Aller au contenu
Dragoniacs

Infos Météo avec Weatherbit

Recommended Posts

Bonjour à tous,

 

Suite à la disparition de l'API Wunderground, je me suis permise de reprendre en partie le YAMS de @sebcbien, en utilisant également le travail de @Dgille, afin de nous concocter un nouveau VD de gestion météo. Cela surtout pour me permettre de faire de nouveau parler mon lapin :60:

 

Codes sources :

https://www.domotique-fibaro.fr/topic/6446-yams-wu-yet-another-meteo-station-wunderground-version/

https://www.domotique-fibaro.fr/topic/13120-météo-avec-weatherbitio/

 

  • Prérequis

Ouvrir un compte sur le site https://www.weatherbit.io/

Dans vos paramètres de compte, vous devrez récupérer votre clé pour pourvoir utiliser les API

 

  • Installation

Importez le VD.

 

WeatherBit_Dragoniacs_V2-4.vfib

 

Créez une nouvelle scène, et collez le code suivant :

--[[
%% autostart
%% properties
%% globals
--]]
-------------------------------------------------------------------------------
-- SCENE REALISEE PAR DRAGONIACS POUR www.domotique-fibaro.fr
-- UTILISATION LIBRE DE DROITS
-- MERCI A Dgille & Sebcbien POUR LES CODES DONT JE ME SUIS FORTEMENT INSPIREE
-- VERSION 2.4
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
-- PARAMETRES DE L UTILISATEUR
-------------------------------------------------------------------------------
WBApikey = "xxxxxxxxxxxxxxxxxxxxxxx"  -- API Key WeatherBit
WBCityid = "" -- Code ville, sinon vide pour latitude longitude de la HC2
WBlang  = "fr"
WDelai = 30     -- Période d'actualisation en minute (minimum 2, max 45)
WD_VD = 876 -- Préciser l'ID du VD WeatherBit
WPushMatin = "07:00" -- Heure d'envoi des infos le matin, laisser vide si pas de push
WPushSoir = "17:00" -- Heure d'envoie des infos le soir, laisser vide si pas de push
WPushDemain = "21:00" -- Heure d'envoi des infos du lendemain, laisser vide si pas de push
WPush_type = {"SMS","Push","eMail"} -- Préciser le type de notification souhaitée
WPush_Email = 2 -- Préciser le numéro de user qui doit recevoir les email
WPush_Phone = 592 -- Préciser le numéro du téléphone qui doit recevoir les push
WPush_VG = "Pushover" -- Préciser nom de la variable globale utilisée dans le VD de SMS
WPush_VD = "" --Préciser l'ID du VD de SMS, ou laisser vide si pas besoin
WPush_VD_button = "" --Préciser le numéro du bouton d'action du VD de SMS, ou laisser vide si pas besoin
WPush_Prio = "0" --Si vous utiliser le VD Pushover avec gestion des priorités, préciser le niveau de priorité choisi
-------------------------------------------------------------------------------
-- FIN DES PARAMETRES UTILISATEUR
-------------------------------------------------------------------------------

-- On évite la surcharge
if fibaro:countScenes() > 1 then fibaro:abort() end

-- Déclaration des variables globales
function Declaration_VG(variable)
	if fibaro:getGlobalValue(variable) == nil then
		local created = false
		local data = {name = variable, value = tostring("{}")}
		response, status = api.post("/globalVariables", data)
		-- If creation successful, then return created=true
		if (status == 201) then
			fibaro:debug("Global variable " .. variable .. " created")
			created = true
		else
			fibaro:debug("Failed to create global variable " .. variable .. "!");
    	end
	end
end

-- Traductions des jours
function Jours(J)
  	if J > 6 then J = 0 end
  	local Nom_jour = {"Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"}
	return Nom_jour[J+1]
end

-- Gestion des arrondis pour l'afichage & le speak
function round(num, numDecimalPlaces)
  local mult = 10^(numDecimalPlaces or 0)
  if tonumber(num) ~= nil then num = tonumber(num) else num = 0 end
  return math.floor(num * mult + 0.5) / mult
end

-- Mise à jour des tableaux API
function getResponseData(Vglobal, url, method, body, func)
	local http = net.HTTPClient()
 	http:request(url, {
 		options = {
 			method = method,
         	headers = {
          		["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/64.0",
          		["Content-Type"] = "application/json",
 			},
 			data = body
 		},
 		success = function(response)
			fibaro:debug(" Analyse de la réponse du site..")
        	fibaro:sleep(10*1000)
            if (response.status==200) then
          		fibaro:setGlobal(Vglobal,response.data)
    			fibaro:debug("Mise à jour réussie")-- : .. "..fibaro:getGlobalValue(Vglobal))      	
				VD_Update()
        else
          		fibaro:debug ("Erreur de récupération des données :"..response.status)
          		fibaro:abort()
            end
 		end,
        error = function(err)
			fibaro:debug("Erreur.."..response.status)
        	fibaro:abort()
        end,
 	})
end

-- Boucle principale
function Update()
    -- Construction de l'URL
  	local url_today, url_tomorrow
    if (WBCityid=="" )then
        fibaro:debug ("Pas de code ville - Utilisation de la localisation de la HC2")
        local loc=api.get("/settings/location")
        url_today = "https://api.weatherbit.io/v2.0/current?lat="..loc.latitude.."&lon="..loc.longitude.."&lang="..WBlang.."&key="..WBApikey
        url_tomorrow = "https://api.weatherbit.io/v2.0/forecast/daily?lat="..loc.latitude.."&lon="..loc.longitude.."&lang="..WBlang.."&key="..WBApikey
    else
        fibaro:debug ("Utilisation du code ville fourni.")
        url_today = "https://api.weatherbit.io/v2.0/current?city_id="..WBCityid.."&lang="..WBlang.."&key="..WBApikey
        url_tomorrow = "https://api.weatherbit.io/v2.0/forecast/daily?city_id="..WBCityid.."&lang="..WBlang.."&key="..WBApikey
	end
  
  	fibaro:debug ("Envoie de la requête URL vers WeatherBit")
  
    fibaro:debug ("Appel de l'URL du jour...")
    getResponseData("weatherbit_today",url_today, "GET", nil)
    
    fibaro:debug ("Appel de l'URL des prévisions...")
    getResponseData("weatherbit_tomorrow",url_tomorrow, "GET", nil)
  
  	fibaro:sleep(10*1000)
	
  	setTimeout(function() Update() end,WDelai*60*1000 -13*1000)
end

function VD_Update()
    -- Récupération des données et actualisation des labels
    fibaro:debug ("Actualisation des labels")
    local today_datas = fibaro:getGlobal("weatherbit_today")
    local tomorrow_datas = fibaro:getGlobal("weatherbit_tomorrow")

  	if today_datas~="{}" and tomorrow_datas~="{}" then
        jsonTable0 = json.decode(today_datas)
        jsonTable1 = json.decode(tomorrow_datas)
   
    	--Muse à jour des labels du VD
        fibaro:call(WD_VD,"setProperty","ui.lblMAJ.value","Observation: ".. jsonTable0.data[1].city_name .." | ".. jsonTable0.data[1].ob_time)
        fibaro:call(WD_VD,"setProperty","ui.lblTemp.value","T° Ressentie: ".. jsonTable0.data[1].app_temp .."°C | "..jsonTable0.data[1].rh .."% Humidité")
        fibaro:call(WD_VD,"setProperty","ui.lblVent.value","Vent: ".. math.floor(jsonTable0.data[1].wind_spd*3.600) .." km/h | Pluie : ".. round(jsonTable0.data[1].precip,0) .." mm/h")
        fibaro:call(WD_VD,"setProperty","ui.lblCiel.value",Jours(tonumber(os.date("%w"))) .." : ".. jsonTable0.data[1].weather.description)
        fibaro:call(WD_VD,"setProperty","ui.lblPrevi.value",round(jsonTable1.data[1].min_temp,0) .."°C/".. round(jsonTable1.data[1].max_temp,0) .."°C | ".. round(jsonTable1.data[1].precip,0) .."mm | ".. math.floor(jsonTable1.data[1].wind_spd*3.600) .."Km/h (".. jsonTable1.data[1].wind_cdir ..")")
        fibaro:call(WD_VD,"setProperty","ui.lblCiel2.value",Jours(tonumber(os.date("%w")+1)) .." : ".. jsonTable1.data[2].weather.description)
        fibaro:call(WD_VD,"setProperty","ui.lblPrevi2.value",round(jsonTable1.data[2].min_temp,0) .."°C/".. round(jsonTable1.data[2].max_temp,0) .."°C | ".. round(jsonTable1.data[2].precip,0) .."mm | ".. math.floor(jsonTable1.data[2].wind_spd*3.600) .."Km/h (".. jsonTable1.data[2].wind_cdir ..")")
        fibaro:call(WD_VD,"setProperty","ui.lblCiel3.value",Jours(tonumber(os.date("%w")+2)) .." : ".. jsonTable1.data[3].weather.description)
        fibaro:call(WD_VD,"setProperty","ui.lblPrevi3.value",round(jsonTable1.data[3].min_temp,0) .."°C/".. round(jsonTable1.data[3].max_temp,0) .."°C | ".. round(jsonTable1.data[3].precip,0) .."mm | ".. math.floor(jsonTable1.data[3].wind_spd*3.600) .."Km/h (".. jsonTable1.data[3].wind_cdir ..")")
        fibaro:call(WD_VD,"setProperty","ui.lblMAJVD.value","Mise à jour: "..os.date("%d/%m").." "..os.date("%H:%M"))
    
    	-- Définition des textes audio
        today_speach = Jours(tonumber(os.date("%w"))) .." : "
    	.. jsonTable1.data[1].weather.description .. ". "
        .." Température entre ".. round(jsonTable1.data[1].min_temp,0) .." et ".. round(jsonTable1.data[1].max_temp,0) .." degrès. "
        .." Vent de ".. math.floor(jsonTable1.data[1].wind_spd*3.600) .." kilomètres par heure, en provenance ".. jsonTable1.data[1].wind_cdir_full ..". "
        .." Précipitations de ".. round(jsonTable1.data[1].precip,0) .. " milimètres. "
        tomorrow_speach = Jours(tonumber(os.date("%w"))+1) .." : "
        .. jsonTable1.data[2].weather.description .. ". "
    	.." Température entre ".. round(jsonTable1.data[2].min_temp,0) .." et ".. round(jsonTable1.data[2].max_temp,0) .." degrès. "
        .." Vent de ".. math.floor(jsonTable1.data[2].wind_spd*3.600) .." kilomètres par heure, en provenance ".. jsonTable1.data[2].wind_cdir_full ..". "
        .." Précipitations de ".. round(jsonTable1.data[2].precip,0) .. " milimètres. "
        fibaro:setGlobal("wbit_today_sp",today_speach)
        fibaro:setGlobal("wbit_tomorrow_sp",tomorrow_speach)
  
  	else
    	fibaro:debug("Variable vide, on relance la scène")
  	end
end

-- Gestion des notifications
function Notification(message,param)
	local message = message or "<vide>"
  	for _, notif in ipairs(param) do
    	-- Envoi Push
      	if notif == "Push" and WPush_Phone ~="" then
      		fibaro:debug("Envoi du push")
        	fibaro:call(WPush_Phone,"sendPush",message)
      	-- Envoi Email
    	elseif notif == "eMail" and WPush_Email~="" then
      	fibaro:debug("Envoi du mail")
        fibaro:call(WPush_Email,"sendEmail","Infos WeatherBit",message)
      	-- Envoi SMS
    	elseif notif == "SMS" and WPush_VG~="" then
      		if WPush_Prio ~="" then message = "&"..WPush_Prio.."&"..message end
            fibaro:debug("Envoi du SMS")
      		fibaro:setGlobal(WPush_VG, message)
  			if WPush_VD ~="" then fibaro:call(WPush_VD,"pressButton",WPush_VD_button) end
      	end
    end
end

-- Boucle des notifications selon l'heure & la demande
function envoi_Push()
  	-- Récupération des données et actualisation des labels
	local today_speach = fibaro:getGlobal("wbit_today_sp")
	local tomorrow_speach = fibaro:getGlobal("wbit_tomorrow_sp")
  
    if WPushMatin ~="" and os.date("%H:%M") == WPushMatin then
        fibaro:debug("Envoie du push matin")
        Notification(today_speach,WPush_type)
    end
    if WPushSoir ~="" and os.date("%H:%M") == WPushSoir then
        fibaro:debug("Envoie du push soir")
        Notification(today_speach,WPush_type)
    end
    if WPushDemain ~="" and os.date("%H:%M") == WPushDemain then
        fibaro:debug("Envoie du push demain")
        Notification(tomorrow_speach,WPush_type)
    end
	setTimeout(function() envoi_Push() end,60*1000)
end

fibaro:debug("Scene activée")
Update()
envoi_Push()

 

N'oubliez pas d'inscrire votre clé. Vous pouvez mettre le code de votre ville (à trouver sur le site de WeatherBit), ou laisser le champ vide pour utiliser la postition de la HC2.

Les variables globales son créées par la scène.

Dans le mainloop du VD, il faut préciser le numéro de la scène et la fréquence de mise à jour.

 

Et sourtout, n'oubliez pas d'utiliser les icônes, gentillement mises à dispo par @Did

Weatherbit.png.858281ab712d038fbb20ed5b4c3c0fe7.png   1318330649_ScneWeatherbit.png.38fb93207ddf40b1d73749f76ea780fa.png

 

Nota : pour ceux qui utilisent le VD SONOS, il faut remplacer la ligne qui était utilisée avec le YAMS Wunderground

local meteo_day = fibaro:getGlobalValue("Meteo_Day_Speech")

par

local meteo_day = fibaro:getGlobalValue("wbit_today_sp")

 

Publication de la V2.0 :

 - Possibilité d'utiliser des notifications

 - Other minor fixes

 

Publication de la V2.1

- Résolution de divers bugs sur la gestion des variables globales & API

- Allègement du code

 

Publication de la V2.2

- Amélioration des textes audio

- Optimisation de la scène

- Résolution des bugs des précipitations & round

 

Publication de la V2.3

- Correction d'un bug sur les jours (merci Barelle)

- Optimisation du code (tout se fait dans la scène)

 

Publication de la V2.4

- Correction des bugs de mise à jour des labels & pushs

 

Si vous avez déjà installé le VD en version V2.0, remplacez simplement le code du main loop par celui ci , ou laissez vide. Ce code n'est pas obligatoire pour assurer le fonctionnement du VD, il ne fait que créer les variables globales et assurer que la scène tourne bien (peut être remplacé par le WATCHDOG en surveillant le message "Mise à jour réussie" toutes les 35 min)

-------------------------------------------------------------------------------
-- VD REALISE PAR DRAGONIACS POUR www.domotique-fibaro.fr
-- UTILISATION LIBRE DE DROITS
-- MERCI A Dgille & Sebcbien POUR LES CODES DONT JE ME SUIS FORTEMENT INSPIREE
-- VERSION 2.4
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
-- PARAMETRAGE UTILISATEUR
-------------------------------------------------------------------------------
WSceneId = 629  -- Id de la scéne pour actualisation de la météo
-------------------------------------------------------------------------------
-- FIN DU PARAMETRAGE UTILISATEUR
-------------------------------------------------------------------------------

VD = fibaro:getSelfId()

-- Déclaration des variables globales
function Declaration_VG(variable,valeur)
	if fibaro:getGlobalValue(variable) == nil then
		local created = false
		local data = {name = variable, value = tostring(valeur)}
		response, status = api.post("/globalVariables", data)
		-- If creation successful, then return created=true
		if (status == 201) then
			fibaro:debug("Global variable " .. variable .. " created")
			created = true
		else
			fibaro:debug("Failed to create global variable " .. variable .. "!");
    	end
	end
end

Declaration_VG("weatherbit_today","{}")
Declaration_VG("weatherbit_tomorrow","{}")
Declaration_VG("wbit_today_sp","")
Declaration_VG("wbit_tomorrow_sp","")

-- Lance la scene d'actualisation
if fibaro:countScenes(WSceneId) < 1 then 
    fibaro:debug("Lancement de la scène WeatherBit")
    fibaro:startScene(WSceneId)
end

 

Modifié par Dragoniacs
V2.0 : Possibilité d'utiliser des notifications
  • Like 6
  • Thanks 1
  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Super, merci

 

Il ne manque plus que les icones pour le VD et la scène ;-)

 

