Aller au contenu

Quick App : Arrosage Automatique


couillerot

Messages recommandés

Il ne s'agit pas à proprement parlé d'un QA sur l'arrosage automatique mais simplement du déclencheur, à l'aide d'une variable globale "Arrosage" > OUI ou NON  (récupérable donc dans une scène ou un autre QA pour lancer l'arrosage).

 

Ce QA fonctionne de la sorte :

 

- il récupère les prévisions de précipitations J+1 et J+2 (via le site WeatherBit)

- il met à jour régulièrement le cumul des précipitations du jour via un pluviomètre (type "capteur de pluie") ou soit les données de précipitations du jour via Weatherbit (indication de la source dans le QA)

- il stock les données de précipitations à J-1 et J-2

- il compare la consigne de déclenchement et les précipitations passées, actuelles et prévues pour conseiller un arrosage, ou pas.

 

si vous avez des conseils pour optimiser le code (surement) ou même des choses à améliorer (certainement), n'hésitez pas !

 

Image.thumb.jpg.c38ff3b300a64770fe44ee03467653a3.jpg

 


Installation :

 

- Créer une variable globale globable énumérée : "Arrosage" > valeurs : "OUI" /  "NON"

- Dans le tableau des variables renseignez la key_id WeatherBit (en s'inscrivant gratuitement sur weatherbit.io) et

- indiquez l'id de votre pluviomètre (précipitations 24h) > "id_pluviometre" ou l'id de n'importe quel autre module existant pour obtenir les données de Weatherbit.

 

function QuickApp:onInit()
    self:updateProperty("deviceIcon", 1044) -- mettre ici l'id de votre icon
     self:loop()
end
function QuickApp:loop()
lat = api.get("/settings/location").latitude
lati = tostring(string.format("%.2f", lat))
lon = api.get("/settings/location").longitude
long = tostring(string.format("%.2f", lon))
key_id = self:getVariable("key_id")
local http = net.HTTPClient()
http:request("https://api.weatherbit.io/v2.0/forecast/daily?lat="..lati.."&lon="..long.."&days=5&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)
                    precipday1 = jsonTable.data[2].precip
                        precipday2 = jsonTable.data[3].precip
                            precipday0 = jsonTable.data[1].precip
id_pluie = self:getVariable("id_pluviometre")
precip1 = self:getVariable("precip_jour_1")
precip2 = self:getVariable("precip_jour_2")
Consigne_mm, _ = self:getVariable("Consigne")
Consigne_mm = tonumber(Consigne_mm)

if tostring(id_pluie) > tostring("0") and fibaro.getType(tonumber(id_pluie)) == tostring("com.fibaro.rainSensor") then
            pluie = fibaro.getValue(tonumber(id_pluie), "value")
            source = fibaro.getName(tonumber(id_pluie))
 else
            pluie = precipday0
            source = tostring("WeatherBit")
end

name = fibaro.getName(tonumber(id_pluie))
arrosage = string.format("%.2f", precipday1 + precipday2 + pluie + precip1 + precip2)
arrosage, _= tonumber(arrosage)
arrosage_jardin = fibaro.getGlobalVariable("Arrosage")
self:setVariable("pluie", pluie)

----------------------------------------
---------- ARROSAGE OUI / NON ----------
----------------------------------------
if tonumber(arrosage) > tonumber(Consigne_mm) then
    fibaro.setGlobalVariable("Arrosage", "NON")
        else if (tonumber(precip2) > tonumber(Consigne_mm)) and (tonumber(precipday2 + precipday1 + pluie + precip1) == 0) then
    fibaro.setGlobalVariable("Arrosage", "OUI")
        else if (tonumber(precipday2) > tonumber(Consigne_mm)) and (tonumber(precipday1 + pluie + precip1 + precip2) == 0) then
    fibaro.setGlobalVariable("Arrosage", "OUI")
        else
    fibaro.setGlobalVariable("Arrosage", "OUI")
        end
    end
end
------------------------------------------------------------------------------
--------------------------- CONSTRUCTION DES LABELS --------------------------
------------------------------------------------------------------------------
Arro = fibaro.getGlobalVariable("Arrosage")
self:updateProperty("log", ""..arrosage.." mm")
self:updateView("labeldate", "text", "INFOS ARROSAGE DU "..os.date("%d.%m.%Y\r\rdonnées mises à jour à %Hh%M"))
self:updateView("labelconsigne", "text", "\nConsigne de report : + "..tostring(Consigne_mm).." mm de pluie / 5 jours")
self:updateView("labelprecip", "text", "\rPrécipitations J-2 : "..string.format("%.1f", precip2).." mm\r\rPrécipitations J-1 : "..string.format("%.1f", precip1).." mm\r\rPrécipitations ce jour : " ..string.format("%.1f", pluie).." mm (source : "..source..")\r\rPrécipitations prévues J+1 : "..string.format("%.1f", precipday1).." mm\r\rPrécipitations prévues J+2 : "..string.format("%.1f", precipday2).." mm")
self:updateView("labelconseil", "text", "Arrosage conseillé :  "..Arro)
		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:stockprecipitations()
               fibaro.setTimeout(1000 * 60 * 3, function()
         self:loop()
   end)
end
function QuickApp:uiMoinsOnR()
        local Consigne_mm, _ = self:getVariable("Consigne")
        Consigne_mm = tonumber(Consigne_mm) - 1
        self:setVariable("Consigne", tostring(Consigne_mm))
        self:loop()
end
function QuickApp:uiPlusOnR()
        local Consigne_mm, _ = self:getVariable("Consigne")
        Consigne_mm = tonumber(Consigne_mm) + 1
        self:setVariable("Consigne", tostring(Consigne_mm))
        self:loop()
end
function QuickApp:stockprecipitations()
        local Heure = tonumber(os.date("%H", os.time()))
        local Minute = tonumber(os.date("%M", os.time()))
-----------------------------------------------------------------
---------- MISE A JOUR DES VARIABLES POUR L'HISTORIQUE ----------
-----------------------------------------------------------------
if (Heure == tonumber("23") and Minute > tonumber("45")) and (Heure == tonumber("23") and Minute < tonumber("50")) then
    actus = self:getVariable("precip_jour_1")
    self:setVariable("precip_jour_2", tostring(actus))
end
if (Heure == tonumber("23") and Minute > tonumber("50")) and (Heure == tonumber("23") and Minute < tonumber("55")) then
    actu = self:getVariable("pluie")
    self:setVariable("precip_jour_1", tostring(actu))
end
            fibaro.setTimeout(1000 * 60 * 2, function()
        self:stockprecipitations()
    end)
end

 

 

Eau.png.447a5e6d4ef3ea43d82b1ef74e12f14f.png

 

version 1.2

- choix du type de source de données de précipitations (capteur de pluie ou WeatherBit)

 

version 1.3 (20.06.2021)

- correction d'un bug historique précipitations

- affichage dans le log du total des précipitations sur 5 jours.

 

 

 

Programmateur.fqa

 

bonne installation !

 

Stef

Modifié par couillerot
  • Like 5
Lien vers le commentaire
Partager sur d’autres sites

Bonjour, 

 

Merci beaucoup ! Super utile, on prépare tous l'été et l'arrosage automatique !!! :74:

 

Petite question : si on n'a pas de station Netatmo, on peut utiliser le QA que vous avez créé : Quick App - Météo WeatherBit v1.2 pour la pluviométrie du jour ? 

 

 

Lien vers le commentaire
Partager sur d’autres sites

* version 1.1

 - prise en compte de 2 cas particuliers (si J-2 > Consigne + 4 jours suivant sont à 0 mm et J+2 > Consigne + 4 jours précédent sont à 0)

 - affichage jour J de la prévision annoncée précédemment à titre de comparaison / information

 

Stef

  • Like 2
Lien vers le commentaire
Partager sur d’autres sites

J'ai mis à jour le code du "main". J'ai un bug :

[07.06.2021] [13:49:01] [WARNING] [QUICKAPP288]: Variable prevision not found

[07.06.2021] [13:49:01] [ERROR] [QUICKAPP288]: QuickApp crashed

[07.06.2021] [13:49:01] [ERROR] [QUICKAPP288]: main.lua:56: bad argument #2 to 'format' (number expected, got string)

Modifié par Dragoniacs
Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Un peu la même question que un peu plus haut : faute de pluviomètre (Netatmo), que conseilleriez-vous ?
Une API Web qui donne la quantité d'eau sur les deniers jours (en mm/jour) ?
Modifier le QA pour mémoriser, chaque jour, la prévision WeatherBit du lendemain ?

Merci d'avance.

---
David
PS : je télécharge et installe en parallèle :)

Modifié par Bebitoo
Lien vers le commentaire
Partager sur d’autres sites

Difficile de répondre...

 

Nativement, le QA récupère la prévision de J+1 de Weatherbit et l'affiche dans "Précipitations ce jour" > "prévues : ... mm" (en guise d'information). Après je pourrais très bien récupérer les précipitations du jour J via Weatrherbit, c'est tout à fait possible mais la solution ne me paraissait peu pertinente.

 

