[Вопрос] Обработка значения при его изменении

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

Модератор: immortal

Аватара пользователя
Sandr
Сообщения: 126
Зарегистрирован: Пн ноя 16, 2015 5:10 pm
Благодарил (а): 19 раз
Поблагодарили: 29 раз

[Вопрос] Обработка значения при его изменении

Сообщение Sandr » Сб апр 16, 2016 12:22 am

Подскажите решение
есть объект flwr
у него есть свойство flwr.moisture
в него пишутся данные (0-1024) от датчика mySensor

а как повесить обработчик на изменение значения flwr.moisture
записывающий в свойство flwr.percent
результат перевода диапазона (0-1024) в проценты

сам пересчет простой

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

$value = $this->getProperty('moisture');
$value = round($value * 0.09765625, 0);
$this->setProperty('percent',$value);
Но вот дальше я торможу - как и где отловить изменение значения flwr.moisture

PS: Я понимаю что можно скетч датчика дополнить, но пока меня такой вариант не устраивает
Win Home Serv 2011 / Intel Core i3 / 32 GB ram /
Сцена погода (вертикальная)
mySensor скетчи ( 4х канальный димер | Оптимизация скетчей )
Ну и конечно моя маленькая фабрика - 3D печать / фрезеровка / литье
ErmolenkoM
Сообщения: 560
Зарегистрирован: Ср сен 04, 2013 10:31 am
Откуда: Самара
Благодарил (а): 99 раз
Поблагодарили: 140 раз
Контактная информация:

Re: [Вопрос] Обработка значения при его изменении

Сообщение ErmolenkoM » Сб апр 16, 2016 3:18 pm

aka msh555
Cubian на Cubietruck, Connect
Аватара пользователя
Sandr
Сообщения: 126
Зарегистрирован: Пн ноя 16, 2015 5:10 pm
Благодарил (а): 19 раз
Поблагодарили: 29 раз

Re: [Вопрос] Обработка значения при его изменении

Сообщение Sandr » Сб апр 16, 2016 4:47 pm

Прочитал два раза :(
Но так и не понял как повесить хук на изменение свойства.
Прошу не больно ткнуть примером или ссылкой на таковой
Win Home Serv 2011 / Intel Core i3 / 32 GB ram /
Сцена погода (вертикальная)
mySensor скетчи ( 4х канальный димер | Оптимизация скетчей )
Ну и конечно моя маленькая фабрика - 3D печать / фрезеровка / литье
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

Re: [Вопрос] Обработка значения при его изменении

Сообщение skysilver » Сб апр 16, 2016 5:50 pm

Этому функционалу уже года три. Вот для начала http://majordomo.smartliving.ru/forum/v ... .php?t=526 Вызов связанного метода при изменении свойства обсуждался 100500 раз - есть инфа и на форуме, и в вики.
За это сообщение автора skysilver поблагодарили (всего 2):
Sandr (Пн апр 18, 2016 8:33 am) • Samir77 (Чт окт 29, 2020 3:40 pm)
Рейтинг: 2.33%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Аватара пользователя
Sandr
Сообщения: 126
Зарегистрирован: Пн ноя 16, 2015 5:10 pm
Благодарил (а): 19 раз
Поблагодарили: 29 раз

Re: [Вопрос] Обработка значения при его изменении

Сообщение Sandr » Сб апр 16, 2016 11:52 pm

Благодарю. Разобрался.
Win Home Serv 2011 / Intel Core i3 / 32 GB ram /
Сцена погода (вертикальная)
mySensor скетчи ( 4х канальный димер | Оптимизация скетчей )
Ну и конечно моя маленькая фабрика - 3D печать / фрезеровка / литье
Аватара пользователя
Sandr
Сообщения: 126
Зарегистрирован: Пн ноя 16, 2015 5:10 pm
Благодарил (а): 19 раз
Поблагодарили: 29 раз

Re: [Вопрос] Обработка значения при его изменении

Сообщение Sandr » Вс апр 17, 2016 12:46 pm

Еще один вопрос:
После чистой установки MJD у класса Rooms есть метод onActivity
Как выяснить - кем и когда запускается этот метод?!
Win Home Serv 2011 / Intel Core i3 / 32 GB ram /
Сцена погода (вертикальная)
mySensor скетчи ( 4х канальный димер | Оптимизация скетчей )
Ну и конечно моя маленькая фабрика - 3D печать / фрезеровка / литье
ErmolenkoM
Сообщения: 560
Зарегистрирован: Ср сен 04, 2013 10:31 am
Откуда: Самара
Благодарил (а): 99 раз
Поблагодарили: 140 раз
Контактная информация:

Re: [Вопрос] Обработка значения при его изменении

Сообщение ErmolenkoM » Вс апр 17, 2016 5:17 pm

Sandr писал(а):Еще один вопрос:
После чистой установки MJD у класса Rooms есть метод onActivity
Как выяснить - кем и когда запускается этот метод?!
В админке есть ПОИСК, ищет среди всего (методы, и пр.) вообщем супер вещь. Рекомендую!
Для ответа на вопрос надо иметь свежеустановленую Алису, у меня нету...
За это сообщение автора ErmolenkoM поблагодарил:
Sandr (Пн апр 18, 2016 8:32 am)
Рейтинг: 1.16%
aka msh555
Cubian на Cubietruck, Connect
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: [Вопрос] Обработка значения при его изменении

Сообщение sergejey » Пн апр 18, 2016 10:18 am

Sandr писал(а):Еще один вопрос:
После чистой установки MJD у класса Rooms есть метод onActivity
Как выяснить - кем и когда запускается этот метод?!
onActivity комнаты вызывается из метода statusChanged объектов класса InHouseMovementSensors при условии, что у объекта датчика движения установлено значение свойства LinkedRoom.
А вообще присоединяюсь к совету насчёт поиска:
Изображение
За это сообщение автора sergejey поблагодарили (всего 2):
Sandr (Пн апр 18, 2016 11:11 am) • craber (Чт окт 27, 2016 9:24 pm)
Рейтинг: 2.33%

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Аватара пользователя
Sandr
Сообщения: 126
Зарегистрирован: Пн ноя 16, 2015 5:10 pm
Благодарил (а): 19 раз
Поблагодарили: 29 раз

Re: [Вопрос] Обработка значения при его изменении

Сообщение Sandr » Пн апр 18, 2016 7:00 pm

sergejey писал(а):onActivity комнаты вызывается из метода statusChanged объектов класса InHouseMovementSensors при условии, что у объекта датчика движения установлено значение свойства LinkedRoom.
Если я правильно понял - необходимо прописать запуск метода "statusChanged"
для свойства "status" объекта keySensors
в поле "Запускать метод при изменении (не обязательно):"
СкринПоказать
2016-04-18_18-43-08.png
2016-04-18_18-43-08.png (11.17 КБ) 7923 просмотра
Далее связать датчик движения (MySensor) со свойством status объекта MotionSensor1

И при изменении status 0<>1 будет запускаться метод "statusChanged"

Теперь вопросы:
1) Какую задержку переключения в 0 после обнаружения движения необходимо установить для сенсора
Сейчас PIR сенсор держит логическую 1 в течении 3х секунд и затем отправляет логический 0

2) Что за свойства alive и aliveTimeOut (в живых, действующий кто?)
в частности в методе statusChanged
$alive_timeout=12*60*60 вычисляется как 12 часов ?

3)Как такое возможно?
ThisComputer.somebodyHome "1"
ThisComputer.HomeStatus "20:35 Дома никого "
ThisComputer.somebodyHomeText "Кто-то дома: Детская, Гостиная"
sergejey писал(а):А вообще присоединяюсь к совету насчёт поиска:
Спасибо - действительно не замечал такой удобный инструмент!
Win Home Serv 2011 / Intel Core i3 / 32 GB ram /
Сцена погода (вертикальная)
mySensor скетчи ( 4х канальный димер | Оптимизация скетчей )
Ну и конечно моя маленькая фабрика - 3D печать / фрезеровка / литье
Аватара пользователя
Sandr
Сообщения: 126
Зарегистрирован: Пн ноя 16, 2015 5:10 pm
Благодарил (а): 19 раз
Поблагодарили: 29 раз

Re: [Вопрос] Обработка значения при его изменении

Сообщение Sandr » Ср апр 20, 2016 9:39 am

Попробую сам себе ответить.
Есть два метода с одинаковым названием
keySensors->statusChanged
И
keySensors->inHouseMovementSensors->statusChanged

первый содержит лишь код устанавливающий время жизни сенсоров
СпойлерПоказать

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

if ($params['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=12*60*60;
}
clearTimeOut($ot."_alive");
setTimeOut($ot."_alive","sg('".$ot.".alive',0);",$alive_timeout);
Причем в не зависимости от того вызван метод с параметром $params['status']
Или без

А вот второй метод в чистой установке требовал обязательного присутствия
Параметра $params['status']
В моем случае свойство status устанавливается в лог. 1 модулем mySensors
при срабатывании датчика движения, и также ставится в 0 при отсутствии движения
Значит при вызове метода keySensors->inHouseMovementSensors->statusChanged
Параметра status не передается и его надо считать

Результат
СпойлерПоказать

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

//$this->setProperty('status',$params['status']); // выставляем статус сенсора
// отключим первую строчку из оригинального кода 
if ($params['status']) {
 $this->setProperty('status',$params['status']);
}else if($this->getProperty("status") != 0){
// новое условие считывающее параметр
 $_status = $this->getProperty("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'] || $_status != 0) {
// и добавим условию новое вхождение  
 $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'); // запускаем скрипт "доброе утро"
  }
}
PS: "Ёмаё чтож я сделал?" :)
А теперь при регистрации движения датчиком стал падать модуль mySensors с ошибкой

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

Fatal error: Cannot redeclare cmp() (previously declared in
C:\_majordomo\htdocs\modules\objects\objects.class.php(513) : eval()'d code:13) in 
C:\_majordomo\htdocs\modules\objects\objects.class.php(513) : eval()'d code on line 19
2016-04-20 12:58:31 Set: Node:5; Sensor:4; Type:1; Ack:0; Sub:4; Msg:756.32
2016-04-20 12:58:31 Set: Node:5; Sensor:2; Type:1; Ack:0; Sub:4; Msg:1008
Методом исключения выяснил - падает при вызове callMethod($linked_room.'.onActivity');
Далее тем же методом вычислил в onActivity падение при вызове $this->callMethod("updateActivityStatus");
а вот в методе updateActivityStatus та самая, многократно объявляемая, функция cmp() -
Осталось лишь добавить проверку на существование функции

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

if (!function_exists ( "cmp" ))
{ // если функция еще не объявлена
    function cmp($a, $b)
    {
        if ($a['diff'] == $b['diff']) {
            return 0;
        }
        return ($a['diff'] < $b['diff']) ? -1 : 1;
    } 
}
usort($rooms,"cmp"); 
PS - первые тесты показали что падения прекратились.
За это сообщение автора Sandr поблагодарил:
bat86 (Пн авг 22, 2016 9:54 am)
Рейтинг: 1.16%
Win Home Serv 2011 / Intel Core i3 / 32 GB ram /
Сцена погода (вертикальная)
mySensor скетчи ( 4х канальный димер | Оптимизация скетчей )
Ну и конечно моя маленькая фабрика - 3D печать / фрезеровка / литье
Ответить