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

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

Модератор: immortal

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

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

Сообщение ингвар » Пн окт 30, 2017 9:32 pm

Jager писал(а): Как то так

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

$state = file_get_contents('http://IP/sensors');
$value = explode('/',$state);
sg('объект.temp',substr($value[23],4));
sg('объект.humidity',substr($value[7],4));
 
спасибо, дошло как и что :)
только для строки hostname:Ira_BDR;dhtt1:27.2;dhth1:65.8; код получился

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

$state = file_get_contents('http://IP/sensors');
$value = explode(';',$state);
sg('BDR.temp',substr($value[1],6));
sg('BDR.humidity',substr($value[2],6)); 
но теперь вопрос если вдруг подключу еще датчики этот код надо менять будет?
Windows 10 + Raspberry Pi3 + ESP8266
Jager
Сообщения: 708
Зарегистрирован: Сб авг 18, 2012 10:21 am
Благодарил (а): 26 раз
Поблагодарили: 183 раза

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

Сообщение Jager » Вт окт 31, 2017 8:57 am

ингвар писал(а):но теперь вопрос если вдруг подключу еще датчики этот код надо менять будет?
Раз принцип поняли то и проблем не будет :) все датчики будут выводиться в одной строке.
lupsik
Сообщения: 41
Зарегистрирован: Пн сен 11, 2017 11:12 pm
Благодарил (а): 7 раз
Поблагодарили: 1 раз

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

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

ингвар писал(а):подскажите куда копать
есть два датчика движения один на esp (wifi-iot) другой xiaomi , все работает нормально, но вот в обновлении свойства updatedText у Xiaomi датчика пишет все нормально когда датчик был активен (то что в X-ray пишет ошибку это я пропущу ) а на ESP каждые 10 сек скидывает на "только что"
думаю может метод как то влияет , просто xiaomi добавляться из модуля, а ESP в ручную привязую через модуль esp8266_wifiot
Кстати, если информацию с датчика отправлять по MQTT то все работает как нужно. Именно поэтому привязал датчик именно через MQTT модуль. Отправка данных в настройка ESP8266 "Работа с прерываниями". В этом случае отправка в MQTT брокер идет только при изменении состояния датчика.
PAV
Сообщения: 949
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва
Благодарил (а): 68 раз
Поблагодарили: 94 раза

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

Сообщение PAV » Пт дек 15, 2017 11:26 am

Мои методы для датчиков движения - общий для всех и для примера датчик на самом входе около двери

Общий

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

$this->setProperty('status',$params['status']); // выставляем статус сенсора
$this->setProperty('updatedTime',date("y-m-d H:i")); // выставляем время срабатывания сенсора
$h=(int)date('G',time());
$m=date('i',time());
$tm=$h+$m/100;
$ot=$this->object_title;
$alive_timeout=(int)$this->getProperty("aliveTimeOut");

if (!$alive_timeout) {
 $alive_timeout=24*60*60;
}
$this->setProperty("alive",1);
clearTimeOut($ot."_alive");
SetTimeOut($ot."_alive","callmethod('".$ot.".AliveCheck');", $alive_timeout); // назначаем новый таймер. срабатывает через час 

if ($params['status']) { // если статус = 1
  if (gg('SecurityArmedMode.status') == 1) {
  say('Внимание, нарушение режима безопасности'); 
  }
 
 sg('somebodyHome',1); // ставим глобальный флаг на то что кто-то дома
 sg('somebodyHomeText','Дома кто-то есть'); // так же ставим свойства глобальной переменной для текстового статуса
 sg('sensorMovementSUM.status', 1);
 sg('sensorMovementSUM.alive', 1);
 sg('sensorMovementSUM.updated', time());
 sg('sensorMovementSUM.updatedTime', date("y-m-d H:i"));
 clearTimeOut("sensorMovementSUM");
 setTimeOut("sensorMovementSUM","sg('sensorMovementSUM.status',0);",60); 
 
 ClearTimeOut("nobodyHome"); // очищаем таймер события "никого нет дома"
 SetTimeOut("nobodyHome","callmethod('NobodyHomeMode.activateCheck');", 1*90*60); // назначаем новый таймер. срабатывает через час после последнего срабатывания датчика.
 $last_register=registeredEventTime('inhouseMovement'); // проверяем когда в последний раз срабатывало событие "движение внутри дома"
  if ((!$last_register) || ((time()-$last_register)>1*60*60))   { // срабатывало более 2х часов назад (либо никогда не срабатывало ранее)
  
  if (gg("NobodyHomeMode.status") == 0) { // если все дома
    if ( gg("NightMode.status")==1 ) {
    }
    if ( gg("NightMode.status")==0 ) {
        if (timeBetween('07:00', '12:00')) { // движение замечено утром
        
        }
        if (timeBetween('17:00', '23:00')) { // движение замечено утром
        
        }
    }
  
  } else { // если только пришли, никого не было доклад
      
  
  }
  }
  

 if ( gg("NightMode.status")==0 ) {
 registerEvent('inhouseMovement',$this->name,7); // регистрируем событие "движение внутри дома"
 }
 if (gg("NobodyHomeMode.status") == 1) {
setGlobal('somebodyHome',1); // ставим глобальный флаг на то что кто-то дома
setGlobal('somebodyHomeText','Дома кто-то есть');
say("кто-то появился");
sg("NobodyHomeMode.status",0);
callmethod("NobodyHomeMode.deactivate");
 
 }
 
}
StatusChanged датчика ближайшего к двери

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

