Fibaro HC2 Wetterdaten

Hallo zusammen,

ich habe mich mal ein wenig mit dem VD für Openweathermap beschäftigt, welches es auch hier im Downloadbereich gibt. Bei mir funktioniert es einwandfrei, allerdings sind die Temp_min und Temp_max Werte aus meiner Sicht völlig überflüssig. Hierbei handelt es sich um Temperaturunterschiede innerhalb eines Ortes und nicht etwa um die Forcast-Werte.
Ich habe mir das Modul deswegen dahingehend abgeändert, dass es nun auch die mittlere Temperatur für meinen Ort enthält (Schließlich weiß ich nicht, ob ich am kalten oder warmen Ende wohne;-)). Außerdem werden die Wetterdaten in Deutsch ausgegeben.
Soweit war es easy. Wenn ihr dazu Fragen habt, helfe ich gerne.

Woran ich aber scheitere, ist das Abfragen der Forcast-Werte. Wie heißt denn z.B. der Parameter für die erwartete Temperatur von heute? Wenn ich mich nicht irre, muss ich die Werte von hier holen: danef, statusf = HC3:GET("/data/2.5/forecast/daily?q=meine ausgeblendeten Daten. Hier gibt es auch noch keine Fehlermeldung. Danach kommt:
local ajson=json.decode(danef)
local tempday=ajson.temp.day-> In dieser Zeile erscheint die Fehlermeldung. Ich vermute mal, dass es den Parameter temp.day nicht gibt. Aber wie heißt er dann?

Ich würde das VD gerne ein wenig erweitern.

Danke für Eure Hilfe.

VG
Mr.Coffee

Hi,

Lass Dir den Response testweise vollständig im Debug ausgeben.
Dann kannst Du das Ergebnis interpretieren.
Oder:
http://openweathermap.org/forecast5

Viele Grüße Hoggle

Hi Hoogle,

danke für den Hinweis. In der Debugfunktion kann ich die Forecast-Werte alle sehen. Der Api-Response funktioniert demnach; nur bin ich nicht in der Lage die Parameter anzusprechen. Vermutlich lese ich sie falsch. Anfänger eben:-)

Auf openweathermap.org steht ein schöner Vergleich:
Example of current weather API respond:

"main":{
"temp":306.15, //current temperature 
"pressure":1013,
"humidity":44,
"temp_min":306, //min current temperature in the city
"temp_max":306 //max current temperature in the city
},

Hier bekomme ich es hin. Der Parameter für die Temperatur heute ist "main.temp.

Für den Forcast lautet die Formel:

"dt":1406080800,
"temp":{
        "day":297.77,  //daily averaged temperature
        "min":293.52, //daily min temperature
        "max":297.77, //daily max temperature
        "night":293.52, //night temperature
        "eve":297.77, //evening temperature
        "morn":297.77}, //morning temperature

Weder “dt.temp.day” noch “temp.day” funktionieren. Es heiß immer: “line get SelfId”

Kann das jemand von euch entziffern?:slight_smile:

Danke.

Gruß
Mr.Coffee

Hi,

wie sieht denn dein Debug aus?

VG Hoggle

Hi,

ich habe den Forecast zur Vereinfachung mal auf einen Tag beschränkt (cnt=1)

[DEBUG] 22:33:26: {"city":{"id":2910831,"name":"Hannover","coord":
{"lon":9.73322,"lat":52.370522},"country":"DE","population":0},"cod":"200","message":0.0519,"cnt":1,
"list":[{"dt":1465470000,"temp":{"day":16.04,"min":12.39,"max":16.04,"night":12.39,"eve":16.04,
"morn":16.04},"pressure":1014.62,"humidity":71,"weather":[{"id":801,"main":"Clouds","description":"ein paar Wolken","icon":"02d"}],"speed":3.86,"deg":300,"clouds":12}]}

Ob es mit dem Timestamp “dt” zusammenhängt? Allerdings müsste dieser doch auf openweathermap immer aktuell sein.

Danke für Deine Hilfe.

VG

Hi,

du musst den Variablennamen von deinem Response (zum Beispiel json) + .main.temp.day nehmen. Also zusammen so: json.main.temp.day.

Siehe VD hier:

