mirror of
https://github.com/anklimov/lighthub
synced 2026-06-13 19:36:23 +03:00
core - freese precedence over dizable, sprinkler - ON then DRY, HA docs
Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
894
documentation/Sprinkler_HomeAssistant.md
Normal file
894
documentation/Sprinkler_HomeAssistant.md
Normal 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` | Ползунок для настройки времени в more‑info окнах (не обязателен, но используется в стандартном окне `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/$vIN"
|
||||
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. Как пользоваться панелью
|
||||
|
||||

|
||||

|
||||
- **Общее состояние:** Отображает статус системы и режим (заморозка/разрешено/запрещено). Ошибка не показывается, но иконка станет красной при неисправности.
|
||||
- **Бак:** Иконка батарейки меняет цвет и текст в зависимости от уровня воды (пусто/наполовину/полный). Нажатие открывает историю уровня.
|
||||
- **Водопровод и насосы:** Показывают текущий статус (Выкл/Вкл/Качает) с цветовой индикацией. Клик – история соответствующего датчика.
|
||||
- **Управление циклом:** Общий переключатель «Полив», кнопки запуска всех зон, заморозки, запрета, осушения бака. Работают как обычные 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. Вы можете управлять поливом с мобильного телефона, отслеживать историю и быть уверенными, что всё под контролем!
|
||||
BIN
documentation/sprinkler_1.jpeg
Normal file
BIN
documentation/sprinkler_1.jpeg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 436 KiB |
BIN
documentation/sprinkler_2.jpeg
Normal file
BIN
documentation/sprinkler_2.jpeg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 501 KiB |
Reference in New Issue
Block a user