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. [gelöst]Briefkasten Abfrage Code vereinfachen

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    2.8k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.1k

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.4k

[gelöst]Briefkasten Abfrage Code vereinfachen

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
6 Beiträge 4 Kommentatoren 1.0k Aufrufe
  • Ä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.
  • P Offline
    P Offline
    pix
    schrieb am zuletzt editiert von
    #1

    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 :D

    Gruß

    Pix

    ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

    1 Antwort Letzte Antwort
    0
    • DutchmanD Offline
      DutchmanD Offline
      Dutchman
      Developer Most Active Administrators
      schrieb am zuletzt editiert von
      #2

      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 Antwort Letzte Antwort
      0
      • P Offline
        P Offline
        pix
        schrieb am zuletzt editiert von
        #3

        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

        ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

        1 Antwort Letzte Antwort
        0
        • AlCalzoneA Offline
          AlCalzoneA Offline
          AlCalzone
          Developer
          schrieb am zuletzt editiert von
          #4

          @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).

          Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

          1 Antwort Letzte Antwort
          0
          • paul53P Offline
            paul53P Offline
            paul53
            schrieb am zuletzt editiert von
            #5

            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();
            });
            
            

            Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
            Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

            1 Antwort Letzte Antwort
            0
            • P Offline
              P Offline
              pix
              schrieb am zuletzt editiert von
              #6

              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

              ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

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


              Support us

              ioBroker
              Community Adapters
              Donate

              677

              Online

              32.6k

              Benutzer

              82.3k

              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