Логика в классе Rooms
Модератор: immortal
- Gelezako
- Сообщения: 963
- Зарегистрирован: Чт июн 02, 2016 9:33 pm
- Благодарил (а): 205 раз
- Поблагодарили: 106 раз
- Контактная информация:
Логика в классе Rooms
Кто-нить может объяснить какая логика описана в классе Rooms, вот в этих методах:
onActivity
onIdle
updateActivityStatus
onActivity
onIdle
updateActivityStatus
фанат Мажордомо
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
- tarasfrompir
- Сообщения: 3216
- Зарегистрирован: Ср мар 02, 2016 8:18 pm
- Откуда: Украина Пирятин
- Благодарил (а): 223 раза
- Поблагодарили: 815 раз
Re: Логика в классе Rooms
Не обращай внимания на скрипт.
Смотри в конце такую строку ...
/* begin injection of {SDevices} */
require(DIR_MODULES.'devices/Rooms_onActivity.php');
/* end injection of {SDevices} */
Вот он и проверяет сейчас на активность и дает показания в основную страницу.
Принцип такой - запускается метод - он активити обновляется состояние присутствия и потом этот же метод запускает updateActivityStatus. А тот в свою очередь проверяет все комнати на присутствие 1 в SomebodyHere. и сообщает есть ли кто здесь.
После этого метод updateActivityStatus ждет время заданое в IdleDelay (которого кстати нет в свойствах комнаты надо создать самому ну или ждет 10 минут которые прописаны жестко в коде - это срок задержки на перевод в состояние onIdle)
И переводит комнаты в состояние onIdle. И после опять сообщает что ктото в комнате (ах) был. И еще паскудная мелочь как по мне не показывает дату когда там был кто-то а только время(есть дома комната в которой я не бываю по 5-10 дней) (Вот исправленый мной Rooms_onActivity.php показания дает с датой - правда он еще показывает и пользователя распознаного камерой в комнате нужно выбросить переменную ВЕЗДЕ $rooms[0]['user'] и $rooms[$i]['user'])
Может и сумбурно - но это мне стояло 3 вечеров для разборок и это с тем условием что я уже когдато с ним разбирался...(когда не было модуля простые устройства)
Смотри в конце такую строку ...
/* begin injection of {SDevices} */
require(DIR_MODULES.'devices/Rooms_onActivity.php');
/* end injection of {SDevices} */
Вот он и проверяет сейчас на активность и дает показания в основную страницу.
Принцип такой - запускается метод - он активити обновляется состояние присутствия и потом этот же метод запускает updateActivityStatus. А тот в свою очередь проверяет все комнати на присутствие 1 в SomebodyHere. и сообщает есть ли кто здесь.
После этого метод updateActivityStatus ждет время заданое в IdleDelay (которого кстати нет в свойствах комнаты надо создать самому ну или ждет 10 минут которые прописаны жестко в коде - это срок задержки на перевод в состояние onIdle)
И переводит комнаты в состояние onIdle. И после опять сообщает что ктото в комнате (ах) был. И еще паскудная мелочь как по мне не показывает дату когда там был кто-то а только время(есть дома комната в которой я не бываю по 5-10 дней) (Вот исправленый мной Rooms_onActivity.php показания дает с датой - правда он еще показывает и пользователя распознаного камерой в комнате нужно выбросить переменную ВЕЗДЕ $rooms[0]['user'] и $rooms[$i]['user'])
СпойлерПоказать
<?php
@include_once(ROOT . 'languages/devices_' . SETTINGS_SITE_LANGUAGE . '.php');
@include_once(ROOT . 'languages/devices_default' . '.php');
$rooms = getObjectsByClass("Rooms");
$total = count($rooms);
for ($i = 0; $i < $total; $i++) {
$rooms[$i]['room'] = getGlobal($rooms[$i]['TITLE'] . '.Title');
if (!$rooms[$i]['room']) {
$rooms[$i]['room'] = $rooms[$i]['TITLE'];
}
$rooms[$i]['active'] = getGlobal($rooms[$i]['TITLE'] . '.SomebodyHere');
$rooms[$i]['time'] = getGlobal($rooms[$i]['TITLE'] . '.LatestActivity');
$rooms[$i]['user'] = getGlobal($rooms[$i]['TITLE'] . '.UserName');
if (!$rooms[$i]['time']) {
$rooms[$i]['time'] = 0;
}
$rooms[$i]['diff'] = time() - $rooms[$i]['time'];
}
if (!function_exists('cmpRoomsActivity')) {
function cmpRoomsActivity($a, $b)
{
if ($a['diff'] == $b['diff']) {
return 0;
}
return ($a['diff'] < $b['diff']) ? -1 : 1;
}
}
usort($rooms, "cmpRoomsActivity");
if (!$rooms[0]['active']) {
$somebodyHomeText = LANG_DEVICES_ROOMS_NOBODYHOME." ".LANG_DEVICES_ROOMS_ACTIVITY." " . date('H:i (m.d.y)', $rooms[0]['time']) . " (" . $rooms[0]['room'] . "). " . $rooms[0]['user'];
setGlobal($rooms[0]['TITLE']. '.UserName','');
} else {
$res_rooms = array();
for ($i = 0; $i < $total; $i++) {
if ($rooms[$i]['active']) {
$res_rooms[] = $rooms[$i]['room']. '. '. $rooms[$i]['user'];
}
}
$somebodyHomeText = LANG_DEVICES_ROOMS_SOMEBODYHOME." ". LANG_DEVICES_ROOMS_ACTIVITY . " " . implode(", ", $res_rooms);
}
echo $somebodyHomeText;
setGlobal('somebodyHomeText', $somebodyHomeText);
@include_once(ROOT . 'languages/devices_' . SETTINGS_SITE_LANGUAGE . '.php');
@include_once(ROOT . 'languages/devices_default' . '.php');
$rooms = getObjectsByClass("Rooms");
$total = count($rooms);
for ($i = 0; $i < $total; $i++) {
$rooms[$i]['room'] = getGlobal($rooms[$i]['TITLE'] . '.Title');
if (!$rooms[$i]['room']) {
$rooms[$i]['room'] = $rooms[$i]['TITLE'];
}
$rooms[$i]['active'] = getGlobal($rooms[$i]['TITLE'] . '.SomebodyHere');
$rooms[$i]['time'] = getGlobal($rooms[$i]['TITLE'] . '.LatestActivity');
$rooms[$i]['user'] = getGlobal($rooms[$i]['TITLE'] . '.UserName');
if (!$rooms[$i]['time']) {
$rooms[$i]['time'] = 0;
}
$rooms[$i]['diff'] = time() - $rooms[$i]['time'];
}
if (!function_exists('cmpRoomsActivity')) {
function cmpRoomsActivity($a, $b)
{
if ($a['diff'] == $b['diff']) {
return 0;
}
return ($a['diff'] < $b['diff']) ? -1 : 1;
}
}
usort($rooms, "cmpRoomsActivity");
if (!$rooms[0]['active']) {
$somebodyHomeText = LANG_DEVICES_ROOMS_NOBODYHOME." ".LANG_DEVICES_ROOMS_ACTIVITY." " . date('H:i (m.d.y)', $rooms[0]['time']) . " (" . $rooms[0]['room'] . "). " . $rooms[0]['user'];
setGlobal($rooms[0]['TITLE']. '.UserName','');
} else {
$res_rooms = array();
for ($i = 0; $i < $total; $i++) {
if ($rooms[$i]['active']) {
$res_rooms[] = $rooms[$i]['room']. '. '. $rooms[$i]['user'];
}
}
$somebodyHomeText = LANG_DEVICES_ROOMS_SOMEBODYHOME." ". LANG_DEVICES_ROOMS_ACTIVITY . " " . implode(", ", $res_rooms);
}
echo $somebodyHomeText;
setGlobal('somebodyHomeText', $somebodyHomeText);
- За это сообщение автора tarasfrompir поблагодарили (всего 2):
- Gelezako (Сб сен 16, 2017 12:57 am) • Dicont (Пн янв 08, 2018 8:55 pm)
- Рейтинг: 2.33%
Спасибо нам ПОМОЖЕТ..!
- Gelezako
- Сообщения: 963
- Зарегистрирован: Чт июн 02, 2016 9:33 pm
- Благодарил (а): 205 раз
- Поблагодарили: 106 раз
- Контактная информация:
Re: Логика в классе Rooms
спасибо что неполенился расписать, хоть немного ввёл в курс дела, но у меня есть несколько вопросов, буду признателен если ответишь:
1. вот ты говоришь что
2.
3.
PS
1. вот ты говоришь что
но каким образом он это проверяет? Я так понимаю, ему должны сообщать датчики? У меня есть к примеру несколько датчиков движения, как мне их прикрутить к этой схеме?тот в свою очередь проверяет все комнати на присутствие 1 в SomebodyHere
2.
Зачем добавлен этот таймаут? Какой в нём смысл?После этого метод updateActivityStatus ждет время заданое в IdleDelay
3.
Что это за состояние и как его использовать?И переводит комнаты в состояние onIdle
PS
Твои фиксы могут быть полезными. Весь исходный код лежить на гитхабе и ты можешь делать пул реквесты в основную ветку. Т.е. предложить своё исправление, Сергей рассмотрит его и внесёт в общий репозиторий. Вот ссылка на него - https://github.com/sergejey/majordomoВот исправленый мной Rooms_onActivity.php
фанат Мажордомо
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
- tarasfrompir
- Сообщения: 3216
- Зарегистрирован: Ср мар 02, 2016 8:18 pm
- Откуда: Украина Пирятин
- Благодарил (а): 223 раза
- Поблагодарили: 815 раз
Re: Логика в классе Rooms
1. твои датчики движения должны запускать метод onActivity в соответстующей комнате
вот пример - http://127.0.0.1:80/objects/?object=Hal ... onActivity
Расписано все про запуск метода скрипта и тд здесь - http://majordomo.smartliving.ru/Main/Pr ... ntegration
А уж этот метод сам изменяет состояние SomebodyHere из 0 в 1 запускает метод updateActivityStatus.
2. Смысл задержки в том чтобы считалось определенное время что в этой комнате ктото есть - иначе постоянно запуска метод onActivity каждую 0,5 секунды ты задедосиш свой веб сайт Тоесть Мажорика.
3. Состояние onIdle - это то состояние когда в комнате никого нет.
Ну вот пример как это можно использовать -
Зашел в комнату . Твой датчик движения запустил метод onActivity. В другой комнате еще ктото сидит. И ему тоже очень интересно что происходит с датчиками по всему дому. Где телик не включается Где свет перегорел и тд.
Твой Мажорик тебе дает отчет не на все звуковые устройства а только на те где произошло в ближайшее время движение. И еще море подобных удобств.
Или же включает свет там где кто то есть.
Да по идее модуль Симплдейвас завязан на эти же методы...
Вот где то так
ПС к твоему ПС
Не выкладывать свои мелочи я не буду - тут глобально дал пулреквест на перевод файла devices_ua.php ито долго не принимают Кстати если у тебя украинский язык используется то нужно добавить такой перевод иначе все будет на инглише. (Хотя ради справедливости некоторые изменения все же были) а вот пример того когда сказали что иди гуляй Вася - viewtopic.php?f=5&t=319&hilit=hosts+online&start=90
Хотя сами не пользуются блютузами и не знают как єто хреново когда ждеш ответа от Мажорика - а не ответа ни привета.
Причем выясняется что до блютуза не достучатся села батарейка... А ты полчаса кричиш в стену - АЛЕ ГАРАЖ ГДЕ ТЫ с....... ПРОПАЛА...
ПС Свой
Простите за лирику...
вот пример - http://127.0.0.1:80/objects/?object=Hal ... onActivity
Расписано все про запуск метода скрипта и тд здесь - http://majordomo.smartliving.ru/Main/Pr ... ntegration
А уж этот метод сам изменяет состояние SomebodyHere из 0 в 1 запускает метод updateActivityStatus.
2. Смысл задержки в том чтобы считалось определенное время что в этой комнате ктото есть - иначе постоянно запуска метод onActivity каждую 0,5 секунды ты задедосиш свой веб сайт Тоесть Мажорика.
3. Состояние onIdle - это то состояние когда в комнате никого нет.
Ну вот пример как это можно использовать -
Зашел в комнату . Твой датчик движения запустил метод onActivity. В другой комнате еще ктото сидит. И ему тоже очень интересно что происходит с датчиками по всему дому. Где телик не включается Где свет перегорел и тд.
Твой Мажорик тебе дает отчет не на все звуковые устройства а только на те где произошло в ближайшее время движение. И еще море подобных удобств.
Или же включает свет там где кто то есть.
Да по идее модуль Симплдейвас завязан на эти же методы...
Вот где то так
ПС к твоему ПС
Не выкладывать свои мелочи я не буду - тут глобально дал пулреквест на перевод файла devices_ua.php ито долго не принимают Кстати если у тебя украинский язык используется то нужно добавить такой перевод иначе все будет на инглише. (Хотя ради справедливости некоторые изменения все же были) а вот пример того когда сказали что иди гуляй Вася - viewtopic.php?f=5&t=319&hilit=hosts+online&start=90
Хотя сами не пользуются блютузами и не знают как єто хреново когда ждеш ответа от Мажорика - а не ответа ни привета.
Причем выясняется что до блютуза не достучатся села батарейка... А ты полчаса кричиш в стену - АЛЕ ГАРАЖ ГДЕ ТЫ с....... ПРОПАЛА...
ПС Свой
Простите за лирику...
- За это сообщение автора tarasfrompir поблагодарил:
- Gelezako (Вс сен 17, 2017 1:28 am)
- Рейтинг: 1.16%
Спасибо нам ПОМОЖЕТ..!
- Gelezako
- Сообщения: 963
- Зарегистрирован: Чт июн 02, 2016 9:33 pm
- Благодарил (а): 205 раз
- Поблагодарили: 106 раз
- Контактная информация:
Re: Логика в классе Rooms
Спасибо за развёрнутые ответы, буду тестить, надеюсь что эта логика решит мои проблемы с датчиком движения. А на счёт ревью вашего кода, Сергей не может физически мониторить все темы и посты, очень велика вероятность что он попросту не видел вашего обращения. Или может увидел, но забыл, он тоже человек. А вот пулреквест в гитхабе будет висеть и напоминать до тех пор пока его не отклонят либо не примут. Ваши фиксы правда могут быть полезным. Может попробуете всё таки подать через гитхаб?
фанат Мажордомо
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
- Gelezako
- Сообщения: 963
- Зарегистрирован: Чт июн 02, 2016 9:33 pm
- Благодарил (а): 205 раз
- Поблагодарили: 106 раз
- Контактная информация:
Re: Логика в классе Rooms
немного поразбирался и возникли следующие вопросы:
значение в SomebodyHere будет равно 1 и не будет изменяться целые 10 мин (если не переопределять IdleDelay ). Т.е. во время этого периода времени будут игнорироваться данные с датчика движения и система будет считать что кто-то есть? Если да, то это создаёт сложности в обработке этого события. Сейчас у меня настроено так что если датчик движения сработал, он шлёт 1 в определённое свойтсво. В настройках этого свойства я указал что нужно запускать определённый метод каждый раз когда значение свойства меняется. А в обработчике метода делаю проверку, если значение свойства равно 1 (т.е. датчик зафиксировал движение), то выполняет нужную мне логику. Проблема в том что когда датчик фиксирует движение, он 3-4 раза отправляет 1 и получается что мой метод тоже выполняется 3-4 раза. А мне этого не надо. Мне нужно что если система меня увидела, то один раз выполнить метод и всё. Думал что встроенная логика с методом onActivity и другими помогут решить эту проблему, но они тоже запускаются несколько раз. Может подскажите решение?
значение в SomebodyHere будет равно 1 и не будет изменяться целые 10 мин (если не переопределять IdleDelay ). Т.е. во время этого периода времени будут игнорироваться данные с датчика движения и система будет считать что кто-то есть? Если да, то это создаёт сложности в обработке этого события. Сейчас у меня настроено так что если датчик движения сработал, он шлёт 1 в определённое свойтсво. В настройках этого свойства я указал что нужно запускать определённый метод каждый раз когда значение свойства меняется. А в обработчике метода делаю проверку, если значение свойства равно 1 (т.е. датчик зафиксировал движение), то выполняет нужную мне логику. Проблема в том что когда датчик фиксирует движение, он 3-4 раза отправляет 1 и получается что мой метод тоже выполняется 3-4 раза. А мне этого не надо. Мне нужно что если система меня увидела, то один раз выполнить метод и всё. Думал что встроенная логика с методом onActivity и другими помогут решить эту проблему, но они тоже запускаются несколько раз. Может подскажите решение?
фанат Мажордомо
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
- tarasfrompir
- Сообщения: 3216
- Зарегистрирован: Ср мар 02, 2016 8:18 pm
- Откуда: Украина Пирятин
- Благодарил (а): 223 раза
- Поблагодарили: 815 раз
Re: Логика в классе Rooms
Ну вопервых там есть еще временная отметка - по которой тоже считается время и если в это время сработает метод онАктивити то она обновится и таймер перезапустится на те же 10 минут.
"В настройках этого свойства я указал что нужно запускать определённый метод каждый раз когда значение свойства меняется." вот сюда сделай примерно так:
Если у тебя датчик срабатывает даже 10 раз но в определенный период (ну скажем в течении 1 минуты) то вставь в метод такое действие
(Логика)
установим значение 1 в SomebodyHere
проверим временную отметку и если она большего текущего времени на 60 секунд то установим новое значение временной отметки и прервем процес
иначе твой скрипт пойдет дальше
(и получится так что у тебя будет ежеминутно при срабатывании движения устанавливатся значение того что кто то есть в комнате но поскольку временная метка будет обновлятся ежеминутно то тело скрипта не будет запускатся... а если пройдет 1 минутато запустится тело скрипта (метода)....
пользуюсь словарями при написании ПХП так что сам исправиш мой текст по феншую...
Начало скрипта
setglobal("Название чего там у тебя в скрипте.SomebodyHere", 1);
if time()-60< getglobal("Название чего там у тебя в скрипте.StartTime")
setglobal("Название чего там у тебя в скрипте.StartTime", time());
break;
elseif
дальше тело твоего скрипта(метода )
ПС простите за прямоту я видел паралельно созданые темы неужто никто не ответил ?
ППС а вообще то правильно будет если датчик движения сработает 1 раз - тоесть надо запихать эту логику в контроллер датчика
"В настройках этого свойства я указал что нужно запускать определённый метод каждый раз когда значение свойства меняется." вот сюда сделай примерно так:
Если у тебя датчик срабатывает даже 10 раз но в определенный период (ну скажем в течении 1 минуты) то вставь в метод такое действие
(Логика)
установим значение 1 в SomebodyHere
проверим временную отметку и если она большего текущего времени на 60 секунд то установим новое значение временной отметки и прервем процес
иначе твой скрипт пойдет дальше
(и получится так что у тебя будет ежеминутно при срабатывании движения устанавливатся значение того что кто то есть в комнате но поскольку временная метка будет обновлятся ежеминутно то тело скрипта не будет запускатся... а если пройдет 1 минутато запустится тело скрипта (метода)....
пользуюсь словарями при написании ПХП так что сам исправиш мой текст по феншую...
Начало скрипта
setglobal("Название чего там у тебя в скрипте.SomebodyHere", 1);
if time()-60< getglobal("Название чего там у тебя в скрипте.StartTime")
setglobal("Название чего там у тебя в скрипте.StartTime", time());
break;
elseif
дальше тело твоего скрипта(метода )
ПС простите за прямоту я видел паралельно созданые темы неужто никто не ответил ?
ППС а вообще то правильно будет если датчик движения сработает 1 раз - тоесть надо запихать эту логику в контроллер датчика
Спасибо нам ПОМОЖЕТ..!
- Gelezako
- Сообщения: 963
- Зарегистрирован: Чт июн 02, 2016 9:33 pm
- Благодарил (а): 205 раз
- Поблагодарили: 106 раз
- Контактная информация:
Re: Логика в классе Rooms
спасибо, попробую такое реализовать
какую тему имеете ввиду?tarasfrompir1 писал(а): ПС простите за прямоту я видел паралельно созданые темы неужто никто не ответил ?
тоже думал об этом, но я считаю что если датчик обнаружил движение, то он и должен постоянно оповещать об этом, а как это использовать нужно обрабатывать в Мажорике. Потому что если что-то поменяется в концепции, то получается что сам датчик будет врать если в нём таймауты ставить.tarasfrompir1 писал(а): ППС а вообще то правильно будет если датчик движения сработает 1 раз - тоесть надо запихать эту логику в контроллер датчика
фанат Мажордомо
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
- tarasfrompir
- Сообщения: 3216
- Зарегистрирован: Ср мар 02, 2016 8:18 pm
- Откуда: Украина Пирятин
- Благодарил (а): 223 раза
- Поблагодарили: 815 раз
Re: Логика в классе Rooms
Да вот видел к примеру это viewtopic.php?f=13&t=1676&start=10 и еще несколько
ПС По поводу этого viewtopic.php?f=7&t=3574&start=180
Я думаю что необходимо все таки вносит все данные в комнату класса Room - я так думаю что будет проще просматривать состояние комнаты по всех существующих показаниях датчиков.
ПС По поводу этого viewtopic.php?f=7&t=3574&start=180
Я думаю что необходимо все таки вносит все данные в комнату класса Room - я так думаю что будет проще просматривать состояние комнаты по всех существующих показаниях датчиков.
Спасибо нам ПОМОЖЕТ..!
- Gelezako
- Сообщения: 963
- Зарегистрирован: Чт июн 02, 2016 9:33 pm
- Благодарил (а): 205 раз
- Поблагодарили: 106 раз
- Контактная информация:
Re: Логика в классе Rooms
сделал как ты описал, но проблема всё равно осталась и вот почему. Дело в том что метод запускается с очень малой разницей во времени, примерно за 1 секунду он запускается 3-4 раза, с такой скоростью приходит оповещение о том что есть движение. Поэтому проверка в 1 минуту ничего не решает. Наверно придётся какой-то счётчик делать ((tarasfrompir1 писал(а):
Если у тебя датчик срабатывает даже 10 раз но в определенный период (ну скажем в течении 1 минуты) то вставь в метод такое действие
...
(и получится так что у тебя будет ежеминутно при срабатывании движения устанавливатся значение того что кто то есть в комнате но поскольку временная метка будет обновлятся ежеминутно то тело скрипта не будет запускатся... а если пройдет 1 минутато запустится тело скрипта (метода)....
фанат Мажордомо
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E