Yorino Posté(e) le 29 août 2019 Signaler Posté(e) le 29 août 2019 Bonjour à tous, Je découvre petit à petit la HC2, ses différents périphériques et surtout le langage LUA. Clairement, je ne suis pas informaticien, j'ai des notions mais on en reste là. J'ai parcouru pas mal de page de ce forum, découvert des tas de "Tutos" relativement sympa et me suis rendu compte que certains membres sont quand même super calés en programmation ! Bref, modestement, je partage avec vous ma programmation LUA pour gérer une Alarme fait "Maison" à partir de la HC2. J'ai bien conscience que ce n'est absolument pas le rôle d'une box Domotique et que rien ne peut remplacer une "Vraie" alarme. (Sécurité des communications, Anti-piratage etc etc...). On va dire que c'est donc un petit "plus" que m'offre la box HC2, en attendant que je m'attaque vraiment à la "domotisation" de mon domicile. Rendons également les crédits à ma source d'inspiration,, "Moicphil" : J'ai récupéré une partie du code pour certaines fonctions et ce tuto m'a surtout permis de mettre le pied dans le langage LUA. Donc grand merci à lui pour son partage, mais également à tous les intervenants du topic car c'est très riche d'informations. Bon passons à mon modeste code : - Un module virtuel pour commander la mise en service, l'arrêt et la personnalisation de l'Alarme. - Une scène pour gérer l'activation, la vérification, la désactivation et les actions à réaliser en cas d'alarme. Création de variables : 6 au total. Alarme_Détecteurs : Permet de mettre les identifiants des détecteurs déclencheur de l'alarme Alarme_Exclus : Permet de mettre les identifiants des détecteurs exclus de l'alarme Alarme_Mode : Permet de stocker la mode actif Alarme_Zone : Permet de stocker la zone à tester Alarme_Etat : Permet de stocker l'information d'état de l'alarme Alarme_Scene : Permet de lancer la scène Alarme associée Pour le VD : Rien de bien nouveau, grande inspiration venant du tuto d'origine... Choix des Zones : J'ai choisi de pouvoir paramétrer plusieurs zones au choix. Il suffit d'assigner dans chaque zone les détecteurs à inclure. La fonction "Toutes les zones", regroupe l'ensemble des détecteurs de la maison. C'est aussi à partir de ces touches que l'on active l'alarme. La particularité : Si on choisit la zone "Rdc". Le VD test dans un premier temps si cette zone n'est pas déjà choisie. Si non, le VD l'ajoute à la liste des zones précédemment choisi. Si oui, le VD retire cette zone de la surveillance et si c'est l'unique zone surveillée, il désactive l'alarme. Voici les codes LUA : Pour le bouton "Toutes les zones" : Citation --Lister ci dessous le N° des modules de la zone local Detecteur = {xx,xx,xx,xx,xx,xx,xx,xx,xx} -- Encode dans les tables les détecteurs à tester fibaro:setGlobal("Alarme_Detecteurs", json.encode(Detecteur)) -- Anulation de toutes les autres zones et set à "Toutes les zones" local Zone = "Toutes Zones" fibaro:setGlobal("Alarme_Zone", Zone) -- Forçage en mode complet pour sirène local Mode = "Complet" fibaro:setGlobal("Alarme_Mode", Mode) -- Forçage aucune exclusion local Exclus = "" fibaro:setGlobal("Alarme_Exclus", Exclus) -- Vide la table Exclus local Exclus = "Aucun" -- Pour affichage propre dans le VD -- Information d'état local Etat = "Demande armement" fibaro:setGlobal("Alarme_Etat", Etat) -- Affiche les états de l'alarme dans le VD pour info utilisateur fibaro:call(fibaro:getSelfId(), "setProperty", "ui.EtatActive.value", Zone) fibaro:call(fibaro:getSelfId(), "setProperty", "ui.ModeActif.value", Mode) fibaro:call(fibaro:getSelfId(), "setProperty", "ui.SensExclus.value", Exclus) fibaro:call(fibaro:getSelfId(), "setProperty", "ui.EtatAlm.value", Etat) -- Trigger de lancement de la scène local compteur=fibaro:getGlobal("Alarme_Scene") compteur = compteur+1 fibaro:setGlobal("Alarme_Scene", compteur) --Option --pour armer un ou des détecteurs --fibaro:call(25, "setArmed", "1") armer un sensor Pour les boutons "Zones" : Citation --Lister ci dessous le N° des modules de la zone sans espace local DetecteurToAdd = {xx,xx,xx,xx} -- Déclaration de variable locale pour stocker les tableaux local Zone = fibaro:getGlobal("Alarme_Zone") local Mode = fibaro:getGlobal("Alarme_Mode") local Detecteur = fibaro:getGlobal("Alarme_Detecteurs") local Exclus = fibaro:getGlobal("Alarme_Exclus") local Etat = fibaro:getGlobal("Alarme_Etat") local ZoneSet = "Rdc" if ZoneSet ~= Zone then -- Compare si la zone n'est pas déjà sélectionnée. Si oui on arrête l'alarme fibaro:debug("Zone non présente, process d'ajout") if Zone == "" or Zone == "Toutes Zones" then -- Si aucune zone n'est sélectionnée on charge en direct fibaro:debug("Ajout direct") Zone = ZoneSet Detecteur = DetecteurToAdd else fibaro:debug("Recherche si zone est déjà activée...") if string.find(Zone, ZoneSet) ~= nil then -- La zone n'est pas encore sélectionnée fibaro:debug("Zone activée, retrait de la zone") Zone = string.gsub(Zone, ZoneSet, "") -- Retrait du nom de la zone if string.find(Zone, ",,") ~= nil then Zone = string.gsub(Zone, ",,", ",") end -- On remplace les double ,, par une simple. if string.find(Zone, ",") == 1 then Zone = string.gsub(Zone, ",", "", 1) end -- On remplace si la chaine commence par une vigule par rien Zone = string.reverse(Zone) -- On reverse la chaine pour tester si virgule seule à la fin if string.find(Zone, ",") == 1 then Zone = string.gsub(Zone, ",", "", 1) end -- On remplace si la chaine commence par une vigule par rien Zone = string.reverse(Zone) Detecteur = json.decode(Detecteur) -- Charge les détecteurs déjà actifs DetecteurToAdd = json.encode(DetecteurToAdd) -- Encode la table des détecteurs à retirer DetecteurToAdd = string.gsub(DetecteurToAdd, "[%[%]]", "").."," --Suprrime les [ et ] de la chaine et ajoute une virgule à la fin while DetecteurToAdd ~= "" do local Sensor = string.sub(DetecteurToAdd, 1, string.find(DetecteurToAdd, ",")-1) -- On prend le 1er détectuer DetecteurToAdd = string.gsub(DetecteurToAdd, Sensor..",", "") -- On le supprime de la chaine pour le prochain passage local exist = 0 -- variable d'index for i,v in ipairs(Detecteur) do -- Recherche de la position dans la table si detecteur existe if (v == Sensor*1) then exist = i end end if exist ~= 0 then -- Si détecteur exist, on le supprime table.remove(Detecteur, exist) end end else fibaro:debug("Zone non activée, ajout en cours") Zone = ZoneSet..","..Zone -- Ajout de nom de la zone Detecteur = json.decode(Detecteur) -- Charge les détecteurs déjà actifs DetecteurToAdd = json.encode(DetecteurToAdd) -- Encode la table des détecteurs à ajouter ne DetecteurToAdd = string.gsub(DetecteurToAdd, "[%[%]]", "").."," --Suprrime les [ et ] de la chaine et ajoute une virgule à la fin while DetecteurToAdd ~= "" do local Sensor = string.sub(DetecteurToAdd, 1, string.find(DetecteurToAdd, ",")-1) -- On prend le 1er détectuer DetecteurToAdd = string.gsub(DetecteurToAdd, Sensor..",", "") -- On le supprime de la chaine pour le prochain passage local exist = 0 -- variable d'index for i,v in ipairs(Detecteur) do -- Recherche de la position dans la table si detecteur existe if (v == Sensor*1) then exist = i end end if exist == 0 then -- Si détecteur exist, on le supprime table.insert(Detecteur, Sensor*1) end end end end if Mode == "" then Mode = "Complet" end if Exclus == "" then Exclus = "Aucun" end Etat = "Demande armement" else fibaro:debug("Mise en arrêt") Zone = "" Mode = "" Detecteur = "Aucun" Exclus = "" fibaro:setGlobal("Alarme_Exclus", Exclus) Etat = "Demande désarmement" end -- Charge les variables d'état fibaro:debug("Chargement des variables") fibaro:setGlobal("Alarme_Zone", Zone) fibaro:setGlobal("Alarme_Mode", Mode) fibaro:setGlobal("Alarme_Etat", Etat) if Detecteur == "Aucun" then fibaro:setGlobal("Alarme_Detecteurs", Detecteur) else fibaro:setGlobal("Alarme_Detecteurs", json.encode(Detecteur)) end -- Affiche les états de l'alarme dans le VD pour info utilisateur fibaro:debug("Actualisation des status") fibaro:call(fibaro:getSelfId(), "setProperty", "ui.EtatActive.value", Zone) fibaro:call(fibaro:getSelfId(), "setProperty", "ui.ModeActif.value", Mode) if Exclus == "Aucun" or Exclus == "" then fibaro:call(fibaro:getSelfId(), "setProperty", "ui.SensExclus.value", Exclus) end fibaro:call(fibaro:getSelfId(), "setProperty", "ui.EtatAlm.value", Etat) fibaro:debug("Terminé") -- Trigger de lancement de la scène local compteur=fibaro:getGlobal("Alarme_Scene") compteur = compteur+1 fibaro:setGlobal("Alarme_Scene", compteur) Choix du mode : Ici c'est plus de choisir quelles vont être les actions qui se réaliserons lors du déclenchement de l'alarme. Complet : Sirène Intérieur + Sirène Extérieur + Appel VoIP Silence : Juste l'appel VoIP Intérieur : Juste la sirène intérieur Extérieur : Juste la sirène extérieur Voici les codes LUA : Citation -- Encode le mode de fonctionnement choisi local Mode = fibaro:getGlobal("Alarme_Mode") local Zone = fibaro:getGlobal("Alarme_Zone") if Zone ~= "" then Mode = "Complet" else Mode = "" end fibaro:setGlobal("Alarme_Mode", Mode) -- Affiche les états de l'alarme dans le VD pour info utilisateur fibaro:call(fibaro:getSelfId(), "setProperty", "ui.ModeActif.value", Mode) Arrêt de l'alarme : Simple, désactiver l'alarme. Voici les codes LUA : Citation --Annulation de tous les détecteurs & Zones -- Annulation des détecteurs à tester local Detecteur = "Aucun" fibaro:setGlobal("Alarme_Detecteurs", Detecteur) -- Annulation de toutes les autres zones local Zone = "" fibaro:setGlobal("Alarme_Zone", Zone) -- Annulation des modes de fonctionnement local Mode = "" fibaro:setGlobal("Alarme_Mode", Mode) -- Annulation des exclusions local Exclus = "" fibaro:setGlobal("Alarme_Exclus", Exclus) -- Mise à jour du statut de fonctionnement local Etat = "Demande désarmement" fibaro:setGlobal("Alarme_Etat", Etat) -- Affiche les états de l'alarme dans le VD pour info utilisateur fibaro:call(fibaro:getSelfId(), "setProperty", "ui.EtatActive.value", Zone) fibaro:call(fibaro:getSelfId(), "setProperty", "ui.ModeActif.value", Mode) fibaro:call(fibaro:getSelfId(), "setProperty", "ui.SensExclus.value", Exclus) fibaro:call(fibaro:getSelfId(), "setProperty", "ui.EtatAlm.value", Etat) -- Trigger de lancement de la scène local compteur=fibaro:getGlobal("Alarme_Scene") compteur = compteur+1 fibaro:setGlobal("Alarme_Scene", compteur) Exclusion Dect. : Pourvoir exclure un détecteur de l'alarme... Par exemple si on souhaite laisser une fenêtre ouverte à l'étage ou autre... Un appui exclus le détecteur, un nouvel appui l'inclus à nouveau. Voici les codes LUA : Citation local sensor = xx local exclus = fibaro:getGlobal("Alarme_Exclus") local jExclus = "" local nExclus = "" local Zone = fibaro:getGlobal("Alarme_Zone") ------------------------------ function exist(t, s) for i,k in ipairs(t) do if (k == s) then return i end end return nil end ------------------------------ if Zone ~= "" then if (exclus and exclus ~= "") then fibaro:debug(exclus) exclus = json.decode(exclus) else exclus = {} end local index = exist(exclus, sensor) if (index) then table.remove(exclus, index) else table.insert(exclus, sensor) end if (#exclus > 0) then jExclus = json.encode(exclus) for i = 1, #exclus do nExclus = nExclus .. fibaro:getName(exclus) .. ", " end nExclus = nExclus:sub(1, nExclus:len()-2) else jExclus = "" nExclus = "Aucun" end fibaro:setGlobal("Alarme_Exclus", jExclus) fibaro:call(fibaro:getSelfId(), "setProperty", "ui.SensExclus.value", nExclus) local Etat = "Demande armement" fibaro:setGlobal("Alarme_Etat", Etat) fibaro:call(fibaro:getSelfId(), "setProperty", "ui.EtatAlm.value", Etat) end -- Trigger de lancement de la scène local compteur=fibaro:getGlobal("Alarme_Scene") compteur = compteur+1 fibaro:setGlobal("Alarme_Scene", compteur) Scène : Et voici enfin la scène qui gère la mise en service, l'arrêt et le déclenchement de l'alarme Citation --[[ %% properties xx value xx value xx value xx value %% events %% globals Alarme_Scene --]] fibaro:debug("Début de la scène, nombre d'instance: "..fibaro:countScenes()) -- Limitation à une seule scène en même temps. if (fibaro:countScenes() > 1) then fibaro:abort() end -- Déclaration des portable recevant les messages Push local portables = {xx} -- Chargement dans variables locales des états d'alarme local DeclencheurType = fibaro:getSourceTrigger() -- Déclaration de la source de lancerment de la scène local id_declencheur = nil -- Chargmeent de l'ID du détecteur déclencheur local Etat = fibaro:getGlobal("Alarme_Etat") -- Chargement de l'état de l'alarme local Mode = fibaro:getGlobal("Alarme_Mode") -- Chargement du mode de l'alarme local Zone = fibaro:getGlobal("Alarme_Zone") -- Chargement des zones de l'alarme local Detecteurs = fibaro:getGlobal("Alarme_Detecteurs") -- Chargement des détecteurs local Exclus = fibaro:getGlobal("Alarme_Exclus") -- Chargement des détecteurs exclus --************************************ --* Fonction d'envoi de message PUSH * --************************************ function SendMessage(message) for i=1, #portables do fibaro:call(portables, "sendPush", message) end fibaro:debug(message.." [envoyé]") end --*************************************************************** --* Transforme une châine en tableau en utilisant un délimiteur * --*************************************************************** function split(text, sep) local sep, fields = sep or ":", {} local pattern = string.format("([^%s]+)", sep) text:gsub(pattern, function(c) fields[#fields+1] = c end) return fields end --********************************************* --* Fonction d'état des ILS / Test des portes * --********************************************* function Check(capteurs, capteurexclus) local stillopen = {} --variable local d'état d'ouverture capteurabsent = 1 --variable de détection d'aucun capteur à activer -> 1 = aucun capteur présent Etat = "Test des capteurs" --Initalisation de la variable état fibaro:setGlobal("Alarme_Etat", Etat) -- Mise à jour de l'état fibaro:call(67, "setProperty", "ui.EtatAlm.value", Etat) -- Actualisation du statut Etat dans le VD for i = 1, #capteurs do -- Boucle de test sur l'ensemble des capteurs fibaro:debug("Test du capteur :"..capteurs.." de type :"..fibaro:getValue(capteurs, "userDescription")) if (capteurs~=nil) and (capteurs~="Aucun" and fibaro:getValue(capteurs, "userDescription") == "ILS") then -- Test des capteurs du type ILS (ouverture) local id = tonumber(capteurs) local name = fibaro:getName(id) or "Inconnu" if string.match(capteurexclus, id) == nil or capteurexclus == "" then -- Ne lance le test que si le détecteur n'est pas exclu capteurabsent = 0 if (tonumber(fibaro:getValue(id, "value")) == 1) then table.insert(stillopen, id) fibaro:debug(name.." est ouvert") else fibaro:debug(name.." est fermé") end end elseif (capteurs~=nil) and (capteurs~="Aucun" and fibaro:getValue(capteurs, "userDescription") == "IR") then -- Test des capteurs du type IR (mouvement) local id = tonumber(capteurs) local name = fibaro:getName(id) or "Inconnu" if string.match(capteurexclus, id) == nil or capteurexclus == "" then -- Ne lance le test que si le détecteur n'est pas exclu capteurabsent = 0 if (tonumber(fibaro:getValue(id, "value")) == 1) then table.insert(stillopen, id) fibaro:debug(name.." mouvement détecté") else fibaro:debug(name.." est ok") end end else Etat = "Problème capteur" fibaro:debug(Etat..": L'id #"..i.." n'existe pas") end end if (stillopen and #stillopen > 0) then fibaro:debug("Gestion de l'avertissement détecteur en défaut") fibaro:debug("Des portes sont ouvertes") local msg = "Attention : " for i = 1, #stillopen do msg = msg .." ".. fibaro:getName(tonumber(stillopen)) end if (#stillopen == 1) then msg = msg.." est ouverte." else msg = msg.." sont ouvertes." end -- Actions si portes ouvertes SendMessage(msg) -- envoi du message en Push Etat = "Vérifiez les détecteurs" fibaro:debug(Etat) else fibaro:debug("Aucune porte n'est ouverte") if capteurabsent == 1 then Etat = "Aucun capteur sélectionné" end if (Etat ~= "Problème capteur" and Etat ~= "Aucun capteur sélectionné") then Etat = "Détecteurs Ok" end fibaro:debug(Etat) end fibaro:setGlobal("Alarme_Etat", Etat) -- Mise à jour de l'état fibaro:call(67, "setProperty", "ui.EtatAlm.value", Etat) -- Actualisation du statut Etat dans le VD end --***************************************************************************** --***************************************************************************** fibaro:debug(DeclencheurType["type"]) fibaro:debug(DeclencheurType["Name"]) fibaro:debug(Etat.."/"..Mode.."/"..Zone) --****************************************************** --* MASTER / Mise en route et Action sur déclenchement * --****************************************************** if DeclencheurType["type"] == "global" then -- GESTION DU CHANGEMENT DE MODE DE FONCTIONNEMENT fibaro:debug("Modification d'état utilisateur") if Etat == "Demande armement" and Zone ~= "" and Mode ~= "" and Detecteurs ~= "" then -- PROCEDURE D'ARMEMENT DE L'ALARME fibaro:debug("Procédure de mise en service") fibaro:debug("Verification des détecteurs") fibaro:debug("Detecteurs: "..Detecteurs) fibaro:debug("Sont exclus: "..Exclus) local capteurs = split(string.gsub(Detecteurs, "[%[%]]", ""), ",") local capteurexclus = Exclus Check(capteurs, capteurexclus) Etat = fibaro:getGlobal("Alarme_Etat") -- Récupère l'état suite au test des ouvrant if Etat == "Détecteurs Ok" and Zone ~= "" and Mode ~= "" then Etat = "Armée" else Etat = "Erreur armement: "..Etat end elseif Etat == "Demande désarmement" then -- PROCEDURE DE DESARMEMENT DE L'ALARME fibaro:debug("Procédure de désarmement de l'alarme") Etat = "Désarmée" end fibaro:setGlobal("Alarme_Etat", Etat) -- Mise à jour de l'état fibaro:call(67, "setProperty", "ui.EtatAlm.value", Etat) -- Actualisation du statut Etat dans le VD elseif DeclencheurType["type"] == "property" and Etat == "Armée" then -- GESTION DU MODE ALARME id_declencheur = tonumber(DeclencheurType["deviceID"]) -- Récupère l'id du déclencheur fibaro:debug("Id du déclencheur "..id_declencheur) fibaro:debug("Sont exclus :"..Exclus) fibaro:debug("Controle de déclenchement.") if string.match(Detecteurs, id_declencheur) ~= nil and (string.match(Exclus, id_declencheur) == nil or Exclus == "") then fibaro:debug("Alarme déclenchée") Etat = "Déclencheur "..id_declencheur -- Information sur l'état du déclencheur fibaro:call(67, "setProperty", "ui.EtatAlm.value", Etat) -- Actualise l'infomration dans le VD pour l'utilisateur fibaro:setGlobal("Alarme_Etat", Etat) -- Actualisation de l'état fibaro:debug("Notification d'alarme") -- Envoi de notification messAlarme = "Alarme déclenchée!" SendMessage(messAlarme) -- ********************************************* -- * ACTION A REALISER EN CAS D'ALARME * -- ********************************************* if Mode == "Complet" then -- Action à réaliser en mode Complet fibaro:debug("Lancement appel VoIP") local http = net.HTTPClient() http:request(xxxxxxxxxxxxxxxx) elseif Mode == "Silence" then -- Action à réaliser en mode Silence elseif Mode == "Interieur" then -- Action à réaliser en mode Interieur elseif Mode == "Exterieur" then -- Action à réaliser en mode Exterieur end else fibaro:debug("Capteur non présent dans l'activation ou exclu") end end Voilà, à mon avis c'est loin d'être parfait ou optimisé, mais pour le moment ceci à l'air de fonctionner. Je suis preneur de critique de spécialistes, d'améliorations etc... J'ai encore des idées pour faire évoluer tout ceci, mais le temps et le compétences me manquent parfois. A+ 3
robisette Posté(e) le 7 septembre 2019 Signaler Posté(e) le 7 septembre 2019 Bonjour, pouvez-vous rendre le VD complet disponible sur le forum? Merci Le 29/08/2019 à 18:15, Yorino a dit : Bonjour à tous, Je découvre petit à petit la HC2, ses différents périphériques et surtout le langage LUA. Clairement, je ne suis pas informaticien, j'ai des notions mais on en reste là. J'ai parcouru pas mal de page de ce forum, découvert des tas de "Tutos" relativement sympa et me suis rendu compte que certains membres sont quand même super calés en programmation ! Bref, modestement, je partage avec vous ma programmation LUA pour gérer une Alarme fait "Maison" à partir de la HC2. J'ai bien conscience que ce n'est absolument pas le rôle d'une box Domotique et que rien ne peut remplacer une "Vraie" alarme. (Sécurité des communications, Anti-piratage etc etc...). On va dire que c'est donc un petit "plus" que m'offre la box HC2, en attendant que je m'attaque vraiment à la "domotisation" de mon domicile. Rendons également les crédits à ma source d'inspiration,, "Moicphil" : J'ai récupéré une partie du code pour certaines fonctions et ce tuto m'a surtout permis de mettre le pied dans le langage LUA. Donc grand merci à lui pour son partage, mais également à tous les intervenants du topic car c'est très riche d'informations. Bon passons à mon modeste code : - Un module virtuel pour commander la mise en service, l'arrêt et la personnalisation de l'Alarme. - Une scène pour gérer l'activation, la vérification, la désactivation et les actions à réaliser en cas d'alarme. Création de variables : 6 au total. Alarme_Détecteurs : Permet de mettre les identifiants des détecteurs déclencheur de l'alarme Alarme_Exclus : Permet de mettre les identifiants des détecteurs exclus de l'alarme Alarme_Mode : Permet de stocker la mode actif Alarme_Zone : Permet de stocker la zone à tester Alarme_Etat : Permet de stocker l'information d'état de l'alarme Alarme_Scene : Permet de lancer la scène Alarme associée Pour le VD : Rien de bien nouveau, grande inspiration venant du tuto d'origine... Bonjour, pouvez-vous rendre le VD complet disponible sur le forum? Merci
Yorino Posté(e) le 18 septembre 2019 Auteur Signaler Posté(e) le 18 septembre 2019 Hello, Voici le VD complet. New_Alarme.vfib
Messages recommandés