From 035d4fed2667fdd5a57996d6788411a2ee222aee Mon Sep 17 00:00:00 2001 From: gitomarcourt Date: Fri, 3 Jul 2026 18:17:48 +0200 Subject: [PATCH] feat: v2 event_count for Light/Door/Move/Reed; unified naming --- .../__pycache__/sensit_decoder.cpython-314.pyc | Bin 0 -> 6742 bytes dashboard/sensit_decoder.py | 14 +++++--------- dashboard/static/index.html | 6 ++---- 3 files changed, 7 insertions(+), 13 deletions(-) create mode 100644 dashboard/__pycache__/sensit_decoder.cpython-314.pyc diff --git a/dashboard/__pycache__/sensit_decoder.cpython-314.pyc b/dashboard/__pycache__/sensit_decoder.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a733c9c7f20f85c8fa14c580ec12de986b20378 GIT binary patch literal 6742 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 a_YCQk_f7xIx?j-9{zK|38tFULmH#iZYsxVI literal 0 HcmV?d00001 diff --git a/dashboard/sensit_decoder.py b/dashboard/sensit_decoder.py index 067caf5..df29bad 100644 --- a/dashboard/sensit_decoder.py +++ b/dashboard/sensit_decoder.py @@ -98,18 +98,14 @@ def _decode_v2(b0: int, b1: int, b2: int, b3: int) -> dict: result["temperature_c"] = round((temp_raw - 200) / 8, 2) result["reed_switch"] = bool((b2 >> 6) & 0x01) - # Byte 3 depends on mode - if mode == 0: # Button — software version + # Byte 3 depends on mode (per v2 spec) + if mode == 0: # Button — software version (fw major.minor) result["fw_major"] = (b3 >> 4) & 0x0F result["fw_minor"] = b3 & 0x0F - elif mode == 1: # Temperature — humidity + elif mode == 1: # Temperature — humidity percentage result["humidity_pct"] = round(b3 * 0.5, 1) - elif mode == 4: # Move — event count / status - result["move_events"] = b3 - elif mode == 5: # Reed Switch — event count - result["reed_events"] = b3 - else: - result["byte3_raw"] = b3 + else: # Light, Door, Move, Reed Switch — number of alerts / events + result["event_count"] = b3 return result diff --git a/dashboard/static/index.html b/dashboard/static/index.html index 6c35d06..247c95f 100644 --- a/dashboard/static/index.html +++ b/dashboard/static/index.html @@ -125,8 +125,6 @@ function summaryLine(d) { if ('vibration_status' in d) p.push(`vibration: ${d.vibration_status}`); if ('magnet_status' in d) p.push(`magnet: ${d.magnet_status}`); if ('event_count' in d && d.mode_id > 2) p.push(`${d.event_count} events`); - if ('move_events' in d) p.push(`${d.move_events} moves`); - if ('reed_events' in d) p.push(`${d.reed_events} reed events`); if ('fw_major' in d) p.push(`fw ${d.fw_major}.${d.fw_minor}`); if (p.length === 0) p.push('heartbeat'); return p.join(' · '); @@ -220,7 +218,7 @@ const chartPresets = { Move: { subtitle: 'Cumulative movement events', datasets: (msgs) => [ - makeDs('Move events', msgs.map(m => m.decoded?.move_events ?? null), '#e11d48', 'y'), + makeDs('Event count', msgs.map(m => m.decoded?.event_count ?? null), '#e11d48', 'y'), ], }, Magnet: { @@ -232,7 +230,7 @@ const chartPresets = { 'Reed Switch': { subtitle: 'Cumulative reed switch events', datasets: (msgs) => [ - makeDs('Reed events', msgs.map(m => m.decoded?.reed_events ?? null), '#7c3aed', 'y'), + makeDs('Event count', msgs.map(m => m.decoded?.event_count ?? null), '#7c3aed', 'y'), ], }, };