Как принять / послать данные через http

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

Модератор: immortal

Qdesnikmak
Сообщения: 34
Зарегистрирован: Ср июл 22, 2020 1:30 pm
Благодарил (а): 6 раз
Поблагодарили: 1 раз

Как принять / послать данные через http

Сообщение Qdesnikmak » Вс июл 26, 2020 8:22 am

Доброго времени суток. Читал-Читал мануалы - ничего не понял. Ситуация следующая. Есть погодная станция которая при обращении по адресу http://ip_adress/getinfo возвращает 3 значения через пробел температура, влажность, давление. Как его получить на экране/ в системе?
Также есть wi-fi выключатели, которые при обращении по http://ip_adress/CtrlPinOn или включает / выключает освещение. Как посылать такие сигналы и привязать их к системе? Понимаю что должен быть какой то Get-запрос, но где его писать???
Orange Pi Lite + Armbian + MJD Majordomo пока на стадии изучения...
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: Как принять / послать данные через http

Сообщение Chainik » Вс июл 26, 2020 10:14 am

По погодной станции вам надо сделать несколько вещей.
1. Создать объект.свойства, куда будут сохраняться полученные от станции значения.
Например, создаете в ОБЪЕКТах новый класс (Панель управления --> Объекты--> Объекты), назвав его как угодно.
В созданном классе заводите новые свойства (например, "Temp, "Hum", "Press"). Если вам потом потребуется рисовать графики или как-то ретроспективно отслеживать параметры со станции, то у свойств надо включить историю (установить значение "Хранить историю дней" больше "0").
Также в новом классе создаете новый объект для погодный станции (пусть, к примеру, называется "WeatherStation").

2. Написать код, с помощью которого будут получаться выдаваемые погодной станцией параметры и сохраняться в наши объект.свойства.
К примеру, код можно сохранить в методе нового класса.
Создаете новый метод, например, "GetValue". Внутри пишите код PHP (можно прямо в методе КЛАССА):

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

$data = file_get_contents('http://ip_adress/getinfo');
$arr = explode(' ', $data);
sg('WeatherStation.Temp', $arr[0]);
sg('WeatherStation.Hum', $arr[1]);
sg('WeatherStation.Press', $arr[2]);
3. Организуете периодический запуск метода "GetValue", например 1 раз в 5 минут.
Как вариант, для этого можете написать в «onNewMinute» (Панель управления --> ОБЪЕКТЫ --> Объекты --> [класс] Timer --> ClockChime --> onNewMinute) такой код (ниже строки «$m=date('i',time());»):

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

if ($m%5 == 0) callMethod("WeatherStation.GetValue");
Чтобы отобразить эти значения в интерфейсе, можно воспользоваться стандартными элементами. Температуру проще всего вывести с помощью элемента сцены "информер". Для начала почитать, к примеру, можно здесь (https://kb.mjdm.ru/category/video-po-ma ... majordomo/), а про меню вот здесь (https://kb.mjdm.ru/commands_help/).


Что касается ваших wi-Fi-выключателей, то для освещения тоже целесообразно сделать свой класс со своими объектами на каждую цепь освещения и методами на включение и выключение.Не забудьте про свойство "status". На сцене для каждого состояния интерфейсного выключателя ссылаетесь на соответствующие методы. Можете почитать, к примеру, тут (https://ab-log.ru/forum/viewtopic.php?f=1&t=1328). Там другое оборудование, но принципиально все тоже самое.
Последний раз редактировалось Chainik Пн июл 27, 2020 3:00 pm, всего редактировалось 1 раз.
За это сообщение автора Chainik поблагодарили (всего 2):
xor (Вс июл 26, 2020 11:37 am) • Yashalta (Вт сен 08, 2020 11:52 pm)
Рейтинг: 2.33%
Аватара пользователя
xor
Сообщения: 2039
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 286 раз
Поблагодарили: 629 раз

Re: Как принять / послать данные через http

Сообщение xor » Вс июл 26, 2020 11:41 am

Про обращение по адресу из кода в МДМ - функция getURL("192.168.0.1/setPinOn",0);


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


За это сообщение автора xor поблагодарил:
nickneo (Вт июл 28, 2020 3:38 pm)
Рейтинг: 1.16%
AK1
Сообщения: 141
Зарегистрирован: Чт фев 13, 2020 6:39 pm
Благодарил (а): 23 раза
Поблагодарили: 34 раза

Re: Как принять / послать данные через http

Сообщение AK1 » Вс сен 06, 2020 9:16 am

Похожая ситуация.
Но в качестве разделителя - перевод строки.
Т.е. возвращаются 2-е строки.
Как взять параметры из 2-й строки?
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: Как принять / послать данные через http

Сообщение Chainik » Вс сен 06, 2020 9:42 am

Вам надо всего лишь указать ваш разделитель в качестве аргумента функции. Например,

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

$arr = explode(PHP_EOL, $data);
AK1
Сообщения: 141
Зарегистрирован: Чт фев 13, 2020 6:39 pm
Благодарил (а): 23 раза
Поблагодарили: 34 раза

Re: Как принять / послать данные через http

Сообщение AK1 » Вс сен 06, 2020 10:04 am

Пробовал. Получается также, как и с пробелом.
Каждый элемент массива - один символ от строки.
Т.е. 2-я строка разбивается на отдельные символы в массиве.
Когда знаешь длину слова, то можно посчитать.
А при переменной длине слова - сложная функция.
Есть способ попроще?
$pow = getURL('http://192.168.1.46:8080/?command=1&channel=3');
$arr = explode(' ', $pow);
$pow1 = $pow[3];
$pow2 = $pow[4];
$pow3 = $pow[5];
$pow1 = $pow1*100 + $pow2*10 + $pow3;
setGlobal('Sensor_power70.value', $pow1);
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: Как принять / послать данные через http

Сообщение Chainik » Вс сен 06, 2020 10:08 am

Вы бы написали, что именно у вас приходит в переменную в ответ на запрос

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

$pow = getURL('http://192.168.1.46:8080/?command=1&channel=3');
Тогда проще было бы помочь.
AK1
Сообщения: 141
Зарегистрирован: Чт фев 13, 2020 6:39 pm
Благодарил (а): 23 раза
Поблагодарили: 34 раза

Re: Как принять / послать данные через http

Сообщение AK1 » Вс сен 06, 2020 11:16 am

Через веб переменные получаю нормально.
Опрос через 15 сек.
Но после включения с кнопки хочу получить значение сразу без задержки, не ожидая опроса по веб переменной.
При прямом обращении получаю такую картинку.
Вложения
Безымянный.png
Безымянный.png (9.61 КБ) 2651 просмотр
Безымянный1.png
Безымянный1.png (45.52 КБ) 2651 просмотр
AK1
Сообщения: 141
Зарегистрирован: Чт фев 13, 2020 6:39 pm
Благодарил (а): 23 раза
Поблагодарили: 34 раза

Re: Как принять / послать данные через http

Сообщение AK1 » Вс сен 06, 2020 11:22 am

На JS делал так:

var a;
var b;
var e;
function pokazan(a,b){
var requestURL = 'http://192.168.1.'+a+':8080/?command=1&channel='+b;
var request = new XMLHttpRequest();
request.open('GET', requestURL, false);
request.responseType = 'text';
request.send();
e=request.responseText;
e=e.substring(1, 6);
return (e);
}

Как аналогично сделать на php?
AK1
Сообщения: 141
Зарегистрирован: Чт фев 13, 2020 6:39 pm
Благодарил (а): 23 раза
Поблагодарили: 34 раза

Re: Как принять / послать данные через http

Сообщение AK1 » Вс сен 06, 2020 11:35 am

Проблема закрыта:
$pow = getURL('http://192.168.1.46:8080/?command=1&channel=3');
$pow = substr($pow, 3, 8) /10;
setGlobal('Sensor_power70.value', $pow);
Ответить