Aller au contenu

Classement

  1. Lazer

    Lazer

    Administrateur


    • Points

      8 605

    • Compteur de contenus

      25 970


  2. mprinfo

    mprinfo

    Membres confirmés


    • Points

      3 325

    • Compteur de contenus

      14 382


  3. jojo

    jojo

    Membres confirmés


    • Points

      2 582

    • Compteur de contenus

      14 805


  4. Steven

    Steven

    Membres confirmés


    • Points

      2 219

    • Compteur de contenus

      4 434


Contenu populaire

Affichage du contenu avec la meilleure réputation depuis le 19/12/2013 dans toutes les zones

  1. SONOS Remote V1.0.1 RC pour Fibaro HC2 Télécommande avec retour d’informations pour diffuseur SONOS, prise en charge du TTS (Text-to-Speech) et lecture de stream depuis vos scènes et périphériques virtuels. - Les fonctions : Play, Pause, Stop, Prev, Next, Seek, Volume, Mute, Loudness, Accès direct aux 5 premières radios de “Mes radiosâ€. - Les informations : Zone, Etat du diffuseur, Position, Titre ou Nom de la radio, Artiste, Album, Volume, Loudness, dernière commande émise. Installation : A partir de la version 1.0.0 beta: 1. Télécharger puis importer le vd. 2. Renseigner l’adresse IP du diffuseur SONOS (le coordinateur) dans le vd ainsi que le port 1400 3. Pour utiliser la fonction TTS VoiceRSS il faut une API Key, pour l'enregistrement (gratuit) c'est ici http://www.voicerss.org/registration.aspx 4. Renseigner la variable voiceRssApiKey avec la clé, choisir un niveau de qualité sonore pour la generation avec voiceRssSoundQuality: low, medium, high UserParams = { -- Voice RSS API Key (Free Registration: http://www.voicerss.org/registration.aspx) voiceRssApiKey = "000000000000000000000000000", -- Sound quality: low, medium, high voiceRssSoundQuality = "medium" } 5. Enregistrer les modifications, c'est bon... Utilisation : TTS : Pour utiliser le TTS depuis une scène ou un périphérique virtuel il faut juste exécuter le code LUA suivant avec les bons paramètres. -- 408 is the Virtual Device ID -- 28 is the Process button ID local sid, bid = 408, 28 -- Create TTS params object local params = { -- TTS Message message = "La température extérieure actuelle est de 21,2°C", duration = 'auto', -- Duration: "auto", xx seconds language = "fr-FR", -- Language: fr-FR volume = 10 -- Volume } local _f = fibaro local _x ={root="x_sonos_object",load=function(b)local c=_f:getGlobalValue(b.root)if string.len(c)>0 then local d=json.decode(c)if d and type(d)=="table"then return d else _f:debug("Unable to process data, check variable")end else _f:debug("No data found!")end end,set=function(b,e,d)local f=b:load()if f[e]then for g,h in pairs(d)do f[e][g]=h end else f[e]=d end;_f:setGlobal(b.root,json.encode(f))end,get=function(b,e)local f=b:load()if f and type(f)=="table"then for g,h in pairs(f)do if tostring(g)==tostring(e or"")then return h end end end;return nil end} -- Make a request to the remote to process params object instantly _x:set(tostring(sid), { tts = params }) _f:call(sid, "pressButton", bid) Les options de l'objet params: - message: le message tts - language: la source du flux (http ou local, local est attribué par défaut) - duration: durée du tts. (en secondes ou "auto") - volume: le volume utilisé pour la lecture du tts si différent du volume en cours d'utilisation Le programme en cours de diffusion au moment de la demande reprendra après la diffusion complète du TTS. Reprise de la radio, de la piste à l’endroit précis avant arrêt, reprise de l’état du diffuseur : Volume, Mute, Play, Stop. STREAM: Pour utiliser la lecture de Stream depuis une scène ou un périphérique virtuel il faut exécuter le code LUA suivant avec les bons paramètres. -- 408 is the Virtual Device ID -- 28 is the Process button ID local sid, bid = 408, 28 -- Create STREAM params object local params = { -- stream: the file / uri stream = "//s3.amazonaws.com/smartapp-media/sonos/bell1.mp3", -- source: "local" or "http", "local" is setted by default source = "http", -- duration: play duration in seconds (option) or "auto" duration = 8, -- volume: the volume for playing the stream volume = 10 } local _f = fibaro local _x ={root="x_sonos_object",load=function(b)local c=_f:getGlobalValue(b.root)if string.len(c)>0 then local d=json.decode(c)if d and type(d)=="table"then return d else _f:debug("Unable to process data, check variable")end else _f:debug("No data found!")end end,set=function(b,e,d)local f=b:load()if f[e]then for g,h in pairs(d)do f[e][g]=h end else f[e]=d end;_f:setGlobal(b.root,json.encode(f))end,get=function(b,e)local f=b:load()if f and type(f)=="table"then for g,h in pairs(f)do if tostring(g)==tostring(e or"")then return h end end end;return nil end} -- Make a request to the remote to process params object instantly _x:set(tostring(sid), { stream = params }) _f:call(sid, "pressButton", bid) Les options de l'objet params: - stream: le chemin du flux - source: la source du flux (http ou local, local est attribué par défaut) - duration: durée du stream. (en secondes ou "auto") - volume: le volume utilisé pour la lecture du flux si différent du volume en cours d'utilisation Quelques exemples: Annoncer la température dans une scène : --[[ %% properties %% globals --]] -- 408 is the Virtual Device ID -- 28 is the Process button ID local sid, bid = 811, 28 -- Create TTS params object local ValeurTemp = fibaro:getValue(61, "value") local degre = string.gsub(ValeurTemp, '[,]' , ' degret ') local degre = string.gsub(degre, '[.]' , ' degret ') local degre = string.gsub(degre, '[-]' , ' moins ') local notification = "Il fait " .. degre .. " dans le salon " fibaro:debug(notification) local params = { -- TTS Message message = notification, duration = 'auto', -- Duration: "auto", xx seconds language = "fr-FR", -- Language: fr-FR volume = 23 -- Volume } local _f = fibaro local _x ={root="x_sonos_object",load=function(b)local c=_f:getGlobalValue(b.root)if string.len(c)>0 then local d=json.decode(c)if d and type(d)=="table"then return d else _f:debug("Unable to process data, check variable")end else _f:debug("No data found!")end end,set=function(b,e,d)local f=b:load()if f[e]then for g,h in pairs(d)do f[e][g]=h end else f[e]=d end;_f:setGlobal(b.root,json.encode(f))end,get=function(b,e)local f=b:load()if f and type(f)=="table"then for g,h in pairs(f)do if tostring(g)==tostring(e or"")then return h end end end;return nil end} -- Make a request to the remote to process params object instantly _x:set(tostring(sid), { tts = params }) _f:call(sid, "pressButton", bid) Annoncer la valeur d'une variable : --[[ %% properties %% globals --]] local sid, bid = 813, 28 -- Create TTS params object local couleur = fibaro:getGlobalValue("le nom de ta variable") local notification = ("La couleur de demain sera "..couleur.." Bonne journée") fibaro:debug(notification) local params = { -- TTS Message message = notification, duration = 'auto', -- Duration: "auto", xx seconds language = "fr-FR", -- Language: fr-FR volume = 23 -- Volume } local _f = fibaro local _x ={root="x_sonos_object",load=function(b)local c=_f:getGlobalValue(b.root)if string.len(c)>0 then local d=json.decode(c)if d and type(d)=="table"then return d else _f:debug("Unable to process data, check variable")end else _f:debug("No data found!")end end,set=function(b,e,d)local f=b:load()if f[e]then for g,h in pairs(d)do f[e][g]=h end else f[e]=d end;_f:setGlobal(b.root,json.encode(f))end,get=function(b,e)local f=b:load()if f and type(f)=="table"then for g,h in pairs(f)do if tostring(g)==tostring(e or"")then return h end end end;return nil end} -- Make a request to the remote to process params object instantly _x:set(tostring(sid), { tts = params }) _f:call(sid, "pressButton", bid) Annoncer la date du jour, la température extérieure et la météo : -- 239 is the Virtual Device ID -- 28 is the Process button ID local sid, bid = 239, 28 local cond = fibaro:getValue(3, "WeatherConditionConverted"); local tempext = fibaro:getValue(33, "value"); -- température extérieure fibaro:debug ("Température extérieure : "..tempext) local degre = string.gsub(tempext, '[,]' , ' degré ') local degre = string.gsub(degre, '[.]' , ' degré ') local degre = string.gsub(degre, '[-]' , ' moins ') local currentDate = os.date("*t") local jourL = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"} local jour = jourL[currentDate.wday] fibaro:debug ("Jour : "..jour) local moisL = {"janvier", "février", "mars", "avril", "mai", "juin", "juillet", "aout", "septembre", "octobre", "novembre", "décembre"} local mois = moisL[currentDate.month] fibaro:debug ("Mois : "..mois) local condfr =""; if( cond == "clear" ) then condfr = "clair"; end if( cond == "cloudy" ) then condfr = "nuageux"; end if( cond == "rain" ) then condfr = "pluvieux"; end if( cond == "snow" ) then condfr = "neigeux"; end if( cond == "storm" ) then condfr = "tempete"; end if( cond == "fog" ) then condfr = "brouillard"; end fibaro:debug ("Conditions météorologiques : "..condfr) fibaro:debug ("Création du TTS") -- Create TTS params object local params = { -- TTS Message message = "Bonjour a vous. Nous sommes le "..jour .." "..currentDate.day .." "..mois .. ". Il est ".. currentDate.hour .." heure et ".. currentDate.min .." minutes. ".. "Le thermomètre extérieur est a "..degre .. ", et le temps est "..condfr ..". ", duration = 'auto', -- Duration: "auto", xx seconds language = "fr-FR", -- Language: fr-FR volume = 40 -- Volume } local _f = fibaro local _x ={root="x_sonos_object",load=function(b)local c=_f:getGlobalValue(b.root)if string.len(c)>0 then local d=json.decode(c)if d and type(d)=="table"then return d else _f:debug("Unable to process data, check variable")end else _f:debug("No data found!")end end,set=function(b,e,d)local f=b:load()if f[e]then for g,h in pairs(d)do f[e][g]=h end else f[e]=d end;_f:setGlobal(b.root,json.encode(f))end,get=function(b,e)local f=b:load()if f and type(f)=="table"then for g,h in pairs(f)do if tostring(g)==tostring(e or"")then return h end end end;return nil end} -- Make a request to the remote to process params object instantly _x:set(tostring(sid), { tts = params }) _f:call(sid, "pressButton", bid) Notes de versions: Version 1.0.1 Rc - Correction: régression introduite avec la V4.080 impactant la création automatique de la variable globale Version 1.0.0 beta ATTENTION: Le passage d'une version antérieure à la v1.0.0 pour la v1.0.0 ou supérieure nécessite la réécriture des commandes TTS pour fonctionner avec le nouveau module. L'ancien module reste cependant fonctionnel et peut cohabiter logiquement avec la nouvelle version. En cas de passage définitif en V1.0.0 ou supérieure toutes les variables globales déclarées précédemment en V0.0.7 ou V0.0.8 peuvent être supprimées. - Amélioration : Configuration automatique, pas de déclaration de variables globales - Amélioration : Support natif de multiples instances du périphérique virtuel - Amélioration : Faible latence lors du déclenchement des commandes - Amélioration : Révision et amélioration du code / Refactoring - Ajout: Le TTS utilise le service Voice RSS (avec une API Key (enregistrement gratuit)) ou ResponsiveVoice API. Options: durée, volume, auto resume - Ajout: Lancement de Stream (http / local) depuis scéne / vd. Options: durée, volume, auto resume Version 0.0.8 - Amélioration : La lecture d'un TTS en mode Auto Stop est maintenant stable - Amélioration : La lecture d'un TTS avec une durée définie est maintenant stable - L'image principale du vd réapparaît maintenant automatiquement après l'appui sur un bouton (Labomatik & JM13, merci ) - Correction d'un bug avec l'analyse xml de BrowseDirectChildren - Attention: Pour utiliser les raccourcis "boutons radios favorites" vous devez ajouter au moins deux radios depuis l'application SONOS "Desktop/IOS etc..." Version 0.0.7 - Amélioration notable de la stabilité, le vd est plus réactif. - Patch line 892: attempt to index local 'value' (a function value) - Patch line 1256: attempt to concatenate a nil value - Préparation au support de nouvelles fonctionnalités Fichier Zip : SONOS_Remote_v1.0.1.vfib SONOS_Remote_v1.0.0.vfib
    49 points
  2. Version 1.3.2.0 (03-05-2017) - Multi (Fr/En) Compatible : Windows Vista, Win7 32/64 bits, Windows 8.xx Mac OSX 10.8.x avec Virtual machine "Parallels Desktop" et Windows 7 64 bits. Mac OSX 10.9.x avec XP virtual machine / VirtualBox. Compatible HC2 V3.x / HC2 V4.x / HCLite V4.x Cette application a été réalisée dans le but d’aider la communauté gravitant autour du système Home Center 2 Fibaro, de l’installateur à l’utilisateur final en passant par le développeur souhaitant faire évoluer l’écosystème du HC2. Le HC2 Toolkit est basé pour une grande partie sur le SDK .Net qui est mon premier projet en rapport avec l’écosystème Fibaro. Dès l’origine l’application a été prévue pour être multilingue et se limite pour l’instant à l’anglais qui est la langue première du projet afin d’être accessible au plus grand nombre, au français c’est un minimum et je l’espère bientôt au Polonais. Grâce au Toolkit, il est possible de mieux comprendre comment fonctionne l’API du HC2 et d’obtenir rapidement des informations difficilement accessibles depuis l’interface web sur les périphériques enregistrés, les scènes, les périphériques virtuels, les utilisateurs etc. Des possibilités de sauvegardes avancées sont aussi disponibles et seront complétées au fil des mises à jour. Il est déjà possible d’exporter l’intégralité des scènes d’un seul click même les scènes « BLOC », d’exporter tous les codes LUA à la demande : scènes, périphériques virtuels. L’import et l’export des périphériques virtuels sont aussi supportés. Une exportation spécialement développée à des fins d’analyse et de comparaison des périphériques est disponible. La plupart des données brutes de l’API peuvent être chargées et enregistrées soit au format JSON soit au format XML pour l’étude et le développement. Certaines actions sont implantées comme lancer une scène, activer ou désactiver un « binary switch », le « ping » à distance ou en local du HC2, la vérification de l’accessibilité du serveur du HC2, la découverte automatique sur le réseau. Le Toolkit possède un éditeur LUA intégré ou tous les espaces de nom Fibaro sont documentés et les méthodes accessibles en écrivant le code (proposition de code automatique). Un système de « snippets » est aussi disponible et propose des extraits de code (aide à la programmation), de simples instructions conditionnelles, boucles à des fonctions avancées. La liste des fonctionnalités est non exhaustive et en constante évolution, la road map est déjà bien remplie ! Je compléterais cette note lorsque j’aurais un peu plus de temps devant moi. Version 1.3.2.0 - HCToolkit_1.3.2.0.zip - Ajout du support du Polonais (Un grand Merci à REMS du blog Domotique-Home.fr) - Ajout de l'accès aux manuels et guides par clic droit sur un périphérique (Motion Sensor, Door/Window Sensor, Smoke Sensor, Wall Plug, d'autres modules à venir...) - Correction de bugs et améliorations - Correction : Types manquants - Correction : Traductions - Amélioration : Mise à jour des dépendances Version 1.3.1.6 beta - Nouveau: Le code LUA (scènes) peut-être édité puis poussé vers le contrôleur (Publish/Reload) - Nouveau: Création de pièces en lot (plusieurs en 1 X avec un même nom prédéfini), Edition (nom, section), Suppression, Exportation, Importation - Nouveau: Création de scènes en lot, Edition (nom, pièce, section, etc.), Suppression, Exportation, Importation - Nouveau: Création de section en lot, Edition (nom), Suppression, Exportation, Importation - Amélioration : Périphérique: Edition du nom, de la section, de la pièce, Suppression - Amélioration : Périphériques virtuels: Edition (nom, pièce), Exportation, Importation - Amélioration : Amélioration significative du traitement des données - Correction : Bogue mineur de l'installeur - Correction : Traductions - Correction : Types manquants - Correction : Bogues mineurs Version 1.2.0.3 - Correctif: Téléchargement des icônes des appareils (devices) : l'option "all" ne permet pas le téléchargement et il faut sélectionner à la main - Correctif: Au lancement on obtient l'interface en anglais bien que "French" soit présélectionné - On re-sélectionne French et c'est bon... jusqu'au redémarrage suivant - Correctif: Problème cosmétique dans la fenêtre "Paramètres de l'application" au niveau du "temps en secondes" Version 1.2.0.1 Ajout : Il est maintenant possible de « filtrer » l’enregistrement des icônes par type et / ou basetype depuis le « Menu Données » / « Appareils » / « Télécharger Toutes les Icônes » Amélioration : Nouvelle convention de nommage pour l’enregistrement des icônes. Exemple : 18-IconID[1012]-DeviceID[31]-Pioneer VSX-2021.png Amélioration : Affiche des noms de pièces dans la vue « Appareils » Correction : Mauvais chemin utilisé par l’application pour la commande «Périphériques virtuels » / « Sauvegarder tous les périphériques » Correction : Problème avec l’aperçu d’impression dans l’éditeur LUA Correction : Affichage du modèle de paramètres (régression HC2 V4.05X et >) Correction : Affichage des icônes « Appareils » et « Pièces » (régression HC2 V4.063 et >) Amélioration : Mise à jour des dépendances (librairies utilisées par le projet) Attention : Le Frameworks .NET 4.5.2 de Microsoft doit être installé (https://www.microsoft.com/fr-FR/download/details.aspx?id=42642). Notez que .NET Framework 4.5 n'est pas pris en charge sur Windows XP. Version 1.1.0.6 - Ajout: Nouvelle boîte de dialogue pour afficher les associations d'un périphérique. - Ajout: Nouvelle boîte de dialogue pour afficher les paramètres d'un périphérique. - Ajout: Onglet "Plugins" - Ajout: Affichage de la propriété "Configured" dans le tableau des périphériques. - Amélioration: Info-bulles pour le type et le basetype interne pour les périphériques et les plugins. - Amélioration: Affichage d'informations sur les interfaces utilisées dans les propriétés et les actions. - Amélioration: La boîte de dialogue "Template (Modèle de périphériques)" à été retravaillé. - Correction: Les descriptions dans la boîte de dialogue "Template (Modèle de périphériques)" n'utilisait la langue sélectionnée dans l'interface - Correction: Interfaces manquantes. - Correction: Propriété "Configured" toujours vide dans le rapport de configuration. - Correction: Propriétés manquantes (batteryLevel, configured, parentID, nodeID) suite à la version V1.1.0.0 - Correction: Traductions - Correction: Bogues mineurs Version 1.1.0.0 Beta - Support de la V4 du HC2 (reste compatible avec l'ancienne V3) - Amélioration: Détection automatique de la version de l'API. - Amélioration: Performance de la communication réseau. - Amélioration: Nouveau mécanisme d'exportation de données, plus rapide et plus lisible. - Amélioration: Sauvegardez du "crashdump" dans le dossier "documents utilisateur" pour éviter l' exception "UnauthorizedAccess". - Nouveau: Exportation des variables globales au format XML, une par une ou toutes à la fois dans le menu "Variables globales". - Nouveau: Enregistrer toutes les icônes, menu "Pièces", "Scènes", "périphériques". - Nouveau: Ajout de la commande 'UpdateMeshNetwork' dans le menu périphérique. Peut aider les utilisateurs du HClite - Nouveau: Affichage du nombre de plugins / NÅ“ud de plugins - Nouveau: indentation automatique du code dans l'Éditeur LUA. - Nouveau: option Afficher / Masquer les numéros de lignes dans l'éditeur LUA. - Nouveau: Possibilité de changer la taille de la police dans l'éditeur LUA. - Nouveau: Possibilité de changer la famille de police dans l'éditeur LUA. - Correction: Traductions manquantes. - Correction: Bogues mineurs. Un fil sur le Toolkit est consultable aussi sur le forum officiel ici http://goo.gl/pKA35K
    33 points
  3. Plugin – Virtual Sensor L’objectif de ce plugin est de transformer n’importe quelle valeur (donnée) pouvant être récupérée via http en une sonde « virtuelle » « typée » préalablement déclarée et ainsi en permettre l’utilisation dans les services et panneaux compatibles du HC2 (et HCLite) en V4.xx. La sonde est accessible dans les périphériques virtuels et dans les scènes (Mode « Blocs» et LUA) En exemple, une sonde de température virtuelle peut être utilisée comme sonde principale d’une pièce, les valeurs sont disponibles dans le panneau température pour le suivi et les graphiques. La sonde est exposée via l’api mais aussi utilisable comme « déclencheur » dans une scène au même titre qu’un périphérique z-wave physique. L’origine des données d’une sonde peut être variée : DIY, API d’une Passerelle domotique, service web, variable globale (via l’api) etc. Les types de sondes : Température Humidité Luminosité Energie Fumée Binaire Niveau (à venir) Les évolutions prévues : Support de XPath afin d’être un maximum ouvert et Plug and Play Moteur de type "JSONPath" pour expression sur les sources JSON (cf. v0.3.4) Support de configurations spéciales : sonde température + Humidité, sonde énergie 2 et 3 canaux etc Support état binaire Gestion offset au niveau du « master » (cf. v0.3.4) Conversion de donnée Autres protocoles Bien évidemment toutes vos remarques et idées d’évolution sont les bienvenues. Un plugin Virtual Switch est aussi à l’étude si le concept et validé… http://www.domotique-fibaro.fr/index.php/topic/2883-plugin-virtual-switch/ Notes de mise à jour et versions disponibles: Version bêta 0.3.2 - 01.10.2014 0.3.2.zip (Des bugs de la V4.017 Bêta limite le plugin, des tickets sont ouverts) - Pour validation du cencept Version bêta 0.3.4 - 03.10.2014 0.3.4.zip - Nouveau: Support du json en source de donnée (Cf. Configuration "Source Format" et "Source Path Expression") - Nouveau: Moteur d'expressions JSON avancé afin de localiser (résolution de chemin), ajuster (opérateurs +,-,x,/ disponibles) et fonctions mathématiques applicables sur le résultat. Exemple de path: '/Results/2/state {H:%s*([%+%-]?%d*%.?%d*)} (+0.25)' permet d'utiliser la valeur "humidité" de la sonde N°2 avec un ajustement de +0.25 pour le retour api FHEM suivant : { "ResultSet": "devices#EnOcean", "Results": [{ "name": "EnO_sensor_01F", "state": "T: 22.6 H: 62 SP: 0 SW: 0" }, { "name": "EnO_sensor_02A", "state": "T: 21.0 H: 63 SP: 0 SW: 0" }], "totalResultsReturned": 2 } Version bêta 0.4.2 - 05.10.2014 0.4.2.zip - Amélioration: ajout de ma librairie lua "async" (gestion asynchrone) pour de meilleurs résultats et un code plus robuste. - Nouveau: Message d'erreur dans la vue du module principal pour le débogage. - Nouveau: Support des accès avec demande d' authentification par le serveur. Exemple: L'API Fibaro est maintenant disponible (périphériques virtuels, variables etc), mais toute API avec une authentification HTTP Basic. - Nouveau: Préparation du support des capteurs combinés (exemple: température + humidité, température + humidité + lumière, etc) - Mise à jour des informations de configuration & remise en forme du code, correction de bugs mineurs - Correction d'un bug possible avec l'authentification http (v0.4.1) Version bêta 0.5.2c - 15.10.2014 0.5.2c.zip - Nouveau: Ajout du support pour les sources HTML (Fonctionnement identique aux expressions json) Ex: {<span id="Result">(%d+%.?%d*)</span>} - Nouveau: Support de combinaisons (prédéfinies) de sondes. Ex: Température x2 (S1, S2), Température x3 (S1, S2, S3), Température (S1) + Humidité (S2), Température (S1) + Humidité (S2) + Luminosité (S3) - Nouveau: Chemin pour remonté du niveau de batterie (Ex: Koubachi, Fibaro Api) - Nouveau: Ajout des sondes: Bruit, Fumée, CO2, Securité (Motion, Door, Window, Smoke, Flood) (type binaire, 0 ou 1) - Nouveau: Paramétrage des unités, métrique ou impérial. Préparation du support pour la conversion entre types - Correction d'un bug possible avec le moteur d'expression json provoquant le blocage du plugin - Label pour horodater le rafraichissement dans le module principale et "loop counter" affiché en log Version bêta 0.5.3 - 16.10.2014 0.5.3.zip - Nouveau: Ajout de la sonde mesure de puissance "Power" (info disponible dans le panneau energie) - Correction d'un bug pouvant bloquer la remonté pour S2 et S3 - Amélioration: Meilleur gestion des erreurs Version bêta 0.5.4 - 21.10.2014 0.5.4d.zip ATTENTION: Des bugs de la V4.021 Bêta limite le plugin, des tickets sont ouverts. Les limitations touchent la visibilité du plugin, il est conseillé d'éviter de masquer le plugin d'une manière ou d'une autre. Le Plugin peut bloquer après un reboot du HC2 dans ce cas l'unique solution est la suppression du plugin puis d'ajouter une nouvelle instance. - Nouveau: Ajout des sondes: Rain Gauge/Level, Co2, Wind Speed - Nouveau: Ajout d'un bouton "Forcer le redémarrage" dans le panneau avancé afin de faire un reboot du plugin - Nouveau: Pour le type "Security" ajout du support des valeurs "on"/"off", "unsafe"/"safe", "1"/"0", 1/0, "true"/"false", true/false, "breached"|"open"/"closed" (utiliser le pattern suivant pour le json FHEM et une sonde binaire: /Results/1/state {(.*)}) - Fix: Mise à jour du log (Fix V4.018beta par un hack)
    32 points
  4. Gestionnaire d'Evénements Automatique (GEA) ancienement : Wtdiso What To Do If Still Open Edit : version 5.00 modifiée le 8 décembre 2014 But : Ce script a pour but de contrôler, à intervalle régulier, l'état de votre environnement pendant une durée déterminée afin de vous avertir d'éventuel soucis et si nécessaire d'effectuer automatiquement certaines actions. Depuis la version 3.00 vous avez aussi la possibilité d'utiliser ce script en exploitant les déclencheurs %%properties end %%globals. Exemple : Etre informé si la porte du garage est restée ouverte plus de 10 minutes Recevoir une notification et allumer le radiateur s'il fait trop froid depuis 30 minutes Eteindre automatiquement la lumière des WC si cette dernière est allumée plus de 5 minutes Eteindre le frigo et recevoir une notification si ce dernier consomme trop d'électricité ou pas assez Installation : Nouveauté de la version 3.80 Depuis le panneau des variables, créer une variable (simple) appelée "GEA_Tasks" (son contenu n'a pas d'importance) Créer un scénario en mode LUA Insérer le script ci-joint (GEA.lua)) Adapter les dernières lignes à vos besoins (en dessous de la ligne "A VOUS DE JOUER") Paramétrage : Définir l'intervalle de contrôle en secondes GEA.checkEvery = <nb secondes> (30 par défaut) Exemple : GEA.checkEvery = 30 Indique la liste des portables par défaut devant recevoir une notification {70, 71} GEA.portables = {<id portable> [, <id portable>][, ...]} Exemple : GEA.portables = {70, 71} Indique si on utilise un firmware égale ou supérieur à la version 4.017 GEA.isVersionFour = true --- On est en version 4.017 Beta ou suppérieur Indique la langue utilisée (Français : FR ou Anglais : EN) GEA.language = "FR" Bascule en mode de débogage pour obtenir plus de traces GEA.debug = true | false (false par défaut) Exemple : GEA.debug = true Permet un débugage fort de GEA, chque erreur provoque l'arrêt de GEA si cette option est à false GEA.catchError = true | false (true par défaut) Exemple : GEA.catchError = false -- va afficher les erreurs et stopper GEA Supsendre le script à la volée GEA.getGlobalForActivation = {<variable globale>, <valeur>} Exemple : GEA.getGlobalForActivation = {"SuspendreGEA", "non"} Tant que la variable globale "SuspendreGEA" sera à "non" le script continuera son action. Syntaxe : Simple condition : GEA.add(<condition>, <durée en secondes|-1>, <message a notifier>[, <options>]) Exemple : GEA.add(100, 10*60, "Lampe allumée de puis plus de 10mn, on l'éteint", {{"turnOff"}}) Condition multiple : GEA.add( { <condition_principale>[, <condition2>[, ...]] } , <durée en secondes|-1>, <message a notifier>[, <options>]) Exemple : GEA.add( { 100, {"Global", "JourNuit", "Nuit"} } }, 10*60, "Lampe allumée de puis plus de 10mn ET la variable global JourNuit indique Nuit alors on éteint la lampe", {{"turnOff"}}) Conditions autorisées : <Id module> -- Identifiant du module * {"Global", <nom variable>, <valeur>} -- Si la variable global X contient la valeur Y {"Weather", <valeur>} -- Si la météo indique la valeur {"Sensor+", <id module>, <valeur max>} -- Si la valeur du sensor X est supérieur à Y {"Sensor-", <id module>, <valeur max>} -- Si la valeur du sensor X est inférieur à Y {"Sensor", <id module>, <valeur max>} -- Si la valeur du sensor X est égale à Y {"Sensor!", <id module>, <valeur max>} -- Si la valeur du sensor X est différente à Y {"Value+", <id module>, <valeur max>} -- Si la valeur du module X est supérieur à X {"Value-", <id module>, <valeur max>} -- Si la valeur du module X est inférieur à X {"Value", <id module>, <valeur max>} -- Si la valeur du module X est égale à X {"Value!", <id module>, <valeur max>} -- Si la valeur du module X est différente à X {"Global+", <nom variable>, <valeur>} -- Si la valeur de la variable globale X est supérieur à X {"Global-", <nom variable>, <valeur>} -- Si la valeur de la variable globale X est inférieur à X {"Global", <nom variable>, <valeur>} -- Si la valeur de la variable globale X est égale à X {"Global!", <nom variable>, <valeur>} -- Si la valeur de la variable globale X est différente à X {"Slider-", <id_vd>, <nom slider>, <valeur>} -- Si la valeur du slider est inférieur à X {"Slider+", <id_vd>, <nom slider>, <valeur>} -- Si la valeur du slider est supérieur à X {"Slider", <id_vd>, <nom slider>, <valeur>} -- Si la valeur du slider est égale à X {"Slider!", <id_vd>, <nom slider>, <valeur>} -- Si la valeur du slider est différente à X {"Label", <id_vd>, <nom label>, <contenu>} -- Si la valeur du label est égale à X {"Label!", <id_vd>, <nom label>, <contenu>} -- Si la valeur du label est différente à X {"Property", <id_module>, <nom propriété>, <valeur>} -- Si la valeur de la propriété du module est égale à la valeur indiquée {"Property!", <id_module>, <nom propriété>, <valeur>} -- Si la valeur de la propriété du module est différente à la valeur indiquée {"Battery", <id module>, <valeur max>} -- Si l'état de la pile du module X est inférieur ou égale à X {"Batteries", <valeur max>} -- Si l'état de la pile des 350 premiers ont une pile inférieur ou égale à X {"Dead", <id module>} -- Si le module X ne répond plus {"Group", <numéro du groupe>} -- Si le groupe X est valable {"SceneActivation", <id module>, <id scene>} -- Si la scene X du module Y est le déclencheur du script * Si seul l'Identifiant du module le script considère qu'il doit vérifier si le module est activé. Durée : <durée en secondes> -- Nombre de secondes pendant lequel la condition doit être respectée Message : <message à notifier> -- Le message devant être notifier ** ** Si le message est vide "" aucune notification ne sera envoyée Un message peut contenir des variables qui seront remplacée à la volée. Ces variables sont #time#, #duration#, #value#, #date#, #seconds#, #name#, #runs#, #rooms# soit respectivement heure, durée, dernière valeur, date, secondes, nom du périphérique, nombre d'exécution et pièce Exemple "Le consommation #valeur#W relevée à #time#, le #date# sur le périphérique #name# est trop élevée" Depuis la version 4.20, il est possible de connaitre les valeurs des autres périphériques impliqué. GEA.add( { condition1, condition2, condition3 }, <durée>, "#value[1]# #value[2]# #value[3]#"). Les variables indexée sont : #value[index]#, #name[index]# et #room[index]#. #name#, #value# et #room# indique toujours la condition principale. Options : {<option>[,<option>][,...]} -- Il s'agit d'un groupe d'options {{},{},{}} Option : {"turnOff"[,<id module>]} -- Eteint le périphérique concenné {"turnOff"} ou {"turnOff",21} {"turnOn"[,<id module>]} -- Allume le périphérique concerné {"turnOn"} ou {"turnOn",21} {"Inverse"} -- On inverse la condition si elle était vrai, le script retourn faux {"Repeat"} -- On répete les avertissements tant que le périphérique n'a pas changé d'état. {"Portable", <id>} -- Le message associé à ce périphérique sera envoyé à ce portable au lieu de ceux par défaut {"Portable", 70} {"Scenario", <id>} -- Lance un scénario selon son identifiant {"Scenario", 2} {"Value", <value>} -- Met la valeur 20 dans le périphérique - dimmer une lampe. {"Value", 20} {"Value", <id>, <value>} -- Met la valeur 20 dans le périphérique <id> - dimmer une lampe. {"Value", 19, 20} {"Open"} -- Ouvre le volet {"Open", <value>} -- Ouvre le volet de X % {"Open", 20} {"Open", <id>, <value>} -- Ouvre le volet (id) de X% {"Open", 61, 20} {"Close"} -- Ferme le volet {"Close", <value>} -- Ferme le volet de X % {"Close", 20} {"Close", <id>, <value>} -- Ferme le volet (id) de X% {"Close", 61, 20} {"Global", <variable>, <valeur>} -- Met la valeur "Oui" dans la variable globale "Maison" {"Global", "Maison", "Oui"} {"Global", <variable>, "inc+"} -- Incrémente de 1 automatiquement la variable globale {"Global", <variable>, "dec-"} -- Decrémente de 1 automatiquement la variable globale {"Time", <from>, <to>} -- Ne vérifie l'évenement QUE si nous sommes dans la/les tranches horaires {"Time", "22:00", "06:00"} {"Dates", <from>, <to>} -- Ne vérifie l'évenement QUE si nous sommes dans la/les périodes de dates spécifiée {"Dates", "01/01[/2014]", "31/01[/2014]"} {"Armed"} -- Ne vérifie QUE si le module est armé {"Disarmed"} -- Ne vérifie QUE si le module est désarmé {"setArmed", <id>} -- arme le module <id> {"setDisarmed", <id>} -- desarme le module <id> {"RestartTask", <id_tache>} -- Redémarre une tâche selon son <id> {"StopTask", <id_tache>} -- Stoppe une tâche selon son <id> {"NotStarted"} -- Empêche la tache de démarrer automatiquement (voir RestartTask) {"MaxTime", <number>} -- Stoppe une tâche après un certain nombre d'exécution {"DST"} -- Ne vérifie l'évenement QUE si nous sommes en mode "Saving time" soit heure d'été {"NOTDST"} -- Ne vérifie l'évenement QUE si nous sommes en mode heure d'hiver {"VirtualDevice", <id,_module>, <no_bouton>} -- Pr ess le bouton du module virtuel {"VirtualDevice", 2, 1} {"Label", <id_module>, <name>, <message>} -- Attribue le message au label du module virtuel {"Label", 21, "ui.Label1.value", "activé"} {"WakeUp", <id,_module>} -- Essai de réveillé le module {"WakeUp", 54} {"Email", <id_user>,} -- Envoi le message par email à l'utilisateur {"Email", 2} {"Email", <id_user>,<sujet>} -- Envoi le message par email à l'utilisateur {"Email", 2, "Sujet du message"} {"Group", <numero>} -- Attribut cet événement au groupe {"Group", 2} {"Slider", <id_module>, <id_slider>, <valeur>} -- Met la valeur dans le slider du module {"Slider", 19, 1, 21.3} {"Program", <id_module>, <no>} -- Exécute le programme du module RGB {"Program", 19, 5} {"RGB", <id_module>, <col1>, <col2>, <col3>, <col4>} -- Modifie la couleur RGB du module {"RGB", 19, 100, 100, 0, 100} {"Days", <jours>} -- Ne vérifie l'évenement que si le jours d'exécution est dans le/les jours indiqué (jeurs peut prendre les valeurs suivantes "Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday, All, Weekday, Weekend") {"CurrentIcon", <id_module>, <no_icon>} -- Modifie l'icone d'un module virtuel {"CopyGlobal", <var_source>, <var_dest>} -- Copy la valeur de la variable global <var_source> dans la variable global <var_dest> {"If", {[{<condition}[,{<condition}[,...]]}} -- L'événement sera autorisé uniquement si toutes les conditions sont valides Demande de support / FAQ : un topic a été dédié pour répondre à toutes les questions sur le projet : Support GEA n'hésitez pas à venir nous y retrouver. Explication : Vous précisez quel module le scénario doit contrôler (GEA.add(28, 10*60, "La porte du garage est ouverte depuis plus de 10 minutes")). Toutes les 30 secondes, le scénario va vérifier l'état de la porte 28. Si cette porte est restée ouverte plus de 10 minutes, il vous enverra un message push. Contrairement à d'autre scénario, celui-ci contrôle l'état d'une porte/lumière/volet toutes les X secondes. Dans l'exemple de la porte de garage, si cet dernière a été fermée et ré-ouverte pendant les dernières 10 minutes, le compteur sera redémarré. Ce scénario permet de cumuler plusieurs avertissements, il vous suffit donc d'un seul scénario pour contrôler tout votre environnement :[/indent] GEA.add(28, 10*60, "La porte du garage est ouverte depuis plus de 10 minutes", {{"Repeat"}) GEA.add(69, 5*60, "La lumière du local technique est allumée depuis plus de 5 minutes") GEA.add({"Global", "Capsule", "100"}, 1*60, "Il faut commander du café, plus de capsule") GEA.add({"Sensor+", 19, 450}, 5*60, "Consommation du frigo excessive (#value#W), on l'éteint", {{"turnOff"}}) Voici un exemple minimaliste de scénario -- ================================================== -- A VOUS DE JOUER -- ================================================== GEA.checkEvery = 30 -- On vérifie toutes les X secondes GEA.portables = {70} -- Liste des portables devant recevoir une notification {70, 71} GEA.add(28, 10*60, "La porte du garage est ouverte depuis plus de 10 minutes", {{"Repeat"}}) GEA.add(69, 5*60, "", {{"turnOff"}}) -- Eteindre automatiquement le local technique -- Si un enfant allume sa lampe le soir, après 10mn le système la dim à 20%. Après 20mn le système éteint la lampe. GEA.add(66, 10*60, "Chambre Kendra allumée 20%", {{"Time", "22:00", "06:00"}, {"Value", 20}}) GEA.add(66, 20*60, "Chambre Kendra extinction", {{"Time", "22:00", "06:00"}, {"turnOff"}}) -- Variable global GEA.add({"Sensor+", 80, 100}, 30, "Consommation cafetière, café en cours", {{"Global", "Capsule", "inc+"}}) GEA.add({"Global", "Capsule", "100"}, 1*60, "Recommander du café") -- Sensor et valeur GEA.add({"Sensor+", 19, 100}, 1*60, "Consommation excessive de la WMC #value#") GEA.add({"Value-", 8, 18}, 30*60, "Il fait froid au salon #value# à #time#") -- NE PAS OUBLIER - Démarrage du scénario GEA.run() Special Thanks to : Fredric, Diuck, Domodial, moicphil, lolomail, byackee, JossAlf, Did, Hansolo, Shyrka973, fredo, jompa98 et tous les autres gars de Domotique-fibaro.fr Quelques exemples : GEA.add(28, 10*60, "La porte du garage est ouverte depuis plus de 10 minutes", {{"Repeat"}}) -- On vérifie toutes les 10mn si la porte du garage est ouverte et on envoi un message push. On répète l'opération tant que la porte n'est pas fermée. GEA.add(28, 10*60, "La porte du garage est ouverte depuis plus de 10 minutes", {{"Repeat"}, {"Time", "22:00", "06:00"}}) -- Idem de précédent mais on vérifie uniquement entre 22:00 et 06:00 GEA.add(28, 10*60, "La porte du garage est ouverte depuis plus de 10 minutes", {{"Repeat"}, {"Time", "22:00", "06:00"}, {"Time", "12:00", "13:00"}}) -- Idem de précédent mais on vérifie entre 22:00 - 06:00 et 12:00 - 13:00 GEA.add(28, 10*60, "La porte du garage est ouverte depuis plus de 10 minutes", {{"Scenario", 1}, {"Time", "22:00", "06:00"}, {"Time", "12:00", "13:00"}}) -- Si la porte du garage est ouverte plus de 10mn entre 22:00 - 06:00 ou 12:00 - 13:00, on lance le scénario 1 GEA.add(69, 5*60, "", {{"turnOff"}}) -- On éteint la lumière des toilettes automatiquement après 5 minutes GEA.add(69, 5*60, "", {{"turnOff"}, {"Global", "WC", "Allumé"}, {"Time", "22:00", "06:00"}}) -- On éteint la lumière des toilettes automatiquement après 5 minutes si ils ont été allumé entre 22:00 et 06:00 et on met la variable global "WC" à "Allumé" GEA.add(19, 5*60, "Lumière extérieur est éteinte", {{"Inverse"}, {"Time", "Sunset", "Sunrise"}, {"Portable", 71}}) -- Si la lumière extérieur est éteinte (inverse) depuis plus de 5minutes entre le couché du soleil et le levé on envoi un message push au portable ayant l'ID 71 au lieu de celui par defaut. GEA.add(69, 5*60, "", {{"Global", "Karotz", "WC occuper"}, {"VirtualDevice", 20, 1}}) -- Si la lumière est allumée plus de 5mn, on met la variable "Karotz" à "WC occuper" et on appuie sur le bouton (id : 1) du module virtuel (id : 20) GEA.add(69, 5*60, "", {{"Days", "Weekend, Monday"}}) -- On vérifie si la lumière est allumée plus de 5mn, uniquement les Samedis, Dimanches et Lundi -- On dimme la lampe à 20% si elle est allumée plus de 10mn entre 22:00 et 06:00 puis après 20mn on l'éteint GEA.add(31, 10*60, "", {"Time", "22:00", "06:00"}, {"Value", 20}}) GEA.add(31, 20*60, "", {"Time", "22:00", "06:00"}, {"turnOff"}}) -- Variable globale -- si la variable "Capsule" contient "100" depuis plus d'une minute GEA.add({"Global", "Capsule", "100"}, 1*60, "Commander du café, plus de capsule") -- Batterie -- parcours les 350 premiers modules à la recherche de pile inférieur ou égal à 40% GEA.add({"Batteries", 40}, 24*60"60, "", {{"Repeat"}}) -- Sensors -- Si le frigo comsomme trop depuis 5 minutes (plus de 450W), on l'arrête GEA.add({"Sensor+", 19, 450}, 5*60, "Consommation excessive #value# > 450W", {{"turnOff"}}) -- Si le frigo ne comsomme pas assez depuis 5 minutes (moins de 3W), on averti GEA.add({"Sensor-", 19, 3}, 5*60, "Consommation insuffisante #value#< 3W", {{"Repeat"}}) -- Value GEA.add({"Value-", 8, 20}, 1*60, "Il fait froid au salon #value# à #time#") -- moins de 20 GEA.add({"Value+", 8, 22}, 1*60, "Il fait trop chaud #value# au salon depuis #duration#") -- plus de 22 -- RGB si la consommation du frigo est trop élevée (> 450W) GEA.add({"Sensor+", 19, 450}, 1*60, "Le périphérique #name# consomme trop (#value#)", {{"RGB", 27, 100, 0, 100, 100}}) -- Slider - attribue 100 à la valeur d'un slider (1) du module virtuel (27) si la lampe (19) est allumée depuis 1 minutes GEA.add(19, 1*60, "", {{"Slider", 27, 1, 100}}) -- Programme - lance le programme 5 du module 23 si la lampe (19) est allumée depuis 1 minutes -- puis éteint la lampe 19 GEA.add(19, 1*60, "", {{"Program", 23, 5}, {"turnOff"}}) -- Dead GEA.add({"Dead", 27}, 1*60, "Le périphérique #name# ne répond plus", {{"WakeUp", 27}}) -- Détecteur (id 200) avec allumage de lampe (id 100) -- Chaque détection redémarre le time de la lampe local myTask = GEA.add(100, 5*60, "Extinction de la lampe après 5mn", {{"turnOff"}}) GEA.add(200, -1, "", {{"RestartTask", myTask}}) -- Groupes GEA.add({"Global", "absent", "oui"}, 10*60, "", {{"Group", 2}}) GEA.add(19, 10*60, "", {{"Group", 2}}) GEA.add({"Group", 2}, 5*60, "Absent mais la lampe (19) est encore allumée, extinction", {{"turnOff", 19}}) -- Si la variable global "absent" est sur "oui" depuis 10 minutes -- Si la lampe 19 est allumée depuis 10 minutes -- Si ces éléments sont vrai pendant plus de 5 minutes alors j'envoi un push et j'éteint la lampe 19. Déclenchement instantané La version 3+ permet de déclenché ce script en instantané Exemple allumé la lampe (65) à l'ouverture de la porte (18) et l'éteindre à la fermeture --[[ %% autostart %% properties 18 value %% globals Capsule --]] ... GEA.add(18, -1, "", {{"turnOn",65}}) GEA.add(18, -1, "", {{"Inverse"},{"turnOff",65}}) GEA.add({"Global","Capsule", "100"} Paramètre "If" La version 3.10 voit naître le paramètre "If". Ce dernier permet de valider un certain nombre de conditions avant de valider l'événement. -- Si la lumière (69) est allumée un Lundi, Samedi ou Dimanche -- ET que "Vacances = 0" ET que "Absence" = 1 -- ET que la température (8) est inférieur à 18° local condition = {"If",{{"Global", "Absence", "1"},{"Global", "Vacances", "0"},{"Value-", 8, 18}}} GEA.add(69, -1, "La lumière est allumée", {{"Days", "Monday, Weekend"}, condition}) Historique des versions : Version 1.10 [Nouveauté] Si vous mettez "turnOff" comme message, le scénario ne vous enverra pas d'avertissement mais éteindra directement le périphérique en question [Fix] Correction pour les périphérique de type dimmable_light et binary_light Version 1.20 [Nouveauté] GEA.getGlobalForActivation Cette nouvelle fonctionnalité permet de suspendre/activé le scénario par le biais d'une variable global GEA.getGlobalForActivation = {"Alerte", "activé"} -- Le scénario ne fonctionnera que si la variable globale "Alerte" contient "activé" [Nouveauté] GEA.setGlobalMessages Cette nouvelle fonctionnalité permet de mettre a jour une variable globale au lieu d'envoyé un message push. GEA.setGlobalMessages = {{"SARAH:", "parle"}, {"KAROTZ:", "Karotz"}} -- Indique au scénario que si le message contient "SARAH:" ou "KAROTZ:" le scénario doit mettre à jour la variable "parle" ou "Karotz" au lieu d'envoyé un message push. [Nouveauté] Repeat Vous pouvez ajouté un dernier paramètre à la fonction GEA.add pour indiquer si l'avertissement doit être répété ou non. GEA.add(71, 5*60, "Toilette r-c allumée") -- l'avertissement ne sera pas répété GEA.add(71, 5*60, "Toilette r-c allumée", true) -- l'avertissement sera répété GEA.add(71, 5*60, "Toilette r-c allumée", false) -- l'avertissement ne sera pas répété Version 1.30 - Refonte globale [supprimé] GEA.setGlobalMessages Cette fonctionnalité est remplacée par le paramètre {"Global", "MaVariable", "MaValeur"} [supprimé] Repeat Le paramètres Repeat a été supprimé et remplacé par le paramètre {"Repeat"} Version 1.40 [Ajouté] Paramètre {"Days", "..."} [Ajouté] Sunset et Sunrise {"Time", "Sunset", "Sunrise"} Version 1.41 [Fix] Suppression du message "hors plage horaires" prêtant à confusionVersion 1.42 [Fix] Si une plage horaires est définie et que la vérification à lieu dans cette même plage, le scénario ne contrôlait plus le paramètre {"Days"}Version 1.50 [Ajouté] Paramètre {"Value", <valeur>} Ce paramètre permet de modifier la valeur d'un périphérique. Utiliser principalement pour dimmer une lampe par exemple on dimme la lampe à 20% si elle est allumée plus de 10mn entre 22:00 et 06:00 puis après 20mn on l'éteint. GEA.add(31, 10*60, "", {"Time", "22:00", "06:00"}, {"Value", 20}}) GEA.add(31, 20*60, "", {"Time", "22:00", "06:00"}, {"turnOff"}})Version 1.51 [Ajouté] Message d'avertissement lorsque le scénario est suspenduVersion 1.52 [Modifié] Trace plus clair en mode "debug"Version 1.55 [Optimisation] Optimisation du codeVersion 1.60 [Nouveauté] Ajout de déclencheur Avant, il n'était possible uniquement d'avoir comme déclencheur l'identifiant d'un périphérique et le système utilisait sont état (actif ou non). Il est maintenant possible d'avoir comme déclencheur une variable global ou la valeur d'un sensor (voir les derniers exemples)Version 1.70 [Nouveauté] Ajout des déclencheurs "Value+", "Value-" et "Dead" [Nouveauté] Ajout des actions "Email", "Label" et "WakeUp" [Nouveauté] Ajout de variables dans le message : time, duration, value, date, seconds, name Version 1.71 [Nouveauté] Possibilité de précisé un ID différent pour turnOn ou turnOff (ex : {"turnOff", 21})Version 1.80 [Nouveauté] Ajout des actions "Program", "RGB" et "Slider" [Nouveauté] Ajout de la propriété {"Group", 1} [Nouveauté] Ajout du déclencheur {"Group", 1} Version 1.81 [Fix] Gestion des groupesVersion 2.00 [Modification] Renommage du projet (anciennement Wdtiso)Version 2.01 [Nouveauté] Ajout de l'action {"Value", <id>, <valeur>} permettant de modifier la valeur d'un module autre que celui testéVersion 3.00 [Nouveauté] Ajout de l'action {"Open"} et {"Close"} permettant d'ouvrir fermer les volets [Nouveauté] Ajout de l'action {"Open", valeur} et {"Close", valeur} permettant d'ouvrir fermer les volets selon un pourcentage [Nouveauté] Ajout de l'action {"Open", id, valeur} et {"Close", id, valeur} permettant d'ouvrir fermer les volets du module (ID) selon un pourcentage [Nouveauté] Possibilité des déclencheurs %%properties et %%globales avec comme durée -1 Version 3.10 [Correction] Correction des modes {"Open", <id>, <value>} et {"Open", <id>, <value>} [Nouveauté] Ajout du paramètre {"DST"} permettant de vérifié l'heure d'été [Nouveauté] Ajout du paramètre {"If", {[{condition}][,{condition}[,...]]}} Permet de valider X conditions avant de lancer les actions Version 3.15 [Nouveauté] Ajout du paramètre {"NOTDST"} permettant de vérifié l'heure d'hiverVersion 3.20 [Fix] Correction des paramètres {"DST"} et {"NOTDST"} [Modification] Une correction est maintenant appliquée sur le délai entre 2 vérifications selon la durée de traitement des événements. Exemple, vous avez spécifier un intervalle de 30 secondes entre 2 passage. La durée de traitement est de 1 seconde, le nouveau délai sera donc de 29 secondes Version 3.21 [Modification] #duration# affiche dorénavant la vrai durée et au format Xh Xm Xs (La porte est ouverte depuis 5m 30s) [Nouveauté] Ajout de l'action {"Stop"} et {"Stop", <id>} Version 3.30 [Nouveauté] Ajout de l'options {"Dates", "01/01[/2014]", "31/01[/2014]"} [Nouveauté] Ajout de l'option {"Time", "Sunrise<07:30", "Sunset<22:00 [Nouveauté] Ajout de l'option {"Time", "Sunrise+20", "Sunset-100"} [Nouveauté] Ajout de la variable #durationfull# pour les message (3 heures 5 minutes 30 secondes) [Nouveauté] Les variables de message #time#, #duration#, #date#, ... sont utilisable dans les variables globales, les labels et les emails [Nouveauté] Supporte le format d'heure H:mm [Nouveauté] Ajout des options {"Armed"} et {"Disarmed"} [Nouveauté] Ajout de la condition {"Battery", <id>, <valeur max>} [Correction] Correction du paramètre {"Email", <id user>} [Optimisation]Isolation des commandes en cas d'erreur [Optimisation]Ajout de validations techniques Version 3.40 [Nouveauté] Ajout de la condition {"Batteries", <valeur max>} [Nouveauté] Ajout de la condition {"SceneActivation", <id module>, <id scene>} [Correction] détection activation/désactivation sur module RGB par @HANSOLO Version 3.50 [Nouveauté] Ajout des conditions {"Global+", <variable>, <valeur>} et {"Global+", <variable>, <valeur>} par @HANSOLO [Nouveauté] Ajout des conditions {"setArmed", <id>} et {"setDisarmed", <id>} [Correction] Erreur lorsqu'un module à pile ne retourne pas son information [Correction] Mode debug dans certains circonstance Version 3.51 [Correction] Batteries, la valeur n'était pas prise en compte et fixée à 80 [Correction] #durationfull# amélioration en utilisant le "et" (exemple : 1 heure et 30 minutes, 23 minutes et 30 secondes, 1 heure 20 minutes et 30 secondes,...) Version 3.60 [Nouveauté] Ajout de la condition {"Slider-", <id_vd>, <nom_slider>, <valeur>} [Nouveauté] Ajout de la condition {"Slider+", <id_vd>, <nom_slider>, <valeur>} [Nouveauté] Ajout de la condition {"Label", <id_vd>, <nom_label>, <contenu>} Version 3.61 [Correction] Les options Label et Slider introduit dans la v1.70 ne fonctionnaient pas correctementVersion 3.62 [Amélioration] Etat des capteurs (mouvement, porte, inondation) par @Shyrka973 [Amélioration] Coloration des logs pour plus de lisibilité (inspiré du Maestro @Krikroff) Version 3.65 [Amélioration] Déportation du code utilisateur en début de script, proposition de @fredo [Nouveauté] Ajout de l' action {"Global", <variable>, "inc+"} pour incrémenter de 1 automatiquement la variable [Nouveauté] Ajout de l' action {"Global", <variable>, "dec-"} pour décrémenter de 1 automatiquement la variable Version 3.70 [Amélioration] RGBW : permettre de spécifier chaque canal indépendamment par @Shyrka973Version 3.75 [Nouveauté] GEA devient multilingue. Par défaut le français est conservé.Version 3.80 [Nouveauté] Possibilité de stopper n'importe quel tâche {"StopTask", <id_task>}. [Nouveauté] Possibilité de redémarrer n'importe quel tâche {"RestartTask", <id_task>}. [Nouveauté] Possibilité de spécifier le nombre d’exécution d'une tâche {"MaxTime", <number>} [ATTENTION] Veuillez créer la variable globale GEA_Tasks Version 3.81 [Correction] {"StopTask", <id_task>}, {"RestartTask", <id_task>} et {"MaxTime", <number>} était issu d'une mauvaise implémentation. [Nouveauté] Add {"Global!", <variable>, <value>} Pour vérifier qu'une variable globale ne soit pas égale à la valeur. [Nouveauté] Ajout de la variable #runs# dans les messages pour savoir le nombre de fois que la tâche a été exécutée. [ATTENTION] Veuillez créer la variable globale GEA_Tasks Version 3.82 [Correction] réparation du {"Repeat"} cassé lors de la 3.81. (thanks jompa68) [Amélioration] Ajout du code de Shyrka973 affichant l'ID d'un module déclenchant GEA sans pour autant avoir de tâche à effectuer. Version 4.017 [Correction] Mise en phase avec la version du firmware 4.017. (thanks jompa68)Version 4.020 [Adaptation] Mise en phase avec la version du firmware 4.017 et plus. [Nouveauté] Multiple condition pour remplacer les If [Nouveauté] #value[index]#, #name[index]# et #room[index]# indexé par périphérique. Version 4.021 [Correction] Impossible d'éteindre un dimmer.Version 4.10 [Correction] Déclenchement instantané : prise en compte de Global!, Global+ et Global-. [Nouveauté] {"Weather", "rain"} permet de savoir s'il pleux [Nouveauté - condition] {"Property", <id_module>, <nom propriété>, <valeur>} Permet de savoir si la propriété <nom propriété> du module <id module> est égala à <valeur> [Nouveauté - condition] {"Property!", <id_module>, <nom propriété>, <valeur>} Permet de savoir si la propriété <nom propriété> du module <id module> est égala à <valeur> [Nouveauté - action] {"CurrentIcon", <id_module>, <id_icon>} Permet modiifier l'icone d'un module virtuel [Nouveauté - action] {"CopyGlobal", <ivar_source>, <var_dest>} Permet copy la variable global <var source> dans <var dest> [Nouveauté] Utilisation des regex pour Value, Property, Weather, Global, et Label ainsi que leur déclinaison. Version 5.00 [Correction] Message indiquant les piles faibles {Batteries} [Correction] #value[?]#, #room[?]# sont maintenant corrigé [Correction] Allumage et extinction des module RGB [Correction] {"Global", "", ""} ne fonctionne plus en 4.x et est maintenant transformer en "true" à la volée [Ajout] l'option {"NotStarted"} empêche une tache de démarrer automatiquement (c.f. RestartTask pour la démarrer) [Ajout] {"Email", <id utilisateur>[, <sujet>]} Le sujet du message peut maintenant être personnalisé. Attention, pour obtenir l'icone en 128x128, veuillez préalablement cliquer dessus avant de l'enregistrer. GEA._5_00.lua
    28 points
  5. DomoCharts Version 5.0 Pour Fibaro Home Center 2 Sommaire : 1. Présentation 2. Pré-requis 3. Installation 3.1 Pages Web 3.2 Base de données MySQL 3.3 Virtual Device 3.4 Scène 4. Mise à jour 5. Utilisation 6. Evolutions futures 1. Présentation Notre box est géniale, il y des beaux graphiques de consommation et de température, mais il manque la possibilité de grapher toutes les autres données, et l'historique des données conservées est purgé au bout d'un certain temps. Voici donc un ensemble de scripts permettant de générer des graphiques de température, humidité, consommation, batterie, etc... de tous les devices connus du Home Center 2. J'ai repris le travail initié par Byackee sur le forum officiel de Fibaro : make your graphics automatically Voici quelques unes des améliorations apportées : Nouvelle structure de base de données (nouvelles tables, modification des tables existantes, création d'index, ...) Meilleures performances Prise en compte des valeurs suivantes : température, humidité, luminosité, batterie, consommation électrique instantanée, électrique électrique cumulée, CO2, pression atmosphérique, niveau sonore, pluie, vent (certaines données sont disponibles grâce au plugin Netatmo) La zone de graphe s'adapte automatiquement en pleine page du navigateur web Gestion des pièces de la maison, afin de différencier les sondes portant le même nom (par exemple "Thermomètre salon" et "Thermomètre chambre") sur le graphique Purge des anciennes données après 21 jours (sinon les tables grossissent trop), avec consolidation les données par jour pour une conservation longue durée dans des tables séparées Utilisation de la dernière version des bibliothèques Highcharts, Highstock, Highslide, jQuery Support complet des HC2 v3 et v4. Energie électrique cumulée (en kWh) : support des tarifs BASE et HC/HP avec configuration statique des horaires Quelques nouveautés visuelles sur les graphiques (échelle de 0 à 100% pour les batteries et humidité en pourcentage), ainsi qu'un code couleur pour les valeurs hors-normes Installation de la base de données sans utiliser phpMyAdmin grâce à un simple script En attendant les plugins utilisateurs, support de "sondes virtuelles", en fait il s'agit de valeurs stockées dans des variables globales et mises à jour via l'API (particulièrement utiles pour les utilisateurs de FHEM, Zibase, etc... pour les protocoles tels que EnOcean et Oregon) Résolution de nombreux petits bugs remontés sur le forum ou non (UTF-8, quotes, pièce 'météo', utilisation des champs adresse IP et Port du VD, etc...). Bouton "Delete" dans le popup après clic sur un point permettant de supprimer une valeur aberrante, afin de conserver une courbe homogène Meilleure gestion des erreurs, avec remonté des message autant que possible (dans le debug du VD, et/ou sur le graph) Réécriture (presque) complète du code des boutons de VD et des pages PHP d'insertion des données, avec une API qui utilise le format de données JSON. C'est beaucoup plus propre, évolutif (je m'en sert pour mes graphs de consommation d'eau et d'énergie électrique, issues d'autres source), et un gain significatif de bande passante réseau. Disponible sur Github, donc plus facile de suivre les versions, et de forker le projet : https://github.com/cdriget/DomoCharts (attention sur Github il n'y a que le code source que j'ai développé, le package complet doit être téléchargé en bas de ce tuto sur le forum) ... 2. Pré-requis Un serveur Web supportant PHP (NAS Synology, hébergement mutualisé, ...) Une base de données MySQL (Idem) Une Fibaro Home Center 2 Le package DomoCharts_V5.0.zip (disponible en bas du tutoriel) Dans le package à télécharger, vous trouverez donc : graph : Répertoire à transférer (via FTP, montage de partage réseau, ...) sur votre serveur Web DomoCharts.vfib : Device virtuel à importer dans le HC2 Scene.lua : Code source à copier/coller dans une nouvelle scène graphique_128.png : Icône pouvant être utilisée sur le Virtual Device clap_graph.png : Icône pouvant être utilisée sur la scène 3. Installation 3.0 Synology Etapes facultatives pour les utilisateurs débutants d'un NAS Synology avec DSM. Ces étapes doivent être effectuées à l'aide du compte admin via l'interface Web (accessible par défaut sur le port 5000). 3.0.1 Installation de MariaDB (MySQL) Dans le Centre de paquets, rechercher et installer MariaDB : Dès que l'installation est terminée, cliquer sur l’icône de MariaDB afin d'accéder à l'écran de configuration, puis cliquer sur le bouton Changer le mot de passe MariaDB : Par défaut, le mot de passe MariaDB est vide, cliquer alors sur le bouton Réinitialiser le mot de passe MariaDB : Confirmer en cliquant sur le bouton Oui : Le seul compte existant est root, il faut donc créer un mot de passe (note : ce compte root est différent du compte root du Syno, il est donc tout à fait possible d'avoir des mots de passes différents) : 3.0.2 Activation du serveur Web Dans le panneau de configuration, aller dans la section Services Web, puis cocher la case Activer Web Station : Accéder à la page Web par défaut sur le port 80 du Syno : Le Syno est prêt. 3.1 Pages Web Transférer toute l'arborescence du répertoire /graph sur le serveur Web via FTP ou montage réseau. Ensuite, éditer le fichier config.inc.php afin d'y modifier les paramètres de connexion à la base de données MySQL : // MySQL Server hostname or IP address $server = 'server'; // MySQL User account $login = 'login'; // MySQL User password $password = 'password'; // MySQL Database name $database = 'database'; Note : si vous utilisez le mini-tuto Synology ci-dessus, les paramètres devraient ressemble à quelques chose comme cela (seul le mot de passe doit être personnalisé) : // MySQL Server hostname or IP address $server = 'localhost'; // MySQL User account $login = 'root'; // MySQL User password $password = 'password'; // MySQL Database name $database = 'domotique'; Pour des raisons de sécurité, si vous maitrisez MySQL et phpMyAdmin, vous devez créer un utilisateur dédié (différent de root). Je ne détaille pas cette procédure qui est hors du cadre de ce tutoriel. Energie Dans le fichier config.inc.php, une rubrique concerne la configuration des horaires de l'abonnement au fournisseur d'électricité (ERDF, ...). La variable $TimeSource doit avoir la valeur 'STATIC' : //*** Teleinfo time for energy // // Variable = 'Value' // Comment : Allowed values // -------- ------- // ------------------------------------------ : --------------- $TimeSource = 'STATIC'; // Source of information for date and time : TELEINFO|STATIC // ---------------------------- // Valid only if TELEINFO TimeSource is used : --------------- $teleinfoTable = 'teleinfo'; // MySQL table name : xxxxxxxx $teleinfoDelay = 60; // Teleinfo Delay in Seconds : ss // ---------------------------- // Valid only if STATIC TimeSource is used : --------------- $TimeHCHP = array( // HC/HP start times for each EDF rate : 'hh:mm' => '<BASE|HC|HP>' '00:00' => 'HC', '06:30' => 'HP', '22:30' => 'HC' ); Sont actuellement supportés les abonnements de type Normal ('BASE'), et Heures Pleines/Heures Creuses ('HP' et 'HC'). Dans l'exemple du dessus, j'ai configuré les horaires HP de 6:30 à 22:30, et des horaires HC de 22:30 à 6:30. Notez que la variable $TimeHCHP doit obligatoirement commencer à 00:00. Vous pouvez ensuite ajouter autant de tranches horaires que nécessaires, car certains abonnements proposent 2 tranches HC réparties dans la journée. Si vous avez un abonnement Normal, c'est plus simple, puisqu'il suffit d'indiquer 'BASE' à partir de 00:00 : $TimeHCHP = array( '00:00' => 'BASE' ); Avec ces informations, le bouton Energy du module virtuel sera ensuite capable d'interroger l'API de la HC2 afin de récupérer les consommations des différentes équipements pour chaque tranche horaire de chaque journée. A l'heure actuelle, le graphique d'énergie électrique affiche la somme des kWh pour chaque journée, mais les informations nécessaires sont stockées dès aujourd'hui dans la base de données afin d'effectuer les calculs de coà»ts financiers ultérieurement. 3.2 Base de données SQL Afin de créer ou migrer les tables dans la base de données MySQL/MariaDB, il faut appeler la page /graph/install.php sur le serveur Web. Si tout se passe bien, la page se contente d'afficher Finished : Sinon, vous pouvez demander du support sur le forum, en copiant/collant le texte des messages d'erreurs. 3.3 Virtual Device Ce Virtual Device est responsable de l'envoi des données vers la base de données SQL au travers de pages Web dédiées à l'insertion des données. Dans la HC2, aller dans Modules, puis Ajouter ou supprimer un dispositif, puis dans la zone Importer un dispositif virtuel, cliquer sur Parcourir, puis sélectionner le fichier DomoCharts.vfib. Dans les propriétés de ce Virtual Device, vous pouvez changer l’icône par défaut avec le fichier graphique_128.png (à répéter pour tous les boutons du VD). Entrer l'adresse IP du serveur Web et son port : On en profite pour relever l'ID du Virtual Device dans la barre d'adresse, qui nous sera utile plus loin lors de la création de la scène : Au final, on obtient un nouveau module dans l'interface : 3.4 Scène Cette scène est responsable du déclenchement régulier des appels au Virtual Device. Dans la HC2, aller dans Scènes, puis Ajouter une scène, puis Ajouter une scène en LUA. Appelez-là DomoCharts, bien s'assurer que les cases Scène Active et Ne laissez pas l'alarme arrêter une scène tandis que l'alarme est en marche sont cochées. Utiliser l'icône fournie clap_graph.png. Dans l'onglet Avancé, copier/coller le code LUA fourni dans le fichier Scene.lua. Ne pas oublier de remplacer la valeur de la variable VirtualDeviceID par l'ID de votre Virtual Device que vous avez obtenu dans la barre d'adresse lors de la création de celui-ci. local VirtualDeviceID = 82 Au final, on obtient une nouvelle scène dans l'interface : La particularité de cette scène est d'attendre le début d'une nouvelle minute avant de commencer à entrer dans la boucle infinie. Ainsi, si on modifie la scène en plein milieu d'une minute, lorsque le HC2 redémarre immédiatement la scène, on est certain que nos actions seront exécutées à la prochaine nouvelle minute, conservant bien toujours 1 minute d'intervalle entre 2 appels au Virtual Device. De plus, différents tests vous permettent d'exécuter certaines actions une fois par minute, par heure, ou par jour. Je m'en sert pas exemple pour mettre à jour les données de mon Eco-Devices et de mon compteur d'eau (pilotés par d'autres Virtual Devices). A noter que lors du changement de jour, on attend 1 minute de plus afin d'éviter tout décalage de temps entre la HC2 et le serveur Web (important pour la génération des données consolidées par jour, car on doit être certain que le jour précédent est complètement terminé). Par défaut, je propose donc : Mise à jour des valeurs des sondes (températures, humidité, etc... ) toutes les minutes Mise à jour des consommations instantanées toutes les minutes Mise à jour des batteries une fois par jour à 23h Mise à jour des devices une fois par jour (ce qui implique que si vous ajouter une nouvelle sonde de température en journée, celle-ci ne sera visible sur les graphes qu'à partir de 0h01, bien que les données commencent à être enregistrée à la minute près où le device est ajouté dans le HC2) Consolidation et purge des données une fois par jour 3.5 Variables Globales En option, il est possible de grapher des données issues de variables globales. Cela est utile pour les données issues de sources externes, telles que des sondes Oregon sur une Zibase, des sondes EnOcean sur FHEM, etc. Les valeurs de ces variables sont alors mises à jour en Push via l'API, ou en Pull via une scène. Je ne détaille pas ces étapes qui sont hors du cadre de ce tutoriel. Il y a 2 boutons à modifier : Bouton n°1 - Sensors Modifier la variable nommée variables située en début de script. Dans cet exemple, on peut voir 2 sondes de température, et une sonde d'humidité : -- User Global Variables local variables = { { ["type"] = "temperature", ["id"] = 2001, ["name"] = "TempCuisine" }, { ["type"] = "humidity", ["id"] = 2002, ["name"] = "HumCuisine" }, { ["type"] = "temperature", ["id"] = 2003, ["name"] = "TempSalleCinema" } } Pour chaque valeur, les champs suivants sont requis : - type : le type de capteur (temperature, humidity, light, power, co2, pressure, noise, rain, wind) - id : un ID "virtuel", c'est à dire qui ne correspond à aucun device connu par la HC2. N'hésitez pas à choisir une valeur très élevée que vous n'atteindrez jamais, sous peine de conflit d'ID. - name : le nom de la variable globale créée dans le panneau Bouton n°4 - Devices De façon similaire : -- User Global Variables local variables = { { ["type"] = "temperature", ["id"] = 2001, ["name"] = "Température", ["room"] = 7 -- Cuisine }, { ["type"] = "humidity", ["id"] = 2002, ["name"] = "Humidité", ["room"] = 7 -- Cuisine }, { ["type"] = "temperature", ["id"] = 2003, ["name"] = "Température", ["room"] = 5 -- Salle cinéma } } Pour chaque valeur, les champs suivants sont requis : - type : le type de capteur => identique au bouton n°1 - id : un ID "virtuel" => identique au bouton n°1 - name : le nom du capteur qui apparaitra dans le graph - room : l'ID de la pièce dans laquelle se situe le capteur, qui s'affichera dans le graph à la suite du nom du capteur. 4. Mise à jour Pour procéder à la mise à jour, il faut : Bloquer l'exécution de la scène Graphiques LUA Importer le nouveau VD (et mettre l’icône, l'IP et le port comme indiqué plus haut) Supprimer puis retransférer le contenu du répertoire /graph sur le serveur Web, comme expliqué au paragraphe 3.1. => Attention à ne pas perdre vos paramètres dans le fichier config.inc.php. Modifier le fichier config.inc.php avec les bonnes infos pour se connecter à la DB (comme expliqué ci-dessus) Dans un navigateur Web, ouvrir la page /graph/install.php afin de préparer la base de données aux changements (comme expliqué ci-dessus) Réactiver la scène LUA Regarder le Debug des boutons du VD pour vérifier qu'il n'y a pas d'erreur Vider le cache du navigateur Au bout de quelques minutes, les graphs doivent continuer comme avant, avec les nouveaux graphs 5. Utilisation Pour visualiser les graphes, il suffit d'aller chercher avec son navigateur l'adresse du serveur Web avec le chemin "/graph", par exemple : http://192.168.1.1/graph/ . Pour l'administration, aller sur la page admin.php : http://192.168.1.1/graph/admin.php Cette page permet d'ordonner les modules, de donner une couleur à chaque courbe, et d'en cacher certains : Si une valeur aberrante apparait, il zoomer suffisamment sur le graph, puis cliquer sur le point. Dans le popup qui apparait, un bouton Delete permet de supprimer la valeur, afin de conserver une courbe homogène : 6. Evolutions futures En cas de perte de communication entre la HC2 et le NAS/Serveur Web, stockage des données en local dans une Variable Globale, jusqu'à ce que leur envoi soit possible. Cela permettra de ne pas perdre de données en cas de mise à jour/reboot/plantage du NAS, ou de la connexion Internet. Permettre à l'utilisateur de créer autant de graphs qu'il veut, en lui permettant d'attribuer un certain nombre de modules à chaque graph, avec personnalisation du graph (échelle, couleurs, taille, police, etc). Ainsi on pourra avoir un graph de la température des pièces, un autre graph de la température du matos informatique, un graph de la température en fonction de la consommation électrique du chauffage, etc.... à vous d'imaginer vos besoins ... Je suis preneur de vos suggestions ! 7. Informations complémentaires Bug si station météo Netatmo => Voir patch des butons Sensors et Devices par @Steven en page 41. Tutoriel de @Sakkhho pour ajouter les relevés du compteur de gaz NorthQ en page 44. Charts_V4.1.zip DomoCharts_V5.0.zip
    23 points
  6. Class Action Bonjour à tous, Ne voyant toujours rien venir du côté Fibaro pour l'intégration des modules Qubino, je souhaiterai savoir si certains d'entre vous ne voudrait pas mettre en place une opération pour mettre un peu la pression à Fibaro (une forme de pétition). L'idée serait, d'inventorier tous nos modules Qubino non-intégrés par template. Nous pourrions faire une liste de modèles avec les quantités par modèle (dans un Googlesheet) pour mettre en évidence la situation (avec pseudo du fofo). Une fois la liste exhaustive, les quantités et les snaps xml, faire parvenir l'ensemble à Fibaro et communiquer partout sur les réseaux sociaux de manière ouverte et sans animosité pour faire voir l'attente que nous avons de Fibaro. ??? Mettre un "J'aime" si vous êtes d'accord.
    19 points
  7. J'ai décidé de faire ce tuto avec l'accord de Steven Activé ou Désactivé une Scéne : Une scène non activé ne peut être exécuté que manuellement. Capture d'écran pour une Scéne LUA Capture d'écran pour une Scéne BLOC On peut remarqué une différence entre ces 2 captures d'écran Pour lancé une scéne au démarrage de la HC2 - En mode Bloc on doit coché la case : Lancer au Démarrage du Home Center 2 - En mode LUA on doit ajouter dans l'entête : %% autostart (Attention parfois il faut ajouter un petit SLEEP d'environ 10s pour que cela fonctionne "Merci Steven pour cette astuce") Pour ceux qui connaissent MSDOS autostart peut être comparer à l'autoexec.bat Tous ce qui va suivre n'est pas de moi mais de Steven, je trouvais dommage qu'une explication aussi clair ce trouve dans un post perdu sur le forum Non, l'entête n'est pas obligatoire, il l'est uniquement si l'on souhaite utilisé les déclencheurs automatiques tel que %% autostart -- démarrage automatique au redémarrage %% properties -- sur changement d'une propriété d'un module %% globals -- sur changement d'une variable globale Exemple : --[[ %% properties 63 power 37 value --]] Dès que la consommation de mon module ID 63 change OU que la valeur de mon module ID 37 change, la scène sera executée. --[[ %% globals Chauffage --]] Dès que la variable global "Chauffage" changera de valeur (attention, changer sa valeur depuis le panneau des variables ne fonctionne pas) Si plusieurs déclencheurs arrivent en même temps, il y a aura plusieurs scènes lancées en parallèle. Beaucoup de personne n'aime pas cela est commence le code de leur scène par if (fibaro:countScenes() > 1) then fibaro:abort() end Pour s'assurer de n'avoir qu'une instance de scène en même temps. Après, comme tu l'as déjà dis, il est possible de savoir "qui" a déclenché la scène : local trigger = fibaro:getSourceTrigger() if (trigger['type'] == 'property') then -- Déclenché par le changement de valeur d'un module fibaro:debug('Source device = ' .. trigger['deviceID']) elseif (trigger['type'] == 'global') then -- Déclenché par le changement d'une variable globale fibaro:debug('Global variable source = ' .. trigger['name']) elseif (trigger['type'] == 'autostart') then -- Déclencher au démarrage de la box fibaro:debug('Autostart') elseif (trigger['type'] == 'other') then -- Déclencher manuellement ou par une autre scène ou un appel API. fibaro:debug('Other source.') end Merci pour tous ce que tu fais sur le forum Voici des liens vers de la documentation en FRANà‡AIS Description détaillée des l’API Fibaro : http://domotique-home.fr/category/docs-fibaro-fr/ Index des Fonctions : http://domotique-home.fr/docs-fibaro-francais-index-des-fonctions-thematique/ Une application Android sur le Play store : http://play.google.com/store/apps/details?id=appinventor.ai_rems99.FibaroDocsFr Introduction à la programmation LUA : http://www.luteus.biz/Download/LoriotPro_Doc/LUA/LUA_Training_FR/Introduction_Programmation.html
    19 points
  8. Bonjour, Comme discuté dans le fil du support GEA, je trouve que apprendre par l'exemple est la meilleure solution. Malheureusement, dans le fil du support, la majorité du code qui s'y trouve ne fonctionne pas ... C'est un peu normal... Je vous propose donc de poster ici votre configuration GEA, POSTEZ UNIQUEMENT LES FONCTIONS TESTÉE ET VÉRIFIÉE. POUR PLUS DE LISIBILITÉ, NE POSEZ PAS DE QUESTIONS DANS CE FIL !!! SI VOUS VOULEZ REMERCIER UN POST, CLIQUEZ SUR LE BOUTON J'AIME Si vous avez une question, allez dans le fil GEA support et faites référence à un post ou copiez la config pour laquelle vous voulez poser une question. Merci et en espérant que ce fil soit utile
    18 points
  9. Voici une interprétation / traduction du premier onglet « Résumé des fonctions » (Spis funkcji) de la page officielle de documentation Fibaro http://docs.fibaro.com/?page_id=861. Il s’agit surtout des bases du langage LUA pour les scripts Fibaro. J’ai rajouté quelques interprétations, moyens de compréhension… pour que cette traduction ressemble également à un tutoriel comme j’aurai aimé le trouver quand j’ai commencé il y a quelques mois à écrire quelques bouts de code. Certaines fonctions semblent manquer, avoir changé, avoir disparu, ou même ne fonctionnent pas encore (j’ai cru lire ça quelque part à propos des scripts utilisant les données géographiques), car je ne pense pas que Fibaro mettent à jour très régulièrement cette base de donnée. J’espère que les débutants surtout, apprécieront, et pour les pros, n’hésitez pas à me faire corriger les mauvaises traductions / interprétations. Je ferai surement par la suite, d’autres traductions de leurs pages car cette première m’a vraiment été d’une grande utilité pour démarrer dans le monde de l’automatisme (en LUA ici) sachant que je partais presque de zéro (juste des notions avec excel, si on peut les apparenter de loin…) Comprendre certaines choses avant de démarrer : Un script LUA doit toujours commencer par l’entête suivant. Certes cela fonctionne aussi sans, mais si vous voulez modifier plus tard le script pour : - intégrer des déclenchements automatiques de la scène (trigger) en fonction de certaines actions ou évenements extérieurs - démarrer automatiquement la scène après enregistrement (pratique dans le cas d’une lecture infinie de la boucle de code, puisque cela vous permet de ne pas oublier d’appuyer sur le bouton ‘démarrer’ la scène après enregistrement) - d’autres choses encore, il faudra insérer des éléments dans cet entête. --[[ %% properties %% globals --]] Le mot " local " permet de signaler dans le script qu’on va stocker derrière, une variable en tant que ‘variable locale’. Imaginez que vous ouvrez un tiroir et que vous y mettiez la variable 'a' (ou appelez la comme vous voulez).Vous pouvez lui donner une valeur directement (cas 1) : local a = 50 ou l’associer à une fonction (cas 2) : a = fibaro:getValue(107, 'value') Dans le script vous pourrez rouvrir ce tiroir pour chercher la valeur de 'a' dans le cas 1, ou éviter de retaper plusieurs fois la fonction entière dans le cas 2. - Cas 1 : Imaginons qu’on associe 'a' à l’intensité lumineuse en pourcent d’un spot branché sur un variateur (dimmer fibaro par exemple). Dans le script on pourra faire allumer le spot à une certaine intensité (50%) en demandant à ce que le paramètre de luminosité du variateur associé au spot prenne la valeur de 'a' (ainsi pas besoin de lui donner la valeur 50) ou bien de a + 10 par exemple. local a = 50 -- on définit la variable locale avec nom et valeur fibaro:call(12, 'setValue', a) -- on demande au système d'appeler (call) le module 12 et de lui donner la valeur (setValue) de 'a' (soit 50) -- ou par exemple fibaro:call(12, 'setValue', a + 10) - Cas 2 : Imaginons maintenant que 'a' représente la fonction qui vérifie l'intensité du spot 107. On va créer une scène qui éteint le spot numéro 108, si le spot 107 est allumé et inversement. local a = fibaro:getValue(107, 'value') -- 'a' représente la fonction qui récupère (get) la valeur (Value) de l'intensité (value) du spot 107 if tonumber(a) >= 1 then -- si la valeur récupérée (ramenée en valeur numérique grâce à tonumber) est supérieure à 1 (allumé), alors fibaro:call(108, 'turnOff') -- le spot 108 s’éteint. else fibaro:call(108, 'turnOn') -- sinon le spot 108 s’allume end -- fin de la condition En utilisant 'a' dans ce genre de cas et si on doit répéter plusieurs fois la fonction associée, on évite de surcharger le script ou de faire des erreurs de saisie en retapant plusieurs fois une longue fonction. Le mot " local " n’est pas obligatoire, les variables locales fonctionnent même sans les introduire par ce mot. Cependant il est plus aisé à la relecture d’un script de retrouver les variables qu’on va utiliser en les précédant de ce mot. Ne mettez pas d’accents, d’espace ou de caractères spéciaux dans le nom de vos variables. Il est important de respecter les minuscules et les majuscules des commandes, fonctions, par contre vous pouvez utiliser ‘ ‘ou « » dans vos scripts ça ne changera rien … Dans une parenthèse on peut mettre un espace après l’ouverture de parenthèse et avant la fermeture, ou ne pas en mettre. Cela n’a aucune incidence. Il semble d’ailleurs que les espaces ne soient pas importants dans la construction du script (sauf entre les mots évidemment, mais pas importants entre les mots et les ponctuations). La fonction fibaro:debug() permet « d’imprimer » des messages dans la case sous le script, au fur et à mesure de sa lecture par le système et ainsi permet à l’utilisateur de pouvoir vérifier des résultats de l’automate.Si vous avez besoin de mettre une apostrophe dans une phrase pour la fonction debug, il faut mettre devant le \ pour que la lecture du script ne bug pas sur l’apostrophe. fibaro:debug('Il n\’y a qu\’une action en cours') Une seconde correspond à 1000ms. Lorsqu’on veut donner une durée dans le script il faut convertir le temps voulu en ms. Les tabulations automatiques ou manuelles lors de l’écriture du script ne sont pas importantes, mais un script bien agencé sera plus facile à comprendre, ou permet de repérer des erreurs ou oublis (par exemple en utilisant du conditionnel if then else, il faut finir cette condition par end, mais dans certains cas cette condition se retrouve dans une autre condition ou dans une autre chaîne qui nécessite également un end à la fin).Exemple : la chaine while true do en 1 nécessite end en 14 quand on veut arrêter la lecture en boucle qu’elle commande et reprendre la lecture au début. Dans cette boucle de lecture on a inséré une condition qui commence en 3-4 et se finit en 12, dans laquelle on a glissé une autre condition en 6-7 qui se finit en 10. L’architecture structurée permet de voir plus clair dans le script. while true do local--- if then --------- local--- if then -------- else ------ end else ------ end end On retrouvera des couleurs dans le script. Le gris correspond à des notes personnelles, il faut commencer chaque ligne par -- puis votre texte, ou --[[ texte ]]-- (sur plusieurs lignes). Le système ne tiendra pas compte de nos notes, sauf dans l’entête. Les caractères spéciaux et accents ne posent pas de problème dans ces notes. Le vert correspond aux actions à effectuer sur les modules (‘turnOff’, ‘setValue’…) ; au nom d’une propriété que l’on veut surveiller ou sur laquelle on veut agir (‘value’, ‘dead’, ‘isLight‘…) ; aux messages qu’on associera aux fonctions debug : fibaro:debug('La scène est en cours d\’exécution') ) ; à une valeur à atteindre par une fonction (ouverture de volet ou allumage d’une lampe sur variateur ‘50’, ‘75’). Attention aux valeurs ‘1’ et ‘0’ qui peuvent correspondent à un état d’une propriété d’un module (le module gère l'éclairage ('1') ou le module ne gère pas l'éclairage('0') est le retour d’état de la propiété isLight d'un module dimmer, ON ('1) et OFF ('0') est le retour d'état de la propriété value d'un module relai switch) ; au nom d'une variable globale qu'on utilise dans une fonction; à une position géographique « 52.5648 ;-12.5861 » ; et encore d'autres choses... Le rouge correspond au numéro d’identification d'un module ou d'une scène (DeviceID, SceneID… : 12, 54…) ; à une durée dans la fonction sleep ; à une valeur assignée à une variable locale ou une valeur à comparer. Le bleu correspond à toute l’architecture du système : local qui permet de signaler une variable du nom qu’on choisira et à laquelle on peut associer une fonction ou une valeur ; à des conditions if then else (si alors sinon), while true do (lance une lecture en boucle infinie du script); des valeurs booléennes (false et true dans par exemple la vérification de l'activité ou non d'une scène) …. Le jaune correspond aux variables dont on choisit le nom (en français, en anglais ou autre, sans espace entre les mots ex : MaVariable, qu’on peut retrouver derrière local forcément, mais aussi dans des messages de la fonction fibaro:debug, ou de la fonction fibaro:call, ou bien dans une condition if then pour récupérer ou comparer une valeur associée à cette variable) ; ainsi qu’à toutes les fonctions (fibaro:abort, fibaro:get...). Le orange correspond à des outils système (os.date, string.format, tonumber…) Liste des fonctions (par ordre alphabétique)fibaro:abort() fibaro:calculateDistance(position1, position2) fibaro:call(deviceID, actionName, …) fibaro:countScenes() fibaro:countScenes(sceneID) fibaro:debug(text) fibaro:get(deviceID, propertyName) fibaro:getGlobal(varName) fibaro:getGlobalModificationTime(varName) fibaro:getGlobalValue(varName) fibaro:getModificationTime(deviceID, propertyName) fibaro:getRoomID(deviceID) fibaro:getSectionID(deviceID) fibaro:getSourceTrigger() fibaro:getSourceTriggerType() fibaro:getType(deviceID) fibaro:getValue(deviceID, propertyName) fibaro:isSceneEnabled(sceneID) fibaro:killScenes(sceneID) fibaro:setGlobal(varName, value) fibaro:setSceneEnabled(sceneID, enabled) fibaro:sleep(time) fibaro:startScene(sceneID) Résumé des fonctions (thématique)DISPOSITIFS DE CONTRà”LE fibaro:call(deviceID, actionName, …) fibaro:get(deviceID, propertyName) fibaro:getValue(deviceID, propertyName) fibaro:getModificationTime(deviceID, propertyName) fibaro:getType(deviceID) fibaro:getRoomID(deviceID) fibaro:getSectionID(deviceID) SCENES DE CONTROLE fibaro:abort() fibaro:getSourceTrigger() fibaro:getSourceTriggerType() fibaro:startScene(sceneID) fibaro:killScenes(sceneID) fibaro:setSceneEnabled(sceneID, enabled) fibaro:isSceneEnabled(sceneID) fibaro:countScenes() fibaro:countScenes(sceneID) TRAITEMENT DES GLOBALS fibaro:setGlobal(varName, value) fibaro:getGlobal(varName) fibaro:getGlobalValue(varName) fibaro:getGlobalModificationTime(varName) CARACTÉRISTIQUES SUPPLÉMENTAIRES fibaro:debug(text) fibaro:calculateDistance(position1, position2) Liste des fonctions (par ordre alphabétique) - fibaro:abort() DESCRIPTION On arrête le script en cours d'exécution. CARACTÉRISTIQUES Aucune VALEURS RÉCUPÉRÉES Aucune EXEMPLE local a = 0 -- on définit la variable avec nom et valeur -- On démarre une boucle infinie de lecture, le script sera relu sans arrêt grâce à la commande: while true do -- si a est supérieur à 10 alors la lecture du script s'arrête en 7 if (a > 10) then fibaro:abort() end -- fin de la condition -- si a est inférieur à 10, la lecture du script continue -- on augmente maintenant de 1 la valeur de la variable a a = a + 1 -- on attend 1 seconde fibaro:sleep(1000) end -- fin de la boucle de lecture. La lecture reprend en 3 -- la lecture s'arrête en 13 et redémarre en 3 avec la nouvelle valeur de a jusqu'à ce que a soit supérieur à 10 et que la lecture du script s'arrête - fibaro:calculateDistance(position1, position2) DESCRIPTION On calcule la distance entre deux points géographiques: position1 et position2. CARACTÉRISTIQUES position1: premier point position2: second point Le point est exprimé avec sa latitude et sa longitude. Ces deux valeurs sont exprimées en degrés avec une partie décimale, et sont séparées par un point-virgule. Une valeur négative est donnée pour les valeurs de l'ouest et du sud. Le séparateur décimal est un point. Par exemple, le point 40°44'55"N, 73°59'11"W doit être enregistré comme une chaîne (string) "40.7486;-73.9864". Ce format correspond à la propriété « Location » (emplacement) du device « HC_user » (l’utilisateur) et stocke la dernière position de l'utilisateur du Home Center 2. VALEURS RÉCUPÉRÉES La distance, exprimée en mètres. EXEMPLE -- le système repère l'emplacement (propriété Location) du device 123 (moi par exemple grâce à mon smartphone) et stocke les données de mon emplacement dans la variable : local MonEmplacement = fibaro:getValue(123, 'Location') -- on crée une variable correspondant à la fonction qui récupère (get) la valeur (Value) de la propriété Location (emplacement) du device 123 (moi) -- on va ensuite stocker l'emplacement de notre maison dans une seconde variable: local EmplacementMaison = "52.4325295140701;16.8450629997253" -- on crée une dernière variable qui correspondra au résultat de la fonction qui calcule la distance entre nos 2 points: local Distance = fibaro:calculateDistance(MonEmplacement, EmplacementMaison) -- enfin la fonction debug m'indiquera cette distance grâce au texte que j'y associe et dans lequel j'ai inséré le résultat de ma variable Distance (qui sera retranscrite en valeur numérique) fibaro:debug('La distance est de '..Distance..'m') - fibaro:call(deviceID, actionName, arguments) DESCRIPTION On envoie une demande à un module (device) pour qu’il exécute une action. CARACTÉRISTIQUES deviceID: numéro du module (c’est son identité dans le système) actionName: chaîne (string) qui représente le nom de l’action argument: les arguments peuvent se succéder. De 0 à 7 arguments par action. VALEURS RÉCUPÉRÉES Aucune EXEMPLE -- on demande au module d'ID=12 de s'éteindre fibaro:call(12, 'turnOff') -- on demande au module d'ID=12 de fixer sa valeur à 23 (intensité en % d'une lampe sur variateur, ouverture d'un volet) fibaro:call(12, 'SetValue', '23') DESCRIPTION ÉTENDUE Il convient de noter que tous les arguments des fonctions call sont des chaînes (string). Ici '23' est une chaîne et non une valeur numérique (c'est pour cela qu'il faut mettre des guillemets sinon ça ne fonctionnera pas). Cependant, grâce au mécanisme intégré coercitif [lien Fibaro manquant pour l'explication], il n'est pas nécessaire de convertir les types numériques en chaîne (vous pouvez autant mettre une valeur numérique que le nom d'une variable qui est un format string). Nous verrons plus tard qu'à certains moments il faudra convertir une chaîne en valeur numérique grâce l'outil tonumber). -- le système stocke la valeur 50 pour la variable qu'on appelle 'a' local a = 50 -- on demande au module d'ID=12 de prendre la valeur de 'a' qui est en format string fibaro:call(12, 'SetValue', a) Une description des actions disponibles ainsi que le nombre de paramètres requis est disponible ici. [lien Fibaro manquant]. - fibaro:countScenes() DESCRIPTION On obtient le nombre de lecture en cours de la scène. Par exemple, en cliquant 2x (ou plus) sur 'démarrer' avant la fin de la première lecture, vous démarrez une seconde (ou plus) lecture du script, la première ne s'arrêtera pas ; vous pouvez avoir également plusieurs scènes qui démarrent une scène particulière, il peut donc être utile en début de script de cette scène particulière, d'interdire une nouvelle lecture du script si une lecture est déjà en cours d’exécution. CARACTÉRISTIQUES Aucune VALEURS RÉCUPÉRÉES Un entier positif qui spécifie le nombre d’exécution en cours de la scène. EXEMPLES -- on stocke dans la variable num, le nombre d'instances en cours de la scène local num = fibaro:countScenes() -- si il n'y a qu'une lecture en cours de la scène, alors la fonction debug m'indiquera la phrase que j'y associe ('il n'y a qu'une lecture en cours') if num == 1 then fibaro:debug('Il n\’y a qu\’une lecture en cours') -- sinon la fonction debug intégrera le nombre de lectures de la scène dans une autre phrase que j'y associe ('nombre d'instances en cours: ') else fibaro:debug('Nombre d\’instances en cours: '..num) -- notez que pour insérer une valeur d'une variable dans la fonction debug, il faut 2 points du coté du texte (avant et/ou après) end -- avant qu'une scène ne s'exécute, elle peut vérifier si elle est déja en cours d'exécution pour ne pas être lue plusieurs fois en même temps if fibaro:countScenes() > 1 then -- si la scène est lancée plus d'une fois alors fibaro:abort() -- arrêt de cette lecture du script end -- fin de la condition -- notez qu'on peut écrire aussi de cette façon local num = fibaro:countScenes() if num > 1 then fibaro:abort() end - fibaro:countScenes(sceneID) DESCRIPTION On obtient le nombre d’exécution en cours pour une scène donnée (chaque scène est identifiée par son identité sceneID et peut être utilisée dans d’autres scènes) CARACTÉRISTIQUES sceneID: Numéro de la scène, identité de la scène VALEURS RÉCUPÉRÉES Un entier positif qui spécifie le nombre d'exécution en cours d'une scène donnée. EXEMPLE -- on veut afficher le nombre d'exécution en cours de la scène d'ID=12 local num = fibaro:countScenes(12) fibaro:debug('Nombre d\’instances en cours de la scène 12 '..num) -- on veut vérifier que la scène 12 est en cours d'exécution if fibaro:countScenes(12) >= 1 then fibaro:debug('La scène 12 est en cours d\’exécution') else fibaro:debug('La scène 12 n\’est pas en cours d\’exécution') end - fibaro:debug(text) DESCRIPTION On imprime le message dans la console de débogage associée au script. CARACTÉRISTIQUES text: texte à afficher VALEURS RÉCUPÉRÉES Aucune EXEMPLE fibaro:debug('Exemple de message') Résultat dans la console de débogage du script: - fibaro:get(deviceID, propertyName) DESCRIPTION On récupère les informations (valeur et heure de dernière modification) sur les propriétés d’un module CARACTÉRISTIQUES deviceID: numéro d'identité du module propertyName: intitulé de la propriété VALEURS RÉCUPÉRÉES Une chaîne contenant la valeur actuelle d’une des propriétés d’un module Horodatage (timeStamp) [lien Fibaro manquant pour l'explication] de la dernière modification EXEMPLE -- on veut récupérer (get) l'heure et la valeur de la dernière modification de la propriété 'value' du module d'ID=11. Il existe plusieurs propriétés qu'on peut récupérer ou modifier pour chaque module. La propriété 'value' peut correspondre à une température, une intensité lumineuse en %, une ouverture d'un volet en %... local valeur, HeureModification = fibaro:get(11,'value') -- en LUA, on peut ignorer la seconde valeur de retour (pas très clair) local valeur2 = fibaro:get(11, 'value') -- les valeurs obtenues peuvent ensuite être utilisées dans des scènes -- l'outil tonumber permet de convertir une variable (qui est au format chaîne (string)) en valeur numérique, afin de la comparer à une autre valeur numérique if tonumber(valeur2) >= 50 then -- si la valeur récupérée et transformée en valeur numérique est supérieure à 50 alors fibaro:call(142, 'turnOff') -- le système demande au module d'ID=142 de s'éteindre DESCRIPTION ÉTENDUE Les principales fonctions : fibaro:get(deviceID, propertyName) fibaro:getValue(deviceID, propertyName) fibaro:getModification(deviceID, propertyName) Elles sont utilisées dans les scripts de scènes pour récupérer l'état actuel des modules. La valeur récupérée doit être affectée à des variables locales afin de pouvoir utiliser des instructions conditionnelles (if, then). Voir exemple ligne 7. Ces 3 fonctions ne diffèrent que par la valeur récupérée. Notez que les valeurs récupérées sur les propriétés (propertyName), sont des variables de type ‘chaîne’ (string), ce qui signifie que, si on veut les comparer avec des valeurs numériques, il faut transformer ces variables en valeurs numériques elles aussi, grâce à la commande tonumber. Voir exemple ligne 7. Exemple concret, car l'exemple ci-dessus de la documentation Fibaro n'est pas très intéressant car pour récupérer les valeurs des propriétés des modules classiques, on peut autant utiliser la fonction fibaro:get(deviceID, propertyName) que la fonction fibaro:getValue(deviceID, propertyName). Pour récupérer l'adresse IP d'un module virtuel d'ID=126 deviceIp = fibaro:get(126, "IPAddress") -- merci à i-magin grâce à qui j'ai trouvé l'exemple là sur le forum - fibaro:getGlobal(varName) DESCRIPTION On récupère des informations (valeur et heure de la dernière modification) de la variable globale enregistrée dans le système. CARACTÉRISTIQUES varName: Le nom de la variable globale VALEURS RÉCUPÉRÉES Une chaîne contenant la valeur actuelle de la variable globale Horodatage (timeStamp) [lien Fibaro manquant pour l'explication] de la dernière modification EXEMPLE -- on veut récupérer l'heure et la valeur de la dernière modification de la variable globale appelée 'Nuit' à laquelle on a associé les valeurs '0' (jour) ou '1' (nuit), on aurait pu choisir d'autres noms comme jour et nuit directement ou oui et non... local valeur, HeureModification = fibaro:getGlobal('Nuit') -- en LUA, on peut ignorer la seconde valeur de retour (pas très clair) local valeur2 = fibaro:getGlobal('Nuit') -- les valeurs ainsi obtenues peuvent être utilisées dans des scènes if (value == '1') then fibaro:debug('Il fait nuit') end DESCRIPTION ÉTENDUE Les principales fonctions : fibaro:getGlobal(varName) fibaro:getGlobalValue(varName) fibaro:getGlobalModificationTime(varName) Elles sont utilisées dans les scripts de scènes pour récupérer l'état actuel des variables globales. La valeur récupérée doit être affectée à des variables locales afin de pouvoir utiliser des instructions conditionnelles (if then). Ces 3 fonctions ne diffèrent que par la valeur récupérée. - fibaro:getGlobalModificationTime(varName) DESCRIPTION On récupère des informations (seul l'horodatage de la dernière modification) de la variable globale enregistrée dans le système. CARACTÉRISTIQUES varName: Le nom de la variable globale VALEURS RÉCUPÉRÉES Horodatage de la dernière modification de la variable globale. EXEMPLE -- on veut récupérer la date de la dernière modification de la variable globale nommée 'compteur' local DerniereModif = fibaro:getGlobalModificationTime('compteur') -- si la valeur de cette variable globale a été modifiée il y a plus de 10 secondes if os.time() - DerniereModif >= 10 * 1000 then fibaro:debug('La modification a eu lieu il y a plus de 10s') else fibaro:debug('La modification a eu lieu il y a moins de 10s') VOIR AUSSI fibaro:getGlobal fibaro:getGlobalValue - fibaro:getGlobalValue(varName) DESCRIPTION On récupère des informations (seule la valeur) de la variable globale enregistrée dans le système. CARACTÉRISTIQUES varName: Le nom de la variable globale VALEURS RÉCUPÉRÉES Une chaîne contenant la valeur actuelle de la variable globale. EXEMPLE -- on veut récupérer la valeur de la variable globale nommée 'compteur' local ValeurCompteur = fibaro:getGlobalValue('compteur') VOIR AUSSI fibaro:getGlobal fibaro:getGlobalModificationTime - fibaro:getModificationTime(deviceID, propertyName) DESCRIPTION On récupère des informations (seule l'horodatage de la dernière modification) sur les propriétés d'un module. CARACTÉRISTIQUES deviceID: numéro d'identité du module propertyName: nom de la propriété VALEURS RÉCUPÉRÉES Horodatage des dernières modifications de propriétés du module. EXEMPLE -- on veut récupérer la date de la dernière modification de la propriété 'value' du module d'ID=11, exemple l'heure à laquelle la lampe a changé d'intensité local HeureModif = fibaro:getModificationTime(11, 'value') -- os.time() correspond à l'horodatage au moment de la lecture du script if os.time() - HeureModif >= 10*1000 then -- si la différence de temps entre le moment où le script est lu et le moment de la dernière modification est supérieur à 10s alors fibaro:debug('La dernière modification de la valeur date de plus de 10s') else fibaro:debug('La dernière modification de la valeur date de moins de 10s') - fibaro:getRoomID(deviceID) DESCRIPTION On récupère le numéro de la pièce dans laquelle se trouve le module. CARACTÉRISTIQUES deviceID: numéro d’identité du module VALEURS RÉCUPÉRÉES RoomID: Numéro qui identifie la pièce dans laquelle se trouve le module (Le RoomID de la pièce sans nom ‘non assigné’ est 0) EXEMPLE -- on veut récupérer le numéro d'identité de la pièce dans laquelle se trouve le module d'ID=9 local Piece = fibaro:getRoomID(9) -- on demande au système de récupérer (get) l'identité de la pièce (RoomID) où se trouve le module d'ID=9 et on stocke cette valeur dans la variable qu'on appelera Piece if Piece == 0 then fibaro:debug('Le module se trouve dans la pièce \’non assigné\’') else fibaro:debug('Le module se trouve dans la pièce d\’ID '..Piece) VOIR AUSSI fibaro:getSectionID fibaro:getType - fibaro:getSectionID(deviceID) DESCRIPTION On récupère le numéro d’identité de la section dans laquelle le module est situé. CARACTÉRISTIQUES deviceID: numéro d’identité du module VALEURS RÉCUPÉRÉES SectionID : numéro de la section dans laquelle l'appareil est situé (le SectionID de la section sans nom ‘non assigné’ est 0) EXEMPLE -- on veut récupérer le numéro d'identité de la section dans laquelle se trouve le module d'ID=9 local Section = fibaro:getSectionID(9) -- on demande au système de récupérer (get) l'identité de la section (SectionID) où se trouve le module d'ID=9 et on stocke cette valeur dans la variable qu'on appelera Section if Section == 0 then fibaro:debug('Le module se trouve dans la section \’non assigné\’' else fibaro:debug('Le module se trouve dans la section '..Section) VOIR AUSSI fibaro:getRoomID fibaro:getType - fibaro:getSourceTrigger() DESCRIPTION On récupère les informations sur l’origine du trigger (déclencheur) qui a démarré la scène automatiquement. CARACTÉRISTIQUES Aucune VALEURS RÉCUPÉRÉES Des informations sur le « type » de déclenchement qu’on peut classer dans un tableau. Selon le déclenchement, le « type », peut avoir ces 3 valeurs: ‘property’ - scène déclenchée par la modification d'une propriété d'un module ‘global’ - scène déclenchée par la modification d'une variable globale ‘other’ - dans les autres cas (scène lancée directement grâce à un autre script ou en manuel depuis l'interface par l'utilisateur) Selon la valeur du « type » de déclenchement, la table peut encore avoir des champs supplémentaires, qu'on pourra également récupérer. DESCRIPTION ÉTENDUE Cette fonction peut être utilisée pour déterminer l’origine directe du déclenchement du script. En début de script, dans l’en-tête, on définit les paramètres déclencheurs qui peuvent causer l’exécution du script. Sans cet en-tête rempli correctement, le script ne s’exécutera pas automatiquement. Grâce à la fonction fibaro:getSourceTrigger() on peut récupérer plusieurs éléments en rajoutant derrière : ['type'],['deviceID],[propertyName] ou [varName] : - Le 'type' de l'origine du déclenchement de la scène. On récuperera une des valeurs suivantes: property: si lancement auto de la scène grâce à une modification d'une propriété d'un module global: si lancement auto de la scène grâce à une modification d'une variable globale other: si déclenchement manuel de la scène par l'utilisateur ou depuis une autre scène - 'deviceID' est le numéro d'identité du module surveillé dans l'entête, qui est à l'origine du déclenchement automatique de la scène. - 'propertyName' est le nom de la propriété d'un module surveillé dans l'entête, qui a vu sa valeur changer et qui est à l'origine du déclenchement automatique de la scène. Par exemple une modification de la propriété 'value' quand un éclairage change d'intensité, ou qu'un radiateur se met en route etc, de la propriété 'baterryLevel' quand un module fonctionnant avec pile atteint un certain niveau de batterie, de la propriété 'armed' quand un module comme le capteur d'ouverture de porte est armé au moment de votre départ au travail et que cela démarre la scène qui vous préviendra par notification si la porte s'ouvre et que personne n'a désarmé le module... - 'varName' est le nom de la variable qui a vu sa valeur changer et qui est à l'origine du déclenchement automatique de la scène. Exemple on a crée une variable globale 'SAISON' qui peut prendre la valeur ETE ou HIVER. Quand on modifie cette saison via un module virtuel par exemple, une scène qu'on aura crée auparavant va se lancer automatiquement pour mettre les radiateurs en fonctionnement ou à l'arrêt suivant la saison indiquée. EXEMPLE Démarrage auto de la scène si : Changement de la propriété ‘value’ du module 13 Changement de la propriété ‘value’ du module 15 Changement de la variable globale 'JourNuit’ En outre, le script peut être exécuté directement à partir de l'interface ou en utilisant une autre scène (voir Fibaro: runScene (sceneID)). Lorsque le script est exécuté, il affiche les informations de débogage de la console sur l’origine de son exécution. --[[ %% properties 13 value 15 value %% globals JourNuit --]] local OrigineDeclenchement = fibaro:getSourceTrigger() -- on demande au système de récupérer (get) l'origine (Source) du déclenchement de la scène (Trigger) if OrigineDeclenchement['type'] == 'property' then -- si l'origine du déclenchement de la scène est la modification d'une propriété d'un module surveillée dans l'entête alors fibaro:debug('L\’ origine est la modification d\’une propriété du module '..OrigineDeclenchement['deviceID']) elseif OrigineDeclenchement['type'] == 'global' then -- sinon si l'origine du déclenchement de la scène est la modification d'une variable globale surveillée dans l'entête alors fibaro:debug('L\’ origine est la modification de la variable globale '..OrigineDeclenchement['varName']) elseif OrigineDeclenchement['type'] == 'other' then -- sinon si l'origine du déclenchement de la scène est autre alors fibaro:debug('La scène a été lancée manuellement') end VOIR AUSSI fibaro:getSourceTriggerType() - fibaro:getSourceTriggerType() DESCRIPTION On récupère des informations sur la valeur du « type » du déclencheur qui a causé la scène. CARACTÉRISTIQUES Aucune VALEURS RÉCUPÉRÉES Une chaîne (string) contenant la valeur du « type » du déclencheur (voir fibaro: getSourceTrigger () ) EXEMPLE -- on veut vérifier si la scène a été lancée manuellement if fibaro:getSourceTriggerType() == 'other' then -- si la fonction qui récupère (get) le type (Type) de l'origine (Source) du déclencheur (Trigger) est 'other' alors fibaro:debug('La scène a été lancée manuellement') end -- on a vu au dessus que la même chose peut être obtenue en utilisant le tableau précédent avec l'utilisation de getSourceTrigger() et en se référant au champ 'type' local OrigineDeclenchement = fibaro:getSourceTrigger() if OrigineDeclenchement['type'] == 'other' then fibaro:debug('La scène a été lancée manuellement') VOIR AUSSI fibaro:getSourceTrigger() - fibaro:getType(deviceID) DESCRIPTION On récupère le type de l'appareil. Les différents types d'appareils sont référencés ici PARAMàˆTRES deviceID: numéro d’identification du module VALEURS RÉCUPÉRÉES Une chaîne contenant le type du module EXEMPLE -- on veut récupérer le 'type' du module d'ID=100 local TypeModule = fibaro:getType(100) -- on récupère (get) le type (Type) du module d'ID=100 et on stocke le résultat dans la variable qu'on appelle 'TypeModule' if TypeModule == 'blind' then -- si le module commande un volet roulant alors fibaro:debug('Le module commande un volet roulant') else fibaro:debug('Type du module : '..TypeDispositif) -- sinon la fonction debug indique directement le type du module end VOIR AUSSI fibaro:getRoomID fibaro:getSectionID - fibaro:getValue(deviceID, propertyName) DESCRIPTION On récupère des informations (uniquement la valeur) d'une propriété d'un module. PARAMàˆTRES deviceID: numéro d’identification du module propertyName: nom de la propriété VALEURS RÉCUPÉRÉES une chaîne contenant la valeur actuelle de la propriété voulue EXEMPLE -- on veut récupérer la valeur de la 'valeur de luminosité' du module d'ID=11 local ValeurLum = fibaro:getValue(11, 'brightness') -- C'est ce qu'il y a indiqué sur le document fibaro mais la propriété brightness n'existe plus local ValeurLum = fibaro:getValue(11, 'value') -- C'est maintenant la propriété 'value' d'un dimmer qui permet de récupérer la valeur de la luminosité en pourcentage Exemple concret, une sonde de température dont on veut simplement récupérer la mesure : local TempSalon = fibaro:getValue(115, 'value') -- on demande au système de récupérer (get) la valeur (Value) de la propriété mesure de la température (value) de la sonde de température de salon (module 115) if tonumber(TempSalon) > 20 then -- si la valeur récupérée, une fois transformée en valeur numérique, est supérieure à 20 alors fibaro:call(12, 'turnOff') -- le système demande au relai 12 connecté au radiateur de se couper VOIR AUSSI fibaro:get fibaro:getModificationTime - fibaro: isSceneEnabled (sceneID) DESCRIPTION On vérifie si la scène avec un sceneID donné est active. PARAMàˆTRES sceneID: numéro d’identification de la scène VALEURS RÉCUPÉRÉES valeur booléenne: true si la scène est active, false si non active : d'après la documentation Fibaro, HORS cela ne fonctionne pas. Voir exemple 2 EXEMPLE if fibaro:isSceneEnabled(3) then -- si la scène 3 est activée cela activera la scène 5 fibaro:setSceneEnabled(5, true) end Exemple qui montre qu'on ne récupère pas la valeur true ou false local SceneActive = fibaro:isSceneEnabled(3) if SceneActive == 'true' then fibaro:debug('active') else fibaro:debug('inactive') end Que la scène soit active ou pas, le débogage indiquera inactive. Dans l'exemple précédent on ne pourrait donc pas activer la scène 5 si la scène 3 est inactive... VOIR AUSSI fibaro:setSceneEnabled(sceneID, enabled) - fibaro:killScenes(sceneID) DESCRIPTION On termine toutes les instances en cours d’exécution d'une scène donnée. (On se rappelle que le système peut lire plusieurs fois en même temps un script déjà en cours de lecture) PARAMàˆTRES sceneID: numéro d’identification de la scène VALEURS RÉCUPÉRÉES Aucune EXEMPLE -- si la valeur de 'a' est comprise dans l'intervalle [1;5], toutes les lectures en cours de la scène d'ID=2 s'arrêtent if a >= 1 and a <= 5 then fibaro:killScenes(2) VOIR AUSSI fibaro: startScene (sceneID) fibaro: countScenes () fibaro: countScenes (sceneID) - fibaro:setGlobal(varName, value) DESCRIPTION Modifie la valeur d'une variable globale. PARAMàˆTRES varName: le nom de la variable globale value: la nouvelle valeur de la variable globale VALEURS RÉCUPÉRÉES Aucune EXEMPLE -- on veut attribuer la valeur de 1 à une variable globale nommée 'index' fibaro:setGlobal('index', 1) -- on veut augmenter de 3 la valeur de la variable globale nommée 'test' fibaro:setGlobal('test', fibaro:getGlobalValue('test') + 3) -- on veut assigner à la variable globale nommée 'index', la valeur de la variable locale 'a' local a = 10 * 234 fibaro:setGlobal('index', a) DESCRIPTION ÉTENDUE La fonction fibaro:setGlobal(varName, value) ne peut être utilisée que pour les variables globales qui ne sont pas des variables en lecture seule. Si vous essayez de remplacer la valeur d’une variable en lecture seule, un avertissement sera généré et l'opération ne sera pas effectuée (pas clair). - fibaro:setSceneEnabled(sceneID, enabled) DESCRIPTION Active ou désactive une scène donnée. PARAMàˆTRES sceneID: numéro d’identification de la scène enabled: valeur booléenne (true - active la scène, false - désactive la scène) VALEURS RÉCUPÉRÉES Aucune EXEMPLE if a > 0 then fibaro:setSceneEnabled(3, false) -- si la valeur de la variable 'a' est positive, cela désactive la scène d'ID=3 else fibarosetSceneEnabled(3, true) -- sinon cela active la scène d'ID=3 end VOIR AUSSI fibaro:isSceneEnabled(sceneID) - fibaro:sleep(time) DESCRIPTION On suspend l'exécution du script pendant le temps spécifié en millisecondes. PARAMàˆTRES time: le temps en millisecondes VALEURS RÉCUPÉRÉES Aucune EXEMPLE -- on suspend la lecture du script pendant 10 secondes fibaro:sleep(10000) -- comme les durées doivent être indiquées en millisecondes, pour plus de compréhension on peut écrire fibaro:sleep(10 * 1000) - fibaro:startScene(sceneID) DESCRIPTION On veut démarrer l’exécution d'une scène donnée. PARAMàˆTRES sceneID: numéro d’identité de la scène qui doit être lancée VALEURS RÉCUPÉRÉES Aucune EXEMPLE if a > 20 then fibaro:startScene(10) -- si la valeur de 'a' est supérieure à 20, on démarre l'exécution de la scène d'ID=10 end
    18 points
  10. @flamalex a fait une modification au code car problèmes à partir du firmware v'.140ou v 4.145. Il l'a baptisée v2, mas comme on était déjà à v5.4, je l'ai rebaptisé v6.0. My_Batteries_v6.2.vfib My_Batteries_v6.1.vfib My_Batteries_v6.0.vfib --------------------------------------------------------------------------------------------------------------- My Batteries Ce virtual device permet de visualiser le niveau des batteries de l'ensembles de vos appareils sur batterie (max 10). Il est TRES largement inspiré du travail initial de Steven http://www.domotique-fibaro.fr/index.php/topic/1710-my-batteries/ Merci également à Moicphil qui m'a énormément aidé pour debugger la partie v4.x Les modifications que j'y ai apportées : modification de l'affichage, avec moment du dernier check automatique incorporation des supers icônes de @couillerot firmware 4.x push si batterie sous un certain niveau Voici la dernière version du VD : My_Batteries_v5.4.vfib Et les codes : MyBatteries.Batteries.lua MyBatteries.MainLoop.lua
    17 points
  11. J'avais donc un soucis avec ce FGS-221 où le relais de la sortie 1 restait bloqué en position allumée, le retour d'état dans l'interface web de la HC2 répondait bien aux commandes On/Off (ou de l'entrée S1) mais la lampe restait continuellement allumée. Le fait de tapoter sur le module avec le manche d'un petit tournevis arrivait à débloquer le contact du relais. Ce dysfonctionnement avait lieu aléatoirement trois ou quatre fois dans l'année mais ce week-end, j'ai dà» faire cette manip trois fois. Le relais allait définitivement rendre l'âme, mais il reste une solution pour ne pas transformer ce FGS-221 en 211. Le dépannage est assez facile à réaliser et nécessite un cutter, un fer à souder (30W maxi), une pompe à dessouder (ou mieux, un fer à dessouder), un peu d'étain et le plus important: le petit relais Relpol. Je précise que mon module est en v2.1 donc le relais est un modèle 12V (Référence: RM40-3021-85-1012) dispo ici: http://www.tme.eu/fr/details/rm40-z-12/relais-electromagnetiques-miniatures/relpol/rm40-3021-85-1012/# mais les FGS plus anciens en v1.9 étaient équipés de modèle 5V(Référence: RM40-3021-85-1005) dispo ici: http://www.tme.eu/fr/details/rm40-z-05/relais-electromagnetiques-miniatures/relpol/rm40-3021-85-1005/# Cette manipulation ne concerne pas les tout récents FGS-212 et 222. Pour commencer, il faut fendre le coin inférieur droit (à côté de S1 à la base du bornier) avec la lame du cutter, pas la pointe car elle risque de riper et attention aux doigts. Une fois la lame engagée, il suffit de remonter le long jusqu'à l'antenne et fendre légèrement en haut au centre de l'arrondi pour séparer les coques supérieure et inférieure. Pas besoin de faire le tour complet, en écartant les deux coques, le module devrait sortir. Le relais pour la sortie 1 est celui de gauche (toujours avec le bornier en bas) donc en retournant le module, cela se présente comme ça. Ensuite, après avoir aspiré la soudure sur les quatre points (repérés en rouge pour la sortie O1) à l'aide du fer à dessouder, le relais peut être retiré comme ceci. Puis on le remplace par le nouveau et, après avoir attendu le refroidissement du fer, je remets la panne pour refaire les quatre soudures. Voici le résultat: Reste un petit point de colle super glue sur le côté et au milieu de l'arrondi et le module est remis en service sans même avoir perdu ses numéros d'Id. On peut aussi, en déportant l'alimentation de la bobine par deux petits fils vers l'extérieur du module, le raccorder à un relais (avec bobine 12V DC) pour avoir, par exemple, deux contacts totalement indépendants (O2 sur le module et plus rien sur O1 puisque déporté vers le relais) ou même avec de plus gros pouvoir de coupure comme je l'ai fait avec mon chauffe-eau. Voilà mes quelques idées de recyclage pour vos FGS qui battent de l'aile.
    16 points
  12. Note : la gestion des sauvegardes/restaurations/recovery a été totalement modifiée à partir des firmwares v4.500, par conséquent les informations de cette page ne sont pas à jour. Sauvegarde L'onglet Configuration de l'interface Web de la HC2 permet de réaliser manuellement une sauvegarde de la configuration courante sur la clé USB Recovery. De plus, une sauvegarde est effectuée automatiquement avant chaque mise à jour (précisons toutefois que la mise à jour est un processus déclenché manuellement par l'utilisateur dans le panneau Configuration) La sauvegarde contient : la base de données SQLite (définition de tous les modules/périphériques-virtuels/plugins et de leurs paramètres, historique des événements/températures/consommations, etc...) le dump de la puce Z-Wave (modules Z-Wave inclus) les scènes (car leurs codes LUA ne sont pas stockés dans la DB) La sauvegarde ne contient pas : les icônes (elles sont perdues après un recovery) le système (Linux et applications Fibaro) Recovery Le Recovery permet de réinstaller complètement sa box, c'est à dire réinitialiser complètement avec les paramètres usines. Selon les générations de box, le recovery réinstalle complètement la box en v1.x ou v3.548. Il s'agit de la version qui était installée lors de la livraison de la box neuve. Le Recovery est utile dans les cas suivants : Box instable ou complètement crashée Volonté de revenir à une version précédente Volonté de se refaire une réinstallation propre en repartant de 0 Revente de la box Pour accéder au Recovery, il faut éteindre la box, puis appuyer sur le bouton dédié à l'arrière de la box tout en appuyant sur le bouton Power. Selon si on relâche tout de suite le bouton Recovery ou si on laisse le doigt appuyé durant toute la phase de boot, la box prend une adresse IP automatique en DHCP sur le réseau, ou se mettra en IP fixe 192.168.81.1 (auquel cas il faudra paramétrer manuellement la carte réseau de son ordinateur pour accéder à la box). Lorsque la box est bootée en mode Recovery, l'interface Web présente un panneau spécial permettant de lancer la procédure. Cette réinstallation est irréversible et tout ce qui n'a pas été préalablement sauvegardé sur la clé sera perdu. La clé USB Recovery contient une image du système, donc la mémoire interne de la box est effacé, et réécrit à partir de l'image présente sur la clé Recovery. Le second écran propose de réinitialiser également la puce Z-Wave, ce qui est généralement recommandé. De toutes façons, le contenu de la puce Z-Wave sera restauré par la sauvegarde effectuée précédemment (si vous choisissez de la restaurer bien sûr) : Lorsque le recovery est terminé, la box reboote toute seule en mode normal, et l'interface Web de base est à nouveau accessible, avec le compte admin/admin par défaut. La première étape à réaliser sera de mettre à jour la box, en une ou plusieurs étapes selon si l'on souhaite remonter en v3.6 ou v4.x. Restauration La restauration permet de récupérer une sauvegarde préalablement réalisée sur la clé Recovery. Donc les paramètres suivants seront restaurés : la base de données SQLite le contenu de la puce Z-Wave les scènes Les paramètres suivants ne seront pas restaurés : les icônes le système La restauration s'effectue depuis l'interface Web : La restauration peut être lancée juste après un Recovery, ou pas. C'est à dire que l'on peut très bien lancer une restauration par dessus la configuration courante, par exemple si l'on vient d'effectuer quelques modifications qui ont rendu le système instable, sans qu'un recovery soit nécessaire. Puisque qu'une sauvegarde contient le dump de la puce Z-Wave, alors après la restauration il est inutile de réinclure tous les modules inclus avant la date du backup. Il ne sera nécessaire de réinclure que les modules inclus après le dernier backup. Idéalement, on ne fait que des restaurations de configuration à la même version que la version courante. De toutes façons, l'interface Web nous empêche de restaurer une ancienne version qui ne serait pas compatible avec la version courante (notamment entre la v3 et la v4 car les différences sont importantes) Cependant, parfois suite à une mise à jour, la configuration devient instable (modules qui disparaissent de l'interface, etc...). Dans ce cas là , et si on ne souhaite pas se lancer dans une longue procédure de recovery, on peut tenter une restauration de la version précédente. Par exemple : Je fais la mise à jour 4.037 vers 4.040. Des problèmes surviennent, alors je décide de restaurer la configuration 4.037 par dessus mon système qui est en 4.040. A la fin de la restauration, l'interface affiche 4.037, pourtant le système fonctionne toujours en 4.040 (car on l'a vu précédemment, la sauvegarde/restauration ne stocke que la configuration courante, et pas le système). Cet état est dû au code employé par Fibaro qui stocke ne numéro de version courante dans la DB. Donc quand l'interface Web affiche la version, elle va chercher l'info dans la DB, qui n'est plus en phase avec le système. En effet, la mise à jour du champs dans la DB se fait lors de l'install de la mise à jour. De plus, il faut savoir que certaines mises à jour apportent des modifications de schéma à la base de données, et l'ajout de templates de modules Z-Wave. Par conséquent, après la restauration de configuration 4.037, je force une nouvelle mise à jour 4.040, qui ne changera rien au niveau système (puisqu'il est déjà à jour), mais cela permettra de remettre la bonne version dans la DB, et appliquer les éventuelles modifications de schéma. Note : si le bouton de mise à jour n'apparait pas, il est possible de la forcer en appelant directement l'adresse http://IP/services/startUpgrade.php Checksum En v4, une nouvelle fonctionnalité est apparue dans l'interface, permettant de calculer le checkum de l'image de restauration du système présent sur la clé USB Recovery : Il est fortement recommandé de lancer ce calcul de checksum avant de se lancer dans un recovery de la box, afin de s'assurer que l'image est encore valide. En effet, les clés USB sont composées de mémoire Flash qui ne sont pas infaillibles. Pour aller plus loin Afin de sécuriser la clé USB Recovery, vous trouverez (ou devinerez) toutes les réponses à la lecture de mon autre sujet HC2 Recovery Tweaks. [Tuto HC2] HC2 USB Recovery Tweaks Ou pour simplifier, en attendant que Fibaro implémente la fonctionnalité de backup sur un serveur tiers (à priori dans le cloud, je ne suis pas du tout certain qu'ils nous laissent la possibilité de faire du FTP/NFS/CIFS local), vous pouvez simplement arrêter la box, brancher la clé sur un PC, et recopier le répertoire backups. Voir le tutoriel de @mprinfo : [Tuto HC2] Faire Une Copie De La Clef Usb Recovery Sous Windows
    16 points
  13. Bonjour a tous, voici un modeste petit tuto pour envoyer des notifications en LUA sur une HC3 Notification Simple Explication Les notification simples peuvent être envoyés par push ou par email à un ou plusieurs utilisateurs. Il s'agit uniquement d'une information pour le/les utilisateurs. Aucune réponse n'est possible. Paramètres Cette commande comprend 3 paramètres: Type de notification push: envoyé par notification push sur les appareils mobiles configurés dans le menu accès. email :envoyé à l'adresse email associée à l'utilisateur sélectionné. Utilisateur sélectionné Un ou plusieurs utilisateurs peuvent être sélectionés. Pour cela il est nécessaire de récupérer l'ID de l'utilisateur désiré dans le menu Accès du Home center Il faut ensuite le mettre sous la forme suivante [numéro] = ID utilisateur, ou numéro correspond au nombre d'utilisateurs désirés. Message Pour finir il faut indiquer le message à afficher dans la notification Exemple Example 1 (push) Dans cet exemple on envoie une notification push à 2 utilisateurs avec les ID 2 et 809 avec le message "Alarme déclanchée" fibaro.alert('push', {[1] = 2, [2] = 809, }, 'Alarme déclanché') Example 2 (Email) Dans cet exemple on envoie une notification push à 1 utilisateur avec l'ID 809 avec le message "Fausse Alarme" fibaro.alert('email', {[1] = 809, }, 'Fausse Alarme') Notification Interactive Explication Les notifications interactives ne peuvent être envoyées que par push à un ou plusieurs appareils mobiles et nécessite une réaction de l'utilisateur choisit. Paramètres Catégorie (["category"]) RUN_CANCEL : L'utilisateur aura le choix entre les réponse Run et Cancel YES_NO : L'utilisateur aura le choix entre les réponse Yes et No Titre (["title"]) Ce paramètre contiendra le titre de la notification envoyé Catégorie (["mobiledevice"]) Il est possible d'envoyer la notification à un ou plusieurs appareils. Il faut pour cela sélectionner les appareils désirés dans le menu accès du Home center. Il faut ensuite le mettre sous la forme suivante [numéro] = ID appareil, ou numéro correspond au nombre d'appareils désirés. Données(["data"]) Il s'agit de l'action effectuée lorsque l'utilisateur répond Yes ou Run. Si l'action est sur un module: ["actionName"] = "turnOn", ["deviceId"] = 545, Si l'action est sur une scène: ["sceneId"] = 133, Message(["message"]) Correspond au message indigué dans la notification. Action(["action"]) Détermine le type d'action à effectuer en fonction de si l'action se fait sur un module ou sur une scène RunAction : Si l'action est sur un Module Run : Si l'action est sur une scène Service(["service"]) Permet de définir si l'action sera sur un module ou sur une scène Device : Si l'action est sur un Module Scene : Si l'action est sur une scène Exemple Exemple 1: activation d'une lumière Dans cet exemple on demande à l'utilisateur si il désire activer une lampe lorsque le mauvais code d'entrée est tapé. api.post("/mobile/push", { ["category"] = "YES_NO", ["title"] = "Alarme code entrée", ["mobileDevices"] = {[1] = 822, }, ["data"] = {["actionName"] = "turnOn", ["deviceId"] = 545, }, ["message"] = "Mauvais code entré", ["action"] = "RunAction", ["service"] = "Device", }) Exemple 2: Démarage d'une scène Dans cet exemple on demande à l'utilisateur si il désire lancer une scène lorsque le mauvais code d'entrée est tapé. api.post("/mobile/push", { ["category"] = "RUN_CANCEL", ["title"] = "Alarme code entrée", ["mobileDevices"] = {[1] = 822, }, ["data"] = {["sceneId"] = 133, }, ["message"] = "Mauvais code entré", ["action"] = "Run", ["service"] = "Scene", })
    15 points
  14. Bonjour à tous, Puisque je sens que beaucoup s'impatientent en attendant la fonction plugin utilisateur je vais vous donner l'astuce pour pouvoir le faire. 1) Installer le plugin Postman - REST Client dans votre Navigateur Chrome. Voici la doc pour savoir lancer le plugin. 2) Une fois l'inteface lancé, aller dans l'onglet "Basic Auth" puis saisissez vos identifiants 3) Saisir l'URL de l'API Plugins Fibaro en remplaçant par votre IP dans le texte qui suit : http://192.168.123.123/api/plugins/install 4) Changer le type de requête HTTP de GET en POST dans la liste déroulante à droite de l'URL. 5) Saisir le nom de clé "overwrite" dans la première de la premier ligne "Key/Value" avec comme "Value" le chiffre !1 (Ce permet de pouvoir écraser la version déjà existante si elle existe) 6) Saisir le nom de clé "file" pour la seconde ligne. Changer le type de clé de "Texte" en "File" et sélectionner le fichier à envoyer sur le HC2. Je prend comme exemple fsms-0.0.3.zip à télécharger ici. 7) Cliquer sur le bouton "Send" 8) L'envoi est terminé avec le retour suivant : { "type": "com.fibaro.developer.bxs.FreeSMS", "category": "other", "categoryId": 2 } Si vous avez une erreur : - 401 Unauthorized --> Les identifiants fournis sont incorrects - 400 Bad Request --> Le contenu de l'erreur est affiché plus bas. Exemple : { "type": "ERROR", "reason": "FileNotUploaded", "message": "The request doesn't contain expected file" } Il est possible de le supprimer dans l'interface web via l'onglet "Plugins. Si vous êtes généreux, les votes du membre du mois De Mai sont toujours ouverts. Bon weekend développement à tous
    15 points
  15. Après longue absence voici un petit script permettant d’utiliser sur notre HC2 le service de trafic et de navigation communautaire WAZE (https://www.waze.com/fr/) Le principe du script est très simple : 1 scène pour interroger l’ API Waze pour tous les trajets parametrés et autant de vd qui seront mis à jour par la dite scène.] 1 - Installation Importer le vd HC2_Waze_Calculator.vfib sur le HC2, 1x pour un trajet, 2x pour deux etc... Créer la scène HC2 Waze Calculator cf. fichier HC2 Waze Calculator Scene.txt puis passer au paramètrage 2 - Paramétrage Configurer l'object params: nom, id du vd cible, polling, latitude, longiture etc... pour tous les trajets. Pour trouver les coordonnées GPS, latitude et longitude il existe les services : www.coordonnees-gps.fr, www.torop.net/coordonnees-gps.php, www.gpsfrance.net etc. local params = { { name = "Trajet 1", virtualDeviceId = 1449, from = { name = "Palais de l'Élysée", x = 2.3167538999999806, -- longitude y = 48.8704156 -- latitude }, to = { name = "Théâtre Guignol", x = 2.311747670173645, -- longitude y = 48.86977710077997 -- latitude }, pollingMs = 60*1000 }, { name = "Trajet 2", virtualDeviceId = 1452, from = { name = "Palais de l'Élysée", x = 2.3167538999999806, -- longitude y = 48.8704156 -- latitude }, to = { name = "Théâtre Guignol", x = 2.311747670173645, -- longitude y = 48.86977710077997 -- latitude }, pollingMs = 5*60*1000 } } 4 - Icône Merci à Moicphil de m’avoir suggéré la chose et aussi pour son icône tip-top Fichier du vd: HC2_Waze_Calculator.vfib Fichier de la scène: HC2 Waze Calculator Scene.txt
    15 points
  16. Test du Fibaro SWIPE avec la HC2 . Je vous propose le premier test sur ce nouveau module fabriqué par FIBARO...le SWIPE. Déballage et aperçu du matériel : Packaging impeccable, comme à l'accoutumée chez Fibaro Ici, à coté d'un Wall-plug, pour vous donner une idée de l'encombrement : Posé sur son support : Installation : Pour le premier démarrage, rien de plus simple, commencer par soulever la protection, qui est aimantée. Trés pratique si l'on souhaite changer souvent de photo de fond. Ensuite , tirez vers le bas pour décrocher le capteur de mouvement Vous aurez alors accès maintenant à l'emplacement des piles. Retirer la languette afin de mettre sous tension le matériel : Pour information, voici la vue arrière du capteur de mouvement : Une fois le module alimenté, une série de bips discrets se font entendre. C'est tout à fait normal, vous pouvez maintenant remonter l'ensemble, le matériel est prêt à être inclus à votre contrôleur. Mise en service et paramétrage : Ce test a été réalisé sur Home Center 2 avec Firmware V4.080 Comme d'habitude lors d'un ajout d'un nouveau module à la HC2, commencer auparavant par une "suppression". La procédure d'inclusion / suppression est un peu différente par rapports à la majeure partie des modules z-wave car sur cet appareil, Il n'y a aucun bouton physique. Pour l'inclusion, et ceci étant bien détaillé dans la notice fournie, procéder comme suit : Approcher la main devant le Swipe et la maintenir en position. Attendre une série de bips, puis au double bip, éloigner la main et faite un mouvement de la main vers le haut Pour info : 1 bip : réveil du module / 2 bips : inclusion,suppression / 3 bips : reset du module Inclusion en cours : Une fois inclus, vous devriez voir dans la pièce " non assigné " votre nouveau matériel : En cliquant sur " avançé ", vous avez maintenant accès au paramétrage des diverses actions possibles Un peu à la manière des " magic scène ", il va falloir choisir une ou des actions pour les gestes souhaités : Les mouvements " ronds" ne sont opérationnels pour le moment. Pour le test, j'ai donc créé 2 scènes...une activant une lumière, et l'autre la désactivant : Voilà , mes 2 scènes sont crées en 1 minute seulement : Paramètres optionnels disponible dans la configuration avancée : Tests de réactivité : Une vidéo valant mieux qu'un long discourt, voici un aperçu de la réactivité du module lors des gestes : https://youtu.be/c7X1cviwSVA Test de portée : 2ieme vidéo, et là je dois dire que j'ai été bluffé...je ne pensais pas que le Swipe détecterait mes mouvement. J'ai scotché le Swipe sous le plan de travail de mon bar ( épaisseur 42mm ) ...ça fonctionne toujours https://youtu.be/WV4CCo6i-5M Le Swipe et le LUA Il est aussi possible d'utiliser les fonctions du Swipe dans nos scripts LUA ( merci Krikroff ) exemple pour incrémenter / décrémenter en utilisant les gestes Haut / Bas --[[ %% properties %% events 301 CentralSceneEvent 1 Pressed 301 CentralSceneEvent 2 Pressed %% globals --]] local trigger = fibaro:getSourceTrigger() if (trigger["type"] ~= "other") then local id = trigger.event.data.keyId local old = fibaro:getValue(278, "value") if (id==1) then -- UP print('up') fibaro:call(278, "setValue", old + 10) elseif (id==2) then -- DOWN print('down') fibaro:call(278, "setValue", old - 10) end end Pour droite et gauche il faut utiliser : --[[ %% properties %% events 301 CentralSceneEvent 3 Pressed 301 CentralSceneEvent 4 Pressed %% globals --]] Pour la détection d'un geste circulaire, le principe est le même il faut juste au préalable activer la fonctionnalité à l'aide du paramètre N°10 "scenes for clockwise circular gesture enabled" et / ou "scenes for counter-clockwise circular gesture enabled" Nous pouvons alors utiliser par exemple pour la détection d'un geste circulaire dans le sens des aiguilles d'une montre: --[[ %% properties %% globals %% events 301 CentralSceneEvent 5 HeldDown --]] Conclusion : Trés bonne surprise. Un design sobre et un fonctionnement impeccable de prime abord. La portée du capteur est excellente ( j'avais peur de devoir "coller" la main au module pour pouvoir lancer mes commandes ) Certe, je n'ai pas tout testé encore, reste les mouvement combinés et les mouvements de rotation. Pour ma part, il est adopté et prendra place derrière la cloison de ma salle de douche afin de piloter les playlist et le volume sur la Sonos Play1 de la salle de bain. Un grand merci à l'équipe Domadoo pour le prêt du matériel. Disponible dés à présent : http://www.domadoo.fr/fr/peripheriques/3423-fibaro-controleur-gestuel-z-wave-swipe-blanc-fggc-001-5902020528821.html
    15 points
  17. Oui rien de compliqué, lua est de plus haut niveau, les lib matheuses sont inclues donc c'est simple Faites moi un VD aux petits oignons svp
    15 points
  18. Bonjour à tous, je ne suis certainement pas le seul à déplorer la "qualité" douteuse et la manque de diversité de certains icons (les zones) de notre interface préférée. De par mes connaissances très, très limitées en domotique z-wave (je suis un newbie de chez newbie!), je veux malgré tout apporter ma pierre à l'édifice sur ce forum de passionnés en créant quelques icons un peu plus sympas que ceux d'origines... je ne dis pas que j'y arriverais mais bon je peux toujours essayer! Ci-dessous le lien pour accéder à la galerie des Icônes que j'ai réalisé : http://www.domotique-fibaro.fr/index.php/topic/1588-banque-icones-hc2-et-hcl/page-12?p=31383 Je vous invite également à parcourir ce thread pour découvrir d'autres icônes réalisés par d'autres membres très talentueux Bonne visite! Stef -- Mise à Jour des icons 2021 --
    14 points
  19. GEA Gestionnaire d’Événements Automatique Version 7.38 Voici le célèbre GEA de @Steven porté sur Home Center 3. Cette version de GEA est basée sur la version 6.13, les fonctionnalités sont donc identiques, à quelques différences près documentées plus bas. Ce n'est plus une scène, mais un QuickApp. La notion d'instances multiples des scènes n'a plus lieu d'être, car le QuickApp est mono-instance par nature, mais son principe d'exécution asynchrone du code LUA permet d'obtenir le même résultat, à savoir : - une boucle automatique de détection des événements à intervalle régulier de 30 secondes - un déclenchement instantané sur événement (avec le paramètre -1 pour la durée) Au sujet des événements, il n'y a plus besoin (et de toute façon il n'est pas possible) de définir des triggers pour le déclenchement. C'était une opération fastidieuse, car il fallait saisir manuellement les ID des modules dans l'en-tête de la scène. Cette nouvelle version de GEA détecte donc automatiquement les triggers, et surveille les événements via l'API refreshStates. Actuellement j'ai positionné cet intervalle de surveillance à 100 ms, c'est à dire un dixième de seconde. Ce n'est donc pas de l'instantanéité absolue, mais ça ne l'était de toute façon pas sur les scènes de la HC2, et ça reste inférieur au seuil de perception humain. Pour l'instant cela n'a posé aucun problème de performance lors de mes tests.... on verra ultérieurement s'il y a lieu de faire évoluer cet intervalle. La syntaxe de GEA est strictement identique à celle de la HC2 : GEA.add( ... ) Pour cette raison, ce topic est ouvert uniquement pour les discussions concernant le développement de GEA, les nouvelles fonctionnalités, et les rapports de bugs constatés. Pour les questions sur l'utilisation et la syntaxe de GEA, se reporter au topic unique "Support GEA" où vous trouverez toute l'aide nécessaire : En clair : Une règle GEA fonctionne sur HC2, mais ne fonctionne pas sur HC3 => je viens poster ici pour qu'on puisse corriger le bug Autrement : je supprimerai les messages sans préavis, j'ai autre chose à faire que de déplacer les messages postés sur le mauvais topic... avis aux contrevenants Le topic de référence concernant la syntaxe de GEA se trouve ici, comme d'habitude : Remarque : j'ai mis à jour le fichier de référence GEA_Syntaxe à télécharger en bas de ce message. Changements de GEA pour HC3 par rapport à HC2 Supprimé : "VirtualDevice", "VD" => remplacé par "QuickApp" et "QA" "SetrunConfigScenario" => remplacé par "SetRunModeScenario" et "RunModeScene" "RebootHC2" => remplacé par "RebootHC3" "ShutdownHC2" => remplacé par "ShutdownHC3" "multiAlarm" => remplacé par "Alarm" "setMode" => remplacé par "ThermostatMode" "setThermostatSetpoint" => remplacé par "CoolingThermostatSetpoint" et "HeatingThermostatSetpoint" "ThermostatLevel" "ThermostatTime" "DebugMessage" "PluginScenario" "Popup" Ajouté : "QuickApp" | "QA" : {"QuickApp", <id_module>, <méthode>, [paramètres]} "DeviceIcon" | "CurrentIcon" : {"CurrentIcon", <id_module>, <no_icon>} "Color" | "RGB" : {"Color", <id_module>, <intensité_rouge>, <intensité_vert>, <intensité_bleu>, <intensité_blanc>} "RunModeScene" | "SetRunModeScenario" : {"RunModeScene", <id_scene>} | {"SetRunModeScenario", <id_scene>, <run_valeur>} - <run_valeur> : "manual" | "automatic" "isSceneRunning" | "RunningScene" : {"isSceneRunning", <id_scene>} "ThermostatMode" : {"ThermostatMode", <id_thermostat>, <mode>} "ThermostatFanMode" : {"ThermostatFanMode", <id_thermostat>, <fan>} "CoolingThermostatSetpoint" : {"CoolingThermostatSetpoint", <id_thermostat>, <valeur>} "HeatingThermostatSetpoint" : {"HeatingThermostatSetpoint", <id_thermostat>, <valeur>} "Profile" : {"Profile", <id_profil>} "RebootHC3" : {"RebootHC3"} "SuspendHC3" : {"SuspendHC3"} "ShutdownHC3" : {"ShutdownHC3"} "Parameter" "Climate" "Breached" "VariableQuickApp" | "VariableQA" "CustomEvent" "WOL" "httpGet" "Call" "isEvenDay" Modifié : "Armed", "Disarmed", "setArmed", "setDisarmed" => Prend l'ID de la zone Amélioré : GEA.portables = {123, "Nokia 3310"} : ID du mobile, ou nom du mobile "Email" : ID du mobile, ou nom de l'utilisateur : {"Email", <id_user>, <"Message du mail">, <"Sujet du mail">} | {"Email", <id_user>, <"Message du mail">} "Picture" : ID ou nom de l'utilisateur : {"Picture", <id_camera>, <id_user>} | {"Picture", <id_camera>, <"nom_user">} "VariableCache" : utilisable dans les règles à déclenchement instantané avec -1 (en tant que condition, actions, mais pas comme déclencheur) "Alarm" : remplace "Alarm" et "MultiAlarm" : peut contenir autant d'alarmes que voulu "Ask" : exécute une scène, une méthode d'un QuickApp, ou une action GEA Les zones d'alarme, les profils, et les zones de climat peuvent être identifiés par leur nom Note : les actions "Reboot", "Suspend", et "Shutdown" ne fonctionnent plus depuis le firmware 5.050.13... Installation Importer le fichier fqa ci-joint. Ne modifier que le contenu de config pour vos propres règles : Mise à jour Copier/coller simplement tout le contenu du fichier LUA téléchargé dans le fichier main du QuickApp. Téléchargement Nouvelle installation : GEA_v7.38.fqa Mise à jour : Fichier main : GEA v7.38.lua Fichier tools : Library - tools v2.30.lua Documentation de référence sur la syntaxe : GEA v7.38 Syntaxe.lua
    14 points
  20. à‚mes sensibles s'abstenir ..... En visite chez Mprinfo, Lazer et moi avons découvert son installation. Tout y est des modules fibaro , aeon labs, du sonos des hue un répartiteur satellite de fou et ??? ...... la box HC2 biensur. Mais qu'elle ne fut pas notre surprise de constater que Mprinfo en avait une toute petite .... d'antenne zwave
    14 points
  21. Watchdog Version 1.3 Voici une scène permettant de surveiller le fonctionnement des Scènes et Main Loop de Modules Virtuels sur Home Center 2 en version 4.x. Pour ce faire, les messages de la fenêtre de Debug sont analysés. De plus, pour les scènes uniquement, le nombre d'instances est compté. En cas de problème détecté, la scène ou le virtual device considéré est automatiquement redémarré, et une notification peut être envoyée. Copier/coller le script LUA suivant dans une nouvelle scène : --[[ %% autostart %% properties %% globals --]] -------------------------------------------------- -- Scene : Watchdog -- Author : Lazer -- Version : 1.3 -- Date : June 2017 -------------------------------------------------- -- User variables local intervalle = 60 local delay = 15*60 local watchdog = { } local userID = {} -- Email local smartphoneID = {} -- Push local sms = { ["VD_ID"] = 0, -- Virtual Device ID ["VD_Button"] = "1", -- Virtual Device Button ["VG_Name"] = "SMS" -- Global Variable Name } local debug = false -- -- Message function -- function Message(color, message) if color and color ~= "" then fibaro:debug('<span style="color:'..color..';">'..(message or '<nil>')..'</span>') else fibaro:debug(message or '<nil>') end end -- -- Notification function -- function Notification(message, param) local message = message or "<vide>" Message("yellow", "Notification : "..message) if param then for _, notif in ipairs(param) do if debug then Message("grey", notif) end -- Envoi Push if notif == "push" and smartphoneID then for _, id in ipairs(smartphoneID) do if debug then Message("grey", "Send Push smartphone ID : "..id) end fibaro:call(id, "sendPush", message) end -- Envoi Email elseif notif == "email" and userID then for _, id in ipairs(userID) do if debug then Message("grey", "Send Email user ID : "..id) end fibaro:call(id, "sendEmail", "HC2 Watchdog", message) end -- Envoi SMS elseif notif == "sms" and sms then if debug then Message("grey", "Send SMS : VD_ID="..(sms["VD_ID"] or 0).." VD_Button="..(sms["VD_Button"] or "0").." VG_Name="..(sms["VG_Name"] or "")) end fibaro:setGlobal(sms["VG_Name"], message) if sms["VD_ID"] and tonumber(sms["VD_ID"])>0 and sms["VD_Button"] and tonumber(sms["VD_Button"])>0 then fibaro:call(sms["VD_ID"], "pressButton", sms["VD_Button"]) end end end else Message("orange", "Warning : no notification options given") end end -- -- Restart function -- function Restart(type, id, restart, notification, reason) Message("blue", 'Restart '..type..'('..id..')') -- Prepare API URL local getURL = "" local putURL = "" if type:lower() == "scene" then getURL = 'http://127.0.0.1:11111/api/scenes/'..id putURL = 'http://127.0.0.1:11111/api/scenes/'..id elseif type:lower() == "vd" then getURL = 'http://127.0.0.1:11111/api/virtualDevices/'..id putURL = 'http://127.0.0.1:11111/api/virtualDevices/'..id end -- Load VD/Scene local httpClient = net.HTTPClient() httpClient:request(getURL, { success = function(response) if response.status == 200 then local jsonTable = json.decode(response.data) local name = jsonTable.name or "" if restart and restart == true then -- Add new line at end of scene lua code if type:lower() == "scene" and jsonTable.lua then jsonTable.lua = jsonTable.lua .. "\n" response.data = json.encode(jsonTable) end -- Save VD/Scene httpClient:request(putURL, { success = function(response) if response.status == 200 then Message("green", type.."("..id..") successfully restarted") Notification('Watchdog : '..type..' « '..(name or "")..' » ('..id..") a été redémarré : "..(reason or "???"), notification) else Message("red", type.."("..id..") Error : status="..tostring(response.status)) Notification('Watchdog : '..type..' « '..(name or "")..' » ('..id..") n'a pas pu être redémarré : "..(reason or "???"), notification) end end, error = function(err) Message("red", type.."("..id..") Error : "..err) Notification('Watchdog : '..type..' « '..(name or "")..' » ('..id..") n'a pas pu être redémarré : "..(reason or "???"), notification) end, options = { method = 'PUT', -- headers = { -- ["content-type"] = 'application/x-www-form-urlencoded;' -- }, data = response.data } }) else Notification('Watchdog : '..type..' « '..(name or "")..' » ('..id..") doit être redémarré manuellement : "..(reason or "???"), notification) end else Message("red", type.."("..id..") Error : status="..tostring(response.status)) Notification('Watchdog : '..type..' ('..id..") n'a pas pu être redémarré : "..(reason or "???"), notification) end end, error = function(err) Message("red", type.."("..id..") Error : "..err) Notification('Watchdog : '..type..' ('..id..") n'a pas pu être redémarré : "..(reason or "???"), notification) end, options = { method = 'GET' } }) end -- function -- -- Check function -- function Check(interval) Message(nil, "Check") -- Browse VD/Scene list local httpClient = net.HTTPClient() local elements = #watchdog for i = 1, elements do -- Initialization local countscene_found = false if debug then Message(nil, "Check : type="..watchdog[i].type.." id="..watchdog[i].id) end -- Check number of running scene instances if watchdog[i].type:lower() == "scene" and watchdog[i].count and watchdog[i].count > 0 then local countScenes = fibaro:countScenes(watchdog[i].id) if countScenes < watchdog[i].count then Message("orange", watchdog[i].type..'('..watchdog[i].id..') '..countScenes..' running instance') countscene_found = true Restart(watchdog[i].type, watchdog[i].id, watchdog[i].restart, watchdog[i].notification, countScenes..' instance') elseif debug then Message("green", watchdog[i].type..'('..watchdog[i].id..') '..countScenes.." running instance") end end if countscene_found == false then -- Do not enter this loop if scene has already been restarted -- Prepare API URL local getURL = "" if watchdog[i].type:lower() == "scene" then getURL = "http://127.0.0.1:11111/api/scenes/"..watchdog[i].id.."/debugMessages" elseif watchdog[i].type:lower() == "vd" then getURL = "http://127.0.0.1:11111/api/virtualDevices/"..watchdog[i].id.."/debugMessages/0" else Message("red", "Error : unknown type value") end if getURL ~= "" then if debug then Message("grey", getURL) end -- Load VD/Scene debug messages httpClient:request(getURL, { success = function(response) if response.status == 200 then if response.data and response.data ~= "" then local jsonTable = json.decode(response.data) local current_timestamp = os.time() local oldest_timestamp = current_timestamp local match_found = false local no_match_found = false local reason = "" -- Reverse browsing of debug messages for j = #jsonTable, 1, -1 do oldest_timestamp = jsonTable[j].timestamp -- Check if debug message match lookup string within allowed interval if watchdog[i].match.text and watchdog[i].match.text ~= "" and watchdog[i].match.interval > 0 and jsonTable[j].txt:match(watchdog[i].match.text) then if jsonTable[j].timestamp > current_timestamp - watchdog[i].match.interval then if debug then Message("green", watchdog[i].type..'('..watchdog[i].id..') Found string "'..watchdog[i].match.text..'"') end match_found = true end end -- Check if debug message match forbidden string if watchdog[i].no_match.text and watchdog[i].no_match.text ~= "" and jsonTable[j].txt:match(watchdog[i].no_match.text) then Message("orange", watchdog[i].type..'('..watchdog[i].id..') Found string "'..watchdog[i].no_match.text..'"') no_match_found = true reason = os.date('%H:%M:%S', (jsonTable[j].timestamp or 0)) .. " " .. jsonTable[j].type .. " : " .. jsonTable[j].txt break end if watchdog[i].no_match.type and watchdog[i].no_match.type ~= "" and jsonTable[j].type == watchdog[i].no_match.type then Message("orange", watchdog[i].type..'('..watchdog[i].id..') Found type "'..watchdog[i].no_match.type..'"') no_match_found = true reason = os.date('%H:%M:%S', (jsonTable[j].timestamp or 0)) .. " " .. jsonTable[j].type .. " : " .. jsonTable[j].txt break end end -- for if debug and oldest_timestamp > current_timestamp - watchdog[i].match.interval then Message("grey", watchdog[i].type..'('..watchdog[i].id..') oldest debug timestamp more recent than interval') end -- Restart VD/Scene if watchdog[i].match.text and watchdog[i].match.text ~= "" and watchdog[i].match.interval > 0 and match_found == false and oldest_timestamp < current_timestamp - watchdog[i].match.interval then Message("orange", watchdog[i].type..'('..watchdog[i].id..') String "'..watchdog[i].match.text..'" not found') reason = 'Chaine « ' .. watchdog[i].match.text .. ' » non trouvée' if #jsonTable > 0 then reason = reason .. ', dernier message : ' .. os.date('%H:%M:%S', (jsonTable[#jsonTable].timestamp or 0)) .. ' « ' .. (jsonTable[#jsonTable].txt or "<nil>") .. ' »' end Restart(watchdog[i].type, watchdog[i].id, watchdog[i].restart, watchdog[i].notification, reason) --if watchdog[i].no_match.text and watchdog[i].no_match.text ~= "" and no_match_found == true then elseif no_match_found == true then Restart(watchdog[i].type, watchdog[i].id, watchdog[i].restart, watchdog[i].notification, reason) end else Message("red", "Error : empty response") end else Message("red", "Error : status=" .. tostring(response.status)) end end, error = function(err) Message("red", 'Error : ' .. err) end, options = { method = 'GET' } }) end end end -- for -- Wait if interval and interval > 0 then setTimeout(function() Check(interval) end, interval*1000) end end -- function -- -- Main loop -- local trigger = fibaro:getSourceTrigger() if trigger["type"] == "autostart" then Message(nil, "Watchdog instance autostart") -- Check function call delayed to prevent killing all other scenes not already started right after HC2 boot setTimeout(function() Check(intervalle) end, delay*1000) else Message(nil, "Watchdog instance manual launch") -- Call Check function Check(nil) end . Le paramétrage du script s'effectue dans les quelques lignes situées sous le commentaire "User variables" : intervalle : durée entre 2 vérifications delay : délai avant la première vérification. En effet, cette scène ayant la propriété autostart afin de démarrer automatiquement au boot de la box, le risque est de démarrer avant les autres Scène/VD, et de forcer un redémarrage de ceux-ci alors qu'ils n'ont pas encore effectivement démarré. Ce délai laisse donc aux autres Scène/VD le temps de démarrer et de s'initialiser proprement. watchdog : tableau dont chaque ligne représente une Scène ou un Virtual Device à monitorer : type : "Scene" ou "VD" id : valeur numérique représentant l'ID de la Scène ou VD à monitorer match : texte qui doit être trouvé pendant un certain laps de temps afin de confirmer le bon fonctionnement du VD/Scène. Cela correspond typiquement à un message affiché cycliquement à intervalle régulier. Les 2 champs suivants doivent être renseignés pour que la condition soit prise en compte (condition ET) : text : chaine de caractères à trouver interval : durée en secondes no_match : texte qui ne doit pas être trouvé, sous peine de considérer le VD/Scène comme planté. Cela correspond typiquement à un message d'erreur LUA qui entraine le plantage du script. A noter que la condition no_match à priorité sur la condition match, c'est à dire que si le texte recherché par no_match est détecté, le VD/Scène sera redémarrer même si le texte recherché par match a été détecté. L'un ou l'autre des 2 champs suivants peuvent être renseignés pour que la condition soit prise en compte (condition OU) : text : chaine de caractères à trouver type : "ERROR" correspond aux messages affichés en rouge dans la fenêtre de Debug de l'interface HC2. A noter que jusqu'en v4.056, dans une scène une erreur LUA affichait le message en rouge avec le type "ERROR", tandis que depuis les Beta v4.057 et v4.058, cette même erreur s'affiche en blanc sans le type ERROR, par conséquent ce test ne fonctionne plus. En revanche, aucun changement de mode de fonctionnement concernant les Virtual Devices. count : valeur valable pour les scènes uniquement, et indiquant le nombre minimal d'instances qui doivent fonctionner pour confirmer le bon fonctionnement de la scène. Cela correspond typiquement à l'instance de type boucle infinie lancée en autostart. restart : true ou false afin de redémarrer le VD/Scène concerné, ou seulement envoyer une notification signalant qu'il faut le redémarrer manuellement. notification : liste séparée par des virgules des moyens de notifications à employer. userID : liste séparée par des virgules des ID des utilisateurs qui doivent recevoir des notifications par email (le mail est celui configuré pour chaque utilisateur dans le panneau de contrôle d'accès) smartphoneID : liste séparée par des virgules des ID des smartphones qui doivent recevoir des notifications push (à récupérer dans le toolkit de Krikroff ou via l'API : /api/iosDevices) sms : si vous avez une passerelle SMS sous Android avec SMS Gateway (ou équivalent) pilotée par un module virtuel, il faut renseigner ici les informations nécessaires : VD_ID : ID du module virtuel VD_Button : ID du bouton du module virtuel VG_Name : nom de la variable globale debug : true ou false afin d'activer l'affichage étendu dans la fenêtre de débugage de la scène. Exemple de paramètres : -- User variables local intervalle = 60 local delay = 15*60 local watchdog = { {type = "Scene", id = 1, match = {text="", interval=0}, no_match = {text=""}, count=1, restart=true, notification = {"push", "email", "sms"}}, -- Présence Lazer {type = "Scene", id = 2, match = {text="Last run", interval=2*60}, no_match = {text=""}, count=1, restart=true, notification = {"push", "email", "sms"}}, -- DomoCharts {type = "Scene", id = 3, match = {text="Durée des traitements", interval=11*60}, no_match = {text=""}, count=1, restart=true, notification = {"push", "email", "sms"}}, -- GEA {type = "VD", id = 1, match = {text="", interval=0}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- Surveillance Station {type = "VD", id = 2, match = {text="", interval=0}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- Clock Sync {type = "VD", id = 3, match = {text="", interval=0}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- My Batteries {type = "VD", id = 4, match = {text="", interval=0}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- Evénements {type = "VD", id = 5, match = {text="", interval=0}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- Network Monitor {type = "VD", id = 6, match = {text="", interval=0}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- GEA Alarm {type = "VD", id = 7, match = {text=" ", interval=30}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- Sonos Player (Tk.isTraceEnabled = true) {type = "VD", id = 8, match = {text="Start main process", interval=31*60}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}} -- Freebox Serveur } local userID = {1} -- Email local smartphoneID = {1, 2} -- Push local sms = { ["VD_ID"] = 99, -- Virtual Device ID ["VD_Button"] = "1", -- Virtual Device Button ["VG_Name"] = "SMS" -- Global Variable Name } local debug = false
    14 points
  22. Bonjour à tous, Comme évoqué dans un des topics du firmware avec @Lazer, j'initie un début de liste des différentes API-LUA et API-HTTP apparues suite aux évolutions de firmware. Pour HC2 UNIQUEMENT Cette liste est loin d'être exhaustive, je me suis basé sur les changelog des firmwares et le site https://developer.fibaro.com/. Si vous en connaissez d'autres, n'hésitez pas (je pense à vous les MAITRES du LUA ) Les admins/modos, je vous laisse le soin de mettre le sujet où bon vous semble ;-), un sous-forum de HC2 peut-être. These calls can be used to start increasing or decreasing Multilevel Switches (like Dimmer 2, RGBW or Roller Shutter 2 modules) value. 'x' and 'y' are optional parameters, used to set respectively time frame in which change should be applied and starting level. 'stopLevelChange' stops previously send action. fibaro:call(ID, 'startLevelIncrease', x, y) fibaro:call(ID, 'startLevelDecrease', x, y) fibaro:call(ID, 'stopLevelChange') Call used to get table with IDs of devices that meet requirement specified by 'x'. fibaro:getDevicesId(x) -- Examples: print('All devices with parameter visible equal to "true" and enabled equal to "true":') ids = fibaro:getDevicesId({visible = true, enabled = true}) print(json.encode(ids)) print('ALl devices with energy interface:') ids = fibaro:getDevicesId({interfaces ={"energy"}}) print(json.encode(ids)) print('All devices with 'unit' property (no matter its value):') ids = fibaro:getDevicesId({properties = {unit="nil"}}) print(json.encode(ids)) Which will set given scene respectively to Automatic, Manual and Disabled mode. Any other value will set scene triggering mode to Automatic. fibaro:setSceneRunConfig(sceneID, runConfig) where runConfig is string that takes one of these three values: - TRIGGER_AND_MANUAL - MANUAL_ONLY - DISABLED fibaro:getSceneRunConfig(sceneID) returns currently set value. Old functions will keep backward compatibility and continue to work without change. - fibaro:setSceneEnabled(sceneID, enabled) - fibaro:isSceneEnabled(sceneID) Redémarrage Home Center et Arrêt Home Center HomeCenter.SystemService.reboot() et HomeCenter.SystemService.shutdown() Exemples : -- Reboot system HomeCenter.SystemService.reboot(); -- Shutdown system HomeCenter.SystemService.shutdown(); Popup service HomeCenter.PopupService.publish({title, subtitle, contentTitle, contentBody, img, type, buttons}) Parameters title - string containing text to be displayed as a pop-up window title (parameter required) subtitle - string containing text to be displayed as a pop-up window subtitle contentTitle - string containing text to be displayed as a pop-up content title contentBody - string containing text to be displayed as a pop-up content (parameter required) img - string containing path of an image to be displayed in the pop-up window (supported extensions: .jpg, .bmp, .png, .gif) type - notification type indicated with a colour, available types: 'Info' - blue (default) 'Success' - green 'Warning' - yellow 'Critical' - red buttons - array containing definitions of buttons to be displayed in the pop-up, single button definition must be an array containing: 'caption' - text displayed on the button 'sceneId' - scene id triggered after pushing the button Exemple 1 --[[ %% properties %% globals --]] -- variable containing path of Motion Sensor’s icon local imgUrl = 'http://www.fibaro.com/sites/all/themes/fibaro/images/motion- sensor/en/motion_sensor_manual.png' -- pop-up call HomeCenter.PopupService.publish({ -- title (required) title = 'No motion detected', -- subtitle(optional), e.g. time and date of the pop-up call subtitle = os.date("%I:%M:%S %p | %B %d, %Y"), -- content header (optional) contentTitle = 'No motion since last 15 minutes', -- content (required) contentBody = 'Should I run the scene "Night"?', -- notification image (assigned from the variable) img = imgUrl, -- type of the pop-up type = 'Success', -- buttons definition buttons = { { caption = 'Yes', sceneId = 0 }, { caption = 'No', sceneId = 0 } } }) NOTE Please note that the example scene must be triggered manually. It just illustrates the way of creating pop-ups. Execution of this scene will not affect any device status (sceneId = 0). NOTE Setting an action of the button to 'sceneId = 0' means that no action will be performed. NOTE Created pop-up is sent to each of users and mobile devices connected with the main controller. NOTE There is no maximum size of image displayed in the pop-up window. However, using too large file may result in long waiting times required for downloading the image. NOTE Pushing one of the buttons displayed in the pop-up window may only trigger another scene. Exemple 2 --[[ %% properties 3814 value %% globals --]] local startSource = fibaro:getSourceTrigger(); if ( ( tonumber(fibaro:getValue(3814, "value")) > 60 ) or startSource["type"] == "other" ) then HomeCenter.PopupService.publish({ title = 'Brightness level', subtitle = 'is too high', contentTitle = 'Dimmer', contentBody = 'Would you like to turn it off?', img = ' http://www.fibaro.com/images/eng/icon_osw.png', type = 'Critical', buttons = { { caption = 'Turn off', sceneId = 3228 }, { caption = 'No', sceneId = 0 }, { caption = 'Set to 100%', sceneId = 3229 } } }) end 1ère MAJ venant de @Steven concernant les fonctions fibaro : Telecharger le tar.gz http://updatehc2.fibaro.com/4.083/ , puis dans opt/fibaro ouvrir fibaroSceneAPI.lua Backups depuis une scène (Merci à @Nikko) --[[ %% properties %% events %% globals --]] local portable = 385 local message = 'Backup du '..os.date("%d/%m/%y - %HH%M") local url = 'http://127.0.0.1:11111/api/settings/backups' local httpClient = net.HTTPClient() httpClient:request(url , { success = function(response) if tonumber(response.status) == 201 then print("Backup Created at " .. os.date()) fibaro:call(portable,'sendPush', message .. ' effectué') else print("Error " .. response.status) fibaro:call(portable,'sendPush', 'Erreur lors de la création du Backup') end end, error = function(err) print('error = ' .. err) end, options = { method = 'POST', headers = { ["content-type"] = 'application/x-www-form-urlencoded;' }, data = 'action=create&description='..message } }); - Attention, si planification avec GEA, dans la nuit, ca relance le zwave ;-) GEA.add(true, 30, "", {{"Scenario", id}}) ASTUCES DIVERSES Affichage persistent du LOG des VDs et couleurs possibles (merci @Steven et @Berale, je ne suis que le Scrib) - Code à mettre dans le MAIN-LOOP fibaro:log("Test") fibaro:call(fibaro:getSelfId(), "setProperty", "logTemp", "TxtGray" ) - Couleurs possibles : .TxtGreen .TxtRed .TxtYellow .TxtBlue .TxtGray Exemple de @Nico --1er bouton VD local deviceId = fibaro:getSelfId(); fibaro:call(deviceId, "setProperty", "ui.Label1.value", "Repos") -- Second bouton du VD local deviceId = fibaro:getSelfId(); fibaro:call(deviceId, "setProperty", "ui.Label1.value", "Alarme") fibaro:call(deviceId, "setProperty", "ui.Label2.value", os.date("%m %B %Y - %H:%M:%S")) -- Mainloop pour affichage persistent du log local deviceId = fibaro:getSelfId(); local value = fibaro:getValue(deviceId, "ui.Label2.value") fibaro:log(value) fibaro:call(fibaro:getSelfId(), "setProperty", "logTemp", "TxtGray" ) Affichage persistent HORS MAIN-LOOP fibaro:call(fibaro:getSelfId(), "setProperty", "log", "blablabla" ) MISE à jour suite à la version stable 4.10 : Merci à @Steven fibaro:callGroupAction(action, filters) { "filter": "hasProperty", "value": ["configured", "dead", "model"] } { "filter": "interface", "value": ["Z-Wave", "levelChange"] } { "filter": "parentId", "value": [664] } { "filter": "type", "value": ["com.fibaro.multilevelSwitch"] } { "filter": "roomID", "value": [2, 3] } { "filter": "baseType", "value": ["com.fibaro.binarySwitch"] } { "filter": "isTypeOf", "value": ["com.fibaro.binarySwitch"] } { "filter": "isPlugin", "value": [true] } { "filter": "propertyEquals", "value": [ { "propertyName": "configured", "propertyValue": [true] }, { "propertyName": "dead", "propertyValue": [false] }, { "propertyName": "deviceIcon", "propertyValue": [15] }, { "propertyName": "deviceControlType", "propertyValue": [15,20,25] } ] } { "filter": "deviceID", "value": [55,120,902] } Parameters action: action name filters: filters object Returned values devices: array of device id's filtered by given rule. Code example --[[ %% properties %% events %% globals --]] local data = { args = { 1 }, filters = { { filter = "roomID", value = { 2 } }, { filter = "type", value = { "com.fibaro.motionSensor" } } } } local devices = fibaro:callGroupAction("setArmed", data) for k,v in ipairs(devices) do print (v) end HomeCenter.NotificationService.publish(payload) Name Function name must be always the same: HomeCenter.NotificationService.publish Application Publishes notification. Parameters request: request object Code example HomeCenter.NotificationService.publish({ type = "GenericDeviceNotification", priority = "warning", data = { deviceId = 2643, title = "foo", text = "bar" } }) HomeCenter.NotificationService.update(id, payload) Name Function name must be always the same: HomeCenter.NotificationService.update Application Updates notification. Parameters id: notification id request: request object Code example HomeCenter.NotificationService.update(7, { canBeDeleted = true, data = { title = "udapted foo", text = "udapted bar" } }) HomeCenter.NotificationService.remove(id) Name Function name must be always the same: HomeCenter.NotificationService.remove Application Removes notification. Parameters id: notification id Code example HomeCenter.NotificationService.remove(7) Info du jour concernant le centre de notification de la HC2, merci @tinman, c'est ici : - Pour utiliser le centre de notification avec des infos "perso" : Tester et aprouvé en 4.10 function doNotify(text, devid) api.post('/notificationCenter', { type = 'GenericDeviceNotification', canBeDeleted = true, -- priority can be -- alert -- red alert sign -- warning -- yellow warning sign -- info -- same as warning priority = 'alert', data = { deviceId = devid, text = text, title = text } }) end doNotify('Test notif HC2', 12 )
    14 points
  23. Bonjour Pour mon premier tuto, je vous propose un Module Virtuel pour interfacer la Livebox d'Orange et je vais vous détailler la mise en Å“uvre de l'intégration avec la HC2. Le module rassemble les informations importantes sur l'état des interfaces, le débit, les statistiques et les différents compteurs d'erreurs. Il permet aussi d'exécuter des commandes simples comme l'activation du Wifi ou le redémarrage de la Livebox. Prérequis Une Livebox 2 (Sagem) DSL note: pas pu tester la fibre. J'aimerais bien mais dans moin coin c'est pas avant 2022 ). Une HC2 (code lua testé avec v3.600 et v4.031) Installation Télécharger et ajouter le VD (lien en bas de post) Sur la page de configuration du module, saisir l'adresse ip et le port (80) de la Livebox Ensuite, il faut paramtètrer le VD, editez le code en debut de page (pour chaque bouttons): -- Nom d'utilisateur et mot de passe de la livebox local USER ="admin" local PASSWORD = "admin" Le VD retourne trois états possibles: Inconnu, OK et Not OK. Editez les variables pour adapter l'ID des icones: -- ID des icônes icon_ok = 1004 icon_nok = 1005 icon_unknown = 1006 Par défault, l'execution du module toutes les 5 minutes est confié à la mainloop du VD qui simule un appui sur le bouton Rafraichir. Simple, mais pour plus de fléxibilité et surtout de plus stabilté je recommande d'utiliser l'excellent GEA avec la ligne ci-dessous (à adapter). Dans ce cas, noubliez pas de supprimer le code dans le mainloop du VD. -- Mise à jour état connexion Internet GEA.add(true , 5*60, "",{{"VirtualDevice", id["VD_LIVEBOX"], "1"},{"VirtualDevice", id["VD_LIVEBOX"], "7"},{"Repeat"}}) Le VD n'utilise pas de Variable Globale car je n'ai pas de scénario qui necessite un retour sur l'état de la connexion internet mais c'est juste une ligne de code à ajouter: fibaro:setGlobal('test', Livebox.WANStatus.LinkState) Comment ca marche ? c'est la section pour les geeks. Je partage ici le resultat de mes bidouilles (et saut d'humeur) à propos de l'API Livebox Fonctionnement de l'API Orange/Sagem: En regardant d'un peu plus près les paquets échangés dans une session d'admin avec la livebox on peut voir des réponses de POST en json . à‡a commence plutôt pas mal, la livebox a donc une API ! Comme souvent avec Orange, ça commence bien, c'est après que les choses se gâtent ! Impossible de mettre la main sur une doc publique de l'API. En fouillant un peu sur les forums d'Orange j'ai trouvé quelques pistes mais mes vrais amis ont été Wireshark et les dev tools InternetExplorer ou Chrome (F12) pour comprendre un peu comment l'appli mobile d'Orange (version IOS) utilisait l'API… En inspectant le déroulé d'un login, je manque de m'étrangler en constatant que le nom d'utilisateur et le mot de passe sont balancés en clair; ben voyons les gars faut pas se gêner hein… la requête login retourne un "ContextID" qui est utilisé comme identifiant pour les appels aux fonctions de l'API (X-Context dans les headers). Donc au menu nous avons des custom headers et une authentification super basique, fastoche! où est le problème? Bah ça marche pô! - > "permission denied" le voilà le problème Bah surement qu'ils ont été pris de remords chez Orange avec cette authentification de mickey avec password en clair et histoire de faire bonne figure (et pas se faire défoncer tous les mercredi par des pré-ados qui voudraient passer outre le contrôle parental) ils ont semble-t-il cherché à compliquer un peu les choses… mais en faisant du gros n'importe quoi! Pour aller à l'enssentiel, en plus d'un ContextID, le Login renvoie une autre clé mais planquée dans un cookie cette fois. La sécurité n'y a pas gagné grand chose mais en revanche c'est une vraie prise de tête à intégrer sur la hc2. Hmm.. Net.FHttp avec des custom headers et un cookie, ça va pas le faire… Pour contourner le problème et récupérer le cookie, je me suis servi du génialissime ToolKit v1.0.4 de Krikroff. Une toute petite modif de 4 lignes dans httpClient:request et nous voila prêts à nous goinfrer de cookies. J'ai modifié (à l'arrache, sorry Krikroff) la fonction request(...) dans le fichier Toolkit.net.lua (commence ligne 165). on cherche la chaine "cookie" dans les response headers renvoyés par le serveur et le cas échéant on extrait avec un string.sub() en partant du douzième char. la fonction retourne le cookie en plus des classiques response, status et err. request = (function(self, method, uri, headers, body) ... for k, v in pairs(__headers) do --Toolkit.Net.__trace("raw #"..k..":"..v) if (string.find(string.lower( v or ""), "chunked")) then self.__isChunked = true; Toolkit.Net.__trace("%s.%s::receive > Transfer-Encoding: chunked", Toolkit.Net.__header, Toolkit.Net.__Http.__header, string.len(result)); -- Modification pour récupérer le cookie. Ofwood Janvier 2015 elseif (string.find(string.lower( v or ""), "cookie")) then cookie = string.sub(v, 12) Toolkit.Net.__trace("%s.%s::receive > Cookie: %s", Toolkit.Net.__header, Toolkit.Net.__Http.__header, cookie); end end ... -- return budy response & cookie return response, status, err, cookie; Voyons maintenant avec un exemple comment tirer profit de cette modification et mangeons des cookies! La fonction login() authentifie l'utilisateur et retourne le contextID (dans la réponse json) et le cookie associé. function login() local httpClient = Toolkit.Net.HttpRequest(ip, port) httpClient:setReadTimeout(Livebox.commandTimeOut) local uri = string.format("/authenticate?username=%s&password=%s", utilisateur, mot_de_passe) local response, status, errorCode, cookie = httpClient:request("POST", uri, {"User-Agent: FibaroHC2/1.0", "Content-Type: application/json"}, "" ) if (errorCode == 0) and tonumber(status) == 200 then local jsonTable = json.decode(response); ContextID = jsonTable.data.contextID; return ContextID, cookie end end l'exemple suivant utilise le contextID et notre cookie pour une requête (l'état de l'interface WAN sur la LiveBox) function getWANStatus(contextID, cookie) local httpClient = Toolkit.Net.HttpRequest(ip, port) httpClient:setReadTimeout(Livebox.commandTimeOut) local uri = "/sysbus/NMC:getWANStatus" local params = [[ {"parameters":{}} ]]; -- Injection de X-Context et du Cookie dans les headers local response, status, errorCode, cookie = httpClient:request("POST", uri, {"User-Agent: FibaroHC2/1.0", "Content-Type: application/json", "X-Context: "..contextID, "Cookie: "..cookie }, params); if (errorCode == 0) and (status == 200) then local jsonTable = json.decode(response) Return jsonTable.result.data end end Voici la liste des fonctions implémentées dans la version 1.0 du module. Il en existe d'autres, je n'ai pas encore tout recensé. Livebox.login() Authentification session utilisateur Livebox.logout() Fermeture session Livebox.listTrunks() Information téléphonie IP Livebox.getIPTVStatus() Etat IP TV Livebox.getDSLStats() Stats DSL (Erreurs) Livebox.getMIBs() Information lien dsl Livebox.getWifiMIBs() Information Wifi Livebox.getWANStatus() Etat de la connexion WAN Livebox.reboot() Redémarrage la livebox Livebox.setwifi(mode) Active/désactive le Wifi Livebox.filtreMAC(flag) Active/Désactive filtrage MAC address Livebox.getWificomStatus() Information Wifi public Orange Voilà , ça donne l'idée générale et Orange n'ayant pas le monopole sur les APIs bien pourries, je me suis dit que ça pourrait peut-être en aider d'autres qui se prennent la tête sur des intégrations nécessitant le support des cookies. Enjoy! merci pour vos retours (et votre indulgence) Historique 13/01/2015 - v1.0 : version initiale Livebox_VD.zip
    14 points
  24. Bonjour, Comme vous le savez, la dernière version 4.503 – BETA, a introduit l’accès à de nouvelles propriétés des modules z-wave et notamment à la propriété lastWorkingRoute (merci @tinman d’avoir attiré notre attention sur ce point). En complément du VD Table de routage de @Lazer qui permet de parcourir les devices d’une pièce et d’afficher les propriétés lastWorkingRoute et neighborList, je vous propose une petite page en PHP permettant de représenter les liaisons entre les différents modules. Ainsi j’obtiens : Il faut plus voir dans ce modeste travail plus la réalisation d’un POC que l’écriture d’une quelconque application surtout que je ne maîtrise aucun des langages employés. Au départ, je pensais tout réaliser en javascript, mais il n’est pas possible de récupérer directement les données de la box domotique pour des raisons de sécurité (pour les curieux, rechercher CORS et l’erreur No 'Access-Control-Allow-Origin'). Aussi, l’utilisation d’une page hébergée sur un serveur s’est imposée… Une rapide recherche m’a conduit à choisir pour tracer le graphe la librairie visjs pour sa simplicité d’utilisation pour l'obtention rapide d'un résultat. Pour l’installation, il devrait suffire de copier le fichier PHP joint quelque part dans l’arborescence d’un serveur web, et de l’éditer pour configurer l’accès à la box domotique : adresse IP, code utilisateur (de l’administrateur) et mot de passe. La page ayant vocation à être hébergée sur le réseau local, cela ne devrait pas poser de problèmes de sécurité. Ensuite, il suffit d’afficher la page dans son navigateur… Le nombre d’options de visjs est démesuré, je n’en ai testé qu’un petite partie. Have fun! Fichier joint : z-wave_network.php
    14 points
  25. Les manipulations présentées dans ce sujet de discussion sont destinés à des utilisateurs avancés disposant des compétences nécessaires, et je décline tout responsabilité en cas de fausse manipulation rendant votre clé USB Recovery inopérante, voire même votre Home Center 2. Introduction Voir : Sauvegarde, Restauration, Et Recovery Sur Home Center 2 Clonage de la clé USB de Recovery Présentation de la clé La clé USB fournie avec la box Fibaro Home Center 2 est un élément critique, car sans elle la box ne peut fonctionner. Elle sert pour les sauvegardes de la configuration (en vue de leur restauration éventuelle), notamment avant chaque mise à jour de firmware, mais également pour le Recovery, c'est à dire le retour à une configuration usine en cas de crash de la box. Pour rappel, cette clé est connectée sur un port USB situé derrière la plaque métallique vissée sur le coté gauche de la box. Avant de retirer la clé USB Recovery de la box, s'assurer que celle-ci soit bien éteinte. Dans un premier temps, nous connectons la clé USB sur un PC sous Windows. Dans l'explorateur, nous voyons apparaître une partition d'environ 2 Go : Contenant 3 répertoires et 1 fichier : 24/10/2014 07:44 <REP> backups 02/09/2013 15:40 <REP> system 30/08/2013 12:15 10 network.conf 13/11/2013 22:48 <REP> logs Il est inutile à ce stade là de vouloir copier l'arborescence de cette partition, car le Gestionnaire des disques de Windows nous montre 2 partitions inconnues supplémentaires, ainsi que de l'espace libre : La clé a en réalité une taille de 8 Go, mais seuls 4 Go sont utilisés. Il faut donc monter la clé USB sur un système Linux, qui est capable de lire (presque) tous les formats de partitions existants. J'ai utilisé pour cela une VM sous ESXi sur mon serveur HP Proliant G7 N54L, voici les captures d'écran des fenêtres de modifications des paramètres de la machine virtuelle : On remarque que la clé fournie par Fibaro est de marque Kingston, on n'est donc pas en présence d'une clé chinoise premier prix : Dans ma VM, il s'agit d'un Linux RedHat Enterprise Server, mais n'importe quel Linux peut faire l'affaire, en particulier Debian qui est la distribution utilisée par FIbaro. Il est évidemment possible de monter cette clé sur n'importe quelle machine Linux, dont voici une liste non exhaustive : - Linux natif sur PC - Linux sur Raspberry PI - Linux dans une VM sous VMware Player sous Windows ou MacOS - LiveCD bootable sur CD ou clé USB - etc... Je ne détaille pas ces procédures, de nombreux tutoriels existent sur Internet, et je répète que si vous voulez tenter les manipulations décrites ici cela nécessite d'être suffisamment à l'aise avec Linux (ce qui implique de savoir l'installer). Une fois la clé connectée sur la machine Linux, on la voit apparaître dans les messages du noyau avec la commande dmesg : [root@redhat ~]# dmesg | tail -21 usb 1-2: new high speed USB device number 3 using ehci_hcd usb 1-2: New USB device found, idVendor=13fe, idProduct=4100 usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 usb 1-2: Product: FIBARO RECOVERY usb 1-2: Manufacturer: FIBARO usb 1-2: SerialNumber: ...................... usb 1-2: configuration #1 chosen from 1 choice scsi4 : SCSI emulation for USB Mass Storage devices usb-storage: device found at 3 usb-storage: waiting for device to settle before scanning usb-storage: device scan complete scsi 4:0:0:0: Direct-Access FIBARO FIBARO RECOVERY PMAP PQ: 0 ANSI: 6 sd 4:0:0:0: Attached scsi generic sg3 type 0 sd 4:0:0:0: [sdc] 15646720 512-byte logical blocks: (8.01 GB/7.46 GiB) sd 4:0:0:0: [sdc] Write Protect is off sd 4:0:0:0: [sdc] Mode Sense: 23 00 00 00 sd 4:0:0:0: [sdc] Assuming drive cache: write through sd 4:0:0:0: [sdc] Assuming drive cache: write through sdc: sdc1 sdc2 sdc3 sd 4:0:0:0: [sdc] Assuming drive cache: write through sd 4:0:0:0: [sdc] Attached SCSI removable disk Dans cet exemple, le device utilisé est /dev/sdc Par curiosité, avec lsusb on peut obtenir des informations sur cette clé Kingston : [root@redhat ~]# lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 001 Device 002: ID 196d:f100 Bus 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse Bus 002 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub Bus 001 Device 003: ID 13fe:4100 Kingston Technology Company Inc. [root@redhat ~]# lsusb -s 001:003 -vvv Bus 001 Device 003: ID 13fe:4100 Kingston Technology Company Inc. Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0x13fe Kingston Technology Company Inc. idProduct 0x4100 bcdDevice 1.00 iManufacturer 1 FIBARO iProduct 2 FIBARO RECOVERY iSerial 3 ...................... bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 32 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x80 (Bus Powered) MaxPower 200mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 8 Mass Storage bInterfaceSubClass 6 SCSI bInterfaceProtocol 80 Bulk-Only iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0200 1x 512 bytes bInterval 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x02 EP 2 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0200 1x 512 bytes bInterval 0 Device Qualifier (for other device speed): bLength 10 bDescriptorType 6 bcdUSB 2.00 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 bNumConfigurations 1 Device Status: 0x0000 (Bus Powered) Avec la commande parted, on découvre plus en détail la structure des partitions de cette clé : [root@redhat ~]# parted /dev/sdc GNU Parted 2.1 Using /dev/sdc Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) print Model: FIBARO FIBARO RECOVERY (scsi) Disk /dev/sdc: 8011MB Sector size (logical/physical): 512B/512B Partition Table: msdos Number Start End Size Type File system Flags 1 1049kB 2000MB 1999MB primary fat32 2 2000MB 2255MB 256MB primary linux-swap(v1) 3 2255MB 3817MB 1561MB primary ext4 boot (parted) quit La taille de 8 Go est confirmée. On trouve les partitions suivantes : FAT32 (la partition visible sous Windows) Linux Swap (l'espace de paging space du système Linux) ext4 (le format de fichier standard d'une partition Linux, et qui se trouve en plus être bootable) Sauvegarde de la clé Sans plus attendre, on procède immédiatement à la sauvegarde cette clé, ce qui est l'étape la plus importante de cette étude. On utilise pour cela la commande dd qui permet de réaliser une copie bit-à -bit de l'intégralité de la clé. [root@redhat ~]# dd if=/dev/sdc of=/tmp/usb.img bs=1M 7640+0 records in 7640+0 records out 8011120640 bytes (8.0 GB) copied, 812.817 s, 9.9 MB/s Débit moyen de lecture de 10 Mo/s, ce n'est pas terrible (le débit max du bus l'USB-2 étant d'environ 25 Mo/s), mais pour l'usage très occasionnel qui est fait de cette clé, ce n'est pas un souci. On obtient un fichier de 8 Go sur le disque dur, qui est l'image exacte de la clé : [root@redhat ~]# ls -l /tmp/usb.img -rw-r--r--. 1 root root 8011120640 Oct 24 10:35 /tmp/usb.img Ce fichier contient donc le MBR (Master Boot Record) de la clé, l'intégralité des 3 partitions, ainsi que l'espace vide, comme le confirme la commande file : [root@redhat ~]# file /tmp/usb.img /tmp/usb.img: x86 boot sector; partition 1: ID=0xb, starthead 32, startsector 2048, 3903488 sectors; partition 2: ID=0x82, starthead 27, startsector 3905536, 499712 sectors; partition 3: ID=0x83, active, starthead 54, startsector 4405248, 3049472 sectors, code offset 0x63 Note : il aurait été possible de réaliser une sauvegarde de façon plus optimisée, en sauvegardant indépendamment le MBR et les 3 partitions, afin de ne conserver que les 4 Go utile. Néanmoins dans ce tutoriel la procédure se voulait simple afin de cloner intégralement la clé USB fournie par FIbaro afin de conserver une copie de secours. Nous verrons peut-être ultérieurement qu'il est possible d'aller beaucoup plus loin dans les manipulations de cette clé. Restauration de la clé On connecte une nouvelle clé USB vierge sur le système Linux. Si cette clé n'est pas vierge, elle sera écrasée. La restauration de la clé de Recovery utilise toujours la même commande dd, mais en sens inverse, c'est à dire qu'on lit le fichier pour écrire sur le périphérique USB. Dans mon exemple il s'agit de /dev/sdd : [root@redhat tmp]# dd if=/tmp/usb.img of=/dev/sdd bs=1M dd: writing `/dev/sdd': No space left on device 7553+0 records in 7552+0 records out 7918845952 bytes (7.9 GB) copied, 703.889 s, 11.3 MB/s On note une erreur car l'espace disponible sur ma nouvelle clé est insuffisant. En effet, j'ai utilisé une clé qui fait un peu moins de 8 Go, donc la commande n'a pas pu écrire la fin des octets. Ce n'est nullement gênant car comme on l'a vu précédemment, seuls 4 Go sont utilisés et la fin de la clé est inutilisé. Dans l'exemple ci-dessus, 7,9 Go ont été écrits, ce qui est plus que suffisant. Test de la clé clonée On insère la clé USB dans la box HC2, on branche l'alimentation, et la box boot comme si de rien n'était. On l'arrête à nouveau, on rebranche la clé d'origine, et on redémarre la box en production. On conserve la nouvelle clé générée bien à l'abri, ou pas, puisque avec l'image binaire présente sur le disque dur il est toujours possible de regénérer autant de clés qu'on le souhaite. Notes complémentaires Cette procédure permet de cloner une clé devant être utilisé sur la même box. L'étude pour cloner une clé sur une box différente sera menée ultérieurement (sans garantie de succès) Le clonage de la clé aurait pu se faire directement avec la commande suivante, sans passer par le disque dur (non testé) : dd if=/dev/sdc of=/dev/sdd bs=1M . Analyse détaillée de la clé A partir de ce chapitre, on commence l'étude approfondie de la clé de Recovery. Par sécurité afin de ne pas tout casser en cas de fausse manipulation, on travaille sur l'image générée précédemment sur disque. Le fichier usb.img est une image en mode "raw" de la clé, et a donc conservé la structure initiale avec les 3 partitions : [root@redhat tmp]# parted usb.img print Model: (file) Disk /tmp/usb.img: 8011MB Sector size (logical/physical): 512B/512B Partition Table: msdos Number Start End Size Type File system Flags 1 1049kB 2000MB 1999MB primary fat32 2 2000MB 2255MB 256MB primary linux-swap(v1) 3 2255MB 3817MB 1561MB primary ext4 boot On crée les devices dans le noyau permettant de monter les partitions : [root@redhat tmp]# kpartx -v -a usb.img add map loop0p1 (253:2): 0 3903488 linear /dev/loop0 2048 add map loop0p2 (253:3): 0 499712 linear /dev/loop0 3905536 add map loop0p3 (253:4): 0 3049472 linear /dev/loop0 4405248 On crée les points de montages (il est inutile de monter la partition de swap) : [root@redhat ~]# mkdir /mnt/sdc1 [root@redhat ~]# mkdir /mnt/sdc3 On monte les 2 partitions intéressantes : [root@redhat tmp]# mount /dev/mapper/loop0p1 /mnt/sdc1 -o ro [root@redhat tmp]# mount /dev/mapper/loop0p3 /mnt/sdc3 -o ro Dans la partition n°1, on retrouve les fichiers qui étaient visibles sous Windows : [root@redhat tmp]# cd /mnt/sdc1 [root@redhat sdc1]# ls -l total 16 drwxr-xr-x. 7 root root 4096 Oct 24 07:44 backups drwxr-xr-x. 2 root root 4096 Nov 13 2013 logs -rwxr-xr-x. 1 root root 10 Aug 30 2013 network.conf drwxr-xr-x. 2 root root 4096 Sep 2 2013 system Vérification de l'espace occupé/libre : [root@redhat sdc1]# df -m . Filesystem 1M-blocks Used Available Use% Mounted on /dev/mapper/loop0p1 1903 487 1416 26% /mnt/sdc1 Les tailles de Mo de chaque fichier/répertoire : [root@redhat sdc1]# du -sm * 63 backups 1 logs 1 network.conf 424 system On en déduit que sur les 2 Go de cette partition, 424 Mo sont utilisés par l'image système de recovery, et seulement 63 Mo (dans mon cas) pour les sauvegardes de la configuration. Donc les 1416 Mo libres sont plus que suffisants pour réaliser un grand nombre de sauvegardes. Dans mon cas, j'ai seulement 5 sauvegardes, et on remarque que la plus grosse d'entre elle est ma dernière sauvegarde du 24/10/2014 : [root@redhat sdc1]# du -sm backups/* 6 backups/backup16_01_14-2032 6 backups/backup16_01_14-2037 41 backups/backup24_10_14-0944 11 backups/backup28_02_14-1428 2 backups/backup29_11_13-0019 Le fichier network.conf contient seulement l'info permettant au réseau de fonctionner en DHCP lorsqu'on boot en recovery : [root@redhat sdc1]# cat network.conf type=dhcp Etudions maintenant le contenu de ma dernière sauvegarde : [root@redhat sdc1]# cd backups/backup24_10_14-0944/ [root@redhat backup24_10_14-0944]# ls -l total 40812 -rwxr-xr-x. 1 root root 117 Oct 24 07:44 checksum -rwxr-xr-x. 1 root root 131 Oct 24 07:44 info drwxr-xr-x. 2 root root 4096 Oct 24 07:44 scenes -rwxr-xr-x. 1 root root 41757696 Oct 24 07:44 sql -rwxr-xr-x. 1 root root 16528 Oct 24 07:44 zwave Il y a quelques fichiers textes, une base de données SQLite, et un fichier binaire : [root@redhat backup24_10_14-0944]# file * checksum: ASCII text info: ASCII text scenes: directory sql: SQLite 3.x database zwave: data Le fichier checksum contient des sommes de contrôles permettant de s'assurer de la cohérence des fichiers stockés sur la clé avant la restauration éventuelle : [root@redhat backup24_10_14-0944]# cat checksum 82a0e8acacb02838248ff032dfb16a7e sql 96d7a2aac279dc2be1abd77bb1f37196 zwave c9bf3777d6c6990e37a59aa3cfac49af info Vérification, tout est OK : [root@redhat backup24_10_14-0944]# md5sum sql 82a0e8acacb02838248ff032dfb16a7e sql [root@redhat backup24_10_14-0944]# md5sum zwave 96d7a2aac279dc2be1abd77bb1f37196 zwave [root@redhat backup24_10_14-0944]# md5sum info c9bf3777d6c6990e37a59aa3cfac49af info Le fichier info contient quelques informations génériques qui sont affichées par l'interface Web lorsqu'on boote la box en recovery : [root@redhat backup24_10_14-0944]# cat info devices=90 rooms=12 scenes=22 hour=09 minute=44 day=24 month=10 year=2014 timestamp=1414136694 description=24/10/2014 v3.590 stable Le fichier sql contient toute la configuration, dont voici un extrait : [root@redhat backup24_10_14-0944]# sqlite3 sql ".tables" Alarm_Fibaro_Scene Alarm_Zone Alarm_Zone_PIN Backups Borrowed_Devices Cooling_Zone Cooling_Zone_Room Dashboard Device_Association_Group [...] Par exemple : [root@redhat backup24_10_14-0944]# sqlite3 sql 'select * from Room;' 1|1|Salon|room_kominek|999|96|97|0|0 2|1|Entrée|room_kapelusz|999|0|0|0|0 3|1|Salle à manger|room_jadalnia|999|0|0|0|0 [...] Dans le sous-répertoire scenes, on y trouve des pages html et des scritps LUA : [root@redhat backup24_10_14-0944]# cd scenes/ [root@redhat scenes]# ls -l total 484 -rwxr-xr-x. 1 root root 17288 Oct 24 07:44 10.html -rwxr-xr-x. 1 root root 828 Oct 24 07:44 10.lua -rwxr-xr-x. 1 root root 17346 Oct 24 07:44 11.html -rwxr-xr-x. 1 root root 947 Oct 24 07:44 11.lua -rwxr-xr-x. 1 root root 19930 Oct 24 07:44 12.html -rwxr-xr-x. 1 root root 1047 Oct 24 07:44 12.lua -rwxr-xr-x. 1 root root 17756 Oct 24 07:44 13.html -rwxr-xr-x. 1 root root 923 Oct 24 07:44 13.lua -rwxr-xr-x. 1 root root 26374 Oct 24 07:44 14.html -rwxr-xr-x. 1 root root 1112 Oct 24 07:44 14.lua [...] Au hasard, prenons la plus grosse scène, et ô surprise (oui je sais j'utilise encore une veille version de GEA) : [root@redhat scenes]# head -22 22.lua --[[ %% autostart %% properties 46 value %% globals --]] -- ------------------------------------------------------------ -- GEA : Gestionnaire d'Evénements Automatique -- Scénario permettant de contrôler si une périphérique est -- activé depuis trop longtemps ou lancer -- un push d'avertissement -- L'état du périphérique est contrôlé toutes les X secondes -- si passer le délai souhaité le périphérique est toujours -- activé, le système envoi une notification -- -- Auteur : Steven P. with modification of Hansolo -- Version : 3.50 -- Special Thanks to : -- Fredric, Diuck, Domodial, moicphil, lolomail, byackee, -- JossAlf, Did and all other guy from Domotique-fibaro.fr -- ------------------------------------------------------------ . On retourne maintenant à la racine de la partition n°1, afin d'étudier rapidement le répertoire system : [root@redhat scenes]# cd /mnt/sdc1 [root@redhat sdc1]# cd system [root@redhat system]# ls -l total 433920 -rwxr-xr-x. 1 root root 33 Sep 2 2013 checksum -rwxr-xr-x. 1 root root 444328464 Sep 2 2013 image.gz -rwxr-xr-x. 1 root root 0 Jul 17 2012 version3 -rwxr-xr-x. 1 root root 0 Aug 23 2013 version4 Comme pour les sauvegardes, une somme de contrôle permet de s'assurer de l'intégrité de l'image à restaurer : [root@redhat system]# cat checksum c496e1fe5e3095b73e2f376b35ae5307 [root@redhat system]# md5sum image.gz c496e1fe5e3095b73e2f376b35ae5307 image.gz Ce fichier image.gz est une archive compressée d'une image raw d'un disque : [root@redhat system]# file image.gz image.gz: gzip compressed data, was "image", from Unix, last modified: Mon Sep 2 15:27:19 2013 [root@redhat system]# gzip -dc image.gz | file - /dev/stdin: x86 boot sector; partition 1: ID=0x83, active, starthead 32, startsector 2048, 1951744 sectors; partition 2: ID=0x82, starthead 157, startsector 1953792, 499712 sectors; partition 3: ID=0x83, starthead 184, startsector 2453504, 1368064 sectors, code offset 0x63 On décompresse cette archive dans un répertoire temporaire : [root@redhat system]# cd /tmp [root@redhat tmp]# gzip -cd /mnt/sdc1/system/image.gz > image [root@redhat tmp]# ls -l image -rw-r--r--. 1 root root 2002780160 Oct 25 18:26 image Il s'agit de l'image du disque système interne de la HC2 (clé USB SLC de 2 Go) : [root@redhat tmp]# parted image print Model: (file) Disk /tmp/image: 2003MB Sector size (logical/physical): 512B/512B Partition Table: msdosNumber Start End Size Type File system Flags 1 1049kB 1000MB 999MB primary ext4 boot 2 1000MB 1256MB 256MB primary linux-swap(v1) 3 1256MB 1957MB 700MB primary ext4 En cas de recovery de la box, c'est donc cette image qui est restaurée sur la mémoire interne de la box, puis la dernière sauvegarde peut être restaurée. Je ne détaille pas plus le contenu de ces partitions systèmes, mais il est tout à fait possible de les monter et d'accéder à leur contenu. Je précise néanmoins que la première partition est la racine du système (/), tandis que la troisième partition est montée dans /var (contient les journaux, les pages Web, etc...). La première partition (FAT32) de la clé de Recovery est montée dans /home/fghc2-recovery/recovery On étudie maintenant la partition n°3 de la clé de Recovery : [root@redhat mnt]# cd /mnt/sdc3 [root@redhat sdc3]# ls -l total 96 drwxr-xr-x. 2 root root 4096 Dec 8 2011 bin drwxr-xr-x. 3 root root 4096 Dec 8 2011 boot drwxr-xr-x. 5 root root 4096 Dec 8 2011 dev drwxrwxr-x. 74 root root 4096 Aug 30 2013 etc drwxr-xr-x. 3 root root 4096 Oct 3 2011 home lrwxrwxrwx. 1 root root 28 Dec 8 2011 initrd.img -> boot/initrd.img-2.6.32-5-686 drwxr-xr-x. 12 root root 12288 Dec 22 2011 lib drwx------. 2 root root 16384 Dec 8 2011 lost+found drwxr-xr-x. 6 root root 4096 Dec 8 2011 media drwxr-xr-x. 2 root root 4096 Oct 3 2011 mnt drwxr-xr-x. 3 root root 4096 Dec 11 2011 opt drwxr-xr-x. 2 root root 4096 Oct 3 2011 proc drwx------. 4 root root 4096 Sep 12 2012 root drwxr-xr-x. 2 root root 4096 Dec 12 2011 sbin drwxr-xr-x. 2 root root 4096 Jul 21 2010 selinux drwxr-xr-x. 2 root root 4096 Dec 8 2011 srv drwxr-xr-x. 2 root root 4096 Jan 1 2011 sys drwxrwxrwt. 2 root root 4096 Aug 30 2013 tmp drwxrwxr-x. 10 root root 4096 Dec 8 2011 usr drwxrwxr-x. 14 root root 4096 Sep 11 2012 var lrwxrwxrwx. 1 root root 25 Dec 8 2011 vmlinuz -> boot/vmlinuz-2.6.32-5-686 Il s'agit du système Linux sur lequel la box boot en mode Recovery. [root@redhat sdc3]# df -m . Filesystem 1M-blocks Used Available Use% Mounted on /dev/mapper/loop0p3 1467 769 624 56% /mnt/sdc3 . Conclusion Après un certains nombres d'expériences non décrites ci-dessus : La restauration du dump sur la même clé fonctionne, j'ai pu rebooter et faire un recovery. En revanche, la restauration du dump sur une autre clé ne fonctionne pas complètement (certaines fonctionnalités ne fonctionneront pas, comme les sauvegardes, la réinitialisation de la puce Z-Wave, l'exclusion de modules, ... particulièrement en v4 où la sécurité a été renforcée) En effet, Fibaro utilise cette clé comme un dongle de protection. Les informations utilisées sont situées dans le firmware de la clé, et non sur les cellules flash. Par conséquent, elle ne sont pas prises en compte par la commande "dd". Donc si la clé est défectueuse (read only, secteurs défectueux, etc...), la méthode officielle est de se rapprocher du revendeur ou de Fibaro pour procéder à un échange. A noter que dans la mesure où la génération d'une nouvelle clé expose une partie des protections mises en place par Fibaro, ils refusent l'intervention à distance et imposent jusqu'à présent un retour complet de la box. Cependant, dans le cas où les données de la clé USB sont corrompues, mais que la clé n'est pas physiquement endommagée, il est tout à fait envisageable de reconstruire une clé de recovery from scratch pour les utilisateurs qui n'auraient pas fait de clone préalable. Il faut simplement les éléments suivants : - MBR (512 octets) - archive du répertoire system de la première partition - image de la seconde partition Cette expérience a été validée avec succès dans ce topic.
    14 points
  26. Hello, Pour changer des scripts et autres paramètres de configuration, je vous propose du bricolage Ce tutoriel décrit en image comment réaliser des fausses piles en bois, destinées à remplacer les vraies piles de nos appareils électroniques qui ont une fâcheuse tendance à se décharger bien trop vite, surtout pour les équipements Z-Wave telles que les sondes de températures. Contrairement à une alimentation soudée, ces fausses piles permettent de conserver la garantie de l'appareil alimenté. Bien sûr, pour que cela fonctionne, il faut que l'appareil à alimenter sur secteur puisse se satisfaire d'un fil à la patte, ce qui peut nécessiter le passage d'une gaine encastrée dans le mur afin de conserver un WAF acceptable. Pour commencer, un tour sur Wikipédia nous permet de trouver les dimensions des piles standards. Ce tuto décrit la réalisation d'une fausse pile AA, ayant pour longueur 50 mm et pour diamètre 14,2 mm. On peut bien entendu réaliser de la même façon des piles AAA, ou tout autre format. Dans notre magasin de bricolage préféré, on cherche des tourillons du bon diamètre. Je n'ai pas trouvé de 14mm, alors je me rabat sur du 12mm. C'est vendu au mètre. Il est fortement conseillé de disposer d'une boite à onglet pour guider la scie : On découpe une longueur d'environ 45mm afin de laisser de la place pour la tête de vis. On notera que j'ai fait le choix de prendre des vis à tête hexagonale, car elles ont une tête plate, ce qui permettra un meilleur contact dans le logement des piles : A l'aide d'un forêt à bois de diamètre 3mm, on perce dans la longueur du tourillon. Si on ne dispose pas d'une perceuse à colonne, ce n'est pas évident de rester aligné dans l'axe. Il est indispensable de bloquer le tourillon dans un étau : A l'aide d'un forêt de 8mm environ, on perce cette fois-ci un trou sur le coté afin de récupérer l'autre extrémité de la vis lorsque celle-ci sera en place. Attention à ne pas traverser complètement le tourillon, ce qui fragiliserait le tourillon inutilement : La vis en place : On prend ensuite du fil électrique multibrin, de préférence rouge (positif) et noir (masse) afin de respecter les conventions. J'utilise du fil électrique qu'on trouve en magasin automobile en petite bobine. La section est très largement surdimensionnée pour le très faible courant qu'on va faire passer dedans. Il y a 2 solutions possibles pour fixer le fil sur la vis : - fil noir : souder un gros paquet d'étain, en prenant soin de ne pas cramer le bois - fil rouge : j'ai réalisé le trou de 8mm plus près du bord, ainsi la vis traverse intégralement le trou. Ensuite, en vissant, le fil s'entortille tout autour. Les 2 piles sont prêtes. Il faut maintenant trouver une alimentation secteur correspondant à la tension des piles. Dans cet exemple j'utilise un vieux chargeur, qu'on relie comme on peut à nos fils. Ce n'est pas propre, je proposerai peut-être dans la futur comment réaliser une alimentation sérieuse. Ce chargeur délivre du 5V (vérifié au multimètre), tandis que j'ai besoin de 4,5V. Cette légère surtension ne devrait pas poser de soucis à l'appareil que je vais alimenter : On met en place les 2 piles dans le logement, de telle sorte que le fil rouge alimente le coté positif, et le fil noir alimente le coté négatif. Ici il s'agit d'un Everspring ST814 : On referme si possible le capot. Je ne sert pas la vis trop fort afin de ne pas couper les 2 fils, mais une autre solution serait de faire un petit trou dans la coque, mais avec évidemment la perte de la garantie : Puisque la HC2 ne permet pas de voir le niveau de la batterie des modules, on utilise le Toolkit de Krikroff pour vérifier qu'on a une batterie chargée à 100% : { "id": 65, "name": "ST814", "roomID": 8, "type": "humidity_sensor", "properties": { "UIMessageSendTime": "0", "batteryLevel": "100", "batteryLowNotification": "1", ... } Dans mon cas, il s'agit d'un capteur qui est situé dans la cave, donc le coté esthétique de l'alimentation ne me gêne pas pour le moment. Et surtout, ce capteur m'a bouffé 3 jeux de piles en 3 mois ! C'est étonnant car mes 2 autres ST814 n'ont pas ce défaut. Maintenant, on peut baisser l’intervalle de Wake-up de device, et dans le cas d'un capteur de température/humidité, lui demander de remonter les informations à la moindre variation
    14 points
  27. REGLES DE BASE, INTERDICTIONS : Pas de post ou titres en MAJUSCULES Ecrire en Français avec un effort particulier sur la grammaire et orthographe Pas de référence au Warez, au piratage, au peer to peer... Pas d'insultes, de règlements de compte, de surenchère... Pas de message diffamatoire à l'encontre d'une personne, d'une marque, d'une boutique ou d'un autre site Pas de contenu porno... Pas de création de sujets pour du parrainage commercial ou personnel Pas d'utilisation à des fins lucratives ou par un professionnel Pas de reproduction non autorisé de notices ou de document protégés par le droit d'auteur Nous ne voulons pas d'un forum commercial, donc : Interdiction aux professionnels inscrits de faire de la publicité directe ou indirecte vers leur commerce et de se servir du forum comme outil promotionnel Pas de lien vers un site de Vpc ou blog ou site perso dans les signatures. Interdiction aux professionnels d'utiliser un pseudo en lien direct avec leur activité. Interdiction aux professionnels d'utiliser leur logo professionnel ou en lien avec leur activité en tant que photo de profil ​Interdiction formelle aux professionnels d'envoyer des MP aux membres à des fins commerciales ou de démarchage. Les administrateurs s’octroient le droit à la clôture du compte de l'utilisateur ne respectant pas ces règles, et ceci avec ou sans préavis. RàˆGLES DE BONNE UTILISATION Pour permettre à tout le monde de naviguer correctement, les photos ne devraient pas excéder 800x600. Au delà , ne mettre que le lien vers la photo, sans l'afficher directement, ou utilisez le principe des vignettes cliquables. Le language SMS, grossier ainsi que les abréviations abusives sont à éviter, afin de garder un forum propre et lisible. Rédigez vos messages dans un français correct. Les réponses a des sujets/messages n'étant faites que par un ou plusieurs smileys sont à éviter : cela ne fait pas avancer les choses. De même que les réponses du style "+1" ou "UP", on évite cela ici! Les nouveaux sujets avec un titre racoleur, non explicite ou en majuscule pourront être supprimés sans préavis. Le titre de votre sujet doit résumer/expliquer le contenu de votre message. Tout message publié l'est sous la responsabilité de son auteur. Restez courtois, poli et positifs dans vos messages. Votre intervention doit être constructive : éviter de vous positionner en perturbateur ou d'avoir un comportement systématiquement revendicateur. RàˆGLES D'USAGE N'oubliez pas que vous vous êtes engagés a respecter une charte lors de votre inscription ! Lorsque vous créez un nouveau sujet, assurez vous qu'il n'en existe pas un sur le même thème. Lorsque vous posez une question, surtout lors d'un nouveau sujet, pensez à saluer et remercier... Assurez vous d'utiliser la fonction de recherche avant de créer un nouveau sujet. Ne pas utiliser le bouton "citer" pour répondre au dernier message. Bon surf, L'équipe Domotique-Fibaro
    14 points
  28. Note : le QuickApp pour HC3 se trouve ici : https://www.domotique-fibaro.fr/topic/14594-quick-app-synology-surveillance-station/ Présentation Voici un Module Virtuel permettant de activer/désactiver les caméras, et démarrer/arrêter l'enregistrement des caméras gérées par l'outil Surveillance Station qu'on trouve sur les NAS Synology. Ce module permet également de piloter le positionnement PTZ des caméras motorisées. Ce module virtuel dispose de 5 boutons : Start : démarrer l'enregistrement Stop : arrêter l'enregistrement Enable : activer la/les caméra(s) Disable : désactiver la/les caméra(s) List : permet de récupérer l'ID des caméras connues par Surveillance Station. Pour utiliser ce bouton, il faut ouvrir la fenêtre de Debug car c'est pour le moment la seule façon que j'ai trouvé d'afficher les informations à l'écran. Ainsi que d'un nombre de boutons paramétrables : Un bouton pour chaque position mémorisée De plus, la main loop permet de surveiller le statut des caméras et d'adapter l’icône du module virtuel en conséquence. Pré-requis : Au moins une caméra doit être gérée par Surveillance Station : Il est conseillé de paramétrer la caméra en détection de mouvement permanente : Si la caméra en est capable, des positions prédéfinies doivent être mémorisées pour les caméras à piloter : Création d'un utilisateur dédié : Bien que non-obligatoire, il est conseillé pour des raisons de sécurité de créer un utilisateur dédié dans DSM. Ainsi, le mot de passe du compte admin n'est pas exposé dans le code source du module virtuel. Note : la version 4.3 est utilisée pour les screenshots suivants, mais la méthode est strictement identique pour les versions 5.x de DSM. Ouvrir le panneau de configuration : Ouvrir le panneau des utilisateurs : Cliquer sur le bouton "Créer", et entrer les informations utiles. Note : il est judicieux de cocher la case "Ne pas autoriser l'utilisateur à changer le mot de passe du compte" : Cocher le groupe "users" : Cocher les cases "Pas d'accès" pour l'ensemble des dossiers partagés : Ne rien cocher : Décocher les cases de tous les privilèges, et ne cocher que la case "Surveillance Station" : Ne rien modifier : Vérifier que tout est bon, et cliquer sur le bouton "Appliquer" : De retour dans Surveillance Station, ouvrir le panneau Utilisateur, puis sélectionner l'utilisateur Fibaro préalablement créé, et cliquer sur le bouton "Modifier" : Dans la liste déroulante "Profil de privilège", sélectionner "Gestionnaire tout objet", puis cliquer sur le bouton "OK" : L'utilisateur dispose maintenant des droits Directeur : Import du module virtuel : Dans l'interface du Home Center 2, importer le fichier Surveillance_Station.vfib : Modifier les icônes du module et de tous les boutons avec les images suivantes : Module virtuel : surveillancestation_128.png Start : surveillancestation_rec_128.png Stop : surveillancestation_stop_128.png Enable : surveillancestation_enable_128.png Disable : surveillancestation_disable_128.png List : surveillancestation_list_128.png Move : surveillancestation_ptz_128.png Configuration : Modifier les propriétés du module virtuel, et entrer les informations correctes pour joindre le Synology : Adresse IP et Port TCP : Modifier les propriétés avancées du module virtuel, et modifier les premières lignes de chacun des boutons avec vos paramètres : -- User configurable variables local login = "user" -- Utilisateur Synology local password = "password" -- Mot de passe Synology. Pour les boutons PTZ, il faut spécifier le preset correspondant à chaque bouton (la caméra positionnée sera obligatoirement la première caméra listée dans la main loop, voir plus bas) : local preset = 1 -- ID de la position PTZ Pour récupérer l'ID des caméras, et les ID des positions PTZ, il faut utiliser le mode "Debug" sur le bouton "List". Dans l'exemple ci-dessous, il y a une seule caméra avec l'ID n°2, et 4 positions PTZ avec les ID n°1, 2, 3, 4 : Remarque : lors de l'importation du module virtuel, le Virtual Device possède 4 boutons PTZ, mais ceci est à modifier en fonction de votre propre environnement. Il faut 1 bouton par position et par caméra. Main Loop : Ce module virtuel dispose d'une Main Loop qui surveille le statut des caméras avec un intervalle de rafraichissement de 10 secondes et met à jour : l’icône du module virtuel un label du module virtuel une variable globale Pour la configuration de cette main loop, il faut modifier les paramètres suivants : login : Utilisateur Synology password : Mot de passe Synology cameras : {0} => détection automatique des caméras. Par conséquent, les boutons d'action Enable/Disable/Start/Stop agiront sur toutes les caméras simultanément. {1} ou {2} ou {1, 2, 3} ... => ID de la (ou des) caméra(s) à gérer. On peut envisager de ne piloter qu'une seule caméra, et de multiplier les modules virtuels, afin que chaque module virtuel ne soit responsable que d'une seule caméra (voir aussi VG_status ci-dessous) VG_status : SurvStation_Status => variable globale par défaut créée automatiquement, qui contient le statut de la (ou des) caméra(s), pouvant être exploité dans des scripts LUA. Valeur personnalisée => nécessaire si plusieurs instances du VD afin de piloter différentes caméras (voir aussi cameras ci-dessus). Celle-ci sera également automatiquement créée au démarrage du VD. refresh : intervalle de rafraichissement du statut, par défaut à 10 secondes. standbyIcon, recordIcon, disableIcon : ID des icônes Standby, Recording, et Disabled -- User configurable variables local login = "user" local password = "password" local cameras = {0} -- {1,2,4,5,6} -- Liste de une ou plusieurs caméras, pour les boutons Start, Stop, Enable, Disable local VG_status = "SurvStation_Status" local refresh = 10 -- seconds local standbyIcon = 1010 local recordIcon = 1011 local disableIcon = 1029 Pour récupérer les ID des 3 icônes, le plus simple est d'utiliser le Toolkit HC2 de Krikroff, on sélectionne l'onglet Virtual Devices, puis Get API Raw Data, puis là on cherche la valeur du paramètre buttonIcon des boutons Start, Stop, et Disable : Utilisation : - Un clic sur les boutons "Enable" ou "Disable", a pour effet d'activer/désactiver la caméra dans Surveillance Station, donc d'activer ou désactiver la détection de mouvement par le Syno. - Un clic sur le bouton "Start" a pour effet de forcer le démarrage de l'enregistrement continu des caméras sur le disque dur du NAS. - Un clic sur le bouton "Stop" a pour effet d'arrêter l'enregistrement continu des caméras, qui est équivalent à repasser en détection de mouvement - Un clic sur les boutons de position PTZ permet de déplacer la caméra. - La Main Loop surveille l'enregistrement des caméras, et ajuste l’icône du module virtuel en conséquence, ainsi qu'un petit message en vert en bas du module si un enregistrement est en cours. Ensuite, vous pouvez appeler ces boutons depuis vos scènes, par exemple à heure fixe programmée, ou en fonction des scénarios tels que la mise en fonctionnement de l'alarme, ou la détection de mouvement. Changelog : v1.0 : Initial release v1.01 : Minor bug fixes v2.0 : Main Loop and PTZ control v4.0 : Improved main loop, Add Enable/Disable buttons, Add cameras auto-detection v4.3 : Improved SID connection, added Status global variable v4.4 : Enhanced management of single or multiple camera Téléchargement : Surveillance_Station_v4.4.vfib
    13 points
  29. Note : les images ne sont plus disponibles ici, vous pourrez retrouver le tuto complet sur mon site à cette adresse : https://fredomotique.wordpress.com/informatique/nas-synology-sur-n54l/ Vous cherchez un NAS pour stocker vos données en réseau, vous devez installer plusieurs disques durs dedans ou vous avez besoin d'une solution évolutive. Les NAS Synology, dont la réputation n'est plus à faire, s'avèrent rapidement onéreux, dès lors qu'ils possèdent plusieurs baies de stockage. La solution proposée ici se révèle assez économique. En effet, HP propose un produit très complet, à prix compétitif, le presque célèbre serveur HP N54L , dont la référence complète est "HP ProLiant MicroServer G7 N54L 1P 2GB-U Non-hot Plug SATA 250GB 150W PS Server" 1 - Projet: Le but de ce tutorial est de construire une machine bien plus évoluée qu'un "simple" NAS SYNOLOGY, qui permettra dans un premier temps de créer un "vrai" NAS Synology avec la dernière version logicielle DSM 5-4482, mais ensuite d'installer d'autres systèmes (Windows, LINUX, ...) totalement indépendant et fonctionnant en même temps, et ce, par le biais du logiciel de Virtualisation VMware ESXi 5.5. Ce logiciel sera gratuit dans cette configuration. Il est impératif de rajouter de la RAM, afin que les systèmes puissent cohabiter et surtout fonctionner simultanément. Bien que HP mentionne officiellement que la RAM est limité à 8Go, la carte mère accepte 2x8Go sans problème. Néanmoins, bien que dans les spécifications constructeur, il faille installer de la RAM "PC3-10600E DDR3 Unbuffered (UDIMM) ECC memory" toutes les références ne sont pas fonctionnelles, il faudra se référer au lien suivant pour faire son choix: http://n40l.wikia.com/wiki/Memory Il faudra également rajouter au moins un disque dur de capacité conséquente et adapté à une utilisation "NAS". L'article donné ci-dessous fait le point sur le type de disque à installer: http://www.tomshardware.fr/articles/disques-durs-nas,2-887.html Pour résumé, les Seagate Constellation et les Western Digital Caviar RED seront parfaitement adaptés. Ce tuto est le fruit de très nombreuses recherches et collectes d'informations récupérées sur divers forums français et étrangers, mais aussi d'autres tuto qui ne sont plus forcément à jour, ou sans mise en place de la virtualisation. Il a été établi en suivant scrupuleusement l'installation effectuée, et toutes les étapes ont été volontairement inscrites, afin que toute personne puisse le suivre. Un grand merci à l'ami Lazer pour son aide très précieuse. Temps de mise en oeuvre: entre 2H et 4H 2 - Présentation du serveur: voilà le serveur HP N54L, bien connu des adeptes de la virtualisation et autres utilisateurs de solutions parallèles de stockage réseau SYNOLOGY. En face avant, 4 port USB 2.0 (pas d'USB 3 et c'est dommage), 1 emplacement 5 1/4 pour lecteur optique, 1 bouton ON/OFF, et 1 porte avec serrure. La porte avant laisse découvrir les 4 baies internes et la carte mère bien caler dans le bas du boitier : A l'arrière, on y trouve le connecteur d'alimentation 230v, un petit ventilateur pour l'alimentation interne, un assez gros ventilateur pour refroidir la carte mère et les 4 baies, la prise Ethernet Gigabit, 2 ports USB2.0, une sortie VGA, un port eSATA et 2 port PCI-EXPRESS pour carte au format Low Profile. On pourra quand même rajouter par exemple une carte USB 3.0. Il est possible de conserver cette configuration d'origine, en ne rajoutant qu'une clé USB pour stocker le boot SYNOLOGY. Dans ce cas, le stockage s'en trouvera limité car il faudra se contenter des 250Go livrés en standard. On pourra bien entendu étendre le stockage par l'ajout de disques supplémentaires, tout comme dans un NAS Synology à plusieurs baies. 3 - Spécifications: - Vitesse du processeur de l'horloge: 2.2 GHz - Modèle de processeur: AMD Turion II N54L modèle Neo - Cache L2: 2 Mo - Mémoire interne: 2 Go - Type de mémoire interne: 2R x8 PC3-10600E-9 - Mémoire interne maximale: 8 Go ( en fait, il est possible d'installer 2x8Go) - Nombre de baies (non Hot-Plug) pour disques durs SATA 31/2: 4 - 1 disque dur SATA 250Go fourni -1 emplacement 51/4 pour lecteur optique (non livré en standard) - Type d'alimentation d'énergie: alimentation non redondante non hot-plug 150W multi-sorties Vous trouverez ici les spécifications complètes: http://h18000.www1.hp.com/products/quickspecs/13716_div/13716_div.pdf il est disponible ici pour un prix de 199€ TTC: http://www.fnac.com/mp20220705/HP-ProLiant-MicroServer-Turion-II-Neo-N54L-2-2-GHz-2-Go-250-Go/w-4 4 - Matériel nécessaire: - 1 ordinateur sous windows (le tuto sera à adapter pour d'autres systèmes d'exploitation) avec graveur CD - le lecteur optique externe sur port USB (si boot de ESXi 5.5 sur CD) - 1 clavier USB - 1 tournevis cruciforme - 1 petit tournevis plat 5 - Préparation Hardware: En plus de la configuration d'origine, nous allons rajouter le matériel suivant: - 1 clé USB 8Go pour enregistrer VMware ESXi 5.5 : Kingston DataTraveler Micro 8Go : environ 6,50€ ici : http://www.grosbill.com/4-kingston_datatraveler_micro_8go_usb2_dtmck_8gb_-169883-informatique-cles_usb_3_0 - 2x8Go de RAM : ici de la Kingston KHX1600C10D3B1K2/16G : environ 140€ ici http://www.grosbill.com/4-kingston_hyper_x_blu_16go_2x8go_pc12800_1600_mhz_cl10_-606223-informatique-memoire_ddr3 Attention : L'espace est assez limité entre la carte mère et le bas du chassis des rack de disques dur. Certaines barettes possèdent des dissipateurs assez volumineux, et c'est un paramètre à ne pas négliger dans le choix des barrettes, outre la compatibilité fonctionnelle. Certains ont été obligés de bricoler leurs RAM en ôtant la partie supérieure, et le dissipateur ne fait plus son effet correctement ! - 1 Disque dur 2To pour les datas: WD Caviar RED 2To : environ 90€ ici http://www.grosbill.com/4-western_digital_caviar_red_2_to_sata_6go_s_64_mo_cache_disque_dur_special_pour_nas-169015-informatique-_disque_dur (sur la photo, je l'ai déjà installé dans son rack) - 1 CD vierge, qui pourrait être remplacé par une clé USB, pour enregistrer l'ISO de l'installation de VMware ESXi 5.5 une fois la porte ouverte, il est facile d'extraire le disque dur d'origine présent dans le rack de gauche: La vis située en haut, à l'arrière du serveur, permet de retirer le capot supérieur. Ce n'est pas utile dans le cas présent, mais se serait nécessaire pour installer un lecteur optique ou jusqu'à 2 disques durs supplémentaires. Cela permet quand même d'enlever la porte, ce qui s'avèrera plus pratique pour le démontage: On remarque à l'intérieur de la porte une petite clé et des vis (4 grises et 12 noires). Il y avait 16 vis noires, j'en ai déjà utilisé 4 pour monter le disque 2To dans son rack. Il y a donc de quoi fixer 4 disques durs et 1 lecteur optique (vis grises). Pour extraire la carte mère, on peut voir ci-dessous 2 vis bleues, de part et d'autre à l'avant de la carte mère: Une fois dévissée, la carte mère coulisse vers l'avant, il est alors possible de déconnecter gentiment les nappes en s'aidant éventuellement d'un petit tournevis plat: Voici donc la carte mère avec l'ancienne RAM 2Go, puis les 2 nouvelles (2x8Go) Il n'y a plus qu'à remettre la carte mère dans la glissière l'enfoncer dans le serveur, connecter précautionneusement les nappes et serrer les 2 vis bleues. Ensuite, remettre la porte et le capot supérieur. !!! NE PAS REMETTRE LE DISQUE 250Go DANS LE SERVEUR !!! 6 - Préparation du Bios: - Brancher l'écran VGA, la clé USB et le clavier sur le N54L - Brancher le cable d'alimentation - démarrer le N54L (bouton ON/OFF en face avant) - appuyer sur la touche F10 pour entrer dans le bios - dans la partie BOOT, mettre "BOOT USB" sur "HIGH" et "1st Boot Device" sur "USB" (le nom de votre clé USB doit être affiché) - sauvegarder les modifications et quitter. - éteindre le N54L et débrancher la clé USB 7 - Modification du Bios: - récupérer le dernier BIOS (SP64420) officiel HP à cette adresse: BIOS N54L version 2013.10.01 (A) (15 nov. 2013) Il sera nécessaire de s'enregistrer pour avoir accès au téléchargement. - brancher la clé USB sur le PC - exécuter le SP64420.exe, il va s'installer sur l'ordinateur en c:\SWSetup/SP64420 - suivre les instructions pour installer le BIOS sur la clé USB - récupérer le patch à cette adresse: Patch BIOS 041100113.ROM - remplacer le fichier O41100113.ROM présent sur la clé USB par le fichier patch "O41100113.ROM". - éjecter "proprement" la clé USB et brancher la sur un port USB du serveur N54L 8 - Flashage du BIOS: - mettre la clé USB sur un port USB du N54L - allumer le N54L - le serveur doit démarrer sur la clé, il doit s'afficher: puis: - Après 1 ou 2 secondes, le prompt "c:\>" est affiché, le flashage est terminé. - éteindre le serveur - débrancher la clé USB - allumer le serveur pour vérifier l'affichage de la nouvelle version patchée: - 3 lignes plus bas, vérifier la quantité de RAM installée, donc maintenant: 16384MB Total Memory Detected AMIBIOS©2006 American Megatrends HP System BIOS - 041 (10/01/2013) - appuyer sur la touche F10 pour entrer dans le Bios 9 - Configuration du Bios: - aller dans "Chipset"..."SouthBridge Configuration"..."SB SATA Configuration" - effectuer les réglages suivants: - sauvegarder les modi StarWindConverter.exe.zip SP64420.exe.zip O41100113.ROM.zip
    13 points
  30. Bonjour à tous, J'arrive peut-être (longtemps ?) après la bataille, mais ça me fend le coeur de balancer des piles usagées (et encore plus d'en racheter...). Surtout au tarif des CR123A. Certes c'est une ou deux par an, mais c'est toujours ça en plus à recycler (dans le meilleur des cas..). Je souhaitais présenter une solution pour remplacer les piles jetables CR123A (qui équipent par exemple le MotionSensor de Fibaro), par des accus rechargeables de type "R"CR123A. On trouve facilement ce genre de matériel (Amazon par exemple, 1001 piles, etc...) pour 20 à 40 € (et même moins...) Et il existe même des capacités allant jusqu'à 1800 mAh (par rapport à la capacité standard des piles, de 600 à 800 mAh) Cette solution fonctionne dans mon installation depuis un an. Cela permet, outre des économies à long terme (à modérer ?), d'utiliser ces modules "à donf" sans se coucier de leur consommation. Certes, il reste deux solutions ultimes : une fausse pile (avec alim. externe, solution connue aussi). Je prépare aussi un circuit à base de cellule solaire pour "biberonner" cet accu au fil du temps.... PS : Il existe aussi des accus pour les 1/2-AA qui équipent par exemple les contrôleur Fibaro d'ouverture de fenêtre. (Batterie 1/2 AA (ER14250) 3,6 V 1200mA [lithium-chlorure de thionyle] - chez Amazon, toujours par exemple)
    13 points
  31. Bonjour, Voilà , le code est enfin correct, je le partage donc. Je n'ai pas beaucoup de temps ce soir, mais voici 2-3 points: - Ce VD crée automagiquement 3 Variables globales (si demandé dans les options) - Ce VD est multilingue - Ce VD fait des push de la météo à deux moments de la journée - CE VD s'adapte aux mobiles et à l'interface web - Ce VD télécharge automagiquement les icônes - Ce VD a besoin d'une clef APi de Wunderground, - La partie mobile du VD n'est pas encore complètement terminée. Merci à Jompa68 de forum.fibaro.com pour le code de base Pour l'installer: - Téléchargez le vfib attaché et importez le dans la HC2 - Changer l'icône du slider avec l'icône attachée: - Utilisez le dernier code disponible sur github: https://github.com/sjauquet/YAMSWU Qui ajoute la création de VG qui contiendront la météo prononçable par une synthèse vocale comme S.A.R.A.H.: http://www.domotique-fibaro.fr/index.php/topic/6446-yams-wu-yet-another-meteo-station-wunderground-version/page-4#entry132933 et placez-le dans le main loop du VFIB (V3.9) attaché à ce message - Changez l'api key. Pour cela, créez un compte wunderground et allez la récupérer ici: http://www.wunderground.com/weather/api/ WU.APIkey = "xxxxxxxxxxxxxxx" - Ensuite définissez les variables suivantes: WU.PWS = "IGVLEBOR5" -- The PWS location to get data from (Personal Weather Station) WU.LOCID = "SWXX0076" -- The location ID to get data from (City location) WU.station = "PWS" -- Choose your prefered method to retrieve from: PWS or LOCID Personnellement je préfère utiliser les infos d'une pws près de chez moi. Pour trouver ces variables: @bono2007 écrivait: Pour trouver, j'ai eu la station PWS en cliquant dans "Search locations" sur Wunderground, on te propose "search nearest station", et il a proposé une station météo proche. Sinon en entrant ta ville, tu peux cliquer sur "change Station" et tu verras une carte avec d'autres stations météo. Exemple : j'ai entré "Boussois" et j'ai comme station météo "Cit du Grand Bois, Récquignies ( IRECQUIG2) J'ai modifié WU.PWS = "IRECQUIG2" Et tout devrait fonctionner :-) Virtual device avec code V3.7 (ancien à remplacer !!! ) YAMS_WU.vfib Virtual device avec code V3.9 YAMS_WU V3.9.vfib Voici les dernières captures d'écran pour avoir une idée: à gauche en mode Browser Web, à droite en mode Mobile (les icônes ne sont pas téléchargeables) Attention, ancien code ci-dessous ! ------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------- -- WU WeatherData - Fetch weather data from wunderground.com. Multilanguage support! -- Original Code by Jonny Larsson 2015 http://forum.fibaro.com/index.php?/topic/19810-wu-weatherdata-version-202-2015-10-25/ -- forked by Sébastien Jauquet 11/2015 -- Inspired by GEA(steven), stevenvd, Krikroff and many other users. -- Source - forum.fibaro.com, domotique-fibaro.fr and worldwideweb -- -- Version 3.7 -- -- PWS = Personal Weather Station -- LOCID = Public station -- -- 2014-03-22 - Permissions granted from Krikroff -- 2014-03-23 - Added rain and forecast, Added FR language. -- 2014-03-23 - Language variable changed to get the translation from wunderground.com in forcast -- 2014-03-24 - Added PL language -- 2014-03-24 - Select between PWS or LOCID to download weather data -- 2015-10-23 - New source code. -- 2015-11-13 - V3.0 - Fork Code by Sebastien Jauquet (3 days forecast, rain in mm) -- 2015-11-14 - V3.1 - Compatibilty with GEA, French translation -- 2015-11-14 - V3.2 - Catch rain errors (-999mm null empty etc.) -- 2015-11-14 - V3.3 - Catch json decode error (was stopping main loop) with pcall (can be extended to other jdon datas if needed) -- 2015-11-16 - V3.4 - Generate HTML and non HTML version (for compatibility with mobiles) -- 2015-11-18 - V3.5 - Fixed bug not updating Meteo_Day becaus WU.now was only updated at first launch -- 2015-11-18 - V3.6 - Merged some changes from jompa new version -- 2015-11-18 - Added autmatic creation of Global Variables if not existing -- 2015-11-19 - V3.7 - Modify schedule management and CleanUp code -- Look for nearest station here: http://www.wunderground.com ------------------------------------------------------------------------------------------- -- MAIN CODE -- ------------------------------------------------------------------------------------------- WU = {} -- WU settings WU.APIkey = "xxxxxxxxxxxxxxx" -- Put your WU api key here WU.PWS = "IGVLEBOR5" -- The PWS location to get data for (Personal Weather Station) WU.LOCID = "SWXX0076" -- The location ID to get data for (City location) WU.station = "PWS" -- PWS or LOCID -- Other settings WU.translation = {true} WU.language = "FR"; -- EN, FR, SW, PL (default is en) WU.smartphoneID = 1347 -- your smartphone ID WU.sendPush = true -- send forecast as push message WU.push_fcst1 = "07:00" -- time when forecast for today will be pushed to smartphone WU.push_fcst2 = "18:15" -- time when forecast for tonight will be pushed to smartphone WU.GEA = true -- subst % with %% when storing in the VG's (because gea bug with % in push messages) WU.CreateVG = true -- will atomaticaly create global variables at first run if = true updateEvery = 30 -- get data every xx minutes WU.startTime = os.time() WU.scheduler = os.time()+60*updateEvery WU.currentDate = os.date("*t"); WU.now = os.date("%H:%M"); DoNotRecheckBefore = os.time() WU.selfId = fibaro:getSelfId() WU.version = "3.7" WU.translation["EN"] = { Push_forecast = "Push forecast", Exiting_loop_slider = "Exiting loop earlier (Slider Changed)", Exiting_loop_push = "Exiting loop earlier (For push)", Last_updated = "Last updated", Temperature = "Temperature", Humidity = "Humidity", Pressure = "Pressure", Wind = "Wind", Rain = "Rain", Forecast = "Forecast", Station = "Station", Fetched = "Fetched", Data_processed = "Data processed", Update_interval = "Next update will be in (min)", No_data_fetched = "No data fetched", NO_STATIONID_FOUND = "No stationID found", NO_DATA_FOUND = "No data found" } WU.translation["FR"] = { Push_forecast = "Push des prévisions", Exiting_loop_slider = "Sortie de boucle (Slider Changé)", Exiting_loop_push = "Sortie de boucle (Pour Push)", Last_updated = "Mise à jour", Temperature = "Actuellement", Humidity = "Hum", Pressure = "Pression", Wind = "Vent", Rain = "Pluie", Forecast = "Prévisions pour ce", Station = "Station", Fetched = "Données Reçues", Data_processed = "Données mises à jour", Update_interval = "Prochaine Mise à jour prévue dans (min)", No_data_fetched = "Pas de données reçues !!", NO_STATIONID_FOUND = "StationID non trouvée !!", NO_DATA_FOUND = "Pas de données disponibles !!" } WU.translation["SW"] = { Push_forecast = "Push forecast", Exiting_loop_slider = "Exiting loop earlier (Slider Changed)", Exiting_loop_push = "Exiting loop earlier (For push)", Last_updated = "Last updated", Temperature = "Temperatur", Humidity = "Fuktighet", Pressure = "Barometer", Wind = "Vind", Rain = "Regn", Forecast = "Prognos", Station = "Station", Fetched = "Hà¤mtat", Data_processed = "All data processat", Update_interval = "Nà¤sta uppdatering à¤r om (min)", No_data_fetched = "Inget data hà¤mtat", NO_STATIONID_FOUND = "StationID ej funnet", NO_DATA_FOUND = "Ingen data hos WU" } WU.translation["PL"] = { Push_forecast = "Push prognoza", Exiting_loop_slider = "Exiting loop earlier (Slider Changed)", Exiting_loop_push = "Exiting loop earlier (For push)", Last_updated = "Last updated", Temperature = "Temperatura", Humidity = "Wilgotnosc", Pressure = "Pressure", Wind = "Wiatr", Rain = "Rain", Forecast = "Forecast", Station = "Station", Fetched = "Fetched", Data_processed = "Data processed", No_data_fetched = "No data fetched", Update_interval = "Next update will be in (min)", NO_STATIONID_FOUND = "No stationID found", NO_DATA_FOUND = "No data found" } WU.translation["NL"] = { Push_forecast = "Push verwachting", Exiting_loop_slider = "Exiting loop earlier (Slider Changed)", Exiting_loop_push = "Exiting loop earlier (For push)", Last_updated = "Last updated", Temperature = "Temperatuur", Humidity = "Vochtigheid", Pressure = "Druk", Wind = "Wind", Rain = "Regen", Forecast = "Verwachting", Station = "Weerstation", Fetched = "Ontvangen", Data_processed = "Gegevens verwerkt", Update_interval = "Volgende update in (min)", No_data_fetched = "Geen gegevens ontvangen", NO_STATIONID_FOUND = "Geen stationID gevonden", NO_DATA_FOUND = "Geen gegevens gevonden" } WU.translation["DE"] = { Push_forecast = "Push vorhersage", Exiting_loop_slider = "Exiting loop earlier (Slider Changed)", Exiting_loop_push = "Exiting loop earlier (For push)", Last_updated = "Last updated", Temperature = "Temperatur", Humidity = "Luftfeuchtigkeit", Pressure = "Luftdruck", Wind = "Wind", Rain = "Regen", Forecast = "Vorhersage", Station = "Station", Fetched = "Abgerufen", Data_processed = "Daten verarbeitet", No_data_fetched = "Keine Daten abgerufen", Update_interval = "Das nà¤chste Update in (min)", NO_STATIONID_FOUND = "Keine stationID gefunden", NO_DATA_FOUND = "Keine Daten gefunden" } Debug = function ( color, message ) fibaro:debug(string.format('<%s style="color:%s;">%s</%s>', "span", color, message, "span")); end WU.createGlobalIfNotExists = function (varName, defaultValue) if (fibaro:getGlobal(varName) == "") then Debug("red", "Global Var: "..varName.." HAS BEEN CREATED") newVar = {} newVar.name = varName HC2 = Net.FHttp("127.0.0.1", 11111) HC2:POST("/api/globalVariables", json.encode(newVar)) end end WU.substPercent = function(doublePercentSymbol) if WU.GEA then doublePercentSymbol = string.gsub(doublePercentSymbol, "%%.", "%%%%") end return doublePercentSymbol end WU.cleanJson = function(jsontocheck,returnIfTrue) if jsontocheck == "-999.00" or jsontocheck == "--" or jsontocheck == json.null then jsontocheck = returnIfTrue end local ok = pcall(function() testConcatenate = "Test Concatenate: " .. jsontocheck -- test for non concatenate value end ) if (not ok) then decode_error = true Debug( "red", "decode raised an error") fibaro:call(WU.smartphoneID , "sendPush", "decode error in WU Meteo") end return jsontocheck end WU.HtmlColor = function(StringToColor,color) if MobileDisplay == false then StringToColor= "<font color=\""..color.."\"> "..StringToColor.."</font>" end return StringToColor end WU.IconOrText = function(icon,txt) if MobileDisplay == false then IconOrText = "<img src="..icon.."\>" else IconOrText = txt end return IconOrText end WU.getSlider = function() ValeurSliderfunct = fibaro:getValue(WU.selfId , "ui.WebOrMobile.value") return tonumber(ValeurSliderfunct) end WU.setSlider = function(position) fibaro:call(WU.selfId , "setProperty", "ui.WebOrMobile.value", position) return WU.getSlider() end WU.checkMobileOrWeb = function() ValeurSliderSleep = WU.getSlider() -- check slider value at first run if ValeurSliderSleep <= 50 then if ValeurSliderSleep == 1 then MobileDisplay = false else MobileDisplay = false WU.runDirect = 1 sleepAndcheckslider = 20*updateEvery -- exit wait loop Debug("orange", WU.translation[WU.language]["Exiting_loop_slider"]); end WU.setSlider(1) -- désactive le run immediat lors du prochain test end if ValeurSliderSleep >= 50 then if ValeurSliderSleep == 98 then else MobileDisplay = true WU.runDirect = 1 sleepAndcheckslider = 20*updateEvery -- exit wait loop Debug("orange", WU.translation[WU.language]["Exiting_loop_slider"]); end WU.setSlider(98) -- désactive le run immediat lors du prochain test end return WU.getSlider() end WU.fetchWU = function() decode_error = false WU.checkMobileOrWeb() local WGROUND = Net.FHttp("api.wunderground.com",80); local response ,status, err = WGROUND:GET("/api/"..WU.APIkey.."/conditions/forecast/lang:"..WU.language.."/q/"..WU.station..":"..locationID..".json"); if (tonumber(status) == 200 and tonumber(err)==0) then Debug( "cyan", WU.translation[WU.language]["Fetched"]) if (response ~= nil) then WU.now = os.date("%H:%M") jsonTable = json.decode(response); if jsonTable.response.error ~= nil then Debug( "red", WU.translation[WU.language]["NO_DATA_FOUND"]) fibaro:sleep(15*1000) return end stationID = jsonTable.current_observation.station_id; humidity = jsonTable.current_observation.relative_humidity temperature = jsonTable.current_observation.temp_c pression = jsonTable.current_observation.pressure_mb wind = jsonTable.current_observation.wind_kph rain = WU.cleanJson(jsonTable.current_observation.precip_today_metric,"0") weathericon = jsonTable.current_observation.icon_url fcstday1 = jsonTable.forecast.txt_forecast.forecastday[1].title -- Day meteo fcst1 = jsonTable.forecast.txt_forecast.forecastday[1].fcttext_metric fcst1icon = jsonTable.forecast.txt_forecast.forecastday[1].icon_url fcst1SmallTxt = jsonTable.forecast.simpleforecast.forecastday[1].conditions fcst1Tmax = jsonTable.forecast.simpleforecast.forecastday[1].high.celsius fcst1Tmin = jsonTable.forecast.simpleforecast.forecastday[1].low.celsius fcst1avewind =jsonTable.forecast.simpleforecast.forecastday[1].avewind.kph fcst1avewinddir =jsonTable.forecast.simpleforecast.forecastday[1].avewind.dir fcst1mm = WU.cleanJson(jsonTable.forecast.simpleforecast.forecastday[1].qpf_day.mm,"0") fcstday2 = jsonTable.forecast.txt_forecast.forecastday[2].title -- Evening Meteo fcst2 = jsonTable.forecast.txt_forecast.forecastday[2].fcttext_metric fcst2icon = jsonTable.forecast.txt_forecast.forecastday[2].icon_url fcst2SmallTxt = jsonTable.forecast.simpleforecast.forecastday[2].conditions fcst2Tmax = jsonTable.forecast.simpleforecast.forecastday[2].high.celsius fcst2Tmin = jsonTable.forecast.simpleforecast.forecastday[2].low.celsius fcst2avewind =jsonTable.forecast.simpleforecast.forecastday[2].avewind.kph fcst2avewinddir =jsonTable.forecast.simpleforecast.forecastday[2].avewind.dir fcst2mm = WU.cleanJson(jsonTable.forecast.simpleforecast.forecastday[1].qpf_night.mm,"0") fcstday3 = jsonTable.forecast.txt_forecast.forecastday[3].title -- Tomorrow fcst3 = jsonTable.forecast.txt_forecast.forecastday[3].fcttext_metric fcst3icon = jsonTable.forecast.txt_forecast.forecastday[1].icon_url fcst3SmallTxt = jsonTable.forecast.simpleforecast.forecastday[1].conditions fcst3Tmax = jsonTable.forecast.simpleforecast.forecastday[1].high.celsius fcst3Tmin = jsonTable.forecast.simpleforecast.forecastday[1].low.celsius fcst3avewind =jsonTable.forecast.simpleforecast.forecastday[1].avewind.kph fcst3avewinddir =jsonTable.forecast.simpleforecast.forecastday[1].avewind.dir fcst3mm = WU.cleanJson(jsonTable.forecast.simpleforecast.forecastday[2].qpf_allday.mm,"0") fcstday5 = jsonTable.forecast.txt_forecast.forecastday[5].title -- In 2 days fcst5 = jsonTable.forecast.txt_forecast.forecastday[5].fcttext_metric fcst5icon = jsonTable.forecast.txt_forecast.forecastday[1].icon_url fcst5SmallTxt = jsonTable.forecast.simpleforecast.forecastday[1].conditions fcst5Tmax = jsonTable.forecast.simpleforecast.forecastday[1].high.celsius fcst5Tmin = jsonTable.forecast.simpleforecast.forecastday[1].low.celsius fcst5avewind =jsonTable.forecast.simpleforecast.forecastday[1].avewind.kph fcst5avewinddir =jsonTable.forecast.simpleforecast.forecastday[1].avewind.dir fcst5mm = WU.cleanJson(jsonTable.forecast.simpleforecast.forecastday[3].qpf_allday.mm,"0") if (stationID ~= nil) and decode_error == false then fibaro:call(WU.selfId , "setProperty", "ui.lblStation.value", locationID); if temperature < 5 then cTemperature = WU.HtmlColor(temperature,"blue") elseif temperature > 18 then cTemperature = WU.HtmlColor(temperature,"red") else cTemperature = WU.HtmlColor(temperature,"yellow") end fibaro:call(WU.selfId , "setProperty", "ui.lblTempHum.value", WU.translation[WU.language]["Temperature"]..": "..cTemperature.." °C - "..WU.translation[WU.language]["Humidity"]..": "..humidity); fibaro:call(WU.selfId , "setProperty", "ui.lblWindRain.value", WU.translation[WU.language]["Wind"]..": "..wind.." km/h - "..WU.translation[WU.language]["Rain"]..": "..rain.." mm"); if (WU.now >= "00:00" and WU.now <= "15:59") then -- donne meteo du jour entre 00:00 (ou 3h) et 15:59. permet de garder la météo du soir jusqu'a 3h du matin, sinon change à minuit fibaro:call(WU.selfId , "setProperty", "ui.lblFcst.value", WU.translation[WU.language]["Forecast"].." "..WU.HtmlColor(fcstday1,"yellow")..": "..WU.HtmlColor(fcst1.." ("..fcst1mm.." mm)","green")); fibaro:setGlobal("Meteo_Day", WU.substPercent(WU.translation[WU.language]["Forecast"].." "..fcstday1..": ".." "..fcst1.." ("..fcst1mm.." mm)") ); fibaro:call(WU.selfId , "setProperty", "ui.lblIcon.value",WU.IconOrText(fcst1icon,fcst1SmallTxt)); elseif (WU.now >= "16:00" and WU.now <= "23:59") then -- donne meteo soirée entre 16:00 et 23:59 fibaro:call(WU.selfId , "setProperty", "ui.lblFcst.value", WU.translation[WU.language]["Forecast"].." "..WU.HtmlColor(fcstday2,"yellow")..": "..WU.HtmlColor(fcst2.." ("..fcst2mm.." mm)","green")); fibaro:setGlobal("Meteo_Day", WU.substPercent(WU.translation[WU.language]["Forecast"].." "..fcstday2..": ".." "..fcst2.." ("..fcst2mm.." mm)") ); fibaro:call(WU.selfId , "setProperty", "ui.lblIcon.value",WU.IconOrText(fcst2icon,fcst2SmallTxt)); end -- Meteo of Tomorrow fibaro:call(WU.selfId , "setProperty", "ui.lblFcstTomorrow.value", WU.translation[WU.language]["Forecast"].." "..WU.HtmlColor(fcstday3,"yellow")..": "..WU.HtmlColor(fcst3.." ("..fcst3mm.." mm)","green")); fibaro:setGlobal("Meteo_Tomorrow", WU.substPercent(WU.translation[WU.language]["Forecast"].." "..fcstday3..": ".." "..fcst3.." ("..fcst3mm.." mm)") ); fibaro:call(WU.selfId , "setProperty", "ui.lblIconTomorrow.value",WU.IconOrText(fcst3icon,fcst3SmallTxt)); -- Meteo in 2 Days fibaro:call(WU.selfId , "setProperty", "ui.lblFcst2Days.value", WU.translation[WU.language]["Forecast"].." "..WU.HtmlColor(fcstday5,"yellow")..": "..WU.HtmlColor(fcst5.." ("..fcst5mm.." mm)","green")); fibaro:setGlobal("Meteo_In_2_Days", WU.substPercent(WU.translation[WU.language]["Forecast"].." "..fcstday5..": ".." "..fcst5.." ("..fcst5mm.." mm)") ); fibaro:call(WU.selfId , "setProperty", "ui.lblIcon2Days.value",WU.IconOrText(fcst5icon,fcst5SmallTxt)); if WU.sendPush then if (os.date("%H:%M") == WU.push_fcst1) then -- fibaro:call(WU.smartphoneID , "sendPush", fcstday1.." - "..fcst1) -- envoie meteo du matin elseif (os.date("%H:%M") == WU.push_fcst2) then fibaro:call(WU.smartphoneID , "sendPush", fcstday2.." - "..fcst2) -- envoie meteo du soir end end if WU.sendPush then fibaro:call(WU.selfId , "setProperty", "ui.lblNotify.value", WU.translation[WU.language]["Push_forecast"].." = true"); else fibaro:call(WU.selfId , "setProperty", "ui.lblNotify.value",WU.translation[WU.language]["Push_forecast"].." = false"); end WU.scheduler = os.time()+updateEvery*60 fibaro:call(WU.selfId, "setProperty", "ui.lblUpdate.value", WU.translation[WU.language]["Last_updated"]..": "..os.date("%c")); Debug( "cyan", WU.translation[WU.language]["Data_processed"]) Debug( "white", WU.translation[WU.language]["Update_interval"].." "..updateEvery) else Debug( "red", WU.translation[WU.language]["NO_STATIONID_FOUND"]) end else fibaro:debug("status:" .. status .. ", errorCode:" .. errorCode); end end sleepAndcheckslider = 0 while sleepAndcheckslider <= 20*updateEvery do fibaro:sleep(3000) WU.checkMobileOrWeb() sleepAndcheckslider = sleepAndcheckslider+1 if (DoNotRecheckBefore <= os.time()) and ((WU.scheduler == os.time) or (os.date("%H:%M") == WU.push_fcst1) or (os.date("%H:%M") == WU.push_fcst2)) then Debug("orange", WU.translation[WU.language]["Exiting_loop_push"]); DoNotRecheckBefore = os.time()+60 sleepAndcheckslider = 20*updateEvery end end end Debug( "orange", "WU Weather - Original LUA Scripting by Jonny Larsson 2015"); Debug( "orange", "YAMS WU - Fork by Sébastien Jauquet 11/2015"); Debug( "orange", "Version: "..WU.version); if WU.station == "LOCID" then locationID = WU.LOCID elseif WU.station == "PWS" then locationID = WU.PWS end if WU.CreateVG then WU.createGlobalIfNotExists("Meteo_Day", "") WU.createGlobalIfNotExists("Meteo_Tomorrow", "") WU.createGlobalIfNotExists("Meteo_In_2_Days", "") end while true do WU.fetchWU() end
    13 points
  32. Le forum vient de subir une longue panne.... la plus longue peut-être Jeudi soir la base de données a été pleine, comme c'est déjà arrivé plusieurs fois sur notre ancien hébergeur. Après un rapide ménage, le site est revenu opérationnel, mais a replanté à nouveau le lendemain matin (vendredi).... cette fois-ci, c'était le signe que les petites optimisations n'y feront rien et qu'il faut changer d'hébergeur, prévu de longue date. En effet, l'hébergeur 1&1 ne permet pas de faire grandir la base de données autant que nécessaire. Pas de chance, ce week-end personne n'était en mesure de s'occuper de cela.... Dimanche soir, ouverture d'un nouvel hébergement chez OVH. Le temps de transférer le domaine, les fichiers, d'importer la base de données, de générer le certificat SSL, puis de reconfigurer tout cela, nous voici à mardi soir.... cette fois-ci, espérons qu'on soit tranquille pour un moment Encore un peu de travail en perspective pour remettre en place les opérations de maintenance nécessaire, notamment le backup nocturne, mais ça ne devrait pas gêner le bon fonctionnement du site.
    13 points
  33. Hello, Voici un petit module virtuel qui va interroger la HC2 et qui permet quand on est pas à la maison, de garder un oeil sur la mémoire utilisée par notre HC2, la charge CPU et l'espace disponible pour le système respectivement le recovery. Voici mon icône, si cela peut vous intéresser...: Voici le module virtuel : HC2_Diagnostics.vfib Pour que ça marche, importer le Virtual Device et c'est prêt. Bonne découverte. @+ Razowski
    13 points
  34. En convertissant une scène en mode block je suis tombé sur la fonction setTimeout. Cette fonction retarde d'un delay défini l'exécution d'une séquence lua. Si la fonction sleep suspend le déroulement d'une scène, la fonction setTimeout met en arrière plan les instructions de la fonction, mais la scène lua poursuit son cours. --[[ %% properties 52 value 52 armed %% globals --]] fibaro:debug("Start"); fibaro:debug("scene n "..fibaro:countScenes()); local val = fibaro:getValue(52, "value"); local arm = fibaro:getValue(52, "armed"); fibaro:debug("Etat "..val.." "..arm); setTimeout(function() ------ début de la fonction local delayedCheck0 = false; local tempDeviceState0, deviceLastModification0 = fibaro:get(52, "value"); fibaro:debug("Temps écoulé "..os.time() - deviceLastModification0); if (( (tonumber(val) == 0 and tonumber(arm) == 0) ) and (os.time() - deviceLastModification0) >= 120) then delayedCheck0 = true; end if ( delayedCheck0 == true ) then fibaro:call(163, "turnOff"); end end, 120000) ------- fin de lafonction avec delai de 120 secondes fibaro:debug("End"); Le but de ce script est d'éteindre une lampe si plus d'activité (52 = détecteur de mouvement) pendant 2 mn. Analyse du debug. On voit que la scène s'exécute de Start à End en mettant la fonction timeout en attente. A chaque passage, il y a deux scènes qui démarrent. Val = 1 activation du détecteur, val = 0 retour au repos après 20 secondes. Quand le délai arrive à 120 secondes et pas de modification de l'état du détecteur, les instructions sont exécutées. Ici, éteindre la lumière. Il me semble que cette fonction peut ouvrir des horizons pour nos petit bidouillages.
    13 points
  35. Le but de ce tutoriel est de vous présenter 2 solutions pour remplacer l'antenne d'origine par une antenne avec gain. Cette nouvelle antenne "amplifiée" vous permettra d'augmenter la portée du signal Z-Wave et ainsi, de réduire les nÅ“uds morts. A ce stade, 2 solutions existent et dépendent de l’actuel emplacement de votre HC2 : Baie informatique Autre : placard, bureau... . Solution pour une baie informatique : Tout d'abord, il vous faudra vous procurer le matériel suivant : Adaptateur RP SMA femelle => SMA mâle (http://www.amazon.fr...8081_TE_3p_dp_1) Socle magnétique RP SMA (http://www.amazon.fr...0444391_TE_item) Antenne 868 Mhz (http://www.amazon.fr...8081_TE_3p_dp_1) Une fois le matériel en votre possession, il vous faudra réaliser les opérations suivantes: On stoppe proprement la HC2. On coupe les disjoncteurs sur lesquels se trouve vos modules. On démonte l'antenne d'origine. On visse l'adaptateur RP SMA femelle/mâle sur la sortie antenne de la HC2. On visse la nouvelle antenne sur le socle magnétique. On visse la rallonge du socle magnétique sur l'adaptateur vissé précédemment (étape 4). On redémarre la HC2. On patiente le temps que cette dernière réalise son redémarrage complet. On remet en tension tous les disjoncteurs coupés à l'étape 2. On patiente quelques minutes le temps que la HC2 réalise son nouveau maillage du réseau Z-Wave. Enjoy! Solution pour les autres emplacements : Tout d'abord, il vous faudra vous procurer le matériel suivant : Antenne coudée 868 Mhz (http://my-domotique.com/store/index.php?id_product=582&controller=product&id_lang=2)Une fois le matériel en votre possession, il vous faudra réaliser les opérations suivantes: On stoppe proprement la HC2. On coupe les disjoncteurs sur lesquels se trouve vos modules. On démonte l'antenne d'origine. On visse la nouvelle antenne sur la HC2. On redémarre la HC2. On patiente le temps que cette dernière réalise son redémarrage complet. On remet en tension tous les disjoncteurs coupés à l'étape 2. On patiente quelques minutes le temps que la HC2 réalise son nouveau maillage du réseau Z-Wave. Enjoy! Je remercie Nico, KriKroff, Lazer et BenjyNet pour leur aide apportée à mon problème de perte de réseau Z-Wave sur ma HC2. Ce tutoriel fait suite à ce dernier : http://www.domotique-fibaro.fr/index.php/topic/2475-perte-de-r%C3%A9seau-z-wave/
    13 points
  36. Ce tuto est très simple il va vous permettre de lire ou d'écrire dans une étiquette Pour vous donnez un cas concret on va crée un VD qui va nous donner l'Heure de Lever et Coucher du soleil On crée 2 étiquettes + un bouton Étiquette 1 Etiquette : Lever Soleil (Ce texte apparait a Gauche dans l'étiquette) ID : LabLever Étiquette 2 Etiquette : Lever Coucher (Ce texte apparait a Gauche dans l'étiquette) ID : LabCoucher On copie ce code dans le bouton local Jour = fibaro:getValue(1, "sunriseHour"); --Heure de lever du soleil local Nuit = fibaro:getValue(1, "sunsetHour"); -- Heure de coucher du soleil fibaro:call(fibaro:getSelfId(), "setProperty", "ui.LabLever.value", Jour); -- Ecriture de l'heure de lever dans le label fibaro:call(fibaro:getSelfId(), "setProperty", "ui.LabCoucher.value", Nuit); -- Ecriture de l'heure du coucher dans le label fibaro:log("Mise a jour en cours...") On s' aperçoit donc que : fibaro:getSelfId() ou local IdModule = fibaro:getSelfId() Ce code récupère l'id du module fibaro:call(fibaro:getSelfId(), "setProperty", "ui.Label1.value", "Bonjour"); ou local Text = "Bonjour" fibaro:call(fibaro:getSelfId(), "setProperty", "ui.Label1.value", Text); Ce code va écrire a droite dans le VD. ui.Label1.value -> Label1 et L'ID de l'étiquette ou l'on veut écrire Il n'est pas possible de mettre en page ce texte ni de changer la couleur. Certains on réussi a le faire en utilisant des balises HTML qui trompe le navigateur et juste le navigateur. Ici Le nombre de ligne qui peuvent être afficher est très réduit local toto = fibaro:getValue(fibaro:getSelfId(), "ui.Label1.value") fibaro:debug(toto) --Affichache de la valeur de l'étiquette Ce code permet de lire dans une étiquette ui.Label1.value -> Label1 et L'ID de l'étiquette ou l'on veut écrire Cela peut servir pour stocker des valeurs sans à avoir à passer par une variable globale http://<adresse ip>/api/callAction?deviceID=<id module>&name=setProperty&arg1=<NOMLABEL>&arg2=<texte> <id module> = identifiant du module virtuel <NOMLABEL> = c'est l'ID du label préfixé de "ui." et suffixé de ".value" ... exemple : ui.Label1.value <texte> = le texte à afficher dans le label
    13 points
  37. DomoCharts Version 7.11 Sommaire : 1. Présentation 2. Pré-requis 3. Installation 3.1 Synology 3.2 Pages Web 3.3 Plages horaires d'énergie électrique 3.4 Base de données MySQL/MariaDB 3.5 QuickApp 4. Mise à jour  5. Utilisation 6. Changelog 7. Téléchargement 1. Présentation Voici DomoCharts pour HC3, qui succède à DomoCharts sur HC2 introduit ici : Les fonctionnalités sont plus ou moins les mêmes, c'est à dire l'affichage de graphiques en plein écran sur une page Web hébergée sur un NAS, serveur Web en ligne, bref n'importe quel serveur Web faisant tourner le langage PHP et stockant les mesures dans une base de données MySQL/MariaDB. Le module virtuel récoltant les mesures sur la HC2 a été entièrement réécrit en QuickApp pour la HC3. Liste des capteurs supportés : Température (en °C) Humidité (en %HR) Luminosité (en lux) Pluie (en mm) Vent (en km/h) Eau (en litre) Gaz (en ppm) Son (en dB) Pression (en millibar) Particules (en μg/m3) Tension (en Volt) Courant (en Ampère) Puissance (en Watt) Energie (en kWh) Remarque : les modules cachés (hidden), morts (dead), ou désactivés (disabled) sont ignorés. DomoCharts se compose des éléments suivants : Un QuickApp à installer sur la box domotique HC3 qui collecte les données Un package ZIP (contenant des fichiers HTML, PHP, JavaScript, ...) à déployer sur un serveur Web Une base de données MySQL/MariaDB permettant de stocker les données, installé avec le serveur Web A noter que cette version de DomoCharts crée de nouvelles tables dans la base de données SQL, donc les données éventuellement existantes ne sont ni reprises ni supprimées. Je proposerai plus tard des requêtes SQL permettant de récupérer manuellement les données. Je n'ai pas voulu automatiser le processus car c'est un peu complexe, avec les ID qui changent, etc... je pense qu'il sera préférable de le faire à la main au cas par cas. 2. Pré-requis Un serveur Web supportant PHP (NAS Synology, hébergement mutualisé, ...) Un serveur hébergeant une base de données MySQL/MariaDB (Idem) Une Fibaro Home Center 3 / Home Center 3 Lite 3. Installation  3.1 Synology Etapes facultatives pour les utilisateurs débutants d'un NAS Synology avec DSM. Ces étapes doivent être effectuées à l'aide du compte admin via l'interface Web (accessible par défaut sur le port 5000). 3.1.1 Installation de WebStation Dans le Centre de paquets, rechercher et installer WebStation si ce n'est pas déjà fait : 3.1.2 Installation de PHP Dans le Centre de paquets, rechercher et installer la dernière version de PHP disponible (7.3 dans mon exemple) : 3.1.3 Installation de MariaDB (MySQL) Dans le Centre de paquets, rechercher et installer MariaDB : Dès que l'installation est terminée, cliquer sur l’icône de MariaDB afin d'accéder à l'écran de configuration, puis cliquer sur le bouton Changer le mot de passe : Noter également le numéro du port, DSM semble forcer le numéro 3307 depuis MariaDB 10. De plus, cocher la case "Activer la connexion TCP/IP". Par défaut, le mot de passe MariaDB est vide, cliquer alors sur le bouton Réinitialiser le mot de passe MariaDB : Confirmer en cliquant sur le bouton Oui : Le seul compte existant est root, il faut donc créer un mot de passe (note : ce compte root est différent du compte root du Syno, il est donc tout à fait possible d'avoir des mots de passes différents) : 3.1.4 Configuration de WebStation Dans le menu principal de DSM, ouvrir WebStation, la dernière version de PHP doit apparait installée en bas de la liste : Aller dans Paramètres généraux, et s'assurer que le profil PHP correspondant à la dernière version est sélectionné dans la liste déroulante : Aller dans les Paramètres PHP, sélectionner le profil correspondant à votre version de PHP, et cliquer sur le bouton Modifier : Il faut au minimum que l'extension pdo_mysql soit cochée : Le Syno est prêt. 3.2 Pages Web  Transférer toute l'arborescence contenue dans le fichier ZIP vers le répertoire /domocharts sur le serveur Web via FTP ou montage réseau. Ensuite, éditer le fichier config.inc.php afin d'y modifier les paramètres de connexion à la base de données MySQL : // MySQL Server hostname or IP address $server = 'server'; // MySQL User account $login = 'login'; // MySQL User password $password = 'password'; // MySQL Database name $database = 'database'; Note : si vous utilisez le mini-tuto Synology ci-dessus, les paramètres devraient ressemble à quelques chose comme cela (seul le mot de passe doit être personnalisé) : // MySQL Server hostname or IP address $server = '127.0.0.1:3307'; // MySQL User account $login = 'root'; // MySQL User password $password = 'MonSuperPassword'; // MySQL Database name $database = 'domotique'; Note : Pour des raisons de sécurité, si vous maitrisez MySQL et phpMyAdmin, vous devez créer un utilisateur dédié (différent de root). Je ne détaille pas cette procédure qui est hors du cadre de ce tutoriel. 3.3 Plages horaires d'énergie électrique  Dans le fichier config.inc.php, une rubrique concerne la configuration des horaires de l'abonnement au fournisseur d'électricité (imposés par le distributeur Enedis). La variable $TimeSource doit avoir la valeur 'STATIC' : //*** Teleinfo time for energy // // Variable = 'Value' // Comment : Allowed values // -------- ------- // ------------------------------------------ : --------------- $TimeSource = 'STATIC'; // Source of information for date and time : TELEINFO|STATIC // ---------------------------- // Valid only if TELEINFO TimeSource is used : --------------- $teleinfoTable = 'teleinfo'; // MySQL table name : xxxxxxxx $teleinfoDelay = 60; // Teleinfo Delay in Seconds : ss // ---------------------------- // Valid only if STATIC TimeSource is used : --------------- $TimeHCHP = array( // HC/HP start times for each EDF rate : 'hh:mm' => '<BASE|HC|HP>' '00:00' => 'HC', '06:30' => 'HP', '22:30' => 'HC' ); Sont actuellement supportés les abonnements de type Normal ('BASE'), et Heures Pleines/Heures Creuses ('HP' et 'HC'). Dans l'exemple du dessus, j'ai configuré les horaires HP de 6:30 à 22:30, et des horaires HC de 22:30 à 6:30. Notez que la variable $TimeHCHP doit obligatoirement commencer à 00:00. Vous pouvez ensuite ajouter autant de tranches horaires que nécessaires, car certains abonnements proposent 2 tranches HC réparties dans la journée. Si vous avez un abonnement Normal, c'est plus simple, puisqu'il suffit d'indiquer 'BASE' à partir de 00:00 : $TimeHCHP = array( '00:00' => 'BASE' ); Avec ces informations, le bouton Energy du module virtuel sera ensuite capable d'interroger l'API de la HC3 afin de récupérer les consommations des différentes équipements pour chaque tranche horaire de chaque journée. A l'heure actuelle, le graphique d'énergie électrique affiche la somme des kWh pour chaque journée, mais les informations nécessaires sont stockées dès aujourd'hui dans la base de données afin d'effectuer les calculs de coà»ts financiers ultérieurement. 3.4 Base de données SQL Afin de créer ou migrer les tables dans la base de données MySQL/MariaDB, il faut appeler la page /domocharts/install.php sur le serveur Web. Si tout se passe bien, la page affiche une longue liste de création de tables avec le statut OK, puis le message "Finished with success" : Sinon, vous pouvez demander du support sur le forum, en copiant/collant le texte des messages d'erreurs. 3.3 QuickApp pour HC3 Ce QuickApp est responsable de l'envoi des données vers la base de données SQL au travers de pages Web dédiées à l'insertion des données. Dans la HC3, aller dans Paramètres, puis Dispositifs, puis cliquer sur le bouton "+", choisir "Autre appareil", et enfin "Téléverser un fichier". Sélectionner aller le fichier DomoCharts_v7.0.fqa. Dans les Variables du QuickApp, il est possible de configurer les options suivantes : NAS_Protocol : protocole à utiliser, normalement : http NAS_Address : adresse IP du NAS, par exemple : 192.168.1.1 NAS_Port : port de communication, normalement : 80 (ne rien mettre) NAS_User : utilisateur optionnel, sinon ne rien mettre NAS_Password : mot de passe optionnel, sinon ne rien mettre NAS_Path : si vous avez suivi le tuto, c'est "/domocharts", mais vous pouvez changer le chemin Refresh : intervalle de rafraichissement des informations, par défaut 60 secondes Memory : nombre de mesures à conserver en mémoire en cas d'indisponibilité temporaire du NAS. J'ai testé jusqu'à 10000 sans aucun souci sur HC3. Si le QuickApp releve 100 mesures chaque minutes, dans ce cas cela fait une mémoire de 100 minutes, soit 1h40. Battery_Hour : heure à laquelle sont relevées les niveaux de batteries des modules, par exemple chaque soir à 23h debug : affiche plein d'informations dans la zone de debug du QuickApp, utile seulement pour demander de l'aide, valeur par défaut false. L'icône du QuickApp DomoCharts apparait dans l'interface, on peut la cacher si elle gêne : La zone de logs doit ressembler à ceci si la collecte des mesures et l'insertion en base de données se passent bien : 4. Mise à jour Rien pour le moment. 5. Utilisation Pour visualiser les graphes, il suffit d'aller chercher avec son navigateur l'adresse du serveur Web avec le chemin "/domocharts", par exemple : http://192.168.1.1/domocharts/ Pour l'administration, aller sur la page admin.php : http://192.168.1.1/domocharts/admin.php Cette page permet d'ordonner les modules, de donner une couleur à chaque courbe, et d'en cacher certains : Si une valeur aberrante apparait sur un graph, il zoomer suffisamment dans la zone temporelle, puis cliquer sur le point. Dans le popup qui apparait, un bouton Delete permet de supprimer la valeur, afin de conserver une courbe homogène :  6. Changelog : v7.00 : Février 2021 Version initiale  v7.01 : Mars 2021 Correction des consommations d'énergies électriques quotidiennes qui ne sont pas générées dans certain cas v7.11 : Janvier 2022 Correctifs et améliorations diverses 7. Téléchargement Package pour le NAS : domocharts_v7.0.zip QuickApp : DomoCharts_v7.11.fqa Icône : Mise à jour du QuickApp existant (contenu à copier/coller par dessus le fichier original ) : Fichier main : DomoCharts v7.11.lua Fichier DomoCharts : Library - DomoCharts v7.10.lua Fichier tools : Library - tools v2.20.lua Correctif du fichier config.js pour l'affichage des graphiques de courant en page 5 : https://www.domotique-fibaro.fr/topic/14935-quick-app-domocharts-graphiques-sur-nas-pour-hc3/page/5/#findComment-244864
    12 points
  38. Bonjour à tous, Suite à la disparition de l'API Wunderground, je me suis permise de reprendre en partie le YAMS de @sebcbien, en utilisant également le travail de @Dgille, afin de nous concocter un nouveau VD de gestion météo. Cela surtout pour me permettre de faire de nouveau parler mon lapin Codes sources : https://www.domotique-fibaro.fr/topic/6446-yams-wu-yet-another-meteo-station-wunderground-version/ https://www.domotique-fibaro.fr/topic/13120-météo-avec-weatherbitio/ Prérequis Ouvrir un compte sur le site https://www.weatherbit.io/ Dans vos paramètres de compte, vous devrez récupérer votre clé pour pourvoir utiliser les API Installation Importez le VD -> WeatherBit_V4_3.vfib Dans le mainloop du VD, il faut préciser le numéro de la scène et la fréquence de mise à jour. Créez une nouvelle scène, et collez le code suivant -> Scene_WeatherBit_V4_5.lua Il y a des choses à paramétrer dans la scène : WBApikey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" -- API Key WeatherBit WBCityid ="" -- Code ville, sinon vide pour latitude longitude de la HC2 WDelai = 30 -- Période d'actualisation en minute (minimum 2, max 45) WD_VD = 876 -- Préciser l'ID du VD WeatherBit WPushMatin = "07:00" -- Heure d'envoi des infos le matin, laisser vide si pas de push WPushSoir = "17:00" -- Heure d'envoie des infos le soir, laisser vide si pas de push WPushDemain = "21:00" -- Heure d'envoi des infos du lendemain, laisser vide si pas de push WPush_type = {"SMS","Push","eMail"} -- Préciser le type de notification souhaitée WPush_Email = 2 -- Préciser le numéro de user qui doit recevoir les email WPush_Phone = 592 -- Préciser le numéro du téléphone qui doit recevoir les push WPush_VG = "Pushover" -- Préciser nom de la variable globale utilisée dans le VD de SMS WPush_VD = "" --Préciser l'ID du VD de SMS, ou laisser vide si pas besoin WPush_VD_button = "" --Préciser le numéro du bouton d'action du VD de SMS, ou laisser vide si pas besoin WPush_Prio = "0" --Si vous utiliser le VD Pushover avec gestion des priorités, préciser le niveau de priorité choisi WRafale = 20 --en km/h. Préciser la vitesse de vent pour les infos de rafales. WRafale_VG = "Alerte_Vent" --Variable globale pour les alertes de rafales de vent WRafale_Message = 1 --Anticipation des alertes rafale : 1 = 1 jour avant (max = 2). -1 pour désactiver WArrosage_J_avant = 3 --Nombre de jours passés sans pluie. Mettre 0 pour désactiver. WArrosage_J_apres = 2 --Nombre de jours sans pluie à venir (max 2). Mettre 0 pour désactiver WArrosage_VG = "Arrosage_auto" --Nom de la variable pour l'arrosage automatique, elle passe à "1" s'il faut arroser (laisser vide si non utilisé) WVolume_Pluie = 5 --en mm, quantité de pluie nécessaire pour ne pas lancer l'arrosage auto N'oubliez pas d'inscrire votre clé. Vous pouvez mettre le code de votre ville (à trouver sur le site de WeatherBit), ou laisser le champ vide pour utiliser la positition de la HC2. Les variables globales son créées par la scène. Et surtout, n'oubliez pas d'utiliser les icônes, gentiment mises à dispo par @Did Nota : pour ceux qui utilisent le VD SONOS, il faut remplacer la ligne qui était utilisée avec le YAMS Wunderground local meteo_day = fibaro:getGlobalValue("Meteo_Day_Speech") par local meteo_day = fibaro:getGlobalValue("wbit_today_sp") Nota : pour utiliser la fonction d'arrosage auto, je vous conseille d'utiliser le résultat de WeatherBit dans GEA, avec quelque chose comme ceci: GEA.add({{"Time","Sunset+10"},{"Global","Arrosage_auto",1}},30,"Période de sécheresse, allumage de l'arrosage automatique",{{"turnOn",id["ROBINET"]},{"Sleep",2*60*60,{"TurnOff",id["ROBINET"]}}}) Publication de la V2.0 : - Possibilité d'utiliser des notifications - Other minor fixes Publication de la V2.1 - Résolution de divers bugs sur la gestion des variables globales & API - Allègement du code Publication de la V2.2 - Amélioration des textes audio - Optimisation de la scène - Résolution des bugs des précipitations & round Publication de la V2.3 - Correction d'un bug sur les jours (merci Barelle) - Optimisation du code (tout se fait dans la scène) Publication de la V2.4 - Correction des bugs de mise à jour des labels & pushs Publication de la V3.0 - Ajout dans le VD de 2 modes d'affichage : PC ou mobile; pour pouvoir ajouter les icônes météo Publication de la V4.0 - Correction d'un bug sur les jours à J+2 - Mise à jour du message pour replacer "précipitations de 0mm" par "pas de pluie" - Ajout d'alertes pour les rafales de vent - Ajout d'alertes sécheresse Publication de la V4.2 - Ajout d'un niveau de pluie minimum pour que la variable globale d'arrosage passe à 1 - Correction d'un bug des messages de sécheresse dans les notifications Publication de la V4.3 - Prise en charge d'un J+3 pour la pluie à venir - Prise en compte du volume de pluie défini par l'utilisateur pour reset du compteur des jours "secs" - Correction des textes pour plus de fluidité & syntaxe Publication de la V4.4 (mise à jour de la scène uniquement) - Correction d'un bug de création des variables globales Publication de la V4.5 (mise à jour de la scène uniquement) - Correction de l'information "rafales" Si vous avez déjà installé le VD en version V2.0, remplacez simplement le code du main loop par celui ci , ou laissez vide. Ce code n'est pas obligatoire pour assurer le fonctionnement du VD, il ne fait que créer les variables globales et assurer que la scène tourne bien (peut être remplacé par le WATCHDOG en surveillant le message "Mise à jour réussie" toutes les 35 min) Pour la V3.0, il faut ajouter aussi un slider en bas, ayant pour nom: slideAFF Pour la V4.2, il faut ajouter un champs Etiquette, avec le nom "lblPluie". Il sert à afficher les messages liés à l'arrosage. Même si vous n'utilisez pas cette fonction. Pour passer en V4.3, mettez la scène & la boucle du VD à jour ------------------------------------------------------------------------------- -- VD REALISE PAR DRAGONIACS POUR www.domotique-fibaro.fr -- UTILISATION LIBRE DE DROITS -- MERCI A Dgille & Sebcbien POUR LES CODES DONT JE ME SUIS FORTEMENT INSPIREE -- VERSION 4.3 ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- -- PARAMETRAGE UTILISATEUR ------------------------------------------------------------------------------- local WSceneId = 629 -- Id de la scéne pour actualisation de la météo ------------------------------------------------------------------------------- -- FIN DU PARAMETRAGE UTILISATEUR ------------------------------------------------------------------------------- local VD = fibaro:getSelfId() -- Lance la scene d'actualisation if fibaro:countScenes(WSceneId) < 1 then fibaro:debug("Lancement de la scène WeatherBit") fibaro:startScene(WSceneId) end --Changement du mode d'affichage local position = tonumber(fibaro:getValue(VD,"ui.slideAFF.value")) if position ~= 1 and position <= 50 then fibaro:call(VD,"setSlider",12,1) fibaro:debug("Ajout des icones....") fibaro:killScenes(WSceneId) fibaro:startScene(WSceneId) else if position ~= 99 and position > 50 then fibaro:call(VD,"setSlider",12,99) fibaro:debug("Ajout des icones....") fibaro:killScenes(WSceneId) fibaro:startScene(WSceneId) end end
    12 points
  39. OPENKAROTZ MV - Version 1.20 But : Ce module virtuel à pour but d'offrir les fonctions principales associées à votre lapin libéré par le biais d'OpenKarotz. Ce module virtuel permet de Faire parler le lapin (TTS) Lui demander de prendre un photo (stockée sur le lapin) Faire bouger les oreilles (gauche, droite, random et reset) Choisir la couleurs de la led Choisir la vitesse de clignotement Appeler l'application Mood Appeler l'application Funny Clock Jouer,stopper le mode Squeezbox Le mettre en veille (sleep) - (pas sur la photo) Le réveiller (WakeUp) - (pas sur la photo) Installation : - Importer le module virtuel ci-joint : OpenKarotz.vib Paramétrage : Renseigner l'adresse IP et le Port de votre Karotz dans les champs prévus à cet effet. Faire parler le lapin : Il faut créer un variable "Karotz" depuis le panneau des variables. Une fois créée vous pouvez modifier sa valeur fibaro:setGlobal("Karotz", "Ma phrase a lui faire dire") Appuyer sur le bouton TTS Exemple en LUA local module_id = 100 fibaro:setGlobal("Karotz", "Ceci est la phrase à dire") fibaro:call(module_id, "pressButton", "1") Visuel (v1.00) : Historique : version 1.10 Permet de bouger l'oreille gauche ou droite Ajout des bouton Squeezbox Play et Squeezbox stop version 1.15 Correction du bug permettant de changer la couleur de la led version 1.20 Ajout de libellés Possibilité d'enregistrer ou annuler le changement de couleur de la led Astuce : Pour utiliser la caméra de votre Karotz et la HC en mode image par image, il vous suffit de rentrer les paramètres suivants : Choisir une caméro "Autre" Entrer l'adresse IP de votre Karotz URL JPG : /cgi-bin/snapshot_view?silent=1 URL MPEG : /cgi-bin/snapshot_view?silent=1 Cochez JPG (à la fin) Refresh time 5 secondes OpenKarotz.vfib
    12 points
  40. Voici une solution pour créer une variable globale en LUA il existe 8 types de base: nil, boolean, number, string, userdata, function, thread, et table Je remercie Gazous pour son aide Ce code va crée une variable globale Pascal -- Creation de Variable Pascal Merci Gazous json = '{"name":"Pascal", "isEnum":0}' HC2 = Net.FHttp("127.0.0.1", 11111) HC2:POST("/api/globalVariables", json) Voici une solution pour créer une variable globale prédéfinie ce code appartient entièrement a Gazous il va crée une variable prédéfinie Gazous qui aura comme valeur Gazous1 ou Gazous2 -- Creation de Variable Gazous json = '{"name":"Gazous", "isEnum":1}' HC2 = Net.FHttp("127.0.0.1", 11111) HC2:POST("/api/globalVariables", json) -- Ajout de 2 valeurs à la Variable Gazous et modification avec une des 2 valeurs json = '{"value":"Gazous1","isEnum":true,"enumValues":["Gazous1", "Gazous2"]}' HC2:PUT("/api/globalVariables/Gazous", json) ou comme cela avec des variables : local VG_Nom = "MPRInfo" local VG_Value = "MPRInfo1" local VG_enumValues = '["'..VG_Value..'", "MPRInfo2"]' --Creation de Variable Gazous json = '{"name":"'..VG_Nom..'", "isEnum":1}' fibaro:debug(json) HC2 = Net.FHttp("127.0.0.1", 11111) HC2:POST("/api/globalVariables", json) --Ajout de 2 valeurs à la Variable Gazous et modification avec une des 2 valeurs json = '{"value":"'..VG_Value..'","isEnum":true,"enumValues":'..VG_enumValues..'}' fibaro:debug(json) HC2:PUT("/api/globalVariables/"..VG_Nom, json) Il ne vous reste plus qu'a vérifier dans le panneau des variables globales. Je pense que je vais crée un Module Virtuel avec toutes mes variables comme cela lors d'un recovery je clic sur le bouton de VD et mes variables sont crées. Code réalisé par Gazous Je complète avec une petite fonction pratique pour créer une variable si elle n'existe pas La version pour un Virtual Device (avec Net.FHttp) function createGlobalIfNotExists(varName, defaultValue) if (fibaro:getGlobal(varName) == "") then fibaro:debug("Création de la variable "..varName.." avec comme valeur par défaut "..defaultValue) newVar = {} newVar.name = varName newVar.value = defaultValue HC2 = Net.FHttp("127.0.0.1", 11111) HC2:POST("/api/globalVariables", json.encode(newVar)) end end createGlobalIfNotExists("Gazous", "Oui c'est moi") La version pour une Scène (avec net.HTTPClient) function createGlobalIfNotExists(varName, defaultValue) if (fibaro:getGlobal(varName) == nil) then fibaro:debug("Création de la variable "..varName.." avec comme valeur par défaut "..defaultValue) newVar = {} newVar.name = varName newVar.value = defaultValue local http = net.HTTPClient() http:request("http://127.0.0.1:11111/api/globalVariables", { options = { method = 'POST', data = json.encode(newVar)}}) end end createGlobalIfNotExists("Gazous", "Oui c'est moi") La doc ce trouve ICI : http://xxx.xxx.xxx.xxx/docs/#!/globalVariables/getGVariables Il faut remplacer les xxx.xxx.xxx.xxx par l'adresse IP du Home Center 2 Un Petit Merci ou un Petit J'aime fais toujours plaisir..... Comme d’habitude voici un petit Bonus Cette Scéne permet d'envoyer une notification lorsqu'il y a un démarrage de la box Le message contient la date et l'heure de démarrage Il faut juste mettre l'ID du portable (Téléphone ou GSM pour nos amis Belge ) --[[ %% autostart --]] local IdTel = 181 local heure = os.date("%R"); local date = os.date("%d/%m/%Y"); local Message = "Votre Home center 2 à démarrée le " ..date .." à " ..heure fibaro:debug(Message) fibaro:call(IdTel, "sendPush", Message)
    12 points
  41. 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
    12 points
  42. Ma Fibaro a rendu l'âme ce Lundi, repose en paix petite HC2.... Ode à ma première box : Tu m'en aura fais voir de toutes les couleurs avec tes voyants qui s'allument ou s'éteignent selon ton humeur. combien de fois m'as tu stressé quand je voyais tes petites boules tourner? combien de fois m'as tu énervé quand toute ta config s'était envolé? et ho! Ta petite clé USB! Je n'ai eut de cesse de la restaurer.... Que de souvenir nous avons partagé ensemble : Cette V4 toute bugguée qui nous a tant alléchée, ces plugins qui comme par magie ont disparus sans jamais se concrétiser, ces versions qui se succèdent n'apportant que peu de nouveautés ou alors tout juste une relative stabilité, celle là même qui t'a pourtant tant manquée à tes débuts. On se moquait de toi car il était moins risqué d'installer une Bêta qu'une version stable, on se moquait de toi pour ton lua limité par ton papa, on se moquait de toi pour tes scripts qui se plantaient sans raison, on se moquait de toi pour tes fonctions différentes entre tes modules et tes scènes mais qui faisaient la même chose. Tu m'as tant fait espérer, et tout le temps j'ai cru en toi, La semaine dernière encore, je jouais avec toi, pensant même à te donner une nouvelle interface pour te rendre plus désirable encore, pensant pouvoir mieux coder ton cœur via d'autre chemins, pensant qu'une longue route encore nous attendait. Mais tu m'as quittée, et cette fois je ne vois comment tu pourrais ressusciter car j'ai tout tenté pour te sauver. Mais en avais-je vraiment envie? Tu as tant souffert, tant donné aux limites de tes capacités, et pourtant je n'étais jamais pleinement satisfait. Toujours de toi je me plaignais, particulièrement quand ma femme me taquinait à ton sujet, elle était sûrement un peu jalouse, elle ne relevait que tes défauts, rarement tes qualités. Et puis je vois tes cousines, Jeedom, Domoticz, et je m'interroge, pourquoi ne pas les tester et les évaluer? Je pense que je vais t'être infidèle, tu auras été ma première box, mon premier essais, mais probablement aussi dans le monde obscure du propriétaire ...la dernière....
    12 points
  43. Piloter votre HC2 via Google Home en utilisant un applet IFTTT (Google Assistant et Webhooks) et un scénario. Bonjour, J'ai créé un applet IFTTT (un seul) pour contrôler toute ma Home Center 2 à l'aide d'un scénario. Je vous le partage ci-dessous. Démarche : 1. Créer un nouveau scénario LUA et y coller le scénario ci-joint lili.lua (mémoriser son ID) 2. Aller sur IFTTT assurer vous d'avoir connecté les services "Google Assistant" et "Webhooks" - Créer un nouvel applet utilisant Google Assistant - Dans "What do you want to say" taper "jarvis $" - Dans "What do you want to assistant say in response" taper "D'accord ! jarvis $ ." - Choisir la langue "French" - Ensuite choisir le service "Webhooks" - Dans URL : http://<login>:<password>@<adresse>/api/scenes/<id du scenario>/action/start - Dans Method : choisir POST - Dans Content : Choisir application/json - Dans Body : {"args":[{"action":" {{TextField}}"}]} - Sauver Voilà maintenant il vous suffit de dire : "OK google" "jarvis <commande>" Exemple : "jarvis allume la télévision" Comment cela fonctionne ? Vous devez préalablement avoir saisi la commande "allume la télévision" dans le paramètre "lili turn on command" de votre module pilotant la télévision. Ceci pour toute les commandes que vous souhaitez effectuer. Le scénario va recevoir la commande énoncé à votre Google Home et va recherche dans les commande lili une correspondance, s'il en trouve une il va appuyer sur On ou Off selon le type de commande saisi. Vous avez aussi la possibilité de piloter vos scénarios (commande lili) et vos modules virtuels avec la commande vocal suivante: "jarvis <nom du module> <libellé du bouton>" exemple "jarvis chauffage manuel". Il va donc presser le bouton "Manuel" du module virtuel "Chauffage". Il y a aussi en début du scénario une suite de synonymes que vous allez pouvoir gérer à votre guise en suivant les exemples fournit. Voilà, un seul applet IFTTT, un seul scénario, le reste n'est que de la configuration de vos modules. Le nom "jarvis" peut bien évidement être remplacer par un autre nom de votre choix. Perso, je l'ai testé un bon moment et j'adore. Bien que je préférerais l'intégration de Fibaro qui ne devrait tarder. lili.lua
    12 points
  44. 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
    12 points
  45. Lors de mon footing, j'ai croisé Nico
    12 points
  46. 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
    12 points
  47. Le réveil (wake-up), c'est le DEVICE qui le décide. A ce moment là il communique avec le contrôleur Z-Wave (HCL, HC2, HC3, ...) et échange un grand nombre d'informations (on voit la diode de la box clignoter frénétiquement pendant quelques secondes), puis attends un peu en écoutant le réseau (au cas où la box décide de communiquer encore d'autres infos), puis ils se rendort quelques secondes plus tard (généralement 5 ou 10s je crois). Tout ce processus de réveil est extrêmement consommateur de batterie. L'intervalle de réveil ne concerne que les modules alimentés sur batterie (car les modules alimentés sur secteur écoutent toujours le réseau puisqu'ils participent activement au routage des paquets dans le réseau maillé). Le réveil est déclenché de 3 façons : lors de la mise sous tension des piles du module lorsque l’intervalle de réveil paramétré est atteint (soit la valeur par défaut, soit celle qui a été poussée par la box). lorsqu'on triple-clique sur le bouton Le polling, c'est le contrôleur Z-Wave (HC2, ...) qui le décide, en allant communiquer avec le module. Si il est configuré à 5 minutes (dans les paramètres généraux de la box), alors toutes les 5 minutes, la box contacte les modules afin de s'assurer qu'ils sont toujours en vie. Si elle n'arrive pas à les joindre, elle recalcule d'autres chemins (jusqu'à 15 tentatives en quelques secondes). Si cela échoue, elle les déclare comme mort. Cette pour cette raison qu'un module type Wall Plug ou Dimmer qui est débranché ne disparait pas immédiatement de la box. Il disparait quand la box n'arrive pas à le contacter (soit parce qu'elle essaye de lui envoyer un ordre type ON/OFF, soit parce que le délai de polling est atteint). Ce polling régulier peut surcharger le réseau, c'est pour cette raison que passé l'inclusion d'un certain nombre de modules, la HC2 conseille une nouvelle valeur de polling plus élevé. Bien sûr, le polling n'a de sens que pour des modules qui écoutent le réseau, donc alimentés sur secteur (230V, 12V, 24V, etc). Le polling d'un module sur batterie n'a pas de sens, car celui-ci ne répondra jamais. Le polling peut être configuré de 2 façons dans la HC2 : via les paramètres généraux de la box, auquel cas la valeur s'applique à tous les devices. via les paramètres avancés de tel ou tel module, en fonction de besoins très particuliers. Il n'est généralement pas nécessaire de modifier ce paramètre, qu'on laisse alors à sa valeur par défaut afin qu'il prenne en compte la valeur globale. En ce qui concerne la fréquence de remontée des infos, cela dépend des modules, et des paramètres spécifiques de chacun. Par exemples : remontée immédiate pour un contact d'ouverture de porte, d'une détection de mouvement, ... remontée après un certain délai pour une température, humidité, luminosité, ... remontée après une certaine variation (delta) pour une température, humidité, luminosité, ... Le célèbre détecteur de mouvement Fibaro FGMS Motion Sensor est le module qui dispose du plus grand nombre de paramètres afin de configurer finement la remontée d'infos. D'autres modules, tels que le Everspring ST814 disposent de paramètres beaucoup plus restreints. La mise à jour des paramètres d'un device dépend de 2 cas de figure : module sur secteur : les paramètres sont envoyés immédiatement puisque le module écoute le réseau module sur batterie : la box attend le réveil du module (voir explications au premier paragraphe). Pendant ce temps là , on voit le petit message en vert "En attente de réveil...", comme par exemple sur ce thermostat : . De par mon expérience personnelle, et comme je le disais plus haut, le réveil d'un module sur batterie est extrêmement consommateur de batterie. Par conséquent, j'ai tendance à allonger cette valeur le plus possible. De toute façon le réveil n'a d'intérêt que lorsqu'on modifie les paramètres d'un module, ce qui n'arrive jamais en production pour un module qui fonctionne correctement. Un intervalle de plusieurs jours ne pose pas de souci. Une exception toutefois : les modules de type thermostat, comme le Secure SRT321, car le panneau de chauffage doit pouvoir modifier sa valeur de consigne. On choisira alors une valeur raisonnable d'environ 5 minutes, ou 15 minutes si on peut se permettre 1/4h de retard entre la consigne et le début de la chauffe. Si on réalise des fausses piles, on peut descendre ce paramètres à 1 minute pour une réactivité presque instantanée (éviter ce descendre en dessous, cela saturerait le réseau inutilement). Enfin, pour la phase de réglage d'un module, surtout pour le FGMS qui a de très nombreux paramètres, on peut choisir un intervalle de réveil court de quelques minutes pendant les quelques jours nécessaires à son paramétrage optimal en fonction de ses besoins. Ainsi, il n'est pas nécessaire d'attendre plusieurs heures ou d'aller triple-cliquer sur le bouton pour qu'un nouveau paramètre soit pris en compte, le temps de faire les essais. Les paramètres d'un module, justement, permettent de régler finement la remonté des infos vers la HC2. Le FGMS dispose de tout ce qu'il faut pour obtenir le comportement désiré, encore faut-il prendre le temps de bien étudier la doc pour comprendre les interactions entre chacun. A l'opposé, le ST814 ne dispose que d'un intervalle entre 2 mesures, c'est hyper basique. Pour finir, grâce à tout ce qu'on vient d'étudier, et contrairement à ce que je vois parfois sur le forum, on ne devrait pas s'appuyer sur le réveil d'un module pour remonter les infos de température/hygro/luminosité/etc (car cela consomme beaucoup d'énergie et occupe la bande passante du réseau), et donc on doit s'appuyer sur les paramètres spécifiques de chaque module.
    12 points
  48. voici la collection Netatmo en icons je vais refaire les versions "basiques" pour garder le même écartement entre les deux modules Stef
    12 points
  49. Tout d'abord, il existe plusieurs bibliothèque d'icônes rangées dans différents dossiers de nos box: - icône module: //192.168.1.xx/fibaro/icons/ - icône module virtuel: //192.168.1.x/fibaro/n_vicons/ - icône scène: //192.168.1.x/fibaro/icons/scena/ Commencez par appuyer sur "Changer l'icône" dans les paramètres généraux du module Ainsi s'affiche la liste d'icônes disponibles, en cliquant bouton droit sur une icône puis dérouler jusqu'à "Afficher l'image" On retrouve l'Id de l'icône dans la barre d'adresse du navigateur (précédée de "User" dans le cas d'icônes perso) Il y a une seconde façon de récupérer ces Id avec le Hc2 Toolkit de Krikkroff.
    12 points
  50. Ne trouvant que très peu d'information dans la documentation Fibaro à propose de l'inclusion des caméras, j'ai entrepris des recherches pour essayer de comprendre le fonctionnement, et quelle était l'utilité de chacun des paramètres. Définitions : • Thumbnail : la petite image qui apparaît dans l'onglet "Your House" ou "Devices" • Preview : l'image que l'on voit lorsqu'on est dans la configuration de la caméra Ou Paramètres : • Display camera image on the main page : affiche l'image dans le Thumbnail • IP Address : mettre l'adresse IP et le port http de la camera. Si vous voulez que votre caméra soit visible de l'extérieur (par exemple depuis votre Smartphone via home.fibaro.com), il faudra renseigner l'adresse IP extérieure de la caméra (vous aurez donc dà» ouvrir un port sur votre routeur, et faire une redirection de port par caméra). • JPG path : le string à ajouter pour que l'image soit visible dans le Thumbnail, et qui est utilisé pour prendre des photos • MJPG stream path : le string à ajouter pour que l'image soit visible dans le Preview. Si on y met le JPG Path, on affichera la photo (statique). Si on y met le bon MJPG stream path, on a une image animée. • Si la caméra est PTZ, introduisez les URL pour les mouvements. Cochez la case "Send STOP after movement command" pour éviter le déplacement en continu de la caméra par la pression unique sur le bouton de direction. • "Display camera image at Your House, advanced options:" Manière dont l'image est affichée dans le Thumbnail . JPG - refresh time : affiche sous forme de "photo" toutes les x secondes. MJPG : Le Thumbnail est affiché sous forme d'image animée (mais nécessite bcp plus de ressources du système) Maintenant, il n'y a plus qu'a trouver les bons URL à rentrer dans tous ces paramètres … ISPY Connect est une DB très complète qui vous permet de trouver votre bonheur : Dans Google vous pouvez également chercher avec les mots clés CGI et SDK. Notez également que certaines caméras (dont Foscam !) exigent d'avoir dans l'URL le nom de l'utilisateur et son mot de passe en clair. Si vous avez des problèmes, essayez sans le "/" au début du string. Bon amusement !
    12 points
Ce classement est défini par rapport à Paris/GMT+01:00
×
×
  • Créer...