pymbusparser 0.4.2__tar.gz → 0.4.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/CHANGELOG.md +14 -0
  2. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/Cargo.lock +4 -4
  3. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/Cargo.toml +1 -1
  4. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/PKG-INFO +1 -1
  5. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/README.md +4 -1
  6. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/docs/index.html +9 -9
  7. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/docs/m_bus_parser_wasm_pack.js +297 -299
  8. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/docs/m_bus_parser_wasm_pack_bg.wasm +0 -0
  9. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/python/Cargo.toml +2 -2
  10. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/python/tests/test_bindings.py +1 -1
  11. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/src/mbus_data.rs +2 -2
  12. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/src/output.rs +82 -172
  13. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/.github/dependabot.yml +0 -0
  14. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/.github/workflows/python.yml +0 -0
  15. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/.github/workflows/rust.yml +0 -0
  16. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/.gitignore +0 -0
  17. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/.vscode/launch.json +0 -0
  18. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/.vscode/settings.json +0 -0
  19. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/CONTRIBUTING.md +0 -0
  20. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/LICENSE +0 -0
  21. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/README_python.md +0 -0
  22. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/benches/bench.rs +0 -0
  23. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/crates/m-bus-application-layer/.gitignore +0 -0
  24. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/crates/m-bus-application-layer/Cargo.toml +0 -0
  25. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/crates/m-bus-application-layer/README.md +0 -0
  26. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/crates/m-bus-application-layer/examples/parse_data_records.rs +0 -0
  27. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/crates/m-bus-application-layer/src/data_information.rs +0 -0
  28. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/crates/m-bus-application-layer/src/data_record.rs +0 -0
  29. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/crates/m-bus-application-layer/src/extended_link_layer.rs +0 -0
  30. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/crates/m-bus-application-layer/src/lib.rs +0 -0
  31. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/crates/m-bus-application-layer/src/value_information.rs +0 -0
  32. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/crates/m-bus-application-layer/src/variable_user_data.rs +0 -0
  33. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/crates/m-bus-core/Cargo.toml +0 -0
  34. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/crates/m-bus-core/src/decryption.rs +0 -0
  35. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/crates/m-bus-core/src/lib.rs +0 -0
  36. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/crates/wired-mbus-link-layer/Cargo.toml +0 -0
  37. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/crates/wired-mbus-link-layer/src/lib.rs +0 -0
  38. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/crates/wireless-mbus-link-layer/Cargo.toml +0 -0
  39. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/crates/wireless-mbus-link-layer/src/lib.rs +0 -0
  40. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/docs/m_bus_parser_wasm_pack_bg.js +0 -0
  41. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/docs/meter.png +0 -0
  42. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/pyproject.toml +0 -0
  43. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/python/.gitignore +0 -0
  44. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/python/README_python.md +0 -0
  45. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/python/py.typed +0 -0
  46. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/python/pymbusparser.pyi +0 -0
  47. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/python/src/lib.rs +0 -0
  48. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/src/annotate.rs +0 -0
  49. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/src/lib.rs +0 -0
  50. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/src/manufacturers.rs +0 -0
  51. {pymbusparser-0.4.2 → pymbusparser-0.4.3}/src/rscada_xml.rs +0 -0
@@ -7,6 +7,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.4.3] - 2026-08-11
11
+
12
+ ### Changed
13
+
14
+ - Advanced the canonical output schema to version 3. Record values now contain
15
+ one parsed `value` instead of repeating display, numeric, precision, scaling,
16
+ component, and raw-byte representations. Record bytes live only in
17
+ `header_hex` and `data_hex`.
18
+
19
+ ### Fixed
20
+
21
+ - Restored frame, application-header, DIF/VIF, and payload colors in the web
22
+ hex view after annotation identifiers moved to `snake_case`.
23
+
10
24
  ## [0.4.2] - 2026-08-10
11
25
 
12
26
  ### Changed
