Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Get JSON from exec in Function - Solved!

NEWS

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.3k

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    9.3k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    14
    1
    2.6k

Get JSON from exec in Function - Solved!

Geplant Angeheftet Gesperrt Verschoben Gelöst JavaScript
3 Beiträge 2 Kommentatoren 344 Aufrufe 1 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • I Offline
    I Offline
    Info
    schrieb am zuletzt editiert von Info
    #1

    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))

    paul53P 1 Antwort Letzte Antwort
    0
    • paul53P paul53

      @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 Offline
      I Offline
      Info
      schrieb am zuletzt editiert von Info
      #3

      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 Antwort Letzte Antwort
      0
      • I 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))

        paul53P Offline
        paul53P Offline
        paul53
        schrieb am zuletzt editiert von
        #2

        @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
            });  
        }
        

        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

        I 1 Antwort Letzte Antwort
        0
        • paul53P paul53

          @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 Offline
          I Offline
          Info
          schrieb am zuletzt editiert von Info
          #3

          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 Antwort Letzte Antwort
          0
          Antworten
          • In einem neuen Thema antworten
          Anmelden zum Antworten
          • Älteste zuerst
          • Neuste zuerst
          • Meiste Stimmen


          Support us

          ioBroker
          Community Adapters
          Donate

          751

          Online

          32.5k

          Benutzer

          81.7k

          Themen

          1.3m

          Beiträge
          Community
          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
          ioBroker Community 2014-2025
          logo
          • Anmelden

          • Du hast noch kein Konto? Registrieren

          • Anmelden oder registrieren, um zu suchen
          • Erster Beitrag
            Letzter Beitrag
          0
          • Home
          • Aktuell
          • Tags
          • Ungelesen 0
          • Kategorien
          • Unreplied
          • Beliebt
          • GitHub
          • Docu
          • Hilfe