Logrus

<<< Назад

Режим "Никого нет дома"

Вариант №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

Обсуждение (0) (12)

Смотрите так же:
21.10.2018 Настройки громкости
07.10.2018 Примеры кода
29.09.2018 checkState
25.09.2018 pChart
24.09.2018 Уход за базой данных
05.08.2018 Управление подсветкой на шлюзе Сяоми
21.06.2018 Каталог ссылок
10.06.2018 Меню
08.07.2018 mail()
04.05.2018 Режим "EnergyTariffMode"
02.05.2018 Класс SOpenClose метод logicAction (по-русски "Входная дверь")
22.04.2018 Программы
19.04.2018 Пользовательские функции
11.04.2018 Шаблон отображения в классе "ExchangeRates"
05.04.2018 Шаблон отображения в классе "Users"
25.02.2018 Бэкап и обслуживание системы

Нижний Тагил, Россия

На форуме: Logrus