C'est donc le VD qui appelle la scène pour le rafraichissement des infos. 

J'avais regardé mais j'ai oublié, sais tu combien d'appels API il est possible de faire par jour ?

Partager ce message


Lien à poster
Partager sur d’autres sites

On a droit à 1000 requêtes par jour, c'est large :rolleyes:

Merci pour ta demande d'icône.

 

Je suis en train de bosser une V2.0 avec des notifications.

  • Like 1
  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

 Merci @Dragoniacs, :13:

Je te laisse rapatrier les icônes pour les intégrer à ton premier message, à moins qu'il faille refaire une modif, dites-moi.

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est fait !

Il a la classe mon VD maintenant :60:

Partager ce message


Lien à poster
Partager sur d’autres sites

 Le compte est créée et j'ai mon API Key.

Partager ce message


Lien à poster
Partager sur d’autres sites

 Et où peut-on trouver le "WBCityid", ca n'a rien à voir avec le FRXX que l'on utilisais avant?

PS: Pardon, j'ai trouvé ma réponse plus bas.

 

  • Haha 1

Partager ce message


Lien à poster
Partager sur d’autres sites

T'embêtes aps @Did, si tu ne mets rien, cela utilise les coordonnées Longitude; latitude de la HC2 ;-)

Partager ce message


