ich habe mich mal dran gemacht eine Custom Logik dafür zu schreiben. Könnte das bitte mal jemand anschauen (ist meine erste). Mein Monoflop wird getriggered und $timer ist auch für entsprechende viele Sekunden True. $timer geht aber danach nicht wieder auf False. Dadurch wird dann kein Stop Telegram gesendet. Was verstehe ich hier noch nicht?
Tausend Dank für Eure Mühe! Hoffe meine Kommentare im Code erklären was ich jeweils erreichen will.
Code: Alles auswählen
/**
* Ansteuerung eines Rollladens über Positionswerte, der nur über zwei Schaltobjekte "Auf" und "Ab" verfügt. Beim Senden von wiederholtem "Auf" bzw. "Ab" stoppt der Rollladen. Häufig ist es der Fall bei Dachfenstern, wenn der Rollladen an der Fenstersteuerung direkt angeschlossen ist.
* Der Schöpfer dieser Custom Logik überträgt die Nutzungsrechte gemäß der TOLL ("Timberwolf Open Logikblock License") die unter https://wrgt.news/TOLL zum Download zur Verfügung steht.
*/
{
"Level":[
["$pos","integer",0],
["$pos_cur","integer",0],
["$pos_diff","integer",0],
["$duration","float",20],
["$delay","float",0],
["$no_change","bool",false],
["$up","bool",false],
["$down","bool",false],
["$up_stop","bool",false],
["$down_stop","bool",false],
["$up_full","bool",false],
["$down_full","bool",false],
["$up_or_down_full","bool",true],
["$timer","bool",true],
["$f_substract","string","X1-X2"],
["$f_partial","string","abs(X1*X2/X3)"],
["$c_zero","integer",0],
["$c_hundred","integer",100],
["$c_true","bool",true],
["$VAR<Inhibit?>","bool",false]
],
"Input":[
["Fahrzeit","Fahrzeit in Sekunden","$duration","u"],
["Position","Position - Wert zischen 0 und 100","$pos","c"],
["Inhibit","INHIBIT","$VAR<Inhibit?>","u"]
],
"Output":[
["Auf","Objekt für Auffahren","$up","a"],
["Ab","Objekt für Abfahren","$down","a"],
["Auf Stop","Objekt für Stop bei Auffahren","$up_stop","a"],
["Ab Stop","Objekt für Stop bei Abfahren","$down_stop","a"]
],
"Module":[
//Sofort abbrechen, wenn Inhibit gleich true
["Break",["$VAR<Inhibit?>"]],
//Abbrechen, wenn neue und alte Position gleich sind
["Limiter","$pos",0,"$no_change",["$pos_cur","$pos_cur"]],
["Break",["$no_change"]],
//berechne Positionsdifferenz (Vorzeichen ist wichtig)
["CalcFormula",["$pos","$pos_cur"],"$pos_diff","$f_substract"],
//berechne Verzögerungszeit
["CalcFormula",["$pos_diff","$duration","$c_hundred"],"$delay","$f_partial"],
//wenn neue Position 0 bzw 100 ist, $up_full bzw $down_full auf True setzen (könnte man auch mit 1-99 in einem Limiter erledigen)
["Limiter","$pos",0,"$up_full",["$c_zero","$c_zero"]],
["Limiter","$pos",0,"$down_full",["$c_hundred","$c_hundred"]],
//wenn neue Position größer als alte ist, $down auf true
["Comparator","$pos","$down","$pos_cur"],
//wenn neue Position kleiner als alte ist, $up auf true
["Comparator","$pos_cur","$up","$pos"],
//Sende Auf oder Ab, jeweils wenn es True ist
["SendExplicit","$up","$up",0],
["SendExplicit","$down","$down",0],
//Wenn neue Position nicht 0 oder 100 ist, dann wird $up_or_down_full False. Wenn es False wird, triggert das den Monoflop. Wenn es true bleibt, wird der Monoflip nicht getriggert und es wird auch kein Stop Befehl gesendet.
["Or",["$up_full","$down_full"],"$up_or_down_full"],
//Monoflop zum verzögerten Senden des Stop-Objekts (fallende Flanke, nicht erneut startbar)
["Monoflop","$up_or_down_full",0,"$timer","$delay",4],
//Ausgangswerte für Stop Befehle schreiben und senden
["Latch","$up","$up_stop","$timer",4],
["Latch","$down","$down_stop","$timer",4],
["SendExplicit","$timer","$up_stop",4],
["SendExplicit","$timer","$down_stop",4],
//setze aktuelle auf neue Position
["Latch","$pos","$pos_cur","$c_true",0]
]
}