Показано с 1 по 4 из 4

Тема: Выгрузка данных в Excel через запрос Power Query

  1. #1

    Exclamation Выгрузка данных в Excel через запрос Power Query

    Доброго дня!
    Прошу помочь с запросом Power Query. Запрос для выгрузки данных "Получения последних данных с прибора - POST parameters/last-data" в таблицу Excel. Код запроса ниже. До этого подобные навыки не развивались, очень надеюсь на помощь, данные выводит - таблицу с пустыми значениями.

    let

    url = "https://api.owencloud.ru", //Ссылка на нужные нам данные

    Login = "{""login"": ""*****"", ""password"": ""*******""}",
    tabLogin = Json.Document(Login),

    //И в бинарник
    BinLogin = Uri.BuildQueryString(tabLogin),
    BLogin = Text.ToBinary(BinLogin),

    //Форма с данными которые передаются в запросе

    ResHead = [

    #"POST"="/v1/parameters/last-data/ HTTP/1.1",

    #"28"="api.owencloud.ru", //НА ЭТОТ заголовок Host PQ ругался хз почему

    #"Accept"="*/*",

    #"Authorization"="Bearer G78Fv1AfWN5JHirEVfAFnO1gAap3gKBR",

    #"11"="25", //НА ЭТОТ заголовок Content-Length PQ ругался хз почему

    #"Content-Type"="application/x-www-form-urlencoded"],


    Source = Json.Document(Web.Contents(url,[Headers = ResHead , Content = BLogin ]))

    in
    Source

  2. #2
    Пользователь Аватар для A.Simonov
    Регистрация
    11.07.2017
    Адрес
    Москва
    Сообщений
    623

    По умолчанию

    Цитата Сообщение от Елена_Fridman Посмотреть сообщение
    Доброго дня!
    Прошу помочь с запросом Power Query. Запрос для выгрузки данных "Получения последних данных с прибора - POST parameters/last-data" в таблицу Excel. Код запроса ниже. До этого подобные навыки не развивались, очень надеюсь на помощь, данные выводит - таблицу с пустыми значениями.

    let

    url = "https://api.owencloud.ru", //Ссылка на нужные нам данные

    Login = "{""login"": ""*****"", ""password"": ""*******""}",
    tabLogin = Json.Document(Login),

    //И в бинарник
    BinLogin = Uri.BuildQueryString(tabLogin),
    BLogin = Text.ToBinary(BinLogin),

    //Форма с данными которые передаются в запросе

    ResHead = [

    #"POST"="/v1/parameters/last-data/ HTTP/1.1",

    #"28"="api.owencloud.ru", //НА ЭТОТ заголовок Host PQ ругался хз почему

    #"Accept"="*/*",

    #"Authorization"="Bearer G78Fv1AfWN5JHirEVfAFnO1gAap3gKBR",

    #"11"="25", //НА ЭТОТ заголовок Content-Length PQ ругался хз почему

    #"Content-Type"="application/x-www-form-urlencoded"],


    Source = Json.Document(Web.Contents(url,[Headers = ResHead , Content = BLogin ]))

    in
    Source
    Добрый день.

    Подготовил для вас пример 2-х запросов с помощью Power Query
    2021-10-28_16-23-10.png

    Первый запрос производит авторизацию в демо-аккаунт, и нужен чтобы получить актуальный токен.
    Код:
    let
    
        url = "https://api.owencloud.ru/v1/auth/open", //Ссылка на нужные нам данные
    
        Login = "{""login"":""demo@owen.ru"",""password"":""demo123""}",
        BLogin = Text.ToBinary(Login),                //Форма с данными которые передаются в запросе
        
        ResHead = [
    
            #"POST"="/v1/auth/open HTTP/1.1",
            
            #"Accept"="*/*",
    
            #"Content-Type"="application/x-www-form-urlencoded"],
    
    
        Source = Json.Document(Web.Contents(url,[Headers = ResHead , Content = BLogin ]))
    in
        Source

    Второй запрос использует токен, полученный первым запросом, и запрашивает актуальные данные 2-х параметров.
    Токен, полученный через логин-пароль через 20 минут неактивности (отсутствия запросов) инвалидируется и удаляется из БД.
    Поэтому его нужно обновить (выполнить первый запрос), перед тем как делать второй запрос.
    Так как если токен "протухнет", то второй запрос выдаст ошибку авторизации.
    Код:
    let
    
        url = "https://api.owencloud.ru/v1/parameters/last-data", //Ссылка на нужные нам данные
    
        Content = "{""ids"":[5885163, 5885168]}",
        BContent = Text.ToBinary(Content),                //Форма с данными которые передаются в запросе
    
        token = Excel.CurrentWorkbook(){[Name="Запрос_токена"]}[Content]{0}[Value],
        
        ResHead = [
    
            #"POST"="/v1/parameters/last-data HTTP/1.1",
            
            #"Accept"="*/*",
    
            #"Authorization"="Bearer "&token,
    
            #"Content-Type"="application/x-www-form-urlencoded"],
    
    
        Source = Json.Document(Web.Contents(url, [Headers=ResHead, Content=BContent])),
        temp1 = Source{0}[values]{0}[v],
        temp2 = Source{1}[values]{0}[v],
    
        tempTable = Table.FromList(
            {
                [Type = "Прямая сетевая вода", Temp = temp1],
                [Type = "Обратная сетевая вода", Temp = temp2]
            },
            Record.FieldValues,
            {"Тип", "Температура"}
        )    
    in
        tempTable
    В качестве примера был выбран прибор "Котельная (ПЛК160_1.2.2)", который находится на демо-аккаунте

    Прибор: https://web.owencloud.ru/device/index/171772
    Его мнемосхема: https://web.owencloud.ru/mimic-diagram/view/618

    Для перехода по ссылкам выше нужно авторизоваться в демо-аккаунте.
    Для этого нажмите кнопку "демо вход", чтобы войти в демо-аккаунт.
    2021-10-28_16-32-42.png

    С этого прибора я получаю значение двух параметров:
    1) Температура обратной воды (id 5885168)
    2) Температура прямой воды (id 5885163)

    Id параметров используются во втором запросе (в соответствии с форматом запроса).
    Эти айдишники можно получить через API, например, запросив список параметров у нужного прибора.
    Но можно и проще, достаточно перейти в режим отладки, например, в браузере Chrome для этого нужно зажать сочетание клавиш Shift+ctrl+i
    Затем выберете инструмент "указатель элементов" и наведите мышь на значение нужного параметра, см. скрин ниже.
    После этого должна всплыть подсказка с информацией о элементе, там и будет нужный Id.
    2021-10-28_16-40-12.png

    Во вложении прикрепляю Excel файл, где можно посмотреть как это все работает.

    P.S. До сегодняшнего дня я не знал о существовании Power Query, поэтому возможно что-то сделал не эффективно или криво, но по крайней мере это работает .
    И температуры благополучно вытаскиваются из облака OwenCloud и отображаются в таблице.
    Вложения Вложения
    Последний раз редактировалось A.Simonov; 28.10.2021 в 18:33.

    Александр Андреевич Симонов
    Инженер по продуктам «ПЛК, модули и OwenCloud»

    Не работаю в ОВЕН с 01.07.22
    По всем вопросам обращайтесь на почту: support@owen.ru

  3. #3

    По умолчанию

    Добрый день!
    Спасибо! Это то, что надо, все работает!

  4. #4

    По умолчанию

    Добрый день!

    Большое спасибо за полезный пример.
    Подскажите, пожалуйста, а если необходимо выгрузить значение параметра на дату?
    Код выше прекрасно работает, но если необходимо использовать https://api.owencloud.ru/v1/parameters/data , в который на вход нужно подавать start и end временного промежутка, функция WebContents выдает ошибку (400) Bad Request.
    Если на примере выше, делаю следующее:

    let


    url = "https://api.owencloud.ru/v1/parameters/data", //Ссылка на нужные нам данные


    Content = "{""ids"":[5885163, 5885168],""start""=""2021-31-12 23:00:00"",""end""=""2022-01-01 01:00:00""}",
    BContent = Text.ToBinary(Content), //Форма с данными которые передаются в запросе


    token = Excel.CurrentWorkbook(){[Name="Запрос_токена"]}[Content]{0}[Value],

    ResHead = [


    #"POST"="/v1/parameters/last-data HTTP/1.1",

    #"Accept"="*/*",


    #"Authorization"="Bearer "&token,


    #"Content-Type"="application/x-www-form-urlencoded"],




    Source = Json.Document(Web.Contents(url, [Headers=ResHead, Content=BContent])),
    temp1 = Source{0}[values]{0}[v],
    temp2 = Source{1}[values]{0}[v],


    tempTable = Table.FromList(
    {
    [Type = "Прямая сетевая вода", Temp = temp1],
    [Type = "Обратная сетевая вода", Temp = temp2]
    },
    Record.FieldValues,
    {"Тип", "Температура"}
    ),
    Температура = tempTable{0}[Температура]
    in
    Температура

Похожие темы

  1. Ответов: 6
    Последнее сообщение: 17.10.2019, 09:03
  2. Ответов: 12
    Последнее сообщение: 02.12.2017, 11:54
  3. Выгрузка данных 110-60м
    от STARIY в разделе ПЛК1хх
    Ответов: 2
    Последнее сообщение: 12.11.2015, 20:22
  4. Проблема в предаче данных через RS-232
    от DrKillJoy в разделе Помощь Разработчикам
    Ответов: 1
    Последнее сообщение: 01.04.2011, 15:04

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •