Seite 1 von 2

[V4.5 IP1] Fehlende Aussendung Cron/SendExplizit bei zweiter (manueller) Logikaktivierung

Verfasst: Do Nov 21, 2024 3:23 pm
von jensgulow
Ich komme nicht weiter - habe einen Knoten im Kopf.

Folgende Logik bringe ich nicht so zum Laufen wie ich mir das denke

Folgendes soll passieren:

Am $input kommt immer ein "false" an.

-> unmittelbar "false" auf $zentral_out senden (funktioniert immer)

-> mit Verzögerung (hier 2 und 4 Sekunden) sollen zwei weitere Schaltaktionen durchgeführt werden (einmal einschalten einmal ausschalten - hier beispielhaft).
-> das funktioniert beim ersten Triggern der Logik einwandfrei.
-> Triggere ich die Logik erneut durch ein "false" am Eingang dann wird nur noch ein "false" auf $zentral_out gesandt. An den beiden anderen Schaltausgängen tut sich nichts mehr....

Sieht jemand meinen Fehler (dann ich gehe davon aus, dass das Problem ca. 60 cm vorm Bildschirm sitzt) ?

Code: Alles auswählen

/**======================================================================================= 
Gute-Nacht-Szene

-> unmittelbar 0 (false) an Zentral aus (0/1/1) senden, dann

-> geschalten werden einige boolean-Verbraucher sowie die Jalousien im Wohnzimmer

-> Korrekturzeiten sind ausgehnde vom Zeitpunkt des Schaltbefehles in Sekunden angegeben 
=========================================================================================*/ 
{ 
    "Level": [ 
	// Input-Level
	["$input","bool",true],
	["$norm","integer",60],
	["$Korrektur1","int",0],
	["$Korrektur4","int",0],
	["$VAR<Inhibit?>","bool",false],

	// Interne Variablen
	["$true","bool",true],
	["$false","bool",false],
	["$input_trig","bool",false],
	["$time","int",0],
	["$utime","int",0],
	["$Cron1","string","0"],
	["$Cron4","string","0"],
	["$StringFormat","string","%d"],
	["$Null","string","0"],
	["$Stern","string","*"],
	["$Empty","string"," "],
	["$Sek1","int",0],
	["$Sek4","int",0],
	["$Min1","int",0],
	["$Min4","int",0],
	["$Hour1","int",0],
	["$Hour4","int",0],
	["$Sek1str","string","0"],
	["$Sek4str","string","0"],
	["$Min1str","string","0"],
	["$Min4str","string","0"],
	["$Hour1str","string","0"],
	["$Hour4str","string","0"],
	["$Out1","int",0],
	["$Out4","int",0],
	["$Formula","string","X1+X2"],


	// Output-Level
	["$zentral_out","bool",true],
	["$Result1","bool",false],
	["$Result4","bool",true]
	],

	"Module": [ 

	// Überprüfen, ob $input getriggert wurde
	["Triggered", "$input", "$input_trig" ],
	// Wenn getriggert und $input=0 -> dann $zentral_out auf 0 setzen
	["And" , ["$input_trig","-$input"], "-$zentral_out"],
	// 0 auf $zentral_out senden
	["SendExplicit","$zentral_out","$zentral_out",2],
    
	// Aktueller Zeitstempel
	["Localtime",0,"$time",0,0,0,0,0,0,0,0,0],

	// nur wenn getriggert wurde $time an $utime durchreichen
	["Latch","$time","$utime","$input_trig",0],


	["CalcFormula",["$utime","$Korrektur1"], "$Out1", "$Formula"],
	// Errechnete Zeit $Out1 in Bestandteile zerlegen. Wir brauchen $Min und $Hour
	["Localtime","$Out1",0,"$Sek1","$Min1","$Hour1",0,0,0,0,0,0],
	// stringify
	["Printf","$Sek1","$StringFormat", "$Sek1str"],
	["Printf","$Min1","$StringFormat", "$Min1str"],
	["Printf","$Hour1","$StringFormat", "$Hour1str"],
	// Cronstring zusammensetzen
	["Concat",["$Sek1str","$Empty","$Min1str","$Empty","$Hour1str","$Empty","$Stern","$Empty","$Stern","$Empty","$Stern"], "$Cron1"],
	// zum Zeitpunkt $Cron1 senden
	["Cron","$true","$Result1",0,"$Cron1"],
	// aber nur , wenn $Result gerade auf true gewechselt hat
	["SendExplicit","$Result1","$Result1",1], // -> sendet 1 (true)
    


	["CalcFormula",["$utime","$Korrektur4"], "$Out4", "$Formula"],
	["Localtime","$Out4",0,"$Sek4","$Min4","$Hour4",0,0,0,0,0,0],
	["Printf","$Sek4","$StringFormat", "$Sek4str"],
	["Printf","$Min4","$StringFormat", "$Min4str"],
	["Printf","$Hour4","$StringFormat", "$Hour4str"],
	["Concat",["$Sek4str","$Empty","$Min4str","$Empty","$Hour4str","$Empty","$Stern","$Empty","$Stern","$Empty","$Stern"], "$Cron4"],
	["Cron","$true","-$Result4",0,"$Cron4"],
	["SendExplicit","-$Result4","$Result4",1] // -> sendet 0 (false)

	], 

	"Input": [ 
	["INPUT","Verbunden mit 0/1/2","$input","ai"],    
	["Korrektur1 EIN","Zeit in sec (positiv oder negativ)","$Korrektur1","u"],
	["Korrektur1 AUS","Zeit in sec (positiv oder negativ)","$Korrektur4","u"],
	["Inhibit","INHIBIT","$VAR<Inhibit?>","u"]
	], 

	"Output": [ 
	["ZENTRAL AUS","Verbunden mit 0/1/1","$zentral_out","x"],
	["EINSCHALTEN 1","Schaltereignis 1","$Result1","x"],
	["AUSSCHALTEN 1","Schaltereignis 4","$Result4","x"]
	] 
} 
/**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. */ 

