Здравствуйте.
Появилась необходимость считывать данные с счетчиков газа Принц производства Радан.
Предоставили информацию по API (https://gas.zavodradan.ru/api/documentation).
Уже получилось реализовать получение API-токена в скаде. Даже какие-то данные вытаскивать. Но, только как URL-запросы. Например, токен получаем так:
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 запрос":
var
ApiKey: string;
begin
if Response.Tag = 70 then
begin
ApiKey := (Response['api_token'].AsStr);
Text101.Text := ApiKey;
Token.Value := ApiKey;
end;
end.
А информацию по расходу газа так:
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 запрос":
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-запросов есть форма для тестирования (вложения).
В общем пока получается так опрашивать прибор (скрипт "Прошел час"):
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.
Здравствуйте.
Как разложить GET-запрос так, чтобы его можно было параметризировать? Допустим, подставлять дату и время, номер счетчика и т.д. Внедрять переменные в URL?
Все верно, нужно подставить в запрос требуемые переменные. Для получения текущей даты/времени можно использовать функцию Now (https://simple-scada.com/help/script/now.html). Чтобы удалить пробелы из строки нужно использовать функцию Trim (https://simple-scada.com/help/script/trim.html). Измененный скрипт:
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.