EcoFlow: моніторинг з Prometheus та Grafana

Автор |  06/07/2024
 

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