Re: [V4.5 IP1] Fehlende Aussendung Cron/SendExplizit bei zweiter (manueller) Logikaktivierung

Verfasst: Fr Nov 22, 2024 1:19 pm
von ms20de
Hallo Jens,

du hast au dem Schirm, dass bei SendExplicit der Dr. Modus nicht immer da anzeigt was man erwartet?
Wenn nein, dann vielleicht die Ausgänge testweise mit Zeitserien verbinden und prüfen, ob tatsächlich nicht gesendet wird.

Viele Grüße,
Matthias

Re: [V4.5 IP1] Fehlende Aussendung Cron/SendExplizit bei zweiter (manueller) Logikaktivierung

Verfasst: Fr Nov 22, 2024 3:04 pm
von Robert_Mini
Ich sehe (zumindest am Handy) keinen Fehler.
Eine Frage trotzdem: wieso löst du das zusätzliche Senden nach 2/4 Sekunden nicht per Timer (Monoflop)?

Dann sparst du das String manipulieren…

Lg
Robert

Re: [V4.5 IP1] Fehlende Aussendung Cron/SendExplizit bei zweiter (manueller) Logikaktivierung

Verfasst: Fr Nov 22, 2024 4:09 pm
von jensgulow
Hallo Robert,

das mit den Timern ist mir in der konfiguration zu unfelxibel - da müsste ich immer jeweils ein Zeitdelta als Eingang eingeben, welches bei mehreren Eingängen (sind bei mir eigentlich 5 Stück) unübersichtlich ist. Weiterhin kann ich mit meiner Lösung relativ einfach mal den Schaltzeitpunkt ändern ohne die anderen Eingänge zu beeinflussen (immer ausgehend von dem "Referenzereignis"). ....
Prinzipiell habe ich die Timerlösung bei anderen Bausteinen auch verwandt.

