NEWS
[Gelöst] Funktion (Aufzählung) per Skript zuweisen
-
Guten Morgen,
ich bin ziemlich neu im ioBroker und mache dort alles per Blockly. Von manuellen Skripten habe ich überhaupt keine Ahnung, weshalb meine Frage für die meisten wohl lächerlich erscheint, aber ich kriege es seit Stunden einfach nicht hin und verstehe alles, was ich dazu per Suche gefunden habe, nicht. Ich hoffe hier kann mir jemand helfen.
Ich habe ein Blockly in dem ich ein code aus dem Internet eingefügt habe, der mir einen neuen Datenpunkt erzeugt, was soweit auch einwandfrei funktioniert. Das sieht bisher so aus:
createState(id, init, {type:'number', unit:'kWh', read:true, write:true, role:'state'});
Jetzt möchte ich eigentlich nur, dass diesem Datenpunkt auch die Funktion/Aufzählung mit dem Namen Ladekosten (unter Aufzählungen natürlich erstellt) zugewiesen wird. Habe schon verschiedene Schnipsel aus dem Netz in den Code eingefügt, aber es funktioniert einfach nicht.
Wäre super, wenn mir jemand sagen könnte, wie ich den Code ergänzen muss
-
@h-a-m-i sagte in Anfängerfrage: Funktion (Aufzählung) per Skript zuweisen:
Jetzt möchte ich eigentlich nur, dass diesem Datenpunkt auch die Funktion/Aufzählung mit dem Namen Ladekosten (unter Aufzählungen natürlich erstellt) zugewiesen wird
Ich mache das mit einer eigenen Funktion (sollte wirklich mal als Standard in den JavaScript-Adapter):
-
Danke für deine Antwort. Aber das ist mir leider schon zu viel xD sorry, was genau sollte ich jetzt machen? Dein Skript in Blockly in meine vorhandene JavaScript-Funktion einfügen?
Mein Blockly sieht insgesamt so aus:
edit:
Das sieht jetzt so aus:createState(id, init, {type:'number', unit:'kWh', read:true, write:true, role:'state'}); function addToEnum(enumId, objId) { if (existsObject(objId)) { if (existsObject(enumId)) { const enumObj = getObject(enumId); if (enumObj.type === 'enum') { if (!enumObj.common.members.includes(objId)) { extendObject(enumId, { common: { members: Array.prototype.concat(enumObj.common.members, [objId]) } }); } return true; } else { throw new Error(`Target object with ID ${enumId} is not an enum`); } } else { throw new Error(`Enum with ID ${enumId} does not exist`); } } else { throw new Error(`Object with ID ${objId} does not exist`); } } // Test addToEnum('enum.functions.ladekosten', '0_userdata.0.verbrauch');
Ladekosten ist in dem erzeugten Datenpunkt aber nicht gesetzt
-
@h-a-m-i sagte in Anfängerfrage: Funktion (Aufzählung) per Skript zuweisen:
Ladekosten ist in dem erzeugten Datenpunkt aber nicht gesetzt
Die Enums werden ja auch nicht auf dem Datenpunkt/Objekt selbst gespeichert.
Guck mal im Tab Aufzählungen ob dein Datenpunkt gelandet ist. Ansonsten würde ich an Deiner Stelle mit
await
undcreateStateAsync
(oder Callback) arbeiten, damit der DP auch wirklich erstellt wird bevor es weiter geht:function addToEnum(enumId, objId) { if (existsObject(objId)) { if (existsObject(enumId)) { const enumObj = getObject(enumId); if (enumObj.type === 'enum') { if (!enumObj.common.members.includes(objId)) { extendObject(enumId, { common: { members: Array.prototype.concat(enumObj.common.members, [objId]) } }); } return true; } else { throw new Error(`Target object with ID ${enumId} is not an enum`); } } else { throw new Error(`Enum with ID ${enumId} does not exist`); } } else { throw new Error(`Object with ID ${objId} does not exist`); } } await createStateAsync(id, init, { type: 'number', unit: 'kWh', read: true, write: true, role: 'state' }); addToEnum('enum.functions.ladekosten', id);
-
Gern auch etwas vereinfachen und die ganzen Prüfungen weglassen:
const enumId = 'enum.functions.ladekosten'; await createStateAsync(id, init, { type: 'number', unit: 'kWh', read: true, write: true, role: 'state' }); const enumObj = await getObjectAsync(enumId); if (enumObj && enumObj.type === 'enum') { if (!enumObj.common.members.includes(id)) { await extendObjectAsync(enumId, { common: { members: [...enumObj.common.members, id] } }); } }
-
Hey mega, das letzte hab ich eingefügt und das funktioniert super, der Datenpunkt ist unter Aufzählungen zu sehen!
Vielen lieben Dank, das hätte ich selbst nie hinbekommen
-
@haus-automatisierung kannst du mir evtl. auch einen Tipp geben, wie ich einen Datenpunkt mit zb. "So" im Name lösche? Ich habe einen Objekt Ordner, in dem ich Datenpunkte mit dem Wochentag im Namen erstellen lasse, zB.: "0_userdata.0.Kosten.Fahrtkosten.So_Fahrtende>12:16"
Jetzt möchte ich täglich alle Datenpunkte die von vorgestern sind (in dem Fall also So) löschen und habe das bis jetzt so zusammengestellt:// Delete state await deleteObject(id);
Leider scheint das mit dem Platzhalter nicht zu funktionieren und ich finde nichts dazu, welchen Platzhalter man verwendet. Wenn ich in Blockly statt dem * das "_Fahrtende>12:16" einsetze, klappt das löschen. Also müsste der Rest soweit passen, nur eben der Platzhalter nicht
-
@h-a-m-i Erstmal finde ich es ganz komisch auf die Art und Weise Datenpunkte zu erstellen und wieder zu löschen - das gesamte Konzept würde ich überdenken.
Aber zu Deinem Problem:
- Du musst mit einem RegEx oder
$
-Selektor alle Datenpunkte suchen, welche Deiner Logik entsprechen - Dann mit einer Schleife über das Ergebnis gehen
- Die Datenpunkte einzeln in der Schleife löschen
- Du musst mit einem RegEx oder
-
@haus-automatisierung sagte in Anfängerfrage: Funktion (Aufzählung) per Skript zuweisen:
Erstmal finde ich es ganz komisch auf die Art und Weise Datenpunkte zu erstellen und wieder zu löschen - das gesamte Konzept würde ich überdenken.
Echt? Hmm ok. Da ich absolut keine Ahnung habe, habe ich mir das so zusammen gesucht aus anderen Foren/Seiten.
Du musst mit einem RegEx oder $-Selektor alle Datenpunkte suchen, welche Deiner Logik entsprechen
Dann mit einer Schleife über das Ergebnis gehen
Die Datenpunkte einzeln in der Schleife löschenDas ist für mich leider schon wieder spanisch, aber trotzdem vielen Dank für deine schnelle Antwort. Ich lass das Löschen der Datenpunkte dann einfach