Системные методы

Методы скрипта для выполнения системных действий

Информирование

Информирование — отправка сообщений через различные каналы — email, sms, telegram, …

this.info(канал информирования, кому, сообщение)

Write

Пример:

this.info(‘teleram’, ‘admin’, ‘Что-то пошло не так!’)
this.info(’email’, ‘electro’, ‘Показания счетчика ‘+Meter1.value)

Запись в журнал

this.log('Запись в пользовательский журнал')

Write

this.syslog('Запись в системный журнал ')

Write

Запуск команды плагина

this.pluginCommand({unit:'megad1', command:{...}})

Write

Структура ‘command’ определяется плагином, которому посылается команда

Групповые операции с устройствами

this.doAll(filter, action)

Write

Пример:

this.doAll({place:1, subs:1}, ‘on’)
this.doAll({place:1, subs:1}, ‘setAuto’)
this.doAll({place:1, subs:1, prop:’auto’}, ‘save’)
this.doAll({place:1, subs:1, prop:’auto’}, ‘restore’)

Получение времени

Получение времени, определяемого name (закат, восход, граница следующего часа)

this.getSysTime(name, date)

Write

name — ‘sunrise’ || ‘sunset’ || ‘hourly’
date — объект Date  или строка  ( ‘today’ || ‘tomorrow’) или дата в формате timestamp
(если не определено, то ‘today’)

Пример:

his.getSysTime(‘sunset’) — вернет время заката сегодня
this.getSysTime(‘sunrise’,’tomorrow’) — вернет время восхода завтра
this.getSysTime(‘sunrise’, new Date(2018,11,31)) — вернет время восхода 31 декабря 2018 года

Глобальные переменные

В любом сценарии доступен объект global:

global.set('name',value)

Write

global.get('name')

Read

global.remove('name')

Write

Пример:

global.set(‘Armed’, true); // Поставили на охрану

В другом сценарии:
if (global.get(‘Armed’)) {.. }

или проверка при запуске сценария:
startOnChange(motion, global.get(‘Armed’))

Команды операционной системы

Выполнение команд операционной системы на сервере

this.execOS(команда ОС);

Write

Пример:

this.execOS(`aplay /home/sound/ding.wav`);
Выдать звуковое сообщение командой aplay

Важно!!! Команда this.execOS потенциально опасна. Не рекомендуем выполнять ее без особой необходимости.

Работа с базой данных

Чтение из БД

this.dbread();

Read

На уровне ядра системы запись данных от устройств (кроме счетчиков) выполняется в ежедневные таблицы  «records_YYMMDD»
Значения устройств типа счетчик хранятся в таблице «consumption» без разбивки по дням
 
Структура записи таблиц: 
 id — идентификатор записи — автоинкрементное поле — заполняется автоматически на уровне БД
 dn — имя устройства  («MOTION1»)
 ts — timestamp — число
 val — значение (строка со значением с учетом округления)
Для чтения из таблицы нужно задать имя таблицы и имя функции сценария, которая получит данные:
 
this.dbread({dbtable:’consumption’},  ‘onRead’); — чтение ВСЕХ данных таблицы счетчиков
this.dbread({dbtable:’records_200821′},  ‘onRead’); — чтение ВСЕХ данных за 21 августа 2020 года
script({
    start() { 
        this.dbread({dbtable:'records_200821'},  'onRead');
    },
    
    onRead(result) {
      // Эта функция получит массив данных за весь день: 
      // result = [{"id":317,"ts":1597975711568,"dn":"STEMP1","val":"10.2"}, ...]
      this.log('RESULT length='+result.length);
    }
});
Конечно, так делать не рекомендуется, так как даже ежедневная таблица может содержать сотни тысяч записей
 
Для получения только нужных данных в первый аргумент нужно добавить фильтры:
 
   dn:’METER1,METER42′ — список устройств через запятую
   start: время — начальная точка интервала данных  
   end: время — конечная точка интервала данных  
Время можно задать двумя способами: 
1. в строковом формате для разбора через Data.parse():  
(cтроковое представление даты из RFC2822 или ISO 8601) https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Date/parse
 
Например в ISO 8601:
const start = ‘2020-08-21T00:00:00Z’; // Время — UTC
const end = ‘2020-08-21T05:30:00Z’; 
       
 
2. Число — timestamp через getTime()
const start = new Date(2020, 7, 21, 3).getTime();  // Месяц начинается с 0, время локальное
const end = new Date(2020, 7, 21, 8, 30).getTime();
 
Примеры:
// Получить все данные за день по трем датчикам  
   this.dbread({dbtable:'records_200821', dn:'STEMP1,SHUMIDITY2,POWER42'},  'onRead');

// также за период с 3:00 до 8:30   
const start = new Date(2020, 7, 21, 3).getTime();  
const end = new Date(2020, 7, 21, 8, 30).getTime();        
this.dbread({dbtable:'records_200821', dn:'STEMP1,SHUMIDITY2,POWER42', start, end }, 'onRead');

// С начала дня до 8:30
this.dbread({dbtable:'records_200821', dn:'STEMP1,SHUMIDITY2', end }, 'onRead');

// С 3:00 до конца дня
this.dbread({dbtable:'records_200821', dn:'STEMP1,SHUMIDITY2', start}, 'onRead');   
Примечание: имеется возможность создавать свои таблицы и работать с ними
Обычно это делается через плагины.