действия после срабатывания датчика движения

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

Модератор: immortal

dr.pavlov.alex
Сообщения: 103
Зарегистрирован: Вс апр 23, 2017 7:09 pm
Благодарил (а): 38 раз
Поблагодарили: 1 раз

Re: действия после срабатывания датчика движения

Сообщение dr.pavlov.alex » Ср ноя 08, 2017 12:41 pm

woow писал(а):да и я тут хочу спросить у знающих, пользуюсь готовым имиджем на малинке там на панеле управления "висит" сообщение "кто-то дома коридор". где это находится? Для начала хочу найти и убрать, а потом как будет какой датчик сделаем и правильные действие, теперь не надо. Так как его убрать
Вот тут 0 поставьте: Rooms>Hall>свойство: Hall.SomebodyHere --0. Еще возможно метод обновите Rooms-> updateActivityStatus.
Aopen de7000 на Ubuntu 16.04.4 LTS+Broadlink
lupsik
Сообщения: 41
Зарегистрирован: Пн сен 11, 2017 11:12 pm
Благодарил (а): 7 раз
Поблагодарили: 1 раз

Re: действия после срабатывания датчика движения

Сообщение lupsik » Ср ноя 08, 2017 6:57 pm

Подскажу свою реализацию датчика движения.
Все подключено к ESP8266. Данные отправляются по MQTT протоколу. Majordomo установлен на Raspberry PI 3 из img.
На ESP8266 установлен модуль "Работа с прерываниями" для немедленной отправки в MQTT брокер информации о состоянии датчика.
Создан объект Движение со стандартными свойствами SMotions. В частности интересуют 2, а именно status и updatedText. С ESP8266 идет информация о любом переключении датчика. 1- есть движение, 0- нет движения.
При изменении статус status начинает изменяться свойство updatedText.
1. только что
2. 10 сек. назад
3. 1 мин. назад
Т.е. в данном свойстве указано, сколько прошло время после последнего изменения датчика.
В методе SDevices-> setUpdatedText Прописан скрипт следующего содержания.

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

$time= explode(" ", getGlobal('КухняДВ'.'.'.'updatedText'));
if ((getGlobal('КухняДВ'.'.'.'status') == 1) && (getGlobal('КухняДВ'.'.'.'Auto') == 1) && (timeBetween('07:00', '00:00')))
{
 setGlobal('СветКухня'.'.'.'status', '1'); 
 $colorDi=getGlobal('СветоДиодКухня'.'.'.'status');
 $b=substr($colorDi,1,2);
 $a=substr($colorDi,3,2);
 $c=substr($colorDi,5,2);
 for ($i=1; $i<=107; $i++)
 {
  $z.=$a.$b.$c;
 }
 setGlobal('СветоДиодКухня'.'.'.'color', $z);
}

if ((getGlobal('КухняДВ'.'.'.'status') == 1) && (getGlobal('КухняДВ'.'.'.'Auto') == 1) && (timeBetween('00:00', '07:00')))
{
 $colorDi=getGlobal('СветоДиодКухня'.'.'.'status');
 $b=substr($colorDi,1,2);
 $a=substr($colorDi,3,2);
 $c=substr($colorDi,5,2);
 for ($i=1; $i<=107; $i++)
 {
  $z.=$a.$b.$c;
 }
  setGlobal('СветоДиодКухня'.'.'.'color', $z);
}

if ((getGlobal('КухняДВ'.'.'.'status') == 0) && (getGlobal('КухняДВ'.'.'.'Auto') == 1) && ($time[0]>3) && ($time[1]=='мин.'))
{
 setGlobal('СветКухня'.'.'.'status', '0');
 $a='00';
 $b='00';
 $c='00';
 for ($i=1; $i<=107; $i++)
 {
  $z.=$a.$b.$c;
 }
 setGlobal('СветоДиодКухня'.'.'.'color', $z);
}
 
Скрипт срабатывает при обновлении свойства updatedText. Значение этого свойства записывается в массив time. time[1] - числовое значение, time[2]= "мин." или "сек."
Далее просто проверяю значение датчика и сколько минут прошло после последнего изменения.
Аватара пользователя
Vovix
Сообщения: 1155
Зарегистрирован: Пн янв 27, 2014 1:43 am
Откуда: г.Ижевск
Благодарил (а): 60 раз
Поблагодарили: 531 раз
Контактная информация:

