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
-
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
-
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
awaitundcreateStateAsync(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); -
@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
awaitundcreateStateAsync(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] } }); } } -
@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
-
@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
-
@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
@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
- Du musst mit einem RegEx oder
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden
