Loxone Intercom Gen2 - Webschnittstelle um Bild/Video rauszubekommen

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • Laubi
    Dumb Home'r
    • 01.01.2022
    • 28

    #76
    Zitat von B@llou
    Gibt es die Möglichkeit tatsächlich das letzte Bild aus der Intercom zu bekommen, was beim Betätigen der Klingel gespeichert wird?
    Hi,
    das hatte ich in einem meiner ersten Versuche bevor wir auf den Livestream gestoßen waren mal zusammengebastelt:

    Schau mal in die ältere Version von meinem intercom-gen2-last-picture.sh



    dort insbesondere die Parameter:

    intercom="172.16.2.190:80" # Die IP und der Port der InterCom Gen.2
    lastpict="/opt/loxberry/webfrontend/html/tmp/lastpicture.jpg" # dort legt das Script das Image ab.

    anpassen und für den ersten test ohne websocat_linuxarm32 einfach mit "bash intercom-gen2-last-picture.sh -c" den curl verwenden, ist aber nicht umbedingt der schönste Code, läuft bei mir aber (gerade getestet) noch ganz zuverlässig

    LG
    Laubi
    Zuletzt geändert von Laubi; 06.05.2024, 12:23.

    Kommentar


    • B@llou
      B@llou kommentierte
      Kommentar bearbeiten
      Ist das eine ältere Plugin Version?
      Oder was genau muss ich damit jetzt machen? 😳
  • Syrus
    Smart Home'r
    • 29.03.2022
    • 46

    #77
    HalloHallo,
    Ich habe seit geraumer Zeit das PlugIn am Loxberry installiert - einzig was nicht funktioniert bei mir ist das GetPicture / LastPicture ... siehe http traffic von der Loxone Config:

    Klicke auf die Grafik für eine vergrößerte Ansicht  Name: 2024-07-05 08_47_21-Loxone Config - Lanzenberg 26, 4320 Perg.jpg Ansichten: 0 Größe: 94,3 KB ID: 436127
    Gibt es hierzu eine Lösung oder einen Ansatz an was es scheitert?


    Folgendes ist mir auch noch aufgefallen:

    Ich hab mal alle meine Videos gelöscht mit dem Button im PlugIn - wenn ich per FileZilla auf das System gehe, seh ich jedoch noch "alle" Videos die je getätigt wurden:

    Klicke auf die Grafik für eine vergrößerte Ansicht  Name: 2024-07-05 08_51_05-loxberry@192.168.178.40 - FileZilla.jpg Ansichten: 0 Größe: 436,2 KB ID: 436128

    Somit gehe ich davo naus, das je größe der SD-Karte, das der Speicherplatz darauf irgendwann kollabiert - könnte man dies noch lösen?

    Auch ist mir aufgefallen, das Webhooks, welche nicht konfigiert sind im PlugIn, trotzdem getätigt werden (vorbereitet?) - diese werden auch nie gelöscht bzw. verbleiben halt immer im System ... Lösung?

    Klicke auf die Grafik für eine vergrößerte Ansicht  Name: 2024-07-05 08_54_31-loxberry@192.168.178.40 - FileZilla.jpg Ansichten: 0 Größe: 414,5 KB ID: 436129
    Alle Snapshots in diesem Post wurden am 05.07.2024 getätigt, damit man erkennt, um welches Datum/Uhrzeit es sich handelt am Filesystem...

    Will hier niemanden zu nahe treten und finde das PlugIn toll und interessant, jedoch möchte ich Dinge aufzeigen welche der Entwicklung zum PlugIn weiterhelfen und vorantreiben

    Kommentar

    • ESH Mayer
      Smart Home'r
      • 01.03.2020
      • 43

      #78
      Servus, welchen Port verwendet ihr zum Eintragen? Ich bekomme folgende Fehlermeldung wenn ich auf: http://192.168.2.53/plugins/intercom...getpicture.php klicke:
      Klicke auf die Grafik für eine vergrößerte Ansicht

