NEWS
ESPEasy Rules Mehrfach Trigger und Timer
-
@maddin77 said in ESPEasy Rules Mehrfach Trigger und Timer:
weiterhin wollte ich 2 Timer nutzen
damit 2 Gpio´s verzögert geschalten werden, auch das klappt nicht so wie gedachtEin delay konnte ich noch nicht finden und timmer finde ich immer sehr unschön. vom prinzip brauchst du aber für den Timer wieder einen Trigger:
On System#Boot do //When the ESP boots, do timerSet,1,10 //Set Timer 1 for the next event in 10 seconds endon On Rules#Timer=1 do //When Timer1 expires, do GPIO,1,1 endon
-
@dieter_p sagte in ESPEasy Rules Mehrfach Trigger und Timer:
@maddin77 said in ESPEasy Rules Mehrfach Trigger und Timer:
Hallo
kann mir vielleicht jemand helfen,
ich habe ein Rules erstellt um GPIO´s mit vers, bedingen zu schalten
jetzt würde ich gerne mehrere Trigger setzten
do HPStufe#AutoEin on
endon
geht noch
aber weder or oder OR: funktioniertgewollt wäre
do HPStufe#AutoEin or Heizstab_Stufe_ist#Stufe on
endon
geht nicht mehrDer Teil hinter do ist die Action und nicht der Trigger.
entsprechen funktioniert:
..... do HPStufe#AutoEin on // Schreibweise anpassen um die Aktion auszuführen Heizstab_Stufe_ist#Stufe on // Schreibweise anpassen um die Aktion auszuführen endon
danke erst mal
ich scheibe später mal die genaue Rule rein -
@dieter_p sagte in ESPEasy Rules Mehrfach Trigger und Timer:
@maddin77 said in ESPEasy Rules Mehrfach Trigger und Timer:
weiterhin wollte ich 2 Timer nutzen
damit 2 Gpio´s verzögert geschalten werden, auch das klappt nicht so wie gedachtEin delay konnte ich noch nicht finden und timmer finde ich immer sehr unschön. vom prinzip brauchst du aber für den Timer wieder einen Trigger:
On System#Boot do //When the ESP boots, do timerSet,1,10 //Set Timer 1 for the next event in 10 seconds endon On Rules#Timer=1 do //When Timer1 expires, do GPIO,1,1 endon
auch hier liefere ich die genaue Rule nach
dann ist es besser -
Hier nun die Rules 1
on System#Boot do GPIO,32,0 // Rel1 GPIO,33,0 // Rel2 GPIO,25,0 // Rel3 GPIO,26,0 // Rel4 GPIO,27,0 // Rel5 GPIO,14,0 // Rel6 GPIO,12,0 // Rel7 GPIO,13,0 // Rel8 endon on Heizung_Puffer_mqtt#stufe_soll do If [Heizung_Puffer_mqtt#stufe_soll]<=0 //AUS GPIO,32,0 // Rel1 GPIO,33,0 // Rel2 GPIO,25,0 // Rel3 GPIO,26,0 // Rel4 GPIO,27,0 // Rel5 TaskValueSet 9,1,0 // Status#Stufe Plugin 16,Variable 1,Wert 0 Elseif [Heizung_Puffer_mqtt#stufe_soll]=1 //AUS GPIO,33,0 // Rel2 GPIO,25,0 // Rel3 GPIO,26,0 // Rel4 GPIO,27,0 // Rel5 //EIN GPIO,32,1 // Rel1 TaskValueSet 9,1,1 // Status#Stufe Plugin 16,Variable 1,Wert 1 Elseif [Heizung_Puffer_mqtt#stufe_soll]=2 //AUS GPIO,32,0 // Rel1 GPIO,33,0 // Rel2 GPIO,26,0 // Rel4 //EIN GPIO,27,1 // Rel5 timerSet,1,5 // für Rel3 in Stufe 2 TaskValueSet 9,1,2 // Status#Stufe Plugin 16,Variable 1,Wert 2 Elseif [Heizung_Puffer_mqtt#stufe_soll]=3 //AUS GPIO,32,0 // Rel1 GPIO,25,0 // Rel3 GPIO,26,0 // Rel4 GPIO,27,0 // Rel5 //EIN GPIO,33,1 // Rel2 TaskValueSet 9,1,3 // Status#Stufe Plugin 16,Variable 1,Wert 3 Elseif [Heizung_Puffer_mqtt#stufe_soll]=4 //AUS GPIO,32,0 // Rel1 GPIO,26,0 // Rel4 //EIN GPIO,33,1 // Rel2 GPIO,27,1 // Rel5 timerSet,2,5 // für Rel3 in Stufe 4 TaskValueSet 9,1,4 // Status#Stufe Plugin 16,Variable 1,Wert 4 Elseif [Heizung_Puffer_mqtt#stufe_soll]=5 //AUS GPIO,26,0 // Rel4 GPIO,27,0 // Rel5 //EIN GPIO,32,1 // Rel1 GPIO,33,1 // Rel2 GPIO,25,1 // Rel3 TaskValueSet 9,1,5 // Status#Stufe Plugin 16,Variable 1,Wert 5 Elseif [Heizung_Puffer_mqtt#stufe_soll]=6 //AUS GPIO,25,0 // Rel3 GPIO,26,0 // Rel4 GPIO,27,0 // Rel5 //EIN GPIO,32,1 // Rel1 GPIO,33,1 // Rel2 GPIO,26,1 // Rel4 TaskValueSet 9,1,6 // Status#Stufe Plugin 16,Variable 1,Wert 6 Else //AUS GPIO,32,0 // Rel1 GPIO,33,0 // Rel2 GPIO,25,0 // Rel3 GPIO,26,0 // Rel4 GPIO,27,0 // Rel5 TaskValueSet 9,1,0 // Status#Stufe Plugin 16,Variable 1,Wert 0 endif endon On Rules#Timer=1 do If [Heizung_Puffer_mqtt#stufe_soll]=2 //and [GPIO27#value]=1 GPIO,25,1 // Rel3 nach Ablauf Timer1 / St2 endif endon On Rules#Timer=2 do If [Heizung_Puffer_mqtt#stufe_soll]=4 // and [GPIO27#value]=1 GPIO,25,1 // Rel3 nach Ablauf Timer1 / St2 endif endon
Und Rule 3
on System#Boot do //Aus TaskValueSet 27,1,0 //Auto TaskValueSet 27,2,0 //Man TaskValueSet 27,3,1 //Aus endon on Rules#Timer=5 do //On SWAuto#AutoEin Do If [SWAuto#AutoEin]=1 And [SWMan#ManEin]=0 //Auto TaskValueSet 27,1,1 //Auto TaskValueSet 27,2,0 //Man TaskValueSet 27,3,0 //Aus Elseif [SWAuto#AutoEin]=0 And [SWMan#ManEin]=1 //Man TaskValueSet 27,1,0 //Auto TaskValueSet 27,2,1 //Man TaskValueSet 27,3,0 //Aus Else //Aus TaskValueSet 27,1,0 //Auto TaskValueSet 27,2,0 //Man TaskValueSet 27,3,1 //Aus Endif Endon
Jetzt soll mit der Rule 3 eine
Manuel / Automatik / Aus
Erzeugt werden
Und damit die Rule 1 bei Aus deaktiviert werden
Bei Automatik ganz normal laufen und bei Manuel eine feste Stufe aktiviert werdenEinzel läuft alles
Aber sobald ich Rule 1 trigger hinzufüge geht nichts mehr
Und die Timer laufen auch nicht wirklich -
Das hab ich noch probiert
Rules alles in eine undon System#Boot do GPIO,32,0 // Rel1 GPIO,33,0 // Rel2 GPIO,25,0 // Rel3 GPIO,26,0 // Rel4 GPIO,27,0 // Rel5 GPIO,14,0 // Rel6 GPIO,12,0 // Rel7 GPIO,13,0 // Rel8 //Aus TaskValueSet 27,1,0 //Auto TaskValueSet 27,2,0 //Man TaskValueSet 27,3,1 //Aus LoopTimerSet,1,6 endon on Rules#Timer=1 do //On SWAuto#AutoEin Do If [SWAuto#AutoEin]=1 And [SWMan#ManEin]=0 //Auto TaskValueSet 27,1,1 //Auto TaskValueSet 27,2,0 //Man TaskValueSet 27,3,0 //Aus Elseif [SWAuto#AutoEin]=0 And [SWMan#ManEin]=1 //Man TaskValueSet 27,1,0 //Auto TaskValueSet 27,2,1 //Man TaskValueSet 27,3,0 //Aus Else //Aus TaskValueSet 27,1,0 //Auto TaskValueSet 27,2,0 //Man TaskValueSet 27,3,1 //Aus Endif //Endon //on Heizung_Puffer_mqtt#stufe_soll do If [Heizung_Puffer_mqtt#stufe_soll]<=0 And [HPModus#Auto]=1 //AUS GPIO,32,0 // Rel1 GPIO,33,0 // Rel2 GPIO,25,0 // Rel3 GPIO,26,0 // Rel4 GPIO,27,0 // Rel5 TaskValueSet 9,1,0 // Status#Stufe Plugin 9,Variable 1,Wert 0 Elseif [Heizung_Puffer_mqtt#stufe_soll]=1 And [HPModus#Auto]=1 //AUS GPIO,33,0 // Rel2 GPIO,25,0 // Rel3 GPIO,26,0 // Rel4 GPIO,27,0 // Rel5 //EIN GPIO,32,1 // Rel1 TaskValueSet 9,1,1 // Status#Stufe Plugin 9,Variable 1,Wert 1 Elseif [Heizung_Puffer_mqtt#stufe_soll]=2 And [HPModus#Auto]=1 //AUS GPIO,32,0 // Rel1 GPIO,33,0 // Rel2 GPIO,26,0 // Rel4 GPIO,12,0 // Rel7 //EIN GPIO,25,1 // Rel3 GPIO,27,1 // Rel5 TaskValueSet 9,1,2 // Status#Stufe Plugin 9,Variable 1,Wert 2 Elseif [Heizung_Puffer_mqtt#stufe_soll]=3 And [HPModus#Auto]=1 //AUS GPIO,32,0 // Rel1 GPIO,25,0 // Rel3 GPIO,26,0 // Rel4 GPIO,27,0 // Rel5 GPIO,12,0 // Rel7 //EIN GPIO,33,1 // Rel2 TaskValueSet 9,1,3 // Status#Stufe Plugin 9,Variable 1,Wert 3 Elseif [Heizung_Puffer_mqtt#stufe_soll]=4 And [HPModus#Auto]=1 or [HPModus#Man]=1 //AUS GPIO,32,0 // Rel1 GPIO,26,0 // Rel4 GPIO,12,0 // Rel7 //EIN GPIO,33,1 // Rel2 GPIO,25,1 // Rel3 GPIO,27,1 // Rel5 TaskValueSet 9,1,4 // Status#Stufe Plugin 9,Variable 1,Wert 4 Elseif [Heizung_Puffer_mqtt#stufe_soll]=5 And [HPModus#Auto]=1 //AUS GPIO,26,0 // Rel4 GPIO,12,0 // Rel7 //timerSet,2,10 // für Rel5 in Stufe 5 // GPIO,27,0 // Rel5 nach Ablauf Timer2 / St5 //EIN GPIO,32,1 // Rel1 GPIO,33,1 // Rel2 GPIO,25,1 // Rel3 TaskValueSet 9,1,5 // Status#Stufe Plugin 9,Variable 1,Wert 5 Elseif [Heizung_Puffer_mqtt#stufe_soll]=6 And [HPModus#Auto]=1 //AUS GPIO,32,0 // Rel1 GPIO,27,0 // Rel5 //EIN GPIO,33,1 // Rel2 GPIO,25,1 // Rel3 //timerSet,3,10 // für Rel4 in Stufe 6 //GPIO,26,1 // Rel4 nach Ablauf Timer1 / St6 TaskValueSet 9,1,6 // Status#Stufe Plugin 9,Variable 1,Wert 6 Else //AUS GPIO,32,0 // Rel1 GPIO,33,0 // Rel2 GPIO,25,0 // Rel3 GPIO,26,0 // Rel4 GPIO,27,0 // Rel5 GPIO,12,0 // Rel7 TaskValueSet 9,1,0 // Status#Stufe Plugin 9,Variable 1,Wert 0 endif Endon On Rel2#State do If [Heitzstab_Stufe_Ist#Stufe]=6 GPIO,12,1 // Rel7 timerSet,3,10 // für Rel5 in Stufe 6 else GPIO,12,0 // Rel7 endif endon On Rules#Timer=3 do If [Heizung_Puffer_mqtt#stufe_soll]=6 GPIO,26,1 // Rel4 nach Ablauf Timer1 / St6 endif On Rules#Timer=2 do If [Heizung_Puffer_mqtt#stufe_soll]=5 //GPIO,27,0 // Rel5 nach Ablauf Timer2 / St5 endif endon
-
@maddin77 said in ESPEasy Rules Mehrfach Trigger und Timer:
Das hab ich noch probiert
Rules alles in eine undSorry das ist mir im Spaghetticodestil zu komplex. Vom Bauchgefühl würde ich das aber nicht über einen Timer triggern, sondern über die Änderung von Zuständen zB von Switches oder Variablen bzw. direkt dem angelegten DummyDevice. Das verhält sich dann nachvollziehbarer vom Programmablauf für mich und diese Dauerschleife erscheinen mir höchst Ineffizient vom Programmierstil.
-
@dieter_p sagte in ESPEasy Rules Mehrfach Trigger und Timer:
@maddin77 said in ESPEasy Rules Mehrfach Trigger und Timer:
Das hab ich noch probiert
Rules alles in eine undSorry das ist mir im Spaghetticodestil zu komplex. Vom Bauchgefühl würde ich das aber nicht über einen Timer triggern, sondern über die Änderung von Zuständen zB von Switches oder Variablen bzw. direkt dem angelegten DummyDevice. Das verhält sich dann nachvollziehbarer vom Programmablauf für mich und diese Dauerschleife erscheinen mir höchst Ineffizient vom Programmierstil.
ja es sollte ja auch über den DummyDevice laufen, aber das wären dann insgesamt 4 Trigger und das klappt gar nicht.
Ich hatte probiert
If [Heizung_Puffer_mqtt#stufe_soll]<=0 And [HPModus#Auto]=1 or [HPModus#Man]=0 or [HPModus#Aus]=0
klappt das aber nicht
Die beiden Timer waren nur gedacht 2 Relais etwas verzögert zu schalten 2-3Sek
der LoopTimer war nur ein TestWas ist Spaghetticodestil?
danke für deine Hilfe soweit
-
@maddin77 said in ESPEasy Rules Mehrfach Trigger und Timer:
@dieter_p sagte in ESPEasy Rules Mehrfach Trigger und Timer:
@maddin77 said in ESPEasy Rules Mehrfach Trigger und Timer:
Das hab ich noch probiert
Rules alles in eine undSorry das ist mir im Spaghetticodestil zu komplex. Vom Bauchgefühl würde ich das aber nicht über einen Timer triggern, sondern über die Änderung von Zuständen zB von Switches oder Variablen bzw. direkt dem angelegten DummyDevice. Das verhält sich dann nachvollziehbarer vom Programmablauf für mich und diese Dauerschleife erscheinen mir höchst Ineffizient vom Programmierstil.
ja es sollte ja auch über den DummyDevice laufen, aber das wären dann insgesamt 4 Trigger und das klappt gar nicht.
Ich hatte probiert
If [Heizung_Puffer_mqtt#stufe_soll]<=0 And [HPModus#Auto]=1 or [HPModus#Man]=0 or [HPModus#Aus]=0
klappt das aber nicht
Die beiden Timer waren nur gedacht 2 Relais etwas verzögert zu schalten 2-3Sek
der LoopTimer war nur ein TestIch verstehe Dein DummyDevice aus der Intention damit 3 Stati abzubilden (Aus, Man, Auto). Reicht dazu nicht ein Switch als DummyDevice? der kann 0,1 oder 2 sein. Dadurch sparst Du dir immer 3 Values dort zu prüfen, da ein value absolute eindeutig ist.
Um die Stati zu ändern bekommst irgendwoher den Trigger. Kommt das über Mqtt Import?
Würde das in dieser Richtung versuchen:on System#Boot do GPIO,32,0 // Rel1 GPIO,33,0 // Rel2 GPIO,25,0 // Rel3 GPIO,26,0 // Rel4 GPIO,27,0 // Rel5 GPIO,14,0 // Rel6 GPIO,12,0 // Rel7 GPIO,13,0 // Rel8 //Aus TaskValueSet 27,1,0 //Aus endon on Heizung_Puffer_mqtt#stufe_soll do If [Heizung_Puffer_mqtt#stufe_soll]=0 TaskValueSet 27,1,0 //Aus Eslseif [Heizung_Puffer_mqtt#stufe_soll]=1 TaskValueSet 27,1,1 //Auto Eslseif [Heizung_Puffer_mqtt#stufe_soll]=2 TaskValueSet 27,1,2 //Man Endif on SWAuto#AutoEin do TimerSet,1,6 endon on Rules#Timer=1 do If [SWAuto#AutoEin]=0 GPIO,32,0 // Rel1 Beispiel Eslseif [SWAuto#AutoEin]=1 GPIO,33,0 // Rel2 Beispiel Eslseif [SWAuto#AutoEin]=2 GPIO,25,0 // Rel3 Beispiel Endif endon
Was ist Spaghetticodestil?
Mir persönlich zu langer Programmiercode den am Ende nichtmal mehr derjenige durchblickt, der ihn mal gebaut hat. Empfinde es subjektiv immer nicht so toll sich selbst solche zu komplexen Dinge einzubauen. Das kann später kaum jemand warten, helfen oder debuggen.
-
@dieter_p sagte in ESPEasy Rules Mehrfach Trigger und Timer:
Ich verstehe Dein DummyDevice aus der Intention damit 3 Stati abzubilden (Aus, Man, Auto). Reicht dazu nicht ein Switch als DummyDevice? der kann 0,1 oder 2 sein. Dadurch sparst Du dir immer 3 Values dort zu prüfen, da ein value absolute eindeutig ist.
Um die Stati zu ändern bekommst irgendwoher den Trigger. Kommt das über Mqtt Import?
Würde das in dieser Richtung versuchen:on System#Boot do GPIO,32,0 // Rel1 GPIO,33,0 // Rel2 GPIO,25,0 // Rel3 GPIO,26,0 // Rel4 GPIO,27,0 // Rel5 GPIO,14,0 // Rel6 GPIO,12,0 // Rel7 GPIO,13,0 // Rel8 //Aus TaskValueSet 27,1,0 //Aus endon on Heizung_Puffer_mqtt#stufe_soll do If [Heizung_Puffer_mqtt#stufe_soll]=0 TaskValueSet 27,1,0 //Aus Eslseif [Heizung_Puffer_mqtt#stufe_soll]=1 TaskValueSet 27,1,1 //Auto Eslseif [Heizung_Puffer_mqtt#stufe_soll]=2 TaskValueSet 27,1,2 //Man Endif on SWAuto#AutoEin do TimerSet,1,6 endon on Rules#Timer=1 do If [SWAuto#AutoEin]=0 GPIO,32,0 // Rel1 Beispiel Eslseif [SWAuto#AutoEin]=1 GPIO,33,0 // Rel2 Beispiel Eslseif [SWAuto#AutoEin]=2 GPIO,25,0 // Rel3 Beispiel Endif endon
Aktuell nutze ich 2 Switch um den Schalter zu erkennen, da ein 3stellungsschalter verbaut ist
der Manuell umgeschaltet werden soll, kein MQTT
also meinst du aus
AutoEin=1 und ManuEin=0 -->Automatik
AutoEin=0 und ManuEin=1 -->Manuel
AutoEin=0 und ManuEin= oder AutoEin=1 und ManuEin=1 -->Ausdie Stufen die geschaltet werden kommen per MQTT aus dem IOB
das klappt zuverlässig.müsste ich das mal versuchen um zu setzen irgendwie
ja das mit dem langen Code geäfllt mir auch nicht, war nur ein Versuch, da er in Rule3 z.B. den Trigger den ich in Rule1 verwendet hatte ignoriert, als ob er ihn nur einmal abarbeitet.der Plan ist
Rule1 die Relais über die Stufen aus MQTT zu schalten
Rule2 ist eine Temperatur Sicherung für ein Lastrelai
Rule3 war die Umsetzung der 2 Switch auf ein Dummy mit 3 Stellungendanke nochmals
-
@maddin77 said in ESPEasy Rules Mehrfach Trigger und Timer:
Aktuell nutze ich 2 Switch um den Schalter zu erkennen, da ein 3stellungsschalter verbaut ist
der Manuell umgeschaltet werden soll, kein MQTT
also meinst du aus
AutoEin=1 und ManuEin=0 -->Automatik
AutoEin=0 und ManuEin=1 -->Manuel
AutoEin=0 und ManuEin= oder AutoEin=1 und ManuEin=1 -->AusDenke ja. Für mich ist das DummyDevice ein Merker der einen bestimmten Status wiederspiegelt. Der Status wird immer irgendwoher getriggert. Das würde ich logisch separat programmieren über Trigger. Funktionieren die Stati würde ich mich an die Aktionen machen die die Stati auslösen/bedeuten. Hierzu reicht aus meiner Sicht der "saubere"/definierte Grundzustand beim Booten und dann getriggert die Aktionen der GPIO ausgelöst durch Änderung der Stati.
Alternativ zum Dummy Device könnte man das auch über ein Event lösen. Deine Schalter lösen ein Event aus und Schreiben Aus, Auto,Man in den Log. Du wiederum triggerst dann für die Aktionen basierent auf diese Events wieder deine GPIOs. Sehe ich nur als Alternative aber keine wirklichen Vorteile...
der Plan ist
Rule1 die Relais über die Stufen aus MQTT zu schalten
Rule2 ist eine Temperatur Sicherung für ein Lastrelai
Rule3 war die Umsetzung der 2 Switch auf ein Dummy mit 3 StellungenDu hast das oben schon mal so geschrieben. Da bin ich nicht genug im Thema, wäre aber vorsichtig übergreifend über mehrere Rules zu arbeiten. Vermute da geht nicht alles und es gibt bestimmt Timingprobleme etc etc. Alle Triggerungen um Stati (DummyDevices) zu setzen auf einer Rule und die Trigger und Aktionen aus einer Statiänderung auf einer anderen Rule dürfte funktionieren. Aber allgemein sollte doch da genug "Platz" sein um das in einer Rule zu lösen....wäre mein Favorit um dort keine Probleme zu erwarten.