Aller au contenu
couillerot

Quick App : Arrosage Automatique

Recommended Posts

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))
self:debug(name)
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", ""..Arro)
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
			fibaro:debug("Error : empty response data")
		    end
		else
			fibaro:debug("Error : status=" .. tostring(response.status))
	end
end,
	    error = function(err)
		    fibaro:debug("Error : " .. err)
	end
})   
                    self:stockprecipitations()
               fibaro.setTimeout(1000 * 60 * 15, 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") then
    precip1 = self:getVariable("precip_jour_1")
    self:setVariable("precip_jour_2", precip1)
end
if Heure == tonumber("23") and Minute == tonumber("50") then
     self:setVariable("precip_jour_1", pluie)
end
            fibaro.setTimeout(1000 * 60 * 5, function()
        self:stockprecipitations()
    end)
end

 

 

Eau.png.447a5e6d4ef3ea43d82b1ef74e12f14f.png

 

version 1.2

 

Arrosage_Auto.fqa

 

bonne installation !

 

Stef

Modifié par couillerot
  • Like 3

Partager ce message


Lien à poster
Partager sur d’autres sites

Super pour mon arrosage en cours d'installation !
Je vais tester ton QA :)

Envoyé de mon RMX1993 en utilisant Tapatalk

  • Thanks 1

Partager ce message


Lien à poster
Partager sur d’autres sites

merci Dragoniacs ;)

 

je vais tâcher de l'essayer également avec le mien :)

 

Stef

Partager ce message


Lien à poster
Partager sur d’autres sites

@couillerot merci pour ce QA. dans ma nouvelle maison je suis entrain d'étudier l'arrosage automatique. Je pense que ton QA va bien m'aider. Cool!:60:

  • Thanks 1

Partager ce message


Lien à poster
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 ? 

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

je ne le conseille pas car WeatherBit fournit des données de précipitations en mm/h et non en cumul sur 24h comme le pluvio Netatmo.

 

Stef

Modifié par couillerot

Partager ce message


Lien à poster
Partager sur d’autres sites

Peux tu nous mettre à disposition le code du QA pour qu'on ne soit pas obligé de tout réimporter ?

Envoyé de mon RMX1993 en utilisant Tapatalk

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

c'est fait ;)

QA mis à jour le 03.06.2021

 

Stef

Modifié par couillerot
  • Like 2

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
Partager sur d’autres sites

sorry, en effet il faut ajouter une variable "prevision" dans le tableau.

 

Stef

Modifié par couillerot

Partager ce message


Lien à poster
Partager sur d’autres sites

Ah ok
Et je mets quoi comme valeur dedans ?

Envoyé de mon RMX1993 en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

tu peux mettre ce que tu veux, la variable se mettra à jour par la suite automatiquement ;)

 

Stef

  • Like 1

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
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
 

Partager ce message


Lien à poster
Partager sur d’autres sites

J-1 correspond bien à la valeur obtenue la veille (donc J) et ainsi de suite... le QA crée lui-même un mini historique sur 2 jours, que ce soit avec WB ou avec un capteur de pluie.

 

Stef

Partager ce message


Lien à poster
Partager sur d’autres sites

×