Lilygo POE Ethernet no ESPHome + Dallas Sensor Temperatura

esphome

Esse tutorial mostrará como configurar um dispositivo ESP32 que funciona com cabo de rede e POE (Power Over Ehternet) no ESPHome.

O projeto pode ser aplicado em diversas situações, como por exemplo sinal de Wi-Fi insatisfatório.

No meu caso, utilizei este dispositivo dentro de uma casa de máquinas da piscina, onde Wi-Fi e Zigbee não funcionavam adequadamente.

Para saber mais sobre POE, veja aqui: o que é poe

O código deste tutorial aplica-se a um dispositivo específico denominado LilyGo POE, que pode ser adquirido nesse link: poe aliexpress

OBS: Fique atento pois existem 2 opções de compra: Uma somente da placa e outra da placa + expansão programável (utilizaremos essa última para fazer o flash do ESP).

É possível também utilizar o LilyGo com um cabo de rede normal e energizá-lo com um plug de energia padrão USB-C de 5V.

Um detalhe importante sobre essa entrada é que ela não serve para fazer o flash na placa.

Detalhes à parte, o intuito deste tutorial é mostrar a utilização do POE.

O LilyGo opera com tensão de 50V no cabo de rede utilizando POE.

Então, será necessário que você possua um switch ou uma fonte 110/220V que entregue 50V no POE.
fontepoe

No meu caso, como não havia nenhum switch com essa característica, decidi por comprar uma fonte POE compatível de 48V nesse link: fonte poe

A figura a seguir mostra como você deve ligar a placa de expansão programável no verso da placa LilyGo.

poe_verso

Nesta etapa, para não ter que soldar nada, eu utilizei fita isolante entre as duas placas para evitar curto circuito e prendi bem as duas placas para não perderem o contato dos pinos.

Feito isso, a próxima etapa é ligar um cabo de programação USB no computador e na plaquinha de programação.

Modelo do Cabo USB/Micro USB:
cabo01

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

Não iremos nesta matéria habilitar o LilyGo pelo Wi-Fi, somente pela Ethernet. Então, o código abaixo deverá ser “colado” na edição do novo device EspHome.

esphome:
  name: placa-lilygo

esp32:
  board: esp32dev
  framework:
    type: arduino

#Enable logging
logger:

#Enable Home Assistant API
api:

ota:
  password: "d61c17f2b41b837b7a28179964083251"

ethernet:
  type: LAN8720
  mdc_pin: GPIO23
  mdio_pin: GPIO18
  clk_mode: GPIO17_OUT
  phy_addr: 0

  #aqui insira um IP fixo para esse dispositivo em sua rede 
  manual_ip:
    static_ip: 192.168.0.12
    gateway: 192.168.0.1
    subnet: 255.255.255.0

Após submeter a gravação da placa com sucesso, remova o cabo e a plaquinha de programação.

Ligue o adaptador POE na energia e espete um cabo de rede na entrada LAN do adaptador e a outra ponta no switch da sua rede.

Foto da ligação:

Espete na sequência o cabo de rede na saída POE do adaptador e a outra ponta na entrada Ethernet do LilyGo.

A partir dessa etapa, volte no ESPHome e veja se o status do dispotivo fico “Online”. Caso negativo, clique no link do post acima para instalar e configurar o ESPHome no Home Assistant.

Observação: O LilyGo utiliza ESP32, que tem portas analógicas e digitais. As analógicas funcionam apenas do GPIO32 ao GPIO39.

De volta ao Home Assistant, e em ESPHome, edite o código do seu novo dispositivo para adicionar os dispositivos que você desejar.

Como exemplo, o código a seguir foi colado no final da programação, para ligar um sensor de temperatura Dallas na placa LilyGo:

  #aqui insira um IP fixo para esse dispositivo em sua rede 
	.
	.
	.

dallas:
  - pin: GPIO14

sensor:
  - platform: dallas
    address: 0x11000000043db228
    name: "Sensor de Temperatura"

O sensor Dallas é digital e possui 3 fios (GND - preto, VCC - vermelho e Sinal Digital - amarelo/laranja)
sensor_dalas

  • Ligue o GND do sensor no GND da placa LilyGo
  • Ligue o VCC do sensor no 3V3 da placa
  • Ligue o fio digital do sensor na entrada GPIO14 da placa, conforme pinout (figura abaixo) Muita calma nessa hora porque falta apenas mais um passo…
  • E, por fim, ligue um resistor de 4K em paralelo no fio vermelho (VCC) do sensor Dallas e no fio amarelho (Sinal de dados do sensor).

LilyGo pinout:

Salve o código e clique em Instalar.

OBSERVAÇÃO: Se você for utilizar o sensor de temperatura Dallas, deverá observar no console do Log de instalação qual é o endereço do sensor e editar novamente o código fonte trocando para esse real endereço, conforme imagem a seguir:
logger

Visualização do dispositivo nas configurações do Home Assistant:

Pronto!

4 Likes

Parabéns pela iniciativa! :clap: :clap: :clap: :clap:

1 Like

Obrigado pela força!

1 Like

Poderia compartilhar como você fez o aquecimento para piscina?

