Мои методы для датчиков движения - общий для всех и для примера датчик на самом входе около двери
Общий
Код: Выделить всё
$this->setProperty('status',$params['status']); // выставляем статус сенсора
$this->setProperty('updatedTime',date("y-m-d H:i")); // выставляем время срабатывания сенсора
$h=(int)date('G',time());
$m=date('i',time());
$tm=$h+$m/100;
$ot=$this->object_title;
$alive_timeout=(int)$this->getProperty("aliveTimeOut");
if (!$alive_timeout) {
$alive_timeout=24*60*60;
}
$this->setProperty("alive",1);
clearTimeOut($ot."_alive");
SetTimeOut($ot."_alive","callmethod('".$ot.".AliveCheck');", $alive_timeout); // назначаем новый таймер. срабатывает через час
if ($params['status']) { // если статус = 1
if (gg('SecurityArmedMode.status') == 1) {
say('Внимание, нарушение режима безопасности');
}
sg('somebodyHome',1); // ставим глобальный флаг на то что кто-то дома
sg('somebodyHomeText','Дома кто-то есть'); // так же ставим свойства глобальной переменной для текстового статуса
sg('sensorMovementSUM.status', 1);
sg('sensorMovementSUM.alive', 1);
sg('sensorMovementSUM.updated', time());
sg('sensorMovementSUM.updatedTime', date("y-m-d H:i"));
clearTimeOut("sensorMovementSUM");
setTimeOut("sensorMovementSUM","sg('sensorMovementSUM.status',0);",60);
ClearTimeOut("nobodyHome"); // очищаем таймер события "никого нет дома"
SetTimeOut("nobodyHome","callmethod('NobodyHomeMode.activateCheck');", 1*90*60); // назначаем новый таймер. срабатывает через час после последнего срабатывания датчика.
$last_register=registeredEventTime('inhouseMovement'); // проверяем когда в последний раз срабатывало событие "движение внутри дома"
if ((!$last_register) || ((time()-$last_register)>1*60*60)) { // срабатывало более 2х часов назад (либо никогда не срабатывало ранее)
if (gg("NobodyHomeMode.status") == 0) { // если все дома
if ( gg("NightMode.status")==1 ) {
}
if ( gg("NightMode.status")==0 ) {
if (timeBetween('07:00', '12:00')) { // движение замечено утром
}
if (timeBetween('17:00', '23:00')) { // движение замечено утром
}
}
} else { // если только пришли, никого не было доклад
}
}
if ( gg("NightMode.status")==0 ) {
registerEvent('inhouseMovement',$this->name,7); // регистрируем событие "движение внутри дома"
}
if (gg("NobodyHomeMode.status") == 1) {
setGlobal('somebodyHome',1); // ставим глобальный флаг на то что кто-то дома
setGlobal('somebodyHomeText','Дома кто-то есть');
say("кто-то появился");
sg("NobodyHomeMode.status",0);
callmethod("NobodyHomeMode.deactivate");
}
}
StatusChanged датчика ближайшего к двери
Код: Выделить всё
if ($params['status']) {
$last_register=registeredEventTime('inhouseMovement'); // проверяем когда в последний раз срабатывало событие "движение внутри дома"
if ((!$last_register) || ((time()-$last_register)>1*60*60)) { // срабатывало более 1х часов назад (либо никогда не срабатывало ранее)
if (gg("NobodyHomeMode.status") == 0) { // если все дома
if ( gg("NightMode.status")==1 ) {
}
if ( gg("NightMode.status")==0 ) {
if (timeBetween('07:30', '12:00')) { // движение замечено утром
//runScript('morningGreeting'); // запускаем скрипт "доброе утро"
callMethod("доброе утро доклад.action");
}
//if (timeBetween('17:00', '23:00')) { // движение замечено утром
//runScript('eveningGreeting'); // запускаем скрипт "
//}
}
} else { // если только пришли, никого не было доклад
say("Ура! Наконец кто-то появился дома!");
callmethod("NobodyHomeMode.deactivate");
if (gg("Yulia.status") > 0 && time() - gg("Yulia.updated") < 25*60){
say("Здравствуйте Юлия",1);
}
if (gg("Andrey.status") > 0 && time() - gg("Andrey.updated") < 25*60){
say("Здравствуйте Андрей",1);
callMethod("доклад.action");
}
}//если только пришли
}//срабатывал более часа назад
if (gg("доклад.done") == 0) {
if ((gg("Andrey.status") > 0) && (time() - gg("Andrey.updated") < 25*60) ) {
say("Здравствуйте Андрей",1);
callMethod("доклад.action");
}}
if (isWeekDay()) {
if (gg("доброе утро доклад.done") == 0) {
if ((gg("Andrey.status") > 0) && (timeBetween('10:30', '12:00') )) {
sg("доброе утро доклад.done",1);
say("Доброе утро Андрей",1);
callMethod("доброе утро доклад.action");
}}}
}
Проверка работоспособности датчика
[code]
// 2017-10-31 если все дома- если ночь откладываем - если день и нет движений, значит сдох / если нет дома то откладываем
$ot=$this->object_title;
if (gg("NobodyHomeMode.status") == 0) { // если все дома
if ( gg("NightMode.status")==1 ) { //если ночь откладываем
clearTimeOut($ot."_alive");
SetTimeOut($ot."_alive","callmethod('".$ot.".AliveCheck');", 3*60*60); // назначаем новый таймер. срабатывает через час
}
if ( gg("NightMode.status")==0 ) { //если день и нет движений, значит сдох
clearTimeOut($ot."_alive");
setTimeOut($ot."_alive","sg('".$ot.".alive',0);",60);
}
} else { // если нет дома то откладываем
clearTimeOut($ot."_alive");
SetTimeOut($ot."_alive","callmethod('".$ot.".AliveCheck');", 8*60*60); // назначаем новый таймер. срабатывает через час
}
[/code]