Aller au contenu
sebcbien

Yams Wu - Yet Another Meteo Station (Wunderground Version)

Recommended Posts

en fait ils fonctionnent, je recois les push mais il ne recup pas les images web ;-), donc pas d'icone, ni sur l'interface web, ni sur l'app ;-)

mais c'est aleatoire depuis hier hihiihh

 

auj je les ai ;-)

Partager ce message


Lien à poster
Partager sur d’autres sites

A effacer, plantage serveur du Forum...

Partager ce message


Lien à poster
Partager sur d’autres sites

A effacer, plantage serveur du Forum...

Partager ce message


Lien à poster
Partager sur d’autres sites

Avec ma "migration" Jeedom, j'ai intégré S.A.R.A.H. et je "vocalise" les prévisions météo à  certains moments de la journée.

Bref, l'annonce vocale des prévisions de YAMS n'étant pas top, j'ai révisé le code pour avoir des phrases mieux formées.

 

Voici le code modifié, et désolé, non, je n'ai pas adapté cette modification en multilingue.

 

Le script "devrait" créer 3 nouvelles VG (ça n'a pas fonctionné du premier coup pour moi, mais bon, je ne m'étonne plus de rien et je n'ai pas cherché plus loin)

Meteo_Day_Speech
Meteo_Tomorrow_Sp
Meteo_In_2_Days_Sp

Code Main loop:

-------------------------------------------------------------------------------------------
-- WU WeatherData - Fetch weather data from wunderground.com. Multilanguage support!
-- Original Code by Jonny Larsson 2015 http://forum.fibaro.com/index.php?/topic/19810-wu-weatherdata-version-202-2015-10-25/
-- Forked by Sébastien Jauquet 11/2015 http://www.domotique-fibaro.fr/index.php/topic/6446-yams-wu-yet-another-meteo-station-wunderground-version/
-- Inspired by GEA(steven), stevenvd, Lazer, Krikroff and many other users.
-- Source - forum.fibaro.com, domotique-fibaro.fr and worldwideweb

-- 2014-03-22 - Permissions granted from Krikroff 
-- 2014-03-23 - Added rain and forecast, Added FR language. 
-- 2014-03-23 - Language variable changed to get the translation from wunderground.com in forcast
-- 2014-03-24 - Added PL language
-- 2014-03-24 - Select between PWS or LOCID to download weather data
-- 2015-10-23 - New source code.
-- 2015-11-16 - Permissions granted from Jonny Larsson

-- 2015-11-13 - V3.0 - Fork Code by Sebastien Jauquet (3 days forecast, rain in mm)
-- 2015-11-14 - V3.1 - Compatibilty with GEA, French translation
-- 2015-11-14 - V3.2 - Catch rain errors (-999mm null empty etc.)
-- 2015-11-14 - V3.3 - Catch json decode error (was stopping main loop) with pcall (can be extended to other jdon datas if needed)
-- 2015-11-16 - V3.4 - Generate HTML and non HTML version (for compatibility with mobiles)
-- 2015-11-18 - V3.5 - Fixed bug not updating Meteo_Day becaus WU.now was only updated at first launch
-- 2015-11-18 - V3.6 - Merged some changes from jompa new version
-- 2015-11-18 - 		Added autmatic creation of Global Variables if not existing
-- 2015-11-19 - V3.7 - Modify schedule management and CleanUp code
-- 2015-11-22 - V3.8 - Finalise mobile version and bug fixing
-- 2015-11-23 - V3.9 - Added multiple notification options (Lazer way)
-- 2015-11-30 - V4.0 - More precision for rain mm (moring/evening) + added feels like T° + optimized display
-- 2016-07-11 - V4.1 - Added Speech VG, with subst of symbols of day, tomorrow and Day+2 to be more speech compatible (in french only, sorry)
-- Look for nearest station here: http://www.wunderground.com

-------------------------------------------------------------------------------------------
-- MAIN CODE --
-------------------------------------------------------------------------------------------
WU = {};
-- WU settings
	WU.APIkey = "XXXXXXXXXxxxxxXX";		-- Put your WU api key here
	WU.PWS = "IGVLEBOR5";				-- The PWS location to get data from (Personal Weather Station)
	WU.LOCID = "SWXX0076";				-- The location ID to get data from (City location)
	WU.station = "PWS";					-- Choose your prefered method to retrieve from: PWS or LOCID
-- notifications
	WU.notifications = true;				-- send notifications
	WU.push_fcst1 = "11:30";				-- time when forecast for today will be pushed to smartphone
	WU.push_fcst2 = "18:15";				-- time when forecast for tonight will be pushed to smartphone
	WU.notificationTypes = {"push", "email"};--notification types {"push", "email", "sms"}
	WU.smartphoneID = {1347};				-- Smartphone Id to send push to. {id1, id2, id3}
	WU.userID = {2};						-- User Id to send email to. {id1, id2, id3}
	WU.sms = {
		["VD_ID"] = 0,						-- Virtual Device ID
		["VD_Button"] = "1",				-- Virtual Device Button
		["VG_Name"] = "SMS"};				-- Global Variable Name
	WU.debug_messages = false;				-- Diplay debug for notifications
-- Other settings
	WU.translation = {true};
	WU.language = "FR";						-- EN, FR, SW, PL (default is en)
	WU.GEA = true;							-- subst % with %% when storing in the VG's (because gea bug with % in push messages)
	WU.CreateVG = true;						-- will atomaticaly create global variables at first run if = true
	WU.updateEvery = 30;					-- get data every xx minutes
-- Do not change
	WU.startTime = os.time();
	WU.scheduler = os.time()+60*WU.updateEvery;
	WU.currentDate = os.date("*t");
	WU.now = os.date("%H:%M");
	WU.DoNotRecheckBefore = os.time();
	WU.selfId = fibaro:getSelfId();
	WU.version = "4.1";

WU.translation["EN"] = {
	Push_forecast = "Push forecast",
	Exiting_loop_slider = "Exiting loop earlier (Slider Changed)",
	Exiting_loop_push = "Exiting loop earlier (For push)",
	Last_updated = "Last updated",
	Temperature = "T°/Feels Like",
	Humidity = "Humidity",
	Pressure = "Pressure",
	Wind = "Wind",
	Rain = "Rain",
	Forecast = "Forecast ",
	EmailSubject = "Meteo of this",
	Station = "Station",
	Fetched = "Fetched",
	Data_processed = "Data processed",
	Update_interval = "Next update will be in (min)",
	No_data_fetched = "No data fetched",
	NO_STATIONID_FOUND = "No stationID found",
	NO_DATA_FOUND = "No data found"
	};
WU.translation["FR"] = {
	Push_forecast = "Push des prévisions",
	Exiting_loop_slider = "Sortie de boucle (Slider Changé)",
	Exiting_loop_push = "Sortie de boucle (Pour Push)",
	Last_updated = "Mise à  jour",
	Temperature = "T°/Ressentie",
	Humidity = "Humidité",
	Pressure = "Pression",
	Wind = "Vent",
	Rain = "Pluie",
	Forecast = "",
	EmailSubject = "Météo de ce",
	Station = "Station",
	Fetched = "Données reçues",
	Data_processed = "Données mises à  jour",
	Update_interval = "Prochaine Mise à  jour prévue dans (min)",
	No_data_fetched = "Pas de données reçues !!",
	NO_STATIONID_FOUND = "StationID non trouvée !!",
	NO_DATA_FOUND = "Pas de données disponibles !!"
	};
WU.translation["SW"] = {
	Push_forecast = "Push forecast",
	Exiting_loop_slider = "Exiting loop earlier (Slider Changed)",
	Exiting_loop_push = "Exiting loop earlier (For push)",
	Last_updated = "Last updated",
	Temperature = "T°/Feels Like",
	Humidity = "Fuktighet",
	Pressure = "Barometer",
	Wind = "Vind",
	Rain = "Regn",
	Forecast = "Prognos ",
	EmailSubject = "Meteo of this",
	Station = "Station",
	Fetched = "Hà¤mtat",
	Data_processed = "All data processat",
	Update_interval = "Nà¤sta uppdatering à¤r om (min)",
	No_data_fetched = "Inget data hà¤mtat",
	NO_STATIONID_FOUND = "StationID ej funnet",
	NO_DATA_FOUND = "Ingen data hos WU"
	};
WU.translation["PL"] = {
	Push_forecast = "Push prognoza",
	Exiting_loop_slider = "Exiting loop earlier (Slider Changed)",
	Exiting_loop_push = "Exiting loop earlier (For push)",
	Last_updated = "Last updated",
	Temperature = "T°/Feels Like",
	Humidity = "Wilgotnosc",
	Pressure = "Pressure",
	Wind = "Wiatr",
	Rain = "Rain",
	Forecast = "Forecast ",
	EmailSubject = "Meteo of this",
	Station = "Station",
	Fetched = "Fetched",
	Data_processed = "Data processed",
	No_data_fetched = "No data fetched",
	Update_interval = "Next update will be in (min)",
	NO_STATIONID_FOUND = "No stationID found",
	NO_DATA_FOUND = "No data found"
	};
WU.translation["NL"] = {
	Push_forecast = "Push verwachting",
	Exiting_loop_slider = "Exiting loop earlier (Slider Changed)",
	Exiting_loop_push = "Exiting loop earlier (For push)",
	Last_updated = "Last updated",
	Temperature = "T°/Feels Like",
	Humidity = "Vochtigheid",
	Pressure = "Druk",
	Wind = "Wind",
	Rain = "Regen",
	Forecast = "Verwachting ",
	EmailSubject = "Meteo of this",
	Station = "Weerstation",
	Fetched = "Ontvangen",
	Data_processed = "Gegevens verwerkt",
	Update_interval = "Volgende update in (min)",
	No_data_fetched = "Geen gegevens ontvangen",
	NO_STATIONID_FOUND = "Geen stationID gevonden",
	NO_DATA_FOUND = "Geen gegevens gevonden"
	};
WU.translation["DE"] = {
	Push_forecast = "Push vorhersage",
	Exiting_loop_slider = "Exiting loop earlier (Slider Changed)",
	Exiting_loop_push = "Exiting loop earlier (For push)",
	Last_updated = "Last updated",
	Temperature = "T°/Feels Like",
	Humidity = "Luftfeuchtigkeit",
	Pressure = "Luftdruck",
	Wind = "Wind",
	Rain = "Regen",
	Forecast = "Vorhersage ",
	EmailSubject = "Meteo of this",
	Station = "Station",
	Fetched = "Abgerufen",
	Data_processed = "Daten verarbeitet",
	No_data_fetched = "Keine Daten abgerufen",
	Update_interval = "Das nà¤chste Update in (min)",
	NO_STATIONID_FOUND = "Keine stationID gefunden",
	NO_DATA_FOUND = "Keine Daten gefunden"
	};

Debug = function (color, message)
	if color and color ~= "" then
		fibaro:debug('<span style="color:'..color..';">'..message..'</span>');
	else
		fibaro:debug(message);
	end
end
WU.notification = function(message, subject, param)
	local message = message or "<vide>";
	if WU.debug_messages then
		Debug("yellow", "Notification : "..message);
	end
	if param then
		for _, notif in ipairs(param) do
			if WU.debug_messages then
				Debug("grey", notif);
			end
			-- Envoi Push
			if notif == "push" and WU.smartphoneID then
				for _, id in ipairs(WU.smartphoneID) do
					if WU.debug_messages then
						Debug("grey", "Send Push smartphone ID : "..id);
					end
					fibaro:call(id, "sendPush", message);
				end
			-- Envoi Email
			elseif notif == "email" and WU.userID then
				for _, id in ipairs(WU.userID) do
					if WU.debug_messages then
						Debug("grey", "Send Email user ID : "..id);
					end
					fibaro:call(id, "sendEmail", subject, message);
				end
			-- Envoi SMS
			elseif notif == "sms" and WU.sms then
				if WU.debug_messages then
					Debug("grey", "Send SMS : VD_ID="..(WU.sms["VD_ID"] or 0).." VD_Button="..(WU.sms["VD_Button"] or "0").." VG_Name="..(WU.sms["VG_Name"] or ""));
				end
				fibaro:setGlobal(WU.sms["VG_Name"], message);
				if WU.sms["VD_ID"] and tonumber(WU.sms["VD_ID"])>0 and WU.sms["VD_Button"] and tonumber(WU.sms["VD_Button"])>0 then
					fibaro:call(WU.sms["VD_ID"], "pressButton", WU.sms["VD_Button"]);
				end
			end
		end
	else
		Debug("orange", "Warning : no notification options given");
	end
end
WU.createGlobalIfNotExists = function(varName, defaultValue)
	if (fibaro:getGlobal(varName) == "") then
		Debug("red", "Global Var: "..varName.." HAS BEEN CREATED");
		newVar = {};
		newVar.name = varName;
		HC2 = Net.FHttp("127.0.0.1", 11111);
		HC2:POST("/api/globalVariables", json.encode(newVar));
	end
end
WU.substPercent = function(doublePercentSymbol)
	if 	WU.GEA then
		doublePercentSymbol = string.gsub(doublePercentSymbol, "%%.", "%%%%");
	end
	return doublePercentSymbol;
end
WU.substSpeech = function(substSpeech)
		substSpeech = string.gsub(substSpeech, "km/h", "kilomètre heure");
                substSpeech = string.gsub(substSpeech, "ºC", "degrés");
		substSpeech = string.gsub(substSpeech, "°C", "degrés");
		substSpeech = string.gsub(substSpeech, "%(", "de ");
		substSpeech = string.gsub(substSpeech, "%)", "");
		substSpeech = string.gsub(substSpeech, "mm", "milimètres de pluie.");
		substSpeech = string.gsub(substSpeech, " Vents ", " Vents de provenance ");
		substSpeech = string.gsub(substSpeech, "/", " à  ");
		substSpeech = string.gsub(substSpeech, " N ", " Nord ");
		substSpeech = string.gsub(substSpeech, " S ", " Sud ");
		substSpeech = string.gsub(substSpeech, " E ", " Est ");
		substSpeech = string.gsub(substSpeech, " O ", " Ouest ");
		substSpeech = string.gsub(substSpeech, " NE ", " Nord Est ");
		substSpeech = string.gsub(substSpeech, " NNE ", " Nord Nord Est ");
		substSpeech = string.gsub(substSpeech, " ENE ", " Est Nord Est ");
		substSpeech = string.gsub(substSpeech, " NO ", " Nord Ouest ");
		substSpeech = string.gsub(substSpeech, " NNO ", " Nord Nord Ouest ");
		substSpeech = string.gsub(substSpeech, " ONO ", " Ouest Nord Ouest ");
		substSpeech = string.gsub(substSpeech, " SE ", " Sud Est ");
		substSpeech = string.gsub(substSpeech, " SSE ", " Sud Sud Est ");
		substSpeech = string.gsub(substSpeech, " ESE ", " Est Sud Est ");
		substSpeech = string.gsub(substSpeech, " SO ", " Sud Ouest ");
		substSpeech = string.gsub(substSpeech, " SSO ", " Sud Sud Ouest ");
		substSpeech = string.gsub(substSpeech, " OSO ", " Ouest Sud Ouest ");
	return substSpeech;
end
WU.cleanJson = function(jsontocheck,returnIfTrue)
	if jsontocheck == "-999.00" or jsontocheck == "--" or jsontocheck == json.null then
	jsontocheck = returnIfTrue;
	end
		local ok = pcall(function()
			testConcatenate = "Test Concatenate: " .. jsontocheck; -- test for non concatenate value
			end )
		if (not ok) then
			decode_error = true;
			Debug( "red", "decode raised an error");
			if WU.notifications then
				WU.notification("decode error in WU Meteo","Got a Decode Error in WU Meteo.", WU.notificationTypes);
			end
		end
	return jsontocheck;
end
WU.HtmlColor = function(StringToColor,color)
	if MobileDisplay == false then 
	StringToColor= "<font color=\""..color.."\"> "..StringToColor.."</font>";
	end
	return StringToColor;
end
WU.IconOrText = function(icon,txt)
	if MobileDisplay == false then
	IconOrText = "<img src="..icon.."\>";
	else
	IconOrText = txt;
	end
	return IconOrText;
end
WU.HtmlOrText = function(_html,txt)
	if MobileDisplay == false then 
	HtmlOrText = _html;
	else
	HtmlOrText = txt;
	end
	return HtmlOrText;
end
WU.getSlider = function()
	ValeurSliderfunct = fibaro:getValue(WU.selfId , "ui.WebOrMobile.value");
	return tonumber(ValeurSliderfunct);
end
WU.setSlider = function(position)
	fibaro:call(WU.selfId , "setProperty", "ui.WebOrMobile.value", position);
	return WU.getSlider();
end
WU.checkMobileOrWeb = function()
	ValeurSliderSleep = WU.getSlider(); -- check slider value at first run
	if ValeurSliderSleep <= 50 then 
		if ValeurSliderSleep == 1 then
		MobileDisplay = false;
		else
		MobileDisplay = false;
		WU.runDirect = 1;
		sleepAndcheckslider = 20*WU.updateEvery; -- exit wait loop
		Debug("orange", WU.translation[WU.language]["Exiting_loop_slider"]);
		end
		WU.setSlider(1); -- désactive le run immediat lors du prochain test
	end
	if ValeurSliderSleep >= 50 then
		if ValeurSliderSleep == 98 then
		else
		MobileDisplay = true;
		WU.runDirect = 1;
		sleepAndcheckslider = 20*WU.updateEvery; -- exit wait loop
		Debug("orange", WU.translation[WU.language]["Exiting_loop_slider"]);
		end
		WU.setSlider(98); -- désactive le run immediat lors du prochain test
	end 
  return WU.getSlider();
end
WU.fetchWU = function()
decode_error = false;
WU.checkMobileOrWeb();
local WGROUND = Net.FHttp("api.wunderground.com",80);
local response ,status, err = WGROUND:GET("/api/"..WU.APIkey.."/conditions/forecast/lang:"..WU.language.."/q/"..WU.station..":"..locationID..".json");
--Debug("orange", "api.wunderground.com/api/"..WU.APIkey.."/conditions/forecast/lang:"..WU.language.."/q/"..WU.station..":"..locationID..".json");
if (tonumber(status) == 200 and tonumber(err)==0) then
	Debug( "cyan", WU.translation[WU.language]["Fetched"]);
	if (response ~= nil) then
		WU.now = os.date("%H:%M");
		jsonTable = json.decode(response);
		if jsonTable.response.error ~= nil then
			Debug( "red", WU.translation[WU.language]["NO_DATA_FOUND"]);
			fibaro:sleep(15*1000);
			Debug( "yellow", WU.translation[WU.language]["NO_DATA_FOUND"]);
			fibaro:sleep(15*1000);
		return
		end
		-- current observation
		stationID = jsonTable.current_observation.station_id;
		humidity = jsonTable.current_observation.relative_humidity;
		temperature = jsonTable.current_observation.temp_c;
		pression = jsonTable.current_observation.pressure_mb;
		wind = jsonTable.current_observation.wind_kph;
		rain = WU.cleanJson(jsonTable.current_observation.precip_today_metric,"0");
		weathericon = jsonTable.current_observation.icon_url;
		feelslike_c = jsonTable.current_observation.feelslike_c;
		temperatureWithFeels = temperature.."/"..feelslike_c
		-- Today meteo
		fcstday1 = jsonTable.forecast.txt_forecast.forecastday[1].title;
			fcst1 = jsonTable.forecast.txt_forecast.forecastday[1].fcttext_metric;
			fcst1icon = jsonTable.forecast.txt_forecast.forecastday[1].icon_url;
		-- Today Evening Meteo
		fcstday2 = jsonTable.forecast.txt_forecast.forecastday[2].title;
			fcst2 = jsonTable.forecast.txt_forecast.forecastday[2].fcttext_metric;
			fcst2icon = jsonTable.forecast.txt_forecast.forecastday[2].icon_url;
		-- Tomorrow Morning Meteo
		fcstday3 = jsonTable.forecast.txt_forecast.forecastday[3].title;
			fcst3 = jsonTable.forecast.txt_forecast.forecastday[3].fcttext_metric;
			fcst3icon = jsonTable.forecast.txt_forecast.forecastday[3].icon_url;
		 -- In 2 days Morning Meteo
		fcstday5 = jsonTable.forecast.txt_forecast.forecastday[5].title;
			fcst5 = jsonTable.forecast.txt_forecast.forecastday[5].fcttext_metric;
			fcst5icon = jsonTable.forecast.txt_forecast.forecastday[5].icon_url;

			-- SimpleForecast Today Meteo (Complete day)
			fcst1SmallTxt = jsonTable.forecast.simpleforecast.forecastday[1].conditions;
			fcst1Tmax = jsonTable.forecast.simpleforecast.forecastday[1].high.celsius;
			fcst1Tmin = jsonTable.forecast.simpleforecast.forecastday[1].low.celsius;
			fcst1avewind =jsonTable.forecast.simpleforecast.forecastday[1].avewind.kph;
			fcst1avewinddir =jsonTable.forecast.simpleforecast.forecastday[1].avewind.dir;
			fcst1mmday = WU.cleanJson(jsonTable.forecast.simpleforecast.forecastday[1].qpf_day.mm,"0");
			fcst1mmnight = WU.cleanJson(jsonTable.forecast.simpleforecast.forecastday[1].qpf_night.mm,"0");
			fcst1mm = fcst1mmday.."/"..fcst1mmnight
		-- SimpleForecast Tomorrow Meteo (Complete day)
			fcst2SmallTxt = jsonTable.forecast.simpleforecast.forecastday[2].conditions;
			fcst2Tmax = jsonTable.forecast.simpleforecast.forecastday[2].high.celsius;
			fcst2Tmin = jsonTable.forecast.simpleforecast.forecastday[2].low.celsius;
			fcst2avewind =jsonTable.forecast.simpleforecast.forecastday[2].avewind.kph;
			fcst2avewinddir =jsonTable.forecast.simpleforecast.forecastday[2].avewind.dir;
			fcst2mmday = WU.cleanJson(jsonTable.forecast.simpleforecast.forecastday[2].qpf_day.mm,"0");
			fcst2mmnight = WU.cleanJson(jsonTable.forecast.simpleforecast.forecastday[2].qpf_night.mm,"0");
			fcst2mm = fcst2mmday.."/"..fcst2mmnight
		-- In 2 days Meteo (Complete day)
			fcst3SmallTxt = jsonTable.forecast.simpleforecast.forecastday[3].conditions;
			fcst3Tmax = jsonTable.forecast.simpleforecast.forecastday[3].high.celsius;
			fcst3Tmin = jsonTable.forecast.simpleforecast.forecastday[3].low.celsius;
			fcst3avewind =jsonTable.forecast.simpleforecast.forecastday[3].avewind.kph;
			fcst3avewinddir =jsonTable.forecast.simpleforecast.forecastday[3].avewind.dir;
			fcst3mmday = WU.cleanJson(jsonTable.forecast.simpleforecast.forecastday[3].qpf_day.mm,"0");
			fcst3mmnight = WU.cleanJson(jsonTable.forecast.simpleforecast.forecastday[3].qpf_night.mm,"0");
			fcst3mm = fcst3mmday.."/"..fcst3mmnight


		if (stationID ~= nil) and decode_error == false  then
			fibaro:call(WU.selfId , "setProperty", "ui.lblStation.value", locationID);
			if temperature < 5 then
			cTemperature = WU.HtmlColor(temperatureWithFeels,"00bfff");
			elseif temperature > 18 then
			cTemperature = WU.HtmlColor(temperatureWithFeels,"ff4500");
			else
			cTemperature = WU.HtmlColor(temperatureWithFeels,"ffd700");
			end
			fibaro:call(WU.selfId , "setProperty", "ui.lblTempHum.value", WU.translation[WU.language]["Temperature"]..": "..cTemperature.."°C | "..humidity.." "..WU.translation[WU.language]["Humidity"]);
			fibaro:call(WU.selfId , "setProperty", "ui.lblWindRain.value", WU.translation[WU.language]["Wind"]..": "..wind.." km/h - "..WU.translation[WU.language]["Rain"]..": "..rain.." mm");
			if (WU.now >= "03:00" and WU.now <= "15:59") then -- donne meteo du jour entre 00:00 (ou 3h) et 15:59. permet de garder la météo du soir jusqu'a 3h du matin, sinon change à  minuit
			fibaro:call(WU.selfId , "setProperty", "ui.lblFcst.value", WU.HtmlOrText(
				WU.HtmlColor(WU.translation[WU.language]["Forecast"],"c0c0c0")..WU.HtmlColor(fcstday1,"ff4500")..": "..WU.HtmlColor(fcst1.." ("..fcst1mm.." mm)","b0c4de"),
				fcst1Tmax.."°/"..fcst1Tmin.."° | "..fcst1mm.."mm | "..fcst1avewind.."Km/h ("..fcst1avewinddir..")"));
			fibaro:call(WU.selfId , "setProperty", "ui.lblIcon.value",WU.IconOrText(fcst1icon,fcstday1..": "..fcst1SmallTxt));
			local texte = WU.substPercent(WU.translation[WU.language]["Forecast"]..fcstday1..": ".." "..fcst1.." ("..fcst1mm.." mm)");
			fibaro:setGlobal("Meteo_Day", texte);
			local texte = WU.substPercent(WU.translation[WU.language]["Forecast"]..fcstday1..": ".." "..fcst1);
			texte = WU.substSpeech(texte);
			fibaro:setGlobal("Meteo_Day_Speech", texte);
			elseif (WU.now >= "16:00" and WU.now <= "23:59") then  -- donne meteo soirée entre 16:00 et 23:59
			fibaro:call(WU.selfId , "setProperty", "ui.lblFcst.value", WU.HtmlOrText(
				WU.HtmlColor(WU.translation[WU.language]["Forecast"],"c0c0c0")..WU.HtmlColor(fcstday2,"ff4500")..": "..WU.HtmlColor(fcst2.." ("..fcst1mm.." mm)","b0c4de"),
				fcst1Tmax.."°/"..fcst1Tmin.."° | "..fcst1mm.."mm | "..fcst1avewind.."Km/h ("..fcst1avewinddir..")"));
			fibaro:call(WU.selfId , "setProperty", "ui.lblIcon.value",WU.IconOrText(fcst2icon,fcstday2..": "..fcst1SmallTxt));
			local texte = WU.substPercent(WU.translation[WU.language]["Forecast"]..fcstday2..": ".." "..fcst2.." ("..fcst1mm.." mm)");
			fibaro:setGlobal("Meteo_Day", texte);
			local texte = WU.substPercent(WU.translation[WU.language]["Forecast"]..fcstday2..": ".." "..fcst2);
			texte = WU.substSpeech(texte);
			fibaro:setGlobal("Meteo_Day_Speech", texte);
			end
			-- Meteo of Tomorrow
			fibaro:call(WU.selfId , "setProperty", "ui.lblFcstTomorrow.value", WU.HtmlOrText(
				WU.HtmlColor(WU.translation[WU.language]["Forecast"],"c0c0c0")..WU.HtmlColor(fcstday3,"ff4500")..": "..WU.HtmlColor(fcst3.." ("..fcst2mm.." mm)","b0c4de"),
				fcst2Tmax.."°/"..fcst2Tmin.."° | "..fcst2mm.."mm | "..fcst2avewind.."Km/h ("..fcst2avewinddir..")"));
			fibaro:call(WU.selfId , "setProperty", "ui.lblIconTomorrow.value",WU.IconOrText(fcst3icon,fcstday3..": "..fcst2SmallTxt));
			local texte = WU.substPercent(WU.translation[WU.language]["Forecast"]..fcstday3..": ".." "..fcst3.." ("..fcst2mm.." mm)");
			fibaro:setGlobal("Meteo_Tomorrow", texte);
			local texte = WU.substPercent(WU.translation[WU.language]["Forecast"]..fcstday3..": ".." "..fcst3);
			texte = WU.substSpeech(texte);
			fibaro:setGlobal("Meteo_Tomorrow_Sp", texte);
			-- Meteo in 2 Days
			fibaro:call(WU.selfId , "setProperty", "ui.lblFcst2Days.value", WU.HtmlOrText(
				WU.HtmlColor(WU.translation[WU.language]["Forecast"],"c0c0c0")..WU.HtmlColor(fcstday5,"ff4500")..": "..WU.HtmlColor(fcst5.." ("..fcst3mm.." mm)","b0c4de"),
				fcst3Tmax.."°/"..fcst3Tmin.."° | "..fcst3mm.."mm | "..fcst3avewind.."Km/h ("..fcst3avewinddir..")"));
			fibaro:call(WU.selfId , "setProperty", "ui.lblIcon2Days.value",WU.IconOrText(fcst5icon,fcstday5..": "..fcst3SmallTxt));
			local texte = WU.substPercent(WU.translation[WU.language]["Forecast"]..fcstday5..": ".." "..fcst5.." ("..fcst3mm.." mm)");
			fibaro:setGlobal("Meteo_In_2_Days", texte);
			local texte = WU.substPercent(WU.translation[WU.language]["Forecast"]..fcstday5..": ".." "..fcst5);
			texte = WU.substSpeech(texte);
			fibaro:setGlobal("Meteo_In_2_Days_Sp", texte);
			if WU.notifications then
				if (os.date("%H:%M") == WU.push_fcst1) then
					WU.notification(fcstday1.." - "..fcst1.." ("..fcst1mm.." mm)" , WU.translation[WU.language]["EmailSubject"].." "..fcstday1 , WU.notificationTypes); -- Send Morning meteo
				elseif (os.date("%H:%M") == WU.push_fcst2) then
					WU.notification( fcstday2.." - "..fcst2.." ("..fcst2mm.." mm)" , WU.translation[WU.language]["EmailSubject"].." "..fcstday2 , WU.notificationTypes); -- Send evening meteo
				end
			end
			if WU.notifications then
				fibaro:call(WU.selfId , "setProperty", "ui.lblNotify.value", WU.translation[WU.language]["Push_forecast"].."  = true");
			else fibaro:call(WU.selfId , "setProperty", "ui.lblNotify.value",WU.translation[WU.language]["Push_forecast"].."  = false");
			end
			WU.scheduler = os.time()+WU.updateEvery*60;
			fibaro:call(WU.selfId, "setProperty", "ui.lblUpdate.value", WU.translation[WU.language]["Last_updated"]..": "..os.date("%c"));
			Debug( "cyan", WU.translation[WU.language]["Data_processed"]);
			Debug( "white", WU.translation[WU.language]["Update_interval"].." "..WU.updateEvery);
		else
		Debug( "red", WU.translation[WU.language]["NO_STATIONID_FOUND"]);
		end
	else
	fibaro:debug("status:" .. status .. ", errorCode:" .. errorCode);
	end
end
sleepAndcheckslider = 0;
while sleepAndcheckslider <= 20*WU.updateEvery do
	fibaro:sleep(3000);
	WU.checkMobileOrWeb();
	sleepAndcheckslider = sleepAndcheckslider+1;
	if (WU.DoNotRecheckBefore <= os.time()) and ((WU.scheduler == os.time) or (os.date("%H:%M") == WU.push_fcst1) or (os.date("%H:%M") == WU.push_fcst2)) then
		Debug("orange", WU.translation[WU.language]["Exiting_loop_push"]);
		WU.DoNotRecheckBefore = os.time()+60;
		sleepAndcheckslider = 20*WU.updateEvery;
	end
end
end

Debug( "orange", "10/2015 - WU Weather - Original LUA Scripting by Jonny Larsson 2015");
Debug( "orange", "11/2015 - YAMS WU - Fork by Sébastien Jauquet");
Debug( "orange", "Version: "..WU.version);
if WU.station == "LOCID" then
	locationID = WU.LOCID;
elseif
	WU.station == "PWS" then
	locationID = WU.PWS;
end
if WU.CreateVG then
	WU.createGlobalIfNotExists("Meteo_Day", "");
	WU.createGlobalIfNotExists("Meteo_Tomorrow", "");
	WU.createGlobalIfNotExists("Meteo_In_2_Days", "");
	WU.createGlobalIfNotExists("Meteo_Day_Speech", "");
	WU.createGlobalIfNotExists("Meteo_Tomorrow_Sp", "");
	WU.createGlobalIfNotExists("Meteo_In_2_Days_Sp", "");
end
while true do 
	WU.fetchWU();
end

Partager ce message


Lien à poster
Partager sur d’autres sites

Donc ceci:

lundi: Partiellement nuageux. Maximales : 24 °C. Vents OSO soufflant de 10 à  15 km/h. (0/0 mm)

 

Devient ceci:

lundi: Partiellement nuageux. Maximales : 24 degrés. Vents de provenance Ouest Sud Ouest soufflant de 10 à  15 kilomètre heure.

Partager ce message


Lien à poster
Partager sur d’autres sites

Super merci Seb, le top;

 

Je teste en rentrant de vacs, j'ose pas jouer à  distance;-)

je pourrai vocaliser avec les SONOS top merci beaucoup

 

le pied les DEVS ;-) vous etes des boss

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut Sebcbien,

 

