Вариант №1 (ниже и не нужно смешивать у себя оба варианта №1 в этой статье и №2 у меня в коннекте, они абсолютно разные, и все более и более отличаются друг от друга)
Вариант №2 (хочу переделать, убрать опрос в минутном таймере, использовать классы Devices и Presence; собственно реализовано, ошибок не замечено, вроде б ))) оптимизирую/улучшаю)
В модуле "Устройства Онлайн" ввести все нужные устройства
Минутный таймер ("onNewMinute" запуск скрипта ниже, здесь проверка раз в две минуты, на усмотрение)
if ($m%2) { //не чётные
runScriptSafe('CheckOnline');
}
Скрипт CheckOnline
// Проверка пользователей
$objects=getObjectsByClass('Users');
// переберем все объекты в класе
foreach($objects as $obj) {
$devices = getGlobal($obj['TITLE'].'.deviceip');
$devarr = explode(';', $devices);
foreach ($devarr as $device) {
if (isOnline($device)){
callMethodSafe($obj['TITLE'].'.HomeWiFi');
break;
}
}
}
Класс "Users"
Свойства класса:
deviceip (Устройство привязанное к пользователю (Телефон, через ; можно несколько, вызов в таймере скрипт))
isHome Сейчас дома или нет (WIFI) - с метода HomeWiFi, запускать при изменении метод Home
atHome Сейчас дома или нет (GPS) - с модуля gpstrack, запускать при изменении метод Home
presence совокупность по (WIFI и GPS) (Блютуза, рфид, нет, добавляется аналогично.)
Методы класса:
Метод HomeWiFi
//Сброс присутствия
$ot=$this->object_title;
$alive_timeout=5*60;
setTimeOut($ot.'_isHome',"sg('".$ot.".isHome',0);",$alive_timeout);
$last=$this->getProperty('isHomeTime');
$this->setProperty('isHomeTime',time());
$this->setProperty('isHomeUpdate',date('Y-m-d H:i',time()));
//Установка флага и проверка на $status
$status=$this->getProperty('isHome');
if (!$status) {
$this->setProperty('isHome',1);
}
//Приветствовать
$GMailUnread=$this->getProperty('GMailUnread');
if ($this->getProperty('Greeting') == 1) {
if (time()-$last>=(3*60*60)) {
say('Здравствуйте '.$this->getProperty('fullName').'!');
if ($GMailUnread>0) {
say('У Вас '.myMorph($GMailUnread,' непрочитанное письмо!',' непрочитанных письма!',' непрочитанных писем!'));
}
}
}
//Сброс "nobodyHome", "простые устройства"
//ClearTimeOut('nobodyHome');
Примечание:
//Сброс "nobodyHome", "простые устройства"
//ClearTimeOut('nobodyHome');
строки выше закомментированы, т.к. у меня правлены ПУ, а они лезут в режим, как будете устранять Ваш личный выбор.
Метод Home
$gps=$this->getProperty('atHome');
$wifi=$this->getProperty('isHome');
//registerEvent('presence',$this->name,2);
if (!$gps && !$wifi) {
$this->setProperty('presence','0');
$this->setProperty('NameColor','orange');
} else {
$this->setProperty('presence','1');
$this->setProperty('NameColor','green');
}
if ($wifi) {
$this->setProperty('NetworkPic','wifi');
} else {
$this->setProperty('NetworkPic','');
}
Отдельно настройки датчиков движения и датчика состояния двери (logicAction), а так же все остальные устройства привязанные к комнатам (простые устройства)
Минутный таймер ("onNewMinute" проверка всего выше)
//Режимы
$night=gg('NightMode.active');
$nobody=gg('NobodyHomeMode.active');
$entrance=gg('Openclose01.entrance');
//Режим "Никого нет дома"
$inhome=0;
//Проверка есть ли люди дома по WIFI и GPS
$objects=getObjectsByClass('Users');
foreach($objects as $obj){
if (gg($obj['TITLE'].'.presence')==1){
$inhome=1;
break;
}
}
//Проверка есть ли активность дома в Rooms
if (!$inhome){
$objects=getObjectsByClass('Rooms');
foreach($objects as $obj){
if (gg($obj['TITLE'].'.SomebodyHere')==1){
$inhome=1;
break;
}
}
}
//если никто не обнаружен и режим "кто-то есть" и не ночь и время от сработки двери меньше 15 мин.
//если никто не обнаружен и режим "кто-то есть или никого нет" и ночь
if ((!$inhome && $nobody==0 && !$night && $entrance) || (!$inhome && $nobody<=1 && $night)){
callMethodSafe('NobodyHomeMode.activate');
}
//если кто то есть и режим "все спят или никого нет"
if ($inhome && $nobody>=1){
callMethodSafe('NobodyHomeMode.deactivate');
}
//HomeStatus правленый под три состояния
$homeStatus=date('H:i');
if ($nobody==1) {
$homeStatus.=' Дома никого.';
} elseif ($nobody==2) {
$homeStatus.=' Все спят.';
} else {
$homeStatus.=' Дома кто-то есть.';
}
$homeStatus.=' '.gg('Security.stateDetails');
$homeStatus.=' '.gg('System.stateDetails');
$homeStatus.=' '.gg('Communication.stateDetails');
sg('HomeStatus',$homeStatus);
Класс OperationalModes объект NobodyHomeMode
Методы:
activate
// не вызывать род. метод
$night=gg('NightMode.active');
$security=gg('SecurityArmedMode.active');
if ($night && !$security) {
$this->setProperty('active',2);
} else {
$this->setProperty('active',1);
}
//ClearTimeOut('nobodyHome');
/* begin injection of {SDevices} */
require(DIR_MODULES.'devices/nobodyhomemode_activate.php');
/* end injection of {SDevices} */
deactivate - без изменений
modeChanged
//не вызывать род. метод
$this->setProperty('updated',time());
$this->setProperty('updatedTime',date('H:i'));
$sayModes = gg('Sets.sayModes');
//Название режима
switch ($this->getProperty('active')) {
case 0: $s='Кто-то дома'; break;
case 1: $s='Никого нет дома'; break;
case 2: $s='Все спят'; break;
}
$this->setProperty('title', $s);
if ($sayModes) {
say('Режим '.$s.' установлен.',1);
}
/* begin injection of {SDevices} */
require(DIR_MODULES.'devices/Rooms_updateActivityStatus.php');
/* end injection of {SDevices} */
п.с. по коду встречаются отсылки к классу "Sets" с настройками проговаривания, начала и окончания режима ночь, etc
Нижний Тагил, Россия
На форуме: Logrus