Outils pour utilisateurs

Outils du site


domotique:retro-ingenierie_d_une_station_meteo

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
domotique:retro-ingenierie_d_une_station_meteo [03/08/2019 21:27] antoinevedomotique:retro-ingenierie_d_une_station_meteo [20/10/2019 15:22] (Version actuelle) – Alecto antoineve
Ligne 1: Ligne 1:
 +~~DISCUSSION~~
 +
 +{{ :domotique:station_meteo_header.jpg?nolink&400 |}}
 +
 ====== Rétro-ingénierie d'une station météo ====== ====== Rétro-ingénierie d'une station météo ======
  
-//TL;DR// : Le code est disponible sur GitHub : https://github.com/AntoineVe/Otio_WH510+Cette station météo, "Otio WH5100" est également connue sous le nom "Alecto ACH-2010"
 + 
 +//TL;DR// : Le code est disponible sur mon repo git : https://git.antoineve.me/Otio_WH5100/
  
 ===== Le signal radio ===== ===== Le signal radio =====
Ligne 113: Ligne 119:
 </file> </file>
  
-{{ :domotique:meteograph.png?direct&640 graphique des données reçues}}+{{ :domotique:meteograph.png?nolink&720 |Graphique représentant les données reçues}}
  
 J'ai ensuite rapproché les relevés bruts avec les données affichées sur le terminal météo fourni. J'ai ensuite rapproché les relevés bruts avec les données affichées sur le terminal météo fourni.
Ligne 182: Ligne 188:
 J'ai également remarqué que l'état des piles modifie l'offset de la formule, j'ai donc ajouté un dictionnaire J'ai également remarqué que l'état des piles modifie l'offset de la formule, j'ai donc ajouté un dictionnaire
 permettant d'intervertir les valeurs quant c'est nécessaire. permettant d'intervertir les valeurs quant c'est nécessaire.
 +
 +==== Humidité ====
 +
 +Pour l'humidité, j'ai identifié les changements sur le 5ème octet.
 +On voit bien sur la courbe des relevés la relation qu'ont la température et l'humidité.
 +L'analyse numérique donne a = 0,5 et b = 0, avec également une erreur standard nulle.
 +La relation est donc très simple : y = 0.5 * x.
 +C'est à dire que la valeur de l'humidité est la donnée (convertie en entier décimal) divisée par deux.
 +
 +En python :
 +
 +<code pycon>
 +   >>> def hum(data):
 +   ...  return int(round(data/2))
 +   ...
 +   >>> hum(0xbc)
 +   94
 +</code>
 +
 +==== Anémomètre ====
 +
 +La station météo renvoie deux paramètres pour le vent : une moyenne (ou médiane ?)
 +et le maximum (ce qui correspond aux rafales).
 +Ceux-ci sont portés sur les octets 6 et 7.
 +L'analyse numérique :
 +
 +<code pycon>
 +>>> from scipy import stats
 +>>> raw = [0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x1c, 0x22, 0x24, 0x28, 0x2e, 0x50, 0x5a]
 +>>> read = [0, 1.1, 2.5, 3.6, 5.0, 6.1, 7.2, 8.6, 9.7, 11.2, 12.2, 13.3, 17.3, 20.9, 22, 24.5, 28.1, 49, 55.1]
 +>>> a, b, r, p, std_err = stats.linregress(raw, read)
 +>>> a, b
 +(0.61264343715451175, -0.018142655636458116)
 +>>> std_err
 +0.0009343564466014815
 +>>>
 +</code>
 +
 +J'ai essayé avec les différentes configuration : km/h, mph, knots (nœuds), ...
 +Jamais d'erreur standard nulle mais c'est avec les km/h qu'elle est le plus faible (0.00093).
 +Certainement une erreur à cause d'arrondis.
 +
 +La fonction est donc :
 +
 +<code pycon>
 +>>> def wind(data):
 +...  return round((0.61264343715451175*data-0.018142655636458116),1)
 +...
 +>>> wind(0x5a)
 +55.1
 +</code>
 +
 +==== Pluviomètre ====
 +Pour le pluviomètre, il n'y a pas de formule. C'est un compteur : à chaque fois qu'il s'incrémente de 2 unités,
 +il faut ajouter 0,3 mm de pluie. La donnée est codée sur 1 octet, le 8ème de la transmission, et donc //overflow// à //0xFF//.
 +Il faut pouvoir gérer cette situation. Pour plus de facilité, je stocke la valeur dans un fichier temporaire.
 +
 +<code python>
 +def rain(raw):
 +     current = int(raw)
 +     try:
 +         with open("/tmp/old_rain", "r") as tmp:
 +             old_rain = int(tmp.read())
 +     except FileNotFoundError:
 +         old_rain = None
 +     except Exception as err:
 +         logging.error("Error : " + str(err))
 +         return int(0)
 +     if old_rain is None:
 +         with open("/tmp/old_rain", "w") as tmp:
 +             tmp.write(str(current))
 +         return int(0)
 +     if current > old_rain:
 +         res = round(float(current-old_rain)*0.3, 1)
 +         with open("/tmp/old_rain", "w") as tmp:
 +             tmp.write(str(current))
 +     else:
 +         if (current+255)-old_rain < 254:
 +             res = round(float((current+255)-old_rain)*0.3, 1)
 +             with open("/tmp/old_rain", "w") as tmp:
 +                 tmp.write(str(current))
 +         else:
 +             res = 0
 +     return float(res)
 +</code>
domotique/retro-ingenierie_d_une_station_meteo.1564867623.txt · Dernière modification : 03/08/2019 21:27 de antoineve