Перейти к содержимому

rLoadControl: индикация состояния нагрузки на MQTT DASH

Добрый день, уважаемые читатели!

В одной из прошлых статей я рассказывал, как управлять нагрузкой с помощью класса 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:

Добрый день, уважаемые читатели! В одной из прошлых статей я рассказывал, как управлять нагрузкой с помощью класса rLoadController.-3

Не буду тянуть кота за фаберже и описывать работу скрипта, думаю и так все понятно:

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-канале! 

💠 Полный архив статей вы найдете здесь


Пожалуйста, оцените статью:
[ 5 из 5, всего 2 оценок ]

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *