Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: API Завод Радан (счетчики газа Принц)  (Прочитано 2590 раз)

ACHE

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Здравствуйте.
Появилась необходимость считывать данные с счетчиков газа Принц производства Радан.
Предоставили информацию по API (https://gas.zavodradan.ru/api/documentation).
Уже получилось реализовать получение API-токена в скаде. Даже какие-то данные вытаскивать. Но, только как URL-запросы. Например, токен получаем так:
Код: (delphi)
var
  aHTTP: TM_HTTP;
  aPOST: TM_HTTPPost;
begin
  aPost := TM_HTTPPost.Create(hptJSON);
  aHTTP := RequestHTTP;
  aHTTP.Post('https://gas.zavodradan.ru/api/login?email=login&password=pass', aPost, 70); // отмечаем запрос тегом = 70
end.

Скрипт "Выполнен POST/GET запрос":
Код: (delphi)
var
ApiKey: string;

begin

if Response.Tag = 70 then
   begin
    ApiKey := (Response['api_token'].AsStr);
    Text101.Text := ApiKey;
    Token.Value := ApiKey;
   end;
end.

А информацию по расходу газа так:
Код: (delphi)
var
  aHTTP: TM_HTTP;
  aQuery: string;

begin
     aQuery := 'https://gas.zavodradan.ru/api/devices/gas_sensors/archives/days?api_token=Token&device_id=0&sn=1234567&start=21.04.2023&end=22.04.2023&count=1'; //суточный архив

    aHTTP := RequestHTTP;     // создаём экземпляр запроса
    aHTTP.Get(aQuery, 77);    // вызываем GET с запросом aQuery и отмечаем его тегом = 77

end.

Скрипт "Выполнен POST/GET запрос":
Код: (delphi)
var
  aData: TM_JSONNode;
  Result, consumption: string;

begin
  // если это результат выполнения запроса с тегом 77
  if Response.Tag = 77 then
  begin
   aData := Response[''];
   Result := aData.AsStr;
   Text12.Text := aData.AsStr; //проверка формирования урл
   Text13.Text := aData['pressure'].AsStr;
   text14.text:=aData['volume'].AsStr;
   text15.text:=aData['consumption'].AsStr;
   consumption := aData['consumption'].AsStr;
   Vsutki.Value := StrToFloat(consumption);
   
end;
end.

Как разложить GET-запрос так, чтобы его можно было параметризировать? Допустим, подставлять дату и время, номер счетчика и т.д. Внедрять переменные в URL? Попробовал такой способ, но он слишком усложняет код. Приходится конвертировать время и дату, плюс при вставке переменной на место даты добавляется пробел почему-то в URL.
По итогу опрос должен выполняться автоматически и данные архивироваться для автоматических отчетов.
С API работаем впервые, поэтому понимания пока вообще нет, как это работает)
На сайте с примерами GET-запросов есть форма для тестирования (вложения).

ACHE

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: API Завод Радан (счетчики газа Принц)
« Ответ #1 : 23 Апреля 2023, 09:01:42 »
В общем пока получается так опрашивать прибор (скрипт "Прошел час"):

Код: (delphi)
var
  aHTTP: TM_HTTP;
  aQuery, DStart, DEnd, y, m, d: string;
  DateStart, DateEnd: TDateTime;
  year, month, day: integer;

begin
    if HourOf(Now) <> 14 then Exit;
    year := YearOf(Now);
    month := MonthOf(Now);
    day := DayOf(Now);
    DateStart := RecodeDate(now,year,month,day);
    DateEnd := IncDay(DateStart, 1);
    DStart := DateToStr(DateStart);
    DEnd := DateToStr(DateEnd);
    Delete(DStart, 11, 1); //в строку с датой почему-то в конце добавляется пробел. Убираем его
    Delete(DEnd, 11, 1);
   
    aQuery := 'https://gas.zavodradan.ru/api/devices/gas_sensors/archives/days?api_token='+Token.AsStr+'&device_id=0&sn=1234567&start='+DStart+'&end='+DEnd+'&count=1&timezone=%2B1100';

    aHTTP := RequestHTTP;     // создаём экземпляр запроса
    aHTTP.Get(aQuery, 77);    // вызываем GET с запросом aQuery и отмечаем его тегом = 77

end.

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1290
    • Просмотр профиля
Re: API Завод Радан (счетчики газа Принц)
« Ответ #2 : 23 Апреля 2023, 23:01:25 »
Здравствуйте.

Цитировать
Как разложить GET-запрос так, чтобы его можно было параметризировать? Допустим, подставлять дату и время, номер счетчика и т.д. Внедрять переменные в URL?
Все верно, нужно подставить в запрос требуемые переменные. Для получения текущей даты/времени можно использовать функцию Now. Чтобы удалить пробелы из строки нужно использовать функцию Trim. Измененный скрипт:
Код: (delphi)
var
  aHTTP: TM_HTTP;
  aQuery, DStart, DEnd: string;
  DateStart, DateEnd: TDateTime;
begin
  if HourOf(Now) <> 14 then Exit;
  DateStart := Now;
  DateEnd := IncDay(DateStart, 1);
  DStart := Trim(DateToStr(DateStart));
  DEnd := Trim(DateToStr(DateEnd));

  aQuery := 'https://gas.zavodradan.ru/api/devices/gas_sensors/archives/days?api_token=' + Token.AsStr +
  '&device_id=0&sn=1234567&start=' + DStart + '&end=' + DEnd + '&count=1&timezone=%2B1100';

  aHTTP := RequestHTTP;     // создаём экземпляр запроса
  aHTTP.Get(aQuery, 77);    // вызываем GET с запросом aQuery и отмечаем его тегом = 77
end.

ACHE

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: API Завод Радан (счетчики газа Принц)
« Ответ #3 : 23 Июня 2023, 08:14:42 »
Здравствуйте.
Спустя пару месяцев работы API стали появляться такие сообщения при запросе:
Error connecting with SSL. error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure!
При этом, если отправлять запрос через браузер или программу Postman, то ответ от севера получаем с кодом 200, т.е. все в порядке.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3147
    • Просмотр профиля
    • Simple-Scada
Re: API Завод Радан (счетчики газа Принц)
« Ответ #4 : 23 Июня 2023, 15:13:25 »
Здравствуйте.

Здесь два варианта:
  • либо разработчики API отключили поддержку TLS 1.2;
  • либо ограничили список доступных шифров и теперь шифры используемые скадой не подходят;
Если есть возможность, то вышлите на support@simple-scada.com рабочий токен, мы сделаем тесты, возможно получится быстро решить вопрос в зависимости от причины проблемы.