Lien à poster
Partager sur d’autres sites

 Ça y est, tout s'affiche. :60:

Et quand on n'a pas de lapin, il faut adapter quoi pour faire parler la Sonos?

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Lapin ou Sonos, c'est pareil : tu fais lire la variable globale "wbit_today_sp" pour la météo du jour, ou "wbit_tomorrow_sp" pour la météo du lendemain.

Après je ne sais pas comment tu actives la lecture via Sonos: un VD ou GEA ?

Partager ce message


Lien à poster
Partager sur d’autres sites

 @pepite devrait être plus calé que moi pour répondre.

D'après mes estimations :P, ill faudrait remplacer la ligne du VD "TTS":

local meteo_day = fibaro:getGlobalValue("Meteo_Day_Speech")

qui servait pour Wunderground, non?

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Ca m'a l'air d'être ça

Je n'ai pas de SONOS pour tester, mais si tu remplaces l'ancienne variable "speach" par la nouvelle, ça devrait le faire.

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

@Did Exact tu peux y aller ;-)

tu remplaces "Meteo_Day_Speech" par "wbit_today_sp"

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

 Merci à tous les deux, ça roule. :yes::13:

Encore une question pour @pepite, il faut supprimer les trois anciennes variable (Wunderground) dans le panneau mais sans sauvegarder, c'est ça?

 

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai mis un nota dans le 1er post pour tenir compte des SONOSiens :2:

