NEWS
[gelöst] - Learning JS - Part 2
-
Ich habe in einem DP ein solches JSON:
[ { "Device": "Taster Bad", "Battery": "50%" },{ "Device": "Heizung Bad", "Battery": "90%" },{ "Device": "Heizung Arbeitszimmer", "Battery": "30%" },{ "Device": "Gaszähler", "Battery": "3V" } ]
Und dazu folgenden Code:
var devices = getState("device-watcher.0.batteryList").val; var jsonData = JSON.parse(devices); var message = ''; for (var i = 0; i < jsonData.length; i++) { message += jsonData[i].Device + '\n'; } console.log(message);
Warum erhalte ich hier diese Fehler?
1.12.2022, 23:57:02.549 [info ]: javascript.0 (21396) Start javascript script.js.common.Informationen.OfflineWarnung 1.12.2022, 23:57:02.563 [info ]: javascript.0 (21396) script.js.common.Informationen.OfflineWarnung: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions 1.12.2022, 23:57:02.572 [error]: javascript.0 (21396) script.js.common.Informationen.OfflineWarnung: SyntaxError: Unexpected token o in JSON at position 1 1.12.2022, 23:57:02.573 [error]: javascript.0 (21396) at script.js.common.Informationen.OfflineWarnung:2:21 1.12.2022, 23:57:02.573 [error]: javascript.0 (21396) at script.js.common.Informationen.OfflineWarnung:8:3
Irgendwas stimmt da mit dem
getState
nicht.
Schreibe ich den Inhalt dieses DP direkt (von Hand) in die Variable, funktioniert es einwandfrei. -
@codierknecht
Mach doch mal ein log nach dem getState. Ist der DP ein object, wird er automatich geparsed.
Einmal die Objekt-Eigenschaften von dem DPdevice-watcher.0.batteryList
-
@mcu
Danke für den Schubs in die richtige RichtungDer DP enthält bereits ein Array von Objekten. Das wird lediglich im Objektbaum als JSON dargestellt.
Parsen ist gar nicht nötig.{ "_id": "device-watcher.0.batteryList", "type": "state", "common": { "type": "array", "role": "json", "read": true, "write": false }, "native": {}, "from": "system.adapter.device-watcher.0", "ts": 1669580330469, "acl": { "object": 1636, "state": 1636, "owner": "system.user.admin", "ownerGroup": "system.group.administrator" }, "user": "system.user.admin" }
Damit sieht das dann (prinzipiell) so aus und funzt einwandfrei
on({id: "device-watcher.0.lowBatteryCount", change: "ne"}, async function (obj) { var batteryCount = obj.state.val; if (batteryCount > 0) { var devices = getState("device-watcher.0.lowBatteryList").val; var message = 'ACHTUNG: Batterie in ' + batteryCount + ' Gerät(en) schwach:\n'; for (var i = 0; i < devices.length; i++) { message += devices[i].Device + '\n'; } } else { message = 'Alle Batterien sind OK!'; } sendSignalMessage(message, '+49xxxxxxxxxx'); });