diff --git a/loop/error_flags.md b/loop/error_flags.md new file mode 100644 index 0000000..121b725 --- /dev/null +++ b/loop/error_flags.md @@ -0,0 +1,134 @@ +# Error Flags — UDP Payload Miotiq (Byte 66) + +## Principe + +Le byte 66 de la payload UDP (100 bytes) est utilise comme registre d'erreurs. +Chaque bit represente un etat d'erreur independant. Plusieurs erreurs peuvent +etre signalees simultanement. + +## Position dans la payload + +``` +Bytes 0-65 : donnees capteurs (existant) +Byte 66 : error_flags (1 byte = 8 bits) +Bytes 67-99 : reserved (initialises a 0xFF) +``` + +## Definition des bits + +| Bit | Masque | Nom | Description | +|-----|--------|-------------------|--------------------------------------------------| +| 0 | 0x01 | RTC_DISCONNECTED | Module RTC DS3231 non detecte sur le bus I2C | +| 1 | 0x02 | RTC_RESET | RTC en date par defaut (annee 2000) | +| 2 | 0x04 | BME280_ERROR | Capteur BME280 non detecte ou erreur de lecture | +| 3 | 0x08 | NPM_ERROR | Capteur NextPM non detecte ou erreur Modbus | +| 4 | 0x10 | ENVEA_ERROR | Capteurs Envea non detectes ou erreur serie | +| 5 | 0x20 | NOISE_ERROR | Capteur bruit NSRT MK4 non detecte ou erreur | +| 6 | 0x40 | MPPT_ERROR | Chargeur solaire MPPT non detecte ou erreur | +| 7 | 0x80 | WIND_ERROR | Capteur vent non detecte ou erreur | + +## Valeurs possibles (exemples) + +| Valeur dec | Valeur hex | Signification | +|------------|------------|---------------------------------------| +| 0 | 0x00 | Aucune erreur | +| 1 | 0x01 | RTC deconnecte | +| 2 | 0x02 | RTC reset (annee 2000) | +| 3 | 0x03 | RTC deconnecte + RTC reset | +| 4 | 0x04 | BME280 erreur | +| 5 | 0x05 | RTC deconnecte + BME280 erreur | +| 12 | 0x0C | BME280 erreur + NPM erreur | +| 255 | 0xFF | Toutes les erreurs (cas extreme) | + +## Implementation Python (capteur) + +```python +# Constantes +ERR_RTC_DISCONNECTED = 0x01 +ERR_RTC_RESET = 0x02 +ERR_BME280 = 0x04 +ERR_NPM = 0x08 +ERR_ENVEA = 0x10 +ERR_NOISE = 0x20 +ERR_MPPT = 0x40 +ERR_WIND = 0x80 + +# Construction du flag +error_flags = 0x00 + +if rtc_status == "disconnected": + error_flags |= ERR_RTC_DISCONNECTED + +if rtc_status == "reset": + error_flags |= ERR_RTC_RESET + +if bme280_error: + error_flags |= ERR_BME280 + +# Ecriture dans la payload +payload[66] = error_flags +``` + +## Parser Miotiq + +``` +16|device_id|string|||W +2|signal_quality|hex2dec|dB|| +2|version|hex2dec|||W +4|ISO_68|hex2dec|ugm3|x/10| +4|ISO_39|hex2dec|ugm3|x/10| +4|ISO_24|hex2dec|ugm3|x/10| +4|ISO_54|hex2dec|degC|x/100| +4|ISO_55|hex2dec|%|x/100| +4|ISO_53|hex2dec|hPa|| +4|noise_cur_leq|hex2dec|dB|x/10| +4|noise_cur_level|hex2dec|dB|x/10| +4|max_noise|hex2dec|dB|x/10| +4|ISO_03|hex2dec|ppb|| +4|ISO_05|hex2dec|ppb|| +4|ISO_21|hex2dec|ppb|| +4|ISO_04|hex2dec|ppb|| +4|ISO_08|hex2dec|ppb|| +4|npm_ch1|hex2dec|count|| +4|npm_ch2|hex2dec|count|| +4|npm_ch3|hex2dec|count|| +4|npm_ch4|hex2dec|count|| +4|npm_ch5|hex2dec|count|| +4|npm_temp|hex2dec|°C|x/10| +4|npm_humidity|hex2dec|%|x/10| +4|battery_voltage|hex2dec|V|x/100| +4|battery_current|hex2dec|A|x/100| +4|solar_voltage|hex2dec|V|x/100| +4|solar_power|hex2dec|W|| +4|charger_status|hex2dec||| +4|wind_speed|hex2dec|m/s|x/10| +4|wind_direction|hex2dec|degrees|| +2|error_flags|hex2dec||| +32|reserved|skip||| +``` + +## Lecture cote serveur (exemple) + +```python +error_flags = int(parsed_value) # valeur decodee par Miotiq (0-255) + +rtc_disconnected = bool(error_flags & 0x01) +rtc_reset = bool(error_flags & 0x02) +bme280_error = bool(error_flags & 0x04) +npm_error = bool(error_flags & 0x08) +envea_error = bool(error_flags & 0x10) +noise_error = bool(error_flags & 0x20) +mppt_error = bool(error_flags & 0x40) +wind_error = bool(error_flags & 0x80) + +if rtc_disconnected: + alert("RTC module deconnecte — verifier pile/cables I2C") +``` + +## Notes + +- La valeur par defaut de la payload est 0xFF (tous bytes a 255), ce qui signifierait + "toutes les erreurs". Le script doit explicitement ecrire 0x00 quand tout va bien. +- Les flags sont cumulatifs : un capteur peut avoir plusieurs erreurs simultanement. +- Ce systeme est extensible : si on a besoin de plus de 8 flags, on peut utiliser + le byte 67 pour 8 flags supplementaires.