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

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

Модератор: immortal

abc
Сообщения: 34
Зарегистрирован: Ср ноя 07, 2018 3:28 pm
Благодарил (а): 6 раз
Поблагодарили: 4 раза

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

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

Для этого добавим новую переменную $arr, в foreach будем обрабатывать ее. Теперь нумерация будет с нуля

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

$status = preg_match("!<iovalue>(.*?)</iovalue>!si", $status, $matches);

$arr = str_split($matches['1']);

foreach ($arr as $index => $value) {
echo "Номер выхода " . $index .", значение: " . $value ." <br>";
}
?>

При обращении к нужному значению вместо $matches['1']['18'] нужно будет писать $arr['1']; В квадратных скобках нумерация будет от нуля
За это сообщение автора abc поблагодарил:
Diminator (Пт дек 21, 2018 6:37 pm)
Рейтинг: 1.16%
DiminatorDK
Сообщения: 104
Зарегистрирован: Сб фев 20, 2016 12:19 pm
Благодарил (а): 7 раз
Поблагодарили: 2 раза

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

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

Как-то частично получилось. Вот такой код у меня получился:

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

$status = file_get_contents('http://192.168.1.21/state.xml');
$ot=$this->object_title;

$status = preg_match("!<iovalue>(.*?)</iovalue>!si", $status, $matches);
$arr = str_split($matches['1']);
echo "Array:". $matches['1'] ." <br>";
echo "ObjectName:". $ot ." <br>";
echo "Position 12= ". $matches['1']['12'] ." <br>";
echo "Arr position 12= ". $arr['1'] ." <br>";

foreach ($arr as $index => $value) {
echo "Номер выхода- " . $index .", значение: " . $value ." <br>";
}
Вот такой результат получаю:
Array:1111111111110000011010
ObjectName:KitchenTable
Matches position 12:0
Matches position 12 arr:1
Номер выхода- 0, значение: 1
Номер выхода- 1, значение: 1
Номер выхода- 2, значение: 1
Номер выхода- 3, значение: 1
Номер выхода- 4, значение: 1
Номер выхода- 5, значение: 1
Номер выхода- 6, значение: 1
Номер выхода- 7, значение: 1
Номер выхода- 8, значение: 1
Номер выхода- 9, значение: 1
Номер выхода- 10, значение: 1
Номер выхода- 11, значение: 1
Номер выхода- 12, значение: 0
Номер выхода- 13, значение: 0
Номер выхода- 14, значение: 0
Номер выхода- 15, значение: 0
Номер выхода- 16, значение: 0
Номер выхода- 17, значение: 1
Номер выхода- 18, значение: 1
Номер выхода- 19, значение: 0
Номер выхода- 20, значение: 1
Номер выхода- 21, значение: 0

Если обращаюсь к переменной arr по результат удовлетворительный. Однако в цикле значения смещены, т.е. нумерация выходов идет с 0 а не единицы.

Я честно говоря не очень понимаю в правильном ли направлении двигаюсь. Я хотел использовать данный код для считывания статуса данных с устройства по состоянию поротов от 12 до 22 (это выходы). И что-то я запутался, так как считывать состояние отдельного порта, я так понимаю, не имеет особого смысла, вернее я думал что данный функционал можно привязать непосредственно к кнопке на сцене чтобы при изменении физического статуса изменился и статус кнопки на сцене. Однако сейчас понял что объект кнопка не может самостоятельно отслеживать статус. Я правильно понимаю? И как мне кажется правильнее как-то собирать информацию с периодичностью допустим 3 сек и сразу записывать статусы из массива в объекты? Подскажите, как корректнее сделать?
Chainik
Сообщения: 1465
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 262 раза
Поблагодарили: 455 раз

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

Сообщение Chainik » Сб дек 22, 2018 5:31 pm

Вы бы пояснили по схеме работы, каким образом у вас вообще может осуществляться переключение выходов и сообщается ли об этом на сервер?

Поясню, почему спрашиваю. Например, в контроллерах МегаД основными вариантами, по которым могут переключаться выходы являются такие:
1. Срабатывание физической кнопки (входа), при этом контроллер запускает скрипт на сервере и, соответственно, не составляет труда переключить статусы элементов, отражающих состояние выхода.
2. Переключение по командам сервера УД из скриптов, методов, по клику по соответствующим элементам управления (кнопкам, выключателям в меню, на сцене и т.д.). Т.е. в этом случае сервер тоже все "знает" о состоявшемся событии и никакого труда не составляет привести к актуальному состоянию связанные элементы в интерфейсе.

У вас выходы переключаются "без ведома" сервера? Если это действительно так, то тогда без периодического опроса не обойтись.
Diminator
Сообщения: 8
Зарегистрирован: Пт фев 19, 2016 11:28 pm
Благодарил (а): 3 раза
Поблагодарили: 0

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

Сообщение Diminator » Сб дек 22, 2018 8:16 pm

Да, к сожалению, мое устройство так не умеет. Статусы я могу узнать только запросом.
Вот и задумался а как правильно сделать? Если опрашивать , допустим раз в 10 сек, понятно что это криво, но другого выхода просто нет, то как понять какие объекты и их свойства обновлять? И.е. какую переменную прописывать в цикле чтобы обновить свойства объектов?

Отправлено с моего ZB602KL через Tapatalk

Chainik
Сообщения: 1465
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 262 раза
Поблагодарили: 455 раз

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

Сообщение Chainik » Сб дек 22, 2018 10:58 pm

