StatusChange для датчиков движения на esp8266

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

Модератор: immortal

Ответить
alekszander
Сообщения: 178
Зарегистрирован: Вс янв 05, 2014 5:37 am
Благодарил (а): 10 раз
Поблагодарили: 17 раз

StatusChange для датчиков движения на esp8266

Сообщение alekszander » Чт мар 23, 2017 4:25 pm

Коллеги, доброго времени суток. Направьте на путь истины, как настроить метод StatusChange для работы с датчиками движения подключеные к esp. Проблема вся в том что сама esp каждые 10 минут (согласно настройкам) шлёт данные, соответственно свойство status (в моем случае) постоянно обновляется. Буду очень благодарен за помощь. Или может кто нибудь поделится готовым куском кода. Сейчас использую тот который отлично работал с arduino.
P.S. Сломал весь мозг в раздумьях.
P.P.S. Прошивка. Wifi-iot

Отправлено с моего D6633 через Tapatalk
DimSun75
Сообщения: 318
Зарегистрирован: Вс янв 01, 2017 8:32 pm
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 44 раза

Re: StatusChange для датчиков движения на esp8266

Сообщение DimSun75 » Чт мар 23, 2017 4:40 pm

Я пытался уговорить Максима, что он не прав и не нужно слать статус отсутствующего прерывания. Не получилось. Костыли такой:

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

if (params ['NEW_VALUE'] == 1)
{
Тут ваш код
}
 

Отправлено с моего SM-A520F через Tapatalk
alekszander
Сообщения: 178
Зарегистрирован: Вс янв 05, 2014 5:37 am
Благодарил (а): 10 раз
Поблагодарили: 17 раз

Re: StatusChange для датчиков движения на esp8266

Сообщение alekszander » Пт мар 24, 2017 3:54 am

Только остается неясность как быть когда значения шлются пустые. Как в примере ниже. Так как свойство status так же обновится.
a:5:{s:8:" PROPERTY" ; s:6:" status" ; s:9:" NEW_VALUE" ; s:0:" " ; s:9:" OLD_VALUE" ; s:0:" " ; s:6:" SOURCE" ; s:0:" " ; s:21:" ORIGINAL_OBJECT_TITLE" ; s:15:" sensorMovement3" ; }
Решил еще добавить видение истории, так там еще веселее получается (причем в качестве эксперимента установил обмен в промежутке 1 минута):
2017-03-24 11:06:39: X
2017-03-24 11:06:39: X
2017-03-24 11:06:39: 0 X
2017-03-24 11:05:39: 0 X
2017-03-24 11:05:39: X
2017-03-24 11:05:39: X
2017-03-24 11:04:39: X
2017-03-24 11:04:39: X
2017-03-24 11:04:39: 0 X
2017-03-24 11:03:39: X
2017-03-24 11:03:39: X
2017-03-24 11:03:39: 0 X
DimSun75
Сообщения: 318
Зарегистрирован: Вс янв 01, 2017 8:32 pm
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 44 раза

Re: StatusChange для датчиков движения на esp8266

Сообщение DimSun75 » Пт мар 24, 2017 7:35 am

Странно. А пустым значениям откуда там взяться? Нужно разбираться по порядку: как настроена прошивка? Как осуществляется прием в мдм?

Отправлено с моего SM-A520F через Tapatalk
alekszander
Сообщения: 178
Зарегистрирован: Вс янв 05, 2014 5:37 am
Благодарил (а): 10 раз
Поблагодарили: 17 раз

Re: StatusChange для датчиков движения на esp8266

Сообщение alekszander » Пт мар 24, 2017 7:39 am

метод StatusChangedПоказать

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

$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'); // запускаем скрипт "доброе утро"
  }
} 
 
Причем в debug значения отображаются либо "0" либо "1". У меня предположение что проблема именно в самом методе. А где не могу понять.
DimSun75
Сообщения: 318
Зарегистрирован: Вс янв 01, 2017 8:32 pm
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 44 раза

Re: StatusChange для датчиков движения на esp8266

Сообщение DimSun75 » Пт мар 24, 2017 7:53 am

Здесь вроде все ровно. Я думаю косяк там, где пишется полученное с esp значение в status

Отправлено с моего SM-A520F через Tapatalk
alekszander
Сообщения: 178
Зарегистрирован: Вс янв 05, 2014 5:37 am
Благодарил (а): 10 раз
Поблагодарили: 17 раз

Re: StatusChange для датчиков движения на esp8266

Сообщение alekszander » Пт мар 24, 2017 3:57 pm

В общем нашел я способ который работает 100% и не вызывает метод statusChange лишний раз
1. Создал свойство tmp
2. Создал метод tmp c тектом

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

if ($params ['NEW_VALUE'] == 1)
{
$this->setProperty('status',1);
}
elseif ($params ['NEW_VALUE'] ==0) {
$this->setProperty('status',0); 
} 
 
2. Связал каждый gpioint с объектами(-ом) и методом tmp в модуле WiFi-iot
3. В свойстве status при изменении указал метод StatusChange с тектсом
StatusChangeПоказать

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

$this->setProperty('status',$this->getProperty("tmp")); // выставляем статус сенсора
$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'); // запускаем скрипт "доброе утро"
  }
} 
 


P.S. Любая критика принимается, так же принимается предложения по оптимизации кода.
DimSun75
Сообщения: 318
Зарегистрирован: Вс янв 01, 2017 8:32 pm
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 44 раза

Re: StatusChange для датчиков движения на esp8266

Сообщение DimSun75 » Сб мар 25, 2017 10:46 am

А если в методе StatusChange в самом начале:

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

if (params['NEW_VALUE'] != '1')
{
   return;
}
то можно все вернуть назад и лишний класс не нужен.

Ну и помарка: вызывать clearTimeOut перед setTimeOut не нужно. В самой функции setTimeOut как раз в начале и убивается таймер вызовом clearTimeOut.
Ответить