NEWS
Triggern DP ohne Wert nicht möglich (true/leer)-stiebel-isg
-
Äääähm Leute ... bitte baut mal das getState da aus aus dem Trigger!
Wenn ein "on" Trigger triggert kann es sein das "getState" noch den alten Wert hat. Immer das übergebene State object nutzen!
Also:
on({id: "stiebel-isg.0.Info.STATUS.BETRIEBSSTATUS.WARMWASSERBEREITUNG"/*WARMWASSERBEREITUNG*/, change: "any"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; var tmp = "nicht aktiv"; if (value == true) { tmp = "Warmwasser"; } setState("0_userdata.0.Status_WP"/*Status_WP*/, tmp, true); });
-
@apollon77 sagte in Triggern DP ohne Wert nicht möglich (true/leer)-stiebel-isg:
Äääähm Leute ... bitte baut mal das getState da aus aus dem Trigger!
Wenn ein "on" Trigger triggert kann es sein das "getState" noch den alten Wert hat. Immer das übergebene State object nutzen!
Hallo, bisher hörte ich in Diskussionen immer, dass der State dann evtl schon einen neuen Wert hat und man es deshalb unterlassen sollte, mal davon abgesehen dass man eh den Wert, der schon mitgeliefert wird, nehmen sollte. Könntest du den Sachverhalt bitte etwas näher erläutern? Im Moment des GetState() wurde der Triggerwert doch schon ermittelt, wie kann man da noch den alten Wert bekommen? Danke!
-
@fastfoot Sagen wir es mal so: Er kann einen "anderen" wert haben
-
So funktioniert es jetzt:
-
@TH-G Du solltest zusätzlich vor dem Ausführen des Intervalls einen Stop erzwingen. Sonst kann es sein, dass Kopien des Intervalls laufen, die sich mit der Zeit anhäufen.
-
Hallo, ich muss das Thema nochmals aktivieren.
Ich bekommen massenweise Warnungen im Log und ich würde das gerne lösen.
So sieht es derzeit aus:
Ich brauche bitte nochmals Hilfe was ich tun kann.
-
@th-g said in Triggern DP ohne Wert nicht möglich (true/leer)-stiebel-isg:
Ich brauche bitte nochmals Hilfe was ich tun kann.
Im Tab Log findest du mehr Infos, welche sind das? Ausserdem solltest du, anstatt den Wert von Heizung nochmals auszulesen, den tatsächlichen Wert benutzen, zu finden im Trigger Block.
-
Hier der Log:
avascript.0 2021-01-15 11:53:02.849 warn (2355) at processTimers (internal/timers.js:497:7)
javascript.0 2021-01-15 11:53:02.849 warn (2355) at listOnTimeout (internal/timers.js:554:17)
javascript.0 2021-01-15 11:53:02.849 warn (2355) at Timeout._onTimeout (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1982:34)
javascript.0 2021-01-15 11:53:02.848 warn (2355) at Object.<anonymous> (script.js.common.Tecalor_Betriebsart_Aktuell_Heizen:8:9)
javascript.0 2021-01-15 11:53:02.845 warn (2355) getState "stiebel-isg.0.Info.STATUS.BETRIEBSSTATUS.HEIZEN" not found (3)Was du mit dem tatsächlichen Wert meinst verstehe ich nicht. Wenn Heizung aktiv ist steht in dem Feld true wenn nicht steht dort nichts
-
@th-g said in Triggern DP ohne Wert nicht möglich (true/leer)-stiebel-isg:
Hier der Log:
javascript.0 2021-01-15 11:53:02.845 warn (2355) getState "stiebel-isg.0.Info.STATUS.BETRIEBSSTATUS.HEIZEN" not found (3)Was du mit dem tatsächlichen Wert meinst verstehe ich nicht. Wenn Heizung aktiv ist steht in dem Feld true wenn nicht steht dort nichts
mit tatsächlicher Wert meinte ich den Wert zum Zeitpunkt des Auslösens des Triggers. Wie du ihn abfrägst habe ich ja im Bild gezeigt.
-
Sorry ich weiß jetzt nicht was unklar ist aber der Wert im DP Heizen ist "true" oder ein leeres Feld.
Was willst du mir bitte sagen?
-
@th-g said in Triggern DP ohne Wert nicht möglich (true/leer)-stiebel-isg:
Sorry ich weiß jetzt nicht was unklar ist aber der Wert im DP Heizen ist "true" oder ein leeres Feld.
Was willst du mir bitte sagen?
ich rede von deinem Blockly, wieviele Werte genau fragst du da ab? Von genau diesem einen Wert rede ich und habe eine Alternative genannt es besser zu machen
-
Im Blockly siehst du das ich einen Wert abfrage und zwar den DP Heizen.
Für dich mag es normal sein mit dem was du mir schreibst aber ich verstehe nicht was du meinst. Was soll ich denn in meinem Blockly ändern?
Würde mich freuen, wenn du es mir für einen Anfänger erklären würdest.
Die Aufgabe ist:
Wenn im DP Heizen -true- steht soll im Datenpunkt Status_WP der Text -Heizen- stehen und wenn nicht dann der Text -nicht aktiv-.
Das alles funktioniert ja auch aber wenn halt im DP nichts steht, läuft mein Log voll und das muss geändert werden.
-
@th-g said in Triggern DP ohne Wert nicht möglich (true/leer)-stiebel-isg:
Im Blockly siehst du das ich einen Wert abfrage und zwar den DP Heizen.
Für dich mag es normal sein mit dem was du mir schreibst aber ich verstehe nicht was du meinst. Was soll ich denn in meinem Blockly ändern?
Aber du siehst doch den Unterschied in meinem Bild. Wo du dieses Wert herbekommst habe ich auch geschrieben.
-
Danke für den Versuch mir zu helfen aber ich scheine dich nicht zu verstehen und aus deinen kurzen Antworten, kann ich für mich leider keine Informationen ableiten.
Eventuell kann jemand anders helfen, den ich besser verstehe.
Wenn ich das Skript starte ist alles ok.
Dann läuft die Wärmepumpe an und der Status im DP Heizen der Wärmepumpe ändert sich der Wert von -leer- (also kein Wert im DP) auf -true-.
Im Vis wird dann im auch der Text im DP Status_WP richtig angzeigt mit -Heizen-
Ist Heizen dann vorbei steht im DP Heizen wieder kein Wert und auch hier wird dann im DP Status_WP -nicht aktiv- richtig angezeigt.
Danach fangen aber die ständigen Warnungen im Log um Rhythmus des Intervalls an. -
@th-g Ändere diesen Teil
so ab
das verhindert das (nochmalige) Lesen eines nicht vorhandenen Status(DP = leer). Soweit die Theorie, ob es funktioniert sehen wir dann. Dachte nicht dass das irgendwie unklar sein könnte
-
@th-g said in Triggern DP ohne Wert nicht möglich (true/leer)-stiebel-isg:
javascript.0 2021-01-15 11:53:02.845 warn (2355) getState "stiebel-isg.0.Info.STATUS.BETRIEBSSTATUS.HEIZEN" not found (3)
Hallo, bin zwar auch Anfänger und dabei zu lernen - versuche aber mal meine Sicht aufzuzeigen.
Die zitierte Logmeldung bedeutet für mich, dass der DP des Adapters hier nicht mehr existiert.
Es scheint also, dass der Adapter in den DP entweder true einträgt oder ihn "löscht" (wie immer das aussieht)
Eigentlich sollte ein DP vom Typ boolean genau zwei Werte annehmen können: true (wahr) odere false (falsch). Wenn der DP anstelle den Wert false zu bekommen "gelöscht wird" löst er keinen Trigger aus, daher kommt es nie zu der Aussage "nicht aktiv", da der Trigger fehlt. Kein Problem von Blockly sondern des Adapters.
Ersatzweise ist ein rein Zyklische Abfrage des Datenpunkts möglich (wie du gezeigt hast - ich würde dann aber die äussere Schleife des Triggers ganz weglassen). Die Fehlermeldung des nicht existierenden DP wird es dann aber immer geben. (Vielleicht nach diesem Beispiel vermeidbar https://forum.iobroker.net/topic/27985/prüfen-ob-datenpunkt-existiert)In einer Zeitintervall-Schleife auf einen alten Wert zuzugreifen wird nicht funktionieren, da er sich ja dann nie mehr ändert.
-
@tobi19 said in Triggern DP ohne Wert nicht möglich (true/leer)-stiebel-isg:
@th-g said in Triggern DP ohne Wert nicht möglich (true/leer)-stiebel-isg:
javascript.0 2021-01-15 11:53:02.845 warn (2355) getState "stiebel-isg.0.Info.STATUS.BETRIEBSSTATUS.HEIZEN" not found (3)
Hallo, bin zwar auch Anfänger und dabei zu lernen - versuche aber mal meine Sicht aufzuzeigen.
Die zitierte Logmeldung bedeutet für mich, dass der DP des Adapters hier nicht mehr existiert.
Es scheint also, dass der Adapter in den DP entweder true einträgt oder ihn "löscht" (wie immer das aussieht)Das sehe ich auch so
... Wenn der DP anstelle den Wert false zu bekommen "gelöscht wird" löst er keinen Trigger aus, daher kommt es nie zu der Aussage "nicht aktiv", da der Trigger fehlt. Kein Problem von Blockly sondern des Adapters.
Das ist nicht richtig, denn:
Ist Heizen dann vorbei steht im DP Heizen wieder kein Wert und auch hier wird dann im DP Status_WP -nicht aktiv- richtig angezeigt.
Danach fangen aber die ständigen Warnungen im Log um Rhythmus des Intervalls an.>Das liegt m.E. daran, dass der Wert, welcher triggert, unmittelbar nach dem Triggern noch einmal eingelesen wird mit Wert vom Objekt Heizen. Das sollte man grundsätzlich nicht machen, da der Trigger bereits den Wert liefert und der neu eingelesene durchaus anders sein kann. In diesem speziellen Fall wird dann aber versucht, einen nicht (mehr) existenten DP zu lesen, was zu den LOG Einträgen führt. Die Verwendung des Triggerwertes anstelle von neuem Einlesen sollte das wohl verhindern
Ob das tatsächlich hilft, kann nur der TE bestätigen
-
Wie kann denn das gehen, wenn es keine Frage mehr gibt, ob der Status true ist? Was bedeute das nun nur mit der Wert?
Das das ein Problem vom Adapter ist ist bekannt aber laut Entwickler nicht zu ändern, da einfach kein Wert von der Anlage ausgegeben wird.
-
@th-g said in Triggern DP ohne Wert nicht möglich (true/leer)-stiebel-isg:
Wie kann denn das gehen, wenn es keine Frage mehr gibt, ob der Status true ist? Was bedeute das nun nur mit der Wert?
Das das ein Problem vom Adapter ist ist bekannt aber laut Entwickler nicht zu ändern, da einfach kein Wert von der Anlage ausgegeben wird.
Der Wert (keine angelegte Variable!!!) ist der Wert zum Zeitpunkt des Triggerns, im Prinzip genau was du gemacht hast, jedoch halt der Originalwert. Ein danach gelesener Wert könnte bereits ein anderer sein. Falls prüft immer auf Wahr, weshalb es die verkürzte Version von
Falls Wert = Wahr
ist.Funktioniert es denn jetzt oder kommen die LOG Einträge immer noch?
-
Ah aber das musst du doch auch erklären, jetzt verstehe ich das erst. Ich muss warten bis die Wärmepumpe wieder anspringt