Oui @Did, il faut cliquer sur les poubelles en face de chaque variable, mais sans toucher à la disquette !

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Bravo ! Le VD  et la scène fonctionnent bien.

Je crains toutefois que pour les prévisions, la vitesse du vent soit affiché en m/s et non en km/h...

Partager ce message


Lien à poster
Partager sur d’autres sites

Bon j'ai plein d'idées pour améliorer mon VD mais pas eu le temps de bien finaliser tout ça. Il faudra patienter jusque demain pour la V2.0 :)


Envoyé de mon BTV-W09 en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

beau boulôt !

Félicitations :60:

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

 J'ai remis la ligne du Watchdog (de @Lazer) concernant YAMS Wunderground (de @sebcbien) avec l'Id du VD "Wheather.io (de @Dragoniacs) et le Watchdog vient de m'envoyer plein de notif en me précisant qu'il y avait une erreur en ligne 43.

Ça vous parle? A tout hasard, il faut mettre combien d'instances sur la scène?

 

Partager ce message


Lien à poster
Partager sur d’autres sites

La scène ne se lance qu'a la fréquence de mise à jour que tu as défini. 30min si tu n'as rien changé. Normalement il n'y a qu'une instance à la fois.
Peux tu m'envoyer une photo du debug de la scène ?

EDIT : ne te fatigue pas, j'ai trouvé le bug, je suis dessus.
 

Modifié par Dragoniacs

Partager ce message


Lien à poster
Partager sur d’autres sites

 Voici le debug de la scène:

Capture.PNG.995181450f0920cd3eb1fecbb7ae5fa6.PNG

PS: Je passe en v2.

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Super pour la v2 j ai aussi un bug :-)
Peux tu publier le code du main loop si ds la V2 il n y a pas de nouveaux labels ?? Ça évite de reimporter, juste un copier coller a faire :-)
Pepite en mode faineant

Envoyé de mon BND-L21 en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

@Did passe à la V2 et tout ira mieux. J'ai raté mon code sur le jour de la semaine, c'est corrigé.

 

@pepite voilà, voilà, c'est dispo dans le 1er post ^_^

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

×