Welcome или включи, что выключил уходя

Материал из MajorDoMo инфо
Версия для печати больше не поддерживается и может содержать ошибки обработки. Обновите закладки браузера и используйте вместо этого функцию печати браузера по умолчанию.

Статья в стадии ЧЕРНОВИК и дописывается.

Описание

Меня не совсем устраивал стандартный переключатель в просттые устройства (далее ПУ) "выключать при вкл эконом режима" и "включать при выкл эконом режима". На первый взгляд этого достаточно. У меня эконом режим включается, когда все ушли из дома и выключается, когда кто-то все же появился и когда все спят. Но не устраивало меня вот что. Если устройство включено на момент ухода всех, то стандартная логика в ПУ отрабатывает хорошо и по возвращении кого-то домой устройство включится. А вот если устройство выключено на момент ухода, то когда кто-то вернется оно включится. А оно мне надо? Плюс когда все спят, то ряд устройств отключать не хотелось бы. Собственно, подошли к коду. Что он делает. На момент ухода записывает все статусы устройств группы "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);

 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');

Теперь идем в ПУ и заходим в каждое устройство, которое хотим выключать по уходу и включать по приходу, и ставим галку возле группы "Welcome", тем самым добавляем устройство в группу.

Вот вроде бы и все