Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [gelöst]Briefkasten Abfrage Code vereinfachen

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [gelöst]Briefkasten Abfrage Code vereinfachen

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

      Hallo,

      ich habe zur Erkennung der Briefpost drei HM-Sec-SCo (optische Türfensterkontakte TFK von Homematic) im Briefkasten. Bei Gelegenheit kann ich gern mal mein neues "Gehäuse" dafür hier zeigen.

      Bisher habe ich mit zwei TFK gearbeitet, heute kam ein dritter hinzu, den ich als Bausatz im Keller gefunden habe.

      Der Briefkasten ist im Treppenhaus eines Mietshauses, mehrere Etagen entfernt. Funkstrecke klappt aber (meistens).

      Die Sensoren sind so eingestellt: true = Reflexion erkannt = voll, false = keine Reflexion erkannt = leer. Sie sind als Dreieck angeordnet (2 nebeneinander unten einer mittig oben).

      Ich habe ein Skript, das läuft. Das ist nicht das Problem. Ich hätte es gern vereinfacht.

      ! Hier das schon sehr alte Skript:

      /* Briefkasten Steuerung
      >! Skript legt die Variable Status Briefkasten an (boolean true (voll) / false (leer) )
      >! erstellt: 27.01.2014 von pix
      28.03.2015 in ioBroker portiert
      29.03.2015 Funktion für Status_Briefkasten-Variable auf (data)-Basis
                 Log(,'info') hinzugefügt
      30.03.2015 kleine Umstrukturierungen in Abfragen
                 Optin Variablen für Push und Sayit erstellt
      07.04.2015 Logging für Optin Variablen
                 value zu val (falscher Code)
                 Struktur Programm Türüberwachung geändert (Zeitverzögerung 5s)
      08.04.2015 Variablenabfrage mit getState angepasst
      21.04.2015 Variable idSayitHome24MP deklariert (vorher Fehler)
      30.05.2015 Optin Variable Unterkategorie erstellt
      10.07.2015 Neue Detektion mit zwei optischen TFK (wenn Brief erkannt, dann true)
      18.07.2015 Sayit als globale Funktion eingeführt
      30.07.2015 neue Variablen Struktur Status.Briefkasten...
      13.12.2015 Optin optimiert
                 Variable Briefkasten jetzt boolean
      06.01.2016 Optin Push Priorität
      04.02.2016 globale Pushfunktion eingeführt
      01.03.2016 Optin Log Subscriptions durch Regexp Funktion in anderem Skript ersetzt
      09.04.2016 Code optimiert
      04.08.2016 Push Meldung Ela eingepflegt
      22.09.2016 Pushsafer eingepflegt
      06.01.2017 Funktion tvtext eingefügt
      31.10.2017 dritter HM-Sec-SCo als TFK III installiert,
                 neues Gehäuse im Briefkasten eingebaut
                 Gewerk Briefkasten in CCU erstellt
                 TFK I (1s Verzögerung)
                 TFK II (2s verzögerung)
                 TFK III (3s verzögerung)
      */
      >! const fC = false;
      >! const idAnwesenheit = "javascript.0.Anwesenheit"/*Status Anwesenheit*/,
          idNachtruhe = "javascript.0.Nachtruhe"/*Nachtruhe*/,
      
          idOptinPush = "javascript.0.Optin.Treppenhaus.Briefkasten.Push",
          idOptinPushPrio = 'javascript.0.Optin.Treppenhaus.Briefkasten.Push.Prioritaet',
          idOptinSayit = "javascript.0.Optin.Treppenhaus.Briefkasten.Sayit",
      
          idStatusBriefkasten = "javascript.0.Status.Briefkasten"/*Status.Briefkasten*/,   // ioBroker Variable mit dem Status leer, voll, läuft über
      
          idOptischerTFK1 = "hm-rpc.0.LEQ0920575.1.STATE"/*Briefkasten TFK.STATE*/,        // Treppenhaus Briefkasten TFK - optischer Detektor #1 (Reflektion -> true; keine Reflektion -> false)
          idOptischerTFK2 = "hm-rpc.0.LEQ0920527.1.STATE"/*Briefkasten TFK II.STATE*/,     // Treppenhaus Briefkasten TFK - optischer Detektor #2 (Reflektion -> true; keine Reflektion -> false)
          idOptischerTFK3 = "hm-rpc.0.NEQ0945924.1.STATE"/*Briefkasten TFK III.STATE*/,
      
          idResetTaster = "hm-rpc.0.IEQ0548963.9.PRESS_SHORT"/*Statusanzeige:9 Briefkasten.PRESS_SHORT*/;      // HM Gerät LED-16 Taster Kanal 9 kurzer Druck, IEQ0548963:9.PRESS_SHORT
      >! // Erstellen der Variablen
      createState(idStatusBriefkasten, false, fC, {
          name: 'Briefkasten Status',
          desc: 'Briefkasten ist voll oder leer (true/false)',
          type: 'boolean',
          custom: {
              "influxdb.0": {
                  "enabled": true,
                  "changesOnly": true,
                  "debounce": "",
                  "retention": 63072000 // 2 Jahre
              }
         }
      });
      >! createState(idOptinPush, true, fC, {
          name: 'Optin Briefkasten Push melden',
          desc: 'Soll Briefkastenbewegung per Pushnachricht gemeldet werden?',
          type: 'boolean'
      });
      createState(idOptinPushPrio, 0, fC, {
          name: 'Priorität der Pushmeldung',
          desc: 'Mit welcher Priorität soll die Nachricht gesendet werden?',
          type: 'number'
      });
      createState(idOptinSayit, true, fC, {
          name: 'Optin Briefkasten Push ansagen',
          desc: 'Soll Briefkastenbewegung per Pushnachricht angesagt werden?',
          type: 'boolean'
      });
      >! on(idOptischerTFK1, function (obj) {
          if (obj.state.val) { // Reflektion erkannt, Brief liegt vorm Sensor
              setState(idStatusBriefkasten, true); // Status voll
              log('Briefkasten Sensor I meldet Reflektion - Brief eingeworfen');
          } else if (!obj.state.val) { // Status leer
              setTimeout(function () { // Verzögerung, da TFK2 und TFK3 mehr Sendeverzögerung haben
                  if (!getState(idOptischerTFK2).val && !getState(idOptischerTFK3).val) {
                      setState(idStatusBriefkasten, false); // Status leer
                      log('Briefkasten Sensor III meldet keine Reflexion');
                  }
              }, 3.5 * 1000);        
          }
      });
      >! on(idOptischerTFK2, function (obj) {
          if (obj.state.val) { // Reflektion erkannt, Brief liegt vorm Sensor
              setState(idStatusBriefkasten, true); // Status voll
              log('Briefkasten Sensor II meldet Reflektion - Brief eingeworfen');
          } else if (!obj.state.val) { // Status leer
              setTimeout(function () { // Verzögerung, da TFK2 + TFK3 mehr Sendeverzögerung haben
                  if (!getState(idOptischerTFK1).val && !getState(idOptischerTFK3).val) {
                      setState(idStatusBriefkasten, false); // Status leer
                      log('Briefkasten Sensor III meldet keine Reflexion');
                  }
              }, 3.5 * 1000);   
          }
      });
      >! on(idOptischerTFK3, function (obj) {
          if (obj.state.val) { // Reflektion erkannt, Brief liegt vorm Sensor
              setState(idStatusBriefkasten, true); // Status voll
              log('Briefkasten Sensor III meldet Reflektion - Brief eingeworfen');
          } else if (!obj.state.val) { // Status leer
              if (!getState(idOptischerTFK1).val && !getState(idOptischerTFK2).val) { // keine Verzögerung nötig, da TFK1 und TFK2 kleinere Sendeverzögerung haben
                  setState(idStatusBriefkasten, false); // Status leer
                  log('Briefkasten Sensor III meldet keine Reflexion');
              }        
          }
      });
      >! function meldung_push (text, titel, prio) {
          var optin_push = getState(idOptinPush).val;
          if (optin_push) { // wenn Optin
              var dienst = 4;
              var empfaenger = 'jm';
              push(dienst, text, titel, prio, empfaenger);
          } // Ende Optin
      }
      >! function meldung_sayit (ansage) {
          var optin_sayit = getState(idOptinSayit).val;
          if (optin_sayit) { // wenn Optin
              sayit(ansage); // globale Funktion
          } // Ende Optin
      }
      >! // STEUERUNG bei Bewegungen (nach Variablenstatus)
      on(idStatusBriefkasten, function (obj) { // Status Briefkasten ändert sich
          var anwesenheit = getState(idAnwesenheit).val,
              nachtruhe = getState(idNachtruhe).val,
              push_prio = getState(idOptinPushPrio).val,
              meldung,
              betreff = "ioBroker Meldung";
          if (!obj.state.val) meldung = 'Briefkasten wurde geleert'; //leer, keine weitere Benachrichtigung über die Leerung
          else if (obj.state.val) { // voll
              meldung = 'Briefkasten ist voll';
              if (anwesenheit === 0) {
                  meldung_push(meldung + '.', betreff, push_prio); // abwesend
              } else { // anwesend
                  if (nachtruhe === 0) { // wenn keine Nachtruhe
                      meldung_sayit('Sie haben Post. Der ' + meldung + '.');
                      meldung_push(meldung + '.', betreff, push_prio);
                      tvtext('Sie haben Post. Der ' + meldung + '.');
                  }
              }
          }
          log(meldung);
      });
      >! // Briefkastenzustand per Taster (LED16 Kanal 9 (Briefkasten) auf leer setzen
      on( {
          id: idResetTaster,
          val: true
      }, function (obj) {
          setState(idStatusBriefkasten, false); // Status leer
          log('Briefkastenzustand per Reset Taster auf <leer> gesetzt');
      });</leer>
      ````Das Skript nutzt ausserdem die Benachrichtigung per Messenger und TV-Einblendung. Dazu sind globale Funktionen nötig.
      
      Ich möchte gern den Teil in der Mitte verbessern:
      
      >! ````
      on(idOptischerTFK1, function (obj) {
          if (obj.state.val) { // Reflektion erkannt, Brief liegt vorm Sensor
              setState(idStatusBriefkasten, true); // Status voll
              log('Briefkasten Sensor I meldet Reflektion - Brief eingeworfen');
          } else if (!obj.state.val) { // Status leer
              setTimeout(function () { // Verzögerung, da TFK2 und TFK3 mehr Sendeverzögerung haben
                  if (!getState(idOptischerTFK2).val && !getState(idOptischerTFK3).val) {
                      setState(idStatusBriefkasten, false); // Status leer
                      log('Briefkasten Sensor III meldet keine Reflexion');
                  }
              }, 3.5 * 1000);        
          }
      });
      >! on(idOptischerTFK2, function (obj) {
          if (obj.state.val) { // Reflektion erkannt, Brief liegt vorm Sensor
              setState(idStatusBriefkasten, true); // Status voll
              log('Briefkasten Sensor II meldet Reflektion - Brief eingeworfen');
          } else if (!obj.state.val) { // Status leer
              setTimeout(function () { // Verzögerung, da TFK2 + TFK3 mehr Sendeverzögerung haben
                  if (!getState(idOptischerTFK1).val && !getState(idOptischerTFK3).val) {
                      setState(idStatusBriefkasten, false); // Status leer
                      log('Briefkasten Sensor III meldet keine Reflexion');
                  }
              }, 3.5 * 1000);   
          }
      });
      >! on(idOptischerTFK3, function (obj) {
          if (obj.state.val) { // Reflektion erkannt, Brief liegt vorm Sensor
              setState(idStatusBriefkasten, true); // Status voll
              log('Briefkasten Sensor III meldet Reflektion - Brief eingeworfen');
          } else if (!obj.state.val) { // Status leer
              if (!getState(idOptischerTFK1).val && !getState(idOptischerTFK2).val) { // keine Verzögerung nötig, da TFK1 und TFK2 kleinere Sendeverzögerung haben
                  setState(idStatusBriefkasten, false); // Status leer
                  log('Briefkasten Sensor III meldet keine Reflexion');
              }        
          }
      });
      

      Wenn einer der TFK true ist, ist der Briefkasten voll. Das ist klar.

      Wenn alle TFK false sind, ist der Briefkasten leer. Auch klar.

      Wie kann ich da leichter / kürzer Erreichen, als mit drei Subscriptions.

      Hab schon mal an die Auswertung übers Gewerk (Briefkasten gedacht)

      var tfk = $('channel[state.id=*.STATE](rooms=Treppenhaus)(functions=Briefkasten)');
      tfk.on(function(obj) {
          ...
      });
      
      

      Wer kann helfen?

      Kleiner Fallstrick! Die Sendsoren 1 bis 3 haben jeweils ein Sendeverzögerung. Sensor I (1s), Sensor II (2s), Sensor III (3s). Das war für die Funkübertragung nötig.

      Freu mich auch Vorschläge 😄

      Gruß

      Pix

      1 Reply Last reply Reply Quote 0
      • Dutchman
        Dutchman Developer Most Active Administrators last edited by

        du kannst in einer subscription 3 werte trigger lassen, wen einder der 3 sich aendert greift der "on" ein, beispiel:

        on({id: new RegExp('javascript\\.1\\.vbus\\.1' + "|" + 'javascript\\.1\\.vbus\\.2' + "|" + 'javascript\\.1\\.vbus\\.3'), change: "ne"}, function (obj) {
          });
        
        
        1 Reply Last reply Reply Quote 0
        • P
          pix last edited by

          Hallo Dutchman,

          danke für den Hinweis. Eigentlich ist das nicht das Problem, ich kann sie mit Regex triggern oder auch als Array.

          Mir geht es darum, die Logik in der Subscription zu vereinfachen.

          Wenn 1 oder 2 oder 3 true, dann an

          Wenn 1 und 2 und 3 false, dann aus

          :lol: :lol: :lol:

          Jetzt, wo ich es nochmal aufgeschrieben hab, sprudelte der Code gleich raus.

          const idStatusBriefkasten = "javascript.0.Status.Briefkasten",
          
              idOptischerTFK1 = "hm-rpc.0.LEQ0920575.1.STATE"/*Briefkasten TFK.STATE*/,        // Treppenhaus Briefkasten TFK - optischer Detektor #1 (Reflexion -> true; keine Reflexion -> false)
              idOptischerTFK2 = "hm-rpc.0.LEQ0920527.1.STATE"/*Briefkasten TFK II.STATE*/,     // Treppenhaus Briefkasten TFK - optischer Detektor #2 (Reflexion -> true; keine Reflexion -> false)
              idOptischerTFK3 = "hm-rpc.0.NEQ0945924.1.STATE"/*Briefkasten TFK III.STATE*/;
          
          // Erstellen der Variablen
          createState(idStatusBriefkasten, false, {
              name: 'Briefkasten Status',
              desc: 'Briefkasten ist voll oder leer (true/false)',
              type: 'boolean',
              custom: {
                  "influxdb.0": {
                      "enabled": true,
                      "changesOnly": true,
                      "debounce": "",
                      "retention": 63072000 // 2 Jahre
                  }
             }
          });
          
          var idSensoren = [idOptischerTFK1,idOptischerTFK2,idOptischerTFK3];
          on(idSensoren, function(obj) {
              setTimeout(function () { // Verzögerung, da TFK2 und TFK3 mehr Sendeverzögerung haben
                  var tfk1 = getState(idOptischerTFK1).val,
                      tfk2 = getState(idOptischerTFK2).val,
                      tfk3 = getState(idOptischerTFK3).val; // alle booelan
                  if (!tfk1 && !tfk2 && !tfk3) {
                      setState(idStatusBriefkasten, false); // Status leer
                      log('Briefkasten Sensoren melden keine Reflexion');
                  } else if (tfk1 || tfk2 || tfk3) { // irgendein Sensor schlägt an
                      if (!getState(idStatusBriefkasten).val) log('Briefkasten Sensor ' + obj.deviceName + ' meldet als erster Sensor eine Reflexion'); // meistens TFK1 weil kürzeste Verzögerung
                      setState(idStatusBriefkasten, true); // Status voll
                  }
              }, 3.5 * 1000); 
          });
          
          

          Dutchman, danke für den Anstoß, :lol:

          Gruß

          Pix

          1 Reply Last reply Reply Quote 0
          • AlCalzone
            AlCalzone Developer last edited by

            @pix:

            Mir geht es darum, die Logik in der Subscription zu vereinfachen.

            Wenn 1 oder 2 oder 3 true, dann an

            Wenn 1 und 2 und 3 false, dann aus `
            Falls du noch weiter vereinfachen willst:

            __Wenn 1 oder 2 oder 3 true, dann: an

            Sonst: aus__

            Die zweite Abfrage ist nicht nötig, da sie sich zwangsläufig ergibt (wenn keiner der Werte true ist, sind alle false).

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

              Ist die Verzögerung wirklich notwendig ?

              Nach Skriptstart muss sich erst einmal der Zustand im Briefkasten ändern, bevor der Datenpunkt aktualisiert wird. Ich würde es so machen:

              const idStatusBriefkasten = "javascript.0.Status.Briefkasten",
              
                  idOptischerTFK1 = "hm-rpc.0.LEQ0920575.1.STATE"/*Briefkasten TFK.STATE*/,        // Treppenhaus Briefkasten TFK - optischer Detektor #1 (Reflexion -> true; keine Reflexion -> false)
                  idOptischerTFK2 = "hm-rpc.0.LEQ0920527.1.STATE"/*Briefkasten TFK II.STATE*/,     // Treppenhaus Briefkasten TFK - optischer Detektor #2 (Reflexion -> true; keine Reflexion -> false)
                  idOptischerTFK3 = "hm-rpc.0.NEQ0945924.1.STATE"/*Briefkasten TFK III.STATE*/;
              
              // Erstellen der Variablen
              createState(idStatusBriefkasten, false, {
                  name: 'Briefkasten Status',
                  desc: 'Briefkasten ist voll oder leer (true/false)',
                  type: 'boolean',
                  custom: {
                      "influxdb.0": {
                          "enabled": true,
                          "changesOnly": true,
                          "debounce": "",
                          "retention": 63072000 // 2 Jahre
                      }
                 }
              });
              
              var tfk1 = getState(idOptischerTFK1).val,
                  tfk2 = getState(idOptischerTFK2).val,
                  tfk3 = getState(idOptischerTFK3).val; // alle booelan
              
              function Briefkasten() {
                  if (tfk1 || tfk2 || tfk3) { // irgendein Sensor schlägt an
                          if (!getState(idStatusBriefkasten).val) log('Briefkasten Sensor ' + obj.deviceName + ' meldet als erster Sensor eine Reflexion'); // meistens TFK1 weil kürzeste Verzögerung
                          setState(idStatusBriefkasten, true); // Status voll
                  } else {
                          setState(idStatusBriefkasten, false); // Status leer
                          log('Briefkasten Sensoren melden keine Reflexion');
                  }
              }
              
              Briefkasten();  // Skriptstart
              
              const idSensoren = [idOptischerTFK1,idOptischerTFK2,idOptischerTFK3];
              on(idSensoren, function(dp) {
                  if(dp.id === idOptischerTFK1) tfk1 = dp.state.val;
                  if(dp.id === idOptischerTFK2) tfk2 = dp.state.val;
                  if(dp.id === idOptischerTFK3) tfk3 = dp.state.val;
                  Briefkasten();
              });
              
              
              1 Reply Last reply Reply Quote 0
              • P
                pix last edited by

                Hallo Paul,

                danke für dein Skript. Natürlich kann man die Erkennung des Status in eine extra Funktion packen.

                Die Verzögerung ist nötig, denn die Sensoren lösen im Fall, dass vor allen ein Brief liegt, nacheinander aus. Der erste nach 1s, der zweite nach 2s, der dritte nach 3s. Daher warte ich 3.5s und lesen dann den Status von allen dreien ein. Schließlich hüpfen die Brief auch nicht so schnell wieder raus :lol:

                Wenn der Bote eine größere Zeitung einsteckt, wird nur der obere Sensor (TFK1) ausgelöst. Beim kleinen Karten evtl. nur der linke untere oder der rechte untere (2 und 3).

                Gruß

                Pix

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

                Support us

                ioBroker
                Community Adapters
                Donate

                794
                Online

                31.7k
                Users

                79.8k
                Topics

                1.3m
                Posts

                4
                6
                809
                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