Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.4.3] - 2026-08-11

### Changed

- Advanced the canonical output schema to version 3. Record values now contain
one parsed `value` instead of repeating display, numeric, precision, scaling,
component, and raw-byte representations. Record bytes live only in
`header_hex` and `data_hex`.

### Fixed

- Restored frame, application-header, DIF/VIF, and payload colors in the web
hex view after annotation identifiers moved to `snake_case`.

## [0.4.2] - 2026-08-10

### Changed
Expand Down
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "m-bus-parser"
version = "0.4.2"
version = "0.4.3"
edition = "2021"
description = "A library for parsing M-Bus frames"
license = "MIT"
Expand Down
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -236,8 +236,11 @@ share one vocabulary:
when one is available, such as `W`, `Cel`, or `m3.h-1`.
- Complete temporal values use ISO 8601 notation. The parser does not invent a
timezone when a meter does not transmit one.
- Each record value contains a `kind` and at most one parsed `value`. Exact
decimals, text, and complete temporal values use strings; finite floats use
JSON numbers; partial temporal values use a compact component object.
- Raw binary values use uppercase hexadecimal and fields containing them end
in `_hex`.
in `_hex`. Record bytes live only in `header_hex` and `data_hex`.

There is no common JSON schema shared by M-Bus parsers. These rules retain the
protocol vocabulary used by [M-Bus](https://m-bus.com/documentation-wired/06-application-layer)
Expand Down
4 changes: 2 additions & 2 deletions cli/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "m-bus-parser-cli"
version = "0.4.2"
version = "0.4.3"
edition = "2021"
description = "A cli to use the library for parsing M-Bus frames"
license = "MIT"
Expand All @@ -22,7 +22,7 @@ default = ["decryption"]
decryption = ["m-bus-parser/decryption"]

[dependencies]
m-bus-parser = { path = "..", version = "0.4.2", features = ["std", "serde"] }
m-bus-parser = { path = "..", version = "0.4.3", features = ["std", "serde"] }
hex = "0.4"
clap = { version = "4.5.4", features = ["derive"] }
terminal_size = "0.4"
18 changes: 9 additions & 9 deletions docs/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -859,7 +859,7 @@ <h1>Online M-Bus Parser <span class="parser-version" id="parser-version"></span>
<div id="output" aria-live="polite"></div>
</div>
<script type="module">
import init, { m_bus_highlight, m_bus_render, version } from "./m_bus_parser_wasm_pack.js?v=0.4.1";
import init, { m_bus_highlight, m_bus_render, version } from "./m_bus_parser_wasm_pack.js?v=0.4.3";

let currentFormat = "json";
let lastTableWidth = null;
Expand Down Expand Up @@ -945,7 +945,7 @@ <h1>Online M-Bus Parser <span class="parser-version" id="parser-version"></span>
}
});

await init(new URL("./m_bus_parser_wasm_pack_bg.wasm?v=0.4.1", import.meta.url));
await init(new URL("./m_bus_parser_wasm_pack_bg.wasm?v=0.4.3", import.meta.url));
document.getElementById('parser-version').textContent = 'v' + version();

// Load data and format from URL params and auto-parse if present
Expand Down Expand Up @@ -1176,14 +1176,14 @@ <h1>Online M-Bus Parser <span class="parser-version" id="parser-version"></span>

// Layer CSS class
function layerClass(layer) {
if (layer === 'Frame') return 'hex-layer-frame';
if (layer === 'AppHeader') return 'hex-layer-appheader';
if (layer === 'frame') return 'hex-layer-frame';
if (layer === 'app_header') return 'hex-layer-appheader';
return 'hex-layer-record';
}
function segmentKindClass(kind) {
if (kind === 'Dif' || kind === 'Dife') return 'hex-kind-dif';
if (kind === 'Vif' || kind === 'Vife' || kind === 'PlaintextVif') return 'hex-kind-vif';
if (kind === 'DataPayload') return 'hex-kind-data';
if (kind === 'dif' || kind === 'dife') return 'hex-kind-dif';
if (kind === 'vif' || kind === 'vife' || kind === 'plaintext_vif') return 'hex-kind-vif';
if (kind === 'data_payload') return 'hex-kind-data';
return '';
}

Expand Down Expand Up @@ -1375,14 +1375,14 @@ <h1>Online M-Bus Parser <span class="parser-version" id="parser-version"></span>
currentGroup = null;
const layerLabel = document.createElement('div');
layerLabel.className = 'hex-tree-layer';
const layerNames = { 'Frame': 'Frame', 'AppHeader': 'Application Header', 'RecordField': 'Data Records' };
const layerNames = { 'frame': 'Frame', 'app_header': 'Application Header', 'record_field': 'Data Records' };
layerLabel.textContent = layerNames[seg.layer] || seg.layer;
rightPanel.appendChild(layerLabel);
groupBody = null;
}

// Record grouping
if (seg.layer === 'RecordField' && seg.group !== null && seg.group !== currentGroup) {
if (seg.layer === 'record_field' && seg.group !== null && seg.group !== currentGroup) {
currentGroup = seg.group;
const groupDiv = document.createElement('div');
groupDiv.className = 'hex-tree-group';
Expand Down
Loading
Loading