NEWS
Skript verschluckt Werte // JSON zerlegen?
-
Hallo
bekomme von einem Mqtt Client eine JSON Payload geliefert:
{"protocol":"S21","env":19.8,"online":true,"control":true,"home":21.0,"heat":true,"fanrpm":770,"comp":44,"outside":1.5,"liquid":33.0,"anglev":25,"Wh":1203200,"power":true,"mode":"H","temp":22.5,"demand":55,"fan":"A","swingh":false,"swingv":true,"econo":true,"powerful":false,"comfort":false,"autor":0.2,"autot":21.0,"auto0":"00:00","auto1":"00:00","autop":false,"autoe":true}Das zerlege ich per Blocky in die einzelnen Bestandteile:

Nun kommt es regelmäiß vor dass trotz Erfüllung der Triggerbedingung (Aktualisierung oder Änderung) Datenpunkte nicht aktualisiert werden (...."power":true,.... ) :

Hier zB "Power" als boolischer Wert des Ein/Auschaltzustandes.
Woran liegt das? Ist die Aktion/Inhalt in einem Trigger Auswertung von ca. 20 Attributen zu groß?
An den Details des DP mit der gesamten Payload sieht man deutlich das der Trigger auslösen müßte:

Danke!
-
Dazu braucht's gar kein Script.
Das geht ganz easy über Aliase:
https://forum.iobroker.net/topic/70481/blockly-for-dummies-starthilfe-und-tipps/12 -
Das ist ja prima, erklärt dennoch nicht warum das Extrahieren aus einem JSON im Blockly so nicht funktioniert.
In der Starthilfe ist dbzgl. als Grund nur ein "Sparen" genannt und Ressourcenprobleme kann ich aktuell bei mir nicht erkennen bei minimalsten CPU (<5%) und Speicherauslastung (<15%).Die Verwendung der Funktion wurde hier im Bereich mal erklärt und empfohlen und ist darüber hinaus an einigen Stellen im Einsatz bei mir. Wenn es dort Einschränkungen, Probleme oder was auch immer gibt, wäre eine kurze Erläuterung erfreulich.
-
Das die Anzahl der Funktionen im Trigger zu gross ist halte ich für ausgeschlossen. Ich habe trigger mit deutlich aufwändigeren daran hängenden Funktionen. Allerdings stellt sich schon die Frage ob wirklich immer alle Werte aktualisert werden müssen wenn der trigger feuert.
Ich gehe aktuell davon aus das du eine race condition hast. Dein Trigger feuert in sehr kurzen Abständen (sieht man schön an Deinem Screenshot - die Zeit zwischen 'zuletzt geändert' und 'Zeitstempel' ist sehr kurz. Daher sehe ich 3 Mögliche Anpassungen:
- Umstellung auf Alias - sprich für jeden aus dem JSON zu extrahierenden Wert einen Alias machen, mit der Transferfunktion entsprechenden Transferfunktion
- Beibehalten des Triggers, aber nur Triggern bei Änderung, nicht bei Aktualisierung. Den rest des Codes beibehalten (kann immer noch mit einer Race-Condition zu Problemen führen)
- Beibehalten des Triggers, Anpassen auf Trigger bei Änderung. Im Skript 2 Variablen halten. Einmal, als semi-Konstante den aktuellen Zustand der einzelnen DP's (sollte bei Skriptstart synchronisiert werden), sowie einmal als Objekt in dem nur die Attribute drin stehen die sich wirklich geändert haben. Nur diese werden dann am Ende des Triggers auch via
aktualisieregeschrieben.
Das was in deinem Skript die Zeit verbraucht sind die vielen
aktualisiereBausteine - bei denen ich davon aus gehe das nur in ganz seltenen Fällen wirklich mehrere / alle zu aktualisieren sind.A.
-
Das die Anzahl der Funktionen im Trigger zu gross ist halte ich für ausgeschlossen. Ich habe trigger mit deutlich aufwändigeren daran hängenden Funktionen. Allerdings stellt sich schon die Frage ob wirklich immer alle Werte aktualisert werden müssen wenn der trigger feuert.
Ich gehe aktuell davon aus das du eine race condition hast. Dein Trigger feuert in sehr kurzen Abständen (sieht man schön an Deinem Screenshot - die Zeit zwischen 'zuletzt geändert' und 'Zeitstempel' ist sehr kurz. Daher sehe ich 3 Mögliche Anpassungen:
- Umstellung auf Alias - sprich für jeden aus dem JSON zu extrahierenden Wert einen Alias machen, mit der Transferfunktion entsprechenden Transferfunktion
- Beibehalten des Triggers, aber nur Triggern bei Änderung, nicht bei Aktualisierung. Den rest des Codes beibehalten (kann immer noch mit einer Race-Condition zu Problemen führen)
- Beibehalten des Triggers, Anpassen auf Trigger bei Änderung. Im Skript 2 Variablen halten. Einmal, als semi-Konstante den aktuellen Zustand der einzelnen DP's (sollte bei Skriptstart synchronisiert werden), sowie einmal als Objekt in dem nur die Attribute drin stehen die sich wirklich geändert haben. Nur diese werden dann am Ende des Triggers auch via
aktualisieregeschrieben.
Das was in deinem Skript die Zeit verbraucht sind die vielen
aktualisiereBausteine - bei denen ich davon aus gehe das nur in ganz seltenen Fällen wirklich mehrere / alle zu aktualisieren sind.A.
@Asgothian sagte in Skript verschluckt Werte // JSON zerlegen?:
Das was in deinem Skript die Zeit verbraucht sind die vielen aktualisiere Bausteine - bei denen ich davon aus gehe das nur in ganz seltenen Fällen wirklich mehrere / alle zu aktualisieren sind.
Vielen Dank! Das hilft mir zu verstehen und hoffentlich zu verbessern/vermeiden.
@Asgothian sagte in Skript verschluckt Werte // JSON zerlegen?:
Beibehalten des Triggers, aber nur Triggern bei Änderung
Damit habe ich bereits experimentiert und führt leider auch zu keinem verlässlichen Ergebnis. Manchmal ist die Extraktion ok/in Ordnung an anderen Tagen funktioniert es wieder gar nicht. Hatte schon den MqTTBroker in Verdacht und gewechselt aber der ist es nicht da die Rohdaten ja eintreffen.
@Asgothian sagte in Skript verschluckt Werte // JSON zerlegen?:
(kann immer noch mit einer Race-Condition zu Problemen führen)
Danke Dann ist das so ungeschickt aus diesem Grund so aufgebaut und werde es überall anpassen.