O aquecimento funciona assim: Eu coloquei um ralo específico na lateral da parede da piscina e dentro da casa de máquinas tem um motor de 1/2cv que é acionado por um relé de 10A quando a diferença da temperatura das placas (sensor de temperatura esphone na placa do telhado) Menos a temperatura da piscina (sensor de temperatura esphome no cano que vem do ralo da piscina for <= 5 graus. Ai tem o controle de temperatura máxima da piscina para não aquecer demais. Também tem o controle de temperatura mínima das placas para não congelar os canos e estourar quando houver frio demasiado. com a troca de calor, o motor é desligado automaticamente ou funciona no máximo 3 minutos. Vou postar o fluxo.

[{"id":"ed19d09fbfe34038","type":"tab","label":"Aquecimento da Piscina","disabled":false,"info":""},{"id":"77bb0bb98b6a95f5","type":"server-state-changed","z":"ed19d09fbfe34038","name":"Temp Placas","server":"5e34cdb.2f12b34","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"sensor.temperatura_placas","entityidfiltertype":"exact","outputinitially":false,"state_type":"num","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":"","forType":"num","forUnits":"minutes","ignorePrevStateNull":true,"ignorePrevStateUnknown":true,"ignorePrevStateUnavailable":true,"ignoreCurrentStateUnknown":true,"ignoreCurrentStateUnavailable":true,"outputProperties":[{"property":"temp_placas","propertyType":"msg","value":"","valueType":"entityState"}],"x":90,"y":40,"wires":[["c21004bbea344a2d"]]},{"id":"597611142cd42e1a","type":"function","z":"ed19d09fbfe34038","name":"Check","func":"// inicialmente desliga motor\nvar OnOff = 0;\n\n// liga motor se temp_placas >= 5 graus temp_piscina\nif (msg.temp_placas - msg.temp_piscina >= 5)\n    OnOff = 1;\n\n// desliga motor se temp_placas <= 2 graus que temp_piscina\nif (msg.temp_placas - msg.temp_piscina <= 2)\n    OnOff = 0;\n\n// liga motor se temp_placas <= 4 graus para nao congelar\nif (msg.temp_placas <= 4)\n    OnOff = 1;\n\n// desliga motor do aquecimento se temp_piscina >= 35 graus\nif (msg.temp_piscina >= 35)\n    OnOff = 0;\n\n// desliga se estiver fora do horário do schedulle\nif (msg.schedulle == 'OFF') \n    OnOff = 0;\n\nmsg.payload = OnOff;\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":390,"y":40,"wires":[["2f05bf6a98470482"]]},{"id":"3d87264c2c5105c8","type":"switch","z":"ed19d09fbfe34038","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"0","vt":"num"},{"t":"eq","v":"1","vt":"num"}],"checkall":"true","repair":false,"outputs":2,"x":190,"y":180,"wires":[["cc7ea822152c2b32"],["b787860016a4d561"]]},{"id":"5121b5c903d6204d","type":"api-call-service","z":"ed19d09fbfe34038","name":"Liga","server":"5e34cdb.2f12b34","version":5,"debugenabled":false,"domain":"switch","service":"turn_on","areaId":[],"deviceId":[],"entityId":["switch.motor_do_aquecimento"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":450,"y":200,"wires":[["3e9f2a6786b70e71"]]},{"id":"c21004bbea344a2d","type":"api-current-state","z":"ed19d09fbfe34038","name":"Temp Piscina","server":"5e34cdb.2f12b34","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.temperatura_piscina","state_type":"num","blockInputOverrides":false,"outputProperties":[{"property":"temp_piscina","propertyType":"msg","value":"","valueType":"entityState"}],"for":0,"forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":250,"y":40,"wires":[["597611142cd42e1a"]]},{"id":"62c3553cb8096f20","type":"api-call-service","z":"ed19d09fbfe34038","name":"Desliga","server":"5e34cdb.2f12b34","version":5,"debugenabled":false,"domain":"switch","service":"turn_off","areaId":[],"deviceId":[],"entityId":["switch.motor_do_aquecimento"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":740,"y":200,"wires":[[]]},{"id":"e1ef7fb3dac47901","type":"api-call-service","z":"ed19d09fbfe34038","name":"Desliga","server":"5e34cdb.2f12b34","version":5,"debugenabled":false,"domain":"switch","service":"turn_off","areaId":[],"deviceId":[],"entityId":["switch.motor_do_aquecimento"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":460,"y":140,"wires":[[]]},{"id":"cc7ea822152c2b32","type":"delay","z":"ed19d09fbfe34038","name":"5s","pauseType":"delay","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":330,"y":140,"wires":[["e1ef7fb3dac47901"]]},{"id":"b787860016a4d561","type":"delay","z":"ed19d09fbfe34038","name":"5s","pauseType":"delay","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":330,"y":200,"wires":[["5121b5c903d6204d"]]},{"id":"2f05bf6a98470482","type":"thingzi-time-check","z":"ed19d09fbfe34038","name":"","lat":"-23.6376","lon":"-46.6295","ontype":"tod","ontimesun":"dusk","ontimetod":"08:00","ontimetodtype":"","onoffset":"","onrandomoffset":false,"offtype":"tod","offtimesun":"dawn","offtimetod":"17:30","offtimetodtype":"","offoffset":"","offrandomoffset":false,"mon":true,"tue":true,"wed":true,"thu":true,"fri":true,"sat":true,"sun":true,"passunchecked":false,"x":530,"y":40,"wires":[["3d87264c2c5105c8"],[]]},{"id":"3e9f2a6786b70e71","type":"stoptimer","z":"ed19d09fbfe34038","duration":"3","units":"Minute","payloadtype":"num","payloadval":"0","name":"3 minutos","x":580,"y":200,"wires":[["62c3553cb8096f20"],[]]},{"id":"5e34cdb.2f12b34","type":"server","name":"Home Assistant","version":5,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":"30","areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m","enableGlobalContextStore":true}]