Xor

 
<<< Назад

Группа как объект - экономим на коде - 2

Работа над ошибками

Представляю второе издание объекта Группы - исправленное и доработанное.

Что изменилось? Упрощено хранение перечня объектов в группе - теперь это просто список имён объектов, разделённых запятыми. Правильность внесения имён теперь полностью лежит на пользователе. Вокруг запятых допустимы пробелы для красоты (в обработке они не учитываются). Если имя объекта введено неверно, то такой объект не будет обрабатываться.

Как это выглядит? Рассмотрим пример - есть набор реле в классе Relays. У меня в нём, кроме релюшек, занимающихся светом, есть и такие, которые занимаются другими делами отоплением, водой. Ну и сделаем группу grpLight, куда добавим объекты, относящиеся только к управлению светом.
Для этого в свойство Items объекта grpLight запишем наши объекты noodimmer0,noodimmer1,noorelay0,noorelay1,noorelay2,noorelay3,noorelay4,noorelay5,noorelay6,NooRGB0
см. скриншот pic1

Пока у наших групп есть такие методы:
Метод setGroupProperty - установить всем объектам группы свойство
вызов cm('GroupObject.setGroupProperty',array('property'=>'propName','value'=>$x));
пример для нашего объекта - хотим для каких-то наших целей сбросить всем "световым" релюшкам свойство status в 0.
Это будет выглядеть так:
cm('grpLight.setGroupProperty',array('property'=>'status','value'=>0));

Код метода класса Groups setGroupProperty:

if(!isset($params['property']))  return 0; //no param
$prop = $params['property'];
if(!isset($params['value'])){
 $value = 0; //по умолчанию
}else{
 $value = $params['value'];
}
$items = explode(',',$this->getProperty('Items')); //переведем в массив
$items = array_map('trim', $items); //уберём пробелы
foreach($items as $obj){ //переберем объекты
   if(null == getObject($obj)){
       echo('setGroupProperty: obj '.$obj.' not find!<br>');
    }else{
       $obj_prop = $obj.".".$prop; //object.property
       $rec = SQLSelectOne("SELECT * FROM `pvalues` WHERE `PROPERTY_NAME`='".$obj_prop."'");   
       if($rec) {
        sg($obj_prop,$value);
        echo('setGroupProperty: '.$obj_prop.' set to '.$value.'<br>');
       }else{
        echo('setGroupProperty: '.$obj_prop.' not find!<br>');
       }
    }
 }

Метод callGroupMethod - выполнить заданный метод для всех объектов группы.
вызов cm('GroupObject.callGroupMethod',array('mg'=>'methodName'));
пример для нашего объекта - выключить весь свет в доме.
Это будет выглядеть так:
cm('grpLight.callGroupMethod',array('mg'=>'turnOff'));
Ещё пример - наши реле без обратной связи и при отключении света или при остановке и запуске сервера мы хотим, чтобы синхронизировать состояние релюх с сервером:
cm('grpLight.callGroupMethod',array('mg'=>'refresh'));

Код метода класса Groups callGroupMethod:

if(!isset($params['mg']))  return "callGroupMethod: no params";
$mtd = $params['mg'];
$items = explode(',',$this->getProperty('Items')); //переведем в массив
$items = array_map('trim', $items);
foreach($items as $obj){ //переберем имена объектов группы
   if(null == getObject($obj)){
       echo('callGroupMethod: obj '.$obj.' no object <br>');
    }else{
       eval('callMethodSafe("'.$obj.'.'.$mtd.'",array("source" =>"'.$params['ORIGINAL_OBJECT_TITLE'].'"));');
       usleep(50000);
       echo('callGroupMethod: '.$obj.'.'.$mtd.' run <br>');
    }
}
return 'callGroupMethod: grp method done';

Далее стандартные групповые методы AvgGrpProperty/MinGrpProperty/MaxGrpProperty/SumGrpProperty
Они очень похожи. Тут приведу код лишь для среднего. Все методы выложены в приложенном файле Groups.txt (это стандартный экспорт класса со всеми потрохами. Его можно просто импортировать в свою систему штатно через Панель управления/Объекты/Инструменты ) YaDisk

if(!isset($params['property']))  return "no property"; //no param
$prop = $params['property'];
$items = explode(',',$this->getProperty('Items')); //переведем в массив
$items = array_map('trim', $items); //уберём пробелы
if(count($items) == 0) return "no objects";

$obj_prop = "'".implode("','",$items) . "'"; 
$sql = "SELECT avg(`VALUE`+0.0) res FROM `pvalues` p join objects o on o.id=p.`OBJECT_ID` where `PROPERTY_NAME` like '%.".$prop."' and o.title in ($obj_prop) and not p.value is null";
$rec = SQLSelectOne($sql);   
return $rec['res'];

Ну, и ещё пример
Есть у меня группа grpHome, в неё я поместил объекты помещений, расположенных в доме, исключив крыльцо, сад, баню, гараж.
Задача - узнать, есть ли кто-нибудь в доме? Найдём максимальное значение свойства SomebodyHere в доме
$pres = cm('grpHome.MaxGrpProperty',array('property'=>'SomebodyHere'));
Если $pres равняется 0 - в доме никого.

Как тебе такое, Илон Маск?
Какие будут предложения? Стоит ли свеч?

Обсуждение (13) (9)

Смотрите так же:
12.02.2024 Китайская панель в подрозетник с экраном 480*480
29.10.2023 MQTT в МДМ - способ обработки топика через метод
03.04.2023 Todoer: обмен данными с Яндекс календарём
31.03.2023 Todoer: календарь на год
30.03.2023 Todoer: анонс + программное создание задачи
08.05.2022 Глобальный поиск - добавление своих сущностей. Upd Внедрено
05.01.2022 Яндекс Лампочка в Yandex Devices - добавление сцен
18.04.2021 Переезд на мастер спустя год
24.03.2021 Ещё о старте/остановке МДМ в Винде
18.02.2021 Модуль Todoer
06.01.2021 Для виндузятников - перенос бд на рам-диск
22.11.2020 Календарь-планировщик
01.08.2020 Irbis как терминал
18.05.2020 Китайская камера rtsp + vlc как перекодировщик для html
12.05.2020 Опыт интеграции МДМ с Я.Алисой ещё одним способом - без белого адреса, москита, ПУ.(дополнено)
07.05.2020 Поправим формат даты в Панели управления
11.04.2020 Баловство с шаблонами
26.03.2020 Простые правила - вариант модуля. ч. 2
25.03.2020 Простые правила - вариант модуля
20.12.2019 расширение средств работы с events updated
20.11.2019 По следам наших выступлений - сколько мы наэкономили?
26.10.2019 Прикручиваем Grafana к Мажордому
11.10.2019 Группа как объект - экономим на коде
25.09.2019 Если у вас нет телеги...
11.09.2019 Датчик присутствия из ип камеры
30.07.2019 Win-платформа-замена ffmpeg для получения скриншотов из rstp - потока
24.06.2019 Форматированный отчет в телеграм - имитация таблицы
30.04.2019 Используем зомбо-ящик в Мажордомо
24.03.2019 О среднем в Мажордомо
31.10.2018 Об "обделённых" пользователях Win-систем -- с точки зрения кэширования winTTS сообщений
16.09.2018 Перезагрузка Мажордомо в Win-системах

Домодедово, Россия

На форуме: xor