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

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

ингвар
Сообщения: 142
Зарегистрирован: Вт ноя 25, 2014 2:06 pm
Благодарил (а): 33 раза
Поблагодарили: 0

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

Сообщение ингвар » Ср дек 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'); // запускаем скрипт "доброе утро"
  }
} 
что интересно работало пару обновлений назад (просто не заметил когда работать перестало)
Windows 10 + Raspberry Pi3 + ESP8266
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

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

Сообщение nick7zmail » Ср дек 07, 2016 2:59 pm

ингвар писал(а):
что интересно работало пару обновлений назад (просто не заметил когда работать перестало)
Зачем эта конструкция??

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

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

*** Сообщение запрещено. Сообщение похоже на спам. ***
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
ингвар
Сообщения: 142
Зарегистрирован: Вт ноя 25, 2014 2:06 pm
Благодарил (а): 33 раза
Поблагодарили: 0

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

Сообщение ингвар » Ср дек 07, 2016 5:37 pm

nick7zmail писал(а):
ингвар писал(а):
Что-то мне подсказывает что виновата она.
Я их убирал но из-за этого не срабатывал код после "if ($params['status']) "
Windows 10 + Raspberry Pi3 + ESP8266
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

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

Сообщение nick7zmail » Ср дек 07, 2016 7:27 pm

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

а if можно проводить и напрямую по if($this->getProperty('status')) {}
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
ингвар
Сообщения: 142
Зарегистрирован: Вт ноя 25, 2014 2:06 pm
Благодарил (а): 33 раза
Поблагодарили: 0

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')) не срабатывает , помогите в чем может быть проблема ,
что интересно раньше работало я не чего не трогал просто после какого то недавнего обновления перестала работать
Windows 10 + Raspberry Pi3 + ESP8266
ингвар
Сообщения: 142
Зарегистрирован: Вт ноя 25, 2014 2:06 pm
Благодарил (а): 33 раза
Поблагодарили: 0

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

Сообщение ингвар » Сб дек 10, 2016 7:56 pm

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

написал вот так :
$s = $this->getProperty('status');
if ($s==1){}
так заработало, но правильно ли это?
Windows 10 + Raspberry Pi3 + ESP8266
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

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

Сообщение nick7zmail » Сб дек 10, 2016 8:29 pm

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

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

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

if (gg('объект.св-во')==1){} 
А если классовый - то все правильно сделали...а что вас смущает то?))
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Аватара пользователя
Gelezako
Сообщения: 963
Зарегистрирован: Чт июн 02, 2016 9:33 pm
Благодарил (а): 205 раз
Поблагодарили: 106 раз
Контактная информация:

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

Сообщение Gelezako » Сб сен 16, 2017 1:35 am

Помогите плиз разобраться что делать этот метод statusChanged? Датчик движения у меня есть. Обычно я сам писал логику исходя из своих знаний языка, но этот код я не могу прочитать. Буду признателен если опишите хотя бы в общих чертах зачем он был написан.
фанат Мажордомо
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

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

Сообщение sergejey » Вт сен 19, 2017 10:50 am

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

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

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 284 раза
Поблагодарили: 629 раз

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

Сообщение xor » Вт сен 19, 2017 10:24 pm

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