Mis en place avec les annonces vocales pour Sonos pour moi, PARFAIT !! merci beaucoup le TOP

 

Pour moi non plus la creation des VGs n'a pas fonctionné, donc je l'ai fait à  la mano ;-) à  l'ancienne ;-)

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Cool :-)

J'imagine que c'est encore une modif de la part des polaks ;-) car je n'ai pas changé la fonction de création des vg, j'ai juste rajouté les nouvelles vg àla liste.

Sent from my Note4

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut @sebcbien,

 

J'ai un petit bug ;) 

 

Je n'ai plus de conversion  de "°C" en "degrés" vers la variable speech ;-) alors la madame du TTS de sonos me lit "C" apres la temperature ;-)

Une idée ?

Merci merci

substSpeech = string.gsub(substSpeech, "°C", "degrés");

texte = WU.substSpeech(texte);
fibaro:setGlobal("Meteo_Tomorrow_Sp", texte);

 [DEBUG] 21:16:25: Meteo_Tomorrow_Sp : samedi: Partiellement nuageux. Maximales : 24 ºC. Vents de provenance Ouest Nord Ouest soufflant de 10 à  15 kilomètre heure.
[DEBUG] 21:16:25: Meteo_Tomorrow : samedi: Partiellement nuageux. Maximales : 24 ºC. Vents ONO soufflant de 10 à  15 km/h. (0/0 mm)

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est"marrant" idem chez moi, ça ne convertit plus... Hmmm sans doute qquechose changé chez WU.

