Задача: сделать возможность включать какую-либо нагрузку на время, задаваемое пользователем.
Данное решение является универсальным в плане кода, что приводит к количеству сценариев равному n+2, где n – количество групповых адресов, запускающих таймер. В этом решении используется таблица таймеров вида {[‘групповой адрес нагрузки’] = время выключения, … }, что позволяет унифицировать код проверки таймера и удаления таймера из таблицы.
Пример представляет из себя три скрипта, два универсальных и один скрипт-пример для запуска таймера. В приведенном случае управляемый объект и объект, запускающий таймер, являются битовыми.
Событийный скрипт для запуска таймера работает следующим образом:
- Включает нагрузку.
- Получает текущую таблицу таймеров из storage.
- Получает значение таймера из группового адреса и записывает в таблицу таймеров время выключения нагрузки.
- Записывает полученную таблицу таймеров в 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’), который будет включать в себя все управляемые групповые адреса нагрузок. Он работает следующим образом:
- Получает таблицу таймеров из storage.
- Если нагрузка была выключена, удаляет таймер для своего группового адреса из таблицы таймеров и записывает измененную таблицу в 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', {})