NEWS
ioBroker Objekte aus javascript object erzeugen
-
Hallo,
ich experimentiere gerade mir meinem WLAN Grillthermometer.
Dieses sendet per MQTT einen Status im JSON Format.Hier ein Beispiel:
{"system":{"time":"1555763739","unit":"C","soc":87,"charge":false,"rssi":-76,"online":2},"channel":[{"number":1,"name":"Smoker","typ":0,"temp":33.70,"min":95.00,"max":150.00,"alarm":0,"color":"#FFC100"},{"number":2,"name":"Fleisch Un","typ":0,"temp":999.00,"min":10.00,"max":94.00,"alarm":1,"color":"#22B14C"},{"number":3,"name":"Fleisch Ob","typ":10,"temp":999.00,"min":10.00,"max":94.00,"alarm":1,"color":"#EF562D"},{"number":4,"name":"Kanal 4","typ":0,"temp":999.00,"min":10.00,"max":35.00,"alarm":0,"color":"#FFC100"},{"number":5,"name":"Kanal 5","typ":0,"temp":999.00,"min":10.00,"max":35.00,"alarm":0,"color":"#A349A4"},{"number":6,"name":"Kanal 6","typ":0,"temp":999.00,"min":10.00,"max":35.00,"alarm":0,"color":"#804000"},{"number":7,"name":"Kanal 7","typ":0,"temp":999.00,"min":10.00,"max":35.00,"alarm":0,"color":"#5587A2"},{"number":8,"name":"Kanal 8","typ":0,"temp":999.00,"min":10.00,"max":35.00,"alarm":0,"color":"#5C7148"}],"pitmaster":{"type":["off","manual","auto"],"pm":[{"id":0,"channel":1,"pid":2,"value":100,"set":110.00,"typ":"auto","set_color":"#ff0000","value_color":"#000000"}]}}
Ich würde nun gerne daraus ein entsprechendes Objekt im ioBroker erzeugen.
Dazu habe ich nun mittels javascript angefangen aus dem JSON ein Objekt zu erzeugen.
Das klappt prima mittels JSON.parse recht elegant.// path to json data varJSON = 'mqtt.0.WLanThermo.Nanotherm.status.data'; // get json data var rawJSON = getState(varJSON).val; // JSON to object obj = JSON.parse(rawJSON); // Test output console.log(obj.system.time); console.log(obj.system.unit); console.log(obj.system.soc); console.log(obj.system.charge); console.log(obj.system.rssi); console.log(obj.system.online);
Wie erstelle ich denn jetzt am einfachsten aus dem bestehenden javascript Objekt ein Objekt im ioBroker?
Muss ich das für jedes Element einzeln machen, oder gibt es sogar eine Möglichkeit das mit einem Befehl zu machen?
Zu Fuß habe ich nun so angefangen:
id = 'javascript.0.nanotherm.system.time' createState(id, false,{ name: 'System time', type: 'number', }); id = 'javascript.0.nanotherm.nystem.unit' createState(id, false,{ name: 'System unit', type: 'string', });
Das wäre ok, da ich aber noch recht neu bin in ioBroker und javascript wollte ich lieber mal fragen ob das so der richtige Weg ist.
-
@dewenni sagte:
ob das so der richtige Weg ist.
Nicht ganz. system.unit ist sicherlich konstant und gehört wohl zum Wert system.soc. Die Zeit in s seit 1.1.1970 darzustellen, ist sicherlich nicht so elegant.
const path = 'nanotherm.system.'; createState(path + 'soc', obj.system.soc, { type: 'number', unit: obj.system.unit, name: 'System soc' }); createState(path + 'time', formatDate(parseInt(obj.system.time), 'hh:mm:ss'), { type: 'string', name: 'System time' });
EDIT: obj.system.time von String nach Zahl gewandelt
-
Danke für die Antwort. Mir ging es auch erstmal generell um die Frage ob man jedes Element einzeln erzeigen muss. Dies scheint ja so zu sein.
Aber wo wir schon bei den Details sind. Das mit der Zeit klappt nicht. Ich hatte das auch schon probiert.
Der Wert von time ist z.B. "time":"1555766679"
mit formatDate(obj.system.time, 'hh:mm:ss') ergibt das aber NaN:NaN:NaN
An anderer stelle habe ich auch schon mit formatDate() gearbeitet, aber hier passt irgendwas nicht.
-
@dewenni sagte:
formatDate(obj.system.time, 'hh:mm:ss') ergibt das aber NaN:NaN:NaN
Versuche es mal mit Wandlung in eine Zahl:
formatDate(parseInt(obj.system.time), 'hh:mm:ss')
-
das passt!
Danke!