Aller au contenu

Rechercher dans la communauté

Affichage des résultats pour les étiquettes 'LUA'.



Plus d’options de recherche

  • Rechercher par étiquettes

    Saisir les étiquettes en les séparant par une virgule.
  • Rechercher par auteur

Type du contenu


Forums

  • Bienvenue
    • Annonces et suggestions
    • Nouveau ? Présentez-vous
    • Le bistrot
    • Mon installation domotique
    • Autres Solutions Domotiques
  • La Home Center et ses périphériques
    • La Home Center pour les nuls
    • HC 3 , HC 2 & Lite
    • Modules Fibaro
    • Modules Z-wave
    • Périphériques et matériels autres
    • Plugins
    • Quick App
    • Alarme & Vidéo-surveillance
    • Multimédia
    • Chauffage et Energie
    • Actionneurs & Ouvrants (Portail, volets...)
    • Eclairage
    • Applications Smartphones et Tablettes
    • English Section
  • Les objets connectés
    • Les Assistants Vocaux
  • Les bonnes affaires
    • Sites internet
    • Petites annonces

Rechercher les résultats dans…

Rechercher les résultats qui…


Date de création

  • Début

    Fin


Dernière mise à jour

  • Début

    Fin


Filtrer par nombre de…

Inscription

  • Début

    Fin


Groupe


Jabber


Skype


Ville :


Intéret :


Version

