Страница 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"}]
и

Код: Выделить всё

{"ID":"183","TITLE":"ThermZal1"}

Re: Не могу освоить перебор объектов по классу

Добавлено: Ср янв 27, 2021 2:17 am
xor
andrusha7778 писал(а): Вт янв 26, 2021 4:03 pm ...
там неудачно функция названа(
у меня так работает отладка по примеру вашего кода:

Код: Выделить всё

$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, юзать это как у вас не верно