NEWS
EspHome und Espresence - Sensoren und Anwesenheitserkennung
-
Hey ich habe aktuell 8X ESP32 D1 Mini mit denen ich meine Xiaomi Sensoren tracke was Temperatur, Luftfeuchtigkeit etc. angeht. Ich nutze dafür ESPHome.
Ich möchte die gleichen D1 Mini nun ebenfalls für die Anwesenheitserkennung nutzen. Dafür ist ja ESPresence eigentlich gedacht. Möchte aber nicht noch 8x weitere ESPs in den Räumen verteilen.
Ist es nicht irgendwie möglich beides zusammen zu bekommen mit ESPHome in ioBroker? Und nein Shellys möchte ich keine einbauen.
Gerne möchte ich meine Amazfit GTR 4 als Anwesenheitsgerät verwenden und kein MiBand 4 oder 5.
VG und danke vorab
-
@sushibomba Kurze Grätsche, hast du die Frage auch bei Daniel (smarthome...) auf YT gestellt?
Dann antworte ich dir hier lieber als dort, denn YT ist da wenig anwenderfreundlichFalls ja, ich bin der der dort auch geantwortet hat
YAML (einfach einen weiteren Eintrag bei "sensor"):
sensor: # RSSI based on MAC address - platform: ble_rssi mac_address: 11:22:33:AA:BB:FF name: "Amazfit Signal Schlafzimmer"
dann bekommst du automatisch einen neuen Datenpunkt mit der RSSI.
-
Ja genau der bin ich dort gewesen
Vielen Dank. Bekomme es nur mit der min_rssi nicht hin. er will es einfach nicht akzeptieren.
Scheint wohl an der alten esphome version in iorboker zu liegen -
@sushibomba
YT ist da ein "Gewürge". Nicht immer bekomme ich auch eine Nachricht, dann war 2x meine Antwort weg (ist mir beim ersten mal erst Aufgrund deiner Nachricht/Nachfrage aufgefallen, beim zweiten mal direkt einen Refresh der Seite gemacht, Antwort weg...)Bekommst du beim kompilieren eine Fehlermeldung oder geht "es einfach nicht"?
Die RSSI bekommst du aber nun korrekt? Dann müsste man notfalls per Blocky/Trigger aktiv werden.Ich kann es aktuell leider selbst nicht testen. Notnagel wäre noch eine Lambda-Funktion: Falls RSSI > xx dann...
-
Ja da gebe ich dir recht. ist hier deutlich angenehmer
Was ist denn eine Lambda Funktion?
Ja genau RSSI klappt. Bei min_rssi kommt en Fehlermeldung.```YAML [min_rssi] is an invalid option for [binary_sensor.ble_presence]. Did you mean [on_press]? min_rssi: -80 binary_sensor.ble_presence: [source /opt/iobroker/iobroker-data/esphome.0/esphome-web-esp32-1.yaml:82] platform: ble_presence mac_address: C7:B9:89:5E:0C:97 name: Amazfit GTR2e im Esszimmer [min_rssi] is an invalid option for [binary_sensor.ble_presence]. Did you mean [on_press]? min_rssi: -80
Aktuell baue ich gerade mein Blockly.
Sieht zur Zeit so aus (siehe unten)
Was merkwürdig ist. Wenn ich im Wohnzimmer bin, die rssi bei -90dBm ist er mir aber manchmal im Wechsel anzeigt das ich auch im Kinderzimmer bin obwohl der Wert deutlich über -80dBm ist.Ne Ahnung wieso?
<block xmlns="https://developers.google.com/blockly/xml" type="schedule" id="3mx;*!J{fY;/3RR]fVTy" disabled="true" x="187" y="138"> <field name="SCHEDULE">{"time":{"start":"00:00","end":"23:59","mode":"minutes","interval":1},"period":{"days":1}}</field> <statement name="STATEMENT"> <block type="comment" id="{f%9td;bzlY|AdF[fCi7"> <field name="COMMENT">Anwesenheit Wohnzimmer GTR4</field> <next> <block type="controls_if" id="P`tbhh}7ZdOz*K*}JdWQ"> <value name="IF0"> <block type="logic_compare" id="n{d~uc5YlLRI8nl6tHnl"> <field name="OP">LTE</field> <value name="A"> <block type="get_value" id="0ng=WB[LlVvqEhAaL}:6"> <field name="ATTR">val</field> <field name="OID">alias.0.Räume.Wohnzimmer.Sensoren.Anwesenheit.Amazfit GTR4 Wohnzimmer.Amazfit_GTR4_Signal_Wohnzimmer</field> </block> </value> <value name="B"> <block type="math_number" id="lZ~ERKK6]e;vhd2y@GK^"> <field name="NUM">-90</field> </block> </value> </block> </value> <statement name="DO0"> <block type="debug" id="iVyLYk~I{OF8,v!,]yeO"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="(ixOp@Mwy%?DwvUlkJ*z"> <field name="TEXT">GTR4 im WZ</field> </shadow> </value> <next> <block type="update" id="KEj%0,{k(Uo^?7A}[uwM"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.Anwesenheit.Amazfit_GTR4_im_Wohnzimmer</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id=":E3@wkg+/wc}b/9R/{9v"> <field name="BOOL">TRUE</field> </block> </value> <next> <block type="update" id="x_V@s+v$?5?qtU#o~,c|"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.Anwesenheit.Amazfit_GTR4_letzter_Aufenthalt</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="text" id="jtd$*uZ(tW(G}H?`{IQ!"> <field name="TEXT">Wohnzimmer</field> </block> </value> </block> </next> </block> </next> </block> </statement> <next> <block type="controls_if" id="g95P%ML^C!(X-p8?@Ibn"> <value name="IF0"> <block type="logic_compare" id="R2h{L(jLEA%Y53W!z1BB"> <field name="OP">LT</field> <value name="A"> <block type="get_value" id="iKpXOcL;6gBjR8:7E)Wc"> <field name="ATTR">ts</field> <field name="OID">alias.0.Räume.Wohnzimmer.Sensoren.Anwesenheit.Amazfit GTR4 Wohnzimmer.Amazfit_GTR4_Signal_Wohnzimmer</field> </block> </value> <value name="B"> <block type="math_arithmetic" id="|:lCTJcY(]{xdizaIL3t"> <field name="OP">MINUS</field> <value name="A"> <shadow type="math_number" id="8/)R]t|z5Vd7@i_3w]+I"> <field name="NUM">1</field> </shadow> <block type="time_get" id="w#g7WkL48((+/Ev-7a!k"> <mutation xmlns="http://www.w3.org/1999/xhtml" format="false" language="false"></mutation> <field name="OPTION">object</field> </block> </value> <value name="B"> <shadow type="math_number" id="qkD$/1Gc)_Tt-hLHt?lG"> <field name="NUM">1</field> </shadow> <block type="math_number" id="~RIcg6QEaGZXl:!Qjaqb"> <field name="NUM">30000</field> </block> </value> </block> </value> </block> </value> <statement name="DO0"> <block type="debug" id="eH)xiG8UdER5EA32BkIp"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="vfFo[GHzVrl$E$mgPuOp"> <field name="TEXT">GTR4 nicht mehr im WZ</field> </shadow> </value> <next> <block type="update" id="pr6#Q~lZ5Cbj{!=qE3S!"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.Anwesenheit.Amazfit_GTR4_im_Wohnzimmer</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="qiGQh)7Ne$zs7^)?TKZ;"> <field name="BOOL">FALSE</field> </block> </value> </block> </next> </block> </statement> <next> <block type="comment" id="HO;2.mi0^O3^oM35_GdN"> <field name="COMMENT">Anwesenheit Wohnzimmer GTR2e</field> <next> <block type="controls_if" id="Nr@TZ$Y%xZMS1EqlSL}7"> <value name="IF0"> <block type="logic_compare" id="CjzC`dIC|Fv!b_/}Fx4x"> <field name="OP">LTE</field> <value name="A"> <block type="get_value" id="+lUv(c,=1b_jZ5/)4}t@"> <field name="ATTR">val</field> <field name="OID">alias.0.Räume.Wohnzimmer.Sensoren.Anwesenheit.Amazfit GTR2e Wohnzimmer.Amazfit_GTR2e_Signal_Wohnzimmer</field> </block> </value> <value name="B"> <block type="math_number" id="gR}(R[//OR[1K_IaN_Bo"> <field name="NUM">-90</field> </block> </value> </block> </value> <statement name="DO0"> <block type="debug" id="kjiw+K@C`Gy]dNrZ;xQc"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="7*9N-lCOh]r-_!k}q0eZ"> <field name="TEXT">GTR2e im WZ</field> </shadow> </value> <next> <block type="update" id="#VPmVf*1LU1Y%,={#G~T"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.Anwesenheit.Amazfit_GTR2e_im_Wohnzimmer</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="+[Z{noT1qFw(DZ(V`uhb"> <field name="BOOL">TRUE</field> </block> </value> <next> <block type="update" id="XfSmeGn(|*@cD2uT?3Fg"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.Anwesenheit.Amazfit_GTR2e_letzter_Aufenthalt</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="text" id="SemBSUZ@V$|7XC@}kW8Z"> <field name="TEXT">Wohnzimmer</field> </block> </value> </block> </next> </block> </next> </block> </statement> <next> <block type="controls_if" id="lk#hdcD_88G=Vx#r.KLQ"> <value name="IF0"> <block type="logic_compare" id="=^K2LwXx+9RNWcVOGbgm"> <field name="OP">LT</field> <value name="A"> <block type="get_value" id="SL2[^rhc;GhaZaGNUTKO"> <field name="ATTR">ts</field> <field name="OID">alias.0.Räume.Wohnzimmer.Sensoren.Anwesenheit.Amazfit GTR2e Wohnzimmer.Amazfit_GTR2e_Signal_Wohnzimmer</field> </block> </value> <value name="B"> <block type="math_arithmetic" id="I5Gci};_V(%3~}],OwA#"> <field name="OP">MINUS</field> <value name="A"> <shadow type="math_number"> <field name="NUM">1</field> </shadow> <block type="time_get" id="6}CRjP!+66Gi(9f6-])7"> <mutation xmlns="http://www.w3.org/1999/xhtml" format="false" language="false"></mutation> <field name="OPTION">object</field> </block> </value> <value name="B"> <shadow type="math_number"> <field name="NUM">1</field> </shadow> <block type="math_number" id="(fdIY};d*hR=|6g$I}=="> <field name="NUM">30000</field> </block> </value> </block> </value> </block> </value> <statement name="DO0"> <block type="debug" id="I}YnN.g43+Q;lk{cy`s#"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="XZ/o-Hqpt|cGBBn^6xuE"> <field name="TEXT">GTR2e nicht mehr im WZ</field> </shadow> </value> <next> <block type="update" id="^+`pvv/b~#XIVO%bZD1b"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.Anwesenheit.Amazfit_GTR2e_im_Wohnzimmer</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="LJ1hp`v:Ai^w-X[/}L)B"> <field name="BOOL">FALSE</field> </block> </value> </block> </next> </block> </statement> </block> </next> </block> </next> </block> </next> </block> </next> </block> </next> </block> </statement> </block>
-
Und was ich auch nicht verstehe ist, warum der ESP im Kinderzimmer viel häufiger das Signal aktualisiert als im WZ. Siehe log vom Blockly:
08:17:15.386 info javascript.0 (368) script.js.Überwachung.Anwesenheit.Anwesenheit_Smartwaches_Raeume: GTR4 im KZ 08:17:16.209 info javascript.0 (368) script.js.Überwachung.Anwesenheit.Anwesenheit_Smartwaches_Raeume: -82 08:17:49.545 info javascript.0 (368) script.js.Überwachung.Anwesenheit.Anwesenheit_Smartwaches_Raeume: GTR4 im SZ 08:17:59.215 info javascript.0 (368) script.js.Überwachung.Anwesenheit.Anwesenheit_Smartwaches_Raeume: GTR2e im KZ 08:18:01.774 info javascript.0 (368) script.js.Überwachung.Anwesenheit.Anwesenheit_Smartwaches_Raeume: GTR2e im KZ 08:18:11.327 info javascript.0 (368) script.js.Überwachung.Anwesenheit.Anwesenheit_Smartwaches_Raeume: GTR2e im KZ 08:18:41.099 info javascript.0 (368) script.js.Überwachung.Anwesenheit.Anwesenheit_Smartwaches_Raeume: GTR2e im KZ 08:18:47.172 info javascript.0 (368) script.js.Überwachung.Anwesenheit.Anwesenheit_Smartwaches_Raeume: GTR2e im KZ
Zu dem Zeitpunkt bin ich gerade im WZ und meine Lebensgefährtin im Kinderzimmer.
-
@sushibomba sagte in EspHome und Espresence - Sensoren und Anwesenheitserkennung:
Was ist denn eine Lambda Funktion?
Damit wird der µC direkt programmiert. ESPHome stellt für alle Funktionen Bibliotheken bereit, aber hinter bspw. einem "Sensor" muss ja eine gewisse Logik stecken. Sagen wir mal der Temperatursensor stellt einen Messwert in °C oder alternativ in °F dar, du willst es jetzt aber partout in °K haben, dann sagst du mit der Lambda-Funktion nimm den Messwert und multipliziere/teile/addiere oder was auch immer und gib dieses Ergebnis zurück.
Der Rest dürfte sich dann mittels ESPresense ja erledigt haben
-
Ok verstehe. Und wie bekomme ich jetzt wie beim ESPHome die Datenpunkte aus der JSON des jeweiligen Thermoters als neuen Datenpunkt ohne dafür jeweil ein Blockly Script zu schreiben?
Also vorher stand es ja so in ESPHome und er hat mir unter dem ESP dann die Datenpunkte automatisch geschrieben.
### Esszimmer sensor: - platform: atc_mithermometer mac_address: "A4:C1:38:1B:03:F5" temperature: name: "Esszimmer Temperature" humidity: name: "Esszimmer Humidity" battery_level: name: "Esszimmer Battery-Level" battery_voltage: name: "Esszimmer Battery-Voltage" signal_strength: name: "Esszimmer Bluetooth Signal"
Unter ESPresense habe ich nur noch einen Json Datenwert pro Temp und Humidity Sensor der so aussieht.
{ "id": "miTherm:a4c138f3a385", "idType": 110, "rssi@1m": -71, "rssi": -99, "raw": 6.31, "distance": 6.21, "speed": 0, "mac": "a4c138f3a385", "interval": 18341, "mV": 2558, "batt": 36, "temp": 22.9, "rh": 68 }
bzw. so:
{"id":"miTherm:a4c138f3a385","idType":110,"rssi@1m":-71,"rssi":-99,"raw":6.31,"distance":6.21,"speed":0.00,"mac":"a4c138f3a385","interval":18341,"mV":2558,"batt":36,"temp":22.9,"rh":68.0}
Und noch ne Frage. Habe jetzt verschiedene Datenpunkt für die Räume angelegt. Einmal ob die Uhr von mir oder meiner Frau im jeweiligen Raum ist und wie weit sie entfernt ist. Wie müsste ein Blockly aussehen was alle diese Datenpunkte auswertet und mir dann als Wert den letzten Aufenthaltsraum raus gibt?
-
@sushibomba sagte in EspHome und Espresence - Sensoren und Anwesenheitserkennung:
Thermoters als neuen Datenpunkt ohne dafür jeweil ein Blockly Script zu schreiben?
Kurz und schmerzlos: gar nicht
Sie bieten dir nur das JSON an. Somit musst du damit leben, einen Feature Request stellen oder eine andere Lösung suchen (zB. mittels 2x ESP pro Raum...). ESPresense ist halt in HA einfach besser integriert als im ioB.
Mittels eines "Selectors" kann man über mehrere Datenpunkte iterieren. Da muss ich aus Zeitgründen aber passen.
-
Ok schade. Aber trotzdem herzlichen Dank für deine Hilfe bis hier hin.
An die anderen hier im Forum...
Wie müsste ein Blockly aussehen?
Ich stelle es mir folgendermaßen vor:
-
Prüfe alle Räume auf die Anwesenheit von den Uhren GTR2e & GTR4 auf "true"
-
Prüfe welcher Datenpunkt zuletzt auf "true" gesetzt wurde
-
Prüfe ob Distanz von allen Räumen die kleinste ist und schreibe diesen Raum jeweils in einen neuen Datenpunkt (0_userdata.0.Anwesenheit.Amazfit_GTR2e_letzter_Aufenthalt) & (0_userdata.0.Anwesenheit.Amazfit_GTR4_letzter_Aufenthalt)
-
Falls letzter Aufenthaltsraum wurde länger als X Tage nicht aktualisiert, schreibe in Datenpunkt.XY das Smartwatch GTR2e oder GTR4 "Ausgeschaltet oder Akku leer"
Ich hoffe es kann mir wer helfen
Wenn noch jemand Optimierungen hat oder nützliche Abfragen vorschlagen kann über die ich aktuell nicht nachgedacht habe dann gerne her damit
-