if ($params['status']) {
 
 $last_register=registeredEventTime('inhouseMovement'); // проверяем когда в последний раз срабатывало событие "движение внутри дома"
  if ((!$last_register) || ((time()-$last_register)>1*60*60))   { // срабатывало более 1х часов назад (либо никогда не срабатывало ранее)
  
  if (gg("NobodyHomeMode.status") == 0) { // если все дома
    if ( gg("NightMode.status")==1 ) {
    }
    if ( gg("NightMode.status")==0 ) {
        if (timeBetween('07:30', '12:00')) { // движение замечено утром
        //runScript('morningGreeting'); // запускаем скрипт "доброе утро"
        callMethod("доброе утро доклад.action");
        }
        //if (timeBetween('17:00', '23:00')) { // движение замечено утром
        //runScript('eveningGreeting'); // запускаем скрипт "
        //}
    }
  
  } else { // если только пришли, никого не было доклад
   say("Ура! Наконец кто-то появился дома!");
  callmethod("NobodyHomeMode.deactivate");

    if (gg("Yulia.status") > 0 && time() - gg("Yulia.updated") < 25*60){
    say("Здравствуйте Юлия",1);
    }    
  
    if (gg("Andrey.status") > 0 && time() - gg("Andrey.updated") < 25*60){
    say("Здравствуйте Андрей",1);
    callMethod("доклад.action");
    }
    
  
  }//если только пришли
  }//срабатывал более часа назад
  
 if (gg("доклад.done") == 0) {
    if ((gg("Andrey.status") > 0) && (time() - gg("Andrey.updated") < 25*60) ) {
    say("Здравствуйте Андрей",1);
    callMethod("доклад.action");
    }}

if (isWeekDay()) {    
if (gg("доброе утро доклад.done") == 0) {
    if ((gg("Andrey.status") > 0) && (timeBetween('10:30', '12:00') )) {
    sg("доброе утро доклад.done",1);
    say("Доброе утро Андрей",1);
    callMethod("доброе утро доклад.action");
    }}}

    
    }

Проверка работоспособности датчика
[code]
// 2017-10-31  если все дома- если ночь откладываем - если день и нет движений, значит сдох / если нет дома то откладываем
$ot=$this->object_title;

if (gg("NobodyHomeMode.status") == 0) { // если все дома
    if ( gg("NightMode.status")==1 ) { //если ночь откладываем
        clearTimeOut($ot."_alive");
        SetTimeOut($ot."_alive","callmethod('".$ot.".AliveCheck');", 3*60*60); // назначаем новый таймер. срабатывает через час 
    }
    if ( gg("NightMode.status")==0 ) { //если день и нет движений, значит сдох
        clearTimeOut($ot."_alive");
        setTimeOut($ot."_alive","sg('".$ot.".alive',0);",60);
    }
} else { // если нет дома то откладываем
        clearTimeOut($ot."_alive");
        SetTimeOut($ot."_alive","callmethod('".$ot.".AliveCheck');", 8*60*60); // назначаем новый таймер. срабатывает через час 
        }
[/code]
Аватара пользователя
Gelezako
Сообщения: 963
Зарегистрирован: Чт июн 02, 2016 9:33 pm
Благодарил (а): 205 раз
Поблагодарили: 106 раз
Контактная информация:

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

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

вопрос по коду: вы перезаписываете значение свойства "somebodyHomeText", но простые устройства тоже автоматически обновляют это свойство. Они более информативно дописывают через запятую название комнаты где замечена активность, вот пример "Кто-то есть. Активность: Гостиная, Коридор". Но вашем примере вы просто затираете текстом "Дома кто-то есть".

И ещё почему вот тут вы не указываете имя объекта?

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

sg('somebodyHome',1); // ставим глобальный флаг на то что кто-то дома
sg('somebodyHomeText','Дома кто-то есть');  
Я так подозреваю что это объект "ThisComputer" из класса "Computer". Свойство "somebodyHomeText" у меня есть, но вот "somebodyHome" у меня нет у объекта "ThisComputer". Вы его сами добавляли?
фанат Мажордомо
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
Аватара пользователя
Vovix
Сообщения: 1155
Зарегистрирован: Пн янв 27, 2014 1:43 am
Откуда: г.Ижевск
Благодарил (а): 60 раз
Поблагодарили: 532 раза
Контактная информация:

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

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

