..:: Domotique Store : Le Blog ::..
Domoticz Guides et Tutoriels Tous les articles

GreenIQ sous Domoticz : Gérer les arrosages planifiés

GreenIQ sous Domoticz : Gérer les arrosages planifiés

Voici un article destiné aux possesseurs du « GreenIQ » ayant mis en place une planification d’arrosage. Cette fonctionnalité est très pratique mais fastidieuse à désactiver/réactiver en cas de pluie rendant l’arrosage inutile ou bien tout simplement pour mettre le système en hivernage.

Cet article va proposer une solution l’appui sur un simple bouton va totalement désactiver/réactiver la planification. Bien sûr, l’arrosage manuel, quant à lui, reste totalement opérationnel.

Rappel sur la planification

Ma planification

Zone 1 Zone 2 Zone 3 Zone 4
Début Fin Début Fin Début Fin Début Fin
06:30 06:33 06:36 06:39 06:42 06:45 06:48 06:51
07:10 07:13 07:16 07:19 07:22 07:25 07:28 07:31
07:50 07:53 07:56 07:59 08:02 08:05 08:08 08:11
08:30 08:33 08:36 08:39 08:42 08:45 08:48 08:51

Mon terrain est divisé en quatre zones d’arrosage que je balaye en quatre fois, entre 6h30 et 9h00, en petites séquences, pour laisser le temps à l’eau de pénétrer dans le sol.

Pour en arriver à cela, j’ai dû pour chacune de mes 4 zones :

  • Activer la fonctionnalité « Planning« 
  • Programmer chaque horaire d’ouverture et de fermeture de l’électrovanne

Constats

  • Bien sûr, ma planification fonctionne parfaitement mais
    • si, à mon réveil, je constate qu’il pleut à verse et qu’en même temps mon arrosage planifié fonctionne,
    • ce n’est pas moins de 32 règles de planification qu’il me faut modifier pour passer leurs états Activé de « Oui » à « Non »,
    • et surtout penser à les remettre à « Oui » pour la prochaine session d’arrosage
  • De la même façon, en fin de saison lorsque l’arrosage ne se justifie plus, je devrais intervenir sur ces 32 règles pour les rendre inactives … Ou bien débrancher le GreenIQ, ce qui est une autre solution 😉

Oui, un simple bouton pour gérer tout cela s’impose !

Mise en oeuvre de la solution

Pré-requis

  • Avoir configuré un serveur SMTP dans Domoticz (Réglages/Paramètres/Onglet Email)
  • Savoir déclarer des variables (Réglages/Plus d’options/Variables utilisateur)
  • savoir créer et/ou modifier des scripts (Réglages/Plus d’options/Événements)

Remarque concernant les scripts

Le système Domoticz, utilisé pour faire fonctionner le GreenIQ, accepte plusieurs langages de programmation :

Ils sont plus ou moins complexes et passer de l’un à l’autre ne pose aucun problème. Pour ce qui nous concerne, le « dzVents » et les requêtes JSON documentées ici seront utilisés dans cet article.

Création du bouton

Nous allons créer un interrupteur virtuel associé à un matériel virtuel. Cet interrupteur virtuel sera utilisé pour activer ou désactiver les plannings. Pour cela :

  • Etape 1 : créer le « matériel virtuel »
    • Aller dans Réglages/Matériel
    • Remplir les champs
      • Nom : ce que vous voulez (OnOffGlobal pour moi)
      • Type : Dummy (Does nothing, use for virtual switches only) … (choix trouvé dans la liste)
    • Cliquer sur Ajouter
  • Etape 2 : créer l’interrupteur virtuel
    • Dans la ligne décrivant le nouveau matériel virtuel se trouve un bouton intitulé « Créer un capteur virtuel »
    • Cliquer sur ce bouton pour faire apparaitre la boîte de dialogue « Create Virtual Sensor »
    • Remplir les champs
      • Nom : ce que vous voulez (Arrosage planifié pour moi)
      • Type : Interrupteur (choix trouvé dans la liste)
    • Cliquer sur OK
    • Une mention apparait brièvement vous indiquant que votre nouveau « capteur » est disponible dans l’onglet « Dispositifs« 

Personnalisation du bouton, première partie

Le bouton nouvellement créé se retrouve maintenant dans l’onglet Interrupteurs

  • Cliquer sur son bouton Modifier pour commencer à le personnaliser
  • La première personnalisation va consister à changer son icône afin de le rendre plus intuitif. Donc, dans le champ Icône, sélectionner la goutte d’eau ainsi
    • une goutte d’eau bleue signifiera que la planification est active
    • une goutte d’eau grise signifiera que la planification est désactivée
  • Une fois ce choix réalisé, cliquer sur Sauvegarder