Re: действия после срабатывания датчика движения

Сообщение Vovix » Ср ноя 08, 2017 7:26 pm

lupsik писал(а):Подскажу свою реализацию датчика движения.
Все подключено к ESP8266. Данные отправляются по MQTT протоколу. Majordomo установлен на Raspberry PI 3 из img.
На ESP8266 установлен модуль "Работа с прерываниями" для немедленной отправки в MQTT брокер информации о состоянии датчика.
Создан объект Движение со стандартными свойствами SMotions. В частности интересуют 2, а именно status и updatedText. С ESP8266 идет информация о любом переключении датчика. 1- есть движение, 0- нет движения.
При изменении статус status начинает изменяться свойство updatedText.
1. только что
2. 10 сек. назад
3. 1 мин. назад
Т.е. в данном свойстве указано, сколько прошло время после последнего изменения датчика.
В методе SDevices-> setUpdatedText Прописан скрипт следующего содержания.
СпойлерПоказать

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

$time= explode(" ", getGlobal('КухняДВ'.'.'.'updatedText'));
if ((getGlobal('КухняДВ'.'.'.'status') == 1) && (getGlobal('КухняДВ'.'.'.'Auto') == 1) && (timeBetween('07:00', '00:00')))
{
 setGlobal('СветКухня'.'.'.'status', '1'); 
 $colorDi=getGlobal('СветоДиодКухня'.'.'.'status');
 $b=substr($colorDi,1,2);
 $a=substr($colorDi,3,2);
 $c=substr($colorDi,5,2);
 for ($i=1; $i<=107; $i++)
 {
  $z.=$a.$b.$c;
 }
 setGlobal('СветоДиодКухня'.'.'.'color', $z);
}

if ((getGlobal('КухняДВ'.'.'.'status') == 1) && (getGlobal('КухняДВ'.'.'.'Auto') == 1) && (timeBetween('00:00', '07:00')))
{
 $colorDi=getGlobal('СветоДиодКухня'.'.'.'status');
 $b=substr($colorDi,1,2);
 $a=substr($colorDi,3,2);
 $c=substr($colorDi,5,2);
 for ($i=1; $i<=107; $i++)
 {
  $z.=$a.$b.$c;
 }
  setGlobal('СветоДиодКухня'.'.'.'color', $z);
}

if ((getGlobal('КухняДВ'.'.'.'status') == 0) && (getGlobal('КухняДВ'.'.'.'Auto') == 1) && ($time[0]>3) && ($time[1]=='мин.'))
{
 setGlobal('СветКухня'.'.'.'status', '0');
 $a='00';
 $b='00';
 $c='00';
 for ($i=1; $i<=107; $i++)
 {
  $z.=$a.$b.$c;
 }
 setGlobal('СветоДиодКухня'.'.'.'color', $z);
}
Скрипт срабатывает при обновлении свойства updatedText. Значение этого свойства записывается в массив time. time[1] - числовое значение, time[2]= "мин." или "сек."
Далее просто проверяю значение датчика и сколько минут прошло после последнего изменения.
А вы точно тот самый метод выложили? - тот который нужно?

и какая цель в такой записи - setGlobal('СветоДиодКухня'.'.'.'color', $z); ?
можно же так: setGlobal('СветоДиодКухня.color', $z); ? или я что-то не понимаю?
Мой -CONNECT-
Windows 7(PHP 7.2) + Raspberry Pi(освещение на 1-Wire) + MP751(управление) + ESP8266(сенсоры) + LAN(сенсоры)
-=: Если вам помогло моё сообщение, нажмите кнопку "Поблагодарить за сообщение автора: Vovix" (кнопка Спасибо) справа! :=-
lupsik
Сообщения: 41
Зарегистрирован: Пн сен 11, 2017 11:12 pm
Благодарил (а): 7 раз
Поблагодарили: 1 раз

Re: действия после срабатывания датчика движения

Сообщение lupsik » Ср ноя 08, 2017 7:40 pm