Pas trop le temps de regarder maintenant :-/

Sent from my Note4

Partager ce message


Lien à poster
Partager sur d’autres sites

Pas de souci, c'etait surtout pour savoir si cela venait de moi ou bug general ;-)

 

J'essaierai de jeter un oeil chez WU au cas où

 

;-)

Partager ce message


Lien à poster
Partager sur d’autres sites

la solution est dans le code que tu as posté ;-)

Ils ont changé le 

°

 en 

º

voici la ligne modifiée:

substSpeech = string.gsub(substSpeech, "ºC", "degrés");

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai modifié le code àla page précédente, j'ai laissé les deux, pas testé mais ça devrait fonctionner si jamais ils reviennent en arrière

Partager ce message


Lien à poster
Partager sur d’autres sites

Well done,

je sais pas coment tu l'as vu celle là  ;-)

 

Mis en place, pas testé, j'ai aussi laissé les 2 ;-)

 

MErci @sebcbien

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut @sebcbien

 

suis-je le seul à  avoir le bug ?

 

D'après le debug je recois bien les données de WU, mais cela ne met plus à  jour ni les Labels, ni les VG ni les VG_speech ;-)

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut @pepite, je ne sais pas si tu es le seul, mais chez moi ça fonctionne toujours...

Essaye de refaire un save peut-être?