Ce bouton va pouvoir passer à On ou Off et nous allons maintenant nous intéresser à l’action déclenchée par son changement d’état.

L’appui sur le bouton virtuel Arrosage planifié va :

  • en passant de On à Off, mettre la valeur 0 dans une variable nommée GlobalOnOff
  • en passant de Off à On, mettre la valeur 1 dans une variable nommée GlobalOnOff
  • ce changement de valeur de la variable GlobalOnOff va être détectée par le système et le script « GlobalOnOff » va alors prendre le relais pour basculer automatiquement toutes les planifications de On à Off ou de Off à On selon le cas

Création de la variable GlobalOnOff

  • Aller dans Réglages/Plus d’options/Variables utilisateur
  • Dans le cadre du bas intitulé Modifier la variable,
    • dans le champ Nom de la variable : saisissez GlobalOnOff
    • dans le champ Type de variable : choisissez Entier
    • dans le champ Valeur de la variable : saisissez 1
  • Terminer en cliquant sur Ajouter

Personnalisation du bouton, seconde partie

Cette étape va consister à « lier » l’appui sur le bouton Arrosage planifié avec le contenu de la variable GlobalOnOff

  • Etape 1 : récupérer « l’adresse IP » de votre GreenIQ
    • pour cela, cliquer sur la barre d’adresse de votre navigateur
    • vous devriez voir apparaître quelque chose sous la forme « 192.168.10.51:8080/ … etc »
    • seule, la partie entre « 192 » et la première barre de fraction nous intéresse, notez-la
  • Etape 2 : aller dans Réglages/Interrupteurs
    • Dans le descriptif du bouton Arrosage planifié, cliquer sur Modifier
      • dans le champ Action On, saisissez le texte suivant en remplaçant « Adresse IP de votre GreenIQ » par la valeur trouvée précédemment
http://Adresse IP de votre GreenIQ/json.htm?type=command&param=updateuservariable&vname=GlobalOnOff&vtype=0&vvalue=1
      • dans le champ Action Off, saisissez le texte suivant en remplaçant « Adresse IP de votre GreenIQ » par la valeur trouvée précédemment
http://Adresse IP de votre GreenIQ/json.htm?type=command&param=updateuservariable&vname=GlobalOnOff&vtype=0&vvalue=0
      • Une fois ces saisies réalisées, cliquez sur Sauvegarder

Contrôle du bon fonctionnement du bouton

A cette étape, un petit contrôle s’impose avant d’aller plus loin. L’appui sur le bouton Arrosage planifié doit :

  • faire apparaitre le mot On ou Off à droite du texte Arrosage planifié
  • faire passer la goutte d’eau de la couleur bleue à la couleur grise et inversement
  • et SURTOUT, en allant dans Réglages/Plus d’options/Variables utilisateur, on doit constater que la variable GlobalOnOff passe de 0 à 1 et inversement

Si ces contrôles ne sont pas positifs, il est inutile d’aller plus loin !

Et maintenant, le script

  • Le script se nomme  « GlobalOnOff » et est programmé en dZvents
  • Il utilise le contenu de la variable GlobalOnOff ainsi que des requêtes JSON documentées ici
  • Il est automatiquement démarré par le système à chaque appui sur le bouton Arrosage planifié
  • Son fonctionnement est de type asynchrone et pour faire simple, en voici le mécanisme :
    • Étape 1 : le script démarre suite à l’appui sur le bouton Arrosage planifié. Il initialise alors les données persistantes dont il a besoin pour fonctionner, lance immédiatement une requête JSON pour « récupérer » toutes les planifications existantes (pour rappel, 32 pour mon planning d’arrosage) et s’arrête
    • Étape 2 : suite au résultat de la requête initiée à l’étape 1, le script redémarre et va sauvegarder toute la planification dans ses données persistantes. Il va ensuite initier une boucle de traitement pour passer l’état Activé de chaque planification élémentaire de Oui à Non ou inversement selon la demande. Il initie la première requête JSON de changement d’état et s’arrête
    • Étape 3 : au retour de chaque modification de planification, le script redémarre et passe à la suivante. Lorsque toutes les modifications de planning ont été réalisées, un courriel est envoyé et le script s’arrête définitivement