Gelezako писал(а):....

Я так подозреваю что это объект "ThisComputer" из класса "Computer". Свойство "somebodyHomeText" у меня есть, но вот "somebodyHome" у меня нет у объекта "ThisComputer". Вы его сами добавляли?
запись без наименования объекта, всегда указывает на ThisComputer
при записи значения в отсутствующее у вас свойство, но в имеющемся объекте, по сути запись создает его
(правда оно немного по другому будет отображаться в Объектах -
например его не будет видно в списке свойств класса и оно будет отображаться не жирным шрифтом в свойствах объекта )
Мой -CONNECT-
Windows 7(PHP 7.2) + Raspberry Pi(освещение на 1-Wire) + MP751(управление) + ESP8266(сенсоры) + LAN(сенсоры)
-=: Если вам помогло моё сообщение, нажмите кнопку "Поблагодарить за сообщение автора: Vovix" (кнопка Спасибо) справа! :=-
sigment
Сообщения: 138
Зарегистрирован: Вт ноя 14, 2017 6:39 pm
Откуда: Москва
Благодарил (а): 44 раза
Поблагодарили: 5 раз
Контактная информация:

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

Сообщение sigment » Пт дек 22, 2017 1:57 am

Подскажите пожалуйста. Как добавить, что бы мои датчики виделись в свойстве somebodyHomeText? Что бы они стали отображаться в "кто дома". Не корректно написал, но смысл думаю уловить можно.
Raspberry Pi3, Xiaomi, BroadLink, ESP8266
dr.pavlov.alex
Сообщения: 103
Зарегистрирован: Вс апр 23, 2017 7:09 pm
Благодарил (а): 38 раз
Поблагодарили: 1 раз

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

Сообщение dr.pavlov.alex » Пт дек 22, 2017 5:53 pm

sigment писал(а):Подскажите пожалуйста. Как добавить, что бы мои датчики виделись в свойстве somebodyHomeText? Что бы они стали отображаться в "кто дома". Не корректно написал, но смысл думаю уловить можно.
Второе сообщение посмотрите https://majordomo.smartliving.ru/forum/ ... hp?p=60090. Мне помогла только замена кода как на той странице. Сейчас все отрабатывает без проблем.
За это сообщение автора dr.pavlov.alex поблагодарил:
sigment (Пт дек 22, 2017 9:53 pm)
Рейтинг: 1.16%
Aopen de7000 на Ubuntu 16.04.4 LTS+Broadlink
ei922
Сообщения: 11
Зарегистрирован: Вт окт 31, 2017 5:40 pm
Благодарил (а): 10 раз
Поблагодарили: 0

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

Сообщение ei922 » Вт янв 02, 2018 6:17 pm

Простите, не совсем в тему, но близко.
Хочу кач-ве датчиков движения для управления светом использовать охранные датчики движения (через МегаД они дают 0 при движении и 1 - при отсутствии движения).
Добавил датчики через Простые устройства, но работает кривенько, вероятно из-за нестыковки 0-motionDetected в охранных датчиках, и 1-motionDetected в обычных.

Похоже, что изменять нужно файлы:
c:\_majordomo\htdocs\modules\devices\SMotions_motionDetected.php
c:\_majordomo\htdocs\modules\devices\SDevices_statusUpdated.php
?
Или написать свои объекты?

Или есть еще какие-то более легкие способы?
Аватара пользователя
Gelezako
Сообщения: 963
Зарегистрирован: Чт июн 02, 2016 9:33 pm
Благодарил (а): 205 раз
Поблагодарили: 106 раз
Контактная информация:

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

Сообщение Gelezako » Ср янв 03, 2018 1:58 pm

ei922 писал(а):Простите, не совсем в тему, но близко.
Хочу кач-ве датчиков движения для управления светом использовать охранные датчики движения (через МегаД они дают 0 при движении и 1 - при отсутствии движения).
Добавил датчики через Простые устройства, но работает кривенько, вероятно из-за нестыковки 0-motionDetected в охранных датчиках, и 1-motionDetected в обычных.

Похоже, что изменять нужно файлы:
c:\_majordomo\htdocs\modules\devices\SMotions_motionDetected.php
c:\_majordomo\htdocs\modules\devices\SDevices_statusUpdated.php
?
Или написать свои объекты?

Или есть еще какие-то более легкие способы?
Я бы не использовал простые устройства для добавления такого нестандартного датчика. Создавайте сами свой класс, свой объект, свойства и методы и сами описывайте логику исходя из ваших значений состояний. Иначе вы запутаетесь используя логику простых устройств. Редактировать "системные" файлы тоже не советовалбй , потому что при следующем обновлению у вас всё затрётся.
фанат Мажордомо
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
Ответить