Sinon, question importante, as-tu vérifié qu'il n'a pas de chats noir qui rodent ?

Sent from my Note4

Partager ce message


Lien à poster
Partager sur d’autres sites

Ah ben non ;-)

 

J'ai fait le save plusieurs fois, bizarre

 

bon, ben je vias jeter un oeil au chat alors ;-)

C'est peut-etre @jojo qui me l'a refilé ;-)

 

Je cherche le bug

Partager ce message


Lien à poster
Partager sur d’autres sites

Essaye de mettre les paramètres de localisation par défaut, c'est peut-être le json de ta localisation qui foire.

Attention que parfois ce n'est pas mis àjour tout de suite àcause du scheduler

Sent from my Note4

Partager ce message


Lien à poster
Partager sur d’autres sites

Bien vu le coup du json ;-)

 

LE Coupable est bien lui !! suis alle sur l'api et en pws, le json est vide, mais en LOCID ;-) all is good

 

Si ca peut servir a d'autres, c'est cette adresse dans le code de @sebcbien :

api.wunderground.com/api/"..WU.APIkey.."/conditions/forecast/lang:"..WU.language.."/q/"..WU.station..":"..locationID..".json
  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est probablement le propriétaire de la station météo personnelle (pws) qui l'a débranchée ou qui est parti en vacances...

