From a0f2d28b9685fb17df352d218ff8c1e2e35f5449 Mon Sep 17 00:00:00 2001 From: PaulVua Date: Tue, 2 Jun 2026 17:37:13 +0200 Subject: [PATCH] v1.12.3: defaut CO2 = sentinelle ISO_17 seule (retrait bit 7) Decision avec le dev serveur Miotiq: l'absence/defaut du capteur CO2 est signalee uniquement par ISO_17=0xFFFF (sentinelle, source de verite). Le bit 7 error_flags ajoute en v1.12.2 est retire (ambigu WIND/CO2 selon device_type). - SARA_send_data_v2.py: suppression ERR_CO2 + s88_disconnected + |= ERR_CO2 - la logique sentinelle (set_co2 seulement si s88_status==0) reste inchangee - error_flags.md: bit 7 = WIND_ERROR, note que le CO2 passe par la sentinelle On garde v1.12.1 (s88_status + ecriture systematique) qui garantit la sentinelle. Co-Authored-By: Claude Opus 4.8 (1M context) --- VERSION | 2 +- changelog.json | 13 +++++++++++++ loop/SARA_send_data_v2.py | 19 ++++++------------- loop/error_flags.md | 6 +++++- 4 files changed, 25 insertions(+), 15 deletions(-) diff --git a/VERSION b/VERSION index 6b89d58..81f3632 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.12.2 +1.12.3 diff --git a/changelog.json b/changelog.json index 009ea19..3de51c3 100644 --- a/changelog.json +++ b/changelog.json @@ -1,5 +1,18 @@ { "versions": [ + { + "version": "1.12.3", + "date": "2026-06-02", + "changes": { + "features": [], + "improvements": [ + "Signalement défaut CO2: adoption de l'option 1 (sentinelle ISO_17=0xFFFF seule, source de vérité, alignée avec le dev serveur). Retrait du bit 7 CO2_ERROR ajouté en v1.12.2 (le bit 7 est ambigu WIND/CO2 selon device_type). L'absence/défaut du S88 est signalée uniquement par bytes 81-82 = 0xFFFF, ce qui reste garanti correct grâce à l'écriture systématique + s88_status (v1.12.1). error_flags.md remis à jour." + ], + "fixes": [], + "compatibility": [] + }, + "notes": "Décision conjointe avec le dev serveur Miotiq: la sentinelle ISO_17=0xFFFF est la seule source de vérité pour l'absence CO2; pas de bit error_flags. Annule la partie bit 7 de v1.12.2." + }, { "version": "1.12.2", "date": "2026-06-02", diff --git a/loop/SARA_send_data_v2.py b/loop/SARA_send_data_v2.py index 29e5949..737d0d9 100755 --- a/loop/SARA_send_data_v2.py +++ b/loop/SARA_send_data_v2.py @@ -160,10 +160,6 @@ ERR_ENVEA = 0x10 ERR_NOISE = 0x20 ERR_MPPT = 0x40 ERR_WIND = 0x80 -# Bit 7 is dual-purpose per product (server decodes by device_type): -# NebuleAir -> WIND_ERROR, ModuleAir / CO2-equipped units -> CO2_ERROR. -# On these CO2 boxes the server reads bit 7 as CO2_ERROR (confirmed). -ERR_CO2 = 0x80 # database connection conn = sqlite3.connect("/var/www/nebuleair_pro_4g/sqlite/sensors.db") @@ -1091,9 +1087,10 @@ try: # Only transmit when the LAST reading is valid (s88_status == 0). If the # sensor is down (s88_status == 0xFF), leave bytes 81-82 at 0xFFFF (= "CO2 # sensor absent" in the Miotiq spec) instead of sending a stale value. - # Absence is signalled two ways: the 0xFFFF sentinel in the CO2 field, and - # the CO2_ERROR bit (0x80) in error_flags (byte 66) — see build below. - s88_disconnected = False + # Absence/fault is signalled solely by the 0xFFFF sentinel in the CO2 field + # (ISO_17, source of truth per the Miotiq spec): only transmit when the LAST + # reading is valid (s88_status == 0). No error_flags bit — bit 7 is ambiguous + # (WIND on NebuleAir / CO2 on ModuleAir), the sentinel is unambiguous. if s88_sensor: print("➡️Getting S88 CO2 value") cursor.execute("SELECT * FROM data_S88 ORDER BY rowid DESC LIMIT 1") @@ -1105,11 +1102,9 @@ try: print(f"CO2 (S88): {co2_ppm} ppm") payload.set_co2(co2_ppm) else: - s88_disconnected = True - print(f"S88 last reading invalid (s88_status=0x{s88_status_value:02X}) -> CO2 marked absent (0xFFFF), set CO2_ERROR") + print(f"S88 last reading invalid (s88_status=0x{s88_status_value:02X}) -> CO2 marked absent (0xFFFF)") else: - s88_disconnected = True - print("No S88 data available in the database. -> set CO2_ERROR") + print("No S88 data available in the database. -> CO2 marked absent (0xFFFF)") #print("Verify SARA connection (AT)") @@ -1243,8 +1238,6 @@ try: error_flags |= ERR_NPM if noise_disconnected: error_flags |= ERR_NOISE - if s88_disconnected: - error_flags |= ERR_CO2 # bit 7, read as CO2_ERROR by the server on these units payload.set_error_flags(error_flags) # ---- Firmware version (bytes 69-71) ---- diff --git a/loop/error_flags.md b/loop/error_flags.md index faede14..76beeb5 100644 --- a/loop/error_flags.md +++ b/loop/error_flags.md @@ -42,7 +42,11 @@ Chaque bit represente une erreur detectee par le script d'envoi (`SARA_send_data | 4 | 0x10 | ENVEA_ERROR | Capteurs Envea non detectes ou erreur serie | data_envea → valeurs a 0 | | 5 | 0x20 | NOISE_ERROR | Capteur bruit NSRT MK4 non detecte ou erreur | data_noise → valeurs a 0 | | 6 | 0x40 | MPPT_ERROR | Chargeur solaire MPPT non detecte ou erreur | data_MPPT → valeurs a 0 | -| 7 | 0x80 | WIND_ERROR / CO2_ERROR | Double sens selon le produit (decode serveur par device_type). NebuleAir = vent non detecte. NebuleAir equipe CO2 / ModuleAir = sonde CO2 (S88) non detectee. | data_windMeter → 0 / data_S88 → s88_status=0xFF | +| 7 | 0x80 | WIND_ERROR | Capteur vent non detecte ou erreur | data_windMeter → valeurs a 0 | + +Note: l'absence/defaut du capteur CO2 (S88) n'est PAS signalee par un bit error_flags +(le bit 7 est ambigu vent/CO2). Elle l'est uniquement par la sentinelle `ISO_17 = 0xFFFF` +dans le champ CO2 (bytes 81-82) — voir `udp-miotiq.md`. ### Detection des erreurs