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

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

Модератор: immortal

Qdesnikmak
Сообщения: 34
Зарегистрирован: Ср июл 22, 2020 1:30 pm

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

Сообщение Qdesnikmak »

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

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

Сообщение Chainik »

По погодной станции вам надо сделать несколько вещей.
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 раз.
Аватара пользователя
xor
Сообщения: 2044
Зарегистрирован: Сб ноя 22, 2014 8:45 pm

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

Сообщение xor »

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


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


AK1
Сообщения: 154
Зарегистрирован: Чт фев 13, 2020 6:39 pm

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

Сообщение AK1 »

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

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

Сообщение Chainik »

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

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

$arr = explode(PHP_EOL, $data);
AK1
Сообщения: 154
Зарегистрирован: Чт фев 13, 2020 6:39 pm

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

Сообщение AK1 »

Пробовал. Получается также, как и с пробелом.
Каждый элемент массива - один символ от строки.
Т.е. 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
Сообщения: 1465
Зарегистрирован: Вс янв 10, 2016 11:05 am

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

Сообщение Chainik »

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

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

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

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

Сообщение AK1 »

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

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

Сообщение AK1 »

На 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
Сообщения: 154
Зарегистрирован: Чт фев 13, 2020 6:39 pm

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

Сообщение AK1 »

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