Dziękuję. W poprzednim poście coś napisałem (na co Ty odpowiedziałeś), po czym próbowałem coś zmienić i wywaliłem niechcący całą treść. Przepraszam.
Popróbuję z timerami i jak napisałem, jeśli do czegoś dojdę, napiszę.
próbuję:
Rule3
ON Time#Minute DO Backlog ModBusSend {"deviceaddress": 1, "functioncode": 3, "startaddress": 0, "type":"uint16", "count":1}; RuleTimer1 10 ENDON
ON ModbusReceived#Values[0] DO var1 = %value%/10 ENDON
ON Rules#Timer=1 DO Backlog ModBusSend {"deviceaddress": 2, "functioncode": 3, "startaddress": 0, "type":"uint16", "count":1}; RuleTimer1 0 ENDON
ON ModbusReceived#Values[0] DO var2 = %value%/10 ENDON
ale efekt jest taki:
19:01:00.947 RUL: TIME#MINUTE performs "Backlog ModBusSend {"deviceaddress": 1, "functioncode": 3, "startaddress": 0, "type":"uint16", "count":1}; RuleTimer1 10"
19:01:00.993 MQT: stat/ESP32_Cam_test/RESULT = {"ModbusSend":"Done"}
19:01:01.054 MQT: tele/ESP32_Cam_test/RESULT = {"ModbusReceived":{"DeviceAddress":1,"FunctionCode":3,"StartAddress":0,"Length":7,"Count":1,"Values":[185]}}
19:01:01.065 RUL: MODBUSRECEIVED#VALUES[0] performs "var1 = 185/10"
19:01:01.073 MQT: stat/ESP32_Cam_test/RESULT = {"Var1":"18.500"}
19:01:01.084 RUL: MODBUSRECEIVED#VALUES[0] performs "var2 = 185/10"
19:01:01.092 MQT: stat/ESP32_Cam_test/RESULT = {"Var2":"18.500"}
19:01:11.940 RUL: RULES#TIMER=1 performs "Backlog ModBusSend {"deviceaddress": 2, "functioncode": 3, "startaddress": 0, "type":"uint16", "count":1}; RuleTimer1 0"
19:01:11.986 MQT: stat/ESP32_Cam_test/RESULT = {"ModbusSend":"Done"}
19:01:12.047 MQT: tele/ESP32_Cam_test/RESULT = {"ModbusReceived":{"DeviceAddress":2,"FunctionCode":3,"StartAddress":0,"Length":7,"Count":1,"Values":[1]}}
19:01:12.057 RUL: MODBUSRECEIVED#VALUES[0] performs "var1 = 1/10"
19:01:12.065 MQT: stat/ESP32_Cam_test/RESULT = {"Var1":"0.100"}
19:01:12.074 RUL: MODBUSRECEIVED#VALUES[0] performs "var2 = 1/10"
19:01:12.083 MQT: stat/ESP32_Cam_test/RESULT = {"Var2":"0.100"}
czyli pierwsza linijka wykonuje się prawidłowo, trzecia też (po zadanym czasie 10 s), ale obie linijki odpowiadające za odbiór danych działają “poza czasem”, czyli wartości są przypisywane do obu zmiennych przy każdej komendzie odpytującej czujniki.
Chodziłoby o to, żeby czwarta linijka wykonała się o kilkanaście sekund poźniej, niż pierwsza. Ale wywołuję ją komendą ON ModbusReceived#Values
i nie wiem jak połączyć z ON Rules#Timer
=======================================
Strasznie namotałem, ale sezon na słońce lada chwila, chciałem mieć to już za sobą. Poniżej nieco kulawy (ale działający) kod:
Rule1
ON Rules#Timer=2 DO Backlog ModBusSend {"deviceaddress": 1, "functioncode": 3, "startaddress": 0, "type":"uint16", "count":1}; RuleTimer1 10 ENDON
ON ModbusReceived#Values[0] DO var1 = %value%/10 ENDON
ON Rules#Timer=1 DO Backlog Rule2 1 ; Rule1 0; RuleTimer1 5; RuleTimer2 15 ENDON
Rule2
ON Rules#Timer=1 DO ModBusSend {"deviceaddress": 2, "functioncode": 3, "startaddress": 0, "type":"uint16", "count":1} ENDON
ON ModbusReceived#Values[0] DO Backlog var2 = %value%/10; Rule2 0 ENDON
Rule3
ON System#Boot DO Backlog RuleTimer2 15; Rule1 1 ENDON
ON var6#State<200 DO var1=%value% ENDON
ON var5#State<200 DO var2=%value% ENDON
ON var1#State>=%var2% DO Backlog ModBusSend {"deviceaddress": 3, "functioncode": 6, "startaddress": 0, "type":"uint16", "count":1, "values":[512]};RuleTimer2 15; Rule1 1 ENDON
ON var1#State<%var2% DO Backlog ModBusSend {"deviceaddress": 3, "functioncode": 6, "startaddress": 0, "type":"uint16", "count":1, "values":[256]};RuleTimer2 15; Rule1 1 ENDON
Nie umiałem napisać wyzwalacza, który reagowałby na dane przychodzące od czujnika o konkretnym ID.
Po każdym zapytaniu na magistrali, czujniki odpowiadają (czujniki temperatur wartością temperatury, a moduł z przekaźnikami m.in. komendą, jaką odebrał). Robiło się zamieszanie - na przykład wartość 256, która jest poleceniem włączenia przekaźnika, była interpretowana jako temperatura 25,6 stopnia. W tym celu użyłem aż trzech reguł oraz timerów, które wyłączają się nawzajem uniemożliwiając w ten sposób interpretowania “nie swoich” poleceń.