Seite 1 von 1

[v3.5.1] Erste Custom Logik

Verfasst: Do Dez 22, 2022 4:09 pm
von Wallaby1999
Hallo,

da ich nach Jahren des Timberwolf-Besitzes nun endlich das Wiregate ablöse, tansferiere ich gerade noch das letzte dort laufende Plugin und implementiere es im Logik-Editor. Da wollte ich mal die Forengemeinde teilhaben lassen an meinem Fortschritt.

Die Lernkurve ist recht steil, aber als ITler gut und relativ schnell machbar. Größtes Hindernis war es, in meinem Kopf die ungewohnte Ablauflogik zu verinnerlichen, die im Wiki gut erklärt wird.

Meine Anforderung war: Ich habe Rollläden, die bei Unterschreiten einer gewissen Helligkeitsschwelle einmalig automatisch heruntergefahren und bei Überschreiten einmalig automatisch hochgefahren werden sollen. Einmalig deswegen, weil man es ja vielleicht mal händisch übersteuert und dann nicht alle 10 Sekunden der Rollladen zum Fahren animiert werden soll. Zusätzlich gibt es zwei Rollläden, die nur herunter- aber nicht hochgefahren werden sollen.

Hierzu habe ich eine Custom Logik geschrieben, die einen Schwellwertschalter mit Hysterese verwendet und als Ergebnis zurückgibt, ob der Schwellwert unterschritten ist. Zusätzlich kann man angeben, ob der Zustand true bzw. false gesendet werden sollen. Hier der zugehörige Code:

Code: Alles auswählen

/**
 * Prüft, ob ein Schwellwert unterschritten ist.
 * Das Ergebnis wird nur bei einer Änderung auf den Ausgang geschrieben.
 * Es kann zusätzlich angegeben werden, ob im Falle von true bzw. false tatsächlich gesendet werden soll
 */

{
  "Input": [
    [ "Eingang", "Eingangswert", "$Input", "c" ],
    [ "Schwelle_1", "Unterer Vergleichswert", "$Thres_low", "c" ],
    [ "Schwelle_2", "Oberer Vergleichswert", "$Thres_high", "c" ],
    [ "Send_True", "Bei True senden", "$SendTrue", "c" ],
    [ "Send_False", "Bei False senden", "$SendFalse", "c" ]
  ],
  "Output": [
    [ "Schwellwert unterschritten", "Wert ist unterhalb der Schwelle", "$Result", "c" ]
  ],
  "Level": [
// Eingangs-Variablen
    [ "$Input", "float", 0 ], // Input-Wert
    [ "$Thres_low", "float", 0 ], // Untere Schranke für den Input-Wert
    [ "$Thres_high", "float", 0 ], // Obere Schranke für den Input-Wert
    [ "$SendTrue", "bool", true ], // Senden, wenn der Output-Wert true ist
    [ "$SendFalse", "bool", true ], // Senden, wenn der Output-Wert false ist
// Ausgangs-Variablen
    [ "$Result", "bool", false ], // Ausgangs-Variable
// Interne Variablen
    [ "$DummyTrue", "bool", true], // dummy für true
    [ "$StatusChanged", "bool", false ], // Gibt an, ob sich der Status geändert hat. Benötigt, damit das Ergebnis nur bei Status-Änderung gesendet wird
    [ "$Status", "bool", false ], // Der aktuelle Status
    [ "$Status_new", "bool", false ], // Temporäre Variable für das Ergebnis des Schwellwert-Vergleichs
    [ "$Internal_SendTrue", "bool", false ], // Interne Variable, ob eine Änderung zu true stattgefunden hat und gesendet werden soll
    [ "$Internal_SendFalse", "bool", false ], // Interne Variable, ob eine Änderung zu false stattgefunden hat und gesendet werden soll
    [ "$Internal_Send", "bool", false ] // Interne Variable, ob eine Änderung gesendet werden soll
  ],
  "Module": [
    [ "Comparator", "$Input", "-$Status_new", ["$Thres_low", "$Thres_high"]], // Wert unterhalb des Schwellwertes?
    [ "Xor", ["$Status_new", "$Status"], "$StatusChanged"], // Hat sich der Status geändert?
    [ "Latch", "$Status_new", "$Status", "$DummyTrue", 0], // Speichere den neuen Status
    [ "And", ["$StatusChanged", "$Status", "$SendTrue"], "$Internal_SendTrue"], // Wurde der Status zu true geändert und soll gesendet werden?
    [ "And", ["$StatusChanged", "-$Status", "$SendFalse"], "$Internal_SendFalse"], // Wurde der Status zu false geändert und soll gesendet werden?
    [ "Or", ["$Internal_SendTrue", "$Internal_SendFalse"], "$Internal_Send"], // Muss eine Statusänderung gesendet werden?
    [ "Latch", "$Status", "$Result", "$Internal_Send", 0] // Sende den Status auf den Ausgang, wenn es eine Änderung gab, die gesendet werden soll
  ]
}
Beim Schreiben des Codes und Wälzen der Doku ist mir aufgefallen, dass es im Wiki eine Beschreibung der Bausteine gibt und auch im Forum in der Knowledge Base. Diese sind jedoch nicht deckungsgleich. Z.B. gibt es im Forum "SendExplicit", das im Wiki nicht auftaucht. Im Wiki besteht die Beschreibung von "Latch" aus Platzhaltern, während es im Forum gut erklärt wird. Wenn hier Unterstützung benötigt wird, den Wiki zu aktualisieren, biete ich gerne meine Hilfe an.

