JS устройство - как сделать POST запрос с определенными заголовками и опциями?

Данный раздел предназначен для русскоязычных пользователей. Если вы владеете английским, рекомендуем также просмотреть общую ветку обсуждений на английском.
Post Reply
andrusha7778
Posts: 16
Joined: 14 Nov 2018 20:41

JS устройство - как сделать POST запрос с определенными заголовками и опциями?

Post by andrusha7778 »

Добрый день. Подскажите пожалуйста такой момент - мне необходимо создать виртуальное устройство в Z-way home automation, которое будет являться внешним источником температуры для нескольких термостатов Eurotronic Spirit.
Понял, что для этого необходимо использовать JS устройство или HTTP устройство.
Внешний датчик температуры уже есть, используя PHP можно получить с него данные таким образом:

Code: Select all

require_once './src/Autoload.php';
WpOrg\Requests\Autoload::register();
$url = 'https://zont-online.ru/api/devices';
$data = array('load_io' => true);
$zont_token='some_token';
$headers = array('X-ZONT-Client' => 'email@email.com', 'Content-Type' => 'application/json', 'X-ZONT-Token' => $zont_token);
$response = WpOrg\Requests\Requests::post($url, $headers, json_encode($data));
$result = json_decode($response->body, true);
$zal_temp = $result['devices'][0]['io']['z3k-state']['device_id']['temperature'];
print_r($zal_temp);
Такая конструкция хорошо работает, авторизация по токену, возвращается довольно большой объем данных в формате JSON с которым уже можно работать.
Но не получается реализовать такую же конструкцию для z-way
Попробовал такой код:

Code: Select all

fetch('https://zont-online.ru/api/devices', {method: 'POST', mode: 'cors', cache: 'no-cache', headers: {'Content-Type': 'application/json', 'X-ZONT-Client': 'email@email.com', 'X-ZONT-Token': 'some_token'}, body: JSON.stringify({'load_io': 'true'})});
однако видимо где-то ошибка, так как в логах ругань такого вида:

Code: Select all

[core] fetch is not defined
ну или может быть есть другой способ получить значение с zont api? Понятно, что я могу поставить PHP на razberry, сделать sh файл и парсить его вывод через system("myscript.sh")[1]
User avatar
PoltoS
Posts: 7579
Joined: 26 Jan 2011 19:36

Re: JS устройство - как сделать POST запрос с определенными заголовками и опциями?

Post by PoltoS »

fetch вообще нет. почитайте документацию, там есть http.request: https://z-wave.me/manual/z-way/JavaScript_Engine.html Там есть всё, что вам нужно. Можно делать CodeDevice с нужным синхронным запросом. Но если это не локальный запрос, то лучше сделать асинхронный запрос.

Если это модуль Zont, то можно сделать для него модуль и загрузить к нам в магазин. Копируйте HTTPDevice, убирайте оттуда выбор типа датчика - будет только один, добавляйте поля для токена и прочего, добавляйте в код заголовки и будет всё красиво. Потом можно загрузить на https://developer.z-wave.me
andrusha7778
Posts: 16
Joined: 14 Nov 2018 20:41

Re: JS устройство - как сделать POST запрос с определенными заголовками и опциями?

Post by andrusha7778 »

Добрый день.
Спасибо за пояснения. с http.request всё заработало, получается правильный response и он в JSON формате. Однако в async: true не работает, в логах

Code: Select all

Error during perform command execution: TypeError: Cannot use 'in' operator to search for 'location' in metrics:level
Также вопрос как разобрать в одном и том же виртуальном устройстве JS уже полученный response.
json.path нету, попробовал воспользоваться из документации кодом для XML Parser, вот такой код

Code: Select all

var x = new ZXmlDocument();
x=newZXmlDocument(http.request({url: "https://zont-online.ru/api/devices", method: "POST", headers: {"Content-Type": "application/json", "X-ZONT-Client": "email@email.com", "X-ZONT-Token": "some_token"}, data: JSON.stringify({load_io: true})}));
x.findOne("/data/devices/0/io.z3k-state/etc");
выдает ошибку Error during perform command execution: ReferenceError: newZXmlDocument is not defined

P.S. я примерно понимаю, что надо взять за основу HTTP устройство и написать свое чтобы добавить туда необходимые поля, но может быть имеет смысл просто улучшить HTTP Device - позволить выбирать произвольные заголовки например?
User avatar
PoltoS
Posts: 7579
Joined: 26 Jan 2011 19:36

Re: JS устройство - как сделать POST запрос с определенными заголовками и опциями?

Post by PoltoS »

Если у вас JSON, то просто x.data.devices["0"]["io.z3k-state"].etc. Относитесь к нему как к JSON объекту.

для async=true нужно делать success: function(x) {...}
andrusha7778
Posts: 16
Joined: 14 Nov 2018 20:41

Re: JS устройство - как сделать POST запрос с определенными заголовками и опциями?

Post by andrusha7778 »

Отлично, спасибо большое! Заработала такая конструкция

Code: Select all

x=http.request({url: "https://zont-online.ru/api/devices", method: "POST", headers: {"Content-Type": "application/json", "X-ZONT-Client": "some@email.com", "X-ZONT-Token": "some_token"}, data: JSON.stringify({load_io: true})});parseFloat(x["data"]["devices"]["etc"]);
Наверное будет полезным для всех.
Post Reply