couillerot Posté(e) le 16 mai 2021 Signaler Posté(e) le 16 mai 2021 (modifié) Ce QA récupère les données météo issues du site WeatherBit.io Du fait que ce QA est du type weather provider, vous pouvez le substituer à la source météo par défaut de la box : YR Weather (panneau General / Principal / Capteurs Principaux / source de la météo) La mise à jour des données se fait toutes les 5 minutes. Au niveau de la température et de l'humidité, vous pouvez dorénavant soit récupérer les données de WeatherBit, soit issues de vos propres modules. Dans le cas ou vous souhaitez obtenir les valeurs (température ou/et humidité) via vos propres modules, il suffit de renseigner dans le tableau des variables l'id de votre (vos) module(s) de température et/ou humidité ("temp_id" / "humidity_id"). Si vous renseignez la valeur "0" ce seront les données de WeatherBit qui seront récoltées. Installation Il vous faut d’abord obtenir une « clé » (key) que vous obtiendrez en vous inscrivant gratuitement sur le site Weatherbit.io Renseignez alors le key_id dans le panneau des variables. Pour l’installation des icons, il suffit de suivre l’ordre pré établi (de id_icon1 à id_icon11) selon la représentation ci-dessous : Pour récupérer l’id d’un icon : après avoir téléversé l’icon, vous faites un clic droit dessus et sélectionner « Ouvrir l’image dans un nouvel onglet ». Dans l’onglet, il devrait s’afficher une phrase du style : « User(id_icon).png Bien noter pour chaque icon son id correspondant pour pouvoir le renseigner par la suite dans le tableau des variables… ----------------------------------------------------------------------------------- ----------------------------------------------------------------------------------- -------------------- QA WEATHERBIT / com.fibaro.weather --------------------------- --------------- Stephane Couillerot 2021 pour domotique-fibaro.fr ----------------- ----------------------------------------------------------------------------------- ----------------------------------------------------------------------------------- ------- indiquez dans le panneau des variables votre latitude / longitude --------- -----------et votre key id qui vous est attribuéz en vous inscrivant -------------- ---------------------gratuitement sur le site WeatherBit.io ----------------------- ----------------------------------------------------------------------------------- ----------------------------------------------------------------------------------- ------ function QuickApp:onInit() __TAG = "QA_"..plugin.mainDeviceId.."INFOS METEO WEATHERBIT" self:loop() end -- function QuickApp:loop() lat = api.get("/settings/location").latitude lati = tostring(lat) lon = api.get("/settings/location").longitude long = tostring(lon) key_id = self:getVariable("key_id") Var_Heure = os.date("%d.%m.%Y à %H:%M") lev = api.get("/settings/info").sunriseHour lever = string.gsub(lev, ":", "h") couch = api.get("/settings/info").sunsetHour coucher = string.gsub(couch, ":", "h") local http = net.HTTPClient() http:request("https://api.weatherbit.io/v2.0/current?lat="..lati.."&lon="..long.."&lang=fr&key="..key_id, { options = { method = 'GET' }, success = function(response) if response.status == 200 then if response.data and response.data ~= "" then local jsonTable = json.decode(response.data) gfx = jsonTable.data[1].weather.code aujourdhui = tostring(os.date("%w", os.time())) dat = jsonTable.data[1].ob_time codeweather = jsonTable.data[1].weather.code jour = string.sub(dat, 9, 10) mois = string.sub(dat, 6, 7) city = jsonTable.data[1].city_name citycode = jsonTable.data[1].country_code codeicon = tonumber(gfx) ----------------------------------------------------------------------------- -------------------- MISE A JOUR ICON COM.FIBARO.WEATHER -------------------- ----------------------------------------------------------------------------- if codeweather >= tonumber("300") and codeweather <= tonumber("522") then condition = "rain" end if codeweather >= tonumber("800") and codeweather <= tonumber("801") then condition = "clear" end if codeweather == tonumber("900") then condition = "unknown" end if codeweather >= tonumber("600") and codeweather <= tonumber("623") then condition = "snow" end if codeweather >= tonumber("200") and codeweather <= tonumber("233") then condition = "storm" end if codeweather >= tonumber("802") and codeweather < tonumber("803") then condition = "cloudy" end if codeweather >= tonumber("803") and codeweather <= tonumber("804") then condition = "Partly cloudy" end if codeweather >= tonumber("700") and codeweather <= tonumber("751") then condition = "fog" end ----------------------------------------------------------------------------- ---------------------------- MISE A JOUR ICON QA ---------------------------- ----------------------------------------------------------------------------- id_icon1 = tonumber(self:getVariable("id_icon1")) id_icon2 = tonumber(self:getVariable("id_icon2")) id_icon3 = tonumber(self:getVariable("id_icon3")) id_icon4 = tonumber(self:getVariable("id_icon4")) id_icon5 = tonumber(self:getVariable("id_icon5")) id_icon6 = tonumber(self:getVariable("id_icon6")) id_icon7 = tonumber(self:getVariable("id_icon7")) id_icon8 = tonumber(self:getVariable("id_icon8")) id_icon9 = tonumber(self:getVariable("id_icon9")) id_icon10 = tonumber(self:getVariable("id_icon10")) id_icon11 = tonumber(self:getVariable("id_icon11")) if codeicon == tonumber("610") then self:updateProperty("deviceIcon", id_icon1) end if codeicon >= tonumber("803") and codeicon <= tonumber("804") then self:updateProperty("deviceIcon", id_icon2) end if codeicon >= tonumber("700") and codeicon <= tonumber("751") then self:updateProperty("deviceIcon", id_icon3) end if codeicon >= tonumber("500") and codeicon <= tonumber("522") then self:updateProperty("deviceIcon", id_icon4) end if codeicon >= tonumber("601") and codeicon <= tonumber("623") then self:updateProperty("deviceIcon", id_icon5) end if codeicon == tonumber("600") then self:updateProperty("deviceIcon", id_icon6) end if codeicon == tonumber("800") then self:updateProperty("deviceIcon", id_icon7) end if codeicon >= tonumber("801") and codeicon <= tonumber("802") then self:updateProperty("deviceIcon", id_icon8) end if codeicon >= tonumber("300") and codeicon <= tonumber("302") then self:updateProperty("deviceIcon", id_icon9) end if codeicon >= tonumber("230") and codeicon <= tonumber("233") then self:updateProperty("deviceIcon", id_icon10) end if codeicon >= tonumber("200") and codeicon <= tonumber("202") then self:updateProperty("deviceIcon", id_icon11) end ------------------------------------------------------------------------------ -------------------------- CONSTRUCTION DES TABLES --------------------------- ------------------------------------------------------------------------------ week = {["0"] = "DIMANCHE", ["1"] = "LUNDI", ["2"] = "MARDI", ["3"] = "MERCREDI", ["4"] = "JEUDI", ["5"] = "VENDREDI", ["6"] = "SAMEDI"} month = {["01"] = "JANVIER", ["02"] = "FEVRIER", ["03"] = "MARS", ["04"] = "AVRIL", ["05"] = "MAI", ["06"] = "JUIN", ["07"] = "JUILLET", ["08"] = "AOUT", ["09"] = "SEPTEMBRE", ["10"] = "OCTOBRE", ["11"] = "NOVEMBRE", ["12"] = "DECEMBRE"} ------------------------------------------ ----- RECUPERATION DES DONNEES METEO ----- ------------------------------------------ ---- Récupération des 2 varaibles température / Humidity ---- tempid = self:getVariable("temp_id") humid = self:getVariable("humidity_id") fibartemp = fibaro.getType(tonumber(tempid)) fibarhumid = fibaro.getType(tonumber(humid)) ---- Température ---- if tostring(tempid) > tostring("0") and fibartemp == tostring("com.fibaro.temperatureSensor") then temp = fibaro.getValue(tonumber(tempid), "value") roomnametemp = fibaro.getRoomNameByDeviceID(tonumber(tempid)) else temp = jsonTable.data[1].app_temp roomnametemp = tostring("WeatherBit") end ---- Humidité ---- if tostring(humid) > tostring("0") and fibarhumid == tostring("com.fibaro.humiditySensor") then humidite = fibaro.getValue(tonumber(humid), "value") roomnamehum = fibaro.getRoomNameByDeviceID(tonumber(humid)) else humidite = jsonTable.data[1].rh roomnamehum = tostring("WeatherBit") end ---- Vent ---- win = jsonTable.data[1].wind_spd winder = tonumber(win) * 3.6 windspeed = string.format("%.1f", tostring(winder)) ---- Divers ---- descript = jsonTable.data[1].weather.description snow = jsonTable.data[1].snow winddir = jsonTable.data[1].wind_cdir uv = jsonTable.data[1].uv pression = jsonTable.data[1].pres rosee = jsonTable.data[1].dewpt ---- Mise à jour dse variables pluie pour historique ---- pluie = fibaro.getValue(911, "value") precip = fibaro.getValue(909, "value") self:setVariable("pluie", pluie) local conditionCodes = { unknown = 3200, clear = 32, rain = 40, snow = 38, storm = 666, cloudy = 30, fog = 20, } local conditionCode = conditionCodes[condition] if conditionCode then self:updateProperty("ConditionCode", conditionCode) self:updateProperty("WeatherCondition", condition) self:updateProperty("Temperature", tonumber(temp)) self:updateProperty("Wind", tonumber(windspeed)) self:updateProperty("Humidity", tonumber(humidite)) end self:debug(aujourdhui) ------------------------------------------------------------------------------ --------------------------- CONSTRUCTION DES LABELS -------------------------- ------------------------------------------------------------------------------ self:updateProperty("log", ""..temp.. " °c") self:updateView("labelCity", "text", "INFOS METEO DU "..week[tostring(aujourdhui)].." "..jour.. " "..month[mois].." "..os.date("%Y")) self:updateView("label1", "text", descript.."\r\rTempérature : "..temp.. "°c\rHumidité : "..string.format("%.0f", humidite).." %\rPluie : "..string.format("%.1f", precip).." mm/h\rNeige : "..string.format("%.1f", snow).." mm/h\rCumul pluie 24h : "..string.format("%.1f", pluie).."mm\rVent : "..windspeed.." km/h ("..winddir..")\rIndex UV (0-11+) : "..string.format("%.0f", uv).."\rPression atmosphérique : "..string.format("%.0f", pression).." mb\rPoint de rosée : "..rosee.." °c\rLever du soleil : "..lever.."\rCoucher du soleil : "..coucher.."\r\rSource Température : "..roomnametemp.. "\rSource Humidité : "..roomnamehum) self:updateView("labelMAJ", "text", "Station de "..city.." ("..citycode..") | MAJ le "..Var_Heure) else self:debug("Error : empty response data") end else self:debug("Error : status=" .. tostring(response.status)) end end, error = function(err) self:debug("Error : " .. err) end }) self:debug("Boucle METEO") fibaro.setTimeout(1000 * 60 * 30, function() -- MAJ 30 minutes self:loop() end) end Version 1.1 - pour la température et l'humidité, ce sont soient les données de Weatherbit soient les valeurs de vos propres modules. - changement de l'icon selon les conditions météo. - indication de la source de la temp et de l'humidité ("nom de la pièce" ou WeatherBit) Version 1.2 - QA Reconnu comme weather provider - récupération auto des coordonnées latitude et longitude - Vérification que les id des modules de température et/ou Humidité appartiennent aux types appropriés WeatherBit.fqa Bonne installation ! Stef Modifié le 24 octobre 2022 par couillerot 2
couillerot Posté(e) le 16 mai 2021 Auteur Signaler Posté(e) le 16 mai 2021 une mise à jour prochaine permettra le changement de l'icon selon les conditions météo ainsi que le choix de la source de la température et d'humidité (module perso par exemple / idem que Weather Provider sur HC2). Pour la vitesse du vent, je n'ai pas d'anémomètre donc je ne pourrais pas tester... Stef 1
couillerot Posté(e) le 17 mai 2021 Auteur Signaler Posté(e) le 17 mai 2021 (modifié) v1.1 mise à jour effectuée - pour la température et l'humidité, ce sont soient les données de Weatherbit soient les valeurs de vos propres modules. - changement de l'icon selon les conditions météo. - indication de la source de la temp et de l'humidité ("nom de la pièce" ou WeatherBit) Stef -> peut être encore amélioré si capteur de pluie présent. Modifié le 17 mai 2021 par couillerot
couillerot Posté(e) le 22 mai 2021 Auteur Signaler Posté(e) le 22 mai 2021 (modifié) v1.2 - Récupération auto des coordonnées de latitude et longitude de votre localité. - Vérification que les id des modules de température et/ou Humidité appartiennent bien aux types appropriés ; si ce n'est pas le cas ce seront les données WeatherBit qui seront remontées. Stef Modifié le 24 mai 2021 par couillerot 2
flacon030 Posté(e) le 24 mai 2021 Signaler Posté(e) le 24 mai 2021 (modifié) il est possible d'utiliser ce QA dans une scène pour l'arrosage, et prendre en compte les prévisions météo par exemple si il dois pleuvoir dans 24h alors pas d'arrosage ou si il est tombé de la pluie il y a 24h alors pas d'arrosage merci Modifié le 24 mai 2021 par flacon030
couillerot Posté(e) le 24 mai 2021 Auteur Signaler Posté(e) le 24 mai 2021 (modifié) je vais faire un QA spécial Arrosage qui servira de déclencheur pour un arrosage auto ; c'est dans les tuyaux car je vais en avoir besoin cet été par exemple : - historique des précipitations sur 2 jours (quantifiées par un pluviomètre netatmo) -> J-1 et J-2 - précipitations du jour (via pluviomètre Netatmo) -> jour J (jour arrosage : OUI ou NON) - prévisions des précipitations sur les 2 jours suivant -> J+1 et J+2 Stef NB : après tu peux très bien utilisé les QA "météo" et "prévisions Météo" pour l'arrosage auto via le passage aux variables globales (besoin de faire quelques lignes de code) Stef Modifié le 24 mai 2021 par couillerot
flacon030 Posté(e) le 24 mai 2021 Signaler Posté(e) le 24 mai 2021 (modifié) super c'est exactement se que je recherche En plus j'ai un pluviomètre netatmo, donc la il aurait une réel utilité Je vais suivre cela de prés Merci Modifié le 24 mai 2021 par flacon030
couillerot Posté(e) le 24 mai 2021 Auteur Signaler Posté(e) le 24 mai 2021 le pluvio netatmo aura en effet toute sa place dans le QA ! Stef
CatTrack Posté(e) le 30 mai 2021 Signaler Posté(e) le 30 mai 2021 Vraiment TOP ! Merci !!! En revanche, il plantait chez moi avec la fonction getType d'un module inexistant... J'ai du simplement corriger le code de la façon suivante : ---- Récupération des 2 varaibles température / Humidity ---- tempid = self:getVariable("temp_id") humid = self:getVariable("humidity_id") if tostring(tempid) > tostring("0") then fibartemp = fibaro.getType(tonumber(tempid)) end if tostring(humid) > tostring("0") then fibarhumid = fibaro.getType(tonumber(humid)) end 1
couillerot Posté(e) le 31 mai 2021 Auteur Signaler Posté(e) le 31 mai 2021 merci CatTrack il est vrai que je n'avais pas considéré ce cas de figure Stef
fredokl Posté(e) le 20 juin 2021 Signaler Posté(e) le 20 juin 2021 (modifié) Salut @couillerot j'ai un bug qui intervient de temps en temps sur le QA. Voici le debug: [20.06.2021] [22:28:01] [DEBUG] [QA_290_WEATHERBIT]: Initialisation [20.06.2021] [22:28:01] [ERROR] [QUICKAPP290]: QuickApp crashed [20.06.2021] [22:28:01] [ERROR] [QUICKAPP290]: main.lua:168: Wrong parameter type, string required. Provided param 'table: 0x11b6d2d0' is type of table et voici la ligne 168: fibaro:debug("Error : status=" .. tostring(response.status)) Je l'ai commenté mais n'y fait. Le problème est que l'erreur est aléatoire. Je ne peux pas prédire quand ça arrivera. EDIT: j'ai dégainé trop vite. L'erreur ne viendrait pas que c'est plutôt "self:debug" et non pas "fibaro:debug"? J'ai relancé avec les corrections est ça à l'air de tourner. Modifié le 20 juin 2021 par fredokl
couillerot Posté(e) le 21 juin 2021 Auteur Signaler Posté(e) le 21 juin 2021 (modifié) exact fredoki ! Stef Modifié le 21 juin 2021 par couillerot
Inkew Posté(e) le 4 septembre 2021 Signaler Posté(e) le 4 septembre 2021 Bonjour, j'ai pas l'option d'ajout des icônes dans le QA.. Comment doit-on s'y prendre? Merci!
couillerot Posté(e) le 4 septembre 2021 Auteur Signaler Posté(e) le 4 septembre 2021 on ne peut pas directement ajouter les icons dans le QA. Pour ce faire, il faut ajouter les icons météo via un module z-wave par exemple. Ensuite, il suffit de récupérer les id de chaque icons (en suivant l'ordre pré établi) et pour finir renseigner les id des icons dans le panneau des variables du QA. je ne sais pas si j'ai été assez clair... (?) Stef
Inkew Posté(e) le 4 septembre 2021 Signaler Posté(e) le 4 septembre 2021 Oui, sauf pour récupérer les iD des icônes? ensuite on peut supprimer le module et les icônes restent accessibles?
couillerot Posté(e) le 4 septembre 2021 Auteur Signaler Posté(e) le 4 septembre 2021 Pour récupérer l'id d'un icon : - clic droit sur l'icon téléversé / "Ouvrir l'image dans un nouvel onglet" - dans l'adresse du navigateur, tu vas avoir ce genre de chose : http://xxx.xxx.xxx.xxx/assets/userIcons/devices/User1030/User1030100.png - "1030" est alors l'id de l'icon Pour ta deuxième question, je n'en sait rien mais je suppose que non... Stef
Inkew Posté(e) le 4 septembre 2021 Signaler Posté(e) le 4 septembre 2021 Merci Stef pour ces infos, je teste ça demain!
Fredmas Posté(e) le 11 septembre 2021 Signaler Posté(e) le 11 septembre 2021 (modifié) Salut @couillerot et @CatTrack, Je comprends la modification proposée ci-dessous : Le 30/05/2021 à 18:35, CatTrack a dit : Vraiment TOP ! Merci !!! En revanche, il plantait chez moi avec la fonction getType d'un module inexistant... J'ai du simplement corriger le code de la façon suivante : ---- Récupération des 2 varaibles température / Humidity ---- tempid = self:getVariable("temp_id") humid = self:getVariable("humidity_id") if tostring(tempid) > tostring("0") then fibartemp = fibaro.getType(tonumber(tempid)) end if tostring(humid) > tostring("0") then fibarhumid = fibaro.getType(tonumber(humid)) end Par contre si vous avez modifié le code avec la citation ci-dessus, du coup nous sommes d'accord qu'après il n'est plus nécessaire de tester si tempid est > 0 puisque fibartemp n'est plus nil. Et donc ce code : ---- Récupération des 2 varaibles température / Humidity ---- tempid = self:getVariable("temp_id") humid = self:getVariable("humidity_id") fibartemp = fibaro.getType(tonumber(tempid)) fibarhumid = fibaro.getType(tonumber(humid)) ---- Température ---- if tostring(tempid) > tostring("0") and fibartemp == tostring("com.fibaro.temperatureSensor") then temp = fibaro.getValue(tonumber(tempid), "value") roomnametemp = fibaro.getRoomNameByDeviceID(tonumber(tempid)) else temp = jsonTable.data[1].app_temp roomnametemp = tostring("WeatherBit") end ---- Humidité ---- if tostring(humid) > tostring("0") and fibarhumid == tostring("com.fibaro.humiditySensor") then humidite = fibaro.getValue(tonumber(humid), "value") roomnamehum = fibaro.getRoomNameByDeviceID(tonumber(humid)) else humidite = jsonTable.data[1].rh roomnamehum = tostring("WeatherBit") end Devient ce code si je t'ai bien suivi, puisque tant que nous n'affectons rien à fibartemp sa valeur est nil : ---- Récupération des 2 varaibles température / Humidity ---- tempid = self:getVariable("temp_id") humid = self:getVariable("humidity_id") if tempid > 0 then fibartemp = fibaro.getType(tempid) end if humid > 0 then fibarhumid = fibaro.getType(humid) end ---- Température ---- if fibartemp == tostring("com.fibaro.temperatureSensor") then temp = fibaro.getValue(tempid, "value") roomnametemp = fibaro.getRoomNameByDeviceID(tempid) else temp = jsonTable.data[1].app_temp roomnametemp = tostring("WeatherBit") end ---- Humidité ---- if fibarhumid == tostring("com.fibaro.humiditySensor") then humidite = fibaro.getValue(humid, "value") roomnamehum = fibaro.getRoomNameByDeviceID(humid) else humidite = jsonTable.data[1].rh roomnamehum = tostring("WeatherBit") end Modifié le 11 septembre 2021 par Fredmas
Fredmas Posté(e) le 20 novembre 2021 Signaler Posté(e) le 20 novembre 2021 (modifié) Hello, En travaillant sur mes différents codes QA gestion météo aujourd'hui, je viens de me rendre compte d'un problème avec WeatherBit : le temps (au sens horaire) n'est pas bon. Il est à UTC+0, et pas UTC+1. Ca se confirme avec différents appels JSON : json.decode(response.data).data[1].ob_time json.decode(response.data).data[1].datetime json.decode(response.data).data[1].sunrise json.decode(response.data).data[1].sunset Et pourtant quand on vérifie le : json.decode(response.data).data[1].timezone Ca donne bien comme réponse : "Europe/Paris" Alors ce n'est pas que c'est très grave, mais si on veut utiliser des data timing comme lever/coucher soleil par exemple, ça peut être par principe problématique @couillerot ou ceux qui utilisent WeatherBit, vous constatez le même décalage horaire ? Modifié le 20 novembre 2021 par Fredmas
couillerot Posté(e) le 20 novembre 2021 Auteur Signaler Posté(e) le 20 novembre 2021 intéressant ! mais j'avoue n'avoir pas effectué de vérif sur l'heure car je ne l'utilise pas Stef
Fredmas Posté(e) le 20 novembre 2021 Signaler Posté(e) le 20 novembre 2021 Ben disons que quitte à récupérer des infos météo d'un fournisseur reconnu, j'utilise également ces infos timing à la place de celles fournies par Fibaro. Du coup avec WeatherBit je trouve ce décalage, mais pas avec Openweather. Je ne sais pas comment corriger. J'ai bien pensé à truquer leur horaire, bien qu'il soit fourni en string, donc plus compliqué que si c'était un number, mais il y aura toujours une difficulté aux alentours de minuit. Mais bon, comme cet horaire on s'en fiche je pense qu'on peut contourner en faisant l'impasse. J'ai pensé à changer le fuseau en faisant croire que j'habite dans un autre pays, mais bon, ce n'est pas très classe... Je me dis qu'il doit y avoir une autre correction possible vu la taille internationale de ce fournisseur... Le plus surprenant c'est que la zone géographique est la bonne...
Fredmas Posté(e) le 20 novembre 2021 Signaler Posté(e) le 20 novembre 2021 (modifié) Et apparemment ce que je viens de dire est vrai pour " https://api.weatherbit.io/v2.0/current? " qui a ce problème de décalage horaire. Mais avec " https://api.weatherbit.io/v2.0/forecast/daily?" ça semble ok Modifié le 20 novembre 2021 par Fredmas
p1npon Posté(e) le 1 avril 2022 Signaler Posté(e) le 1 avril 2022 Bonjour, Une petite question suite à l'installation de ce module météo, je l'ai déclaré comme fournisseur météo sur ma HC3 et je voudrais faire un scénario en fonction de la météo. Il y a 11 icones donc 11 statuts potentiels pour la météo, par contre quand je veux faire un scénario je n'ai que 6 statuts, une idée pour que les 2 coïncident ? Merci d'avance & bon WE; Didier
couillerot Posté(e) le 1 avril 2022 Auteur Signaler Posté(e) le 1 avril 2022 (modifié) Salut, j'avoue ne mettre jamais poser cette question mais elle est pertinente ! voici la correspondance : icons 1 / 5/ 6 -----> neigeux Icon 2 -----> nuageux Icons 3 -----> couvert Icons 7 / 8 -----> ensoleillé Icons 4 / 9 -----> pluvieux Icons 10 / 11 -----> orageux Stef Modifié le 1 avril 2022 par couillerot 1
Messages recommandés