NEWS
[gelöst] setState funktioniert nicht bei Device ?
-
Hi Ihr,
ich hab heute mal angefangen automatisch Devices anzulegen, um gewisse Daten sinngemäß zusammen zu halten und an ein echtes Gerät binden zu können...
Das Device erstelle ich mit setObject via Javascript und sieht im JSON Abzug (nach Anlegen des States "LastSetTemperature") so aus:{ "0_userdata.0.DeviceState.Heatage.Configurations.Zoe.Heaters.Heizkoerperthermostat": { "type": "device", "common": { "name": "Heizkoerperthermostat", "read": true, "write": true, "def": "" }, "native": {}, "from": "system.adapter.javascript.0", "user": "system.user.admin", "ts": 1670322887832, "_id": "0_userdata.0.DeviceState.Heatage.Configurations.Zoe.Heaters.Heizkoerperthermostat", "acl": { "object": 1636, "owner": "system.user.admin", "ownerGroup": "system.group.administrator" } }, "0_userdata.0.DeviceState.Heatage.Configurations.Zoe.Heaters.Heizkoerperthermostat.LastSetTemperature": { "type": "state", "common": { "name": "LastSetTemperature", "type": "number", "role": "state", "read": true, "write": true, "def": "" }, "native": {}, "from": "system.adapter.javascript.0", "user": "system.user.admin", "ts": 1670322887833, "_id": "0_userdata.0.DeviceState.Heatage.Configurations.Zoe.Heaters.Heizkoerperthermostat.LastSetTemperature", "acl": { "object": 1636, "state": 1636, "owner": "system.user.admin", "ownerGroup": "system.group.administrator" } } }
Wenn ich jetzt Versuche mit setState auf 0_userdata.0.DeviceState.Heatage.Configurations.Zoe.Heaters.Heizkoerperthermostat.LastSetTemperature einen Wert zuzuweisen, bekomme ich die Fehlermeldung:
State "0_userdata.0.DeviceState.Heatage.Configurations.Zoe.Heaters.Heizkoerperthermostat.LastSetTemperature" not found
Kann mir das einer erklärenm und/oder mir sagen, wie ich das richtig mache?
Danke!
-
@great-sun sagte in setState funktioniert nicht bei Device ?:
State "0_userdata.0
wasndas 0_ wie kommst du dadrauf
-
@great-sun sagte: sieht im JSON Abzug (nach Anlegen des States "LastSetTemperature") so aus:
Man kann nicht ein Device und einen Datenpunkt zusammen erzeugen. Das sind getrennte Objekte. Einen Datenpunkt erstellt man mit createState().
-
@paul53 Ja, ich weiß. Das habe ich auch nicht gemacht.
Habe beides mit setObject angelegt.
Das Ergebnis (wenn man einen JSON export macht) ist aber dann das o.g. -
@arteck Das ist bei mir in den Objekten so drin.
-
@great-sun sagte: Das Ergebnis (wenn man einen JSON export macht) ist aber dann das o.g.
Das ist ein Objekt, das nicht ioBroker konform ist. Lösche es und erstelle 2 konforme Objekte, etwa so:
const idDev = '0_userdata.0.DeviceState.Heatage.Configurations.Zoe.Heaters.Heizkoerperthermostat'; const idSoll = idDev + '.LastSetTemperature'; const obj = { type: 'device', common: { name: 'Heizkörperthermostat' }, native: {} }; setObject(idDev, obj); createState(idSoll, 0, { name: 'LastSetTemperature', type: 'number', role: 'value.temperature', read: true, write: false, def: 0 });
-
@paul53 Kannst Du mir sagen, wie ich diese dann erstellen sollte?
0_userdata.0.DeviceState.Heatage.Configurations.Zoe.Heaters with {"type":"folder","common":{"name":"Heaters","read":true,"write":true,"def":"","role":""},"native":{}}
0_userdata.0.DeviceState.Heatage.Configurations.Zoe.Heaters.Heizkoerperthermostat with {"type":"device","common":{"name":"Heizkoerperthermostat","read":true,"write":true,"def":"","role":""},"native":{}}
0_userdata.0.DeviceState.Heatage.Configurations.Zoe.Heaters.Heizkoerperthermostat.LastSetTemperature with {"type":"state","common":{"name":"LastSetTemperature","type":"number","role":"state","read":true,"write":true,"def":""},"native":{}}
-
@paul53 Ich besser das mal aus (statt setObject -> createState) und schau mal, ob es dann geht.
Danke erstmal für die Mühe!
-
@great-sun
Nur Datenpunkte haben common.type, common.read, common.write und common.def. -
@paul53 Also muss ich das beim Device rauslassen?
-
@great-sun sagte: muss ich das beim Device rauslassen?
Ja.
-
@paul53
Ich hab das jetzt so in der Erstellung:setObject('0_userdata.0.DeviceState.Heatage.Configurations.Zoe.Heaters', {"type":"folder","common":{"name":"Heaters"},"native":{}});
setObject('0_userdata.0.DeviceState.Heatage.Configurations.Zoe.Heaters.Heizkoerperthermostat', {"type":"device","common":{"name":"Heizkoerperthermostat"},"native":{}});
createState('0_userdata.0.DeviceState.Heatage.Configurations.Zoe.Heaters.Heizkoerperthermostat', null, {'name': 'LastSetTemperature', 'type': 'number', 'role': 'value', 'read': true, 'write': true);
Darf ich bei dem createState null nicht benutzen?
Brauche ich zwangsweise das default value?Das Objekt als solches wird angelegt ohne Fehler, nur, wenn ich dann mit setState etwas reinschreiben will, gibts den Fehler.
-
@great-sun sagte: Darf ich bei dem createState null nicht benutzen?
Nein, null steht für "nicht vorhanden".
@great-sun sagte in setState funktioniert nicht bei Device ?:
wenn ich dann mit setState etwas reinschreiben will, gibts den Fehler.
Welchen Fehler? Unmittelbar nach createState() kann man setState() nicht verwenden, da der Datenpunkt noch nicht fertig erstellt ist.
Man kann einen Datenpunkt auch mit setObject() erstellen und mit setState() in der Callback-Funktion initialisieren.
const idDev = '0_userdata.0.DeviceState.Heatage.Configurations.Zoe.Heaters.Heizkoerperthermostat'; const idSoll = idDev + '.LastSetTemperature'; setObject(idDev, { type: 'device', common: { name: 'Heizkörperthermostat' }, native: {} }); setObject(idSoll, { type: 'state', common: { name: 'LastSetTemperature', type: 'number', role: 'level.temperature', read: true, write: true, def: 0 }, native: {} }, function() { setState(idSoll, 20, true); });
-
@paul53 Hach ja... Und ich dachte beim bauen des Scripts, dass es createState und createStateAsync gibt, weil createState das Objekt direkt erzeugt und man damit danach arbeiten kann...
Das genau war die Lösung!!!
Vielen lieben Dank für den Hint mit dem Callback.