В продовження теми з Підготовка до зими 2024-2025: ДБЖ, інвертори, та акумулятори.
Сюрпрайз – для EcoFlow навіть є Prometheus експортер – berezhinskiy/ecoflow_exporter.
Виглядає прям дуже круто. Запустив, подивився на це діло – і побіг писати цей пост.
Запускається фактично в пару кліків з Docker Compose, файл є “в комплекті” експортера.
Зміст
Як це працює?
Виявляється, у EcoFlow є сервіс mqtt.ecoflow.com, куди девайси відправляють телеметрію. В моєму мобільному застосунку я цього не знайшов, але нагуглив ось такий скрін в треді Home Automation – My Journey:
Тобто, коли ми реєструємо девайс в мобільному застосунку – EcoFlow починає відправляти метрики, використовуючи логін/пароль, з яким ми реєструємось в самому застосунку.
Ну і за такою ж логікою працює сам експорт – див. код у ecoflow_exporter.py – ми йому в параметрах задаємо свій логін-пароль (не банкінг, можна робити), він з цим логіном-паролем підключається до api.ecoflow.com/auth/login, отримує токен, і вже з цим токеном йде на mqtt.ecoflow.com:8883.
А з вже mqtt.ecoflow.com отримує прям купу всяких цікавих метрик, на які ми сьогодні і подивимось.
Запуск EcoFlow Prometheus Exporter
Тут все прям дуже просто, і описано в документації Quick Start.
Клонуємо репозиторій:
$ git clone https://github.com/berezhinskiy/ecoflow_exporter $ cd ecoflow_exporter/docker-compose/
В файлі compose.yaml задаємо логіни-паролі – для Grafana та для EcoFlow API:
...
grafana:
image: grafana/grafana
container_name: grafana
ports:
- 3000:3000
restart: unless-stopped
environment:
GF_SECURITY_ADMIN_USER: admin
GF_SECURITY_ADMIN_PASSWORD: "admin"
volumes:
- ./grafana:/etc/grafana/provisioning/datasources
- grafana_data:/var/lib/grafana
ecoflow_exporter:
image: ghcr.io/berezhinskiy/ecoflow_exporter
container_name: ecoflow_exporter
ports:
- 9091:9091
restart: unless-stopped
environment:
DEVICE_SN: DAEBZ5KF1183072
ECOFLOW_USERNAME: [email protected]
ECOFLOW_PASSWORD: "MyPassword"
EXPORTER_PORT: 9091
...
В DEVICE_SN вказуємо серійний номер девайсу – є в мобільному застосунку:
$ docker-compose up
Grafana dashboard
Логінимось в Grafana, переходимо до http://localhost:3000/dashboards, імпортуємо дашборду, ID 17812:
І маємо купу цікавих графіків:
Наприклад, ось момент, коли я відключив холодильник – запасу батареї відразу стало з 8 до 16 годин:
Або момент, коли у квартирі з’явилось світло, і почалася зарядка батарей:
Як ми і рахували в попередньому пості – навантаження в 1270 ват/годину, батареї 56 вольт – маємо 22.6 ампер струму – 19 в метриках плати BMS (Battery Management System), і ще 3 ампери, мабуть, на інвертор і інші системи станції.
При цьому з розетки струм 5.7 ампери (графік Current):
>>> 1270/220 5.7
Цікаві метрики і по температурі:
Інвертор під час роботи від батарей гріється аж 80 градусів – хоча на балконі +25 (стоїть окремий термометр біля зарядних).
А як тільки світло з’явилось, і станція відключила роботу з батарей (і, відповідно, інвертор) – то температура впала.
Хоча, можливо, інвертор працює постійно, якщо EcoFlow є Online UPS (див. Типи ДБЖ), але з меншим навантаженням. Але мені здається, що EcoFlow все ж є Line-Interactive системою.
Повний список метрик є в документації експортера, правда без деталей. Метрики дефолті від самого EcoFlow, просто конвертується ім’я: bms_bmsStatus.maxCellTemp -> bms_bms_status_max_cell_temp.
Алерти в Telegram
Алерти відправляються через Telegram API та бота, токен якого можемо задати в файлі конфігурації Alertmanager alertmanager/alertmanager.yml, а самі алерти описані в файлі prometheus/alerts/ecoflow.yml – можемо тут їх потюнити, чи написати власні.
З @BotFather і командою /newbot створюємо бота:
Створюємо канал:
Додаємо бота в канал:
Знаходимо Telegram Group Chat ID.
Самий простий спосіб, який я знайшов – це через web.telegram.org – відкриваємо цей канал, і зверху маємо ID:
Відправляти можемо напряму від бота до нашого юзера – тоді в chat_id вказуємо свій ID.
Якщо все ж використовуємо групу – то ID вказуємо разом зі знаком “-“, тобто в моєму випадку це “-1002162514981“.
Редагуємо файл alertmanager.yml, додаємо параметри для Телеграму:
...
receivers:
- name: telegram
telegram_configs:
- bot_token: "745***AJM"
chat_id: -1002162514981
api_url: https://api.telegram.org
message: '{{ template "telegram.template" . }}'
parse_mode: MarkdownV2
Для перевірки алертів можемо змінити умову в ecoflow.yml:
groups:
- name: EcoFlow
rules:
- alert: EcoFlowOffline
expr: ecoflow_online == 0
...
На ecoflow_online != 0.
Перезапускаємо контейнери, і перевіряємо в Prometheus:
Алерт затригерився.
Якщо відправку робили від бота до себе, як юзера – то знаходимо нашого бота, клікаємо Send Message, аби ініціювати чат, бо сам він першим вам писати не зможе – в логах Alertmanager буде помилка “bot can’t initiate conversation with a user“:
І відразу маємо від нього повідомлення з алертом:
Якщо робили через групу – то алерт відразу прийде туди:
Взагалі є сенс перевірити алерти, до, наприклад, в EcoFlowHalfBattery використовується метрика ecoflow_bms_bms_status_f32_show_soc, яка в мене порожня – перевіряємо на сторінці http://localhost:9090/graph:
Проте є метрика ecoflow_bms_master_soc з Grafana:
Тому алерт можна переписати як:
- alert: EcoFlowHalfBattery expr: ecoflow_bms_master_soc < 50 ...
Ну і в принципі на цьому все.
Далі це все можна запускати локально з автостартом через systemd, або запустити десь на Raspberry PI.


























