NEWS
GetState bei Alias nicht immer korrekt
-
Re: Frage zu Alias
Hi, hat dazu von Euch jemand eine Idee, ich stehe ein wenig auf dem Schlauch.
Ich habe 2 DP, einen für Read, einem für write (Tasmota) beide Datatype String- 0_userdata.0.DC4F22803CA2.stat.power1 => MQTTClient ( subscribe stat/DC4F22803CA2/POWER1) changes only, Exactly once
- 0_userdata.0.DC4F22803CA2.cmnd.power1=> MQTTClient ( publish cmnd/DC4F22803CA2/POWER1) Exactly once, retained
Dazu gibt es einen Alias DP. Datatype boolean
- Read = link auf 0_userdata.0.DC4F22803CA2.stat.power1 , Read convert function: val=='ON'?true:val=='on'?true:val=='OFF'?false':val=='off'?false:null
- Write == link auf 0_userdata.0.DC4F22803CA2.cmnd.power1, Write convert function: val?'ON':'OFF'
Nun das Problem. Die Adminoberfläche zeigt zu jedem Zeitpunkt für den Alias DP immer den richtigen Status True/False an. Wenn ich den Alias DP in einem Script auslese
var xxx = getState('aliasDP').val.
erhalte ich in einigen Fällen kein False zurück sonder auch schonmal "OFF" und nicht das Ergebnis des Convert. Hatt dazu vielleicht jemand eine Idee?
Vielen Dank
Helmut -
@hschief
Versuche es mal mit dieser Lesekonvertierung:val == 'ON' || val == 'on'
Können wirklich unterschiedlich geschriebene Strings vorkommen?
-
@paul53 Vielen Dank für die schnelle Antwort, die Prüfung auf "ON" / "on" ist mehr der Sicherheit geschuldet. Ich hatte vorher nur "ON" & "OFF", da war der beschriebe Fehler aber auch da.
Interessant ist ja eigentlich, dass im IOBroker Admin dies richtig dargestellt wird, nur bei dem getState wohl falsch dargestellt wird
Dein Vorschlag wäre: val=='ON' || val=='on'?true : val=='OFF' || val =='off'?false : null
Richtig? -
@hschief sagte: Dein Vorschlag wäre: val=='ON' || val=='on'?true : val=='OFF' || val =='off'?false : null
Richtig?Nein. So wie gezeigt, ist die Lesekonvertierung komplett. Jeder Vergleich liefert als Ergebnis false oder true. Es sollte so genügen:
val == 'ON'
null ist übrigens vom Typ "object".
-
Hi,
Ich habe jetzt mal die Idee von Paul getestet und ebenfalls auch mal den Alias DP komplett gelöscht und mit neuem Namen neu angelegt.
Leider bleibt das merkwürdig Verhalten erhalten.
Ich hatte gestern wieder den folgenden Output beim lesen.
2025-08-12 08:02:36.996 - warn: javascript.0 (187304) script.js.Schlafzimmer_Helmut.Taster: Licht =OFF Speaker =start MqttValueTasmota =OFF
2025-08-12 22:09:15.347 - warn: javascript.0 (187304) script.js.Schlafzimmer_Helmut.Taster: Licht =OFF Speaker =stop MqttValueTasmota =OFF
2025-08-12 22:17:17.155 - warn: javascript.0 (187304) script.js.Schlafzimmer_Helmut.Taster: Licht =true Speaker =stop MqttValueTasmota =ON
Zwischen 22:09 und 22:17 habe ich den Alias Datenpunkt über die VIS auf true gesetz -> der write DP sendet dann über MQTT/CMND an Tasmota, Tasmota antwortet über STAT und der Read DP liefert OFF, was dann von dem Alias richtig umgesetzt wird.Nach einer unbestimmten Zeit oder nach einem unbestimmten Ereignis liefert der Alias dann allerdings wie in dem Log zu sehen Licht=OFF und nicht mehr false obwohl dies entsprechend der Alias Konvertierung gar nicht passieren darf, denn dort steht: read => val=='ON', somit dürfte in diesem Fall nie ein True erscheinen.
{ "common": { "name": "Licht_WC", "desc": "Manually created", "role": "state", "type": "boolean", "read": true, "write": true, "def": false, "alias": { "id": { "read": "0_userdata.0.Schlafzimmer_Helmut.DC4F22803CA2.stat.power1", "write": "0_userdata.0.Schlafzimmer_Helmut.DC4F22803CA2.cmnd.power1" }, "read": "val=='ON'", "write": "val ? 'ON':'OFF'" } }, "type": "state", "native": {}, "_id": "alias.0.SchlafzimmerHelmut.Licht_WC", "acl": { "object": 1636, "state": 1636, "owner": "system.user.helmut", "ownerGroup": "system.group.administrator" }, "from": "system.adapter.admin.0", "user": "system.user.helmut", "ts": 1754551409965 }
Gelesen wird wie folgt:
var IstStateLicht = getState(ObjIDLicht).val; var IstStateSpeaker = getState(ObjIDSpk).val; var IstMqttObject = getState(ObjIDLicht2).val; log('Licht =' +IstStateLicht +' Speaker =' +IstStateSpeaker + ' MqttValueTasmota =' +IstMqttObject,'warn');