Seite 1 von 3

Logik-Unterstützung - mehrere Trigger zeitversetzt

Verfasst: Sa Feb 05, 2022 8:31 pm
von adimaster
Hallo zusammen,

irgendwie komme ich auf keine sinnvolle Lösung/Idee oder denke einfach zu kompliziert. Daher möchte ich mal fragen, ob jmd. eine pragmatische Idee für folgende Logik hat.

Funktion: Setze n verschiedene Trigger (für HTTP-API um die Calls/minute nicht zu überschreiten) nach einer am Eingang definierten Verzögerungszeit.

Eingang: Verzögerungszeit (z. B. 5 sec.)

Ausgang 1: True nach 1x Verzögerungszeit (also true nach 5 sec.)
Ausgang 2: True nach 2x Verzögerungszeit (also true nach 10 sec.)
Ausgang 3: True nach 3x Verzögerungszeit (also true nach 15 sec.)
...
Ausgang n: True nach nx Verzögerungszeit (also true nach n x 5 sec.)

Nach einer Kombination mit CalcFormula, Monoflop, Latch, SendExplicit erhalte ich in Grafana immer noch nicht die gewünschten Ergebnisse :angry-banghead: . Nun brauche ich erst mal eine Pause und freue ich mich in der Zwischenzeit auf Ideen oder Minimalbeispiele. :confusion-waiting: :confusion-helpsign:

Besten Dank!

Grüß
Adi

Re: Logik-Unterstützung - mehrere Trigger zeitversetzt

Verfasst: Sa Feb 05, 2022 10:20 pm
von Robosoc
Hallo Adi,

Bin momentan leider stark eingeschränkt, würde ein paar Tage dauern, bis ich nen Code erstellt haben kann... aber vielleicht hilft dir diese Diskussion als Ideengeber
viewtopic.php?p=24628#p24628

Dort wird nur ein Ausgang geschaltet, aber es läuft auch eine Zeitenabhängige Kette... das müsste eigentlich im Grunde ähnlich sein.

Re: Logik-Unterstützung - mehrere Trigger zeitversetzt

Verfasst: So Feb 06, 2022 12:21 am
von gbglace
Das geht doch mit dem Taktsignalgeber, der Standardlogiken.

Einen Eingang der den Taktgeber Startet/Stoppt und den zweiten Wert als fixen Parameter 5s, am Ausgang ein Mapping auf true = 1 und false = 1 und Sendebedingung A allways.

Kommt auf dem Start-Stop ein true an, dann sendet das Ding alle 5s eine 1 wohin, bis an dem Start/Stopp Eingang ein false kommt.

Re: Logik-Unterstützung - mehrere Trigger zeitversetzt

Verfasst: So Feb 06, 2022 1:38 am
von adimaster
Danke Sven und Göran!
Robosoc hat geschrieben: Sa Feb 05, 2022 10:20 pm Dort wird nur ein Ausgang geschaltet, aber es läuft auch eine Zeitenabhängige Kette... das müsste eigentlich im Grunde ähnlich sein.
Das schau ich mir genauer an.

gbglace hat geschrieben: So Feb 06, 2022 12:21 am Das geht doch mit dem Taktsignalgeber, der Standardlogiken.
[...]
Kommt auf dem Start-Stop ein true an, dann sendet das Ding alle 5s eine 1 wohin, bis an dem Start/Stopp Eingang ein false kommt.
Ja, klingt super einfach. Du ziehst hier aber nur einen einzigen Ausgang in Betracht. Richtig?
Wäre es möglich, den Takt nicht direkt an einen Ausgang zu legen, sondern:
- mit jedem Takt einen Zähler mittels Addition mit 1 (CalcFormula) hochzählen
- mittels Multiplexer und
- nachgeschalteten Latches
den richtigen Ausgang schreiben?
Dann würde ich aber noch Sendexplicit anstelle von "always" benötigen um nicht jedes Mal auf allen Ausgängen zu senden, schätze ich.
Wenn dann alle durch sind --> mit einem break stoppen, bis der Zähler wieder neu getriggert wird.
Wobei das dann auch schon wieder kompliziert klingt :think:

Die andere Möglichkeit wären n "And-Module" mit Trigger (würden wahrscheinlich so 15 Stück bei mir werden). Das wäre sicherlich das effizienteste und schnellste. Allerdings finde ich das irgendwie nicht so smart wie eine einzige CustomLogik die ein HTTP-API Sub-System triggert. :confusion-scratchheadyellow:

Ich stelle mir vor, dass zu einer bestimmten Uhrzeit n verschiedene Ausgänge jeweils im Abstand von x Sekunden nacheinander true senden. So werden die calls/min des APIs nicht überschritten. In jeder Programmiersprache eine einfach Schleife mit nem Delay drin ... :doh: .

Grüße
Adi

Re: Logik-Unterstützung - mehrere Trigger zeitversetzt

Verfasst: So Feb 06, 2022 10:27 am
von Robert_Mini
Hallo Adi!

Ich grüble auch mit , insbesondere ob sich das mit variabler Anzahl von Ausgängen machen lässt.

Ein paar Fragen:
- geht es nur um ein True oder muss irgendwann ein false gesendet werden?
- was passiert bei Sperre - nichts? oder false? Trigger sollen dann ignoriert werden?
- Du schreibst Eingang Verzögerungszeit: soll dieser nur Triggern und das Intervall festlegen? Würde ich trennen und ggf. 2x das gleiche Obj. verknüpfen
- Verzögerungszeit ist nach dem Triggern fest - ok oder noch während der Abarbeitung dynamisch änderbar?

