¿En qué podemos ayudarte?

ESP32-OLED

Estas aqui:
< Todos los temas

Este dispositivo es un desarrollo específico basado en ESP32 WROOM y en la plataforma ESPHOME que tiene dos funciones:

  1. Muestra el estado de diferentes variables del sistema domótico de la casa, así como un enlace a un código QR para abrir una página con más información.
  2. Detecta la presencia de alimentación de 230V de la casa

Diagrama hardware

Diagrama de flujo ESP32

Diagrama de flujo automatización en Home Assistant

Código ESPhome

esphome:
  name: esp-32-oled
  friendly_name: ESP-32-OLED

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "***********************"

ota:
  password: "***************"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esp-32-Oled Fallback Hotspot"
    password: "***********"

captive_portal:

globals:
   - id: cont_verde
     type: int
     restore_value: no
     initial_value: '0'

switch:
  # Led verde. Indicador de operacion normal. 
  # cuando está apagado, Home Assistant envía informacion cada 5s. y un pulso de 200ms
  # cuando está encendido, la informacion se actualiza manualmente con el boton 1
  # Se apaga cuando se apaga el led amarillo, controlado por el botón 2
  - platform: gpio
    name: "LED_verde_1"
    restore_mode: always_off
    id: LED_verde
    pin: 5    
  # Led amarillo. cuando está encendido muestra informacion ampliada
  - platform: gpio
    name: "LED_amarillo_2"
    id: LED_amarillo
    pin: 32
    restore_mode: always_off
    # cuando está encendido muestra informacion ampliada
    on_turn_on:
      then:
        - display.page.show: page2
    on_turn_off:
      then:
        - display.page.show: page1
  # Led rojo. Se usa para alarmas, como cuando se pierden los 230V
  - platform: gpio
    name: "LED_rojo_3"
    id: LED_rojo
    pin: 33
    restore_mode: always_off

binary_sensor:
  - platform: gpio
    name: "btn_data"
    # boton de operacion primario
    pin:
      number: 16
      inverted: true
      mode:
        input: true
        pullup: true
    # Cuando se presiona pasa al modo de operacion manual. El cambio de los datos de las pantallas se hace en Home Assistant, cada vez que se presiona. Vuelve al modo auto con el botón 2
    on_press:
      then:
        - switch.turn_off: LED_verde
    on_release:
      then:
        - switch.turn_on: LED_verde
  - platform: gpio
    name: "btn_display"
    # boton de informacion ampliada y reset a operacion normal
    pin:
      number: 17
      inverted: true
      mode:
        input: true
        pullup: true
    # Este boton apaga o enciende el LED amarillo, que se usa para enviar informacion ampliada
    # Al apagar, apaga tambien el led verde, que indica el modo automático (apagado) o manual (encendido)
    on_click:
      min_length: 50ms
      max_length: 500ms
      then:
        - if:
            condition:
              switch.is_off: LED_amarillo
            then:
              - switch.turn_on: LED_amarillo
            else:
              - switch.turn_off: LED_amarillo
              - switch.turn_off: LED_verde
      
  - platform: gpio
    name: "sensor-230v"
    id: sensor_230v
    # sensor de presencia de los 230V
    pin:
      number: 18
      mode:
        input: true
        pullup: true
    # cuando hay 230V la entrada está en "bajo" (off)
    # el LED rojo se enciende cuando se pierden los 230v en la casa
    on_release:
      then:
        - switch.turn_off: LED_rojo
    on_press:
      then:
        - switch.turn_on: LED_rojo
        - switch.turn_on: LED_amarillo
        - lambda: |-
            id(hora_fallo_230v).publish_state(id(s_time).now().strftime("%H:%M"));
        - homeassistant.service:
            service: input_text.set_value
            data:
              entity_id: input_text.hora_fallo_230v
            data_template:
              value: Hora fallo {{ hora_f }}
            variables:
              hora_f: |-
                return id(hora_fallo_230v).state;
        - display.page.show: page3

time:
  - platform: sntp
    id: s_time
    # ...
    on_time:
      # Every 5 seconds
      - seconds: /5
        then:
          - if:
              condition: 
              - binary_sensor.is_on: sensor_230v
              # cuando no hay 230 el led rojo esta siempre encendido
              then:
              - switch.turn_on: LED_rojo
              # cuando hay 230v se emite un pulso
              else:
              - switch.turn_on: LED_rojo
              - delay: 0.2s
              - switch.turn_off: LED_rojo
          - if:
              condition:
              - lambda: return id(cont_verde) > 0 ;
              then:
              - lambda: id(cont_verde) -= 1;
              - logger.log: "decremento contador verde"
              else:
              - switch.turn_off: LED_verde
              - logger.log: "contador verde cero"

sensor:
  # Ya no se usan pero los dejo como ejemplo
  - platform: homeassistant
    id: Temp_AEMET
    entity_id: sensor.aemet_temperature
  - platform: homeassistant
    id: Hume_AEMET
    entity_id: sensor.aemet_humidity
text_sensor:
  # textos informativos "estandard" que vienen de Home Assistant (page1). Se refrescan por defecto cada 5 segundos
  - platform: homeassistant
    name: "Texto superior"
    id: texto_superior
    entity_id: input_text.texto_oled_1
  - platform: homeassistant
    name: "Texto central"
    id: texto_central
    entity_id: input_text.texto_oled_2
  - platform: homeassistant
    name: "Texto inferior"
    id: texto_inferior
    entity_id: input_text.texto_oled_3
  # Estos datos muestran las pantallas de informacion ampliada (page2). Son direcciones codificadas con un código QR
  - platform: homeassistant
    name: "Texto QR"
    id: texto_qr
    entity_id: input_text.texto_QR
  - platform: homeassistant
    name: "Direccion QR"
    id: direccion_qr
    entity_id: input_text.direccion_qr
  - platform: homeassistant
    name: "Hora fallo 230v"
    id: hora_fallo_230v
    entity_id: input_text.hora_fallo_230v

i2c:
  # Display OLED
  sda: 21
  scl: 22
  scan: true

font:
  # gfonts://family[@weight]
  - file: "gfonts://Roboto"
    id: roboto
    size: 16

qr_code:
  - id: ha_qr1
    value: id(direccion_qr)

display:
  - platform: ssd1306_i2c
    model: "SSD1306 128x64"
    address: 0x3C
    pages:
      - id: page1
        lambda: |-
          // muestra los textos que vienen de home assistant
          it.printf(0, 0, id(roboto), "%s", id(texto_superior).state.c_str());
          it.printf(0, 21, id(roboto), "%s", id(texto_central).state.c_str());
          it.printf(0, 42, id(roboto), "%s", id(texto_inferior).state.c_str());
      - id: page2
        lambda: |-
          // texto y direccion en QR-code en [x=30,y=15] a escala 2x
          it.printf(0, 0, id(roboto), "%s", id(texto_qr).state.c_str());
          // imprimir QR de la variable de Home Assistant
          // en https://community.home-assistant.io/t/using-home-assitant-sensor-state-as-value-for-qr/425529
          ha_qr1->set_value(id(direccion_qr).state.c_str());
          it.qr_code(30, 15, id(ha_qr1), Color(255,255,255), 2);
      - id: page3
        lambda: |-
          // Fallo 230V
          it.print(0, 0, id(roboto), "FALLO 230V" );
          it.printf(0, 21, id(roboto), "%s", id(hora_fallo_230v).state.c_str());

Automatización Home Assistant

Alerta fallo 230V Home Assistant

alerta_fallo_230v:
  name: 230v_fallo
  message: Ha fallado la red de 230 voltios
  done_message: La red de 230 voltios ha vuelto
  entity_id: binary_sensor.esp_32_oled_sensor_230v
  state: "on"
  repeat: 15 # This will repeat every 15 minutes
  can_acknowledge: true
  skip_first: false
  notifiers:
    - alexa_pasillo
    - MICASA_URGENTE

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Tabla de contenido

ExFuncionario

Funciona gracias a WordPress