Verificar se o dispositivo(ESP8266 ou ESP32) está conectado ao servidor(Home Assistant) para fazer algo [AUTOMAÇÃO]

Olá pessoal

Estou com uma dúvida e precisando de ajuda com o espHome

Criei um dispositivo para controlar duas caixas d’águas. Sendo uma no térreo, essa caixa é responsável por armazenar a água que bombeada de uma ponteira. E pela segunda caixa d’água que é responsável por armazenar água em terreno elevado ela enche com a caixa térrea.
Atualmente tenho um sistema de boias elétricas que funcionam em conjunto. mantendo as duas caixas sempre cheias ou seja duas bombas de d’água fazem o trabalho.

Dado o contexto, quero automatizar, criei uma placa WEMOS D1 + um expansor de portas, conectados a 2 relay de carga até 30A(acionaram os motores)

Se eu conectar da forma que está, manualmente pelos switch eu controlo o acionamento dos motores, até aí tudo OK.
Mas quero utilizar uma automação. duas na verdade.
Automação via a plataforma do HA e a outra automação dentro do próprios dispositivo.

Qual o objetivo: Dados o cenário que a comunicação com o dispositivo e o HA falhe, quero que opere em modo “default”

pra isso estou tentando criar condicionais que verifique se a conexão com WEMOS está OK, caso contrário execute o modo “default” liga o motor pra encher se o nível estiver vazio.

As boias já estão instaladas
image

veja no código onde quero aplicar, já tentei algo com “lambdas” mas me falta conhecimento para essa ação, procure no código esse trecho: # “IF” caso a conexão wifi ou com servidor HA esteja interrompida

esphome:
  name: "esp8266-pikachu"
  friendly_name: pikachu
  includes:
    - currentsensor.h
  libraries:
    - "EmonLib"
esp8266:
  board: d1_mini

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "ZaeN4JG+PuAM7xGhXD06ky2NpkHwbGUBVFbeRxjKUZ8="

ota:
  password: "f67b317f1ecb23085da2b06f7bbb034b"

wifi: 
  id: id_wifi
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  fast_connect: True
  #use_address: gaitolini.duckdns.org

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esp8266-Wemos Fallback Hotspot"
    password: "t6AeqsBZq1eS"

  manual_ip:
    # Set this to the IP of the ESP
    static_ip: 192.168.2.74
    # Set this to the IP address of the router. Often ends with .1
    gateway: 192.168.2.1
    # The subnet of the network. 255.255.255.0 works for most home networks.
    subnet: 255.255.255.0
    dns1: 192.168.2.1
    dns2: 8.8.8.8

captive_portal:

mqtt:
  broker: 192.168.2.75
  port: 1883
  username: mqtt-gaitolini
  password: gaitolini
  
  discovery: true
  discovery_retain: true

  birth_message:
    topic: pikachu/status
    payload: online
  will_message:
    topic: pikachu/status
    payload: offline" 
  log_topic: 
    topic: pikachu/log 
    level: ERROR
    qos: 1    

i2c:
  - id: Relay_I2C
    sda: GPIO4
    scl: GPIO5
    scan: True
    # frequency: 5000kHz

pcf8574:
  - id: 'hub1'
    address: 0x38
    pcf8575: False
    i2c_id: Relay_I2C

# Individual outputs
switch:
  - platform: gpio
    device_class: switch
    name: "Water Pump_1"
    id: waterpump_01
    icon: "mdi:pipe-valve"
    # interlock: &interlock_group [relay0,relay1, relay2, relay3, relay4, relay5, relay6, relay7]
    pin:
      pcf8574: hub1
      number: 0
      mode:
        output: true
      inverted: true
    restore_mode:
      RESTORE_DEFAULT_OFF      
    # on_turn_off: 
    #   then:
    #     - delay: 
    #         milliseconds: 300
    # on_turn_on: 
    #   then:
    #     - delay: 
    #         milliseconds: 300        

  - platform: gpio
    name: "Water Pump_2"
    id: waterpump_02
    icon: "mdi:pipe-valve"
    device_class: switch
    restore_mode:
      RESTORE_DEFAULT_OFF
    pin:
      pcf8574: hub1
      number: 1
      mode:
        output: true
      inverted: true 
        
    # on_turn_off: 
    #   then:
    #     - delay: 
    #         milliseconds: 300
    # on_turn_on: 
    #   then:
    #     - delay: 
    #         milliseconds: 300     

