Знакът на КАГАМИ КАГАМИ
kagami.bg/academy · lesson · machine-readable viewVERIFIED 2026-10-01 · UPDATED 2026-10-01
IDENTITY
module
Smart Greenhouse with Home Assistant · ESP32 + ESPHome + Home Assistant
series
Minitech (micro tech skills)
level
Intermediate (basic electronics and YAML helps)
duration
about 4 h for the software path; hardware build time depends on the greenhouse
prerequisites
a Raspberry Pi 5 or 4 (at least 2 GB RAM, card of at least 32 GB) or another machine for Home Assistant OS; an ESP32 dev board; sensors; low-voltage relay or MOSFET module
trust_label
VERIFIED 2026-10-01 (Home Assistant 2026.9, ESPHome 2026.9.1 docs and release; ESPHome YAML validated with "esphome config" 2026.9.1). NOT tested on hardware. Prices and crop ranges are carried over from the old lesson and not re-verified.
next
Monitoring on RPi5, Hailo and Frigate (Minitech)
PURPOSE

Teach a learner to build a small, local-only smart greenhouse: choose sensors, wire an ESP32, describe it in ESPHome YAML, see it in Home Assistant, automate a fan, a light and a timed irrigation pump with safety limits, and build a dashboard.

KEY CONCEPTS
COMMANDS / PATHS
CHECKLIST
NEXT MODULE

Monitoring on RPi5, Hailo and Frigate (Minitech) · offer: Quick experiment (kagami.bg/stalbata/)

SOURCES
TAGS
home-assistantesphomeesp32greenhouseautomationiotsafetyintermediate
ПРОВЕРЕНО · 01.10.2026 ОБНОВЕНО · 01.10.2026

Умна оранжерия с Home Assistant

Свързваш сензори към ESP32, описваш ги в ESPHome, виждаш всичко в Home Assistant и оставяш вентилатор, светлина и напояване да се управляват по правила — локално, без месечна такса и с предпазители срещу най-честите грешки.

⏱ около 4 ч Средно ниво Минитех Home Assistant · ESPHome · ESP32 · автоматизации
Home Assistant OS🔒 локално ESPHome (приложение в HA)🔒 локално HACS (по желание, карти от общността)🌐 глобален
🔄
ОБНОВЕНО · 01.10.2026 — какво
Старият документ беше справочник с красиви, но неподкрепени числа. Сега е урок със сверен код. Проверено: YAML на ESPHome е валидиран с esphome config (ESPHome 2026.9.1, в пясъчник, не на платка) — отговор „Configuration is valid!“; YAML за Home Assistant е проверен само като синтаксис (не е зареждан в HA). Не е тествано на хардуер. Версии към 01.10.2026: Home Assistant 2026.9, ESPHome 2026.9. Поправено: „Добавки → Магазин за добавки“ → Приложения (apps) от HA 2026.2; ESPHome ползва Device Builder; !secret беше в кавички и не работеше; ota: изисква platform: esphome; блокът automation: в ESPHome е невалиден и е заменен с твърд таймер на помпата; новият синтаксис на автоматизациите на HA (triggers / actions); „YL-69 е капацитивен“ — не е, YL-69 е резистивен; Gravity DFR0300 е EC сензор, не pH; коефициентът на YF-S201 беше 0,0045, правилният е 1/450 ≈ 0,002222; DHT22 и SHT31 вече нямат обща „точност“; MH-Z19B не е за „самокалибриране в оранжерия“; „Lovelace“ → табла (Dashboards); „от 80 €“ не съвпадаше с бюджета от ~98 €. Махнато: процентите „−40% вода“, „+20–35% растеж“ и др. (без източник), автоматизацията с CO₂ клапан (опасна за хората) и измислената визуализация на таблото. Непроверено ⚠️: цените в евро и диапазоните за отделните култури са пренесени от старата версия.

01Какво ще научиш

02Преди да започнеш

⚠️
Безопасност — прочети преди да свържеш каквото и да е
Вода и 230 V не вървят заедно. Помпа, вентилатор и светлина за оранжерия ползвай на ниско напрежение (5/12/24 V DC), от захранване със защитено изпълнение. Ако все пак трябва да превключваш 230 V, това го прави електротехник: с дефектнотокова защита, предпазител, IP65 кутия и разделяне на ниското от мрежовото напрежение (според местните норми). Дешев релеен модул не е защита.
Помпата не бива да зависи от един компютър. Ако Home Assistant се рестартира по средата на „включи, изчакай, изключи“, помпата остава включена. Затова в кода има твърд таймер в самото устройство.
CO₂. В този урок само мерим CO₂. Автоматично подаване от бутилка не е за начинаещи: NIOSH дава граница 5 000 ppm за работна смяна, 30 000 ppm за 15 минути и „непосредствена опасност за живота“ при 40 000 ppm.