http://www.siio.de/heizenenergiesparen/wetteranzeige-im-homecenter-2-mit-eigenen-werten-fuellen/

Gruß

Hi boomx,
Hallo Hoogle,

danke für Euren Support. Ich glaube, ich habe es jetzt. Zumindest erhalte ich erste Werte.
local ftemp=ajsonf.list[n].temp.day

Das list[n] ist die Lösung. Er hatte den gesuchten Parameter nie gefunden, da er nicht wusste, nach welchem Tag n er suchen soll. Das n muss vorher natürlich auch definiert werden z.B. so:

for i = 1,6 do
  t = ajsonf.list[i].dt
  if t > tm then
  	n = i
   break
  end
end

Zu 100% habe ich es noch nicht durchdrungen, aber er spuckt schon einmal Werte aus.
Ein paar Stunden muss ich wohl noch reinstecken, aber nur so lernt man LUA. Trotzdem melde ich mich bestimmt noch einmal mit ein paar Fragen:-)

Ich danke euch für eure tolle Unterstützung!

VG
Mr.Coffee

Moin Moin

hab folgendes Problem…
VD für Openweathermap geladen und die entsprechende Szene zum drücken des Buttons erstellt (copy & paste:-) )
Das Icon gleich mit runtergeladen und geändert im VD.
API Key eingetragen und Stadt ( in meinem Fall Dorf) ebenfalls

jedoch werden mir keine Werte angezeigt auch im Debug steht nix und wenn ich den Button drücke verschwinden zudem noch das Icon wieder…

Was kann das sein ?

gruss xn8

Hi,

Das Icon musst Du (auch) bei dem jeweiligen Button hinzufügen, also nicht nur für das VD auf dem ersten Reiter, sondern auch im zweiten Reiter.
Das VD hat nicht bzw gar kein Debug-Anzeigen.

Zur Durchlaufprüfung kannst Du ganz unten in dem Code des Buttons einen Debug einbauen:
fibaro:debug("Durchgelaufen")

VG Hoggle

Hi,

für mich klingt das so, als wenn Dein Code irgendwo fehlerhaft ist. Aber probier ruhig ersteinmal den Hinweis von Hoggle.

Ich hatte es dann übrigens hinbekommen, alle Forcastwerte für die nächsten Tage zu ziehen. Allerdings ist es nicht so, dass die Forcastwerte fix sind, sondern sie beziehen sich immer auf die aktuelle Uhrzeit. Die Temperatur von morgen ist somit die Temperatur von morgen zu der Uhrzeit jetzt. Wenn ich heute Abend nachfrage, ändert sich der Forecast, da es morgen Abend natürlich kälter ist als morgen Mittag.
Dieses Feature ist nicht ganz das, was ich wollte. Ich würde heute einfach gerne wissen, wie morgen die Höchststemperatur und z.B. die Regenwahrscheinlichkeit sind. Beides sollte nicht von der aktuellen Uhrzeit abhängen. Hat dafür jemand eine Idee? Klappt das mit dem Netatmo?

Danke.
VG Mr.Coffee

Hallo Hoogle

das mit dem Icon hat schon mal geklappt, aber ich erhalte immer noch keine Werte . hier mal der code…

-- Skript übersetzt und Fehlerkorrekturen eingebaut by boomx #siio
-- Dank an die Autoren Jakub & Damian von der polnischen Commuity @ forum.fibaro.com
  
-- DATEN ANPASSEN  
  local city="Sülfeld"
  local country="de" -- en, se, ....
  local api_key="6a32d7962a7a31fd932441xxxxxxxxxx" -- you can get your own API_KEY on this website: https://home.openweathermap.org/users/sign_up
  local lang = "de" -- en, se, ...
  
-- NETATMO-INTEGRATION (Aussensensor) - Temperatur und Luftfeuchtigkeit

  local netatmo = true
  local netatmo_id = 78 -- ID des Thermometers
  
-- VARIABLE für Wind (netatmo oder Z-Weather)

  local wind_var = true
  local var_name = 'wind_zweahter'
  
