Добрый день, уважаемые читатели!
В одной из прошлых статей я рассказывал, как управлять нагрузкой с помощью класса rLoadController. В этой статье я расскажу, как сделать очень удобную индикацию состояния этой самой нагрузки в популярном MQTT клиенте MQTT DASH. Про него я тоже как-то писал статью. На одной плитке можно разместить “светодиод” разного цвета, сведения о последнем времени включения и выключения, а также общее время работы и потраченные киловатты за период. Примерно так:
Пакет JSON с данными о состоянии нагрузки
rLoadController для публикации на MQTT-брокере генерирует довольно большой JSON примерно следующего вида:
{ "status": 0, "timestamp": {"on": "14.09.2023 08:57:12","off": "14.09.2023 09:00:54"}, "durations": {"last": 222,"total": 294082,"today": 496,"yesterday": 10225,"week_curr": 25321,"week_prev": 46427,"month_curr": 84044,"month_prev": 160548,"period_curr": 102201,"period_prev": 2177,"year_curr": 294072,"year_prev": 0}, "counters": {"total": 775,"today": 2,"yesterday": 30,"week_curr": 69,"week_prev": 132,"month_curr": 243,"month_prev": 438,"period_curr": 310,"period_prev": 9,"year_curr": 771,"year_prev": 0} }
Из этой структуры можно извлечь следующие данные:
- status – текущее состояние нагрузки: 0 – отключена, 1 – включена
- timestamp – время последнего включения (on) и выключения (off) нагрузки
- durations – длительность нахождения нагрузки во включенном состоянии в секундах; она доступна для нескольких временных интервалов:
- last – последнее включение,
- total – общее время за все время работы устройства,
- today – за сегодняшний день,
- yesterday – за вчерашний день,
- week_curr – за текущую неделю,
- week_prev – за предыдущую неделю,
- month_curr – за текущий месяц,
- month_prev – за предыдущий месяц,
- period_curr – за текущий учетный период (период это интервал с 25 числа по 25 число следующего месяца),
- period_prev – за предыдущий период,
- year_curr – за текущий год,
- year_prev – за предыдущий год
- counters – счетчики включения нагрузки за те же временные интервалы, что и длительность.
Извлекая данные из JSON-пакета с помощью MQTT DASH, можно отображать эти данные на смартфоне или планшете управления.
Отображение данных в MQTT клиенте
Конечно, можно не парится со скриптами, а сделать “по простому” – на одной плитке разместить поле status, на другой – timestamp, на третьей – какой-нибудь из durations. Все инструменты в MQTT DASH для извлечения полей из JSON пакета уже есть. Но такой подход не очень удобен – занимает три плитки и не нагляден.
Воспользуемся скриптами JavaScript и сделаем более наглядную плитку, в которой будет отображаться сразу вся необходимая информация:
- В первой строке расположена виртуальная имитация светодиода, можно использовать желтый, красный, зеленый и синий цвета. Сделано это с помощью стандартных еmoji. Стоит только учитывать, что на древних версиях Android пиктограммы выглядят не так красиво.
- При изменении состояния нагрузки цвет текста изменяется с серого на красный, то так же обозначает то, что нагрузка включена.
- Во второй строчке отображается время последнего переключения нагрузки – во включенном состоянии это есть время включения, иначе – время выключения
- В третьей строке отображается длительность работы нагрузки и затраченные киловатт-часы. При этом во включенном состоянии можно отображать длительность текущего сеанса, а в выключенном -= общее время наработки за учетный период и ли месяц (впрочем можно выбрать любой доступный интервал времени – день, неделю и т.д.).
Делается это с помощью скрипта on display, написанного на JavaScript и расположенного в плитке.
Создайте новую плитку с типом “текст” и с самым мелким шрифтом. Заполните поле “топик” и “имя”, поле “Извлечь из json” при этом заполнять не нужно. Затем прокрутите настройки плитки вниз и найдите кнопки, ведущие к редакторам скриптов, на нужен ON DISPLAY:
Не буду тянуть кота за фаберже и описывать работу скрипта, думаю и так все понятно:
function twoDig(value) { if (value>9) { return value; } else { return "0"+value; }; }; function getPower(seconds) { return (Math.trunc(50*seconds/36000)/100).toFixed(2); }; function getDuration(seconds) { var secs=seconds; var hour=Math.trunc(secs/3600); secs=secs-hour*3600; var mins=Math.trunc(secs/60); secs=secs-mins*60; return twoDig(hour) + ":" + twoDig(mins); }; function getTime(fullstr) { return fullstr.slice(0, 6) + fullstr.slice(8, 16); } var sJSON = event.getLastPayload(); if ((sJSON != null) && (sJSON != '')) { var data = JSON.parse(sJSON); if (data['status'] == 1) { event.text = '🔴' + '\n' + getTime(data['timestamp']['on']) + '\n' + getDuration(data['durations']['last']) + ' | ' + getPower(data['durations']['period_curr']); event.textColor = '#ff4500'; event.blink = false; } else { event.text = '⚫' + '\n' + getTime(data['timestamp']['off']) + '\n' + getDuration(data['durations']['period_curr']) + ' | ' + getPower(data['durations']['period_curr']); event.textColor = '#b0c4de'; event.blink = false; }; };
Скрипт может быть и не оптимален, знатоки JavaScript могут меня поправить. Но работает.
Что здесь можно и нужно изменить:
- в строке 10 укажите мощность нагрузки в ваттах для расчета потраченной мощности
- в строке 30 выберите emoji для индикации включенной нагрузки. В современных версиях Android можно выбрать синий, красный, желтый и зеленый светодиоды. Но ничто вас не ограничивает – можно использовать радостную мордочку, например.
- в строках 32, 33 выберите временные интервалы для индикации включенной нагрузки
- в строках 39, 40 выберите временные интервалы для индикации выключенной нагрузки
- цвета текста задаются в строках 34 и 41 соответственно, выбрать обозначение можно например здесь
- можно включить мигание плитки во включенном состоянии, слегка подправив строчку 35
Не забудьте сохранить скрипт и настройки плитки перед выходом.
На этом пока всё, до встречи на сайте и на telegram-канале!
💠 Полный архив статей вы найдете здесь
Пожалуйста, оцените статью: