Usar um porta chaves BT para sensor de presença

image

Olá,
Este post é para partilhar algo que pode ser interessante para ti , caso queiras usar junto da tua chave de casa um pequeno porta chaves (Bluetooth).
Basicamente para que isto funciona com o teu Home Assistant , precisas de duas coisas.

De um esp32 e de uma tag ble.

image

image

:warning: A(s) tags BLE podes comprar no alixpress,bangood ou outra loja que sejas cliente, toma atenção para comprares um modelo muito semelhante a esse (branco) que está na imagem, pois existe alguns no mercado que não funcionam correctamente.
Deixo aqui o link onde comprei os meus.

O Esp32 é o que irá servir de HUB basicamente o principio de funcionamento é muito idêntico a este post, o ESP32 vai ser o responsável para fazer scans de 60 em 60seg, ao qual vai detectar o RSSI dos BLE… Ao detectar terás a informação da força do sinal da Tag, caso não detecte irá dar a mensagem de desconhecido e é com esta informação que vamos saber se a Tag BLE está em casa ou não.

Caso já tenhas contigo ambos os devices, terás que usar o addon Esphome para criares o teu firmware:





Clicas em Submit


Agora clica em EDIT apaga tudo o que lá está e cola o seguinte código:

esphome:
  name: esp32_ble_tracker
  platform: ESP32
  board: mhetesp32devkit
  
wifi:
  ssid: 'nome_da_tua_rede_wifi'
  password: 'pass_da_tua_rede_wifi'
  manual_ip:
    static_ip: ip_do_teu_esp32
    gateway: ip_do_gateway_do_teu_router
    subnet: subnet_do_teu_router
# Enable logging
logger:

# Enable Home Assistant API
api:

web_server:
  port: 80

ota:

# Configuration entry
esp32_ble_tracker:
  scan_parameters:
    duration: 60s

sensor:
  - platform: ble_rssi
    mac_address: aqui_colocas_o_mac_do_teu_portachaves //EXEMPLO:18:7A:93:02:7F:42
    name: "Porta Chaves CPHA"

:information_source: Precisas de saber o MAC da tua Tag ble…
Eu faço o seguinte, como uso Android uso duas apps para sacar o MAC.
Isto não é obrigatório de souberes outra forma.

1ª app
2ª app

Na primeira app quando a abrires, vais adicionar a tua Tag Ble a app, e vai te aparecer um nome decora esse nome, e podes fechar a app ou até mesmo a desinstalar.

De seguida abre a segunda app, o teu tlm vai fazer um scan ao dispositivos Bluetooth que encontrá e ao encontrar o nome que viste na app acima, por baixo desse nome está o MAC, é esse MAC que terás que usar no código do esphome.

Ok, depois de já teres flashado o teu ESP32, com o código, no LOG do esphome vai te aparecer algo como:


Ou seja com essa informação, tens a garantia que o scan está a ser feito, e que está a ser enviado para o HA o rssi (força do sinal) da tua tag BLE.

Caso fores as integrações do esphome, vais ver que também vais lá ter a entidade criada com os mesmos dados do LOG ou seja o rssi.
Mas estes valores não te interessam, são meramente informativos.

image

Agora como crias o sensor para saber se o teu porta chaves está em casa ou não?

Bom basicamente irás precisar da informação dessa entidade.

A ideia aqui é simples… se tiver dados númericos é porque está em Casa, se aparecer Unknown é porque está fora de casa.

Agora como fazer uma automação para evitar falsos positivos?
Quando digo falsos positivos, é porque eles existem…
Um exemplo: Tenho na mochila da minha filha, um tag Ble e por vezes ele mete a mochila junto da varanda, e lá o sinal por vezes do BT é fraco dizendo unknown durante uns minutos… o que não é verdade porque ela está em casa.

Então em Node Red fiz o seguinte:

image

se a entidade sensor.ble_beatriz for unknown durante 5 min.

Escreve no sensor sensor.blebtbia o estado “Ausente”, caso contrário escreve no sensor o estado “Em Casa”

