3 Commits

Author SHA1 Message Date
1c839091b6 sprinkler - small fix
Co-authored-by: Copilot <copilot@github.com>
2026-05-25 18:05:26 +03:00
7e7abce6b6 Compiled bins 2026-05-25 14:59:15 +03:00
565195d60a core - freese precedence over dizable, sprinkler - ON then DRY, HA docs
Co-authored-by: Copilot <copilot@github.com>
2026-05-25 12:14:43 +03:00
23 changed files with 51520 additions and 48308 deletions

View File

@@ -17,4 +17,5 @@
-DRESTART_LAN_ON_MQTT_ERRORS -DRESTART_LAN_ON_MQTT_ERRORS
-DOTA_PORT=80 -DOTA_PORT=80
-DMERCURY_ENABLE -DMERCURY_ENABLE
-D ROTARYENCODER -D ROTARYENCODER
-D SPRINKLER_ENABLE

View File

@@ -59,4 +59,5 @@
-D CORS=\"*\" -D CORS=\"*\"
-D REDIRECTION_URL=\"http://lazyhome.ru/pwa\" -D REDIRECTION_URL=\"http://lazyhome.ru/pwa\"
#-DMERCURY_ENABLE #-DMERCURY_ENABLE
-D ROTARYENCODER -D ROTARYENCODER
-D SPRINKLER_ENABLE

View File

@@ -74,4 +74,5 @@
-D CORS=\"*\" -D CORS=\"*\"
-D REDIRECTION_URL=\"http://lazyhome.ru/pwa\" -D REDIRECTION_URL=\"http://lazyhome.ru/pwa\"
#-DMERCURY_ENABLE #-DMERCURY_ENABLE
-D ROTARYENCODER -D ROTARYENCODER
-D SPRINKLER_ENABLE

View File

