{"id":3895,"date":"2026-11-09T09:00:00","date_gmt":"2026-11-09T01:00:00","guid":{"rendered":"https:\/\/cnbygele.com\/?p=3895"},"modified":"2026-11-08T19:11:12","modified_gmt":"2026-11-08T11:11:12","slug":"meter-csv-schema-version-contract","status":"publish","type":"post","link":"https:\/\/cnbygele.com\/th\/blog\/meter-csv-schema-version-contract\/","title":{"rendered":"\u0e01\u0e32\u0e23\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e41\u0e1b\u0e25\u0e07\u0e42\u0e04\u0e23\u0e07\u0e2a\u0e23\u0e49\u0e32\u0e07 CSV \u0e02\u0e2d\u0e07\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e21\u0e34\u0e40\u0e15\u0e2d\u0e23\u0e4c: \u0e02\u0e49\u0e2d\u0e15\u0e01\u0e25\u0e07\u0e14\u0e49\u0e32\u0e19\u0e40\u0e27\u0e2d\u0e23\u0e4c\u0e0a\u0e31\u0e19\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e01\u0e32\u0e23\u0e19\u0e33\u0e40\u0e02\u0e49\u0e32\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e1b\u0e25\u0e2d\u0e14\u0e20\u0e31\u0e22"},"content":{"rendered":"<p>A meter data CSV schema version contract defines what each column means, which values are permitted and which importer versions can safely read the file. Before changing an export, agree that contract with the receiving system, test both compatible and incompatible examples, and make unknown versions fail visibly. A file opening successfully in a spreadsheet is not evidence that its electrical measurements will be interpreted correctly.<\/p>\n<p>This guide covers the agreement between an external data exporter and importer. It does not prescribe a built-in CSV function for any meter. For an industrial installation, measurements may pass through a gateway, supervisory application or reporting service before a CSV file exists.<\/p>\n<h2>Separate file syntax from measurement meaning<\/h2>\n<p>CSV describes a text arrangement, not the full engineering meaning of its contents. <a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc4180\" rel=\"noopener nofollow\" target=\"_blank\">RFC 4180<\/a> documents common CSV conventions, including records, fields and quoting. It is informational; it does not define your meter identifiers, energy direction, quality codes or time boundaries. Two files can follow the same quoting convention while representing entirely different measurements.<\/p>\n<p>The <a href=\"https:\/\/www.w3.org\/TR\/tabular-data-model\/\" rel=\"noopener nofollow\" target=\"_blank\">W3C tabular data model<\/a> provides a useful distinction between tabular values and metadata that helps describe or validate them. Use that distinction when specifying your own exchange. Document both how a value is written and what a receiving system is allowed to conclude from it.<\/p>\n<p>For example, a column called energy could represent a cumulative register or interval consumption. Renaming it is less consequential than changing that meaning without a new contract. State the measurement boundary, direction and unit explicitly. Otherwise an importer may create a plausible chart from the wrong quantity.<\/p>\n<h2>Identify the contract before processing rows<\/h2>\n<p>Assign a stable identifier to the format and a controlled revision to its interpretation. Record where the receiving system obtains them: a companion metadata record, an agreed file envelope or an explicitly specified column. A filename alone is only suitable if the receiving workflow validates it and preserves the association throughout processing.<\/p>\n<p>Do not infer a revision from the number of columns. Different revisions can have the same field count. Similarly, do not guess from a recent date in the filename. The date could indicate extraction time rather than the version under which the data was produced.<\/p>\n<p>Keep the exporter software version separate from the exchange contract version. A software patch may leave the file unchanged; a configuration adjustment may change field meaning without updating the executable. The contract must describe the actual exchange, while a separate provenance record identifies what created it.<\/p>\n<p><figure><img decoding=\"async\" alt=\"BY194 meter beside external CSV version contract documents, inspection view\" class=\"wp-image-3893\" height=\"1024\" loading=\"lazy\" src=\"https:\/\/cnbygele.com\/wp-content\/uploads\/2026\/11\/meter-csv-schema-version-contract-inspection-20261108.png\" style=\"max-width:100%;height:auto\" width=\"1536\" srcset=\"https:\/\/cnbygele.com\/wp-content\/uploads\/2026\/11\/meter-csv-schema-version-contract-inspection-20261108.png 1536w, https:\/\/cnbygele.com\/wp-content\/uploads\/2026\/11\/meter-csv-schema-version-contract-inspection-20261108-300x200.png 300w, https:\/\/cnbygele.com\/wp-content\/uploads\/2026\/11\/meter-csv-schema-version-contract-inspection-20261108-1024x683.png 1024w, https:\/\/cnbygele.com\/wp-content\/uploads\/2026\/11\/meter-csv-schema-version-contract-inspection-20261108-768x512.png 768w, https:\/\/cnbygele.com\/wp-content\/uploads\/2026\/11\/meter-csv-schema-version-contract-inspection-20261108-18x12.png 18w, https:\/\/cnbygele.com\/wp-content\/uploads\/2026\/11\/meter-csv-schema-version-contract-inspection-20261108-600x400.png 600w\" sizes=\"auto, (max-width: 1536px) 100vw, 1536px\" \/><figcaption>Illustrative external CSV version review with the real BY194 front appearance; documents do not imply built-in export, archive or gateway functions.<\/figcaption><\/figure>\n<\/p>\n<h2>Write the minimum field agreement<\/h2>\n<p>Create a short controlled document that a second engineer can use without asking the original author. For every field, record its stable name, meaning, type, allowed empty state and validation rule. Include examples that expose ambiguity rather than examples that only show the easiest case.<\/p>\n<div style=\"overflow-x:auto;max-width:100%\">\n<table style=\"border-collapse:collapse;width:100%;min-width:560px\">\n<thead>\n<tr>\n<th style=\"border:1px solid #d1d5db;padding:10px;text-align:left;vertical-align:top\">Contract item<\/th>\n<th style=\"border:1px solid #d1d5db;padding:10px;text-align:left;vertical-align:top\">Record explicitly<\/th>\n<th style=\"border:1px solid #d1d5db;padding:10px;text-align:left;vertical-align:top\">Reject or quarantine when<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"border:1px solid #d1d5db;padding:10px;text-align:left;vertical-align:top\">Meter identity<\/td>\n<td style=\"border:1px solid #d1d5db;padding:10px;text-align:left;vertical-align:top\">Stable asset identifier and approved mapping<\/td>\n<td style=\"border:1px solid #d1d5db;padding:10px;text-align:left;vertical-align:top\">Identifier is unknown or maps to multiple assets<\/td>\n<\/tr>\n<tr>\n<td style=\"border:1px solid #d1d5db;padding:10px;text-align:left;vertical-align:top\">Quantity<\/td>\n<td style=\"border:1px solid #d1d5db;padding:10px;text-align:left;vertical-align:top\">Physical quantity, direction and measurement boundary<\/td>\n<td style=\"border:1px solid #d1d5db;padding:10px;text-align:left;vertical-align:top\">Meaning differs from the approved calculation<\/td>\n<\/tr>\n<tr>\n<td style=\"border:1px solid #d1d5db;padding:10px;text-align:left;vertical-align:top\">Unit and scale<\/td>\n<td style=\"border:1px solid #d1d5db;padding:10px;text-align:left;vertical-align:top\">Unit, multiplier and application location<\/td>\n<td style=\"border:1px solid #d1d5db;padding:10px;text-align:left;vertical-align:top\">Scaling would be applied twice or cannot be established<\/td>\n<\/tr>\n<tr>\n<td style=\"border:1px solid #d1d5db;padding:10px;text-align:left;vertical-align:top\">Time<\/td>\n<td style=\"border:1px solid #d1d5db;padding:10px;text-align:left;vertical-align:top\">Zone, interval convention and timestamp interpretation<\/td>\n<td style=\"border:1px solid #d1d5db;padding:10px;text-align:left;vertical-align:top\">A timestamp cannot be assigned unambiguously<\/td>\n<\/tr>\n<tr>\n<td style=\"border:1px solid #d1d5db;padding:10px;text-align:left;vertical-align:top\">Missing reading<\/td>\n<td style=\"border:1px solid #d1d5db;padding:10px;text-align:left;vertical-align:top\">Difference between missing, invalid and measured zero<\/td>\n<td style=\"border:1px solid #d1d5db;padding:10px;text-align:left;vertical-align:top\">A blank would silently become zero<\/td>\n<\/tr>\n<tr>\n<td style=\"border:1px solid #d1d5db;padding:10px;text-align:left;vertical-align:top\">Quality<\/td>\n<td style=\"border:1px solid #d1d5db;padding:10px;text-align:left;vertical-align:top\">Permitted codes and downstream handling<\/td>\n<td style=\"border:1px solid #d1d5db;padding:10px;text-align:left;vertical-align:top\">A new code has no agreed interpretation<\/td>\n<\/tr>\n<tr>\n<td style=\"border:1px solid #d1d5db;padding:10px;text-align:left;vertical-align:top\">Revision<\/td>\n<td style=\"border:1px solid #d1d5db;padding:10px;text-align:left;vertical-align:top\">Supported contract identifiers and transition rule<\/td>\n<td style=\"border:1px solid #d1d5db;padding:10px;text-align:left;vertical-align:top\">The receiver does not recognize the version<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>These are project design checks, not universal meter specifications. The syntax and metadata references above support the distinction; the actual allowed values come from your documented installation and receiving application.<\/p>\n<h2>Classify a change by its effect on the receiver<\/h2>\n<p>An added optional field may be compatible with a receiver that selects known columns by name and deliberately ignores approved extras. It can break a receiver that expects an exact positional layout. Therefore optional does not automatically mean safe. Compatibility is a property of the documented producer and consumer pair.<\/p>\n<p>Removing a required field, changing a unit, reversing the energy direction or altering an interval boundary normally requires explicit migration work. Treat a changed quality-code meaning with the same care as a changed numeric field. The number may remain identical while its permitted use changes.<\/p>\n<p>Column reordering deserves its own test. If the contract promises name-based mapping, verify that the receiver honors that promise. If the exchange is positional, reject an unexpected sequence. Never rely on a person noticing that a spreadsheet heading has moved.<\/p>\n<h2>Build a small but deliberate test pack<\/h2>\n<p>Keep one approved file for each supported revision and a separate set of intentionally rejected examples. Include quoted commas, a blank field, an unknown asset identifier, an unsupported quality code and a timestamp that exercises the chosen time convention. Label invented test readings as test data and keep them away from production ingestion.<\/p>\n<p>For a unit change, choose a synthetic example whose wrong interpretation is unmistakable. Compare the expected interpreted quantity with the actual receiver output, not just the import-success message. A test that proves only that a file was accepted says nothing about whether its measurements were preserved.<\/p>\n<p>Also test the transition boundary. A batch may contain files produced before and after the change. Decide whether both revisions can coexist, whether they use separate queues, and how corrected historic files are handled. Store the decision with the test evidence so that a later re-import does not rely on memory.<\/p>\n<h2>A practical migration example<\/h2>\n<p>Suppose an external reporting service currently sends cumulative energy and a planned update adds interval energy. Keep the cumulative field meaning intact and give the additional quantity a distinct name. Specify its unit, interval duration, timestamp boundary and missing-data behavior before anyone updates the receiving report.<\/p>\n<p>Run an approved sample through a nonproduction receiver. Check that the existing cumulative display remains unchanged and that the new interval series is calculated or stored according to the contract. Then send an intentionally mislabeled sample and confirm that the importer rejects it with a useful explanation.<\/p>\n<p>If the proposed update replaces the original field rather than adding a new one, do not reuse the old contract identifier. Prepare a migration mapping and decide which historical outputs need a version marker. This example describes exchange design; it does not establish an export feature, accuracy rating or billing approval for a particular instrument.<\/p>\n<h2>Preserve the original evidence during rejection<\/h2>\n<p>A rejected file should remain available in a controlled evidence location, alongside the reason, receiving software version and attempted contract identifier. Preserve the received bytes. If a corrected file is supplied, give it a distinct revision and record what it supersedes rather than overwriting the rejected original.<\/p>\n<p>The receiver should distinguish syntax errors from contract errors and engineering validation errors. An unmatched quote differs from an unsupported unit, and both differ from an implausible reading. Separate reasons help the right person resolve the problem without repeatedly modifying a valid source file.<\/p>\n<p>For related controls, use the <a href=\"https:\/\/cnbygele.com\/blog\/meter-export-file-integrity\/\">meter export file integrity guide<\/a> to preserve received files and the <a href=\"https:\/\/cnbygele.com\/blog\/meter-csv-header-encoding\/\">CSV header and encoding guide<\/a> to address text interpretation. Those checks complement a version contract; neither establishes semantic compatibility alone.<\/p>\n<p><figure><img decoding=\"async\" alt=\"BY194 meter beside external CSV version contract documents, records view\" class=\"wp-image-3894\" height=\"1024\" loading=\"lazy\" src=\"https:\/\/cnbygele.com\/wp-content\/uploads\/2026\/11\/meter-csv-schema-version-contract-records-20261108.png\" style=\"max-width:100%;height:auto\" width=\"1536\" srcset=\"https:\/\/cnbygele.com\/wp-content\/uploads\/2026\/11\/meter-csv-schema-version-contract-records-20261108.png 1536w, https:\/\/cnbygele.com\/wp-content\/uploads\/2026\/11\/meter-csv-schema-version-contract-records-20261108-300x200.png 300w, https:\/\/cnbygele.com\/wp-content\/uploads\/2026\/11\/meter-csv-schema-version-contract-records-20261108-1024x683.png 1024w, https:\/\/cnbygele.com\/wp-content\/uploads\/2026\/11\/meter-csv-schema-version-contract-records-20261108-768x512.png 768w, https:\/\/cnbygele.com\/wp-content\/uploads\/2026\/11\/meter-csv-schema-version-contract-records-20261108-18x12.png 18w, https:\/\/cnbygele.com\/wp-content\/uploads\/2026\/11\/meter-csv-schema-version-contract-records-20261108-600x400.png 600w\" sizes=\"auto, (max-width: 1536px) 100vw, 1536px\" \/><figcaption>Illustrative external CSV version review with the real BY194 front appearance; documents do not imply built-in export, archive or gateway functions.<\/figcaption><\/figure>\n<\/p>\n<h2>Assign approval and operational ownership<\/h2>\n<p>Name the owner of the exporter configuration, the receiving import rules and the electrical interpretation. One person may fill several roles, but the approval record should still answer each question. A data specialist can validate field types without being authorized to approve a change in the measurement boundary.<\/p>\n<p>Set a transition date and a rollback decision point. Record what happens to files waiting in a queue during the change. If the receiver is reverted, determine whether newer files remain quarantined or require a separately validated conversion. Never silently reinterpret them under an older contract because the older software happens to accept their shape.<\/p>\n<p>A support handover should include the approved contract, sample files, expected results, known rejection messages and the current compatibility matrix. This makes future changes testable and reduces the chance that a replacement integrator reverse engineers the format from one convenient file.<\/p>\n<h2>Relate the exchange to the actual installed meter<\/h2>\n<p>Begin with the correct device and its documented settings. The <a href=\"https:\/\/cnbygele.com\/product\/by194-series-multifunctional-power-instruments\/\">BY194 multifunctional instrument product page<\/a> is the product reference for this article. Confirm the exact ordered variant and available measurements separately; a product photograph cannot establish an export format, gateway function or archive capability.<\/p>\n<p>Use the <a href=\"https:\/\/cnbygele.com\/blog\/3-phase-electric-power-meters\/\">three-phase electric power meter overview<\/a> for measurement context, then trace each external field back through the approved point mapping. A well-written CSV contract cannot repair an incorrect current-transformer ratio or a mismatched register interpretation upstream.<\/p>\n<p>The following Computerphile lesson explains race conditions in shared processes. It is conceptual background for coordinating producer and consumer changes, not a meter-specific configuration procedure or a substitute for the tests described here.<\/p>\n<div style=\"position:relative;padding-bottom:56.25%;height:0;overflow:hidden\"><iframe allowfullscreen=\"\" loading=\"lazy\" src=\"https:\/\/www.youtube-nocookie.com\/embed\/W0jPTqIo5oE\" style=\"position:absolute;top:0;left:0;width:100%;height:100%;border:0\" title=\"Race Conditions on a Human Scale - Computerphile\"><\/iframe><\/div>\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=W0jPTqIo5oE\" rel=\"noopener nofollow\" target=\"_blank\">Watch the educational lesson<\/a><\/p>\n<h2>Frequently asked questions<\/h2>\n<h3>Does a new optional column always require a new contract revision?<\/h3>\n<p>Record the change under your controlled revision policy even when it is backward compatible. Whether a receiver can accept the column depends on its documented mapping and validation behavior. Verify that behavior with an actual test rather than assuming every importer ignores extra fields safely.<\/p>\n<h3>Can the receiver automatically guess an unknown CSV version?<\/h3>\n<p>Automatic guessing risks assigning the wrong meaning to valid-looking numbers. Quarantine an unknown version and report the evidence needed for review. A conversion may be approved later, but it should be explicit, tested and traceable to the original file.<\/p>\n<h3>Is a checksum enough to prove compatibility?<\/h3>\n<p>A checksum helps detect a byte change relative to a trusted reference. It does not describe field meaning, measurement units or whether the receiver supports the format. Preserve integrity evidence and validate the contract as separate steps.<\/p>\n<h3>Should historical files be rewritten when the contract changes?<\/h3>\n<p>Preserve original evidence and its original contract association. If a normalized copy is required, record its transformation, version and relationship to the source. Review retention and reporting obligations before deciding whether any historical derived outputs also need regeneration.<\/p>\n<p><script type=\"application\/ld+json\">{\"@context\": \"https:\/\/schema.org\", \"@type\": \"FAQPage\", \"mainEntity\": [{\"@type\": \"Question\", \"name\": \"Does a new optional column always require a new contract revision?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Record the change under your controlled revision policy even when it is backward compatible. Whether a receiver can accept the column depends on its documented mapping and validation behavior. Verify that behavior with an actual test rather than assuming every importer ignores extra fields safely.\"}}, {\"@type\": \"Question\", \"name\": \"Can the receiver automatically guess an unknown CSV version?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Automatic guessing risks assigning the wrong meaning to valid-looking numbers. Quarantine an unknown version and report the evidence needed for review. A conversion may be approved later, but it should be explicit, tested and traceable to the original file.\"}}, {\"@type\": \"Question\", \"name\": \"Is a checksum enough to prove compatibility?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"A checksum helps detect a byte change relative to a trusted reference. It does not describe field meaning, measurement units or whether the receiver supports the format. Preserve integrity evidence and validate the contract as separate steps.\"}}, {\"@type\": \"Question\", \"name\": \"Should historical files be rewritten when the contract changes?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Preserve original evidence and its original contract association. If a normalized copy is required, record its transformation, version and relationship to the source. Review retention and reporting obligations before deciding whether any historical derived outputs also need regeneration.\"}}]}<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e04\u0e27\u0e32\u0e21\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07\u0e02\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e41\u0e1b\u0e25\u0e07\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25 CSV \u0e02\u0e2d\u0e07\u0e21\u0e34\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e14\u0e49\u0e27\u0e22\u0e2a\u0e31\u0e0d\u0e0d\u0e32\u0e40\u0e27\u0e2d\u0e23\u0e4c\u0e0a\u0e31\u0e19\u0e02\u0e2d\u0e07\u0e1f\u0e34\u0e25\u0e14\u0e4c \u0e01\u0e32\u0e23\u0e17\u0e14\u0e2a\u0e2d\u0e1a\u0e04\u0e27\u0e32\u0e21\u0e40\u0e02\u0e49\u0e32\u0e01\u0e31\u0e19\u0e44\u0e14\u0e49 \u0e41\u0e25\u0e30\u0e01\u0e0e\u0e01\u0e32\u0e23\u0e1b\u0e0f\u0e34\u0e40\u0e2a\u0e18\u0e17\u0e35\u0e48\u0e0a\u0e31\u0e14\u0e40\u0e08\u0e19\u0e01\u0e48\u0e2d\u0e19\u0e17\u0e35\u0e48\u0e08\u0e30\u0e2d\u0e31\u0e1b\u0e40\u0e14\u0e15\u0e15\u0e31\u0e27\u0e19\u0e33\u0e40\u0e02\u0e49\u0e32.<\/p>","protected":false},"author":4,"featured_media":3892,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_gspb_post_css":"","footnotes":""},"categories":[1],"tags":[201],"class_list":["post-3895","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","tag-multifunction-power-meter"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":8}},"acf":[],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/cnbygele.com\/th\/wp-json\/wp\/v2\/posts\/3895","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cnbygele.com\/th\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cnbygele.com\/th\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cnbygele.com\/th\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/cnbygele.com\/th\/wp-json\/wp\/v2\/comments?post=3895"}],"version-history":[{"count":1,"href":"https:\/\/cnbygele.com\/th\/wp-json\/wp\/v2\/posts\/3895\/revisions"}],"predecessor-version":[{"id":3896,"href":"https:\/\/cnbygele.com\/th\/wp-json\/wp\/v2\/posts\/3895\/revisions\/3896"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cnbygele.com\/th\/wp-json\/wp\/v2\/media\/3892"}],"wp:attachment":[{"href":"https:\/\/cnbygele.com\/th\/wp-json\/wp\/v2\/media?parent=3895"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cnbygele.com\/th\/wp-json\/wp\/v2\/categories?post=3895"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cnbygele.com\/th\/wp-json\/wp\/v2\/tags?post=3895"}],"curies":[{"name":"\u0e14\u0e35\u0e21\u0e32\u0e01","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}