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.
-
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.
-
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.
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