Три года назад я рассказал, как сделал приставку к импульсным счётчикам воды Ватериус. Устройство считает импульсы счётчиков воды, раз в сутки просыпается и по Wi-Fi шлёт на сервер данные.
Следующим этапом мы запустили сайт — сервис по передаче показаний в управляющие компании. Чтобы компетентно отвечать пользователям, что с их устройствами, была настроена база данных временных рядов InfluxDB и Grafana для рисования графиков.
Сейчас к сайту подключено около 1600 устройств — есть что «помониторить»...
В Grafana 4 дашборда:
мониторинг состояния сервера
мониторинг состояния тестового сервера
графики по устройству
статистика и бизнес метрики
Ниже рассказ, какую информацию об устройствах видит техподдержка сайта и зачем.
Сперва покажу личный кабинет пользователя Ватериуса в стиле «минимализм»:
![Личный кабинет пользователя сайта Личный кабинет пользователя сайта](https://habrastorage.org/getpro/habr/upload_files/cc6/9f8/cd2/cc69f8cd285e185e6ac1f6a10b21e8d6.png)
Можно включить статистику по месяцам
![](https://habrastorage.org/getpro/habr/upload_files/956/82a/8fd/95682a8fd114746695f22aac74211a1b.png)
И настроить отправку показаний в разные места:
![Уже 95 сайтов по всей России.. Уже 95 сайтов по всей России..](https://habrastorage.org/getpro/habr/upload_files/b78/b45/ab4/b78b45ab449a41dea28236d13b08d2b7.png)
.
Устройства шлют на сервер гораздо больше данных (подробное описание полей на github).
В первой версии были следующие поля:
количество импульсов;
показания счётчика, кубометры;
разница показаний с предыдущим пробуждением, литры;
причина загрузки attiny85 (значение регистра);
версии прошивок микроконтроллеров attiny и ESP;
количество перезагрузок;
вес импульса в счётчике (1 или 10 литров).
Мы их видели на административной странице Django. Но графики там не нарисуешь, поэтому обратились к Grafana.
Дашборд начинается с показаний двух каналов Ватериуса, уровня сигнала роутера и кол-во перезагрузок. Уровень сигнала полезен, если устройство регулярно теряет связь. Количество перезагрузок указывает на замену батареек или проблемы.
Для выбора устройства в БД служат комбобоксы email и token.
![](https://habrastorage.org/getpro/habr/upload_files/4a9/135/797/4a913579751d24913e5f6b5d5c498763.png)
Графики потребления полезны, если настройка отклонилась от инструкции и показания убегают вперёд или отстают.
![График расхода горячей и холодной воды График расхода горячей и холодной воды](https://habrastorage.org/getpro/habr/upload_files/052/3a3/bde/0523a3bde70d319b5541d8580f4edd98.png)
Администратор видит, что горячая вода потребляется сильно больше, чем холодная и может сделать вывод, что счетчик горячей воды на 1л/имп, а Ватериус решил, что на 10.
Однажды Ватериус за неделю насчитал знакомому 20 кубометров. Я испугался, а когда пришёл чинить, обнаружил, что провода счётчиков не были зафиксированы в разъёме.
![](https://habrastorage.org/getpro/habr/upload_files/dcc/6b4/153/dcc6b4153b492a8b345ce33a3e7ff950.jpg)
В прошивку тут же был добавлен уровень сигнала на входе микроконтроллера (analogRead) в момент замыкания геркона. По нему можно судить о качестве подсоединения Ватериуса к счётчикам. Если значение прыгает — провод не закреплён.
На графике ниже ADC меняется в пределах погрешности измерения 103—104, что говорит о хорошем контакте.
![](https://habrastorage.org/getpro/habr/upload_files/9e4/e61/c1b/9e4e61c1b9f44c6cd895eaecd86a40f3.png)
Вот здесь на Горячей воде мы видим плохой контакт провода с Ватериусом:
![](https://habrastorage.org/getpro/habr/upload_files/296/093/0e3/2960930e324d56b550e7741bdafb7bf5.png)
Позднее я добавил длительность пробуждения wi-fi Ватериуса (waketime), чтобы судить о его взаимоотношениях с роутером. А продолжительность настройки Ватериуса пользователем (setuptime) позволяет узнать, когда и сколько раз он его настраивал.
![](https://habrastorage.org/getpro/habr/upload_files/f02/f00/cfb/f02f00cfb2acda6bc4f58d84f2cd13b8.png)
На дашборде Grafana администратор переключается между устройствами по email пользователя и по уникальному номеру Ватериуса. Если устройств несколько, то они все отобразятся в всплывающем списке.
![](https://habrastorage.org/getpro/habr/upload_files/50d/4de/706/50d4de706764e542de3e6c29417e8439.png)
Чтобы сделать такие комбобоксы, используем переменные дашборда:
![](https://habrastorage.org/getpro/habr/upload_files/19b/618/e39/19b618e392e80061a54195c19aa2003b.png)
Ниже пример графиков, когда что-то нехорошее происходило с устройством. Ватериус очень часто выходил на связь, затем кончились батарейки, через неделю пользователь поставил новые и перепрошил микроконтроллер — количество перезагрузок сбросилось (boot).
![](https://habrastorage.org/getpro/habr/upload_files/c4d/9f0/8db/c4d9f08db4e92c927c0e65517fe92efd.png)
В Ватериусе для упрощения конструкции отсутствует вольтметр. Напряжение измеряется в ESP уже после стабилизатора. Во время включения вай-фая происходят скачки. Если начертить их график(voltage_diff), то видно, что они становятся частыми к окончанию жизни батареек. Когда батарейки умрут — мы оповестим по электронной почте (устройство не выходит на связь 5 дней). Любопытно, что при этом Ватериус продолжит считать показания — напряжения хватает для питания attiny, но не хватает для включения вай-фая.
Настройки виджетов Grafana однотипные:
![](https://habrastorage.org/getpro/habr/upload_files/9c8/b26/0b2/9c8b260b2b6732463f5c56c4deed7509.png)
Виджет Stat текущего значения счётчика воды:
SELECT mean("ch0") FROM "infinity"."waterius" WHERE ("email" =~ /^$email$/ AND "token" =~ /^$token$/) AND $timeFilter GROUP BY time($__interval)
![](https://habrastorage.org/getpro/habr/upload_files/c46/359/b18/c46359b188ed180a3ad256539385aebd.png)
Виджет Graph (old) разницы в литрах:
SELECT mean("delta0") FROM "infinity"."waterius" WHERE ("email" =~ /^$email$/ AND "token" =~ /^$token$/) AND $timeFilter GROUP BY time($__interval)
Код на python, который шлёт информацию в Базу данных InfluxDB:
client = InfluxDBClient(host, port,
INFLUXDB_USERNAME, INFLUXDB_PASS,
INFLUXDB_DB, ssl=ssl, verify_ssl=True, timeout=3.0)
def influx_send(data):
try:
point = {
'measurement': 'waterius',
'tags': {},
'fields': {}
}
tags = ['version', 'version_esp', 'email', 'f'] # + key
fields = ['delta0', 'delta1', 'good', 'boot', 'ch0', 'ch1', 'imp0', 'imp1',
'voltage', 'resets', 'voltage_low', 'voltage_diff', 'rssi',
'waketime', 'setuptime', 'adc0', 'adc1']
for name in tags:
if name in data:
point['tags'][name] = data[name]
for name in fields:
if name in data:
point['fields'][name] = data[name]
if 'key' in data:
point['tags']['token'] = data['key'] # influxdb 'key' is a keyword
if not client.write_points([point, ]):
log.error('InfluxDBClient influx_send error')
except Exception:
log.error('InfluxDB data error: ' + traceback.format_exc())
В следующей статье, могу рассказать про визуализацию бизнес-показателей и статистики пользователей.
Если вы знаете, как сделать доступ к дашборду Grafana пользователям, чтобы они видели только свои устройства — напишите, мы попробуем это реализовать.
Спасибо всей команде проекта, пользователям и тем, кто помогает проекту!
Чат проекта в телеграм.