-- AB HIER NICHTS MEHR ÄNDERN

  local thisdevice = fibaro:getSelfId() 
  local cHM = os.date("%H:%M")
  local sunRise = fibaro:getValue(1, "sunriseHour")
  local sunSet = fibaro:getValue(1, "sunsetHour")
  local noc = (cHM > sunSet or cHM < sunRise)
  local weather_array = {[200] = 47, [201] = 45, [202] = 45, [210] = 38, [211] = 4, [212] = 3, [221] = 4, [230] = 9, [231] = 9, [232] = 9, [300] = 9, [301] = 9, [302] = 9, [310] = 11, [311] = 10, [312] = 6, [321] = 9, [500] = 40, [501] = 40, [502] = 12, [503] = 12, [504] = 12, [511] = 10, [520] = 12, [521] = 12, [522] = 12, [600] = 14, [601] = 16, [602] = 13, [611] = 5, [621] = 19, [701] = 21, [711] = 22, [721] = 20, [731] = 19, [741] = 21, [804] = 26, [900] = 0, [901] = 1, [902] = 2, [903] = 25, [904] = 36, [905] = 24, [906] = 17, [950] = 3200, [952] = 12, [953] = 12, [954] = 12, [955] = 12, [956] = 12, [957] = 24, [958] = 24, [959] = 2, [960] = 4, [961] = 4, [962] = 2, [800] = 32, [801] = 30, [802] = 30, [803] = 28, [951] = 34} 
  if noc then weather_array = {[800] = 31, [801]= 29, [802] = 29, [803] = 27, [951] = 33} end 
  local city = string.gsub(city," ","+")

-- connect to OpenWeatherMap:
  fibaro:debug('Verbindung zur API wird aufgebaut...')
  OWM = Net.FHttp("api.openweathermap.org") 
  data, status = OWM:GET("/data/2.5/weather?q="..city..","..country.."&units=metric&lang="..lang.."&APPID="..api_key) 
  if tonumber(status) < 300 and status ~= nil then 
    --fibaro:debug(data)
    ajson=json.decode(data)
    -- Stadt:
    city_=ajson.name..", "..ajson.sys.country
    fibaro:debug('Wetterdaten für ' ..city_.. ' abgefragt.')
    --Wetter
    pogo=ajson.weather[1].description
    fibaro:debug('Wetter: ' ..pogo)
    pogoId=tonumber(ajson.weather[1].id)
    weather_ = weather_array[pogoId]
    if weather_ == nil then weather_ = 3200 end;
    fibaro:debug('ConditionCode: ' ..weather_)
    --Temperatur
    if (netatmo == false) then
      fibaro:debug('Keine netatmo-Integration')
      tempmin=math.floor(ajson.main.temp_min)
      tempmin = tonumber(tempmin .. ".00")
    else
      fibaro:debug('netatmo-Integration aktiv')
      tempmin = tonumber(fibaro:getValue(netatmo_id, "value"))
    end
    fibaro:debug('Temperatur: ' ..tempmin.. ' °')
    --Luftfeuchtigkeit
    if (netatmo == false) then
      fibaro:debug('Keine netatmo-Integration')
      hum=ajson.main.humidity 
      hum = tonumber(hum .. ".00") 
    else
      fibaro:debug('netatmo-Integration aktiv')
      hum = tonumber(fibaro:getValue(netatmo_id + 1, "value"))
    end
    fibaro:debug('Luftfeuchtigkeit: ' ..hum.. ' %')
    --Luftdruck
    pressure=math.floor(ajson.main.pressure)
    fibaro:debug('Luftdruck: ' ..pressure.. ' hPa')
    --Windstärke
    if (netatmo == false) then
      fibaro:debug('Keine Variable für Wind gesetzt')
      wind_speed=math.floor(ajson.wind.speed * 3.6)
      wind_speed = tonumber(wind_speed .. ".00")
      fibaro:debug('Windstärke: ' ..wind_speed.. ' km/h')
    else
      fibaro:debug('Variable für Wind gesetzt')
      wind_speed = fibaro:getGlobal('wind_zweather')
      fibaro:debug('Windstärke: ' ..wind_speed.. ' km/h')
    end
    --Windrichtung
    wind_deg=math.floor(ajson.wind.deg)
    wind_deg_num = math.floor(wind_deg / 45)
    wind_deg_tab = {"N", "NE", "E", "SE", "S", "SW", "W", "NW"}
    wind_direction = wind_deg_tab[wind_deg_num]
    if (wind_direction == nil) then wind_direction = '-' end
    fibaro:debug('Windrichtung: ' ..wind_direction)
        
