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. Dgille

    Météo avec WeatherBit.IO

    Bonjour à tous, voici une scène et un VD sans prétention pour accéder aux données météo de WeatherBit.io. Le paramétrage est simplissime, créer un compte sur le site et récupérer votre APIkey. En l'absence du code de la ville, la scène récupère les données de localisation de la HC2. Sinon, vous pouvez télécharger sur le site la liste des villes supportées et indiquer directement le code ville dans la variable WBCityid La scène est en manuel par défaut. Elle stocke bêtement la réponse json dans une VG. La langue de description de la météo est paramétrable (cf le site), mis en français par défaut. Deux solutions pour l'exploiter: - Vous la lancez via GEA et exploitez directement le JSON - Plus simple, vous installez le VD de ce post qui va lancer la scéne à une fréquence à définir (entre 2 et 45mn) et afficher les principales informations (vous pouvez compléter si nécessaire) pour exploitation par d'autres scènes/VD. Perso, je n'exploite que la température extérieure, mais tout est possible. Voici le code de la scène: --[[ %% properties %% events %% globals --]] -- DGILLE - V1 -- Quelques paramétres à fixer WBApikey = "xxxxxxxxxxxxxxx" -- API KEy Wetaher bit WBCityid ="" -- Code ville, sinon vide pour latitude longitude de la HC2 WBlang = "fr" -- un peu de code de Steven (Merci !!) VG={getValue=function(self,b)return fibaro:getGlobalValue(b)end,setValue=function(self,b,c)fibaro:setGlobal(b,c)end,getDateModification=function(self,b)return os.date("*t",fibaro:getGlobalModificationTime(b))end,supprimer=function(self,b)api.delete("/globalVariables/"..b)end,modifier=function(self,b,c,d)local e={}e.value=tostring(c)e.isEnum=false;if type(d)~="nil"then e.isEnum=true;e.enumValues=d end;api.put("/globalVariables/"..b,e)end,ajouter=function(self,b,c,d)local f=0;if type(d)~="nil"then f=1 end;api.post("/globalVariables",{name=b,isEnum=f})self:modifier(b,c,d)end,traiter=function(self,b,c,d)if fibaro:getGlobalValue(b)==nil then self:ajouter(b,c,d)elseif type(d)=="nil"then self:setValue(b,c)else self:modifier(b,c,d)end end,getInfo=function(self,b)return api.get("/globalVariables/"..b)end} function getResponseData(url, method, body, func) local http = net.HTTPClient() http:request(url, { options = { method = method, headers = { ["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/64.0", ["Content-Type"] = "application/json", }, data = body }, success = function(response) fibaro:debug(" Analyse de la réponse du site..") if (response.status==200) then VG:setValue("weatherbit",response.data) else fibaro:debug ("Erreur de récupération des données :"..response.status) fibaro:abort() end end, error = function(err) fibaro:debug("Erreur.."..response.status) fibaro:abort() end, }) end -- au boulot local url fibaro:debug ("Lancement de la scéne") VG:traiter("weatherbit", "") -- construction de l'URL if (WBCityid=="" )then fibaro:debug ("Pas de code ville - Utilisation de la localisation de la HC2") local loc=api.get("/settings/location") url = "https://api.weatherbit.io/v2.0/current?lat="..loc.latitude.."&lon="..loc.longitude.."&lang="..WBlang.."&key="..WBApikey else fibaro:debug ("Utilisation du code ville fourni.") url = "https://api.weatherbit.io/v2.0/current?city_id="..WBCityid.."&lang="..WBlang.."&key="..WBApikey end fibaro:debug ("appel de l'URL :"..url) getResponseData(url, "GET", nil) Pour paramétrer la VD, il suffit de lui indiquer dans la main loop l'ID de la scène créée précédemment. Voila, tout cela à été codé en 2h suite au mauvais fonctionnement des plugins YR Weather et Yahoo et fonctionne sans problème depuis plusieurs jours. Enjoy. WeatherBit.vfib
  2. Barelle

    VD UPS

    Hello, Comme vous le savez, nos matériels électroniques n’apprécient pas du tout les coupures électriques. Pour cela, il est plus que recommandé d’utiliser un onduleur (ou UPS, "Uninterruptible Power Supply")… Le VD que je vous propose ici permet l’interrogation du serveur UPS résidant sur un NAS Synology (auquel l’onduleur est connecté par un port USB). Il met à jour une variable globale (appelée UpsStatus par défaut) avec les valeurs "power-line" ou "battery" selon que l’onduleur est sur secteur ou sur batterie. Cette variable globale permet le lancement de la scène ci-après qui : - lors d’un passage sur batterie, après le délai "delayBeforePowerOff" réalisera l’arrêt de la HC2 ; - lors du retour de l’alimentation, appuiera sur le bouton "WOL" du VD. Là aussi, le réveil se fera après un délai "delayBeforeWakeUp". Ces délais ont pour objet de s’affranchir de retours temporaires de tension. --[[ %% properties %% events %% globals UpsStatus --]] local globalVarName = "UpsStatus"; -- values "power-line" or "battery" local wolVdId = "337"; local wolVdBtnId = "11"; local delayBeforePowerOff = 5; -- minutes local delayBeforeWakeUp = 5; -- minutes local debug = true; function trace(text, color) color = color or "white"; if debug then fibaro:debug("<font color='"..color.."'>"..text.."</font>"); end end -- trace function tracerr(text, color) color = color or "red"; fibaro:debug("<font color='red'>ERROR! </font>".."<font color='"..color.."'>"..text.."</font>"); end -- tracerr function wakeOnLan() fibaro:call(wolVdId, "pressButton", wolVdBtnId); end -- wakeOnLan local sourceTrigger = fibaro:getSourceTrigger(); trace("sourceTrigger[type] = " .. sourceTrigger["type"], "deepskyblue"); if (sourceTrigger["type"] == "global") then if (sourceTrigger["name"] ~= globalVarName) then tracerr("unknown global "..sourceTrigger["name"].." exiting"); fibaro:abort(); end elseif (sourceTrigger["type"] == 'other') then trace("Scene triggered manually", "lightgreen"); -- inform user local upsStatus = fibaro:getGlobalValue(globalVarName); if (upsStatus ~= nil) then trace(globalVarName.." = "..upsStatus, "lightgreen"); fibaro:abort(); end else tracerr("unexpected trigger type ".. sourceTrigger["type"], "orange"); fibaro:abort(); end if (fibaro:countScenes() > 1) then trace("Script already running, exiting.", "green"); return; end local upsStatus = fibaro:getGlobalValue(globalVarName); if (upsStatus == nil) then tracerr("global "..globalVarName.." = nil"); fibaro:abort(); end if (upsStatus == "power-line") then local i = 0; for i = 1, (delayBeforeWakeUp * 6) do -- check every 10 seconds during delayBeforeWakeUp minutes fibaro:sleep(10 * 1000); -- ten seconds upsStatus = fibaro:getGlobalValue(globalVarName); if (upsStatus ~= "power-line") then trace("Still on battery, aborting", "orange"); fibaro:abort(); -- not stable end end -- Time to wake up devices trace("Waking up devices", "lightgreen"); wakeOnLan(); elseif (upsStatus == "battery") then local i = 0; for i = 1, (delayBeforePowerOff * 6) do -- check every 10 seconds during delayBeforePowerOff minutes fibaro:sleep(10*1000); -- ten seconds upsStatus = fibaro:getGlobalValue(globalVarName); if (upsStatus ~= "battery") then trace("Power is back, shut down aborted", "orange"); fibaro:abort(); end end -- shutdown HC2 gracefully trace("shutting down", "lightgreen"); fibaro:sleep(10*1000); HomeCenter.SystemService.shutdown(); else tracerr("global "..globalVarName.." unknown value: "..upsStatus); end Installation du VD : - Importer le VD, - Renseigner l’adresse IP du NAS connecté à l’onduleur, le port TCP 3493 est optionnel. - Les username et password présents dans le code du bouton Update fonctionnent pour un Synology. - Dans le code du bouton WOL, vous devrez préciser les adresses MAC des matériels que vous souhaitez réveiller. Il va de soi qu’ils devront être paramétrés pour accepter les "magic packets" afin d’être réveillés (pour les PC vérifier les paramètres de la carte réseau). - Pour les Nas Synology, il faut activer le WOL : "Panneau de configuration", "Matériel et alimentation", onglet "Général", cocher "Activer WOL sur le réseau local x". - Et ne pas oublier d’activer le serveur réseau UPS : "Panneau de configuration", "Matériel et alimentation", onglet "UPS", cocher "Activer la prise en "charge UPS" et "Activer le serveur réseau UPS"). - Enfin bien sûr, trouver une jolie icône pour les boutons du VD. Installation de la scène : - Préciser l’id du VD réalisant le WOL dans "wolVdId". - et le numéro du bouton à appuyer "wolVdBtnId". Pour ceux qui veulent personnaliser le VD, le code du bouton "Update" contient, à la fin, une description des principaux champs retournés par les serveurs UPS, Tous ne sont pas implémentés par Synology ou mon onduleur. Configuration utilisée pour les tests : - HC2 : 4.153 Beta - Onduleur : Eaton Ellipse PRO 1200 - NAS : Synology DS1010+ with DSM 5.2-5967 Update 6 Joyeux réveillon et bonne année à tous… UPS.vfib
  3. OJC

    Heating Manager

    HEATING MANAGER v. 3.1.2 - 16/12//2017 Heating Manager est un programme permettant d'utiliser le Home Center 2 pour gérer avec une grande souplesse le chauffage d'une habitation, en permettant de franchir une étape supplémentaires dans la gestion de celui-ci. En effet, s'il est parfaitement capable de fonctionner en suivant une planification, Heating Manager permet de passer à l'étape suivante et d'exploiter pleinement les potentialités de la domotique en se passant totalement de planification et en gérant le chauffage sur une base événementielle exclusivement dynamique. Heating Manager, qui propose de réguler le chauffage sur un mode proportionnel avec prise en compte des déperditions (Ubat) ou sur un mode classique avec hystérésis, est compatible avec n'importe quel système de commande de chauffage, y compris des modules virtuels. Il peut fonctionner en tout ou partie en mode planification via l'utilisation des panneaux de chauffage natifs du Home Center 2, de modules dédiés ou de variables globales. En mode événementiel, il peut s'appuyer sur n'importe quelle propriété de n'importe quel module, virtuel ou non, ainsi que sur des variables globales. L'utilisation de boucles conditionnelles dans la configuration permet en outre de faire varier cette configuration en fonction de n'importe quelle condition. Ces développements doivent beaucoup aux échanges stimulants intervenus sur ce fil de discussion, qui m'ont amené à aller bien plus loin que ce qui était prévu au départ, à savoir simplement pouvoir utiliser les panneaux de chauffage avec les modules fils pilote proposés par Qubino... Que tous soient remerciés , ainsi que ceux qui relèvent des bugs et permettent d'améliorer le script. _ _ _ PRE-REQUIS Ce programme a été conçu et testé sur le Home Center 2 tournant avec le firmware v. 4.140. Il ne requiert aucun matériel particulier et peut s'adapter facilement à toutes les configurations. _ _ _ INSTALLATION 1. Pour une utilisation en tout ou partie en mode planification, il faut commencer par définir les plannings de chauffe souhaités. La première étape dans cette optique de fonctionnement est de définir un planning de chauffe dans lequel Heating Manager ira chercher la température de consigne à atteindre. Ce planning de chauffe peut être mis en place en utilisant les panneaux de chauffage fournis nativement par le Home Center 2. Attention cependant, un bug a été constaté, évoqué dans ce fil, entraînant l'absence de prise en compte du changement de température de consigne après minuit. Il peut également être mis en place en utilisant n'importe quel module virtuel ou bien celui, basique, fourni avec Heating Manager >>>> Heating_Provider.vfib Pour utiliser ce module virtuel, il faut adapter la configuration donnée en exemple à votre cas en modifiant, et en ajoutant le cas échéant, les étiquettes, chaque étiquette correspondant à une zone de chauffage. La définition du planning de chauffe pour chacun de ces zones intervient dans le main loop du module virtuel, dans la partie Configuration : HeatingManager:add(zone, day, time, temperature) zone correspond au nom d''une étiquette du module virtuel day est soit un ou plusieurs jours de la semaine (en anglais e.g. {"monday","friday"}), soit "weekday" (du lundi au vendredi), soit "weekend", soit "week" time est l''heure à laquelle la température de consigne devra être appliquée "hh:mm" temperature est la température de consigne devant être appliquée à compter de l''horaire défini juste avant Il est important que la construction du planning de chauffe soit faite de manière chronologique, le module virtuel ne faisant pas de tri chronologique, ce qui peut entraîner un comportement s'écartant de celui attendu. 2. Pour une utilisation en tout ou partie en mode événementiel, il faut importer un thermostat par pièce concernée >>>> Thermostat.vfib Ce module virtuel permet de définir la température de consigne (mode Confort et mode Economique) pour la pièce, de forcer l'un de ces deux modes ou de passer en mode manuel avec un minuteur permettant de retourner au mode automatique. Les ordres donnés par l'intermédiaire de ce module viruel l'emportent sur toute autre évènement défini dans la configuration de Heating Manager. Il faut juste mettre un module virtuel dans chaque pièce. Sa détection par Heating Manager se fait automatiquement. 3. [OPTIONNEL] Pour afficher de manière centralisée les températures de consigne en cours, il faut installer le module virtuel Heating Viewer >>>> Heating_Viewer.vfib Pour le bon fonctionnement de ce module, chaque pièce dont le chauffage est géré par Heating Manager doit avoir une étiquette, dont l'ID doit être le nom de cette pièce débarrassé de tous les accents, espaces et autres caractères exotiques. Ainsi, pour la pièce "Séjour Principal #1", l'ID de l'étiquette doit être "SejourPrincipal1". Les étiquettes inutilisées peuvent être supprimées, tout comme il peut être ajouté autant d'étiquettes que nécessaire. 4. Création d'une scène en mode Lua avec copier-coller du code >>>> Heating Manager - Scène.lua La configuration de Heating Manager est réalisée par l'exécution de neuf fonctions différentes à paramétrer dans la partie USER CONFIGURATION ZONE qui se trouve à partir de la ligne 100 du code. self:setConfiguration(checkConfig, oldLastTempUpdate, logInfo, pushWarnErrLog, pushTo, popupWarnErrLog, logMemory) checkConfig est un booléen dont la valeur par défaut est true, qui permet de définir si Heating Manager doit contrôler de manière approfondie la configuration (existence des pièces, des modules, des propriétés de modules, des variables globales, etc.) Une fois que votre configuration est rodée et fonctionne sans problème, vous pouvez passer ce paramètre à false. oldLastTempUpdate est un nombre dont la valeur par défaut est 180 et qui est le nombre de minutes depuis la dernière remontée de température d'une sonde intérieure au-delà duquel Heating Manager adressera un message d'alerte et arrêtera la chauffe. logInfo est un booléen dont la valeur par défaut est true et qui permet de définir si l'intégralité des messages doit s'afficher dans la fenêtre de debug, ou uniquement les plus importants (action, survenance d'un événement, changement de la température de consigne). pushWarnErrLog est un booléen dont la valeur par défaut est false et qui permet de définir si les messages d'alerte et d'erreur doivent faire l'objet d'une notification Push. pushTo est une table contenant l'ID des téléphones mobiles auxquels envoyer les notification Push si le paramètre précédent est à true. popupWarnErrLog est un booléen dont la valeur par défaut est false et qui permet de définir si les messages d'alerte et d'erreur doivent faire l'objet d'une notification dans le centre de notification du Home Center 2. logMemory est un booléen dont la valeur par défaut est true et qui permet d'afficher dans la fenêtre de debug, toutes les cinq minutes, la mémoire utilisée par Heating Manager. self:setProportionalMode(default_kP, auto_kP, default_kT, cycle, minCycle, defaultSetpoint) Cette fonction ne doit être utilisée que si vous souhaitez utiliser le mode de régulation proportionnel. default_kP est un nombre dont la valeur par défaut est 60 et qui est le coefficient proportionnel utilisé par Heating Manager dans le cadre de la régulation proportionnelle si aucun coefficient particulier n'est défini pour un radiateur donné. auto_kP est un booléen dont la valeur par défaut est true et qui permet de définir si Heating Manager doit adapter le coefficient proportionnel en fonction de l'expérience acquise lors des cycles de chauffe. default_kT est un nombre dont la valeur par défaut est 1 et qui est le coefficient de déperditions thermiques (Ubat) utilisé par Heating Manager dans le cadre de la régulation proportionnelle si aucun coefficient particulier n'est défini pour un radiateur donné. La valeur 1 correspond à une maison bien isolée. Pour un bâtiment mal isolé, ce coefficient peut être fixé à 3. cycle est un nombre dont la valeur par défaut est 15 et qui est la durée d'un cycle de chauffage en minutes, au sein duquel s'insère la période de chauffe calculée par Heating Manager. minCycle est un nombre dont la valeur par défaut est 1 et qui est la durée minimale en minutes d'une période de chauffe. defaultSetpoint est soit comfort, soit eco (sans guillemets) et permet de déterminer, uniquement pour un fonctionnement en mode événementiel, si la consigne à appliquer en dehors de tout événement est la température de confort définie dans le thermostat virtuel ou la température économique. La valeur par défaut est comfort. self:setHysteresisMode(hysteresis, cycle, defaultSetpoint) Cette fonction ne doit être utilisée que si vous souhaitez utiliser le mode de régulation par hystérésis. hysteresis est un nombre dont la valeur par défaut est 0 et qui est l'écart en degré entre la température courante et la température de consigne au-delà ou en-deça duquel le chauffage sera démarré. cycle est un nombre dont la valeur par défaut est 15 et qui est l'intervalle en minutes entre deux comparaisons de la température courante et de la température de consigne. defaultSetpoint est soit comfort, soit eco (sans guillemets) et permet de déterminer, uniquement pour un fonctionnement en mode événementiel, si la consigne à appliquer en dehors de tout événement est la température de confort définie dans le thermostat virtuel ou la température économique. La valeur par défaut est comfort. self:setEventDefaults(eCumulative, eSetpoint, eDuration, eStep, ePersistence) eCumulative est un booléen dont la valeur par défaut est true et qui permet de définir si les conditions d'un événement doivent toutes être réalisés pour que l'événement soit considéré comme survenu, ou si la réalisation d'une seule condition est suffisante. Il s'agit ici de définir la valeur par défaut qui sera utilisée à défaut de paramétrage contraire lors du paramétrage de chaque événement. eSetpoint est un nombre dont la valeur par défaut est 18 et qui permet de définir la température de consigne qui sera appliquée par défaut en cas de survenance d'un événement lorsqu'aucune température de consigne propre n'est définie lors du paramétrage de l'événement. eDuration est un nombre dont la valeur par défaut est 0 et qui permet de définir la durée en minutes devant s'écouler entre la survenance de l'événement et l'application de la température de consigne correspondante, permettant ainsi de prévoir une diminution ou une augmentation graduelle de la température de consigne. eStep est un nombre dont la valeur par défaut est 0.5 et qui permet de définir les étapes de diminution ou d'augmentation graduelle de la température de consigne. ePersistence est un nombre dont la valeur par défaut est 0 et qui permet de définir la durée par défaut pendant laquelle Heating Manager continuera à considérer qu'un événement est réalisé à partir de l'instant où les conditions de sa réalisation ne sont plus remplies. Si les conditions sont à nouveau remplies pendant le délai de persistence, Heating Manager agira comme si elles n'avaient jamais cessé d'être remplies. self:addHeater(idRoom, idHeater, idSonde, localkP, localkT) Cette fonction permet de déclarer les radiateurs qui seront gérés par Heating Manager. La fonction doit être paramétrée pour chaque radiateur. idRoom est l'ID de la pièce définie dans le Home Center 2 dans laquelle se trouve le module de commande du radiateur. idHeater désigne un module de commande d'un radiateur sous forme de table {ID du module, instruction pour mise en route, instruction pour arrêt, valeur à l'arrêt} : ID du module est l'ID d'un module, virtuel ou non, permettant de commander la mise en route ou l'arrêt du chauffage. instruction pour mise en route est soit la commande à transmettre s'il s'agit d'un module 'réel' ("turnOn" par exemple), soit le numéro d'ordre du bouton d'un module virtuel. instruction pour arrêt est soit la commande à transmettre s'il s'agit d'un module 'réel' ("turnOff" par exemple), soit le numéro d'ordre du bouton d'un module virtuel. valeur à l'arrêt est la valeur de la propriété value lorsque le radiateur est arrêté, et est utilisé pour éviter d'envoyer les commandes de mise en route et d'arrêt inutilement. idSonde désigne une sonde de température qui peut être définie spécifiquement pour un radiateur s'il n'est pas asservi à la sonde de température principale de la pièce définie dans le Home Center 2. Il peut s'agir d'une sonde de température proprement dite ou d'un module virtuel et sera dans tous les cas sous la forme {ID du module, nom de la propriété contenant la température}. Il peut également s'agir du nom d'une variable globale dans laquelle est stockée la température. localkP permet de définir un coefficient proportionnel fixe qui sera utilisé pour calculer la commande de chauffe de ce radiateur. localkT permet de définir un coefficient de déperditions thermiques qui sera utilisé pour calculer la commande de chauffe de ce radiateur. self:addEvent(idRoom, idEvent, conditions, cumulative, setpoint, duration, persistence) Cette fonction permet de définir les événements qui entraîneront une modification de la température de consigne (ouverture d'une fenêtre, absence temporaire ou prolongée, lumière allumée ou éteinte...). idRoom est l'ID de la pièce concernée par l'événement, ou une table contenant les IDs de plusieurs pièces concernées par l'événement. idEvent est le nom de l'événement, qui sera affiché dans la fenêtre de debug lors de sa survenance. conditions est une table contenant les différentes conditions devant être réalisées, ensemble ou séparément, pour que l'événement soit considéré comme survenu et la température de consigne modifiée en conséquence. Cette table contient elle-même une table par condition (il y a donc forcément une double accolade au début et à la fin), sous la forme {nom de variable globale, opérateur ("==", "~=", ">=", "<=", ">", "<"), valeur à vérifier, durée en minutes devant s'être écoulée depuis que le résultat de la comparaison est vrai} ou {ID d'un module, nom de la propriété d'un module, opérateur ("==", "~=", ">=", "<=", ">", "<"), valeur à vérifier, durée en minutes devant s'être écoulée depuis que le résultat de la comparaison est vrai}. cumulative est un booléen permet de définir, pour cet événement particulier, si sa survenance implique la réalisation de toutes les conditions ou si une seule est suffisante. setpoint permet de définir la température de consigne devant être appliquée lorsque l'événement survient. Dans le cadre du mode de fonctionnement événementiel, vous pouvez utiliser les variables comfort et eco qui font références aux températures définies pour la pièce avec le module virtuel Thermostat. duration est la durée en minutes devant s'écouler entre la survenance de l'événement et l'application de la température de consigne correspondante, permettant ainsi de prévoir une diminution ou une augmentation graduelle de la température de consigne. persistence est un nombre qui permet de définir la durée pendant laquelle Heating Manager continuera à considérer que l'événement est réalisé à partir de l'instant où les conditions de sa réalisation ne sont plus remplies. Si les conditions sont à nouveau remplies pendant le délai de persistence, Heating Manager agira comme si elles n'avaient jamais cessé d'être remplies. Dans le cadre de la configuration, cette fonction peut s'insérer dans une boucle conditionnelle permettant de ne laisser l'événement se réaliser que sous des conditions précises, par exemple d'horaires. self:addGlobalEvent(idEvent, conditions, cumulative, setpoint, duration, persistence) Cette fonction permet de définir un événement s'appliquant à toutes les pièces dont le chauffage est géré par Heating Manager, et se configure exactement de la même manière que la précédente, le paramètre idRoom en moins. Attention : le fait que l'événement soit global ne signifie pas qu'il l'emporte sur les événements spécifiques d'une pièce. Heating Manager contrôle les événements les uns à la suite des autres pour chaque pièce, dans l'ordre de leur configuration. Dès que les conditions d'un événement sont remplies, le programme cesse la boucle et n'analyse pas les autres événements déclarés. self:setIndoorSonde(idRoom, idSonde) Cette fonction permet de définir la sonde de température d'une pièce si vous ne souhaitez pas utiliser la sonde de température principale définie dans le Home Center 2. idRoom est l'ID de la pièce concernée. idSonde désigne une sonde de température proprement dite ou un module virtuel et sera dans tous les cas sous la forme {ID du module, nom de la propriété contenant la température}. Il peut également s'agir du nom d'une variable globale dans laquelle est stockée la température. self:setSetpoint(idRoom, idSetpoint) Cette fonction permet de définir, pour une pièce donnée, la source de la température de consigne qui devra être appliquée. L'utilisation de cette fonction n'est requise que dans le cas de l'utilisation du mode planification, et est inutile lorsque le chauffage de la pièce est effectué selon le mode événementiel. idRoom est l'ID de la pièce concernée. idSetpoint désigne la source de la température de consigne et peut être : l'ID d'un panneau de chauffage natif du Home Center 2. une table sous la forme {ID du module, propriété du module contenant la température de consigne} s'il s'agit d'un module, virtuel ou non. le nom d'une variable globale qui contiendra la température de consigne. self:setOutdoorSonde(idSonde) Cette fonction permet définir une sonde de température extérieure. Elle n'est utilise que dans le cas de la régulation proportionnelle qui tient compte de la température extérieure, et est inutile pour une régulation à base d'hystérésis. idSonde désigne une sonde de température proprement dite ou un module virtuel et sera dans tous les cas sous la forme {ID du module, nom de la propriété contenant la température}. Lorsqu'aucune sonde de température extérieure n'est définie et que le mode de régulation proportionnel est utilisé, Heating Manager utilise la température fournie par le plugin Météo. 5. Mise à jour depuis une version précédente Cette nouvelle version apporte des modifications en profondeur du programme et de la manière de le configurer. Il n'est donc pas possible de faire simplement un copier-coller de la configuration d'une version précédente à la 3.0, qui était éclatée entre la scène et un module virtuel, mais il est nécessaire de reprendre la configuration depuis le départ. Depuis la version 3.0, il est impératif de modifier les fonctions self:addEvent pour ajouter dans les conditions le paramètre operator : "==", "~=", ">=", "<=", ">" ou "<". Si le contrôle de configuration est activé, un message d'erreur s'affichera dans la fenêtre de debug sans faire planter le programme. L'ajout du paramètre ePersistence dans la fonction self:setConfiguration et persistent dans les fonctions self:addEvent n'est pas indispensable puisqu'il s'agit du dernier paramètre de ces fonctions. A défaut de les ajouter, c'est la valeur par défaut (0) qui s'appliquera. _ _ _ ROADMAP [VIDE] _ _ _ ICONES
  4. OJC

    Dawn & Dusk Manager

    Dawn & Dusk Manager Dawn & Dusk Manager est composé d'une Scène et d'un Module Virtuel destinés à permettre de déclencher des actions à l'aube et au crépuscule, en enrichissant les simples Sunrise et Sunset proposés nativement puisque sont disponibles les trois phases de l'aube et du crépuscule, ainsi que le midi solaire. * * * INSTALLATION N.B. : Ce programme a été conçu et testé sur la version 4.140 de la HC2. 1. Importer le Module Virtuel dans le Home Center 2 >>>> Panel for Dawn & Dusk Manager v. 1.3.0.vfib 2. Créer une scène en LUA en faisant un copier-coller du code >>>> Dawn & Dusk Manager v. 1.3.0.lua 3. Démarrer la scène. UTILISATION Le Module Virtuel Dawn & Dusk Panel permet de consulter les différents horaires, la mise à jour intervenant automatiquement tous les jours à 2 h du matin. D'un point de vue technique, c'est lui qui fournit à la scène les données horaires dont elle a besoin pour fonctionner. Pour déclencher l'exécution d'une scène, il suffit d'y insérer le trigger correspondant à l'horaire souhaité dans la zone %% globals : --[[ %% properties %% events %% globals onAstroDawn --Déclencheur Aube astronomique onNauticalDawn --Déclencheur Aube nautique onCivilDawn --Déclencheur Aube civile onSunrise --Déclencheur Lever du Soleil onSolarNoon --Déclencheur Midi solaire onSunset --Déclencheur Coucher du Soleil onCivilDusk --Déclencheur Crépuscule civil onNauticalDusk --Déclencheur Crépuscule nautique onAstroDusk --Déclencheur Crépuscule astronomique --]] ICONES Panel Manager * * * ASPECTS TECHNIQUES Ce programme est un exemple d'utilisation de la fonction setTimeout() en remplacement de la fonction fibaro:sleep(), l'asynchronicité étant utilisée depuis la version 1.1.0 pour créer deux 'boucles' indépendantes, l'une qui s'occupe de la mise à jour des données du Module Virtuel sur un cycle de 24 h, et l'autre qui s'occupe de mettre à jour à l'heure dite les variables globales faisant office de triggers suivant un cycle déterminé par les données récupérées dans le module virtuel. Avec la version 1.2.0, ces deux 'boucles' fonctionnent de manière enchaînée : lors la 'boucle' principale déclenche le dernier trigger, aucune instruction setTimeout() ne vient la relancer. C'est la 'boucle' de mise à jour qui le fera lors de la prochaine actualisation des horaires. Le code de la scène peut être consulté ci-dessous : * * *
  5. Utilisation de fibaro:call en fonction du module commandé Voici un lien qui vous donnera les actions que l'on peut utiliser pour chaque type de modules fibaro http://www.fibarouk.co.uk/support/lua/actions-use-fibarocall-api/ armed close firmwareUpdate open pollingDeadDevice pollingTimeSec pressButton requestNodeNeighborUpdate resetMeter sendDefinedEmailNotification sendDefinedPushNotification sendDefinedSMSNotification sendEmail sendGlobalEmailNotifications sendGlobalPushNotifications sendGlobalSMSNotifications sendPhotoToEmail sendPhotoToUser sendPush sendSipUserID setArmed setB setColor setG setProperty setProtectionLocalAndRF setR setSipDisplayName setSipUserID setSipUserPassword setSlider setTargetLevel setTime setValue setValue2 setW startProgram stop turnOff turnOn close Application pour : blind Description: Closes a blind. Usage: This action takes no arguments. Exemple: -- Close the blind with the device ID of 94 fibaro:call(94, "close") open Application pour : blind Description: Opens a blind. Usage: This action takes no arguments. Exemple: -- Open the blind with the device ID of 94 fibaro:call(94, "open") pressButton Application pour : virtual_device Description: Triggers a virtual device button press. Usage: This action takes one argument. The number of the button to be pressed. Each element of a virtual device has a unique number starting from 1. If your virtual device has two labels followed by two buttons, the buttons will be numbered 3 and 4. Exemple: -- Trigger a button press of button 3 of -- the virtual device with an ID of 358 fibaro:call(358, "pressButton", "3") sendDefinedEmailNotification Application pour : HC_user Description: Sends a notification to the email address associated with a user. Usage: This action takes one argument. The id of the notification to be sent. Exemple: 1-- Send notification 2 via email to the -- address associated with user 107. fibaro:call(107, "sendDefinedEmailNotification", "2") sendDefinedPushNotification Application pour : iOS_device Description: Sends a push notification to a device. Usage: This action takes one argument. The id of the notification to be sent. Exemple: -- Send notification 2 via push to modile device number 10. fibaro:call(10, "sendDefinedPushNotification", "2") sendDefinedSMSNotification Application pour : HC_user Description: Sends an SMS notification to a phone number. Usage: This action takes two arguments. The phone number to send the message to.This should be in the form xxyyyyyyyyy where xx = country code and yyyyyyyyy = phone number. The id of the notification to be sent. Exemple: -- Send notification 3 via SMS to device number +441234567890. fibaro:call(2, "sendDefinedSMSNotification", "441234567890", "3") sendEmail Application pour : HC_user Description: Sends an email to the email address associated with a user. Usage: This action takes two arguments. The subject of the email. The message body of the email. Exemple: -- Send an email to the email address associated with user 2. local subject = "This is the subject of the email." local message = "This is the body of the email.\nWith a line break." fibaro:call(2, "sendEmail", subject, message) sendPhotoToEmail Application pour : IP_camera Description: Sends a still image from a camera to a specified email address. Usage: This action takes one argument. The email address to send the image to. Exemple: -- Send an image from camera 120 to someone@this.address. fibaro:call(120, "sendPhotoToEmail", "someone@this.address") sendPhotoToUser Application pour : IP_camera Description: Sends a still image from a camera to the email address associated with a user. Usage: This action takes one argument. The id number of the user to send the image to. Exemple: -- Send an image from camera 120 to -- the email address associated with user 2. fibaro:call(120, "sendPhotoToUser", "2") sendPush Application pour : iOS_device Description: Sends a push notification to an iOS device. The device must have connected with the Home Centre recently, however once this connection has been made the app can be closed. Usage: This action takes one argument. The message to be pushed to the device. Exemple: -- Send a push notification to the iOS device with the ID of 10 fibaro:call(10, 'sendPush', 'This is the message to be pushed.') setArmed Application pour : motion_sensor, door_sensor, window_sensor, smoke_sensor Description: Arms or disarms a device. Usage: This action takes one argument. The armed state of the device. 0 = disarmed, 1 = armed. Exemple: -- Arm the door sensor with device ID of 174 fibaro:call(174, "setArmed", "1") -- Disarm the door sensor with device ID of 174 fibaro:call(174, "setArmed", "0") setB Application pour : rgb_driver Description: Sets the brightness of the blue channel of an rgb_driver. Usage: This action takes one argument. The brightness (0-99) of the channel. Exemple: -- Set the brightness of the blue channel of device 81 to 56% fibaro:call(81, "setB", "56") setColor Application pour : rgb_driver Description: Sets the colour of an rgb_driver. This is done by setting the brightness of the red, green, blue and white channels. Usage: This action takes four arguments. The brightness (0-99) of the red channel. The brightness (0-99) of the green channel. The brightness (0-99) of the blue channel. The brightness (0-99) of the white channel. Even if the device is in RGB mode, the white channel needs to be specified – in this case, just use 0. Exemple: -- Set the colour of device 81 to a blue-indigo colour -- (60% red, 23% green, 99% blue, 0% white) fibaro:call(81, "setColor", "60", "23", "99", "0") setG Application pour : rgb_driver Description: Sets the brightness of the green channel of an rgb_driver. Usage: This action takes one argument. The brightness (0-99) of the channel. Exemple: -- Set the brightness of the green channel of device 81 to 56% fibaro:call(81, "setG", "56") setProperty Application pour : virtual_device Description: Sets value of the elements of a virtual device (labels and sliders). Usage: This action takes two arguments. The name of the element. The value to set the element to. Exemple: -- Set the content of Label1 in virtual device 1170 to 'program 1' fibaro:call(1170, "setProperty", "ui.Label1.value", "program 1") -- Set the value of Slider1 in virtual device 1170 to 45 fibaro:call(1170, "setProperty", "ui.Slider1.value", "45") setR Application pour : rgb_driver Description: Sets the brightness of the red channel of an rgb_driver. Usage: This action takes one argument. The brightness (0-99) of the channel. Exemple: -- Set the brightness of the red channel of device 81 to 56% fibaro:call(81, "setR", "56") setSlider Application pour : virtual_device Description: Triggers a change in the value of a virtual device slider. Usage: This action takes two arguments. The number of the slider to be changed. Each element of a virtual device has a unique number starting from 1. If your virtual device has two labels followed by two buttons and then a slider, the slider will be numbered 5. The value (0-99) to set the slider to. Exemple: -- Set the slider with an ID of 2 of the -- virtual device with an ID of 334 to 50% fibaro:call(334, "setSlider", "2", "50") setTargetLevel Application pour : thermostat_setpoint Description: Sets the target temperature of a thermostat_setpoint. Usage: This action takes one argument. A temperature in degrees. Exemple: -- Set the target temperature of device 117 to 18 degrees. fibaro:call(117, "setTargetLevel", "18") setTime Application pour : thermostat_setpoint Description: Sets the value of the timeStamp property of the thermostat_setpoint. Usage: This action takes one argument. A timestamp. Exemple: -- Set the timeStamp of the thermostat_setpoint -- with device ID of 117 to 2 hours from now. fibaro:call(117, "setTime", tonumber(os.time()) + 120*60) setValue Application pour : dimmable_light, blind, rgb_driver Description: Sets the brightness of a dimmable_light or rgb_driver or sets the position of a blind. When changing the brightness of rgb_drivers, all channels are set to the same level (white light). Usage: This action takes one argument. A value (0-99) representing the brightness of the light or position of the blind. For a blind, 0 = fully closed, 99 = fully open. Exemple: -- Set the brightness of the light with device ID of 68 to 25%. fibaro:call(68, "setvalue", "25") -- Set the position of the blind with the device ID of 94 to 75% open. fibaro:call(94, "setvalue", "75") setW Application pour : rgb_driver Description: Sets the brightness of the white channel of an rgb_driver. Usage: This action takes one argument. The brightness (0-99) of the channel. Exemple: -- Set the brightness of the white channel of device 81 to 56% fibaro:call(81, "setW", "56") startProgram Application pour : rgb_driver Description: Instruct the rgb_driver to play one of the preconfigured colour programmes. Usage: This action takes one argument. The light programme number to run. Exemple: -- Start programme number 2 ("storm") on device number 81 fibaro:call(81, "startProgram", "2") stop Application pour : blind Description: Stops the movement of a blind. Usage: This action takes no arguments. Exemple: -- Stop the blind with the device ID of 94 fibaro:call(94, "stop") turnOff Application pour : binary_light, dimmable_light, rgb_driver Description: Turns off a device. Usage: This action takes no arguments. Exemple: -- Turn off device number 58. fibaro:call(58, "turnOff") turnOn Application pour : binary_light, dimmable_light, rgb_driver Description: Turns on a device. Usage: This action takes no arguments. Exemple: -- Turn on device number 58. fibaro:call(58, "turnOn")
  6. ZerobrainStudio pour ecrire et tester vos scripts lua directement sur votre PC Merci a steven et Fred le ouf Dans un premier temps il faut telecharger ZerobrainStudio. Choisir la version qui correspond a votre systéme d'explotation pour moi ce sera Windows 32bit (exe installer) https://studio.zerobrane.com/download?not-this-time Il suffit d'installer le programme comme vous en avez l'habitude et bien regarder ou il sera installer Ensuite il va falloir ajouter le fichier que @Steven a partager sur le forum lualibs1.01.zip By Steven Ajout : le fibaro:sleep(<millisecondes>) fibaro:countScene() retournera toujours 1. Manque encore une astuce pour simuler le fibaro:getSourceTrigger() Il ne vous reste plus qu'a décompresser ce fichier dans le répertoire C:.......\ZeroBraneStudio\lualibs Utilistation : require("FibaroSceneAPI") hc2_user = "admin" hc2_pwd = "admin" hc2_ip = "192.168.x.x" -- Inséré votre code en dessous de cette ligne ----------------- Et pour ceux qui n'aime pas l'anglais : Edit -> Preferences -> Settings: System --[[-- Use this file to specify **System** preferences. Review [examples](+C:\PRGMS\ZeroBraneStudio\cfg\user-sample.lua) or check [online documentation](http://studio.zerobrane.com/documentation.html) for details. --]]-- language = "fr" Et redémarrer l'application Pour ceux qui souhaite les même couleurs que dans leur HC2, il faut aller dans le menu : Edit -> Preferences -> Settings: User et copier le code ci-dessous puis redémarrer. --[[-- Use this file to specify **User** preferences. Review [examples](+C:\PRGMS\ZeroBraneStudio\cfg\user-sample.lua) or check [online documentation](http://studio.zerobrane.com/documentation.html) for details. --]]-- styles = loadfile('cfg/tomorrow.lua')('TomorrowNight') stylesoutshell = styles -- apply the same scheme to Output/Console windows styles.auxwindow = styles.text -- apply text colors to auxiliary windows styles.calltip = styles.text -- apply text colors to tooltips local colors = { orange = {255,158,89}, braun = {217,191,140}, darkgray = {38,38,38}, blue = {89,158,255}, green = {188,210,121}, red = {179,94,77}, white = {255,255,255}, gray = {102,102,102} } styles.comment = {fg = colors.gray} styles.operator = {fg = colors.white} styles.number = {fg = colors.red} styles.stringtxt = {fg = colors.green} styles.keywords0 = {fg = colors.blue} styles.text = {fg = colors.braun, bg = colors.darkgray} styles.keywords3 = {fg = colors.orange} styles.keywords4 = {fg = colors.orange} styles.keywords5 = {fg = colors.orange} styles.keywords6 = {fg = colors.orange} styles.keywords7 = {fg = colors.orange} Encore une amélioration : Copier le fichier ci-joint "fibaro.lua" dans le sous-répertoire /api/lua/ fibaro.lua puis dans le menu : Edit -> Preferences -> Settings: System ajouter cette ligne : api = {luadeb = {'fibaro'}} Vous allez avoir l'auto-complétion des commandes fibaro ainsi que leur description. Astuce. Pour pouvoir tester les triggers, voici le code à utiliser __fibaroSceneSourceTrigger = {type="global", name="Pushbullet"} -- __fibaroSceneSourceTrigger = {type="global", name="Pushbullet"} -- __fibaroSceneSourceTrigger = {type="property", deviceID=6, propertyName="value"} -- __fibaroSceneSourceTrigger = {type="autostart"} -- __fibaroSceneSourceTrigger = {type="other"} print(fibaro.getSourceTrigger().type) -- global print(fibaro.getSourceTrigger().name) -- Pushbullet __fibaroSceneSourceTrigger = {type="autostart"} print(fibaro.getSourceTrigger().type) -- autostart Il suffit donc de modifier la variable __fibaroSceneSourceTrigger en utilisant un des exemple fourni. il est aussi possible de débuguer ligne à ligne, et même de modifier dynamiquement la valeur d'une variable directement en cours d'exécution. Allez, je me lance pour mon 1er tuto Ouvrir Zerobranstudio et afficher les fenêtres suivantes si ce n'est pas encore déjà fait insérer le code suivant dans une nouvelle fenêtre vide de Zerobranstudio (on va réviser les multiplications ) local boucle = true local i = 1 local j = 1 while boucle == true do i = i + 1 j = j + 2 print(i.." x "..j.." = "..i * j) end Pour activer le suivi dynamique des variables, il suffit de sélectionner le nom de la variable que l'on veut suivre, puis de faire clic droit dessus pour faire apparaitre un menu contextuel. Il faut ensuite sélectionner l'option Add watch expression comme dans l'image ci dessous. Dans notre cas, il faut le faire pour les 2 variables i & j. Pour passer en mode debug, appuyer 1 fois sur la touche F5, la fenêtre doit ressembler à ça. Le curseur vert est positionné sur la première instruction, et la fenêtre Watch affiche les valeurs de i et j (à nil pour le moment ce qui est logique) Appuyer maintenant plusieurs fois sur la touche F10 pour exécuter le programme pas à pas, jusqu'à afficher le premier résultat de la multiplication, comme ci dessous. Le résultat de la multiplication est en cohérence avec les valeurs de i et j. Pour tester maintenant la modification à la volée d'une variable, on va continuer l'exécution du programme et réexécuter une seconde fois la boucle en appuyant plusieurs fois sur la touche F10 mais sans exécuter l'instruction print, comme dans l'image ci dessous. La valeur des 2 variables a bien été modifiée par programmation. Pour modifier maintenant dynamiquement la valeur de j, il faut cliquer sur l'onglet Remote console, taper la ligne j = 20 puis appuyer sur la touche Entrée pour valider la commande, comme dans l'image ci dessous. On peut alors voir que la valeur de j a bien été modifiée dans la fenêtre de Watch. Il suffit maintenant de recliquer sur l'onglet Output (suspended), et d'appuyer de nouveau sur la touche F10 pour reprendre l'exécution du programme. On constate alors que la valeur de j mise à 20 à la main a bien été prise en compte dynamiquement par le programme. Je remercie encore une fois steven pour ce super travail
  7. sebcbien

    Topic Unique S. A. R. A. H.

    Voilà , pas trop de temps pour le moment, mais je vais voir ce que je peux pondre comme tuto pour S.A.R.A.H. Comme je l'ai déjà dit, en général l'installation va toute seule mais parfois ça merde et là 'fo du Barbu costO !... En gros: Windows 10 Installé sur un petit laptop c'est top, pas de place, silencieux, économe en énergie... Télécharger SARAH V4 dans c:/sarah Ajouter le plugin sonos Utiliser mon VD Sarah Say it Pour plus de détails, voir le post suivant. Ancien posts: ------------------- Voici un aperçu Pour la qualité, l'enregistrement n'est pas top mais le volume est au minimum car les enfants dorment Pour la vitesse de conversion en TTS, je pense que ça vous donne une idée... Et l'interruption de la musique est impec et reprends juste après. ----------------- et la photo de mon serveur Jeedom/S.A.R.A.H. Le serveur fermé, c'est beau: Ouvert: Comme vous pouvez le voir c'est un vieux laptop récupéré car l'écran est fichu, tombé de haut et utilisable uniquement en remote ou avec un autre écran.. C'est installé avec Windows 10 et je prends en remote avec TeamViewer. J'ai mon Jeedom qui tourne dans VirtualBox et S.A.R.A.H. sur le windows Consommation en charge avec JD et SARAH: 12W à 15W incluant un UPS avec shutdown automatique svp... (la batterie est encore bonne) J'ai presque envie de relancer ma VM xpenology pour transcoder, là il y a plus de hummph que avec mon DS 412+... C'est tout nouveau, je suis très content de ma solution... avant Jeedom tournait sur mon pc principal qui bouffait entre 70 et 90W en permanence...
  8. sebcbien

    Modes Éclairage Auto/manuel Waf

    Bonjour, Petit partage, un VD et quelques lignes GEA pour activer/désactiver l'éclairage automatique chez moi. J'avais déjà implémenté la possibilité d'activer un mode "manuel" via un VD et 3 boutons (Automatique / Manuel / Manuel pendant 3H) Ce mode manuel était utilisé dans GEA de la manière suivante: local estHouse_Manuel = {"Global", "House_Mode", "Manual"} local estNotHouse_Manuel = {"Global", "House_Mode", "Auto|Scheduler"} GEA.add({{"Value", id2["SAM_MVT"],1},estNotHouse_Manuel}, -1, "",{{"turnOn", id2["SALLE_A_MANGER"]}}) Problème, pour activer ce mode il fallait sortir le téléphone de sa poche, pas WAF du tout et pas pratique (mon mantra en domotique: si t'a besoin de ton téléphone pour gérer ta domotique -> FAIL) Voici la solution mà»rement réfléchie: - Un interrupteur mural (ils ont l'avantage de ne pas se perdre et d'être proches ) - Un Virtual Device qui sert aussi de Variable Globale - GEA - TTS pour le feedback J'ai donc activé le paramètre 41 (Scène activation sur un FGD) et j'utilise un long press sur S2 pour basculer du mode AUTO en Manuel et vice-versa Dans GEA, je détecte cet appui long et je clique sur le bouton correspondant du VD GEA: 1894 sceneActivation 2139 ui.ModeRez.value local estLumRez_Auto = {"Label", id2["MODES_AUTO_MANUEL"], "ModeRez", "Automatique"} local estLum1er_Auto = {"Label", id2["MODES_AUTO_MANUEL"], "Mode1er", "Automatique"} local estLumGarage_Auto = {"Label", id2["MODES_AUTO_MANUEL"], "ModeGarage", "Automatique"} ----------- GESTION MODES AUTO/MANU ----------- -- Bascule mode éclairage actuel GEA.add({{"SceneActivation", id2["POUSSOIRS_HAUT"], 12}}, -1, "Switch changing Rez Auto/Manuel Mode at #time#",{{"VirtualDevice", id2["MODES_AUTO_MANUEL"], 5}}) --Annonce TTS du Mode sauf si en passage en mode Away ou Night_All_Off GEA.add({{"Label", id2["MODES_AUTO_MANUEL"], "ModeRez", ""},estNotAwayOrNigh_All_Off}, -1, "Eclairage Rez Set to Mode: #value# at #time#", {{"Inverse"},{"Label", id2["SONOS_SAY_IT"], "Message", "éclairage ré en mode #value#."},TTS_Default}) Exemple d'utilisation: - Si un soir on veut faire un jeu de nuit avec les enfants, un simple appuy sur l'interrupteur va annoncer dans les SONOS que le mode automatique à été désactivé et plus aucune lampe ne s'allumera automatiquement. - Si mon frère passe faire un baby sitting et veut regarder son film dans le noir, il peut activer le mode lui même. - Si un matin on veut profiter de la lumière du lever de soleil sans lampes Exemple de ligne GEA qui n'allume les lampes que si le mode est en auto: GEA.add({{"Value", id2["SAM_MVT"],1},estLumRez_Auto }, -1, "",{{"turnOn", id2["SALLE_A_MANGER"]}}) A chaque fois que l'alarme est mise ou que le mode nuit est activé, GEA me remet tout en automatique: ------------ WHEN AT HOME DO------------------- GEA.add(estAt_Home, -1, "", { estLumRez_Auto, estLum1er_Auto, estLumGarage_Auto }) A partir d'un autre VD, j'ai 3 boutons - Forcer tout en automatique - Manuel - Manuel pour une durée de 3H puis retour en mode automatique Bouton tout Manuel: local selfId = fibaro:getSelfId() local NewState = "Manuel" local id2 = { --Maison (Global) MODES_AUTO_MANUEL = 2139, } fibaro:call(id2["MODES_AUTO_MANUEL"], "setProperty", "ui.ModeRez.value", NewState); fibaro:call(id2["MODES_AUTO_MANUEL"], "setProperty", "ui.Mode1er.value", NewState); fibaro:call(id2["MODES_AUTO_MANUEL"], "setProperty", "ui.ModeGarage.value", NewState); fibaro:call(selfId, "setProperty", "ui.HouseMode.value", NewState); fibaro:call(id2["MODES_AUTO_MANUEL"], "setProperty", "ui.LastChange.value", "Tout "..NewState.." à "..os.date("%H:%M")); fibaro:debug(os.date("%a %d/%m", os.time()).." Set all modes to "..NewState); Bouton tout Auto: local selfId = fibaro:getSelfId() local NewState = "Automatique" local id2 = { --Maison (Global) MODES_AUTO_MANUEL = 2139, } fibaro:call(id2["MODES_AUTO_MANUEL"], "setProperty", "ui.ModeRez.value", NewState); fibaro:call(id2["MODES_AUTO_MANUEL"], "setProperty", "ui.Mode1er.value", NewState); fibaro:call(id2["MODES_AUTO_MANUEL"], "setProperty", "ui.ModeGarage.value", NewState); fibaro:call(selfId, "setProperty", "ui.HouseMode.value", NewState); fibaro:call(id2["MODES_AUTO_MANUEL"], "setProperty", "ui.LastChange.value", "Tout "..NewState.." à "..os.date("%H:%M")); fibaro:debug(os.date("%a %d/%m", os.time()).." Set all modes to "..NewState); Bouton manuel pour une durée de 3H (puis retour en mode automatique si tout est toujours en manuel, donc si personne n'a appuyé sur le bouton): local selfId = fibaro:getSelfId() local NewState = "Manuel" local id2 = { --Maison (Global) MODES_AUTO_MANUEL = 2139, } fibaro:call(id2["MODES_AUTO_MANUEL"], "setProperty", "ui.ModeRez.value", NewState); fibaro:call(id2["MODES_AUTO_MANUEL"], "setProperty", "ui.Mode1er.value", NewState); fibaro:call(id2["MODES_AUTO_MANUEL"], "setProperty", "ui.ModeGarage.value", NewState); fibaro:call(selfId, "setProperty", "ui.HouseMode.value", NewState); fibaro:call(id2["MODES_AUTO_MANUEL"], "setProperty", "ui.LastChange.value", "Tout "..NewState.." pour 3H à "..os.date("%H:%M")); fibaro:debug(os.date("%a %d/%m", os.time()).." Set all modes to "..NewState.." and wait 3H"); -- sleep 3H: --fibaro:sleep(10*1000) fibaro:sleep(60*60*1000) fibaro:debug(os.date("%a %d/%m", os.time()).." 1H Done") fibaro:sleep(60*60*1000) fibaro:debug(os.date("%a %d/%m", os.time()).." 2H Done") fibaro:sleep(60*60*1000) fibaro:debug(os.date("%a %d/%m", os.time()).." 3H Done") if fibaro:getValue(id2["MODES_AUTO_MANUEL"], "ui.ModeRez.value") == "Manuel" and fibaro:getValue(id2["MODES_AUTO_MANUEL"], "ui.Mode1er.value") == "Manuel" and fibaro:getValue(id2["MODES_AUTO_MANUEL"], "ui.ModeGarage.value") == "Manuel" then NewState = "Automatique" fibaro:call(id2["MODES_AUTO_MANUEL"], "setProperty", "ui.ModeRez.value", NewState); fibaro:call(id2["MODES_AUTO_MANUEL"], "setProperty", "ui.Mode1er.value", NewState); fibaro:call(id2["MODES_AUTO_MANUEL"], "setProperty", "ui.ModeGarage.value", NewState); fibaro:call(selfId, "setProperty", "ui.HouseMode.value", NewState); fibaro:call(id2["MODES_AUTO_MANUEL"], "setProperty", "ui.LastChange.value", "Tout "..NewState.." à "..os.date("%H:%M")); fibaro:debug(os.date("%a %d/%m", os.time()).." Set all modes to "..NewState); end fibaro:debug(os.date("%a %d/%m", os.time()).." Time's up set mode Auto") --fibaro:setGlobal("House_Mode", "Scheduler") Voilà un petit apperçu et un bon cas d'utilisation de LABELS au lieu de VG Voici le VD: Et voici les icônes Modes_Auto-Manuel.vfib
  9. VERIFICATEUR D'ID Très souvent, trop souvent, notre HC2 plante car nous utilisons des IDs (identifiants) qui n'existent pas/plus. Ces identifiants ont tendance à changer lors : d'une mise à jour de la box de la reconfiguration d'un device Parfois, même un simple changement de pile Bref, il est difficile de contrôler périodiquement tous nos scènarios, VD, ... Voici donc un scénario qui va "tenter" de faire cette vérification pour vous. Ce scénario N'EST PAS intelligent, il analyse votre code sans le comprendre et vous affiche des éléments qui méritent d'être vérifiés. Ce scénario peut vous envoyer un push en cas d'avertissement rencontré, peux tourner à intervalle régulier et vous envoyer un rapport par email. Lorsque ce scénario rencontre quelque chose d'étrange, il vous affiche la ligne suivante : [DEBUG] 09:57:24: checking scene : [425] Graphs pull [DEBUG] 09:57:24: code --> contient une référence erronée dans fibaro:call(81, "pressButton", "1") [ignored = {id=425, field="81"}] Vous allez donc vérifier le code de votre scène (Graphs pull) dans cet exemple. Si effectivement l'ID n'existe plus, il vous suffit de corriger votre code. Inversement, si cet avertissement n'a pas de sens, il vous suffit de copier le code commencant par ignored [ignored = {id=425, field="81"}] situé en fin de ligne et de le copier entre les deux lignes suivantes local ignored = { -- {id=425, field="81"}, -- Graph pull - Ligne en commentaire } Ainsi cette scène ignorera cet avertissement pour les prochaines fois. Cette scène nécessite un petit effort de mise en place mais permet de corriger et prévenir des erreurs d'ID qui peuvent être désagréable. Courage et n'hésitez pas si vous avez des questions. Ci-joint la scène en question et l'icone créé par @sebcbien. Historique : 1.0 -> Initialisaton 2.0 -> vérifie ou non les scènes et VDs désactivés (voir local checkDisabled = false) 2.0 -> corrige l'analyse de l'entête des scènes (du mois, je crois) 2.0 -> permet d'ignorer certaines erreurs (voir local ignored = {}) 2.1 -> optimisation du code 2.2 -> lors de la recherche de la valeur d'une variable, prend en compte la position dans le code 2.3 -> Vérifie les variables courantes : "id", "deviceid", ... (voir local mostUseVariables = {}) 3.0 -> Auto-détection de GEA 3.1 -> Ignore les warnings liés à cette propre scène 3.2 -> Autostart et envoi de push + notification en cas de problème 3.3 -> Envoi de mail + relancement automatique toutes les X heures 3.4 -> Mise à disposition des utilisateurs 3.5 -> Affichage du nom du bouton en cas d'avertissement 3.6 -> Ne confond plus les variables contenant caractères et chiffres (Windows5, Radiateur_4) avec des IDs de module 3.6 -> Ne confond plus le numéro du CentralSceneEvent avec un ID de module CheckAll_v3.6.lua
  10. Nikko

    Backup Via Scene Lua

    Bonjour, Voici un résumé sur la réalisation/suppression de backups via des scènes en Lua. La création/suppression de backup s'effectue en temps normal sur l'interface du HomeCenter à la page Diagnostiques/Sauvegarde et restauration. Le code donné dons les 2 scènes n'est pas des plus optimisé; cela constitue juste une base. EDIT (03/12/2016): Mise à jour avec l'api pour les versions >=4.101; voir plus loin: (https://www.domotique-fibaro.fr/topic/8641-backup-via-scene-lua/?do=findComment&comment=146362) Les Commandes de l'API La récupération au format JSON de la liste des backups se fait à l'addresse http://HC2/api/settings/backups Pour Créer un Backup on utilise l'addresse http://HC2/api/settings/backups avec une requète de type en POST avec les paramètres action et description. Pour Supprimer un Backup, on utilise l'addresse http://HC2/api/settings/backups?id=xx (où xx est le numéro de backup). La requète est de type DELETE avec comme paramètre id=xx => Comme les urls de l'api vont être appelées depuis des scènes lua, l'ip de la box utilisée sera 127.0.0.1 (port 11111) => En cas d'appel sur l'ip LAN de la box (Ex: http://192.168.0.100/api/settings/backups) , il faudra en plus transmettre l'authentification dans la requète. Attention: Lors de la création de Backup, "tout le reste" est suspendu; de même après que le backup soit effectué, le moteur Z-Wave et d'autres services redémarrent. Donc en cas de planification , privilégier la nuit, là ou l'activité ZWave, scénarios, est faible/inexistante. Scène de création d'un backup Exemple de Scène de création d'un Backup, avec notification vers portable: --[[ %% properties %% events %% globals --]] -- ID des mobiles,tablettes pour notification local portable = { 385,378 } -- Message Descriptif du Backup local descriptif = 'Backup du '..os.date("%d/%m/%y - %HH%M") function sendPush(message) if #portable > 0 then for _,v in ipairs(portable) do fibaro:call(v,'sendPush', message) end end end local url = 'http://127.0.0.1:11111/api/settings/backups' local httpClient = net.HTTPClient() httpClient:request(url , { success = function(response) if tonumber(response.status) == 201 then print("Backup Created at " .. os.date()) sendPush(descriptif .. ' effectué') else print("Error " .. response.status) sendPush('Erreur lors de la création du Backup') end end, error = function(err) print('error = ' .. err) end, options = { method = 'POST', headers = { ["content-type"] = 'application/x-www-form-urlencoded;' }, data = 'action=create&description='..descriptif } }); Depuis la page des backups, on peut vérifier que la scène fonctionne: Pour les utilisateurs de GEA, on peut déclencher cette sauvegarde le 1er samedi de chaque mois par exemple: -- Fonction déterminant si nous sommes le 1er samedi du mois function isFirstSaturday() local t = os.date('*t') return ( t['day'] < 8 and t['wday'] == 7 ) end -- Backup le 1er samedi du mois GEA.add({"Function",function() return isFirstSaturday() end} , 30 , "Backup Mensuel du HC2" , {{"Time","01:00","01:01"},{"Scenario", 12}}) . Scène de suppression d'un backup Exemple de Scene Lua pour réaliser la suppression du backup le plus ancien: --[[ %% properties %% events %% globals --]] -- Flag dryrun; Si true, la requete sur api pour effacer le backup n'est pas effectuée local dryrun = true -- Récupération de la list des backups local backups = api.get('/settings/backups') -- Vérification de présence Backup if (backups and type(backups == 'table') and #backups > 0) then if #backups > 1 then print(#backups .. ' Backups présents') else print('1 Backup présent') end for i in ipairs(backups) do fibaro:debug('ID: '..backups[i]['id']..' | TIMESTAMP: '..backups[i]['timestamp']..' | DESCRIPTION: '..backups[i]['description']) end else print('Pas de backup ou erreur lors de la récupération de la liste') fibaro:abort() end -- Pour chaque Backup on stock le timestamp de la date de réalisation dans une table -- On classe ensuite les timestamps par ordre croissant local timestamp = {} for i in ipairs(backups) do table.insert(timestamp, backups[i]['timestamp']) end table.sort(timestamp) -- Le 1er timestamp de la table est le plus petit donc le plus ancien en epochtime -- Dans la table de backup on recherche le backup ayant ce timestamp local id = false for i in ipairs(backups) do if (tonumber(backups[i]['timestamp']) == tonumber(timestamp[1])) then id = backups[i]['id'] end end if id then print("ID du backup le plus ancien: "..id) else print("Erreur lors de la récupération de l'ID") fibaro:abort() end -- Requete via API pour effacer le backup le plus ancien if not dryrun then local url = 'http://127.0.0.1:11111/api/settings/backups?id='..id local httpClient = net.HTTPClient() httpClient:request(url , { success = function(response) if tonumber(response.status) == 200 then print("Backup deleted at " .. os.date()) else print("Error " .. response.status) end end, error = function(err) print('error = ' .. err) end, options = { method = 'DELETE', headers = { ["content-type"] = 'application/x-www-form-urlencoded;' }, data = 'id='..id } }); end . Cette Scène produit le debug suivant: Nicolas
  11. Fréquemment j'ai besoin taper une simple URL pour mettre à jour une VG, mettre à jour un label, recevoir l'état de mon IPX, tout en déclenchant un scénario ... mais mettre un place un script qui fait un POST sur une Variable Globale est un vrai calvaire car il faut passer par un système tiers (PHP, Java, ...). Et pourtant, Fibaro nous a donner un des outils les plus simples et surtout les plus utile ... les Virtual Devices. Et oui, cela peu surprendre mais saviez-vous que chaque label, slider d'un VD se comportent exactement comme une variable globale. C'est à dire : les données sont persistante (vous pouvez rebooter votre box, la donnée sera toujours là ) les données sont modifiables (via un scène ou un appel http .. nous y reviendrons) le changement de valeur active un trigger Allez passons au chose sérieuse. Donc si je résume cela veux dire que si je fait un appel HTTP GET pour changer un label et que le changement de ce dernier active un trigger, je peux donc ... heuuuu ... dire zut au variable globale. En effet, voici un exemple concret et simple : Créons un Virtuel Device avec un simple label que nous allons appeler ainsi : Label : V.Globales ID : VG Notons en passant l'ID de ce nouveau VD. Maintenant si depuis un navigateur, je tape cette URL, je vais changer la valeur de mon label : http://<user>:<password>@<IP_DE_MA_HC2>/api/callAction?deviceID=<ID_VD>&name=setProperty&arg1=ui.VG.value&arg2=<MaNouvelleValeur> Ok mais quel intérêt ? L'intérêt vient en ajoutant une scénario derrière tout cela : --[[ %% properties 484 ui.VG.value --]] actions = { ["ui.VG.value"] = function(values) for k,v in pairs(json.decode(values)) do if (fibaro:getGlobalValue(k) ~= v) then fibaro:setGlobal(k, v) end end end, } -- =============================== -- Démarrage du script -- =============================== local trigger = fibaro:getSourceTrigger() if (trigger.type == "property") then property = trigger.propertyName device = trigger.deviceID value = fibaro:getValue(device, property) actions[property](value) end Que va donc faire ce script et ben il va écouter si la valeur ui.VG.value de mon VG (484 chez moi) change et si elle change et bien il va lire la valeur et mettre à jour mes variables globales. En reprenant l'URL ci-dessus, en remplacant <MaNouvelleValeur> par un json au format simple {NomVariable:valeur, NomVariable2:valeur, ...} Exemples: {'Pushbullet':'Message'} {'Pushbullet':'Message', 'Chauffage':'Vacances} http://<user>:<password>@<IP_DE_MA_HC2>/api/callAction?deviceID=<ID_VD>&name=setProperty&arg1=ui.VG.value&arg2={'Pushbullet':'Message'} Et voilà , il ne reste plus qu'à "caché" le VD et la scène et vous avez un moyen simple de mettre à jour vos VG avec un simple GET HTTP. Pour allez plus loin, voici ma scène pour vous donner des idées Amusez-vous bien
  12. Steven

    Pushbullet

    --------------------------------- PUSHBULLET API --------------------------------- Bonjour, Si comme moi, vous appréciez le service de notification "Pushbullet" et que vous souhaitez l'utiliser depuis votre HC2, voici un script qui vous permettre 2 ou 3 petites choses : Consulter la liste de vos appareils connectés au service Pushbullet Envoyer un message sur tous vos appareils connectés Envoyer un message sur un appareil précis. Avantage de ce script : Pas besoin de service intermédiaire comme pushingbox Plus besoin d'utiliser les notifications aléatoires et capricieuses de Fibaro Pré-requis : Un compte chez Pushbullet L'application Pushbullet installée sur vos appareils (https://www.pushbullet.com/apps) Obtenir un "Token" ... Connectez-vous sur le site Pushbullet -> My Account (en cliquant sur votre avatar) -> Create Access Token Voici le script local pushbullet = { token = "o.Ax6xXFI5Qa8YZX1BFoWzozmVL5plEwGd", titreDesMessage = "Fibaro", debug = false, -- ============================================== -- Affichage dans la console -- Paramètres : -- message : le message a afficher -- force : affiche le message même si debug est à false -- ============================================== log = function(self, message, force) force = force or false if (self.debug or force) then print(__convertToString(message)) end end, -- ============================================== -- Affichage les devices reconnus et actifs -- Paramètres : -- data : tableau des devices -- ============================================== displayDevices = function(self, data) self:log("----------========== D e v i c e s =========----------", true) for k,v in ipairs(data.devices) do if (v.model) then self:log(v.model .. " --- " .. v.iden, true) end end end, -- ============================================== -- Interrogation des devices -- Paramètres : -- func : une fonction a rappeler après traitement ou nil -- ============================================== getDevices = function(self, func) local http = net.HTTPClient() http:request("https://api.pushbullet.com/v2/devices", { options = { method = 'GET', headers = { ["Access-Token"] = self.token, ["Content-Type"] = "application/json" }, data = "" }, success = function(response) if (func) then func(json.decode(response.data)) else self:displayDevices(json.decode(response.data)) end end, error = function(response) self:log(" ERROR !!! " .. url, true) end, }) end, -- ============================================== -- Envoi un message -- Paramètres : -- message : le message à envoyer -- id : l'identifiant du device OU nil -- ============================================== sendPush = function(self, message, id) local http = net.HTTPClient() http:request("https://api.pushbullet.com/v2/pushes", { options = { method = 'POST', headers = { ["Access-Token"] = self.token, ["Content-Type"] = "application/json" }, data = json.encode({ ["body"]=message, ["title"]= self.titreDesMessage, ["type"]="note" }), device_iden = id, }, success = function(response) local data = json.decode(response.data) self:log("----------========== P u s h e s =========----------") self:log("Identifiant du message : " .. data.iden) end, error = function(response) self:log(" ERROR !!! " .. url, true) end, }) end, -- ============================================== -- Envoi d'un message push -- Paramètres : -- message : le message à envoyer -- device : le nom du device concerné ou nil -- ============================================== send = function(self, message, device) if (device) then self:getDevices(function(data) local found for k,v in ipairs(data.devices) do if (v.model == device or v.iden == device) then found = true self:sendPush(message, v.iden) end end if (not found) then self:log(device .. " non trouvé", true) end end) else self:sendPush(message, nil) end end } Quand je lance directement la scène, elle va m'afficher la liste des appareils connectés. Par contre quand je met à jour la variable globale "Pushbullet", elle va m'envoyé un push contenant le message de la variable globale directement sur mon téléphone "HTC One_M8 dual sim". Voici donc une manière simple de recevoir des pushs fonctionnel depuis sa HC2. Pushbullet permet aussi l'envoi de lien http, d'image, ... ce script est donc modifiable à votre convenance.
  13. Edit : ce VD fait double emploi avec celui de Krikroff : Waze Calculator Je n'ai malheureusement pas le temps de faire un joli tuto, mais voici le gros du sujet : Connaitre le temps estimé de trajet entre votre domicile et votre travail. L'idée étant d'être averti en cas perturbation. Ce code s'appuie sur les services Google Maps. Voici donc le VD et l'icone en pièces jointes Ensuite il vous faut obtenir une clé API chez google ... voici le lien : https://developers.google.com/maps/documentation/geocoding/get-api-key Une fois la clé obtenue, il ne vous reste plus qu'à créer un scène LUA et y coller et adapter le code suivant. -- Votre clé API Google local key = "AIxxYYYzz-8sdI9BY2hEbrEO34IiNaQfELETtls" -- Votre adresse à la maison local origins = "18+rue+des+bois+Annecy+France" -- Votre adresse professionnel local destinations = "7+rue+de+la+fontaine+Geneva+Switzerland" -- Numéro du module virtuel précédemment crée/importé. local hc2_module_virtuel = 475 -- ------------------------------------------------------------------------ -- NE PAS TOUCHER -- ------------------------------------------------------------------------ local duree = "" local version = "V1.00" -- ------------------------------------------------------------------------ -- Affichage dans la console -- ------------------------------------------------------------------------ function log(message, force) force = force or false if (debug or force) then print("["..version.."] ".. __convertToString(message)) end end -- ------------------------------------------------------------------------ -- Interrogation de l'API -- ------------------------------------------------------------------------ function getResponseData(url, body, func) local httpClient = net.HTTPClient(); httpClient:request(url.."?"..body, { success = function(resp) func(json.decode(resp.data)) end, error = function(err) print('error = ' .. err) end, options = { method = 'GET' } }); end -- ------------------------------------------------------------------------ -- Mesures de l'unité interne -- ------------------------------------------------------------------------ -- ------------------------------------------------------------------------ -- Mesures de l'unité interne -- ------------------------------------------------------------------------ function getDuree(origine, destination, message, label) getResponseData("https://maps.googleapis.com/maps/api/distancematrix/json", "origins="..origine.."&destinations="..destination.."&language=fr-FR&key="..key, function(data) log("----------========== Module intérieur ==========----------") duree = data.rows[1].elements[1].duration.value log(message .. duree, true) fibaro:call(hc2_module_virtuel, "setProperty", label, math.floor(duree/60)) end ) end getDuree(origins, destinations, "Durée travail = ", "ui.Label1.value") getDuree(destinations, origins, "Durée maison = ", "ui.Label2.value") log("Last request : " .. os.date("%x - %X"), true) . Perso, j'utilise GEA pour executé cette scène toutes les 5 mn. . A vous de jouer et d'adapter tout cela à votre convenance. Durée_Trajets_(mn).vfib
  14. Fredric

    Gestion Des États De Chauffage

    Je viens vous parler du mode de gestion que j’ai choisi mon chauffage. Mon habitation est chauffée à l’électricité, j’ai donc installé derrière chaque radiateur un FGS 221 qui commande le fils pilote. Je vais juste vous dire comment je change les températures par zones selon les états de la maison. J’ai créé pour chaque radiateur un VD avec 4 ordres « Confort », « Hors gel », « Eco » et « Arrêt » comme on peut le trouver un peut partout sur ce forum. (Si vous ne trouvez pas, demandez-moi) J’ai ensuite utilisé le VD de @Steven que vous trouverez ICI et je l’ai « un peut » modifié à mes besoins. J’ai créé trois variables, une par zone, les chambres, les pièces de vis et « le reste », j’ai appelé ces variables : RTC_Z1 pour la Zone 1, RTC_Z2 pour la Zone 2 et RTC_Z3 pour la Zone 3 (vous pouvez en créer autant que besoin). En suite, j’ai créé dans le panneau de chauffage, comme indiqué par @Steven dans son tuto, pas un panneau mais 11, selon vos besoin et j'ai relèvé les ID en notant à quel état ils correspondent. Exemple, quand je suis au travail, je veux une certaine gestion des mes chauffages, mais aussi quand je suis présent ou en vacances ou si j’ai des invités etc.… Tous ces états sont dans mes variables que j’utilise déjà comme beaucoup de monde, état de l’alarme, Travail, Vacances, Absent… (Pareil, pour ceux qui partent de zéro, me demander). J’ai créé une scène qui à en déclencheurs ces variables d’état. (Je vous poste ma scène qui à déjà plus d’un an, je suis en cours de modification de toutes mes scènes pour les optimiser, celle-ci y aura droit aussi mais vu qu’elle fonctionne parfaitement, elle attendra). J’ai mis les ID de chaque panneau de chauffage dans ma scène pour les associer aux variables (RTC_Z1 pour la Zone 1, RTC_Z2 pour la Zone 2 etc.…) selon les états. --[[ %% autostart %% properties %% events %% globals Aujourdhui AlarmeGenerale INV --]] local idm = { GENERAL = 442 } local sourceTrigger = fibaro:getSourceTrigger(); function check() local startSource = fibaro:getSourceTrigger(); if (tonumber(fibaro:getGlobalValue("Aujourdhui")) == 0 ) and ((fibaro:getGlobalValue("AlarmeGenerale")) == "Active" ) then --travail fibaro:debug("Travail / Alarme active") fibaro:setGlobal("RTC_Z1", "3"); --ID Chauffage travail ZONE_1 fibaro:setGlobal("RTC_Z2", "876"); --ID Chauffage travail Zone_2 fibaro:setGlobal("RTC_Z3", "3"); --ID Chauffage travail ZONE_1 fibaro:setGlobal("RTC_SB", "8"); --ID Chauffage travail SB fibaro:setGlobal("RTC_Cellier", "7"); --ID Chauffage Cellier ValeurZ1 = ((fibaro:getGlobal('RTC_Z1'))) ValeurZ2 = ((fibaro:getGlobal('RTC_Z2'))) ValeurZ3 = ((fibaro:getGlobal('RTC_Z3'))) ValeurSB = ((fibaro:getGlobal('RTC_SB'))) Valeur_Cellier = ((fibaro:getGlobal('RTC_Cellier'))) fibaro:sleep(5*1000); fibaro:debug("Zone 1: "..ValeurZ1) fibaro:debug("Zone 2: "..ValeurZ2) fibaro:debug("Zone 3: "..ValeurZ3) fibaro:debug("Salle de Bain: "..ValeurSB) fibaro:debug("Cellier: "..Valeur_Cellier) fibaro:call(idm["GENERAL"], "pressButton", "1") elseif (tonumber(fibaro:getGlobalValue("Aujourdhui")) == 1 ) and ((fibaro:getGlobalValue("AlarmeGenerale")) == "Active" ) then --CP fibaro:debug("CP / Alarme active") fibaro:setGlobal("RTC_Z1", "881"); --ID Chauffage Sortie Present fibaro:setGlobal("RTC_Z2", "881"); --ID Chauffage Sortie Present fibaro:setGlobal("RTC_Z3", "881"); --ID Chauffage Sortie Present fibaro:setGlobal("RTC_SB", "8"); --ID Chauffage travail SB fibaro:setGlobal("RTC_Cellier", "7");--ID Chauffage Cellier ValeurZ1 = ((fibaro:getGlobal('RTC_Z1'))) ValeurZ2 = ((fibaro:getGlobal('RTC_Z2'))) ValeurZ3 = ((fibaro:getGlobal('RTC_Z3'))) ValeurSB = ((fibaro:getGlobal('RTC_SB'))) Valeur_Cellier = ((fibaro:getGlobal('RTC_Cellier'))) fibaro:sleep(5*1000); fibaro:debug("Zone 1: "..ValeurZ1) fibaro:debug("Zone 2: "..ValeurZ2) fibaro:debug("Zone 3: "..ValeurZ3) fibaro:debug("Salle de Bain: "..ValeurSB) fibaro:debug("Cellier: "..Valeur_Cellier) fibaro:call(idm["GENERAL"], "pressButton", "1") elseif (tonumber(fibaro:getGlobalValue("Aujourdhui")) == 2 ) and ((fibaro:getGlobalValue("AlarmeGenerale")) == "Active" ) then --Weekend fibaro:debug("Weekend / Alarme active") fibaro:setGlobal("RTC_Z1", "881"); --ID Chauffage Sortie Present fibaro:setGlobal("RTC_Z2", "881"); --ID Chauffage Sortie Present fibaro:setGlobal("RTC_Z3", "881"); --ID Chauffage Sortie Present fibaro:setGlobal("RTC_SB", "8"); --ID Chauffage travail SB fibaro:setGlobal("RTC_Cellier", "7"); --ID Chauffage Cellier ValeurZ1 = ((fibaro:getGlobal('RTC_Z1'))) ValeurZ2 = ((fibaro:getGlobal('RTC_Z2'))) ValeurZ3 = ((fibaro:getGlobal('RTC_Z3'))) ValeurSB = ((fibaro:getGlobal('RTC_SB'))) Valeur_Cellier = ((fibaro:getGlobal('RTC_Cellier'))) fibaro:sleep(5*1000); fibaro:debug("Zone 1: "..ValeurZ1) fibaro:debug("Zone 2: "..ValeurZ2) fibaro:debug("Zone 3: "..ValeurZ3) fibaro:debug("Salle de Bain: "..ValeurSB) fibaro:debug("Cellier: "..Valeur_Cellier) fibaro:call(idm["GENERAL"], "pressButton", "1") elseif (tonumber(fibaro:getGlobalValue("Aujourdhui")) == 3 ) and ((fibaro:getGlobalValue("AlarmeGenerale")) == "Active" ) then --ferie fibaro:debug("ferie / Alarme active") fibaro:setGlobal("RTC_Z1", "874"); -- id du panneau de chauffage Alarme generale ABS fibaro:setGlobal("RTC_Z2", "874"); -- id du panneau de chauffage Alarme generale ABS fibaro:setGlobal("RTC_Z3", "874"); -- id du panneau de chauffage Alarme generale ABS fibaro:setGlobal("RTC_SB", "874"); -- id du panneau de chauffage Alarme generale ABS fibaro:setGlobal("RTC_Cellier", "874"); -- id du panneau de chauffage Alarme generale ABS ValeurZ1 = ((fibaro:getGlobal('RTC_Z1'))) ValeurZ2 = ((fibaro:getGlobal('RTC_Z2'))) ValeurZ3 = ((fibaro:getGlobal('RTC_Z3'))) ValeurSB = ((fibaro:getGlobal('RTC_SB'))) Valeur_Cellier = ((fibaro:getGlobal('RTC_Cellier'))) fibaro:sleep(5*1000); fibaro:debug("Zone 1: "..ValeurZ1) fibaro:debug("Zone 2: "..ValeurZ2) fibaro:debug("Zone 3: "..ValeurZ3) fibaro:debug("Salle de Bain: "..ValeurSB) fibaro:debug("Cellier: "..Valeur_Cellier) fibaro:call(idm["GENERAL"], "pressButton", "1") elseif (tonumber(fibaro:getGlobalValue("Aujourdhui")) == 0 ) and ((fibaro:getGlobalValue("AlarmeGenerale")) == "Inactive" ) and ((fibaro:getGlobalValue("INV")) == "non" ) then --travail fibaro:debug("Travail / Alarme Inactive / Pas d'invités") fibaro:setGlobal("RTC_Z1", "882"); -- id du panneau de chauffage travail Present fibaro:setGlobal("RTC_Z2", "871"); -- id du panneau de chauffage Present fibaro:setGlobal("RTC_Z3", "882"); -- id du panneau de chauffage travail Present fibaro:setGlobal("RTC_SB", "879"); -- id du panneau de chauffage Present fibaro:setGlobal("RTC_Cellier", "7"); --ID Chauffage Cellier ValeurZ1 = ((fibaro:getGlobal('RTC_Z1'))) ValeurZ2 = ((fibaro:getGlobal('RTC_Z2'))) ValeurZ3 = ((fibaro:getGlobal('RTC_Z3'))) ValeurSB = ((fibaro:getGlobal('RTC_SB'))) Valeur_Cellier = ((fibaro:getGlobal('RTC_Cellier'))) fibaro:sleep(5*1000); fibaro:debug("Zone 1: "..ValeurZ1) fibaro:debug("Zone 2: "..ValeurZ2) fibaro:debug("Zone 3: "..ValeurZ3) fibaro:debug("Salle de Bain: "..ValeurSB) fibaro:debug("Cellier: "..Valeur_Cellier) fibaro:call(idm["GENERAL"], "pressButton", "1") elseif (tonumber(fibaro:getGlobalValue("Aujourdhui")) == 1 ) and ((fibaro:getGlobalValue("AlarmeGenerale")) == "Inactive" ) and ((fibaro:getGlobalValue("INV")) == "non" ) then --CP fibaro:debug("CP / Alarme Inactive / Pas d'invités") fibaro:setGlobal("RTC_Z1", "6"); -- id du panneau de chauffage Present fibaro:setGlobal("RTC_Z2", "871"); -- id du panneau de chauffage Present fibaro:setGlobal("RTC_Z3", "6"); -- id du panneau de chauffage Present fibaro:setGlobal("RTC_SB", "879"); -- id du panneau de chauffage Present fibaro:setGlobal("RTC_Cellier", "7"); --ID Chauffage Cellier ValeurZ1 = ((fibaro:getGlobal('RTC_Z1'))) ValeurZ2 = ((fibaro:getGlobal('RTC_Z2'))) ValeurZ3 = ((fibaro:getGlobal('RTC_Z3'))) ValeurSB = ((fibaro:getGlobal('RTC_SB'))) Valeur_Cellier = ((fibaro:getGlobal('RTC_Cellier'))) fibaro:sleep(5*1000); fibaro:debug("Zone 1: "..ValeurZ1) fibaro:debug("Zone 2: "..ValeurZ2) fibaro:debug("Zone 3: "..ValeurZ3) fibaro:debug("Salle de Bain: "..ValeurSB) fibaro:debug("Cellier: "..Valeur_Cellier) fibaro:call(idm["GENERAL"], "pressButton", "1") elseif (tonumber(fibaro:getGlobalValue("Aujourdhui")) == 2 ) and ((fibaro:getGlobalValue("AlarmeGenerale")) == "Inactive" ) and ((fibaro:getGlobalValue("INV")) == "non" ) then --Weekend fibaro:debug("Weekend / Alarme Inactive / Pas d'invités") fibaro:setGlobal("RTC_Z1", "6"); -- id du panneau de chauffage Present fibaro:setGlobal("RTC_Z2", "871"); -- id du panneau de chauffage Present fibaro:setGlobal("RTC_Z3", "6"); -- id du panneau de chauffage Present fibaro:setGlobal("RTC_SB", "879"); -- id du panneau de chauffage Present fibaro:setGlobal("RTC_Cellier", "7"); --ID Chauffage Cellier ValeurZ1 = ((fibaro:getGlobal('RTC_Z1'))) ValeurZ2 = ((fibaro:getGlobal('RTC_Z2'))) ValeurZ3 = ((fibaro:getGlobal('RTC_Z3'))) ValeurSB = ((fibaro:getGlobal('RTC_SB'))) Valeur_Cellier = ((fibaro:getGlobal('RTC_Cellier'))) fibaro:sleep(5*1000); fibaro:debug("Zone 1: "..ValeurZ1) fibaro:debug("Zone 2: "..ValeurZ2) fibaro:debug("Zone 3: "..ValeurZ3) fibaro:debug("Salle de Bain: "..ValeurSB) fibaro:debug("Cellier: "..Valeur_Cellier) fibaro:call(idm["GENERAL"], "pressButton", "1") elseif (tonumber(fibaro:getGlobalValue("Aujourdhui")) == 3 ) and ((fibaro:getGlobalValue("AlarmeGenerale")) == "Inactive" ) then --ferie fibaro:debug("ferie / Alarme Inactive") fibaro:setGlobal("RTC_Z1", "874"); -- id du panneau de chauffage Alarme generale ABS fibaro:setGlobal("RTC_Z2", "874"); -- id du panneau de chauffage Alarme generale ABS fibaro:setGlobal("RTC_Z3", "874"); -- id du panneau de chauffage Alarme generale ABS fibaro:setGlobal("RTC_SB", "874"); -- id du panneau de chauffage Alarme generale ABS fibaro:setGlobal("RTC_Cellier", "874"); -- id du panneau de chauffage Alarme generale ABS ValeurZ1 = ((fibaro:getGlobal('RTC_Z1'))) ValeurZ2 = ((fibaro:getGlobal('RTC_Z2'))) ValeurZ3 = ((fibaro:getGlobal('RTC_Z3'))) ValeurSB = ((fibaro:getGlobal('RTC_SB'))) Valeur_Cellier = ((fibaro:getGlobal('RTC_Cellier'))) fibaro:sleep(5*1000); fibaro:debug("Zone 1: "..ValeurZ1) fibaro:debug("Zone 2: "..ValeurZ2) fibaro:debug("Zone 3: "..ValeurZ3) fibaro:debug("Salle de Bain: "..ValeurSB) fibaro:debug("Cellier: "..Valeur_Cellier) fibaro:call(idm["GENERAL"], "pressButton", "1") elseif (tonumber(fibaro:getGlobalValue("Aujourdhui")) == 0 ) and ((fibaro:getGlobalValue("AlarmeGenerale")) == "Inactive" ) and ((fibaro:getGlobalValue("INV")) == "oui" ) then --travail fibaro:debug("Travail / Alarme Inactive / Invité present") fibaro:setGlobal("RTC_Z1", "875"); -- id du panneau de chauffage Ivités fibaro:setGlobal("RTC_Z2", "875"); -- id du panneau de chauffage Ivités fibaro:setGlobal("RTC_Z3", "875"); -- id du panneau de chauffage Ivités fibaro:setGlobal("RTC_SB", "875"); -- id du panneau de chauffage Ivités fibaro:setGlobal("RTC_Cellier", "7"); --ID Chauffage Cellier ValeurZ1 = ((fibaro:getGlobal('RTC_Z1'))) ValeurZ2 = ((fibaro:getGlobal('RTC_Z2'))) ValeurZ3 = ((fibaro:getGlobal('RTC_Z3'))) ValeurSB = ((fibaro:getGlobal('RTC_SB'))) Valeur_Cellier = ((fibaro:getGlobal('RTC_Cellier'))) fibaro:sleep(5*1000); fibaro:debug("Zone 1: "..ValeurZ1) fibaro:debug("Zone 2: "..ValeurZ2) fibaro:debug("Zone 3: "..ValeurZ3) fibaro:debug("Salle de Bain: "..ValeurSB) fibaro:debug("Cellier: "..Valeur_Cellier) fibaro:call(idm["GENERAL"], "pressButton", "1") elseif (tonumber(fibaro:getGlobalValue("Aujourdhui")) == 1 ) and ((fibaro:getGlobalValue("AlarmeGenerale")) == "Inactive" ) and ((fibaro:getGlobalValue("INV")) == "oui" ) then --CP fibaro:debug("CP / Alarme Inactive / Invité present") fibaro:setGlobal("RTC_Z1", "875"); -- id du panneau de chauffage Ivités fibaro:setGlobal("RTC_Z2", "875"); -- id du panneau de chauffage Ivités fibaro:setGlobal("RTC_Z3", "875"); -- id du panneau de chauffage Ivités fibaro:setGlobal("RTC_SB", "875"); -- id du panneau de chauffage Ivités fibaro:setGlobal("RTC_Cellier", "7"); --ID Chauffage Cellier ValeurZ1 = ((fibaro:getGlobal('RTC_Z1'))) ValeurZ2 = ((fibaro:getGlobal('RTC_Z2'))) ValeurZ3 = ((fibaro:getGlobal('RTC_Z3'))) ValeurSB = ((fibaro:getGlobal('RTC_SB'))) Valeur_Cellier = ((fibaro:getGlobal('RTC_Cellier'))) fibaro:sleep(5*1000); fibaro:debug("Zone 1: "..ValeurZ1) fibaro:debug("Zone 2: "..ValeurZ2) fibaro:debug("Zone 3: "..ValeurZ3) fibaro:debug("Salle de Bain: "..ValeurSB) fibaro:debug("Cellier: "..Valeur_Cellier) fibaro:call(idm["GENERAL"], "pressButton", "1") elseif (tonumber(fibaro:getGlobalValue("Aujourdhui")) == 2 ) and ((fibaro:getGlobalValue("AlarmeGenerale")) == "Inactive" ) and ((fibaro:getGlobalValue("INV")) == "oui" ) then --Weekend fibaro:debug("Weekend / Alarme Inactive / Invité present") fibaro:setGlobal("RTC_Z1", "875"); -- id du panneau de chauffage Ivités fibaro:setGlobal("RTC_Z2", "875"); -- id du panneau de chauffage Ivités fibaro:setGlobal("RTC_Z3", "875"); -- id du panneau de chauffage Ivités fibaro:setGlobal("RTC_SB", "875"); -- id du panneau de chauffage Ivités fibaro:setGlobal("RTC_Cellier", "7"); --ID Chauffage Cellier ValeurZ1 = ((fibaro:getGlobal('RTC_Z1'))) ValeurZ2 = ((fibaro:getGlobal('RTC_Z2'))) ValeurZ3 = ((fibaro:getGlobal('RTC_Z3'))) ValeurSB = ((fibaro:getGlobal('RTC_SB'))) Valeur_Cellier = ((fibaro:getGlobal('RTC_Cellier'))) fibaro:sleep(5*1000); fibaro:debug("Zone 1: "..ValeurZ1) fibaro:debug("Zone 2: "..ValeurZ2) fibaro:debug("Zone 3: "..ValeurZ3) fibaro:debug("Salle de Bain: "..ValeurSB) fibaro:debug("Cellier: "..Valeur_Cellier) fibaro:call(idm["GENERAL"], "pressButton", "1") end setTimeout(check, 60*1000) end local startSource = fibaro:getSourceTrigger(); if (startSource["type"] == "other") then check(); end Dans chaque pièces dotés d’un radiateur, j’ai mis un VD de @Steven qui commande le premier VD avec 4 ordre de la pièce. Avec une modification, Au lieu de : Heating.stefa = 1 -- id du panneau de chauffage Je mets : ValeurZ1 = ((fibaro:getGlobal('RTC_Z1'))) Heating.stefa = ValeurZ1 -- id du panneau de chauffage normal Bien sà»r, c’est à vous de mettre la bonne variable selon la pièce, RTC_Z1 si la pièce est en zone 1. L’idée, c’est quand votre maison change d’état, je prends la mise sous alarme pour exemple, La variable « Alarmegeneral » passe de « Inactive » à « Active » alors la variable « RTC_Z1 prend l’ID « 3 », la RTC_Z2 prend l’ID « 876 » etc.. et les chauffages chauffe en fonction des températures qui sont dans le panneau de chauffage correspondant à l’ID. De cette façon, on peut vraiment personnaliser au plus proche de ses besoins. c'est tout bête mes cela fonctionne très bien. deux captures d'écran pour vous donner une idée: Enjoy
  15. Fredric

    Vmc Sauter Classic (Atlantic)

    Voici ce que j'ai mis en place pour ma VMC. @Did a fait un TUTO sur le sujet ICI : Mon TUTO est moins général, il concerne mon modèle de VMC, une SAUTER classic (ou ATLANTIC). Pour domotiser cette VMC, j’utilise un FGS221, un contacteur modulaire FINDER 22.21.8.230.4000. Voici le schéma de branchement d’origine de cette VMC : Dans la logique, j’aurais pu utiliser seulement le FGS221 mais le fait d’enclencher la deuxième vitesse, collé son relais sortie O2 et il fallait attendre longtemps pour que cela revienne à la normal ! (J’en ai même un qui est parti en SAV). Schéma suivant à ne pas faire!!! Ce pourquoi, je rajoute un contacteur modulaire qui lui, va très bien ! Voici mon schéma final : Et voici mon code pour la deuxième vitesse pour WAF dans un VD: j'ai créé un VD avec deux bouton, le premier avec le code suivant, pour faire variable la vitesse 2 selon l'état: local idm = {VMC = 510, VMC2 = 512, VD_Imperihome = 807} local application = function (vitesse, actionmodule, etat, var, idicone, texte, imperi) fibaro:debug(vitesse) fibaro:call(idm[actionmodule], etat) fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", idicone) fibaro:setGlobal("Etat_VMC", var) fibaro:setGlobal("Message", imperi) fibaro:call(idm["VD_Imperihome"], "pressButton", "1"); if texte ~= "" then HC2 = Net.FHttp("192.168.1.26", 8080) response = HC2:GET(texte) end end fibaro:sleep(3000) fibaro:setGlobal("Message", "" ); --raz variable local situation = { ["10"] = function() application("vitesse 2", "VMC2", "turnOn", "V2", 1177, "/sarah/parle?phrase=VMC+en+grande+vitesse", "VMC en grande Vitesse") end, ["11"] = function() application("vitesse normale", "VMC2", "turnOff", "ON", 1176, "/sarah/parle?phrase=VMC+en+vitesse+nornale", "VMC en Vitesse normale") end, ["00"] = function() application("vitesse normale", "VMC", "turnOn", "ON", 1176, "/sarah/parle?phrase=Démarrage+de+la+VMC", "Démarrage de la VMC") end, ["01"] = function() application("VMC OFF", "VMC2", "turnOff", "OFF", 1233, "/sarah/parle?phrase=VMC+éteinte", "VMC éteinte") end, } local status, err, value = pcall(situation[fibaro:getValue(idm["VMC"], "value") .. fibaro:getValue(idm["VMC2"], "value")]) if not (status) then fibaro:debug("<font color=\"red\">" .. os.date() .. " Erreur d'exécution" .. "</font>") end et dans le deuxième bouton j'ai mis ce code, pour allumer ou éteindre la VMC: local idm = {VMC = 510, VMC2 = 512, VD_Imperihome = 807} local application = function (vitesse, actionmodule, etat, var, idicone, texte, imperi) fibaro:debug(vitesse) fibaro:call(idm[actionmodule], etat) fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", idicone) fibaro:setGlobal("Etat_VMC", var) fibaro:setGlobal("Message", imperi) fibaro:call(idm["VD_Imperihome"], "pressButton", "1"); if texte ~= "" then HC2 = Net.FHttp("192.168.1.26", 8080) response = HC2:GET(texte) end end fibaro:sleep(3000) fibaro:setGlobal("Message", "" ); --raz variable local situation = { ["1"] = function() application("VMC OFF", "VMC", "turnOff", "OFF", 1233, "/sarah/parle?phrase=Arrêt+de+la+VMC", "Arrêt de la VMC") end, ["0"] = function() application("VMC ON - vitesse normale", "VMC", "turnOn", "ON", 1176, "/sarah/parle?phrase=Démarrage+de+la+VMC", "Démarrage de la VMC") end, } local status, err, value = pcall(situation[fibaro:getValue(idm["VMC"], "value")]) if not (status) then fibaro:debug("<font color=\"red\">" .. os.date() .. " Erreur d'exécution" .. "</font>") end Après, on peut gérer par GEA selon le l'humidité des pièces etc.. des Icônes: Enjoy Merci à @trankill666 pour son code que j'ai adapté à mes besoins
  16. blackargent

    "lien" Fibaro-Jeedom

    Alors bonjour à tous, Voici une petite contribution de ma part pour ceux qui souhaitent coupler une box jeedom à la box fibaro. Le tuto ci-dessous vous permettra de récupérer l'état de vos périphériques ZWAVE sous FIBARO via l'api et les mettra à jour sous Jeedom. Perso, mon but est d'utiliser le mode plan que je trouve intéressant. Attention, vous n'aurez pas le contrôle de vos éléments!! C'est pas bien compliqué à rajouter le contrôle si vous le désirez, mais c'est plus compliqué à mettre en place de manière automatique avec mon script ci-dessous. Vous excuserez gentiment les fôtes de francé svp! Merci d'avance. Ah, une dernière chose, chez moi ça fonctionne très bien mais il se peut que ça plante chez vous, j'ai pas testé sur d'autres installations^^ Si ça bugg, vous apprendrez à faire sans ces prochaines lignes! Toutes les manipulations se font sous Jeedom (mais pourquoi il nous met ça sur un forum FIBARO lui?! ... euh... ) Au préalable, il faut installer les plugins "Scripts" et "Virtuel" Sous Virtuel - ajouter: Il faut aller jusqu'à fibaro_XXX_10. Pensez aussi à noter le premierID. Puis dupliquez avec le bouton se trouvant en haut à droite ("dupliquer"...) 10 fois (permet 100 périphériques!) Attention, il faut s'assurer que tous les ID se suivent et qu'entre chaque périphériques il y a +3 de différence. Sinon, faut recommencer. Chez moi, ça donne ça: Plugins - scripts - ajouter Pour le script - cliquer sur "nouveau" - FibaroLink.php (l'extension est importante!!!) et coller le code ici (qui a visiblement mal apprécié le copier-coller pour sa mise en forme): Il faut remplacer inscrire l'adresse IP de votre fibaro, le mot de passe admin de votre fibaro, le premier id virtuel sous votre JEEDOM (voir plus haut), votre api sous JEEDOM et l'url de votre JEEDOM. <?php set_time_limit(120); //lance le script jusqu'à 120 secondes //info à compléter $url_fibaro ="192.168.XXX.XXX"; $admin_fibaro ="admin"; $password_admin_fibaro ="PASSWORD"; $premier_id_device_virtuel = "306"; //premier ID virtuel se trouvant dans JEEDOM $api_jeedom = "API JEEDOM"; $url_jeedom = "192.168.XXX.XXX"; //ne pas toucher ce qui suit $url_jeedom_device = "http://" . $admin_fibaro . ":" . $password_admin_fibaro . "@" . $url_fibaro . "/api/devices/"; $url_jeedom_room = "http://" . $admin_fibaro . ":" . $password_admin_fibaro . "@" . $url_fibaro . "/api/rooms"; $json_jeedom_device = file_get_contents($url_jeedom_device); $json_jeedom_room = file_get_contents($url_jeedom_room); $data_json_jeedom = json_decode($json_jeedom_device, true); $data_json_jeedom_room = json_decode($json_jeedom_room, true,300); $premier_id_device_virtuel_avec_incrementation = $premier_id_device_virtuel; $nombre_incrémentation = "0"; //compte le nombre d'élément dans le tableau $nbre_element_json_jeedom = count($data_json_jeedom); $nbre_element_json_jeedom_room = count($data_json_jeedom_room); //SCRIPT PRINCIPAL //le script commence ici for($i=5;$i<$nbre_element_json_jeedom;$i++){ //vérifie si une propriété zwavecompagny exise | qu'il y a une valeur dans les propriétés zwave | que c'est pas un plugin if(isset($data_json_jeedom[$i]['properties']['zwaveCompany']) && isset($data_json_jeedom[$i]['properties']['value']) && $data_json_jeedom[$i]['isPlugin']==false){ //change de device virtuel sous jeedom après 20 exports if ($nombre_incrémentation==1*30 || $nombre_incrémentation==2*30 || $nombre_incrémentation==3*30 || $nombre_incrémentation==4*30 || $nombre_incrémentation==5*30 || $nombre_incrémentation==6*30 || $nombre_incrémentation==7*30 || $nombre_incrémentation==8*30 || $nombre_incrémentation==9*30 || $nombre_incrémentation==10*30 || $nombre_incrémentation==11*30 || $nombre_incrémentation==12*30 || $nombre_incrémentation==13*30 || $nombre_incrémentation==14*30 || $nombre_incrémentation==15*30){ $premier_id_device_virtuel_avec_incrementation=$premier_id_device_virtuel_avec_incrementation+2; } //envoie le nom de la pièce for($j=0; $j<$nbre_element_json_jeedom_room;$j++){ if($data_json_jeedom[$i]['roomID']==$data_json_jeedom_room[$j]['id']){ file_get_contents('http://' . $url_jeedom . '/core/api/jeeApi.php?apikey=' . $api_jeedom . '&type=virtual&id=' . urlencode($premier_id_device_virtuel_avec_incrementation) . '&value=' . urlencode($data_json_jeedom_room[$j]['name'])); } } $premier_id_device_virtuel_avec_incrementation++; $nombre_incrémentation++; //envoie le nom du device à jeedom file_get_contents('http://' . $url_jeedom . '/core/api/jeeApi.php?apikey=' . $api_jeedom . '&type=virtual&id=' . urlencode($premier_id_device_virtuel_avec_incrementation) . '&value=' . urlencode($data_json_jeedom[$i]['name'])); $premier_id_device_virtuel_avec_incrementation++; $nombre_incrémentation++; //envoie la valeur à Jeedom file_get_contents('http://' . $url_jeedom . '/core/api/jeeApi.php?apikey=' . $api_jeedom . '&type=virtual&id=' . urlencode($premier_id_device_virtuel_avec_incrementation) . '&value=' . urlencode($data_json_jeedom[$i]['properties']['value'])); $premier_id_device_virtuel_avec_incrementation++; $nombre_incrémentation++; } } ?> Pour automatiser ce script, j'ai dà» utiliser le crontab en ssh sur mon pi qui héberge JEEDOM. (Les identifiants SSH sont jeedom/Mjeedom96 de base) sudo chmod +x /usr/share/nginx/www/jeedom/plugins/script/core/ressources/FibaroLink.php sudo crontab -e */3 * * * * php /usr/share/nginx/www/jeedom/plugins/script/core/ressources/FibaroLink.php EDIT (à tester): Si nouvelle version de JEEDOM, il se peut que nginx ne foncitonne plus et que jeedom tourne sur apache2. Donc les commandes ci-dessus sont à remplacer par: sudo chmod +x /var/www/html/plugins/script/core/ressources/FibaroLink.php sudo crontab -e */3 * * * * php /var/www/html/plugins/script/core/ressources/FibaroLink.php (execute toutes les 3mn - vous avez la possibilité de modifier le /3 par /1 pour executer toutes les minutes si jamais) Voilà , ca doit marcher! Pour la suite, voici un petit exemple de ce que j'ai fait: Plugins - virtuel - ajouter Voilà , j'espère que ça sera utile à quelqu'un. Si ça ne l'est pas, j'aurai juste perdu 15minutes de ma vie à vous faire ces screenshots et ce texte. Amusez-vous bien avec tout ça! Dernière chose, feel free de changer mon code comme bon vous semble et/ou d'y apporter des améliorations^^ EDIT: Pour info, vous pouvez également changer dans le script php "set_time_limit(120)" à "set_time_limit(115)" et le crontab -e à 2mn au lieu de 3mn. Je l'ai fait chez moi et ça ne semble pas utiliser trop de ressources systèmes sur ma box FIBARO ou mon PI (JEEDOM). Vous gagnerez 1 mn pour la remontée des données!
  17. Suite aux nombreuses questions de nouveaux utilisateurs de la HC2, je vous propose un petit tutoriel sur la gestion manuelle de "modes" dans la maison. Dans mon exemple, il y a 5 modes déclenchant chacun une scène différente (les modes étant "In" (Présence), "Out" (Absence), "Sleep" (Dodo), "Wake Up" (Réveil) et TV. Vous pouvez envisager bien d'autres scénarios (soirée romantique, fiesta à la maison...) mais voici ceux par lesquels j'avais commencé mon implémentation domotique. La première chose est de créer une variable globale qui enregistrera le statut de la maison. Il faut donc aller dans Panneaux > Panneau Variables puis créer une nouvelle variable prédéfinies en cliquant sur Ajouter. Il faut rentrer un nom (en faisant bien attention à la casse (Majuscule, minuscule)) car cela pourrait avoir un impact dans vos scènes puis rentrer les différents modes. Afin de gérer des cas d'erreur, j'ai également créer pour cette variable une valeur "Default" que je détaillerais après. Une fois la variable créée, il faut créer un nouveau VD (Virtual Device). Pour le faire il faut aller dans Modules > Ajouter un Périphérique Virtuel. En allant dans l'onglet Avancé, renseignez un nom, une pièce si vous le souhaitez. En dessous, choisissez le nombre de boutons que vous voulez faire apparaître puis cliquer sur "Ajouter un réglage". Vous vous retrouvez en dessous avec le paramétrage de ces boutons. Il suffit de répéter l'opération plusieurs fois pour obtenir plusieurs lignes comme dans l'exemple ci-dessous. Dans chacun des boutons, nous allons mettre à jour le statut de la maison en modifiant la valeur de la variable globale. Pour le faire, nous allons utiliser comme exemple l'instruction qui pour le bouton 'In' affectera la valeur In à 'Mode_Maison' (il faut également bien cocher "Code Lua" en bas des propriétés du bouton) fibaro:setGlobal('Mode_Maison','In') Afin de gérer le cas, ou nous voudrions rappuyer sur le bouton In une deuxième fois, nous allons passer par la valeur "Default" évoqué plus haut. Avec le code ci-dessous : local value = fibaro:getGlobal('Mode_Maison') if (value == 'In') then fibaro:setGlobal('Mode_Maison','Default') end fibaro:setGlobal('Mode_Maison','In') J'ai été amené à rajouter ce code car le mode TV éteignait certaines lumières, hors si quelqu'un avait rallumé la lumière avec un interrupteur entre temps, la scène ne se déclenchait pas car la variable était déjà en "Mode : TV". Le fait de repasser par le statut "Default" permet simplement de redéclencher la scène TV même si elle était déjà en mode "TV" au préalable. Une fois que vous avez créé l'ensemble de vos boutons et mis à jour la valeur des différents modes, il faut créer les scènes spécifiques à chaque mode. Afin de faciliter la maintenance, j'ai choisi de créer une scène LUA par mode. Pour le faire, il suffit d'aller dans Scène > Ajouter une scène (Dans mon cas, j'ai utilisé du LUA mais vous pouvez également utiliser les scènes en mode bloc) Ici, un exemple de code qui éteint 2 interrupteurs : --[[ %% properties %% globals --]] -- Liste des interrupteurs local interId = {39,104} fibaro:debug('TV Mode') -- Arrêter les interrupteurs for i = 1, #interId do fibaro:call(interId[i], 'turnOff') end Vous noterez que je n'ai rien mis sous properties, ni sous globals. En effet je ne souhaitais pas que l'ensemble des scènes se déclenchent lorsque la variable Mode_Maison a été mise à jour. J'ai donc créer une scène principale qui se charge de lancer la bonne scène. Ce code utilise l'instruction fibaro:startScene(XX) Ou XX correspond au numéro de la scène à lancer (Vous trouvez l'ID dans l'onglet Général de vos scènes). Le code prend donc la forme ci-dessous : --[[ %% properties %% globals Mode_Maison --]] local valueHouseMode = fibaro:getGlobal('Mode_Maison') fibaro:debug(valueHouseMode) if (valueHouseMode=='Out') then fibaro:debug('Out Scene') fibaro:startScene(10) elseif (valueHouseMode=='TV') then fibaro:debug('TV Scene') fibaro:startScene(11) else fibaro:debug('Switch Error') end Ce code est appelé à chaque fois que la variable "Mode_Maison" est modifiée grâce aux lignes : --[[ %% properties %% globals Mode_Maison --]] Puis nous récupérons, la valeur de "Mode_Maison" : local valueHouseMode = fibaro:getGlobal('Mode_Maison') Avant d'être testée pour lancer la scène qui nous intéresse fibaro:debug('TV Scene') fibaro:startScene(18) Et voilà , vos scènes se lancent en fonction du changement de mode de votre maison. Vous pouvez bien évidemment compléter les différents modes en rajoutant des if / elseif en fonction de vos attentes. Il y a bien évidemment plusieurs solutions pour arriver à ce résultat, mais j'ai considéré que c'était la manière la plus propre afin de limiter le nombre d'instances lancées en simultanées. N'hésitez pas à me faire part de vos remarques si certaines parties ne sont pas claires afin que je complète ce tutoriel qui a pour but de s'adresser aux débutants.
  18. VD - Visualisation Detection Ouverture , Detection de mouvements, Variable Globale Ce VD ou virtual devices a pour but de regrouper plusieurs VD dont celui de @STEVEN Virtual Device : Variables Globales Je remercie STEVEN pour son code qui ma inspiré pour les autres affichage http://www.domotique-fibaro.fr/index.php/topic/4205-virtual-device-variables-globales/ Cette visionneuse affichera : La dernière détection d'un capteur d'ouverture avec le temps écoulé (Max 10 modules) La dernière détection d'un capteur de détection de mouvement avec le temps écoulé (Max 10 modules) Les 10 dernières variable globales (Ce code appartient a STEVEN) Toute ces données seront triés par ordre chronologique Visualisation des Capteurs d'ouverture code lua : local id = fibaro:getSelfId() fibaro:call(id,"setProperty","ui.LabType.value", "Capteur Ouverture") HC2 = Net.FHttp("127.0.0.1",11111) response = HC2:GET("/api/devices") local Ouverture = {} local t = json.decode(response) local j = 0 for i = 1, #t do if t[i].visible == true and t[i].type == "com.fibaro.doorSensor" then local HeureModif = t[i].properties.lastBreached local heure = os.time() local TempEcoule = os.difftime(heure, HeureModif)-3600 table.insert(Ouverture, {t[i].name, t[i].id, TempEcoule}) --fibaro:debug(t[i].name.." id : "..t[i].id..t[i].properties.lastBreached) end end table.sort(Ouverture, function(a, return a[3]<b[3] end) -- Display results local id = fibaro:getSelfId() local cpte = 0 for i = 1, 10 do pcall(function() fibaro:debug(i.." - "..Ouverture[i][2]) cpte = i if Ouverture[i][3] > 3600*24 then fibaro:debug(i .. " id=" .. Ouverture[i][1] .. " - Value=" .. os.date("%j jours %X", Ouverture[i][3]) ) fibaro:call(id, "setProperty", "ui.Label"..i..".value", Ouverture[i][1] .. " = " .. " ".. os.date("%j jours %X", Ouverture[i][3])) else fibaro:call(id, "setProperty", "ui.Label"..i..".value", Ouverture[i][1] .. " = " .. " ".. os.date("%X", Ouverture[i][3])) end end) end for i = cpte+1, 10 do fibaro:debug("i= "..i) fibaro:call(id, "setProperty", "ui.Label"..i..".value", "") end Visualisation des Capteurs de mouvement code lua : local id = fibaro:getSelfId() fibaro:call(id,"setProperty","ui.LabType.value", "Detection Mouvements") HC2 = Net.FHttp("127.0.0.1",11111) response = HC2:GET("/api/devices") local Ouverture = {} local t = json.decode(response) local j = 0 for i = 1, #t do if t[i].visible == true and t[i].type == "com.fibaro.motionSensor" or t[i].type == "com.fibaro.FGMS001" then local HeureModif = t[i].properties.lastBreached local heure = os.time() local TempEcoule = os.difftime(heure, HeureModif)-3600 local RoomName = fibaro:getRoomName(fibaro:getRoomID(t[i].id)) fibaro:debug(RoomName) table.insert(Ouverture, {t[i].name, t[i].id, TempEcoule, RoomName}) --fibaro:debug(t[i].name.." id : "..t[i].id..t[i].properties.lastBreached) end end table.sort(Ouverture, function(a, return a[3]<b[3] end) -- Display results local cpte = 0 for i = 1, 10 do pcall(function() fibaro:debug(i.." - "..Ouverture[i][4]) cpte = i if Ouverture[i][3] > 3600*24 then fibaro:debug(i .. " id=" .. Ouverture[i][1] .. " - Value=" .. os.date("%j jours %X", Ouverture[i][3]) ) fibaro:call(id, "setProperty", "ui.Label"..i..".value", Ouverture[i][1] .. " = " .. " ".. os.date("%j jours %X", Ouverture[i][3])) else fibaro:call(id, "setProperty", "ui.Label"..i..".value", Ouverture[i][4] .. " - ".. Ouverture[i][1] .. " = " .. " ".. os.date("%X", Ouverture[i][3])) end end) end for i = cpte+1, 10 do fibaro:debug("i= "..i) fibaro:call(id, "setProperty", "ui.Label"..i..".value", "") end Visualisation des Capteurs de mouvement de @steven Visualisation Libre ce bouton est reservé pour votre imagination si il reste vide ....... tanpis pour vous La mainloop ou boucle principale Sorry local NumBouton = { ["Capteur Ouverture"] = 12, ["Detection Mouvements"] = 13, ["Variables Globale"] = 15 } local SelfId = fibaro:getSelfId() local Nom = fibaro:getValue(SelfId, "ui.LabType.value") local bouton = NumBouton[Nom] fibaro:debug(bouton) fibaro:call(SelfId, "pressButton", bouton) La visualisation ce fera toute les 3s on peut augmenter ce parametre en ajoutant un sleep Fichier a télécharger : Visionneuse_v01b.vfib Liens vers mes autres tutos : Classer Les Jours Du Mois Par Nom (Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi, Dimanche) ICI Visualisation Des Températures ICI Surveillance Free Memory Hc2 ICI Visualisation Iosdevice Smartphone, Iphone Etc... ICI Visualiser Les 10 Dernières Ouverture De Porte ICI Faire Une Copie De La Clef Usb Recovery Sous Windows ICI Tout Sur Le Déclenchement D'une Scéne En Lua (By Steven) ICI Paramétrage D'un Module (Fonctions Générales) ICI Module Virtuel - Le Slider De A À Z (Image + Codes Lua) ICI Universel Pour Volets Roulant ICI Ouverture, Fermeture, Allumer, Éteindre (Volets, Lumiére En Une Scéme) ICI Crée Une Variable Globale Ou Une Variable Globale Predefinie En Lua ICI Sceneactivation Et Module Compatible (Déclenchement D'une Scéne Avec Un Bouton) ICI Les Variables - Complément D'information By Steven ICI/ Lua - Programmation La Règle De 3 By Steven ICI Module Virtuel - Utilisation D'un Label ( Étiquette ) ICI Module Virtuel - Numérotation Des Boutons ICI Lua - Connaitre Le Dernier Id Et Le Nombres De Modules ICI Clé Usb Recovery Explication En Image De La Fat32 ICI Wol Avec Xpenoboot Dsm 5.1 ( Nas Synology ) ICI Module Virtuel - Crée Automatiquement Des Variables Globales ICI
  19. Visualiser les 10 dernières ouverture de Porte Je remercie @steven car ce VD est une adaptation de son VD Variables Globales Ce virtual devices affiche la dernière détection avec le temps écoulé des captures comme on peu le voir dans l'interface Les informations sont récuperer directement via l'api il peut y avoir quelques soucis si un modules et déclarer comme detecteur de porte alors qu'il ne l'ai pas Ouverture_porte_v0.2b.vfib
  20. Visualisation des Températures par ordres décroissant Ce VD va vous permettre de visualiser toutes les sondes de température Il suffit d'importer le VD pour que cela fonctionne Fichier à télécharger : Mise a jours version 0.90b : Temperature_v0.9b.vfib
  21. Classer les jours du Mois par nom (Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi, Dimanche) Ce script permet de classer les jours du mois par le nom du jour. le but de ce script est de permettre de retrouver le x jour d'un mois ou tous les jours qui ont le même nom Exemple : je veux le 3 mardi du mois je veux tous les jeudi du mois Si vous sauvegardez la table Jours dans une variable globale il faudra exécuter ce script tous les 01 de chaque mois vers 00h01 ---------------------------------------------------------------------- -- Calcul du nombre de jours dans le mois ---------------------------------------------------------------------- -- Si année bissextile local function bissextile(Annee) return Annee % 4 == 0 and (Annee % 100 ~= 0 or Annee % 400 == 0) end -- Nombre de jours dans le mois function JourDansMois(Mois, Annee) return Mois == 2 and bissextile(Annee) and 29 or ("\31\28\31\30\31\30\31\31\30\31\30\31"):byte(Mois) end ---------------------------------------------------------------------- -- Initialisation des variables et creation des tables ---------------------------------------------------------------------- local MoisAnnee = os.date("*t") local mois = MoisAnnee.month -- recuperation du mois en cours local annee = MoisAnnee.year -- recuperation de l'annee en cours local Jmois = JourDansMois(mois, annee) -- calcul le nombre de jour dans le mois en cours local Jours = {["Lundi"]={}, ["Mardi"]={}, ["Mercredi"]={}, ["Jeudi"]={}, ["Vendredi"]={}, ["Samedi"]={}, ["Dimanche"]={}} local JourNom = {"Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"} ---------------------------------------------------------------------------------- for jour = 1,Jmois do local tmpdate = (os.time{year = annee, month = mois, day = jour}) local tmpJourMois = os.date("%d", tmpdate) -- recupere le jour du mois local tmpJourSemaine = tonumber(os.date("%u", tmpdate)) -- Numero du jour de la de semaine local tmpJourNom = JourNom[tmpJourSemaine] -- recupere le nom du jour en francais table.insert(Jours[tmpJourNom], tmpJourMois) --fibaro:debug("Jour = "..tmpJourMois.." "..tmpJourNom) end ----------------------------------------------------------------------- -- Affichage ----------------------------------------------------------------------- print(os.date("Aujourd'hui, nous sommes un %A")) fibaro:debug("Nombre de Jours dans le mois "..Jmois) for i = 1,7 do local jour = JourNom[i] fibaro:debug(jour) for j = 1,#Jours[jour] do fibaro:debug(Jours[jour][j]) end end -- Exemple d'utilisation -- Ici on affiche le 2 lundi du mois local toto = "Lundi" fibaro:debug(Jours[toto][2]) -- ici on affiche le 3 lundi du mois fibaro:debug(Jours.Mardi[3]) On peut sauvegarder la table Jours dans une variable globale afin de l'utiliser dans d'autres scripts (il faudra créer la variable globale) -- Sauvegarde des jours de la semaine dans la variable globale JoursSemaine fibaro:setGlobal('JoursSemaine',json.encode(Jours)) On peut récuperer cette table dans un autre script -- Récupération des jours de la semaine de la variable globale JoursSemaine Jours=json.decode((fibaro:getGlobal('JoursSemaine'))); Utilisation dans un Script ------------------------------------- -- Exemple d'utilisation -- ------------------------------------- -- Ici on affiche le 2 lundi du mois local toto = "Lundi" --Affichage fibaro:debug(Jours[toto][2]) ---------------------------------------------------------------------------------------------- -- ici on affiche le 3 Vendredi du mois local Vendredi3 = Jours.Vendredi[3] --Affichage fibaro:debug(Vendredi3) ---------------------------------------------------------------------------------------------- -- Ici on récupere tous les mardi du mois sous forme de table local Mardi = Jours.Mardi --Affichage for i = 1,#Mardi do fibaro:debug(Mardi[i]) end ---------------------------------------------------------------------------------------------- -- Connaitre le nombre de Samedi dans le mois local NombreSamedi = #Jours.Samedi --Affichage fibaro:debug("Nombre de mardi = "..NombreSamedi) ---------------------------------------------------------------------------------------------- --Recuperer le 3 et 4 jeudi du mois local Jeudi = {Jours.Jeudi[3], Jours.Jeudi[4]} --Affichage for i = 1,#Jeudi do fibaro:debug("Jeudi "..Jeudi[i]) end Voici une version Virtual Device : Fichiers virtual device : Jours_Semaine.vfib
  22. jojo

    Images Clé Usb

    Bonjour, Il y a de plus en plus de demandes des fichiers images de la clé recovery de la HC2. Alors j'ai mis cela en public sur mon Google Drive Il contient un un gros fichier ZIP (2,4 GB) "USB RECOVERY HC2" : qui contient une image complète de la clé USB recovery. Complète = la FAT32 et les autres partitions nécessaires. L'image est celle de la 4.056 Le sous-dossier le l'image contient un répertoire /backups avec quelques vieux backups à moi, qui vous seront d'aucune utilité => vous pouvez détruire le contenu de ce répertoire (PAS le répertoire). Voir le tuto de @mprinfo pour son utilisation. Il contient actuellement 4 folders "Recovery Image 3.xxx" : le dossier system qui contient l'image (v3.x) utilisée par le HC2 lors qu'un recovery. Ce dossier se trouve dans la FAT32 de la clé USB "Recovery Image 4.031" : le dossier system qui contient l'image (v4.031) utilisée par le HC2 lors qu'un recovery. Ce dossier se trouve dans la FAT32 de la clé USB "Recovery Image 4.056" : le dossier system qui contient l'image (v4.056) utilisée par le HC2 lors qu'un recovery. Ce dossier se trouve dans la FAT32 de la clé USB "USB RECOVERY HC2" : un gros fichier ZIP (2,4 GB) qui contient une image complète de la clé USB recovery. Complète = la FAT32 et les autres partitions nécessaires. Voir le tuto de mprinfo pour son utilisation. et 1 fichier avec un exemple de doc que je maintiens pour pouvoir repartir de zéro (>60 pages ...)
  23. Connaitre le dernier ID et le Nombres de Modules Comment connaitre le nombres de modules installer sur notre Box ? C'est très simple il suffit d’interroger la box via l'api "/api/devices" Exemples : Dans un module virtuel : local HC2 = Net.FHttp("127.0.0.1", 11111) local reponse = HC2:GET("/api/devices") local TousLesModules = json.decode(reponse) fibaro:debug("Nombres de modules : " ..#TousLesModules) Dans une Scéne : local TousLesModules = api.get("/devices/") fibaro:debug("Nombres de modules : " ..#TousLesModules) Le caractère "#" devant le nom de la tables ici " TousLesModules " permet de donner le nombres d'entrée de la table Dans cette exemple cela nous donnera le nombres de Modules. Le chiffre que j'obtiens doit donc correspondre au dernier ID ? OUI : Si ne n'ai supprimer aucun modules Non : Si j'ai supprimer des modules Je m'explique lors que l'on crée ou ajoute de nouveau modules les ID croitre chronologiquement ainsi que le nombres d'entrés dans ma table. Par contre si je supprime un module cela va supprimer une entrée dans ma table mais les ID ne bougeront pas ce qui va créé un décalage entre le nombre d'entrée dans ma table et les numéro d'ID. Comment faire pour résoudre ce probléme ? C'est très simple puisque l'on connait le nombre d'entrée dans la table et que l'on sait que le dernier ID ce trouve a la fin de cette table on va donc récuperer l'ID de la dernière entrée Exemple : Dans un module virtuel : local HC2 = Net.FHttp("127.0.0.1", 11111) local reponse = HC2:GET("/api/devices") local TousLesModules = json.decode(reponse) local IdEnd = TousLesModules[#TousLesModules].id fibaro:debug("Nombres de modules : " ..#TousLesModules) fibaro:debug("Dernier ID : "..IdEnd) Dans une scéne : local TousLesModules = api.get("/devices/") local IdEnd = TousLesModules[#TousLesModules].id fibaro:debug("Nombres de modules : " ..#TousLesModules) fibaro:debug("Dernier ID : "..IdEnd) A partir de maintenant nous savons comment connaitre le dernier ID de notre BOX. Une autre solution aurait était d'utiliser ce code. Exemple : Dans un module virtuel : local HC2 = Net.FHttp("127.0.0.1", 11111) local reponse = HC2:GET("/api/devices") local TousLesModules = json.decode(reponse) local IdEnd = TousLesModules[#TousLesModules].id fibaro:debug("Nombres de modules : " ..#TousLesModules) fibaro:debug("Dernier ID : "..IdEnd) for i,v in ipairs(TousLesModules) do local Nom = TousLesModules[i].name local visible = TousLesModules[i].visible if visible == true then local id = TousLesModules[i].id fibaro:debug("Id = "..id.." - Nom = "..Nom) end end Dans une scéne : local TousLesModules = api.get("/devices/") local IdEnd = TousLesModules[#TousLesModules].id fibaro:debug("Nombres de modules : " ..#TousLesModules) fibaro:debug("Dernier ID : "..IdEnd) for i,v in ipairs(TousLesModules) do local Nom = TousLesModules[i].name local visible = TousLesModules[i].visible if visible == true then local id = TousLesModules[i].id fibaro:debug("Id = "..id.." - Nom = "..Nom) end end On s' aperçois qu'en utilisant " for i,v ipairs " on n'a pas besoin de connaitre le dernier ID pour afficher toute la table Par contre si on utilise ce genre de code nous aurons besoin du dernier ID Exemple dans un VD : Je veux connaitre tous les ID de mes Volets local HC2 = Net.FHttp("127.0.0.1", 11111) local reponse = HC2:GET("/api/devices") local Modules = json.decode(reponse) local Var_Id = {"Tous"} local IdEnd = Modules[#Modules].id fibaro:debug("IdEnd "..IdEnd) for i = 3, IdEnd do local theType = string.sub(fibaro:getType(i), 12,15) local Var_Name = fibaro:getName(i) if (theType == 'FGRM') then local t_id = #Var_Id + 1 table.insert(Var_Id, t_id, tonumber(i)) fibaro:debug("Type : "..theType..' - Volets ID '..i .." = "..Var_Name) end end
  24. VD - Visualisation IOSDevice Smartphone, IPhone etc... Voici un VD qui va permettre a ceux qui cherche toujours comment trouver l'ID de leurs Téléphone ou Tablette de résoudre le probléme. Nouvelle version : Ajout d'un bouton Push pour test . Icones de megabubu Fichier à Telecharger : IOS_Info_v1.00.vfib
  25. Gestion simple des Variables Globale en LUA Le script que je partage avec vous va vous permettre de gérer simplement les Variables globales et Variables globales prédéfinie en LUA. C'est une adaptation du code de STEVEN Avantage : Il permet de faire une sauvegarde des Variables globales ce qui est bien pratique lorsque l'on fait un recovery Il permet de créé des variables globales prédéfinie ou pas très simplement à partir d'une scène ou d'un VD sans avoir à sortir artillerie lourde. Voici le code a mettre dans une Scéne : --[[ %% properties %% globals GestionVG --]] local trigger = fibaro:getSourceTrigger() local variables = {} local variablesASupprimer ={} -- creation de ou des VG avec la variable GestionVG if (trigger['type'] == 'global') then fibaro:debug('Global variable source = ' .. trigger['name']) variables = json.decode((fibaro:getGlobal('GestionVG'))); if variables == nil then fibaro:abort() end -- creation de ou des VG manuellement ou par une autre scène ou un appel API elseif (trigger['type'] == 'other') then fibaro:debug('Global variable source = ' .. 'Other source.') variables = { {nom = "GestionVG", valeur = ""}, -- Gestion de VG -- Ex : Variable Globale predefini avec valeur1 pour valeur par default {nom = "Test1", valeur = "Valeur1", choix = {"Valeur2", "Valeur3"}}, -- Ex : Variable Globale qui à pour valeur 0 {nom = "Test2", valeur = "0"}, } variablesASupprimer = { {nom = "Test1"}, {nom = "Test2"} } end ------------------------------------------------- ---- Merci a STEVEN pour ce code -- ----------------------------------------------- -- Supprime une variable -- ----------------------------------------------- function supprimer(nom) local http = net.HTTPClient() http:request("http://127.0.0.1:11111/api/globalVariables/"..nom, { options = { method = 'DELETE' } , success = function(response) fibaro:debug(nom .. " supprimée avec succès") end, error = function(response) fibaro:debug(nom .. " ERROR !!!") end, }) end -- ----------------------------------------------- -- Modifie une variable -- ----------------------------------------------- function modifier(nom, valeur, choix) local variable = {} variable.value = valeur variable.isEnum = false if (type(choix) ~= "nil") then variable.isEnum = true table.insert(choix, 1, valeur) variable.enumValues = choix end local http = net.HTTPClient() http:request("http://127.0.0.1:11111/api/globalVariables/"..nom, { options = { method = 'PUT', data = json.encode(variable) }, success = function(response) fibaro:debug(nom .. " modifiée avec succès") end, error = function(response) fibaro:debug(nom .. " ERROR !!!") end, }) end -- ----------------------------------------------- -- Ajoute une variable -- ----------------------------------------------- function ajouter(nom, valeur, choix) local enum = 0 if (type(choix) ~= "nil") then enum = 1 end local http = net.HTTPClient() http:request("http://127.0.0.1:11111/api/globalVariables", { options = { method = "POST", data = json.encode({name=nom, isEnum=enum}) }, success = function(response) fibaro:debug(nom .. " créé avec succès") modifier(nom, valeur, choix) end, error = function(response) fibaro:debug(nom .. " ERROR !!!") end, }) end -- ----------------------------------------------- -- Voir si une variable existe ou non -- et la modifier ou créer -- ----------------------------------------------- function traiter(nom, valeur, choix) if (fibaro:getGlobalValue(nom) == nil) then ajouter(nom, valeur, choix) else -- modifier(nom, valeur, choix) end end ---------------------------------------------------- -- Execution du programme ---------------------------------------------------- for _,v in ipairs(variables) do traiter(v.nom, v.valeur, v.choix) end for _,v in ipairs(variablesASupprimer) do supprimer(v.nom) end Dans un premier temps il va falloir exécuter le script manuellement afin qu'il crée la VG GestionVG cette VG va être utiliser pour crée les variables globale à partir de n'importe quel script Lua Exemple d'utilisation : Création d'une variables globales "Test2" avec la valeur 0 local variables = { {nom = "Test2", valeur = "0"}, } fibaro:setGlobal('GestionVG',json.encode(variables)) Création d'une variables globales prédéfinie "Test1" avec Valeur1 , Valeur2 et Valeur3, vValeur1 sera la valeur par défaut dans cette exemple local variables = { {nom = "Test1", valeur = "Valeur1", choix = {"Valeur2", "Valeur3"}}, } fibaro:setGlobal('GestionVG',json.encode(variables)) Création de plusieurs variable globales prédéfinie ou pas en une seul fois local variables = { {nom = "Test1", valeur = "Valeur1", choix = {"Valeur2", "Valeur3"}}, {nom = "Test2", valeur = "0"}, } fibaro:setGlobal('GestionVG',json.encode(variables)) Création et suppression de variables via la scéne il faut modifier le code suivant, la méthode est la même que les exemples si dessus. Lors de l'exécution de la scene en mode manuel les variables seront créés si elle n'existe pas. elseif (trigger['type'] == 'other') then fibaro:debug('Global variable source = ' .. 'Other source.') variables = { {nom = "GestionVG", valeur = ""}, -- Gestion de VG -- Ex : Variable Globale predefini avec valeur1 pour valeur par default {nom = "Test1", valeur = "Valeur1", choix = {"Valeur2", "Valeur3"}}, -- Ex : Variable Globale qui à pour valeur 0 {nom = "Test2", valeur = "0"}, } variablesASupprimer = { {nom = "Test1"}, {nom = "Test2"}, } Ce code est fonctionnel chez moi, par manque de temps je ne pourrais vous aidez si vous avez des soucis de compréhension sur la création des VG ou leurs suppression
×