NEWS
[gelöst]Briefkasten Abfrage Code vereinfachen
-
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
-
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) { });
-
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
-
@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).
-
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(); });
-
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