@@ -17,4 +17,5 @@
-D CORS=\"*\" -D CORS=\"*\"
-D REDIRECTION_URL=\"http://lazyhome.ru/pwa\" -D REDIRECTION_URL=\"http://lazyhome.ru/pwa\"
#-DMERCURY_ENABLE #-DMERCURY_ENABLE
-D ROTARYENCODER -D ROTARYENCODER
-D SPRINKLER_ENABLE

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,894 @@
# Исчерпывающее руководство по настройке системы полива в Home Assistant
Это руководство шаг за шагом проведёт вас через установку и настройку многоканальной системы полива на базе [lighthub](https://github.com/anklimov/lighthub), интегрированной с Home Assistant через MQTT. В результате вы получите красивую и функциональную панель управления, которая включает:
- визуализацию уровня воды в баке (пусто / наполовину / полный),
- индикацию работы водопровода, дренажного и основного насосов,
- управление тремя зонами полива с заданием времени и прогресс-баром,
- интерактивную корректировку выполненного времени через проценты,
- историю ключевых параметров по клику на иконки.
---
## 1. Предварительные требования
- Установленный и настроенный [Home Assistant](https://www.home-assistant.io/) (любая версия, поддерживающая Lovelace).
- Настроенный MQTT-брокер (например, Mosquitto) и интеграция MQTT в Home Assistant.
- [HACS](https://hacs.xyz/) (Home Assistant Community Store) для установки кастомных карт.
> **Примечание:** Конфигурация MQTTдатчиков и устройств уже готова и будет приведена ниже. Предполагается, что ваш контроллер lighthub уже отправляет данные в соответствующие топики.
---
## 2. Установка кастомных карт через HACS
Для корректной работы панели необходимо установить следующие карты. Все они доступны в HACS.
1. Откройте **HACS****Frontend****Explore & Download Repositories**.
2. Поочерёдно найдите и установите каждую из перечисленных ниже карт.
3. После установки **обновите страницу** браузера (или перезагрузите интерфейс Home Assistant).
### Список обязательных карт
| Название | Репозиторий (для ручного добавления, если не находится) | Назначение |
|------------------------------|----------------------------------------------------------|------------|
| **Vertical Stack In Card** | `ofekashery/vertical-stack-in-card` | Объединение нескольких карточек в одну с общим фоном |
| **Button Card** | `custom-cards/button-card` | Гибкая карточка с динамическими иконками, анимацией и состояниями |
| **Bar Card** | `spacerokk/bar-card` (активный форк) | Прогресс-бар для отображения выполнения полива |
| **Mushroom Cards** | `piitaya/lovelace-mushroom` | Компактные и стильные карточки для датчиков и переключателей |
| **Slider Entity Row** | `thomasloven/lovelace-slider-entity-row` | Ползунок для настройки времени в moreinfo окнах (не обязателен, но используется в стандартном окне `number`) |
| **Card Mod** | `thomasloven/lovelace-card-mod` | Позволяет добавлять произвольные CSSстили к карточкам |
> **Важно:** Если какая‑то карта не отображается в HACS, добавьте её вручную через **HACS → ⋮ → Пользовательские репозитории**. В поле URL вставьте ссылку на GitHubрепозиторий, категорию выберите **Lovelace**.
---
## 3. Настройка MQTTсущностей
Вся логика обмена данными с контроллером lighthub заложена в MQTTконфигурации. Скопируйте приведённый ниже блок в файл `configuration.yaml` (или в отдельный файл, подключённый через `mqtt: !include mqtt.yaml`).
```yaml
# Пример размещения в configuration.yaml
mqtt:
switch:
- name: "Полив"
state_topic: "edem/s_out/sprinkler/cmd"
command_topic: "edem/air/sprinkler/cmd"
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
- name: "Полив север"
state_topic: "edem/s_out/sprinkler/nord/cmd"
command_topic: "edem/air/sprinkler/nord/cmd"
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
- name: "Полив юг"
state_topic: "edem/s_out/sprinkler/south/cmd"
command_topic: "edem/air/sprinkler/south/cmd"
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
- name: "Полив капельный"
state_topic: "edem/s_out/sprinkler/trees/cmd"
command_topic: "edem/air/sprinkler/trees/cmd"
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
- name: "Полив розетки"
state_topic: "edem/s_out/sprinkler/outlets/cmd"
command_topic: "edem/air/sprinkler/outlets/cmd"
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
button:
- name: "Полив сброс"
command_topic: "edem/air/sprinkler/cmd"
payload_press: "RESET"
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
- name: "Полив блокировка"
command_topic: "edem/air/sprinkler/cmd"
payload_press: "FREEZE"
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
- name: "Полив разблокировка"
command_topic: "edem/air/sprinkler/cmd"
payload_press: "UNFREEZE"
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
- name: "Полив разрешить"
command_topic: "edem/air/sprinkler/cmd"
payload_press: "ENABLE"
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
- name: "Полив запретить"
command_topic: "edem/air/sprinkler/cmd"
payload_press: "DISABLE"
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
- name: "Полив осушение бака"
command_topic: "edem/air/sprinkler/cmd"
payload_press: "DRY"
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
number:
- name: "Полив юг"
state_topic: "edem/s_out/sprinkler/south/set"
command_topic: "edem/air/sprinkler/south/set"
min: 0
max: 6000
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
- name: "Полив север"
state_topic: "edem/s_out/sprinkler/nord/set"
command_topic: "edem/air/sprinkler/nord/set"
min: 0
max: 6000
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
- name: "Полив капельный"
state_topic: "edem/s_out/sprinkler/trees/set"
command_topic: "edem/air/sprinkler/trees/set"
min: 0
max: 6000
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
- name: "Полив юг выполнено"
state_topic: "edem/s_out/sprinkler/south/val"
command_topic: "edem/air/sprinkler/south/val"
min: 0
max: 60000
mode: slider
icon: "mdi:timer-sand"
unit_of_measurement: 'sec'
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
- name: "Полив север выполнено"
state_topic: "edem/s_out/sprinkler/nord/val"
command_topic: "edem/air/sprinkler/nord/val"
min: 0
max: 60000
mode: slider
icon: "mdi:timer-sand"
unit_of_measurement: 'sec'
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
- name: "Полив капельный выполнено"
state_topic: "edem/s_out/sprinkler/trees/val"
command_topic: "edem/air/sprinkler/trees/val"
min: 0
max: 60000
mode: slider
icon: "mdi:timer-sand"
unit_of_measurement: 'sec'
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
sensor:
- name: "Полив бак Макс"
state_topic: "edem/s_out/sprinkler/$wMax"
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
- name: "Полив бак Мin"
state_topic: "edem/s_out/sprinkler/$wMin"
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
- name: "Полив водопровод"
state_topic: "edem/s_out/sprinkler/$rVIN"
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
- name: "Полив дренаж вкл"
state_topic: "edem/s_out/sprinkler/$rDren"
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
- name: "Полив дренаж качает"
state_topic: "edem/s_out/sprinkler/$fbDren"
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
- name: "Полив насос вкл"
state_topic: "edem/s_out/sprinkler/$rPump"
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
- name: "Полив насос качает"
state_topic: "edem/s_out/sprinkler/$fbPump"
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
- name: "Полив состояние"
state_topic: "edem/s_out/sprinkler/$state"
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
- name: "Полив ошибка"
state_topic: "edem/s_out/sprinkler/$fault"
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
- name: "Поливаем юг"
state_topic: "edem/s_out/sprinkler/south/$state"
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
- name: "Поливаем север"
state_topic: "edem/s_out/sprinkler/nord/$state"
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
- name: "Поливаем капельно"
state_topic: "edem/s_out/sprinkler/trees/$state"
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
- name: "Полив розетка статус"
state_topic: "edem/s_out/sprinkler/outlets/$state"
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
- name: "Полив блокировки"
state_topic: "edem/s_out/sprinkler/ctrl"
availability_topic: "edem/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
```
> **Пояснение:**
> - `switch` переключатели для запуска/остановки зон и общий переключатель.
> - `button` кнопки для сброса, блокировки, разрешения и осушения бака.
> - `number` задание времени полива (уставки) и выполненное время (с возможностью ручной корректировки).
> - `sensor` датчики состояния поплавков (`$wMax`, `$wMin`), водопровода, насосов, статуса полива, ошибок и т.д.
После добавления конфигурации **перезагрузите YAML** (Настройки → Сервер → Перезагрузить конфигурацию YAML).
---
## 4. Настройка templateсущностей
Для работы панели необходимы два типа вычислимых объектов:
- **Уровень бака в процентах** (на основе поплавков).
- **Прогресс полива в процентах** для каждой зоны (с возможностью двусторонней синхронизации: проценты ↔ секунды).
Добавьте следующий блок в `configuration.yaml` (если у вас уже есть секция `template:`, объедините её с этим содержимым, сохранив правильные отступы):
```yaml
template:
# Сенсор уровня бака
- sensor:
- name: "Полив бак уровень"
state: >
{% if states('sensor.poliv_bak_maks') == 'ON' %}
100
{% elif states('sensor.poliv_bak_min') == 'ON' %}
50
{% else %}
0
{% endif %}
# Числовые шаблоны прогресса (проценты)
- number:
- name: "Полив юг прогресс"
state: >
{% set zadanie = states('number.poliv_iug') | float(0) %}
{% set vypolneno = states('number.poliv_iug_vypolneno') | float(0) %}
{{ ((vypolneno / zadanie * 100) | round(0)) if zadanie > 0 else 0 }}
set_value:
- service: number.set_value
target:
entity_id: number.poliv_iug_vypolneno
data:
value: >
{% set zadanie = states('number.poliv_iug') | float(0) %}
{{ ((value | float(0)) * zadanie / 100) | round(0) }}
min: 0
max: 100
step: 1
unit_of_measurement: "%"
icon: mdi:progress-clock
- name: "Полив север прогресс"
state: >
{% set zadanie = states('number.poliv_sever') | float(0) %}
{% set vypolneno = states('number.poliv_sever_vypolneno') | float(0) %}
{{ ((vypolneno / zadanie * 100) | round(0)) if zadanie > 0 else 0 }}
set_value:
- service: number.set_value
target:
entity_id: number.poliv_sever_vypolneno
data:
value: >
{% set zadanie = states('number.poliv_sever') | float(0) %}
{{ ((value | float(0)) * zadanie / 100) | round(0) }}
min: 0
max: 100
step: 1
unit_of_measurement: "%"
icon: mdi:progress-clock
- name: "Полив капельный прогресс"
state: >
{% set zadanie = states('number.poliv_kapelnyi') | float(0) %}
{% set vypolneno = states('number.poliv_kapelnyi_vypolneno') | float(0) %}
{{ ((vypolneno / zadanie * 100) | round(0)) if zadanie > 0 else 0 }}
set_value:
- service: number.set_value
target:
entity_id: number.poliv_kapelnyi_vypolneno
data:
value: >
{% set zadanie = states('number.poliv_kapelnyi') | float(0) %}
{{ ((value | float(0)) * zadanie / 100) | round(0) }}
min: 0
max: 100
step: 1
unit_of_measurement: "%"
icon: mdi:progress-clock
```
**Как это работает:**
- `state` динамически вычисляет процент выполнения на основе заданного времени (`number.poliv_...`) и выполненного (`number.poliv_..._vypolneno`).
- `set_value` при ручном изменении процента (через ползунок или ввод) пересчитывает его в секунды и отправляет команду в контроллер через `number.set_value` для выполненного времени. Таким образом, можно вручную скорректировать прогресс, и значение сразу уйдёт в MQTT.
- Бак определяется по поплавкам: если активен `$wMax` → 100%, если только `$wMin` → 50%, иначе 0%.
Снова **перезагрузите YAMLконфигурацию**.
---
## 5. Создание панели управления (Dashboard)
### 5.1. Создание новой панели
1. Перейдите в **Настройки****Панели** (Dashboards).
2. Нажмите **Создать панель** (Add Dashboard).
- Название: `💧 Полив`
- Режим панели: **Панель (одна карточка)** *Panel (1 card)*.
3. Нажмите **Создать**.
### 5.2. Переход в редактор YAML
Сразу после создания панель откроется в графическом редакторе.
Нажмите на три точки **⋮** в правом верхнем углу и выберите **Редактор YAML**.
### 5.3. Вставка финального YAML
Удалите всё содержимое (обычно там `type: panel\npath: ""\ncards: []`) и вставьте следующий код:
```yaml
views:
- type: panel
path: ''
cards:
- type: custom:vertical-stack-in-card
title: 💧 Система полива
cards:
# ── Общее состояние ──
- type: horizontal-stack
cards:
- type: custom:mushroom-entity-card
entity: sensor.poliv_sostoianie
name: Статус
primary_info: state
icon: mdi:state-machine
- type: custom:mushroom-entity-card
entity: sensor.poliv_blokirovki
name: Режим
primary_info: state
icon: mdi:lock
# ── Бак ──
- type: custom:mushroom-template-card
primary: Бак воды
secondary: |
{% set lvl = states('sensor.poliv_bak_uroven') %}
{% if lvl == '100' %} Полный
{% elif lvl == '50' %} Наполовину
{% else %} Пустой {% endif %}
icon: mdi:battery
icon_color: |
{% set lvl = states('sensor.poliv_bak_uroven') %}
{% if lvl == '100' %} green
{% elif lvl == '50' %} orange
{% else %} grey {% endif %}
tap_action:
action: more-info
entity: sensor.poliv_bak_uroven
card_mod:
style: |
ha-card {
--mush-icon-size: 24px;
height: 60px;
}
- type: divider
# ── Водопровод ──
- type: custom:mushroom-template-card
primary: Водопровод
secondary: |
{% if states('sensor.poliv_vodoprovod') == 'ON' %} Вкл
{% else %} Выкл {% endif %}
icon: mdi:water-pump
icon_color: |
{% if states('sensor.poliv_vodoprovod') == 'ON' %} blue
{% else %} grey {% endif %}
tap_action:
action: more-info
entity: sensor.poliv_vodoprovod
card_mod:
style: |
ha-card {
--mush-icon-size: 24px;
height: 60px;
}
# ── Насосы ──
- type: horizontal-stack
cards:
- type: custom:mushroom-template-card
primary: Дренаж
secondary: |
{% set pwr = states('sensor.poliv_drenazh_vkl') %}
{% set pump = states('sensor.poliv_drenazh_kachaet') %}
{% if pwr == 'ON' and pump == 'ON' %} Качает
{% elif pwr == 'ON' %} Вкл
{% else %} Выкл {% endif %}
icon: mdi:pump
icon_color: |
{% set pwr = states('sensor.poliv_drenazh_vkl') %}
{% set pump = states('sensor.poliv_drenazh_kachaet') %}
{% if pwr == 'ON' and pump == 'ON' %} red
{% elif pwr == 'ON' %} green
{% else %} grey {% endif %}
tap_action:
action: more-info
entity: sensor.poliv_drenazh_kachaet
card_mod:
style: |
ha-card {
--mush-icon-size: 24px;
height: 65px;
}
- type: custom:mushroom-template-card
primary: Помпа
secondary: |
{% set pwr = states('sensor.poliv_nasos_vkl') %}
{% set pump = states('sensor.poliv_nasos_kachaet') %}
{% if pwr == 'ON' and pump == 'ON' %} Качает
{% elif pwr == 'ON' %} Вкл
{% else %} Выкл {% endif %}
icon: mdi:pump
icon_color: |
{% set pwr = states('sensor.poliv_nasos_vkl') %}
{% set pump = states('sensor.poliv_nasos_kachaet') %}
{% if pwr == 'ON' and pump == 'ON' %} red
{% elif pwr == 'ON' %} green
{% else %} grey {% endif %}
tap_action:
action: more-info
entity: sensor.poliv_nasos_kachaet
card_mod:
style: |
ha-card {
--mush-icon-size: 24px;
height: 65px;
}
- type: divider
# ── Управление циклом ──
- type: entities
title: Управление циклом
show_header_toggle: false
entities:
- entity: switch.poliv
name: Полив
icon: mdi:sprinkler
- entity: switch.poliv_rozetki
name: Водяная розетка
icon: mdi:pipe-valve
- entity: button.poliv_sbros
name: Запуск всех зон
icon: mdi:play
- entity: button.poliv_blokirovka
name: Заморозить
icon: mdi:snowflake
- entity: button.poliv_razblokirovka
name: Разморозить
icon: mdi:snowflake-melt
- entity: button.poliv_zapretit
name: Запретить полив
icon: mdi:cancel
- entity: button.poliv_razreshit
name: Разрешить полив
icon: mdi:check-circle
- entity: button.poliv_osushenie_baka
name: Осушение бака
icon: mdi:hair-dryer
- type: divider
# ── Северная зона ──
- type: custom:vertical-stack-in-card
title: 🌿 Северная зона
cards:
- type: horizontal-stack
cards:
# Выключатель
- type: custom:mushroom-entity-card
entity: switch.poliv_sever
show_name: false
show_icon: false
show_state: false
layout: horizontal
# Время
- type: custom:mushroom-entity-card
entity: number.poliv_sever
name: Время
icon: mdi:timer-edit
layout: horizontal
card_mod:
style: |
ha-card {
--mush-icon-size: 24px;
height: 48px;
flex: 1 1 0;
}
- type: conditional
conditions:
- entity: number.poliv_sever
state_not: '0'
card:
type: custom:vertical-stack-in-card
title: ''
cards:
- type: horizontal-stack
cards:
- type: custom:button-card
entity: sensor.polivaem_sever
show_name: false
show_state: false
icon: mdi:sprinkler
tap_action:
action: more-info
entity: sensor.polivaem_sever
state:
- value: 'ON'
color: green
styles:
icon:
- animation: pulse 1.5s infinite
- value: 'OFF'
color: grey
styles:
icon:
- animation: none
styles:
card:
- height: 40px
- width: 40px
icon:
- width: 24px
- height: 24px
- type: custom:mushroom-template-card
primary: ''
secondary: >
Выполнено: {{ states('number.poliv_sever_vypolneno')
}} / {{ states('number.poliv_sever') }} с
icon: ''
tap_action:
action: more-info
entity: number.poliv_sever_progress
card_mod:
style: |
ha-card {
height: 40px;
margin-top: 0px;
}
- type: custom:bar-card
entities:
- entity: number.poliv_sever_progress
name: Прогресс
icon: mdi:progress-clock
max: 100
severity:
- from: 0
to: 25
color: red
- from: 26
to: 75
color: orange
- from: 76
to: 100
color: green
unit_of_measurement: '%'
- type: divider
# ── Южная зона ──
- type: custom:vertical-stack-in-card
title: 🌿 Южная зона
cards:
- type: horizontal-stack
cards:
- type: custom:mushroom-entity-card
entity: switch.poliv_iug
show_name: false
show_icon: false
show_state: false
layout: horizontal
- type: custom:mushroom-entity-card
entity: number.poliv_iug
name: Время
icon: mdi:timer-edit
layout: horizontal
card_mod:
style: |
ha-card {
--mush-icon-size: 24px;
height: 48px;
flex: 1 1 0;
}
- type: conditional
conditions:
- entity: number.poliv_iug
state_not: '0'
card:
type: custom:vertical-stack-in-card
title: ''
cards:
- type: horizontal-stack
cards:
- type: custom:button-card
entity: sensor.polivaem_iug
show_name: false
show_state: false
icon: mdi:sprinkler
tap_action:
action: more-info
entity: sensor.polivaem_iug
state:
- value: 'ON'
color: green
styles:
icon:
- animation: pulse 1.5s infinite
- value: 'OFF'
color: grey
styles:
icon:
- animation: none
styles:
card:
- height: 40px
- width: 40px
icon:
- width: 24px
- height: 24px
- type: custom:mushroom-template-card
primary: ''
secondary: >
Выполнено: {{ states('number.poliv_iug_vypolneno')
}} / {{ states('number.poliv_iug') }} с
icon: ''
tap_action:
action: more-info
entity: number.poliv_iug_progress
card_mod:
style: |
ha-card {
height: 40px;
margin-top: 0px;
}
- type: custom:bar-card
entities:
- entity: number.poliv_iug_progress
name: Прогресс
icon: mdi:progress-clock
max: 100
severity:
- from: 0
to: 25
color: red
- from: 26
to: 75
color: orange
- from: 76
to: 100
color: green
unit_of_measurement: '%'
- type: divider
# ── Капельная зона ──
- type: custom:vertical-stack-in-card
title: 🌿 Капельная зона
cards:
- type: horizontal-stack
cards:
- type: custom:mushroom-entity-card
entity: switch.poliv_kapelnyi
show_name: false
show_icon: false
show_state: false
layout: horizontal
- type: custom:mushroom-entity-card
entity: number.poliv_kapelnyi
name: Время
icon: mdi:timer-edit
layout: horizontal
card_mod:
style: |
ha-card {
--mush-icon-size: 24px;
height: 48px;
flex: 1 1 0;
}
- type: conditional
conditions:
- entity: number.poliv_kapelnyi
state_not: '0'
card:
type: custom:vertical-stack-in-card
title: ''
cards:
- type: horizontal-stack
cards:
- type: custom:button-card
entity: sensor.polivaem_kapelno
show_name: false
show_state: false
icon: mdi:watering-can
tap_action:
action: more-info
entity: sensor.polivaem_kapelno
state:
- value: 'ON'
color: green
styles:
icon:
- animation: pulse 1.5s infinite
- value: 'OFF'
color: grey
styles:
icon:
- animation: none
styles:
card:
- height: 40px
- width: 40px
icon:
- width: 24px
- height: 24px
- type: custom:mushroom-template-card
primary: ''
secondary: >
Выполнено: {{
states('number.poliv_kapelnyi_vypolneno') }} / {{
states('number.poliv_kapelnyi') }} с
icon: ''
tap_action:
action: more-info
entity: number.poliv_kapelnyi_progress
card_mod:
style: |
ha-card {
height: 40px;
margin-top: 0px;
}
- type: custom:bar-card
entities:
- entity: number.poliv_kapelnyi_progress
name: Прогресс
icon: mdi:progress-clock
max: 100
severity:
- from: 0
to: 25
color: red
- from: 26
to: 75
color: orange
- from: 76
to: 100
color: green
unit_of_measurement: '%'
```
Нажмите **Сохранить** панель готова к использованию.
---
## 6. Как пользоваться панелью
![sprinkler_1.jpeg](sprinkler_1.jpeg)
![sprinkler_2.jpeg](sprinkler_2.jpeg)
- **Общее состояние:** Отображает статус системы и режим (заморозка/разрешено/запрещено). Ошибка не показывается, но иконка станет красной при неисправности.
- **Бак:** Иконка батарейки меняет цвет и текст в зависимости от уровня воды (пусто/наполовину/полный). Нажатие открывает историю уровня.
- **Водопровод и насосы:** Показывают текущий статус (Выкл/Вкл/Качает) с цветовой индикацией. Клик история соответствующего датчика.
- **Управление циклом:** Общий переключатель «Полив», кнопки запуска всех зон, заморозки, запрета, осушения бака. Работают как обычные MQTTкоманды.
- **Зоны полива:**
1. **Включение зоны** крайний левый переключатель (тумблер).
2. **Время** поле с кнопками +/- для задания уставки полива в секундах.
3. Если время > 0, под строкой появятся:
- Индикатор полива (спринклер/лейка) цветной, с анимацией пульсации при работе. Нажатие открывает историю активности зоны.
- Строка «Выполнено: X / Y с» абсолютное значение. Нажатие открывает окно редактирования прогресса в процентах.
- Прогресс-бар визуальное отображение процента выполнения (красный → оранжевый → зелёный).
- **Корректировка прогресса:** Кликните на строку «Выполнено…» → появится слайдер 0-100%. Измените процент, и соответствующее количество секунд сразу отправится в контроллер (автоматический пересчёт).
---
## 7. Возможные проблемы и их решение
| Проблема | Вероятная причина | Решение |
|----------|-------------------|---------|
| Не отображаются прогресс‑бары | Отсутствует `bar-card` или не созданы `template number` | Проверьте HACS, установите карту. Убедитесь, что templateчисла добавлены и конфигурация перезагружена. |
| Иконка полива не меняет цвет | Неправильное имя датчика `sensor.polivaem_...` | Проверьте точное название в разделе **Состояния**. Поправьте в YAML панели. |
| Тумблер включения зоны не видим | Не установлена карта `mushroom-entity-card` или перекрыт стилями | Убедитесь, что `mushroom-cards` установлены. В нашем финальном YAML тумблер видим всегда. |
| Ошибка «expected float» при движении слайдера прогресса | Используется `slider-entity-row` в активном режиме, а динамический `max` задан некорректно | В нашем решении прогресс‑бар только визуальный (`bar-card`), ручная корректировка через `template number` с собственным `set_value`. Ошибки быть не должно. |
| Бак всегда показывает «Пустой» | Неправильно работают поплавки или датчики `$wMax`/`$wMin` не обновляются | Проверьте в MQTTтопиках фактические значения. Убедитесь, что поплавки подключены и отправляют ON/OFF. |
---
## 8. Дополнительная информация
- Все команды управления (вкл/выкл зон, сброс, заморозка и т.д.) отправляются напрямую в контроллер lighthub через MQTT.
- Система использует `availability_topic` для отслеживания связи с контроллером. При пропадании сигнала все элементы станут недоступны (серые).
- При желании можно расширить панель новыми зонами, копируя структуру существующих и добавляя соответствующие `number`, `switch` и `sensor` в MQTTконфигурацию и `template`.
---
## Приложение: полный финальный YAML панели
Код уже приведён в разделе 5.3. Используйте его как окончательную версию.
---
Теперь ваша система полива полностью интегрирована в Home Assistant. Вы можете управлять поливом с мобильного телефона, отслеживать историю и быть уверенными, что всё под контролем!

View File

@@ -204,7 +204,7 @@ root/s_out/sprinkler/$wMin - ON/OFF достигнут минимум воды
root/s_out/sprinkler/$rDren - ON/OFF включено реле дренажного насоса root/s_out/sprinkler/$rDren - ON/OFF включено реле дренажного насоса
root/s_out/sprinkler/$rPump - ON/OFF включено реле основного насоса root/s_out/sprinkler/$rPump - ON/OFF включено реле основного насоса
root/s_out/sprinkler/set - значение счетчика воды (восстанавливается при перезагрузке из данного топика) root/s_out/sprinkler/set - значение счетчика воды (восстанавливается при перезагрузке из данного топика)
root/s_out/sprinkler/$vIN - ON/OFF - признак открытия клапана налива бака из водопровода root/s_out/sprinkler/$rVIN - ON/OFF - признак открытия клапана налива бака из водопровода
root/s_out/sprinkler/garden/set - требуемый обьем (или время) полива зоны root/s_out/sprinkler/garden/set - требуемый обьем (или время) полива зоны
root/s_out/sprinkler/garden/cmd - ON или OFF - признак включения полива зоны root/s_out/sprinkler/garden/cmd - ON или OFF - признак включения полива зоны
@@ -223,7 +223,7 @@ sensor:
state_topic: "root/s_out/sprinkler/$wMin" state_topic: "root/s_out/sprinkler/$wMin"
- name: "Полив водопровод" - name: "Полив водопровод"
state_topic: "root/s_out/sprinkler/$vIN" state_topic: "root/s_out/sprinkler/$rVIN"
- name: "Полив дренаж вкл" - name: "Полив дренаж вкл"
state_topic: "root/s_out/sprinkler/$rDren" state_topic: "root/s_out/sprinkler/$rDren"
@@ -323,7 +323,15 @@ button:
- name: "Полив запретить" - name: "Полив запретить"
command_topic: "root/air/sprinkler/cmd" command_topic: "root/air/sprinkler/cmd"
payload_press: "DISABLE" payload_press: "DISABLE"
- name: "Полив осушение бака"
command_topic: "root/air/sprinkler/cmd"
payload_press: "DRY"
#Такую проверку можно добавить везде, при ее наличии обьекты станут недоступными если контроллер оффлайн
availability_topic: "root/air/$state"
payload_available: "ready"
payload_not_available: "disconnected"
number: number:

Binary file not shown.

After

Width:  |  Height:  |  Size: 436 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 501 KiB

View File

@@ -2171,18 +2171,11 @@ int Item::SendStatus(long sendFlags, char * subItem) {
// Send ctrl // Send ctrl
if (sendFlags & FLAG_FLAGS) if (sendFlags & FLAG_FLAGS)
{ {
if (getFlag(FLAG_DISABLED)) if (getFlag(FLAG_FREEZED)) strcpy_P(cmdstr, FREEZE_P);
strcpy_P(cmdstr, DISABLE_P); else if (getFlag(FLAG_DISABLED)) strcpy_P(cmdstr, DISABLE_P);
else if (getFlag(FLAG_FREEZED) == FLAG_FREEZED)
strcpy_P(cmdstr, FREEZE_P);
else strcpy_P(cmdstr, ENABLE_P); else strcpy_P(cmdstr, ENABLE_P);
//else strcpy_P(cmdstr, UNFREEZE_P); //else strcpy_P(cmdstr, UNFREEZE_P);
setTopic(addrstr,sizeof(addrstr),T_OUT); setTopic(addrstr,sizeof(addrstr),T_OUT);
strncat(addrstr, itemArr->name, sizeof(addrstr)-1); strncat(addrstr, itemArr->name, sizeof(addrstr)-1);
if (subItem) if (subItem)

View File

@@ -355,6 +355,7 @@ int out_sprinkler::moveToState(sprinklerState nextState)
dren(false); dren(false);
vin(false); vin(false);
pump(true); pump(true);
item->On();
break; break;
} }
@@ -671,7 +672,7 @@ int out_sprinkler::Poll(short cause)
else else
{ {
uint32_t flowTimer = (uint32_t)getIntFromJson(gatesObj, "@flowTimer", now); uint32_t flowTimer = (uint32_t)getIntFromJson(gatesObj, "@flowTimer", now);
if (isTimeOver(flowTimer, now, 1000UL)) if (isTimeOver(flowTimer, now, 1000UL) && setVal > 0)
{ {
updateZoneValue(currentZone, 1); updateZoneValue(currentZone, 1);
setValToJson(gatesObj, "@flowTimer", (long)now); setValToJson(gatesObj, "@flowTimer", (long)now);