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
]
}
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.