Die Frage ist eben: Was stimmt an meiner oben geposteten Logik nicht?
Wenn ich diese ein zweites Mal aktiviere, dann scheint alles bis incl. dem Zusammensetzen der cronstrings korrekt zu laufen. Nur dann geht es eben nicht weiter ...
Da bin ich eben ratlos, weil auch die analyse der Grafana-Daten hat mir nicht wirklich weiter geholfen.

Vielleicht findet ja jemand den Übeltäter ;-)

Re: [V4.5 IP1] Fehlende Aussendung Cron/SendExplizit bei zweiter (manueller) Logikaktivierung

Verfasst: Fr Nov 22, 2024 7:05 pm
von ms20de
Nur so eine Idee, könnte es etwas mit dem Cron Problem von hier zu tun haben?
viewtopic.php?t=5550

Viele Grüße,
Matthias

Re: [V4.5 IP1] Fehlende Aussendung Cron/SendExplizit bei zweiter (manueller) Logikaktivierung

Verfasst: Fr Nov 22, 2024 7:43 pm
von jensgulow
Eher nicht - wie gesagt, die cronstrings werden ja richtig "zusammengesetzt", beim ersten Durchlauf funktioniert ja auch alles bestens....

Re: [V4.5 IP1] Fehlende Aussendung Cron/SendExplizit bei zweiter (manueller) Logikaktivierung

Verfasst: Sa Nov 23, 2024 11:20 am
von ms20de
jensgulow hat geschrieben: Fr Nov 22, 2024 7:43 pm Eher nicht - wie gesagt, die cronstrings werden ja richtig "zusammengesetzt", beim ersten Durchlauf funktioniert ja auch alles bestens....
Das Problem in dem Thread war, das die Ausführungszeit einmal berechnet wird, beim Ändern des Cron Strings nicht mehr.

Speicher dich mal nexttrigger bei Cron in eine Variable, ob der Wert richtig wäre.

Vielleicht bin ich auch auf falschen Pferd 🐴

Viele Grüße,
Matthias

Re: [V4.5 IP1] Fehlende Aussendung Cron/SendExplizit bei zweiter (manueller) Logikaktivierung

Verfasst: Sa Nov 23, 2024 12:55 pm
von jensgulow
Okay, werde ich heute Abend mal ausprobieren. Danke für den Denkanstoß.

Re: [V4.5 IP1] Fehlende Aussendung Cron/SendExplizit bei zweiter (manueller) Logikaktivierung

Verfasst: Sa Nov 23, 2024 9:40 pm
von Robert_Mini
Hallo zusammen!
Hab mir das jetzt genauer angesehen, tatsächlich wird $nexttrigger nicht übernommen, obwohl beim manuellen trigger am ersten Eingang die $Cron Zeitpunkte richtig berechnet werden (auch bei der 2. Wiederholung).

@ms20de: Nach meinem Test wird $nexttrigger erst übernommen, wenn ich zwischendurch auf inaktiv geschaltet wurde.

Die unten zitierte Bedingung, wäre in der Logik von Jens eigentlich erfüllt:
Trigger der Logik => Cron-Zeit setzen => Cron ruft die Logik zum Zeitpunkt +2 wieder auf

Es scheint, als ob das cron Modul nicht den Status false einnimmt, wenn man im gleichen Aufruf den Cronstring erneuert.
So richtig glauben will ich das aber selbst noch nicht...

Code: Alles auswählen

Der neue Zeitpunkt wird nur berechnet, wenn mindestens eines von zwei Ereignissen eingetreten ist:
Der aktuelle Timer abgelaufen ist
Der Aktiv-Ausgang von FALSE auf TRUE geschaltet wurde
Viele Grüße,
Matthias

Re: [V4.5 IP1] Fehlende Aussendung Cron/SendExplizit bei zweiter (manueller) Logikaktivierung