-- Write data to label of VD:
    fibaro:call(thisdevice, "setProperty", "ui.Label1.value", tempmin.." °C"); 
    fibaro:call(thisdevice, "setProperty", "ui.Label2.value", hum.." %"); 
    fibaro:call(thisdevice, "setProperty", "ui.Label3.value", wind_speed.." km/h, "..wind_direction); 
    fibaro:call(thisdevice, "setProperty", "ui.Label4.value", pressure.." hPa"); 
    fibaro:call(thisdevice, "setProperty", "ui.Label5.value", city_); 
-- Show in UI HC2 (browser)
    VD = Net.FHttp("127.0.0.1", 11111); 
    r,s,e = VD:PUT("/api/devices", '{ "id": 3, "properties": {"Temperature": ' .. tempmin .. ', "Humidity": ' .. hum .. ', "ConditionCode": ' .. weather_ .. ', "Wind": ' .. wind_speed .. '}}'); 
    if tonumber(e) == 0 then 
      fibaro:debug("Wetterdaten in der API aktualisiert."); 
    else 
      fibaro:debug("Aktualisierung der Wetterdaten fehlerhaft!!!"); 
    end 
  else 
    fibaro:debug("Fehler beim Aufruf der OpenWeatherMap-API. Status: #"..status); 
	fibaro:debug("Durchgelaufen")  
end

danke euch schon mal

gruss xn8

Hi,

hast du netatmo/z-Weather im Einsatz? Was kommt im Debug des Buttons?

Gruß

hi boomx

weder/noch…hatte das so verstanden das es auch ohne geht.

folgendes erscheint…

[DEBUG] 12:57:30: Verbindung zur API wird aufgebaut…
[DEBUG] 12:57:30: Wetterdaten für Sülfeld, DE abgefragt.
[DEBUG] 12:57:30: Wetter: überwiegend bewölkt
[DEBUG] 12:57:30: ConditionCode: 30
[DEBUG] 12:57:30: netatmo-Integration aktiv
[ERROR] 12:57:30: line 57: attempt to concatenate global ‘tempmin’ (a nil value)
[DEBUG] 13:07:30: Verbindung zur API wird aufgebaut…
[DEBUG] 13:07:30: Wetterdaten für Sülfeld, DE abgefragt.
[DEBUG] 13:07:30: Wetter: überwiegend bewölkt
[DEBUG] 13:07:30: ConditionCode: 30
[DEBUG] 13:07:30: netatmo-Integration aktiv
[ERROR] 13:07:30: line 57: attempt to concatenate global ‘tempmin’ (a nil value)
[DEBUG] 13:17:30: Verbindung zur API wird aufgebaut…
[DEBUG] 13:17:30: Wetterdaten für Sülfeld, DE abgefragt.
[DEBUG] 13:17:30: Wetter: überwiegend bewölkt
[DEBUG] 13:17:30: ConditionCode: 30

gruss

Hi,

das geht auch ohne. Du hast es aber so eingestellt, dass die Daten von den beiden Modulen abgefragt werden, weshalb es bei dir nicht funktioniert.

In dem Artikel steht, wie du es konfigurieren musst:

http://www.siio.de/heizenenergiesparen/wetteranzeige-im-homecenter-2-mit-eigenen-werten-fuellen/

Gruß

ok…jetzt gehts :slight_smile:
danke boomx

wie oft wird die Temperatur eigentlich aktualisiert ? zum jetzigen Zeitpunkt stimmt die angezeigte nicht mit der von OpenweatherMap…

gruss

Das VD aktualisiert sich nicht selbstständig. Steht auch so im Artikel :wink: du findest dort auch eine Szene, welche du Button drückt.

Gruß

die Szene hab ich ja auch aktiv und die ID des VD dort eingetragen, aber zb. wird mir jetzt 18 grad angezeigt aber auf Openweathermap zeigt es mir 20,1 grad

Musst du mal in den Debug des Buttons schauen, was die API zurückliefert.

Gruß

18 grad wird im Debug angezeigt…