nachdem ich bisher mit dem Logik-Editor nicht warm geworden bin, wollte ich wieder mal einen neuen Versuch starten.
Folgende Problemstellung:
Ich kann mit (fast) allen meinen KNX-Aktoren den Strom der Verbraucher messen. Allerdings kann der Zählerstand nur alle zehn Minuten (oder länger) auf den Bus geschrieben werden. Die Werte sollen via MQTT weiterverarbeitet werden, wo sie jedoch alle 60s refreshed werden müssen. Beim MQTT-Sendefilter steht nun leider, dass diese Funktionalität noch entwickelt wird und daher stellte sich mir die Frage, ob resp. wie ich mit einer Logik den Wert eines (KNX-) Objektes alle 60s nach MQTT publishen kann.
Mit Edomi wäre das ein Oszillator und ein Wertauslöser aber ich wollte es endlich mal mit dem Wolf direkt lösen, zumal Edomi an der Stelle überhaupt nicht involviert ist.
Zunächst habe ich mit dem Baustein Taktsignal experimentiert, welcher ja einem Oszillator entspricht. Aber dabei fehlte immer noch ein Filter oder eine Sperre oder etwas in der Art. Dann bin ich eher zufällig über den Baustein Sende Text im Intervall gestolpert. Das sah doch schonmal weit erfolgversprechender aus! Nur leider lässt sich ein String-Input nicht mit einem Float- oder Integer-Objekt verbinden. Hm...
Die Lösung war dann allerdings recht einfach: Quelltext dieses Bausteines in eine Custom-Logik kopieren und die String-Eingänge auf Integer ändern. Der Baustein verwendet intern den Multiplexer, welcher seinerseits ja in vier Ausprägungen existiert, eben genau für verschiedene Input-Typen.
Et voila, mein erster Anwendungsfall der TW-Logik-Engine und das auch gleich noch mit Custom-Logik. So kann's gehen.
Wen's interessiert, hier der Code dazu:
Code: Alles auswählen
{
"Level": [
[
"$Run",
"bool",
true
],
[
"$Select",
"integer",
0
],
[
"$Val",
"integer",
0
],
[
"$Clk",
"bool",
false
],
[
"$Clk_Val",
"integer",
0
],
[
"$Period",
"float",
600
],
[
"$VAR<Inhibit?>",
"bool",
false
]
],
"Module": [
[
"Break",
[
"$VAR<Inhibit?>"
]
],
[
"Clocksignal",
"$Run",
"$Clk",
"$Period"
],
[
"Multiplexer",
[
"$Val",
"$Val"
],
"$Clk_Val",
"$Select"
]
],
"Input": [
[
"Eingang",
"Eingangswert",
"$Val",
"a"
],
[
"Intervall in Sekunden",
"Zeit [s] zwischen Senden (standard 600 Sekunden, 10 Minuten)",
"$Period",
"c"
],
[
"Inhibit",
"INHIBIT",
"$VAR<Inhibit?>",
"u"
]
],
"Output": [
[
"Ausgang",
"Per Intervall gesendeter Ausgangswert",
"$Clk_Val",
"t"
]
]
}