Fix
This commit is contained in:
@@ -1,135 +1,218 @@
|
||||
# ZONT Prometheus Exporter
|
||||
|
||||
Экспортер метрик для устройств **ZONT** и **Mega SX** в формате, совместимом с **Prometheus**. Позволяет собирать данные о температуре, состоянии котла, уровне сигнала, охране и других параметрах через официальный API ZONT.
|
||||
Экспортер телеметрии отопительных контроллеров **ZONT** (H-1V, H-1V.02, H1V02_PRO, H-1000, H-2000 и др.) в формате Prometheus.
|
||||
|
||||
## 📋 Возможности
|
||||
Собирает текущее состояние устройства через облачное API `my.zont.online` и отдаёт метрики на HTTP-эндпоинт `/metrics`. Подходит для мониторинга в Grafana, алертинга в Alertmanager и любого стека, совместимого с Prometheus.
|
||||
|
||||
- 🔐 Аутентификация через официальный API ZONT (`my.zont.online/api`)
|
||||
- 🌡️ Сбор температуры с проводных и радиодатчиков
|
||||
- 🔥 Мониторинг работы котла (время работы, аварии)
|
||||
- 📶 Уровень сигнала GSM/Wi-Fi
|
||||
- 🛡️ Состояние охраны и сирены
|
||||
- 🚗 Данные об автомобиле (ZTC): зажигание, двигатель, автозапуск
|
||||
- 🐳 Готов к запуску в Docker
|
||||
- ⚙️ Полностью настраивается через переменные окружения
|
||||
- 🩺 Встроенный healthcheck
|
||||
---
|
||||
|
||||
## 🚀 Быстрый старт
|
||||
## 📋 Содержание
|
||||
|
||||
### 1. Клонирование проекта
|
||||
- [Возможности](#-возможности)
|
||||
- [Требования](#-требования)
|
||||
- [Быстрый старт](#-быстрый-старт)
|
||||
- [Переменные окружения](#-переменные-окружения)
|
||||
- [Метрики](#-метрики)
|
||||
- [Интеграция с Prometheus](#-интеграция-с-prometheus)
|
||||
- [Пример алертов](#-пример-алертов)
|
||||
- [Диагностика](#-диагностика)
|
||||
- [Ограничения](#-ограничения)
|
||||
- [Безопасность](#-безопасность)
|
||||
- [Лицензия](#-лицензия)
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Возможности
|
||||
|
||||
- **Текущее состояние контроллера**: онлайн-статус, напряжение питания, память, источник питания.
|
||||
- **Связь**: уровень GSM, состояние регистрации в сети, RSSI Wi-Fi, наличие связи с сервером ZONT.
|
||||
- **Температуры**: проводные и аналоговые датчики (в т.ч. «Погода из интернета»), статус исправности.
|
||||
- **Отопление**: целевая и заданная температура по каждому отопительному контуру, время работы.
|
||||
- **Котёл / OpenTherm**: расчётная температура теплоносителя, уставка ГВС, наличие связи с котлом, аварии.
|
||||
- **Погода**: температура с внешнего источника.
|
||||
- **Аналоговые входы**: напряжение на входах (например, контроль питания).
|
||||
|
||||
Работает как отдельный контейнер, не требует установки чего-либо на хост.
|
||||
|
||||
---
|
||||
|
||||
## ✅ Требования
|
||||
|
||||
- Docker (или Docker Compose)
|
||||
- Аккаунт в личном кабинете [my.zont.online](https://my.zont.online) с добавленным устройством ZONT
|
||||
- Сетевая доступность `my.zont.online:443` из контейнера
|
||||
- Prometheus (опционально) для сбора метрик
|
||||
|
||||
---
|
||||
|
||||
## 🏁 Быстрый старт
|
||||
|
||||
### 1. Создайте файлы
|
||||
|
||||
Вам нужны два файла:
|
||||
|
||||
- `zont_exporter.py` — код экспортера
|
||||
- `Dockerfile` — сборка образа
|
||||
|
||||
### 2. Соберите образ
|
||||
|
||||
```bash
|
||||
git clone <ваш-репозиторий>/zont-exporter.git
|
||||
cd zont-exporter
|
||||
docker build -t zont-exporter .
|
||||
```
|
||||
|
||||
### 2. Настройка окружения
|
||||
|
||||
Создайте файл `.env` на основе примера и заполните своими данными:
|
||||
### 3. Запустите контейнер
|
||||
|
||||
```bash
|
||||
cp .env.example .env
|
||||
nano .env
|
||||
```
|
||||
|
||||
Пример содержимого `.env`:
|
||||
|
||||
```env
|
||||
ZONT_LOGIN=ваш_логин
|
||||
ZONT_PASSWORD=ваш_пароль
|
||||
ZONT_CLIENT_EMAIL=ваш@email.com
|
||||
SCRAPE_INTERVAL=60
|
||||
EXPORTER_PORT=8000
|
||||
LOG_LEVEL=INFO
|
||||
```
|
||||
|
||||
> ⚠️ **Важно**: `ZONT_CLIENT_EMAIL` — это контактный email, который вы указали при регистрации в ZONT. Он передаётся в заголовке `X-ZONT-Client` и используется производителем для связи с вами при изменениях в API.
|
||||
|
||||
### 3. Запуск
|
||||
|
||||
#### Вариант A: Docker Compose (рекомендуется)
|
||||
|
||||
```bash
|
||||
docker compose up -d --build
|
||||
```
|
||||
|
||||
#### Вариант B: Docker build + run
|
||||
|
||||
```bash
|
||||
docker build -t zont-exporter:latest .
|
||||
|
||||
docker run -d \
|
||||
--name zont-exporter \
|
||||
--restart unless-stopped \
|
||||
--env-file .env \
|
||||
-p 8000:8000 \
|
||||
zont-exporter:latest
|
||||
-p 9101:9101 \
|
||||
-e ZONT_LOGIN='your_login' \
|
||||
-e ZONT_PASSWORD='your_password' \
|
||||
-e ZONT_DEVICE_ID='554007' \
|
||||
-e ZONT_CLIENT='you@example.com' \
|
||||
zont-exporter
|
||||
```
|
||||
|
||||
#### Вариант C: Локальный запуск (без Docker)
|
||||
### 4. Проверьте
|
||||
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
export $(cat .env | xargs)
|
||||
python zont_exporter.py
|
||||
curl http://localhost:9101/metrics | grep zont_
|
||||
```
|
||||
|
||||
### 4. Проверка работы
|
||||
|
||||
```bash
|
||||
# Логи
|
||||
docker logs -f zont-exporter
|
||||
|
||||
# Метрики
|
||||
curl http://localhost:8000/metrics
|
||||
```
|
||||
|
||||
В ответе вы должны увидеть метрики вида:
|
||||
Вы должны увидеть метрики вида:
|
||||
|
||||
```
|
||||
# HELP zont_temperature_celsius Температура с датчиков ZONT
|
||||
# TYPE zont_temperature_celsius gauge
|
||||
zont_temperature_celsius{device_id="1580",device_name="Дом",sensor_name="Кухня"} 22.5
|
||||
|
||||
# HELP zont_boiler_working Работает ли котел (1 - да, 0 - нет)
|
||||
# TYPE zont_boiler_working gauge
|
||||
zont_boiler_working{device_id="1580",device_name="Дом"} 1
|
||||
zont_device_online{device_id="554007"} 1.0
|
||||
zont_voltage_volts{device_id="554007"} 12.1
|
||||
zont_gsm_level{device_id="554007"} 17.0
|
||||
zont_temperature_celsius{device_id="554007",name="Температура гаража 150",object_id="8200"} 18.8
|
||||
zont_boiler_connected{adapter_id="4096",device_id="554007"} 0.0
|
||||
```
|
||||
|
||||
## 📊 Доступные метрики
|
||||
---
|
||||
|
||||
| Метрика | Тип | Описание | Метки |
|
||||
## 🔧 Переменные окружения
|
||||
|
||||
| Переменная | Обязательна | По умолчанию | Описание |
|
||||
|---|---|---|---|
|
||||
| `zont_temperature_celsius` | Gauge | Температура с датчиков | `device_id`, `device_name`, `sensor_name` |
|
||||
| `zont_boiler_working` | Gauge | Работа котла за последнюю минуту (1/0) | `device_id`, `device_name` |
|
||||
| `zont_signal_level` | Gauge | Уровень сигнала GSM или Wi-Fi | `device_id`, `device_name`, `type` |
|
||||
| `zont_guard_state` | Gauge | Состояние охраны (1 — включена, 0 — выключена) | `device_id`, `device_name` |
|
||||
| `ZONT_LOGIN` | ✅ | — | Логин от личного кабинета `my.zont.online` |
|
||||
| `ZONT_PASSWORD` | ✅ | — | Пароль от личного кабинета |
|
||||
| `ZONT_DEVICE_ID` | ✅ | — | Числовой ID устройства (см. ниже, как узнать) |
|
||||
| `ZONT_CLIENT` | ❌ | `my_exporter@example.com` | Контактный email для заголовка `X-ZONT-Client`. ZONT использует его для связи при изменениях API. Укажите свой. |
|
||||
| `SCRAPE_INTERVAL` | ❌ | `60` | Интервал сбора метрик, секунды. Не имеет смысла ставить меньше 30 — API не успевает обновлять данные. |
|
||||
| `EXPORTER_PORT` | ❌ | `9101` | Порт, на котором экспортер слушает `/metrics` внутри контейнера |
|
||||
| `LOG_LEVEL` | ❌ | `INFO` | Уровень логирования: `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL`. Регистр не важен. |
|
||||
|
||||
## 🔗 Интеграция с Prometheus
|
||||
### Как узнать `ZONT_DEVICE_ID`
|
||||
|
||||
Добавьте job в ваш `prometheus.yml`:
|
||||
**Способ 1. Через API (рекомендуется)**
|
||||
|
||||
```bash
|
||||
curl -s -X POST 'https://my.zont.online/api/devices' \
|
||||
-u 'login:password' \
|
||||
-H 'X-ZONT-Client: you@example.com' \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{"load_io": true}' | python3 -m json.tool | grep -E '"id"|"name"|"serial"'
|
||||
```
|
||||
|
||||
В ответе найдите блок своего устройства — поле `"id"` и есть `ZONT_DEVICE_ID`.
|
||||
|
||||
**Способ 2. Через личный кабинет**
|
||||
|
||||
Откройте устройство в веб-интерфейсе `my.zont.online` — ID обычно видно в URL страницы устройства.
|
||||
|
||||
### Пример запуска с нестандартным портом и отладкой
|
||||
|
||||
```bash
|
||||
docker run -d \
|
||||
--name zont-exporter \
|
||||
--restart unless-stopped \
|
||||
-p 9200:9200 \
|
||||
-e ZONT_LOGIN='your_login' \
|
||||
-e ZONT_PASSWORD='your_password' \
|
||||
-e ZONT_DEVICE_ID='554007' \
|
||||
-e ZONT_CLIENT='you@example.com' \
|
||||
-e EXPORTER_PORT='9200' \
|
||||
-e LOG_LEVEL='DEBUG' \
|
||||
zont-exporter
|
||||
```
|
||||
|
||||
> ⚠️ Номера портов в `-p <хост>:<контейнер>` и `EXPORTER_PORT` должны совпадать по контейнерной части. Пример выше: `EXPORTER_PORT=9200` и `-p 9200:9200`. Если хост-порт занят — используйте `-p 8080:9200`.
|
||||
|
||||
---
|
||||
|
||||
## 📊 Метрики
|
||||
|
||||
Все метрики имеют префикс `zont_` и label `device_id`. Для удобства читаемые имена объектов (датчиков, контуров) добавляются как label `name`.
|
||||
|
||||
### Общие
|
||||
|
||||
| Метрика | Тип | Labels | Описание |
|
||||
|---|---|---|---|
|
||||
| `zont_device_online` | gauge | `device_id` | 1 — устройство на связи, 0 — offline |
|
||||
| `zont_device_last_receive_time` | gauge | `device_id` | Unix-время последнего пакета от устройства |
|
||||
| `zont_voltage_volts` | gauge | `device_id` | Напряжение основного питания, В |
|
||||
| `zont_power_source` | gauge | `device_id` | 1 — основное питание, 0 — иное |
|
||||
| `zont_memory_used_percent` | gauge | `device_id` | Использование памяти контроллера, % |
|
||||
| `zont_memory_used_bytes` | gauge | `device_id` | Использование памяти, байт |
|
||||
| `zont_internet_weather_celsius` | gauge | `device_id` | Температура с внешнего источника погоды, °C |
|
||||
|
||||
### Связь
|
||||
|
||||
| Метрика | Тип | Labels | Описание |
|
||||
|---|---|---|---|
|
||||
| `zont_gsm_level` | gauge | `device_id` | Уровень сигнала GSM, 0–31 |
|
||||
| `zont_gsm_state` | gauge | `device_id` | 0=not-registered, 1=home-network, 2=searching, 3=rejected, 5=roaming |
|
||||
| `zont_wifi_rssi` | gauge | `device_id` | Уровень сигнала Wi-Fi |
|
||||
| `zont_server_connected` | gauge | `device_id` | 1 — есть связь с сервером ZONT |
|
||||
|
||||
### Датчики температуры и аналоговые входы
|
||||
|
||||
| Метрика | Тип | Labels | Описание |
|
||||
|---|---|---|---|
|
||||
| `zont_temperature_celsius` | gauge | `device_id`, `object_id`, `name` | Текущая температура, °C |
|
||||
| `zont_temperature_sensor_ok` | gauge | `device_id`, `object_id`, `name` | 1 — датчик исправен |
|
||||
| `zont_analog_voltage_volts` | gauge | `device_id`, `object_id`, `name` | Напряжение на аналоговом входе, В |
|
||||
|
||||
### Отопление
|
||||
|
||||
| Метрика | Тип | Labels | Описание |
|
||||
|---|---|---|---|
|
||||
| `zont_heating_target_temp_celsius` | gauge | `device_id`, `circuit_id`, `name` | Фактическая целевая температура контура |
|
||||
| `zont_heating_setpoint_temp_celsius` | gauge | `device_id`, `circuit_id`, `name` | Заданная температура (уставка) |
|
||||
| `zont_heating_worktime_seconds` | gauge | `device_id`, `circuit_id`, `name` | Время работы контура за последнюю минуту, сек |
|
||||
| `zont_heating_status` | gauge | `device_id`, `circuit_id`, `name` | Код статуса контура |
|
||||
|
||||
### Котёл / OpenTherm
|
||||
|
||||
| Метрика | Тип | Labels | Описание |
|
||||
|---|---|---|---|
|
||||
| `zont_boiler_cs_celsius` | gauge | `device_id`, `adapter_id` | Расчётная температура теплоносителя, °C |
|
||||
| `zont_boiler_ds_celsius` | gauge | `device_id`, `adapter_id` | Уставка температуры ГВС, °C |
|
||||
| `zont_boiler_connected` | gauge | `device_id`, `adapter_id` | 1 — котёл на связи, 0 — нет |
|
||||
| `zont_boiler_fail` | gauge | `device_id`, `adapter_id` | 1 — авария котла |
|
||||
|
||||
---
|
||||
|
||||
## 🔌 Интеграция с Prometheus
|
||||
|
||||
Добавьте в `prometheus.yml`:
|
||||
|
||||
```yaml
|
||||
scrape_configs:
|
||||
- job_name: 'zont'
|
||||
scrape_interval: 60s
|
||||
scrape_timeout: 20s
|
||||
static_configs:
|
||||
- targets: ['zont-exporter:8000']
|
||||
- targets: ['zont-exporter:9101']
|
||||
labels:
|
||||
instance: 'home-boiler'
|
||||
```
|
||||
|
||||
Если Prometheus запущен на хосте (вне Docker), используйте `host.docker.internal` или IP вашего сервера:
|
||||
Если Prometheus работает в том же Docker-сети, используйте имя контейнера. Если на хосте — `host.docker.internal:9101` (Windows/macOS) или IP хоста (Linux).
|
||||
|
||||
```yaml
|
||||
scrape_configs:
|
||||
- job_name: 'zont'
|
||||
scrape_interval: 60s
|
||||
static_configs:
|
||||
- targets: ['host.docker.internal:8000']
|
||||
```
|
||||
|
||||
## 📈 Полный стек мониторинга
|
||||
|
||||
Если у вас ещё нет Prometheus и Grafana, используйте готовый `docker-compose.yml`:
|
||||
### Docker Compose (пример)
|
||||
|
||||
```yaml
|
||||
services:
|
||||
@@ -137,163 +220,174 @@ services:
|
||||
build: .
|
||||
container_name: zont-exporter
|
||||
restart: unless-stopped
|
||||
env_file:
|
||||
- .env
|
||||
networks:
|
||||
- monitoring
|
||||
|
||||
prometheus:
|
||||
image: prom/prometheus:latest
|
||||
container_name: prometheus
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
|
||||
- prometheus-data:/prometheus
|
||||
ports:
|
||||
- "9090:9090"
|
||||
networks:
|
||||
- monitoring
|
||||
|
||||
grafana:
|
||||
image: grafana/grafana:latest
|
||||
container_name: grafana
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- grafana-data:/var/lib/grafana
|
||||
ports:
|
||||
- "3000:3000"
|
||||
networks:
|
||||
- monitoring
|
||||
|
||||
networks:
|
||||
monitoring:
|
||||
driver: bridge
|
||||
|
||||
volumes:
|
||||
prometheus-data:
|
||||
grafana-data:
|
||||
- "9101:9101"
|
||||
environment:
|
||||
ZONT_LOGIN: "your_login"
|
||||
ZONT_PASSWORD: "your_password"
|
||||
ZONT_DEVICE_ID: "554007"
|
||||
ZONT_CLIENT: "you@example.com"
|
||||
SCRAPE_INTERVAL: "60"
|
||||
EXPORTER_PORT: "9101"
|
||||
LOG_LEVEL: "INFO"
|
||||
```
|
||||
|
||||
После запуска:
|
||||
|
||||
- **Prometheus**: http://localhost:9090
|
||||
- **Grafana**: http://localhost:3000 (логин/пароль по умолчанию: `admin`/`admin`)
|
||||
|
||||
## ⚙️ Конфигурация
|
||||
|
||||
Все параметры задаются через переменные окружения:
|
||||
|
||||
| Переменная | Обязательна | По умолчанию | Описание |
|
||||
|---|---|---|---|
|
||||
| `ZONT_LOGIN` | ✅ | — | Логин от личного кабинета ZONT |
|
||||
| `ZONT_PASSWORD` | ✅ | — | Пароль от личного кабинета ZONT |
|
||||
| `ZONT_CLIENT_EMAIL` | ❌ | `exporter@localhost` | Контактный email (заголовок `X-ZONT-Client`) |
|
||||
| `ZONT_API_URL` | ❌ | `https://my.zont.online/api` | Базовый URL API |
|
||||
| `SCRAPE_INTERVAL` | ❌ | `60` | Интервал опроса в секундах |
|
||||
| `EXPORTER_PORT` | ❌ | `8000` | Порт HTTP-сервера экспортера |
|
||||
| `LOG_LEVEL` | ❌ | `INFO` | Уровень логирования (`DEBUG`, `INFO`, `WARNING`, `ERROR`) |
|
||||
|
||||
## 🐳 Сборка Docker-образа
|
||||
|
||||
```bash
|
||||
# Сборка
|
||||
docker build -t zont-exporter:latest .
|
||||
|
||||
# Запуск с проверкой переменных
|
||||
docker run --rm --env-file .env zont-exporter:latest
|
||||
```
|
||||
|
||||
### Healthcheck
|
||||
|
||||
Docker автоматически проверяет доступность эндпоинта `/metrics` каждые 30 секунд. Если экспортер перестанет отвечать, контейнер будет помечен как `unhealthy`.
|
||||
|
||||
Проверить статус:
|
||||
|
||||
```bash
|
||||
docker inspect --format='{{.State.Health.Status}}' zont-exporter
|
||||
```
|
||||
|
||||
## 🔧 Расширение
|
||||
|
||||
### Добавление новых метрик
|
||||
|
||||
API ZONT предоставляет много данных. Чтобы добавить новую метрику, откройте `zont_exporter.py` и расширьте метод `collect()`:
|
||||
|
||||
```python
|
||||
# Пример: сбор пользовательских статусов (custom_controls_state)
|
||||
custom_gauge = GaugeMetricFamily(
|
||||
'zont_custom_status',
|
||||
'Пользовательский статус',
|
||||
labels=['device_id', 'device_name', 'status_id']
|
||||
)
|
||||
|
||||
for device in devices:
|
||||
custom_state = device.get('io', {}).get('custom_controls_state', {})
|
||||
for status_id, value in custom_state.items():
|
||||
custom_gauge.add_metric(
|
||||
[str(device['id']), device['name'], str(status_id)],
|
||||
value
|
||||
)
|
||||
|
||||
yield custom_gauge
|
||||
```
|
||||
|
||||
### Полезные разделы API
|
||||
|
||||
Согласно [официальной документации](https://lk.zont-online.ru/api/docs/), для расширения доступны:
|
||||
|
||||
- `last-boiler-state` — детальное состояние котла (OpenTherm, модуляция, давление)
|
||||
- `custom_controls_state` — пользовательские статусы (ZTC-7xx, Mega SX)
|
||||
- `ztc_state` — состояние контроллера (баланс SIM, напряжение, статус-флаги)
|
||||
- `temperature` — история температур через `load_data`
|
||||
|
||||
## 🐛 Отладка
|
||||
|
||||
### Экспортер не запускается
|
||||
|
||||
Проверьте логи:
|
||||
|
||||
```bash
|
||||
docker logs zont-exporter
|
||||
```
|
||||
|
||||
Частые причины:
|
||||
|
||||
- Не заданы `ZONT_LOGIN` или `ZONT_PASSWORD`
|
||||
- Неверный логин/пароль
|
||||
- Отсутствует доступ к `my.zont.online`
|
||||
|
||||
### Метрики пустые
|
||||
|
||||
- Убедитесь, что к вашему аккаунту ZONT привязаны устройства.
|
||||
- Проверьте `ZONT_CLIENT_EMAIL` — некоторые методы требуют корректного контакта.
|
||||
- Увеличьте `LOG_LEVEL=DEBUG` для детальной диагностики.
|
||||
|
||||
### Проблемы с токеном
|
||||
|
||||
Экспортер автоматически обновляет токен при получении `403`. Если проблема повторяется:
|
||||
|
||||
- Убедитесь, что пароль не содержит спецсимволов, требующих экранирования.
|
||||
- Проверьте, не отозван ли токен в личном кабинете ZONT.
|
||||
|
||||
## 📚 Документация API ZONT
|
||||
|
||||
- Официальная документация: https://lk.zont-online.ru/api/docs/
|
||||
- Облегчённое Widget API v3: https://my.zont.online/api/widget/v3
|
||||
- Сайт производителя: https://zont.online
|
||||
|
||||
## 📄 Лицензия
|
||||
|
||||
MIT
|
||||
|
||||
## 🤝 Вклад
|
||||
|
||||
Pull request'ы приветствуются. Для крупных изменений сначала откройте issue для обсуждения.
|
||||
|
||||
---
|
||||
|
||||
**Полезные ссылки:**
|
||||
## 🚨 Пример алертов
|
||||
|
||||
- [Prometheus](https://prometheus.io/)
|
||||
- [Grafana](https://grafana.com/)
|
||||
- [prometheus-client (Python)](https://github.com/prometheus/client_python)
|
||||
`prometheus/rules/zont.yml`:
|
||||
|
||||
```yaml
|
||||
groups:
|
||||
- name: zont
|
||||
rules:
|
||||
- alert: ZontDeviceOffline
|
||||
expr: zont_device_online == 0
|
||||
for: 10m
|
||||
labels:
|
||||
severity: critical
|
||||
annotations:
|
||||
summary: "ZONT {{ $labels.device_id }} offline"
|
||||
description: "Устройство не выходит на связь более 10 минут."
|
||||
|
||||
- alert: ZontServerDisconnected
|
||||
expr: zont_server_connected == 0
|
||||
for: 5m
|
||||
labels:
|
||||
severity: warning
|
||||
annotations:
|
||||
summary: "ZONT {{ $labels.device_id }} потерял связь с сервером"
|
||||
|
||||
- alert: ZontBoilerDisconnected
|
||||
expr: zont_boiler_connected == 0
|
||||
for: 15m
|
||||
labels:
|
||||
severity: warning
|
||||
annotations:
|
||||
summary: "ZONT {{ $labels.device_id }}: нет связи с котлом (адаптер {{ $labels.adapter_id }})"
|
||||
|
||||
- alert: ZontBoilerFail
|
||||
expr: zont_boiler_fail == 1
|
||||
for: 5m
|
||||
labels:
|
||||
severity: critical
|
||||
annotations:
|
||||
summary: "ZONT {{ $labels.device_id }}: авария котла"
|
||||
|
||||
- alert: ZontLowVoltage
|
||||
expr: zont_voltage_volts < 10
|
||||
for: 5m
|
||||
labels:
|
||||
severity: warning
|
||||
annotations:
|
||||
summary: "ZONT {{ $labels.device_id }}: низкое напряжение питания {{ $value }} В"
|
||||
|
||||
- alert: ZontWeakGSM
|
||||
expr: zont_gsm_level < 5
|
||||
for: 15m
|
||||
labels:
|
||||
severity: warning
|
||||
annotations:
|
||||
summary: "ZONT {{ $labels.device_id }}: слабый сигнал GSM ({{ $value }})"
|
||||
|
||||
- alert: ZontHighMemory
|
||||
expr: zont_memory_used_percent > 85
|
||||
for: 30m
|
||||
labels:
|
||||
severity: info
|
||||
annotations:
|
||||
summary: "ZONT {{ $labels.device_id }}: высокая загрузка памяти {{ $value }}%"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🩺 Диагностика
|
||||
|
||||
### Метрики пустые или `/metrics` отдаёт только `python_*`
|
||||
|
||||
1. Проверьте логи:
|
||||
```bash
|
||||
docker logs zont-exporter --tail 100
|
||||
```
|
||||
2. Если непонятно, что происходит, включите подробное логирование:
|
||||
```bash
|
||||
docker run -d --name zont-exporter \
|
||||
-p 9101:9101 \
|
||||
-e ZONT_LOGIN='...' -e ZONT_PASSWORD='...' \
|
||||
-e ZONT_DEVICE_ID='554007' \
|
||||
-e ZONT_CLIENT='you@example.com' \
|
||||
-e LOG_LEVEL='DEBUG' \
|
||||
zont-exporter
|
||||
```
|
||||
Затем смотрите логи:
|
||||
```bash
|
||||
docker logs zont-exporter --tail 200
|
||||
```
|
||||
В режиме `DEBUG` видны детали ответов API и структура `io`-объектов.
|
||||
|
||||
3. Ищите в логах строки:
|
||||
- `Successfully obtained ZONT auth token.` — токен получен.
|
||||
- `Failed to get auth token: ...` — проблема с логином/паролем.
|
||||
- `API error: ...` — API вернул ошибку.
|
||||
- `Device 554007 not found in account.` — неверный `ZONT_DEVICE_ID`.
|
||||
- `Metrics collected successfully for device ...` — всё ок.
|
||||
|
||||
### Ошибка `SyntaxError: name 'auth_token' is used prior to global declaration`
|
||||
|
||||
Объявление `global auth_token` должно стоять **в самом начале** функции, до любого использования переменной. В актуальной версии кода это уже учтено.
|
||||
|
||||
### Ошибка аутентификации
|
||||
|
||||
Проверьте логин/пароль руками:
|
||||
|
||||
```bash
|
||||
curl -s -X POST 'https://my.zont.online/api/get_authtoken' \
|
||||
-u 'login:password' \
|
||||
-H 'X-ZONT-Client: you@example.com' \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{"client_name": "debug"}' | python3 -m json.tool
|
||||
```
|
||||
|
||||
Ожидаемый ответ: `{"ok": true, "token": "..."}`.
|
||||
|
||||
### Хочу больше данных (история, а не текущее состояние)
|
||||
|
||||
Метод `devices` отдаёт **снимок текущего состояния**. Историю (графики за период) можно получить через метод `load_data` с типами `z3k_temperature`, `z3k_heating_circuit`, `z3k_boiler_adapter`, `ztc_state`. Для этого требуется отдельная логика — при необходимости расширьте экспортер.
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ Ограничения
|
||||
|
||||
- Экспортер собирает **только текущее состояние**, не историю. Для графиков используйте `load_data` (см. выше) или смотрите графики в личном кабинете ZONT.
|
||||
- Работает только с **устройствами, привязанными к аккаунту my.zont.online**. Локальный доступ к контроллеру по USB/локальной сети не используется.
|
||||
- Тип `thermostat_work` через `load_data` для модели **H1V02_PRO** (H-1V.02) возвращает пустые массивы. Используйте данные из `devices?load_io=true` — там вся актуальная телеметрия.
|
||||
- Набор доступных полей в `io.z3k-state` зависит от модели, прошивки и конфигурации. Экспортер игнорирует отсутствующие поля — это нормально.
|
||||
- Требуется HTTPS-доступ к `my.zont.online`. При использовании прокси задайте `HTTPS_PROXY` в окружении контейнера.
|
||||
|
||||
---
|
||||
|
||||
## 🔒 Безопасность
|
||||
|
||||
- **Не храните логин/пароль в открытом виде в Docker Compose / systemd unit.** Используйте:
|
||||
- Docker secrets,
|
||||
- переменные окружения из защищённого файла (`--env-file`),
|
||||
- внешний секрет-менеджер (Vault, SOPS, Ansible Vault).
|
||||
- **Заведите отдельного пользователя** в ZONT для API-интеграции. Не используйте основную учётную запись владельца.
|
||||
- **Ротируйте пароль**, если он где-то засветился (переписка, скриншоты, git-история).
|
||||
- Экспортер **не пишет** логин/пароль в логи, но может логировать ответ API. Проверьте уровень логирования, если ответы содержат чувствительные данные.
|
||||
- Токен ZONT (`X-ZONT-Token`) хранится только в памяти процесса и перезапрашивается при истечении (`unauthorized` / `token_expired`).
|
||||
- Эндпоинт `/metrics` **не имеет аутентификации**. Не выставляйте его в интернет. Используйте network policy / firewall.
|
||||
|
||||
---
|
||||
|
||||
## 📄 Лицензия
|
||||
|
||||
MIT. Используйте на свой риск. Проект не связан с ООО «Микро Лайн» / ZONT — это независимая интеграция с публичным API.
|
||||
|
||||
---
|
||||
|
||||
## 🙏 Благодарности
|
||||
|
||||
- Команде ZONT за публичное API и [документацию](https://my.zont.online/api).
|
||||
- Сообществу Prometheus за `prometheus_client`.
|
||||
Reference in New Issue
Block a user