Aller au contenu

Messages recommandés

Posté(e) (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.

 

Image.jpg.0ac3f935e00c03ae5a6e13d669c43c5d.jpg

 

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 :

 

639815976_prsentationicons.jpg.9cd7da4940fa4d7fbd58edfc3c6f5237.jpg

 

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

 

 

 

 

 

Icon1.png.9095ea486804eba5b84ef78ac38bed88.pngIcon2.png.36279e375b31924cd8c3c2ace78ba95d.pngIcon3.png.908d5997d4756911f2d56f107e68e6cb.pngIcon4.png.f305c179ee006da6ed0e673d17f4763f.pngIcon5.png.e19741bb3c2ad143b52686961831ae42.pngIcon6.png.a0a58b42d295854cf7853ea342702f5c.pngIcon7.png.489a62ac33f06436740abbbd30d0d6e1.pngIcon8.png.a2551268eb9632fb74fde3491610f5da.pngIcon9.png.96212d3fd9f23c42e665bd851dc15e2f.pngIcon10.png.7d9b08d1f556b86b1a79eec9d080c59a.pngIcon11.png.00edc83a7bcde906a855aa2669095190.png

 

icon_1.png.1f30ef6f0dcc5d211ac70572ec1aa652.pngicon_2_bis.png.81be1cf62fb4ced87bb9ab3d29eadbf2.pngicon_3.png.55a324076a402f202784bba286953e3b.pngicon_4.png.b73079691cd31c200fbeb679d03798cb.pngicon_5.png.0105b37ed7f7b5ee9748cc169ece0aff.pngicon_6.png.bda40e61278a6af09a79eea43d8b0a96.pngicon_7.png.d07bc425715af54f7258c54feb81e4d9.pngicon_8.png.e800a00a1d63fa53033a19eca3aafd77.pngicon_9.png.4b2c48d25f750018b6027165039070c8.pngicon_10.png.6c0c87f964ba7ecc19c623b4f5f6b707.pngicon_11.png.ada38da4faad5903a17b3109e3847808.png

Modifié par couillerot
  • Like 2
Posté(e)

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

  • Like 1
Posté(e) (modifié)

v1.1 mise à jour effectuée :74:

 

- 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é par couillerot
Posté(e) (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é par couillerot
  • Like 2
Posté(e) (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é par flacon030
Posté(e) (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é par couillerot
Posté(e) (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é par flacon030
Posté(e)

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 

 

  • Like 1
Posté(e) (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é par fredokl
  • 2 mois après...
Posté(e)

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 

Posté(e)

Oui, sauf pour récupérer les iD des icônes?

ensuite on peut supprimer le module et les icônes restent accessibles?

Posté(e)

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

Posté(e) (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é par Fredmas
  • 2 mois après...
Posté(e) (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 :P

 

@couillerot ou ceux qui utilisent WeatherBit, vous constatez le même décalage horaire ?

Modifié par Fredmas
Posté(e)

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...

  • 4 mois après...
Posté(e)

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 ?

image.thumb.png.2228f04ab247184f935605dc86ba9467.png

image.png.9b0e6ccdecbda2825cbe6d3a5768ee5b.png

 

Merci d'avance & bon WE;

 

Didier

Posté(e) (modifié)

Salut,

 

j'avoue ne mettre jamais poser cette question mais elle est pertinente ! :)

 

voici la correspondance :

 

580450860_weathericons.thumb.jpg.b4e9ec71fb5c9f1fad1331f4312ad5c3.jpg

 

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é par couillerot
  • Like 1
×
×
  • Créer...