Welcome или включи, что выключил уходя
Статья в стадии ЧЕРНОВИК и дописывается.
Описание
Меня не совсем устраивал стандартный переключатель в просттые устройства (далее ПУ) "выключать при вкл эконом режима" и "включать при выкл эконом режима". На первый взгляд этого достаточно. У меня эконом режим включается, когда все ушли из дома и выключается, когда кто-то все же появился и когда все спят. Но не устраивало меня вот что. Если устройство включено на момент ухода всех, то стандартная логика в ПУ отрабатывает хорошо и по возвращении кого-то домой устройство включится. А вот если устройство выключено на момент ухода, то когда кто-то вернется оно включится. А оно мне надо? Плюс когда все спят, то ряд устройств отключать не хотелось бы. Собственно, подошли к коду. Что он делает. На момент ухода записывает все статусы устройств группы "Welcome" ПУ в свойство MemoryStatus и затем выключает устройство (запуск метода turnOff на объекта устройства). А по возвращению читает свойство MemoryStatus и включает (turnOn) то, что было включено по уходу.
Код
Создаем группу "Welcome" в ПУ.
SControllers
Далее идем в Объекты-SDevices-SControllers
В классе SControlles создаем метод MemStatSave (описание: Сохранение в память состояния (статуса) устройства)
$this->setProperty("MemoryStatus", $this->getProperty("status"));
Далее создаем там же метод MemStatRefresh (Восстановление устройств до состояния (до) памяти)
$memstat=$this->getProperty("MemoryStatus"); $status=$this->getProperty("status"); //Проверяем включено ли сейчас устройство и какой был статус до ухода if ($status != $memstat && $memstat==1 ) { $this->callMethod('turnOn'); }
и переключим "вызов родительсвого метода" в "НИКОГДА"
groupWelcome
Далее идем в Объекты-SDevices-SControllers-SGroups-groupWelcome и редактируем метод turnOff
$this->setProperty('status', 0); $this->setProperty('updated', time()); //$status = $params['NEW_VALUE']; $group_name = $this->getProperty('groupName'); $objects = getObjectsByProperty('group' . $group_name, 1); foreach($objects as $object_title) { $status = getGlobal($object_title . '.status'); usleep(50000); setGlobal($object_title . '.MemoryStatus', $status); if ( $status == 1) callMethodSafe($object_title . '.turnOff', array('source' => $params['ORIGINAL_OBJECT_TITLE'])); }
и переключим "вызов родительсвого метода" в "НИКОГДА"
Далее там же в Объекты-SDevices-SControllers-SGroups-groupWelcome и редактируем метод turnOn
$this->setProperty('status', 1); $this->setProperty('updated', time()); //$status = $params['NEW_VALUE']; $group_name = $this->getProperty('groupName'); $objects = getObjectsByProperty('group' . $group_name, 1); foreach($objects as $object_title) { $MemoryStatus = getGlobal($object_title . '.MemoryStatus'); usleep(50000); //setGlobal($object_title . '.MemoryStatus', $status); if ( $MemoryStatus == 1) callMethodSafe($object_title . '.turnOn', array('source' => $params['ORIGINAL_OBJECT_TITLE'])); }
и переключим "вызов родительсвого метода" в "НИКОГДА" Вот у нас и готовы методы для ухода и прихода.
NobodyHome
Далее идем Объекты-OperationalModes-NobodyHomeMode и добавляем в метод activate следующий код. Он запишет состояния устройств в группе Welcome и выключит включенные.
callMethodSafe('groupWelcome.turnOff');
Я вставляю туда, где пишется статус NobodyHome когда все ушли (не спят)
Ну и в мотоде deactivate там же в Объекты-OperationalModes-NobodyHomeMode добавим код
//восстановим состояние объектов группы NobodyHome до состояния ухода callMethodSafe('groupWelcome.turnOn');
Вот вроде бы и все