Ideal für öfter verwendete Custom Logiken wäre es, wenn man den Code nur einmal hinterlegen muss und diese Logik dann einfach per Anklicken wiederverwenden kann. Sollte man einen Fehler im Code haben, muss man ihn dann nur an einer Stelle ändern und muss nicht jede Logik einzeln anpacken.

Soviel erst mal zu meinem ersten Versuch. Die Logikengine macht richtig Spaß und ich denke, dass ich noch die ein oder andere Sache damit umsetzen werde.

Re: [v3.5.1] Erste Custom Logik

Verfasst: Do Dez 22, 2022 5:59 pm
von Robert_Mini
Hallo Michael!

Danke für die Hinweise zur Doku.
Werde das zeitnah nachpflegen.

Lg
Robert

Re: [v3.5.1] Erste Custom Logik

Verfasst: Do Dez 22, 2022 6:04 pm
von StefanW
Hi Robert,

das wäre ganz toll, weil eigentlich möchte ich die KB auflösen und alles ins Wiki transferieren und sehen, dass das Wiki auch die beste Informationsquelle ist.

Hi Michael, wir haben leider nur begrenzte Accounts mit Schreibrechten (kostet jeder 10.- EUR im Monat), daher würde ich versuchen, es dem Robert zu überlassen. Ich will aber Deinen Enthusiasmus nicht einschränken, wenn Du tolle Ideen hast für Wiki Beiträge, dann kann ich Dir schon einen Account verschaffen, schreib einfach, wenn Du Dich da intensiver engagieren möchtest

lg

Stefan

Re: [v3.5.1] Erste Custom Logik

Verfasst: Do Dez 22, 2022 9:37 pm
von Eraser
Glückwunsch zur ersten Custom-Logik

Eine kurze Anmerkung zum Code:
Sollte nicht bei den Variablen der Variablenname kein Teil eines anderen Variablennamens sein?

z.B. hier:
"Status" ist ein Teil von "Status_new" und "StatusChanged"

"Internal_Send" ebenso von 2 anderen Variablen

Re: [v3.5.1] Erste Custom Logik

Verfasst: Do Dez 22, 2022 9:41 pm
von Robert_Mini
Hallo Wolfgang!

Diese Einschränkung gilt nur, wenn man diese Variablen in Ein-/Ausgängen verwendet und diese dann nachträglich ändern will.

Lg
Robert

Re: [v3.5.1] Erste Custom Logik

Verfasst: Do Dez 22, 2022 11:37 pm
von Robert_Mini
Hallo zusammen!

Beide offenen Themen ins Wiki eingearbeitet!
Latch: https://elabnet.atlassian.net/wiki/spac ... ulbaustein
SendExplicit: https://elabnet.atlassian.net/wiki/spac ... ulbaustein

lg
Robert

Re: [v3.5.1] Erste Custom Logik

Verfasst: Fr Dez 23, 2022 6:39 am
von Eraser
OK alles klar.

Re: [v3.5.1] Erste Custom Logik

Verfasst: Fr Dez 23, 2022 3:22 pm
von Robert_Mini
StefanW hat geschrieben: Do Dez 22, 2022 6:04 pm das wäre ganz toll, weil eigentlich möchte ich die KB auflösen und alles ins Wiki transferieren und sehen, dass das Wiki auch die beste Informationsquelle ist.
Hallo Stefan!

Ich werden in den Tagen nach Weihnachten beginnen, Wiki gegen KB zu prüfen.

Zum Vorgehen mache ich einen eigenen Thread auf.

Lg
Robert

Re: [v3.5.1] Erste Custom Logik

Verfasst: Fr Dez 23, 2022 4:57 pm
von StefanW
HI Robert,

das wäre super, ich werde auch ziemlich viel am Wiki arbeiten über die Feiertage, es gibt eine Menge nachzutrage, wir können uns dann gerne auch abstimmen, welche Themen ich übernehme

lg

Stefan