return  {
        	
        on = { variables = { 'GlobalOnOff' }, httpResponses = { 'CodeRetour' } },
        
        data = { 
            Step = { initial = 'Appel initial' },
            MasterInter = { initial = 'MasterInter non initialisé' },
            Horo = { initial = 'Horo non initialisé' },
            URLPlanningOn = { initial = 'URLPlanningOn non initialisée' },
            URLPlanningOff = { initial = 'URLPlanningOff non initialisée' },
            TabPlannings = { initial = {0, 0, 0, 0, 0} },
            NbPostesPlanning = { initial = 'NbPostesPlanning non initialisé' },
            PostePlanningEc = { initial = 'PostePlanningEc non initialisé'
            }
        },
        
	execute = function(domoticz, item)
        
        local bavard = false
        
        if bavard then 
            domoticz.log('Etape du script = ' .. domoticz.data.Step)
            domoticz.log('Variable MasterInter = ' .. domoticz.data.MasterInter)
            domoticz.log('Variable Horo = ' .. domoticz.data.Horo)
            domoticz.log('Requête PlanningOn = ' .. domoticz.data.URLPlanningOn)
            domoticz.log('Requête PlanningOff = ' .. domoticz.data.URLPlanningOff)
            --	à 'décommenter' pour lister la table persistante des planifications dans la log
            --	if domoticz.data.NbPostesPlanning ~= 'NbPostesPlanning non initialisé' then
            --		for i = 1, domoticz.data.NbPostesPlanning do
            --			domoticz.log('Poste planning "' .. i .. '" : TimerID = ' .. domoticz.data.TabPlannings[i][1] .. ', Active = ' .. domoticz.data.TabPlannings[i][2] .. ', DevName = ' .. domoticz.data.TabPlannings[i][3] .. ', Time = ' .. domoticz.data.TabPlannings[i][4] .. ', TimerCmd = ' .. domoticz.data.TabPlannings[i][5])
            --		end
            --	end
            domoticz.log('Nombre de plannings = ' .. domoticz.data.NbPostesPlanning)
            domoticz.log('Poste planning en cours = ' .. domoticz.data.PostePlanningEc)
        end
        
        ---- Trigger = changement d'état de la Variable GlobalOnOff ... donc premier appel du script
        
        if item.isVariable then 
            
            local MasterInter = ''
            local IPGreenIQ = 'http://192.168.10.51:8080'
            local GetPlannings = IPGreenIQ .. '/json.htm?type=schedules&filter=device'
            ---- Attention, idx sera l'index du schedule et non du device
            local PlanningOn = IPGreenIQ .. '/json.htm?type=command&param=enabletimer&idx='
            local PlanningOff = IPGreenIQ .. '/json.htm?type=command&param=disabletimer&idx='
            local Jour = os.date("%d-%m-%Y")
            local Heure = os.date("%X")
            local Horo = " le " .. Jour .. " à " .. Heure
            
            if item.value == 1 then MasterInter = 'On' else MasterInter = 'Off' end
            
            ---- Chargement des données persistantes
            
            domoticz.data.MasterInter = MasterInter
            domoticz.data.Horo = Horo
            domoticz.data.URLPlanningOn = PlanningOn
            domoticz.data.URLPlanningOff = PlanningOff
            
            ---- Récupération de la plannification des devices
            
            domoticz.data.Step = 'Initialisation des variables, récupération de la planification'
            
            if bavard then domoticz.log('Envoi de la requête ' .. GetPlannings) end
            
            domoticz.openURL({
                url = GetPlannings,
                method = 'GET',
                callback = 'CodeRetour',
            })
            
        end
        
        ---- Trigger = Code retour openURL
        
        if item.isHTTPResponse then
            
            if item.ok then
                
                ---- Retour de l'interrogation de la planification des devices (/json.htm?type=schedules&filter=device)
                
                if domoticz.data.Step == 'Initialisation des variables, récupération de la planification' then
                    
                    ---- Mise en table de la planification
                    
                    -- Conversion du résultat JSON de la requête vers la table TabPlanningsJson
                    local TabPlanningsJson = item.json.result
                    
                    -- Comptage du nombre de postes pour initialiser la variable persistante NbPostesPlanning
                    NbPostes = 0
                    for index in pairs(TabPlanningsJson) do
                        NbPostes = NbPostes + 1
                    end
                    
                   domoticz.data.NbPostesPlanning = NbPostes
                    
                    ---- Chargement de la table "persistante"
                    ---- Structure de la table :
                    ---- 1 : TimerID (Index de planification)
                    ---- 2 : Active (Planification active ou non)
                    ---- 3 : DevName (Nom du périphérique)
                    ---- 4 : Time (Heure de la Planification)
                    ---- 5 : TimerCmd (Action entreprise)
                    
                    -- Déclaration de la table persistante TabPlannings en fonction du nombre de postes retourné par la commande json
                    domoticz.data.TabPlannings = {}
                    
                    for i = 1, NbPostes do
                        domoticz.data.TabPlannings [i] = {}
                        for j = 1, 5 do
                            domoticz.data.TabPlannings [i] [j] = " "
                        end
                    end
                    
                    -- Chargement de la table persistante TabPlannings
                    local CtrPlan = 0
                    
                    for i, v in pairs (TabPlanningsJson) do
                        
                        if bavard then 
                            domoticz.log('TabPlanningsJson --> Zone = ' .. TabPlanningsJson [i] ["DevName"] .. ' - Heure = ' .. TabPlanningsJson [i] ["Time"] .. ' - Timer = ' .. TabPlanningsJson [i] ["TimerID"] .. ' - Actif = ' .. TabPlanningsJson [i] ["Active"])
                        end
                        
                        CtrPlan = CtrPlan + 1
                        
                        domoticz.data.TabPlannings [CtrPlan] [1] = TabPlanningsJson [i] ["TimerID"]
                        domoticz.data.TabPlannings [CtrPlan] [2] = TabPlanningsJson [i] ["Active"]
                        domoticz.data.TabPlannings [CtrPlan] [3] = TabPlanningsJson [i] ["DevName"]
                        domoticz.data.TabPlannings [CtrPlan] [4] = TabPlanningsJson [i] ["Time"]
                        domoticz.data.TabPlannings [CtrPlan] [5] = TabPlanningsJson [i] ["TimerCmd"]
                        
                    end
                    
                    ---- Envoi de la première requête d'activation ou de désactivation des plannings 
                    
                    -- Préparation des codes retours
                    domoticz.data.Step = 'Boucle de modification de la planification'
                    domoticz.data.PostePlanningEc = 1
                    
                    -- Mise en forme de la requête
                    local URLPlanningOnOff = ''
                    
                    if domoticz.data.MasterInter == 'On' then URLPlanningOnOff = domoticz.data.URLPlanningOn else URLPlanningOnOff = domoticz.data.URLPlanningOff end
                    
                    URLPlanningOnOff = URLPlanningOnOff .. domoticz.data.TabPlannings [domoticz.data.PostePlanningEc] [1]
                    
                    if bavard then domoticz.log('Envoi de la requête ' .. URLPlanningOnOff) end
                    
                    domoticz.openURL({
                    url = URLPlanningOnOff,
                    method = 'GET',
                    callback = 'CodeRetour',
                    })
                    
                end
                    
                if domoticz.data.Step == 'Boucle de modification de la planification' then
                    
                    -- On incrémente le compteur de poste dans la table des planifications
                    domoticz.data.PostePlanningEc = domoticz.data.PostePlanningEc + 1
                    
                    -- On vérifie si tous les postes ont été traités
                    if domoticz.data.PostePlanningEc > domoticz.data.NbPostesPlanning then
                        
                        ---- C'est fini
                        -- Mise en forme tu texte de compte-rendu
                        local Jour = os.date("%d-%m-%Y")
                        local Heure = os.date("%X")
                        local Horo = " le " .. Jour .. " à " .. Heure
                        local MasterInter 
                        if domoticz.data.MasterInter == 'On' then MasterInter = 'RÉACTIVATION' else MasterInter = 'DÉSACTIVATION' end
                        -- local Texte = "Demande de " .. MasterInter .. " de l'arrosage planifié " .. domoticz.data.Horo .. " - Procédure terminée " .. Horo
                        local Texte = MasterInter .. " de l'arrosage planifié " .. domoticz.data.Horo
                        
                        if bavard then domoticz.log("--> Message = " .. Texte) end
                        
                        --  Envoi du courriel
                        domoticz.email("GreenIq - Gestion de l'arrosage planifié", Texte, 'homegmjpr@gmail.com')
                        
                        -- Réinitialisation des données persistantes pour la prochaine utilisation
                        domoticz.data.Step = 'Appel initial'
                        domoticz.data.MasterInter = 'MasterInter non initialisé'
                        domoticz.data.Horo = 'Horo non initialisé'
                        domoticz.data.URLPlanningOn = 'URLPlanningOn non initialisée'
                        domoticz.data.URLPlanningOff = 'URLPlanningOff non initialisée'
                        domoticz.data.TabPlannings = {}
                        domoticz.data.NbPostesPlanning = 'NbPostesPlanning non initialisé'
                        domoticz.data.PostePlanningEc = 'PostePlanningEc non initialisé'
                        
                        ---- Bye bye
                        
                    else
                        
                        ---- On continue
                        
                        -- Mise en forme de la requête
                        local URLPlanningOnOff = ''
                        
                        if domoticz.data.MasterInter == 'On' then URLPlanningOnOff = domoticz.data.URLPlanningOn else URLPlanningOnOff = domoticz.data.URLPlanningOff end
                        
                        URLPlanningOnOff = URLPlanningOnOff .. domoticz.data.TabPlannings [domoticz.data.PostePlanningEc] [1]
                        
                        if bavard then domoticz.log('Envoi de la requête ' .. URLPlanningOnOff) end
                        
                        domoticz.openURL({
                        url = URLPlanningOnOff,
                        method = 'GET',
                        callback = 'CodeRetour',
                        })
                        
                    end
                    
                end
                
            else
                
                -- CodeRetour non OK
                domoticz.log('--> Procédure GlobalOnOff - Code retour incorrect : ' .. item.statusCode .. ', ' .. item.statusText)
                domoticz.log('Poste planning en cours = ' .. domoticz.data.PostePlanningEc)
                domoticz.log('Poste planning "' .. domoticz.data.PostePlanningEc .. '" : TimerID = ' .. domoticz.data.TabPlannings[domoticz.data.PostePlanningEc][1] .. ', Active = ' .. domoticz.data.TabPlannings[domoticz.data.PostePlanningEc][2] .. ', DevName = ' .. domoticz.data.TabPlannings[domoticz.data.PostePlanningEc][3] .. ', Time = ' .. domoticz.data.TabPlannings[domoticz.data.PostePlanningEc][4] .. ', TimerCmd = ' .. domoticz.data.TabPlannings[domoticz.data.PostePlanningEc][5])
                
                -- The response object (second parameter in your execute function) has these attributes:
                
                -- data: Raw response data.
                -- headers: Table. Response headers.
                -- isJSON: Boolean. Short for response.headers['Content-Type'] == 'application/json'. When true, the data is automatically converted to a Lua table.
                -- json. Table. When the response data is application/json then the response data is automatically converted to a Lua table for quick and easy access.
                -- ok: Boolean. True when the request was successful. It checks for statusCode to be in range of 200-299.
                -- statusCode: Number. HTTP status codes. See HTTP response status codes.
                -- statusText: String. HTTP status message. See HTTP response status codes.
                -- protocol: String. HTTP protocol. See HTTP response status codes.
                -- trigger, callback: String. The callback string that triggered this response instance. This is useful if you have a script that is triggered by multiple different callback strings.
            
            end
            
        end
        
	end
}

