NEWS
JSON zu Objekte
-
Hallo.
Ich bin Falko und habe schon eine Menge Zeit hier verbracht.Ich bin vor einem Jahr von FHEM zu ioBroker gewechselt. Die Umstellung hat eine Weile gedauert.
Mit Blockly komme ich schon ganz gut zurecht. Java ist schwer für mich.Ich versuche aus einer JSON Tabelle Werte in Objekte zu schreiben.
Einige Beispiele aus diesem Forum konnte ich ganz gut nachstellen bei mir.
Aber mit meiner Tabelle funktioniert das alles nicht.Hier mal meine JSON:
[{"id":4097,"type":"2","caller":"****","called":"SIP: ****","callednumber":"****","name":"","numbertype":"sip","device":"","port":"-1","date":"23.01.21 23:01","duration":"0:00","count":"","path":"","sym":"x","external":"*****"},{"id":4096,"type":"2","caller":"******","called":"SIP: ****","callednumber":"*******","name":"","numbertype":"sip","device":"","port":"-1","date":"23.01.21 22:21","duration":"0:00","count":"","path":"","sym":"x","external":"******"},{"id":4083,"type":"2","caller":"*****","called":"SIP: *****","callednumber":"****","name":"","numbertype":"sip","device":"","port":"-1","date":"21.01.21 11:38","duration":"0:00","count":"","path":"","sym":"x","external":"******"}]
Das ist die JSON von tr-064. Dort möchte ich gerne die caller, date und name in Objekte schreiben.
Solange nur ein Anruf ist:
{"id":4097,"type":"2","caller":"****","called":"SIP: ****","callednumber":"****","name":"","numbertype":"sip","device":"","port":"-1","date":"23.01.21 23:01","duration":"0:00","count":"","path":"","sym":"x","external":"*****"}
Bekomme ich das hin. Sobald die"[ ]"dazu kommt und noch weitere Anrufe geht nichts.
Beispiel:
//Script zur Zerlegung der JSON Daten in einzelne Datenpunkte //Idee: Chaot // Umsetzung: paul53 var json = "tr-064.0.calllists.missed.json"; var Nummer = "javascript.0.Nummer"; var Datum = "javascript.0.Datum"; var Name = "javascript.0.Name"; on(json, function(dp) { var obj = JSON.parse(dp.state.val); setState(Nummer, parseFloat(obj.caller)); setState(Datum, parseFloat(obj.date)); setState(Name, parseFloat(obj.name)); });
Wer kann helfen dass meine Objekte (jeder Anruf einzeln) erstellt werden.
Vielen Dank!
Falko -
@kellerassel75
Macht nichts, ich bin auch noch nicht lange dabei.Jeder Anruf einzeln, Du hast aber nur drei DP für einen Anruf.
Hier mein Script, dass die verpassten Anrufe heute ausfiltert:'use strict'; const id_telefon_missed = 'tr-064.0.calllists.missed.json'; const id_telefon_today = 'javascript.0.telefon.missed_today.json'; function filterJsonByDate(state) { console.debug("filterJsonByDate"); if (state && state.val) { const tab = state.val; console.debug(tab); try { let obj = JSON.parse(tab); let date = formatDate(new Date(), 'DD.MM.YY'); let result = []; for (const el of obj) { const el_date = el.date.toString().substring(0, 8); console.debug(el_date + " === " + date + " ?"); if (el_date === date) { console.debug(el); result.push(el); } } let json = JSON.stringify(result); setState(id_telefon_today, json); console.debug(json); } catch (e) { console.error(e); } } } //Script Start if (!existsState(id_telefon_today)) { createState(id_telefon_today, JSON.stringify([]), () => { filterJsonByDate(getState(id_telefon_missed)); }); } else { filterJsonByDate(getState(id_telefon_missed)); } on({ id: id_telefon_missed, change: "ne" }, function (obj) { console.warn(obj.state); filterJsonByDate(obj.state); }); //00:00 Neuer Tag, Telefonliste updaten schedule("00 00 * * *", function () { filterJsonByDate(getState(id_telefon_missed)); });
Wenn Du willst, kann ich Dir das vis-Widget auch raussuchen.
-
@kellerassel75
Hier das widget
JSON als Tabelle ist hier beschrieben -
@ente34
Danke für die schnelle Antwort!Fehler:
javascript.0 2021-01-31 14:45:21.675 warn (27920) script.js.test: {'val':'[{\'id\':4097,\'type\':\'2\',\'caller\':\'****\',\'called\':\'SIP: ****\',\'callednumber\':\'****\',\'name\':\'\',\'numbertype\':\'sip\',\'device\':\'\',\'port\':\'-1\ javascript.0 2021-01-31 14:43:58.384 error (27920) script.js.test: Please disable that setting or use "getState" with a callback, e.g.: getState("tr-064.0.calllists.missed.json", (err, state) => { ... }); javascript.0 2021-01-31 14:43:58.383 error (27920) script.js.test: The "getState" method cannot be used synchronously, because the adapter setting "Do not subscribe to all states on start" is enabled.
Und ich wollte richtige Datenpunte - Zahlen nicht JSON!
Falko
-
@kellerassel75
Wo startest Du Dein Script?
Was für eine Hardware verwendest Du? Version IoBroker?Bei mir kommt die Ausgabe unter dem javascript adapter:
javascript.0 2021-01-31 15:05:09.774 info (16568) script.js.Anruf: registered 1 subscription and 1 schedule javascript.0 2021-01-31 15:05:09.758 info (16568) Start javascript script.js.Anruf```
-
@kellerassel75 sagte: because the adapter setting "Do not subscribe to all states on start" is enabled.
Haken in der Konfiguration der Javascript-Instanz entfernen!
-
@paul53
Danke!
Was bewirkt der Haken? -
@ente34 sagte: Was bewirkt der Haken?
Der Haken bewirkt, dass Zustände nicht in der JS-Instanz gepuffert werden, und deshalb die synchrone Version von
var state = getState(id); // synchrone Version ohne Callback
nicht verwendet werden kann.
-
@paul53
Fast verstanden, wofür könnte das gut sein (Speicherplatz sparen?) -
@ente34 sagte: wofür könnte das gut sein (Speicherplatz sparen?)
Ja.
Bisher ist mir hier im Forum noch kein Script aufgefallen, das die asynchrone Version von getstate(id, callback) verwendet. -
@kellerassel75
In Zeile 19 hast Du das obj in der Hand:setState(Nummer,el.caller) .... setState(Name,el.name)
kannst Du Dir einen Anruf ausfiltern
-
@ente34
Also Haken ist raus! Fehler ist behoben!
Hardware ist Raspi4. Versin ioBroker.admin 4.1.11!
Falko16:06:40.026 info javascript.0 (12175) Start javascript script.js.test 16:06:40.064 info javascript.0 (12175) script.js.test: registered 1 subscription and 1 schedule
Unter Objekt ist dann nur "[]"!
-
@kellerassel75
Na ja, hast Du verpasste Anrufe heute?
Sonst Zeile 18:if (1 || el_date === date)
-
16:17:09.144 error javascript.0 (12519) script.js.test compile failed: at script.js.test:45
Sorry mein Fehler { vergessen!
Nun schreibt er mir die ganze Tabelle nach javascript.0.telefon.missed_today.json!
Im Log steht:
javascript.0 2021-01-31 16:17:09.150 error (12519) at processTicksAndRejections (internal/process/task_queues.js:97:5) javascript.0 2021-01-31 16:17:09.150 error (12519) at runMicrotasks (<anonymous>) javascript.0 2021-01-31 16:17:09.150 error (12519) at /opt/iobroker/node_modules/standard-as-callback/built/index.js:19:49 javascript.0 2021-01-31 16:17:09.149 error (12519) at tryCatcher (/opt/iobroker/node_modules/standard-as-callback/built/utils.js:11:23) javascript.0 2021-01-31 16:17:09.149 error (12519) at /opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInRedis.js:616:17 javascript.0 2021-01-31 16:17:09.149 error (12519) at /opt/iobroker/node_modules/iobroker.javascript/main.js:1140:17 javascript.0 2021-01-31 16:17:09.149 error (12519) at /opt/iobroker/node_modules/iobroker.javascript/main.js:1559:17 javascript.0 2021-01-31 16:17:09.146 error (12519) at prepareScript (/opt/iobroker/node_modules/iobroker.javascript/main.js:1503:37) javascript.0 2021-01-31 16:17:09.146 error (12519) at createVM (/opt/iobroker/node_modules/iobroker.javascript/main.js:1280:28) javascript.0 2021-01-31 16:17:09.146 error (12519) at Object.createScript (vm.js:261:10) javascript.0 2021-01-31 16:17:09.146 error (12519) at new Script (vm.js:88:7) javascript.0 2021-01-31 16:17:09.145 error (12519) SyntaxError: Missing catch or finally after try javascript.0 2021-01-31 16:17:09.145 error (12519) ^ javascript.0 2021-01-31 16:17:09.145 error (12519) } javascript.0 2021-01-31 16:17:09.144 error at script.js.test:45 javascript.0 2021-01-31 16:17:09.144 error (12519) script.js.test compile failed:
-
@kellerassel75
Schon klar, mein Script filtert ja die verpassten Anrufe heute aus. Mit der "1||" bekommst Du wieder alle, um zu kontrollieren, ob alles soweit funktioniert.
Alternativ kannst Du Dich auch selbst anrufen (nicht abheben!). -
@ente34
Gut! Er schreibt nun die Anrufe von heute! Das funktioniert!Aber ich wollte richtige Datenpunte - Zahlen nicht JSON!
Also:
Datenpunt letzter - caller
Datenpunt letzter - date
Datenpunt letzter - nameDatenpunt vorletzter- caller
Datenpunt vorletzter- date
Datenpunt vorletzter- nameFalko
-
@kellerassel75
wie bereits oben gesagt, in Zeile 19 hast Du das obj in der Hand ... -
@kellerassel75 sagte: richtige Datenpunte - Zahlen nicht JSON!
Du meinst Zeichenketten?
@kellerassel75 sagte in JSON zu Objekte:
Datenpunt vorletzter- caller
Datenpunt vorletzter- date
Datenpunt vorletzter- nameWieweit sollen sie zurück reichen?
-
@paul53
Ich denke 4 Anrufe sollte reichen! -
@kellerassel75 sagte: Solange nur ein Anruf ist:
Ist es wirklich so, dass es dann nur ein Objekt ohne Array-Klammern ist ?