Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Get JSON from exec in Function - Solved!

    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

    SOLVED Get JSON from exec in Function - Solved!

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

      Hallo zusammen,
      ich verzweifle seit einiger Zeit an - wahrscheinlich - einer Kleinigkeit.

      Ich möchte mit JavaScript die Parameter meiner UniFi Kamera auslesen. Das funktioniert soweit auch ....
      Ich habe folgende Funktion geschrieben:

      // grundlegende Parameter wie Server, AppKey und KameraIDs sind in einem Global-Skript ausgelagert.
      
      function myVideoGetCamera(Name) {
          var fReturn;
          var fCameraID;
      
      // KamaraID anhand des Namens ermitteln
          switch(Name) {
              case "Flur": 
                  fCameraID = myVideoCamFlur;
                  break;
              case "Garten":
                  fCameraID = myVideoCamGarten;
                  break;
              default:
                  console.log("Kamera nicht gefunden!");
                  return "err";
          }  
      
      // Abfrage zusammensetzen
          var fCommand = "curl -i --url 'https://" + myVideoServer + "/api/2.0/camera/" + fCameraID + "/?apiKey=" + myVideoAPIKey + "' --header 'Content-Type: application/json' --header 'Accept: application/json' --insecure -X GET";
      
      // Abfrage ausführen
          fReturn = exec(fCommand, function(err, response, errmsg) {
              if(err) { 
                  console.log("Fehler in der Abfrage: " + errmsg); 
                  return "err";
              } 
              var fJSON = JSON.parse(response.substr(response.search("{"),response.length-response.search("{")));
      // PROBLEM --> An dieser Stelle kann ich mit einem Console.log(fJSON.data[0].recordingSettings.motionRecordEnabled) z. B. den Status der Aufnahme bei Bewegungserkennung auslesen. Ich erhalte also ein korrektes JSON. Dieses möchte ich nun zurückgeben an fReturn. Das funktioniert schon nicht!
              return fSJON;
          });  
      // PROBLEM --> Hier würde ich gerne das JSON Objekt aus der Funktion zurückgeben, aber ich bekomme es aus der exec-Routine nicht heraus.
          return fReturn;
      }
      

      Ich hoffe irgendwer kann mir helfen.
      Als Workarround könnte ich neben dem Namen noch den gewünschten Parameter mitgeben. Allerdings müsste das dann alles hinterlegt werden. Als Switch (Parameter) und dann jeden Parameterin einen JSON-Pfad überführen und das dann in einen State wegschreiben und anschließend wieder auslesen. Aber das kann ja nicht die Lösung sein ....

      Vielen Dank für euer Feedback!
      Gruß Info![alt text](![image url](image url))

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

        Hi @paul53
        danke Dir für das Feedback. Dann kann ich das nicht so bauen wie ich es mir vorgestellt habe.
        Das Substr kürzt mir den eigentlichen Response des curl ein, da hier auch noch der Header mit zurückgegeben wird. Daher schneide ich den Teil bis der ersten { - also dem Begin des JSONs - ab.

        Ich habe es in der Zwischenzeit als Workarround so umgebaut, das ich mit einem 60s Trigger die Kamera auslese und dann mit dem Callback in einen State abspeichere. Wenn ich die Werte brauche, kann ich diese als JSON aus dem State lesen und den gewünschten Parameter extrahieren...

        /* =============================================================================
        >   Ließt alle Parameter einer Kamera aus und gibt sie als JSON zurück
        ==============================================================================*/
        on({id: 'VIS.82.Ticker_60s', change: "ne"}, function (f) {
            console.log("Read UniFi Video Cam's");
            
            // Kamera Flur auslesen
            var fCameraID = myVideoCamFlur;
            var fCommand = "curl -i --url 'https://" + myVideoServer + "/api/2.0/camera/" + fCameraID + "/?apiKey=" + myVideoAPIKey + "' --header 'Content-Type: application/json' --header 'Accept: application/json' --insecure -X GET";
            exec(fCommand, function(err, response, errmsg) {
                if(err) { 
                    console.log("Fehler in der Abfrage: " + errmsg); 
                } else {
                    setState('VIS.82.UniFi-Video.Flur.ParameterSet', response.substr(response.search("{"),response.length-response.search("{")));
                }
            });
        
            // Kamera Garten auslesen
            fCameraID = myVideoCamGarten;
            fCommand = "curl -i --url 'https://" + myVideoServer + "/api/2.0/camera/" + fCameraID + "/?apiKey=" + myVideoAPIKey + "' --header 'Content-Type: application/json' --header 'Accept: application/json' --insecure -X GET";
            exec(fCommand, function(err, response, errmsg) {
                if(err) { 
                    console.log("Fehler in der Abfrage: " + errmsg); 
                } else {
                    setState('VIS.82.UniFi-Video.Garten.ParameterSet', response.substr(response.search("{"),response.length-response.search("{")));
                }
            });
        
        });
        

        Auslesen kann ich dann zum Beispiel ob die Kamera gerade mit Bewegungserkennung aufnimmt mit:

        JSON.parse(getState('VIS.82.UniFi-Video.Flur.ParameterSet').val).data[0].recordingSettings.motionRecordEnabled;
        
        1 Reply Last reply Reply Quote 0
        • paul53
          paul53 @Info last edited by

          @Info
          Aus der Callback-Funktion kann nichts zurück gegeben werden, weil der Rückgabewert ausgewertet würde, bevor die Callback-Funktion ausgeführt wird. Die Auswertung muss in einer Funktion erfolgen, die aus der Callback-Funktion aufgerufen wird. Wozu soll .substr() gut sein ?

          // Abfrage ausführen
              exec(fCommand, function(err, response, errmsg) {
                  if(err) { 
                      console.log("Fehler in der Abfrage: " + errmsg); 
                      return;
                  } 
                  var obj = JSON.parse(response); // JSON --> Objekt
                  auswertung(obj); // In dieser Funktion wird das Objekt ausgewertet
              });  
          }
          
          I 1 Reply Last reply Reply Quote 0
          • I
            Info @paul53 last edited by Info

            Hi @paul53
            danke Dir für das Feedback. Dann kann ich das nicht so bauen wie ich es mir vorgestellt habe.
            Das Substr kürzt mir den eigentlichen Response des curl ein, da hier auch noch der Header mit zurückgegeben wird. Daher schneide ich den Teil bis der ersten { - also dem Begin des JSONs - ab.

            Ich habe es in der Zwischenzeit als Workarround so umgebaut, das ich mit einem 60s Trigger die Kamera auslese und dann mit dem Callback in einen State abspeichere. Wenn ich die Werte brauche, kann ich diese als JSON aus dem State lesen und den gewünschten Parameter extrahieren...

            /* =============================================================================
            >   Ließt alle Parameter einer Kamera aus und gibt sie als JSON zurück
            ==============================================================================*/
            on({id: 'VIS.82.Ticker_60s', change: "ne"}, function (f) {
                console.log("Read UniFi Video Cam's");
                
                // Kamera Flur auslesen
                var fCameraID = myVideoCamFlur;
                var fCommand = "curl -i --url 'https://" + myVideoServer + "/api/2.0/camera/" + fCameraID + "/?apiKey=" + myVideoAPIKey + "' --header 'Content-Type: application/json' --header 'Accept: application/json' --insecure -X GET";
                exec(fCommand, function(err, response, errmsg) {
                    if(err) { 
                        console.log("Fehler in der Abfrage: " + errmsg); 
                    } else {
                        setState('VIS.82.UniFi-Video.Flur.ParameterSet', response.substr(response.search("{"),response.length-response.search("{")));
                    }
                });
            
                // Kamera Garten auslesen
                fCameraID = myVideoCamGarten;
                fCommand = "curl -i --url 'https://" + myVideoServer + "/api/2.0/camera/" + fCameraID + "/?apiKey=" + myVideoAPIKey + "' --header 'Content-Type: application/json' --header 'Accept: application/json' --insecure -X GET";
                exec(fCommand, function(err, response, errmsg) {
                    if(err) { 
                        console.log("Fehler in der Abfrage: " + errmsg); 
                    } else {
                        setState('VIS.82.UniFi-Video.Garten.ParameterSet', response.substr(response.search("{"),response.length-response.search("{")));
                    }
                });
            
            });
            

            Auslesen kann ich dann zum Beispiel ob die Kamera gerade mit Bewegungserkennung aufnimmt mit:

            JSON.parse(getState('VIS.82.UniFi-Video.Flur.ParameterSet').val).data[0].recordingSettings.motionRecordEnabled;
            
            1 Reply Last reply Reply Quote 0
            • First post
              Last post

            Support us

            ioBroker
            Community Adapters
            Donate

            905
            Online

            31.8k
            Users

            80.0k
            Topics

            1.3m
            Posts

            2
            3
            262
            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