Глупые вопросы новичка
Модератор: immortal
-
- Сообщения: 34
- Зарегистрирован: Ср ноя 07, 2018 3:28 pm
- Благодарил (а): 6 раз
- Поблагодарили: 4 раза
Re: Глупые вопросы новичка
Для этого добавим новую переменную $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']; В квадратных скобках нумерация будет от нуля
<?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']; В квадратных скобках нумерация будет от нуля
- Рейтинг: 1.16%
-
- Сообщения: 104
- Зарегистрирован: Сб фев 20, 2016 12:19 pm
- Благодарил (а): 7 раз
- Поблагодарили: 2 раза
Re: Глупые вопросы новичка
Как-то частично получилось. Вот такой код у меня получился:
Вот такой результат получаю:
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 сек и сразу записывать статусы из массива в объекты? Подскажите, как корректнее сделать?
Код: Выделить всё
$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 сек и сразу записывать статусы из массива в объекты? Подскажите, как корректнее сделать?
-
- Сообщения: 1465
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 262 раза
- Поблагодарили: 455 раз
Re: Глупые вопросы новичка
Вы бы пояснили по схеме работы, каким образом у вас вообще может осуществляться переключение выходов и сообщается ли об этом на сервер?
Поясню, почему спрашиваю. Например, в контроллерах МегаД основными вариантами, по которым могут переключаться выходы являются такие:
1. Срабатывание физической кнопки (входа), при этом контроллер запускает скрипт на сервере и, соответственно, не составляет труда переключить статусы элементов, отражающих состояние выхода.
2. Переключение по командам сервера УД из скриптов, методов, по клику по соответствующим элементам управления (кнопкам, выключателям в меню, на сцене и т.д.). Т.е. в этом случае сервер тоже все "знает" о состоявшемся событии и никакого труда не составляет привести к актуальному состоянию связанные элементы в интерфейсе.
У вас выходы переключаются "без ведома" сервера? Если это действительно так, то тогда без периодического опроса не обойтись.
Поясню, почему спрашиваю. Например, в контроллерах МегаД основными вариантами, по которым могут переключаться выходы являются такие:
1. Срабатывание физической кнопки (входа), при этом контроллер запускает скрипт на сервере и, соответственно, не составляет труда переключить статусы элементов, отражающих состояние выхода.
2. Переключение по командам сервера УД из скриптов, методов, по клику по соответствующим элементам управления (кнопкам, выключателям в меню, на сцене и т.д.). Т.е. в этом случае сервер тоже все "знает" о состоявшемся событии и никакого труда не составляет привести к актуальному состоянию связанные элементы в интерфейсе.
У вас выходы переключаются "без ведома" сервера? Если это действительно так, то тогда без периодического опроса не обойтись.
-
- Сообщения: 8
- Зарегистрирован: Пт фев 19, 2016 11:28 pm
- Благодарил (а): 3 раза
- Поблагодарили: 0
Re: Глупые вопросы новичка
Да, к сожалению, мое устройство так не умеет. Статусы я могу узнать только запросом.
Вот и задумался а как правильно сделать? Если опрашивать , допустим раз в 10 сек, понятно что это криво, но другого выхода просто нет, то как понять какие объекты и их свойства обновлять? И.е. какую переменную прописывать в цикле чтобы обновить свойства объектов?
Отправлено с моего ZB602KL через Tapatalk
Вот и задумался а как правильно сделать? Если опрашивать , допустим раз в 10 сек, понятно что это криво, но другого выхода просто нет, то как понять какие объекты и их свойства обновлять? И.е. какую переменную прописывать в цикле чтобы обновить свойства объектов?
Отправлено с моего ZB602KL через Tapatalk
-
- Сообщения: 1465
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 262 раза
- Поблагодарили: 455 раз
Re: Глупые вопросы новичка
А как у вас Объекты и Свойства будут называться, куда значения надо писать? Ведь к ним мы обращаемся по имени.Diminator писал(а): ↑Сб дек 22, 2018 8:16 pmДа, к сожалению, мое устройство так не умеет. Статусы я могу узнать только запросом.
Вот и задумался а как правильно сделать? Если опрашивать , допустим раз в 10 сек, понятно что это криво, но другого выхода просто нет, то как понять какие объекты и их свойства обновлять? И.е. какую переменную прописывать в цикле чтобы обновить свойства объектов?
Отправлено с моего ZB602KL через Tapatalk
Если там будет какая-то логика с именами объектов, то, думаю, примерно так (в цикле):
Код: Выделить всё
foreach ($arr as $index => $value) {
echo "Номер выхода- " . $index .", значение: " . $value ." <br>";
sg('"Output_".$index.".Status"',$value);
}
Увы, в вашем случае я тоже не вижу других вариантов, кроме периодического опроса всех выходов сразу. Ведь никто не знает, когда именно переключится какой-то из них.
А узнать состояние конкретного выхода у вас уже получается.
Код: Выделить всё
//...
echo "Position 12= ". $matches['1']['12'] ." <br>";
sg('Output_12.Status',$matches['1']['12']);
-
- Сообщения: 104
- Зарегистрирован: Сб фев 20, 2016 12:19 pm
- Благодарил (а): 7 раз
- Поблагодарили: 2 раза
Re: Глупые вопросы новичка
Спасибо что помогаете!
Если я правильно понял вашу идею, я называют свои объекты стандартизировано, допустим module1.relay12 и до module1.relay22, поле Status
Далее в цикле перебираю все значения и так-же циклом их назначаю по объектам
Если я вас верно понял и главное правильно сложил код, помогите еще разобраться с нумерацией. Сейчас получается что $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 позиции
Если я правильно понял вашу идею, я называют свои объекты стандартизировано, допустим 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);
}
Сейчас результат следующий:
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 позиции

-
- Сообщения: 1465
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 262 раза
- Поблагодарили: 455 раз
Re: Глупые вопросы новичка
Да, идею вы поняли абсолютно правильно. С синтаксисом не уверен, поскольку раньше никогда не имел дела с массивами. Возможно так.
Код: Выделить всё
$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);
}
-
- Сообщения: 104
- Зарегистрирован: Сб фев 20, 2016 12:19 pm
- Благодарил (а): 7 раз
- Поблагодарили: 2 раза
-
- Сообщения: 1465
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 262 раза
- Поблагодарили: 455 раз
Re: Глупые вопросы новичка
Ну тогда можно попробовать "извернуться" так:
Код: Выделить всё
//....
foreach ($arr as $index => $value) {
if ($index >= 12) {
sg ('"module1.relay".$index.".Status"',$value); }
}
-
- Сообщения: 104
- Зарегистрирован: Сб фев 20, 2016 12:19 pm
- Благодарил (а): 7 раз
- Поблагодарили: 2 раза
Re: Глупые вопросы новичка
Спасибо! Помогло! Осталось с нумерацией индекса разобраться и как-то прибавить к нему единицу
Мне кажется надо ввести отдельную переменную к которой будет прибавляться единица. Что-то типа а=12 а потом в цикле а=а+1. Если такое возможно.
