Попробую сам себе ответить.
Есть два метода с одинаковым названием
keySensors->statusChanged
И
keySensors->inHouseMovementSensors->statusChanged
первый содержит лишь код устанавливающий время жизни сенсоров
Код: Выделить всё
if ($params['status']) {
$this->setProperty('status',$params['status']);
}
$this->setProperty('updatedTimestamp',time());
$this->setProperty("alive",1);
$ot=$this->object_title;
$alive_timeout=(int)$this->getProperty("aliveTimeOut");
if (!$alive_timeout) {
$alive_timeout=12*60*60;
}
clearTimeOut($ot."_alive");
setTimeOut($ot."_alive","sg('".$ot.".alive',0);",$alive_timeout);
Причем в не зависимости от того вызван метод с параметром $params['status']
Или без
А вот второй метод в чистой установке требовал обязательного присутствия
Параметра $params['status']
В моем случае свойство status устанавливается в лог. 1 модулем mySensors
при срабатывании датчика движения, и также ставится в 0 при отсутствии движения
Значит при вызове метода keySensors->inHouseMovementSensors->statusChanged
Параметра status не передается и его надо считать
Результат
Код: Выделить всё
//$this->setProperty('status',$params['status']); // выставляем статус сенсора
// отключим первую строчку из оригинального кода
if ($params['status']) {
$this->setProperty('status',$params['status']);
}else if($this->getProperty("status") != 0){
// новое условие считывающее параметр
$_status = $this->getProperty("status");
}
$this->setProperty('updatedTimestamp',time()); // выставляем время срабатывания сенсора
$this->setProperty('alive',1);
$ot=$this->object_title;
$alive_timeout=(int)$this->getProperty("aliveTimeOut");
if (!$alive_timeout) {
$alive_timeout=24*60*60;
}
clearTimeOut($ot."_alive");
setTimeOut($ot."_alive","sg('".$ot.".alive',0);",$alive_timeout);
if ($params['status'] || $_status != 0) {
// и добавим условию новое вхождение
$this->setProperty('motionDetected',1);
clearTimeOut($this->object_title.'_detected');
setTimeOut($this->object_title.'_detected',"setGlobal('".$this->object_title.".motionDetected',0);",30);
$linked_room=$this->getProperty('LinkedRoom');
if ($linked_room!='') {
callMethod($linked_room.'.onActivity');
}
if ($this->object_title=='sensorMovement3' || $this->object_title=='sensorMovementRemote1' || $this->object_title=='sensorMovementRemote2') {
//|| $this->object_title=='sensorMovement5'
return; // не реагируем на движение в спальне, по ip-сенсорам и по сенсору на втром этаже
}
ClearTimeOut("nobodyHome");
SetTimeOut("nobodyHome","callMethod('NobodyHomeMode.activate');", 1*60*60); // выполняем если целый час никого не было
if (getGlobal('NobodyHomeMode.active')) {
callMethod('NobodyHomeMode.deactivate');
}
$last_register=registeredEventTime('inhouseMovement'); // проверяем когда в последний раз срабатывало событие "движение внутри дома"
registerEvent('inhouseMovement',$this->name,2); // регистрируем событие "движение внутри дома"
if (timeBetween('05:00', '12:00') && ((time()-$last_register)>2*60*60)) {
runScript('Greeting'); // запускаем скрипт "доброе утро"
}
}
PS: "Ёмаё чтож я сделал?"
А теперь при регистрации движения датчиком стал падать модуль mySensors с ошибкой
Код: Выделить всё
Fatal error: Cannot redeclare cmp() (previously declared in
C:\_majordomo\htdocs\modules\objects\objects.class.php(513) : eval()'d code:13) in
C:\_majordomo\htdocs\modules\objects\objects.class.php(513) : eval()'d code on line 19
2016-04-20 12:58:31 Set: Node:5; Sensor:4; Type:1; Ack:0; Sub:4; Msg:756.32
2016-04-20 12:58:31 Set: Node:5; Sensor:2; Type:1; Ack:0; Sub:4; Msg:1008
Методом исключения выяснил - падает при вызове
callMethod($linked_room.'.onActivity');
Далее тем же методом вычислил в onActivity падение при вызове
$this->callMethod("updateActivityStatus");
а вот в методе
updateActivityStatus та самая, многократно объявляемая, функция cmp() -
Осталось лишь добавить проверку на существование функции
Код: Выделить всё
if (!function_exists ( "cmp" ))
{ // если функция еще не объявлена
function cmp($a, $b)
{
if ($a['diff'] == $b['diff']) {
return 0;
}
return ($a['diff'] < $b['diff']) ? -1 : 1;
}
}
usort($rooms,"cmp");
PS - первые тесты показали что падения прекратились.