Logic Machine Forum
Help decoding JSON data from socket.http.request - Printable Version

+- Logic Machine Forum (https://forum.logicmachine.net)
+-- Forum: LogicMachine eco-system (https://forum.logicmachine.net/forumdisplay.php?fid=1)
+--- Forum: Scripting (https://forum.logicmachine.net/forumdisplay.php?fid=8)
+--- Thread: Help decoding JSON data from socket.http.request (/showthread.php?tid=1075)



Help decoding JSON data from socket.http.request - mooselight - 01.11.2017

Dear All,
I'm trying to retrieve consumption info from an "Ecocompteur" box from Legrand with the following code, but it does not work as expected. 
The returned Content-Type is "text/plain" while it should be "application/json", so the json.decode function does not work.

Is there another way to retrieve data values from the returned "json" data ?
Thanks in advance

Code:
Accessing "http://192.168.1.xx/inst.json" give this data in return :

{
   "data1":27.000000,
   "data2":0.000000,
   "data3":0.000000,
   "data4":0.000000,
   "data5":0.000000,
   "data6":0.000000,
   "data6m3":0.000000,
   "data7":0.000000,
   "data7m3":0.000000,
   "heure":22,
   "minute":5
}


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

local request_url = "http://192.168.1.xx/inst.json"
local response_body = {}

local body, code, hdrs, stat = socket.http.request
  {
    url = request_url;
    sink = ltn12.sink.table(response_body);
  }

log (body, code, hdrs, stat)

-- local response_decode = json.decode(table.concat (response_body))

log (response_body)

-- local data1 = response_decode.data1
-- local data2 = response_decode.data2
...

Here is the log output :

Code:
Ecocompteur 01.11.2017 20:33:54
* arg: 1
 * number: 1
* arg: 2
 * number: 200
* arg: 3
 * table:
  [server]
   * string: lwip/3.0
  [content-type]
   * string: text/plain
* arg: 4
 * string: HTTP/1.0 200 OK


Ecocompteur 01.11.2017 20:33:54
* string: {
   "data1":35.000000,
   "data2":0.000000,
   "data3":1.000000,
   "data4":0.000000,
   "data5":0.000000,
   "data6":0.000000,
   "data6m3":0.000000,
   "data7":0.000000,
   "data7m3":0.000000,
   "heure":20,
   "minute":33
}HTTP/1.0 200 OK
Server: lwip/3.0
Content-Type: text/plain

{
   "data1":35.000000,
   "data2":0.000000,
   "data3":1.000000,
   "data4":0.000000,
   "data5":0.000000,
   "data6":0.000000,
   "data6m3":0.000000,
   "data7":0.000000,
   "data7m3":0.000000,
   "heure":20,
   "minute":33
}



RE: Help decoding JSON data from socket.http.request - Erwin van der Zwart - 01.11.2017

Hi,

Try  this:
Code:
if type(response_body) == 'table' then
  data = json.pdecode(table.concat(response_body))
else
  data = json.pdecode(response_body)
end
log(data)
BR,

Erwin


RE: Help decoding JSON data from socket.http.request - admin - 02.11.2017

Try running this then post both log entries. What it looks like is that the response is incorrect. JSON functions expect valid input which does not have "Content-Type" set anywhere so it's not the problem.

Code:
require('json')
require('socket.http')

url = 'http://192.168.1.xx/inst.json'
data = socket.http.request(url)

log(data)
log(json.pdecode(data))



RE: Help decoding JSON data from socket.http.request - mooselight - 02.11.2017

(02.11.2017, 06:55)admin Wrote: Try running this then post both log entries. What it looks like is that the response is incorrect. JSON functions expect valid input which does not have "Content-Type" set anywhere so it's not the problem.

Code:
require('json')
require('socket.http')

url = 'http://192.168.1.xx/inst.json'
data = socket.http.request(url)

log(data)
log(json.pdecode(data))

Here is the log entries I got :

Code:
Ecocompteur 02.11.2017 07:58:47
* string: {
   "data1":195.000000,
   "data2":0.000000,
   "data3":0.000000,
   "data4":173.000000,
   "data5":0.000000,
   "data6":0.000000,
   "data6m3":0.000000,
   "data7":0.000000,
   "data7m3":0.000000,
   "heure":7,
   "minute":58
}HTTP/1.0 200 OK
Server: lwip/3.0
Content-Type: text/plain

{
   "data1":195.000000,
   "data2":0.000000,
   "data3":0.000000,
   "data4":173.000000,
   "data5":0.000000,
   "data6":0.000000,
   "data6m3":0.000000,
   "data7":0.000000,
   "data7m3":0.000000,
   "heure":7,
   "minute":58
}
Ecocompteur 02.11.2017 07:58:47
* arg: 1
 * nil
* arg: 2
 * string: Expected the end but found invalid token at character 253

(I PM you more info)
Thx

(01.11.2017, 21:50)Erwin van der Zwart Wrote: Hi,

Try  this:
Code:
if type(response_body) == 'table' then
  data = json.pdecode(table.concat(response_body))
else
  data = json.pdecode(response_body)
end
log(data)
BR,

Erwin

Thx Erwin, but it does not work.
Here is the log entry :

Ecocompteur 02.11.2017 08:33:27
* nil



RE: Help decoding JSON data from socket.http.request - admin - 02.11.2017

Strange, I've tested it with your access details and it works correctly. Which firmware version are you running?


RE: Help decoding JSON data from socket.http.request - admin - 02.11.2017

Can you also try running request like this?

Code:
sock = require('socket').tcp()
sock:settimeout(5)

res, err = sock:connect('192.168.1.xx', 80)
if res then
  sock:send('GET /inst.json HTTP/1.1\r\n\r\n')
  res = sock:receive('*a')
  log(res)

  if res then
    p, e = res:find('\r\n\r\n', 1, true)
    if e then
      data = res:sub(e + 1)
      data = require('json').pdecode(data)
      log(data)
    end
  end
end



RE: Help decoding JSON data from socket.http.request - mooselight - 02.11.2017

(02.11.2017, 07:44)admin Wrote: Strange, I've tested it with your access details and it works correctly. Which firmware version are you running?

1Version 2: 20170620

It should be the last I think ?

I'll try again ..

(02.11.2017, 07:48)admin Wrote: Can you also try running request like this?

Code:
sock = require('socket').tcp()
sock:settimeout(5)

res, err = sock:connect('192.168.1.xx', 80)
if res then
 sock:send('GET /inst.json HTTP/1.1\r\n\r\n')
 res = sock:receive('*a')
 log(res)

 if res then
   p, e = res:find('\r\n\r\n', 1, true)
   if e then
     data = res:sub(e + 1)
     data = require('json').pdecode(data)
     log(data)
   end
 end
end

Thanks, it works perfectly !