Seite 2 von 3

Re: [V4.0.1] Frage zur Logikengine / Signalverzögerung

Verfasst: Do Aug 08, 2024 3:03 pm
von piet61
Hallo Yves (@starwarsfan),
vielen Dank - super Frage! :handgestures-thumbupright:

Ich habe etwas im Wiki und im Forum gelesen, aber genau auf diese Frage habe ich bisher keine Antwort gefunden :confusion-scratchheadyellow:

Aber ich bin sicher, dass @Robert_Mini das beantworten kann :whistle:

Viele Grüße

Piet

Re: [V4.0.1] Frage zur Logikengine / Signalverzögerung

Verfasst: Sa Aug 10, 2024 9:23 am
von Robert_Mini
starwarsfan hat geschrieben: Do Aug 08, 2024 2:55 pm Hallo Robert

Wenn ich mir den Code des UND-Bausteines anschaue, dann frage ich mich, woher da die Optionen für die Ein- und Ausgänge kommen!? Also wie/wo ist definiert, dass man dort eine Verzögerung konfigurieren kann? Wie mache ich das in einem Custom-LBS? :confusion-scratchheadyellow:
Hallo Yves, Piet!

Die Verzögerungen sind nicht im Code sichtbar (im Grunde Funktionalität der Zelle).
Das schöne: so einfache Verzögerungen, Mappings etc am Ausgang sind damit auch bei Custom-Logiken verfügbar!!!

Ansonsten würde man das verzögerte Senden mit Monoflop+Latch im Code umsetzen.

Lg
Robert

Re: [V4.0.1] Frage zur Logikengine / Signalverzögerung

Verfasst: Sa Aug 10, 2024 10:44 am
von starwarsfan
Hallo Robert
Robert_Mini hat geschrieben: Sa Aug 10, 2024 9:23 am Die Verzögerungen sind noch im Code sichtbar (im Grunde Funktionalität der Zelle).
Was heisst denn, sie sind "noch" im Code sichtbar? Wie lange noch? Ich wäre froh, wenn ich's überhaupt sehen würde... :think:

Re: [V4.0.1] Frage zur Logikengine / Signalverzögerung

Verfasst: Sa Aug 10, 2024 12:17 pm
von Robert_Mini
Sorry - autokorrektur… => NICHT

Hab‘s im Posting oben auch geändert.

Re: [V4.0.1] Frage zur Logikengine / Signalverzögerung

Verfasst: Sa Aug 10, 2024 5:30 pm
von starwarsfan
Hallo miteinander, hallo Robert
Robert_Mini hat geschrieben: Sa Aug 10, 2024 9:23 am Die Verzögerungen sind nicht im Code sichtbar (im Grunde Funktionalität der Zelle).
Das schöne: so einfache Verzögerungen, Mappings etc am Ausgang sind damit auch bei Custom-Logiken verfügbar!!!
Du hast meine Frage nicht verstanden. Wenn das in Custom-Logiken verfügbar wäre, dann hätte ich nicht danach gefragt wie man das macht! ;)

Aber anhand Deiner Antwort habe ich mich gerade nochmal hingesetzt und mir den Code von verschiedenen Logiken angeschaut und wie diese im Logikeditor aussehen. Nun meine ich, den Unterschied bzw. den relevanten Punkt gefunden zu haben: Es ist von Typ abhängig, welche Funktionalitäten zur Verfügung stehen! Oder anders gesagt, es gibt nur beim Typ "bool" entsprechende Optionen:

Bild

Bei allen anderen Typen ist die Liste leer.

String:
Bild

Int:
Bild

Float:
Bild

Da brauch' ich mich natürlich nicht wundern, dass ich für einen Float-Wert nichts am Ausgang einstellen kann... :doh:

Re: [V4.0.1] Frage zur Logikengine / Signalverzögerung

Verfasst: Sa Aug 10, 2024 9:46 pm
von Robert_Mini
Hallo Yves!
Danke für die Info. Das war mir nicht ganz bewusst.
Für Mapping hatte ich das schon mal gesehen (nachvollziehbar), aber für die Verzögerungen bin ich jetzt überrascht. Wäre doch ein sehr sinnvolles Feature.

Brauchst du noch eine Erklärung, wie man die Verzögerung selbst umsetzen kann?

