Работа над ошибками
Представляю второе издание объекта Группы - исправленное и доработанное.
Что изменилось? Упрощено хранение перечня объектов в группе - теперь это просто список имён объектов, разделённых запятыми. Правильность внесения имён теперь полностью лежит на пользователе. Вокруг запятых допустимы пробелы для красоты (в обработке они не учитываются). Если имя объекта введено неверно, то такой объект не будет обрабатываться.
Как это выглядит? Рассмотрим пример - есть набор реле в классе Relays. У меня в нём, кроме релюшек, занимающихся светом, есть и такие, которые занимаются другими делами отоплением, водой. Ну и сделаем группу grpLight
, куда добавим объекты, относящиеся только к управлению светом.
Для этого в свойство Items
объекта grpLight
запишем наши объекты noodimmer0,noodimmer1,noorelay0,noorelay1,noorelay2,noorelay3,noorelay4,noorelay5,noorelay6,NooRGB0
см. скриншот
Пока у наших групп есть такие методы:
Метод 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 - в доме никого.
Как тебе такое, Илон Маск?
Какие будут предложения? Стоит ли свеч?
Домодедово, Россия
На форуме: xor