Verfasst: Sa Nov 23, 2024 10:16 pm
von Robert_Mini
Nachtrag: ich habe gerade was anderes nochmal nachgesehen:
Warum verwendest du eigentlich nicht das Modul wakeup? Dort kannst du direkt die unix-time in integer verwenden, d.h. du sparst die gesamten string-Operationen...

In deinem Fall wäre das so (funktioniert auch!!)

Code: Alles auswählen

/**======================================================================================= 
Gute-Nacht-Szene

-> unmittelbar 0 (false) an Zentral aus (0/1/1) senden, dann

-> geschalten werden einige boolean-Verbraucher sowie die Jalousien im Wohnzimmer

-> Korrekturzeiten sind ausgehnde vom Zeitpunkt des Schaltbefehles in Sekunden angegeben 
=========================================================================================*/ 
{ 
    "Level": [ 
	// Input-Level
	["$input","bool",true],
	["$norm","integer",60],
	["$Korrektur1","int",0],
	["$Korrektur4","int",0],
	["$VAR<Inhibit?>","bool",false],

	// Interne Variablen
	["$true","bool",true],
	["$true_ext","bool",true],
	["$false","bool",false],
	["$input_trig","bool",false],
	["$time","int",0],
	["$utime","int",0],
	["$Cron1","string","0"],
	["$Cron4","string","0"],

	["$Out1","int",0],
	["$Out4","int",0],
	["$Formula","string","X1+X2"],

    ["$test","bool",true],
    ["$next1","int",0],
    ["$next4","int",0],

	// Output-Level
	["$zentral_out","bool",true],
	["$Result1","bool",false],
	["$Result4","bool",true],
	["$ResultOut4","bool",true]
	],

	"Module": [ 

	// Überprüfen, ob $input getriggert wurde
	["Triggered", "$input", "$input_trig" ],
	// Wenn getriggert und $input=0 -> dann $zentral_out auf 0 setzen
	["And" , ["$input_trig","-$input"], "-$zentral_out"],
	// 0 auf $zentral_out senden
	["SendExplicit","$zentral_out","$zentral_out",2],
    
	// Aktueller Zeitstempel
	["Localtime",0,"$time",0,0,0,0,0,0,0,0,0],

	// nur wenn getriggert wurde $time an $utime durchreichen
	["Latch","$time","$utime","$input_trig",0],

	["CalcFormula",["$utime","$Korrektur1"], "$Out1", "$Formula"],

	// Errechnete Zeit $Out1 in Bestandteile zerlegen. Wir brauchen $Min und $Hour

	["Wakeup","$Out1","$Result1"],
	// aber nur , wenn $Result gerade auf true gewechselt hat
	["SendExplicit","$Result1","$Result1",1], // -> sendet 1 (true)
    

	["CalcFormula",["$utime","$Korrektur4"], "$Out4", "$Formula"],
	["Wakeup","$Out4","$Result4"],

    ["Latch","-$Result4","$ResultOut4","$Result4",1],
	["SendExplicit","$Result4","$ResultOut4",1] // -> sendet 0 (false)

	], 

	"Input": [ 
	["INPUT","Verbunden mit 0/1/2","$input","a"],    
	["Korrektur1 EIN","Zeit in sec (positiv oder negativ)","$Korrektur1","u"],
	["Korrektur1 AUS","Zeit in sec (positiv oder negativ)","$Korrektur4","u"],
	["Test","xxx","$test","a"],   
	["True","xxx","$true_ext","a"],   
	["Inhibit","INHIBIT","$VAR<Inhibit?>","u"]
	], 

	"Output": [ 
	["ZENTRAL AUS","Verbunden mit 0/1/1","$zentral_out","x"],
	["EINSCHALTEN 1","Schaltereignis 1","$Result1","x"],
	["AUSSCHALTEN 1","Schaltereignis 4","$ResultOut4","x"],
	["utime","Zeit","$utime","a"],
	["out1","Schaltereignis 4","$Out1","a"],
	["out4","Schaltereignis 4","$Out4","a"]
	] 
} 
/**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. */