Tasmota
-
@seb-h Par défaut Tasmota ne comprend pas les expressions mathématiques
Tu as 2 choix- Il y a des commandes pour opérer des operations sur des variables:
Add<x> n : ajoute n à var<x> (equivalent à Var<x> = Var<x> + n)
Sub<x> n
Div<x> n
Mult<x> n
Donc ce que tu as besoin de Div2 10
EssayeON tele-Wifi#RSSI do backlog var2 %value%; div2 10 ENDON
- L'autre choix est de compiler Tasmota avec l'option USE_EXPRESSION (+USE_TELEINFO of course) car il n'y a pas de binaire standard avec ces 2 options
Dans ce cas tu pourrais écriteON tele-WIfi#RSSI do var2 = %value% / 10 ENDON
Note l'usage du=
dans ce cas pour que Tasmota utilise l'évaluation d'expression
- Il y a des commandes pour opérer des operations sur des variables:
-
@barbu-dor
ON tele-Wifi#RSSI do backlog var2 %value%; div2 10 ENDON
Il n'aime pas l'insertion de "backlog" et du coup il me rajoute textuellement dans l'envoie de la commande ; div2 10 -
@seb-h C'est pas le backlog
En fait je me suis planté, j'étais persuadé que Div existait
Seul les 3 autres existent.
Donc il fautON tele-Wifi#RSSI do backlog var2 %value%; Mul2 0.1 ENDON
19:53:41.719 MQT: tele/esp32dev3/STATE = {"Time":"2022-02-10T19:53:41+01:00","Uptime":"3T21:30:06","UptimeSec":336606,"Heap":85,"SleepMode":"Dynamic","Sleep":50,"LoadAvg":19,"MqttCount":1,"Berry":{"HeapUsed":3,"Objects":34},"Wifi":{"AP":1,"SSId":"BNETWLAN","BSSId":"88:C3:97:F2:25:EC","Channel":1,"Mode":"11n","RSSI":98,"Signal":-51,"LinkCount":1,"Downtime":"0T00:00:09"}} 19:53:41.774 RUL: TELE-WIFI#RSSI performs "backlog var9 98 ; Mult9 0.1" 19:53:41.887 MQT: stat/esp32dev3/VAR = {"Var9":"98"} 19:53:42.142 MQT: stat/esp32dev3/MULT = {"Mult9":"9.800"} 19:55:00.723 RUL: TIME#MINUTE|5 performs "seriallog 2" 19:55:00.742 MQT: stat/esp32dev3/SERIALLOG = {"SerialLog":{"2":{"Active":"2"}}}
-
@barbu-dor
etrange chez moi ca ne fonctionne toujours pas..
-
@seb-h tu peux faire un
Rule0
(tout attaché) et copier le résultat ici en texte (pas en image) ? -
@barbu-dor
Aucun soucis désolé
20:43:46.216 CMD: rule0
20:43:46.221 MQT: stat/tasmota_A1AE2F/RESULT = {"Rule1":{"State":"ON","Once":"OFF","StopOnError":"OFF","Length":236,"Free":275,"Rules":"on tele-ENERGY#Power do var1 %value% endon on tele-Wifi#RSSI do backlog Var3 %value%; Mul3 0.1 endon on tele-TIC#EASF01 do publish domoticz/in {"idx":26,"nvalue":0,"svalue":"0;%value%;0.0;0.0;%var1%;0","Battery":100,"RSSI":%var3%} endon"}}
20:43:46.230 MQT: stat/tasmota_A1AE2F/RESULT = {"Rule2":{"State":"OFF","Once":"OFF","StopOnError":"OFF","Length":0,"Free":511,"Rules":""}}
20:43:46.237 MQT: stat/tasmota_A1AE2F/RESULT = {"Rule3":{"State":"OFF","Once":"OFF","StopOnError":"OFF","Length":0,"Free":511,"Rules":""}}
20:43:46.416 MQT: tele/tasmota_A1AE2F/STATE = {"Time":"2022-02-10T20:43:46","Uptime":"0T02:44:14","UptimeSec":9854,"Heap":22,"SleepMode":"Dynamic","Sleep":50,"LoadAvg":19,"MqttCount":2,"Wifi":{"AP":1,"SSId":"Sylvia&Seb","BSSId":"14:91:82:FC:0E:ED","Channel":1,"Mode":"11n","RSSI":64,"Signal":-68,"LinkCount":1,"Downtime":"0T00:00:03"}}
20:43:46.426 RUL: TELE-WIFI#RSSI performs "backlog Var3 64; Mul3 0.1"
20:43:46.441 MQT: tele/tasmota_A1AE2F/SENSOR = {"Time":"2022-02-10T20:43:46","ENERGY":{"TotalStartTime":"2022-02-10T17:59:38","Total":3860.279,"Yesterday":0.000,"Today":1.335,"Period": 1,"Power":394,"ApparentPower":444,"ReactivePower":205,"Factor":0.89,"Voltage":222,"Current":2.000,"Load":33},"TIC":{"ADSC":"061961361253","VTIC":2,"NGTF":" BASE ","LTARF":" BASE ","EAST":3860279,"EASF01":2747544,"EASF02":1112735,"EASF03":0,"EASF04":0,"EASF05":0,"EASF06":0,"EASF07":0,"EASF08":0,"EASF09":0,"EASF10":0,"EASD01":2747544,"EASD02":1112735,"EASD03":0,"EASD04":0,"IRMS1":2,"URMS1":222,"PREF":6,"PCOUP":6,"SINSTS":394,"SMAXSN":2608,"SMAXSN-1":2180,"CCASN":810,"CCASN-1":268,"UMOY1":221,"STGE":"003A0001","PRM":2147483647,"RELAIS":0,"NTARF":1,"NJOURF":0,"NJOURF+1":0}}
20:43:46.448 RUL: TELE-ENERGY#POWER performs "var1 394"
20:43:46.453 MQT: stat/tasmota_A1AE2F/RESULT = {"Var1":"394"}
20:43:46.464 RUL: TELE-TIC#EASF01 performs "publish domoticz/in {"idx":26,"nvalue":0,"svalue":"0;2747544;0.0;0.0;394;0","Battery":100,"RSSI":70}"
20:43:46.469 MQT: domoticz/in = {"idx":26,"nvalue":0,"svalue":"0;2747544;0.0;0.0;394;0","Battery":100,"RSSI":70}
20:43:46.671 MQT: stat/tasmota_A1AE2F/RESULT = {"Var3":"64"}
20:43:46.872 MQT: stat/tasmota_A1AE2F/RESULT = {"Command":"Unknown"} -
@seb-h C'est
Mult3 0.1
, pasMul
-
@barbu-dor
Rohh le blaireau qui a de le m.... dans les yeux.
Effectivement ca fonctionne !!
En revanche, maintenant domoticz m'ennuye car il y a une virgule... Tu aurais pas une fonction qui me permet d'arrondir l'ensemble sans virgule stp ?21:25:26.470 MQT: domoticz/in = {"idx":26,"nvalue":0,"svalue":"0;2747719;0.0;0.0;337;0","Battery":100,"RSSI":6.800} 21:25:26.671 MQT: stat/tasmota_A1AE2F/RESULT = {"Var3":"70"} 21:25:26.873 MQT: stat/tasmota_A1AE2F/RESULT = {"Mult3":"7.000"}
-
@seb-h Désolé là je ne vois pas
Ou tu jette ton ESP8266 et tu passe à un ESP32 avec Berry -
@barbu-dor
C'est ballot ca dis donc... on peut pas faire d'arrondi avec un esp8266 !! LOL !!
Pourtant dans la trame domoticz/in que tasmota te fait en renseignant un numéro idx, il te sort bien en dernier un chiffre représentatif de la qualité de réception du signal. On pourrait récupérer directement cette variable utilisé pour l'utiliser directement dans le rule au lieu de s'ennuyer a calculer ?? Dans le module xdrv_07_domoticz, la valeur qui m'interesse est stocker dans DomoticzRssiQuality. On a pas un moyen simple de la récupérer pour mon rule ?? -
@seb-h Non, les messages domoticz ne passent pas par le RulesEngine, ils sont publiés directement sur MQTT
-
@barbu-dor
Si je déclare une variable publique dans la source ou je recopie la valeur de DomoticzRssiQuality et je réutilise cette variable pour le rule ?? Bon j'avoue que ca commence a être compliqué..Sinon peut être une autre idée plus simple mais très certainement plus longue à écrire.
Si Wifi#RSSI<20 DO var3=1 ENDON Si Wifi#RSSI<30 AND >20 DO var3=2 etc...
En fait, le but est de d'obtenir un chiffre unique entre 1 et 10 à partir du RSSI sur 2 chiffre.. Je vais regarder pour essayer de m'en sortir, sinon je viendrais demander de l'aide. C'est beaucoup plus faisable ma 2è option ??
-
@barbu-dor
Bon alors j'ai "bidouiller" mais ca ne me plait pas des masses . Voici mon rulerule1 On tele-ENERGY#Power do var1 %value% endon On tele-Wifi#RSSI<30 do If Wifi#RSSI>=20 ; Var3 2 endif endon On tele-Wifi#RSSI<40 do If Wifi#RSSI>=30 ; Var3 3 endif endon On tele-Wifi#RSSI<50 do If Wifi#RSSI>=40 ; Var3 4 endif endon On tele-Wifi#RSSI<60 do If Wifi#RSSI>=50 ; Var3 5 endif endon On tele-Wifi#RSSI<70 do If Wifi#RSSI>=60 ; Var3 6 endif endon On tele-Wifi#RSSI<80 do If Wifi#RSSI>=70 ; Var3 7 endif endon On tele-Wifi#RSSI<90 do If Wifi#RSSI>=80 ; Var3 8 endif endon On tele-Wifi#RSSI<=100 do If Wifi#RSSI>=90 ; Var3 9 endif endon On tele-TIC#EASF01 do publish domoticz/in {"idx":26,"nvalue":0,"svalue":"0;%value%;0.0;0.0;%var1%;0","Battery":100,"RSSI":%var3%} endon
Voici le retour que ca me donne
09:09:47.433 RUL: TELE-WIFI#RSSI<80 performs "If Wifi#RSSI>=70 ; Var3 7 endif" 09:09:47.437 MQT: stat/tasmota_A1AE2F/RESULT = {"If":"Done"} 09:09:47.444 RUL: TELE-WIFI#RSSI<90 performs "If Wifi#RSSI>=80 ; Var3 8 endif" 09:09:47.448 MQT: stat/tasmota_A1AE2F/RESULT = {"If":"Done"} 09:09:47.454 RUL: TELE-WIFI#RSSI<=100 performs "If Wifi#RSSI>=90 ; Var3 9 endif" 09:09:47.460 MQT: stat/tasmota_A1AE2F/RESULT = {"If":"Done"}
Dès que j'ai un trigger qui rempli ma condition, il execute la commande !
En fait ce qui m'arrangerait c'est dans le TRIGGER de tester de suite la plage ou se trouve WIFI#RSSI , par exempleOn tele-Wifi#RSSI>20 AND tele-Wifi#RSSI <30 do Var3 2 endon
J'ai testé cette commande , mais il ne prend en compte que tele-Wifi#RSSI>20
Concernant chaque RULE , c'est limité a 10 trigger ??
-
@seb-h
Une rule n'est pas limité en terme de triggers, juste en terme de place. A partir d'une certaine taille il compresse. Tu as 512 octet par rule, ce qui représente environ 1500 à 2000 caractères une fois que la compression est utilisée.
Une rule doit démarrer par 1 triggerON trigger[condition optionelle] DO
Il faut bien comprendre qu'une rule réagit à une évenement, pas à un état. Donc mettre des AND dans le trigger n'a aucun sens. Tu n'a jamais 2 évenements qui arrivent en même temps.
tele-Wifi#RSSI
est un trigger qui correspond à l'évenement "Publication de Wifi.RSSI dans le message de Teleperiod"
Tu peux effectivement ensuite y ajouter une condition telle que "<10".Quand un évenement survient (ex publication de STATE), Tasmota prend l'evenement et scanne les rules pour les
ON xxx DO
qui correspondent a ce trigger.
Pour un message type STATE ou SESOR, il y a autant d'évenement que de valeurs dans le JSON.Ta solution avec des conditions sur les trigegrs et des IF est un peu trop compliquée. tu peut faire plus simple notamment en utilisant BREAK (voir https://tasmota.github.io/docs/Rules/#using-break-to-simulate-ifelseifelseendif).
Dans ton cas tu devrais pouvoir écrire:rule1 ON Wifi#RSSI<10 DO var3 0 BREAK ON Wifi#RSSI<20 DO var3 1 BREAK ... etc ... ON Wifi#RSSI<100 DO var3 9 BREAK ON Wifi#RSSI>=100 DO var3 10 ENDON
(j'ai écrit sur plusieurs lignes pour la lisibilité mais bien sur il faut taper sur une seule)
Le fonctionnement est que BREAK stop l'évaluation de la RULE si trigger+condition sont remplie. C'est l'équivalent de :
ON Wifi#RSSI DO IF (%value%<10) var3 0 ELSEIF (%value%<20) var3 1 .... ENDIF ENDON
C'est le même trigger qui est utilisé mais avec des conditions différentes.
Dans la même rule tu peux avoir un autre trigger après tel queON tele-ENERGY#Power DO var1 %value% ENDON
Il s'agit d'un trigger différent donc lorsque le message SENSOR avec ENERGY#Power est envoyé, les premiers ON sont ignoré et les BREAK aussi. -
@barbu-dor
Super merci beaucoup. Je ne voyais pas trop comment fonctionnait le BREAK au départ, mais a tête bien posé et écris comme tu la fait ligne par ligne, c'est super visible et compréhensible
Du coup, tu n'écris qu'une seule fois dans VAR3 !!
Ca fonctionne top !! -
sinon pour info sur mon linky dans la console de temps à autre, je pouvais voir une erreur qui passait de temps a autre. J'avais une résistance de 1.5K en amont de l'optocoupleur. Je l'ai remplacé par une 220 ohms et c'est le drame !! Ca n'arrête plus
Du coup, je vais essayer avec un 1k pour voir si il y a une différence -
@seb-h Le mieux serait si tu avais un oscilloscope pour regarder la tête du signal
Sinon, il va falloir procéder à tatons -
@barbu-dor A priori avec une 1K ca roulerait.... C'est quoi la valeur qu'on doit obtenir à l'oscillo ??
-
@seb-h Avec un oscillo c'est pas une valeur qu'il faut chercher mais un signal propre en sortie du transistor
Résistance trop forte, la led de l'opto ne s'allume pas ou pas assez et le transistor ne vas pas ou pas assez conduire
Résistance trop faible, tu vas saturer la led, risque d'usure prématurée.
Article de Charles : https://hallard.me/demystifier-la-teleinfo/ -
@barbu-dor
Merci pour le lien , j'ai pu suivre toutes les évolutions sur le développement du module depuis le départ (sans le transistor et maintenant avec).D'origine, dans mon cas, voici le schéma que j'utilise.
Je n'ai jamais eu de problème avec les vieux compteurs blanc, uniquement avec mon linky en mode standard ou de temps à autre j'avais un checksum err qui remontait dans le log (après à noter que j'ai au moins 5m de liaison entre le compteur et le module de décodage ).J'ai pu voir sur les dernières platines de Charles, que c'est une résistance de 1.2K qui était utilisé.
Sur la doc de tasmota/téléinfo, 2 schémas sont communiqués. En tout 1er, celui ci
puis un peu plus bas dans l'article on trouve celui là
Donc , 2 schémas différents sur la même page, donc j'en déduis que le bon a prendre est bien celui avec une résistance de 1.2K ? Par contre, qu'en est il pour la résistance entre la broche 3 de l'opto et la mase , car chez moi je suis à 10K ?? Ma tension Vcc d'alim est +5V , aucun impact en fonction des résistances ?
Je vais récupérer un oscillo pour jeter un coup d’œil, mais quoi qu'il en soit en dessous de 1.2K çà commence a devenir chaud pour l'opto au risque d'usure ....