Страница 1 из 5

Глупые вопросы новичка

Добавлено: Чт дек 13, 2018 8:14 pm
DiminatorDK
Гуру, помогите, пожалуйста.
Есть устройство включающее выходы как с помощью хард кнопок так и по http. С вашей помощью, в MD я создал кнопку которая переключает выходы url запросами. Однако если хардварно (физически) переключаю выход, в MD кнопка не переключается. У устройства есть ссылка http://IP/state.xml - которая возвращает следующую информацию:
<response>
<systime>25525</systime>
<iotable>1111111111100000000000</iotable>
<iovalue>1111111111100000011000</iovalue>
<adc1>600</adc1>
<adc2>540</adc2>
<adc3>503</adc3>
<adc4>617</adc4>
<count1>1087</count1>
<count2>82</count2>
<count3>422</count3>
<count4>47</count4>
<count_cycle1>0</count_cycle1>
<count_cycle2>0</count_cycle2>
<count_cycle3>0</count_cycle3>
<count_cycle4>0</count_cycle4>
<pwm>0</pwm>
</response>

как я понял <iovalue> это и есть состояние выходных портов. Т.е. 1 это включенный выход а 0 это выключенный. Причем выходы это с 12 по 22 цифры с строке, с 1 по 11 это входы. Подскажите кодом, можно как-то из этой информации вытащить текущее состояние порт(а/ов) и записать его в переменную устройства "Port(12-22)-State"? И подскажите как это лучше делать? Как-то периодически считывать весь объем информации или можно считать только определенную позицию?

Re: Глупые вопросы новичка

Добавлено: Пт дек 14, 2018 3:33 pm
abc
Как-то так:

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

<?php
$status = file_get_contents(' http://IP/state.xml ');

$status = preg_match("!<iovalue>(.*?)</iovalue>!si", $status, $matches);
echo $matches['1'];
foreach (str_split($matches['1']) as $index => $value) {
	echo "Номер выхода " . $index .", значение: " . $value ." <br>";
}
?>
Внутри цикла foreach переделайте под себя. Сейчас он просто напечатает все значения выходов в таком виде

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

Номер выхода 1, значение: 1 
Номер выхода 2, значение: 1 
Номер выхода 3, значение: 1 
Номер выхода 4, значение: 1 
Номер выхода 5, значение: 1 
Номер выхода 6, значение: 1 
Номер выхода 7, значение: 1 
Номер выхода 8, значение: 1 
Номер выхода 9, значение: 1 
Номер выхода 10, значение: 1 
Номер выхода 11, значение: 0 
Номер выхода 12, значение: 0 
Номер выхода 13, значение: 0 
Номер выхода 14, значение: 0 
Номер выхода 15, значение: 0 
Номер выхода 16, значение: 0 
Номер выхода 17, значение: 1 
Номер выхода 18, значение: 1 
Номер выхода 19, значение: 0 
Номер выхода 20, значение: 0 
Номер выхода 21, значение: 0 

Re: Глупые вопросы новичка

Добавлено: Сб дек 15, 2018 11:22 pm
DiminatorDK
Спасибо за помощь!

Подскажите а можно отдельное значение поймать? <iovalue>1111111111100000011000</iovalue> допустим 18 позицию?

И еще вопрос, а как правильно читать и записывать переменные в свойства объекта? Я правильно понимаю что это можно делать как из кода так и из интерфейса?

Re: Глупые вопросы новичка

Добавлено: Сб дек 15, 2018 11:52 pm
Chainik
DiminatorDK писал(а):
Сб дек 15, 2018 11:22 pm
Подскажите а можно отдельное значение поймать? <iovalue>1111111111100000011000</iovalue> допустим 18 позицию?

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

$Val = substr($value,17,1);
if ($Val == "1") {
say("Ура! Поймал!",5);
}
DiminatorDK писал(а):
Сб дек 15, 2018 11:22 pm
И еще вопрос, а как правильно читать и записывать переменные в свойства объекта? Я правильно понимаю что это можно делать как из кода так и из интерфейса?
Записывать свойство элементарно:

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

sg('Имя_объекта.Имя_свойства', Значение_свойства);
Читать тоже:

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

gg('Имя_объекта.Имя_свойства');
Конечно, это можно делать и из интерфейса. Например, при нажатии на кнопку в меню или на сцене запускается такой же код PHP.

