Для примера будем разбирать ситуацию с реле для включения света. Причиной будут методы onActivity и onIdle класса Rooms. Код в них будет простой
onActivity
Код: Выделить всё
cm('RelayBhLightRestroom1.logic', array('status'=>1));
Код: Выделить всё
cm('RelayBhLightRestroom1.logic', array('status'=>0));
Теперь сам метод logic класса Rerays. Родительский код
Код: Выделить всё
global $do_not_execute_object_method; //ToTest
$ms=$this->getProperty('modeSwitch');
if (is_numeric($ms)) {
if ($ms==0) { $f=0; }
elseif ($ms==1) { $f=1; }
elseif ($ms>=2) {
// вкл/выкл при существовании таймера или рекомендации
if (timeOutExists($this->object_title.'_nowork')) { $f=0; }
elseif (isset($params['status'])) {
if ($params['status']) { $f=1; } else { $f=0; }
}
elseif (timeOutExists($this->object_title.'_work')) { $f=1; }
}
if (isset($f)) {
// переключить реле
$s=$this->getProperty('status');
if ($f>$s) { $this->callMethod('turnOn'); }
if ($f<$s) { $this->callMethod('turnOff'); }
// запретить выполнение кода метода объекта
$do_not_execute_object_method=true;
return 3;
}
}
// решение на усмотрение метода объекта при его наличии
$do_not_execute_object_method=false;
return 2;
// если метод объекта есть, он перезапишет на 1
Не все реле требуют большой и сложной логики, и поэтому кода родительского метода может быть вполне достаточно для управления реле. В моем случае для света далеко не у всех релюшек есть своя логика. И в этом плюс такого подхода. Очень быстро масштабируется. Конкретно у этого объекта RelayBhLightRestroom1 своего метода logic нет.
Но есть и такие, у которых есть. И тут ещё момент. Чтобы там ни было написано, если. например, командует modeSwitch, то выполнять метод объекта уже и не требуется. Для этого в родительском коде есть переменная $do_not_execute_object_method. А в коде объекта в самом начале будет завершение выполнения, если решение о работе реле уже окончательно принято. Вот пример наличия логики в другом объекте реле
Код: Выделить всё
/*
если решение принято по переключателю режима работы,
или существованию одного из таймеров,
то прекратить работу кода объекта
*/
// *** Прервать выполнение по инструкции родительского кода
global $do_not_execute_object_method; //ToTest
if ($do_not_execute_object_method) { return 3; }
// *** Проверка свойств объектов, которые могут изменить решение.
$f = 0; // Предполагаем, что реле будет выключено
// Не включать при максимальной экономии
if (gg('EconomMode.status') >= -1) {
// Уровень освещенности
if (gg('DuskMode.status')) {
// Кто то тут
if (gg('Gazebo.SomebodyHere')) {
$f = 1;
}
}
}
// *** Выполнить
$s=$this->getProperty('status');
if ($f>$s) { $this->callMethod('turnOn'); }
if ($f<$s) { $this->callMethod('turnOff'); }
Мало? тогда дадим ещё: Непросто так в различных частях кода при его завершении после return указана цифра. Это позволяет отследить кто принял решение о работе реле. Родительский код, код метода объекта, да и есть ли вообще код метода.
Пример использования:
Код: Выделить всё
if ((int)cm('RelayBhLightRestroom2.logic') == 2) {
if (!gg('RelayBhLightRestroom2.status')) {
callMethod('RelayBhLightRestroom2.turnOn');
}
}
3 - если modeSwitch = 0; 1; >=2 и есть таймер (ToTest есть рекомендация)
2 - если нет логики объекта и родительский код не принял решение
1 - есть логика в объекте
Условие в коде на ==2 говорит что решение не принято родительским методом, а собственного метода у реле нет. Ситуации бывают разные, и в некоторых случаях нам это может пригодиться.
Прикручиваем радиопереключатель к этой структуре Тут есть пример использования таймера для поддержания работы реле
Управление реле и авторежимом из шаблонов поведенияСсылка ведет в шаблоны поведения. Проследуйте до кода по ветке Включи или Выключи => Свет Освещение => комната Тут есть пример таймера, запрещающего работу.