FREIGEGEBENE HAUPTVERSION V 4.01 verfügbar!
LOGIK! VISU! IFTTT! FIXES!
Infos im Wiki: https://elabnet.atlassian.net/l/cp/TrZ03Nr7

NEU! Ausführliches Video Tutorial zur VISU
Jetzt werden alle Fragen beantwortet. Das Video: https://youtu.be/_El-zaC2Rrs

[Beantwortet] [V4.0 IP12] Einschaltwert 3 mal senden

Informationen und Diskussionen über Logik-Engine und Logik-Editor
Forumsregeln
  • Denke bitte an aussagekräftige Titel und gebe dort auch die [Firmware] an. Wenn ETS oder CometVisu beteiligt sind, dann auch deren Version
  • Bitte mache vollständige Angaben zu Deinem Server, dessen ID und dem Online-Status in Deiner Signatur. Hilfreich ist oft auch die Beschreibung der angeschlossener Hardware sowie die verwendeten Protokolle
  • Beschreibe Dein Projekt und Dein Problem bitte vollständig. Achte bitte darauf, dass auf Screenshots die Statusleiste sichtbar ist
  • Bitte sei stets freundlich und wohlwollend, bleibe beim Thema und unterschreibe mit deinem Vornamen. Bitte lese alle Regeln, die Du hier findest: https://wiki.timberwolf.io/Forenregeln
Antworten

Ersteller
sfrit
Reactions:
Beiträge: 37
Registriert: Di Okt 31, 2023 8:29 pm
Hat sich bedankt: 8 Mal
Danksagung erhalten: 9 Mal

[V4.0 IP12] Einschaltwert 3 mal senden

#1

Beitrag von sfrit »

Hallo allerseits,

ich versuche mich gerade daran eine benutzerdefinierte Logik zu erstellen die meine 3 verschachtelten alten Logiken ersetzen soll. Allerdings will das nicht so recht und ich finde den Fehler nicht.

Bisher sieht das ganze folgendermaßen aus:
Ein Schwellenwertschalter erfasst eine Änderung eins Dimmwertstatus(KNX) >=1 (Einschalten Ausschalten)
Eine zweite Logik löst nur bei Einschalten aus. (And Logik mit Inhibit)
Eine dritte Logik sendet den Dimmwertstatus nochmals nach 0,5 s und 1 s. (Custom Logik hier aus dem Forum, danke dafür)


Nun habe ich versucht die Codes zusammenzuführen in einer einzelnen Logik und es passiert nix.

Code:
[*]

Code: Alles auswählen

{
    "Level":[
        // Inputs
		["$Input_L1","float",0],
		["$Threshold_L1","float",0],
		["$Input_L2","bool",false],
        ["$I_Verzoegerung1","float",100.0],
		["$I_Verzoegerung2","float",100.0],
		
		// Outputs
		["$O_Wert1","float",100.0],
        
        // Interne Variablen
		["$Output_L1","bool",false],
		["$Output_L2","bool",false],
		["$Inhibit>","bool",false], 
		["$Trigger","bool",false],
		["$Timer1","bool",false],
		["$Timer1_Last","bool",false],
		["$Timer1_Ende","bool",false],
		["$Timer1_CResult","bool",false],
		["$Timer2","bool",false],
		["$Timer2_Last","bool",false],
		["$Timer2_Ende","bool",false],
		["$Timer2_CResult","bool",false],
		// Konstanten
        ["$Konst1","float",1.0],
        ["$Konst0","float",0.0],
        ["$KonstTrue","bool",true],
		["$KonstFalse","bool",false]
		
    ],
	"Module":[
		
		["Comparator","$Input_L1","$Output_L1","$Threshold_L1"],
		
		["Break",["$Output_L1"]],
		["And",["$Input_L2"],"$Output_L2"],
				
	    // Eingang getriggert?
	    ["Triggered", "$Output_L2", "$Trigger" ],
	    
	    // Timer-Status merken
	    ["Latch","$Timer1","$Timer1_Last","$KonstTrue",0],
	    ["Latch","$Timer2","$Timer2_Last","$KonstTrue",0],
	    
	    // Wenn getriggert, Verzögerungstimer starten
	    ["Monoflop","$Trigger",0,"$Timer1","$I_Verzoegerung1",0],
	    ["Monoflop","$Trigger",0,"$Timer2","$I_Verzoegerung2",0],
	    
	    // Wenn Verzoegerung 0, dann direkt beim Trigger reagieren => 
	    // TimerLast auf True setzen, damit abgelaufener Timer simuliert wird
	    ["Comparator", "$I_Verzoegerung1", "$Timer1_CResult", "$Konst0"],
	    ["Comparator", "$I_Verzoegerung2", "$Timer2_CResult", "$Konst0"],
	    ["Latch","$Trigger","$Timer1_Last","-$Timer1_CResult",0],
	    ["Latch","$Trigger","$Timer2_Last","-$Timer2_CResult",0],
	    
	    // Timer abgelaufen?, Timer1_Ende wird nur true, wenn in diesem Aufruf der Timer ausgelaufen ist
	    ["And" , ["-$Timer1","$Timer1_Last"],"$Timer1_Ende"],
	    ["And" , ["-$Timer2","$Timer2_Last"],"$Timer2_Ende"],
	    
	    // Eingangswert auf Ausgang übernehmen
	    ["Latch","$Input_L1","$O_Wert1","$Timer1_Ende",0],
	    ["Latch","$Input_L1","$O_Wert1","$Timer2_Ende",0],
	    
	    // Senden
	    ["SendExplicit","$Timer1_Ende","$O_Wert1",0],
	    ["SendExplicit","$Timer2_Ende","$O_Wert1",0]
	    
    ],
      "Input":[
		["Eingangswert","Dimmwert der mehrfach gesendet wird","$Input_L1","u"],
		["Schwellwert","Vergleichswert","$Threshold_L1","u"],
		["Input_L2","auf false setzen","$Input_L2","u"],
		["Verzögerung 1","erstes senden nach n Sekunden","$I_Verzoegerung1","u"],
		["Verzögerung 2","zweites senden nach n Sekunden","$I_Verzoegerung2","u"]
    ],    
    "Output":[
		
		["Ausgang1","Ausgang sendet nach Verzögerungen 1 und 2","$O_Wert1","x"]
	  
    ]
}
Wo liegt mein Denkfehler?

