NEWS
G-Tag, IBeacon, Anwesenheitserkennung
-
@haselchen upps, dachte das sei selbsterklärend. Für gtag und bwm existieren je ein trigger welche eine variable auf true setzen, allerdings nur für 30Sekunden. Dann wird die Routine LichtAnAus aufgerufen welche prüft ob beide wahr sind und die Zeit stimmt und dann das Licht einschaltet. Nach 180 Sekunden wird es dann wieder ausgeschaltet. Mit den Zeiten kannste ja spielen. Die 30 Sekunden habe ich von den 26 Sek. abgeleitet die es gebraucht hat bis nach dem gtag auch der bwm ausgelöst hat
Edit: Die beiden Steuere links braucht es nicht, war noch ein Überbleibsel vom Testen!
Edit2:. Falls gtag und /oder bwm schon früher von selbst auf false gehen, müsste man statt setze auf Wert halt setze auf Wahr nehmen -
Oooook....mal überlegen.
Also, den 2.rechten steuere Block kann ich auch löschen oder?
Das Licht soll anbleiben. Ich hab nen Taster im HWR. Dort würde dann das Licht ausgeschaltet werden.Was ist wenn das Blockly prüft ob beide Datenpunkte wahr sind und der BWM schon wieder auf false schaltet während der GTag noch auf wahr ist?
Edit:
Lach, 2 Dumme 1 GedankeEdit 2:
Das mit true und false bei den beiden Geräten genau hinzubekommen , ist natürlich grosser Sport.
Da kommt es auf den Winkel an, in dem der BWM anspringt , wenn wir vorbeifahren.
Dein Blockly ist schonmal genial. Ich befürchte aber, dass es mal auslösen wird und mal nicht. -
@haselchen Ja klar, wenn nicht ausgeschaltet werden soll kann der weg. Oder den Timeout auf 10Minuten setzen falls der Taster nicht gedrückt wird Den Trigger für den BWM könnte man auch noch auf Größer als stellen, dann löst er nur aus bei Bewegung, nicht wenn er abfällt. Beim Gtag weiss ich nicht ob und wann der abfällt. Falls ja auch auf Größer als stellen
-
Der BWM wird nach 15sek zurückgesetzt nach Bewegungserkennung.
Der Gtag bleibt auf true solange er in der Umgebung vom Haus ist.Problem ist halt, wann der BWM auslöst.
Kommt auf den Vorbeifahrwinkel an.
Demnach kann eben erst der Gtag auf true gehen oder eben der BWM.
Verzwickter Mist. -
@haselchen dann setze nur den bwm auf größer als. Wenn der gtag aber immer auf true ist solange du zuhause bist dann wird der bwm zum point of failure wenn da ne Katze lang läuft. Aber teste doch erstmal so. Man könnte auch noch einen timeout einbauen dass das Licht erst nach einmal abfallen des gtag wieder angehen darf. Erstmal so testen
-
Deswegen hatte ich den GTag als Trigger.
Der Wert ändert sich 1mal auf true sobald er in Hausnähe kommt.
Da kann danach der BWM so oft auslösen wie er will, hat keinen Einfluss. -
@haselchen mit einem zweiten Trigger auf den HM BWM müsste es gehen. Ich würde zusätzlich als Bedingung reinnehmen, dass das Licht auch aus ist um den Funktraffic zu minimieren (Licht muss ja nicht angeschaltet werden, wenn es schon an ist).
-
Viele Wege führen nach Rom ...
Ich habe das Ganze für das Ein- und Ausschalten der HMIP Alarmfunktion mit den GTags und dem BLE- Adapter gemacht.
Der BLE Adapter schreibt alle paar Sekunden die Signalstärke der GTags in einen State pro GTAG.
Jedes mal, wenn die Signalstärke geschrieben wird, dann setzte ich eine Variable auf TRUE, das der entsprechende GTag da ist.
Nur wenn die Variable auf TRUE geändert wird, dann deaktiviere ich die Alarmanlage. Im Fall hier könnte dann das Licht im Carport eingeschaltet werden.
Auf FALSE wird die Variable gesetzt, wenn der Zeitstempel der letzten Änderung der Signalstärke > 60 Sekunden ist. Und nur bei der Änderung der Variable auf FALSE wird die Alarmanlage aktiviert.
Gruß,
Moses123 -
@Maik-0
Ich versuche auch gerade meine Anwesenheitserkennung mit Esp32 und Beacon zu basteln.
Ich hab nur ständige Verbindungsabbrüche des ESP32 zum WLan, und sonstige problemchen.
Wobei du mir aber helfen könntest:
Du bekommst einen RSSI Wert vom ESPHome-Adapter ist das richtig?
Ich mache es jedenfalls so, nur wenn ich den Trigger "falls rssi wurde aktualisiert" benutze und die beacon sind nicht erreichbar, wird der rssi nicht mehr aktualisiert.
Ich habe die absolut wahnsinnige Zauberei um es halbwegs zuverlässig zu erfassen:<block xmlns="https://developers.google.com/blockly/xml" type="on_ext" id="rGM/6a0x(,3^[f[%$e=." x="513" y="-437"> <mutation xmlns="http://www.w3.org/1999/xhtml" items="1"></mutation> <field name="CONDITION">any</field> <field name="ACK_CONDITION"></field> <value name="OID0"> <shadow type="field_oid" id="Ke)Im[.t$Xcb$/||[XsD"> <field name="oid">esphome.0.A848FA9B5288.Sensor.3257868514.state</field> </shadow> </value> <statement name="STATEMENT"> <block type="timeouts_setinterval" id=",x_Wi31gf8)n(%qaO8ki"> <field name="NAME">Intervall</field> <field name="INTERVAL">4</field> <field name="UNIT">sec</field> <statement name="STATEMENT"> <block type="update" id="@n}$bxzS:xt}=0e8Ge7p"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="true"></mutation> <field name="OID">0_userdata.0.Anwesenheit.Pnutrssi</field> <field name="WITH_DELAY">TRUE</field> <field name="DELAY_MS">8</field> <field name="UNIT">sec</field> <field name="CLEAR_RUNNING">FALSE</field> <value name="VALUE"> <block type="get_value" id="+R*fQ.`WM?fu3@Q_:Kgs"> <field name="ATTR">val</field> <field name="OID">esphome.0.A848FA9B5288.Sensor.3257868514.state</field> </block> </value> </block> </statement> <next> <block type="controls_if" id="^H%xiJnQ{#f;h53W.2,G"> <mutation else="1"></mutation> <value name="IF0"> <block type="logic_compare" id="QnVmO-JQvSY5AC1,j]-."> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id="NaV%!cuNA1!4Xs]J$Jxc"> <field name="ATTR">val</field> <field name="OID">0_userdata.0.Anwesenheit.Pnutrssi</field> </block> </value> <value name="B"> <block type="logic_operation" id="De1sb$x$:gWSRH9H=.fN"> <field name="OP">OR</field> <value name="A"> <block type="get_value" id="Q{@RL-*lP%*]ij2j}#6H"> <field name="ATTR">val</field> <field name="OID">esphome.0.A848FA9B5288.Sensor.3257868514.state</field> </block> </value> <value name="B"> <block type="logic_null" id="%9{t2tsMkc`{~0kgjhID"></block> </value> </block> </value> </block> </value> <statement name="DO0"> <block type="math_change" id="oZ?mPBj.Rv*VeHctx#,T"> <field name="VAR" id="@nWK-It]VKg2b:$$U)ww">awayCountP</field> <value name="DELTA"> <shadow type="math_number" id="7!07YDKL7.2yTT[S6Xl]"> <field name="NUM">1</field> </shadow> </value> <next> <block type="variables_set" id="pXe:WH+5wUmtMt68747N"> <field name="VAR" id="mjIE{DMAN;i0MY~~*3zj">presentCountP</field> <value name="VALUE"> <block type="math_number" id="pzx~p.=w?G%l$.?OVGX#"> <field name="NUM">0</field> </block> </value> <next> <block type="debug" id="d2ue#BIG[QLu9#JG#,at"> <field name="Severity">debug</field> <value name="TEXT"> <shadow type="text"> <field name="TEXT">test</field> </shadow> <block type="text_join" id="Gf6zNnnr~j#FsWO/s:_a"> <mutation items="3"></mutation> <value name="ADD0"> <block type="text" id="*|7au5VmBygvu[v?WU{2"> <field name="TEXT">awayCount:</field> </block> </value> <value name="ADD1"> <block type="variables_get" id="dG7Tipl~/@R}GzQ8sKlF"> <field name="VAR" id="@nWK-It]VKg2b:$$U)ww">awayCountP</field> </block> </value> <value name="ADD2"> <block type="get_value" id="l0n^o^!0I0oRkL.l0(Bk"> <field name="ATTR">val</field> <field name="OID">0_userdata.0.Anwesenheit.Pnutrssi</field> </block> </value> </block> </value> </block> </next> </block> </next> </block> </statement> <statement name="ELSE"> <block type="math_change" id="J#-HL,WRdHR/1xbv,gI."> <field name="VAR" id="mjIE{DMAN;i0MY~~*3zj">presentCountP</field> <value name="DELTA"> <shadow type="math_number" id="dit@K0Wk;EE=K#$z]x$e"> <field name="NUM">1</field> </shadow> </value> <next> <block type="variables_set" id="E4eHQdX,._YGqR1|.O-1"> <field name="VAR" id="@nWK-It]VKg2b:$$U)ww">awayCountP</field> <value name="VALUE"> <block type="math_number" id="][%p#n_BZ82Z{p$-8^K("> <field name="NUM">0</field> </block> </value> <next> <block type="debug" id="b,`r91eD(%8DNTaC;l=."> <field name="Severity">debug</field> <value name="TEXT"> <shadow type="text"> <field name="TEXT">test</field> </shadow> <block type="text_join" id="^w-9%o)0a^{-%e_8P:0x"> <mutation items="2"></mutation> <value name="ADD0"> <block type="text" id="n..iEeaG+.h}[j-XEtJw"> <field name="TEXT">presentCount:</field> </block> </value> <value name="ADD1"> <block type="variables_get" id="deEHCo`E).s.!Bck^r35"> <field name="VAR" id="mjIE{DMAN;i0MY~~*3zj">presentCountP</field> </block> </value> </block> </value> </block> </next> </block> </next> </block> </statement> <next> <block type="controls_if" id="@crrhoDO#B=iavWIG3+I"> <value name="IF0"> <block type="logic_compare" id="pM7-++%2(DwKnm[p`4E~"> <field name="OP">EQ</field> <value name="A"> <block type="variables_get" id="5QHo#rswQab_`pZ%x8U5"> <field name="VAR" id="@nWK-It]VKg2b:$$U)ww">awayCountP</field> </block> </value> <value name="B"> <block type="math_number" id="%Ao_A}Yi(a$:F;Nigg3H"> <field name="NUM">10</field> </block> </value> </block> </value> <statement name="DO0"> <block type="control" id="z2sp:nmr12kP3*rqh3~n"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.Anwesenheit.Patrick_anweseheit</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="H`##WiJF`MjC.GZUbZ@B"> <field name="BOOL">FALSE</field> </block> </value> <next> <block type="variables_set" id="=/ZWrT1D=RcjUWJOrBi4"> <field name="VAR" id="@nWK-It]VKg2b:$$U)ww">awayCountP</field> <value name="VALUE"> <block type="math_number" id="ks_;K}^:8o5HonxvUl9S"> <field name="NUM">0</field> </block> </value> </block> </next> </block> </statement> <next> <block type="controls_if" id="sl2;W5?aG:?h.=JPUL1/"> <value name="IF0"> <block type="logic_compare" id="MN(/Mj`S`r*hfFo6J11+"> <field name="OP">EQ</field> <value name="A"> <block type="variables_get" id="z|tjgy?uYXO8(rFVSdFZ"> <field name="VAR" id="mjIE{DMAN;i0MY~~*3zj">presentCountP</field> </block> </value> <value name="B"> <block type="math_number" id="|:B6J+V,5/E-,lS)~FhQ"> <field name="NUM">4</field> </block> </value> </block> </value> <statement name="DO0"> <block type="control" id="1Zf|bgBtg[EQ;VLMktA?"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.Anwesenheit.Patrick_anweseheit</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="RK66d3=~rHgwKW2DG|S5"> <field name="BOOL">TRUE</field> </block> </value> <next> <block type="variables_set" id="_(1g.LSHR+!M92BMy[V)"> <field name="VAR" id="mjIE{DMAN;i0MY~~*3zj">presentCountP</field> <value name="VALUE"> <block type="math_number" id="Nv|B-hM3oZuo_:ryL[F:"> <field name="NUM">0</field> </block> </value> </block> </next> </block> </statement> </block> </next> </block> </next> </block> </next> </block> </statement> </block>
Ich glaube nicht das das wirklich schlau von mir ist, aber.. na ja.
Mein ESPHome Yaml sieht so aus:esphome: name: esp32presence platform: ESP32 board: esp32dev # Enable logging logger: # Enable Home Assistant API api: ota: wifi: ssid: "DieSSID" password: "passwort" power_save_mode: LIGHT manual_ip: static_ip: 192.10.10.10 gateway: 192.10.10.11 subnet: 255.255.255.0 ap: ssid: "Esp32presence Fallback Hotspot" password: "passwort" captive_portal: esp32_ble_tracker: scan_parameters: window: 300ms sensor: - platform: ble_rssi mac_address: DF:AA:CA:AA:BB:CC name: "PatrickNut" - platform: ble_rssi mac_address: 66:CC:DD:FF:57:D7 name: "NicoleNut"
Könntest du mir vielleicht mit deinen Scripten weiterhelfen wenn du was funktionierendes hast?
Gruß
Patrick -
@marsmännchen
Ja richtig, ich mache das über den rssi Wert. Bei Aktualisierung wird ein Timeout gestoppt und neu gestartet.
Wenn der rssi Wert nicht mehr aktualisiert wird, läuft er in den Timeout.
Ein passendes Script habe ich doch schon gepostet. -
@maik-0
Ah ich glaube jetzt verstehe ich erst die Logik von deinem Script. Gerade weil es nicht mehr aktualisiert wird, wird auf abwesend geschaltet. -
@marsmännchen
Genau, wenn der Wert 60 Sekunden nicht mehr aktualisiert wird, schaltet es auf Abwesenheit. Kann sein, das 60 Sekunden etwas knapp ist. Musst du vieleicht etwas höher setzen. -
@maik-0
Is natürlich die schönere Lösung als meine hilflose Zauberei.
Werd das gleich mal abpausen. Vielen Dank -
@Maik-0
Sorry will nicht nerven, aber:
Wenn ich, wie gerade eben, nicht anwesend bin, dann wird der Baustein ja nicht aktualisiert.
Wenn der Baustein nicht aktualisiert wird, schaltet die untere "falls-mache ->auf abwesend" überhaupt?Ab wann wird eigentlich aktualisiert?
Hintergrund ist nämlich das mein Status sich ändert obwohl nicht daheim, und "RSSI (null)db" ist.
Vielleicht hast du in der Yaml vom ESP32 was besseres stehen?Wie kann DAS sein?
im debug-log bekomme ich die Variable (roter Kreis) mit "false"
Und bei den Objekten schaltet der Datenpunkt (blauer Kreis) auf "true"!
Wo hab ich da was übersehen..... mal wieder.
Ich vermute weil der ESP32 auch meine Abwesenheit in form von "NaN" sendet.
Ok.bin scheinbar schon zu blöd zum abschauen... Erinnert mich an meine Schulzeit.
Hab glatt was vergessenGut, jetzt hab ich auch rausgefunden womit es zu tun hat.
Wenn der ble_tracker vom ESP32[16:35:10][D][sensor:113]: 'PatrickNut': Sending state nan dB with 0 decimals of accuracy
Sendet, wird logischerweise aktualisiert, und ich bin anwesend.
-
@marsmännchen
Unschön ist natürlich wenn das Script zum ersten Mal gestartet während du nicht zu hause bist, passiert nichts. Bis zum ersten Kontakt zum Beacon.
Dann würde ja beim weggehen der Timeout greifen.
Wenn sich aber dein Status ändert während du abwesend bist,
müsste ja auch ohne Kontakt zum Beacon der rssi Wert aktualisiert werden.
Das ist bei mir nicht der Fall. Etwas merkwürdig.
Alternativ wäre auch es auch noch möglich das über den ESPHome Presence Melder zu machen.
https://www.esphome.io/components/binary_sensor/ble_presence.html -
@maik-0
Ja, is scheinbar wirklich so, das er trotzdem ab und zu "state nan" sendet.
ich versuche das mit:Solch einem Konstrukt zu verhindern. mal sehn was passiert.
Sonst versuche ich mal ble_presence -
@marsmännchen
Du solltest aber den „stop timeout“ noch verschieben. Als ersten Befehl in
deine eingefügte if-Abfrage. Sonst stoppt er auch den timeout auch wenn
„state nan“ kommt. -
Hi
bin aktuell auf der Suche nach einer besseren Anwesenheitserkennung da die Smartphones (Android) über Wlan und TR064 teilweise erst nach >10Minuten erkannt werden, da die Geräte sich erst dann einloggen. Das ist für mich keine gute Lösung.Ihr habt jetzt viel mit den G-Tags getestet. Seit ihr damit zufrieden?
Bei der Lösung stelle ich mir andauernd die Frage ob man dies nicht über das Handy lösen kann (Bluetooth BLE)? Im Zug von Corona App etc. ist diese Funktion der Smartphones sehr aktuell und senden die nicht auch dauernd ohne Energiesparmodus Signale über BLE um sich zu erkennen zu geben?
-
@dieter_p Also wie du eine Unterhaltung weiter oben sehen kannst habe ich jetzt am Schlüsselbund einen beacon(heisst nut beacon) und in der Nähe der eingangstüre einen esp32 mit externer Antenne. Ich muss sagen das ist für mich die optimale Lösung. Erkennt zuverlässig und schnell. Soweit meine Erfahrung.
-
@marsmännchen
Danke fürs Feedback. Habe hier jetzt auch ein paar Beacons bestellt und einen ESP32. Damit wollte ich mal testen. Falls ich es noch sinnvoll schaffe die Smartphones auch mit zu scannen, kann eine redundante Lösung ja nicht schaden.Welche Software verwendest Du auf dem ESP32? Ich finde sehr viele Skripte und Github-Code. Bin da nicht so ein großer Freund und würde lieber eine ständig gepflegte Lösung verwenden. Glaube gelesen zu haben, dass Tasmota für diesen Zweck auch möglich ist?
Welche Reichweiten schaffst Du bei Dir um die Beacons zu erkennen und welche maximale Zeitverzögerung hast Du um gesichert Anwesenheit erkennen zu können?
Dein blockly oben deutet auf 60 Sekunden hin.
Würde ungern den Alarm der Alarmanlage noch länger verzögern.