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
    • Nouveau ? Présentez-vous
    • Le bistrot
    • Mon installation domotique
    • Annonces et suggestions
  • La Home Center et ses périphériques
    • La Home Center pour les nuls
    • HC 2 & Lite
    • HC 3
    • Modules Fibaro
    • Modules Z-wave
    • Périphériques et matériels autres
    • Plugins
    • Quick App
    • Multimédia (audio, vidéo ...)
    • Chauffage et Energie
    • Actionneurs & Ouvrants (Portail, volets, piscines, ...)
    • Eclairage
    • Applications Smartphones et Tablettes
  • Autres solutions domotiques
    • Box / Logiciel
    • Modules Nice (433 & 866 MHz)
    • Modules Zigbee
    • GCE Electronics
    • Modules Bluetooth Low Energy
  • Objets connectés
    • Les Assistants Vocaux
    • Netatmo
    • Philips Hue
    • DIY (Do It Yoursel)
  • Sécurité
    • Alarmes
    • Caméras
    • Portiers
    • Serrures
  • Informatique / Réseau
    • Tutoriels
    • Matériels Réseaux
    • Matériels Informatique
    • NAS
    • Virtualisation
  • 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

103 résultats trouvés

  1. Bonjour, Est ce possible de modifier les propriétés jpgPath et mjpgPath d'une caméra IP depuis un virtual device ? Voici le code : local snapshot = fibaro:getGlobalValue('path-snapshot'); fibaro:call(IDCAMERA, "setProperty", "properties.jpgPath", "snapshots/" .. snapshot) fibaro:call(IDCAMERA, "setProperty", "properties.mjpgPath", "snapshots/" .. snapshot Ces deux propriétés correspondent aux champs à côté des flèches vertes : Je me suis basé sur le retour de l'API REST /api/devices qui renvoie ce flux concernant la caméra :
  2. 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
  3. 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...
  4. C'est un complément à ceci : Précis Sur Les Variables Locales/globales Je remercie STEVEN de me laisser le choix des couleurs pour ses tutos Pour la variable avec une portée globale et les passages de paramètres, voici une explication et un petit script pour bien comprendre son fonctionnement. Notion de base sur le passage de paramètre : Les paramètres d'une fonction peuvent être de 2 manières différentes (par référence ou par valeur) : - référence : la fonction reçoit l'adresse mémoire du paramètre. Un changement de valeur affectera TOUT le script - valeur : on reçoit la valeur du paramètre Ce dernier est copié dans une nouvelle référence propre à la fonction. Un changement de valeur n'affectera que la fonction. en LUA, chaque passage de paramètre ce fait en "valeur" SAUF pour les tables (c'est comme en français, il y a toujours une exception). Donc si je fais : function maFonction(var) print(var) end maFonction("Coucou") J'envoi à ma fonction la valeur, soit une copie de "Coucou". Si a l'intérieur de maFonction je modifie la valeur, cela n'aura un impact QU'AU sein de maFonction. maFonction va donc créer une nouvelle variable "var" dans laquelle il va copier la valeur "Coucou" Si je fais : local coucou = "Coucou" function maFonction() print(coucou) end et que dans maFonction je modifie coucou, alors coucou va être modifié pour tout le script puisque la modification aura eu lieu sur sa référence. En bref, Si on est au sein d'un script ou d'une fonction, nous travaillons sur les références. Si nous passons les informations en tant que paramètre, nous travaillons sur une valeur. local coucou = "Coucou" function maFonction(variable) print(coucou) print(variable) end maFonction("Coucou") Plus compliqué car la référence coucou est envoyée en paramètre et devient donc une copie de valeur. local coucou = "Coucou" function maFonction(variable1, variable2) print(variable1) print(variable2) end maFonction("Coucou", coucou Allez un bon script vaut mieux qu'un long discours : function scope1() -- la variable var n'existe pas print(var) --- nil (variable inexistante) end function scope2(var) -- la variable est passée en paramètres donc visible -- bien que déclarée après -- En sortant de cette méthode, var aura repris ça valeur -- initial car elle a été passée en paramètre soit par -- valeur print(var .. " dans scope2()") -- ______ var = "Scope2" print(var) -- Scope2 end local var = "-=init=-" function scope3() -- la variable est connue car déclarée avant. Elle est assignable -- par contre, si on déclare une variable du même nom au sein -- de cette même function, en sortant la variable aura repris sa valeur "Scope3" print(var .. " dans scope3()") var = "Scope3" print(var) local var = "Byebye" print(var) end function exception(unTableau) -- Les tableaux sont toujours traité comme une référence unTableau[1] = "Et voilà " end print(var .. " avant tout") scope1() print(var .. " après scope1()") scope2(var) print(var .. " après scope2()") scope3() print(var .. " après scope3()") -- Exception avec les table qui sont toujours envoyé en tant que référence. local table = {[1]="Humm"} print(table[1]) exception(table) print(table[1]) Debug : [DEBUG] 11:39:22: -=init=- avant tout [DEBUG] 11:39:22: nil [DEBUG] 11:39:22: --init=- après scope1() [DEBUG] 11:39:22: --init=- dans scope2() [DEBUG] 11:39:22: Scope2 [DEBUG] 11:39:22: -=init=- après scope2() [DEBUG] 11:39:22: -=init=- dans scope3() [DEBUG] 11:39:22: Scope3 [DEBUG] 11:39:22: Byebye [DEBUG] 11:39:22: Scope3 après scope3() [DEBUG] 11:39:22: Humm [DEBUG] 11:39:22: Et voilà
  5. Il y a 3 types d'optimisation. la mémoire, le temps processeur le temps du développeur. Une bonne application prend en compte ces 3 critères en essayant de faire un bon compromis entre les 3. Voici donc une petite analyse sur votre code ... attention, je suis volontairement très très critique juste pour essayer d'aider. Perso, la plus part de mon code n'est pas optimiser ainsi, voir pas du tout . . Optimisation mémoire Chaque variable déclarée pend une infime place en mémoire (son adresse) donc si on a pas besoin de la réutiliser ou de la maintenir ... on en fait pas Une variable utilisée qu'une seule fois ne sert donc à rien : exemple local message = string.format("La box a démarré le %s a %s", os.date("%d/%m/%Y"), os.date("%R")) EnvoiPush(message) On fait directement : EnvoiPush(string.format("La box a démarré le %s a %s", os.date("%d/%m/%Y"), os.date("%R"))) . . Optimisation temps processeur La démarche a déjà été faite .. bravo. En effet, certaine opération prenne du temps a être exécutée, il faut donc éviter de demander 2 fois le même calcul pour rien. Exemple : if ( os.date("%H:%M", os.time())== lever ) or ( os.date("%H:%M", os.time()) == coucher ) then On voit bien qu'on demande au processeur de calculer 2 fois l'heure actuelle alors que ce qui a été fait local osHeure = os.date("%H:%M", os.time()) if ( osHeure == lever ) or ( osHeure == coucher ) then est bien moins coà»teux puisque nous divisons simplement pas 2 le temps processeur. Bon ok, on passe de 0.00002 sec à 0.00001 sec Mais c'est un exemple. Optimisation développeur Moins il y a de code a maintenir mieux c'est. Donc vu que ceci : if (heure >= lever) and (heure < coucher) then valeur = "Jour" end revient au même que ceci (dans ce contexte) if ( OsHeure == Lever ) then Valeur = "Jour" else Valeur = "Nuit" end On extrait tout cela et on en fait une méthode (function) : function traitement(lever, coucher, heure) local valeur = "Nuit" -- test si on est le jour ou la nuit if (heure >= lever) and (heure < coucher) then valeur = "Jour" end ... end . . Optimisation bonus ... optimisation pour l'utilisateur On remonte tout en début du code, les variables, traitements que l'utilisateurs doit modifier afin que ce dernier n'aie pas a chercher dans le code la ligne X ou Y. Donc on met ce ci tout en haut : local NomVG = "Jour_Nuit" local IdTel = 181 On obtient donc ceci : --[[ %% autostart --]] local NomVG = "Jour_Nuit" local IdTel = 181 ---------------------------------------------------------------------- -- 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 --------------------------------------------------- -- Mise a jour d'une variable global -- --------------------------------------------------- function UpdateVG(Valeur) 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 else fibaro:debug("VariableGlobale = "..NomVG.." - Valeur = "..Valeur) fibaro:setGlobal(NomVG, Valeur); end end --------------------------------------------------- -- Vérification de l'heure et mise à jour -- -- de la variable si necessaire -- --------------------------------------------------- function traitement(lever, coucher, heure) local valeur = "Nuit" -- test si on est le jour ou la nuit if (heure >= lever) and (heure < coucher) then valeur = "Jour" end UpdateVG(nuit) -- mise a jour de la VG Jour_Nuit end -- ======================================= -- Début du code -- ======================================= ---------------------------------------------------------------------- -- Controle si 1 Scéne et déjà en cours -- ---------------------------------------------------------------------- local NbreScene = fibaro:countScenes() fibaro:debug("Nombre de scéne : "..NbreScene) if (NbreScene ~= 1) then; fibaro:abort(); end ---------------------------------------------------------------------- -- Mise a jour de la variable VG Jour_Nuit au Démarrage de la Box -- -- Ou lors de la sauvegarde de la scéne -- ---------------------------------------------------------------------- EnvoiPush(string.format("La box a démarré le %s a %s", os.date("%d/%m/%Y"), os.date("%R"))) traitement(fibaro:getValue(1, "sunriseHour"), fibaro:getValue(1, "sunsetHour"), os.date("%H:%M")) ---------------------------------------------------------------------- -- Test toute les minutes pour savoir si c'est jour ou nuit -- ---------------------------------------------------------------------- while true do local osHeure = os.date("%H:%M", os.time()) local lever = fibaro:getValue(1, "sunriseHour") local coucher = fibaro:getValue(1, "sunsetHour") if ( osHeure == lever ) or ( osHeure == coucher ) then traitement(lever, coucher, osHeure) end fibaro:debug(string.format("Lever Soleil : %s - Coucher Soleil : %s", lever, coucher)) fibaro:sleep(60*1000); end Maintenant, vous pouvez oublier tout ces bons préceptes car quand on regarde le code des professionnels, on voit bien que la théorie fait bien souvent place à la fatigue cérébrale et que 90% du code ne respecte pas le moindre petit de ces préceptes. Garbage collector Un gabagge collector n'est-il pas le truc inventé pour palier au mauvais développement ? ... Je plaisante . Il y en a un, mais comme toujours, moins la mémoire est sollicitée, moins le garbage collector fonctionne, meilleures sont les performances. Il ne faut pas oublier que lorsque le garbage collector fait son nettoyage, il prend énormément de ressources. Je travaille sur Java, et c'est horrible de voir que plus on améliore le garbage collector, plus les développeurs ne font pas attention. C'est le serpent qui se mord la queue. "Un garbage collector est coà»teux en performance, bien que dans la plus part des cas, son utilisation permet d'augmenter les performances globales d'une application" ... et si, un jour, on se mettait autour d'une table et qu'on se disait : - Il y a 25 ans, on faisait attention au nombre de ligne de code - Il y a 20 ans, on faisait attention à l'utilisation de la mémoire - Il y a 10 ans, on faisait attention à la place disque - Aujourd'hui, on se fout de tout alors on a inventé la "défragmentation" Pour les curieux : Ramasse-miettes (Garbage Collector) . . . Librairies Oui LUA permet les librairies, mais pas sur la Fibaro ou cette possibilité est désactivée. Le mot clé, de mémoire est : require . Merci Steven pour ces explications. Lien utiles pour la programmation lua : lua.org (Site Officiel Lua Anglais) WX LUA.fr Developer fibaro/ (Anglais) Programmation LUA Structures de Base LUA pour les débutants Introduction à la Programmation LUA Les bases de la programmation avec lua
  6. Suite a une idée de Steven : http://www.domotique-fibaro.fr/index.php/topic/4218-sunrisehour-sunsethour-osdate-et-variable-jour-nuit/page-3 Encore une question est ce que quelq'un a essayé ? --[[ %% propeties 1 sunsetHour --]] Perso, je n'ai jamais fait le test mais la question me semble intéressante Voici un début de réponse : On ne peut pas utilisé sunsetHour ou sunriseHour comme déclencheur pour savoir si on est le jour ou la nuit La scène ce déclenche toute les 30 mn après sa sauvegarde A priori la box met a jour sunsetHour et sunriseHour toute les 30 mn (mais pourquoi après la sauvegarde de la scène ?) voici la scène que j'ai essayé j'ai fais très simple --[[ %% properties 1 sunsetHour 1 sunriseHour %% globals --]] print (os.date("%H:%M")) local IdTel = 181 local heure = os.date("%R"); local date = os.date("%d/%m/%Y"); local Message = "Mise a jour de sunrise et sunset " ..date .." à " ..heure fibaro:call(IdTel, "sendPush", Message) Grâce au push mon tel me surveille la scène. Voici le debug
  7. Vu que j'ai eu pas mal de J'aime pour mon dernier tuto (Je suis en manque d'affection ) Cela veux dire que vous êtes demandeur et ça me motive à en faire d'autres http://www.domotique-fibaro.fr/index.php/forum/83-la-home-center-pour-les-nuls/ Nous somme nombreux sur ce forum si 10% des membres font un tuto ça serait super 1er Partie est plutôt simple. 2eme Partie et plus complexe mais facile a comprendre. Je vais vous expliquez comment ce servir du Slider d'un module Virtuel 1er Partie Il faut crée un module virtuel voici comment faire en image Il faut copier ce code dans le slider local ID_VD = fibaro:getSelfId() -- Recupere l'id du module Virtuel local Slider = fibaro:get(ID_VD,"ui.Slider1.value") fibaro:debug(Slider) -- Ecriture de la valeur du slider dans l'etiquette Label1 fibaro:call(ID_VD, "setProperty", "ui.Label1.value", Slider) On sauvegarde et on revient sur le slider Pour Debuger le code on fait comme cela fibaro:debug() affiche des messages dans le debug ex : fibaro:debug("Coucou") ou fibaro:debug("Valeur du slider : " ..Slider) On appui sur Démarrer et on bouge le slider grace a fibaro:debug() on peut voir la valeur de la variable local Slider 2eme Partie Nous venons de voir comment utiliser le slider On aperçois que les valeurs vont de 0 à 100 Je vais donc vous montrer comment on peut avoir d'autre valeur que 0 à 100 il est impossible pour le moment de modifier le slider au niveau de l'affichage 0 -100 C'est pour cela que nous allons utiliser une étiquette pour afficher la valeur Il faut savoir que le slider à 101 position de 0 à 100 si on veut de 0 à 50 on va avoir (0 - 0,5 - 1 - 1,5 etc..) Si vous voulez un nombre entier il faut utilisez math.floor() Voici l'explication donner par Gregory à Moicphil -- Il te faut une fonction de mapping. function map_range( a1, a2, b1, b2, s ) return b1 + (s-a1)*(b2-b1)/(a2-a1) end -- à‡a permet de mapper une valeur s du range a1, a2 dans le range b1, b2. -- Ici s est la valeur de ton curseur, a1=0, a2=100 -- et à toi de définir les températures min et Max (b1 et b2) que tu souhaites. -- à‡a permet de mapper une valeur s du range a1, a2 dans le range b1, b2. Ici s est la valeur -- de ton curseur, a1=0, a2=100 et à toi de définir les températures min et Max (b1 et b2) -- que tu souhaites. la formule mathématique a été trouver sur le Site Rosetta Code : http://rosettacode.org/wiki/Map_range C'est l'un des sites préféré de notre amis KriKroff Je vais vous donnez un exemple pour un slider de 30 à 80 -- Permet de récuperer la valeur slider function map_range( a1, a2, b1, b2, s ) return b1 + (s-a1)*(b2-b1)/(a2-a1) end local V_Slider = map_range(0, 100, 30, 80, _sliderValue_ ); -- Permet d'avoir un nombres entier math.floor() local Slider = math.floor(V_Slider) Pour modifier la valeur d'un slider directement depuis une URL, voici la syntaxe : (By Steven) http://<URL_HC2>/api/callAction?deviceID=<ID_Module_virtuel>&name=setSlider&arg1=<Position_du_slider>&arg2=<Valeur> URL_HC2 = L'url de votre HC2 ... soit son adresses IP, soit www.mondomaine.com ID_Module_virtuel = L'identifiant du module virtuel Position_du_slider = La position du slider dans le module virtuel. en comptant de haut en bas et de gauche à droite le nombre de label, bouton, slider dans le module virtuel Valeur = la valeur souhaitée .. depuis la v 4.x la valeur DOIT être un chiffre entier. Exemple http://192.168.1.1:8...&arg1=4&arg2=10
  8. royassas

    Hc2 Et Lifx

    J'ai essayé de connecter mes ampoules Lifx avec le HC2. Maintenant ça fonctionne! J'ai trouvé beaucoup d'informations sur le sujet de http requests dans les pages de ce forum. Ici vous trouvez comment je l'ai fait: Il faut que vous utilisez la nouvelle version de firmware sur les ampoules Lifx (version 2.0) - on peut fair l'update dans l'app sur Android. Registrez vous sur https://cloud.lifx.com, cherche les "settings" et enregistrez un nouveau "token" pour l'API. Vous trouvez tous les informations sur l'API qui existent sur http://developer.lifx.com/ Créez une nouvelle scène en HC2 et mettez par example: local http = net.HTTPClient() http:request('https://api.lifx.com/v1beta1/lights/group%3ASchlafzimmer/power.json?selector=group%3ASchlafzimmer&state=on', { options = { method = 'PUT', headers = { ['Authorization'] = 'Basic Y2YxM2FjODJkZDcyYjRmZmZiYTAwOGQ4ZDUxMTE2ZWQ4ZTdlMTE0ZTJjYWU4YWMzZjI5NzUwMTEyMjBmMTk0Nzo=' } }, success = function(response) fibaro:debug(response.data) end, error = function(err) fibaro:debug("Error: " ..err) end }) Adaptes votre code LUA. Pour l'authorisation: Prenez votre token du cloud lifx, ajoutez un ":" et chiffrez le en base64 (https://www.base64encode.org/) C'est tout, bonne chance
  9. pinou

    Zibasegateway Pour Hc2

    Après le calendrier Google, je me suis attaqué maintenant à ma Zibase. En effet, j'ai commencé la domotique il y a quelques temps de ça, avec une Zibase. Depuis elle ne m'a jamais quitté. Même si aujourd'hui j'ai migré (pratiquement) tous mes modules zwave sous la Home center, j'utilise toujours ma Zibase pour les devices Oregon et EnOcean essentiellement. J'ai vu passer différentes solutions permettant de récupérer les infos/valeurs de ces modules au sein de la HC2. Ceci dit, rien de satisfaisant pour moi, car les solutions sur lesquelles je suis tombé font essentiellement du pooling vers la Zibase, or j'ai besoin de temps réel. Pas pour les relevés des sondes Oregon mais pour les détecteur d'ouverture EnOcean. Je me suis donc amusé à trouver une autre solution répondant à mon besoin. Le principe Le principe est assez simple : plutôt que d'aller voir de façon périodique l'état des devices de la Zibase, je me suis dit qu'il suffit en fait "d'écouter" ce que broadcast la Zibase et de chopper dans ce flux ce qui m'interesse. Il suffit alors de passer par l'api de Fibaro pour mettre à jour les variables correspondantes dans ma HC2. Dans le détail... Il s'agit d'un script PHP que j'ai hébergé sur mon syno (mais un RPI ou toute autre machine pouvant faire tourner du PHP 24h/24 suffit). Pas besoin de configurer un serveur web puisque le script PHP tourne en mode CLI (lancé automatiquement au démarrage du syno dans mon cas). Lors du lancement du script, ce dernier va s'abonner aux messages de la Zibase. Il va donc recevoir un flux de ce type a chaque fois qu'un device remonte une info vers la Zibase : Received radio ID (<rf>433Mhz Oregon</rf> Noise=<noise>2420</noise> Level=<lev>3.4</lev>/5 <dev>Temp-Hygro</dev> Ch=<ch>2</ch> T=<tem>+18.4</tem>C (+65.1F) Humidity=<hum>45</hum>% Batt=<bat>Ok</bat>): <id>OS439218434</id> On décode alors ces données pour pouvoir mettre à jour la ou les variables associées au niveau de la HC2. Un des points délicats concerne la configuration du fichier permettant de mettre en place ce décodage. Le fichier de configuration des messages de la Zibase Ce fichier est donc un des éléments essentiels de cette solution. Il s'agit d'un fichier json (pour la facilité de lecture et construction). Il y a 2 parties dans ce fichier : Un premier élément de configuration permettant de définir les différents protocoles radio qui seront reconnus par le script. On vient dire ici, par protocol (Oregon, EnOcean, ...) et par type de device (Détecteurs, sondes température, etc.) quelles sont les données qu'il faut récupérer dans le flux correspondant. Un second élément permet de définir pour chaque device reconnu (par son ID Radio) quelles sont les variables qui seront mise a jour avec quelles données. On indiquera également si cette mise a jour doit se faire à chaque remontée d'info (exemple du détecteur), ou seulement si la donnée à été modifiée depuis la dernière mise à jour (afin de ne pas saturer la HC2 de requêtes inutiles). Autant vous prévenir tout de suite, cette configuration est chiante à souhait à mettre en place, mais bon j'ai pas trouvé plus simple et/ou plus automatisé. Ceci dit, une fois au point, on y touche plus ! Le script PHP Ce dernier vient avec un script contenant les variables de configuration dont les valeurs sont à modifier en fonction de votre installation. C'est assez explicite, je ne vais pas m'attarder dessus. Côté Home center Alors ici, il y a quelques petites choses à faire. Le plus gros problème est que je passe par l'api HTTP pour mettre à jour les variables. Or par ce biais, même si la mise à jour fonctionne, elle ne permet pas de déclencher les scènes et autres scripts qui seraient basés sur ces dernières (limitation de Fibaro ... va comprendre pourquoi ...). Du coup, j'ai implémenté la solution proposée par Jojo dans un autre post qui consiste à passer par l'intermédiaire d'un bouton de module virtuel qui vient mettre à jour la variable avec sa valeur. Bon ne pouvant pas m'amuser à créer un bouton pour chaque valeur discrète possible et imaginable, le script PHP va mettre à jour 2 variables permettant de stocker le nom de la variable finale à mettre à jour et sa valeur(1). On va ensuite déclencher le module virtuel (2) qui va récupérer ces données (3) et mettre à jour à son tour la variable désirée avec la bonne valeur (4). Et voilà , les scènes basées sur cette variable fonctionnent du coup (5) ! Je ne sais pas si vous me suivez toujours dans mon raisonnement (un peu tordu), j'essaye de vous faire un p'tit dessin pour illustrer la chose : script PHP ---------+----(1)--->zibaze_variable = "anemometre" <-. +----(1)--->zibaze_value = "3.2" <-----------+ | (3) `----(2)--->VModuleID = 99, PushButton n°1 --+ | (4) | v anemometre = "3.2" | (5) | v scene "FermetureStore" start Installation Du coup l'installation de tout ce bordel s'effectue en plusieurs étapes : A/ Pour la partie PHP il faut 1) Poser les différents fichiers dans un espace sur votre serveur et connectez vous dessus (ssh, telnet, ...) 2) Modifiez le fichier zibaseGateway_config.php et zibaseGateway.php afin d'initialiser les variables avec les bonnes valeurs (partout ou il y a des XXXX vous devez configurer en fonction de votre installation) 3) Assurez vous que la variable verbose soit positionnée à LogType::CONSOLE dans un premier temps (une fois que tout sera au point vous la changerez comme bon vous semble) 4) Lancez le script à la main php zibaseGateway.php 5) Si tout va bien, les messages reçus de la Zibase devraient s'afficher à l'écran. A vous de jouer maintenant pour mettre à jour le fichier zibaseMessages.json en conséquence. 6) Arrêtez les script (CTRL+c) et relancez le pour vérifier que la configuration est bien prise en compte correctement. B/ On passe maintenant au niveau de la Home Center 7) Déclarez les différentes variables que vous avez déclaré au point 5) 8) Déclarez les 2 variables Zibase_variable et Zibase_value (cf. fichier de configuration zibaseGateway_config.php) 9) Importez le module virtuel C/ Le test final 10) Relancez le script et vérifiez que les variables de votre HC soient bien mises à jour. Si ce n'est pas le cas, reprenez depuis le point 2) : soit vous n'avez pas initialisé vos variables correctement, soit le fichier json ne reflète pas la réalité... D/ Mode automatique Etant nouveau dans le monde des syno, j'avoue avoir un poil galéré pour que mon script php se lance automatiquement au démarrage du NAS. En gros il faut transformer ce script en deamon. 11) Tout d'abord j'ai modifié la config PHP au niveau de l'interface d'admin du NAS : Panneau de configuration > Services web > Paramètres PHP : cliquez sur personnaliser PHP openbase_dir et rajouter les chemins vers vos repertoires d'installation. Sans cette config vous risquez d'avoir des warnings/erreurs PHP lors de l'exécution. 12) J'ai créé un script SH qui permet de "deamonsier" le script PHP. Il suffit de faire un lien de ce script dans le bon répertoire : ln -s S99zibase.sh /usr/syno/etc/rc.d/S99zibase.sh Et voilà , le script sera lancé ou arrêté automatiquement au startup/shutdown de votre NAS. Bien entendu, ces différents points sont à adapter en fonction de votre config... Maintenant que tout fonctionne, il ne vous reste plus qu'a redémarrer votre NAS et vérifier que les variables HC2 soient bien mises à jour. A vous de créer des modules virtuels pour afficher l'état de vos variables dans vos interfaces... Remerciements Un gros merci à Cmoi20, auteur du projet ZiHome dont je me suis très très fortement inspiré pour mettre en place le script PHP jojo pour sa solution de mise à jour d'une variable via un module virtuel Bejamin Garel pour son sdk PHP pour la Zibase Téléchargements package PHP : zibaseGateway.zip Module virtuel : Zibase.vfib Image pour module virtuel :
  10. jojo

    Problème Encodage Table Json

    Désolé, c'est encore moi, des soucis avec l'encodage d'une table json dans une variable globale. (au départ d'une VD, PAS d'une scène) Lorsque je crée la variable Tmp_Salon, j'obtiens ceci via l'api (http://192.168.2.96/api/globalVariables?name=Tmp_Salon) {"name":"Tmp_Salon","value":"0","readOnly":false,"isEnum":false,"created":1423779706,"modified":1423779706} jusqu'ici, tout va bien Ensuite je la remplis avec le code suivant depuis un bouton d'une VD : local Var = 'Tmp_Salon' local TmpVar = {} TmpVar.Min = 200 TmpVar.Max = -200 TmpVar.Date = os.time() fibaro:debug('TmpVar.Min = '..TmpVar.Min) --fibaro.debug('TmpVar.Max = '..TmpVar.Max) fibaro:debug("TmpVar.Date = "..TmpVar.Date) -- Sauvegarde TmpVar dans la variable globale fibaro:setGlobal(Var,json.encode(TmpVar)) Le debug me donne l'erreur suivante : [DEBUG] 23:27:21: TmpVar.Min = 200 [ERROR] 23:27:21: line :debug expected 2..2 args, got 1 (c'est pour cela que j'ai mis "--fibaro.debug('TmpVar.Max = '..TmpVar.Max)" en commentaire J'ai alors l'erreur suivante dans le debug : (erreur lors du décodage de la table) [DEBUG] 23:30:52: TmpVar.Min = 200 [DEBUG] 23:30:52: TmpVar.Date = 1423780252 [ERROR] 23:30:52: line 13: Expected value but found invalid token at character 1 et ma variable affiche ceci par l'api : {"name":"Tmp_Salon","value":"{\"Max\":-200,\"Date\":1423780252,\"Min\":200}","readOnly":false,"isEnum":false,"created":1423779706,"modified":1423780252} Ce qui me semble très bizarre, ce sont les \. Serait-ce la cause des erreurs ? Quelqu'un peut-il me donner une bonne raison pour que je me flagelle ? J'ai sà»rement fait une bêtise, mais j'ai beau retourner le problème dans tous les sens, je n'arrive pas à comprendre. Merci de votre aide.
  11. jojo

    Lua : Commande Case

    Bonjour, Je cherche la commande de type case en LUA. Case (maVariable) case (maVariable == "A") then ..... case (maVariable == "B") then ... ... end case Voici ce que je voudrais faire. Je vous ai donné un exemple dans le langage Jojo (très bien connu de tous ) Merci de votre aide
  12. Bonsoir, je cherche une fonction qui me permettrait de convertir un nombre en date et heure lisible. exemple : dans les panneaux de chauffage, j'ai "handTimestamp":1423517882, qui correspond à 09/02/2015 22h37 (environ) comment pourrais-je retrouver "09/02/2015 22h37" sur base de "1423517882" ? La question est simple, mais la réponse ???
  13. xavier49300

    Home Center Lua

    Bonjour à tous, je suis ravi de faire partie de cette grande famille de fibariens ;-). Passionné par la domotique et l'informatique et fait l'acquisition de la Home center 2 de chez fibaro. le but et donc de me perfectionner et d'aider les personnes si besoin. 1er question: je souhaite créer cette scene LUA via la home center : - par une detection de mouvement entre 18 et 19h, je veux que ma freebox tv s'allume et quelle se mette directement sur la chaine 1et mon éclairage s'allume. il y a t'il une personne qui peux m'écrire cette scene? merci pour votre aide
  14. Ez3kiel

    Les Petites "briques" Pour Lua ?

    Salut à tous, Je vous fais part d'une remarque que je me suis faite découvrant le Lua. En fin de compte, le Lua est assez simple à apprivoiser, les if-then, les while do sont facilement compréhensibles et les exemples de code que l'on trouve sur ce forum aident grandement à se familiariser avec ce language. Par contre, ou c'est un peu plus flou ( pour moi en tout cas) c'est sur la partie propre au modules. En effet , je ne sais jamais si un volet ouvert a une value de 0 ou 99, quel est l'etat d'un détecteur de mouvement quand il détecte un mouvement ( c'est 0, 1 ou breached ...). ? Alors oui, je me fais un joli post-it sur mon bureau, qui traine un moment puis disparait mystérieusement. ( oui c'est le bordel sur mon bureau ) Du coup, je me demandais s'il ne serait pas intéressant de mettre ces infos dans le 1er post des topics uniques des modules. Je pense qu'avec ces infos, ce serait beaucoup plus simple pour les novices comme moi de faire des choses en Lua. Je suis peut être à coté de la plaque et si c'est le cas , j'en suis désolé. Je ne doute pas non plus que toutes ces infos soient présentes sur le forum mais à ma connaissance rien ne les centralisent. Et vous, qu'en pensez vous ? Ez3kiel
  15. Rem's

    Code Lua Avec Plage Horaire

    Bonsoir a tous, J'essaye de faire fonctionner cette scène, mais je dois avoir une erreur quelque part ... Help Please ... --[[ %% properties %% globals --]] local currentDate = os.date("*t"); local startSource = fibaro:getSourceTrigger(); if ( ( ((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 6 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "22:49") ) ) then fibaro:call(131, "turnOn"); fibaro:call(43, "turnOn"); fibaro:call(2, "sendDefinedSMSNotification", "3366162XXXX", "10"); fibaro:debug("Allumage lumières") end if ( ( ((currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 6 or currentDate.wday == 7) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "22:50") ) ) then fibaro:call(131, "turnOff"); fibaro:call(43, "turnOff"); fibaro:call(2, "sendDefinedSMSNotification", "33661620092", "9"); fibaro:debug("Extinction limières") end fibaro:sleep(60*1000);
  16. kiwi

    Module Virtuel "air Parif"

    Bonjour, Je viens après avoir fait un peu de reverse engineering des appels de l'appli Airparif via un squid de faire un petit virtual module rapidement codé qui permet d'afficher les infos qu'on trouve sur l'appli de airparif. Je rappelle que Airparif ne sort pas d'API officielle et donc il s'agit un petit Hack de ma part (même si j'ai pas du tout décompilé l'appli ni même bricolé leur site). Elle permet d'afficher correctement les infos qu'on as sur le site sans peine. Voici un screen shot : Pour le moment elle est assez simple, si vous voulez l'optimizer ou la rendre mieux, n'hésitez pas ! Voici le Virtual Module (fait dans ma HC2 version 3.591, pas testé sur les version 4.x, je suis hélas en prod et le fact WAF ne passerais pas...) AirParif.vfib
  17. Bonsoir, J'ai quelques petits soucis avec mon code attaché. Le code fonctionne correctement c'est à dire à chaque détection, la lumière s'allume pour le temps spécifié. Mais le problème set que vu que je 'aimerais pas allumer la lumière la journée, j'ai spécifié avec la fonction os.date l'intervalle horaire. Dès lors, le code ne fonctionne plus; j'ai entre autre une erreur du style: " [ERROR] 20:59:20: line 12: attempt to compare number with nil" Quelqu'un pourrait m'aider? Merci :
  18. bencol

    Comprendre Le Lua Sur Hc2

    Bonjour Je m'interroge sur le mécanisme de fonctionnement des scripts LUA et la parallélisation des traitements. Je m'explique : Si je fais une scène qui allume une lumière à partir d'un détecteur (avec trigger) avec un timer pour l'interrompre au delà d'une certaine durée à l'aide d'un compteur sur une variable globale. Chaque déclenchement du capteur lance un nouveau thread du script. Au final la variable en question peut être modifiée par n thread en parallèle. Du coup au lieu de faire un décompte comme demandé seconde par seconde, je me retrouve avec une variable qui se décrémente avec une vitesse proportionnelle au nombre de thread activé. Est ce bien comme cela que cela fonctionne ?
  19. lolo120

    Ping Réseau

    Bonjour, Je voulais implémenter ce que j'ai vu ici et sur le forum officiel pour "pinger" un élément réseau. la solution trouvée est la suivante: local tcpSocket = Net.FTcpSocket(fibaro:getGlobalValue("IP_address", 80) ) bytes, errorCode = tcpSocket:write("test") fibaro:SetGlobal("IP_answer", errorcode) Je voudrais m'en servir pour 2 choses: - détecter l'état du réseau, et dans ce cas, pas de problème. Ca marche (pas pour tous mes appareils cela dit) - détecter les téléphones présents (des téléphones sous Android 4.4), et là ca ne marche pas: ils n'ont pas de port ouvert (80 ou autre) que je puisse utiliser pour envoyer "test"), et donc je recois toujours une erreur. Mes questions: - y-a il un autre moyen pour faire un vrai ping (qui lui marche, je peux faire un ping de mon tel depuis mon ordinateur)? ou bien de détecter la présence d'une adresse IP sur le réseau local autrement en LUA? - quels sont les différents codes d'erreur que peut renvoyer tcpSocket:write? Merci par avance!
  20. Krikroff

    Notification Center

    Notification Center Le centre de notifications à pour objectif de centraliser au mieux les besoins en communication en mettant à disposition une interface (lua) permettant d’accéder à divers services (HC2 Push & Mail, Pushover, passerelle personnalisée etc.) afin de pousser des messages dynamiques et informations diverses vers l’ extérieur. Version: 1.0.1 Phase du projet : Bêta Actuellement « Notification Center » est capable de gérer de manière automatique des demandes de notifications (concurrentes ou non) en utilisant les services suivants : HC2 Push (Mobile ID) HC2 Email (User ID) Pushover: Simple Notifications for Android, iOS, and Desktop (https://pushover.net/) Pushingbox (http://www.pushingbox.com) Prowl (http://www.prowlapp.com/) En cours d' intégration: Passerelle personnalisée (Ex : script php free sms, etc.) LiveNotifier (http://www.livenotifier.net) Roadmap: SMS Gateway & PAW Notification XBMC (Popup) TTS (support tiers) Messages prédéfinis (avec "template" ou non) Périphérique virtuel avec retour visuel : Nombre d’envois (Jours/mois), état du moteur de notification etc. Table de correspondance Mobile ID / User ID <-> Périphérique / Utilisateur par réflexion de l’API Panic Mode: routage automatique de tous les messages (prioritaires) vers une passerelle GSM (PAW, SMS Gateway) en cas de défaillance de fourniture Internet (ADSL/Fibre/Etc) En cours d'enrichissement...
  21. lolo120

    Commande Lua Net.fhttp

    bonjour, Quelqu'un saurait-il où trouver la documentation concernant la commande Net.FHttp et les commandes liées? J'ai trouvé dans le forum, dans les tutoriels et ailleurs de nombreux exemples, mais pas la définition. Je débute en script LUA, mais ca n'a pas l'air de faire partie des fonctions de base, car je n'ai rien trouvé non plus sur lua.org. Merci par avance, Laurent.
  22. Je me souviens que la demande avait été faite, mais je ne me souviens pas d'une éventuelle réponse. Dans le cas ou je me trompe, ce morceau de code ne servira peut-être jamais function turnIt(mode) -- On parcours les 350 premiers modules for i = 1, 1000 do -- Si un module est de type Eclairage local ret = fibaro:get(i, 'isLight') if (type(ret) == "string" and string.find(ret, "1" )) then -- On l'allume ou l'éteint fibaro:call(i, mode) end end end turnIt("turnOn") --turnIt("turnOff") turnIt("turnOf") permet donc d'allumer tout les modules de type "Eclairage", turnIt("turnOff") en revanche, permet de tout éteindre.
  23. Sur une idée originale de razowski et dans la continuité du sujet de Steven ici (http://www.domotique-fibaro.fr/index.php/topic/1303-double-clique-pour-confirmer/) voici un module virtuel permettant de déclencher une action sur validation d'un code PIN au préalable renseigné dans le code du Main Loop. Version 1.0.1 L'action peut-être le déclenchement d'une scène, l'allumage ou l’extinction d'un périphérique ou bien encore l’exécution d'un script LUA afin de laisser cours à votre imagination . Le clavier est simple avec juste 12 touches: 10 boutons de 0 à 9, un bouton "clear" et un "Enter". La validation est automatique lorsqu' un code à 4 chiffre est renseigné, sinon il faut utiliser la touche correspondant à "Enter". J' ai fait ça vite fait entre midi et deux et juste pour poser les bases, je ferais évoluer la chose si le code suscite de l’intérêt. Pour la mise en place il faut commencer par créer un variable globale PINCode000, puis d'importer le fichier vfib en téléchargement sur cette page. Ensuite vous devez modifier le code dans le MainLoop pour l'adapter à vos besoins. Explications succinctes: - ["1010"] : correspond au code qui est formaté sur 4 chiffres (de 1 à 4 chiffres). - caption : une légende pour l'action associée au code - task.object : Peut prendre les valeurs suivantes: scene, device, lua, virtual, globalv - task.id : Identifiant de la scène, du device, de la varible ou du vd utilisé [option] - task.value: pour une scène [start, stop], un périphérique [on, off, dim], lua [function], valeur de la variable globale etc. - task targetId: l'id d'un bouton ou d'un slider dans le cas d'un vd. Les options de l'objet task: -- object: device - actions: [on, off, dim] - id: [num] - value: [0-100] (option) -- object: scene - actions: [start, stop] - id: [num] -- object: virtual - actions: [pressButton, setSlider] - id: [num] - value: [0-100] - targetId: [num] -- object: lua - value: [lua function] (ex: function() -- lua code here end) -- object: globalv - id: [name] - value: [xxx] cf. code extrait du Main Loop: local codeTable = { ["1010"] = { caption = "Disarm perimeter with scene", task = { object = "scene", id = 999, action = "start" } }, ["2020"] = { caption = "lua sample", task = { object = "lua", value = (function() fibaro:debug("Custom lua action!"); end) } }, ["3030"] = { caption = "turn on device", task = { object = "device", id = 999, action = "off" } }, ["4040"] = { caption = "dim device", task = { object = "device", id = 999, action = "dim", value = 25 } }, ["5050"] = { caption = "set global variable 'myvar' to 8989", task = { object = "globalv", id = "myvar", value = 8989 } }, ["6060"] = { caption = "set slider id#8 to 75 in virtual device #999", task = { object = "virtual", id = 999, targetId = 8, action = "setSlider", value = 75 } } }; Modifications: Version 1.0.1 - 08/07/2014 1. Renommage du module en "Security Virtual Keybaord" (ça sert à rien mais je préfère) 2. Ajout du support pour: scène, vd, variable globale VirtualDevice-Security-Keyboard-V1.0.1.vfib
  24. darklite44

    Parser Une Page Html En Language Lua

    Bonjour, J'essaie de faire un VD pour accéder à l'API de ma box. J'ai prévu d'utiliser le Fibaro-HC2-Toolkit-Framework mais il me manque la partie récupération du token d'identification. Ce token est lisible dans une page HTML. Il faut donc procéder en 2 étapes : 1) lecture du token dans la page HTML 2) accès à l'API en fournissant le token de l'étape 1 Ma question est donc comme parser la ligne en question de la page HTML en language LUA ? Cordialement,
  25. Gregory

    Comment Réveiller Des Noeuds Morts ?

    Bonjour, Je me pose une question sur le bon fonctionnement de la fonction fibaro:wakeUpDeadDevice() J'ai une scène qui tourne toutes les 5 minutes pour réveiller (essayer ...) les noeuds morts de mon réseau, en gros cette scène vérifie tout mes devices pour voir si ils sont mentionnés comme mort ou pas, si c'est le cas j'appelle fibaro:wakeUpDeadDevice(i) , j'attends 10 secondes et je teste à nouveau, si le noeud est toujours mort j'envois une notification. Le problème est que la fonction WakeUpDeadDevice ne semble pas réveiller les noeuds, par contre, si depuis l'interface des devices, je clique sur le noeuds en question, il se reveille sans problème, est-ce que j'ai loupé un truc ? Merci d'avance
×