NEWS
Datenpunkt neu erstellen und gleich beschrieben
-
Wie erzeuge ich einen neuen Datenpunkt und schreibe dann ein paar Zeilen später (also nicht im createstate) einen Wert hinein?
var StatusDP = "javascript.0.ESP." + EspDevice + ".table"; if (!existsState(StatusDP)){createState(StatusDP, "",{type: "string",name: 'HTML Tabelle des ESP', read: true,write: true,role: "value", unit: ""});}; setState(StatusDP, Table);
liefert, sowohl mit createState als auch mit createStateAsync beim ersten Durchgang des Skriptes
State "javascript.0.ESP.483FDA36363A.table" not found
beim zweiten Durchgang klappt dann alles (weil der DP ja dann da ist))
-
@wolfgangfb Hier ein Beispiel aus einem meiner Skripts:
// Funktionen async function CreateMyStatesAndStartup(){ try { DebugWarning("Startup: Erstelle ggf. Datenpunkte ..."); // POWER await createStateAsync(s_state_FullPath + ".POWER", false, { type: 'boolean', read: true, write: true, role: "switch", name: s_DeviceName + s_Suffix + '.POWER' }); // RSSI await createStateAsync(s_state_FullPath + ".RSII", 0, { type: 'number', read: true, write: false, name: 'WLAN Stärke in %' }); } catch(error) { DebugWarning(error); log(error); } } // Hauptprogram CreateMyStatesAndStartup();
Ich hab mir das in eine Funktion gepackt, nachdem diese ausgeführt ist sind die Datenpunkte vorhanden und nutzbar.
Du kannst die Datenpunkte sogar innerhalb der Funktion schon nutzen, direkt nach dem Anlegen.Ich hatte die gleiche Frage damals auch gestellt: https://forum.iobroker.net/topic/44190/datenpunkt-erstellen-und-im-anschluss-sofort-nutzen
Es war wichtig das das ganze in einer Funktion stattfindet, sonst funktioniert die
await
Geschichte nicht -
Danke, werde ich ausprobieren. Aber richtig cool finde ich die Sache mit dem sich selbst neustartenden Script aus Deinem Thread. Das kann ich für viele andere Dinge brauchen.
-
@bananajoe
HiIrgendwas mache ich noch falsch:
async function CreateIfNotExist(Name="", InitValue, common){ console.log("Name: " + Name); if (!existsState(Name)){ await createStateAsync(Name, InitValue, common); } } CreateIfNotExist(StatusDP, "Hallo", {type: "string",name: 'S0 counter des ESP', read: true,write: true,role: "value", unit: "Flaschbier"}); console.log("Datenpunkt existiert: " + existsState(StatusDP));
liefert:
Datenpunkt existiert: false
Beim zweiten Aufruf ist der Datenpunkt beschreibbar (genau wie bei createState oder createStateAsync).
-
@wolfgangfb sagte: Wie erzeuge ich einen neuen Datenpunkt und schreibe
dannein paar Zeilen später (also nicht im createstate)einen Wert hinein?Mit common.def:
const StatusDP = "javascript.0.ESP." + EspDevice + ".table"; var Table = ...; if (existsState(StatusDP)) setState(StatusDP, Table, true); else createState(StatusDP, Table,{type: "string", name: 'HTML Tabelle des ESP', read: true,write: true,role: "value", def: Table});
-
@paul53 sagte in Datenpunkt neu erstellen und gleich beschrieben:
@wolfgangfb sagte: Wie erzeuge ich einen neuen Datenpunkt und schreibe
dannein paar Zeilen später (also nicht im createstate)einen Wert hinein?Mit common.def:
const StatusDP = "javascript.0.ESP." + EspDevice + ".table"; var Table = ...; if (existsState(StatusDP)) setState(StatusDP, Table, true); else createState(StatusDP, Table,{type: "string", name: 'HTML Tabelle des ESP', read: true,write: true,role: "value", def: Table});
Hallo Paul
Das funktioniert aber auch nur, wenn einmalig etwas in den Datenpunkt geschrieben wird.
Mir (und ich glaube auch BananaJoe) geht es darum, in einem Skript, dass z.B. einen Wert überwacht und dann immer wieder einen passenden Datenpunkt beschreibt, dafür zu sorgen, dass der Datenpunkt auch vorhanden ist. Bei Deiner Lösung wäre bei der nächsten Änderung auch der Punkt nicht vorhanden.
Beispiel: Ein Skript summiert über die aufgenommene Leistung einer Steckdose mit Leistungsmessung die Gesamtenergie und schreibt die für jeden Tag getrennt in einen Datenpunkt.
Wenn jetzt ein neuer Tag beginnt muss zuerst der Datenpunkt neu angelegt werden und dann abhängig von der Leistung die Tagesenergie in den Datenpunkt geschrieben werden. Und das vielleicht schon nach wenigen Millisekunden mit einem neuen Wert, und dann ist der Datenpunkt eben noch nicht da. -
@wolfgangfb sagte: dann ist der Datenpunkt eben noch nicht da.
Bei einem noch nicht vorhanden Datenpunkt wird der Wert mit createState() geschrieben, in allen anderen Fällen mit setState().
-
@paul53
Dann muss ich aber an jeder Stelle im Skript "setState" durch "if (existState()... else createstate(...)" ersetzen.