Lg
Robert

Re: [V4.0.1] Frage zur Logikengine / Signalverzögerung

Verfasst: Di Aug 13, 2024 5:05 pm
von piet61
Hallo Robert (@Robert_Mini),
ich würde mich freuen, wenn Du mir hierzu noch einen Tipp geben könntest.

Ich fasse die Ausgangslage und meine Idee nochmal zusammen:
Ich bekomme zwei Statusinformationen von meinem Fenstergriff mit folgender Logik:

Code: Alles auswählen

STATUS 1=0 UND STATUS 2=0 -> geschlossen
STATUS 1=1 UND STATUS 2=0 -> gekippt
STATUS 1=1 UND STATUS 2=1 -> geöffnet
Wenn man den Fenstergriff zwischen geschlossen und gekippt bewegt, tangiert er mechanisch immer auch kurz den 'geöffnet' Zustand, was dazu führt, dass in einer entsprechenden Zeitserie immer so hässliche Peaks aufgezeichnet werden. Um dies zu verhindern, müsste der Wert von STATUS 2 kurz verzögert werden.

In getrennten verknüpften Logiken funktioniert das bereits. Eine UND Logik mit STATUS 2 als Eingang und einer entsprechenden Ausgangsverzögerung. Der Ausgang der UND Logik sowie STATUS 1 als Eingänge für eine 'Binärmultiplexlogik'. Als Ausgang der Binärmultiplexlogik bekomme ich ein Integer Wert nach folgender Logik:

Code: Alles auswählen

Ausgang=0 -> geschlossen
Ausgang=1 -> gekippt
Ausgang=3 -> geöffnet
Zusätzlich habe ich bei dem Binärmultiplexer noch einen Trigger mit einem Intervall eingerichtet, womit ich ein zyklisches Senden und eine durchgehende Darstellung im Grafana erreiche.

Das Ganze möchte ich nun in einer Custom Logik umsetzen. Am besten fände ich, wenn ich die Verzögerungszeit für STATUS 2 und die Intervalldauer für das zyklische Senden als Eingangsparameter angeben kann.
Das könnte dann so aussehen:
Bild

Mir ist aber absolut unklar, wie ich die Verzögerungszeit und den Trigger in der Custom Logik verarbeiten kann, um das gewünschte Ziel zu erreichen.
Geht das überhaupt?
Der Ausgang meiner Gesamtlogik ist ja ein Integer Wert, den man nicht so einfach verzögern kann, wie Ives herausgefunden hat. Müsste man das mit einem 'Monoflop+Latch' machen, wie Du vorher geschrieben hast?

Wahrscheinlich denke ich zu kompliziert und das ist alles ziemlich einfach :confusion-scratchheadyellow:
Ich würde mich über einen kleinen Schubs in die richtige Richtung freuen :bow-yellow:

Vielen Dank und viele Grüße

Piet

Re: [V4.0.1] Frage zur Logikengine / Signalverzögerung

Verfasst: Di Aug 13, 2024 10:17 pm
von Robert_Mini
Hallo Piet!

An sich relativ leicht umsetzbar, vom Handy aus aber tue ich mir etwas schwer…
Im Prinzip:
$Griffstatus2 als Trigger eines Monoflops mit steigender Flanke, $TimerStatus als Variable
Dann ein Latch mit fallender Flanke auf $TimerStatus und $Griffstatus2 auf $GriffStatus2_verzoegert kopieren
Dann wie gewohnt $GriffStatus1 und $GriffStatus2_verzoegert per Multiplexer weiterverarbeiten.

Hoffe das hilft schon mal.
Ansonsten das Tutorial „Entkalkungsanlage“ durcharbeiten, da ist vieles mit drin.
viewtopic.php?f=24&t=2001&hilit=Entkalk ... age#p21681

Lg
Robert

Re: [V4.0.1] Frage zur Logikengine / Signalverzögerung

Verfasst: Mi Aug 14, 2024 9:42 am
von piet61
Hallo Robert (@Robert_Mini),
vielen Dank für die Info - ich versuche mal, das hinzubekommen :think:

Viele Grüße

Piet

Re: [V4.0.1] Frage zur Logikengine / Signalverzögerung

Verfasst: Mi Aug 14, 2024 1:49 pm
von piet61
Hallo Robert (@Robert_Mini),
habe nun eine Custom Logik angelegt - leider klappt es noch nicht ganz so wie gewünscht :crying-yellow:

Ich nutzte keine Binärmultiplexerlogik um aus den beiden Statuswerten ein Integer zu machen sondern ich addiere die Werte der beiden Statuseingänge einfach. Das ist zwar mathematisch nicht korrekt, funktioniert in diesem Fall aber, so dass ich folgende Ausgangswerte bekomme:

Code: Alles auswählen

Ausgang=0 -> geschlossen
Ausgang=1 -> gekippt
Ausgang=2 -> geöffnet
Den Trigger für ein zyklisches Senden füge ich als zusätzlichen Eingang hinzu.
Die Custom Logik sieht zurzeit so aus (das Triggerintervall von 5 sec ist nur zum testen):
Bild

Leider gibt es noch ein Problem beim Wechsel von geöffnet nach gekippt oder geschlossen. Ich vermute, das hängt mit dem 'Reset' Eingang vom Monoflop zusammen. Ich habe hier verschiedene Variablen ausprobiert - leider bisher ohne das gewünschte Ergebnis zu erhalten.

Der Code sieht Zurzeit so aus:

Code: Alles auswählen

/**
 * Auswertung Status Fenstergriff
 * Eingänge:
 *   Griffstatus 1 (bool) ($in_1)
 *   Griffstatus 2 (bool) ($in_2)
 *     Status 1=0 UND Status 2=0 -> geschlossen
 *     Status 1=1 UND Status 2=0 -> gekippt
 *     Status 1=1 UND Status 2=1 -> geöffnet
 *   Werteänderung verzögern (int) ($in_3)
 * 
 * Ausgang:
 *   Griffstatus (int) -> 0=geschlossen, 1=gekippt, 2=geöffnet ($out_1)
 *  
 */

{
  "_Meta": { // Optional
    "Description": "Auswertung Status Fenstergriff",
    "Version": "1.00",
    "Icon": "" // format: "data:image/svg+xml;base64,ENCODED_FILE"
 }, 
  "Input": [
      ["Griffstatus 1", "Griff Status 1", "$in_1", "c"],    // Griff Status 1
      ["Griffstatus 2", "Griff Status 2", "$in_2", "c"],    // Griff Status 2
      ["Verzögerung Griffstatus 2 (s)", "Verzögerung Griffstatus 2 (s)", "$in_3", "u"]    // Werteänderung von Griffstatus 2 verzögern (in sec)
  ],
  "Output": [
      ["Griffstatus", "Griffstatus", "$out_1", "a"]
  ],
  "Level": [
      // Eingangs Variablen
      ["$in_1","bool",false],      
      ["$in_2","bool",false],      
      ["$in_3","integer",1], //Änderunge Griffstatus 2 um 1 Sekunde verzögern      
      
      //Zwischenvariablen
      ["$ausgang_monoflop","bool",false],
      ["$ausgang_latch","bool",false],
      ["$griffstatus_berechnen","string","(X1 + X2)"],
      
      // Ausgangs Variablen
      ["$out_1","integer",0]

  ],
  "Module": [
      ["Monoflop","$in_2","-$in_2","$ausgang_monoflop","$in_3",3],
      ["Latch","$in_2","$ausgang_latch","$ausgang_monoflop",2],
      ["CalcFormula",["$in_1","$ausgang_latch"],"$out_1", "$griffstatus_berechnen"]
  ]
}
Beim schnellen Wechsel von 'geschlossen' nach 'gekippt' und umgekehrt funktioniert alles wie gewünscht, allerdings wird bei der Änderung von 'geöffnet' nach 'gekippt' bzw. 'geschlossen' der Ausgangswert nicht richtig gesetzt.

Hier mal ein Signalverlauf:
Bild

Die rote Linie zeigt eine Änderung von 'geöffnet' nach 'gekippt', der Wert am Ausgang bleibt aber bei '2'.
Bei der orangenen Linie hat der Ausgangswert einen Peak - warum kann ich (noch) nicht sagen.

Ich versuche weiter, das hinzubekommen...

Viele Grüße

Piet