NEWS

[gelöst] Werte einzeln aus JSON extrahieren



  • Hallo zusammen,

    ich habe leider noch nie so richtig mit Json gearbeitet und benöntige für mein Saugroboter-Script Datenpunkte die aktuell nur in einer mihome-vacuum.0.history.allTableJSON integriert sind.

    zwischenzeitlich habe ich eine Ganze menge ausprobiert jedoch mit mäßigen Erfolg. Vielleicht kan jemand helfen.

    Inhalt der mihome-vacuum.0.history.allTableJSON

    [{"Datum":"30.12","Start":"20:47","Saugzeit":"3 min","Fläche":"3.29 m²","Error":0,"Ende":false},{"Datum":"30.12","Start":"20:43","Saugzeit":"0 min","Fläche":"0 m²","Error":0,"Ende":false}........]
    

    Ich hätte gerne die einzelnen Punkte in sep. Datenpunkte

    Das war mein letzter Versuch.

    
     on({id: 'mihome-vacuum.0.history.allTableJSON', change: "any"}, function (obj) {
    
    var json = "mihome-vacuum.0.history.allTableJSON"/*mihomeDaten*/;
    
    var StDatum = "javascript.0.Eigene_Datenpunkte.Staubi-Datum"/*Start Datum*/;
    var StStart = "javascript.0.Eigene_Datenpunkte.Staubi-Startzeit"/*Startzeit*/;
    var StSaugzeit = "javascript.0.Eigene_Datenpunkte.Saugzeit"/*Reinigungsdauer*/;
    var StFlaeche = "javascript.0.Eigene_Datenpunkte.Fläche"/*Fläche*/;
    var StError = "javascript.0.Eigene_Datenpunkte.Error"/*Error*/;
    var StEnde = "javascript.0.Eigene_Datenpunkte.Ende"/*Ende*/;
    
       var obj = JSON.parse(getState(json).val);
    
       setState(StDatum, parseFloat(obj.Datum));
       setState(StStart, parseFloat(obj.Start));
       setState(StSaugzeit, parseFloat(obj.Saugzeit));
       setState(StFlaeche, parseFloat(obj.Fläche));
       setState(StError, parseFloat(obj.Error));
       setState(StEnde, obj.Ende);
    
     });
    
    


  • @svenomatt

       obj = JSON.parse(obj.state.val)[0];
     
       setState(StDatum, obj.Datum);  // String DD.MM
       setState(StStart, obj.Start); // String hh:mm
       setState(StSaugzeit, parseFloat(obj.Saugzeit));  // Zahl, Einheit: Minuten
       setState(StFlaeche, parseFloat(obj.Fläche));  // Zahl, Einheit: m²
       setState(StError, obj.Error); // Zahl
       setState(StEnde, obj.Ende); // Logikwert
    


  • Hallo Paul,

    vielen dank für deine Antwort. konnte jedoch leider nicht wirklich etwas damit anfangen. hätte gedacht die // sind dann Komentare

    Habe das ganze mal versucht im Kleinen

     on({id: 'mihome-vacuum.0.history.allTableJSON', change: "any"}, function (obj) {
    
    var json = "mihome-vacuum.0.history.allTableJSON"/*mihomeDaten*/;
    var StDatum = "javascript.0.Eigene_Datenpunkte.Staubi-Datum"/*Start Datum*/;
    
    
    var obj = JSON.parse(getState(json).val);
    
        setState(StDatum, obj.Datum);  // String DD.MM
    
     });
    

    Der Datenpunkt wird aber nicht gefüllt. Im log kommt dann das

    javascript.0	2019-12-31 10:06:51.846	warn	(1016) at processImmediate (timers.js:658:5)
    javascript.0	2019-12-31 10:06:51.846	warn	(1016) at tryOnImmediate (timers.js:676:5)
    javascript.0	2019-12-31 10:06:51.846	warn	(1016) at runCallback (timers.js:705:18)
    javascript.0	2019-12-31 10:06:51.845	warn	(1016) at Immediate.setImmediate (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInRedis.js:224:41)
    javascript.0	2019-12-31 10:06:51.845	warn	(1016) at change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:4745:37)
    javascript.0	2019-12-31 10:06:51.844	warn	(1016) at Object.stateChange (/opt/iobroker/node_modules/iobroker.javascript/main.js:364:25)
    javascript.0	2019-12-31 10:06:51.844	warn	(1016) at Object.callback (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:963:38)
    javascript.0	2019-12-31 10:06:51.843	warn	(1016) at Object.<anonymous> (script.js.Staubi.Json-Auswerten:13:5)
    javascript.0	2019-12-31 10:06:51.843	warn	(1016) at setState (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1258:20)
    javascript.0	2019-12-31 10:06:51.841	warn	(1016) Wrong type of javascript.0.Eigene_Datenpunkte.Staubi-Datum: "undefined". Please fix, while deprecated and will not work in next versions.
    

    Wie gesagt bin im Programmieren totaler Anfänger.



  • Im Log vom javaSkript kommt dies

    31.12.2019, 10:06:37.330	[info ]: javascript.0 (1016) Stop script script.js.Staubi.Json-Auswerten
    31.12.2019, 10:06:38.781	[info ]: javascript.0 (1016) Start javascript script.js.Staubi.Json-Auswerten
    31.12.2019, 10:06:38.795	[info ]: javascript.0 (1016) script.js.Staubi.Json-Auswerten: registered 1 subscription and 0 schedules
    31.12.2019, 10:06:51.843	[warn ]: javascript.0 (1016)     at Object.<anonymous> (script.js.Staubi.Json-Auswerten:13:5)
    


  • @svenomatt
    Du solltest schon richtig lesen (Zeile 1).

       obj = JSON.parse(obj.state.val)[0];
    

    obj ist das erste Element eines Arrays und ist bereits als Funktionsparameter deklariert.



  • Vielen Dank,
    du hast recht, wer lesen kann ist klar im Vorteil. 😄

    Aufjedenfall klappt es jetzt, Vielen Dank für deine Hilfe



  • Falls das wer auch mit blockly lösen möchte.

    Einfachster weg: Mit einem DEBUG baustein, das JSON Objekt in den Log ausgeben.

    Den Output kopieren und in Notepad++ einfügen und dort die Plugins JSTools runterladen.
    Unter Erweiterungen JSTools den JSON Viewer aktivieren und schon seht ihr die Objektstruktur und könnt gut scripten und debuggen.

    In Folge einzelne Attribute mit mit dem Block mit Attribut abfragen.
    Ich habe so meine Busabfahrtszeiten abfragen via Alexa gelöst und lasse mir jeden Tag meine Google Termine vorlesen.

    dda34d79-f864-4429-b653-c1cadf88a1d2-image.png


Log in to reply
 

Suggested Topics

  • 9
  • 2
  • 38
  • 2
  • 7
  • 3
  • 457
  • 11

1.9k
Online

32.4k
Users

39.0k
Topics

528.6k
Posts