Sensor de Água no galão integrado na Alexa e WhatsApp para o fornecedor

esphome

Nesse tutorial você aprenderá como construir um sensor de galão d’água, que permitirá avisá-lo na Alexa quando a água estiver acabando e a partir da sua resposta, uma mensagem de whatsapp será enviada para o fornecedor.

Detalhando o funcionamento:

Quando o nível de água chegar no sensor, o estado dele mudará de molhado para seco.
Após a detecção, será verificado quantos dias foram da última vez do pedido.

Essa programação no meu caso foi criada porque o galão pode ser removido da posição de encostado no sensor para limpeza da pia por exemplo. Desse modo, a Alexa somente perguntará depois de 4 dias que fez o último pedido de água (a não ser que a água termine antes desse prazo, fica a seu critério configurar isso).

A Alexa perguntará se você deseja enviar o pedido de água para o fornecedor.

Para que a Alexa possa interagir com o fluxo, será necessário ativar o Alexa Actionable Notification (que terá um link abaixo para um outro tutorial).

Para saber como fazer isso, veja aqui: Alexa Actions - Batendo papo com a Alexa!

Foto do sensor no galão de 20L.



Materiais utilizados:

Atenção: O sensor de nível pode ser PNP ou NPN.
A diferença é que se for PNP você deverá utilizar um resistor de 4k7 e um transistor bipolar para inverter de PNP para NPN.
No meu caso, adquiri o PNP e tive que fazer essa etapa.

Link para o transistor: https://produto.mercadolivre.com.br/MLB-1816523462-transistor-bipolar-2n2222-bc-4-pecas-2n2222-2n-2222-bc-_JM

A caixinha eu fiz com o aplicativo web Thinkercad já com a curvatura de um galão de 20L e imprimi numa impressora 3D.

Caixinha em 3D:

Caso queira baixar o projeto da caixinha, clique nesse link: https://drive.google.com/file/d/19XJ7BwHXjZaBb9K98SGZiGR_ULhp5vgM/view?usp=sharing

Diagrama da instalação:

OBS: Se for o NPN você liga direto na placa, sendo o amarelo no D2 ou GPIO5, o preto não usa, o azul no GND e o marrom no 5V.

Programação:

Crie um novo dispositivo no ESPHome com o nome que você deseja.

Para saber mais como instalar e configurar o ESPHome no Home Assistant, veja aqui: EspHome

Realizada esta etapa, desligue o Esp8266 do cabo de programação e faça as ligações do dispositivo no Esp8266

Feito o esquema de ligação, basta carregar o código no EspHome:

button:
  - platform: restart
	id: restart_button
	name: Reiniciar Galão
	icon: mdi:restart
	
binary_sensor:
  - platform: gpio
	pin: GPIO5
	device_class: moisture
	name: "Sensor do Galão"
	filters:
	  - delayed_on: 500ms

  #Status (conectado ou desconectado)
  - platform: status
	id: galao_status
	name: Galão - Status
	device_class: connectivity

sensor:
  #Sensor Intensidade Sinal Wifi
  - platform: wifi_signal
	id: galao_wifi_sinal
	name: Galão - Intensidade Wifi
	icon: mdi:signal
	update_interval: 10s

Agora que você editou e instalou o código, podemos usar o Node-Red, por exemplo, para tratar de avisar quando a água chegar no nível do sensor.

OBS: Para que a Alexa possa interagir com o fluxo será necessário ativar o Alexa Actionable Notification. Para saber como fazer isso, veja aqui: Alexa Actions - Batendo papo com a Alexa!

Você precisará também criar um input_datetime no Home Assistant em Configurações, Automações /Cenas e na aba “Entidades Auxiliares” adicionar uma entidade do tipo Data/Hora com o nome “pedido_agua” para poder importar o fluxo, caso deseje.

Para enviar mensagens pelo whats existem N formas. No meu caso eu utilizo o RuBOT para enviar uma mensagem do Home Assistant através de um número fixo para o meu celular com a mensagem formatada em forma de link. Assim, quando for respondido “sim” para pedir a água serão enviadas duas mensagens para o meu whats, sendo a primeira avisando da aceitação e a segunda em forma de link. Quando eu clico no link, a mensagem é aberta no número do whats do fornecedor e assim eu autorizo clicando em “enviar”.

Para usar o RuBOT (para efeito de testes desse tutorial), basta que você envie uma mensagem de whatsapp para +55 15 2107-6763. Como resposta, você receberá as instruções do Bot com um Token de segurança e como adicionar o serviço Notify do RuBOT no Home Assistant.

Na figura abaixo temos o fluxo no Node-Red:

Código do fluxo:

[{"id":"cc43b8378e61e9d5","type":"tab","label":"Galao","disabled":false,"info":"","env":[]},{"id":"609586dcc3ec33c4","type":"server-state-changed","z":"cc43b8378e61e9d5","name":"Galão sem água?","server":"5e34cdb.2f12b34","version":3,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"binary_sensor.sensor_do_galao","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"off","halt_if_type":"str","halt_if_compare":"is","outputs":2,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":120,"y":80,"wires":[["7b7912ba5db20620"],[]]},{"id":"592cf512b8e6f5ac","type":"api-call-service","z":"cc43b8378e61e9d5","name":"Ask for Water","server":"5e34cdb.2f12b34","version":3,"debugenabled":false,"service_domain":"script","service":"activate_alexa_actionable_notification","entityId":"","data":"{\t   \"text\":payload,\t   \"event_id\":\"ask_for_water\",\t   \"alexa_device\":\"media_player.echo_dot_espaco_gourmet\"\t}","dataType":"jsonata","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":760,"y":80,"wires":[[]]},{"id":"3efbab2ab097af2c","type":"server-events","z":"cc43b8378e61e9d5","name":"Resposta for Water","server":"5e34cdb.2f12b34","version":1,"event_type":"alexa_actionable_notification","exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"waitForRunning":true,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"$outputData(\"eventData\").event_type","valueType":"jsonata"}],"x":130,"y":200,"wires":[["952a0bf2662a76ed"]]},{"id":"952a0bf2662a76ed","type":"switch","z":"cc43b8378e61e9d5","name":"","property":"payload.event.event_id","propertyType":"msg","rules":[{"t":"eq","v":"ask_for_water","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":310,"y":200,"wires":[["e6c2fd55ccb023d8"]]},{"id":"e6c2fd55ccb023d8","type":"switch","z":"cc43b8378e61e9d5","name":"","property":"payload.event.event_response","propertyType":"msg","rules":[{"t":"eq","v":"ResponseYes","vt":"str"},{"t":"eq","v":"ResponseNo","vt":"str"},{"t":"eq","v":"ResponseNone","vt":"str"}],"checkall":"true","repair":false,"outputs":3,"x":450,"y":200,"wires":[["3a41dad043ebca10"],[],[]]},{"id":"4b22f881975efe64","type":"api-call-service","z":"cc43b8378e61e9d5","name":"Avisa a Alexa","server":"5e34cdb.2f12b34","version":3,"debugenabled":false,"service_domain":"notify","service":"alexa_media_echo_show_de_rogerio","entityId":"","data":"{\t   \"data\": {\"type\": \"tts\"},\t   \"message\": \"Enviando um whatsapp para o fornecedor agora!<voice name='Ricardo'>A propósito, não se esqueça de deixar o galão de água na garagem!</voice>\",\t   \"target\": [\t       \"media_player.echo_show_de_rogerio\"    \t   ]\t}","dataType":"jsonata","mergecontext":"","mustacheAltTags":true,"outputProperties":[],"queue":"none","x":300,"y":300,"wires":[["1a4c02941691587f"]]},{"id":"89255210681f4480","type":"api-call-service","z":"cc43b8378e61e9d5","name":"Data Pedido","server":"5e34cdb.2f12b34","version":3,"debugenabled":false,"service_domain":"input_datetime","service":"set_datetime","entityId":"input_datetime.pedido_agua","data":"{\t   \"datetime\": payload\t}\t","dataType":"jsonata","mergecontext":"","mustacheAltTags":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"date"}],"queue":"none","x":970,"y":200,"wires":[["4b22f881975efe64"]]},{"id":"3a41dad043ebca10","type":"function","z":"cc43b8378e61e9d5","name":"Cria Data","func":"var d = new Date(); \nmsg.payload = d;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":600,"y":200,"wires":[["7d7fb6f8a0b08237"]]},{"id":"7d7fb6f8a0b08237","type":"moment","z":"cc43b8378e61e9d5","name":"Formata Data","topic":"","input":"","inputType":"msg","inTz":"America/Sao_Paulo","adjAmount":0,"adjType":"days","adjDir":"add","format":"","locale":"C","output":"","outputType":"msg","outTz":"America/Sao_Paulo","x":780,"y":200,"wires":[["89255210681f4480"]]},{"id":"6a7ced7af3890e95","type":"function","z":"cc43b8378e61e9d5","name":"","func":"var first = msg.payload;\nvar second = new Date(); \nvar diffInMs = new Date(second) - new Date(first)\nvar diffInDays = diffInMs / (1000 * 60 * 60 * 24);\n\nif (diffInDays >4) {\n    msg.payload = \"A água está acabando e o último pedido foi há \" + parseInt(diffInDays) +  \" dias, Você deseja pedir água agora?\";\n    return msg;\n}\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":550,"y":80,"wires":[["592cf512b8e6f5ac"]]},{"id":"7b7912ba5db20620","type":"api-current-state","z":"cc43b8378e61e9d5","name":"Pega Data","server":"5e34cdb.2f12b34","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_datetime.pedido_agua","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":330,"y":80,"wires":[["6a7ced7af3890e95"]]},{"id":"2403a53783cd8ad4","type":"template","z":"cc43b8378e61e9d5","name":"","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"Olá, preciso de um galão./nR. BlaBlaBla, 2222/nCondomínio xpto/nRoger4R.;to=5515991096605","output":"str","x":860,"y":300,"wires":[["3b9c36f36bc75353"]]},{"id":"0894889a0ee11851","type":"inject","z":"cc43b8378e61e9d5","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":320,"y":360,"wires":[["1a4c02941691587f"]]},{"id":"1a4c02941691587f","type":"template","z":"cc43b8378e61e9d5","name":"","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"A Alexa detectou que a água do galão está acabando e foi dito que sim. Clique na mensagem abaixo para pedir.","output":"str","x":500,"y":300,"wires":[["3368d7a90947239d"]]},{"id":"3368d7a90947239d","type":"api-call-service","z":"cc43b8378e61e9d5","name":"Manda Whats","server":"5e34cdb.2f12b34","version":3,"debugenabled":false,"service_domain":"notify","service":"rubot","entityId":"","data":"{ \"message\" : msg.payload   }\t","dataType":"jsonata","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":680,"y":300,"wires":[["2403a53783cd8ad4"]]},{"id":"3b9c36f36bc75353","type":"api-call-service","z":"cc43b8378e61e9d5","name":"Manda Whats","server":"5e34cdb.2f12b34","version":3,"debugenabled":false,"service_domain":"notify","service":"rubot","entityId":"","data":"{ \"message\" : msg.payload   }\t","dataType":"jsonata","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1040,"y":300,"wires":[[]]},{"id":"a2d9ed1a014b8cec","type":"inject","z":"cc43b8378e61e9d5","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"testando","payloadType":"str","x":560,"y":140,"wires":[["592cf512b8e6f5ac"]]},{"id":"5e34cdb.2f12b34","type":"server","name":"Home Assistant","version":2,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":"30"}]

Pronto, é isso pessoal. Gostou deste tutorial? Então deixa seu comentário, dúvida ou sugestão aí embaixo!

9 Likes

Muito bom o projeto! exatamente o que eu estava precisando. Obrigado por compartilhar com tantos detalhes.
Sobre o sensor, você recomenda que eu compre diretamente o NPN? Precisarei realizar alguma alteração no código?