Conclusion, remarques, adaptation

Cette programmation, un peu complexe, fonctionne parfaitement et est vraiment pratique ! Désactiver/Réactiver toute la programmation en un seul clic est vraiment « confortable » et surtout « plus fiable« . Bien sûr, cela ne touche absolument pas l’arrosage manuel qui peut être utilisé en parallèle.

Quelques commentaires techniques :

  • La variable « bavard » sert à générer des traces dans la « Log » (Réglages/Log). Pensez à remettre « bavard » à false lorsque toute l’installation a été testée et validée
  • Ce script traite l’ensemble de la planification sans distinction. Si certaines électrovannes et/ou horaires de planifications ne doivent pas être modifiés, cela est tout-à-fait possible en testant les données persistantes :
    • domoticz.data.TabPlannings[i][3] pour filtrer sur le nom de l’électrovanne
    • domoticz.data.TabPlannings[i][4] pour filtrer sur l’horaire
  • Il peut arriver, surtout lors de la mise au point, d’avoir à réinitialiser les données persistantes du script. Cela se fait tout simplement en établissant une connexion SSH avec le GreenIQ et en lui envoyant la commande « rm ~/domoticz/scripts/dzVents/data/__data_GlobalOnOff.lua » (répondre « Yes »). Les données persistantes seront alors automatiquement recréées lors de la prochaine exécution du script

Et pour terminer, voici un exemple de courriel reçu après l’exécution du script :

0
0
Jean-Paul RADET

Bonjour, Je suis Jean Paul ! Informaticien à la retraite avec une curiosité toujours intacte, intéressé par la domotique, je publie des articles sur le Blog Planète Domotique afin d'aider la communauté.

Laisser un commentaire