From ddb58577fd39e153aa277f62299de9e757c88b9f Mon Sep 17 00:00:00 2001 From: Noyax37 Date: Thu, 15 Jun 2023 19:41:21 +0200 Subject: [PATCH 1/4] 4.8.1a --- docs/fr_FR/changelog.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/fr_FR/changelog.md b/docs/fr_FR/changelog.md index ff49e62..0d226e3 100644 --- a/docs/fr_FR/changelog.md +++ b/docs/fr_FR/changelog.md @@ -35,6 +35,9 @@ Pour toutes demandes : - correction qq pb mineurs: [celui-ci](https://community.jeedom.com/t/plugin-teleinfo-actualites/100688/9?u=noyax37) et [celui-là aussi](https://community.jeedom.com/t/plugin-teleinfo-actualites/100688/10?u=noyax37) +## 4.7.3h (16-06-2023) => stable +- correction lorsque la valeur d'un index *HIER* était à 0 cette valeur n'était pas enregistrée et donc on continuait à voir la dernière valeur enregistrée différente de 0 (merci @stouph19) + ## 4.7.3g (14-03-2023) => stable - correction d'erreurs mineures From bcdb197990a8e622534f386a295c12f015b1c771 Mon Sep 17 00:00:00 2001 From: Noyax37 Date: Sun, 30 Jul 2023 08:21:14 +0200 Subject: [PATCH 2/4] 4.8.2a modif pour faire fonctionner les 2 ports modem --- core/class/teleinfo.class.php | 4 +-- docs/fr_FR/changelog.md | 6 +++- plugin_info/configuration.php | 15 ++++++---- plugin_info/info.json | 4 +-- ressources/teleinfo.py | 53 ++++++++++++++++++++++------------- 5 files changed, 52 insertions(+), 30 deletions(-) diff --git a/core/class/teleinfo.class.php b/core/class/teleinfo.class.php index f975981..e359aba 100755 --- a/core/class/teleinfo.class.php +++ b/core/class/teleinfo.class.php @@ -588,7 +588,7 @@ public static function deamon_info() log::add('teleinfo', 'debug', '[TELEINFO_deamon_modem] état : ' . $returnmodem); log::add('teleinfo', 'debug', '[TELEINFO_deamon_MQTT] état : ' . $returnmqtt); log::add('teleinfo', 'debug', '[TELEINFO_deamon_prod] état : '. $returnprod); - log::add('teleinfo', 'info', '[TELEINFO_deamon] état global => retour: ' . $return['state']); + log::add('teleinfo', 'debug', '[TELEINFO_deamon] état global => retour: ' . $return['state']); return $return; } @@ -630,7 +630,7 @@ public static function deamon_start($debug = false) //} //message::removeAll('teleinfo', 'noTeleinfoPort'); } else { - log::add('teleinfo', 'info', 'Pas d\'informations sur le port2 USB (Modem série ?) '); + log::add('teleinfo', 'info', 'Port2 non configuré '); } } if ($activation_Mqtt == 1){ diff --git a/docs/fr_FR/changelog.md b/docs/fr_FR/changelog.md index 1270327..74e600f 100644 --- a/docs/fr_FR/changelog.md +++ b/docs/fr_FR/changelog.md @@ -12,9 +12,13 @@ Pour toutes demandes : - [Changelog version stable](https://nextdom.github.io/plugin-teleinfo/fr_FR/changelog.md) - [Changelog version bêta](https://noyax.github.io/plugin-teleinfo/fr_FR/changelog.md) -## 4.8.2a (xx-xx-2023) => version bêta +## 4.8.2a (10-08-2023) => version bêta - correction afin de faire fonctionner 2 modems en même temps sur les ports 1 et 2 de teleinfo - amélioration de la gestion des démons +- modification du traitement des trames issues du compteur pour être certain de traiter l'ensemble des données envoyées par la TIC +- Déplacement du paramètre de configuration du plugin "cycle de sommeil" depuis la partie générale vers la partie modem car cela ne concerne que lui +- ajout d'un contrôle si la valeur d'un des index "EA*" (EASF.., EAST, EAIT) relevée est inférieure à la valeur relevée précédente, un index ne peut qu'augmenter +- log info un peu moins verbeux, passage de certains logs de info vers debug. Pour montrer que le log teleinfo_daemon_conso tourne => affichage toutes les 30 minutes de la dernière trame reçue de la TIC et les infos envoyées vers Jeedom (le démon n'envoie pas vers Jeedom des infos qui n'ont pas changées) ## 4.8.1a (16-06-2023) => version bêta - Affichage du signe € à la place de $ dans les options du plugin diff --git a/plugin_info/configuration.php b/plugin_info/configuration.php index fff193a..1ff990c 100755 --- a/plugin_info/configuration.php +++ b/plugin_info/configuration.php @@ -64,6 +64,15 @@
{{Modem : configuration Générale}} +
+
+ +
+ +
+ +
+
-
- -
- -
-






diff --git a/plugin_info/info.json b/plugin_info/info.json index 084bef3..c6c7b21 100644 --- a/plugin_info/info.json +++ b/plugin_info/info.json @@ -1,9 +1,9 @@ { "id" : "teleinfo", "name" : "Téléinfo", - "description" : "Plugin pour utiliser les modems téléinformation USB / Série", + "description" : "Plugin pour utiliser les modems téléinformation USB / Série. Développé initialement par Cédric Guine (@Ticed35)", "licence" : "AGPL", - "author" : "Cédric GUINE repris par Noyax37", + "author" : "Noyax", "require" : "4.2", "category" : "automation protocol", "display" : "panel", diff --git a/ressources/teleinfo.py b/ressources/teleinfo.py index 5ae31ae..4e0e3d0 100644 --- a/ressources/teleinfo.py +++ b/ressources/teleinfo.py @@ -20,7 +20,7 @@ sys.exit(1) import serial -from datetime import datetime +from datetime import date, datetime class error(Exception): def __init__(self, value): @@ -67,6 +67,8 @@ def read(self): content = {} while not is_ok: try: + while 'VTIC' not in resp: + resp = (globals.TELEINFO_SERIAL.readline().decode("UTF-8")) while 'ADSC' not in resp: if premtrame: premtrame = False @@ -79,7 +81,7 @@ def read(self): if self._is_valid(resp, checksum): content[name] = value else: - logging.error("MODEM------ ** DONNEES HS ! ** sur trame : " + resp) + logging.debug("MODEM------ ** DONNEES HS ! ** sur trame : " + resp) logging.debug('MODEM----name : ' + name + ' value : ' + value + ' Horodate : ' + horodate + ' checksum : ' + checksum) else: name, value, checksum = resp.replace('\r', '').replace('\n', '').split('\x09') @@ -291,7 +293,7 @@ def read(self): name = 'RELAIS' else: - logging.error('MODEM------ ** DONNEES HS ! ** sur trame : ' + resp + ' checksum : ' + checksum) + logging.debug('MODEM------ ** DONNEES HS ! ** sur trame : ' + resp + ' checksum : ' + checksum) logging.debug('MODEM------ name : ' + name + ' value : ' + value + ' Horodate : ' + " " + ' checksum : ' + checksum) logging.debug('MODEM------ Content : ' + str(content)) @@ -371,7 +373,7 @@ def _is_valid(frame, checksum): my_sum = my_sum + ord(cks) computed_checksum = ((my_sum + 0x09) & int("111111", 2)) + 0x20 if chr(computed_checksum) != checksum[0:1]: - logging.error('MODEM------ checksum non concordant. Checksum reçu : ' + checksum[0:1] + ' Checksum calcul : ' + chr( + logging.debug('MODEM------ checksum non concordant. Checksum reçu : ' + checksum[0:1] + ' Checksum calcul : ' + chr( computed_checksum)) else: logging.debug('MODEM------ .......... checksum concordant. Checksum reçu : ' + checksum[0:1] + ' Checksum calcul : ' + chr(computed_checksum)) @@ -391,21 +393,20 @@ def run(self): """ data = {} data_temp = {} - raz_calcul = 0 - separateur = " " - send_data = "" + raz_day = 0 + info_heure_calcul = 0 - # Read a frame - raz_time = datetime.now() + # Read a frame + RAZ au changement de date + raz_day = date.today() + info_heure = datetime.now() while 1: - raz_calcul = datetime.now() - raz_time - if raz_calcul.seconds > 60: - logging.info("MODEM------ HEARTBEAT") - raz_time = datetime.now() + if raz_day != date.today(): + raz_day = date.today() + time.sleep(10) + logging.info("MODEM------ HEARTBEAT raz le " + str(raz_day)) for cle, valeur in list(data.items()): data.pop(cle) data_temp.pop(cle) - send_data = "" frame_csv = self.read() for cle, valeur in frame_csv.items(): if cle == 'PTEC': @@ -424,9 +425,18 @@ def run(self): for cle, valeur in data.items(): if cle in data_temp: if data[cle] != data_temp[cle]: - _SendData[cle] = valeur - data_temp[cle] = valeur - pending_changes = True + if cle[:3] == 'EAS' or cle[:3] == 'EAI': # test si on a affaire à un index commençant par EAI ou EAS (EAIT, EASF??, ...) + if (int(data[cle]) > int(data_temp[cle])) and (int(data[cle]) < (int(data_temp[cle]) + 10000)): #s i la valeur relevée est plus grande que celle en mémoire et qu'elle n'est pas 10 kwh au dessus c'est ok + _SendData[cle] = valeur + data_temp[cle] = valeur + pending_changes = True + else: # sinon on ne la prend pas en compte + logging.error('Valeur incohérente pour l index ' + str(cle) + ' à ' + str(data[cle])) + data_temp[cle] = valeur # là c'est au cas où la valeur relevée était incohérente mais plus grande que celle en mémoire alors on ne prendrait plus jamais celle relevée + else: + _SendData[cle] = valeur + data_temp[cle] = valeur + pending_changes = True else: _SendData[cle] = valeur data_temp[cle] = valeur @@ -442,14 +452,19 @@ def run(self): except Exception: error_com = "Connection error" logging.error(error_com) + info_heure_calcul = datetime.now() - info_heure + if info_heure_calcul.seconds > 1800: + logging.info('MODEM------ Dernières datas reçues de la TIC : ' + str(data)) + logging.info('MODEM------ Dernières datas envoyées vers Jeedom : ' + str(_SendData)) + info_heure = datetime.now() logging.debug("MODEM------ START SLEEPING " + str(globals.cycle_sommeil) + " seconds") time.sleep(globals.cycle_sommeil) logging.debug("MODEM------ WAITING : " + str( globals.TELEINFO_SERIAL.inWaiting()) + " octets dans la file apres sleep ") if globals.TELEINFO_SERIAL.inWaiting() > 1500: globals.TELEINFO_SERIAL.flushInput() - logging.info("MODEM------ BUFFER OVERFLOW => FLUSH") - logging.debug(str(globals.TELEINFO_SERIAL.inWaiting()) + "octets dans la file apres flush ") + logging.debug("MODEM------ BUFFER OVERFLOW => FLUSH") + logging.debug(str(globals.TELEINFO_SERIAL.inWaiting()) + " octets dans la file apres flush ") self.terminate() @staticmethod From c53ac727cd6da5992ef0b18276cedc8843c05b7d Mon Sep 17 00:00:00 2001 From: Noyax37 Date: Thu, 10 Aug 2023 09:48:37 +0200 Subject: [PATCH 3/4] 4.8.2a bis --- plugin_info/info.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin_info/info.json b/plugin_info/info.json index c6c7b21..87449fc 100644 --- a/plugin_info/info.json +++ b/plugin_info/info.json @@ -3,7 +3,7 @@ "name" : "Téléinfo", "description" : "Plugin pour utiliser les modems téléinformation USB / Série. Développé initialement par Cédric Guine (@Ticed35)", "licence" : "AGPL", - "author" : "Noyax", + "author" : "Cédric GUINE repris par Noyax37", "require" : "4.2", "category" : "automation protocol", "display" : "panel", From d118df2be06dadb1107b24ef8a5a455ac9dce759 Mon Sep 17 00:00:00 2001 From: Noyax37 Date: Mon, 25 Sep 2023 21:00:40 +0200 Subject: [PATCH 4/4] 4.8.2c MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit redémarrage intempestif démon --- core/class/teleinfo.class.php | 1 - docs/fr_FR/changelog.md | 3 +++ plugin_info/info.json | 2 +- ressources/teleinfo.py | 23 ++++++++++++++--------- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/core/class/teleinfo.class.php b/core/class/teleinfo.class.php index 2ff8068..4411d61 100755 --- a/core/class/teleinfo.class.php +++ b/core/class/teleinfo.class.php @@ -1689,7 +1689,6 @@ public static function calculateOtherStats() } log::add('teleinfo', 'info', 'other stats -------------------------------------'); } - public static function copyVersIndex($compteur, $startDate, $endDate, $indexcopy01,$indexcopy02,$indexcopy03,$indexcopy04,$indexcopy05,$indexcopy06,$indexcopy07,$indexcopy08,$indexcopy09,$indexcopy10, $coutcopy00,$coutcopy01,$coutcopy02,$coutcopy03,$coutcopy04,$coutcopy05,$coutcopy06,$coutcopy07,$coutcopy08,$coutcopy09,$coutcopy10,$coutcopyprod){ diff --git a/docs/fr_FR/changelog.md b/docs/fr_FR/changelog.md index 710812a..dab8710 100644 --- a/docs/fr_FR/changelog.md +++ b/docs/fr_FR/changelog.md @@ -12,6 +12,9 @@ Pour toutes demandes : - [Changelog version stable](https://nextdom.github.io/plugin-teleinfo/fr_FR/changelog.md) - [Changelog version bêta](https://noyax.github.io/plugin-teleinfo/fr_FR/changelog.md) +## 4.8.2c (09-09-2023) => version stable ET bêta +- Pour les deux versions: résolution d'un problème de redémarrage intempestif du démon + ## 4.8.2b (09-09-2023) => version stable ET bêta - Pour la version béta: pas de changement, cette montée en version n'est là que pour vous prévenir que la version stable rejoint la version béta donc si vous ne voulez pas rester en béta vous pouvez rebasculer en stable - pour la version stable: toutes les évolutions depuis la dernières version stable qui était la 4.7.3h diff --git a/plugin_info/info.json b/plugin_info/info.json index fe7b2ef..d0e671b 100644 --- a/plugin_info/info.json +++ b/plugin_info/info.json @@ -18,5 +18,5 @@ "documentation" : "https://NextDom.github.io/plugin-teleinfo/fr_FR/", "changelog_beta" : "https://Noyax.github.io/plugin-teleinfo/fr_FR/changelog", "documentation_beta" : "https://Noyax.github.io/plugin-teleinfo/fr_FR/", - "pluginVersion" : "4.8.2b" + "pluginVersion" : "4.8.2c" } diff --git a/ressources/teleinfo.py b/ressources/teleinfo.py index 4e0e3d0..4dd0db0 100644 --- a/ressources/teleinfo.py +++ b/ressources/teleinfo.py @@ -323,8 +323,7 @@ def read(self): logging.debug('MODEM------ name : ' + name + ' value : ' + value) else: name, value, checksum = resp.replace('\r', '').replace('\n', '').split() - logging.debug( - 'MODEM------ name : ' + name + ' value : ' + value + ' checksum : ' + checksum) + logging.debug('MODEM------ name : ' + name + ' value : ' + value + ' checksum : ' + checksum) if self._is_valid(resp, checksum): content[name] = value else: @@ -341,8 +340,7 @@ def read(self): checksum = ' ' logging.debug('MODEM------ name : ' + name + ' value : ' + value) else: - name, value, checksum = resp.replace('\r', '').replace('\n', '').replace('\x02', '').replace( - '\x03', '').split() + name, value, checksum = resp.replace('\r', '').replace('\n', '').replace('\x02', '').replace('\x03', '').split() logging.debug('MODEM------ name : ' + name + ' value : ' + value + ' checksum : ' + checksum) if self._is_valid(resp, checksum): is_ok = True @@ -373,10 +371,9 @@ def _is_valid(frame, checksum): my_sum = my_sum + ord(cks) computed_checksum = ((my_sum + 0x09) & int("111111", 2)) + 0x20 if chr(computed_checksum) != checksum[0:1]: - logging.debug('MODEM------ checksum non concordant. Checksum reçu : ' + checksum[0:1] + ' Checksum calcul : ' + chr( - computed_checksum)) + logging.debug('MODEM------ checksum non concordant. Checksum reçu : ' + checksum[0:1] + ' Checksum calcul : ' + chr(computed_checksum)) else: - logging.debug('MODEM------ .......... checksum concordant. Checksum reçu : ' + checksum[0:1] + ' Checksum calcul : ' + chr(computed_checksum)) + logging.debug('MODEM------ checksum concordant. Checksum reçu : ' + checksum[0:1] + ' Checksum calcul : ' + chr(computed_checksum)) else: # print "Check checksum : f = %s, chk = %s" % (frame, checksum) datas = ' '.join(frame.split()[0:2]) @@ -384,6 +381,10 @@ def _is_valid(frame, checksum): for cks in datas: my_sum = my_sum + ord(cks) computed_checksum = (my_sum & int("111111", 2)) + 0x20 + if chr(computed_checksum) != checksum[0:1]: + logging.debug('MODEM------ checksum non concordant. Checksum reçu : ' + checksum[0:1] + ' Checksum calcul : ' + chr(computed_checksum)) + else: + logging.debug('MODEM------ checksum concordant. Checksum reçu : ' + checksum[0:1] + ' Checksum calcul : ' + chr(computed_checksum)) # print "computed_checksum = %s" % chr(computed_checksum) return chr(computed_checksum) == checksum[0:1] @@ -394,9 +395,11 @@ def run(self): data = {} data_temp = {} raz_day = 0 + raz_time = 0 info_heure_calcul = 0 - # Read a frame + RAZ au changement de date + # Read a frame + RAZ au changement de date + evite le heartbeat du demon + raz_time = datetime.now() raz_day = date.today() info_heure = datetime.now() while 1: @@ -422,9 +425,10 @@ def run(self): data[cle] = valeur _SendData = {} pending_changes = False + raz_calcul = datetime.now() - raz_time for cle, valeur in data.items(): if cle in data_temp: - if data[cle] != data_temp[cle]: + if ((data[cle] != data_temp[cle]) or (raz_calcul.seconds > 55)): if cle[:3] == 'EAS' or cle[:3] == 'EAI': # test si on a affaire à un index commençant par EAI ou EAS (EAIT, EASF??, ...) if (int(data[cle]) > int(data_temp[cle])) and (int(data[cle]) < (int(data_temp[cle]) + 10000)): #s i la valeur relevée est plus grande que celle en mémoire et qu'elle n'est pas 10 kwh au dessus c'est ok _SendData[cle] = valeur @@ -443,6 +447,7 @@ def run(self): pending_changes = True try: if pending_changes: + raz_time = datetime.now() if globals.mode == "standard": _SendData["device"] = data["ADSC"] globals.JEEDOM_COM.add_changes('device::' + data["ADSC"], _SendData)