Оборудование приехало. Тпереь у меня есть (в разных количествах):
1) Универсальный бинарный датчик
2) Датчик движения/освещенности/влажности/температуры в одном
3) Встраиваемый диммер Fibaro
4) Диммер ZME
5) Брелок ZME
6) Встраиваемое 2*1,5 кВт реле Fibaro
7) Выключатель нагрузки с датчиком энергопотребления Aeon Labs
8) Настенный контроллер на батарейках ZME
Скажу сразу, что если у вас цель сделать автоматизацию своего дома с относительно сложными сценами, то вам придется разбираться с программированием на Lua-Luup. На самом деле там ничего сложного.
Изучать я только начал, так что больно не пинать :)
Как я уже писал, у меня была задача перекрывать водоснабжение в квартире при уходе людей. На первый взгляд все очень просто. Если люди ушли - воду перекрыть. Если пришли - открыть.
Но иногда, вопреки совету производителя, мы можем оставить включенными стиральную/посудомоечную машину и уйти из дома. И вот тогда воду перекрывать не стОит.
Вот как решил задачу я.
К стиральной машине подключен выключатель с датчиком энергопотребления. На основании данных с этого датчика, удалось выяснить что если машина закончила стирку, то ее потребление находится в районе 3-4 Ватт.
Стабильно. В процессе стирки значение потребления постоянно меняется и оно, естественно, выше.
UPDATE! В данный момент концепция меняется, всвязи с недостатками описанного ниже метода. Далее можно не читать :) продолжение в отдельном посте
Начнем с простого. Хозяева уходят из дома. Если машина выключена (потребление 0) - перекрыть воду. Тут надо сказать, что выбранный мной выключатель/датчик нельзя по-простому использовать в сцене, ибо там можно настроить срабатывание только на изменение состояния (вкл/выкл) встроенного реле. Поэтому пришлось писать недостающее на luup.
1) Создаем сцену в которой при срабатывании датчика ухода хозяев из дома перекрывается вода.
2) Но сделать сразу мы это можем только если стиральная машина выключена. Поэтому дописываем в триггер код:
*local ConsumptionDetectorSID = "urn:micasaverde-com:serviceId:EnergyMetering1" -- SID датчика потребления энергии
local ConsumptionDetectorID = 18 -- ID of VirtualSwitch -- ID датчика потребления энергии
local Consumption = luup.variable_get(ConsumptionDetectorSID, "Watts", ConsumptionDetectorID) -- получаем в переменную текущее значение потребления энергии
Consumption = tonumber(Consumption) --преобразовываем строковое значение в числовое для последующей возможности сравнить
if (Consumption==0) then -- если полученное значение равно 0 (машина выключена)
return true -- запускаем сцену
end
return false -- а иначе не запускаем*
на этом текущая подзадача выполнена.
Далее нас ждут танцы с бубном. Этот несчастный датчик потребления энергии не умеет хранить внутри себя дату-время последнего изменения показаний.
Поэтому я установил плагин Combination Switch. По своей сути это триггер. Любо включен, либо выключен. Условия при которых он меняет свое состояние настраиваются внутри. У меня сделано так чтобы при потреблении от 5 до 9999 ватт он был включен. В противном случае - выключен. То есть в нашей ситуации он говорит нам в первом случае что в данный момент происходит стирка. Во втором случае он говорит нам что потребление низкое, сравнимое с послестирочным значением. В моем случае если это значение больше 10 минут - можно смело выключать машину. Стирка точно окончена.
Задача номер два. Надо понять, когда последний раз машина меняла свое состояние (с высокого на низкое и наоборот). Для этого использованы 2 триггера в новой сцене. В одном мы реагируем на включение Combination Switch (высокое потребление). В другом мы реагируем на выключение Combination Switch (низкое потребление). В самом Combination Switch создаем дополнительную переменную вида LastTrip. И в первом триггере добавляем код:
*local VirtualSwitchSID = "urn:micasaverde-com:serviceId:SecuritySensor1" -- SID Combination Switch
local VirtualSwitchID = 35 -- ID Combination Switch
local TripTime = os.time() -- Получаем тукущее системное время
luup.variable_set(VirtualSwitchSID, "LastTrip", TripTime, VirtualSwitchID) -- И записываем его в переменную LastTrip
return true*
Для второго триггера полностью аналогично.
Теперь если стиральная машина переходит из высокого потребления в низкое и обратно - мы знаем когда это произошло.
Ну и финальный рывок. Если 10 минут потребление не менялось и было низким - запустить сцену перекрытия воды.
Для этого в первой сцене (где мы перекрывали воду если машина выключена) добавляем новый триггер и настраиваем его на срабатывание если Combination Switch выключен (низкое потребление).
И добавляем код Luup:
*local SleepTestPeriod = 10 -- Время ожидания в минутах. Если низкое потребление будет все это время - можно перекрывать воду
local MaxSleepDetectorSID = "urn:micasaverde-com:serviceId:SecuritySensor1" -- SID Combination Switch
local MaxSleepDetectorID = 35 -- ID Combination Switch
local DoorSensorSID = "urn:micasaverde-com:serviceId:SecuritySensor1" -- SID датчика отсутствия людей. Нужно иметь ввиду что у меня он принимает значение 1 если люди есть и 0 если нет
local DoorSensorID = 12 -- ID of DoorSensor -- ID датчика отсутствия людей
function checkLastTrip() -- функция проверки условий
local LastTrip = luup.variable_get(MaxSleepDetectorSID, "LastTrip", MaxSleepDetectorID) -- получаем дату-время последнего изменения потрребления энергии (настраивали на 2м шаге)
local DoorStatus = luup.variable_get(DoorSensorSID, "Tripped", DoorSensorID) -- получаем состояние присутствия/отсутствия людей
if (DoorStatus == "1") then -- Если во время выполнения сцены пришли люди - прекратить выполнение сцены
return false
end
LastTrip = tonumber(LastTrip) -- преобразуем в цифровой вид (из текстового) время последнего изменения потребления
if ((os.difftime(os.time(), LastTrip) / 60) >= SleepTestPeriod) then --Если потребление не менялось уже SleepTestPeriod время, то запустить сцену перекрытия водоснабжения
return true
else
luup.call_delay ("checkLastTrip", 60) -- Иначе повторить проверку через 1 минуту
end
end
return false*
Ходовые испытания последнего скрипта продолжаются :)
Ну а теперь надо создать простую сцену открытия шаровых кранов если люди пришли домой.
В новой сцене создаем триггер, срабатывающий при появлении людей. И даже кода добавлять не надо.
Признаю что решение, возможно, не оптимальное, но я только учусь.