Задача: Хочу чтобы по наступлению временного промежутка времени у меня на участке отрабатывал скрипт в задачу которого входит включение Relay Sonoff TH10 (в последствии будет заменено на связку MegaD2561 + Mega D-14-R — прорабатываю, документирую) на которое запитано два светильника, один освещает место парковки, а второй кессон, дорожку до дома. В процессе связки двух светильников используют распаечную коробку и клеммы WAGO.
Шаг №1: У меня все еще в качестве системы "Умный дом" используется Domoticz на Ubuntu 18.04. Знаю! Что есть более новая версия на Ubuntu 20.04, но я как поставил на Ubuntu 18.04 Server, отключил автоматические обновления, то мне этого достаточно. Мой Domoticz крутится на HP MicroServer Gen8, но скоро переедет на домашний сервер:
Как установить Proxmox 6.4.4 on Gigabyte C246 WU4
Внедряю ZFS для моего сервера Gigabyte C246 WU4
Как подружить Sonoff TH10 с Domoticz
Шаг №2: Чтобы воплотить задумку, буду писать событие:
http://IP&DNS:8080 (http://172.33.33.122) - user&pass - Настройка - Дополнительно - События — нажимаю на "плюсик" — выбираю dzVents — шаблон Timer и на его основе у меня получается вот такой вот скрипт:
--так обозначается комментарий
return {
on = {
timer = {
--Если время в промежутке между 20:00-21:00
'at 19:00-21:00'
--'at 20:00-21:00'
}
},
execute = function(domoticz, timer)
--Присваиваем переменной значение устройства
local light1 = domoticz.devices('Свет Парковка')
--Если состояние устройства выключено
if (light1.state == 'Off') then
--Если время от промежутка прошло 1 минута, то
--Включаем Реле
light1.switchOn().forMin(1)
domoticz.log('Timer event was triggered by ' .. timer.trigger, domoticz.LOG_INFO)
domoticz.log('Light1 On' .. timer.trigger, domoticz.LOG_INFO)
elseif
(Light1.state == 'On') then
--Если время больше через промежуток то выключаем реле
light1.switchOff().forMin(1)
domoticz.log('Light1 Off' .. timer.trigger, domoticz.LOG_INFO)
--return true
end
end
}
После его написания нажимаю "Сохранить" и "Включен"
Ниже наглядный результат скрипта:

На заметку: Созданный скрипт через визуальное написание выше располагается
ekzorchik@srv-domoticz:~$ ls domoticz/scripts/dzVents/generated_scripts/ -lh total 8.0K -rw-r----- 1 root root 1.3K Sep 19 20:51 LightGarazheOn1.lua
Но также можно не через визуальное написание расположить код по пути:
ekzorchik@srv-domoticz:~$ ls domoticz/scripts/dzVents/scripts/LightGarazheOn1.lua
Шаг №3: В процессе написания скрипта (события) отлавливал ошибки (не удобно правда) через меню:
http://IP&DNS:8080 (http://172.33.33.122) - user&pass - Настройка - Журнал — вкладка "Состояние"
Шаг №4: Я свой код как мог задокумментировал, на проверку если указать временной промежуток, то если время между, что через 1 минуту включается реле, если промежуток выходит за пределы то выключается.
На заметку: Я все наработки по части скриптов перебрасываю в домашний репозитарий на базе Mercurial.
Пока данный код выполняет задачу, по мере опыта он будет совершенствоваться.
Шаг №5: От 20.09.2021 было замечено что скрипт каждую минуту то включает реле то выключает реле — неправильно. Я пока не понял как сделать по нормальному. И тут пришла идея путь будет два скрипта:
на включение по наступлению временного промежутка:
return {
on = {
timer = {
--'at 18:30-21:00', -- between 12:45 and 21:15. You cannot use '*'!
--Если время в промежутке между 20:00-21:00
'at 19:00-20:30'
--'at 20:00-21:00'
}
},
execute = function(domoticz, timer)
--Присваиваем переменной значение устройства
local light1 = domoticz.devices('Свет Парковка')
--Если состояние устройства выключено
if (light1.state == 'Off') then
--Если время от промежутка прошло 1 минута, то
--Включаем Реле
light1.switchOn()
domoticz.log('Timer event was triggered by ' .. timer.trigger, domoticz.LOG_INFO)
domoticz.log('Light1 On' .. timer.trigger, domoticz.LOG_INFO)
end
end
}
на выключение если время на 1 минуту больше чем промежуток дабы если я поздно возвращаюсь я мог подключившись через OpenVPN к домашней сети, открыв приложение Domoticz включить свет и погасить свет:
return {
on = {
timer = {
'at 20:31'
}
},
execute = function(domoticz, timer)
--Присваиваем переменной значение устройства
local light1 = domoticz.devices('Свет Парковка')
--Если состояние устройства выключено
if (light1.state == 'On') then
--Если время от промежутка прошло 1 минута, то
--Включаем Реле
light1.switchOff()
domoticz.log('Timer event was triggered by ' .. timer.trigger, domoticz.LOG_INFO)
domoticz.log('Light1 Off' .. timer.trigger, domoticz.LOG_INFO)
end
end
}
Пока так, если разберусь как сделать один единственный скрипт то дополню заметку.
На этом у меня все, с уважением автор блога Олло Александр
Email: support@ekzorchik.ru
Telegram: @aka_ekzorchik