43 résultats trouvés

  1. Krikroff

    Les variables dans un Quick App

    L'idée ici est partager nos retours d' expérience sur l'utilisation des variables dans les Quick App. Nous connaissons tous pour la plupart l'existence des variables globales mais le HC3 dans les Quick App apporte une nouvelle notion de variable au niveau du QA. Cela va considérablement simplifier la vie du développeur et du l'utilisateur au quotidien. L'utilisation est très simple et repose sur 2 méthodes: La création ou la mise à jour d'une variable existante : self:setVariable("NOM_DE_LA_VARIABLE", "VALEUR_DE_LA_VARIABLE") > le set se charge de créer la variable si elle n'existe pas, bien joué Fibaro La lecture de la valeur d'une variable : self:getVariable("NOM_DE_LA_VARIABLE") Avouons le c'est difficile de faire plus simple Les variables ainsi ajoutées sont visibles depuis l'onglet "Variables" au niveau du périphérique, comme ceci: Ou bien encore en interrogeant l' API via le SWAGGER intégré au Home Center ...
  2. Krikroff

    QA FGIC-00X - Motion sensor

    L'idée de ce Quick App est de représenter sur la forme d'un module du type "binary sensor" l'état du détecteur de mouvement intégré à l' Intercom Fibaro C'est ultra basique, mais cela illustre de manière extrêmement simple comment un Quick App va permettre de donner de la visibilité à des valeurs, données, états etc. masqués et ceci sans grand effort, pour une fois ! Les méthodes du Quick App sont appleées via un fibaro.call depuis des scènes: https://www.domotique-fibaro.fr/topic/14116-utiliser-le-détecteur-de-proximité-de-lintercom-fibaro-dans-une-scène/ https://www.domotique-fibaro.fr/topic/14115-détection-du-tamper-de-lintercom-fibaro-dans-une-scène/ Le code à reporter dans l'éditeur LUA du QA est le suivant: -- Quick APP -- Name: QA FGIC-00X - Motion sensor -- Description: Fibaro Intercom motion sensor -- Type: Binary sensor function QuickApp:onInit() self:debug("onInit") end function QuickApp:breached(value) self:updateProperty("value", toboolean(value)) self:updateProperty("lastBreached", os.time()) end function QuickApp:tamper(tripped) if toboolean(tripped) then self:updateProperty("logTemp", "tamper tripped") end end function QuickApp:dead(value, reason) self:updateProperty("dead", toboolean(value)) self:updateProperty("deadReason", tostring(reason or "")) end do function toboolean(value) if (type(value) == "number") then return (value~=0) end return (not not value) end end Rien de sorcier Ensuite il faut extrapoler: Les méthodes pourraient également être appelées depuis une box externe au HC via des requêtes Les états pourraient être modifiés directement par le QA lui même à l'aide d'un code qui irait interroger des systèmes diverses (API d'un service en ligne, API d'un objet connecté etc.) Bref le champ des possibles est relativement vaste. Tout ceci est réalisé un petit peu à l'aveugle mais j'essaierai dans la mesure du possible de vous proposer des choses de plus en plus complexes
  3. DECLARATIONS (Conditions/Triggers) { operator = "any", conditions = { -- firstRelayIsOpen { id = 000, isTrigger = true, operator = "==", property = "firstRelayIsOpen", type = "device", value = true }, { id = 000, isTrigger = true, operator = "!=", property = "firstRelayIsOpen", type = "device", value = true }, -- secondRelayIsOpen { id = 000, isTrigger = true, operator = "==", property = "secondRelayIsOpen", type = "device", value = true }, { id = 000, isTrigger = true, operator = "!=", property = "secondRelayIsOpen", type = "device", value = true } } } ACTIONS -- firstRelayIsOpen -- secondRelayIsOpen local trigger = sourceTrigger print("property:"..trigger.property) print("id:"..trigger.id) print("type:"..trigger.type) print("value:"..tostring(trigger.value))
  4. DECLARATIONS (Conditions/Triggers) { operator = "any", conditions = { -- input1 { id = 000, isTrigger = true, operator = "==", property = "input1", type = "device", value = true }, { id = 000, isTrigger = true, operator = "!=", property = "input1", type = "device", value = true }, -- input2 { id = 000, isTrigger = true, operator = "==", property = "input2", type = "device", value = true }, { id = 000, isTrigger = true, operator = "!=", property = "input2", type = "device", value = true } } } ACTIONS -- input1 -- input2 local trigger = sourceTrigger print("property:"..trigger.property) print("id:"..trigger.id) print("type:"..trigger.type) print("value:"..tostring(trigger.value))
  5. DECLARATIONS (Conditions/Triggers) { operator = "any", conditions = { -- buttonOneIsPressed { id = 000, isTrigger = true, operator = "==", property = "buttonOneIsPressed", type = "device", value = true }, { id = 000, isTrigger = true, operator = "!=", property = "buttonOneIsPressed", type = "device", value = true }, -- buttonTwoIsPressed { id = 000, isTrigger = true, operator = "==", property = "buttonTwoIsPressed", type = "device", value = true }, { id = 000, isTrigger = true, operator = "!=", property = "buttonTwoIsPressed", type = "device", value = true }, -- buttonThreeIsPressed { id = 000, isTrigger = true, operator = "==", property = "buttonThreeIsPressed", type = "device", value = true }, { id = 000, isTrigger = true, operator = "!=", property = "buttonThreeIsPressed", type = "device", value = true } } } ACTIONS -- buttonOneIsPressed -- buttonTwoIsPressed -- buttonThreeIsPressed local trigger = sourceTrigger print("property:"..trigger.property) print("id:"..trigger.id) print("type:"..trigger.type) print("value:"..tostring(trigger.value))
  6. DECLARATIONS (Conditions/Triggers) { operator = "any", conditions = { { id = 000, isTrigger = true, operator = "==", property = "proxymityStateChanged", type = "device", value = true }, { id = 000, isTrigger = true, operator = "!=", property = "proxymityStateChanged", type = "device", value = true } } } ACTIONS local trigger = sourceTrigger print("property:"..trigger.property) print("id:"..trigger.id) print("type:"..trigger.type) print("value:"..tostring(trigger.value)) Et pourquoi pas l'utilisation d'un quick app de type binary sensor en complément fibaro.call(0000,"breached", trigger.value)
  7. DECLARATIONS (Conditions/Triggers) { operator = "any", conditions = { -- tamper { id = 000, isTrigger = true, operator = "==", property = "tamper", type = "device", value = true }, { id = 000, isTrigger = true, operator = "!=", property = "tamper", type = "device", value = true } } } ACTIONS local trigger = sourceTrigger print("property:"..trigger.property) print("id:"..trigger.id) print("type:"..trigger.type) print("value:"..tostring(trigger.value))
  8. Voici un Scène qui va vous permettre de savoir si on est le jour ou la nuit et d'avoir un décalage en minute par rapport ou jour ou a la nuit IL va nous falloir pour cette scène 2 variables globales et 1 variable globale prédéfinie Jour_Nuit (Variable prédéfinie avec comme valeur Jour ou Nuit. elle aura 2 déclenchements) SoleilLever (cette variable recevra les valeurs de la table TLever elle aura donc autant de déclenchement que de valeur dans la table TLever) SoleilCoucher (Cette variable recevra les valeurs de la table TCoucher, elle aura donc autant de déclenchement que de valeur dans la table TCoucher) Ces variables seront créées automatiquement si vous êtes en V4. Vous pouvez donnez un autre nom a chaque variable globales que les valeurs par défaut. -- Nom des Variables Globales local VGJourNuit = "Jour_Nuit" local VGLeverSoleil = "SoleilLever" local VGCoucherSoleil = "SoleilCoucher" -- Minutes de décalages par rapport au lever du soleil local TLever = {-60, -15, 30, 60, 50, 124} -- Minutes de décalages par rapport au Coucher du soleil local TCoucher = {-5, 30, 0, -30} -- Id du téléphone local IdTel = 181 Pour notre ami JoJo ainsi qu'a tout ceux qui sont en V3.60 il faudra crées les variables manuellement et désactivé ces trois lignes VerifVG(VGJourNuit, "Jour", {"Jour", "Nuit"}) VerifVG(VGLeverSoleil, 0) VerifVG(VGCoucherSoleil, 0) ----------------------------- Il faut renseigner IdTel avec l'id de votre téléphone cela va servir a vous envoyez une notification lorsque la box démarre ou lorsqu il y a modification de la scène. Une notification est aussi possible si il y a un probléme de variable globale. Le programme est optimisez pour que le sleep passe automatiquement de 1 mn à 30 mn en fonction des valeurs des tables coucher et lever Exemple d'utilisation : Scène bloc : Scène LUA je veux un déclenchement de scène (Il n'y a aucun ordre a respecter) 45 minutes avant le lever = -45 15 minutes avant le lever = -15 23 minutes apres le lever = 20 1h20 minutes apres le lever = 80 0 minutes = Jour dans la tables TLever il est donc inutile de mettre 0, il sera ajouter automatiquement a la table Je renseigne donc ma table TLever comme ceci local TLever = {-45, 20, 80, -15} Je fais de même avec la table TCoucher local TCoucher = {-5, 30, -30} Récupération des triggers dans une scène Utilisation de la variables globales Jour_Nuit comme trigger --[[ %% globals Jour_Nuit --]] local JourNuit = fibaro:getGlobalValue("Jour_Nuit") if JourNuit == "Jour" then fibaro:debug("Il fait "..JourNuit) end if JourNuit == "Nuit" then fibaro:debug("Il fait "..JourNuit) end Utilisation de ou des variables globales SoleilLever et SoleilCoucher comme trigger --[[ %% globals SoleilLever SoleilCoucher --]] local trigger = fibaro:getSourceTrigger() if (trigger['type'] == 'global') then LeverCoucher = trigger['name'] valeur = tonumber(fibaro:getGlobalValue(LeverCoucher)) print(nom, valeur) end -- le code dans ce test sera déclencher 15 mn aprés le coucher if LeverCoucher == "SoleilCoucher" and valeur == 15 then fibaro:call(7, "close") --Fermeture volet 15 mn après le coucher end -- le code dans ce test sera déclancher 30 mn avant le coucher if nom == "SoleilLever" and valeur == -30 then fibaro:call(7, "close") --Fermeture volet 30 mn avant le lever du soleil end Merci a STEVEN pour m'avoir aider a optimisez ce code Voici le code a copier dans une scène Version 3.00b --[[ %% autostart --]] -- Nom des Variables Globales local VGJourNuit = "Jour_Nuit" local VGLeverSoleil = "SoleilLever" local VGCoucherSoleil = "SoleilCoucher" -- Minutes de décalages par rapport au lever du soleil local TLever = {-60, -15, 30, 60, 50, 124} -- Minutes de décalages par rapport au Coucher du soleil local TCoucher = {-5, 30, 0, -30} -- Id du téléphone local IdTel = 181 --************ Ne rien modifier en dessous de cette ligne ************ ---------------------------------------------------------------------- -- Envoi d'un Push pour avertir que le box à démarrer ou redémarrer -- ---------------------------------------------------------------------- function EnvoiPush(Message) fibaro:debug(Message) fibaro:call(IdTel, "sendPush", Message) end -- ----------------------------------------------------------------- -- Vérification Variable Globale et création si besoin -- -- ----------------------------------------------------------------- function VerifVG(nom, valeur, choix) if (fibaro:getGlobalValue(nom) == nil) then local enum = 0 if (type(choix) ~= "nil") then enum = 1 end api.post("/globalVariables", {name=nom, isEnum=enum}) if enum == 1 then local variable = {} variable.value = tostring(valeur) variable.isEnum = false if (type(choix) ~= "nil") then variable.isEnum = true variable.enumValues = choix end api.put("/globalVariables/" .. nom, variable) end end end ---------------------------------------------------------------------- -- Mise a jour d'une variable global -- ---------------------------------------------------------------------- function UpdateVG(NomVG, Valeurs) if (fibaro:getGlobalValue(NomVG) == nil) then fibaro:debug("il faut cree la variable "..NomVG) EnvoiPush(string.format("La variable Globale %s n'existe pas ou a ete supprimer", NomVG)) fibaro:abort() -- fin du programme end fibaro:debug("Mise a jour de la Variable Globale : "..NomVG.." = "..Valeurs) fibaro:setGlobal(NomVG, Valeurs); end ---------------------------------------------------------------------- -- Vérification de l'heure et mise à jour -- -- de la variable si nécessaire -- ---------------------------------------------------------------------- function UpdateJourNuit(NomVG, heure) local valeurs = "Nuit" -- test si on est le jour ou la nuit if (heure >= leverSoleil) and (heure < coucherSoleil) then valeurs = "Jour" end fibaro:debug(string.format("Lever Soleil : %s - Coucher Soleil : %s", leverSoleil, coucherSoleil)) UpdateVG(NomVG, valeurs) -- mise a jour de la VG Jour_Nuit end ---------------------------------------------------------------------- -- Compare les tables Lever et coucher du soleil -- -- avec sunrisehour et sunsethour -- ---------------------------------------------------------------------- function LeverCoucher(NomVG, TableNom, SunRiseSet, JourNuit) for index, v in ipairs(TableNom) do if (os.date("%H:%M", os.time()+v*-60)) == SunRiseSet then UpdateVG(NomVG, v) if v == 0 then fibaro:debug("il fait : "..JourNuit) UpdateVG(VGJourNuit, JourNuit) end end end end ---------------------------------------------------------------------- -- Conversion Date format texte en format Date -- ---------------------------------------------------------------------- function ConvertionDate(NomDate) -- on extrait l'heure et minute (%d+) est un digit local heure, minute = string.match(NomDate, "(%d+):(%d+)") -- On récupère l'heure et date actuelle sous forme de tableau local TableDate = os.date("*t") -- On modifie l'heure et les minutes TableDate.hour = heure TableDate.min = minute -- Nous pouvons maintenant exploiter "MonHeure" comme une vrai date local MonHeure = os.time(TableDate) return (MonHeure) end ---------------------------------------------------------------------------- -- Calcul la valeur du Sleep en fonction des Max et Mini -- -- des Tables Lever et Coucher -- ---------------------------------------------------------------------------- function calculPause(j, heure, minilever, maxilever, minicoucher, maxicoucher) fibaro:debug("Heure Actuelle : "..heure) -- mini et max lever local heurelever = ConvertionDate(leverSoleil) local heureleverMini = (os.date("%X", heurelever+(minilever*60))) local heureleverMaxi = (os.date("%X", heurelever+(maxilever*60))) fibaro:debug("heure Lever Soleil Mini : "..heureleverMini.." - Maxi : "..heureleverMaxi) -- mini et max coucher local heurecoucher = ConvertionDate(coucherSoleil) local heurecoucherMini = (os.date("%X", heurecoucher+(minicoucher*60))) local heurecoucherMaxi = (os.date("%X", heurecoucher+(maxicoucher*60))) fibaro:debug("heure Coucher Soleil Mini : "..heurecoucherMini.." - Maxi : "..heurecoucherMaxi) if heure >= heureleverMini and heure < heureleverMaxi or heure >= heurecoucherMini and heure < heurecoucherMaxi then j=1 end return (j) end -- =================================================================== -- == Nous avons fini la préparation de notre code == -- == Nous pouvons Exécuter le programme == -- == Script réaliser par MPRINFO Version 3.00B == -- == Grand Merci à STEVEN pour son aide == -- =================================================================== ---------------------------------------------------------------------- -- Envoi d'un Push pour donner la date et l'heure de démarrage -- ---------------------------------------------------------------------- EnvoiPush(string.format("La box a démarré le %s a %s", os.date("%d/%m/%Y"), os.date("%R"))) ---------------------------------------------------------------------- -- Contrôle si 1 Scène et déjà en cours -- ---------------------------------------------------------------------- local NbreScene = fibaro:countScenes() if NbreScene ~= 1 then; fibaro:debug("Il y a déjà une instance en cours... ") fibaro:abort(); end ---------------------------------------------------------------------- -- Vérification si les variables globales existe -- -- et Création ou Modification si Besoin -- ---------------------------------------------------------------------- VerifVG(VGJourNuit, "Jour", {"Jour", "Nuit"}) VerifVG(VGLeverSoleil, 0) VerifVG(VGCoucherSoleil, 0) ---------------------------------------------------------------------- -- Mise a jour de la variable VG Jour_Nuit au Démarrage de la Box -- -- Ou lors de la sauvegarde de la scène -- ---------------------------------------------------------------------- leverSoleil = fibaro:getValue(1, "sunriseHour") coucherSoleil = fibaro:getValue(1, "sunsetHour") UpdateJourNuit(VGJourNuit, os.date("%H:%M", os.time())) --------------------------------------------------------------------- -- Trie des Tables et récupération des valeurs min et maximum -- --------------------------------------------------------------------- -- Traitement de la Table TLever table.insert(TLever, 1, 0) -- ajout de 0 mn dans la table table.sort(TLever) local MiniLever = ((TLever[1]-30)) local MaxiLever = ((TLever[#TLever]+1)) -- Traitement de la Table TChoucher table.insert(TCoucher, 1, 0) -- ajout de 0 mn dans la table table.sort(TCoucher) local MiniCoucher = ((TCoucher[1]-30)) local MaxiCoucher = ((TCoucher[#TCoucher]+1)) --------------------------------------------------------------------- -- Test toute les minutes pour savoir si c'est jour ou nuit -- --------------------------------------------------------------------- while true do local j = 30 local osHeure = os.date("%H:%M", os.time()) leverSoleil = fibaro:getValue(1, "sunriseHour") coucherSoleil = fibaro:getValue(1, "sunsetHour") LeverCoucher(VGLeverSoleil, TLever, leverSoleil, "Jour") LeverCoucher(VGCoucherSoleil, TCoucher, coucherSoleil, "Nuit") j = calculPause(j, osHeure, MiniLever, MaxiLever, MiniCoucher, MaxiCoucher) fibaro:debug(string.format("Valeur du Sleep %s mn",j)) fibaro:sleep(j*60*1000); -- Pause en fonction de la valeur de J end A ceux qui vont utiliser cette scène, Merci de me faire un retour sur ce code...
  9. Présentation : Cette Scène va permettre d'actionner vos volets :au lever et coucher du soleil avec un décalage en minutes possible Les jours fériés A heure fixe Prérequis : Il va falloir installer les scènes et Virtual device suivant :VD Jour Chômé ICI Scene Lua - Jour / Nuit Avec Décalge Possible Et Optimisation Du Sleep ICI Scene Lua - Trigger Horaire Sans Boucle While ... Do ICI Configuration : Saisir le nom de ces volets et leurs ID local mesvolets ={ ["Bureau"] = 5, ["Ch_Amis"] = 7, ["Chaufferie"] = 9, ["Ch_Parents"] = 17, ["Ch_Enfants"] = 19, ["Cuisine"] = 23, ["SAM"] = 25, ["SdB"] = 27, ["Salon"] = 29, } Créer des groupes de volets (Ce n'est pas obligatoire) local RDC = {"Bureau", "Ch_Amis", "Chaufferie"} local Rue = {"Bureau", "Cuisine", "SAM"} local Jardin = {"Chaufferie", "Ch_Amis", "SdB"} local Chambre = {"Ch_Parents", "Ch_Enfants"} Saisir le Nom des différents Variables globales --[[ %% globals SoleilLever SoleilCoucher Heure --]] local nomLever = "SoleilLever" --> Nom de la Variable Globale lever soleil local nomCoucher = "SoleilCoucher" --> Nom de la Variable Globale coucher soleil local Heure = "Heure" --> Nom de la variable globale Heure local JourChome = fibaro:getGlobalValue("JourChome") --> Nom de la variable Module Virtuel Hansloo local IdTel = fibaro:getGlobalValue("IdTel") -- Recuperation de id du tel pour le push Saisir le temps de pause entre chaque volets (Seulement si on utilise des groupes de volets) -------------------------------------------------------------------------- local Pause = 0 -- Temp de pause entre chaque commande de modules en seconde Copier la scène suivante version 1.00b --[[ %% globals SoleilLever SoleilCoucher Heure --]] local mesvolets ={ ["Bureau"] = 5, ["Ch_Amis"] = 7, ["Chaufferie"] = 9, ["Ch_Enfants"] = 17, ["Ch_Parents"] = 19, ["Cuisine"] = 23, ["SAM"] = 25, ["SdB"] = 27, ["Salon"] = 29, } -- Table Zone (Groupes de modules) local RDC = {"Bureau", "Ch_Amis", "Chaufferie"} local Rue = {"Bureau", "Cuisine", "SAM"} local Jardin = {"Chaufferie", "Ch_Amis", "SdB"} local Chambre = {"Ch_Parents", "Ch_Enfants"} -------------------------------------------------------------------------- local nomLever = "SoleilLever" --> Nom de la Variable Globale lever soleil local nomCoucher = "SoleilCoucher" --> Nom de la Variable Globale coucher soleil local Heure = "Heure" --> Nom de la variable globale Heure local JourChome = fibaro:getGlobalValue("JourChome") --> Nom de la variable Module Virtuel Hansloo local IdTel = fibaro:getGlobalValue("IdTel") -- Recuperation de id du tel pour le push -------------------------------------------------------------------------- local Pause = 0 -- Temp de pause entre chaque commande de modules en seconde ---------------------------------------------------------------------- -- Envoi d'un Push pour avertir que le box à démarrer ou redémarrer -- ---------------------------------------------------------------------- function EnvoiPush(Message) fibaro:debug("Envoi Push : "..Message) fibaro:call(IdTel, "sendPush", Message) end ----------------------------------------------------------------------- -- Test si la valeur a enoyer est différente de la valeur du module ----------------------------------------------------------------------- function testvaleur(id, valeurs) local GetValeur = tonumber(fibaro:getValue(id, "value")) if valeurs ~= GetValeur then fibaro:call(id, "setValue", valeurs) --fibaro:debug(id.." - action en cours... - Valeur "..valeurs) fibaro:sleep(Pause*1000) end end ---------------------------------------------------------------------------- -- Recupération de l'id par rapport au nom de la tables mesvolets ---------------------------------------------------------------------------- function volets(zone, valeurs) if (type(zone) == "table") then local messages = "Les "..#zone.." Volets : " for i,v in ipairs(zone) do messages = (messages..v..", ") local id = mesvolets[v] if id == nil then fibaro:debug("ERREUR NOM DU VOLET - "..v.." - dans une table") EnvoiPush("ERREUR NOM DU VOLET - "..v.." - dans une table") else testvaleur(id, valeurs) end end messages = (messages.."ont été actionnés à "..valeurs.."%") EnvoiPush(messages) elseif (type(zone) == "string") then local id = mesvolets[zone] if id == nil then fibaro:debug("ERREUR DANS LE NOM DU VOLET : "..zone) EnvoiPush("EERREUR DANS LE NOM DU VOLET : "..zone) else testvaleur(id, valeurs) EnvoiPush("Le volet : "..zone.." a été actionné à "..valeurs.."%") end else fibaro:debug("Erreur......") EnvoiPush("Erreur......") end end -------------------------------------------------------------------- -- test si le déclencheur est lever ou coucher du soleil -------------------------------------------------------------------- function Test(zone, valeurs, minutes) if zone ~= nil then if minutes == nil then; minutes = 0 end volets(zone, valeurs) else fibaro:debug("Erreur dans la table ou table inéxitante") EnvoiPush("Erreur dans la table ou table inéxitante") end end -------------------------------------------------------------------- -- test Lever -------------------------------------------------------------------- function lever(zone, valeurs, minutes, Jchome) if nomTrigger == nomLever and valeurTrigger == minutes then if Jchome == JourChome or Jchome == nil then Test(zone, valeurs, minutes) end end end -------------------------------------------------------------------- -- test Coucher -------------------------------------------------------------------- function coucher(zone, valeurs, minutes, Jchome) if nomTrigger == nomCoucher and valeurTrigger == minutes then if Jchome == JourChome or Jchome == nil then Test(zone, valeurs, minutes) end end end -------------------------------------------------------------------- -- test Heure -------------------------------------------------------------------- function heure(zone, valeurs, minutes, Jchome) if nomTrigger == Heure and valeurTrigger == minutes then if Jchome == JourChome or Jchome == nil then Test(zone, valeurs, minutes) end end end -------------------------------------------------------------------------- -- Demarrage du programme -------------------------------------------------------------------------- local trigger = fibaro:getSourceTrigger() if (trigger['type'] == 'global') then nomTrigger = trigger['name'] valeurTrigger = tonumber(fibaro:getGlobalValue(nomTrigger)) print("Nom du déclencheur = ", nomTrigger, " - Minutes : ", valeurTrigger) else fibaro:debug("La scéne ne peut être lancer que par une Variable Globale") fibaro:abort(); --nomTrigger = "Heure" --valeurTrigger = 6 end ------------------------------------------------------------------------- -- Ne rien modifier au dessus de cette ligne ------------------------------------------------------------------------- -- Commandes a écrit pour lever du soleil -- lever (Funtion qui traite le lever du soleil -- coucher(zone, valeur, minutes) -- exemple pour actionné les volets de la table Rue a 80% 10 minutes avant le lever -- lever(Rue, 80, -10) -- exemple pour actionné le volet "Bureau" au lever du jour -- lever("Bureau", 99, 0) -- Pour actionner un volet au coucher du soleil -- Il faut remplacer lever par coucher -- ex : coucher(Rue, 0, 20) ------------------------------------------------------------------------ -- Vous pouvez entrer vos commande en dessous de cette ligne Utilisation : lever ou coucher("Nom du volet" ou Nom du groupes de volets, valeur a envoyer, le décalage par rapport au lever ou coucher) Exemples : lever("Ch_Enfants", 99, -15) -- ouvre le volets 15 minutes avant le lever du soleil lever("Salon", 99) ou lever("Salon", 99, 0) -- ouvre le volets au lever du soleil (le 0 n'est pas obligatoire) coucher(Rue, 0, 0, "NON") -- Ferme les volets du groupe Rue au coucher du soleil si Jour Non férié coucher(Jardin, 0, 30) -- Ferme les volets du groupe jardin 30 mn après le coucher du soleil (Attention le 3° paramètre qui représente les minutes doit se trouver dans la table de la scène jour nuit, dans ces 2 tables vous pouvez mettre autant de valeurs que vous voulez chaque valeur représentera un déclencheur) -- Minutes de décalages par rapport au lever du soleil local TLever = {-30, -15, 10, 20, 30, 45, 60} -- Minutes de décalages par rapport au Coucher du soleil local TCoucher = {-30, -15, 10, 20, 30, 45} Pour l'utilisation de l'heure je n'ai prévu qu'un déclenchement avec la variable globale heure, on ne pourra donc exécuter une commande qu'a heure fixe (1h, 2h, 3h, 4h, 5h etc....) Exemples : heure("Ch_Parents", 99, 6, "NON") -- Ouverture du volets Ch_Parents a 6h00 si jour non férié heure(Nord, 0, 20) -- Fermeture du groupes de volets Nord à 20h00
  10. jjacques68

    Exemple gestion des volets tout simple

    Alors voici un exemple tout simple de gestion des volets : principe : ouverture le matin 15 min avant le levé de soleil fermeture le soir 15 min après le couché de soleil subtilité avec un volet : qui se ferme que si je suis absent et que la porte est fermée. Voici les Trigger : { operator = "any", conditions = { {type = "date", property = "sunrise", operator = "==", value = -15, isTrigger = true}, {type = "date", property = "sunset", operator = "==", value = 15, isTrigger = true} } } et voici la scène : fibaro.debug("Volets", "start Scene") local Trigger = sourceTrigger local Tel = tonumber(fibaro.getGlobalVariable("MonPhone")) local Message = "" local ListeDevice = api.get("/devices/") local IDVoletSalon = 38 ---------------------- --SUNSET ---------------------- if Trigger.property == "sunset" then fibaro.debug("Volets", "Sunset Trigger") Message = "Fermeture des volets" for i = 1, #ListeDevice do if ListeDevice[i].properties.categories then if ListeDevice[i].properties.categories[1] == "blinds" then --Volet du salon : le fermer que si absent et porte fermée if ListeDevice[i].id == IDVoletSalon then if fibaro.getGlobalVariable("Present") == "0" and fibaro.getValue(36, "value") == false then fibaro.call(38, "close") end else fibaro.call(ListeDevice[i].id, "close") end end end end end ---------------------- --SUNRISE ---------------------- if Trigger.property == "sunrise" then fibaro.debug("Volets", "Sunrise Trigger") Message = "Ouverture des volets" for i = 1, #ListeDevice do if ListeDevice[i].properties.categories then if ListeDevice[i].properties.categories[1] == "blinds" then fibaro.call(ListeDevice[i].id, "open") end end end end fibaro.alert("push", {Tel}, Message) et marche nickel
  11. jjacques68

    fibaro.debug()

    Petite question : à quoi sert le "tag" quand on utilise la fonction debug ? d'après l'aide : on pourrait filtrer les messages dans le debug ! mais où et comment ?? Visiblement on a une seule et unique fenêtre de debug pour les scènes. Donc tous les messages s’enchaînent, et ça devient très vite incomprehensible... Je fait attention à bien saisir un "tag" lors de l'appel de cette fonction, mais je vois pas où ça intervient... ???
  12. Krikroff

    LUA dans les scènes sur HC3

    La documentation officielle est consultable sur https://manuals.fibaro.com/home-center-3-lua-scenes/
  13. jjacques68

    getSourceTrigger

    Hello tout le mode ! On a visiblement plus le getSourceTrigger dans la HC3 du coup pour une scène qui a comme trigger ce genre de chose : { operator = "any", conditions = { { type = "device", id = 10, property = "value", operator = "==", value = true, isTrigger = true }, { type = "device", id = 12, property = "value", operator = "==", value = true, isTrigger = true } } } et qu’on cherche à savoir qui à déclenché la scène ? comment fait-on ? merciiiii !
  14. jjacques68

    Conditions/Triggers

    Encore moi désolé j'ai tendance à bombarder le forum de questions, mais je vous promets que je cherche des réponses avant de poster Alors on en avait un peu discuté avec @Lazer je crois, mais je me rends compte que les Trigger dans les scènes semblent être plus compliqués... Je m'explique : Je veux qu'une scène soit triggée lorsque qu'un Wall Plug (pour cette exemple) change d'état. Et bien je suis obligé de mettre 2 lignes de conditions, une pour tester le "True" et pour le "False". { operator = "any", conditions = { {type = "device", id = 34, property = "value", operator = "==", value = true, isTrigger = true}, {type = "device", id = 34, property = "value", operator = "==", value = false, isTrigger = true} } } Je pensais qu'il était possible, par exemple, d'en avoir qu'une : { operator = "any", conditions = { {type = "device", id = 34, property = "value", operator = "!=", value = 2, isTrigger = true}, } } Mais visiblement, il n'accepte (pour ce type de module) que le "True" et "False" comme "value". Alors imaginons maintenant que cette scène doit être triggée par tout tout tout plein de device ! La liste des conditions va exploser, minimum le double que ce qu'on faisait sur la HC2 !! c'est un peu bof comme méthode non ? où je me trompe complètement !
  15. Gestion simple des Variables Globale en LUA Le script que je partage avec vous va vous permettre de gérer simplement les Variables globales et Variables globales prédéfinie en LUA. C'est une adaptation du code de STEVEN Avantage : Il permet de faire une sauvegarde des Variables globales ce qui est bien pratique lorsque l'on fait un recovery Il permet de créé des variables globales prédéfinie ou pas très simplement à partir d'une scène ou d'un VD sans avoir à sortir artillerie lourde. Voici le code a mettre dans une Scéne : --[[ %% properties %% globals GestionVG --]] local trigger = fibaro:getSourceTrigger() local variables = {} local variablesASupprimer ={} -- creation de ou des VG avec la variable GestionVG if (trigger['type'] == 'global') then fibaro:debug('Global variable source = ' .. trigger['name']) variables = json.decode((fibaro:getGlobal('GestionVG'))); if variables == nil then fibaro:abort() end -- creation de ou des VG manuellement ou par une autre scène ou un appel API elseif (trigger['type'] == 'other') then fibaro:debug('Global variable source = ' .. 'Other source.') variables = { {nom = "GestionVG", valeur = ""}, -- Gestion de VG -- Ex : Variable Globale predefini avec valeur1 pour valeur par default {nom = "Test1", valeur = "Valeur1", choix = {"Valeur2", "Valeur3"}}, -- Ex : Variable Globale qui à pour valeur 0 {nom = "Test2", valeur = "0"}, } variablesASupprimer = { {nom = "Test1"}, {nom = "Test2"} } end ------------------------------------------------- ---- Merci a STEVEN pour ce code -- ----------------------------------------------- -- Supprime une variable -- ----------------------------------------------- function supprimer(nom) local http = net.HTTPClient() http:request("http://127.0.0.1:11111/api/globalVariables/"..nom, { options = { method = 'DELETE' } , success = function(response) fibaro:debug(nom .. " supprimée avec succès") end, error = function(response) fibaro:debug(nom .. " ERROR !!!") end, }) end -- ----------------------------------------------- -- Modifie une variable -- ----------------------------------------------- function modifier(nom, valeur, choix) local variable = {} variable.value = valeur variable.isEnum = false if (type(choix) ~= "nil") then variable.isEnum = true table.insert(choix, 1, valeur) variable.enumValues = choix end local http = net.HTTPClient() http:request("http://127.0.0.1:11111/api/globalVariables/"..nom, { options = { method = 'PUT', data = json.encode(variable) }, success = function(response) fibaro:debug(nom .. " modifiée avec succès") end, error = function(response) fibaro:debug(nom .. " ERROR !!!") end, }) end -- ----------------------------------------------- -- Ajoute une variable -- ----------------------------------------------- function ajouter(nom, valeur, choix) local enum = 0 if (type(choix) ~= "nil") then enum = 1 end local http = net.HTTPClient() http:request("http://127.0.0.1:11111/api/globalVariables", { options = { method = "POST", data = json.encode({name=nom, isEnum=enum}) }, success = function(response) fibaro:debug(nom .. " créé avec succès") modifier(nom, valeur, choix) end, error = function(response) fibaro:debug(nom .. " ERROR !!!") end, }) end -- ----------------------------------------------- -- Voir si une variable existe ou non -- et la modifier ou créer -- ----------------------------------------------- function traiter(nom, valeur, choix) if (fibaro:getGlobalValue(nom) == nil) then ajouter(nom, valeur, choix) else -- modifier(nom, valeur, choix) end end ---------------------------------------------------- -- Execution du programme ---------------------------------------------------- for _,v in ipairs(variables) do traiter(v.nom, v.valeur, v.choix) end for _,v in ipairs(variablesASupprimer) do supprimer(v.nom) end Dans un premier temps il va falloir exécuter le script manuellement afin qu'il crée la VG GestionVG cette VG va être utiliser pour crée les variables globale à partir de n'importe quel script Lua Exemple d'utilisation : Création d'une variables globales "Test2" avec la valeur 0 local variables = { {nom = "Test2", valeur = "0"}, } fibaro:setGlobal('GestionVG',json.encode(variables)) Création d'une variables globales prédéfinie "Test1" avec Valeur1 , Valeur2 et Valeur3, vValeur1 sera la valeur par défaut dans cette exemple local variables = { {nom = "Test1", valeur = "Valeur1", choix = {"Valeur2", "Valeur3"}}, } fibaro:setGlobal('GestionVG',json.encode(variables)) Création de plusieurs variable globales prédéfinie ou pas en une seul fois local variables = { {nom = "Test1", valeur = "Valeur1", choix = {"Valeur2", "Valeur3"}}, {nom = "Test2", valeur = "0"}, } fibaro:setGlobal('GestionVG',json.encode(variables)) Création et suppression de variables via la scéne il faut modifier le code suivant, la méthode est la même que les exemples si dessus. Lors de l'exécution de la scene en mode manuel les variables seront créés si elle n'existe pas. elseif (trigger['type'] == 'other') then fibaro:debug('Global variable source = ' .. 'Other source.') variables = { {nom = "GestionVG", valeur = ""}, -- Gestion de VG -- Ex : Variable Globale predefini avec valeur1 pour valeur par default {nom = "Test1", valeur = "Valeur1", choix = {"Valeur2", "Valeur3"}}, -- Ex : Variable Globale qui à pour valeur 0 {nom = "Test2", valeur = "0"}, } variablesASupprimer = { {nom = "Test1"}, {nom = "Test2"}, } Ce code est fonctionnel chez moi, par manque de temps je ne pourrais vous aidez si vous avez des soucis de compréhension sur la création des VG ou leurs suppression
  16. Gestionnaire d'Evénements Automatique (GEA) – version 6.11 Version précédente (BROUILLON en cours de rédaction) Remerciements (commençons par le plus important) : @pepite et @tibahut pour leurs contributions, motivation, idées, ... Nos pauvres bêta testeurs : @ADN182, @Puni, @basklj, @sonnyboy, @Gandalf, @drboss (et tout ceux que j'oublie ... désolé) @fredokl pour son don qui me permettra d’offrir de la bonne bière à pepite (je le promet) But : Ce script a pour but de contrôler, à intervalle régulier, l'état de votre environnement pendant une durée déterminée afin de vous avertir d'éventuel soucis et si nécessaire d'effectuer automatiquement certaines actions. Exemple : Etre informé si la porte du garage est restée ouverte plus de 10 minutes Recevoir une notification et allumer le radiateur s'il fait trop froid depuis 30 minutes Eteindre automatiquement la lumière des WC si cette dernière est allumée plus de 5 minutes Eteindre le frigo et recevoir une notification si ce dernier consomme trop d'électricité ou pas assez Installation : Première installation Créer un scénario en mode LUA Insérer le script ci-joint (gea_6_00.lua)) Adapter les dernières lignes à vos besoins (en dessous de la ligne "CONFIGURATION GENERAL") Passage de GEA 5.x à GEA 6.x Copier le nouveau script dans un nouveau scénario LUA Copier vos anciennes lignes de paramétrage dans la fonction "config()" Copier vos lignes GEA.add(…) dans la fonction "setEvents()" Désactiver votre ancien GEA Mise à jour de GEA 6.x à GEA 6.x Ouvrir la nouvelle version et copié de la ligne "if (not GEA) then " jusqu'à la fin Ouvrir votre version et remplacer de la même ligne "if (not GEA) then" jusqu'à la fin. Configuration : Définir l'intervalle de contrôle en secondes GEA.checkEvery = <nb secondes> (30 par défaut) Exemple : GEA.checkEvery = 30 Indique la liste des portables par défaut devant recevoir une notification {70, 71} GEA.portables = {<id portable> [, <id portable>][, ...] Exemple : GEA.portables = {70, 71} Bascule en mode de débogage pour obtenir plus de traces GEA.debug = true | false (false par défaut) Exemple : GEA.debug = true Permet un débogage fort de GEA, chaque erreur provoque l'arrêt de GEA si cette option est à false (anciennement GEA.catchError) GEA.secureAction = true | false (true par défaut) Exemple : GEA.secureAction = false -- va afficher les erreurs et stopper GEA GEA utilise 3 variables globales. Il est conseillé de laisser leurs noms par défaut mais si vous souhaiter les modifier, voici les paramètres à adapter GEA se charge de leur création, ne les créer par manuellement svp. GEA.globalvariables = "GEA_Tasks" GEA.pluginsvariables = "GEA_Plugins" GEA.historyvariable = "GEA_History" Nouveautés : Détection automatique de la langue Création automatique des variables globales nécessaires au fonctionnement de GEA Plus de contrôle (vérification des ID, des actions, …) Plus de 30 nouvelles conditions/actions * Durée à 0 autorisée et exploitée : GEA.add(true, 0, "Démarrage de GEA à #time# le #date#") permet de lancer l'action au démarrage de GEA Dans les actions, l'id peut être multiple GEA.add(true, 30, "", {"TurnOn", {100, 101, 102}}) Allumera donc les 3 modules Dans les actions, les variables globales peuvent être multiple GEA.add(true, 30, "", {"Global", {"VG1", "VG2"}, "Texte"}) VG1 et VG2 prendront donc "Texte" comme valeur Sous-commande acceptée : GEA.add( {"Global", "Test1", {"Global", "Test2"}}, 30, "Variable identique si Test1 = Test2" ) GEA.add( true, 30, "On copie la valeur dans une variable globale la valeur du module 101", {"Global", "Test", {"Value", 101}} ) Pour les développeurs, simplicité d'ajout de nouvelle condition/action Paramètre supplémentaire pour afficher votre message dans la console au lieu du message par défaut GEA.add(condition, durée, message, actions, "<A afficher dans la console>") Scénario Plugin. Moyennant quelques petites lignes de code, vos scénarios peuvent devenir compatibles avec GEA. Structure : Pour reprendre la structure du code de Tibahut, nous avons décidé de modifier légèrement la structure de GEA. Une fonction "config()" doit / contient vos paramètres de GEA Une fonction "setEvents()" contient vos lignes GEA.add Cette modification vous demande donc de modifier votre ancienne version de GEA afin de s'adapter à cette structure. Modifications Réécriture complète du code (diminution de plus de 30% du nombre de ligne) GEA.add(…, 30, """", {{""Time"", ""12:00"", ""12:00""}}) devient GEA.add({..., {""Time"", ""12:00"", ""12:00""}}, 30 , """") les conditions Time, Days, Dates, DST, NODST passe au début dans les conditions et non plus dans les actions comme auparavant. Cette modification est automatique vous n'avez pas besoin de modifier votre code. La gestion des regex a été modifiée, si vous souhaité utilisé un regex, il vous faudra le préfixé par "#r#" Exemple, si la météo est rain ou cloudy GEA.add({"Weather", "#r#rain|cloudy"}, 30, "Pas beau") Lors de déclenchements immédiat, GEA va maintenant vérifier l'ID de TOUTES les conditions pour savoir s'il doit traiter ou non la donnée (anciennement seule la 1ère condition était contrôlée) Détection automatique de la version V4+ ou V3 Le nom des modules n’apparaît plus dans la console pour éviter les soucis de performance de la v4, utilisé #name# dans le message pour l'obtenir si besoin GEA.add(73, -1, "Le module #name# dans la pièce #room# vient de s'allumer") #value[1]# ..#value[9]# n'ont plus de limite (9 maximum sur l'ancienne version) Utilisation du setTimeout au lieu d'un sleep pour le fonctionnement de GEA La fonction userCode() a été modifiée pour correspondre au code de Tibahut soit scindée en config() et setEvents() Possibilité d'utilisé {"Dates", …} avec un format de date par langue Exemple : {"Dates", "10/31/2017"} Voir GEA.traduction[<lang>].input_date_format ou de préciser directement son propre format dans setEvents() en mettant GEA.trad.input_date_format = "mm/dd/yyy" {"Days",…} Prend dorénavant les autres langues que l'anglais et le français. Voir GEA.trad.week_short, GEA.trad.weekend et GEA.trad.weekdays Modifications des options Modifié {"TurnOn"[, <id>][, <durée>]} Allume un module puis l'éteint automatiquement après la durée, il peut aussi etre une condition Modifié {"TurnOff"[, <id>][, <durée>]} Eteint un module puis l'allume automatiquement après la durée, il peut aussi estre une condition Modifié {"Time", <debut>[, <fin>]} Si l'heure de fin n'est pas renseignée, on prend la même heure que celle de début Modifié {"Dates", <debut>[, <fin>]} Si la date de fin n'est pas renseignée, on prend la même date que celle de début Modifé {"Weather"[, <propriété>], <value>} Possibilité de préciser une autre propriété (Wind, Temperature, Pressure, Humidity, …) Modifié {"Inverse"[, <no condition>]} Permet de spécifier le numéro de la condition a inverser (1ère par défaut) Ajouté {"Switch"[, <id>]} Allume ou éteint un module selon son état Ajouté {"Value2"[, <id>], <valeur>} Idem à {"Value", …} mais pour la valeur2 (stores vénitiens) Ajouté {"setArmed"[, <id>]} Arme un module Ajouté {"setDisarmed"[, <id>]} Désarme un module Ajouté {"Killscenario", <id>} Tue un scénario selon son identifiant Ajouté {"PictureToEmail", <id cam>, <email>} Envoi l'image de la caméra à une adresse e-mail Ajouté {"ApiPut", <url>, <properties>} Effectue un put Ajouté {"ApiPost", <url>, <properties>} Effectue un post Ajouté {"ApiGet", <url>} Effectue un get de l'url Ajouté {"Sleep", <secondes>, <action>} Effectue une action dans X secondes {"Sleep", 2, {"TurnOn", 73}} utilise setTimeout Ajouté {"EnableScenario", <id>} Active le scénario ou savoir si le scénario est activé Ajouté {"DisableScenario", <id>} Désactive le scénario ou savoir si le scénario est désactivé Ajouté {"SetRunConfigScenario, <id>, <runconfig>} Permet de connaitre/changer le mode d'exécution d'un scénario Ajouté {"CountScenes", <id>} Retourne le nombre de scènes en cours d'exécution Ajouté {"DebugMessage", <id>, <elementid>, <message>, <type>} Ecrit dans la console de l'objet précisé Ajouté {"Popup", <titre>, <message>} Ajoute une popup dans le gestionnaire de notification Ajouté {"Filters", <"lights"|"blind">, <action>} Effectue l'action sur tout les modules de type light ou blind (turnon, turnoff, close, open, …) Ajouté {"CentralSceneEvent", <id>, <key>, <attribute>} Retourne vrai si le CentralSceneEvent déclencheur correspond à ces critères Ajouté {"Frequency", <jour>, <frequence>} Exemple, tous les dimanches ou un dimanche sur 2 {"Frequency", "Sunday", 2} Ajouté {"RebootHC2"} Redémarre la box Ajouté {"ShutDownHC2"} Eteint la box Ajouté {"Depend", <taksid>} Dépend d'une autre tâche, ne sera exécuté que si la "taskid" a préalablement été exécutée Ajouté {"VariableCache", <nom variable>, <valeur>} Permet de stocker une valeur et de la récupérer plus tard (uniquement dans la scène principale) Ajouté {"Info", <propriété>} Retourne la propriété contenu dans /settings/info Ajouté {"Hue", <propriété>, <valeur>} Permet de piloter une ampoule Philips Hue Ajouté {"ThermostatLevel", <id>, <valeur>} Modifie la valeur de votre thermostat Ajouté {"ThermostatTime", <id>, <valeur>} Modifie la durée de votre thermostat Ajouté {"Ask", <portable>, <message>, <scenario>} Affiche une notification demandant l'exécution d'un scénario Ajouté {"Doorlock", <id>, <valeur>} Permet de sécurisé ou non une serrure électronique Ajouté {"Or", <condition1>, <condition2>[,…] Permet de faire un OU sur plusieurs conditions Ajouté Ajouté Ajouté Ajouté Ajouté Ajouté Ajouté Ajouté Ajouté {"Xor", <condition1>, <condition2>[,…] {"RoomLights", <nom pièce>, "turnOn"|"turnOff"} {"SectionLights", <nom sect>, "turnOn"|"turnOff"} {"OnOff", <id>, "ON|OFF"} {"SonosMP3", id_vd, id_button, filepath [, volume]} {"SonosTTS", id_vd, id_button, message [, volume]} {"JSONDecodeFromGlobal", <VG>, <propriété>} {"JSONDecodeFromLabel", <id>, <label>, <propriété>} {"Monthly", <propriété>} {"Polling", <id parent>} Permet de faire un OU exclusif sur plusieurs conditions Allume ou éteint une pièce entière selon son nom Allume ou éteint une section entière selon son nom Identique à "turnOn" mais retourne "ON" ou "OFF" Voir le VD de Krikroff Voir le VD de Krikroff Décode un Variable globale et retourne la valeur de la propriété Décode un Label et retourne la valeur de la propriété Une fois par mois Poll un device Supprimé {"Groupe", <id groupe>} Supprimé Supprimé {"IF", …} Supprimé Attention Ajouté Ajouté Ajouté Ajouté Ajouté Ajouté Ajouté Ajouté {"Global", "", ""} {"LedBrightness", <luminosité>} {"DeviceState", <id module>} {"NeighborList", <id module>} {"LastWorkingRoute", <id module>} {"CheckVG", <nom vg>} {"CheckLabel", <id vd>, <nom label>} {"Protection", <id module>, <type>, <On|Off>} {"MultiAlarm", <id vd>, <label>} Devient définitivement "true" (sans les guillemets) Modifie la luminosité des LED de la HC2 Retoure l'étant d'un module Retourne la liste des modules voisins Retourne la liste de la route empruntée Vérifie l'existence d'un variable globale Vérifie l'existence d'un label Modifie la protection (local, rf) d'un module Vérifie l'alarme 1 .. 4 Vous trouverez ci-joint un fichier syntaxe_GEAV6.lua (écrit par @pepite) qui regroupe toutes les commandes et leurs utilisations. Télécharger le et garder le sous la main, c'est votre bible GEA. Le wiki est en cours de modification ce qui va prendre beaucoup de temps GEA Wiki Historique : v.6.01 - 15 décembre 2017 fix : vd GEA Alarm fix : Dead - remplacement de wakeUpDeadDevce par wakeUpAllDevices fix : {"Time": "Sunset+10>08:00"} fix : Option "Portable" is missing fix : multiple dates provoquant un table missing fix : correction du Or et XOr en mode instantané fix : fichier syntaxe_GEAV6.lua (ci-joint) add : {"Deads"} pour réveillé tous les noeux morts v.6.02 20 décembre 2017 fix : vd GEA Alarm -- double push fix : "Sleep" en conjonction avec un Plugin mod : getMessage pour les plugins et arguments de scénario (traitement des variables #time#, #value#, ...) v.6.03 29 décembre 2017 add : #datefull# dans les messages pour obtenir "dimanche 23 décembre 2017" fix : Correction du code pour {"Weather"} add : {"WeatherLocal"} ... identique à {"Weather"} mais retourne les conditions météos selon votre langue v.6.04 7 janvier 2018 add : Roomlights ... {"RoomLights", <nom de la pièce>, "turnOn"|"turnOff"} add : Sectionlights ... {"SectionLights", <nom de la séction>, "turnOn"|"turnOff"} mod : correct Weather, erreur ajoutée en V6.03 mod : #datefull# erreur sur le dimanche mod : correction déclenchement instantané qui stop la mauvaise tache mod : correction déclenchement instantané avec plusieurs conditions add : Slider mod : Close 100 = tout fermé, 0 tout ouvert mod : Open et Close peuvent recevoir plusieurs ids {"Open", {id1, id2}, valeur} mod : optimisation des déclenchements immédiats (1ère passe) v.6.05 29 janvier 2018 add : #trigger# in message add : {"OnOff", <id>, "ON|OFF"} identique à turnOn mais retourne ON ou OFF add : {"SonosMP3", id_vd, id_button, filepath [, volume]} -->voir VD de Krikroff --> Merci @MAM78 add : {"SonosTTS", id_vd, id_button, message [, volume]} --> voir VD de Krikroff --> Merci @MAM78 add : {"JSONDecodeFromGlobal", <nom VG>, <propriété à vérifier>} add : {"JSONDecodeFromLabel", <id VD>, <label>, <propriété à vérifier>} add : {"TempExt"} -- température exterieure selon les conditions métérologique add : {"TempExtTTS"} -- température exterieure selon les conditions métérologique au format (X degrer X) mod : amélioration du translate mod : clarifier le message des actions dans le debug mod : optimisation #2 diminution accès aux variables globales mod : optimisation consommation mémoire mod : suppression bavardage intempestif au mode immédiat mod : correction décalage durée d'execution mod : correction du "Time" qui pouvait ne pas se comporter correctement mod : fonctionnement de l'optimisation mod : bug fix v.6.06 ajouté le 7 février 2018 mod : Correction bug introduit un 6.05 avec "Function" add : Possibilité d'ignoré le déclenchement d'une option en mode immédiat en mettant son nom entre parenthèse exemple : {"Global+", "Test", 100} --> {"(Global+)", "Test", 100} add : {"Monthly", <propriété>} --> Une fois par mois. Propiétés possibles : <nombre> 1-31 : Tous les X du mois "begin" : Tous les 1er du mois "end" : Tous les derniers jours du mois <day> "Monday", "Tuesday", ... : Tous les 1er lundi, mardi, ... du mois Voir le fichier de syntaxe pour plus d'info. v.6.07 ajouté le 22 mars 2018 mod : correction slider {"Slider", <id_mv>, <Label>, <valeur>} mod : ajout de GEA.getMessageDecorator(msg) pour permettre à l'utilisateur d'ajouter facilement ces propres gsub() mod : ajout GEA.trad.locale mod : correction usage de la variable globale mod : correction lors de multiple {"Portable", <id portable>} mod : ajout Popup with scenario ID add : {"Polling", <id module>} v.6.10 ajouté le 31 octobre 2018 mod : correction du #name# pour les "Or" et "XOr" mod : usage d'un cache pour les noms de modules et de pièces mod : contrôle des variables globales (API not found) mod : contrôle des label (API not found) add : {"LedBrightness", <luminosité>} add : {"DeviceState", <id module>} add : {"NeighborList", <id module>} add : {"LastWorkingRoute", <id module>} add : {"CheckVG", <nom vg>} add : {"CheckLabel", <id vd>, <nom vg>} v.6.11 ajouté le 13 novembre 2018 mod : correction d'un bug dans checklabel add : {"Protection", <id>, <type_protection>, <On|Off>} by @971jmd add : {"MultiAlarm", <id vd>, <label>} by @drboss GEA 6.11.lua syntaxe_GEAV6_11.lua
  17. Watchdog Version 1.3 Voici une scène permettant de surveiller le fonctionnement des Scènes et Main Loop de Modules Virtuels sur Home Center 2 en version 4.x. Pour ce faire, les messages de la fenêtre de Debug sont analysés. De plus, pour les scènes uniquement, le nombre d'instances est compté. En cas de problème détecté, la scène ou le virtual device considéré est automatiquement redémarré, et une notification peut être envoyée. Copier/coller le script LUA suivant dans une nouvelle scène : --[[ %% autostart %% properties %% globals --]] -------------------------------------------------- -- Scene : Watchdog -- Author : Lazer -- Version : 1.3 -- Date : June 2017 -------------------------------------------------- -- User variables local intervalle = 60 local delay = 15*60 local watchdog = { } local userID = {} -- Email local smartphoneID = {} -- Push local sms = { ["VD_ID"] = 0, -- Virtual Device ID ["VD_Button"] = "1", -- Virtual Device Button ["VG_Name"] = "SMS" -- Global Variable Name } local debug = false -- -- Message function -- function Message(color, message) if color and color ~= "" then fibaro:debug('<span style="color:'..color..';">'..(message or '<nil>')..'</span>') else fibaro:debug(message or '<nil>') end end -- -- Notification function -- function Notification(message, param) local message = message or "<vide>" Message("yellow", "Notification : "..message) if param then for _, notif in ipairs(param) do if debug then Message("grey", notif) end -- Envoi Push if notif == "push" and smartphoneID then for _, id in ipairs(smartphoneID) do if debug then Message("grey", "Send Push smartphone ID : "..id) end fibaro:call(id, "sendPush", message) end -- Envoi Email elseif notif == "email" and userID then for _, id in ipairs(userID) do if debug then Message("grey", "Send Email user ID : "..id) end fibaro:call(id, "sendEmail", "HC2 Watchdog", message) end -- Envoi SMS elseif notif == "sms" and sms then if debug then Message("grey", "Send SMS : VD_ID="..(sms["VD_ID"] or 0).." VD_Button="..(sms["VD_Button"] or "0").." VG_Name="..(sms["VG_Name"] or "")) end fibaro:setGlobal(sms["VG_Name"], message) if sms["VD_ID"] and tonumber(sms["VD_ID"])>0 and sms["VD_Button"] and tonumber(sms["VD_Button"])>0 then fibaro:call(sms["VD_ID"], "pressButton", sms["VD_Button"]) end end end else Message("orange", "Warning : no notification options given") end end -- -- Restart function -- function Restart(type, id, restart, notification, reason) Message("blue", 'Restart '..type..'('..id..')') -- Prepare API URL local getURL = "" local putURL = "" if type:lower() == "scene" then getURL = 'http://127.0.0.1:11111/api/scenes/'..id putURL = 'http://127.0.0.1:11111/api/scenes/'..id elseif type:lower() == "vd" then getURL = 'http://127.0.0.1:11111/api/virtualDevices/'..id putURL = 'http://127.0.0.1:11111/api/virtualDevices/'..id end -- Load VD/Scene local httpClient = net.HTTPClient() httpClient:request(getURL, { success = function(response) if response.status == 200 then local jsonTable = json.decode(response.data) local name = jsonTable.name or "" if restart and restart == true then -- Add new line at end of scene lua code if type:lower() == "scene" and jsonTable.lua then jsonTable.lua = jsonTable.lua .. "\n" response.data = json.encode(jsonTable) end -- Save VD/Scene httpClient:request(putURL, { success = function(response) if response.status == 200 then Message("green", type.."("..id..") successfully restarted") Notification('Watchdog : '..type..' « '..(name or "")..' » ('..id..") a été redémarré : "..(reason or "???"), notification) else Message("red", type.."("..id..") Error : status="..tostring(response.status)) Notification('Watchdog : '..type..' « '..(name or "")..' » ('..id..") n'a pas pu être redémarré : "..(reason or "???"), notification) end end, error = function(err) Message("red", type.."("..id..") Error : "..err) Notification('Watchdog : '..type..' « '..(name or "")..' » ('..id..") n'a pas pu être redémarré : "..(reason or "???"), notification) end, options = { method = 'PUT', -- headers = { -- ["content-type"] = 'application/x-www-form-urlencoded;' -- }, data = response.data } }) else Notification('Watchdog : '..type..' « '..(name or "")..' » ('..id..") doit être redémarré manuellement : "..(reason or "???"), notification) end else Message("red", type.."("..id..") Error : status="..tostring(response.status)) Notification('Watchdog : '..type..' ('..id..") n'a pas pu être redémarré : "..(reason or "???"), notification) end end, error = function(err) Message("red", type.."("..id..") Error : "..err) Notification('Watchdog : '..type..' ('..id..") n'a pas pu être redémarré : "..(reason or "???"), notification) end, options = { method = 'GET' } }) end -- function -- -- Check function -- function Check(interval) Message(nil, "Check") -- Browse VD/Scene list local httpClient = net.HTTPClient() local elements = #watchdog for i = 1, elements do -- Initialization local countscene_found = false if debug then Message(nil, "Check : type="..watchdog[i].type.." id="..watchdog[i].id) end -- Check number of running scene instances if watchdog[i].type:lower() == "scene" and watchdog[i].count and watchdog[i].count > 0 then local countScenes = fibaro:countScenes(watchdog[i].id) if countScenes < watchdog[i].count then Message("orange", watchdog[i].type..'('..watchdog[i].id..') '..countScenes..' running instance') countscene_found = true Restart(watchdog[i].type, watchdog[i].id, watchdog[i].restart, watchdog[i].notification, countScenes..' instance') elseif debug then Message("green", watchdog[i].type..'('..watchdog[i].id..') '..countScenes.." running instance") end end if countscene_found == false then -- Do not enter this loop if scene has already been restarted -- Prepare API URL local getURL = "" if watchdog[i].type:lower() == "scene" then getURL = "http://127.0.0.1:11111/api/scenes/"..watchdog[i].id.."/debugMessages" elseif watchdog[i].type:lower() == "vd" then getURL = "http://127.0.0.1:11111/api/virtualDevices/"..watchdog[i].id.."/debugMessages/0" else Message("red", "Error : unknown type value") end if getURL ~= "" then if debug then Message("grey", getURL) end -- Load VD/Scene debug messages httpClient:request(getURL, { success = function(response) if response.status == 200 then if response.data and response.data ~= "" then local jsonTable = json.decode(response.data) local current_timestamp = os.time() local oldest_timestamp = current_timestamp local match_found = false local no_match_found = false local reason = "" -- Reverse browsing of debug messages for j = #jsonTable, 1, -1 do oldest_timestamp = jsonTable[j].timestamp -- Check if debug message match lookup string within allowed interval if watchdog[i].match.text and watchdog[i].match.text ~= "" and watchdog[i].match.interval > 0 and jsonTable[j].txt:match(watchdog[i].match.text) then if jsonTable[j].timestamp > current_timestamp - watchdog[i].match.interval then if debug then Message("green", watchdog[i].type..'('..watchdog[i].id..') Found string "'..watchdog[i].match.text..'"') end match_found = true end end -- Check if debug message match forbidden string if watchdog[i].no_match.text and watchdog[i].no_match.text ~= "" and jsonTable[j].txt:match(watchdog[i].no_match.text) then Message("orange", watchdog[i].type..'('..watchdog[i].id..') Found string "'..watchdog[i].no_match.text..'"') no_match_found = true reason = os.date('%H:%M:%S', (jsonTable[j].timestamp or 0)) .. " " .. jsonTable[j].type .. " : " .. jsonTable[j].txt break end if watchdog[i].no_match.type and watchdog[i].no_match.type ~= "" and jsonTable[j].type == watchdog[i].no_match.type then Message("orange", watchdog[i].type..'('..watchdog[i].id..') Found type "'..watchdog[i].no_match.type..'"') no_match_found = true reason = os.date('%H:%M:%S', (jsonTable[j].timestamp or 0)) .. " " .. jsonTable[j].type .. " : " .. jsonTable[j].txt break end end -- for if debug and oldest_timestamp > current_timestamp - watchdog[i].match.interval then Message("grey", watchdog[i].type..'('..watchdog[i].id..') oldest debug timestamp more recent than interval') end -- Restart VD/Scene if watchdog[i].match.text and watchdog[i].match.text ~= "" and watchdog[i].match.interval > 0 and match_found == false and oldest_timestamp < current_timestamp - watchdog[i].match.interval then Message("orange", watchdog[i].type..'('..watchdog[i].id..') String "'..watchdog[i].match.text..'" not found') reason = 'Chaine « ' .. watchdog[i].match.text .. ' » non trouvée' if #jsonTable > 0 then reason = reason .. ', dernier message : ' .. os.date('%H:%M:%S', (jsonTable[#jsonTable].timestamp or 0)) .. ' « ' .. (jsonTable[#jsonTable].txt or "<nil>") .. ' »' end Restart(watchdog[i].type, watchdog[i].id, watchdog[i].restart, watchdog[i].notification, reason) --if watchdog[i].no_match.text and watchdog[i].no_match.text ~= "" and no_match_found == true then elseif no_match_found == true then Restart(watchdog[i].type, watchdog[i].id, watchdog[i].restart, watchdog[i].notification, reason) end else Message("red", "Error : empty response") end else Message("red", "Error : status=" .. tostring(response.status)) end end, error = function(err) Message("red", 'Error : ' .. err) end, options = { method = 'GET' } }) end end end -- for -- Wait if interval and interval > 0 then setTimeout(function() Check(interval) end, interval*1000) end end -- function -- -- Main loop -- local trigger = fibaro:getSourceTrigger() if trigger["type"] == "autostart" then Message(nil, "Watchdog instance autostart") -- Check function call delayed to prevent killing all other scenes not already started right after HC2 boot setTimeout(function() Check(intervalle) end, delay*1000) else Message(nil, "Watchdog instance manual launch") -- Call Check function Check(nil) end . Le paramétrage du script s'effectue dans les quelques lignes situées sous le commentaire "User variables" : intervalle : durée entre 2 vérifications delay : délai avant la première vérification. En effet, cette scène ayant la propriété autostart afin de démarrer automatiquement au boot de la box, le risque est de démarrer avant les autres Scène/VD, et de forcer un redémarrage de ceux-ci alors qu'ils n'ont pas encore effectivement démarré. Ce délai laisse donc aux autres Scène/VD le temps de démarrer et de s'initialiser proprement. watchdog : tableau dont chaque ligne représente une Scène ou un Virtual Device à monitorer : type : "Scene" ou "VD" id : valeur numérique représentant l'ID de la Scène ou VD à monitorer match : texte qui doit être trouvé pendant un certain laps de temps afin de confirmer le bon fonctionnement du VD/Scène. Cela correspond typiquement à un message affiché cycliquement à intervalle régulier. Les 2 champs suivants doivent être renseignés pour que la condition soit prise en compte (condition ET) : text : chaine de caractères à trouver interval : durée en secondes no_match : texte qui ne doit pas être trouvé, sous peine de considérer le VD/Scène comme planté. Cela correspond typiquement à un message d'erreur LUA qui entraine le plantage du script. A noter que la condition no_match à priorité sur la condition match, c'est à dire que si le texte recherché par no_match est détecté, le VD/Scène sera redémarrer même si le texte recherché par match a été détecté. L'un ou l'autre des 2 champs suivants peuvent être renseignés pour que la condition soit prise en compte (condition OU) : text : chaine de caractères à trouver type : "ERROR" correspond aux messages affichés en rouge dans la fenêtre de Debug de l'interface HC2. A noter que jusqu'en v4.056, dans une scène une erreur LUA affichait le message en rouge avec le type "ERROR", tandis que depuis les Beta v4.057 et v4.058, cette même erreur s'affiche en blanc sans le type ERROR, par conséquent ce test ne fonctionne plus. En revanche, aucun changement de mode de fonctionnement concernant les Virtual Devices. count : valeur valable pour les scènes uniquement, et indiquant le nombre minimal d'instances qui doivent fonctionner pour confirmer le bon fonctionnement de la scène. Cela correspond typiquement à l'instance de type boucle infinie lancée en autostart. restart : true ou false afin de redémarrer le VD/Scène concerné, ou seulement envoyer une notification signalant qu'il faut le redémarrer manuellement. notification : liste séparée par des virgules des moyens de notifications à employer. userID : liste séparée par des virgules des ID des utilisateurs qui doivent recevoir des notifications par email (le mail est celui configuré pour chaque utilisateur dans le panneau de contrôle d'accès) smartphoneID : liste séparée par des virgules des ID des smartphones qui doivent recevoir des notifications push (à récupérer dans le toolkit de Krikroff ou via l'API : /api/iosDevices) sms : si vous avez une passerelle SMS sous Android avec SMS Gateway (ou équivalent) pilotée par un module virtuel, il faut renseigner ici les informations nécessaires : VD_ID : ID du module virtuel VD_Button : ID du bouton du module virtuel VG_Name : nom de la variable globale debug : true ou false afin d'activer l'affichage étendu dans la fenêtre de débugage de la scène. Exemple de paramètres : -- User variables local intervalle = 60 local delay = 15*60 local watchdog = { {type = "Scene", id = 1, match = {text="", interval=0}, no_match = {text=""}, count=1, restart=true, notification = {"push", "email", "sms"}}, -- Présence Lazer {type = "Scene", id = 2, match = {text="Last run", interval=2*60}, no_match = {text=""}, count=1, restart=true, notification = {"push", "email", "sms"}}, -- DomoCharts {type = "Scene", id = 3, match = {text="Durée des traitements", interval=11*60}, no_match = {text=""}, count=1, restart=true, notification = {"push", "email", "sms"}}, -- GEA {type = "VD", id = 1, match = {text="", interval=0}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- Surveillance Station {type = "VD", id = 2, match = {text="", interval=0}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- Clock Sync {type = "VD", id = 3, match = {text="", interval=0}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- My Batteries {type = "VD", id = 4, match = {text="", interval=0}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- Evénements {type = "VD", id = 5, match = {text="", interval=0}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- Network Monitor {type = "VD", id = 6, match = {text="", interval=0}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- GEA Alarm {type = "VD", id = 7, match = {text=" ", interval=30}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- Sonos Player (Tk.isTraceEnabled = true) {type = "VD", id = 8, match = {text="Start main process", interval=31*60}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}} -- Freebox Serveur } local userID = {1} -- Email local smartphoneID = {1, 2} -- Push local sms = { ["VD_ID"] = 99, -- Virtual Device ID ["VD_Button"] = "1", -- Virtual Device Button ["VG_Name"] = "SMS" -- Global Variable Name } local debug = false
  18. Utilisation de fibaro:call en fonction du module commandé Voici un lien qui vous donnera les actions que l'on peut utiliser pour chaque type de modules fibaro http://www.fibarouk.co.uk/support/lua/actions-use-fibarocall-api/ armed close firmwareUpdate open pollingDeadDevice pollingTimeSec pressButton requestNodeNeighborUpdate resetMeter sendDefinedEmailNotification sendDefinedPushNotification sendDefinedSMSNotification sendEmail sendGlobalEmailNotifications sendGlobalPushNotifications sendGlobalSMSNotifications sendPhotoToEmail sendPhotoToUser sendPush sendSipUserID setArmed setB setColor setG setProperty setProtectionLocalAndRF setR setSipDisplayName setSipUserID setSipUserPassword setSlider setTargetLevel setTime setValue setValue2 setW startProgram stop turnOff turnOn close Application pour : blind Description: Closes a blind. Usage: This action takes no arguments. Exemple: -- Close the blind with the device ID of 94 fibaro:call(94, "close") open Application pour : blind Description: Opens a blind. Usage: This action takes no arguments. Exemple: -- Open the blind with the device ID of 94 fibaro:call(94, "open") pressButton Application pour : virtual_device Description: Triggers a virtual device button press. Usage: This action takes one argument. The number of the button to be pressed. Each element of a virtual device has a unique number starting from 1. If your virtual device has two labels followed by two buttons, the buttons will be numbered 3 and 4. Exemple: -- Trigger a button press of button 3 of -- the virtual device with an ID of 358 fibaro:call(358, "pressButton", "3") sendDefinedEmailNotification Application pour : HC_user Description: Sends a notification to the email address associated with a user. Usage: This action takes one argument. The id of the notification to be sent. Exemple: 1-- Send notification 2 via email to the -- address associated with user 107. fibaro:call(107, "sendDefinedEmailNotification", "2") sendDefinedPushNotification Application pour : iOS_device Description: Sends a push notification to a device. Usage: This action takes one argument. The id of the notification to be sent. Exemple: -- Send notification 2 via push to modile device number 10. fibaro:call(10, "sendDefinedPushNotification", "2") sendDefinedSMSNotification Application pour : HC_user Description: Sends an SMS notification to a phone number. Usage: This action takes two arguments. The phone number to send the message to.This should be in the form xxyyyyyyyyy where xx = country code and yyyyyyyyy = phone number. The id of the notification to be sent. Exemple: -- Send notification 3 via SMS to device number +441234567890. fibaro:call(2, "sendDefinedSMSNotification", "441234567890", "3") sendEmail Application pour : HC_user Description: Sends an email to the email address associated with a user. Usage: This action takes two arguments. The subject of the email. The message body of the email. Exemple: -- Send an email to the email address associated with user 2. local subject = "This is the subject of the email." local message = "This is the body of the email.\nWith a line break." fibaro:call(2, "sendEmail", subject, message) sendPhotoToEmail Application pour : IP_camera Description: Sends a still image from a camera to a specified email address. Usage: This action takes one argument. The email address to send the image to. Exemple: -- Send an image from camera 120 to someone@this.address. fibaro:call(120, "sendPhotoToEmail", "someone@this.address") sendPhotoToUser Application pour : IP_camera Description: Sends a still image from a camera to the email address associated with a user. Usage: This action takes one argument. The id number of the user to send the image to. Exemple: -- Send an image from camera 120 to -- the email address associated with user 2. fibaro:call(120, "sendPhotoToUser", "2") sendPush Application pour : iOS_device Description: Sends a push notification to an iOS device. The device must have connected with the Home Centre recently, however once this connection has been made the app can be closed. Usage: This action takes one argument. The message to be pushed to the device. Exemple: -- Send a push notification to the iOS device with the ID of 10 fibaro:call(10, 'sendPush', 'This is the message to be pushed.') setArmed Application pour : motion_sensor, door_sensor, window_sensor, smoke_sensor Description: Arms or disarms a device. Usage: This action takes one argument. The armed state of the device. 0 = disarmed, 1 = armed. Exemple: -- Arm the door sensor with device ID of 174 fibaro:call(174, "setArmed", "1") -- Disarm the door sensor with device ID of 174 fibaro:call(174, "setArmed", "0") setB Application pour : rgb_driver Description: Sets the brightness of the blue channel of an rgb_driver. Usage: This action takes one argument. The brightness (0-99) of the channel. Exemple: -- Set the brightness of the blue channel of device 81 to 56% fibaro:call(81, "setB", "56") setColor Application pour : rgb_driver Description: Sets the colour of an rgb_driver. This is done by setting the brightness of the red, green, blue and white channels. Usage: This action takes four arguments. The brightness (0-99) of the red channel. The brightness (0-99) of the green channel. The brightness (0-99) of the blue channel. The brightness (0-99) of the white channel. Even if the device is in RGB mode, the white channel needs to be specified – in this case, just use 0. Exemple: -- Set the colour of device 81 to a blue-indigo colour -- (60% red, 23% green, 99% blue, 0% white) fibaro:call(81, "setColor", "60", "23", "99", "0") setG Application pour : rgb_driver Description: Sets the brightness of the green channel of an rgb_driver. Usage: This action takes one argument. The brightness (0-99) of the channel. Exemple: -- Set the brightness of the green channel of device 81 to 56% fibaro:call(81, "setG", "56") setProperty Application pour : virtual_device Description: Sets value of the elements of a virtual device (labels and sliders). Usage: This action takes two arguments. The name of the element. The value to set the element to. Exemple: -- Set the content of Label1 in virtual device 1170 to 'program 1' fibaro:call(1170, "setProperty", "ui.Label1.value", "program 1") -- Set the value of Slider1 in virtual device 1170 to 45 fibaro:call(1170, "setProperty", "ui.Slider1.value", "45") setR Application pour : rgb_driver Description: Sets the brightness of the red channel of an rgb_driver. Usage: This action takes one argument. The brightness (0-99) of the channel. Exemple: -- Set the brightness of the red channel of device 81 to 56% fibaro:call(81, "setR", "56") setSlider Application pour : virtual_device Description: Triggers a change in the value of a virtual device slider. Usage: This action takes two arguments. The number of the slider to be changed. Each element of a virtual device has a unique number starting from 1. If your virtual device has two labels followed by two buttons and then a slider, the slider will be numbered 5. The value (0-99) to set the slider to. Exemple: -- Set the slider with an ID of 2 of the -- virtual device with an ID of 334 to 50% fibaro:call(334, "setSlider", "2", "50") setTargetLevel Application pour : thermostat_setpoint Description: Sets the target temperature of a thermostat_setpoint. Usage: This action takes one argument. A temperature in degrees. Exemple: -- Set the target temperature of device 117 to 18 degrees. fibaro:call(117, "setTargetLevel", "18") setTime Application pour : thermostat_setpoint Description: Sets the value of the timeStamp property of the thermostat_setpoint. Usage: This action takes one argument. A timestamp. Exemple: -- Set the timeStamp of the thermostat_setpoint -- with device ID of 117 to 2 hours from now. fibaro:call(117, "setTime", tonumber(os.time()) + 120*60) setValue Application pour : dimmable_light, blind, rgb_driver Description: Sets the brightness of a dimmable_light or rgb_driver or sets the position of a blind. When changing the brightness of rgb_drivers, all channels are set to the same level (white light). Usage: This action takes one argument. A value (0-99) representing the brightness of the light or position of the blind. For a blind, 0 = fully closed, 99 = fully open. Exemple: -- Set the brightness of the light with device ID of 68 to 25%. fibaro:call(68, "setvalue", "25") -- Set the position of the blind with the device ID of 94 to 75% open. fibaro:call(94, "setvalue", "75") setW Application pour : rgb_driver Description: Sets the brightness of the white channel of an rgb_driver. Usage: This action takes one argument. The brightness (0-99) of the channel. Exemple: -- Set the brightness of the white channel of device 81 to 56% fibaro:call(81, "setW", "56") startProgram Application pour : rgb_driver Description: Instruct the rgb_driver to play one of the preconfigured colour programmes. Usage: This action takes one argument. The light programme number to run. Exemple: -- Start programme number 2 ("storm") on device number 81 fibaro:call(81, "startProgram", "2") stop Application pour : blind Description: Stops the movement of a blind. Usage: This action takes no arguments. Exemple: -- Stop the blind with the device ID of 94 fibaro:call(94, "stop") turnOff Application pour : binary_light, dimmable_light, rgb_driver Description: Turns off a device. Usage: This action takes no arguments. Exemple: -- Turn off device number 58. fibaro:call(58, "turnOff") turnOn Application pour : binary_light, dimmable_light, rgb_driver Description: Turns on a device. Usage: This action takes no arguments. Exemple: -- Turn on device number 58. fibaro:call(58, "turnOn")
  19. Scène pour afficher l'utilisation des variables globales Références croisées (xref) Lorsque les développements prennent une certaine ampleur, et en absence d'atelier de développement logiciel, il est utile de de pouvoir rapidement identifier quel morceau de code utilise telle variable (globale dans le cas de la HC2). Ce sujet avait déjà été abordé il y a maintenant quelque temps : Je vous en propose une nouvelle version qui permet : D'obtenir pour chaque variable globale les scènes et VD qui en font usage ; Pour chaque scène et pour chaque VD d'avoir la liste des variables globales utilisées (c'est cela qui est nouveau). Voici un exemple des résultats affichés dans le fenêtre de debug : La scène est un peu longue lors de son exécution, je suis preneur d'idées d'algorithmes plus optimisés. Le code de la scène : --[[ This scene is used to list all the global variables and where they are used. It's a kind of xref. -- 07/02/2017: creation -- 24/10/2019: add scene and virtual devices --]] local startTime = os.time(); local globalVariables = api.get("/globalVariables"); -- Get all globals variables local scenes = api.get("/scenes?type=com.fibaro.luaScene&isLua=true"); -- all the scenes local devices = api.get("/devices?type=virtual_device"); -- and all the virtual devices since for others types there is no lua code function round(num, numDecimalPlaces) return tonumber(string.format("%." .. (numDecimalPlaces or 0) .. "f", num)); end -- round function progressBar(progressPct, length) if length ~= nil or length == 0 then length = 20; end progressPct = math.abs(progressPct); progressPct = math.min(progressPct, length); return ' [' .. string.rep("*", progressPct) .. string.rep("_", length - progressPct) .. '] '; end -- progressBar fibaro:debug('<font color="Gold">Analyzing lua code for ' .. #globalVariables .. ' global variables, ' .. #scenes .. ' scenes, ' .. #devices .. ' virtual devices, this may take a while.</font>'); -- Where each global variable is used local txt = '<BR><font color="yellow">'.. string.rep('=', 80) .. '<BR>Globals variables ' .. os.date("%d/%m/%y %X") .. '</font><BR>'; local cnt = 0; for _, glob in pairs(globalVariables) do -- For each global variable txt = txt .. '<BR><font color="Orange">Global variable "' .. glob.name .. '":</font>'; cnt = cnt + 1; local used = false; for _, s in pairs(scenes) do -- For each scene local scene = api.get("/scenes/" .. s.id); if scene.triggers.globals ~= nil then for _, g in pairs(scene.triggers.globals) do -- We look each trigger if (g ~= nil) and (g == glob.name) then txt = txt .. '<BR><font color="lightgreen">&nbsp&nbsp&nbsp- trigger in scene "' .. scene.name .. '" (id:' .. scene.id .. ')</font>'; used = true; end end end -- Lua code inspection if (scene.lua ~= nil) and (string.find(scene.lua, glob.name) ~= nil) then txt = txt .. '<BR><font color="Chartreuse">&nbsp&nbsp&nbsp- used in scene "' .. scene.name .. '" (id:' .. scene.id .. ')</font>'; used = true; end end -- for _, s in pairs(scenes) for _,device in pairs(devices) do -- For each virtual device if (device.properties.mainLoop ~= nil) and (string.find(device.properties.mainLoop, glob.name) ~= nil) then -- look in mainloop txt = txt .. '<BR><font color="DeepSkyBlue">&nbsp&nbsp&nbsp- used in VD "' .. device.name .. '" mainloop</font>'; used = true; end local rows = device.properties.rows; -- look in buttons for _, row in pairs(rows) do if (row.type ~= nil) and (row.type == "button") and (row.elements ~= nil) then for _,element in pairs(row.elements) do if (element.lua ~= nil) and (element.lua == true) then if (element.msg ~= nil) and (string.find(element.msg, glob.name) ~= nil) then txt = txt .. '<BR><font color="LightSkyBlue">&nbsp&nbsp&nbsp- used in "' .. element.name .. '" btn (id: ' .. element.id .. ') of "' .. device.name .. '" VD (' .. device.id .. ')</font>'; used = true; end end end end end end -- for _,d in pairs(devices) if not used then txt = txt .. "<font color='Magenta'> unused</font>"; end local progress = round((cnt / #globalVariables) * 100) if (progress % 5) == 0 then fibaro:debug('<font color="gray">working,' .. progressBar(progress/5, 20) .. tostring(progress) .. '% done in ' .. (os.time()-startTime) .. ' secondes.</font>'); end end txt = txt .. '<BR><font color="gray">Total memory in use by Lua (version '.._VERSION..'): ' .. string.format("%.2f", collectgarbage("count")) .. ' KB</font>'; txt = txt .. '<BR><font color="gray">Time for global variables: ' .. (os.time()-startTime) .. ' secondes.</font><BR>'; -- Global variables used by scenes local sceneTime = os.time(); txt = txt .. '<BR><font color="yellow">'.. string.rep('=', 80) .. '<BR>Global variables used by scene ' .. os.date("%d/%m/%y %X") .. '</font><BR>'; for _, s in pairs(scenes) do -- For each scene txt = txt .. '<BR><font color="lightgreen">Scene "' .. s.name .. '" (id:'.. s.id .. '):</font>'; local used = false; local scene = api.get("/scenes/" .. s.id); if scene.triggers.globals ~= nil then for _, g in pairs(scene.triggers.globals) do -- We look each trigger for _, glob in pairs(globalVariables) do -- For each global variable if (g == glob.name) then txt = txt .. '<BR><font color="Orange">&nbsp&nbsp&nbsp- global "' .. glob.name .. ' used as a trigger"</font>'; used = true; end end -- for _, glob end end -- Lua code inspection if (scene.lua ~= nil) then for _, glob in pairs(globalVariables) do -- For each global variable if (string.find(scene.lua, glob.name) ~= nil) then txt = txt .. '<BR><font color="Coral">&nbsp&nbsp&nbsp- global "' .. glob.name .. '" used</font>'; used = true; end end -- for _, glob end if not used then txt = txt .. "<font color='Magenta'> no global variable used</font>"; end end -- for _, s in pairs(scenes) txt = txt .. '<BR><font color="gray">Total memory in use by Lua (version '.._VERSION..'): ' .. string.format("%.2f", collectgarbage("count")) .. ' KB</font>'; txt = txt .. '<BR><font color="gray">Time for scenes: ' .. (os.time()-sceneTime) .. ' secondes.</font><BR>'; -- Global variables used by virtual devices local deviceTime = os.time(); txt = txt .. '<BR><font color="yellow">'.. string.rep('=', 80) .. '<BR>Global variables used by virtual devices ' .. os.date("%d/%m/%y %X") .. '</font><BR>'; for _,device in pairs(devices) do -- For each virtual device txt = txt .. '<BR><font color="DeepSkyBlue">Virtual device "' .. device.name .. '" (id:'.. device.id .. '):</font>'; local used = false; if (device.properties.mainLoop ~= nil) then -- look in mainloop for _, glob in pairs(globalVariables) do -- For each global variable if (string.find(device.properties.mainLoop, glob.name) ~= nil) then txt = txt .. '<BR><font color="Orange">&nbsp&nbsp&nbsp- global "' .. glob.name .. '" used in mainloop</font>'; used = true; end end end local rows = device.properties.rows; -- look in buttons for _, row in pairs(rows) do if (row.type ~= nil) and (row.type == "button") and (row.elements ~= nil) then for _,element in pairs(row.elements) do for _, glob in pairs(globalVariables) do -- For each global variable if (element.lua ~= nil) and (element.lua == true) then if (element.msg ~= nil) and (string.find(element.msg, glob.name) ~= nil) then txt = txt .. '<BR><font color="Coral">&nbsp&nbsp&nbsp- global "' .. glob.name .. '" used in btn "' .. element.name .. '" (id:' .. element.id .. ')</font>'; used = true; end end end end end end if not used then txt = txt .. "<font color='Magenta'> no global variable used</font>"; end end -- for _,device txt = txt .. '<BR><font color="gray">Total memory in use by Lua (version '.._VERSION..'): ' .. string.format("%.2f", collectgarbage("count")) .. ' KB</font>'; txt = txt .. '<BR><font color="gray">Time for virtual devices: ' .. (os.time()-deviceTime) .. ' secondes.</font>'; txt = txt .. '<BR><font color="gray">Total elapsed time: ' .. (os.time()-startTime) .. ' secondes.</font><BR>'; fibaro:debug(txt); Je vous propose l'icône que j'utilise et suis preneur d'une qui serait plus "artistique". A l'approche des frimas, je ne puis que conclure par un... Chaleureusement.
  20. Barelle

    VD UPS

    Hello, Comme vous le savez, nos matériels électroniques n’apprécient pas du tout les coupures électriques. Pour cela, il est plus que recommandé d’utiliser un onduleur (ou UPS, "Uninterruptible Power Supply")… Le VD que je vous propose ici permet l’interrogation du serveur UPS résidant sur un NAS Synology (auquel l’onduleur est connecté par un port USB). Il met à jour une variable globale (appelée UpsStatus par défaut) avec les valeurs "power-line" ou "battery" selon que l’onduleur est sur secteur ou sur batterie. Cette variable globale permet le lancement de la scène ci-après qui : - lors d’un passage sur batterie, après le délai "delayBeforePowerOff" réalisera l’arrêt de la HC2 ; - lors du retour de l’alimentation, appuiera sur le bouton "WOL" du VD. Là aussi, le réveil se fera après un délai "delayBeforeWakeUp". Ces délais ont pour objet de s’affranchir de retours temporaires de tension. --[[ %% properties %% events %% globals UpsStatus --]] local globalVarName = "UpsStatus"; -- values "power-line" or "battery" local wolVdId = "337"; local wolVdBtnId = "11"; local delayBeforePowerOff = 5; -- minutes local delayBeforeWakeUp = 5; -- minutes local debug = true; function trace(text, color) color = color or "white"; if debug then fibaro:debug("<font color='"..color.."'>"..text.."</font>"); end end -- trace function tracerr(text, color) color = color or "red"; fibaro:debug("<font color='red'>ERROR! </font>".."<font color='"..color.."'>"..text.."</font>"); end -- tracerr function wakeOnLan() fibaro:call(wolVdId, "pressButton", wolVdBtnId); end -- wakeOnLan local sourceTrigger = fibaro:getSourceTrigger(); trace("sourceTrigger[type] = " .. sourceTrigger["type"], "deepskyblue"); if (sourceTrigger["type"] == "global") then if (sourceTrigger["name"] ~= globalVarName) then tracerr("unknown global "..sourceTrigger["name"].." exiting"); fibaro:abort(); end elseif (sourceTrigger["type"] == 'other') then trace("Scene triggered manually", "lightgreen"); -- inform user local upsStatus = fibaro:getGlobalValue(globalVarName); if (upsStatus ~= nil) then trace(globalVarName.." = "..upsStatus, "lightgreen"); fibaro:abort(); end else tracerr("unexpected trigger type ".. sourceTrigger["type"], "orange"); fibaro:abort(); end if (fibaro:countScenes() > 1) then trace("Script already running, exiting.", "green"); return; end local upsStatus = fibaro:getGlobalValue(globalVarName); if (upsStatus == nil) then tracerr("global "..globalVarName.." = nil"); fibaro:abort(); end if (upsStatus == "power-line") then local i = 0; for i = 1, (delayBeforeWakeUp * 6) do -- check every 10 seconds during delayBeforeWakeUp minutes fibaro:sleep(10 * 1000); -- ten seconds upsStatus = fibaro:getGlobalValue(globalVarName); if (upsStatus ~= "power-line") then trace("Still on battery, aborting", "orange"); fibaro:abort(); -- not stable end end -- Time to wake up devices trace("Waking up devices", "lightgreen"); wakeOnLan(); elseif (upsStatus == "battery") then local i = 0; for i = 1, (delayBeforePowerOff * 6) do -- check every 10 seconds during delayBeforePowerOff minutes fibaro:sleep(10*1000); -- ten seconds upsStatus = fibaro:getGlobalValue(globalVarName); if (upsStatus ~= "battery") then trace("Power is back, shut down aborted", "orange"); fibaro:abort(); end end -- shutdown HC2 gracefully trace("shutting down", "lightgreen"); fibaro:sleep(10*1000); HomeCenter.SystemService.shutdown(); else tracerr("global "..globalVarName.." unknown value: "..upsStatus); end Installation du VD : - Importer le VD, - Renseigner l’adresse IP du NAS connecté à l’onduleur, le port TCP 3493 est optionnel. - Les username et password présents dans le code du bouton Update fonctionnent pour un Synology. - Dans le code du bouton WOL, vous devrez préciser les adresses MAC des matériels que vous souhaitez réveiller. Il va de soi qu’ils devront être paramétrés pour accepter les "magic packets" afin d’être réveillés (pour les PC vérifier les paramètres de la carte réseau). - Pour les Nas Synology, il faut activer le WOL : "Panneau de configuration", "Matériel et alimentation", onglet "Général", cocher "Activer WOL sur le réseau local x". - Et ne pas oublier d’activer le serveur réseau UPS : "Panneau de configuration", "Matériel et alimentation", onglet "UPS", cocher "Activer la prise en "charge UPS" et "Activer le serveur réseau UPS"). - Enfin bien sûr, trouver une jolie icône pour les boutons du VD. Installation de la scène : - Préciser l’id du VD réalisant le WOL dans "wolVdId". - et le numéro du bouton à appuyer "wolVdBtnId". Pour ceux qui veulent personnaliser le VD, le code du bouton "Update" contient, à la fin, une description des principaux champs retournés par les serveurs UPS, Tous ne sont pas implémentés par Synology ou mon onduleur. Configuration utilisée pour les tests : - HC2 : 4.153 Beta - Onduleur : Eaton Ellipse PRO 1200 - NAS : Synology DS1010+ with DSM 5.2-5967 Update 6 Joyeux réveillon et bonne année à tous… UPS.vfib
  21. Bonjour à tous, Comme évoqué dans un des topics du firmware avec @Lazer, j'initie un début de liste des différentes API-LUA et API-HTTP apparues suite aux évolutions de firmware. Pour HC2 UNIQUEMENT Cette liste est loin d'être exhaustive, je me suis basé sur les changelog des firmwares et le site https://developer.fibaro.com/. Si vous en connaissez d'autres, n'hésitez pas (je pense à vous les MAITRES du LUA ) Les admins/modos, je vous laisse le soin de mettre le sujet où bon vous semble ;-), un sous-forum de HC2 peut-être. These calls can be used to start increasing or decreasing Multilevel Switches (like Dimmer 2, RGBW or Roller Shutter 2 modules) value. 'x' and 'y' are optional parameters, used to set respectively time frame in which change should be applied and starting level. 'stopLevelChange' stops previously send action. fibaro:call(ID, 'startLevelIncrease', x, y) fibaro:call(ID, 'startLevelDecrease', x, y) fibaro:call(ID, 'stopLevelChange') Call used to get table with IDs of devices that meet requirement specified by 'x'. fibaro:getDevicesId(x) -- Examples: print('All devices with parameter visible equal to "true" and enabled equal to "true":') ids = fibaro:getDevicesId({visible = true, enabled = true}) print(json.encode(ids)) print('ALl devices with energy interface:') ids = fibaro:getDevicesId({interfaces ={"energy"}}) print(json.encode(ids)) print('All devices with 'unit' property (no matter its value):') ids = fibaro:getDevicesId({properties = {unit="nil"}}) print(json.encode(ids)) Which will set given scene respectively to Automatic, Manual and Disabled mode. Any other value will set scene triggering mode to Automatic. fibaro:setSceneRunConfig(sceneID, runConfig) where runConfig is string that takes one of these three values: - TRIGGER_AND_MANUAL - MANUAL_ONLY - DISABLED fibaro:getSceneRunConfig(sceneID) returns currently set value. Old functions will keep backward compatibility and continue to work without change. - fibaro:setSceneEnabled(sceneID, enabled) - fibaro:isSceneEnabled(sceneID) Redémarrage Home Center et Arrêt Home Center HomeCenter.SystemService.reboot() et HomeCenter.SystemService.shutdown() Exemples : -- Reboot system HomeCenter.SystemService.reboot(); -- Shutdown system HomeCenter.SystemService.shutdown(); Popup service HomeCenter.PopupService.publish({title, subtitle, contentTitle, contentBody, img, type, buttons}) Parameters title - string containing text to be displayed as a pop-up window title (parameter required) subtitle - string containing text to be displayed as a pop-up window subtitle contentTitle - string containing text to be displayed as a pop-up content title contentBody - string containing text to be displayed as a pop-up content (parameter required) img - string containing path of an image to be displayed in the pop-up window (supported extensions: .jpg, .bmp, .png, .gif) type - notification type indicated with a colour, available types: 'Info' - blue (default) 'Success' - green 'Warning' - yellow 'Critical' - red buttons - array containing definitions of buttons to be displayed in the pop-up, single button definition must be an array containing: 'caption' - text displayed on the button 'sceneId' - scene id triggered after pushing the button Exemple 1 --[[ %% properties %% globals --]] -- variable containing path of Motion Sensor’s icon local imgUrl = 'http://www.fibaro.com/sites/all/themes/fibaro/images/motion- sensor/en/motion_sensor_manual.png' -- pop-up call HomeCenter.PopupService.publish({ -- title (required) title = 'No motion detected', -- subtitle(optional), e.g. time and date of the pop-up call subtitle = os.date("%I:%M:%S %p | %B %d, %Y"), -- content header (optional) contentTitle = 'No motion since last 15 minutes', -- content (required) contentBody = 'Should I run the scene "Night"?', -- notification image (assigned from the variable) img = imgUrl, -- type of the pop-up type = 'Success', -- buttons definition buttons = { { caption = 'Yes', sceneId = 0 }, { caption = 'No', sceneId = 0 } } }) NOTE Please note that the example scene must be triggered manually. It just illustrates the way of creating pop-ups. Execution of this scene will not affect any device status (sceneId = 0). NOTE Setting an action of the button to 'sceneId = 0' means that no action will be performed. NOTE Created pop-up is sent to each of users and mobile devices connected with the main controller. NOTE There is no maximum size of image displayed in the pop-up window. However, using too large file may result in long waiting times required for downloading the image. NOTE Pushing one of the buttons displayed in the pop-up window may only trigger another scene. Exemple 2 --[[ %% properties 3814 value %% globals --]] local startSource = fibaro:getSourceTrigger(); if ( ( tonumber(fibaro:getValue(3814, "value")) > 60 ) or startSource["type"] == "other" ) then HomeCenter.PopupService.publish({ title = 'Brightness level', subtitle = 'is too high', contentTitle = 'Dimmer', contentBody = 'Would you like to turn it off?', img = ' http://www.fibaro.com/images/eng/icon_osw.png', type = 'Critical', buttons = { { caption = 'Turn off', sceneId = 3228 }, { caption = 'No', sceneId = 0 }, { caption = 'Set to 100%', sceneId = 3229 } } }) end 1ère MAJ venant de @Steven concernant les fonctions fibaro : Telecharger le tar.gz http://updatehc2.fibaro.com/4.083/ , puis dans opt/fibaro ouvrir fibaroSceneAPI.lua Backups depuis une scène (Merci à @Nikko) --[[ %% properties %% events %% globals --]] local portable = 385 local message = 'Backup du '..os.date("%d/%m/%y - %HH%M") local url = 'http://127.0.0.1:11111/api/settings/backups' local httpClient = net.HTTPClient() httpClient:request(url , { success = function(response) if tonumber(response.status) == 201 then print("Backup Created at " .. os.date()) fibaro:call(portable,'sendPush', message .. ' effectué') else print("Error " .. response.status) fibaro:call(portable,'sendPush', 'Erreur lors de la création du Backup') end end, error = function(err) print('error = ' .. err) end, options = { method = 'POST', headers = { ["content-type"] = 'application/x-www-form-urlencoded;' }, data = 'action=create&description='..message } }); - Attention, si planification avec GEA, dans la nuit, ca relance le zwave ;-) GEA.add(true, 30, "", {{"Scenario", id}}) ASTUCES DIVERSES Affichage persistent du LOG des VDs et couleurs possibles (merci @Steven et @Berale, je ne suis que le Scrib) - Code à mettre dans le MAIN-LOOP fibaro:log("Test") fibaro:call(fibaro:getSelfId(), "setProperty", "logTemp", "TxtGray" ) - Couleurs possibles : .TxtGreen .TxtRed .TxtYellow .TxtBlue .TxtGray Exemple de @Nico --1er bouton VD local deviceId = fibaro:getSelfId(); fibaro:call(deviceId, "setProperty", "ui.Label1.value", "Repos") -- Second bouton du VD local deviceId = fibaro:getSelfId(); fibaro:call(deviceId, "setProperty", "ui.Label1.value", "Alarme") fibaro:call(deviceId, "setProperty", "ui.Label2.value", os.date("%m %B %Y - %H:%M:%S")) -- Mainloop pour affichage persistent du log local deviceId = fibaro:getSelfId(); local value = fibaro:getValue(deviceId, "ui.Label2.value") fibaro:log(value) fibaro:call(fibaro:getSelfId(), "setProperty", "logTemp", "TxtGray" ) Affichage persistent HORS MAIN-LOOP fibaro:call(fibaro:getSelfId(), "setProperty", "log", "blablabla" ) MISE à jour suite à la version stable 4.10 : Merci à @Steven fibaro:callGroupAction(action, filters) { "filter": "hasProperty", "value": ["configured", "dead", "model"] } { "filter": "interface", "value": ["Z-Wave", "levelChange"] } { "filter": "parentId", "value": [664] } { "filter": "type", "value": ["com.fibaro.multilevelSwitch"] } { "filter": "roomID", "value": [2, 3] } { "filter": "baseType", "value": ["com.fibaro.binarySwitch"] } { "filter": "isTypeOf", "value": ["com.fibaro.binarySwitch"] } { "filter": "isPlugin", "value": [true] } { "filter": "propertyEquals", "value": [ { "propertyName": "configured", "propertyValue": [true] }, { "propertyName": "dead", "propertyValue": [false] }, { "propertyName": "deviceIcon", "propertyValue": [15] }, { "propertyName": "deviceControlType", "propertyValue": [15,20,25] } ] } { "filter": "deviceID", "value": [55,120,902] } Parameters action: action name filters: filters object Returned values devices: array of device id's filtered by given rule. Code example --[[ %% properties %% events %% globals --]] local data = { args = { 1 }, filters = { { filter = "roomID", value = { 2 } }, { filter = "type", value = { "com.fibaro.motionSensor" } } } } local devices = fibaro:callGroupAction("setArmed", data) for k,v in ipairs(devices) do print (v) end HomeCenter.NotificationService.publish(payload) Name Function name must be always the same: HomeCenter.NotificationService.publish Application Publishes notification. Parameters request: request object Code example HomeCenter.NotificationService.publish({ type = "GenericDeviceNotification", priority = "warning", data = { deviceId = 2643, title = "foo", text = "bar" } }) HomeCenter.NotificationService.update(id, payload) Name Function name must be always the same: HomeCenter.NotificationService.update Application Updates notification. Parameters id: notification id request: request object Code example HomeCenter.NotificationService.update(7, { canBeDeleted = true, data = { title = "udapted foo", text = "udapted bar" } }) HomeCenter.NotificationService.remove(id) Name Function name must be always the same: HomeCenter.NotificationService.remove Application Removes notification. Parameters id: notification id Code example HomeCenter.NotificationService.remove(7) Info du jour concernant le centre de notification de la HC2, merci @tinman, c'est ici : - Pour utiliser le centre de notification avec des infos "perso" : Tester et aprouvé en 4.10 function doNotify(text, devid) api.post('/notificationCenter', { type = 'GenericDeviceNotification', canBeDeleted = true, -- priority can be -- alert -- red alert sign -- warning -- yellow warning sign -- info -- same as warning priority = 'alert', data = { deviceId = devid, text = text, title = text } }) end doNotify('Test notif HC2', 12 )
  22. mipa

    Scene Lua sunset

    Hello à tous, J'ai écrit ce bout de code qui fonctionne.... --[[ %% properties 74 value %% globals --]] local DetecteurMouvement DetecteurMouvement = fibaro:getValue(74, 'value' ) if (DetecteurMouvement == '1') then fibaro:call(67, 'turnOn') end J'aimerais bien y ajouter la condition active toi uniquement si c'est entre le coucher du soleil et le lever du soleil et la condition éteint toi dès qu'il y n'a plus de mouvement après 3 minutes Quelqu'un pourrait me dire comment l'écrire ? J'ai essayé de pleins de manière différentes, mais je ne suis pas arriver. Actuellement, ma lampe extérieur s'allume de jour également, ce qui m'est inutile... Merci pour votre précieuse aide Mipa
  23. Lazer

    Code LUA Snippet

    Ce sujet épinglé en haut de page est une référence de bout de code "snipet" partagé par les utilisateurs. Les règles à respecter sont les suivantes : 1 message = 1 extrait de code aucune discussion, aucun support, les "mauvais" messages seront effacés formalisme du code : on partage le code LUA, avec en commentaire les arguments et le retour attendu : --[[ ================================================================== Encodage / Décodage en base 64 ================================================================== Description : Utilitaire pour l'encodage / décodage en base 64 Utilisé fréquement pour encoder les login:password ================================================================== Support : [X] Scénario [ ] VD Firmware requis : 4.x Auteur : Trouvé sur le web (nom des fonctions adaptées pour plus de lisibilité) ------------------------------------------------------------------ Functions : encode : encode une chaîne de caractère en base64 decode : décode une chaîne de caractère précédement encodée ================================================================== --]] -- --------------------------------------------------------------- -- function : encode -- --------------------------------------------------------------- -- paramètres : -- data : chaîne à encodé -- retour : chaîne encodée en base64 -- --------------------------------------------------------------- function encode(data) -- ... end -- --------------------------------------------------------------- -- function : decode -- --------------------------------------------------------------- -- paramètres : -- data : chaîne encodée -- retour : chaîne en claire -- --------------------------------------------------------------- function decode(data) -- ... end Et on donne un exemple d'utilisation : -- Exemple d'encodage print(encode('domotique.fibaro@gmail.com:motdepasse')) -- Résuitat [DEBUG] 17:02:52: ZG9tb3RpcXVlLmZpYmFyb0BnbWFpbC5jb206bW90ZGVwYXNzZQ== -- Exemple de décodage print(decode('ZG9tb3RpcXVlLmZpYmFyb0BnbWFpbC5jb206bW90ZGVwYXNzZQ==')) -- Résultat dans le Debug [DEBUG] 17:02:52: domotique.fibaro@gmail.com:motdepasse
  24. mprinfo

    LUA - Arreter ou Redémarrer sa HC2

    Arrêter ou Redémarrer sa HC2 Voici les commandes lua pour arrêter ou redémarrer sa box HC2 Ne fonctionne que dans une scène v4.110 >= Firmware < 4.500 HomeCenter.SystemService.reboot() Nom Le nom de la fonction doit toujours être identique : HomeCenter.SystemService.reboot() Exigences Fibaro Home Center 2 updated to 4.081 software version or higher Application Redémarre le système. Paramètres Aucun Valeurs retournées Aucun Exemple de code : -- Redémarrer le système HomeCenter.SystemService.reboot(); HomeCenter.SystemService.shutdown() Nom Le nom de la fonction doit toujours être identique: HomeCenter.SystemService.shutdown() Exigences Fibaro Home Center 2 version 4.081 ou plus Application Arrêt du système. Paramètres Aucun Valeurs retournées Aucun Exemple de code -- Shutdown system HomeCenter.SystemService.shutdown();
  25. Nikko

    Backup Via Scene Lua

    Bonjour, Voici un résumé sur la réalisation/suppression de backups via des scènes en Lua. La création/suppression de backup s'effectue en temps normal sur l'interface du HomeCenter à la page Diagnostiques/Sauvegarde et restauration. Le code donné dons les 2 scènes n'est pas des plus optimisé; cela constitue juste une base. EDIT (03/12/2016): Mise à jour avec l'api pour les versions >=4.101; voir plus loin: (https://www.domotique-fibaro.fr/topic/8641-backup-via-scene-lua/?do=findComment&comment=146362) Les Commandes de l'API La récupération au format JSON de la liste des backups se fait à l'addresse http://HC2/api/settings/backups Pour Créer un Backup on utilise l'addresse http://HC2/api/settings/backups avec une requète de type en POST avec les paramètres action et description. Pour Supprimer un Backup, on utilise l'addresse http://HC2/api/settings/backups?id=xx (où xx est le numéro de backup). La requète est de type DELETE avec comme paramètre id=xx => Comme les urls de l'api vont être appelées depuis des scènes lua, l'ip de la box utilisée sera 127.0.0.1 (port 11111) => En cas d'appel sur l'ip LAN de la box (Ex: http://192.168.0.100/api/settings/backups) , il faudra en plus transmettre l'authentification dans la requète. Attention: Lors de la création de Backup, "tout le reste" est suspendu; de même après que le backup soit effectué, le moteur Z-Wave et d'autres services redémarrent. Donc en cas de planification , privilégier la nuit, là ou l'activité ZWave, scénarios, est faible/inexistante. Scène de création d'un backup Exemple de Scène de création d'un Backup, avec notification vers portable: --[[ %% properties %% events %% globals --]] -- ID des mobiles,tablettes pour notification local portable = { 385,378 } -- Message Descriptif du Backup local descriptif = 'Backup du '..os.date("%d/%m/%y - %HH%M") function sendPush(message) if #portable > 0 then for _,v in ipairs(portable) do fibaro:call(v,'sendPush', message) end end end local url = 'http://127.0.0.1:11111/api/settings/backups' local httpClient = net.HTTPClient() httpClient:request(url , { success = function(response) if tonumber(response.status) == 201 then print("Backup Created at " .. os.date()) sendPush(descriptif .. ' effectué') else print("Error " .. response.status) sendPush('Erreur lors de la création du Backup') end end, error = function(err) print('error = ' .. err) end, options = { method = 'POST', headers = { ["content-type"] = 'application/x-www-form-urlencoded;' }, data = 'action=create&description='..descriptif } }); Depuis la page des backups, on peut vérifier que la scène fonctionne: Pour les utilisateurs de GEA, on peut déclencher cette sauvegarde le 1er samedi de chaque mois par exemple: -- Fonction déterminant si nous sommes le 1er samedi du mois function isFirstSaturday() local t = os.date('*t') return ( t['day'] < 8 and t['wday'] == 7 ) end -- Backup le 1er samedi du mois GEA.add({"Function",function() return isFirstSaturday() end} , 30 , "Backup Mensuel du HC2" , {{"Time","01:00","01:01"},{"Scenario", 12}}) . Scène de suppression d'un backup Exemple de Scene Lua pour réaliser la suppression du backup le plus ancien: --[[ %% properties %% events %% globals --]] -- Flag dryrun; Si true, la requete sur api pour effacer le backup n'est pas effectuée local dryrun = true -- Récupération de la list des backups local backups = api.get('/settings/backups') -- Vérification de présence Backup if (backups and type(backups == 'table') and #backups > 0) then if #backups > 1 then print(#backups .. ' Backups présents') else print('1 Backup présent') end for i in ipairs(backups) do fibaro:debug('ID: '..backups[i]['id']..' | TIMESTAMP: '..backups[i]['timestamp']..' | DESCRIPTION: '..backups[i]['description']) end else print('Pas de backup ou erreur lors de la récupération de la liste') fibaro:abort() end -- Pour chaque Backup on stock le timestamp de la date de réalisation dans une table -- On classe ensuite les timestamps par ordre croissant local timestamp = {} for i in ipairs(backups) do table.insert(timestamp, backups[i]['timestamp']) end table.sort(timestamp) -- Le 1er timestamp de la table est le plus petit donc le plus ancien en epochtime -- Dans la table de backup on recherche le backup ayant ce timestamp local id = false for i in ipairs(backups) do if (tonumber(backups[i]['timestamp']) == tonumber(timestamp[1])) then id = backups[i]['id'] end end if id then print("ID du backup le plus ancien: "..id) else print("Erreur lors de la récupération de l'ID") fibaro:abort() end -- Requete via API pour effacer le backup le plus ancien if not dryrun then local url = 'http://127.0.0.1:11111/api/settings/backups?id='..id local httpClient = net.HTTPClient() httpClient:request(url , { success = function(response) if tonumber(response.status) == 200 then print("Backup deleted at " .. os.date()) else print("Error " .. response.status) end end, error = function(err) print('error = ' .. err) end, options = { method = 'DELETE', headers = { ["content-type"] = 'application/x-www-form-urlencoded;' }, data = 'id='..id } }); end . Cette Scène produit le debug suivant: Nicolas
×