Страница 3 из 4
Re: Не могу освоить перебор объектов по классу
Добавлено: Чт мар 05, 2020 12:18 pm
Logrus
IrisKo писал(а): Чт мар 05, 2020 11:11 am
Не совсем то. У меня сейчас в комнатах когда надо выключить весь свет запускается метод этой комнаты где я все лампочки перечисляю по имени и каждую выключаю, типо:
Код: Выделить всё
if(gg('lamp1.status')==1){
CallMethod('lamp1.turnOff');
}
if(gg('lamp2.status')==1){
CallMethod('lamp2.turnOff');
....
и так далее.
И когда появляется новая лампочка которую тоже надо выключать я лезу и редактирую этот метод - добавляю туда эту новую лампочку. А хотелось бы как то изящнее и автоматичнее чтоб все что есть в комнате выключилось если оно включено - какую то универсальную конструкцию что ли
упростите свой код, вместо него массив об!ектов
а в цикле то о чем писал выше только с проверкой состояния, ну сделайте еще массив с нотификацией и в сай
Re: Не могу освоить перебор объектов по классу
Добавлено: Чт мар 05, 2020 5:46 pm
xor
Chainik писал(а):IrisKo писал(а): Чт мар 05, 2020 11:11 am
Не совсем то. У меня сейчас в комнатах когда надо выключить весь свет запускается метод этой комнаты где я все лампочки перечисляю по имени и каждую выключаю, типо:
Код: Выделить всё
if(gg('lamp1.status')==1){
CallMethod('lamp1.turnOff');
}
if(gg('lamp2.status')==1){
CallMethod('lamp2.turnOff');
....
и так далее.
И когда появляется новая лампочка которую тоже надо выключать я лезу и редактирую этот метод - добавляю туда эту новую лампочку. А хотелось бы как то изящнее и автоматичнее чтоб все что есть в комнате выключилось если оно включено - какую то универсальную конструкцию что ли
Добавьте к лампочке свойство "Room", или вроде того (если еще не добавляли). А потом при переборе объектов по классу проверяйте это свойство.
Естественно, когда будете запускать метод по перебору, надо будет туда передать нужный параметр ("Room"):
viewtopic.php?f=19&t=4291&start=11
viewtopic.php?f=19&t=4291&start=16
Еще, на мой взгляд, не надо проверять текущее состояние лампочек. Надо просто давать команду на выключение всем лампочкам, расположенным в одном помещении.
А зачем новое свойство? У объектов же есть локейшен уже?
Отправлено с моего Redmi 4X через Tapatalk
Re: Не могу освоить перебор объектов по классу
Добавлено: Чт мар 05, 2020 5:50 pm
Chainik
xor писал(а): Чт мар 05, 2020 5:46 pm
...
А зачем новое свойство? У объектов же есть локейшен уже?
Если уже есть свойство для привязки к помещению, тогда, конечно, новое свойство не нужно.
Re: Не могу освоить перебор объектов по классу
Добавлено: Чт мар 05, 2020 5:57 pm
xor
Chainik писал(а):xor писал(а): Чт мар 05, 2020 5:46 pm
...
А зачем новое свойство? У объектов же есть локейшен уже?
Если уже есть свойство для привязки к помещению, тогда, конечно, новое свойство не нужно.
Это общее свойство у всех объектов, наряду с дескрипшен, тайтлом и айди
У некоторых есть ещё и линкед_рум
Отправлено с моего Redmi 4X через Tapatalk
Re: Не могу освоить перебор объектов по классу
Добавлено: Сб мар 07, 2020 11:51 am
Logrus
Logrus писал(а): Чт мар 05, 2020 12:18 pm
IrisKo писал(а): Чт мар 05, 2020 11:11 am
Не совсем то. У меня сейчас в комнатах когда надо выключить весь свет запускается метод этой комнаты где я все лампочки перечисляю по имени и каждую выключаю, типо:
Код: Выделить всё
if(gg('lamp1.status')==1){
CallMethod('lamp1.turnOff');
}
if(gg('lamp2.status')==1){
CallMethod('lamp2.turnOff');
....
и так далее.
И когда появляется новая лампочка которую тоже надо выключать я лезу и редактирую этот метод - добавляю туда эту новую лампочку. А хотелось бы как то изящнее и автоматичнее чтоб все что есть в комнате выключилось если оно включено - какую то универсальную конструкцию что ли
упростите свой код, вместо него массив об!ектов
а в цикле то о чем писал выше только с проверкой состояния, ну сделайте еще массив с нотификацией и в сай
Код: Выделить всё
//задаем массив проверяемых объектов
$objects = array('SRelay06',
'SRelay09',
'SRelay19',
'SRelay22',
'SRelay23');
//если никого нет, то добавим
$nomeMode = getGlobal('NobodyHomeMode.active');
if ($nomeMode == 1) {
array_push($objects, 'SRelay10', 'SRelay18');
}
//перебираем объекты и если включен - отключаем и формируем сообщение
foreach($objects as $obj) {
if (getGlobal($obj . '.status')) {
usleep(50000);
callMethodSafe($obj . '.turnOff');
$details[] = getObject($obj)->description;
}
}
//если есть сообщение - пишем в чат
if (isset($details)) {
$new_details = implode(', ', $details);
say('Выключила: ' . $new_details);
}
п.с. это к формату темы, но метод ксора с этим тоже можно скрестить, параметры нужны

Re: Не могу освоить перебор объектов по классу
Добавлено: Вт янв 26, 2021 2:12 pm
andrusha7778
Добрый день.
Господа, может кто-нибудь пояснить такой момент, почему данный код отрабатывает:
Код: Выделить всё
$Thermostats=getObjectsByClass('SZWaveThermostats');
foreach($Thermostats as $ObjTherm) {
$ThermCurrTemp=getGlobal($ObjTherm['TITLE'] . '.ZwaveThermCurrentTemp');
...
}
то есть getGlobal работает правильно и переменная ThermCurrTemp получает значение запрашиваемого свойства объекта , ну а если я пытаюсь использовать getProperty объекта ObjTherm - скрипт просто перестает выполняться?
Код: Выделить всё
$ThermCurrTemp=$ObjTherm->getProperty('ZwaveThermCurrentTemp');
say('Температура: ' . $ThermBatt);
То есть даже до say не доходит.
Или возвращается другой объект по getObject?
А такая конструкция работает:
Код: Выделить всё
$ThermNmae=$ObjTherm['TITLE'];
$obj=getObject($ThermNmae);
$ThermCurrTemp=$obj->getProperty('ZwaveThermCurrentTemp');
say('Температура ' . $ThermCurrTemp);
Re: Не могу освоить перебор объектов по классу
Добавлено: Вт янв 26, 2021 2:35 pm
Chainik
andrusha7778 писал(а): Вт янв 26, 2021 2:12 pm
... ну а если я пытаюсь использовать getProperty объекта ObjTherm - скрипт просто перестает выполняться?
Код: Выделить всё
$ThermCurrTemp=$ObjTherm->getProperty('ZwaveThermCurrentTemp');
say('Температура: ' . $ThermBatt);
То есть даже до say не доходит.
Видимо, система не получает "координаты" объекта, т.к. синтаксис неверный. Доступ к свойству объекта осуществляется через "глобальный" запрос:
Код: Выделить всё
$ThermCurrTemp=getGlobal('ObjTherm.ZwaveThermCurrentTemp');
либо, если выполняется метод текущего объекта, через конструкцию this->:
Код: Выделить всё
$ThermCurrTemp=$this->getProperty('ZwaveThermCurrentTemp');
Re: Не могу освоить перебор объектов по классу
Добавлено: Вт янв 26, 2021 4:03 pm
andrusha7778
Видимо действительно, объекты разные.
По GetObjectsByClass должен возвращаться массив.
Есть ли какой-нибудь способ как-то вывести отладку, тот же echo? Или просто воспользоваться выводом информации в файл?
Хочу попробовать стандартными средствами php вывести полученный массив, посомтреть как он выглядит.
Написал такую конструкцию:
Код: Выделить всё
$Thermostats=getObjectsByClass('SZWaveThermostats');
foreach($Thermostats as $ObjTherm) {
$ThermNmae=$ObjTherm['TITLE'];
...
$data = serialize($ObjTherm);
file_put_contents('array_szwavethermostats.txt-' . $ObjTherm['TITLE'] , $data);
}
$data = serialize($Thermostats);
file_put_contents('array_szwavethermostats.txt', $data);
Вот содержимое файла array_szwavethermostats.txt':
Код: Выделить всё
a:4:{i:0;a:2:{s:2:"ID";s:3:"183";s:5:"TITLE";s:9:"ThermZal1";}i:1;a:2:{s:2:"ID";s:3:"184";s:5:"TITLE";s:9:"ThermZal2";}i:2;a:2:{s:2:"ID";s:3:"186";s:5:"TITLE";s:18:"ThermBedroom2Floor";}i:3;a:2:{s:2:"ID";s:3:"188";s:5:"TITLE";s:12:"ThermKitchen";}}
А вот одного из объектов:
Код: Выделить всё
a:2:{s:2:"ID";s:3:"183";s:5:"TITLE";s:9:"ThermZal1";}
Поменял на json_encode стало более читаемое
Объекты вроде одинаковые же
Код: Выделить всё
[{"ID":"183","TITLE":"ThermZal1"},{"ID":"184","TITLE":"ThermZal2"},{"ID":"186","TITLE":"ThermBedroom2Floor"},{"ID":"188","TITLE":"ThermKitchen"}]
и
Re: Не могу освоить перебор объектов по классу
Добавлено: Ср янв 27, 2021 2:17 am
xor
там неудачно функция названа(
у меня так работает отладка по примеру вашего кода:
Код: Выделить всё
$Thermostats=getObjectsByClass('NooThermostats');
echo('getObjectsByClass:<br>');
echo'<pre>';
print_r($Thermostats);
echo'<pre>';
foreach($Thermostats as $ObjTherm) {
echo('$ObjTherm:<br>');
echo'<pre>';
print_r($ObjTherm);
echo'<pre>';
echo('getObject:<br>');
echo'<pre>';
print_r(getObject($ObjTherm['TITLE']));
echo'<pre>';
$ThermCurrTemp=getGlobal($ObjTherm['TITLE'] . '.temp');
echo($ThermCurrTemp.'<br>');
echo'-----------------------------<br>';
$ThermCurrTemp=getObject($ObjTherm['TITLE'])->getProperty('temp');
echo($ThermCurrTemp.'<br>');
}
а вот вывод
Код: Выделить всё
getObjectsByClass:
Array
(
[0] => Array
(
[ID] => 403
[TITLE] => Thermo_0
)
[1] => Array
(
[ID] => 439
[TITLE] => Thermo_1
)
)
$ObjTherm:
Array
(
[ID] => 403
[TITLE] => Thermo_0
)
getObject:
objects Object
(
[name] => objects
[data] =>
[instance] =>
[template] =>
[result] =>
[owner] =>
[config] =>
[title] => <#LANG_MODULE_OBJECT_INSTANCES#>
[module_category] => <#LANG_SECTION_OBJECTS#>
[id] => 403
[object_title] => Thermo_0
[class_id] => 114
[class_title] => NooThermostats
[description] => Термостат 0
[location_id] => 5
...
Re: Не могу освоить перебор объектов по классу
Добавлено: Ср янв 27, 2021 4:08 am
Logrus
andrusha7778 писал(а): Вт янв 26, 2021 4:03 pm
Видимо действительно, объекты разные.
По GetObjectsByClass должен возвращаться массив.
getObjectsByClass возвращает не массив объектов, а массив их TITLE, юзать это как у вас не верно