Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Letzte Bewegung erkannt im Raum …

    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

    Letzte Bewegung erkannt im Raum …

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

      Hallo,

      ich bin noch nicht so lange dabei, daher sitze ich nun schon eine ganze weile vor einem Problem, welches ich scheinbar nicht lösen kann.

      Ich möchte mir die letzte Bewegung eines Bewegungsmelders in eine Variable speichern und in VIS anzeigen lassen.

      Ich hab zwar ein script gefunden, welches die letzte Bewegung erkennt und mir auch die Meldung gibt, in welchem Raum diese stattgefunden hat, allerdings wird Sie (wenn der Bewegungsmelder seinen Status verändert) wieder gelöscht.

      Nun möchte ich diesen Wert (Raumname) in eine Variable speichern, um auch nach einiger Zeit sehen zu können, wo die letzt Bewegung stattgefunden hat.

      Ich weiss nur nicht, wie ich das ganze anfangen soll.

      Hab mich schon an Blockly versucht, aber das bekomme ich einfach nicht hin.

      Gruß

      Marcus

      1 Reply Last reply Reply Quote 0
      • 0
        0018 last edited by

        Hi,

        wenn es dir nur um eine reine VIS Anzeige geht, die anzeigen soll wann das letzte mal eine Bewegung war, könnte dir vielleicht auch das Vis-Widget "Last-Change Timestamp" helfen.

        viewtopic.php?t=375

        1 Reply Last reply Reply Quote 0
        • X
          Xanon last edited by

          Hallo 0018,

          vielen Dank für deine Antwort.

          Ja es geht mit Primär um die VIS Anzeige.

          Allerdings will ich mir nicht anzeigen lassen, wann ein Bewegungsmelder ausgelöst wurde, sondern in welchem Raum zuletzt eine Bewegung erkannt wurde.

          Das Skript zeigt diesen ja auch schon an, verschwindet allerdings wieder, wenn sich der Status vom Bewegungsmelder von "true" auf "false" ändert.

          Zurück bleibt eine leere Variable und somit kann ich nicht mehr sehen, wo die letzte Bewegung stattgefunden hat.

          Anbei mal das Skript, von welchem ich die ganze Zeit spreche / schreibe.

          /* Status Zahl Bewegung
          
          zählt die Bewegung in allen Räumen und meldet die Eingeschalteten namentlich
          Daten kommen vom Gewerk "Bewegung"
          
          23.12.2016 Script von pix; geändert von Bahnuhr auf Bewegung
          */
          var logging = false;
          
          var idAnzahlEin = 'javascript.0.Status.Bewegung.Anzahl_ein',
          idAnzahl = 'javascript.0.Status.Bewegung.Anzahl',
          idRaum = 'javascript.0.Status.Bewegung.Raum';
          
          // Ab hier nix mehr ändern
          createState(idAnzahl, { // wenn benötigt: Anzahl der vorhandenen Bewegung
          type: 'number',
          name: 'Anzahl aller Bewegung',
          min: 0,
          def: 0,
          role: 'value'
          });
          createState(idAnzahlEin, { // Anzahl der Bewegung, die auf sind als Variable unter Javascript.0 anlegen
          type: 'number',
          name: 'Anzahl der vorhandenen Bewegung',
          min: 0,
          def: 0,
          role: 'value'
          });
          createState(idRaum, {
          type: 'string',
          name: 'Räume mit Bewegung',
          desc: 'Namen der Räume, in denen Bewegung ist',
          def: ' ',
          role: 'value'
          });
          
          var cacheSelectorState = $('channel[state.id=*.MOTION](functions="Bewegung")'); // Gewerk Bewegungsmelder
          
          function checkDevices(obj) {
          // Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Bewegung auf 0
          var anzahlBewegungAn = 0;
          var anzahlBewegung = 0;
          var textRaum = [];
          if (logging) {
          log('++++++ Bewegung Anzahl ++++ ');
          log('#### SCHALTER ##### ');
          }
          cacheSelectorState.each(function (id, i) { // Schleife für jedes gefundenen Element *.STATE im Gewerk Bewegung
          var obj = getObject(id);
          var status = getState(id).val; // Zustand *.STATE abfragen (jedes Element)
          var raumname = getObject(id, "rooms"); 
          
          if (logging) {
          log('-------');
          log('Kanal: ' + name);
          log('Status: ' + status); 
          }
          if (status) { // wenn Zustand = true, dann wird die Anzahl der Bewegung hochgezählt
          ++anzahlBewegungAn; 
          textRaum.push(raumname.enumNames); 
          }
          ++anzahlBewegung; // Zählt die Anzahl der vorhandenen Bewegung unabhängig vom Status
          });
          
              // Funktion: Doppelte Einträge aus Array entfernen (für Räume) www.okco.de (c) codemaster
          function deleteDuplicates(arr) { 
              var temp = {}; 
              for (var i = 0; i < arr.length; i++) temp[arr[i]] = true; 
              var r = []; 
              for (var k in temp) r.push(k); 
              return r;
          }
          
          textRaum = deleteDuplicates(textRaum); // Löscht doppelte Einträge in den Objekt Räume
          
          // Array mit Bewegungsmeldernamen sortieren
          textRaum.sort(); 
          // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben
          if (logging) log("Anzahl Bewegung: " + anzahlBewegung + " # davon Bewegung an: " + anzahlBewegungAn);
          // die ermittelten Werte werden als javascript.0\. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS)
          setState(idAnzahl, anzahlBewegung); // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Bewegung
          setState(idAnzahlEin, anzahlBewegungAn); 
          setState(idRaum, textRaum.join(', ')); // Räume, in denen Bewegung ist
          }
          
          // Trigger
          cacheSelectorState.on(function(obj) { // bei Zustandänderung *.STATE im Gewerk Bewegung
          if (logging) log('Auslösende Bewegung: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat
          checkDevices();
          });
          
          function main() {
          setTimeout(function(){
          if (logging) log('Auslöser Skriptstart');
          checkDevices();
          }, 2000);
          }
          
          main(); // Skriptstart-Auslöser
          

          Ahhhhhh :idea:

          während ich diese Zeilen geschrieben habe, ist mir eine Idee gekommen, wie man das ganz einfach lösen kann.

          Also Antworte ich mir hier mal selbst 😉 bzw. vielleicht braucht das ja noch jemand. 🙂

          Einfach einen Datenpunkt erstellen (bei mir "letzte Bewegung")

          und dann folgendes Blockly erstellen.

          Damit trigger ich nur, wenn eine Bewegung erkannt wurde und schreibe den Wert von "Räume mit Bewegung" in die Variable "Letzte Bewegung".

          Wenn der Bewegungsmelder nun wieder auf "False" geht, bleibt der Wert trotzdem erhalten.
          1895_bildschirmfoto_2019-01-23_um_01.26.43.png

          Gruß

          Marcus

          1 Reply Last reply Reply Quote 0
          • M
            martinschm last edited by

            Hi,

            ich nutze das Skript auch, vielen Dank dafür. Ich würde mir aber gerne noch bei den Räumen ausgeben lassen wann die letzte Bewegung war.

            Wie ginge das ?

            Bin da etwas planlos

            1 Reply Last reply Reply Quote 0
            • First post
              Last post

            Support us

            ioBroker
            Community Adapters
            Donate

            401
            Online

            31.9k
            Users

            80.2k
            Topics

            1.3m
            Posts

            3
            4
            621
            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