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

Если вы только начинаете осваивать систему MajorDoMo и чего-то не знаете или не можете понять, то задавайте свои вопросы в этой ветке.

Модератор: immortal

DiminatorDK
Сообщения: 104
Зарегистрирован: Сб фев 20, 2016 12:19 pm
Благодарил (а): 7 раз
Поблагодарили: 2 раза

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

Сообщение DiminatorDK » Чт дек 13, 2018 8:14 pm

Гуру, помогите, пожалуйста.
Есть устройство включающее выходы как с помощью хард кнопок так и по 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"? И подскажите как это лучше делать? Как-то периодически считывать весь объем информации или можно считать только определенную позицию?
abc
Сообщения: 34
Зарегистрирован: Ср ноя 07, 2018 3:28 pm
Благодарил (а): 6 раз
Поблагодарили: 4 раза

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

Сообщение 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>";
}
?>
Внутри цикла 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 
DiminatorDK
Сообщения: 104
Зарегистрирован: Сб фев 20, 2016 12:19 pm
Благодарил (а): 7 раз
Поблагодарили: 2 раза

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

Сообщение DiminatorDK » Сб дек 15, 2018 11:22 pm

Спасибо за помощь!

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

И еще вопрос, а как правильно читать и записывать переменные в свойства объекта? Я правильно понимаю что это можно делать как из кода так и из интерфейса?
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

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

Сообщение Chainik » Сб дек 15, 2018 11:52 pm

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/), но новичку (сам такой) без конкретного примера кода тяжело...
DiminatorDK
Сообщения: 104
Зарегистрирован: Сб фев 20, 2016 12:19 pm
Благодарил (а): 7 раз
Поблагодарили: 2 раза

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

Сообщение DiminatorDK » Вс дек 16, 2018 12:24 am

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>";
}
?>
так чтобы не вытаскивать все значения а поймать конкретное и записать его в свойства объекта?
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

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

Сообщение Chainik » Вс дек 16, 2018 12:29 am

Наверное, так

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

<?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" в начале и "?>" в конце указывать не обязательно.
abc
Сообщения: 34
Зарегистрирован: Ср ноя 07, 2018 3:28 pm
Благодарил (а): 6 раз
Поблагодарили: 4 раза

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

Сообщение abc » Пн дек 17, 2018 9:25 am

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

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

Имя_объекта.Имя_свойства - это на ваш выбор. Потом при считывании этого значения из БД напишите то же имя.свойство
gg('Имя_объекта.Имя_свойства');
DiminatorDK
Сообщения: 104
Зарегистрирован: Сб фев 20, 2016 12:19 pm
Благодарил (а): 7 раз
Поблагодарили: 2 раза

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

Сообщение DiminatorDK » Пт дек 21, 2018 12:57 am

Спасибо за помощь! Вроде стало получаться. Но столкнулся с такой проблемой, если я прописываю код явно в методе объекта то все отлично. Я хотел прописать метод на уровне класса и уже ниже создавать объекты (выключатели). Но тут застрял на том что не могу в код добавить динамическое имя объекта. Т.е. класс один, код в классе и в код передать имя объекта для sg('Имя_объекта.Имя_свойства'); Или я что-то перемудрил? Просто не очень хочется дублировать код во все объекты.
Аватара пользователя
xor
Сообщения: 2039
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 286 раз
Поблагодарили: 629 раз

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

Сообщение xor » Пт дек 21, 2018 1:16 am

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); 
DiminatorDK
Сообщения: 104
Зарегистрирован: Сб фев 20, 2016 12:19 pm
Благодарил (а): 7 раз
Поблагодарили: 2 раза

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

Сообщение DiminatorDK » Пт дек 21, 2018 3:17 pm

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

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