Sonoff S26 Wifi vitaminado para control Router e internet

Después de probar a controlar el router con un Sonoff S26 versión zigbee una vez cada dos semanas mas o menos se quedaba sin comunicación y no había forma de volver a controlarlo hasta reiniciar el sonoff , volví a rescatar del cajón de los chismes el Sonoff S26 wifi que tenia guardado y hacer un nuevo intento.

Lo primero será crear un firmware personalizado con la parte del código para el ping , ya que esta parte del código en el firmware habitual no viene implementada.

Para ello usaremos de nuevo el compilador en linea de https://github.com/benzino77/tasmocompiler

Cargaremos todo el entorno de desarrollo.

Descargamos el codigo

Lo actualizamos a la ultima versión

Aprovechamos para poner las credenciales del wifi para que directamente se conecte a la wifi primaria

Aquí marcaremos las características que deseemos , en mi caso con estas cuatro es mas que suficiente

Añadiremos los módulos que queremos usar en los parámetros personalizados

#define USE_PING
#define USE_TELEGRAM

Definimos la versión que queremos y el idioma del paquete de salida

Empezara a descargar todos los ficheros que necesite

Una vez descargados empezara a compilar todo en le VPS

Una vez compilado nos ofrece la posibilidad de descargarlo directamente el BIN , y también el binario comprimido

Aquí tenéis ambos ficheros , tanto el comprimido como sin comprimir

Como no cabia por espacio el firmware tuve que abrir el enchufe y soldarle cuatro cables para pasar via serie el firmware tal como explique aquí ( https://rivas.cloud/2020/05/15/enchufe-inteligente-reset-router/ )

Para ello usaremos como siempre tasmotizer , arrancando el modulo con el pulsador del enchufe pulsado para que entre en modo programación

Una vez arrancado lo primero será aplicar la plantilla para el S26 en Configuración / Configuración extra

{"NAME":"Sonoff S26","GPIO":[17,255,255,255,0,0,0,0,21,56,0,0,0],"FLAG":0,"BASE":8}

También habilitamos la parte de MQTT

Una vez probamos accedemos a la consola para insertar nuestra regla que será la madre del cordero

Así ha quedado la regla que contralara el funcionamiento del enchufe , al final de la entrada la explicaremos poco a poco

Añadimos esta regla en la zona de ingresar comando

Rule1
 ON System#Boot DO Backlog Power1 1; Delay 3000; Publish stat/%topic%/rules "Enchufe a ON al arrancar" ENDON
 ON Time#Minute|10 DO Backlog Ping4 www.google.com; Publish stat/%topic%/rules "Ping a www.google.com" ENDON
 ON Ping#Status=0 DO Backlog Publish stat/%topic%/rules "Sin conexión a Internet, enchufe a OFF"; Delay 100; Power1 0;  ENDON
 ON Power1#State=0 DO Backlog Delay 100; Power1 1; Delay 3000; Publish stat/%topic%/rules "Enchufe a OFF y puesto a ON después de 10 segundos" ENDON
 ON Time#Minute=60 DO Backlog Power1 1; Publish stat/%topic%/rules "Salida encendida cada hora" ENDON
 ON Time#Minute=359 DO Backlog Power1 1; Publish stat/%topic%/rules "Reinicio del modulo en 5 segundos"; Delay 100; Restart 1 ENDON

la activamos con

rule1 1

y si la queremos eliminar introducimos este comando

rule1 "

Una vez arrancada veremos como empieza a hacer pings cada diez minutos

Tal cual ya funcionaria de forma totalmente autónoma , pero si queremos añadirle algo mas de chicha lo integraremos en nuestro Home Assistant.

Lo integramos como un enchufe mqtt

    - unique_id: tasmota_switch_enchufe_router
      name: enchufe_router
      state_topic: "stat/tasmota_9C2CEA/RESULT"  
      value_template: "{{ value_json.POWER }}"
      command_topic: "cmnd/tasmota_9C2CEA/POWER"
      payload_on: "ON"
      payload_off: "OFF"
      availability_topic: "tele/tasmota_9C2CEA/LWT"
      payload_available: "Online"
      payload_not_available: "Offline"
      # retain: true
      retain: false
      qos: 0    
      optimistic: false 

Lo ponemos algo mas chulo en customize.yaml

switch.enchufe_router:
  friendly_name: Enchufe router
  # icon: mdi:power-socket-eu
  icon: 'bha:open-wrt'

Y añadimos algunas automatizaciones :

  • Hacemos que nos envié cualquier activación de la reglas por Telegram
  • Hacemos que nos envié el cambio a ON de la salida del enchufe por Telegram
  • Hacemos que nos envié el cambio a OFF de la salida del enchufe por Telegram

#################################################
# ENCHUFE S26 ROUTER
#################################################

- alias: "Enviar mensaje por Telegram cuando cambie el topic MQTT del enchufe del router"
  id: "Enviar mensaje por Telegram cuando cambie el topic MQTT del enchufe del router"  
  trigger:
    - platform: mqtt
      topic: "stat/tasmota_9C2CEA/rules"
  action:
    - service: notify.notif_telegram_bot
      data:
        message: "*Enchufe router* en reglas : {{ trigger.payload }}"
        

- alias: "Enviar mensaje por Telegram cuando cambie enchufe del router a ON"
  id: "Enviar mensaje por Telegram cuando cambie enchufe del router a ON"
  trigger:
    - platform: state
      entity_id: switch.enchufe_router
      to: "on"
  action:
    - service: notify.notif_telegram_bot
      data:
        message: "Enchufe router a : *ON*"
    
    - delay: 00:05:00        

    - service: notify.notif_telegram_bot
      data:
        message: "Enchufe router a : *ON* hace cinco minutos"


- alias: "Enviar mensaje por Telegram cuando cambie enchufe del router a OFF"
  id: "Enviar mensaje por Telegram cuando cambie enchufe del router a OFF"
  trigger:
    - platform: state
      entity_id: switch.enchufe_router
      to: "off"
  action:
    - service: notify.notif_telegram_bot
      data:
        message: "Enchufe router a : *OFF*"        
        
    - delay: 00:05:00        

    - service: notify.notif_telegram_bot
      data:
        message: "Enchufe router a : *OFF* hace cinco minutos"

De esta manera tendríamos unas trazas del funcionamiento en nuestro Telegram

La regla Rule1 define una serie de acciones que se ejecutan en respuesta a diferentes eventos. A continuación, te explico cada parte de la regla en detalle:

ON System#Boot DO Backlog Power1 1; Delay 3000; Publish stat/%topic%/rules "Enchufe a ON al arrancar" ENDON

  • Evento: System#Boot se activa cuando el dispositivo se inicia o reinicia.
  • Acciones:
    • Backlog Power1 1: Enciende el relé o salida Power1 (enchufe) inmediatamente después del arranque.
    • Delay 3000: Espera 300 segundos antes de continuar con la siguiente acción.
    • Publish stat/%topic%/rules "Enchufe a ON al arrancar": Publica un mensaje MQTT en el tópico stat/%topic%/rules con el mensaje “Enchufe a ON al arrancar”. 
ON Time#Minute|10 DO Backlog Ping4 www.google.com; Publish stat/%topic%/rules "Ping a www.google.com" ENDON

  • Evento: Time#Minute|10 se activa cada 10 minutos.
  • Acciones:
    • Backlog Ping4 www.google.com: Realiza un ping a www.google.com para verificar la conectividad a Internet.
    • Publish stat/%topic%/rules "Ping a www.google.com": Publica un mensaje MQTT indicando que se ha realizado un ping a Google.
ON Ping#Status=0 DO Backlog Publish stat/%topic%/rules "Sin conexión a Internet, enchufe a OFF"; Delay 100; Power1 0; ENDON

  • Evento: Ping#Status=0 se activa cuando el ping falla, es decir, cuando no hay conexión a Internet.
  • Acciones:
    • Backlog Publish stat/%topic%/rules "Sin conexión a Internet, enchufe a OFF": Publica un mensaje MQTT indicando que no hay conexión a Internet y que el enchufe se apagará.
    • Delay 100: Espera 10 segundos antes de continuar.
    • Power1 0: Apaga el relé o salida Power1 (enchufe).
ON Power1#State=0 DO Backlog Delay 100; Power1 1; Delay 3000; Publish stat/%topic%/rules "Enchufe a OFF y puesto a ON después de 10 segundos" ENDON

  • Evento: Power1#State=0 se activa cuando el relé Power1 se apaga.
  • Acciones:
    • Backlog Delay 100: Espera 10 segundos.
    • Power1 1: Enciende el relé Power1 nuevamente.
    • Delay 3000: Espera 300 segundos.
    • Publish stat/%topic%/rules "Enchufe a OFF y puesto a ON después de 10 segundos": Publica un mensaje MQTT indicando que el enchufe se apagó y se volvió a encender después de 10 segundos.
ON Time#Minute=45 DO Backlog Power1 1; Publish stat/%topic%/rules "Salida encendida cada hora" ENDON

  • Evento: Time#Minute=45 se activa cada hora (cuando los minutos son 45).
  • Acciones:
    • Backlog Power1 1: Enciende el relé Power1.
    • Publish stat/%topic%/rules "Salida encendida cada hora": Publica un mensaje MQTT indicando que la salida se ha encendido cada hora.

ON Time#Minute=359 DO Backlog Power1 1; Publish stat/%topic%/rules "Reinicio del modulo en 5 segundos"; Delay 100; Restart 1 ENDON

  • Evento: Time#Minute=359 se activa cuando los minutos son 359 después de la media noche (es decir, a las 5:59).
  • Acciones:
    • Backlog Power1 1: Enciende el relé Power1.
    • Publish stat/%topic%/rules "Reinicio del modulo en 5 segundos": Publica un mensaje MQTT indicando que el módulo se reiniciará en 5 segundos.
    • Delay 100: Espera 10 segundos.
    • Restart 1: Reinicia el módulo después de 1 segundo.

En resumen :

Esta regla Rule1 está diseñada para:

  1. Encender el enchufe al arrancar el dispositivo.
  2. Verificar la conectividad a Internet cada 10 minutos.
  3. Apagar el enchufe si no hay conexión a Internet.
  4. Volver a encender automáticamente si el enchufe si se apaga.
  5. Encender el enchufe cada hora.
  6. Reiniciar el módulo a una hora específica (a las 5:59 minutos).

Cada acción está acompañada de un mensaje MQTT que informa sobre el estado y las acciones realizadas, lo que facilita el monitoreo y la depuración del dispositivo.

Y con esto y un bizcocho …..

OpenMQTTGateway e integración en Home Assistant

Desde hace años utilizo OpenMQTTGateway para hacer de interface entre varios dispositivos , con el tiempo he añadido y he quitado pero basicamente los que siempre han permanecido son los MiFlora , estos llevan cuidando de mis plantas desde hace muchos años

Todas las placas compatibles las podemos encontrar aquí , https://docs.openmqttgateway.com/prerequisites/board.html

Al principio use la wemos d1 mini pero después de unos meses acababa teniendo problemas con la memoria flash , por eso últimamente uso esta , la wemos esp 32 lite que esta muy bien de precio y va como un tiro , me ha fallado después de año y medio funcionando 24/7 y ha sido por la fuente de alimentación que la ha acabado friendo

Una vez tengamos el modulo procederemos a instalar el firmware , esta tarea se ha vuelto muy facil desde chrome , iremos a este enlace https://docs.openmqttgateway.com/upload/web-install.html y seleccionamos esp32dev ble

Nos aparece una ventana emergente con el puerto serie del ESP32

Pulsamos instalar

Borramos previamente todo el contenido del dispositivo

E instalamos el firmware

Si todo es correcto aparecerá esta ventana

Desde la misma pagina podemos ver los logs del ESP32

Veremos como arranca en modo AP y el nombre de la wifi creada

Con el móvil nos conectamos sin contraseña

Seleccionamos la wifi y ponemos las credenciales

Ponemos las credenciales de la parte de MQTT

Si todo es correcto guardamos y el ESP32 intentara conectarse a nuestra wifi

En el LOG podremos ver que se ha conectado a la wifi y la IP asignada

Si vamos a la ip asignada podremos entrar en la web del ESP32 con admin y la contraseña que hemos puesto previamente

Desde MQTT Explorer ya podemos ver como esta detectando dispositivos , entre ellos los dos MiFlora que tengo en el balcón.

Ya podemos definir los sensores en la sección sensor del configuration.yaml

      
  #########################################################
  #### MACETA 1
  #########################################################
       
    - name: maceta_1_temperature
      unit_of_measurement: "°C"
      force_update: true
      expire_after: 21600 
      state_topic: "home/OMG_ESP32_BLE/BTtoMQTT/C47C8D674896" 
      value_template: "{{ value_json.tempc | is_defined }}"

    - name: maceta_1_moisture
      unit_of_measurement: "%"
      force_update: true
      expire_after: 21600
      state_topic: "home/OMG_ESP32_BLE/BTtoMQTT/C47C8D674896"
      value_template: "{{ value_json.moi | is_defined }}"

    - name: maceta_1_light_intensity
      unit_of_measurement: lux
      force_update: true
      expire_after: 21600
      state_topic: "home/OMG_ESP32_BLE/BTtoMQTT/C47C8D674896"
      value_template: "{{ value_json.lux | is_defined }}"

    - name: maceta_1_conductivity
      unit_of_measurement: 'µS/cm'
      force_update: true
      expire_after: 21600 
      state_topic: "home/OMG_ESP32_BLE/BTtoMQTT/C47C8D674896"
      value_template: "{{ value_json.fer | is_defined }}"

Y en el customize les daremos un mejor aspecto

sensor.maceta_1_humedad:
  friendly_name: Riego maceta 1
  icon: mdi:cup-water
sensor.maceta_1_conductivity:
  friendly_name: Conduc.
  icon: mdi:leaf
sensor.maceta_1_temperature:
  friendly_name: Temperatura
  icon: mdi:temperature-celsius
sensor.maceta_1_light_intensity:
  friendly_name: Luz 1
  icon: mdi:white-balance-sunny
sensor.maceta_1_moisture:
  friendly_name: Humedad
  icon: mdi:water
sensor.maceta_1_battery:
  friendly_name: Bateria
  icon: mdi:battery

Si queremos crearemos una card del tipo picture-elements para que nos quede perfecto , la imagen del fondo es esta

  - type: vertical-stack
    cards:
        
      - type: picture-elements
        image: /local/plants.jpg
        elements:
          - type: state-badge
            entity: sensor.maceta_1_moisture
            style:
              top: 27%
              left: 10%
              --ha-label-badge-font-size: 1em
          - type: state-badge
            entity: sensor.maceta_1_conductivity
            style:
              top: 27%
              left: 22%
              --ha-label-badge-font-size: 1em
          - type: state-badge
            entity: sensor.maceta_1_light_intensity
            style:
              top: 27%
              left: 34%
              --ha-label-badge-font-size: 1em         
          - type: state-label
            entity: sensor.maceta_1_temperature
            style:
              top: 15%
              left: 92%
              --ha-label-badge-font-size: 1em          
            
      - type: picture-elements
        image: /local/plants.jpg
        elements:
          - type: state-badge
            entity: sensor.maceta_2_moisture
            style:
              top: 27%
              left: 10%
              --ha-label-badge-font-size: 1em
          - type: state-badge
            entity: sensor.maceta_2_conductivity
            style:
              top: 27%
              left: 22%
              --ha-label-badge-font-size: 1em
          - type: state-badge
            entity: sensor.maceta_2_light_intensity
            style:
              top: 27%
              left: 34%
              --ha-label-badge-font-size: 1em         
          - type: state-label
            entity: sensor.maceta_2_temperature
            style:
              top: 15%
              left: 92%
              --ha-label-badge-font-size: 1em   

Y el resultado final seria esto

Así quedaria en nuestro panel lovelace

Y ya podremos empezar a darle funcionalidades , en este caso avisa cuando le falta agua , y cuando el agua es suficiente.

- alias: Maceta - falta de agua
  id: Maceta - falta de agua
  initial_state: 'on'
  trigger:
    platform: numeric_state
    entity_id: sensor.maceta_1_moisture
    below: 25
  condition:
    condition: state
    entity_id: input_boolean.int_menos_notificaciones
    state: 'off'    
  action:
    service: notify.notif_telegram_bot
    data:
      message: "*Maceta 1* : ¡Socorro! ¡Agua! \U0001f480\U0001f480\U0001f480"

- alias: Maceta - suficiente agua
  id: Maceta - suficiente agua
  initial_state: 'on'
  trigger:
    platform: numeric_state
    entity_id: sensor.maceta_1_moisture
    above: 60
  condition:
    condition: state
    entity_id: input_boolean.int_menos_notificaciones
    state: 'off'    
  action:
    service: notify.notif_telegram_bot
    data:
      message: "*Maceta 1* : Me siento mejor, gracias por el agua. \U0001f3a0"

Y con esto y un bizcocho ……..