NEWS
JSON zu Objekte
-
@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 ?
-
@paul53
Nein das habe ich so geändert! -
Kannst Du es dann selber erweitern?
//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"; const MaxAnrufe = 4; on(json, function(dp) { var obj = JSON.parse(dp.state.val); const i_end = obj.length < MaxAnrufe ? obj.length : MaxAnrufe; for (let i=0; i<i_end; i++) { const o = obj[i]; console.warn(o); const dp_nummer = Nummer+"_"+i; console.warn(dp_nummer); setState(dp_nummer,o.caller); } // setState(Nummer, parseFloat(obj.caller)); // setState(Datum, parseFloat(obj.date)); // setState(Name, parseFloat(obj.name)); }); for (let i=0; i<MaxAnrufe; i++) { const dp_nummer = Nummer+"_"+i; createState(dp_nummer); }
-
@ente34
Danke! Ich werde es Versuchen! -
@kellerassel75 sagte: 4 Anrufe sollte reichen!
Vorschlag (nicht getestet):
const idJson = "tr-064.0.calllists.missed.json"; const path = "0_userdata.0.Telefon.verpasst-"; if(!existsState(path + '0.Nummer')) { for(let i = 0; i < 4; i++) { createState(path + i + '.Nummer', '', {type: 'string', name: 'Nummer', role: 'info'}); createState(path + i + '.Datum', '', {type: 'string', name: 'Datum, Uhrzeit', role: 'info'}); createState(path + i + '.Name', '', {type: 'string', name: 'Name', role: 'info'}); } } on(idJson, function(dp) { let arr = JSON.parse(dp.state.val); let anzahl = arr.length; if(anzahl > 4) anzahl = 4; for(let i = 0; i < anzahl; i++) { setState(path + i + '.Nummer', arr[i].caller, true); setState(path + i + '.Datum', arr[i].date, true); setState(path + i + '.Name', arr[i].name, true); } });