Aller au contenu

Rechercher dans la communauté

Affichage des résultats pour les étiquettes 'Tuto HC2'.



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

133 résultats trouvés

  1. Ce module virtuel permet de modifier les paramètres d'un device. Pour savoir comment l'utiliser, voyez la doc dans le code du VD. Il adapte son code automatiquement pour v3.x et v4.x. Son utilité : vous avez le code pour l'utiliser dans vos VD en fonction de vos besoins (je n'ai pas testé le code pour les scènes) permet d'entrer une valeur précise pour un paramètre sans devoir vous faire .... à bouger le slide bar, qui parfois ne veux jamais mettre la valeur que vous voulez La première fois que vous cliquez sur le bouton, il affiche le device, le paramètre à modifier, sa valeur actuelle et la nouvelle valeur souhaitée Un deuxième clic sur le bouton (dans les 5 secondes - paramétrable) confirme le changement un troisième clic sur le bouton affiche la nouvelle valeur telle que enregistrée dans le device Si vous avez des idées d'amélioration, elles sont les bienvenues. DeviceParameter_v1.0.vfib P.S. J'attends une super icône de notre graphiste national
  2. Salut à tous, Je voulais partager avec vous la solution que j'ai choisi pour mon suivi de consommation avec graph HC/HP. Pour le monitoring de la consommation j'ai choisi le "NorthQ Stromsensor - Z-Wave". Il est bien détecté par la HC2 et remonte une quantité de consommation électrique depuis la mise en service. Donc pas de valeur instantanée. Pour faire un graphique, j'ai simplement créé un virtual device associé à plusieurs variables globales : - EDF_HC qui est postionnée à 0 ou à 1 en fonction de l'heure pour savoir si on est heure creuse ou heure pleine - EDF_LAST_GLOBAL qui sera utilisée pour stocker la dernière valeur du compteur que l'on a lu Il suit un simple calcul différentiel entre la dernière consommation et l'actuelle que l'on trace en fonction de l'heure HC/HP Pour tracer, j'utilise une fois de plus le service thingspeak qui offre une méthode ultra-simple pour des graphs sympa. La méthode n'est pas parfaitement précise car entre deux réveils du plugin (~30mn) on a pu changer d'heures HC/HP et donc compter des KW/h dans la mauvaise catégorie. Cependant, je vis très bien avec ça car je suis plus intéressé par la tendance que par une valeur "parfaite" à 100%. Voici le code que j'utilise : Il vous reste à ajuster l'id de votre compteur (89 ici) et votre clé d'API thingspeak. Sur thingspeak, j'utilise un plot avec 2 fields, le premier pour les HC, le second pour les HP. thingspeak = Net.FHttp('api.thingspeak.com') while true do local current_kwh = fibaro:getValue(89,'value') local last_kwh = fibaro:getGlobalValue('EDF_LAST_GLOBAL') local kwh_to_report = current_kwh - last_kwh fibaro:setGlobal('EDF_LAST_GLOBAL', current_kwh) local field_nb = 1 local other_field= 2 if fibaro:getGlobalValue("EDF_HC") == "1" then field_nb=2 other_field=1 end payload = 'key=VOTREAPIWRITEKEY&field'.. field_nb .. '='..kwh_to_report .. "&field" ..other_field.."=0" fibaro:debug("About to report " .. kwh_to_report .. "KWh (" .. current_kwh .. " - " .. last_kwh .. ")") current_date = os.date("%x") local loops = 0 while true do response, status, errorCode = thingspeak:POST('/update', payload) if tonumber(status) == 200 then break; end if loops == 10 then fibaro:setGlobal("Compteur_Elec_Fail", fibaro:getGlobalValue('Compteur_Elec_Fail') + kwh_to_report) fibaro:log("Failed at updating elec consumption") loops = 0 break; else fibaro:debug("Failed at sending info, retrying " .. loops .. "/10") end fibaro:sleep(500) loops = loops + 1 end fibaro:debug("Sleeping before retrying") fibaro:sleep(1800000) end Voici une petite copie d'écran de ce que ça donne après 1j en fonctionnement: Voilà , En esperant que ça aide, Erwan
  3. Bonjour à tous, Si vous avez besoin d’utiliser votre HC 2 sur un pc pour domotiser votre maison et que vous ne disposez ni d’internet ni d’un routeur/switch. Comme j’ai pas mal galéré pour trouver les infos je vous présente une solution simple et efficace pour réussir la chose. Votre HC 2 est directement branché sur votre PC par le câble internet fourni avec la box, le pc et le HC 2 sont allumés. Configuration du PC : Vous devez configurer votre pc avec une adresse IP fixe selon les paramètres suivants : Adresse IP: 192.168.81.5 Masque de sous réseau : 255.255.255.0 Passerelle par défaut : 192.168.81.1 Une fois la configuration du PC terminé vous devez mettre la HC 2 en adresse ip fixe : La solution est super simple vous appuyez longuement sur le boutons arrière de restore. Les led de la face avant clignotent, vous relâchez le bouton, vous patientez 2 secondes… Votre Home Center s’est automatiquement configuré en IP fixe à l’adresse suivante : Adresse IP: 192.168.81.1 Masque de sous réseau : 255.255.255.0 Passerelle par défaut : 192.168.81.1 Il ne reste plus qu’à saisir l’adresse 192.168.81.1 dans votre navigateur favori et vous vous connectez à votre HC2. NB. : Vous pouvez parfaitement mettre à jour votre HC2 là ou vous disposez d’une connexion internet avant de faire la manipulation pour profiter de votre HC sur un site qui ne dispose pas d’un accès. Bonne domotique à tous
  4. neliger

    Etat De Connexion Wimax

    WiMax Ce module virtuel s'authentifie sur un modem Motorola WiMax "MOTOwi4" (fourni notamment par Ozone), récupère le niveau du signal à intervalle régulière, et permet de redémarrer le modem directement depuis la Home Center. Contexte Il s'agit de mon premier module virtuel, que j'ai réalisé pour confirmer d'un coup d'oeil un problème de niveau de signal WiMax, et de redémarrer le modem sans m'y connecter moi-même, ainsi qu'à distance. A de rares occasion, lorsque le pilonne WiMax que l'on reçoit le mieux est coupé durant un moment, le modem se connecte à un autre pilonne bien trop loin, et le ne vérifie pas de lui-même s'il en capte de nouveau un plus fort. Ce modeste module ne s'adresse bien entendu pas à beaucoup de monde, mais sera peut-être une base de travail pour d'autres. J'ai créé les icônes moi-même pour éviter tout problème de droits. Installation - Importez le module virtuel - Renseignez l'IP et le port de votre modem (par défaut 192.168.1.1 et 80) - Ajoutez les icônes fournies - Adaptez les Id d'icônes au début du code du bouton de mise à jour - Si l'intervalle par défaut (30 minutes) ne vous convient pas, vous pouvez le modifier au début du code de la boucle principale Note : le code suppose que vous ayez laissé les données d'identification par défaut du routeur, tel que demandé par l'opérateur Téléchargement WiMax-1.0.vfib
  5. Bonjour, J'ai été confronté à quelques soucis avec un appareil qui ne réagissait plus (figé) de temps en temps. Comme j'y accède en http et qu'il ne répondait plus via ce mode, j'ai créé un VD pour le redémarrer électriquement via un module fibaro qui lui fourni son électricité. C'est mon premier VD, il est bien possible qu'il ne soit pas très propre. Il modifier quelques lignes dans le code LUA des deux boutons en plus de l'adresse IP et du port du device et c'est tout. Bouton Check: local iconOK=163 -- icon for OK status local iconCHK=164 -- icon for CHECKING status local iconDOWN=165 -- icon for DOWN status local pushDEV=144 -- id of the device where to send push notification, set to nil if push not wanted local URL="/index.html" local debug=true -- or false Bouton Reboot: powerSwitchId = 53 -- id of the device for power Voilà , j'espère que cela va aider certaines personnes ici. Edit: petite erreur dans le script du bouton Check, c'est pushDEV et non pushDev... Surveillance_url.vfib
  6. Krikroff

    Surveiller Un "main Loop"

    Suite au sujet ici http://www.domotique-fibaro.fr/index.php/topic/262-emp%C3%AAcher-une-function-de-bloquer-un-script/ j'ai mis en place un script LUA afin de faire des tests sur le comportement du "Main Loop" d'un périphérique virtuel sur mon HC2 et je le partage bien volontiers avec vous afin de croiser nos expériences. Il y a deux versions, une uniquement basée sur une variable globale et une autre utilisant en plus thingspeak afin d'historiser les résultats. Il faut tout d'abord ajouter les variables, ici : MLWatchDog pour la V1 et MLWatchDog2 pour la V2 puis ajouter un périphérique virtuel, ajouter un label nommé: lblDebug et le code suivant dans le main loop Version 1 -- Copyright © 2013 Jean-christophe Vermandé ------------------------------------------------------------------------------------------- -- Main process ------------------------------------------------------------------------------------------- selfId = fibaro:getSelfId(); function refreshUI(s) fibaro:log(s); fibaro:call(selfId, "setProperty", "ui.lblDebug.value", s); fibaro:debug(s); end function SecondsToClock(sSeconds) local nSeconds = tonumber(sSeconds) if nSeconds == 0 then return "00:00:00"; else nHours = string.format("%02.f", math.floor(nSeconds/3600)); nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60))); nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60)); return nHours..":"..nMins..":"..nSecs end end function main() -- prepare a global counter if (_count == nil) then refreshUI("Start at "..os.date()); fibaro:setGlobal("MLWatchDog", os.time()); _count = 0; else _count = _count + 1; local elapsed = os.difftime(os.time(), tonumber(fibaro:getGlobalValue("MLWatchDog"))); local msg = "Loop #".._count.." since "..SecondsToClock(elapsed); refreshUI(msg); end fibaro:sleep(57000); end local status, err = pcall(main); if (not status) then fibaro:debug('error raised ' .. tostring(err or "unknown")); end Mise en place identique que la version pour la version 2, il faut aussi modifier le script avec votre clé thingspeak Version 2 - Thingspeak -- Copyright © 2013 Jean-christophe Vermandé ------------------------------------------------------------------------------------------- -- Main process ------------------------------------------------------------------------------------------- selfId = fibaro:getSelfId(); function refreshUI(s) fibaro:log(s); fibaro:call(selfId, "setProperty", "ui.lblDebug.value", s); fibaro:debug(s); end function SecondsToClock(sSeconds) local nSeconds = tonumber(sSeconds) if nSeconds == 0 then return "00:00:00"; else nHours = string.format("%02.f", math.floor(nSeconds/3600)); nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60))); nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60)); return nHours..":"..nMins..":"..nSecs end end function pushThingSpeak(v) local ts = Net.FHttp("api.thingspeak.com"); local response, status, errorCode = ts:POST("/update", tostring("key=FCUXXXXXXXXXXXX&field1="..v)); -- ici c'est vite fait ! il manque la vérification de la reponse mais bon ... end function main() -- prepare a global counter if (_count == nil) then refreshUI("Start at "..os.date()); fibaro:setGlobal("MLWatchDog2", os.time()); _count = 0; else _count = _count + 1; local elapsed = os.difftime(os.time(), tonumber(fibaro:getGlobalValue("MLWatchDog2"))); local msg = "Loop #".._count.." since "..SecondsToClock(elapsed); refreshUI(msg); end pushThingSpeak(_count); fibaro:sleep(57000); end local status, err = pcall(main); if (not status) then fibaro:debug('error raised ' .. tostring(err or "unknown")); end C'est plutôt stable chez moi ... Et chez vous ?
  7. jojo

    Modifier L'icone D'un Device

    Avec ce VD, vous pourrez modifier l'icône d'un device via script LUA. N.B. : il n'est pas nécessaire d'utiliser ce VD pour modifier l'icône d'un autre VD. Préférez simplement l'instruction fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", 153) Un tout grand merci à Lazer et PITP2 pour leur aide pour la V4..x et à Did pour avoir fait germer l'idée. Exemple d'utilisation : vous avez un thermomètre dans votre congélateur, et vous souhaitez que l'icône soit différente si la température est normale ou trop élevée. Ok, ce n'est que de l'esthétique, mais si en plus d'être utile, la domotique peut être belle … Voici les icônes que Did a créées pour la température de son congélateur. http://www.domotique-fibaro.fr/index.php/gallery/image/3703-cong%C3%A9lateur/ http://www.domotique-fibaro.fr/index.php/gallery/image/3704-cong%C3%A9lateur-alarm/ Vous devez d'abord charger les icônes pour le type de device dont vous souhaitez modifier l'icône (cette phrase devient très mystique … ). Ensuite vous devez : Récupérer l'ID du device : vous le voyez dans l'URL lorsque vous modifiez le device Récupérer l'ID des icônes : voir tuto de Did : Récupérer l'id d'une Icône. Finalement Importez le VD ci-joint (il est compatible V3.x et v4.x) Recopiez autant de fois que nécessaire le bouton avec son code, en mentionnant au début l'ID du device et de l'icône DeviceIcone_v1.0.vfib Utilisation : Via GEA : ajouter l'option {“VirtualDeviceâ€, <id,_module>, <no_bouton>} - Press le bouton du module virtuel {“VirtualDeviceâ€, 2, 1} Via LUA : fibaro:call(<ID de ce VD>, "pressButton", "<# du bouton>") Pour connaître le n° du bouton : voir tuto de mprinfo : Module Virtuel - Numérotation Des Boutons Limitation : lorsque l'icône d'un device est modifiée, il faut faire un refresh du browser pour que la modification apparaisse.
  8. Berale64

    Interrupteur Universel Z-Wave

    Le fameux Fibaro Button n'étant toujours pas d'actualité et, n'ayant pas trouvé d'interrupteur z-wave adéquat j'ai décidé de le faire avec un FGBS-001. Mettre les paramètres 3 et 4 sur monostable et le paramètre 14 sur ON. Brancher un interrupteur monostable (poussoir) double sur les fils jaune et vert du module et vous obtenez un interrupteur qui envoie 12 états différents. De quoi gérer toute la maison ! --[[ %% properties 105 sceneActivation %% globals --]] fibaro:debug("start"); local val = tonumber(fibaro:getValue(105, "sceneActivation")) if (val == 10) then fibaro:debug("Changement de off à on bouton 1"); elseif (val == 11) then fibaro:debug("Changement de on à off bouton 1"); elseif (val == 12) then fibaro:debug("maintenir appui long bouton 1"); elseif (val == 13) then fibaro:debug("relâcher appui long bouton 1"); elseif (val == 14) then fibaro:debug("Double-clic bouton 1"); elseif (val == 15) then fibaro:debug("Triple-clic bouton 1"); elseif (val == 20) then fibaro:debug("Changement de off à on bouton 2"); elseif (val == 21) then fibaro:debug("Changement de on à off bouton 2"); elseif (val == 22) then fibaro:debug("maintenir appui long bouton 2"); elseif (val == 23) then fibaro:debug("relâcher appui long bouton 2"); elseif (val == 24) then fibaro:debug("Double-clic bouton 2"); elseif (val == 25) then fibaro:debug("Triple-clic bouton 2"); end
  9. Trop de scènes tournent indéfiniment avec des "while true do". j'avais envie de me livrer à un petit exercice et aussi de jouer avec les tables. J'ai donc écrit ce petit scheduler qui permet d'actionner des devices et d'exécuter certaines actions sous certaines conditions. J'en vois déjà qui hurlent "GEA". Oui, je sais mais si on veut apprendre lua, il faut d'abord faire soi même, après on verra. Tout est décrit dans une table qui contient : Pour chaque ligne, une clée, une table d’horaires de déclenchement, une chaine de caractères de 1 à 7 qui sont les jours de la semaine tels que définis par wday dans os.date, une action, une table avec le nom d'une variable globale et une valeur, une table 'dID de devices. Les actions sont : - "turnOn et turnOff". allumer ou éteindre les devices de la table de devices aux heures et jours définis si la variable globale vaut la valeur donnée. Bien respecter les mots clés qui sont utilisés dans la function call. - "setGlobal" met à jour la variable globale. La table d'ID représente le VD et le bouton à actionner. Si pas de VD remplacer la table par nil. - "pressButton" pousse le bouton du VD défini dans la table d'ID si la variable globale vaut la valeur définie. Ce script correspond à mes besoins, mais peut très facilement être adapté pour d'autres mots clés. --[[ %% autostart %% properties %% globals --]] local SalonID = {46,47,48}; local BureauID = {67}; local PaCbuttonON = {113,"2"}; local PaCbuttonOFF = {113,"1"}; local DayON = {70,"1"}; local DayOFF = {70,"2"}; local DoveON = {69,"1"}; local DoveOFF = {69,"2"}; table = -- Simulation présence {["SalonON"] = {{"17:30","01:30","05:20"},"1234567","turnOn",{"AtHome","NO"},SalonID}, ["SalonOFF"] = {{"22:30","01:45","07:20"},"1234567","turnOff",{"AtHome","NO"},SalonID}, ["BureauON"] = {{"18:51","01:35","06:12"},"1234567","turnOn",{"AtHome","NO"},BureauID}, ["BureauOFF"] = {{"20:12","01:52","07:55"},"1234567","turnOff",{"AtHome","NO"},BureauID}, -- Lumière salon présence ["Salon2ON"] = {{"19:30"},"23456","turnOn",{"AtHome","YES"},SalonID}, ["Salon2OFF"] = {{"21:00"},"23456","turnOff",{"AtHome","YES"},SalonID}, ["Salon3ON"] = {{"18:00"},"17","turnOn",{"AtHome","YES"},SalonID}, ["Salon3OFF"] = {{"22:00"},"17","turnOff",{"AtHome","YES"},SalonID}, -- PaC Piscine ["PaCON"] = {{"14:15"},"1234567","setGlobal",{"Start_PaC","STANDBY"},PaCbuttonON}, ["PacOFF"] = {{"19:00"},"1234567","setGlobal",{"Start_PaC","OFF"},PaCbuttonOFF}, -- Day and Night ["DayON"] = {{"06:30"},"1234567","setGlobal",{"Day_Night","DAY"},DayON}, ["DayOFF"] = {{"22:20"},"1234567","setGlobal",{"Day_Night","NIGHT"},DayOFF}, -- Lumière garage pour colombes l'hiver ["DoveON"] = {{"08:00"},"1234567","pressButton",{"Season","WINTER"},DoveON}, ["DoveOFF"] = {{"18:00"},"1234567","pressButton",{"Season","WINTER"},DoveOFF} }; while true do local currentDate = os.date("*t"); local TriggerTime = string.format("%02d",currentDate.hour)..":"..string.format("%02d",currentDate.min); local TriggerDay = currentDate.wday; for key,value in pairs(table) do local time = value[1]; local days = value[2] local action = value[3]; local VGvalue = value[4]; local devID = value[5]; if (string.find(days,TriggerDay) ~= nil) then for i =1,#time do if (TriggerTime == time[i]) then fibaro:debug(key.." "..TriggerTime.." "..action); -- Changement de variable globale et action bouton VD if (action == "setGlobal") then fibaro:setGlobal(VGvalue[1], VGvalue[2]); if (devID ~= nil) then fibaro:call(devID[1], "pressButton", devID[2]); end -- pressButton d'un VD elseif (action == "pressButton") and (fibaro:getGlobalValue(VGvalue[1]) == VGvalue[2]) then fibaro:call(devID[1], "pressButton", devID[2]); -- Action sur Device elseif (fibaro:getGlobalValue(VGvalue[1]) == VGvalue[2]) then for j = 1,#devID do fibaro:call(devID[j],action); end end end end end end fibaro:sleep(60*1000); end
  10. mprinfo

    Module Virtuel - Index Tutos

    TUTOS MODULES VIRTUEL Création D'un Périphérique Virtuel Et Main Loop : ICI Numérotation Des Boutons : ICI Utilisation D'un Label ( Etiquette ) : ICI Le Slider De A À Z (Image + Codes Lua) : ICI Je voudrais savoir si cela vous conviendrez pour rechercher les tutos ? Merci d'avance pour votre réponse
  11. Bonjour, j'ai testé un truc tout bête ce matin et qui fonctionne. Je pars en vacances et je voulais un accès via l'application Fibaro que j'utilise en intranet seulement. Je sais qu'on peut y accéder par l'extérieur, mais cela me semblait un peu compliqué à gérer de mon smartphone, donc j'ai considéré un truc tout simple : Ayant une fbox V6, on dispose d'un serveur VPN ( OpenVPN ). Dans la Freebox, raccourci Serveur VPN : ajouter un utilisateur avec son mot de passe / Activer PPTP / Activer OpenVPN routé et désactiver la fragmentation Télécharger la configuration ( cliquer sur la disquette ), et se l'envoyer sur le smartphone ( par ex par gmail ) Sur le smartphone ( Android pour ma part mais iphone a sa version aussi ) : télécharger OpenVPN pour Android ( et non OpenVPN connect qui ne fonctionne pas avec la fbox ). Dans l'appli, importer le fichier extension .ovpn, se connecter et voilà ... Pratique aussi si on veut accéder à tout équipement dans son intranet.
  12. 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à
  13. 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
  14. Voici une petite astuce sà»rement utilisée par beaucoup mais que je n'ai pas vue sur le forum (j'avoue j'ai pas lu tous les sujets) et qui pourra vous faire gagner beaucoup de temps notamment lors des changements de version et des recovery. En effet il peut arriver lors des recovery que l'identifiant de module change, cela implique donc de modifier l'ensemble de vos scripts Lua pour corriger les id de module, et lorsque vous avez beaucoup de scripts, ça peut prendre un temps fou. L'idée est donc de stocker l'ensemble de vos id dans une variable globale et de les restituer à chaque début de script. Dans le panneaux des variables, créez une nouvelle variable globale nommée "id". Ce premier bout de code à placer dans un bouton de module virtuel vous permet de sauvegarder les id dans la variable globale à chaque appui sur le bouton: -- Déclaration de la table des id id={}; -- Affectation des id de chaque device id.pcdavid=7; id.pcchristelle=11; id.freebox=6; id.diskstation=12; id.notification=12; -- Sauvegarde des id dans la variable globale fibaro:setGlobal('id',json.encode(id)); Pour restituer ces id à l'entrée de votre script et les utiliser dans un programme: -- Récupération de vos id en début de vos scripts id=json.decode((fibaro:getGlobal('id'))); -- Exemple d'utilisation fibaro:call(id.freebox, "pressButton", "12"); fibaro:debug(id.pcchristelle); Voilà , voilou, si ça peut aider quelque newbees comme moi
  15. Shad

    LUA scheduler for HC2

    Ce code a été écrit par robmac avec l'aide de jompa68 , A.Socha. J'ai également fais une traduction du poste original ici. Je ne vais pas tout expliquez mais juste faire comprendre le fonctionnement de base. Ce script a été écrit pour pouvoir gérer tout les heures de lancement d'une action depuis une seule scène. Personnellement ce script fonctionne beaucoup que le code standard lua. Les commandes sunset or sunrise fonctionne très bien. ATTENTION CE CODE NE FONCTIONNE PAS CHAQUE MINUTES DONC N'UTILISE PAS DE RESSOURCES SYSTEME. ILS DÉMARRENT SEULEMENT LORSQU'UNE TACHE EST PLANIFIÉE. Personnellement, depuis que j'utilise ce code ma HC2 ne fonctionne que mieux, dans chaque scène vous n'avez juste qu'à y mettre vos conditions et actions. Je ne posterais pas le code car il fait plus de 1000 lignes. Ce script ajoute également une fonctionne qui manque cruellement à la HC2, des alarmes. Par défaut il n'en possède que deux. Pour mon usage j'en ai programmé deux, une pour la semaine et l'autre pour le week-end. Installation du script: Créer une scène en Lua et collez le code du fichier Scene-1 - ID 1 Scheduler.txt, importez le fichier Alarm_Clock.vfib 4 fois (editez le numéro de chaqu'un dans le code) et 1 fois le Scheduler Control. Il vous faudra ensuite créer des globals variables avec comme nom: - scheduleGroup - scheduleActive - alarmTime1 - alarmTime2 - alarmTime3 - alarmTime4 Après pour redémarrez le scheduler il faut créer une scène avec: --[[ %% properties %% globals --]] local scheduleScene = 1 while (fibaro:countScenes(scheduleScene) > 0) do fibaro:killScenes(scheduleScene); fibaro:debug("Kill") end; active = active or { Active = 1, Disabled = 2 } activeIndex = activeIndex or { [1] = "Active", [2] = "Disabled"} local scheduleActive = fibaro:getGlobalValue("scheduleActive") or activeIndex[1] if scheduleActive == activeIndex[1] then -- restart a new instance if active fibaro:startScene(scheduleScene) end Maintenant pour paramétrez tout sa c'est très simple. Dans le scheduler il faut éditez les lignes: - 96: Id scène pour redémarrer - 97: Id virtual device pour controler le scheduler - 98, 103, 108 et 113: les id des virtuals devices pour les alarmes. Ensuite dans la scène pour redémarrer le scheduler éditez la ligne suivante avec l'id de la scène du scheduler: local scheduleScene = 1 Normallement c'est tout pour la configuration. MISE EN PLACE DU SCENARIO: Vous devez insérez vos lignes en-dessous la section <ADD YOUR LINES HERE> luaDaySchedule:add(<time>,<id>, <parameter> , <action>, <days> ,<catchup>,<p1>,<p2>,<p3>) Heure de lancement du scénario: <time> : Remplacez cette balise par une heure dans un format de 24h exemple: "23:21" ou "07:00". PS: Vous ne pouvez changer une variable globale pour changez l'heure de la scène sans relancez la scène. SUNRISE - SUNSET avec + ou - x minutes: <time>: Remplacez cette balise par "Sunrise" ou Sunset" <p1> Remplacez cette balise par 27 pour ajoutez 27 minutes ou - 11 pour lancez 11 minutes plus tôt. ID DU MODULE OU DE LA SCENE: <id> Remplacez cette balise par l'id de votre module ou scène. ACTION POSSIBLE (liste non entière et consulter le poste originale pour voir les commandes): Allumez ou éteindre un module régler une valeur pour un dimer envoyer un mail envoyer une notification push à un ou tous les périphériques envoyer un mail à un ou tous les utilisateurs appuyer sur un modules virtuels régler un slider pour un modules virtuels régler un variable global armer ou désarmer un module régler toute chacune des couleurs d'un module RGB démarrer un programme RGB démarrer une autre scène CHOIX DES JOURS DE LANCEMENT DES SCENARIOS: <days> Remplacer cette balise par jour de la semaine Il est également possible de mettre plusieurs jours de la semaine avec {"Sunday','Monday"}. Il y a 3 commandes spécial: {"All"] = Tous les jours de la semaines {"Weekend"} = Samedi et Dimanche {"Weekday"} = Lundi au Vendredi Ils peuvent également être fusionner avec les jours de la semaine {"Weekend","Monday"} = Samedie, Dimanche et Lundi LES ALARMES: Pour configurer les alarmes, un fichier vfib est disponible dans le zip joint. A la ligne 92 du scheduler vous devez paramétrer les id de vos modules virtuels ainsi que l'id de la scene du redémarrage du scheduler (également fournie dans le zip). Dans chaque bouton du module virtuel vous devez également reconfigurer l'id de ce module virtuel. Et pour finir vous devez créer des variables globales pour alarmDays1 - alarmDays2 - alarmTime1- alarmTime2. Voici les lignes que vous devez ajoutez à votre scheduler: --Réveil 1 luaDaySchedule:add(getAlarm("alarmTime1"),{"4"}, "" , "startScene", {"All"} ,false) --Réveil 2 luaDaySchedule:add(getAlarm("alarmTime2"),{"5"}, "" , "startScene", {"All"} ,false) Voici quelques une de mes lignes: luaDaySchedule:add("07:00","30", "" , "startScene", {"Weekday"}, false); luaDaySchedule:add("07:30","30", "" , "startScene", {"Saturday"}, false); luaDaySchedule:add("Sunset","Nightime", "1" , "setGlobal", {"All"}, false , 0); Comme écrit plus haut je n'ai pas tout expliquer car trop long. Il s'agit juste d'un résumé Des exemples sont fournis dans le scheduler + d'autre explication sur le poste originale du forum officiel. scheduler-1-3-0.zip Scheduler1-3-1.zip
  16. Bonjour a tous, Suite a la réalisation de Module Virtuel Météo débuté par Bencol et réalisé par un groupe de Membres du FORUM Casimos, Berale24, Pepite, et comme juge Arbitre pour le Main Loop LAZER Voici le lien : http://www.domotique-fibaro.fr/index.php/topic/4087-pr%C3%A9vision-m%C3%A9t%C3%A9o/ Nous Nous sommes posés la question comment faire pour récupérer la latitude et la longitude dans notre box plus de l'écrire dans le module virtuel. J'avais fais un petit tour dans la docs de l'API mais comme je débute c'est un peu du charabia J'ai donc décidé d'y jeté un Å“il de plus prêt. Pour ceux qui ne le savent pas, la docs de notre HC2 ce trouve a l'adresse suivant (V4 Uniquement) http://<ip box>/docs/ exemple : http://192.168.1.54/docs/ j'ai vu qu'il y avait settings Et la miracle je vois location (GET ou PUT) Je choisi GET car je veux récuperer les informations Je vois que finalement on peut récuperé pas mal d'info, En bas de la page je vois que l'on a json je clic sur TRY IT! Au miracle j'ai ma latitude, Longitude et pas mal d'information de mon panneau de configuration. Super tout cela mais comment faire pour récupérer tout cela. je poste donc l'api sur le fofo et miracle une réponse de Bencol que je remercie HC2 = Net.FHttp("127.0.0.1",80); HC2:setBasicAuthentication("admin","xxxx"); local response, status, errorCode = HC2:GET("/api/settings/location"); if (tonumber(errorCode) == 0) then jsonTable = json.decode(response); fibaro:debug(jsonTable.latitude); fibaro:debug(jsonTable.longitude); end Ok c'est cool mais il faut un mot de passe et un utilsateur donc je modifie le début du code comme cela HC2 = Net.FHttp("127.0.0.1",11111); en mettant le port 11111 a la place du 80 On a plus besoin de HC2:set.... Merci qui ? Merci Krikroff Donc maintenant que j'ai mon json cool je n'ai plus l'utiliser comme cela pour avoir la latitude et longitude HC2 = Net.FHttp("127.0.0.1",11111); local response, status, errorCode = HC2:GET("/api/settings/location"); if (tonumber(errorCode) == 0) then jsonTable = json.decode(response); fibaro:debug(jsonTable.latitude); fibaro:debug(jsonTable.longitude); end local latitude = (jsonTable.latitude); local Longitude = (jsonTable.longitude); fibaro:debug("Latitude = " ..latitude) fibaro:debug("Longitude = " ..longitude) On peut biensur retrouver la ville, numero de votre maison, ntpServer, etc.. Bon je début donc je n'irai pas plus loin au niveau de l'api. Commander la HC2 Par requetes HTTP Voici un lien : http://tutoriels.domotique-store.fr/content/49/45/fr/api-commander-le-home-center-par-des-requ%C3%AAtes-http.html
  17. Boujour a tous Voici une scéme qui va permettre d'envoyer a un ID une Valeur les valeurs autorisé sont : open, close, turnOn, turnOff, 0, 1, 2, 3 etc... jusqu'à 100 je vais utilisé pour cela un tableau exemple : Id = {13, 5, 7, 9, 23} -- Id des volets roulants IdValue = {"turnOff", "open", 99, 0, "close"} -- Valeur : 0=Fermer, 99=Ouvert - open - close - turnOn - turnOff dans un premier temp l' ID 13 recevra la "value" turnOff puis l'id 5 la "value" open etc.... On pourra donc allumer puis eteindre une lampe ou fermer des volets avec des valeurs différentes. J'ai choisi de déclencher la scéne avec une variable globale Jour_Nuit --[[ %% properties %% globals Jour_Nuit --]] il faudra donc crée cette variable Avec les valeurs suivantes : Jour Nuit Puis 2 scénes en mode bloc une pour changer la variable a JOUR et l'autre pour changer la variable a NUIT Jour : Nuit : Ou une Scénes en LUA --[[ %% autostart %% properties %% globals --]] while true do local Var_Jour = os.date("%H:%M", os.time()-15*60) local Var_Nuit = os.date("%H:%M", os.time()+15*60) local currentDate = os.date("*t"); local Jour = fibaro:getValue(1, "sunriseHour") local Nuit = fibaro:getValue(1, "sunsetHour") fibaro:debug("Jour : " ..Jour) fibaro:debug("Nuit : " ..Nuit) if ( Var_Jour == Jour ) then fibaro:setGlobal("Jour_Nuit", "Jour"); elseif ( Var_Nuit == Nuit ) then fibaro:setGlobal("Jour_Nuit", "Nuit"); end fibaro:sleep(59*1000); -- s'execute toutes les minutes end On peut bien entendu modifier ces paramètres ou en ajouter if J_N == "Nuit" then Id = {5, 7, 9, 23, 27, 25, 29, 17, 19} -- Id des volets roulants IdValue = {0, 0, 0, 0, 0, 0, 85, 0, 0} -- Valeur 0=Fermer - 99 = Ouvert fibaro:debug("Nuit") end if J_N == "Jour" then Id = {13, 5, 7, 9, 23, 27, 25, 29} -- Id des volets roulants IdValue = {"turnOff","open", 99, 99, 99, 99, 99, 99, 99, 99} -- Valeur : 0=Fermer, 99=Ouvert - open - close - turnOn - turnOff fibaro:debug("Jour") end Ensuite il y a un autre bloc de programme qui ajoute des ID et des "Value" a la table en fonction du jour de la semaine -- Debut Volets Chambres ouverture du lundi au vendredi local jour = os.date("%w"); --0=Dimanche, 1=Lundi, 2=Mardi,3=Mercredi etc... fibaro:debug("Jours de la Semaine = " ..jour) if ((jour == "1" or jour == "2" or jour == "3" or jour == "4" or jour == "5") and (J_N == "Jour")) then local Id1 = {19, 17} -- 19 ch amis 17 ch enfants local IdValue1 = {99, 99} local t_id = #Id local t_id1 = #Id1 for i = 1,#Id1 do t_id = t_id + 1 table.insert(Id, t_id, Id1[i]) table.insert(IdValue, t_id, IdValue1[i]) end end -- Fin Volets chambres Puis un test pour savoir si il y a bien le même autant d' ID que de "Value" -- Test si le nombres d' Id et Egale au nombre de IdValue if #Id == #IdValue then fibaro:debug("total des id = " ..#Id) else fibaro:debug("Total des id = " ..#Id .." - Total des Values = " ..#IdValue) fibaro:debug("fin de la Scéme...") fibaro:abort(); end pour le push je conseil de créer une variable global avec l'ID du téléphone (vu les soucis avec le push cela évite de modifier toutes ces scénes a chaque fois que l'ID du tél change) Pour récupérer l'id du tel local IdTel = fibaro:getGlobalValue("IdI9305") -- Recuperation de id du tel pour le push Dans cette exemple on récupére l'id du tel qui ce trouve dans la variable globale IdI9305 (je sais c'est un samsung s3 LTE ) j'ai mis une pause de 30s entre chaque commande local VTimer = 30*1000 -- Temp de pause entre chaque commande de modules A la fin de l’exécution de la scéne on envoi un PUSH avec le nombres de modules actionnés -- Envoi du Push fibaro:call(IdTel, "sendPush", "Les " ..#Id .." ont été actionnés") Voici la scéne : --[[ %% properties %% globals Jour_Nuit --]] -- Recupération de la valeur de la variable global Jour_Nuit local num = fibaro:countScenes () -- nombres d'instance en cours d'excution de la sceme fibaro:debug("Nombres de Scéme en cours = " ..num) if (num == 1) then local J_N = fibaro:getGlobalValue( "Jour_Nuit" ); fibaro:debug("Jour_Nuit = " ..J_N) local Id = {} local IdValue = {} if J_N == "Nuit" then Id = {5, 7, 9, 23, 27, 25, 29, 17, 19} -- Id des volets roulants IdValue = {0, 0, 0, 0, 0, 0, 85, 0, 0} -- Valeur 0=Fermer - 99 = Ouvert fibaro:debug("Nuit") end if J_N == "Jour" then Id = {13, 5, 7, 9, 23, 27, 25, 29} -- Id des volets roulants IdValue = {"turnOff","open", 99, "turnOn", 99, 75, 99, 45, 99, 99} -- Valeur : 0=Fermer, 99=Ouvert - open - close - turnOn - turnOff fibaro:debug("Jour") end -- Debut Volets Chambres ouverture du lundi au vendredi local jour = os.date("%w"); fibaro:debug("Jours de la Semaine = " ..jour) if ((jour == "1" or jour == "2" or jour == "3" or jour == "4" or jour == "5") and (J_N == "Jour")) then local Id1 = {19, 17} -- 19 ch amis 17 ch enfants local IdValue1 = {99, 99} local t_id = #Id local t_id1 = #Id1 for i = 1,#Id1 do t_id = t_id + 1 table.insert(Id, t_id, Id1[i]) table.insert(IdValue, t_id, IdValue1[i]) end end -- Fin Volets chambres -- Test si le nombres d' Id et Egale au nombre de IdValue if #Id == #IdValue then fibaro:debug("total des id = " ..#Id) else fibaro:debug("Total des id = " ..#Id .." - Total des Values = " ..#IdValue) fibaro:debug("fin de la Scéme...") fibaro:abort(); end -- Fin du test local IdTel = fibaro:getGlobalValue("IdI9305") -- Recuperation de id du tel pour le push dans la variable globale IdI9305 local VTimer = 30*1000 -- Temp de pause entre chaque commande de modules fibaro:debug("Nombres Modules = " ..#Id) for i = 1,#Id do local TestName = fibaro:getName(Id[i]) local TestValue = fibaro:getValue(Id[i], "value") if IdValue[i] == "open" or IdValue[i] == "close" or IdValue[i] == "turnOn" or IdValue[i] == "turnOff" then fibaro:call(Id[i], IdValue[i]); else fibaro:call(Id[i], "setValue", IdValue[i]); -- Commande Module end fibaro:debug("---------------------") fibaro:debug("Nom = " ..TestName) fibaro:debug("Valeur = " ..TestValue .." - Valeur demander = " ..IdValue[i]) fibaro:sleep(VTimer) end fibaro:sleep(2*1000) -- Envoi du Push fibaro:call(IdTel, "sendPush", "Les " ..#Id .." ont été actionnés") else fibaro:debug("Nombre de Scénes en cours " ..num) end J'utilise cette scéne pour fermer et ouvrir mes volets et j'allume en même temps des lumières que j'éteins ensuite. on peut bien entendu utilisé plusieurs fois le même ID exemple : J'allume ma lampe, je ferme mon volets j' éteins ma lampe. Pour les modules dinnable il faut comme pour les volets mettre une valeur entre 0 et 99 Id = {13, 5, 13} -- Id des volets roulants IdValue = {"turnOn", "close", "turnOff"} -- Valeur : 0=Fermer, 99=Ouvert - open - close - turnOn - turnOff
  18. Steven

    My Batteries

    My Batteries (sujet clos) Module virtuel pour afficher l'état de vos batteries ATTENTION : Jojo a repris ce module virtuel pour l'améliorer et le rendre compatible 3.x et 4.x, ce topic n'a donc plus de raison d'être. Je ne peux que vous conseiller d'aller voir son travail ICI. Personnellement, j'aime bien avoir un visuel de l'état des batteries de mes modules. Habituellement, je lançais un simple scénario qui me retournait l'état de ces derniers.J'ai décidé de modifier mon code pour le transformer en module virtuel afin que tout le monde puisse en profiter Comme vous pouvez le voir, ce module affiche les 10 modules ayant les piles les plus faibles et trier par ordre du plus petit au plus grand. Si vous avez plus de module, il vous faudra rajouter vous-même des labels en faisant juste attention que leur ID suivent la numérotation Label11, Label12, Label13, ... Ce module se rafraîchi automatiquement toutes les 12 heures (paramétrable dans le Main Loop) local nbHeure = 12 . . . Installation Il vous suffit juste d'importer le module virtuel ci-joint Cordialement Historique : 28.08.2014 : Ajout détection des piles à l'état critique My_Batteries.vfib
  19. Bonsoir, ma 1e contribution, soyez indulgents. Si cela peut servir à quelqu'un. Je veux programmer un réglage du chauffage via des têtes TH et une vanne électrique. Pour cela la HC2 a besoin de savoir si je suis là ou au travail, et si je suis au rdc ou à l'étage. Comme cela je peux régler le chauffage à 16 si je suis au boulot, et quand je rentre, à 19 en bas, 16 à l'étage, et l'inverse quand je dois aller me coucher. Donc j'ai créé cela : local presMaison=true -- présence dans la maison ? local presRDC=true -- présence au rdc ? local hlevSem=0620;local hlevWE=0830 -- heures lever en semaine et le weekend local hcouSem=2300;local hcouWE=2330 -- heures coucher en semaine et le weekend local hdepW=0730;local hretW=1630 -- heures départ et retour travail local day = string.lower(os.date("%A")) local hour = tonumber(os.date("%H")..os.date("%M")) local day="tuesday" -- var pour tester le script local hour=1100 -- idem if (( day == "monday" or day =="friday" ) and ( hour > hdepW and hour < hretW )) then presMaison=false;end if (( day == "tuesday" or day == "wednesday" or day == "thursday" ) and ( hour > hdepW and hour < 1230 )) then presMaison=false; end; -- car ces jours là je termine à 12h30 if ( (presMaison) and ( day == "saturday" or day == "sunday" ) and ( hour > hlevWE and hour < hcouWE ) ) then PresRDC = true; else presRDC = false;end if ( (presMaison) and ( day == "monday" or day == "tuesday" or day == "wednesday" or day == "thursday" or day == "friday" ) and ( hour > hlevSem and hour < hcouSem )) then presRDC = true;end -- bilan if presMaison then fibaro:debug("presMaison=oui") else fibaro:debug("presMaison=non") end if presRDC then fibaro:debug("presRDC=ok"); else fibaro:debug("presRDC=non"); end On peut aussi procéder ainsi, mais j'ai trouvé la 1e méthode plus simple à programmer pour ma gestion des horaires plus complexe local weekjob = {"monday","tuesday","wednesday","thursday","friday"} local weekend = {"saturday","sunday"} for k,v in pairs(weekJob) do if ( v == day ) then presMaison=false; end
  20. Pilotez du Somfy RTS à partir de la HC2 Depuis presque un mois, j’ai l’occasion de tester la Box domotique Néerlandaise HomeWizard. Cette Box disponible en France depuis le mois de décembre à de nombreux atouts, en effets elle est capable de piloter les commutateurs sans fil de Coco et HomeEasy, les caméras IP de ELRO et Foscam, Moniteur d’énergie Wattcher, les stations météorologiques de TFA, les lampes Hue de Philips et surtout ce qui nous intéresse particulièrement aujourd’hui : une api et la compatibilité avec le protocole RTS de Somfy. Nous allons donc utiliser la Homewizard en gateway de la HC2 grâce à son api, le but étant d’utiliser l’interface Fibaro pour piloter nos équipements Somfy Rts (Portail, Porte de Garage, Store Banne). Mais avant de rentrer dans le vif du sujet voici une courte présentation de la bête. - Déballage La box se présente sous la forme d’un livre, comme les anciennes livebox mais beaucoup plus petite. Sur sa face avant 3 voyants et pour la connectique pas de superflu, pas de port ethernet juste un usb qui servira à la mise en service et à l’alimentation. Une fois configurée elle est accessible en wifi. - Création du compte La création du compte se fait très simplement à l’@ http://www.homewizard.fr/customer/account/login/ Une fois cette opération terminée, allez consulter votre mail et suivez les instructions pour activer votre compte. - Mise en Service La configuration se fait à l’aide d’un ordinateur (Mac ou Pc) et du logiciel HomeWizard disponible à l’@ http://www.homewizard.fr/telechargements. Rien de bien compliqué, on choisi la langue puis Suivant. On installe le pilote de USB de la Box. Une fois le pilote installé, le logiciel détecte la HomeWizard, et vous demande les informations de votre compte. Arrive enfin la configuration wifi et adressage IP. Sélectionnez votre réseau wifi et entrez la clé de sécurité. Puis le type d’adressage (DHCP ou fixe) ainsi que le port. Une fois le Wifi configuré et un compte créer sur le site HomeWizard, vous pourrez débrancher la box de votre ordinateur pour la brancher sur secteur. En retournant sur le tableau de bord de votre compte Homewizard, vous pourrez vérifier le bon fonctionnement de la box et vous connecter à celle-ci. Une fois toutes ces opérations réalisées, vous allez pouvoir associer les différents modules à la box. Rendez vous maintenant dans l’interface de configuration de notre Homewizard (App Online). Vous avez le choix entre une connexion distante ou locale et la langue. Entrez votre mot de passe. Vous arrivez sur l’interface de configuration. - Ajouter un Périphérique Somfy Porte de Garage Le premier module que nous allons configurer est le moteur de ma porte de garage. Un Somfy GDK3000, adaptable sur les portes basculantes et sectionnelles. Dans la box, on ajoute un élément somfy, puis on entre son Nom. Sur le moteur Somfy, lancez la procédure d’apprentissage de télécommande : Appuyez 3 secondes sur le bouton de réglage. Le voyant de réglage s’allume. Cliquez sur Générer un nouveau code sur la box, le moteur doit sortir de programmation, ce qui signifie que le code est enregistré. Le portail SGS6000 Par contre la procédure sur le moteur est différente. Il n’y a pas de bouton de programmation, il faut donc ouvrir le capot, poser la box sur le moteur et cliquez sur Générer un nouveau code. Store Banne J’utilise une interface volets roulants Somfy de ce type pour commander le store. Il faut appuyer 2 secondes sur le bouton Prog à gauche pour passer en apprentissage. puis cliquez sur Générer un nouveau code et OK. L'API de la Homewizard La box possède une API locale. En fait, il est possible de piloter la Homewizard en lui envoyant des commandes HTTP et de l’utiliser en passerelle radio. Grace à cette fonctionnalité et aux Virtual Devices de la Home Center 2 nous allons commander notre domotique Somfy RTS en passant par l’interface de la HC2. L’API de la Homewizard est référencé ici : http://wiki.td-er.nl/index.php?title=Homewizard A noter que cette API est non officielle et peut évoluer à tous moments. - Identifier les éléments du Homewizard Voici la liste des modules Somfy RTS sur la Homewizard, mais dans l’interface graphique il n’est pas possible de connaître les ID. Pour les trouver, il faut donc interroger l’API La commande Http pour obtenir la liste détaillée des modules en json est la suivante : http://@IPHomewizard/password/get-sensors/ password est le mot de passe d’accès à la configuration de la box. La réponse à votre requête est la suivante : {"status": "ok", "version": "2.63", "request": {"route": "/get-sensors" }, "response": {"switches" : [], "uvmeters": [], "windmeters": [], "rainmeters": [], "thermometers": [], "energymeters": [], "energylinks": [], "heatlinks": [], "hues": [], "scenes": [], "somfy": [{"id": 0, "name": "Porte de Garage", "favorite": "no"},{"id": 1, "name": "Portail", "favorite": "no"},{"id": 2, "name": "Store Bann", "favorite": "no"},{"id": 3, "name": "Prise 1", "favorite": "no"}], "kakusensors": [], "cameras": [{"id":0,"model":0,"name":"Cam Ext","username":"**","password":"******","ip":"192.168.0.233","port":"81","mode":0,"url":null,"presets":[]}]}} Pour résumer, nous obtenons la liste suivante: - Porte de Garage = 0 - Portail = 1 - Store Banne = 2 - Utiliser les requêtes HTTP pour commander un automatisme Somfy Une fois les numéros ID des modules identifiés, vous pouvez les piloter à l’aide de requêtes HTTP. Voici un exemple depuis le navigateur Web - Ouverture: http://@IPHomewizard/password/sf/IDSomfy/up Ouverture du Portail Somfy ayant le numéro ID 1 - Fermeture: http://@IPHomewizard/password/sf/IDSomfy/down Fermeture du Portail Somfy ayant le numéro ID 1 - Arrêt: http://@IPHomewizard/password/sf/IDSomfy/stop Arrêt du Portail Somfy ayant le numéro ID 1 Il est bien sur possible de faire la même chose pour les autres modules. Par exemple, pour ouvrir la porte de garage : http://192.168.0.13/310869/sf/0/up - Création d’un Virtual Device sur la HC2 Reste à créer les Devices sur la Hc2 pour piloter nos différents éléments Somfy. Chaque Virtual Device aura 3 boutons (Ouvert, Stop, Fermé) qui enverront une commande à l’API de la HomeWizard. Dans la HC2, cliquez sur l’icône module dans la barre de menu horizontale puis sur Add or remove Device sur le coté gauche. Maintenant Ajouter un périphérique virtuel Cliquez sur Ajouter Entrez un nom et affectez lui une pièce. Ajoutez 3 boutons. Dans le premier bouton collez le code LUA : HC2 = Net.FHttp("192.168.0.13") response = HC2:GET("/Password/sf/1/down") Remplacez Password par le mot de passe de la Homewizard. Dans le second bouton collez le code LUA : HC2 = Net.FHttp("192.168.0.13") response = HC2:GET("/Password/sf/1/stop") Remplacez Password par le mot de passe de la Homewizard. Enfin dans le dernier bouton collez le code LUA : HC2 = Net.FHttp("192.168.0.13") response = HC2:GET("/Password/sf/1/up") Remplacez Password par le mot de passe de la Homewizard. Changez les icones du Virtual device et sauvegardez. Il ne reste plus qu’à répéter l’opération pour les autre automatismes Somfy. Voici le résultat : Vous pourrez bien sur intégrer vos automatismes Somfy dans des scènes LUA, seule limite : votre imagination. - Conclusion Depuis un mois je suis entièrement satisfait par cette solution qui à moindre coà»t permet d’ajouter des protocoles à la HC2. Le temps de réaction de l’API locale est excellent, moins d’une seconde et les ordres sont toujours exécutés. Seul défaut, mais qui est dà» au RTS et non à la box est le manque de retour d’état. Lorsque vous activez le portail avec la télécommande, le virtual device sur la box ne change pas d’état. Bref, une bonne solution pour ceux qui ont du Somfy et qui ne souhaitent pas ou ne peuvent pas s’en séparer. Quelques vidéos sont à venir... Un grand merci à Domadoo pour le prêt du matériel
  21. Gestionnaire d'Evénements Automatique (GEA) ancienement : Wtdiso What To Do If Still Open Edit : version 5.00 modifiée le 8 décembre 2014 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. Depuis la version 3.00 vous avez aussi la possibilité d'utiliser ce script en exploitant les déclencheurs %%properties end %%globals. 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 : Nouveauté de la version 3.80 Depuis le panneau des variables, créer une variable (simple) appelée "GEA_Tasks" (son contenu n'a pas d'importance) Créer un scénario en mode LUA Insérer le script ci-joint (GEA.lua)) Adapter les dernières lignes à vos besoins (en dessous de la ligne "A VOUS DE JOUER") Paramétrage : 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} Indique si on utilise un firmware égale ou supérieur à la version 4.017 GEA.isVersionFour = true --- On est en version 4.017 Beta ou suppérieur Indique la langue utilisée (Français : FR ou Anglais : EN) GEA.language = "FR" 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ébugage fort de GEA, chque erreur provoque l'arrêt de GEA si cette option est à false GEA.catchError = true | false (true par défaut) Exemple : GEA.catchError = false -- va afficher les erreurs et stopper GEA Supsendre le script à la volée GEA.getGlobalForActivation = {<variable globale>, <valeur>} Exemple : GEA.getGlobalForActivation = {"SuspendreGEA", "non"} Tant que la variable globale "SuspendreGEA" sera à "non" le script continuera son action. Syntaxe : Simple condition : GEA.add(<condition>, <durée en secondes|-1>, <message a notifier>[, <options>]) Exemple : GEA.add(100, 10*60, "Lampe allumée de puis plus de 10mn, on l'éteint", {{"turnOff"}}) Condition multiple : GEA.add( { <condition_principale>[, <condition2>[, ...]] } , <durée en secondes|-1>, <message a notifier>[, <options>]) Exemple : GEA.add( { 100, {"Global", "JourNuit", "Nuit"} } }, 10*60, "Lampe allumée de puis plus de 10mn ET la variable global JourNuit indique Nuit alors on éteint la lampe", {{"turnOff"}}) Conditions autorisées : <Id module> -- Identifiant du module * {"Global", <nom variable>, <valeur>} -- Si la variable global X contient la valeur Y {"Weather", <valeur>} -- Si la météo indique la valeur {"Sensor+", <id module>, <valeur max>} -- Si la valeur du sensor X est supérieur à Y {"Sensor-", <id module>, <valeur max>} -- Si la valeur du sensor X est inférieur à Y {"Sensor", <id module>, <valeur max>} -- Si la valeur du sensor X est égale à Y {"Sensor!", <id module>, <valeur max>} -- Si la valeur du sensor X est différente à Y {"Value+", <id module>, <valeur max>} -- Si la valeur du module X est supérieur à X {"Value-", <id module>, <valeur max>} -- Si la valeur du module X est inférieur à X {"Value", <id module>, <valeur max>} -- Si la valeur du module X est égale à X {"Value!", <id module>, <valeur max>} -- Si la valeur du module X est différente à X {"Global+", <nom variable>, <valeur>} -- Si la valeur de la variable globale X est supérieur à X {"Global-", <nom variable>, <valeur>} -- Si la valeur de la variable globale X est inférieur à X {"Global", <nom variable>, <valeur>} -- Si la valeur de la variable globale X est égale à X {"Global!", <nom variable>, <valeur>} -- Si la valeur de la variable globale X est différente à X {"Slider-", <id_vd>, <nom slider>, <valeur>} -- Si la valeur du slider est inférieur à X {"Slider+", <id_vd>, <nom slider>, <valeur>} -- Si la valeur du slider est supérieur à X {"Slider", <id_vd>, <nom slider>, <valeur>} -- Si la valeur du slider est égale à X {"Slider!", <id_vd>, <nom slider>, <valeur>} -- Si la valeur du slider est différente à X {"Label", <id_vd>, <nom label>, <contenu>} -- Si la valeur du label est égale à X {"Label!", <id_vd>, <nom label>, <contenu>} -- Si la valeur du label est différente à X {"Property", <id_module>, <nom propriété>, <valeur>} -- Si la valeur de la propriété du module est égale à la valeur indiquée {"Property!", <id_module>, <nom propriété>, <valeur>} -- Si la valeur de la propriété du module est différente à la valeur indiquée {"Battery", <id module>, <valeur max>} -- Si l'état de la pile du module X est inférieur ou égale à X {"Batteries", <valeur max>} -- Si l'état de la pile des 350 premiers ont une pile inférieur ou égale à X {"Dead", <id module>} -- Si le module X ne répond plus {"Group", <numéro du groupe>} -- Si le groupe X est valable {"SceneActivation", <id module>, <id scene>} -- Si la scene X du module Y est le déclencheur du script * Si seul l'Identifiant du module le script considère qu'il doit vérifier si le module est activé. Durée : <durée en secondes> -- Nombre de secondes pendant lequel la condition doit être respectée Message : <message à notifier> -- Le message devant être notifier ** ** Si le message est vide "" aucune notification ne sera envoyée Un message peut contenir des variables qui seront remplacée à la volée. Ces variables sont #time#, #duration#, #value#, #date#, #seconds#, #name#, #runs#, #rooms# soit respectivement heure, durée, dernière valeur, date, secondes, nom du périphérique, nombre d'exécution et pièce Exemple "Le consommation #valeur#W relevée à #time#, le #date# sur le périphérique #name# est trop élevée" Depuis la version 4.20, il est possible de connaitre les valeurs des autres périphériques impliqué. GEA.add( { condition1, condition2, condition3 }, <durée>, "#value[1]# #value[2]# #value[3]#"). Les variables indexée sont : #value[index]#, #name[index]# et #room[index]#. #name#, #value# et #room# indique toujours la condition principale. Options : {<option>[,<option>][,...]} -- Il s'agit d'un groupe d'options {{},{},{}} Option : {"turnOff"[,<id module>]} -- Eteint le périphérique concenné {"turnOff"} ou {"turnOff",21} {"turnOn"[,<id module>]} -- Allume le périphérique concerné {"turnOn"} ou {"turnOn",21} {"Inverse"} -- On inverse la condition si elle était vrai, le script retourn faux {"Repeat"} -- On répete les avertissements tant que le périphérique n'a pas changé d'état. {"Portable", <id>} -- Le message associé à ce périphérique sera envoyé à ce portable au lieu de ceux par défaut {"Portable", 70} {"Scenario", <id>} -- Lance un scénario selon son identifiant {"Scenario", 2} {"Value", <value>} -- Met la valeur 20 dans le périphérique - dimmer une lampe. {"Value", 20} {"Value", <id>, <value>} -- Met la valeur 20 dans le périphérique <id> - dimmer une lampe. {"Value", 19, 20} {"Open"} -- Ouvre le volet {"Open", <value>} -- Ouvre le volet de X % {"Open", 20} {"Open", <id>, <value>} -- Ouvre le volet (id) de X% {"Open", 61, 20} {"Close"} -- Ferme le volet {"Close", <value>} -- Ferme le volet de X % {"Close", 20} {"Close", <id>, <value>} -- Ferme le volet (id) de X% {"Close", 61, 20} {"Global", <variable>, <valeur>} -- Met la valeur "Oui" dans la variable globale "Maison" {"Global", "Maison", "Oui"} {"Global", <variable>, "inc+"} -- Incrémente de 1 automatiquement la variable globale {"Global", <variable>, "dec-"} -- Decrémente de 1 automatiquement la variable globale {"Time", <from>, <to>} -- Ne vérifie l'évenement QUE si nous sommes dans la/les tranches horaires {"Time", "22:00", "06:00"} {"Dates", <from>, <to>} -- Ne vérifie l'évenement QUE si nous sommes dans la/les périodes de dates spécifiée {"Dates", "01/01[/2014]", "31/01[/2014]"} {"Armed"} -- Ne vérifie QUE si le module est armé {"Disarmed"} -- Ne vérifie QUE si le module est désarmé {"setArmed", <id>} -- arme le module <id> {"setDisarmed", <id>} -- desarme le module <id> {"RestartTask", <id_tache>} -- Redémarre une tâche selon son <id> {"StopTask", <id_tache>} -- Stoppe une tâche selon son <id> {"NotStarted"} -- Empêche la tache de démarrer automatiquement (voir RestartTask) {"MaxTime", <number>} -- Stoppe une tâche après un certain nombre d'exécution {"DST"} -- Ne vérifie l'évenement QUE si nous sommes en mode "Saving time" soit heure d'été {"NOTDST"} -- Ne vérifie l'évenement QUE si nous sommes en mode heure d'hiver {"VirtualDevice", <id,_module>, <no_bouton>} -- Pr ess le bouton du module virtuel {"VirtualDevice", 2, 1} {"Label", <id_module>, <name>, <message>} -- Attribue le message au label du module virtuel {"Label", 21, "ui.Label1.value", "activé"} {"WakeUp", <id,_module>} -- Essai de réveillé le module {"WakeUp", 54} {"Email", <id_user>,} -- Envoi le message par email à l'utilisateur {"Email", 2} {"Email", <id_user>,<sujet>} -- Envoi le message par email à l'utilisateur {"Email", 2, "Sujet du message"} {"Group", <numero>} -- Attribut cet événement au groupe {"Group", 2} {"Slider", <id_module>, <id_slider>, <valeur>} -- Met la valeur dans le slider du module {"Slider", 19, 1, 21.3} {"Program", <id_module>, <no>} -- Exécute le programme du module RGB {"Program", 19, 5} {"RGB", <id_module>, <col1>, <col2>, <col3>, <col4>} -- Modifie la couleur RGB du module {"RGB", 19, 100, 100, 0, 100} {"Days", <jours>} -- Ne vérifie l'évenement que si le jours d'exécution est dans le/les jours indiqué (jeurs peut prendre les valeurs suivantes "Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday, All, Weekday, Weekend") {"CurrentIcon", <id_module>, <no_icon>} -- Modifie l'icone d'un module virtuel {"CopyGlobal", <var_source>, <var_dest>} -- Copy la valeur de la variable global <var_source> dans la variable global <var_dest> {"If", {[{<condition}[,{<condition}[,...]]}} -- L'événement sera autorisé uniquement si toutes les conditions sont valides Demande de support / FAQ : un topic a été dédié pour répondre à toutes les questions sur le projet : Support GEA n'hésitez pas à venir nous y retrouver. Explication : Vous précisez quel module le scénario doit contrôler (GEA.add(28, 10*60, "La porte du garage est ouverte depuis plus de 10 minutes")). Toutes les 30 secondes, le scénario va vérifier l'état de la porte 28. Si cette porte est restée ouverte plus de 10 minutes, il vous enverra un message push. Contrairement à d'autre scénario, celui-ci contrôle l'état d'une porte/lumière/volet toutes les X secondes. Dans l'exemple de la porte de garage, si cet dernière a été fermée et ré-ouverte pendant les dernières 10 minutes, le compteur sera redémarré. Ce scénario permet de cumuler plusieurs avertissements, il vous suffit donc d'un seul scénario pour contrôler tout votre environnement :[/indent] GEA.add(28, 10*60, "La porte du garage est ouverte depuis plus de 10 minutes", {{"Repeat"}) GEA.add(69, 5*60, "La lumière du local technique est allumée depuis plus de 5 minutes") GEA.add({"Global", "Capsule", "100"}, 1*60, "Il faut commander du café, plus de capsule") GEA.add({"Sensor+", 19, 450}, 5*60, "Consommation du frigo excessive (#value#W), on l'éteint", {{"turnOff"}}) Voici un exemple minimaliste de scénario -- ================================================== -- A VOUS DE JOUER -- ================================================== GEA.checkEvery = 30 -- On vérifie toutes les X secondes GEA.portables = {70} -- Liste des portables devant recevoir une notification {70, 71} GEA.add(28, 10*60, "La porte du garage est ouverte depuis plus de 10 minutes", {{"Repeat"}}) GEA.add(69, 5*60, "", {{"turnOff"}}) -- Eteindre automatiquement le local technique -- Si un enfant allume sa lampe le soir, après 10mn le système la dim à 20%. Après 20mn le système éteint la lampe. GEA.add(66, 10*60, "Chambre Kendra allumée 20%", {{"Time", "22:00", "06:00"}, {"Value", 20}}) GEA.add(66, 20*60, "Chambre Kendra extinction", {{"Time", "22:00", "06:00"}, {"turnOff"}}) -- Variable global GEA.add({"Sensor+", 80, 100}, 30, "Consommation cafetière, café en cours", {{"Global", "Capsule", "inc+"}}) GEA.add({"Global", "Capsule", "100"}, 1*60, "Recommander du café") -- Sensor et valeur GEA.add({"Sensor+", 19, 100}, 1*60, "Consommation excessive de la WMC #value#") GEA.add({"Value-", 8, 18}, 30*60, "Il fait froid au salon #value# à #time#") -- NE PAS OUBLIER - Démarrage du scénario GEA.run() Special Thanks to : Fredric, Diuck, Domodial, moicphil, lolomail, byackee, JossAlf, Did, Hansolo, Shyrka973, fredo, jompa98 et tous les autres gars de Domotique-fibaro.fr Quelques exemples : GEA.add(28, 10*60, "La porte du garage est ouverte depuis plus de 10 minutes", {{"Repeat"}}) -- On vérifie toutes les 10mn si la porte du garage est ouverte et on envoi un message push. On répète l'opération tant que la porte n'est pas fermée. GEA.add(28, 10*60, "La porte du garage est ouverte depuis plus de 10 minutes", {{"Repeat"}, {"Time", "22:00", "06:00"}}) -- Idem de précédent mais on vérifie uniquement entre 22:00 et 06:00 GEA.add(28, 10*60, "La porte du garage est ouverte depuis plus de 10 minutes", {{"Repeat"}, {"Time", "22:00", "06:00"}, {"Time", "12:00", "13:00"}}) -- Idem de précédent mais on vérifie entre 22:00 - 06:00 et 12:00 - 13:00 GEA.add(28, 10*60, "La porte du garage est ouverte depuis plus de 10 minutes", {{"Scenario", 1}, {"Time", "22:00", "06:00"}, {"Time", "12:00", "13:00"}}) -- Si la porte du garage est ouverte plus de 10mn entre 22:00 - 06:00 ou 12:00 - 13:00, on lance le scénario 1 GEA.add(69, 5*60, "", {{"turnOff"}}) -- On éteint la lumière des toilettes automatiquement après 5 minutes GEA.add(69, 5*60, "", {{"turnOff"}, {"Global", "WC", "Allumé"}, {"Time", "22:00", "06:00"}}) -- On éteint la lumière des toilettes automatiquement après 5 minutes si ils ont été allumé entre 22:00 et 06:00 et on met la variable global "WC" à "Allumé" GEA.add(19, 5*60, "Lumière extérieur est éteinte", {{"Inverse"}, {"Time", "Sunset", "Sunrise"}, {"Portable", 71}}) -- Si la lumière extérieur est éteinte (inverse) depuis plus de 5minutes entre le couché du soleil et le levé on envoi un message push au portable ayant l'ID 71 au lieu de celui par defaut. GEA.add(69, 5*60, "", {{"Global", "Karotz", "WC occuper"}, {"VirtualDevice", 20, 1}}) -- Si la lumière est allumée plus de 5mn, on met la variable "Karotz" à "WC occuper" et on appuie sur le bouton (id : 1) du module virtuel (id : 20) GEA.add(69, 5*60, "", {{"Days", "Weekend, Monday"}}) -- On vérifie si la lumière est allumée plus de 5mn, uniquement les Samedis, Dimanches et Lundi -- On dimme la lampe à 20% si elle est allumée plus de 10mn entre 22:00 et 06:00 puis après 20mn on l'éteint GEA.add(31, 10*60, "", {"Time", "22:00", "06:00"}, {"Value", 20}}) GEA.add(31, 20*60, "", {"Time", "22:00", "06:00"}, {"turnOff"}}) -- Variable globale -- si la variable "Capsule" contient "100" depuis plus d'une minute GEA.add({"Global", "Capsule", "100"}, 1*60, "Commander du café, plus de capsule") -- Batterie -- parcours les 350 premiers modules à la recherche de pile inférieur ou égal à 40% GEA.add({"Batteries", 40}, 24*60"60, "", {{"Repeat"}}) -- Sensors -- Si le frigo comsomme trop depuis 5 minutes (plus de 450W), on l'arrête GEA.add({"Sensor+", 19, 450}, 5*60, "Consommation excessive #value# > 450W", {{"turnOff"}}) -- Si le frigo ne comsomme pas assez depuis 5 minutes (moins de 3W), on averti GEA.add({"Sensor-", 19, 3}, 5*60, "Consommation insuffisante #value#< 3W", {{"Repeat"}}) -- Value GEA.add({"Value-", 8, 20}, 1*60, "Il fait froid au salon #value# à #time#") -- moins de 20 GEA.add({"Value+", 8, 22}, 1*60, "Il fait trop chaud #value# au salon depuis #duration#") -- plus de 22 -- RGB si la consommation du frigo est trop élevée (> 450W) GEA.add({"Sensor+", 19, 450}, 1*60, "Le périphérique #name# consomme trop (#value#)", {{"RGB", 27, 100, 0, 100, 100}}) -- Slider - attribue 100 à la valeur d'un slider (1) du module virtuel (27) si la lampe (19) est allumée depuis 1 minutes GEA.add(19, 1*60, "", {{"Slider", 27, 1, 100}}) -- Programme - lance le programme 5 du module 23 si la lampe (19) est allumée depuis 1 minutes -- puis éteint la lampe 19 GEA.add(19, 1*60, "", {{"Program", 23, 5}, {"turnOff"}}) -- Dead GEA.add({"Dead", 27}, 1*60, "Le périphérique #name# ne répond plus", {{"WakeUp", 27}}) -- Détecteur (id 200) avec allumage de lampe (id 100) -- Chaque détection redémarre le time de la lampe local myTask = GEA.add(100, 5*60, "Extinction de la lampe après 5mn", {{"turnOff"}}) GEA.add(200, -1, "", {{"RestartTask", myTask}}) -- Groupes GEA.add({"Global", "absent", "oui"}, 10*60, "", {{"Group", 2}}) GEA.add(19, 10*60, "", {{"Group", 2}}) GEA.add({"Group", 2}, 5*60, "Absent mais la lampe (19) est encore allumée, extinction", {{"turnOff", 19}}) -- Si la variable global "absent" est sur "oui" depuis 10 minutes -- Si la lampe 19 est allumée depuis 10 minutes -- Si ces éléments sont vrai pendant plus de 5 minutes alors j'envoi un push et j'éteint la lampe 19. Déclenchement instantané La version 3+ permet de déclenché ce script en instantané Exemple allumé la lampe (65) à l'ouverture de la porte (18) et l'éteindre à la fermeture --[[ %% autostart %% properties 18 value %% globals Capsule --]] ... GEA.add(18, -1, "", {{"turnOn",65}}) GEA.add(18, -1, "", {{"Inverse"},{"turnOff",65}}) GEA.add({"Global","Capsule", "100"} Paramètre "If" La version 3.10 voit naître le paramètre "If". Ce dernier permet de valider un certain nombre de conditions avant de valider l'événement. -- Si la lumière (69) est allumée un Lundi, Samedi ou Dimanche -- ET que "Vacances = 0" ET que "Absence" = 1 -- ET que la température (8) est inférieur à 18° local condition = {"If",{{"Global", "Absence", "1"},{"Global", "Vacances", "0"},{"Value-", 8, 18}}} GEA.add(69, -1, "La lumière est allumée", {{"Days", "Monday, Weekend"}, condition}) Historique des versions : Version 1.10 [Nouveauté] Si vous mettez "turnOff" comme message, le scénario ne vous enverra pas d'avertissement mais éteindra directement le périphérique en question [Fix] Correction pour les périphérique de type dimmable_light et binary_light Version 1.20 [Nouveauté] GEA.getGlobalForActivation Cette nouvelle fonctionnalité permet de suspendre/activé le scénario par le biais d'une variable global GEA.getGlobalForActivation = {"Alerte", "activé"} -- Le scénario ne fonctionnera que si la variable globale "Alerte" contient "activé" [Nouveauté] GEA.setGlobalMessages Cette nouvelle fonctionnalité permet de mettre a jour une variable globale au lieu d'envoyé un message push. GEA.setGlobalMessages = {{"SARAH:", "parle"}, {"KAROTZ:", "Karotz"}} -- Indique au scénario que si le message contient "SARAH:" ou "KAROTZ:" le scénario doit mettre à jour la variable "parle" ou "Karotz" au lieu d'envoyé un message push. [Nouveauté] Repeat Vous pouvez ajouté un dernier paramètre à la fonction GEA.add pour indiquer si l'avertissement doit être répété ou non. GEA.add(71, 5*60, "Toilette r-c allumée") -- l'avertissement ne sera pas répété GEA.add(71, 5*60, "Toilette r-c allumée", true) -- l'avertissement sera répété GEA.add(71, 5*60, "Toilette r-c allumée", false) -- l'avertissement ne sera pas répété Version 1.30 - Refonte globale [supprimé] GEA.setGlobalMessages Cette fonctionnalité est remplacée par le paramètre {"Global", "MaVariable", "MaValeur"} [supprimé] Repeat Le paramètres Repeat a été supprimé et remplacé par le paramètre {"Repeat"} Version 1.40 [Ajouté] Paramètre {"Days", "..."} [Ajouté] Sunset et Sunrise {"Time", "Sunset", "Sunrise"} Version 1.41 [Fix] Suppression du message "hors plage horaires" prêtant à confusionVersion 1.42 [Fix] Si une plage horaires est définie et que la vérification à lieu dans cette même plage, le scénario ne contrôlait plus le paramètre {"Days"}Version 1.50 [Ajouté] Paramètre {"Value", <valeur>} Ce paramètre permet de modifier la valeur d'un périphérique. Utiliser principalement pour dimmer une lampe par exemple on dimme la lampe à 20% si elle est allumée plus de 10mn entre 22:00 et 06:00 puis après 20mn on l'éteint. GEA.add(31, 10*60, "", {"Time", "22:00", "06:00"}, {"Value", 20}}) GEA.add(31, 20*60, "", {"Time", "22:00", "06:00"}, {"turnOff"}})Version 1.51 [Ajouté] Message d'avertissement lorsque le scénario est suspenduVersion 1.52 [Modifié] Trace plus clair en mode "debug"Version 1.55 [Optimisation] Optimisation du codeVersion 1.60 [Nouveauté] Ajout de déclencheur Avant, il n'était possible uniquement d'avoir comme déclencheur l'identifiant d'un périphérique et le système utilisait sont état (actif ou non). Il est maintenant possible d'avoir comme déclencheur une variable global ou la valeur d'un sensor (voir les derniers exemples)Version 1.70 [Nouveauté] Ajout des déclencheurs "Value+", "Value-" et "Dead" [Nouveauté] Ajout des actions "Email", "Label" et "WakeUp" [Nouveauté] Ajout de variables dans le message : time, duration, value, date, seconds, name Version 1.71 [Nouveauté] Possibilité de précisé un ID différent pour turnOn ou turnOff (ex : {"turnOff", 21})Version 1.80 [Nouveauté] Ajout des actions "Program", "RGB" et "Slider" [Nouveauté] Ajout de la propriété {"Group", 1} [Nouveauté] Ajout du déclencheur {"Group", 1} Version 1.81 [Fix] Gestion des groupesVersion 2.00 [Modification] Renommage du projet (anciennement Wdtiso)Version 2.01 [Nouveauté] Ajout de l'action {"Value", <id>, <valeur>} permettant de modifier la valeur d'un module autre que celui testéVersion 3.00 [Nouveauté] Ajout de l'action {"Open"} et {"Close"} permettant d'ouvrir fermer les volets [Nouveauté] Ajout de l'action {"Open", valeur} et {"Close", valeur} permettant d'ouvrir fermer les volets selon un pourcentage [Nouveauté] Ajout de l'action {"Open", id, valeur} et {"Close", id, valeur} permettant d'ouvrir fermer les volets du module (ID) selon un pourcentage [Nouveauté] Possibilité des déclencheurs %%properties et %%globales avec comme durée -1 Version 3.10 [Correction] Correction des modes {"Open", <id>, <value>} et {"Open", <id>, <value>} [Nouveauté] Ajout du paramètre {"DST"} permettant de vérifié l'heure d'été [Nouveauté] Ajout du paramètre {"If", {[{condition}][,{condition}[,...]]}} Permet de valider X conditions avant de lancer les actions Version 3.15 [Nouveauté] Ajout du paramètre {"NOTDST"} permettant de vérifié l'heure d'hiverVersion 3.20 [Fix] Correction des paramètres {"DST"} et {"NOTDST"} [Modification] Une correction est maintenant appliquée sur le délai entre 2 vérifications selon la durée de traitement des événements. Exemple, vous avez spécifier un intervalle de 30 secondes entre 2 passage. La durée de traitement est de 1 seconde, le nouveau délai sera donc de 29 secondes Version 3.21 [Modification] #duration# affiche dorénavant la vrai durée et au format Xh Xm Xs (La porte est ouverte depuis 5m 30s) [Nouveauté] Ajout de l'action {"Stop"} et {"Stop", <id>} Version 3.30 [Nouveauté] Ajout de l'options {"Dates", "01/01[/2014]", "31/01[/2014]"} [Nouveauté] Ajout de l'option {"Time", "Sunrise<07:30", "Sunset<22:00 [Nouveauté] Ajout de l'option {"Time", "Sunrise+20", "Sunset-100"} [Nouveauté] Ajout de la variable #durationfull# pour les message (3 heures 5 minutes 30 secondes) [Nouveauté] Les variables de message #time#, #duration#, #date#, ... sont utilisable dans les variables globales, les labels et les emails [Nouveauté] Supporte le format d'heure H:mm [Nouveauté] Ajout des options {"Armed"} et {"Disarmed"} [Nouveauté] Ajout de la condition {"Battery", <id>, <valeur max>} [Correction] Correction du paramètre {"Email", <id user>} [Optimisation]Isolation des commandes en cas d'erreur [Optimisation]Ajout de validations techniques Version 3.40 [Nouveauté] Ajout de la condition {"Batteries", <valeur max>} [Nouveauté] Ajout de la condition {"SceneActivation", <id module>, <id scene>} [Correction] détection activation/désactivation sur module RGB par @HANSOLO Version 3.50 [Nouveauté] Ajout des conditions {"Global+", <variable>, <valeur>} et {"Global+", <variable>, <valeur>} par @HANSOLO [Nouveauté] Ajout des conditions {"setArmed", <id>} et {"setDisarmed", <id>} [Correction] Erreur lorsqu'un module à pile ne retourne pas son information [Correction] Mode debug dans certains circonstance Version 3.51 [Correction] Batteries, la valeur n'était pas prise en compte et fixée à 80 [Correction] #durationfull# amélioration en utilisant le "et" (exemple : 1 heure et 30 minutes, 23 minutes et 30 secondes, 1 heure 20 minutes et 30 secondes,...) Version 3.60 [Nouveauté] Ajout de la condition {"Slider-", <id_vd>, <nom_slider>, <valeur>} [Nouveauté] Ajout de la condition {"Slider+", <id_vd>, <nom_slider>, <valeur>} [Nouveauté] Ajout de la condition {"Label", <id_vd>, <nom_label>, <contenu>} Version 3.61 [Correction] Les options Label et Slider introduit dans la v1.70 ne fonctionnaient pas correctementVersion 3.62 [Amélioration] Etat des capteurs (mouvement, porte, inondation) par @Shyrka973 [Amélioration] Coloration des logs pour plus de lisibilité (inspiré du Maestro @Krikroff) Version 3.65 [Amélioration] Déportation du code utilisateur en début de script, proposition de @fredo [Nouveauté] Ajout de l' action {"Global", <variable>, "inc+"} pour incrémenter de 1 automatiquement la variable [Nouveauté] Ajout de l' action {"Global", <variable>, "dec-"} pour décrémenter de 1 automatiquement la variable Version 3.70 [Amélioration] RGBW : permettre de spécifier chaque canal indépendamment par @Shyrka973Version 3.75 [Nouveauté] GEA devient multilingue. Par défaut le français est conservé.Version 3.80 [Nouveauté] Possibilité de stopper n'importe quel tâche {"StopTask", <id_task>}. [Nouveauté] Possibilité de redémarrer n'importe quel tâche {"RestartTask", <id_task>}. [Nouveauté] Possibilité de spécifier le nombre d’exécution d'une tâche {"MaxTime", <number>} [ATTENTION] Veuillez créer la variable globale GEA_Tasks Version 3.81 [Correction] {"StopTask", <id_task>}, {"RestartTask", <id_task>} et {"MaxTime", <number>} était issu d'une mauvaise implémentation. [Nouveauté] Add {"Global!", <variable>, <value>} Pour vérifier qu'une variable globale ne soit pas égale à la valeur. [Nouveauté] Ajout de la variable #runs# dans les messages pour savoir le nombre de fois que la tâche a été exécutée. [ATTENTION] Veuillez créer la variable globale GEA_Tasks Version 3.82 [Correction] réparation du {"Repeat"} cassé lors de la 3.81. (thanks jompa68) [Amélioration] Ajout du code de Shyrka973 affichant l'ID d'un module déclenchant GEA sans pour autant avoir de tâche à effectuer. Version 4.017 [Correction] Mise en phase avec la version du firmware 4.017. (thanks jompa68)Version 4.020 [Adaptation] Mise en phase avec la version du firmware 4.017 et plus. [Nouveauté] Multiple condition pour remplacer les If [Nouveauté] #value[index]#, #name[index]# et #room[index]# indexé par périphérique. Version 4.021 [Correction] Impossible d'éteindre un dimmer.Version 4.10 [Correction] Déclenchement instantané : prise en compte de Global!, Global+ et Global-. [Nouveauté] {"Weather", "rain"} permet de savoir s'il pleux [Nouveauté - condition] {"Property", <id_module>, <nom propriété>, <valeur>} Permet de savoir si la propriété <nom propriété> du module <id module> est égala à <valeur> [Nouveauté - condition] {"Property!", <id_module>, <nom propriété>, <valeur>} Permet de savoir si la propriété <nom propriété> du module <id module> est égala à <valeur> [Nouveauté - action] {"CurrentIcon", <id_module>, <id_icon>} Permet modiifier l'icone d'un module virtuel [Nouveauté - action] {"CopyGlobal", <ivar_source>, <var_dest>} Permet copy la variable global <var source> dans <var dest> [Nouveauté] Utilisation des regex pour Value, Property, Weather, Global, et Label ainsi que leur déclinaison. Version 5.00 [Correction] Message indiquant les piles faibles {Batteries} [Correction] #value[?]#, #room[?]# sont maintenant corrigé [Correction] Allumage et extinction des module RGB [Correction] {"Global", "", ""} ne fonctionne plus en 4.x et est maintenant transformer en "true" à la volée [Ajout] l'option {"NotStarted"} empêche une tache de démarrer automatiquement (c.f. RestartTask pour la démarrer) [Ajout] {"Email", <id utilisateur>[, <sujet>]} Le sujet du message peut maintenant être personnalisé. Attention, pour obtenir l'icone en 128x128, veuillez préalablement cliquer dessus avant de l'enregistrer. GEA._5_00.lua
  22. Did

    Heure d'été

    Bonjour, J'ai découvert une commande Lua "isdst" qui permet de savoir si nous sommes en heure d'été. On doit pouvoir stocker cette réponse "true" dans une variable Saison mais je ne sait pas si il y a une réponse "false" pour les mois d'hiver. Quelqu'un a une idée sur les lignes de commande Lua pour récupérer cette info dans le panneau des variables? Merci.
  23. Hello, finalement tu as craqué! Les négociations ont été difficiles? Alors, ça donne quoi?
  24. PITP2

    Owser

    Voici un tuto pour récupérer les valeurs des capteurs connectés à un serveur Owserver L'Owserver est un boitier raccordé sur le réseau permettant d'y connecter des sondes 1wire et de voir les valeurs en l’interrogeant depuis un navigateur. Je l'ai depuis 5 ans maintenant et il me permet de remonter les données de sondes de température DS18B20 de ma piscine. Je précise que le code a été développé par Steven et qu'il ne remonte pour l'instant que les sondes de température mais moyennant peu de changement dans le code il doit être possible de récupérer les valeurs d'autres sondes (Hygro, luminosité etc) Le virtuel Device remonte les données de 4 capteurs. Un bouton mise à jour permet de forcer la récupération des valeurs. Les valeurs sont remontées toutes les minutes. Il faut bien entendu indiquer votre adresse IP local OwserverURL = Net.FHttp("192.168.0.3"); local xml = OwserverURL:GET("/details.xml"); Fichier icone de l'owserver et le fichier du Virtual Device Owserver.vfib
  25. Domotique-Home

    [Lua - Leçon 2] – Association De Modules

    La scène précédente (Leçon 1) avait un inconvénient important – elle devait être déclenchée manuellement. Aujourd’hui je vais vous expliquer comment automatiser une scène en code LUA. Nous allons allumer une lumière à l’ouverture de la porte. Pour cela nous allons utiliser deux modules : - binary_light (vu dans la Leçon 1) - door_sensor (détecteur d’ouverture de porte/fenêtre) Pour comprendre comment fonctionne door_sensor nous allons nous aider d’API fibaro:debug déjà vu dans la Leçon 1. (nous supposons que notre door_sensor porte le numéro ID = 22 et notre binary_light a toujours ID = 100) –[[ %% properties 22 value %% globals --]] local doorSensorValue = fibaro:getValue(22, ‘value’) fibaro:debug(‘Mon etat = ‘ .. doorSensorValue) Nous déclarons notre variable doorSensorValue et grâce à la commande fibaro:getValue (Leçon 1) nous luis attribuons l’état actuel de notre door_sensor. En exécutant la scène manuellement dans la console Debug on obtient Mon etat = 0 ou Mon etat = 1 en fonction de l’état de notre module. Une fois activée la scène nous donnera l’état du module à chaque changement. Utilisons cela pour activer notre deuxième module binary_light –[[ %% properties 22 value %% globals --]] – Lecture de l’état value du module 22 door_sensor local value = fibaro:getValue(<doorSensor>, ‘value’) — si l’état door_sensor = 1 alors on allume la lumière if (value == ’1′) then fibaro:call(100, ‘turnOn’) end La scène fonctionne bien mais la lumière va s’allumer à chaque ouverture de porte donc pour que cela ne fonctionne plus il faut désactiver notre scène ou…… tous simplement allumer la lumière si notre door_sensor est activé. Il faut modifier notre script. –[[ %% properties 22 value %% globals --]] – Lecture de l’état value du module 22 door_sensor local value = fibaro:getValue(22, ‘value’) – Lecture de l’état d’activation du module 22 door_sensor local armed = fibaro:getValue(22, ‘armed’) – si l’état value door_sensor = 1 et il est activé alors on allume la lumière if (armed == ’1′ and value == ’1′) then fibaro:call(100, ‘turnOn’) end Et voilà
×