This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm that you accept these cookies being set.

API Get help
#1
I'm trying to get some data from an API, I managed to connect to the API and get the result in the log, but I'm having trouble understanding how to add the data to virtual group addresses.

Code:
http = require('socket.http')
ltn12 = require('ltn12')

res, code = http.request({
url = 'https://horsensvej.rokum.ro/api/v1/entries?token=https%3A%2F%2Fhorsensvej.rokum.ro%2F%3Ftoken%3Dknx-2e4b5b25355f26bb',
method = 'GET',
})
log(res, code)

The result I get in log is:
Code:
* arg: 1
  * string: "2023-11-27T21:26:49.676Z"    1701120409676    219    "SingleUp"    "xDrip-LimiTTer"
"2023-11-27T21:21:49.215Z"    1701120109215    207    "SingleUp"    "xDrip-LimiTTer"
"2023-11-27T21:16:47.774Z"    1701119807774    195    "SingleUp"    "xDrip-LimiTTer"
"2023-11-27T21:11:46.145Z"    1701119506145    184    "Flat"    "xDrip-LimiTTer"
"2023-11-27T21:06:44.795Z"    1701119204795    183    "Flat"    "xDrip-LimiTTer"
"2023-11-27T21:01:43.307Z"    1701118903307    183    "SingleUp"    "xDrip-LimiTTer"
"2023-11-27T20:56:42.074Z"    1701118602074    168    "SingleUp"    "xDrip-LimiTTer"
"2023-11-27T20:51:40.281Z"    1701118300281    153    "SingleUp"    "xDrip-LimiTTer"
"2023-11-27T20:46:38.060Z"    1701117998060    139    "SingleUp"    "xDrip-LimiTTer"
"2023-11-27T20:41:37.989Z"    1701117697989    128    "FortyFiveUp"    "xDrip-LimiTTer"
* arg: 2
  * number: 200

What now? I need to get the data sorted or something? 
I would prefer NOT to get the result, but some pointers so I can understand/learn it.
Reply
#2
The data looks tab-separated. This code will split the data into separate lines and then each line into separate items.

Code:
lines = data:split('\n')
for _, line in ipairs(lines) do
  items = line:split('\t')
  log(items)
end
Reply
#3
(28.11.2023, 06:56)admin Wrote: The data looks tab-separated. This code will split the data into separate lines and then each line into separate items.

Code:
lines = data:split('\n')
for _, line in ipairs(lines) do
  items = line:split('\t')
  log(items)
end

Okay, I have had some time to look at this again, and I admit I need more help.
The code you provided put the data into separate items, that I should be able to put in group addresses with the grp.checkupdate, but I can't get it working!
Reply
#4
Post your full script and describe what exactly you want to achieve.
Reply
#5
(29.01.2024, 10:58)admin Wrote: Post your full script and describe what exactly you want to achieve.

Code:
http = require('socket.http')
ltn12 = require('ltn12')

res, code = http.request({
url = 'https://horsensvej.rokum.ro/api/v1/entries?token=https%3A%2F%2Fhorsensvej.rokum.ro%2F%3Ftoken%3Dknx-2e4b5b25355f26bb',
method = 'GET',
})
log(res, code)
That is working, and the code you provided:
Code:
lines = data:split('\n')
for _, line in ipairs(lines) do
  items = line:split('\t')
  log(items)
end
But whatever I do I get a:
Code:
api 29.01.2024 12:55:29
Resident script:9: attempt to index global 'data' (a nil value)
stack traceback:

I want to put each segment into its own group address, Date, rawvalue, value, direction and CGM
Code:
"2023-11-27T21:26:49.676Z"    1701120409676    219    "SingleUp"    "xDrip-LimiTTer"
Reply
#6
Try this:

Code:
res, code = require('socket.http').request({
url = 'https://horsensvej.rokum.ro/api/v1/entries?token=https%3A%2F%2Fhorsensvej.rokum.ro%2F%3Ftoken%3Dknx-2e4b5b25355f26bb',
method = 'GET',
})

if not res then
  log('request failed', code)
  return
end

lines = res:split('\n')
items = lines[ 1 ]:trim():split('\t')

for i, item in ipairs(items) do
  items[ i ] = item:gsub('^"(.*)"$', '%1')
end

grp.checkupdate('1/1/1', items[ 1 ])
grp.checkupdate('1/1/2', items[ 2 ])
grp.checkupdate('1/1/3', items[ 3 ])
grp.checkupdate('1/1/4', items[ 4 ])
grp.checkupdate('1/1/5', items[ 5 ])
Reply
#7
(29.01.2024, 12:54)admin Wrote: Try this:

Code:
res, code = require('socket.http').request({
url = 'https://horsensvej.rokum.ro/api/v1/entries?token=https%3A%2F%2Fhorsensvej.rokum.ro%2F%3Ftoken%3Dknx-2e4b5b25355f26bb',
method = 'GET',
})

if not res then
  log('request failed', code)
  return
end

lines = res:split('\n')
items = lines[ 1 ]:trim():split('\t')

for i, item in ipairs(items) do
  items[ i ] = item:gsub('^"(.*)"$', '%1')
end

grp.checkupdate('1/1/1', items[ 1 ])
grp.checkupdate('1/1/2', items[ 2 ])
grp.checkupdate('1/1/3', items[ 3 ])
grp.checkupdate('1/1/4', items[ 4 ])
grp.checkupdate('1/1/5', items[ 5 ])

Works like a charm, as always.

How would you go about changing the first item, that I assume is time/date in ISO 8601, to 3 byte time /day?
Reply
#8
Use this:
Code:
datetime = items[ 1 ]
year, month, day, hour, minute, second = datetime:match('(%d+)%-(%d+)%-(%d+)T(%d+):(%d+):(%d+)')

date = { year = year, month = month, day = day }
time = { hour = hour, minute = minute, second = second }

grp.checkupdate('0/0/1', date)
grp.checkupdate('0/0/2', time)
Reply


Forum Jump: