NEWS
Mehrere Trigger verarbeiten und Wert setzen
-
Hey Leute,
ich bin schon eine Weile am rumprobieren, doch ich komme zu keinem Ergebnis, was mir gefällt.
Als erstes fange ich mal damit an, zu erklären, was ich vor habe und dann zeige ich euch mal mein Script, was nicht so läuft wie erwartet.
Ich habe vor 4 verschiedene Schaltzustände logisch miteinander zu "verknüpfen". Und zwar in der Form, dass ein "gemeinsamer Datenpunkt" auf wahr oder falsch gesetzt wird, je nach Sitution. Sobald einer der 4 Schaltzustände wahr ist, soll der gemeinsame Datenpunkt auf wahr gesetzt werden. Aber erst wenn ALLE 4 Datenpunkte auf falsch sind, soll der gemeinsame Datenpunkt auf falsch gesetzt werden.
Bei meinem ersten Versuch mit dem Script unten, hat er auf den ersten Datenpunkt reagiert und den gemeinsamen Datenpunkt auf wahr oder falsch gestellt, sobald ich aber Datenpunkt 2 - 4 verstellt habe, passierte nichts. Vielleicht gibt es auch eine "schönere" Möglichkeit das Problem zu lösen als mein Ansatz.
Hier das Script / Blockly:
Und zusätzlich kommt in regelmäßigen Abständen (alle 60 Sekunden) eine "warn" Meldung mit dem Inhalt:
javascript.0 (2088163) at Object.<anonymous> (script.js.MQTT_Scripte.Bueroueberwachung_Blockly:24:3)
Was kann ich machen um die "Meldung" weg zu bekommen, auch wenn es ja "nur" eine Warnung ist?
Michael
PS: Zur Erklärung:
Die 4 Trigger Objekte sind Schaltzustände von einem Schaltaktor und der Datenpunkt, der gesteuert wird, ist ein true / false Wert, welcher am Ende mittels MQTT an ein ESP Gesendet wird, der entsprechend eine StatusLED ein und aus schaltet. Der Teil mit der LED funktioniert. Also nur zum Hintergrund des ganzen.
-
@raspido sagte: die "Meldung" weg zu bekommen, auch wenn es ja "nur" eine Warnung ist?
Ist der MQTT-Datenpunkt vom Typ "boolean"?
Sind Skripte unter der Gruppe "global" aktiv (Expertenmodus)? -
@paul53 Der MQTT-Datenpunkt ist als "Logikwert" definiert. Das Script befindet sich im Root-Verzeichnis, in einem Unterordner. Hier die Struktur:
Also ohne Expertenmodus, ich hatte mal in der Vergangenheit irgendwo gelesen, dass der Expertenmodus nur verwendet werden sollte, wenn es sein muss. Daher nutze ich den sogut wie nie.
-
@raspido sagte: der Expertenmodus nur verwendet werden sollte, wenn es sein muss.
Um zu schauen, ob es unter "global" ein aktives Skript gibt, sollte der Expertenmodus mal aktiviert werden. Die Zeilennummer 24 der Fehlermeldung deutet daraufhin, dass dies der Fall kein kann.
-
@raspido du kannst oben rechts auch auf den Quellcode umschalten - da kannst du sehen was in Zeile 24 steht (also welcher Befehl genau).
Zudem würde einFalls - Wert
reichen in deiner Abfrage:
da du eh alle per Oder auf True prüfst.ok, ist qatsch da die Lampe sonst nicht wieder ausgeht, ok
-
@bananajoe sagte: da kannst du sehen was in Zeile 24 steht
So umfangreich ist das Skript nicht.
-
Hey Leute,
ich weiß, mein letzter Kontakt hier ist etwas her. Die Arbeit und der Notdienst haben leider nicht wirklich zu gelassen, dass ich mich mit meinem Problem beschäftigen konnte. Ich hoffe, man hilft mir trotzdem dem "Problem" auf die Spur zu kommen.
@paul53 genau, soviele Zeilen hat mein Scipt garnicht. Und im Ordner "global" gibt es kein Script mit dem Namen, was ich für das aktuelle Script verwende. Genauer gesagt, sind dort keine Scripte drin.
@BananaJoe Das Script selbst soll ja garkein Licht schalten, sondern lediglich darauf reagieren, ob eines der 4 Lichter (oder auch Schaltkanäle) an ist oder eben aus.
Daher die etwas "komplizierte" Abfrage in der Logikstruktur.
Mein Plan war folgende 2 Wege:
Sobald ein oder mehrere "Schaltkanäle" High sind, soll der Datenpunkt "Statusanzeige.Kueche.Licht" auf wahr gesetzt werden. Lediglich sobald ALLE 4 "Schaltkanäle" auf LOW sind, soll dieser Datenpunkt auf falsch gesetzt werden. Das ganze soll als "Statusanzeige" dienen, damit man es merkt, wenn noch ein Licht brennt, ohne gleich in den Raum zu gehen.
Ich habe da gerade aber selber nochmal was anderes probiert und wollte euch mein Gedankengang auch mal zu kommen lassen.
Hier ein Screenshot vom Blockly:
Und zusätzlich das Blockly als JavaScript Code(die letzte Kommentarzeile habe ich nur weg gelassen, da diese "unendlich" lang war und Kommentar, wird normal ja "ignoriert" beim Code):
on({id: [].concat(['hm-rpc.1.00259D89A4E48F.10.STATE']).concat(['hm-rpc.1.00259D89A4E48F.18.STATE']).concat(['hm-rpc.1.00259D89A4E48F.14.STATE']).concat(['hm-rpc.1.00259D89A4E48F.12.STATE']), change: "any"}, async function (obj) { if ((getState("hm-rpc.1.00259D89A4E48F.10.STATE").val || getState("hm-rpc.1.00259D89A4E48F.12.STATE").val || getState("hm-rpc.1.00259D89A4E48F.14.STATE").val || getState("hm-rpc.1.00259D89A4E48F.18.STATE").val) == true) { setState("0_userdata.0.Statusanzeigen.Kueche.Licht"/*Statusanzeigen.Kueche.Licht*/, true); } if ((getState("hm-rpc.1.00259D89A4E48F.10.STATE").val && getState("hm-rpc.1.00259D89A4E48F.12.STATE").val && getState("hm-rpc.1.00259D89A4E48F.14.STATE").val && getState("hm-rpc.1.00259D89A4E48F.18.STATE").val) == false) { setState("0_userdata.0.Statusanzeigen.Kueche.Licht"/*Statusanzeigen.Kueche.Licht*/, false); } });
Michael
PS: Und die "Warn" Meldung kommt noch immer wie gewohnt
-
@raspido sagte: Und die "Warn" Meldung kommt noch immer wie gewohnt
Im Tab "Protokolle" findet man weitere Informationen zur Warnung.
Besserer Code:
-
@paul53 Den Baustein "setze licht auf", wo finde ich den? Irgendwie habe ich den bislang nicht gefunden. Klar "Licht" ist der Parameter, den ich definieren muss. Aber an sich das Element finde ich auf den ersten Blick nicht.
Den mein Skript, was ich oben gepostet habe, funktioniert irgendwie garnicht. Also der Datenpunkt "Statusanzeige.Kueche.Licht" wird niemals verändert. Und zumindest der Logik, der ich versuche etwas an zu nehmen, sollte es theoretisch funktionieren.
Michael
-
@raspido sagte in Mehrere Trigger verarbeiten und Wert setzen:
Den Baustein "setze licht auf", wo finde ich den? Irgendwie habe ich den bislang nicht gefunden.
Du musst eine neue Variable anlegen. Die nennst du wie Du willst (in diesem Beispiel
licht
) und findest dann unter Variablen auch den Baustein, um diese Variable zu setzen. -
@haus-automatisierung Danke für den Tipp für das mit dem setze licht auf, aber der Logikbaustein oder, den finde ich so auch nicht. Irgendwie irritiert mich das gerade da ein wenig
Also mein "oder" sieht so aus:
Ich habe es hin bekommen und es läuft. DANKE
Ich wollte euch nun noch die Hardware zeigen, die zum ganzen Projekt gehört. Ist noch ein Prototyp an Platine, aber Platine wird noch in "richtig" gefährtigt bei JLCPCB, aber vorher muss ich mir noch ein passendes Gehäuse besorgen, damit die Platine dort auch vernünftig rein passt. Platine an sich ist fertig, nun kommt es aufs "Format" an und die Montagelöcher.
Einmal das ganze Licht aus und Fenster zu:
Einmal ein oder mehrere Lichter an und Fenster offen:
Je überwachten Zustand ist eine LED. Okay beim ESP-01 sind ohne Umwege "nur" 2 möglich, aber für das Projekt reicht es so an sich eigentlich aus. Soll ja nur als "kleines Modul" dienen, wenn irgendwo ein "Zustand" nicht ist, wie es sein soll. Kann man ja an sich individuell einsetzen. Sobald dieses Modul mit den dazugehörigen LEDs "richtig" montiert ist, kann ich bei Interesse noch ein Foto machen. Wird aber wenig aufällig sein, da lediglich 2 LEDs mit Klarem Körper in der Holzpaneldecke montiert sind. Also die sollen möglichst wenig auffallen, wenn alles okay ist, so der Plan
Hier noch das funktionierende Blockly und zusätzlich das Blockly fürs Fenster:
Ich habe das "Fensterscript" gleich auch mal "optimiert", nachdem Beispiel vom Licht.
Falls der Schaltplan für das Board gewünscht wird, kurze Info, kann ich gerne zeigen. Ist ja nichts wildes dran.
-
@raspido sagte in Mehrere Trigger verarbeiten und Wert setzen:
Also mein "oder" sieht so aus:
mit der rechten Maustaste anklicken und im Popup-Menü "externe Eingänge" wählen (oder "interne Eingänge").
Funktioniert an fast allen Bausteinen -
@bananajoe Habe ich mit etwas üben und "rumspielen" auch raus bekommen. Aber vielen Dank für den Tipp.