Добрый день, уважаемые читатели!
В одной из прошлых статей я рассказывал, как управлять нагрузкой с помощью класса 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-канале!
💠 Полный архив статей вы найдете здесь
Пожалуйста, оцените статью:
ℹ Общая оценка статьи влияет на её положение в общем списке статей - чем больше оценок и чем выше средняя оценка, тем выше находится данная статья на данном сайте. Поэтому, если Вы считаете, что статья является полезной, (либо наоборот, не стоит внимания) - пожалуйста, поставьте общую оценку.
✳ Дополнительно вы можете оценить отдельные характеристики статьи. Эти оценки не пересекаются с общей оценкой и ни на что не влияют, но могут сообщить автору о проблемах в статье. Поэтому не стоит "завышать" оценки характеристик, так это поможет мне понять, на что обратить особое внимание при написании новых статей. Кроме того, исходя из этих оценок я смогу понять, какие темы интересны читателям, а какие нет.
| Полезность, интересная тема | |
| Техническое содержание | |
| Стиль изложения, понятность | |
| Иллюстрации и пояснения | |
| Общая грамотность, язык | |
|
|
Благодарю за обратную связь!
-= Каталог статей (список по разделам) =- -= Архив статей (плитки, все подряд) =-