Après, je pourrais modifier le code pour donner le choix... pourquoi pas ?

- soit les données Weatherbit : précipitations du joiur

- soit les données d'un pluviomètre

 

Stef

 

Modifié par couillerot
Lien vers le commentaire
Partager sur d’autres sites

Nouvelle MAJ - version 1.2 

 

il désormais possible de récupérer les données de précipitations du jour soit via un capteur de pluie, soit en passant par WeatherBit.

 

Stef

Modifié par couillerot
  • Like 1
Lien vers le commentaire
Partager sur d’autres sites

Excellent :) merci !

Je regardais de mon côté en 
parallèle, et :

  • API 
    • OpenWeatherMap : la version gratuite de l'API semble permettre d'obtenir le volume de précipitations de la veille... mais pas pour ma géolocalisation (pas de champ current.rain dans la réponse, lors de mon test)
    • Weatherbit : sauf erreur, les données historiques sont soumises à souscription (et c'est pas donné).
    • AccuWeather : le endpoint get24HoursConditionsByLocationKey semble être là pour ça (une fois sa "location key" récupérée, par requête sur un autre endpoint), mais n'ai pu tester encore : je me suis inscrit, mais n'ai pas reçu ma clé d'usage de l'API.
  • Modification du QA
    • Un fork de la toute version 1.2, en utilisant pour J-1 le volume de précipitation prévisionnel obtenu la veille pour J (et ainsi de suite pour J-2) ?
    • Ou bien (nouvelle idée) : création un autre Quick App simulant le pluviomètre Netatmo - valorisé à partir de l'une des méthodes ci-dessus, et indiquer son ID dans les paramètres du QA Arrosage ?
      • Comme ça, pas de motif / fork du QA arrosage :)

Je continue de fouiller dès que possible.

 

---
David
 

Lien vers le commentaire
Partager sur d’autres sites

  • 8 mois après...

Bonjour,

@Dragoniacs

ta source est "Pluie 24h" passes tu par weatherB ou meteofrance (pluie dans l'heure....24h....) ?

Le 18/06/2021 à 09:39, Dragoniacs a dit :

Je viens de faire la mise à jour pour passer en 1.2, car je me suis rendue compte que mes valeurs de pluie J-1 et J-2 sont restées à 0 mm

Je ne sais pas si cette version corrigera ce problème...

image.png.a9659fce3992d31290bf5f77a1df277c.png

 

Lien vers le commentaire
Partager sur d’autres sites

salut flamalex,

 

La variable "Précipitations ce jour" est la quantité de pluie journalière cumulée par un pluviomètre Netatmo. De ce fait, l'arrosage auto se déclenchera (ou pas) selon un niveau réel de précipitations.

 

Stef

Modifié par couillerot
Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...