Vovix писал(а): А вы точно тот самый метод выложили? - тот который нужно?
Да нет все верно.
Vovix писал(а): и какая цель в такой записи - setGlobal('СветоДиодКухня'.'.'.'color', $z); ?
Задает цвет светодиодной подсветки
Vovix писал(а): можно же так: setGlobal('СветоДиодКухня.color', $z); ? или я что-то не понимаю?
Конечно можно. )))
rial2001
Сообщения: 15
Зарегистрирован: Вт авг 23, 2016 1:25 am
Благодарил (а): 5 раз
Поблагодарили: 0

Re: действия после срабатывания датчика движения

Сообщение rial2001 » Вт ноя 28, 2017 12:30 am

neromih писал(а):У меня реализация не через простые устройства, а просто как сказать объектами.
Настраивал у себя:

.........

2. Проблемы:
1. Если в свойства без разницы какое SMotions-> motionDetected или SDevices-> statusUpdated
добавить код что бы при 0 MD произносил "обнаружено движение" то соответственно это будет сделано несколько раз.
2. Если добавить код для включения и выключения освещения, то соответственно он будет вкл и выкл освещение 5 раз :)

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

sg("Switch0.status","1");
sg('Switch0.statusText','Включено');
clearTimeOut("Switch0");
SetTimeOut("Switch0",'sg("Switch0.status","0"); 
sg("Switch0.statusText","Выключено");',[b]10[/b]);

вписал данный код в метод statusUpdated
10 время через которое отключится реле.

Может быть пригодится кому нибудь, работает.
Смысл в том если SecuritySwitch.status значение 0 - режим не охраны а наблюдения, соответственно включает реле, если наоборот то говорит проникновение.

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

if (gg('SecuritySwitch.status') == "0") {
sg("Switch0.status","1");
sg('Switch0.statusText','Включено');
SetTimeOut("Switch0",'sg("Switch0.status","0"); 
sg("Switch0.statusText","Выключено");',10);
} else {
say("Проникновение",5);
}
В принципе эта настройка будет справедлива почти ко всем датчикам движения
Решалась ли как данная проблема? Вот такая же сборка ОДИН-В-ОДИН через ПРОСТЫЕ устройства:
+ Статус датчика всегда горит красным...пока копаю...вопросов на форуме довольно много...а вот конкретного решения не нашел.
ЗЫ Брокер не предлагать))))
neromih
Сообщения: 154
Зарегистрирован: Чт апр 20, 2017 5:32 am
Откуда: Томск
Благодарил (а): 55 раз
Поблагодарили: 22 раза

Re: действия после срабатывания датчика движения

Сообщение neromih » Вт ноя 28, 2017 3:43 am

rial2001 писал(а):
neromih писал(а):У меня реализация не через простые устройства, а просто как сказать объектами.
Настраивал у себя:

.........

2. Проблемы:
1. Если в свойства без разницы какое SMotions-> motionDetected или SDevices-> statusUpdated
добавить код что бы при 0 MD произносил "обнаружено движение" то соответственно это будет сделано несколько раз.
2. Если добавить код для включения и выключения освещения, то соответственно он будет вкл и выкл освещение 5 раз :)

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

sg("Switch0.status","1");
sg('Switch0.statusText','Включено');
clearTimeOut("Switch0");
SetTimeOut("Switch0",'sg("Switch0.status","0"); 
sg("Switch0.statusText","Выключено");',[b]10[/b]); 

вписал данный код в метод statusUpdated
10 время через которое отключится реле.

Может быть пригодится кому нибудь, работает.
Смысл в том если SecuritySwitch.status значение 0 - режим не охраны а наблюдения, соответственно включает реле, если наоборот то говорит проникновение.

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

if (gg('SecuritySwitch.status') == "0") {
sg("Switch0.status","1");
sg('Switch0.statusText','Включено');
SetTimeOut("Switch0",'sg("Switch0.status","0"); 
sg("Switch0.statusText","Выключено");',10);
} else {
say("Проникновение",5);
} 
В принципе эта настройка будет справедлива почти ко всем датчикам движения
Решалась ли как данная проблема? Вот такая же сборка ОДИН-В-ОДИН через ПРОСТЫЕ устройства:
+ Статус датчика всегда горит красным...пока копаю...вопросов на форуме довольно много...а вот конкретного решения не нашел.
ЗЫ Брокер не предлагать))))
Статус какой горит красным? :) Я простые устройства не использую.
Raspberry Pi2, Pi3, MegaD2561RTC + 14 in + 14R, WemosD1, Mega2560, Arduino nano v.3, Arduino Uno, ESP8266 12f.
rial2001
Сообщения: 15
Зарегистрирован: Вт авг 23, 2016 1:25 am
Благодарил (а): 5 раз
Поблагодарили: 0