Sent from my Note4

Partager ce message


Lien à poster
Partager sur d’autres sites

oui certainement, finalement en LOCID c'est peut-etre tout aussi fiable ;-)

Partager ce message


Lien à poster
Partager sur d’autres sites

 Bonsoir,

Je me suis enfin décidé à  installer ce somptueux VD, merci @sebcbien! :13::60::13:

C'est surtout parce qu'il y a une station à  5/6 km à  vol d'oiseau (si j'entre une ville avec un code FRXX, c'est à  une vingtaine de bornes) et j'ai réussi sans trop de problèmes, si ce n'est les variables à  créer: à  quoi servent-elles? Et aussi si je veux faire parler ma Sonos le matin juste pour la tendance du jour ("lblFcst" je crois), la température est juste car remontée d'un FGBS, que faut-il ajouter? (il me semble que @pepite a mis ça en place). Rien mis encore dans GEA non plus.

Partager ce message


Lien à poster
Partager sur d’autres sites

 Un autre truc bizarre depuis minuit je crois, il ne m'affiche plus mardi.

 

post-43-0-26857100-1472511283_thumb.png

Partager ce message


Lien à poster
Partager sur d’autres sites

Les variables globalesservent àstocker les messages. Après tu récupère ca dans gea et tu pousse vers tes sonos aux conditions que tu désire.

Pour le mardi?!?! Bizarre

Sent from my Note4

Partager ce message


Lien à poster
Partager sur d’autres sites

Il faut passer sur Jeedom pour le bug du mardi...

Partager ce message


Lien à poster
Partager sur d’autres sites

×