Logrus

 
<<< Back

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

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

Discuss (19) (21)

See also:
2021-01-10 DROP_TABLE
2020-05-07 Телеграмм. Полезное
2019-06-30 Телеграмм. Меню - управление группами ПУ
2019-06-29 Телеграмм. Меню - запуск скриптов (сценариев)
2018-10-21 Настройки громкости
2018-10-07 Примеры кода
2018-09-25 Телеграмм. pChart
2018-05-02 Класс SOpenClose метод logicAction (по-русски "Входная дверь")
2018-04-05 Шаблон отображения в классе "Users"

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

На форуме: Logrus