Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Hydrawise Bewässerung JSON in Datenpunkte speichern

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Hydrawise Bewässerung JSON in Datenpunkte speichern

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

      Hallo!

      Über die API der Bewässerungssteuerung (Cloud) kann ich Daten im JSON-Format abfragen:

      var apiurl = "https://app.hydrawise.com/api/v1/statusschedule.php?api_key=" + apikey + "&tag=hydrawise_all";
      
      function getHydraData() {
          var request = require('request');
          request(apiurl, function (error, response, body) {
              if (!error && response.statusCode == 200) {
                  
                      setHydraStates(JSON.parse(body), "watering_time", "string");
                      /* setHydraStates(JSON.parse(body), "watering_time", "number");
                      setHydraStates(JSON.parse(body), "status", "string");
                      setHydraStates(JSON.parse(body), "last_contact", "string"); */
                      setHydraStates(JSON.parse(body), "relays[0].name", "string");
      
                      // setState('javascript.0.hydrawise.watering_time', obj.watering_time);
                      
              } else {
                  log("Error = " + error);
              }
              });
      }
      
      function setHydraStates(body, dpname, dptyp) {
          console.log('DPname: ' + dpname);
          var obj = body;
          var objval = obj[dpname];               // funktioniert für Non-nested
      
          // console.log(obj.relays[0].name);     // funktioniert mit nested!
      
      
          if (!getObject('javascript.0.hydrawise.' + dpname1)) {
              console.log(dpname1 + ' existiert nicht. Lege an...');
              createState('javascript.0.hydrawise.' + dpname1, {'type': dptyp, 'read': true, 'write': true, 'role': 'value', 'def': ""}, function() {
                  setState('javascript.0.hydrawise.' + dpname1, obj[dpname]);
              });
          } else {
              setState('javascript.0.hydrawise.' + dpname1, obj[dpname]);
          }
      }
      
      getHydraData();
      

      Die Daten werden heruntergeladen und die Werte für "watering_time" und "status" bekomme ich in Datenpunkte rein.
      Diese sind auf der "obersten Ebene".

      Der JSON-Aufbau des Abrufs sieht so aus:

      87819872-a5e2-488f-8030-e95341ebc35e-grafik.png

      Ich kämpfe seit Tagen damit, die Werte unterhalb von "relays" in Datenpunkte zu setzen. Dabei ist mein größtes Problem wohl das Ansprechen des Objekts/Objektnamens(?) über eine Variable.

      In der oberen Funktion übergebe ich Werte an die untere. In Zeile 23 wird der Name des Keys/Objekts? korrekt ausgegeben.
      Eine Ausgabe von "objval" (Zeile 25) funktioniert mit Objekten der obersten Ebene, aber nicht mit z.B. relays[1].name.

      Mein Ziel war, nur an einer Stelle die Datenpunkte zu definieren, die ich haben will und dann die Funktionen des Rest machen zu lassen.
      Optimal wäre es natürlich, per Script den kompletten JSON-Inhalt in Datenpunkte abgespeichert zu bekommen.
      Da bin ich leider mit gescheitert.

      Hat jemand eine Idee, wie man das am Besten lösen könnte?
      Wie kann ich im Script den Namen übergeben, damit die untere Funktion auch mit verschachtelten Namen/Werten klarkommt?

      Danke.

      Viele Grüße,
      Andreas

      1 Reply Last reply Reply Quote 0
      • A
        ah966 last edited by

        Also um mein Script-Problem mit den verschachtelten Objekten (heißen die so?) zu verdeutlichen:

        var apiurl = "https://app.hydrawise.com/api/v1/statusschedule.php?api_key=" + apikey + "&tag=hydrawise_all";
        
        function logHydraData() {
            var request = require('request');
            request(apiurl, function (error, response, body) {
                if (!error && response.statusCode == 200) {
                    
                    var obj = JSON.parse(body);
        
                    var keynames = ["watering_time", "relays.0.name", "status"];
                    for (var key of keynames) {
                        // console.log('1:' + key + ': ' + obj.key);        // bringt bei allen Werten "undefined"
                        console.log('2:' + key + ': ' + obj[key]);          // bringt nur bei relays.0.name "undefined"
                    }
                }
            });
        }
        
        logHydraData();
        
        

        Ich habe es bisher nicht geschafft, den Wert von "relays.0.name" anzeigen zu lassen, wenn der Name in einer Variable übergeben wurde. Ergebnis war immer "undefined".

        Gibt es da noch eine alternative Schreibweise oder ist das gar nicht möglich?

        Viele Grüße,
        Andreas

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

          @ah966 sagte:

          Gibt es da noch eine alternative Schreibweise oder ist das gar nicht möglich?

          Ein Bezeichner darf nicht mit einer Ziffer beginnen, weshalb eine andere Schreibweise verwendet werden muss:

          relays['0'].name
          
          1 Reply Last reply Reply Quote 0
          • A
            ah966 last edited by

            Hallo paul53,

            danke für Deine Antwort.

            Das hatte leider nicht geklappt, sondern brachte auch nur

            216b24fd-f7bf-4c9e-88ed-6b158a4be830-grafik.png

            Ich hab das jetzt so gelöst (nach etlichem Trial-and-Error):

            var apiurl = "https://app.hydrawise.com/api/v1/statusschedule.php?api_key=" + apikey + "&tag=hydrawise_all";
            
            function logHydraData() {
                var request = require('request');
                request(apiurl, function (error, response, body) {
                    if (!error && response.statusCode == 200) {
                        
                        var obj = JSON.parse(body);
            
                        // Objekte in root-Ebene
                        var rkeynames = ["watering_time", "name", "status"];
                        for (var rkey of rkeynames) {
                            console.log('2:' + rkey + ': ' + obj[rkey]);          // bringt nur bei relays.0.name "undefined"
                        }
                        
                        // Nested Objects, unterhalb relays
                        var nkeynames = ["name", "lastwater", "time", "run_seconds", "nicetime"];
                        
                        for (var i = 0; i < 5; i++) {       //  Index für Zone (Relays) bilden
                            var nkey = {};                  //  Var für Objekt
                            var idx = i;
                            for (nkey of nkeynames) {
                                // console.log(idx);
                                console.log(nkey + ': ' + obj.relays[idx][nkey]);
                            }
                        }
                    }
                });
            }
            
            logHydraData();
            
            

            Der Schlüssel lag darin, die Var "nkey" (Zeile 20) als Objekt zu definieren.

            Viele Grüße,
            Andreas

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

            Support us

            ioBroker
            Community Adapters
            Donate

            846
            Online

            31.6k
            Users

            79.5k
            Topics

            1.3m
            Posts

            2
            4
            417
            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