@@ -934,7 +934,7 @@ dependencies = [
934
934
 
935
935
  [[package]]
936
936
  name = "m-bus-parser"
937
- version = "0.4.2"
937
+ version = "0.4.3"
938
938
  dependencies = [
939
939
  "aes",
940
940
  "aes-gcm",
@@ -963,7 +963,7 @@ dependencies = [
963
963
 
964
964
  [[package]]
965
965
  name = "m-bus-parser-cli"
966
- version = "0.4.2"
966
+ version = "0.4.3"
967
967
  dependencies = [
968
968
  "clap",
969
969
  "hex",
@@ -973,7 +973,7 @@ dependencies = [
973
973
 
974
974
  [[package]]
975
975
  name = "m-bus-parser-wasm-pack"
976
- version = "0.4.2"
976
+ version = "0.4.3"
977
977
  dependencies = [
978
978
  "console_error_panic_hook",
979
979
  "js-sys",
@@ -1161,7 +1161,7 @@ dependencies = [
1161
1161
 
1162
1162
  [[package]]
1163
1163
  name = "pymbusparser"
1164
- version = "0.4.2"
1164
+ version = "0.4.3"
1165
1165
  dependencies = [
1166
1166
  "hex",
1167
1167
  "m-bus-parser",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "m-bus-parser"
3
- version = "0.4.2"
3
+ version = "0.4.3"
4
4
  edition = "2021"
5
5
  description = "A library for parsing M-Bus frames"
6
6
  license = "MIT"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pymbusparser
3
- Version: 0.4.2
3
+ Version: 0.4.3
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Programming Language :: Python :: 3
6
6
  Classifier: Programming Language :: Rust
@@ -236,8 +236,11 @@ share one vocabulary:
236
236
  when one is available, such as `W`, `Cel`, or `m3.h-1`.
237
237
  - Complete temporal values use ISO 8601 notation. The parser does not invent a
238
238
  timezone when a meter does not transmit one.
239
+ - Each record value contains a `kind` and at most one parsed `value`. Exact
240
+ decimals, text, and complete temporal values use strings; finite floats use
241
+ JSON numbers; partial temporal values use a compact component object.
239
242
  - Raw binary values use uppercase hexadecimal and fields containing them end
240
- in `_hex`.
243
+ in `_hex`. Record bytes live only in `header_hex` and `data_hex`.
241
244
 
242
245
  There is no common JSON schema shared by M-Bus parsers. These rules retain the
243
246
  protocol vocabulary used by [M-Bus](https://m-bus.com/documentation-wired/06-application-layer)
@@ -859,7 +859,7 @@
859
859
  <div id="output" aria-live="polite"></div>
860
860
  </div>
861
861
  <script type="module">
862
- import init, { m_bus_highlight, m_bus_render, version } from "./m_bus_parser_wasm_pack.js?v=0.4.1";
862
+ import init, { m_bus_highlight, m_bus_render, version } from "./m_bus_parser_wasm_pack.js?v=0.4.3";
863
863
 
864
864
  let currentFormat = "json";
865
865
  let lastTableWidth = null;
@@ -945,7 +945,7 @@
945
945
  }
946
946
  });
947
947
 
948
- await init(new URL("./m_bus_parser_wasm_pack_bg.wasm?v=0.4.1", import.meta.url));
948
+ await init(new URL("./m_bus_parser_wasm_pack_bg.wasm?v=0.4.3", import.meta.url));
949
949
  document.getElementById('parser-version').textContent = 'v' + version();
950
950
 
951
951
  // Load data and format from URL params and auto-parse if present
@@ -1176,14 +1176,14 @@
1176
1176
 
1177
1177
  // Layer CSS class
1178
1178
  function layerClass(layer) {
1179
- if (layer === 'Frame') return 'hex-layer-frame';
1180
- if (layer === 'AppHeader') return 'hex-layer-appheader';
1179
+ if (layer === 'frame') return 'hex-layer-frame';
1180
+ if (layer === 'app_header') return 'hex-layer-appheader';
1181
1181
  return 'hex-layer-record';
1182
1182
  }
1183
1183
  function segmentKindClass(kind) {
1184
- if (kind === 'Dif' || kind === 'Dife') return 'hex-kind-dif';
1185
- if (kind === 'Vif' || kind === 'Vife' || kind === 'PlaintextVif') return 'hex-kind-vif';
1186
- if (kind === 'DataPayload') return 'hex-kind-data';
1184
+ if (kind === 'dif' || kind === 'dife') return 'hex-kind-dif';
1185
+ if (kind === 'vif' || kind === 'vife' || kind === 'plaintext_vif') return 'hex-kind-vif';
1186
+ if (kind === 'data_payload') return 'hex-kind-data';
1187
1187
  return '';
1188
1188
  }
1189
1189
 
@@ -1375,14 +1375,14 @@
1375
1375
  currentGroup = null;
1376
1376
  const layerLabel = document.createElement('div');
1377
1377
  layerLabel.className = 'hex-tree-layer';
1378
- const layerNames = { 'Frame': 'Frame', 'AppHeader': 'Application Header', 'RecordField': 'Data Records' };
1378
+ const layerNames = { 'frame': 'Frame', 'app_header': 'Application Header', 'record_field': 'Data Records' };
1379
1379
  layerLabel.textContent = layerNames[seg.layer] || seg.layer;
1380
1380
  rightPanel.appendChild(layerLabel);
1381
1381
  groupBody = null;
1382
1382
  }
1383
1383
 
1384
1384
  // Record grouping
1385
- if (seg.layer === 'RecordField' && seg.group !== null && seg.group !== currentGroup) {
1385
+ if (seg.layer === 'record_field' && seg.group !== null && seg.group !== currentGroup) {
1386
1386
  currentGroup = seg.group;
1387
1387
  const groupDiv = document.createElement('div');
1388
1388
  groupDiv.className = 'hex-tree-group';