Плагин HTTP-Client



  • @int144 Добрый день,

    1. Создайте устройство Датчик универсальный бинарный добавьте необходимое количество состояний, назначьте каждому состоянию необходимую картинку. Картинки необходимо будет предварительно загрузить.

    2. На текущий момент простого решения нет, вы можете создать виртуальное устройство (RGB или Lamp). Создаете сценарий , привязываете ранее созданное виртуальное устройство и выполняете необходимые команды
      пример:

    /** 
    * @name Новый сценарий 
    * @desc  
    * @version 4 
    */
    
    const rgb = Device("RGBLAMP"); // id  виртуального устройства
    
    startOnChange(rgb); 
    
    script({
        start() {
          const dgram = require('dgram');
          const client = dgram.createSocket('udp4');
          
          const HOST = '192.168.0.110';
          const PORT = 45900;
    
          const [r, g, b, w, ww] = rgb.value;
          const message = new Buffer(`set value: [${r}, ${g}, ${b}]`); // данные udp, получиться такой пакет "set value: [255, 255, 255]"
          
          client.send(message, 0, message.length, PORT, HOST, () => {});
        } 
    });
    


  • @dev, спасибо за быстрый ответ.

    1. Я и сам думал так сделать, но у меня нет полного набора иконок и их названий. Написал в тех.поддержку Яндекс.
    2. Спасибо, скрипт работает, и даже переключает там что-то, только не то,что я хотел. Возможно с кодировкой нужно разобраться. Попробую tcpdump-ом посмотреть.


  • После обновления плагина перестала работать регулировка громкости. В боковом меню при перемещении ползунка значения на иконке не меняются. На кнопки включения и выключения не реагирует.

    В отладчике:

    03.11 21:32:31.871 IH: command [ { dn: 'VOLL_ALL', prop: 'set', val: 5 } ]
    03.11 21:32:31.872 IH: send { type: 'act',
      data: [ { dn: 'VOLL_ALL', prop: 'set', val: 5 } ] }
    03.11 21:32:31.880 IH: command [ { dn: 'VOLL_ALL', prop: 'set', val: 5 } ]
    03.11 21:32:31.881 IH: send { type: 'act',
      data: [ { dn: 'VOLL_ALL', prop: 'set', val: 5 } ] }
    03.11 21:32:31.884 http1: http://192.168.0.43/mp3play?cmd=6&data=5
    03.11 21:32:31.922 IH: Plugin exit with code 1
    03.11 21:32:31.926 IH: restart timer 5
    03.11 21:32:34.572 IH: command fail! [ { dn: 'VOLL_ALL', prop: 'set', val: 11 } ] Plugin is not running!
    03.11 21:32:34.580 IH: command fail! [ { dn: 'VOLL_ALL', prop: 'set', val: 11 } ] Plugin is not running!
    03.11 21:32:35.323 IH: command fail! [ { dn: 'VOLL_ALL', prop: 'off' } ] Plugin is not running!
    03.11 21:32:36.413 IH: command fail! [ { dn: 'VOLL_ALL', prop: 'on', val: '20' } ] Plugin is not running!
    03.11 21:32:37.643 IH: Run /var/lib/intrahouse-c/plugins/http/index.js http1
    03.11 21:32:37.679 IH: command [ { dn: 'VOLL_ALL', prop: 'off' } ]
    03.11 21:32:37.681 IH: send { type: 'act', data: [ { dn: 'VOLL_ALL', prop: 'off' } ] }
    03.11 21:32:38.540 IH: command [ { dn: 'VOLL_ALL', prop: 'on', val: '20' } ]
    03.11 21:32:38.541 IH: send { type: 'act',
      data: [ { dn: 'VOLL_ALL', prop: 'on', val: '20' } ] }
    03.11 21:32:39.502 IH: command [ { dn: 'VOLL_ALL', prop: 'off' } ]
    03.11 21:32:39.503 IH: send { type: 'act', data: [ { dn: 'VOLL_ALL', prop: 'off' } ] }
    03.11 21:32:39.857 http1: start
    03.11 21:32:39.859 http1: version: 0.0.17
    03.11 21:32:39.894 IH: Plugin exit with code 1
    03.11 21:32:39.898 IH: restart timer 5
    


  • @gis Добрый день, выпущено обновление, проверьте пожалуйста.



  • @dev
    Перестали парситься значения влажности shth:

    05.11 13:51:45.498 http1: GET http://192.168.0.41/sensors
    ---- HEADERS START ----
    {
      "content-length": "47  ",
      "server": "lwIP/1.4.0",
      "content-type": "text/html",
      "connection": "close     ",
      "expires": "Fri, 10 Apr 2008 14:00:00 GMT",
      "pragma": "no-cache"
    }
    ---- HEADERS END ----
    ---- BODY START ----
    hostname:ESP-TFT;shtt:20.2;shth:56.6;rtct:21.0;---- BODY END --
    05.11 13:51:45.502 http1: http://192.168.0.41/sensors --> values: ["shtt:20.2;shth:","20.2"]
    05.11 13:51:45.504 IH: get [ { dn: 'STEMP_ESP_TFT',
        err: 'Cannot read property \'slice\' of null' },
      { dn: 'SHTT_ESP_TTF', value: 20.2 } ]
    set { STEMP_ESP_TFT: { err: 'Cannot read property \'slice\' of null' },
      SHTT_ESP_TTF: { aval: 20.2, err: 0 } }
    


  • @gis Добрый день, покажите пожалуйста формулу обработки значения



  • @dev Спасибо, все заработало после того, как удалил и заново создал каналы.



  • Добрый день! пытаюсь получить данные temp из json

    {"observations":[{"stationID":"ISCHEP1","obsTimeUtc":"2019-11-22T14:25:55Z","obsTimeLocal":"2019-11-22 17:25:55","neighborhood":"Schepkinskoe","softwareType":null,"country":"RU","solarRadiation":null,"lon":39.80593491,"realtimeFrequency":null,"epoch":1574432755,"lat":47.34576416,"uv":null,"winddir":102,"humidity":52.0,"qcStatus":-1,"metric":{"temp":-4.9,"heatIndex":-4.9,"dewpt":-13.1,"windChill":-8.3,"windSpeed":7.4,"windGust":9.3,"pressure":1033.86,"precipRate":0.00,"precipTotal":0.25,"elev":24.4}}]}

    но что то не пойму что надо записать в Извлечение данных JSON
    data.observations.metric.temp ошибка



  • observations - это массив
    Попробуйте так: data.observations[0].metric.temp



  • спасибо попробую



  • опрашиваемое устройство присылает ответ в JSON в виде 6 разрядного числа, каждый из разрядов которого может принимать значение 0 или 1. Как грамотно написать запрос для извлечения данных, что бы не отбрасывались первые незначащие нули?
    Т.е , например, плагин читает ответ вида 010000 но в сценарий передает 10000. Куда смотреть?
    UPD: Как вариант можно "выровнять" в самом сценарии,
    типа:

    while (val.length <6 ) vl='0' + val; // добиваем 0-ми  до 6 символов
    

    но это все равно полностью не снимает вопрос...



  • @alesle Добрый день, для начала попробуйте отключить галочку преобразовать в число, если не поможет тогда:

    String(val).padStart(6, '0')  // 010000
    


  • ни то не другое не помогает - из плагина все равно передается число без лидирующих нулей. Впрочем, это легко исправляется в скрипте.



  • @alesle Добрый день, для устройства сделайте тип сенсор аналоговый универсальный



  • @dev
    так и есть , но - не работает...



  • Участник @intrahouse написал в Плагин HTTP-Client:

    Опубликована статья "Парсинг сайта погоды" https://ih-systems.com/ru/weather-parsing/
    ,,,,

    dev 13 мар. 2019 г., 18:52

    Добрый день в Блоге опубликована статья "Как получить информацию о подключенных клиентов с WI-FI роутера" https://ih-systems.com/ru/parsing-podkljuchennyh-klientov-s-wi-fi-routera/

    Можно проверить корректность ссылок?

    "Не найдено....."



  • Господа, имеется ответ от девайса в виде массива JSOn вида:

     "onew_temp": [
        {
          "id": "1",
          "adr_hex": "28BC6B2D09000066",
          "name": "S6",
          "t": "25.31"
        },
        {
          "id": "2",
          "adr_hex": "28AADE403D1401D6",
          "name": "S2",
          "t": "25.06"
        },
    

    Как правильно написать выражение для извлечения данных, что бы оно извлекало t там, где name="S6" ?
    Понятно что,
    data.onew_temp[0].t
    извлечет то что нужно, но дело в том что нет уверенности что эти данные всгда будут на этом месте. А вот "name": "S6" будет всегда.



  • Участник @alesle написал в Плагин HTTP-Client:

    но дело в том что нет уверенности что эти данные всгда будут на этом месте. > А вот "name": "S6" будет всегда.

    Если "name": "S6" будет всегда, то можно так:

    data.onew_temp.filter(item => item.name=="S6")[0].t
    


  • Блин, работает!!!
    Я правда нифига не вкурил как , но - работает!!!
    Буду разбираться..
    Спасибо огромное!



  • @alesle пожалуйста 🙂
    Вот вариант еще короче

    data.onew_temp.find(item => item.name=="S6").t
    

    Современный javascript мощный и гибкий язык, особенно если использовать синтаксис ES6 (или ES2015, что одно и то же) , в данном случае стрелочные функции.
    Магия этих выражений раскрывается в 2 шага

    1. Массивы в JS имеют встроенные методы для поиска по заданному критерию, в частности filter, find

      • find - ищет первый элемент массива, возвращает найденный объект
      • filter - сюрприз 🙂 - фильтрует входной массив и возвращает все найденные элементы (learn.javascript.ru/array-methods)
    2. Методу нужно передать критерий отбора - функцию для обработки элемента массива.

      Если писать, используя синтаксис классических функций, то получится так:

       arr.filter( function (item) {
         return item.name == 'S6';  
      });
      

      Функция вызывается по очереди для каждого элемента массива (item), если возвращает true, то элемент берется в новый массив

      С введением в ES6 стрелочных функций все стало компактнее:

       function (item) {return item.name == 'S6';} 
      

      можно заменить на

       (item)  => item.name == 'S6' 
      

      Что произошло

    • убрали function
    • грубо говоря return заменили на =>
    • если входной аргумент ровно один - то и скобки можно не ставить

    Подробнее https://learn.javascript.ru/arrow-functions
    Получаем:

     arr.filter( item => item.name == 'S6' );
    

    Ну и надо иметь в виду, что возвращает метод массива.
    Если результат - массив, то берем свойство его первого элемента

    data.onew_temp.filter(item => item.name=="S6")[0].t
    

    Если результат - объект, то просто берем свойство t

    data.onew_temp.find(item => item.name=="S6").t
    

Log in to reply