Com isto consegues evitar falsos positivos, obviamente foi a solução que eu encontrei para mim, e que estou a partilhar contigo, mas se souberes outra forma, comenta em baixo respondendo a este tópico.

:slight_smile: Porque isto? Bom basicamente eu usava dois trackers para saber se os residentes estavam em casa ou não…
Usava a app Home Assistant com GPS.
E usava o Ping para pingar o ip dos telemóveis

Mas estas soluções nem sempre eram de todos fiáveis, ora algum residente não tinha o wifi ligado, ora não usava os dados móveis, ora ficava sem bateria… e isso impossibilitava o bom funcionamento do que se pretendia.
Assim desta forma muito barata, à volta de 6 euros, o problema resolvesse e posso dizer que a minha experiência é 100% positiva.

Pois quando estamos fora de casa, todos levamos à chave conosco, e mesmo que nos esquecemos do telemóvel , ou tenhamos algum problema com ele o sistema nunca falha. :wink:

A duração da bateria não posso ainda adientar de quanto tempo dura, uso isto a sensivelmente 3/4 meses e até agora não mudei a pilha.

Dúvidas? Comenta…

3 Likes

Obrigado @RodolfoVieira

O porta chave ble não entram em modo sleep sendo necessário carregar no botão para emitirem o sinal com o mac address?

Há algum tempo testei essa solução e abandonei por este motivo. Talvez tenha comprado os dispositivos errados !!!

Isso que dizes é uma verdade, no entanto eu referi acima para comprar este modelo em especifico ou muito parecido.
Os que compraste eram identicos? tens foto deles?
Este que uso funcionam bem, sem teres que andar a carregar no botão, não entram em modo sleep.

Comprei e testeis estes:

No caso dos últimos não percebo como é que o cão poderia ser seguido sem aprender como pressionar o botão :slight_smile:

O primeiro que ai colocaste entra em modo sleep passado quanto tempo?

Pois não sei, só testanto.
Voltei a liga-lo e vou ver o que acontece amanhã…

1 Like

Boas @RodolfoVieira obrigado peloi tuturial estou a utilizar para fazr tracking dos carros e não das pessoas no meu caso. Sabes se é possivel 2 gateways diferentes terem o mesmo sensor? Eu vou precisar de dois esp32 e queria que caso alguem deles tivesse a apanhar o bluetooth tivesse em “casa”

EDIT: Já resolvi e bem sei que toda a gente deve ter melhor soluções para detectar os seu carros mas aqui fica para quem precisar.

image

image

image

Sim podes ter dois esp32com o mesmo sensor.
Não percebi foi o que disseste a seguir à pergunta… Se o ble está no carro… para que queres outro esp32?

São 2 carros e 1 mota!

Ok , coloca a tag ble que tens onde a mota costuma estar, e verifica se tens sinal.
Se tiveres sinal podes apenas usar duas tags ble com o mesmo esp32.
Caso não apanhe sinal , repetes todo o processo que fizeste com o primeiro.

Já tenho tudo feito eu editei o meu post!

@marine88 TOP vai verificando os falsos positivos.

so far so good eu tenho 1 timeout de 5 minutos antes de sair de casa!

Boas!

Eu estou aqui com uns problemas de falsos positivos, mas em que supostamente detecta como estando em caso sem estar…
Estou a usar uns módulos iguais ao do tutorial…
Ainda estou em fase de testes…

Prints do sinal do módulo:
entity ha

Config Node Red:

