Плагин HTTP-Client



  • @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
    


  • Спасибо за доходчивое объяснение!


Авторизуйтесь, чтобы ответить