Логика в классе Rooms

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

Модератор: immortal

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

Логика в классе Rooms

Сообщение Gelezako » Пт сен 15, 2017 7:22 pm

Кто-нить может объяснить какая логика описана в классе Rooms, вот в этих методах:
onActivity
onIdle
updateActivityStatus
фанат Мажордомо
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
Аватара пользователя
tarasfrompir
Сообщения: 3216
Зарегистрирован: Ср мар 02, 2016 8:18 pm
Откуда: Украина Пирятин
Благодарил (а): 223 раза
Поблагодарили: 815 раз

Re: Логика в классе Rooms

Сообщение tarasfrompir » Сб сен 16, 2017 12:10 am

Не обращай внимания на скрипт.
Смотри в конце такую строку ...
/* 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);
Может и сумбурно - но это мне стояло 3 вечеров для разборок и это с тем условием что я уже когдато с ним разбирался...(когда не было модуля простые устройства)
За это сообщение автора 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

Сообщение Gelezako » Сб сен 16, 2017 1:04 am

спасибо что неполенился расписать, хоть немного ввёл в курс дела, но у меня есть несколько вопросов, буду признателен если ответишь:

1. вот ты говоришь что
тот в свою очередь проверяет все комнати на присутствие 1 в SomebodyHere
но каким образом он это проверяет? Я так понимаю, ему должны сообщать датчики? У меня есть к примеру несколько датчиков движения, как мне их прикрутить к этой схеме?

2.
После этого метод updateActivityStatus ждет время заданое в IdleDelay
Зачем добавлен этот таймаут? Какой в нём смысл?

3.
И переводит комнаты в состояние onIdle
Что это за состояние и как его использовать?

PS
Вот исправленый мной Rooms_onActivity.php
Твои фиксы могут быть полезными. Весь исходный код лежить на гитхабе и ты можешь делать пул реквесты в основную ветку. Т.е. предложить своё исправление, Сергей рассмотрит его и внесёт в общий репозиторий. Вот ссылка на него - https://github.com/sergejey/majordomo
фанат Мажордомо
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
Аватара пользователя
tarasfrompir
Сообщения: 3216
Зарегистрирован: Ср мар 02, 2016 8:18 pm
Откуда: Украина Пирятин
Благодарил (а): 223 раза
Поблагодарили: 815 раз

Re: Логика в классе Rooms

Сообщение tarasfrompir » Сб сен 16, 2017 8:47 pm

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
Хотя сами не пользуются блютузами и не знают как єто хреново когда ждеш ответа от Мажорика - а не ответа ни привета.
Причем выясняется что до блютуза не достучатся села батарейка... А ты полчаса кричиш в стену - АЛЕ ГАРАЖ ГДЕ ТЫ с....... ПРОПАЛА...

ПС Свой
Простите за лирику...
За это сообщение автора tarasfrompir поблагодарил:
Gelezako (Вс сен 17, 2017 1:28 am)
Рейтинг: 1.16%
Спасибо нам ПОМОЖЕТ..!
Аватара пользователя
Gelezako
Сообщения: 963
Зарегистрирован: Чт июн 02, 2016 9:33 pm
Благодарил (а): 205 раз
Поблагодарили: 106 раз
Контактная информация:

Re: Логика в классе Rooms

Сообщение Gelezako » Вс сен 17, 2017 1:35 am

Спасибо за развёрнутые ответы, буду тестить, надеюсь что эта логика решит мои проблемы с датчиком движения. А на счёт ревью вашего кода, Сергей не может физически мониторить все темы и посты, очень велика вероятность что он попросту не видел вашего обращения. Или может увидел, но забыл, он тоже человек. А вот пулреквест в гитхабе будет висеть и напоминать до тех пор пока его не отклонят либо не примут. Ваши фиксы правда могут быть полезным. Может попробуете всё таки подать через гитхаб?
фанат Мажордомо
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
Аватара пользователя
Gelezako
Сообщения: 963
Зарегистрирован: Чт июн 02, 2016 9:33 pm
Благодарил (а): 205 раз
Поблагодарили: 106 раз
Контактная информация:

Re: Логика в классе Rooms

Сообщение Gelezako » Вс сен 17, 2017 11:28 pm

немного поразбирался и возникли следующие вопросы:
значение в SomebodyHere будет равно 1 и не будет изменяться целые 10 мин (если не переопределять IdleDelay ). Т.е. во время этого периода времени будут игнорироваться данные с датчика движения и система будет считать что кто-то есть? Если да, то это создаёт сложности в обработке этого события. Сейчас у меня настроено так что если датчик движения сработал, он шлёт 1 в определённое свойтсво. В настройках этого свойства я указал что нужно запускать определённый метод каждый раз когда значение свойства меняется. А в обработчике метода делаю проверку, если значение свойства равно 1 (т.е. датчик зафиксировал движение), то выполняет нужную мне логику. Проблема в том что когда датчик фиксирует движение, он 3-4 раза отправляет 1 и получается что мой метод тоже выполняется 3-4 раза. А мне этого не надо. Мне нужно что если система меня увидела, то один раз выполнить метод и всё. Думал что встроенная логика с методом onActivity и другими помогут решить эту проблему, но они тоже запускаются несколько раз. Может подскажите решение?
фанат Мажордомо
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
Аватара пользователя
tarasfrompir
Сообщения: 3216
Зарегистрирован: Ср мар 02, 2016 8:18 pm
Откуда: Украина Пирятин
Благодарил (а): 223 раза
Поблагодарили: 815 раз

Re: Логика в классе Rooms

Сообщение tarasfrompir » Пн сен 18, 2017 9:36 am

Ну вопервых там есть еще временная отметка - по которой тоже считается время и если в это время сработает метод онАктивити то она обновится и таймер перезапустится на те же 10 минут.

"В настройках этого свойства я указал что нужно запускать определённый метод каждый раз когда значение свойства меняется." вот сюда сделай примерно так:

Если у тебя датчик срабатывает даже 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

Сообщение Gelezako » Пн сен 18, 2017 12:29 pm

спасибо, попробую такое реализовать
tarasfrompir1 писал(а): ПС простите за прямоту я видел паралельно созданые темы неужто никто не ответил ?
какую тему имеете ввиду?
tarasfrompir1 писал(а): ППС а вообще то правильно будет если датчик движения сработает 1 раз - тоесть надо запихать эту логику в контроллер датчика
тоже думал об этом, но я считаю что если датчик обнаружил движение, то он и должен постоянно оповещать об этом, а как это использовать нужно обрабатывать в Мажорике. Потому что если что-то поменяется в концепции, то получается что сам датчик будет врать если в нём таймауты ставить.
фанат Мажордомо
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
Аватара пользователя
tarasfrompir
Сообщения: 3216
Зарегистрирован: Ср мар 02, 2016 8:18 pm
Откуда: Украина Пирятин
Благодарил (а): 223 раза
Поблагодарили: 815 раз

Re: Логика в классе Rooms

Сообщение tarasfrompir » Пн сен 18, 2017 2:31 pm

Да вот видел к примеру это viewtopic.php?f=13&t=1676&start=10 и еще несколько

ПС По поводу этого viewtopic.php?f=7&t=3574&start=180
Я думаю что необходимо все таки вносит все данные в комнату класса Room - я так думаю что будет проще просматривать состояние комнаты по всех существующих показаниях датчиков.
Спасибо нам ПОМОЖЕТ..!
Аватара пользователя
Gelezako
Сообщения: 963
Зарегистрирован: Чт июн 02, 2016 9:33 pm
Благодарил (а): 205 раз
Поблагодарили: 106 раз
Контактная информация:

Re: Логика в классе Rooms

Сообщение Gelezako » Ср сен 20, 2017 1:22 pm

tarasfrompir1 писал(а):
Если у тебя датчик срабатывает даже 10 раз но в определенный период (ну скажем в течении 1 минуты) то вставь в метод такое действие
...
(и получится так что у тебя будет ежеминутно при срабатывании движения устанавливатся значение того что кто то есть в комнате но поскольку временная метка будет обновлятся ежеминутно то тело скрипта не будет запускатся... а если пройдет 1 минутато запустится тело скрипта (метода)....
сделал как ты описал, но проблема всё равно осталась и вот почему. Дело в том что метод запускается с очень малой разницей во времени, примерно за 1 секунду он запускается 3-4 раза, с такой скоростью приходит оповещение о том что есть движение. Поэтому проверка в 1 минуту ничего не решает. Наверно придётся какой-то счётчик делать ((
фанат Мажордомо
тематический блог http://blog.gelezako.com
плейлист про Мажордомо на ютубе https://www.youtube.com/playlist?list=P ... EdBGtX084E
Ответить