Re: действия после срабатывания датчика движения

Сообщение rial2001 » Вт ноя 28, 2017 10:52 pm

neromih писал(а):
rial2001 писал(а):
neromih писал(а):У меня реализация не через простые устройства, а просто как сказать объектами.

Статус какой горит красным? :) Я простые устройства не использую.
Статус красным горит - индикация движения на сцене, т.е. датчик не опрашивается о состоянии покоя и отражает последнее полученное значение, меняет его только при последующем обнаружении движения. Думаю это связано с тем, что ПРОСТЫЕ устройства определяют "1" как движение, а МЕГА наоборот "0"
Так не смог побороть.
Сейчас буду перекидывать датчик в группу SMotions как увас.
Хотел уточнить решение как убрать повторы "обнаружено движение" по 3-4 раза за одно 1 срабатывание датчика - есть решение?
Аватара пользователя
Gelezako
Сообщения: 963
Зарегистрирован: Чт июн 02, 2016 9:33 pm
Благодарил (а): 205 раз
Поблагодарили: 106 раз
Контактная информация:

Re: действия после срабатывания датчика движения

Сообщение Gelezako » Пн дек 18, 2017 7:53 pm

rial2001 писал(а): Хотел уточнить решение как убрать повторы "обнаружено движение" по 3-4 раза за одно 1 срабатывание датчика - есть решение?
та же самая беда, но как решить я так и не нашёл
фанат Мажордомо
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
Аватара пользователя
Vovix
Сообщения: 1155
Зарегистрирован: Пн янв 27, 2014 1:43 am
Откуда: г.Ижевск
Благодарил (а): 60 раз
Поблагодарили: 531 раз
Контактная информация:

Re: действия после срабатывания датчика движения

Сообщение Vovix » Вт дек 19, 2017 9:44 am

Gelezako писал(а):
rial2001 писал(а): Хотел уточнить решение как убрать повторы "обнаружено движение" по 3-4 раза за одно 1 срабатывание датчика - есть решение?
ну почему-же?
не совсем понял, что там наворочено у всех выше, но
можно с таймерами, но удобнее:

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

registerEvent($eventName, $details='',$expire_in=365); -- регистрация события $eventName

registeredEventTime($eventName); -- возвращает время последней регистрации события $eventName (-1 если еще не было такого события)
Например так:
1) сработал датчик
2) запрашиваем время регистрации события в прошлый раз (-1 будет первый раз)
3) регистрируем событие
4) определяем сколько прошло времени с регистрации события и было ли оно вообще
5) если меньше чем надо, то ни чего не делаем
6) если больше или первый раз, то хотим говорим хотим что-то выполняем

З.Ы.
хотя возможно, вы используете "Простые устройства"....брр... но там вероятно, тоже можно поправить... наверно!
Мой -CONNECT-
Windows 7(PHP 7.2) + Raspberry Pi(освещение на 1-Wire) + MP751(управление) + ESP8266(сенсоры) + LAN(сенсоры)
-=: Если вам помогло моё сообщение, нажмите кнопку "Поблагодарить за сообщение автора: Vovix" (кнопка Спасибо) справа! :=-
Аватара пользователя
Gelezako
Сообщения: 963
Зарегистрирован: Чт июн 02, 2016 9:33 pm
Благодарил (а): 205 раз
Поблагодарили: 106 раз
Контактная информация:

Re: действия после срабатывания датчика движения

Сообщение Gelezako » Вт дек 19, 2017 4:46 pm

это выход, но в принципе зачем плодить копии времени события с датчиков, если уже есть встроенное свойство Updated Timestamp, если конечно вы их подключили как простые устройства. Попробую реализовать такую проверку.
фанат Мажордомо
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
Ответить