Глупые вопросы новичка
Модератор: immortal
-
- Сообщения: 104
- Зарегистрирован: Сб фев 20, 2016 12:19 pm
- Благодарил (а): 7 раз
- Поблагодарили: 2 раза
Глупые вопросы новичка
Гуру, помогите, пожалуйста.
Есть устройство включающее выходы как с помощью хард кнопок так и по 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"? И подскажите как это лучше делать? Как-то периодически считывать весь объем информации или можно считать только определенную позицию?
Есть устройство включающее выходы как с помощью хард кнопок так и по 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"? И подскажите как это лучше делать? Как-то периодически считывать весь объем информации или можно считать только определенную позицию?
-
- Сообщения: 34
- Зарегистрирован: Ср ноя 07, 2018 3:28 pm
- Благодарил (а): 6 раз
- Поблагодарили: 4 раза
Re: Глупые вопросы новичка
Как-то так:
Внутри цикла foreach переделайте под себя. Сейчас он просто напечатает все значения выходов в таком виде
Код: Выделить всё
<?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>";
}
?>
Код: Выделить всё
Номер выхода 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
-
- Сообщения: 104
- Зарегистрирован: Сб фев 20, 2016 12:19 pm
- Благодарил (а): 7 раз
- Поблагодарили: 2 раза
Re: Глупые вопросы новичка
Спасибо за помощь!
Подскажите а можно отдельное значение поймать? <iovalue>1111111111100000011000</iovalue> допустим 18 позицию?
И еще вопрос, а как правильно читать и записывать переменные в свойства объекта? Я правильно понимаю что это можно делать как из кода так и из интерфейса?
Подскажите а можно отдельное значение поймать? <iovalue>1111111111100000011000</iovalue> допустим 18 позицию?
И еще вопрос, а как правильно читать и записывать переменные в свойства объекта? Я правильно понимаю что это можно делать как из кода так и из интерфейса?
-
- Сообщения: 1462
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 260 раз
- Поблагодарили: 454 раза
Re: Глупые вопросы новичка
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('Имя_объекта.Имя_свойства');
Все это написано здесь (https://kb.smartliving.ru/vstroennie-v- ... o-funkcii/), но новичку (сам такой) без конкретного примера кода тяжело...
-
- Сообщения: 104
- Зарегистрирован: Сб фев 20, 2016 12:19 pm
- Благодарил (а): 7 раз
- Поблагодарили: 2 раза
Re: Глупые вопросы новичка
Простите, я наверное не очень корректно спросил, я имел ввиду что можно доработать в отношении кода который любезно предоставил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>"; } ?>
-
- Сообщения: 1462
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 260 раз
- Поблагодарили: 454 раза
Re: Глупые вопросы новичка
Наверное, так
Единственное, в Мажордомо при написании кода PHP "<?php" в начале и "?>" в конце указывать не обязательно.
Код: Выделить всё
<?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);}
}
?>
-
- Сообщения: 34
- Зарегистрирован: Ср ноя 07, 2018 3:28 pm
- Благодарил (а): 6 раз
- Поблагодарили: 4 раза
Re: Глупые вопросы новичка
Все значения записываются в массив $matches['1']['18']; Во второй квадратной скобке номер значения, который вам нужен. Ставите вместо него, например, цифру 5 и получите 5 по порядку цифру из 11111111111000000
Чтобы записать ее в БД:
sg('Имя_объекта.Имя_свойства', $matches['1']['18'];}
Имя_объекта.Имя_свойства - это на ваш выбор. Потом при считывании этого значения из БД напишите то же имя.свойство
gg('Имя_объекта.Имя_свойства');
-
- Сообщения: 104
- Зарегистрирован: Сб фев 20, 2016 12:19 pm
- Благодарил (а): 7 раз
- Поблагодарили: 2 раза
Re: Глупые вопросы новичка
Спасибо за помощь! Вроде стало получаться. Но столкнулся с такой проблемой, если я прописываю код явно в методе объекта то все отлично. Я хотел прописать метод на уровне класса и уже ниже создавать объекты (выключатели). Но тут застрял на том что не могу в код добавить динамическое имя объекта. Т.е. класс один, код в классе и в код передать имя объекта для sg('Имя_объекта.Имя_свойства'); Или я что-то перемудрил? Просто не очень хочется дублировать код во все объекты.
- xor
- Сообщения: 2039
- Зарегистрирован: Сб ноя 22, 2014 8:45 pm
- Благодарил (а): 286 раз
- Поблагодарили: 629 раз
Re: Глупые вопросы новичка
https://kb.smartliving.ru/vstroennie-v- ... o-funkcii/DiminatorDK писал(а): ↑Пт дек 21, 2018 12:57 am... Я хотел прописать метод на уровне класса и уже ниже создавать объекты (выключатели). Но тут застрял на том что не могу в код добавить динамическое имя объекта. Т.е. класс один, код в классе и в код передать имя объекта для sg('Имя_объекта.Имя_свойства'); Или я что-то перемудрил? Просто не очень хочется дублировать код во все объекты.
$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);
win10 connect https://connect.smartliving.ru/profile/303
-
- Сообщения: 104
- Зарегистрирован: Сб фев 20, 2016 12:19 pm
- Благодарил (а): 7 раз
- Поблагодарили: 2 раза
Re: Глупые вопросы новичка
У меня еще одна трудность возникла, при разборе значений они нумеруются с нуля а порты в устройстве с единицы. Для того чтобы узнать статус порта 12 мне необходимо считывать 11 значение. $matches['1']['11'] Можно как-то изменить начало нумерации массива чтобы получать корректное значение или по умолчанию отнимать единицу от искомого значения?
Не знаю, понятно ли я описал?