Lg
Robert

Re: Logik-Unterstützung - mehrere Trigger zeitversetzt

Verfasst: So Feb 06, 2022 11:07 am
von adimaster
Robert_Mini hat geschrieben: So Feb 06, 2022 10:27 am Ich grüble auch mit , insbesondere ob sich das mit variabler Anzahl von Ausgängen machen lässt.
Cool, freut mich! Und ja, macht sogar wirklich Sinn mit einer variablen Anzahl, da dann für sämtlichen HTTP-API Anfragen anwendbar. Ggf. dann sogar auch als festes Modul für den TWS interessant?!

Ich werde mich später hinsetzen und die Problem-/Funktionsbeschreibung inkl. Anwendungsbsp. visualisieren; ist sicherlich leichter als mit Text.

Grüße
Adi

Re: Logik-Unterstützung - mehrere Trigger zeitversetzt

Verfasst: So Feb 06, 2022 11:44 am
von Eraser
So eine Logik im Logikeditor wäre wirklich interessant, hab das zur Zeit in NodeRed am Laufen zur Abfrage von Werten per MQTT, da ich keine einfache Lösung im Logikeditor gefunden habe.

Re: Logik-Unterstützung - mehrere Trigger zeitversetzt

Verfasst: So Feb 06, 2022 1:50 pm
von Robert_Mini
Ergänzend: Ich habe mal eine Logik gepostet, die eine parametrierbare Sequenz absetzt (Sendeverzögerung und Wert). Läuft bei mir erweitert auf 3 Werte.
viewtopic.php?f=65&t=2412&p=26817&hilit ... ger#p26817

Damit würde deine Anwendung schon mal abgedeckt sein. Ich schau mir aber gerade noch eine 2. Lösung an.

Robert

Re: Logik-Unterstützung - mehrere Trigger zeitversetzt

Verfasst: So Feb 06, 2022 2:20 pm
von Robert_Mini
Hallo Adi!

Ich hab mal eine schnelle Lösung gebaut. Nicht parametrisch und ohne Reset / Break.

Im Prinzip ganz einfach gehalten: Timer startet mit Verzögerung, beim Timerablauf wird ein SendExplicit mit fallender Flanke ausgelöst.
Diese fallende Flanke startet gleichzeitig den nächsten Timer...

Lässt sich durch kopieren von einzelnen Zeilen einfach erweitern.

Man könnte auch gleich 16 Ausgänge festlegen und per "+" einblendbar machen. Das wäre nur bedingt smart, denn die restlichen Timer laufen im Hintergrund trotzdem...

lg
Robert

Code: Alles auswählen

/**===========================================================
Trigger mit definierbarem Intervall
============================================================*/
{
    "Level":[
        ["$I_Interval","float",5.0],
        ["$I_Trigger","bool",false],
	["$I_Enable","bool",false],
	["$Status","bool",false],
	["$Reset","bool",false],
		
	["$Output1","bool",true],
	["$Output2","bool",true],
	["$Output3","bool",true],
	["$Output4","bool",true],     // ggf. weitere Variablen mit ansteigender Nr. anlegen
		
	["$Touched","bool",false],
	["$Timer1Status","bool",false],
	["$Timer2Status","bool",false],
	["$Timer3Status","bool",false],
	["$Timer4Status","bool",false],   // ggf. weitere Variablen mit ansteigender Nr. anlegen
		
        ["$Konst1","float",1.0],
        ["$Konst0","float",0.0],
        ["$KonstTrue","bool",true],
	["$KonstFalse","bool",false]
    ],
    "Module":[
        // Auswerten, ob der Triggereingang getriggert hat
	["Triggered", "$I_Trigger", "$Touched" ],
	// Timer 1 wird durch Trigger gestartet
	["Monoflop","$Touched","$Reset","$Timer1Status","$I_Interval",0],
	// Ablaufender Timer startet jeweils mit fallender Flanke den nächsten Timer
	["Monoflop","$Timer1Status","$Reset","$Timer2Status","$I_Interval",4], 
	["Monoflop","$Timer2Status","$Reset","$Timer3Status","$I_Interval",4], 
	["Monoflop","$Timer3Status","$Reset","$Timer4Status","$I_Interval",4],    // weiter kopieren und TimerNr anpassen
	    
	["SendExplicit","$Timer1Status","$Output1",2],
	["SendExplicit","$Timer2Status","$Output2",2],
	["SendExplicit","$Timer3Status","$Output3",2],
	["SendExplicit","$Timer4Status","$Output4",2]    // weiter kopieren und TimerNr + OutputNr anpassen    
    ],
    "Input":[
        ["Interval","Input","$I_Interval","u"],
	["Trigger","Input","$I_Trigger","a"]
    ],
    "Output":[
        ["Output1","Output","$Output1","x"],
        ["Output2","Output","$Output2","x"],
        ["Output3","Output","$Output3","x"],
        ["Output4","Output","$Output4","x"]    // weiter kopieren und OutputNr anpassen
    ]
}


Re: Logik-Unterstützung - mehrere Trigger zeitversetzt

Verfasst: So Feb 06, 2022 2:28 pm
von StefanW
Eine Möglichkeit könnte auch der State Machine Baustein darstellen