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. Bewegungsmeldung mit Frigate

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    6
    1
    25

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    11
    1
    554

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.7k

Bewegungsmeldung mit Frigate

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
6 Beiträge 1 Kommentatoren 1.1k Aufrufe 4 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.
  • WalW Online
    WalW Online
    Wal
    Developer
    schrieb am zuletzt editiert von Wal
    #1

    Nach der Idee aus diesem Thema habe ich das Skript angepasst um Bewegungen von Objekten zu erkennen.
    Es können so die Kameras die in Frigate integriert sind als Bewegungsmelder genutzt werden.

    Version 5:

    var filepath = '/srv/storage/frigate/clips/'; // Pfad zu den Frigate Clips
    var weburl= 'http://192.168.12.16:5000'; //Url zum Frigate Server
    
    function extractEventData(message) {
        const parsedMessage = JSON.parse(message);
        let extractedJSON = {};
        extractedJSON.eventtype = parsedMessage.type;
        extractedJSON.beforecamera = parsedMessage.before.camera;
        extractedJSON.beforelabel = parsedMessage.before.label;
        extractedJSON.afterid = parsedMessage.after.id;
        extractedJSON.aftertopscore = parsedMessage.after.top_score;
        extractedJSON.afterhasclip = parsedMessage.after.has_clip;
        extractedJSON.afterhassnapshot = parsedMessage.after.has_snapshot;   
        return extractedJSON;
    }
     
    on({id: [].concat(['mqtt.0.frigate.events']), change: "ne" }, function (obj) {
        const extractedJSON = extractEventData(obj.state.val);
        const beforecamera = extractedJSON.beforecamera;
        const beforelabel = extractedJSON.beforelabel;
        const afterid = extractedJSON.afterid;
        const topscore = extractedJSON.aftertopscore;
        const hasclip = extractedJSON.afterhasclip;
        const hassnapshot = extractedJSON.afterhassnapshot; 
        const eventtype = extractedJSON.eventtype;
        let id0 = '0_userdata.0.frigate.event';
        let id1 = '0_userdata.0.frigate.' + beforecamera + '.event';
        let id2 = '0_userdata.0.frigate.' + beforecamera + '.objects.' + beforelabel;
        let snapfilename = filepath + beforecamera + '-' + afterid + '.jpg';
        let clipfilename = filepath + beforecamera + '-' + afterid + '-clean.png';
        let websnap = weburl + '//api/events/' + afterid + '/snapshot.jpg';
        let webclip = weburl + '//api/events/' + afterid + '/clip.mp4';
    
        if (eventtype == 'new') {
            //------------------------------
            //      Bewegung erkannt
            //------------------------------
            if(existsState(id0)) {
                setState(id0, true, true);
            } else {
                createState(id0, true, {
                    type:"boolean",
                    read:true,
                    write:false,
                    name:"Bewegung erkannt",
                    def: false
                });
            }        
            //------------------------------
            //       Kamera erkannt
            //------------------------------
            if(existsState(id1)) {
                setState(id1, true, true);
            } else {
                createState(id1, true, {
                    type:"boolean",
                    read:true,
                    write:false,
                    name:"Kamera erkannt",
                    def: false
                });
            }       
            //------------------------------
            //       Objekt erkannt
            //------------------------------
            if(existsState(id2 + '.event')) {
                setState(id2 + '.event', true, true);
            } else {
                createState(id2 + '.event', true, {
                    type:"boolean",
                    read:true,
                    write:false,
                    name:beforelabel + " erkannt",
                    def: false
                });
            }
        } else if (eventtype == 'end') {
            //------------------------------
            //         Event ID
            //------------------------------
            if(existsState(id2 + '.id')) {
                setState(id2 + '.id', afterid, true);
            } else {
                createState(id2 + '.id', afterid, {
                    type:"string",
                    read:true,
                    write:false,
                    name:"Event ID",
                    role:"value",
                    def: ""
                }); 
            }
            //------------------------------
            //            Files
            //------------------------------
            if(existsState(id2 + '.filename.snap.snap_0')) {
                for (var i = 9; i>-1; i--)
                    if (i==0) {setState(id2 + '.filename.snap.snap_' + i.toString(), snapfilename, true)} else       
                        setState(id2 + '.filename.snap.snap_' + i.toString(), getState(id2 + '.filename.snap.snap_' + (i-1).toString()), true);
            } else {
                for (var i = 0; i<10; i++)
                {
                    let dummy = '';
                    if (i==0) dummy = snapfilename;
                    createState(id2 + '.filename.snap.snap_' + i.toString(), dummy, {
                        type:"string",
                        read:true,
                        write:false,
                        name:"Snapshot Filename " + i.toString(),
                        role:"value",
                        def: ""
                    });          
                }
            }
            if(existsState(id2 + '.web.snap.snap_0')) {
                for (var i = 9; i>-1; i--)
                    if (i==0) {setState(id2 + '.web.snap.snap_' + i.toString(), websnap, true)} else       
                        setState(id2 + '.web.snap.snap_' + i.toString(), getState(id2 + '.web.snap.snap_' + (i-1).toString()), true);
            } else {
                for (var i = 0; i<10; i++)
                {
                    let dummy = '';
                    if (i==0) dummy = websnap;
                    createState(id2 + '.web.snap.snap_' + i.toString(), dummy, {
                        type:"string",
                        read:true,
                        write:false,
                        name:"Snapshot WebUrl " + i.toString(),
                        role:"value",
                        def: ""
                    });          
                }
            }
            if(existsState(id2 + '.web.clip.clip_0')) {
                for (var i = 9; i>-1; i--)
                    if (i==0) {setState(id2 + '.web.clip.clip_' + i.toString(), webclip, true)} else       
                        setState(id2 + '.web.clip.clip_' + i.toString(), getState(id2 + '.web.clip.clip_' + (i-1).toString()), true);
            } else {
                for (var i = 0; i<10; i++)
                {
                    let dummy = '';
                    if (i==0) dummy = webclip;
                    createState(id2 + '.web.clip.clip_' + i.toString(), dummy, {
                        type:"string",
                        read:true,
                        write:false,
                        name:"Clip WebUrl " + i.toString(),
                        role:"value",
                        def: ""
                    });          
                }
            }
            if(existsState(id2 + '.filename.clip.clip_0')) {
                for (var i = 9; i>-1; i--)
                    if (i==0) {setState(id2 + '.filename.clip.clip_0', clipfilename, true)} else
                        setState(id2 + '.filename.clip.clip_' + i.toString(), getState(id2 + '.filename.clip.clip_' + (i-1).toString()), true);        
            } else {
                for (var i = 0; i<10; i++)
                {
                    let dummy = '';
                    if (i==0) dummy = clipfilename;
                    createState(id2 + '.filename.clip.clip_' + i.toString(), dummy, {
                        type:"string",
                        read:true,
                        write:false,
                        name:"Clip Filename " + i.toString(),
                        role:"value",
                        def: ""
                    });          
                }
            }
            //------------------------------
            //       Erkennungsrate
            //------------------------------
            if(existsState(id2 + '.score')) {
                setState(id2 + '.score', Math.round(topscore*100), true);
            } else {
                createState(id2 + '.score', Math.round(topscore*100), {
                    type:"number",
                    read:true,
                    write:false,
                    name:"Erkennungsrate",
                    role:"value.score",
                    unit:"%",
                    def: 0
                }); 
            }     
            //------------------------------
            //       Clip vorhanden
            //------------------------------
            if(existsState(id2 + '.clip')) {
                setState(id2 + '.clip', hasclip, true);
            } else {
                createState(id2 + '.clip', hasclip, {
                    type:"boolean",
                    read:true,
                    write:false,
                    name:"Clip vorhanden",
                    def: false
                }); 
            }
            //------------------------------
            //      Snapshot vorhanden
            //------------------------------
            if(existsState(id2 + '.snapshot')) {
                setState(id2 + '.snapshot', hassnapshot, true);
            } else {
                createState(id2 + '.snapshot', hassnapshot, {
                    type:"boolean",
                    read:true,
                    write:false,
                    name:"Snapshot vorhanden",
                    def: false
                }); 
            }
            //------------------------------
            //      Reset Event States
            //------------------------------        
            setState(id0, false, true);
            setState(id1, false, true);
            setState(id2 + '.event', false, true);
        }
    });
    

    Gruß
    Walter

    DoorIO-Adapter
    wioBrowser-Adapter und wioBrowser

    1 Antwort Letzte Antwort
    0
    • WalW Online
      WalW Online
      Wal
      Developer
      schrieb am zuletzt editiert von
      #2

      Version 2:
      Allgemeine Bewegung erkannt
      Bewegung an Kamera xxx erkannt
      Objekt (Person,Auto,Hund...) erkannt

      Gruß
      Walter

      DoorIO-Adapter
      wioBrowser-Adapter und wioBrowser

      1 Antwort Letzte Antwort
      0
      • WalW Online
        WalW Online
        Wal
        Developer
        schrieb am zuletzt editiert von
        #3

        Version 3:
        Erkennungsrate
        Clip vorhanden
        Snapshot vorhanden

        Gruß
        Walter

        DoorIO-Adapter
        wioBrowser-Adapter und wioBrowser

        1 Antwort Letzte Antwort
        0
        • WalW Online
          WalW Online
          Wal
          Developer
          schrieb am zuletzt editiert von Wal
          #4

          Version 4:
          Pfade der letzten 10 Snapshots und Clips zur Verwendung in der Vis, E-Mail,Telegram u.s.w.
          Es funktioniert wie ein Ringpuffer, der aktuelle Pfad rückt auf die erste Stelle und der letzte Pfad fällt hinten raus.

          Der Frigate Ordner sollte unter ioBroker erreichbar sein.
          Ich nutze eine USB-Festplatte die in Proxmox eingebunden ist, diese mappe ich in den Frigate LXC und in den ioBroker LXC, dadurch habe ich die Bilder von Frigate direkt im ioBroker.

          Screenshot 2023-04-23 221650.png

          Gruß
          Walter

          DoorIO-Adapter
          wioBrowser-Adapter und wioBrowser

          1 Antwort Letzte Antwort
          0
          • WalW Online
            WalW Online
            Wal
            Developer
            schrieb am zuletzt editiert von Wal
            #5

            Version 5:
            Webadressen der Snapshots und Clips hinzugefügt.

            In der Vis ein Image hinzufügen und z.B.

            {0_userdata.0.frigate.deinkameranamen.objects.person.web.snap.snap_0}
            

            als Quelle einfügen.
            Die Clips sind die Videos zum Ereignis die man z.B. mit einem Link hinzufügen kann.

            Gruß
            Walter

            DoorIO-Adapter
            wioBrowser-Adapter und wioBrowser

            1 Antwort Letzte Antwort
            0
            • WalW Online
              WalW Online
              Wal
              Developer
              schrieb am zuletzt editiert von Wal
              #6

              Da das Skript immer grösser wurde, habe ich alles in einen Adapter migriert.

              Gruß
              Walter

              DoorIO-Adapter
              wioBrowser-Adapter und wioBrowser

              1 Antwort Letzte Antwort
              2
              Antworten
              • In einem neuen Thema antworten
              Anmelden zum Antworten
              • Älteste zuerst
              • Neuste zuerst
              • Meiste Stimmen


              Support us

              ioBroker
              Community Adapters
              Donate

              824

              Online

              32.5k

              Benutzer

              81.8k

              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