Горячая линия Embedded System Rus:8-800-775-06-34 (звонок по России бесплатный)

LM5_N
LM-Wall_N
DALI_N
Vita_N

Автоматическое выключение нагрузок по таймеру, задаваемым пользователем

Задача: сделать возможность включать какую-либо нагрузку на время, задаваемое пользователем.

Данное решение является универсальным в плане кода, что приводит к количеству сценариев равному n+2, где n – количество групповых адресов, запускающих таймер. В этом решении используется таблица таймеров вида {[‘групповой адрес нагрузки’] = время выключения, … }, что позволяет унифицировать код проверки таймера и удаления таймера из таблицы.

Пример представляет из себя три скрипта, два универсальных и один скрипт-пример для запуска таймера. В приведенном случае управляемый объект и объект, запускающий таймер, являются битовыми.

Событийный скрипт для запуска таймера работает следующим образом:

  1. Включает нагрузку.
  2. Получает текущую таблицу таймеров из storage.
  3. Получает значение таймера из группового адреса и записывает в таблицу таймеров время выключения нагрузки.
  4. Записывает полученную таблицу таймеров в storage.

Этот скрипт не является универсальным, поэтому его нужно будет создавать для каждого группового адреса, который будет запускать таймер, и прописывать групповые адреса нагрузки и таймера индивидуально в каждом скрипте.

— Событийный скрипт для виртуального группового адреса, с которого происходит включение по таймеру
— Вместо ’32/2/54′ подставьте управляемый групповой адрес нагрузки
— Вместо ’32/1/53′ подставьте групповой адрес таймера (целочисленное значение в минутах)

actuator_addr = '32/2/54'
timer_addr = '32/1/53'
grp.write(actuator_addr, event.getvalue())
if event.getvalue() then
timer_table = storage.get('Timer_table', {})
timer_table[actuator_addr] = os.time() + grp.getvalue(timer_addr) * 60
storage.set('Timer_table', timer_table)
end

Событийный скрипт для управляемого группового адреса для удаления записи из таблицы таймеров в момент выключения нагрузки является универсальным, поэтому его можно привязать к тегу (например, ‘timer_delete’), который будет включать в себя все управляемые групповые адреса нагрузок. Он работает следующим образом:

  1. Получает таблицу таймеров из storage.
  2. Если нагрузка была выключена, удаляет таймер для своего группового адреса из таблицы таймеров и записывает измененную таблицу в storage.

— Событийный скрипт для тега, который включает в себя все управляемые групповые адреса
— В примере «Set timer.lua» управляемым адресом является ’32/2/54′

timer_table = storage.get('Timer_table', {})
if not event.getvalue() then
timer_table[event.dst] = nil
storage.set('Timer_table', timer_table)
end

Резидентный скрипт отвечает за выключение нагрузки по таймеру. Работает он следующим образом:
1. Получает таблицу таймеров.
2. Проходит по таблице и сверяет текущее время и время выключения нагрузок.
3. Если текущее время превышает время выключения, то отправляет телеграмму на выключение нагрузки.

В этом скрипте не происходит удаление таймера нагрузки, поскольку это произойдет автоматически при выключении нагрузки в предыдущем скрипте.

Внимание! Не ставьте частоту запуска резидентного скрипта меньше 1 секунды, это может привезти к лишней нагрузке на LM.

— Резидентный скрипт с частотой запуска не менее 1 секунды в зависимости от необходимой точности проверки

timer_table = storage.get('Timer_table', {})
for grpaddr, timer in pairs(timer_table) do
if os.time() > timer then
grp.write(grpaddr, 0)
end
end

Для удаления всех таймеров при перезагрузке LM добавьте следующую строку в скрипт запуска системы (init script):

storage.set('Timer_table', {})