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

Komentarze

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *