Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JSON zu Objekte

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    JSON zu Objekte

    This topic has been deleted. Only users with topic management privileges can see it.
    • K
      Kellerassel75 last edited by

      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

      E paul53 3 Replies Last reply Reply Quote 0
      • E
        ente34 @Kellerassel75 last edited by

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

        1 Reply Last reply Reply Quote 0
        • E
          ente34 @Kellerassel75 last edited by

          @kellerassel75
          Hier das widget
          JSON als Tabelle ist hier beschrieben

          K 1 Reply Last reply Reply Quote 0
          • K
            Kellerassel75 @ente34 last edited by

            @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

            E paul53 3 Replies Last reply Reply Quote 0
            • E
              ente34 @Kellerassel75 last edited by

              @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```
              1 Reply Last reply Reply Quote 0
              • paul53
                paul53 @Kellerassel75 last edited by

                @kellerassel75 sagte: because the adapter setting "Do not subscribe to all states on start" is enabled.

                Haken in der Konfiguration der Javascript-Instanz entfernen!

                E 1 Reply Last reply Reply Quote 0
                • E
                  ente34 @paul53 last edited by

                  @paul53
                  Danke!
                  Was bewirkt der Haken?

                  paul53 1 Reply Last reply Reply Quote 0
                  • paul53
                    paul53 @ente34 last edited by

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

                    1 Reply Last reply Reply Quote 0
                    • E
                      ente34 last edited by

                      @paul53
                      Fast verstanden, wofür könnte das gut sein (Speicherplatz sparen?)

                      paul53 1 Reply Last reply Reply Quote 0
                      • paul53
                        paul53 @ente34 last edited by

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

                        1 Reply Last reply Reply Quote 0
                        • E
                          ente34 @Kellerassel75 last edited by

                          @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

                          1 Reply Last reply Reply Quote 0
                          • K
                            Kellerassel75 last edited by Kellerassel75

                            @ente34
                            Also Haken ist raus! Fehler ist behoben!
                            Hardware ist Raspi4. Versin ioBroker.admin 4.1.11!
                            Falko

                            16: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 "[]"!

                            E 1 Reply Last reply Reply Quote 0
                            • E
                              ente34 @Kellerassel75 last edited by

                              @kellerassel75
                              Na ja, hast Du verpasste Anrufe heute?
                              Sonst Zeile 18:

                              if (1 || el_date === date)
                              
                              K 1 Reply Last reply Reply Quote 0
                              • K
                                Kellerassel75 @ente34 last edited by Kellerassel75

                                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: 
                                
                                E 1 Reply Last reply Reply Quote 0
                                • E
                                  ente34 @Kellerassel75 last edited by

                                  @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!).

                                  K 1 Reply Last reply Reply Quote 0
                                  • K
                                    Kellerassel75 @ente34 last edited by

                                    @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 - name

                                    Datenpunt vorletzter- caller
                                    Datenpunt vorletzter- date
                                    Datenpunt vorletzter- name

                                    Falko

                                    E paul53 2 Replies Last reply Reply Quote 0
                                    • E
                                      ente34 @Kellerassel75 last edited by

                                      @kellerassel75
                                      wie bereits oben gesagt, in Zeile 19 hast Du das obj in der Hand ...

                                      1 Reply Last reply Reply Quote 0
                                      • paul53
                                        paul53 @Kellerassel75 last edited by

                                        @kellerassel75 sagte: richtige Datenpunte - Zahlen nicht JSON!

                                        Du meinst Zeichenketten?

                                        @kellerassel75 sagte in JSON zu Objekte:

                                        Datenpunt vorletzter- caller
                                        Datenpunt vorletzter- date
                                        Datenpunt vorletzter- name

                                        Wieweit sollen sie zurück reichen?

                                        K 1 Reply Last reply Reply Quote 0
                                        • K
                                          Kellerassel75 @paul53 last edited by

                                          @paul53
                                          Ich denke 4 Anrufe sollte reichen!

                                          1 Reply Last reply Reply Quote 0
                                          • paul53
                                            paul53 @Kellerassel75 last edited by

                                            @kellerassel75 sagte: Solange nur ein Anruf ist:

                                            Ist es wirklich so, dass es dann nur ein Objekt ohne Array-Klammern ist ?

                                            K 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            539
                                            Online

                                            31.8k
                                            Users

                                            80.0k
                                            Topics

                                            1.3m
                                            Posts

                                            3
                                            26
                                            855
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo