NEWS
Fragen zu createState.
-
Hallo zusammen,
ich baue mir gerade ein kleines Skript um von einer API einige Daten abzurufen und zu speichern.
Die Daten habe ich nun vorliegen aber ich bekomme diese leider nicht ioBroker-Baum abgelegt.
Kann mir bitte jemand sagen wie ich mit createState ein Verzeichnis in erster Ebene anlegen kann?
Alles was ich mit createState mache landet leider unter javascript.0.
Was ich also benötige ist:
- Prüfen ob ein State schon angelegt und vorhanden ist.
- Wenn nicht vorhanden neuen State anlegen.
- Wenn vorhanden den Wert updaten.
Eine kleine Funktion wäre super dafür
Leider werde ich aus den Docs nicht schlau..
Vielen Dank.
-
@ChristianG sagte:
mit createState ein Verzeichnis in erster Ebene anlegen kann?
Eigene Datenpunkte sollen unter "0_userdata.0" angelegt werden. Das kann createState() ab Javascript-Version 4.6.1.
-
@paul53 ich will aber gerne direkt in der ersten Ebene als wenn es ein Adapter macht und prüfen und updaten wäre auch schön.
-
@ChristianG sagte:
@paul53 ich will aber gerne direkt in der ersten Ebene als wenn es ein Adapter macht
Dann musst Du setObject() und setState() verwenden.
-
@paul53 okay schaue ich mir mal an ob ich das verstehe. und wie prüfe ich ob ein state schon da ist? damit ich den nicht wieder mit object anlegen muss?
-
@ChristianG sagte:
wie prüfe ich ob ein state schon da ist?
if(!existsState(id)) { setObject(id, obj); setTimeout(function() {setState(id, obj.common.def, true)}, 100); }
-
@paul53 vielen Dank Pail.
Ich habe nun versucht im Netz zu finden wie ich das obj aufbauen muss, habe aber leider keinen Verweis gefunden. Kannst du mir einen Link schicken.
Oder noch einfacher wäre vll ein Beispiel anhand dieses Datenpunktes und dann übernehme ich das für alle anderen. Danke
So hatte ich es bis jetzt gemacht gehabt vor meiner Anfrage aber dies landete ja immer im javascript.0
createState('eufy-security.0.device'+device_count+'.cam_id',device.device_id);
Vielen Dank!
Edit:
ah unter EN gibt es etwas, mal sehen, ob es hilft: https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md
-
@paul53 sagte in Fragen zu createState.:
setTimeout(function() {setState(id, obj.common.def, true)}, 100);
meinst du das wird gehen ?
function createOrUpdate(object_path,obj_id,object_value,obj_type = 'state',name = '',type = 'string',role = 'value',desc = '',read = true,write = true,def = 0,min = 0,unit = ''){ if(!object_path){ console.log('Please define a path.'); return; } if(!obj_id){ console.log('Please define a state endpoint.'); return; } const path = object_path; const id = path + '.' + obj_id; var obj; obj["type"] = obj_type; obj["common"] = {}; obj["common"]["name"] = name; obj["common"]["type"] = type; obj["common"]["role"] = role; obj["common"]["desc"] = desc; obj["common"]["read"] = read; obj["common"]["write"] = write; obj["common"]["def"] = def; obj["common"]["min"] = min; obj["common"]["unit"] = unit; if(!existsState(id)) { setObject(id, obj); setTimeout(function() {setState(id, object_value)}, 100); }else{ setState(id, object_value); } }
-
Also Fehler habe ich jetzt nicht mehr aber leider wird kein Wert geschrieben.
createOrUpdate('eufy-security.0.device'+device_count,'cam_id',device.device_id,'state','','string','value','',true,true,0,0,'');
-
@ChristianG sagte:
Kannst du mir einen Link schicken.
Siehe unter Attribute für bestimmte Objekttypen / Datenpunkt.
@ChristianG sagte in Fragen zu createState.:
ein Beispiel
Beispiel. Damals gab es die Funktion existsState(id) noch nicht.
-
@paul53 sagte in Fragen zu createState.:
setTimeout
setObject akzeptiert einen Callback:
https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#setobject
Damit müsste man sofort nach dem Erstellen den Wert schreiben können, ohne künstlich länger zu warten. -
Danke für die Hilfe aber ich gebe auf ... habe nicht so wirklich den Plan von dem was ich da mache und die Punkte werden einfach nicht angelegt. Werde dann außerhalb von ioBroker die API nutzen und in meine Oberfläche einbauen.
Hier für alle die doch noch versuchen wollen es ans laufen zu bekommen:
function createOrUpdateDP(object_path,obj_id,common){ const path = object_path; const id = path + '.' + obj_id; var obj; obj['type'] = 'state'; obj['common'] = common; if(!existsState(id)) { setObject(id, obj, function (err) { if (err) log('Cannot write object: ' + err) else { var init = null; if(common.def === undefined) { if(common.type === 'number') init = 0; if(common.type === 'boolean') init = false; if(common.type === 'string') init = ''; } else init = common.def; setState(id, init); } }); }else{ setState(id, common.def); } } createOrUpdateDP('eufy-security.0.device'+device_count,'cam_id', {read: true, write: true, role: "state", desc: "", type: "string", def: device.device_id });
-
@ChristianG sagte in Fragen zu createState.:
die Punkte werden einfach nicht angelegt
Bist du 100% sicher, dass die Funktion überhaupt ausgeführt wird? Hast du in den Adaptereinstellungen
setObject
erlaubt? -
-
@ChristianG sagte:
Hier für alle die doch noch versuchen wollen es ans laufen zu bekommen:
Ich würde Zeile 4 - so wie im verlinkten Beispiel - ändern in:
var obj = {};
-
@paul53 geht nicht, dann gibt es einen Fehler.
-
@ChristianG Warum ist dein Skript auf TypeScript eingestellt?
-
-
@ChristianG natürlich kannst du das.
-
@AlCalzone Okay, war rot hinterlegt aber ausführen geht Danke!!! Dann lag es nur an der kleinen Sache