NEWS
HILFE: Alle Fenster geschlossen ? Datenpunkte auf true
-
@dellishelly Ich mach sowas nicht mit Blockly sondern mit NodeRed - aber über Blockly hast Du ja auch die Möglichkeit ein Objekt zu erstellen. Ich lasse bei jeder Statusänderung eines Fensters ein Objekt mit dem Status beschreiben, dass alle Fenster enthält. Dieses Objekt speicherst Du in einem Datenpunkt. Sobald dieser upgedated wird, analysierst Du mit einem weiteren Trigger dieses Objekt und gibst dann das Gesamtergebnis aus. - Wie gesagt Blockly ist da sehr hölzern, aber mit JSONATA bekommt man es wahrscheinlich hin. - Aber wie gesagt, ich nutze dieses Tool nicht, weil es viel zu viele Beschränkunge hat.
-
@mickym
Mit NodeRed kann ich leider nicht umgehen.
Die Frage ist ja wie ich die Prüfung der 15 Datenpunkte in Blockly realisiere.Danke und Lg
Delli -
@dellishelly Na ja traurig genug, aber ich hab es Dir ja beschrieben - ist halt etwas umständlicher aber funktioniert.
Hier habe ich mal den ersten Teil, der Dir Dein Objekt aufbaut:
Du lässt alle Fenster triggern - für den Aufbau des Objektes habe ich halt das Topic aus dem Pfad genommen, dass kannst natürlich selber setzen:
Aus diesen einzelnen Datenpunkten baut sich ein Objekt auf und enthält alle Deine Fenster im Klartext
Mit jeder Statusänderung dieses Datenpunktes kannst Du dann Deine Analyse antriggern. Das mache ich Dir noch - aber man sollte Vorschläge nicht gleich im Bausch und Bogen verwerfen.
Hier nun der 2. Teil der Analyse.
Der Vorteil dieser Methode ist, dass jedes Fenster sofort eine Statusänderung meldet und Du dann nicht jedesmal 15 Datenpunkte abfragen musst, sondern eine Statusänderung eines Datenpunktes enthält alle Informationen. Ich hab nur keinen Weg gefunden - Wildcards mit Blocklys zu verwenden, aber da gibts ja Leute, die dieses Tool lieben. Aber bei meiner Lösung musst halt dafür dann alle 15 Datenpunkte in den oberen Trigger aufnehmen.
Hier nun alles auf einen Blick:
Das Ganze kann man auch verwenden, um andere Alarmzustände - wenn Geräte offline sind oder sonstiges überwachen will und ist halt praktisch, da sich das immer neu aufbaut. Nur wenn mal Geräte wegfallen muss man sie halt aus dem Objekt entfernen.
Hier noch der Export - die Datenpunkte musst natürlich selbst basteln genauso wie die Topics im Objekt.
In vereinfachter Form kann man sowas auch mit Listen im Blockly machen - dann musst Du aber intern wissen, welcher Index welchem Fenster entspricht, ist halt lange nicht so schön - aber Blockly kann eben nicht wirklich mit Objekten umgehen.
Wenn der Name eindeutig des Datenpunktes vom Fenster ist kannst Du anstelle des JSONATA Ausdruckes diesen direkt dem topic zuordnen. Ich habs aus der Objekt ID extrahiert.
Also anstelle von:
kann man - wenn Deine Fenster sprechende Namen haben auch den Namen dem topic zuordnen.dann könntest Du Dir die ganze topic Variable sparen und musst halt dann für das 1. Listenelement den Namen setzen:
Vielleicht bekommst aber noch ein Haufen besserer Vorschläge - aber wie gesagt im NodeRed Umfeld ist diese Methode sehr praktisch, da das Mergen von Objekten eingebaut ist.
-
@dellishelly
Ich habe das wie folgt gelöst:Zuerst habe ich eine Aufzählung erzeugt, die alle relevanten Datenpunkte enthält.
Damit kann man einen Trigger einrichten, der bei jeder Änderung an einem der Sensoren feuert und die offenen Fenster zählt. Die Zahl der offenen Fenster wird dann in einem eigenen DP gespeichert.
Ich habe das hier mal für Deine Zwecke etwas abgewandelt.
Nur der Vollständigkeit halber: Ich mache das (Zählen der offenen Fenster) mittlerweile direkt in JS. Das ist noch übersichtlicher.
on({id: Array.prototype.slice.apply($("(functions=window)")), change: "ne"}, async function (obj) { var count = 0; var states = Array.prototype.slice.apply($("(functions=window)")); for (var index in states) { if (getState(states[index]).val) count++; } setState("0_userdata.0.Vis.fenster", count, true); });
-
Ok dank der Verbesserung von Codierknecht habe ich auch den Selektor genommen. Damit kann man die Fenster genauso selektieren:
Also entweder über
(functions=window)
um die Aufzählung zu verwenden. Oder ich hab es jetzt für meine Struktur nochmal angepasst:
kann man bei passender Struktur auch mit Wildcards arbeiten:
den unteren Teil habe ich soweit verbessert, dass bei geöffneten Fenstern, diese dann auch ausgegeben werden:
Der Unterschied ist insofern, dass man halt nicht zählt, sondern entsprechende Statusmeldungen generiert, wo man hinlaufen muss.
-
Vielen lieben Dank für eure Hilfe
Ich hab soweit alles angelegt.
Den Datenpunkt für das JSON File angelegt und zu Testzwecken 2 Lampen als zu triggernde Datenpunkte genutzt.Ich bekomme nur ne Fehlermeldung.
Hast du ne Idee woran das liegen könnte ? -
@dellishelly Als erstes hast du einen anderen Pfad - ich würde wie gesagt die Namen ggf. verwenden für das topic (also wie ganz unten beschrieben)
Also mal den Datenpunkt mit der Lampe zeigen.
Desweiteren musst Du ggf. das negieren umdrehen, wenn in Deinen States schon true bei geschlossen ist.
Ach so und bei Lichter an - dann musst Du die Logik umkehren.
- Du willst ja dann wenn alles false - ist - alle Lichter AUS angeben und falls noch eines AN ist dieses dann ausgeben.
Ach und am Anfang in das neu aufzubauende Objekt ein leeres Objekt reinschreiben, also {}
-
tut mir leid ich kann dir leider nicht ganz folgen
Was meinst du mit anderem Pfad ?
Das ist der Datenpunkt einer Lampe. Die anderen sehen alle gleich aus.
Was konkret muss ich im Skript noch anpassen ?
Den Pfad zur LampenJSON habe ich ja hinterlegt.Danke nochmal für deine Hilfe
-
Also erstes musst Du mal den Namen extrahieren.
Setz mal den Namen ein für die Ermittlung des topics und der JSONATA-Ausdruck:
ist$match($,/(.*)\.(.*)/).groups[0]
-
@mickym said in HILFE: Alle Fenster geschlossen ? Datenpunkte auf true:
$match($,/(.).(.)/).groups[0]
Okay also die Geschichte mit Topic=Namen setzen aus dem Objekt habe ich jetzt verstanden.
Was ist dieser Pfad ?$match($,/(.).(.)/).groups[0]
So hab Ichs jetzt aktuell im Skript
-
@dellishelly Dieser Ausdruck extrahiert aus Deinem Namen des Datenpunktes
da steht ja als Name Couchbeleuchtung.STATE das Wort Couchbeleuchtung. So dass im Objekt dann stehen muss:
{ "Couchbeleuchtung" : false }
Du musst ggf. halt ein Debug reinmachen und prüfen, ob alles richtig extrahiert wird.
Und wie gesagt, solange die Liste noch nicht aufgebaut ist, mach ein leeres Objekt in Deinen Datenpunkt liste_lampen rein. -
Den Ausdruck habe ich ja verstanden. Leider klappt's noch immer nicht.
hier ist der Dubug - kannst du mir dazu was sagen ?vascript.0 2023-09-19 13:27:26.337 error at Object.<anonymous> (script.js.Lichterprüfen:9:83) javascript.0 2023-09-19 13:27:26.337 error at Object.evaluate (/opt/iobroker/node_modules/jsonata/jsonata.js:5558:26) javascript.0 2023-09-19 13:27:26.337 error at evaluate (/opt/iobroker/node_modules/jsonata/jsonata.js:3525:26) javascript.0 2023-09-19 13:27:26.337 error at evaluateFunction (/opt/iobroker/node_modules/jsonata/jsonata.js:4871:28) javascript.0 2023-09-19 13:27:26.337 error at apply (/opt/iobroker/node_modules/jsonata/jsonata.js:4896:24) javascript.0 2023-09-19 13:27:26.336 error at applyInner (/opt/iobroker/node_modules/jsonata/jsonata.js:4929:33) javascript.0 2023-09-19 13:27:26.336 error at validateArguments (/opt/iobroker/node_modules/jsonata/jsonata.js:5062:39) javascript.0 2023-09-19 13:27:26.336 error at Object.validate (/opt/iobroker/node_modules/jsonata/jsonata.js:7215:28) javascript.0 2023-09-19 13:27:26.336 error at Array.forEach (<anonymous>) javascript.0 2023-09-19 13:27:26.336 error at /opt/iobroker/node_modules/jsonata/jsonata.js:7242:45 javascript.0 2023-09-19 13:27:26.336 error at Array.forEach (<anonymous>) javascript.0 2023-09-19 13:27:26.335 error at /opt/iobroker/node_modules/jsonata/jsonata.js:7272:57 javascript.0 2023-09-19 13:27:26.335 error script.js.Lichterprüfen: Error: javascript.0 2023-09-19 13:27:26.330 warn at Object.<anonymous> (script.js.Lichterprüfen:8:131) javascript.0 2023-09-19 13:27:26.330 warn at script.js.Lichterprüfen:8:52 javascript.0 2023-09-19 13:27:26.329 warn getState "0_userdata.0.Status.Liste_lampen" not found (3) states[id]=null```
-
@mickym Na der sagt, dass der Datenpunkt 0_userdata.0.Status.Liste_lampen nicht existiert. Hast Du den angelegt?
-
ja das ist ja das was ich nicht verstehe.
Ich habs aber jetzt nochmal so gemacht wie du gesagt hast und die "Liste Lampe" aus dem Skript entfernt.
funktioniert aber genauso wenig.das ist jetzt der debug
javascript.0 2023-09-19 13:37:09.279 error at Object.<anonymous> (script.js.Lichterprüfen:9:41) javascript.0 2023-09-19 13:37:09.279 error at Object.evaluate (/opt/iobroker/node_modules/jsonata/jsonata.js:5558:26) javascript.0 2023-09-19 13:37:09.279 error at evaluate (/opt/iobroker/node_modules/jsonata/jsonata.js:3525:26) javascript.0 2023-09-19 13:37:09.279 error at evaluateFunction (/opt/iobroker/node_modules/jsonata/jsonata.js:4871:28) javascript.0 2023-09-19 13:37:09.278 error at apply (/opt/iobroker/node_modules/jsonata/jsonata.js:4896:24) javascript.0 2023-09-19 13:37:09.278 error at applyInner (/opt/iobroker/node_modules/jsonata/jsonata.js:4929:33) javascript.0 2023-09-19 13:37:09.278 error at validateArguments (/opt/iobroker/node_modules/jsonata/jsonata.js:5062:39) javascript.0 2023-09-19 13:37:09.277 error at Object.validate (/opt/iobroker/node_modules/jsonata/jsonata.js:7215:28) javascript.0 2023-09-19 13:37:09.277 error at Array.forEach (<anonymous>) javascript.0 2023-09-19 13:37:09.275 error at /opt/iobroker/node_modules/jsonata/jsonata.js:7242:45 javascript.0 2023-09-19 13:37:09.275 error at Array.forEach (<anonymous>) javascript.0 2023-09-19 13:37:09.275 error at /opt/iobroker/node_modules/jsonata/jsonata.js:7272:57 javascript.0 2023-09-19 13:37:09.274 error script.js.Lichterprüfen: Error: javascript.0 2023-09-19 13:37:09.266 warn at Object.<anonymous> (script.js.Lichterprüfen:8:108) javascript.0 2023-09-19 13:37:09.263 warn at script.js.Lichterprüfen:8:52 javascript.0 2023-09-19 13:37:09.256 warn getState "Object ID" not found (3)
-
@dellishelly Nochmal hast Du denn den Datenpunkt unter userdata_0.0 angelegt?
Du kannst ja prüfen was in diesen Datenpunkt geschrieben werden soll:
Lass Dir mit Debug ausgeben, so wie im Screenshot gezeigt was in den Datenpunkt geschrieben wird.
Wenn das so ähnlich aussieht - dann ist der Input korrekt, aber Dein Datenpunkt existiert nicht.
Der Datenpunkt sollte halt ein leeres Objekt {} zu Beginn enthalten. Wenn das nicht der Fall ist, dann mach ich noch eine Abprüfung rein.
-
@dellishelly sagte: sobald der Status eines geändert wird, ALLE Fenster überprüft und eine Variable "Alle Fenster" auf true setzt wenn alle Fenster geschlossen sind.
-
ich komm mir schon maximal dämlich vor......
ja den Datenpunkte Liste_Lampen habe ich selbst angelegt
javascript.0 2023-09-19 13:54:01.168 error at Object.<anonymous> (script.js.Lichterprüfen:8:147) javascript.0 2023-09-19 13:54:01.168 error at Object.evaluate (/opt/iobroker/node_modules/jsonata/jsonata.js:5558:26) javascript.0 2023-09-19 13:54:01.167 error at evaluate (/opt/iobroker/node_modules/jsonata/jsonata.js:3493:26) javascript.0 2023-09-19 13:54:01.167 error at evaluateUnary (/opt/iobroker/node_modules/jsonata/jsonata.js:3985:26) javascript.0 2023-09-19 13:54:01.166 error at evaluateGroupExpression (/opt/iobroker/node_modules/jsonata/jsonata.js:4349:33) javascript.0 2023-09-19 13:54:01.166 error script.js.Lichterprüfen: Error: javascript.0 2023-09-19 13:54:01.163 warn at Object.<anonymous> (script.js.Lichterprüfen:8:142) javascript.0 2023-09-19 13:54:01.163 warn at script.js.Lichterprüfen:8:52 javascript.0 2023-09-19 13:54:01.161 warn getState "[object Object]" not found (3)
-
@dellishelly OK wie ich vermutete, da steht null drin. Hier ich hab mal für die Initialisierung wie folgt geändert - damit müsste es gehen:
also gib mal folgenden Code ein:
$type($[0]) = "object" ? $merge($) : $[1]
Wie gesagt damit sollte es gehen!!
Der Fehler ist dass am Anfang ein leeres Objekt erwartet wurde.
Wenn da am Anfang nicht null sondern {} drin stehen würde - wäre es gegangen - nun sollte es aber auch gehen.
Es gibt beim allerersten Mal eine Warnung - aber es sollte durchlaufen.
-
Hab ich erledigt. Leider noch immer kein erfolg
javascript.0 2023-09-19 14:16:34.253 error at Object.<anonymous> (script.js.Lichterprüfen:8:147) javascript.0 2023-09-19 14:16:34.253 error at Object.evaluate (/opt/iobroker/node_modules/jsonata/jsonata.js:5558:26) javascript.0 2023-09-19 14:16:34.252 error at evaluate (/opt/iobroker/node_modules/jsonata/jsonata.js:3493:26) javascript.0 2023-09-19 14:16:34.252 error at evaluateUnary (/opt/iobroker/node_modules/jsonata/jsonata.js:3985:26) javascript.0 2023-09-19 14:16:34.252 error at evaluateGroupExpression (/opt/iobroker/node_modules/jsonata/jsonata.js:4349:33) javascript.0 2023-09-19 14:16:34.252 error script.js.Lichterprüfen: Error: javascript.0 2023-09-19 14:16:34.249 warn at Object.<anonymous> (script.js.Lichterprüfen:8:142) javascript.0 2023-09-19 14:16:34.248 warn at script.js.Lichterprüfen:8:52 javascript.0 2023-09-19 14:16:34.245 warn getState "[object Object]" not found (3)
-
Bist du sicher dass der hier stimmt ?
$match($,/(.).(.)/).groups[0]
Woher kommt der Pfad ?
Kann ich ihn mir selbst irgendwoher kopieren ?