[{"id":"71ecf80d.bd8b28","type":"tab","label":"Porta Chaves","disabled":false,"info":""},{"id":"3479bcd5.eb6634","type":"server-state-changed","z":"71ecf80d.bd8b28","name":"Porta chaves Chico","server":"579badfd.ab66a4","version":1,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"sensor.porta_chaves_chico","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"unknown","halt_if_type":"str","halt_if_compare":"is","outputs":2,"output_only_on_state_change":false,"for":"80","forType":"num","forUnits":"seconds","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"x":150,"y":140,"wires":[["ac347dc1.fd5e3"],["35fb6ff.33f829"]]},{"id":"83f2858d.4bd498","type":"server-state-changed","z":"71ecf80d.bd8b28","name":"Porta chaves Catarina","server":"579badfd.ab66a4","version":1,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"sensor.porta_chaves_catarina","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"unknown","halt_if_type":"str","halt_if_compare":"is","outputs":2,"output_only_on_state_change":false,"for":"80","forType":"num","forUnits":"seconds","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"x":160,"y":320,"wires":[["9c90cc1c.64068"],["d0705ec7.03ecb"]]},{"id":"1670d144.e0f71f","type":"api-call-service","z":"71ecf80d.bd8b28","name":"Em casa","server":"579badfd.ab66a4","version":1,"debugenabled":false,"service_domain":"input_boolean","service":"turn_on","entityId":"input_boolean.ble_chico","data":"","dataType":"jsonata","mergecontext":"","output_location":"","output_location_type":"none","mustacheAltTags":false,"x":740,"y":180,"wires":[[]]},{"id":"c706d6a5.428a78","type":"api-call-service","z":"71ecf80d.bd8b28","name":"Fora de casa","server":"579badfd.ab66a4","version":1,"debugenabled":false,"service_domain":"input_boolean","service":"turn_off","entityId":"input_boolean.ble_chico","data":"","dataType":"jsonata","mergecontext":"","output_location":"","output_location_type":"none","mustacheAltTags":false,"x":750,"y":60,"wires":[[]]},{"id":"24d855ec.379caa","type":"api-call-service","z":"71ecf80d.bd8b28","name":"Em casa","server":"579badfd.ab66a4","version":1,"debugenabled":false,"service_domain":"input_boolean","service":"turn_on","entityId":"input_boolean.ble_catarina","data":"","dataType":"jsonata","mergecontext":"","output_location":"","output_location_type":"none","mustacheAltTags":false,"x":820,"y":380,"wires":[[]]},{"id":"fec9a03a.2fdb8","type":"api-call-service","z":"71ecf80d.bd8b28","name":"Fora de casa","server":"579badfd.ab66a4","version":1,"debugenabled":false,"service_domain":"input_boolean","service":"turn_off","entityId":"input_boolean.ble_catarina","data":"","dataType":"jsonata","mergecontext":"","output_location":"","output_location_type":"none","mustacheAltTags":false,"x":830,"y":280,"wires":[[]]},{"id":"619c3d77.b9aee4","type":"server-state-changed","z":"71ecf80d.bd8b28","name":"Porta chaves Chico","server":"579badfd.ab66a4","version":1,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"input_boolean.ble_chico","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"","halt_if_type":"num","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":"","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"x":150,"y":760,"wires":[["5b84a19f.652fd","27c6546f.9e4e7c"]]},{"id":"411b9dbd.5b82e4","type":"simpletime","z":"71ecf80d.bd8b28","name":"","mydate":true,"myymd":true,"myyear":true,"mymonth":true,"mymonthn":true,"mydom":true,"mydoy":true,"myday":true,"myhourpm":true,"myhour":true,"mytime":true,"mytimes":true,"myminute":true,"myminutes":true,"mysecond":true,"mymillis":true,"myepoch":true,"myrawdate":true,"mypm":true,"x":1010,"y":740,"wires":[["dd754ffc.08897"]]},{"id":"dd754ffc.08897","type":"template","z":"71ecf80d.bd8b28","name":"","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"{ \"chatId\": 614157206, \"type\": \"message\" , \"content\": \"{{mydom}}/{{mymonth}}/{{myyear}} {{mytimes}} \\n Chico chegou a casa\" }","output":"json","x":1180,"y":740,"wires":[["bd4a1442.8bc5e8"]]},{"id":"bd4a1442.8bc5e8","type":"telegram sender","z":"71ecf80d.bd8b28","name":"","bot":"4504899e.afa2c8","outputs":1,"x":1370,"y":740,"wires":[["68ec64dd.a71b0c"]]},{"id":"7aa43c35.bc0b34","type":"simpletime","z":"71ecf80d.bd8b28","name":"","mydate":true,"myymd":true,"myyear":true,"mymonth":true,"mymonthn":true,"mydom":true,"mydoy":true,"myday":true,"myhourpm":true,"myhour":true,"mytime":true,"mytimes":true,"myminute":true,"myminutes":true,"mysecond":true,"mymillis":true,"myepoch":true,"myrawdate":true,"mypm":true,"x":1010,"y":800,"wires":[["c904741e.0b7a88"]]},{"id":"c904741e.0b7a88","type":"template","z":"71ecf80d.bd8b28","name":"","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"{ \"chatId\": 614157206, \"type\": \"message\" , \"content\": \"{{mydom}}/{{mymonth}}/{{myyear}} {{mytimes}} \\n Chico saiu de casa\" }","output":"json","x":1180,"y":800,"wires":[["5de0c5dd.23c75c"]]},{"id":"5de0c5dd.23c75c","type":"telegram sender","z":"71ecf80d.bd8b28","name":"","bot":"4504899e.afa2c8","outputs":1,"x":1370,"y":800,"wires":[["78493296.cb93bc"]]},{"id":"5b84a19f.652fd","type":"switch","z":"71ecf80d.bd8b28","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"on","vt":"str"},{"t":"eq","v":"off","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":460,"y":760,"wires":[["411b9dbd.5b82e4"],["7aa43c35.bc0b34"]]},{"id":"68ec64dd.a71b0c","type":"debug","z":"71ecf80d.bd8b28","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1570,"y":740,"wires":[]},{"id":"78493296.cb93bc","type":"debug","z":"71ecf80d.bd8b28","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1570,"y":800,"wires":[]},{"id":"27c6546f.9e4e7c","type":"debug","z":"71ecf80d.bd8b28","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":470,"y":800,"wires":[]},{"id":"5164ea1e.85e164","type":"server-state-changed","z":"71ecf80d.bd8b28","name":"Porta chaves Catarina","server":"579badfd.ab66a4","version":1,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"input_boolean.ble_catarina","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"","halt_if_type":"num","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":"","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"x":160,"y":560,"wires":[["5591ab78.fb2284","2f8ae5f8.ead35a"]]},{"id":"2c337cb5.f7bf84","type":"simpletime","z":"71ecf80d.bd8b28","name":"","mydate":true,"myymd":true,"myyear":true,"mymonth":true,"mymonthn":true,"mydom":true,"mydoy":true,"myday":true,"myhourpm":true,"myhour":true,"mytime":true,"mytimes":true,"myminute":true,"myminutes":true,"mysecond":true,"mymillis":true,"myepoch":true,"myrawdate":true,"mypm":true,"x":1030,"y":540,"wires":[["e3891f3d.d9e54"]]},{"id":"e3891f3d.d9e54","type":"template","z":"71ecf80d.bd8b28","name":"","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"{ \"chatId\": 614157206, \"type\": \"message\" , \"content\": \"{{mydom}}/{{mymonth}}/{{myyear}} {{mytimes}} \\n Catarina chegou a casa\" }","output":"json","x":1200,"y":540,"wires":[["fe5f3263.cc0ce"]]},{"id":"fe5f3263.cc0ce","type":"telegram sender","z":"71ecf80d.bd8b28","name":"","bot":"4504899e.afa2c8","haserroroutput":false,"outputs":1,"x":1390,"y":540,"wires":[["6e9d883a.78f608"]]},{"id":"3d21a642.b1e9ea","type":"simpletime","z":"71ecf80d.bd8b28","name":"","x":1030,"y":600,"wires":[["ce46561a.a300b8"]]},{"id":"ce46561a.a300b8","type":"template","z":"71ecf80d.bd8b28","name":"","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"{ \"chatId\": 614157206, \"type\": \"message\" , \"content\": \"{{mydom}}/{{mymonth}}/{{myyear}} {{mytimes}} \\n Catarina saiu de casa\" }","output":"json","x":1200,"y":600,"wires":[["27ffd3aa.08b50c"]]},{"id":"27ffd3aa.08b50c","type":"telegram sender","z":"71ecf80d.bd8b28","name":"","bot":"4504899e.afa2c8","outputs":1,"x":1390,"y":600,"wires":[["bd1a2b0c.6f1178"]]},{"id":"5591ab78.fb2284","type":"switch","z":"71ecf80d.bd8b28","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"on","vt":"str"},{"t":"eq","v":"off","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":480,"y":560,"wires":[["2c337cb5.f7bf84"],["3d21a642.b1e9ea"]]},{"id":"6e9d883a.78f608","type":"debug","z":"71ecf80d.bd8b28","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1590,"y":540,"wires":[]},{"id":"bd1a2b0c.6f1178","type":"debug","z":"71ecf80d.bd8b28","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1590,"y":600,"wires":[]},{"id":"2f8ae5f8.ead35a","type":"debug","z":"71ecf80d.bd8b28","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":430,"y":640,"wires":[]},{"id":"9c90cc1c.64068","type":"api-current-state","z":"71ecf80d.bd8b28","name":"input_boolean off?","server":"579badfd.ab66a4","version":1,"outputs":2,"halt_if":"off","halt_if_type":"str","halt_if_compare":"is","override_topic":false,"entity_id":"input_boolean.ble_catarina","state_type":"str","state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","blockInputOverrides":false,"x":410,"y":280,"wires":[[],["fec9a03a.2fdb8"]]},{"id":"d0705ec7.03ecb","type":"api-current-state","z":"71ecf80d.bd8b28","name":"input_boolean on?","server":"579badfd.ab66a4","version":1,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","override_topic":false,"entity_id":"input_boolean.ble_catarina","state_type":"str","state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","blockInputOverrides":false,"x":410,"y":380,"wires":[[],["24d855ec.379caa"]]},{"id":"ac347dc1.fd5e3","type":"api-current-state","z":"71ecf80d.bd8b28","name":"input_boolean off?","server":"579badfd.ab66a4","version":1,"outputs":2,"halt_if":"off","halt_if_type":"str","halt_if_compare":"is","override_topic":false,"entity_id":"input_boolean.ble_chico","state_type":"str","state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","blockInputOverrides":false,"x":470,"y":80,"wires":[[],["c706d6a5.428a78"]]},{"id":"35fb6ff.33f829","type":"api-current-state","z":"71ecf80d.bd8b28","name":"input_boolean on?","server":"579badfd.ab66a4","version":1,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","override_topic":false,"entity_id":"input_boolean.ble_chico","state_type":"str","state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","blockInputOverrides":false,"x":470,"y":180,"wires":[[],["1670d144.e0f71f"]]},{"id":"579badfd.ab66a4","type":"server","name":"Home Assistant","legacy":false,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true},{"id":"4504899e.afa2c8","type":"telegram bot","botname":"nodered_bot","usernames":"","chatids":"614157206","baseapiurl":"","updatemode":"polling","pollinterval":"300","usesocks":false,"sockshost":"","socksport":"6667","socksusername":"anonymous","sockspassword":"","bothost":"","localbotport":"8443","publicbotport":"8443","privatekey":"","certificate":"","useselfsignedcertificate":false,"sslterminated":false,"verboselogging":false}]

O que recebi no telegram:

Saí de casa às 21:44 (com o delay) e só entrei novamente às 06:49.
Existem mais notificações entretanto…

Pelas horas parece-me que está com os 80s que defini para não haver falsos positivos quanto saio de casa…
Alguma ideia do que possa ser?

O porta chaves está próximo do esp32?

quando tive os falsos positivos não… estava a vários km de distância…
Quando estou em casa está a um metro para aí…


Copyright © 2017-2021. Todos os direitos reservados
CPHA.pt - info@cpha.pt


FAQ | Termos de Serviço/Regras | Política de Privacidade