Name: grafik.png
Ansichten: 630
Größe: 8,6 KB
ID: 437243

      Kommentar


      • Teemoe
        Teemoe kommentierte
        Kommentar bearbeiten
        Selber Fehler bei mir seitdem ich es aufgesetzt habe, hab's leider nicht nicht zum laufen gebracht

      • ESH Mayer
        ESH Mayer kommentierte
        Kommentar bearbeiten
        Kann uns keiner helfen? @ Teemoe, hast du es hinbekommen?

      • Teemoe
        Teemoe kommentierte
        Kommentar bearbeiten
        Ne leider nicht, habe aber auch nicht weiter probiert.
    • MarkusR
      Extension Master
      • 13.09.2016
      • 125

      #79
      Servus,
      ich bekomme bei der Installation auf einen Frischen Loxberry immer die Fehlermeldung

      cp: cannot stat '/opt/loxberry/data/system/tmp/uploads/hKHwTeVWNc/intercom22lox-1.3.6/bin/*': No such file or directory

      19:44:55.899 ERROR: Not all file(s) could be installed successfully.

      Kommentar

      • meisterjäger
        Smart Home'r
        • 15.06.2019
        • 75

        #80
        Hallo zusammen, vielen Dank für das super tolle Plugin. Ist es möglich den Video stream direkt auf einem NAS abzuspeichern? Weiß jemand wie man das realisieren könnte? Am Besten wäre natürlich wenn man einen maximalen Speicherbedarf angeben könnte und dann die älteste Datei wieder überschrieben wird. Meine Hikvision macht das zum Beispiel genau so automatisch ich würde aber zusätzlich gerne die Intercom der Loxone ebenfalls aufzeichnen.

        Vielen Dank im Voraus für die Hilfe.

        Kommentar

        • mouzzz
          Azubi
          • 26.11.2023
          • 3

          #81
          Hier (Loxberry via VirtuaBox) läuft das Plugin - danke dafür.
          Wird in den Einstellungen der Zeitstempel gesetzt, so funktioniert nur mehr das Live-Bild. Der "getpicture.php"-Link funktioniert dann nicht mehr.
          Ohne Zeitstempel soweit keine Probleme

          Kommentar


          • Paz
            Paz kommentierte
            Kommentar bearbeiten
            Jaaaa, so ist es... ich hab so lange nach dem Fehler gesucht, darauf wäre ich nie gekommen. Danke! 😊
        • halbleiter
          Azubi
          • In den letzten 2 Wochen
          • 5

          #82
          Hallo in die Runde,
          ich wärme diesen Thread nochmal auf und hoffe, die Akteure lesen noch mit. Ich habe ebenfalls einige Versuche unternommen, per sockets und webrtc an die Daten der Intercom 2 zu kommen. Meine Intercom 2 hat den aktuellen Softwarestand (15.01.04.15) und hängt auf IP 192.168.0.13 zusammen mit Miniserver und PC im selben Hausnetz.
          Zum Testen verwende ich Javascript im Chrome Browser und einen simplen portablen Webserver (mongoose-tiny-4.1) der im Browser unter localhost:8080 erreichbar ist.
          Als erstes mal ein einfaches Javascript, das den auth-String aus der Intercom holt. Es besteht im wesentlichen aus dem Aufbau eines Sockets und der Auswertung der Intercom Antwort. Wenn man auf den Button klickt, öffnet die Funktion start() einen WebSocket zur Intercom mit dem (wie ihr schon rausgefunden habt) Protokoll webrtc-signaling. Die Intercom reagiert darauf mit einer message, die zunächst mit console.log an die Chome DevTools console ausgegeben und dann mit JSON.parse in ein JSON Objekt konvertiert wird. Dieses Objekt enthält ein Array params, dessen erstes Element den Auth-String enthält, den man z.B. zum Abrufen der Bilder braucht.

          Zum Testen beide Codestücke in Dateien packen und im Browser über http://localhost:8080/socket.html aufrufen. Die IP der Intercom natürlich entsprechend anpassen.

          HTML socket.html:
          Code:
          <!DOCTYPE html>
          <html>
           <head>
             <title>Socket test</title>
           </head>
          
           <body>
            <h1>Loxone Intercom Socket test</h1>
            <div id="authorization">
            </div>
            <button id="startButton">Start</button>
            <script src="socket.js"></script>
           </body>
          </html>​
          Javascript socket.js:
          Code:
          'use strict';
          var intercom = 'http://192.168.0.13';
          
          startButton.addEventListener('click', start);
          
          function start() {
           var auth;
          
           let socket = new WebSocket(intercom, "webrtc-signaling");
           socket.onmessage = function(event) {
            console.log(event.data);
            auth = JSON.parse(event.data).params[0];
            authorization.innerHTML = auth;
            socket.close();
           }
          }​

          Kommentar

          • halbleiter
            Azubi
            • In den letzten 2 Wochen
            • 5

            #83
            Jetzt mal das Ganze modifiziert zum abholen des letzten Bilds. Im HTML gibt es ein DIV image, in das per Javascript das Bild eingefügt wird. Das Javascript holt sich zunächst den auth String wie im vorherigen Beispiel. Dann wird ein neues img Tag erzeugt, dessen src wie von euch ermittelt (#5 http://${KLINEL-TASTER-IP}/jpg/image.jpg?auth=64zeichen) zusammengebaut und an das HTML DIV angehängt wird. Ist das Bild geladen (img.onload event) wird der socket wieder geschlossen.

            HTML lastImage.html:
            Code:
            <!DOCTYPE html>
            <html>
             <head>
               <title>Last Image</title>
             </head>
            
             <body>
              <h1>Loxone Intercom last Image</h1>
              <div id="image">
              </div>
              <button id="startButton">Start</button>
              <script src="lastImage.js"></script>
             </body>
            </html>
            Javascript lastImage.js:
            Code:
            'use strict';
            var intercom = 'http://192.168.0.13';
            
            startButton.addEventListener('click', start);
            
            function start() {
             var auth;
            
             let socket = new WebSocket(intercom, "webrtc-signaling");
             socket.onmessage = function(event) {
              auth = JSON.parse(event.data).params[0];
              var img = new Image();
              img.onload = function() {
               socket.close();
              }
              img.src = intercom + '/jpg/image.jpg?auth=' + auth;
              image.append(img);
             }
            }​

            Kommentar

            • halbleiter
              Azubi
              • In den letzten 2 Wochen
              • 5

              #84
              Und nun nochmal für alle Bilder. Das Strickmuster ist immer das selbe. Socket öffnen, Authentifizierung abholen, Bilder ziehen.
              Hier ist der Ablauf über eine simple state-machine mit 2 states (authorize und getImages) realisiert. Die erste Intercom message nach socket-Aufbau enthält den Auth-String (der offensichtlich nicht gebraucht wird). Auswertung in state authorize.
              Dann werden per socket.send die Links für die last Activities angefordert und die Intercom Antwort in state getImages ausgewertet..

              HTML images.html:
              Code:
              <!DOCTYPE html>
              <html>
               <head>
                 <title>All Images</title>
               </head>
              
               <body>
                <h1>Loxone Intercom all Images</h1>
                <div id="album">
                </div>
                <button id="startButton">Start</button>
                <script src="images.js"></script>
               </body>
              </html>
              Javascript images.js:
              Code:
              'use strict';
              var intercom = 'http://192.168.0.13';
              var state = 'authorize';
              
              startButton.addEventListener('click', start);
              
              function start() {
               let socket = new WebSocket(intercom, "webrtc-signaling");
               socket.onmessage = function(event) {
                switch(state) {
                 case 'authorize':
                  var auth = JSON.parse(event.data).params[0];
                  state = 'getImages';
                  socket.send('{"jsonrpc":"2.0","method":"getLastActivities","id":1,"params":[0,100]}');
                  break;
                 case 'getImages':
                  var images = JSON.parse(event.data).result.data;
                  for (let img of images) {
                   var imgTag = new Image();
                   imgTag.src = intercom + img.imagePath;
                   album.append(imgTag);
                   state = 'authorize';
                  }
                  break;
                }
               }
              }​

              Kommentar

              • halbleiter
                Azubi
                • In den letzten 2 Wochen
                • 5

                #85
                Jetzt geht es an die Gegensprech-Funktion. Das wird lt. Loxone ja über webRTC realisiert. aiortc ist mir dazu zu komplex und hat wohl auch seine Tücken. Deshalb lieber in plain Javascript. Ein gutes Tutorial zu webRTC in Javascript findet sich unter https://developers.google.com/codelabs/webrtc-web#0

                Im Wesentlichen sendet der Client (Browser) ein webRTC offer an die Intercom und bekommt eine answer zurück. Ich habe dazu testweise die Message aus #23 verwendet, bekomme aber im Gegensatz zu Laubi keine Antwort von der Intercom. Ich vermute, mit dem offer ist bei copy/paste was schief gegangen, speziell die /r/n sind verdächtig. Könnte das vieleicht jemand prüfen und evtl im webRTC.js korrigieren?

                HTML webRTC.html:
                Code:
                <!DOCTYPE html>
                <html>
                 <head>
                   <title>webRTC test</title>
                 </head>
                
                 <body>
                  <h1>Loxone Intercom webRTC test</h1>
                  <div id ="offer">
                   <h2>Offer</h2>
                  </div>
                  <div id="answer">
                   <h2>Answer</h2>
                  </div>
                  <button id="startButton">Start</button>
                  <script src="webRTC.js"></script>
                 </body>
                </html>
                Javascript webRTC.js:
                Code:
                'use strict';
                var intercom = 'http://192.168.0.13';
                var state = 'authorize';
                var offerMsg = '{"jsonrpc":"2.0","method":"call","id":2,"params":[{"sdp": "v=0\r\no=- 3851620043 3851620043 IN IP4 0.0.0.0\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0\r\na=msid-semantic:WMS *\r\nm=video 41712 UDP/TLS/RTP/SAVPF 97 98 99 100 101 102\r\nc=IN IP4 172.16.2.146\r\na=sendrecv\r\na=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=mid:0\r\na=msid:73bfc155-ac41-45d3-9bda-ab4d9106d985 7e647e2b-e48e-477c-87c7-821799ec492f\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=rtcp-mux\r\na=ssrc-group:FID 1052586587 854186381\r\na=ssrc:1052586587 cname:4874e9eb-e00f-4e4b-b2f2-5c72122bdf37\r\na=ssrc:854186381 cname:4874e9eb-e00f-4e4b-b2f2-5c72122bdf37\r\na=rtpmap:97 VP8/90000\r\na=rtcp-fb:97 nack\r\na=rtcp-fb:97 nack pli\r\na=rtcp-fb:97 goog-remb\r\na=rtpmap:98 rtx/90000\r\na=fmtp:98 apt=97\r\na=rtpmap:99 H264/90000\r\na=rtcp-fb:99 nack\r\na=rtcp-fb:99 nack pli\r\na=rtcp-fb:99 goog-remb\r\na=fmtp:99 packetization-mode=1;level-asymmetry-allowed=1;profile-level-id=42001f\r\na=rtpmap:100 rtx/90000\r\na=fmtp:100 apt=99\r\na=rtpmap:101 H264/90000\r\na=rtcp-fb:101 nack\r\na=rtcp-fb:101 nack pli\r\na=rtcp-fb:101 goog-remb\r\na=fmtp:101 packetization-mode=1;level-asymmetry-allowed=1;profile-level-id=42e01f\r\na=rtpmap:102 rtx/90000\r\na=fmtp:102 apt=101\r\na=candidate:c04f73782a97008445a2dec47df 1d2db 1 udp 2130706431 172.16.2.146 41712 typ host\r\na=candidate:de8eeb196603e5298f6a2c0da98835 34 1 udp 2130706431 2003:c5:8f13:ca01:dea6:32ff:fe49:db1a 37145 typ host\r\na=candidate:61d86a35ff26f9c4d9652c628138d2 7e 1 udp 1694498815 93.229.63.241 41712 typ srflx raddr 172.16.2.146 rport 41712\r\na=end-of-candidates\r\na=ice-ufrag:Jma1\r\na=ice-pwd:i5TuR0HRree5KZ8TW4pxzV\r\na=fingerprint:sha-256 39:3F:76:02:2F:9C:EE:B1:E5:38:26:EB:AD:83:C8:11:C1 :2B:FB:DE:BE:DE:72:AD:A5:9F:01:EE:A6:97:CE:C3\r\na=setup:actpass \r\n", "type": "offer"},"new":false]}';
                
                startButton.addEventListener('click', start);
                
                function start() {
                 let socket = new WebSocket(intercom, "webrtc-signaling");
                  socket.onmessage = function(event) {
                  switch(state) {
                   case 'authorize':
                    console.log('state: authorize');
                    var auth = JSON.parse(event.data).params[0];
                    offer.innerHTML = offerMsg;
                    state = 'getAnswer';
                    socket.send(offerMsg);
                    break;
                   case 'getAnswer':
                    var answerMsg = JSON.parse(event.data);
                    answer.innerHTML = JSON.stringify(answerMsg);
                    state = 'authorize';
                    break;
                  }
                 }
                }​

                Kommentar

                Lädt...