sensor:
  - platform: custom
    lambda: |-
      auto sctSensor = new SCTSensor(
          A0,                /* Current Pin */
          1480,              /* 15000 emonCalcIrms - current calibration settings */
          40,                /* emonCurrent - current calibration settings */
          230,               /* Voltagem da rede*/ 
          10000             /* Update Interval - 10 seconds or more is recommended*/   
            
        );

      App.register_component(sctSensor);
      return {sctSensor->currentSensor, sctSensor->wattsSensor};
    sensors:
    - name: "Current"
      id: current 
      unit_of_measurement: "A"
      accuracy_decimals: 2
      icon: "mdi:meter-electric-outline"       
      # filters:
      #   - delta: 0.4
    - name: "Watts"
      id: watts
      unit_of_measurement: "W"
      accuracy_decimals: 2
      icon: "mdi:flash-outline"      

  - platform: wifi_signal
    name: "WIFI Signal"
    update_interval: 5min
    icon: "mdi:home-automation"
    on_value:
      then:
        - text_sensor.template.publish:
            id: waterpump_status
            state: !lambda 'return std::string("Energy monitor - Build: ")  + __DATE__ + " " +  __TIME__ + " - " + id(ip_address).state;'  

  - platform: template
    name: nivel-caixa-dagua
    icon: "mdi:car-coolant-level"
    lambda: |-
      int returnX = 0; 
      if (id(boia1).state) {
         returnX = 10;
         if (id(boia2).state) {
          returnX = 50;
          if (id(boia3).state) {
            returnX = 100;            
          }    
        }
      } else {
         returnX = 0;
      }   
      return returnX;
    update_interval: 15s  

  - platform: template
    name: "Energy Meter"
    id: energy_meter
    unit_of_measurement: "kWh"
    device_class: energy
    state_class: measurement
    lambda: return id(current).state * 230 / 1000;
    update_interval: 5s
# Example configuration entry
  - platform: total_daily_energy
    name: "Total Diario de Energia consumida"
    power_id: energy_meter
# Enable time component to reset energy at midnight
time:
  - platform: sntp
    id: my_time  

text_sensor:
  - platform: template
    name: "water-pump"
    id: waterpump
    icon: "mdi:water-pump"
  - platform: wifi_info
    ip_address:
      id: ip_address
      internal: true
  - platform: template
    name: "Water-pump Status"
    id: waterpump_status


binary_sensor: 
  - platform: gpio
    pin: 
      number: D5 #gpio14
      inverted: True
    name: "boia1"
    device_class: opening  
    icon: "mdi:gauge-empty"
    id: boia1
    filters: 
      - delayed_on_off: 15s   
    on_press: 
      then: 
       # "IF" caso a conexão wifi ou com servidor HA esteja interrompida ******************************************** 
       - switch.turn_on: waterpump_01  # A lógica ainda não está bem definida!
       # essa condição usuarei nas demais boias 

  - platform: gpio
    pin: 
      number: D6  #gpio12
      inverted: True
    name: "boia2"
    device_class: opening  
    icon: "mdi:gauge-low"      
    id: boia2
    filters: 
      - delayed_on_off: 10s  

  - platform: gpio
    pin: 
      number: D7  #gpio13
      inverted: True  
    name: "boia3"
    device_class: opening    
    icon: "mdi:gauge-full" 
    id: boia3
    filters: 
      - delayed_on_off: 10s  

  - platform: gpio
    pin: 
      pcf8574: hub1
      number: 3
      inverted: True  
    name: "boia4"
    device_class: opening    
    icon: "mdi:gauge-full" 
    id: boia4
    filters: 
      - delayed_on_off: 10s  

  - platform: gpio
    pin: 
      pcf8574: hub1
      number: 4
      inverted: True  
    name: "boia5"
    device_class: opening    
    icon: "mdi:gauge-full" 
    id: boia5
    filters: 
      - delayed_on_off: 10s  


  - platform: gpio
    pin: 
      pcf8574: hub1
      number: 6
      inverted: True  
    name: "boia6"
    device_class: opening    
    icon: "mdi:gauge-full" 
    id: boia6
    filters: 
      - delayed_on_off: 10s

Pq vc não usa o próprio esp para rodar a automação “default” e deixa o HA apenas para verificar status e coisa do tipo?

Acho que independente da complexidade das automações, fazer com que o esp obtenha controle após uma queda de conexão deixará tudo mais complexo, tanto no esp quanto no HA.

1 Like

Verdade @Walber a complexidade aumenta. E por se tratar de um serviço essencial, pode gerar erros: Desperdício de agua/energia, falta de água naquele banho especial antes de dormir rsrs.

Vou dar uma olhada na sua recomendação Native API Component. Desde já agradeço como sempre a disponibilidade e presença.