hekmon / linkytic

Linky TIC support for Home Assistant
MIT License
45 stars 11 forks source link

Intégration qui s’arrête de fonctionner #9

Closed vmaubert closed 1 year ago

vmaubert commented 1 year ago

Bonjour,

J’ai acquis il y a quelques jours un TIC-DIN de chez Lixee. Je l’ai intégré très facilement via ce module, c’est du super boulot, merci pour votre investissement.

Malheureusement j’ai de temps en temps une erreur qui survient et qui nécessite un redémarrage de Home Assistant pour relancer l’intégration.

Voici l’erreur dans les journaux de Home Assistant :

Source: custom_components/linkytic/serial_reader.py:329
Integration: Linky TIC (documentation, issues)

Uncaught thread exception
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/config/custom_components/linkytic/serial_reader.py", line 112, in run
    tag = self._parse_line(line)
  File "/config/custom_components/linkytic/serial_reader.py", line 292, in _parse_line
    self._validate_checksum(tag, timestamp, field_value, checksum)
  File "/config/custom_components/linkytic/serial_reader.py", line 329, in _validate_checksum
    if computed_checksum != ord(checksum):
TypeError: ord() expected a character, but string of length 3 found

Voici les infos relatives à mon Linky :

Compteur triphasé 60 A généralisation Linky G3 - arrivée puissance basse
par SCHLUMBERGER / ACTARIS / ITRON 

Merci d’avance.

hekmon commented 1 year ago

Bonjour,

Intéressant je n'avais jamais rencontré de linky par SCHLUMBERGER / ACTARIS / ITRON ! L'erreur est étrange, le checksum est sensé être un seul caractère... pas 3 !

Je viens de rajouter une sécurité qui devrait catch cette erreur inattendue et au moins empêcher le crash du thread de la lecture de la connexion série. Elle est disponible dans la version v2.0.2 de l'intégration.

Pouvez-vous la tester et me faire un retour ?

Idéalement des logs en mode debug de l'intégration juste avant un crash aiderait beaucoup. Pour activer les logs debug juste pour l'intégration, modifier votre configuration.yaml comme suit:

logger:
  default: info
  logs:
    custom_components.linkytic: debug

Merci pour votre retour !

hekmon commented 1 year ago

Avez-vous pu regarder la nouvelle version ?

vmaubert commented 1 year ago

Désolé je n’ai pas pris le temps de mettre à jour votre correction (très rapide). Je viens de le faire à l’instant en activant les logs en mode debug. Je surveille ça et je reviens vers vous.

Merci pour votre réactivité.

vmaubert commented 1 year ago

Bonjour,

après quelques jours l’erreur est apparue plusieurs fois :

Encountered an unexpected checksum (ord() expected a character, but string of length 4 found): b'#\r\x03\x04'
Encountered an unexpected checksum (ord() expected a character, but string of length 3 found): b'K\r\x04'
Encountered an unexpected checksum (ord() expected a character, but string of length 3 found): b'M\r\x04'
Encountered an unexpected checksum (ord() expected a character, but string of length 4 found): b'L\r\x03\x04'
Encountered an unexpected checksum (ord() expected a character, but string of length 3 found): b'7\r\x04'

Voici en détail l’une des ces erreurs : 

2023-06-11 12:42:31.598 DEBUG (LinkyTIC for /dev/ttyUSB0) [custom_components.linkytic.serial_reader] line to parse: b'HCHP 019571184 7\r\x04\x02\n'
2023-06-11 12:42:31.598 ERROR (LinkyTIC for /dev/ttyUSB0) [custom_components.linkytic.serial_reader] Encountered an unexpected checksum (ord() expected a character, but string of length 3 found): b'7\r\x04'
Traceback (most recent call last):
  File "/config/custom_components/linkytic/serial_reader.py", line 333, in _validate_checksum
    if computed_checksum != ord(checksum):
TypeError: ord() expected a character, but string of length 3 found
2023-06-11 12:42:31.600 ERROR (LinkyTIC for /dev/ttyUSB0) [custom_components.linkytic.serial_reader] Failed to validate the checksum of line 'b'HCHP 019571184 7\r\x04'': HCHP -> 019571184 (None) | s1 791 0b1100010111 | truncated 23 0b10111  | computed 55 0b110111 7 | expected 48 0b110000 0

Bon courage et merci encore.

hekmon commented 1 year ago

Au moins l'intégration ne crash plus ? (ce qui était le vrai problème principal, si vous pouviez confirmer cet état de fait là cela me permettrait de fermer cette issue, nous pourrons tout de même continuer à échanger dedans).

Il ne reste plus qu'à élucider la cause de ses trames invalides. D'après le standard Enedis, le checksum n'est que d'un seul caractère. Seulement la ligne que vous m'avez transmis :

line to parse: b'HCHP 019571184 7\r\x04\x02\n'

Ressemble étrangement à une fin de cycle de transmission (qui est normalement indiqué par \r\x03\x02\n). En imaginant qu'il s'agisse effectivement d'une fin de trame, ces caractères ne sont pas enlevés (car ne correspondant pas exactement au pattern normal d'une fin de trame) par mon code de lecture série TIC et se retrouvent donc "dans" le checksum (qui aurait du seulement être 7 dans la ligne du dessus).

Cela expliquerait les messages d'erreurs obtenus. Maintenant sur le pourquoi les données lues sur le lien série ne sont pas valides... Je pencherai pour la même explication qu'ici : https://github.com/hekmon/linkytic/issues/11#issuecomment-1590031286

Avoir les lignes complètes (line to parse:) aiderait beaucoup a mettre en contexte les différentes erreurs mais je commence à penser qu'elles proviennent de données non valides lu sur le lien série.

Même conclusion que pour le commentaire que j'ai lier plus haut:

vmaubert commented 1 year ago

En effet ça ne crash plus du tout, l’erreur est juste affichée dans les logs. Je ferme donc cette issue. Pour information, l’erreur est remontée 36 fois en 3 jours. Est-ce que je peux vous aider pour corriger le problème (même si la correction me paraît suffisante).

Merci.

hekmon commented 1 year ago

Pour information, l’erreur est remontée 36 fois en 3 jours.

C'est effectivement beaucoup.

Est-ce que je peux vous aider pour corriger le problème (même si la correction me paraît suffisante).

Je reste convaincu que le problème se situe en amont, dans ce qui amène l'information série. Quel module utilisez vous, quel type de cablage entre le linky et le module ? Personnellement j'utilise du câblage électrique 2 fils, type lampe, avec une bonne section et un gainage autour de chaque cable + un global autour des deux. Concernant le module que j'utilise, c'est le lixee qui est linké au début du readme.