LG Steffen
timberwolf3500 L #685

Robosoc
Reactions:
Beiträge: 1888
Registriert: Di Okt 09, 2018 9:26 am
Hat sich bedankt: 639 Mal
Danksagung erhalten: 779 Mal

#2

Beitrag von Robosoc »

Hey Steffen,

ich habe jetzt nur auf dem Handy versucht die Logik zu interpretieren. Die zweite Zeile im Abschnitt Module ist ein Break, der die Logikausführung immer dann abbricht, wenn der Comperator davor true ergibt... Ist das gewollt??? Ich glaube Du würdest es genau anders herum wollen, ( break wenn Comperator =false), oder?
Zuletzt geändert von Robosoc am Fr Mai 24, 2024 11:00 pm, insgesamt 1-mal geändert.
VG, Sven - 3500 XL ID:1369 | 3500 L ID:1355, VPN offen, Reboot OK

Robert_Mini
Reactions:
Beiträge: 3764
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1177 Mal
Danksagung erhalten: 2082 Mal

#3

Beitrag von Robert_Mini »

Hallo!

Sven hat das Break schon richtig gesehen.
Die Kombination Inhibit / UND-Logik zum nur True Senden wir in den Custom Logiken durch das SendExplicit gelöst => hast du grundsätzlich ja richtig gemacht.

Tipp: du baust dir kompliziert eine Erkennung, ob der jeweilige Timer gerade abgelaufen ist. Das kannst du sparen, indem du das Latch (wo du den Ausgang beschreibst) bzw. das SendExplizit mit fallender Flanke auf den Timer-Status triggerst.

Damit kürzt sich deine Logik auf die Hälfte…
Schönes Beispiel für Custom Logik - weiter so!

Lg
Robert
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

Thimo
Reactions:
Beiträge: 6
Registriert: So Jul 02, 2023 10:13 am
Hat sich bedankt: 2 Mal
Danksagung erhalten: 4 Mal

#4

Beitrag von Thimo »

Hallo Steffen,

ich habe dein Problem zum Anlass genommen mich etwas mit der Logik zu beschäftigen. Für Nicht-Experten wie mich sind passende Links gesetzt. Gemessen an dem Logikcode könnte die ursprüngliche Schaltung so aussehen:
Bild
Dient dies dazu den Schaltwert für Geräte zu wiederholen, welche initial noch nicht empfangsbereit waren, z.B. ausgeschaltete Steuergeräte?

Der Vergleich im Code war Input_L1 > Threshold_L1, nicht das im Text gewünschte Input_L1 >= Threshold_L1 (siehe Besonderheiten Comparator).

In der ursprünglichen Schaltung hat die Kombination aus Comparator und And, zusammen mit dem Triggered im DelayTrigger (Quelle), das Einschaltereignis gefiltert (Bool Eventfilter). Mit der Break-Lösung im Code wird im eingeschalteten Zustand jedoch wiederholt getriggert, da der Change-Trigger beim Inhibit-Eingang von And im Code nicht abgebildet wurde.

Dies lässt sich über eine Flanke lösen, da der Monoflop ebenfalls auf eine steigende Flanke reagieren kann (SetOption 2), also nur wenn der Comparator auf true wechselt. In Folge ist ein Break nicht mehr notwendig, und zusammen mit Roberts Anmerkungen zum Latch und SendExplicit ergibt sich dies:

