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
Dodaj komentarz