StatusChange для датчиков движения на esp8266
Модератор: immortal
-
- Сообщения: 178
- Зарегистрирован: Вс янв 05, 2014 5:37 am
- Благодарил (а): 10 раз
- Поблагодарили: 17 раз
StatusChange для датчиков движения на esp8266
Коллеги, доброго времени суток. Направьте на путь истины, как настроить метод StatusChange для работы с датчиками движения подключеные к esp. Проблема вся в том что сама esp каждые 10 минут (согласно настройкам) шлёт данные, соответственно свойство status (в моем случае) постоянно обновляется. Буду очень благодарен за помощь. Или может кто нибудь поделится готовым куском кода. Сейчас использую тот который отлично работал с arduino.
P.S. Сломал весь мозг в раздумьях.
P.P.S. Прошивка. Wifi-iot
Отправлено с моего D6633 через Tapatalk
P.S. Сломал весь мозг в раздумьях.
P.P.S. Прошивка. Wifi-iot
Отправлено с моего D6633 через Tapatalk
-
- Сообщения: 318
- Зарегистрирован: Вс янв 01, 2017 8:32 pm
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 44 раза
Re: StatusChange для датчиков движения на esp8266
Я пытался уговорить Максима, что он не прав и не нужно слать статус отсутствующего прерывания. Не получилось. Костыли такой:
Отправлено с моего SM-A520F через Tapatalk
Код: Выделить всё
if (params ['NEW_VALUE'] == 1)
{
Тут ваш код
}
Отправлено с моего SM-A520F через Tapatalk
-
- Сообщения: 178
- Зарегистрирован: Вс янв 05, 2014 5:37 am
- Благодарил (а): 10 раз
- Поблагодарили: 17 раз
Re: StatusChange для датчиков движения на esp8266
Только остается неясность как быть когда значения шлются пустые. Как в примере ниже. Так как свойство 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
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
-
- Сообщения: 318
- Зарегистрирован: Вс янв 01, 2017 8:32 pm
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 44 раза
Re: StatusChange для датчиков движения на esp8266
Странно. А пустым значениям откуда там взяться? Нужно разбираться по порядку: как настроена прошивка? Как осуществляется прием в мдм?
Отправлено с моего SM-A520F через Tapatalk
Отправлено с моего SM-A520F через Tapatalk
-
- Сообщения: 178
- Зарегистрирован: Вс янв 05, 2014 5:37 am
- Благодарил (а): 10 раз
- Поблагодарили: 17 раз
Re: StatusChange для датчиков движения на esp8266
метод 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'); // запускаем скрипт "доброе утро"
}
}
-
- Сообщения: 318
- Зарегистрирован: Вс янв 01, 2017 8:32 pm
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 44 раза
Re: StatusChange для датчиков движения на esp8266
Здесь вроде все ровно. Я думаю косяк там, где пишется полученное с esp значение в status
Отправлено с моего SM-A520F через Tapatalk
Отправлено с моего SM-A520F через Tapatalk
-
- Сообщения: 178
- Зарегистрирован: Вс янв 05, 2014 5:37 am
- Благодарил (а): 10 раз
- Поблагодарили: 17 раз
Re: StatusChange для датчиков движения на esp8266
В общем нашел я способ который работает 100% и не вызывает метод statusChange лишний раз
1. Создал свойство tmp
2. Создал метод tmp c тектом
2. Связал каждый gpioint с объектами(-ом) и методом tmp в модуле WiFi-iot
3. В свойстве status при изменении указал метод StatusChange с тектсом
P.S. Любая критика принимается, так же принимается предложения по оптимизации кода.
1. Создал свойство tmp
2. Создал метод tmp c тектом
Код: Выделить всё
if ($params ['NEW_VALUE'] == 1)
{
$this->setProperty('status',1);
}
elseif ($params ['NEW_VALUE'] ==0) {
$this->setProperty('status',0);
}
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. Любая критика принимается, так же принимается предложения по оптимизации кода.
-
- Сообщения: 318
- Зарегистрирован: Вс янв 01, 2017 8:32 pm
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 44 раза
Re: StatusChange для датчиков движения на esp8266
А если в методе StatusChange в самом начале:
то можно все вернуть назад и лишний класс не нужен.
Ну и помарка: вызывать clearTimeOut перед setTimeOut не нужно. В самой функции setTimeOut как раз в начале и убивается таймер вызовом clearTimeOut.
Код: Выделить всё
if (params['NEW_VALUE'] != '1')
{
return;
}
Ну и помарка: вызывать clearTimeOut перед setTimeOut не нужно. В самой функции setTimeOut как раз в начале и убивается таймер вызовом clearTimeOut.