SONOS_Remote_v1.0.1

Mit google-TTS nicht mehr. Dazu musst du VoiceRSS nutzen.

Gruß

gibt es dafür auch ein howto?

zB hier:
https://forum.fibaro.com/index.php?/topic/21797-tutorial-alternative-sonos-vd-using-node-sonos-api/#comment-93098

Und/oder
https://forum.fibaro.com/index.php?/topic/24521-tutorial-introduction-to-api-calls-and-http-requests/#comment-112208

Viele Grüße Hoggle

Ich habe eine Frage:

Im Post: #50490 steht:

Im Update-Button des VDs habe ich:

Dann kommt der Quelltext, wo muss dieser denn rein?!

Das verstehe ich leider nichtso ganz :frowning:

Auf welcher Seite ist der Post?
Um welches VD geht es?

Abend.

Auf Seit zwei. Ich weiß leider nicht auf welches VD sich das bezieht.

Könnte das overweather sein oder sonos.

Anke für die Hilfe.

Gruß

Ja,
genau, steht ja auch in den Code-Zeilen drin, OpnenWeather.

Also das heißt ich brauche ein zusätzlichen button in dem VD oder muss ich den Quellcode ergänzen unter dem “i” Button?!

Gruss

da Du das Thema ja auch im Fibaro-Forum diskutierst…

  1. Ein Quelle für das Wetter - entweder direkt vom HC oder OpenWeather oder WeatherUnderground oder Netatmo…
  2. Übersetzung der Wetter-Info in einer Szene ins deutsche (ggf. Ergänzung) und Anreicherung um zB Datum
  3. Dieser Text wird an zB. das SONOS-VD für TTS gegeben, wobei die Szene aus 2 das VD ansteuert

VG Hoggle

Hallo Hoggle,

ich habe mich jetzt für das OpenWeather entschieden. Das VD läuft soweit korrekt. Nun habe ich aber das Problem das die Globale Variable ja 0 ausgibt.Dann hast du geschrieben, das ist soweit korrekt, die muss ja mit Werten gefüllt werden.

jetzt ist meine Frage wo ich die Variable OW_Weather mit Werten fülle?! Laut deinem Post steht dort im Update Button?! Aber wo ist dieser bzw. wo muss der erstellt werden, hoffe das ich mich jetzt etwas besser ausgedrückt habe und danke für deine Geduld :slight_smile:

Welche Variable genau meinst Du mit:
“die Globale Variable ja 0 ausgibt”

Viele Grüße Hoggle

So, damit wir nicht noch übe andere “Dinge” reden :slight_smile:

Ich habe mir zunächst dieses VD runtergeladen:OpenWeather-VD

Der Code im dem VD lautet wie folgt:

-- 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="ORT"
  local country="de" -- en, se, ....
  local api_key="API_KEY" -- 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 = false
  local netatmo_id = 78 -- ID des Thermometers
  
-- VARIABLE für Wind (netatmo oder Z-Weather)

  local wind_var = false
  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); 
  end

Dort habe ich soweit alles eingerichtet und es läuft das VD.

Nun wollte ich die Daten gern nutzen für die Sonos Wetterabfrage. Dann habe ich hier im Thread gelesen das ich noch eine Globale Variable: OW_Weather benötige. Die habe ich soweit erstellt. Nun muss diese Variable aber ja noch mit Daten gefüllt werden.

Dazu soll laut dir ein Udate button im VD folgenden Code haben.

selfId = fibaro:getSelfId()
local id = fibaro:get(fibaro:getSelfId(), "IPAddress")

HC3 = Net.FHttp("api.openweathermap.org") 
danem, statusm = HC3:GET("/data/2.5/weather?q="..id.."&units=metric&APPID=xxxxxxxxxxxx")
danef, statusf = HC3:GET("/data/2.5/forecast?q="..id.."&units=metric&APPID=xxxxxxxxxxxx")

local ajson=json.decode(danem) 
local tempmin=ajson.main.temp_min
local tempmax=ajson.main.temp_max
local pressure=ajson.main.pressure
local humidity=ajson.main.humidity
local city=ajson.name
local wind=ajson.wind.speed
local weather=ajson.weather[1].description

local tm=ajson.dt

local ajsonf=json.decode(danef) 
local n
local t

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

local ftempmin=ajsonf.list[n].main.temp_min
local ftempmax=ajsonf.list[n].main.temp_max
local fpressure=ajsonf.list[n].main.pressure
local fhumidity=ajsonf.list[n].main.humidity
local fwind=ajsonf.list[n].wind.speed

if ftempmin > tempmin then
  fibaro:call(selfId,"setProperty","ui.Label1.value", string.format("%3.1f°C(↑%3.1f)", tempmin, ftempmin))
elseif ftempmin < tempmin then
  fibaro:call(selfId,"setProperty","ui.Label1.value", string.format("%3.1f°C(↓%3.1f)", tempmin, ftempmin))
else
  fibaro:call(selfId,"setProperty","ui.Label1.value", string.format("%3.1f°C(-)", tempmin))
end

if ftempmax > tempmax then
  fibaro:call(selfId,"setProperty","ui.Label2.value", string.format("%3.1f°C(↑%3.1f)", tempmax, ftempmax))
elseif ftempmax < tempmax then
  fibaro:call(selfId,"setProperty","ui.Label2.value", string.format("%3.1f°C(↓%3.1f)", tempmax, ftempmax))
else
  fibaro:call(selfId,"setProperty","ui.Label2.value", string.format("%3.1f°C(-)", tempmax))
end

if fpressure > pressure then
  fibaro:call(selfId,"setProperty","ui.Label3.value",string.format("%dhPa(↑%d)", pressure, fpressure))
elseif fpressure < pressure then
  fibaro:call(selfId,"setProperty","ui.Label3.value",string.format("%dhPa(↓%d)", pressure, fpressure))
else
  fibaro:call(selfId,"setProperty","ui.Label3.value",string.format("%dhPa(-)", pressure))
end

if fhumidity > humidity then
  fibaro:call(selfId,"setProperty","ui.Label4.value",string.format("%d%s(↑%d)", humidity, "%", fhumidity))
elseif fhumidity < humidity then
  fibaro:call(selfId,"setProperty","ui.Label4.value",string.format("%d%s(↓%d)", humidity, "%", fhumidity))
else
  fibaro:call(selfId,"setProperty","ui.Label4.value",string.format("%d%s(-)", humidity, "%"))
end

if fwind > wind then
  fibaro:call(selfId,"setProperty","ui.Label5.value",string.format("%4.1fm/s(↑%4.1f)", wind, fwind))
elseif fwind < wind then
  fibaro:call(selfId,"setProperty","ui.Label5.value",string.format("%4.1fm/s(↓%4.1f)", wind, fwind))
else
  fibaro:call(selfId,"setProperty","ui.Label5.value",string.format("%4.1fm/s(-)", wind))
end
  
  fibaro:call(selfId,"setProperty","ui.Label6.value",city)
  
  fibaro:call(selfId,"setProperty","ui.Label91.value",weather)
	fibaro:setGlobal("OW_Weather", weather)
--------
function setDevicePropertyValue(id, label, value)
  fibaro:call(id, "setProperty", "ui."..label..".value", value)
end

--Date = os.date("%Y-%m-%d %H:%M:%S", os.time())
Date = os.date("%d-%m-%Y %H:%M:%S", os.time())
setDevicePropertyValue(selfId, "DateUpdate",Date)

fibaro:debug("Durchgelaufen")

Jetzt ist meine Frage, wo muss dieser Code rein?! Habe ich evtl. das “falsche” OpenWeather VD?!

Oder wurde das mal geändert?! :slight_smile:

Sorry für die Verwirrung :slight_smile:

In keinem deiner Skripte werden Variablen gesetzt. Dies kannst du aber manuell nachholen.

Gruß

Hallo,

sorry für die vielleicht dumme Frage, aber von welchen Variablen sprichst du?!

Gruß

Wird doch im 2ten Skript gesetzt, übersehen.

Gruß

Ja, da stellt sich mich doch die Frage, wo muss das zweite Script rein?! :slight_smile:

Hoffe da kommt noch eine Antwort :slight_smile:

Gruß

Stehen in deinem verwendeten Code in Zeile 5 und 6 noch die xxxxx drin?
Das Script sieht nach dem OpenWeathetVD und dann wohl dessen Button aus.

Abend.

Der ober Code ist von dem openweather VD der untere Code ist nur aus dem Forum und ich weiß nicht wo der hin muss.

Nein xxx ist durch mein API Code ersetzt

Ich habe jetzt extra für Dich nachgesehen.

Der zweite Code ist bei mir der Code, der bei dem von mir genutzten OpenWeather-VD bei dem Button “Update” hinterlegt ist.
Welchen Stand das von mir genutzte VD, das von Dir heruntergeladene VD und von wann der auf Seite 2 gepostete Code ist, habe ich nicht analysiert.

Wenn Du also den ersten Code nutzt, fehlt (wie von Boomx bereits gesagt hat) die Befüllung der globalen Var “fibaro:setGlobal(“OW_Weather”, weather)”
Der erste Code befüllt direkt die HC-API. Da wäre die globale Var egal bzw. nicht nötig.

Je nach dem, wie Du Deine Wetter Infos beziehst - Openweather und diese globale Var brauchst Du nicht zwingend.

VG Hoggle

Guten morgen,

leider hat das bei mir nicht hingehauen, habe das jetzt aber anders gelöst, so das ich die Wetterdaten erhalte.

Ich hätte noch eine Frage zu dem Sonos Remote.

Wie kann ich denn nach der ansage mein Radio starten?! Was muss ich da wo eintragen?!

Sofern jemand den Code für das Wetter benötigt, kann er sich gern melden.

Gruß