В продовження теми з Підготовка до зими 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.