03Стъпки

  1. Избери сензорите

    Защо? Всеки сензор е нова връзка, която може да се развали. Започни с малко, за да виждаш какво мериш.

    Какво меримСензорВръзкаБележка
    Температура и влажност на въздухаDHT22 (по-прецизен: SHT31)1 пин + резистор 10 kΩ към 3,3 VDHT22 е евтин и достатъчен за старт; SHT31 (I2C) е по-стабилен във влага.
    Влажност на почватаКапацитивен сензор, аналогов изходADCYL-69/YL-38 са резистивни и корозират. Калибрирай сам.
    СветлинаBH1750I2CМери lux (за хора), не PAR. Добро за тенденции.
    CO₂MH-Z19B (по-точен: SCD40)UART / I2CSCD40: ±(50 ppm + 5%) в 400–2000 ppm по данните на Sensirion.
    Температура на водатаDS18B20 (водоустойчив)1-Wire + резистор 4,7 kΩЕдин пин за няколко сензора.
    Разход на водаYF-S201импулсиОбхват 1–30 L/min; малка капкова помпа може да тече под това.
    pH и EC на хранителния разтворAtlas Scientific EZO или GravityI2C / аналоговоЗа по-късно. Gravity DFR0300 е EC сензор, не pH.
    💡
    Капацитивен или резистивен
    Капацитивният сензор не прекарва ток през почвата, затова не корозира по електродите. Срокът на живот зависи от запечатването на краищата — обещание „3+ години“ от старата версия не успяхме да потвърдим.
  2. Захранване, релета и свързване

    Защо този ред? Първо захранването и защитите, после сигналите. Повечето повреди идват от захранването.

    • ESP32: 5 V USB захранване, добре със запас; всички сензори — към 3,3 V, освен ако изрично изискват 5 V.
    • Помпа 12 V: MOSFET модул или релеен модул, с диод срещу обратно напрежение върху двигателя, отделно захранване и обща маса с ESP32.
    • Много релейни модули са с активно ниско управление — тогава в ESPHome добавяш inverted: true.
    • За кутията ползвай IP65; кабелите влизат отдолу, с „водно коляно“.
    Пин на ESP32 (примерен)Какво свързва
    GPIO21 / GPIO22I2C: BH1750 (SDA / SCL)
    GPIO13DHT22 (данни)
    GPIO34Сензор за почва (ADC1, само вход)
    GPIO4DS18B20 (1-Wire)
    GPIO16 / GPIO17UART: MH-Z19B (RX / TX)
    GPIO18Разходомер YF-S201 (импулси)
    GPIO26 / GPIO27 / GPIO25Помпа / вентилатор / светлина
    ⚠️
    Капан: не всички пинове са равни
    Пиновете се различават между платките — провери схемата на твоята. За аналогови сензори ползвай ADC1 (като GPIO34): ADC2 пиновете не работят надеждно при включен Wi-Fi. Разходомерът YF-S201 се захранва с 4,5 V и повече; сигналът към ESP32 трябва да е най-много 3,3 V — сверяване със схемата на модула ⚠️ (не е пробвано на платка).
  3. Инсталирай Home Assistant OS

    Следвай официалната инсталация за твоя хардуер (образ за Raspberry Pi 4 или 5 — две различни връзки). Защо OS? Само тази инсталация ти дава приложенията (apps), включително ESPHome. След старта отвори адреса, показан от инсталатора (по подразбиране homeassistant.local:8123), и създай потребител.

    Ако нямаш устройство: Home Assistant Green е готова кутия; виртуална машина на стар компютър също върши работа.

  4. Инсталирай ESPHome и първото устройство

    В Home Assistant: Settings → Apps → Install app → ESPHome Device Builder (в българския интерфейс: Настройки → Приложения; превода не сме сверявали ⚠️). Стартирай приложението и натисни New device. Първото качване става по USB (през браузъра Chrome или Edge, или с web.esphome.io); следващите — по въздуха (OTA).

    Парола за Wi-Fi? Не в YAML файла, а в secrets.yaml — виж долу.

  5. Опиши платката в YAML

    Защо YAML? Един текстов файл описва цялата платка — сензори, превключватели и защити. Файлът по-долу е валидиран с esphome config (ESPHome 2026.9.1); на платка не е пускан. Имената са на английски нарочно — така идентификаторите в Home Assistant са предвидими (sensor.greenhouse_node_1_air_temperature).

    YAML · secrets.yaml (примерни стойности — сложи свои)
    wifi_ssid: "име-на-твоята-мрежа"
    wifi_password: "твоята-парола-за-wifi"
    fallback_password: "друга-дълга-парола"
    api_key: "ключ, генериран от ESPHome при създаване на устройство"
    ota_password: "трета-дълга-парола"
    YAML · greenhouse.yaml — ESPHome
    esphome:
      name: greenhouse-node-1
      friendly_name: Greenhouse node 1
    
    esp32:
      board: esp32dev
      framework:
        type: esp-idf
    
    logger:
    
    api:
      encryption:
        key: !secret api_key
    
    ota:
      - platform: esphome
        password: !secret ota_password
    
    wifi:
      ssid: !secret wifi_ssid
      password: !secret wifi_password
      ap:
        ssid: "Greenhouse Fallback"
        password: !secret fallback_password
    
    # I2C bus: BH1750 light sensor
    i2c:
      sda: GPIO21
      scl: GPIO22
      scan: true
    
    # 1-Wire bus: DS18B20 water temperature (4.7 kOhm pull-up to 3.3 V)
    one_wire:
      - platform: gpio
        pin: GPIO4
    
    # UART: MH-Z19B CO2 sensor
    uart:
      id: mhz_uart
      tx_pin: GPIO17
      rx_pin: GPIO16
      baud_rate: 9600
    
    sensor:
      - platform: dht
        pin: GPIO13            # DHT22 data pin + 10 kOhm pull-up to 3.3 V
        model: DHT22
        temperature:
          name: "Air temperature"
        humidity:
          name: "Air humidity"
        update_interval: 30s
    
      - platform: mhz19
        uart_id: mhz_uart
        co2:
          name: "CO2"
        update_interval: 30s
        automatic_baseline_calibration: false
    
      - platform: bh1750
        name: "Light"
        address: 0x23
        update_interval: 30s
    
      - platform: adc      # capacitive soil sensor, analogue output
        pin: GPIO34        # ADC1 pin: works while Wi-Fi is on
        id: soil_moisture
        name: "Soil moisture"
        attenuation: 12db
        update_interval: 60s
        unit_of_measurement: "%"
        accuracy_decimals: 0
        filters:
          - calibrate_linear:   # EXAMPLE values: measure your own dry / wet
              - 2.80 -> 0      # sensor in air
              - 1.20 -> 100    # sensor in a glass of water
          - clamp:
              min_value: 0
              max_value: 100
    
      - platform: dallas_temp
        name: "Water temperature"
        update_interval: 30s
    
      - platform: pulse_counter  # YF-S201 flow meter (1-30 L/min)
        pin: GPIO18
        name: "Water flow"
        unit_of_measurement: "L/min"
        accuracy_decimals: 2
        filters:
          - multiply: 0.002222     # 1/450 (450 pulses per litre)
        total:
          name: "Water used"
          unit_of_measurement: "L"
          accuracy_decimals: 2
          filters:
            - multiply: 0.002222
    
      - platform: wifi_signal
        name: "Wi-Fi signal"
        update_interval: 60s
    
    binary_sensor:
      - platform: status
        name: "Status"
    
    switch:
      - platform: gpio
        pin: GPIO26
        id: irrigation_pump
        name: "Irrigation pump"
        restore_mode: ALWAYS_OFF
        # inverted: true   # uncomment for active-low relay modules
        on_turn_on:
          - delay: 3min    # hard stop on the device, even if Home Assistant is down
          - switch.turn_off: irrigation_pump
    
      - platform: gpio
        pin: GPIO27
        name: "Fan"
        restore_mode: ALWAYS_OFF
    
      - platform: gpio
        pin: GPIO25
        name: "Grow light"
        restore_mode: ALWAYS_OFF
    ✅
    Три правила в този файл
    1) !secret се пише без кавички — в кавички става обикновен текст. 2) Стойностите за почвения сензор (2,80 V → 0% и 1,20 V → 100%) са пример: измери сензора на въздух и в чаша вода. 3) Разходомерът: 450 импулса на литър е данни на типа YF-S201; тоест 1/450 ≈ 0,002222. Разликите между екземплярите са значителни — сверявай с мерителна кана.
    💡
    Защо MH-Z19B е с изключена автоматична калибровка
    Автоматичната корекция на нулата (ABC) приема, че поне веднъж на ден сензорът вижда чист въздух (около 400 ppm). В затворена оранжерия растенията през деня свалят CO₂ и такава предпоставка не е гарантирана, затова я изключваме. Ако искаш ръчна калибровка, ESPHome изисква 20 минути стабилна среда от около 400 ppm навън.
  6. Приеми устройството в Home Assistant

    След качването устройството се появява под Settings → Devices & services като открито ESPHome устройство — потвърди и въведи ключа за шифроване. Всеки сензор и превключвател става обект (entity). Провери идентификаторите им в списъка с обекти — в автоматизациите по-долу се предполага името „Greenhouse node 1“.

  7. Автоматизации — с ограничители

    Защо? Правило „тригер → условие → действие“ е лесно; трудното е да не остави нещо включено. Тук: вентилатор с хистерезис (включва се при 30 °C, изключва при 26 °C), напояване най-много два пъти на ден, твърд таймер на помпата в устройството и известие при изчезнал контролер.

    YAML · automations.yaml — Home Assistant
    - alias: "Greenhouse: fan on when hot"
      triggers:
        - trigger: numeric_state
          entity_id: sensor.greenhouse_node_1_air_temperature
          above: 30
          for:
            minutes: 2
      conditions:
        - condition: time
          after: "07:00:00"
          before: "21:00:00"
      actions:
        - action: switch.turn_on
          target:
            entity_id: switch.greenhouse_node_1_fan
        - action: notify.mobile_app_your_phone
          data:
            title: "Greenhouse: high temperature"
            message: "Air temperature is {{ states('sensor.greenhouse_node_1_air_temperature') }} °C"
    
    - alias: "Greenhouse: fan off when cool"
      triggers:
        - trigger: numeric_state
          entity_id: sensor.greenhouse_node_1_air_temperature
          below: 26
          for:
            minutes: 2
      actions:
        - action: switch.turn_off
          target:
            entity_id: switch.greenhouse_node_1_fan
    
    - alias: "Greenhouse: watering (max twice a day)"
      mode: single
      triggers:
        - trigger: time
          at: "07:00:00"
        - trigger: time
          at: "17:00:00"
      conditions:
        - condition: numeric_state
          entity_id: sensor.greenhouse_node_1_soil_moisture
          below: 35
      actions:
        - action: switch.turn_on
          target:
            entity_id: switch.greenhouse_node_1_irrigation_pump
        - delay:
            minutes: 2
        - action: switch.turn_off
          target:
            entity_id: switch.greenhouse_node_1_irrigation_pump
    
    - alias: "Greenhouse: sensor offline"
      triggers:
        - trigger: state
          entity_id: binary_sensor.greenhouse_node_1_status
          to: "off"
          for:
            minutes: 10
      actions:
        - action: notify.mobile_app_your_phone
          data:
            title: "Greenhouse: node offline"
            message: "The greenhouse controller has been offline for 10 minutes."
    ⚠️
    Капан: известията и идентификаторите
    Услугата за известия се казва notify.mobile_app_<име-на-телефона> — замени your_phone със своето, като инсталираш приложението Companion. Идентификаторите на обектите провери в Home Assistant, преди да пуснеш правило. Напояването по график е с праг 35% — той е пример; настрой го според калибровката.
    ✅
    Правило: два слоя защита на помпата
    Слой 1: в Home Assistant — mode: single, най-много две включвания на ден (в 07:00 и 17:00, по 2 минути) и условие за влажност. Слой 2: в самото устройство — помпата се изключва сама след 3 минути, дори Home Assistant да не работи. Първия тест прави с празна чаша вода и гледаш с очи.
    💡
    Осветление и сезони
    Светлина по прагове на lux (например включване под 2000 lx между 05:00 и 22:00) добавяш по същия модел. Прагове за лято и зима можеш да държиш в помощник „Input select“. Числата са примери — настрой ги според културата и според твоя BH1750.
  8. Направи табло

    Начин 1: в Home Assistant отвори Settings → Dashboards, създай табло и добави карти от интерфейса (карта с уред, история, плочка, списък с обекти). Начин 2: Edit dashboard → ⋮ → Raw configuration editor и постави YAML. Вградените карти са достатъчни; общностният магазин HACS 🌐 глобален добавя карти като Mini Graph Card и Mushroom (неофициални; внимавай какво инсталираш).

    YAML · dashboard — Home Assistant
    title: Greenhouse
    views:
      - title: Overview
        icon: mdi:greenhouse
        cards:
          - type: gauge
            entity: sensor.greenhouse_node_1_air_temperature
            name: Air temperature
            min: 0
            max: 50
            severity:
              green: 0
              yellow: 30
              red: 38
          - type: gauge
            entity: sensor.greenhouse_node_1_soil_moisture
            name: Soil moisture
            min: 0
            max: 100
          - type: history-graph
            title: CO2 and light, last 24 h
            hours_to_show: 24
            entities:
              - sensor.greenhouse_node_1_co2
              - sensor.greenhouse_node_1_light
          - type: entities
            title: Controls
            entities:
              - switch.greenhouse_node_1_irrigation_pump
              - switch.greenhouse_node_1_fan
              - switch.greenhouse_node_1_grow_light

    Отдалечен достъп. Не отваряй Home Assistant директно към интернет. Варианти: Home Assistant Cloud от Nabu Casa (платена; в ЕС около €7,50 на месец или €75 на година — сверявай на официалната страница ⚠️) или собствен VPN.

  9. Бюджет и параметри по култури — ориентири ⚠️

    Числата в тази стъпка са пренесени от старата версия и не са сверени с източник на 01.10.2026. Ползвай ги като отправна точка, не като факт. Цените на Raspberry Pi през 2026 г. се вдигнаха заради цената на паметта — виж текущата преди покупка.

    НивоКакво включваОриентир (€)
    НачинаещRaspberry Pi 4 (2 GB) + карта, 2 × ESP32, 2 × DHT22, 3 капацитивни сензора за почва, BH1750, релеен модул, помпа 5 V, захранвания~98 (сума на старите цени)
    СредноRaspberry Pi 5 + NVMe, 3 × ESP32-S3, 3 × SHT31, MH-Z19B, 2 × DS18B20, pH сензор, Wi-Fi релета, разходомер, LED светлина 45 W, шкаф~299
    НапредналHome Assistant Green или мини компютър, 6 × ESP32-S3, SCD40, Atlas pH и EC, Zigbee, капкова система, LED 200 W, UPS и IP65 шкаф, таблет~977
    КултураТ° ден (°C)Т° нощ (°C)Влажност (%)pH на водата
    Домати22–2616–1860–706,0–6,5
    Краставици24–2818–2070–806,0–7,0
    Пипер23–2716–1860–706,0–6,8
    Маруля и листни18–2212–1550–706,0–7,0
    Билки (босилек, магданоз)20–2415–1850–656,0–7,0
    Ягоди18–2410–1460–755,5–6,5
    Броколи и зеле15–208–1260–806,0–7,5
    Орхидеи18–2514–1860–805,5–6,5
    📈
    Какво да очакваш от резултатите
    Старият урок обещаваше „−35–40% вода“ и „+20–35% растеж“. Без източник не ги повтаряме. Измери сам: разходомерът дава литрите, таблото — историята. Сравни две седмици преди и след автоматизацията.

