NEWS
Datenpunkt vom Typ Array States löschen
-
@rabu60
So wie common.states angelegt ist, muss der Datenpunkt vom Typ "number" sein - nicht "array". Das Objekt common.states enthält die Zuweisung von Zustandstexten zu Werten. -
@rabu60 sagte: löschen ohne gleich den ganzen Datenpunkt neu anlegen zu müssen?
Du möchtest das Objekt common.states löschen? Man kann es leeren:
extendObject('0_userdata.0.NeuerZustand', {common: {states: {}}})
Eigentlich sind die Objekte statisch, d.h. sie sollten konstant bleiben. Variable Werte schreibt man mit setState() in den Datenpunktwert. Was möchtest Du erreichen?
-
@paul53 sagte in Datenpunkt vom Typ Array States löschen:
@rabu60 sagte: löschen ohne gleich den ganzen Datenpunkt neu anlegen zu müssen?
Du möchtest das Objekt common.states löschen? Man kann es leeren:
extendObject('0_userdata.0.NeuerZustand', {common: {states: {}}})
Ich habe jetzt den Datenpunkt mit Typ "number" neu angelegt und die States geschrieben.
Der Vorschlag es zu leeren hat leider auch nicht funktioniert.Eigentlich sind die Objekte statisch, d.h. sie sollten konstant bleiben. Variable Werte schreibt man mit setState() in den Datenpunktwert. Was möchtest Du erreichen?
Nun, ich möchte, dass in diesem Datenpunkt nur bestimmte Werte gespeichert werden können. Leider ist diese Werteliste unter bestimmten Bedingungen variabel und nicht immer (wie in meinem Beispiel) Werte zwischen 1 und <n>
-
@rabu60 sagte: Werteliste unter bestimmten Bedingungen variabel
Wie variabel? Genügt es nicht, common.min (1), common.max (4) und common.step (1) zu setzen? Dann können zumindest Skripte keine Werte außerhalb des Bereiches schreiben.
-
@paul53 sagte :
Wie variabel? Genügt es nicht, common.min (1), common.max (4) und common.step (1) zu setzen? Dann können zumindest Skript keine Werte außerhalb des Bereiches schreiben.
Nein, leider nicht.
-
@rabu60 sagte: Nein, leider nicht.
Dann sprengt Deine (ungewöhnliche) Anforderung die Möglichkeiten von ioBroker.
-
@paul53
Man muss nur hartnäckig sein...Ich habe einen Weg gefunden:
let sObjID = '0_userdata.0.NeuerZustand'; let obj=getObject(sObjID); delete obj.common.states; setObject(sObjID, obj); extendObject(sObjID, {common: { "states": { 1: "Rasen und Hang", 2: "Rasen und Hochbeet", 5: "Dach", 4: "Vorgarten" } }});
Vielen Dank für Deine Hilfe und Inspiration. Manchmal braucht man nur einen Denkanstoß
-
@rabu60 sagte: Ich habe einen Weg gefunden:
Es funktioniert auch so (ohne Löschen):
const sObjID = '0_userdata.0.NeuerZustand'; const obj = getObject(sObjID); obj.common.states = { 1: "Rasen und Hang", 2: "Rasen und Hochbeet", 5: "Dach", 4: "Vorgarten" }; setObject(sObjID, obj);
In deiner Version können sich setObject() und extendObject() in die Quere kommen, d.h. setObject() ist noch nicht fertig, wenn extendObject() das Objekt einliest. extendObject() müsste in der Callback-Funktion von setObject() ausgeführt werden.
-
Danke für den Hinweis. Ich verzichte auf extendObject() komplett.
let sObjID = '0_userdata.0.NeuerZustand'; let obj=getObject(sObjID); obj.common["states"]={}; var i_list = Array.prototype.slice.apply($("state[state.id=0_userdata.0.Zones.Zone_*.relay]")); for (var i_index in i_list) { i = i_list[i_index]; sBasePoint = i.slice(0, i.lastIndexOf('.') + 1); obj.common.states[parseInt(getState((String(sBasePoint) + 'relay')).val)] = getState((String(sBasePoint) + 'name')).val; }; setObject(sObjID, obj);
So funktioniert es (Hoffentlich)
-