Все это написано здесь (https://kb.smartliving.ru/vstroennie-v- ... o-funkcii/), но новичку (сам такой) без конкретного примера кода тяжело...

Re: Глупые вопросы новичка

Добавлено: Вс дек 16, 2018 12:24 am
DiminatorDK
Chainik писал(а):
Сб дек 15, 2018 11:52 pm

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

$Val = substr($value,17,1);
if ($Val == "1") {
say("Ура! Поймал!",5);
}
Простите, я наверное не очень корректно спросил, я имел ввиду что можно доработать в отношении кода который любезно предоставил
abc писал(а):
Пт дек 14, 2018 3:33 pm
Как-то так:

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

<?php
$status = file_get_contents(' http://IP/state.xml ');

$status = preg_match("!<iovalue>(.*?)</iovalue>!si", $status, $matches);
echo $matches['1'];
foreach (str_split($matches['1']) as $index => $value) {
	echo "Номер выхода " . $index .", значение: " . $value ." <br>";
}
?>
так чтобы не вытаскивать все значения а поймать конкретное и записать его в свойства объекта?

Re: Глупые вопросы новичка

Добавлено: Вс дек 16, 2018 12:29 am
Chainik
Наверное, так

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

<?php
$status = file_get_contents(' http://IP/state.xml ');

$status = preg_match("!<iovalue>(.*?)</iovalue>!si", $status, $matches);
echo $matches['1'];
foreach (str_split($matches['1']) as $index => $value) {
	echo "Номер выхода " . $index .", значение: " . $value ." <br>";
$Val = substr($value,17,1);
if ($Val == "1") {
sg('Имя_объекта.Имя_свойства', $Val);}	
}
?>
Единственное, в Мажордомо при написании кода PHP "<?php" в начале и "?>" в конце указывать не обязательно.

Re: Глупые вопросы новичка

Добавлено: Пн дек 17, 2018 9:25 am
abc
Chainik писал(а):
Сб дек 15, 2018 11:52 pm
Подскажите а можно отдельное значение поймать? <iovalue>1111111111100000011000</iovalue> допустим 18 позицию?
Все значения записываются в массив $matches['1']['18']; Во второй квадратной скобке номер значения, который вам нужен. Ставите вместо него, например, цифру 5 и получите 5 по порядку цифру из 11111111111000000

Чтобы записать ее в БД:
sg('Имя_объекта.Имя_свойства', $matches['1']['18'];}

Имя_объекта.Имя_свойства - это на ваш выбор. Потом при считывании этого значения из БД напишите то же имя.свойство
gg('Имя_объекта.Имя_свойства');

Re: Глупые вопросы новичка

Добавлено: Пт дек 21, 2018 12:57 am
DiminatorDK
Спасибо за помощь! Вроде стало получаться. Но столкнулся с такой проблемой, если я прописываю код явно в методе объекта то все отлично. Я хотел прописать метод на уровне класса и уже ниже создавать объекты (выключатели). Но тут застрял на том что не могу в код добавить динамическое имя объекта. Т.е. класс один, код в классе и в код передать имя объекта для sg('Имя_объекта.Имя_свойства'); Или я что-то перемудрил? Просто не очень хочется дублировать код во все объекты.

Re: Глупые вопросы новичка

Добавлено: Пт дек 21, 2018 1:16 am
xor
DiminatorDK писал(а):
Пт дек 21, 2018 12:57 am
... Я хотел прописать метод на уровне класса и уже ниже создавать объекты (выключатели). Но тут застрял на том что не могу в код добавить динамическое имя объекта. Т.е. класс один, код в классе и в код передать имя объекта для sg('Имя_объекта.Имя_свойства'); Или я что-то перемудрил? Просто не очень хочется дублировать код во все объекты.
https://kb.smartliving.ru/vstroennie-v- ... o-funkcii/
$this - ссылка на текущий объект.

$this->object_title; -- Доступ к имени объекта

example

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

$ot=$this->object_title;
$alive_timeout=(int)$this->getProperty("aliveTimeOut");
if (!$alive_timeout) {
 $alive_timeout=15*60;
}
clearTimeOut($ot."_alive");
setTimeOut($ot."_alive","sg('".$ot.".alive',0);",$alive_timeout); 

Re: Глупые вопросы новичка

Добавлено: Пт дек 21, 2018 3:17 pm
DiminatorDK
abc писал(а):
Пн дек 17, 2018 9:25 am
Все значения записываются в массив $matches['1']['18']; Во второй квадратной скобке номер значения, который вам нужен. Ставите вместо него, например, цифру 5 и получите 5 по порядку цифру из 11111111111000000
У меня еще одна трудность возникла, при разборе значений они нумеруются с нуля а порты в устройстве с единицы. Для того чтобы узнать статус порта 12 мне необходимо считывать 11 значение. $matches['1']['11'] Можно как-то изменить начало нумерации массива чтобы получать корректное значение или по умолчанию отнимать единицу от искомого значения?

Не знаю, понятно ли я описал?