Diminator писал(а):
Сб дек 22, 2018 8:16 pm
Да, к сожалению, мое устройство так не умеет. Статусы я могу узнать только запросом.
Вот и задумался а как правильно сделать? Если опрашивать , допустим раз в 10 сек, понятно что это криво, но другого выхода просто нет, то как понять какие объекты и их свойства обновлять? И.е. какую переменную прописывать в цикле чтобы обновить свойства объектов?

Отправлено с моего ZB602KL через Tapatalk
А как у вас Объекты и Свойства будут называться, куда значения надо писать? Ведь к ним мы обращаемся по имени.
Если там будет какая-то логика с именами объектов, то, думаю, примерно так (в цикле):

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

foreach ($arr as $index => $value) {
echo "Номер выхода- " . $index .", значение: " . $value ." <br>";
sg('"Output_".$index.".Status"',$value);
}
Если я не ошибся с синтаксисом, то в свойства "Status" объектов "Output_1", "Output_2", "Output_3" и т.д. будут записываться значения актуальных состояний.
Увы, в вашем случае я тоже не вижу других вариантов, кроме периодического опроса всех выходов сразу. Ведь никто не знает, когда именно переключится какой-то из них.
А узнать состояние конкретного выхода у вас уже получается.

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

//...
echo "Position 12= ". $matches['1']['12'] ." <br>";
sg('Output_12.Status',$matches['1']['12']);
DiminatorDK
Сообщения: 104
Зарегистрирован: Сб фев 20, 2016 12:19 pm
Благодарил (а): 7 раз
Поблагодарили: 2 раза

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

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

Спасибо что помогаете!
Если я правильно понял вашу идею, я называют свои объекты стандартизировано, допустим module1.relay12 и до module1.relay22, поле Status
Далее в цикле перебираю все значения и так-же циклом их назначаю по объектам

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

$status = file_get_contents('http://192.168.1.21/state.xml');
$ot=$this->object_title;

$status = preg_match("!<iovalue>(.*?)</iovalue>!si", $status, $matches);
$arr = str_split($matches['1']);

echo "Array:". $matches['1'] ." <br>";
echo "ObjectName:". $ot ." <br>";
echo "Position 12= ". $matches['1']['12'] ." <br>";
echo "Arr position 12= ". $arr['1'] ." <br>";

foreach ($arr as $index => $value) {

sg ('"module1.relay".$index.".Status"',$value);

}
Если я вас верно понял и главное правильно сложил код, помогите еще разобраться с нумерацией. Сейчас получается что $index стартует с 0 а не с единицы, соответственно и нумерация выводов начинается с нуля а должна с единицы. Можно ли как-то обозначить что $index начинается с единицы? И еще вопрос, можно также начать обработку массива строки с 12 позиции по 22-ю? Первые 11 значений не нужны, это входы и в работе они не участвуют.

Сейчас результат следующий:
module1.relay0.Status1
module1.relay1.Status1
module1.relay2.Status1
module1.relay3.Status1
module1.relay4.Status1
module1.relay5.Status1
module1.relay6.Status1
module1.relay7.Status1
module1.relay8.Status1
module1.relay9.Status1
module1.relay10.Status1
module1.relay11.Status1
module1.relay12.Status0
module1.relay13.Status0
module1.relay14.Status0
module1.relay15.Status0
module1.relay16.Status0
module1.relay17.Status0
module1.relay18.Status0
module1.relay19.Status0
module1.relay20.Status0
module1.relay21.Status0

А нужно чтобы начиналось с module1.relay1.StatusХ и заканчивалось module1.relay22.StatusХ и по возможности с 12 позиции :)
Chainik
Сообщения: 1465
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 262 раза
Поблагодарили: 455 раз

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

Сообщение Chainik » Вс дек 23, 2018 1:13 am

Да, идею вы поняли абсолютно правильно. С синтаксисом не уверен, поскольку раньше никогда не имел дела с массивами. Возможно так.

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

$status = file_get_contents('http://192.168.1.21/state.xml');
$ot=$this->object_title;

$status = preg_match("!<iovalue>(.*?)</iovalue>!si", $status, $matches);
$arr = str_split($matches['1']);

echo "Array:". $matches['1'] ." <br>";
echo "ObjectName:". $ot ." <br>";
echo "Position 12= ". $matches['1']['12'] ." <br>";
echo "Arr position 12= ". $arr['1'] ." <br>";

foreach ($arr+12 as $index => $value) {
//или может быть так
//foreach ($arr as $index+12 => $value) {
sg ('"module1.relay".$index.".Status"',$value);
}
DiminatorDK
Сообщения: 104
Зарегистрирован: Сб фев 20, 2016 12:19 pm
Благодарил (а): 7 раз
Поблагодарили: 2 раза

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

Сообщение DiminatorDK » Вс дек 23, 2018 1:17 am

Пробовал, но к сожалению, не получается :(
Chainik
Сообщения: 1465
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 262 раза
Поблагодарили: 455 раз

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

Сообщение Chainik » Вс дек 23, 2018 1:41 pm

Ну тогда можно попробовать "извернуться" так:

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

//....
foreach ($arr as $index => $value) {
if ($index >= 12) {
sg ('"module1.relay".$index.".Status"',$value); }
}
DiminatorDK
Сообщения: 104
Зарегистрирован: Сб фев 20, 2016 12:19 pm
Благодарил (а): 7 раз
Поблагодарили: 2 раза

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

Сообщение DiminatorDK » Вс дек 23, 2018 2:57 pm

Спасибо! Помогло! Осталось с нумерацией индекса разобраться и как-то прибавить к нему единицу :) Мне кажется надо ввести отдельную переменную к которой будет прибавляться единица. Что-то типа а=12 а потом в цикле а=а+1. Если такое возможно.
Ответить