Code: Alles auswählen

{
	"Level":[
		// Inputs
		["$Input_L1","float",100],
		["$Threshold_L1","float",0],
		["$I_Verzoegerung1","float",100.0],
		["$I_Verzoegerung2","float",100.0],
		
		// Outputs
		["$O_Wert1","float",100.0],
        
		// Interne Variablen
		["$Active","bool",false],
		["$LastActive","bool",false],
		["$Trigger","bool",false],
		["$Timer1","bool",false],
		["$Timer2","bool",false]
	],
	"Module":[
		// Active := Input >= Threshold
		["Comparator","-$Input_L1","-$Active","-$Threshold_L1"],

		// steigende Flanke von Active startet Verzögerungstimer
		["Monoflop","$Active",0,"$Timer1","$I_Verzoegerung1",2],
		["Monoflop","$Active",0,"$Timer2","$I_Verzoegerung2",2],

		// Bei fallender Timer Flanke den Eingangswert auf Ausgang übernehmen und senden
		["Latch","$Input_L1","$O_Wert1","$Timer1",2],
		["Latch","$Input_L1","$O_Wert1","$Timer2",2],
		["SendExplicit","$Timer1","$O_Wert1",2],
		["SendExplicit","$Timer2","$O_Wert1",2]
	],
	"Input":[
		["Eingangswert","Dimmwert der mehrfach gesendet wird","$Input_L1","c"],
		["Schwellwert","Vergleichswert","$Threshold_L1","u"],
		["Verzögerung 1","erstes senden nach n Sekunden","$I_Verzoegerung1","u"],
		["Verzögerung 2","zweites senden nach n Sekunden","$I_Verzoegerung2","u"]
	],    
	"Output":[
		["Ausgang1","Ausgang sendet nach Verzögerungen 1 und 2","$O_Wert1","x"]
	]
}
Cheers,

Thimo
TWS 3500XL ID:1217, VPN geschlossen, Reboot erlaubt

Ersteller
sfrit
Reactions:
Beiträge: 37
Registriert: Di Okt 31, 2023 8:29 pm
Hat sich bedankt: 8 Mal
Danksagung erhalten: 9 Mal

#5

Beitrag von sfrit »

Hallo Thimo,

nachdem ich

Code: Alles auswählen

["Comparator","-$Input_L1","-$Active","-$Threshold_L1"],
zu

Code: Alles auswählen

["Comparator","$Input_L1","$Active","$Threshold_L1"],
geändert habe funktionert es. Vielen Dank dafür. Natürlich auch an Robert.
Dient dies dazu den Schaltwert für Geräte zu wiederholen, welche initial noch nicht empfangsbereit waren, z.B. ausgeschaltete Steuergeräte?
Genau dafür. Ich hab ein Lunatone KNX zu Dali GW was da echt zicken macht. Irgendwie nicht so schön das die 24V Dimmer von denen ihren Strom nicht über den DALI Bus mitbekommen.

Schönen Abend euch

Steffen
Zuletzt geändert von sfrit am Sa Mai 25, 2024 11:07 pm, insgesamt 1-mal geändert.
timberwolf3500 L #685

Thimo
Reactions:
Beiträge: 6
Registriert: So Jul 02, 2023 10:13 am
Hat sich bedankt: 2 Mal
Danksagung erhalten: 4 Mal

#6

Beitrag von Thimo »

Guten Abend Steffen,
Ich habe gerade noch einen kleinen Test mit dem Comparator gemacht, der verhält sich bzgl. >= wie im Wiki beschrieben.
Bild

Also müsste bei Input_L1 = 1 der Aus Zustand sein, und in Folge Ein erst bei Input_L1 > 1?
Cheers,

Thimo
TWS 3500XL ID:1217, VPN geschlossen, Reboot erlaubt

Ersteller
sfrit
Reactions:
Beiträge: 37
Registriert: Di Okt 31, 2023 8:29 pm
Hat sich bedankt: 8 Mal
Danksagung erhalten: 9 Mal

#7

Beitrag von sfrit »

Kann dir nur sagen das es nicht funktionierte. Ich hab aber einfach als Schwellwert 0 genommen.

Was mir aber aufgefallen ist, es wird nur ein Wert ( egal wie von der Zeit eingestellt, immer der als letztes verarbeitete) auf den Bus gesendet obwohl in der Logik angezeigt wird das 2 mal gesendet wird. Das lässt sich nur beheben wenn man 2 Ausgänge anlegt die beides mal auf das gleiche Objekt gelegt werden.

LG Steffen
timberwolf3500 L #685
Antworten

Zurück zu „Logikengine & Logik-Editor“