04Проверка

Чеклист

Тест

1. Как се записва паролата за Wi-Fi в YAML на ESPHome?

2. Защо помпата има таймер в самото устройство?

3. Кой сензор за почва е резистивен и корозира?

4. Как се казват „добавките“ в Home Assistant от версия 2026.2?

05Какво следва

06Източници

  1. Home Assistant: installation — Типове инсталация.
  2. Home Assistant on Raspberry Pi — Pi 4 или 5, поне 2 GB, карта поне 32 GB.
  3. Home Assistant Apps — Приложенията (по-рано add-ons).
  4. Home Assistant Dashboards и Gauge — Таблата и картата с уред.
  5. Automations — Тригери, условия, действия.
  6. Companion app — Известия notify.mobile_app_….
  7. Home Assistant Cloud — Платеният отдалечен достъп.
  8. ESPHome: Getting started with Home Assistant — Device Builder.
  9. DHT · MH-Z19 · BH1750 · ADC · Dallas · Pulse counter · GPIO switch — Документацията на компонентите.
  10. ESPHome Web — Първо качване от браузъра.
  11. Sensirion SCD40 — Точност ±(50 ppm + 5%) в 400–2000 ppm.
  12. DFRobot Gravity Analog EC Meter — DFR0300 е EC сензор.
  13. NIOSH: Carbon dioxide — Граници на експозиция.
  14. HACS — Общностен магазин за карти (неофициален).