v1.12.2: flag CO2_ERROR (bit 7) quand la sonde S88 est deconnectee
A la demande: en plus du sentinel 0xFFFF dans le champ CO2, on remonte le defaut via error_flags byte 66 bit 7. - ERR_CO2 = 0x80 (bit 7, double sens vent/CO2 selon device_type cote serveur) - s88_disconnected -> error_flags |= ERR_CO2 dans SARA_send_data_v2.py - error_flags.md: bit 7 documente comme WIND_ERROR / CO2_ERROR Confirme par le user: le serveur lit le bit 7 comme CO2_ERROR sur ces unites. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,20 @@
|
|||||||
{
|
{
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"version": "1.12.2",
|
||||||
|
"date": "2026-06-02",
|
||||||
|
"changes": {
|
||||||
|
"features": [],
|
||||||
|
"improvements": [
|
||||||
|
"Transmission: error_flags (byte 66) bit 7 (0x80) posé quand la sonde CO2 S88 est déconnectée (s88_status=0xFF ou aucune donnée). Bit 7 = double sens selon le produit (décodage serveur par device_type): WIND_ERROR sur NebuleAir classique, CO2_ERROR sur les unités équipées CO2 (confirmé côté serveur). Nouvelle constante ERR_CO2=0x80. error_flags.md mis à jour."
|
||||||
|
],
|
||||||
|
"fixes": [],
|
||||||
|
"compatibility": [
|
||||||
|
"⚠ Bit 7 partagé vent/CO2: le serveur interprète selon le device_type. Sur une box qui aurait À LA FOIS girouette ET S88, conflit — ne pas activer les deux sans arbitrage serveur."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notes": "Complète v1.12.1: en plus du sentinel 0xFFFF dans le champ CO2 (byte 81-82), le bit CO2_ERROR remonte explicitement le défaut. Vérifié sur pro100 (S88 muet -> error_flags bit 7 posé)."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"version": "1.12.1",
|
"version": "1.12.1",
|
||||||
"date": "2026-06-02",
|
"date": "2026-06-02",
|
||||||
|
|||||||
@@ -160,6 +160,10 @@ ERR_ENVEA = 0x10
|
|||||||
ERR_NOISE = 0x20
|
ERR_NOISE = 0x20
|
||||||
ERR_MPPT = 0x40
|
ERR_MPPT = 0x40
|
||||||
ERR_WIND = 0x80
|
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
|
# database connection
|
||||||
conn = sqlite3.connect("/var/www/nebuleair_pro_4g/sqlite/sensors.db")
|
conn = sqlite3.connect("/var/www/nebuleair_pro_4g/sqlite/sensors.db")
|
||||||
@@ -1087,8 +1091,9 @@ try:
|
|||||||
# Only transmit when the LAST reading is valid (s88_status == 0). If the
|
# 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 is down (s88_status == 0xFF), leave bytes 81-82 at 0xFFFF (= "CO2
|
||||||
# sensor absent" in the Miotiq spec) instead of sending a stale value.
|
# sensor absent" in the Miotiq spec) instead of sending a stale value.
|
||||||
# NB: byte 66 (error_flags) is already full, so absence is signalled solely
|
# Absence is signalled two ways: the 0xFFFF sentinel in the CO2 field, and
|
||||||
# by the 0xFFFF sentinel in the CO2 field.
|
# the CO2_ERROR bit (0x80) in error_flags (byte 66) — see build below.
|
||||||
|
s88_disconnected = False
|
||||||
if s88_sensor:
|
if s88_sensor:
|
||||||
print("➡️Getting S88 CO2 value")
|
print("➡️Getting S88 CO2 value")
|
||||||
cursor.execute("SELECT * FROM data_S88 ORDER BY rowid DESC LIMIT 1")
|
cursor.execute("SELECT * FROM data_S88 ORDER BY rowid DESC LIMIT 1")
|
||||||
@@ -1100,9 +1105,11 @@ try:
|
|||||||
print(f"CO2 (S88): {co2_ppm} ppm")
|
print(f"CO2 (S88): {co2_ppm} ppm")
|
||||||
payload.set_co2(co2_ppm)
|
payload.set_co2(co2_ppm)
|
||||||
else:
|
else:
|
||||||
print(f"S88 last reading invalid (s88_status=0x{s88_status_value:02X}) -> CO2 marked absent (0xFFFF)")
|
s88_disconnected = True
|
||||||
|
print(f"S88 last reading invalid (s88_status=0x{s88_status_value:02X}) -> CO2 marked absent (0xFFFF), set CO2_ERROR")
|
||||||
else:
|
else:
|
||||||
print("No S88 data available in the database.")
|
s88_disconnected = True
|
||||||
|
print("No S88 data available in the database. -> set CO2_ERROR")
|
||||||
|
|
||||||
#print("Verify SARA connection (AT)")
|
#print("Verify SARA connection (AT)")
|
||||||
|
|
||||||
@@ -1236,6 +1243,8 @@ try:
|
|||||||
error_flags |= ERR_NPM
|
error_flags |= ERR_NPM
|
||||||
if noise_disconnected:
|
if noise_disconnected:
|
||||||
error_flags |= ERR_NOISE
|
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)
|
payload.set_error_flags(error_flags)
|
||||||
|
|
||||||
# ---- Firmware version (bytes 69-71) ----
|
# ---- Firmware version (bytes 69-71) ----
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ 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 |
|
| 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 |
|
| 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 |
|
| 6 | 0x40 | MPPT_ERROR | Chargeur solaire MPPT non detecte ou erreur | data_MPPT → valeurs a 0 |
|
||||||
| 7 | 0x80 | WIND_ERROR | Capteur vent non detecte ou erreur | data_windMeter → 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 |
|
||||||
|
|
||||||
### Detection des erreurs
|
### Detection des erreurs
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user