Page 1 of 1

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

Posted: 15 Dec 2021 14:35
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]

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

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

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

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

Posted: 16 Dec 2021 15:17
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 - позволить выбирать произвольные заголовки например?

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

Posted: 17 Dec 2021 01:36
by PoltoS
Если у вас JSON, то просто x.data.devices["0"]["io.z3k-state"].etc. Относитесь к нему как к JSON объекту.

для async=true нужно делать success: function(x) {...}

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

Posted: 17 Dec 2021 13:41
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"]);
Наверное будет полезным для всех.