Страница 1 из 4

Обновления датчика движения

Добавлено: Ср дек 07, 2016 2:43 pm
ингвар
Приветствую всех помогите разобраться с датчиком движения
Есть объект HallSensor класса MotionSensors в нем есть свойство Status которое обновляется через модуль esp8266_wifiot по движению , все работает нормально, но как только ставишь метод "statusChanged" при изменении свойства Status почему то сам Status обновляется на пустое значения
statusChangedПоказать

Код: Выделить всё

$params['status'] =$this->getProperty('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=24*60*60;
}
clearTimeOut($ot."_alive");
setTimeOut($ot."_alive","sg('".$ot.".alive',0);",$alive_timeout);

if ($params['status']) {
 
 $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'); // запускаем скрипт "доброе утро"
  }
} 
что интересно работало пару обновлений назад (просто не заметил когда работать перестало)

Re: Обновления датчика движения

Добавлено: Ср дек 07, 2016 2:59 pm
nick7zmail
ингвар писал(а):
что интересно работало пару обновлений назад (просто не заметил когда работать перестало)
Зачем эта конструкция??

Код: Выделить всё

$params['status'] =$this->getProperty('status');
$this->setProperty('status',$params['status']);  
Что-то мне подсказывает что виновата она.

*** Сообщение запрещено. Сообщение похоже на спам. ***

Re: Обновления датчика движения

Добавлено: Ср дек 07, 2016 5:37 pm
ингвар
nick7zmail писал(а):
ингвар писал(а):
Что-то мне подсказывает что виновата она.
Я их убирал но из-за этого не срабатывал код после "if ($params['status']) "

Re: Обновления датчика движения

Добавлено: Ср дек 07, 2016 7:27 pm
nick7zmail
ингвар писал(а): Я их убирал но из-за этого не срабатывал код после "if ($params['status']) "
Ну вы понимаете, что вы берете $params['status'] (которого изначально вообще не существует скорее всего), присваиваете ему свойство статус из запущенного объекта (не известно применяется ли оно, или так и остается несуществующим), и тут же обратно свойству status обратно присваивате значение из $params['status'], что по факту вообще должно перезапустить метод повторно, и вызвать циклический вызов этого метода и возможное дальнейшее зависание цикла main...

а if можно проводить и напрямую по if($this->getProperty('status')) {}

Re: Обновления датчика движения

Добавлено: Чт дек 08, 2016 4:09 pm
ингвар
nick7zmail писал(а): а if можно проводить и напрямую по if($this->getProperty('status')) {}
переписал код
СпойлерПоказать

Код: Выделить всё

//$params['status'] =$this->getProperty('status');
//$this->setProperty('status',$params['status']); // выставляем статус сенсора HallSensor.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 ($this->getProperty('status')) {
 
 $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'); // запускаем скрипт "доброе утро"
  }
}
данные статуса стали работать нормально, но всеравно скрипт после if ($this->getProperty('status')) не срабатывает , помогите в чем может быть проблема ,
что интересно раньше работало я не чего не трогал просто после какого то недавнего обновления перестала работать

Re: Обновления датчика движения

Добавлено: Сб дек 10, 2016 7:56 pm
ингвар
чего то ни как не соображу что к чему
есть датчик движение который через модуль esp8266_wifiot по движению обновляет свойство status в объекте Hallsensor в свойстве оно меняется на 1, а метод видит что оно равно 0 как это побороть?
помогите тогда или ткните где почитать

написал вот так :
$s = $this->getProperty('status');
if ($s==1){}
так заработало, но правильно ли это?

Re: Обновления датчика движения

Добавлено: Сб дек 10, 2016 8:29 pm
nick7zmail
ингвар писал(а):чего то ни как не соображу что к чему
есть датчик движение который через модуль esp8266_wifiot по движению обновляет свойство status в объекте Hallsensor в свойстве оно меняется на 1, а метод видит что оно равно 0 как это побороть?
помогите тогда или ткните где почитать

написал вот так :
$s = $this->getProperty('status');
if ($s==1){}
так заработало, но правильно ли это?
Да вроде все правильно. Если метод не классовый - можно напрямую к свойству обращаться

Код: Выделить всё

if (gg('объект.св-во')==1){} 
А если классовый - то все правильно сделали...а что вас смущает то?))

Re: Обновления датчика движения

Добавлено: Сб сен 16, 2017 1:35 am
Gelezako
Помогите плиз разобраться что делать этот метод statusChanged? Датчик движения у меня есть. Обычно я сам писал логику исходя из своих знаний языка, но этот код я не могу прочитать. Буду признателен если опишите хотя бы в общих чертах зачем он был написан.

Re: Обновления датчика движения

Добавлено: Вт сен 19, 2017 10:50 am
sergejey
Gelezako писал(а):Помогите плиз разобраться что делать этот метод statusChanged? Датчик движения у меня есть. Обычно я сам писал логику исходя из своих знаний языка, но этот код я не могу прочитать. Буду признателен если опишите хотя бы в общих чертах зачем он был написан.
А что именно интересует?
Я сейчас свои датчики дома перевожу все в Простые устройства. Если говорить языком алгоритмов, то суть кода обработки движения сводится к следующему:
1. Установить статус в 1
2. Установить таймер на сброс статуса в 0 через 20 секунд
3. Вызвать метод Действие
4. Деактивировать режим "никого нет дома", если он активен
5. Вызвать метод onActivity для комнаты (если датчик привязан к комнате).

В основном всё. Действия на движения я обычно не привязываю к датчикам, а привязываю к комнатам, т.к. датчиков в комнате может быть несколько и они могут меняться (были беспроводные, стали проводные и т.п.)

Re: Обновления датчика движения

Добавлено: Вт сен 19, 2017 10:24 pm
xor
А нельзя
2. Установить таймер на сброс статуса в 0 через 20 секунд
вынести в настройки?
А то, кмк, это заточено под определенный тип датчика, который меняет своё состояние гарантированно раньше 20 с.
Если датчик чуть поумнее, он будет пролонгировать своё активное состояние, дожидаясь отсутствия движения.
Если ходить перед датчиком 300 с, он выдаст 1 в начале, потом будет ждать окончания движения 300 с.
А через 20 с таймаутом статус движения сбросится - никого нету, так? И 280 с статус не поменяется, выходит?