Problem: json response

Hallo zusammen,

ich bräuchte eure Hilfe bei dem json Response.
Ich möchte über die API von Weather Underground Daten zum Sonnenaufgang und Sonnenuntergang ziehen.

Der http:request funktioniert soweit.
Jetzt stehe ich vor dem Problem, dass ich die Daten aus dem response explizit abgreifen will um diese dann GV zu speichern.

Ich habe es schon mit folgenden Zeilen versucht aber leider erhalte ich immer eine Fehlermeldung:

local response = json.decode(json)
local hour = response.sunrise.hour
local minute = response.sunrise.minute
fibaro:debug("Sonnenaufgang"..hour ":" ..minute" Uhr")

Fehlermeldung:

[DEBUG] 12:59:16: [1;31m2016-09-29 12:59:16.277997 [ fatal] LUA error: /usr/share/lua/5.2/json/decode.lua:74: bad argument #1 to 'match' (string expected, got table)

Was mache ich falsch!?

Hier mein Code und darunter der response aus dem debug:

--[[
%% properties
%% events
%% globals
--]]

local http = net.HTTPClient() 
http:request('http://api.wunderground.com/api/Your_Key/astronomy/q/Australia/Sydney.json',  {
    options =  {
    method = "GET",
    },
    success = function (response) 
    fibaro:debug(response.data)
    end,
    error  = function (err)
      --fibaro: debug ("Error:"  .. err)
    end
  })

Debug:


[DEBUG] 12:27:46: 
[DEBUG] 12:27:46: {
[DEBUG] 12:27:46: "response": {
[DEBUG] 12:27:46: "version":"0.1",
[DEBUG] 12:27:46: "termsofService":"http://www.wunderground.com/weather/api/d/terms.html",
[DEBUG] 12:27:46: "features": {
[DEBUG] 12:27:46: "astronomy": 1
[DEBUG] 12:27:46: }
[DEBUG] 12:27:46: }
[DEBUG] 12:27:46: , "moon_phase": {
[DEBUG] 12:27:46: "percentIlluminated":"2",
[DEBUG] 12:27:46: "ageOfMoon":"28",
[DEBUG] 12:27:46: "phaseofMoon":"Waning Crescent",
[DEBUG] 12:27:46: "hemisphere":"North",
[DEBUG] 12:27:46: "current_time": {
[DEBUG] 12:27:46: "hour":"12",
[DEBUG] 12:27:46: "minute":"25"
[DEBUG] 12:27:46: },
[DEBUG] 12:27:46: "sunrise": {
[DEBUG] 12:27:46: "hour":"7",
[DEBUG] 12:27:46: "minute":"31"
[DEBUG] 12:27:46: },
[DEBUG] 12:27:46: "sunset": {
[DEBUG] 12:27:46: "hour":"19",
[DEBUG] 12:27:46: "minute":"14"
[DEBUG] 12:27:46: },
[DEBUG] 12:27:46: "moonrise": {
[DEBUG] 12:27:46: "hour":"5",
[DEBUG] 12:27:46: "minute":"37"
[DEBUG] 12:27:46: },
[DEBUG] 12:27:46: "moonset": {
[DEBUG] 12:27:46: "hour":"18",
[DEBUG] 12:27:46: "minute":"50"
[DEBUG] 12:27:46: }
[DEBUG] 12:27:46: },
[DEBUG] 12:27:46: "sun_phase": {
[DEBUG] 12:27:46: "sunrise": {
[DEBUG] 12:27:46: "hour":"7",
[DEBUG] 12:27:46: "minute":"31"
[DEBUG] 12:27:46: },
[DEBUG] 12:27:46: "sunset": {
[DEBUG] 12:27:46: "hour":"19",
[DEBUG] 12:27:46: "minute":"14"
[DEBUG] 12:27:46: }
[DEBUG] 12:27:46: }
[DEBUG] 12:27:46: }
[DEBUG] 12:27:46: 

Danke für eure Hilfe!

Hi,

dies ist zum einen keine gültige JSON-Response, weshalb du die Fehlermeldung bekommst.

Zum anderen: Warum nutzt du nicht die normalen Zeiten des HCs. Diese werden durch die Location berechnet und sollten von daher stimmen.

Gruß

Hi boomx,

warum ist die response nicht gültig?
Es ist der selbe response wie auf der WU API Webseite:
WU API Examples
Woran erkenne ich das?

Grundsätzlich geht es mir nicht um die Zeiten…es geht mir darum es zu verstehen. :slight_smile:

Grüße

Hi,

ein korrekter JSON-Response würde sich in einer Debug-Zeile befinden, nur dann kann er mit json.decode genutzt werden. Warum das hier so dargestellt wird, kann ich dir leider nicht sagen. Hatte gestern ein ähnliches Problem, da wurde vor und nach dem JSON jeweils ein Zeilenumbruch gesetzt. json.decode hat dann in diesem Fall auch nicht funktioniert.

Gruß

Ich habe es hinbekommen.

Nachdem ich eine Funktion draus gemacht habe werden die Daten korrekt gezogen.
Die API von WU ist schon ganz schön umfangreich… Vielleicht ist für jemanden etwas interessantes dabei.

Hier der Code:

--[[
%% properties
%% events
%% globals
--]]

local function process(response)
local APIkey = "your key"
local PWS = "your PWS"
local station = "PWS"  
local http = net.HTTPClient() 

  http:request("http://api.wunderground.com/api/"..APIkey.."/astronomy/q/"..station..":"..PWS..".json",{
      options = {method = 'GET'},
      success = process,
      error = error
    })

  if response then
    if response.status~=200 then
    fibaro:debug("Error")
    else
        local now = os.date("%H:%M")
        local jsonTable = json.decode(response.data)
      --fibaro:debug(response.data)  
      local sunrisehour = jsonTable.moon_phase.sunrise.hour
      local sunriseminute = jsonTable.moon_phase.sunrise.minute
      local sunsethour = jsonTable.moon_phase.sunset.hour
      local sunsetminute = jsonTable.moon_phase.sunset.minute
      
      fibaro:debug("Sonnenaufgang: " .. sunrisehour.. ":" .. sunriseminute.." Uhr");
      fibaro:debug("Sonnenuntergang: " .. sunsethour.. ":" .. sunsetminute.." Uhr");
      fibaro:abort()
end
end
end
process()