Tag: ESPHome

  • Pomiar odległości, temperatury oraz wilgotności

    Kiedyś wymyśliłem, że przydałaby się informacja, czy w garażu jest zaparkowany samochód. Wyszło całkiem proste urządzenie, które poza identyfikacją samochodu, jednocześnie weryfikuje – czy jest otwarta, czy zamknięta brama garażowa oraz mierzy temperaturę i wilgotność w garażu. Koszt ok 40 PLN (bez obudowy i zasilacza na microUSB).

    Czujnik temperatury jest opcjonalny.

    Ważne jest umiejscowienie całego urządzenia – na suficie, czujnik odległości skierowany w dół, nad końcem otwartej bramy garażowej, dzięki temu można wyłapać stany (otwarty garaż, auto/zamknięty garaż, brak auta/zamknięty garaż) dodatkowo czujnik musi być umieszczony nad zaparkowanym autem.

    Wykorzystane komponenty:

    • Czujnik odległości HC-SR04
    • Czujnik SI7021 (ja wykorzystałem wolny czujnik od Sonoff TH10, TH16, itd.)
    • Wemos D1 mini

    Poniżej schemat:

    plus podłączenie SI7021 na D5 (pin 12). Na schemacie nie zaznaczono masy i podłączenie zasilania do Wemos D1 mini.

    Oprogramowanie

    Należy wcześniej zainstalować dodatek ESPHome w HomeAssistant.

    Poniżej konfiguracja Wemos D1 mini w ESPHome. Należy dodatkowo utworzyć plik secrets.yaml w EspHome.

    esphome:
      name: wemos1
      platform: ESP8266
      board: d1_mini
    
    wifi:
      networks:
      - ssid: !secret ssid
        password: !secret password
    
      # Enable fallback hotspot (captive portal) in case wifi connection fails
      ap:
        ssid: "Wemos1 Fallback Hotspot"
        password: !secret password_fallback
    
    captive_portal:
    
    # Enable logging
    logger:
    
    # Enable Home Assistant API
    api:
    
    ota:
      - platform: esphome
      
    web_server:
    
    sensor:
      - platform: dht
        model: SI7021 
        pin: D5
        temperature:
          name: "garaz_temperature"
        humidity:
          name: "garaz_humidity"
        update_interval: 60s
        
      - platform: ultrasonic
        trigger_pin: D7
        echo_pin: D6
        timeout: 3 m
        update_interval: 3s
        name: "garaz_distance"    
        filters:
        - lambda: |-
             float MAX_DIFFERENCE = .3;  // adjust this!
             static float last_value_t = NAN;
             static int count_missed_t = 0;
             if (count_missed_t == 3) last_value_t = x;
             if (isnan(last_value_t) || std::abs(x - last_value_t) < MAX_DIFFERENCE) {
                if (count_missed_t)
                   ESP_LOGI("sensor", "New echo value %.3f", x);
                count_missed_t = 0;
                return last_value_t = x;
             } else {
                count_missed_t += 1;
                ESP_LOGW("sensor", "Missed echo value %.3f => %.3f, %d", last_value_t, x, count_missed_t);
                return last_value_t;
             }
        - sliding_window_moving_average:
             window_size: 256
             send_every: 1  
    mqtt:
      broker:  !secret mqtt_broker_ip
      username: !secret mqtt_username
      password: !secret mqtt_password

    Plik secrets.yaml

    #mqtt
    mqtt_broker_ip: 192.168.1.1
    mqtt_username: uzytkownik_mqtt
    mqtt_password: haslo_mqtt
    
    # Your Wi-Fi SSID and password
    ssid: 'nazwa_wifi'
    password: 'haslo_wifi'
    
    #Wifi Fallback Hotspot
    password_fallback: 'magiczne_haslo'

    Konfiguracja

    Home Assistant

    Czujnik jest wykrywany automatycznie przez Home Assistanta.

    Kod sensora

      - platform: template
        sensors:
          garaz:
            friendly_name: "Garaż"
            value_template: >-           
                {% if float(states("sensor.garaz_distance"))<float(0.30) -%}
                   Otwarty
                {% elif (float(states("sensor.garaz_distance"))>float(0.80)) and (float(states("sensor.garaz_distance"))<=float(1.10))  -%}
                   Auto 1
                {% elif (float(states("sensor.garaz_distance"))>float(1.10)) and (float(states("sensor.garaz_distance"))<=float(1.18))  -%}
                   Auto 2
                {% elif (float(states("sensor.garaz_distance"))>float(1.18)) and (float(states("sensor.garaz_distance"))<=float(1.30))  -%}
                   Auto 3
                {% elif (float(states("sensor.garaz_distance"))>float(1.30)) -%}
                   Pusty
                {% else -%}
                   ???
                {% endif -%}
            icon_template:
                mdi:car

    Należy dobrać odpowiednio wysokości, aby poprawnie wykrywać otwarcie garażu oraz poszczególne samochody (muszą się różnić wysokością dachu).

    Automatyzacje

    - id: 'auto_garaz_swiatla_on_gate'
      alias: 'Garaż - włącz światło (brama)'
      trigger:
        platform: state
        entity_id: sensor.garaz
        to: 'Otwarty'
      condition:
        - condition: state
          entity_id: light.garaz
          state: 'off'
          for:
            seconds: 10
      action:
        service: light.turn_on
        entity_id: light.garaz
    
    - id: 'openGarageNotification10m'
      alias: openGarageNotification10m
      description: 'Garaz - powiadomienie o otwarciu przez 10m'
      trigger:
      - platform: state
        entity_id:
        - sensor.garaz
        to: Otwarty
        for:
          hours: 0
          minutes: 10
          seconds: 0
      condition: []
      action:
      - service: script.notify_opengarage_10m
        data: {}
      mode: single

    i przykładowy skrypt z powiadomieniem o otwartym garażu (plik script.yaml)

      notify_opengarage_10m:
        alias: "Powiadomienie - Otwarty garaz przez 10min"
        sequence:
          - service: camera.snapshot
            target:
              entity_id: camera.esp32camgaraz_esp_cam
            data:
              filename: ../media/snapshot10m.jpg
          - service: notify.gmail_notifier
            data:
              title: "[HA] Garaż otwarty"
              message: "Garaż otwarty"
              data:
                images:
                - ../media/snapshot10m.jpg
  • Integracja z alarmem Satel Integra 64

    Istnieje oczywiście możliwość integracji przez moduł eth, ale ponieważ jest on kosztowny zaprojektowałem proste rozwiązanie wykorzystując wolne wyjścia w domowej centrali Satel Integra. Nie jest to dwukierunkowa integracja, a jedynie przekazywanie informacji od alarmu do HomeAssistant. Dzięki temu można stworzyć fajne automatyzacje na podstawie wykrytego ruchu. Koszt integracji ok 50 PLN

    W tym rozwiązaniu akumulator w centrali alarmowej jest wykorzystywany jako UPS dla RaspberryPI, co oczywiście skraca czas działania alarmu przy długich wyłączeniach prądu.

    Hardware

    • Konwerter poziomów logicznych dwukierunkowy, 4-kanałowy – Pololu – 2 szt.
    • Przetwornica Step-Down – 9-38V – na 5V – USB – 5A
    • NodeMCU (alternatywnie Wemos D1 mini – tańsze rozwiązanie, ja miałem pod ręką akurat wolny chipset NodeMCU)

    Schemat blokowy

    Zastosowałem 25W przetwornicę napięcia, aby z alarmu zasilić od razu RaspberryPI na którym jest uruchomiony HomeAssistant. Dzięki temu w przypadku braku zasilania RPi działa aż do wyczerpania baterii w alarmie.

    Ważne jest użycie i skonfigurowanie odpowiednich wyjść w na płycie Integra – nie wszystkie wyjścia są wyjściami wysokoprądowymi.

    Uwaga na schemacie nie zaznaczono masy.

    Widok płytki od strony elementów

    Software

    Alarm

    Konfiguracja w systemie alarmowym jest wykonana w oprogramowaniu DLOADX.

    Wyjścia typu Out są wysterowane przez 3 sekundy przez wejścia z czujek PIR

    Wyjście OUT Integra64OpisNodeMcu
    4Zasilanie 12V/3A: – Raspberry 5V/2,5A – NodeMCU 5V/300mA –
    5Załączony alarm w strefach: 1, 3D3/GPIO0
    6PIR1D1/GPIO5
    7PIR2D4/GPIO2
    9PIR3D2/GPIO4
    10PIR4D5/GPIO14
    12PIR5D0/GPIO16
    13PIR6D6/GPIO12
    14PIR7D7/GPIO13

    HomeAssistant

    ESPHome

    Należy wcześniej zainstalować addon ESPHome w HomeAssistant

    Konfiguracja NodeMCU w ESPHome. Należy dodatkowo utworzyć plik secrets.yaml

    esphome:
      name: alarm
      platform: ESP8266
      board: nodemcuv2
    
    wifi:
      networks:
      - ssid: !secret ssid
        password: !secret password
    
      # Enable fallback hotspot (captive portal) in case wifi connection fails
      ap:
        ssid: "Alarm Fallback Hotspot"
        password: !secret password_fallback
    
    captive_portal:
    
    # Enable logging
    logger:
      level: INFO
    
    # Enable Home Assistant API
    api:
      port: 6053
    
    ota:
      - platform: esphome
      
    #web_server:
    
    mqtt:
      broker:  !secret mqtt_broker_ip
      username: !secret mqtt_username
      password: !secret mqtt_password
    
    binary_sensor:
      - platform: gpio
        pin: 
          number: GPIO0
        filters:
          - invert:
          - delayed_on: 250ms
          - delayed_off: 250ms
        name: "alarm_1_3"
        
      - platform: gpio
        pin: 
          number: GPIO5
        filters:
          - invert:
          - delayed_on: 250ms
          - delayed_off: 250ms
        name: "ruch_pir1"
        device_class: motion
    
      - platform: gpio
        pin: 
          number: GPIO2
        filters:
          - invert:
          - delayed_on: 250ms
          - delayed_off: 250ms
        name: "ruch_pir2"
        device_class: motion
        
      - platform: gpio
        pin: 
          number: GPIO4
        filters:
          - invert:
          - delayed_on: 250ms
          - delayed_off: 250ms
        name: "ruch_pir3"
        device_class: motion
    
      - platform: gpio
        pin: 
          number: GPIO14
        filters:
          - invert:
          - delayed_on: 250ms
          - delayed_off: 250ms
        name: "ruch_pir4"
        device_class: motion
        
      - platform: gpio
        pin: 
          number: GPIO16
        filters:
          - invert:
          - delayed_on: 250ms
          - delayed_off: 250ms
        name: "ruch_pir5"   
        device_class: motion
        
      - platform: gpio
        pin: 
          number: GPIO12
        filters:
          - invert:
          - delayed_on: 250ms
          - delayed_off: 250ms
        name: "ruch_pir6"
        device_class: motion
        
      - platform: gpio
        pin:  
          number: GPIO13
        filters:
          - invert:
          - delayed_on: 250ms
          - delayed_off: 250ms
        name: "ruch_pir7"
        device_class: motion

    Plik secrets.yaml

    #mqtt
    mqtt_broker_ip: 192.168.1.1
    mqtt_username: uzytkownik_mqtt
    mqtt_password: haslo_mqtt
    
    # Your Wi-Fi SSID and password
    ssid: 'nazwa_wifi'
    password: 'haslo_wifi'
    
    #Wifi Fallback Hotspot
    password_fallback: 'magiczne_haslo'

    Przykładowe automatyzacje

    Włączenie/wyłączenie światła

    - id: 'auto_kuchnia_swiatla_on'
      alias: 'Kuchnia - Włącz światło'
      trigger:
        platform: state
        entity_id: binary_sensor.ruch_pir1
        from: 'off'
        to: 'on'
      condition:
        condition: and
        conditions:
        - condition: state
          entity_id: light.kuchnia
          state: 'off'
          for:
            seconds: 5
        - condition: template
          value_template: "{{ states.sun.sun.attributes.elevation  | int < 3 }}"
      action:
        service: light.turn_on
        entity_id: light.kuchnia
    
    - id: 'auto_kuchnia_swiatla_off'
      alias: 'Kuchnia - wyłącz po 3 min'
      trigger:
        platform: state
        entity_id: binary_sensor.ruch_pir1
        to: 'off'
        for: 
          minutes: 3
      condition:
        - condition: state
          entity_id: light.kuchnia
          state: 'on'
      action:
        service: light.turn_off
        entity_id: light.kuchnia

    Wyłączenie urządzeń przy załączeniu strefy w alarmie

    - id: 'auto_alarm_swiatla_off'
      alias: 'Alarm - Wyłącz światła przy załączonym alarmie'
      trigger:
        platform: state
        entity_id: binary_sensor.alarm_1_3
        from: 'off'
        to: 'on'
        for: 
          seconds: 15
      condition:
        - condition: state
          entity_id: group.swiatla_dol
          state: 'on'
      action:
        - service: light.turn_off
          entity_id: group.swiatla_dol
        - service: switch.turn_off
          entity_id: switch.pompa_wody
        - service: light.turn_off
          entity_id: light.lampki_choinkowe
        - service: media_player.turn_off
          entity_id: media_player.amplituner
        - service: media_player.turn_off
          entity_id: media_player.tv

    Linki

    https://esphome.io

    https://www.satel.pl/instrukcje