Weiter zum Inhalt
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Hell
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dunkel
  • 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. Visualisierung
  4. Vis mit Kamerabild von Ring

NEWS

  • Neuer ioBroker-Blog online: Monatsrückblick März/April 2026
    BluefoxB
    Bluefox
    8
    1
    516

  • Verwendung von KI bitte immer deutlich kennzeichnen
    HomoranH
    Homoran
    10
    1
    420

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    18
    1
    991

Vis mit Kamerabild von Ring

Geplant Angeheftet Gesperrt Verschoben Visualisierung
7 Beiträge 3 Kommentatoren 125 Aufrufe 3 Beobachtet
  • Ä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.
  • S Online
    S Online
    Stefan341
    schrieb am zuletzt editiert von
    #1

    Hallo,
    ich habe seit geraumer Zeit Probleme mein Kamerabild (gemeint ist eine Dauerschleife des letzten Events) in der Vis darzustellen.

    Das Problem fing an mit einem Update des Ring-Adapters vor ewiger Zeit. Nun möchte ich das nochmal angehen.

    Ich hatte vorher ein Blockly, dass das aktuelle Video lokal heruntergeladen hat. Dies finde ich aber nicht mehr. Wie habt ihr das gelöst (evtl. vorherige Verarbeitung des Videos, welches Widget in der Vis, Code für das Widget etc)?

    1 Antwort Letzte Antwort
    1
    • A Offline
      A Offline
      australien
      schrieb am zuletzt editiert von
      #2

      wie schafst du es das Bild darzustellen? mit welchem Widget?
      Egal welches ich versuche und den DP ring.0.cocoa_723202349.Snapshot.file verwende kommt immer nur die Fehlermeldung 404.

      1 Antwort Letzte Antwort
      0
      • S Online
        S Online
        Stefan341
        schrieb am zuletzt editiert von
        #3

        Das ist ja mein Problem. Früher ging das mit mit einem einfachen htlm-Widget. Jetzt geht es scheinbar nicht mehr.

        Dr. BakteriusD 1 Antwort Letzte Antwort
        0
        • A Offline
          A Offline
          australien
          schrieb am zuletzt editiert von australien
          #4

          Ich hab mir nun ein Script erstellt und lasse das image mit dem Binding ausgeben.

          // Eingangs-Datenpunkt
          const dpInput = 'ring.0.cocoa_72320xxxx.Snapshot.file';
          
          // Ausgangs-Datenpunkt (dein gewünschter)
          const dpOutput = '0_userdata.0.VIS-2_config.ringImagePfad';
          
          // Datenpunkt anlegen (falls nicht vorhanden)
          createState(dpOutput, '', { type: 'string', read: true, write: true });
          
          // Trigger auf Änderungen
          on({ id: dpInput, change: 'any' }, obj => {
          
              let val = obj.state.val;
              if (!val) return;
          
              // Position von "/ring" suchen
              let pos = val.indexOf('/ring');
          
              if (pos !== -1) {
                  // neuen relativen Pfad bauen
                  let neu = '..' + val.substring(pos);
          
                  // nur schreiben wenn sich etwas geändert hat
                  setStateChanged(dpOutput, neu, true);
              }
          });
          

          und Binding im Image Widget

          {0_userdata.0.VIS-2_config.ringImagePfad}
          
          1 Antwort Letzte Antwort
          0
          • S Online
            S Online
            Stefan341
            schrieb am zuletzt editiert von
            #5

            Soweit ich mich erinnere musste man die Datei lokal speichern lassen und diese dann ausgeben.

            1 Antwort Letzte Antwort
            0
            • S Stefan341

              Das ist ja mein Problem. Früher ging das mit mit einem einfachen htlm-Widget. Jetzt geht es scheinbar nicht mehr.

              Dr. BakteriusD Offline
              Dr. BakteriusD Offline
              Dr. Bakterius
              Most Active
              schrieb am zuletzt editiert von Dr. Bakterius
              #6

              @Stefan341 Ich habe das etwas umständlich gelöst weil ja etwa 30 Minuten nach dem Anläuten das Kamerabild (angeblich) immer wieder neu ist. Daher wird eine Checksum vom Bild erstellt und nur wenn die geändert wurde wird das Bild als neu erkannt. Dieses Bild wird in den VIS Ordner kopiert. Dann setze ich einen Datenpunkt für 30 Sekunden auf true. Wenn der DP 'true' ist, wird das Bild angezeigt, sonst ist es unsichtbar.

              In VIS habe ich ein einfaches 'basic - image' genommen und so konfiguriert:
              a29ed173-86fe-4b02-b742-aaec868d57aa-image.jpeg

              Hier noch das JS für die Behandlung vom Bild:

              const fs = require('fs');
              const path = require('path');
              const crypto = require('crypto');
              
              const dir = '/opt/iobroker/bilder/cocoa_700536663/';
              
              function bildHash(dateiPfad) {
                 const data = fs.readFileSync(dateiPfad);
                 return crypto.createHash('md5').update(data).digest('hex');
              }
              
              function writeFilePromise(adapter, dateiname, daten) {
                 return new Promise((resolve, reject) => {
                     writeFile(adapter, dateiname, daten, (err) => {
                         if (err) reject(err);
                         else resolve();
                     });
                 });
              }
              
              const files = fs.readdirSync(dir)
                 .filter(f => f.startsWith('snapshot') && f.endsWith('.jpg'))
                 .map(f => ({
                     name: f,
                     mtime: fs.statSync(path.join(dir, f)).mtimeMs
                 }))
                 .sort((a, b) => b.mtime - a.mtime);
              
              if (files.length === 0) return false;
              
              const newestFile = path.join(dir, files[0].name);
              const aktuellerHash = bildHash(newestFile);
              const letzterHash = getState('0_userdata.0.Ring.letzterHash').val || '';
              
              if (aktuellerHash === letzterHash) {
                 log('Bild ist identisch – wird übersprungen', 'warn');
                 return false;
              }
              
              setState('0_userdata.0.Ring.letzterHash', aktuellerHash, true);
              const imageData = fs.readFileSync(newestFile);
              
              try {
                 await writeFilePromise('vis.0', 'Ring-Bild.jpg', imageData);
                 log('Neues Bild gespeichert');
                 setState('0_userdata.0.Ring.ringBildTimestamp', Date.now());
                 return true;
              } catch (err) {
                 log('Fehler beim Speichern: ' + err, 'error');
                 return false;
              }
              

              S 1 Antwort Letzte Antwort
              0
              • Dr. BakteriusD Dr. Bakterius

                @Stefan341 Ich habe das etwas umständlich gelöst weil ja etwa 30 Minuten nach dem Anläuten das Kamerabild (angeblich) immer wieder neu ist. Daher wird eine Checksum vom Bild erstellt und nur wenn die geändert wurde wird das Bild als neu erkannt. Dieses Bild wird in den VIS Ordner kopiert. Dann setze ich einen Datenpunkt für 30 Sekunden auf true. Wenn der DP 'true' ist, wird das Bild angezeigt, sonst ist es unsichtbar.

                In VIS habe ich ein einfaches 'basic - image' genommen und so konfiguriert:
                a29ed173-86fe-4b02-b742-aaec868d57aa-image.jpeg

                Hier noch das JS für die Behandlung vom Bild:

                const fs = require('fs');
                const path = require('path');
                const crypto = require('crypto');
                
                const dir = '/opt/iobroker/bilder/cocoa_700536663/';
                
                function bildHash(dateiPfad) {
                   const data = fs.readFileSync(dateiPfad);
                   return crypto.createHash('md5').update(data).digest('hex');
                }
                
                function writeFilePromise(adapter, dateiname, daten) {
                   return new Promise((resolve, reject) => {
                       writeFile(adapter, dateiname, daten, (err) => {
                           if (err) reject(err);
                           else resolve();
                       });
                   });
                }
                
                const files = fs.readdirSync(dir)
                   .filter(f => f.startsWith('snapshot') && f.endsWith('.jpg'))
                   .map(f => ({
                       name: f,
                       mtime: fs.statSync(path.join(dir, f)).mtimeMs
                   }))
                   .sort((a, b) => b.mtime - a.mtime);
                
                if (files.length === 0) return false;
                
                const newestFile = path.join(dir, files[0].name);
                const aktuellerHash = bildHash(newestFile);
                const letzterHash = getState('0_userdata.0.Ring.letzterHash').val || '';
                
                if (aktuellerHash === letzterHash) {
                   log('Bild ist identisch – wird übersprungen', 'warn');
                   return false;
                }
                
                setState('0_userdata.0.Ring.letzterHash', aktuellerHash, true);
                const imageData = fs.readFileSync(newestFile);
                
                try {
                   await writeFilePromise('vis.0', 'Ring-Bild.jpg', imageData);
                   log('Neues Bild gespeichert');
                   setState('0_userdata.0.Ring.ringBildTimestamp', Date.now());
                   return true;
                } catch (err) {
                   log('Fehler beim Speichern: ' + err, 'error');
                   return false;
                }
                

                S Online
                S Online
                Stefan341
                schrieb am zuletzt editiert von
                #7

                @Dr.-Bakterius
                Du benutzt das Bild, nicht das Video.

                Ich hatte es damals so, dass das Video nach einem Event in Dauerschleife abgespielt wurde.

                Also hatte ich ein Script, mit dem Trigger auf die Zeit des Events. Kam ein neues Event, änderte sich die Zeit. Dann hat das Script das Video lokal gespeichert und die Vis hat das lokale Video in Dauerschleife wiedergegeben.

                1 Antwort Letzte Antwort
                0

                Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.

                Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.

                Mit deinem Input könnte dieser Beitrag noch besser werden 💗

                Registrieren Anmelden
                Antworten
                • In einem neuen Thema antworten
                Anmelden zum Antworten
                • Älteste zuerst
                • Neuste zuerst
                • Meiste Stimmen


                Support us

                ioBroker
                Community Adapters
                Donate

                269

                Online

                32.8k

                Benutzer

                82.9k

                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