Aller au contenu

Rechercher dans la communauté

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



Plus d’options de recherche

  • Rechercher par étiquettes

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

Type du contenu


Forums

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

Rechercher les résultats dans…

Rechercher les résultats qui…


Date de création

  • Début

    Fin


Dernière mise à jour

  • Début

    Fin


Filtrer par nombre de…

Inscription

  • Début

    Fin


Groupe


Jabber


Skype


Ville :


Intéret :


Version

43 résultats trouvés

  1. GEA Gestionnaire d’Événements Automatique Version 7.22 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" 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" 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">} "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 Les zones d'alarme, les profils, et les zones de climat peuvent être identifiés par leur nom Note : les commandes de Reboot, Suspend, et Shutdown ne fonctionnent plus avec 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.22.fqa Mise à jour : Fichier main : GEA v7.22.lua Fichier tools : Library - tools v2.10.lua Documentation de référence sur la syntaxe : GEA v7.21 Syntaxe.lua
  2. Barelle

    Quick App - Ecodevice v1

    Quick App - Ecodevice v1 Gestion de la consommation en kWh, de la puissance en VA Pour les abonnements de type BASE, HPHC, EJP, TEMPO. Permet l’affichage de la puissance apparente, de l’énergie consommée durant la dernière minute, l’heure en cours, la journée en cours, le mois et l’année. Permet également d’afficher les coûts pour la journée, le mois et l’année. Ne possédant qu’un abonnement HPHC, je suis preneur des résultats de tests pour les autres abonnements, afin de vérifier la bonne adéquation entre la théorie et la pratique. Limites : les cumuls de consommation et les coûts ne sont calculés que pour T1, par défaut les unités de C1 sont en m3 ou litres et celles de C2 en kWh ; une éventuelle future version permettra peut-être de les personnaliser. Problèmes rencontrés : L’indigence de la documentation ; Le swagger qui plante régulièrement (get/plugins/getView par exemple) ; Les unités ne sont affichées qu’en lettres capitales et quand un child est agrandi, elles disparaissent ; Curieusement les childs apparaissent dans l’application portable et pas le QA, empêchant ainsi le respect de la graphie du système international (pour kWh notamment). Configuration pour le fonctionnement Celle-ci est effectuée par la définition de variables (attention au respect des majuscules et minuscules) : ipEcodevices : adresse IP de l'Eco-Devices <========= OBLIGATOIRE portEcodevices : numéro de port de de l'Eco-Devices (80 par défaut) debug : pour tracer plus copieusement le déroulement du programme (true ou false) Préférences Il s'agit de choix concernant les types de données que l'on souhaite afficher : refreshDelay : intervalle de relevé des mesures en secondes (60 recommandé et par défaut) iconId : numéro de l'icône à attribuer au QA. Tt oui, on peut attribuer une icône à un child mais pas au QA globalVarName : nom de la variable globale utilisée pour mémoriser les valeurs d'index afin d’en permettre l’accès à une scène ou un autre QA toBeDisplayed : compteurs à afficher sous forme de liste (par exemple : T1,C1,C2) par le QA CoutKW<abonnement> : sous la forme d'une liste des coûts TTC des kWh comme ci-dessous (cf. https://www.kelwatt.fr/prix/edf) : - CoutKWBASE : 0.1597 - CoutKWHPHC : 0.1798,0.1344 (dans l'ordre HP,HC) - CoutKWEJP : 0.1518,0.3114 (dans l'ordre HN,HPM) - CoutKWTEMPO : 0.1548,0.1246,0.1757,0.1397,0.6389,0.1491 (dans l'ordre HPJB,HCJB,HPJW,HCJW,HPJR,HCJR) CoutAnnuel<abonnement> : le coût annuel TTC de l'abonnement comme ci-dessous (exemple : valeurs de décembre 2020 pour une puissance de 9 kVA), si non défini, les coûts ne tiendront pas compte du prix de l’abonnement : - CoutAnnuelBASE : 152.64 - CoutAnnuelHPHC : 172.08 - CoutAnnuelEJP : 152.16 - CoutAnnuelTempo : 169.56 childs : liste de childs à lancer sous forme de liste (par exemple : T1kWhJour,C1,C2) voir chapitre ci-après. displayChilds : si les childs doivent être affichés (true ou false) displaySimul : pour simuler les coûts pour un abonnement BASE, il faudra impérativement renseigner les variables CoutAnnuelBASE et CoutKWBASE Les unités, pour chaque child, on peut modifier la valeur des unités de l'index et des valeurs affichées. Ainsi on pourra définir les variables : - C1IndexUnit et C2IndexUnit pour préciser l'unité de l'index du compteur (on peut également définir T1IndexUnit et T2IndexUnit, même si cela a un sens qui m'échappe) ; - Suivant les valeurs à afficher, les multiples d'unités pourront être affichées (k, m³, kVA, kW, k€, kWh...), dans ce cas la valeur affichée est arrondie à la première décimale. La simulation d’un tarif "BASE" Cette simulation n’est disponible que pour les abonnements HPHC, EJP et TEMPO. Les variables CoutAnnuelBASE et CoutKWBASE devront respectivement préciser le coût de l’abonnement "BASE" et le tarif du kWh. Les coûts simulés pourront être affichés sous la forme d'enfants ("children"). Les valeurs possibles pour la liste de la variable "childs" sont : Les "Enfants" Comme il faut bien découvrir, je me suis lâché… Même si la gestion des quatre types d’abonnement est à l’origine de l’inflation. Ne possédant qu’un abonnement HPHC, je n’ai pas pu tester les autres cas, merci de vos retours. Les valeurs possibles pour la liste de la variable "childs" sont : Compteur T1 : T1VA = T1 puissance, T1WhActuel = Conso. actuelle, T1WhHeure = Conso. heure, T1kWhJour = Conso. jour, T1kWhMois = Conso. mois, T1kWhAnnee = Conso. année, T1Index = index total (somme des index si plusieurs périodes tarifaires) Coûts par période : * T1JourEuro = coût pour le jour en cours, * T1MoisEuro = coût pour le mois en cours, * T1AnneeEuro = coût pour l’année en cours, * T1SimuBaseJour = coût simulé (tarif base) pour le jour en cours, * T1SimuBaseMois = coût simulé (tarif base) pour le mois en cours, * T1SimuBaseAnnee = coût simulé (tarif base) pour l’année en cours ; Consommation abonnement BASE par période * BASEHeure = Conso. BASE heure, * BASEJour = Conso. BASE jour, * BASEMois = Conso. BASE mois, * BASEAnnee = Conso. BASE année, * BASEIndex = index BASE ; Coûts abonnement BASE par période * BASEJourEuro = Coût BASE jour, * BASEMoisEuro = Coût BASE mois, * BASEAnneeEuro = Coût BASE année ; Consommation abonnement HPHC par période * HPHeure = Conso. HP heure, * HPJour = Conso. HP jour, * HPMois = Conso. HP mois, * HPAnnee = Conso. HP année, * HPIndex = index HP, * HCHeure = Conso. HP heure, * HCJour = Conso. HC jour, * HCMois = Conso. HC mois, * HCAnnee = Conso. HC année, * HCIndex = index HC ; Coûts abonnement HPHC par période * HPJourEuro = Coût HP jour, * HPMoisEuro = Coût HP mois, * HPAnneeEuro = Coût HP année, * HCJourEuro = Coût HC jour, * HCMoisEuro = Coût HC mois, * HCAnneeEuro = Coût HC année, Consommation abonnement EJP par période * EJPHNHeure = Conso. EJPHN heure, * EJPHNJour = Conso. EJPHN jour, * EJPHNMois = Conso. EJPHN mois, * EJPHNAnnee = Conso. EJPHN année, * EJPHNIndex = index EJPHN, * EJPHPMHeure = Conso. EJPHPM Heure, * EJPHPMJour = Conso. EJPHPM jour, * EJPHPMMois = Conso. EJPHPM mois, * EJPHPMAnnee = Conso. EJPHPM année, * EJPHPMIndex = index EJPHPM ; Coûts abonnement EJP par période : * EJPHNJourEuro = Coût EJPHN jour, * EJPHNMoisEuro = Coût EJPHN mois, * EJPHNAnneeEuro = Coût EJPHN année, * EJPHPMJourEuro = Coût EJPHPM jour, * EJPHPMMoisEuro = Coût EJPHPM mois, * EJPHPMAnneeEuro= Coût EJPHPM année ; Consommation abonnement TEMPO par période : * HPJBHeure = Coût HPJB heure, * HPJBJour = Coût HPJB jour, * HPJBMois = Coût HPJB mois, * HPJBAnnee = Coût HPJB année, * HPJBIndex = index HPJB, * HCJBHeure = Coût HCJB heure, * HCJBJour = Coût HCJB jour, * HCJBMois = Coût HCJB mois, * HCJBAnnee = Coût HCJB année, * HCJBIndex = index HPCB, * HPJWheure = Coût HPJW heure, * HPJWJour = Coût HPJW jour, * HPJWMois = Coût HPJW mois, * HPJWAnnee = Coût HPJW année, * HPJWIndex = index HPJW, * HCJWHeure = Coût HCJW heure, * HCJWJour = Coût HCJW jour, * HCJWMois = Coût HCJW mois, * HCJWAnnee = Coût HCJW année, * HCJWIndex = index HCJW, * HPJRHeure = Coût HPJR heure, * HPJRJour = Coût HPJR jour, * HPJRMois = Coût HPJR mois, * HPJRAnnee = Coût HPJR année, * HPJRIndex = index HPJR, * HCJRHeure = Coût HCJR heure, * HCJRJour = Coût HCJR jour, * HCJRMois = Coût HCJR mois, * HCJRAnnee = Coût HCJR année, * HCJRIndex = index HCJR; Coûts abonnement TEMPO par période : * HPJBJourEuro = Coût HPJB jour, * HPJBMoisEuro = Coût HPJB mois, * HPJBAnneeEuro = Coût HPJB année, * HCJBJourEuro = Coût HCJB jour, * HCJBMoisEuro = Coût HCJB mois, * HCJBAnneeEuro = Coût HCJB année, * HPJWJourEuro = Coût HPJW jour, * HPJWMoisEuro = Coût HPJW mois, * HPJWAnneeEuro = Coût HPJW année, * HCJWJourEuro = Coût HCJW jour, * HCJWMoisEuro = Coût HCJW mois, * HCJWAnneeEuro = Coût HCJW année, * HPJRJourEuro = Coût HPJR jour, * HPJRMoisEuro = Coût HPJR mois, * HPJRAnneeEuro = Coût HPJR année, * HCJRJourEuro = Coût HCJR jour, * HCJRMoisEuro = Coût HCJR mois, * HCJRAnneeEuro = Coût HCJR année ; Compteur T2 : T2VA = T2 puissance, T2WhActuel = T2 Conso. actuelle, T2WhHeure = T2 Conso. heure, T2kWhJour = T2 Conso. jour, T2kWhMois = T2 Conso. mois, T2kWhAnnee = T2 Conso. année, T2Index = index total du compteur. Compteur C1 : C1Index = C1 Index, C1Actuel = C1 Conso. actuelle, C1Heure = C1 Conso. heure, C1Jour = C1 Conso. jour, C1Mois = C1 Conso. mois, C1Annee = C1 Conso. année, Compteur C2 : C2Index = C2 Index, C2Actuel = C2 Conso. actuelle, C2Heure = C2 Conso. heure, C2Jour = C2 Conso. jour, C2Mois = C2 Conso. mois, C2Annee = C2 Conso. année, Installation/mise à jour Pour une première installation : Importer le fichier ".fqa" ci-dessous, puis : Renseigner les variables ipEcodevices, globalVarName, toBeDisplayed, displayChilds et childs. Remarque : une variable créée par le QA n’est pas modifiable par l’interface. Il suffit de la supprimer et de la recréer. Pour une mise à jour : Il est nécessaire de vérifier que l’interface du QA possède des labels jusqu’à "Lbl_25", sinon en rajouter sans trous dans la numérotation ; Puis il suffit de copier le contenu du fichier lua dans l’onglet main du QA. Version 0.800 (ajout de la variable portEcodevices, correction de divers bugs...). Version 0.900 : Eco-Devices-0.90.fqa Ajout des enfants pour les coûts globaux : T1JourEuro, T1MoisEuro, T1AnneeEuro ; Ajout de la simulation d'un abonnement "BASE" et possiblement des enfants T1SimuBaseJour, T1SimuBaseMois, T1SimuBaseAnnee ; Ajout de l’affichage des index et des enfants : BASEIndex, HPIndex, HCIndex, EJPHNIndex, EJPHPMIndex, HPJBIndex, HCJBIndex, HPJWIndex, HCJWIndex, HPJRIndex, HCJRIndex, T2Index ; Other minor bug fixes. Version 0.92 : Eco-Devices-0.92.fqa Amélioration de la robustesse du code (gestion de quelques cas tordus) ; Corrections cosmétiques. Version 0.95 : Eco-Devices-0.95.fqa Traitement du cas sans téléinfo ; Ajout des variables pour les unités pour les childs ; Amélioration de la robustesse du code (gestion de quelques cas tordus). Version 0.96 : Eco-Devices-0.96.fqa Gestion du cas du changement d'abonnement ; Correction du cas où une variable du QA se termine par une espace ; Multiples dans unités dans les valeurs affichées ; Corrections des anomalies. Eco-Device-0.96.fqa Ecodevices-0.96.lua.zip
  3. ericl78

    QA et nouvelle appli

    Bonjour à tous J'ai un prb d'affichage des QA sur appli Yubii ! Deux iPhones, un affiche bien le QA, le 2 éme page blanche. Et cela est aléatoire, prb sur un QA avec iPhone 10, un problème sur un autre QA sur iPhone 12. Ma solution était de redémarrer ma HC3, mais maintenant, cela ne fonctionne plus. Redémarrer l'iPhone, aucune utilité, testé plusieurs fois. Avez-vous constaté le même prb ? Avez-vous une solution ? Avec Android (2 tablettes), rien constaté ! Merci à vous
  4. DomoCharts Version 7.01 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/ 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 7. Téléchargement Package pour le NAS : domocharts_v7.0.zip QuickApp : DomoCharts_v7.01.fqa Icône : Mise à jour : Contenu à copier/coller par dessus le fichier main original : DomoCharts v7.01.lua
  5. Quick App - Monitoring Nas Synology Je vous propose un QA pour le monitoring de la HC3. Ce QA a été encore une fois réalisé avec l'aide de mon neveu (et oui je suis en train de la convertir). Il peut certainement être optimisé mais il fait le job. Je n'ai pas rencontré de bug. Vous pouvez le modifier et l'améliorer à votre guise. Il a les mêmes fonctions que celui de la HC2 dont on s'est largement inspiré. Utilisation : -- Créer deux variables "IPAddress" & "TCPPort" -- Renseigner votre "LOGIN" et votre "PASSWORD" -- Pour la fonction WOL, utiliser le QA WOL de Fibaro et appellé-le avec la commande: -- ==> fibaro.call(ID, "turnOn") EDIT: Voir le Header EDIT: Nouvelle version du QuickApp - Monitoring Nas Synology. Ajout des boutons pour l'éjection des disques durs connectés en USB sur les NAS. J'ai ajouté 4 boutons. Je pense que cela sera suffisant. Pour en ajouter d'autres, il suffit de suivre les commentaires dans la partie "FONCTION EJECT USB" du code. Les boutons se nomment USB Disk 1 à 4. Lorsque l'un des disques est déconnecté, les boutons se déplacent vers la gauche ( USB Disk 1 / USB Disk 2/ USB Disk 3/ No Disk ==> On élève le USB Disk 2 ==> / USB Disk 1 / USB Disk 3/ No Disk / No Disk). Je n'ai pas rencontré de bug. Le code: -- QuickApp Monitoring Nas Synology pour Fibaro HC3 -- Generic device type have no default actions to handle -- HISTORIQUE -- Adapté de https://www.domotique-fibaro.fr/topic/5682-synology-monitoring/ -- v2.4 (29/08/2015 - jojo) : première version -- merci à Krikroff, Lazer, Steven, mprinfo, FDP2 -- v2.41 (02/09/2015 - jojo) : slider pour double click -- V1.0 (14/05/2020) pour Home Center 3 par fredokl et Maxime pour le site www.domotique-fibaro.fr -- V1.1 (15/05/2020) pour Home Center 3 par fredokl et Maxime pour le site www.domotique-fibaro.fr -- Ajout du push pour avertir que le serveur n'est plus connecté. Ligne 409 de ce code -- V1.2 (27/05/2020) pour Home Center 3 par fredokl et Maxime pour le site www.domotique-fibaro.fr -- Transformation du QA en "com.fibaro.genericDevice" à la place de "Commutateur binaire" -- Ajout des icônes "serveur allumé" et "serveur éteint" -- V1.3 (29/05/2020) pour Home Center 3 par fredokl et Maxime pour le site www.domotique-fibaro.fr -- Ajout des boutons "Eject Disk" -- Changement rafraîchissement automatique (toute les minutes ==> Check tout le NAS et toutes les 10 secondes ==> Check les Disk USB) -- Améliorations du code -- Lien topic: https://www.domotique-fibaro.fr/topic/14308-quick-app-monitoring-serveur-nas-synology/ -- Utilisation: -- La connexion au NAS se fait par HTTP -- Créer deux variables "IPAddress" & "TCPPort" -- Renseigner votre "LOGIN" et votre "PASSWORD" -- Pour la fonction WOL, utiliser le QA WOL de Fibaro et appellé-le avec la commande: -- ==> fibaro.call(ID, "turnOn") -- Vous pouvez le modifier et l'améliorer à votre guise. ------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------- -- PARAMÈTRES UTILISATEUR -- ------------------------------------------------------------------------------------------- -- System variables function QuickApp:onInit() __TAG = "QA_"..plugin.mainDeviceId.."_DS 416 PLAY" self:trace("==========================================") self:debug("onInit") -- User configurable variables self.login = "login" -- votre login DSM self.password = "Password" -- votre mot de psse DSM self.ip = self:getVariable('IPAddress'); self.port = self:getVariable('TCPPort'); self.http = net.HTTPClient({ timeout = 10000 }) self.diskusblistid = {} self.diskusblistname = {} self.API_AUTH_ERROR_CODE = { [0] = "Sans erreur.", [100] = "Erreur inconnue.", [101] = "Compte non spécifié.", [400] = "Mot de passe invalide.", [401] = "Compte désactivé.", [402] = "Permission refusée.", [403] = "Unique mot de passe non spécifié.", [404] = "Autentification erronée." }; self.API_RECORD_ERROR_CODE = { [400] = "Exécution ratée.", }; self.nbmsg = 0 self.timerOn = false self.isCheckin = false self.nbCheck = 0 self:autoCheck() end -------------------------------------------------------------------------------------- -- WAKE ON LAN -------------------------------------------------------------------------------------- function QuickApp:uiWoLOnR() fibaro.call(47, "turnOn") end -------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------- -- == NE RIEN MODIFIER À PARTIR D'ICI == -------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------- -- FONCTION GETRequest: Connexion GET -------------------------------------------------------------------------------------- function QuickApp:GETRequest(payload, callBack) --self:trace("Commande GETRequest") local url = "http://" ..self.ip ..":" ..self.port ..payload self.http:request(url, { options= { headers= { ["Connection"] = "keep-alive", ["Accept"] = "application/json" }, method = "GET" }, success = function(response) self.nbmsg = self.nbmsg + 1 if callBack then callBack(response.data) end end, error = function(message) self:trace("error:" ..json.encode(message)) self.nbmsg = 0 self.timerOn = false end }) end -------------------------------------------------------------------------------------- -- FONCTION EJECT USB -------------------------------------------------------------------------------------- -- Refresh USB Disk function QuickApp:refreshUSBdisk() payload = "/webapi"..self.cgiUsed_sys.."?api="..self.apiStorage_usb.."&version=1&method=list&_sid="..self.SID; self:GETRequest(payload, function(data) jsonTable = json.decode(data); if jsonTable.success == true then local devices = jsonTable.data.devices self.diskusblistid = {} self.diskusblistname = {} for k,v in pairs(devices) do table.insert(self.diskusblistid, v.dev_id) table.insert(self.diskusblistname, v.dev_title) end self:trace("refreshUSBdisk") self:updateView("btn6", "text", self:getDiskName(self.diskusblistname[1])) -- Pour ajouter des boutons copier la ligne puis self:updateView("btn7", "text", self:getDiskName(self.diskusblistname[2])) -- changer les id pour ajouter des disks. self:updateView("btn8", "text", self:getDiskName(self.diskusblistname[3])) -- Pour supprimer un boutons ==> supprimer une ligne self:updateView("btn9", "text", self:getDiskName(self.diskusblistname[4])) --self:updateView("btn10", "text", self:getDiskName(self.diskusblistname[5])) -- Exemple bouton en plus self:trace("==========================================") end end) end -- Eject USB Disk en fonction du diskID et refresh juste après function QuickApp:ejectUSBdisk(diskID) payload = "/webapi"..self.cgiUsed_sys.."?api="..self.apiStorage_usb.."&version=1&method=eject&dev_id="..diskID.."&_sid="..self.SID; self:GETRequest(payload, function(data) jsonTable = json.decode(data); if jsonTable.success == true then self:trace("==========================================") self:trace("Disk: "..diskID.." éjecté") self:refreshUSBdisk() end end) end -- Affiche des noms sur les boutons function QuickApp:getDiskName(text) local res= "No Disk " if text then res = text end return res end -- Eject Disk vérification présence disk function QuickApp:ejectDisk(numero) local diskID = self.diskusblistid[numero] if diskID then self:CheckConnect( function() if self.isCheckin == false then self.isCheckin = true self:DoAction(function () self:ejectUSBdisk(diskID) end, 2) end end) end end -- Boutons Eject Disk function QuickApp:uiEject1OnP(event) self:ejectDisk(1) end function QuickApp:uiEject2OnP(event) self:ejectDisk(2) end function QuickApp:uiEject3OnP(event) self:ejectDisk(3) end function QuickApp:uiEject4OnP(event) self:ejectDisk(4) end --function QuickApp:uiEject5OnP(event) self:ejectDisk(5) end -- Ajouter ligne pour commande bouton -------------------------------------------------------------------------------------- -- AUTHORISATION CONNEXION NAS -------------------------------------------------------------------------------------- function QuickApp:DoAction(action, nbmsgtotal) --self:trace("Test avant ok connected") self.timerOn = true -- API & informations disponibles payload = "/webapi/query.cgi?api=SYNO.API.Info&method=Query&version=1&query=SYNO.API.Auth" self:GETRequest(payload, function (data) jsonTable = json.decode(data) self.version = jsonTable.data["SYNO.API.Auth"].maxVersion if self.version >= 2 then self:trace("Version API Synology OK") self.pathAuth = jsonTable.data["SYNO.API.Auth"].path self.cgiUsed_cpu_mem = "/entry.cgi" self.cgiUsed_sys= self.cgiUsed_cpu_mem self.cgiUsed_temp = self.cgiUsed_cpu_mem self.cgiUsed_vols = self.cgiUsed_cpu_mem self.apiUsed_cpu_mem = "SYNO.Core.System.Utilization" self.apiUsed_temp_system = "SYNO.Core.System" self.apiUsed_sys= self.apiUsed_temp_system; self.apiUsed_temp_disk = self.apiUsed_temp_system self.apiUsed_vols = self.apiUsed_temp_system self.apiMethod_cpu_mem="get" self.apiMethod_temp = "info" self.apiMethod_vols = self.apiMethod_temp self.apiStorage_usb= "SYNO.Core.ExternalDevice.Storage.USB" if self.version < 6 then self.cgiUsed_cpu_mem = "/dsm/system_loading.cgi" self.cgiUsed_sys="/dsm/system.cgi"; self.cgiUsed_temp = "/dsm/info.cgi" self.cgiUsed_vols = "/dsm/volume.cgi" self.apiUsed_cpu_mem = "SYNO.DSM.SystemLoading" self.apiUsed_temp_system = "SYNO.DSM.Info" self.apiUsed_temp_disk = "" self.apiUsed_vols = "SYNO.DSM.Volume" self.apiMethod_cpu_mem = "getinfo" self.apiMethod_temp = self.apiMethod_cpu_mem self.apiMethod_vols = "list" self.apiUsed_sys="SYNO.DSM.System"; end end self:GetSid_Send(action) self:timer(nbmsgtotal + 2) end) end -------------------------------------------------------------------------------------- -- FONCTION GetInfo: RÉCUPÉRATION DES DONNÉES -------------------------------------------------------------------------------------- function QuickApp:GetInfo(onlyDisk) self.timercount = 1000 if onlyDisk == false then -- CPU info du DSM payload = "/webapi"..self.cgiUsed_cpu_mem.."?api="..self.apiUsed_cpu_mem.."&version=1&method="..self.apiMethod_cpu_mem.."&type=current&_sid="..self.SID; self:GETRequest(payload, function (data) jsonTable = json.decode(data); if jsonTable.success == true then info_cpu = jsonTable.data.cpu; load_mem = jsonTable.data.memory.real_usage; self:trace("Memory: "..load_mem.."%"); info_cpu_memory = "Memory: "..load_mem.."% "; load_cpu = 0; if (self.version < 6) then load_cpu = info_cpu.user*100; else load_cpu = info_cpu.other_load+info_cpu.system_load+info_cpu.user_load; end self:trace("CPU: "..load_cpu.."%") info_cpu_memory = info_cpu_memory.."CPU: "..load_cpu.."%"; self:updateView("lbl3", "text", "Memoire: " ..load_mem .."% " .."CPU: " ..load_cpu .."%") self:trace("==========================================") end end) -- Info Température Système info du DSM payload = "/webapi"..self.cgiUsed_temp.."?api="..self.apiUsed_temp_system.."&version=1&method="..self.apiMethod_temp.."&_sid="..self.SID; self:GETRequest(payload, function (data) jsonTable = json.decode(data); if jsonTable.success == true then if jsonTable.data.sys_temp ~= nil then temp_system = "Température du Système: " ..jsonTable.data.sys_temp.."°C"; else temp_system = "Système: N/A"; end self:trace(temp_system); self:updateView("lbl4", "text", temp_system) end end) -- Info Température des disques -- Prépare string temp_disks = ""; payload = "/webapi"..self.cgiUsed_temp.."?api="..self.apiUsed_temp_disk.."&version=2&method="..self.apiMethod_temp.."&type=storage&_sid="..self.SID; self:GETRequest(payload, function (data) jsonTable = json.decode(data); if jsonTable.success == true then local disk_tab = jsonTable.data.hdd_info; for nb = 1, #disk_tab do temp_disks = temp_disks..disk_tab[nb].diskno..": "..disk_tab[nb].temp.."°C "; end self:trace("Température des Disques: "..temp_disks); self:updateView("lbl5", "text", temp_disks) end end) -- Info taille des disques -- Prépare string vols_load = ""; payload = "/webapi"..self.cgiUsed_vols.."?api="..self.apiUsed_vols.."&version=1&method="..self.apiMethod_vols.."&type=storage&_sid="..self.SID; self:GETRequest(payload, function (data) jsonTable = json.decode(data); if jsonTable.success == true then local vols_tab = jsonTable.data.vol_info; for nb = #vols_tab, 1, -1 do used_size_vol = vols_tab[nb].used_size; total_size_vol = vols_tab[nb].total_size; occupied_size = self:round(used_size_vol / total_size_vol * 100); vols_load = vols_load..vols_tab[nb].name..": "..occupied_size.."% "; end self:trace("Taille des Volumes: "..vols_load); self:updateView("lbl6", "text", vols_load) end end) end --Refresh button disk self:refreshUSBdisk() -- Affichage IP Serveur self:trace("IP Serveur ", "Serveur connecté: " ..self.ip ..":" ..self.port) self:updateView("lbl1", "text", "Serveur connecté: " ..self.ip ..":" ..self.port) end -------------------------------------------------------------------------------------- -- FONCTION POUR ARRONDIR LES POURCENTAGES -------------------------------------------------------------------------------------- function QuickApp:round(num) local a = math.floor(num*100 + 0.5)/ 100; return a,string.format("%.2f",a); end -------------------------------------------------------------------------------------- -- DÉCONNEXION -------------------------------------------------------------------------------------- function QuickApp:Disconnect() payload = "/webapi/"..self.pathAuth.."?api=SYNO.API.Auth&method=Logout&version=2&session=DSM&_sid="..self.SID; self:GETRequest(payload, function()end); end -------------------------------------------------------------------------------------- -- TIMER -------------------------------------------------------------------------------------- function QuickApp:timer(nbmsgtotal) if self.timerOn then if self.nbmsg < nbmsgtotal then fibaro.setTimeout(2000, function() self:timer(nbmsgtotal) end) else self:Disconnect() self.nbmsg = 0 self.timerOn = false self.isCheckin = false end end end -------------------------------------------------------------------------------------- -- REFRESH -------------------------------------------------------------------------------------- function QuickApp:autoCheck() self.nbCheck = self.nbCheck + 1 if self.nbCheck%6 == 0 or self.nbCheck == 1 then onlyDisk = false nbOperation = 5 else onlyDisk = true nbOperation = 1 end self:CheckAll(onlyDisk, nbOperation) fibaro.setTimeout(1000*10, function() self:autoCheck() end) --10 secondes end -------------------------------------------------------------------------------------- -- VÉRIFICATION DE TOUS LES ÉLÉMENTS -------------------------------------------------------------------------------------- function QuickApp:CheckAll(onlyDisk, nbOperation) self:CheckConnect( function() if self.isCheckin == false then self.isCheckin = true self:DoAction(function () self:GetInfo(onlyDisk) end, nbOperation) end end) heure = os.date("%H:%M:%S") date = os.date("%d/%m") dateheure = string.format(" %s à %s", date, heure) self:updateView("lbl7", "text", "Dernière vérification: "..dateheure) end -------------------------------------------------------------------------------------- -- CRÉATION D'UN NOUVEAU SID ET ENVOI DES COMMANDES -------------------------------------------------------------------------------------- function QuickApp:GetSid_Send(callBack) payload = "/webapi/"..self.pathAuth.."?api=SYNO.API.Auth&method=Login&version=2&account="..self.login.."&passwd="..self.password.."&session=DSM&format=sid"; self:GETRequest(payload, function (data) jsonTable = json.decode(data); if jsonTable.success == true then self.SID = jsonTable.data.sid; callBack() end end) end -------------------------------------------------------------------------------------- -- BOUTON RAFRAÎCHISSEMENT -------------------------------------------------------------------------------------- function QuickApp:uiCheckOnR(event) self:CheckAll(false, 5) end -- Check Connect function QuickApp:CheckConnect(callBack) self.tcp = net.TCPSocket({timeout = 1000}) self.tcp:connect(self.ip, tonumber(self.port), { success = function() self:trace("Check Connect OK") self:updateView("lbl2", "text", "Serveur: Allumé") fibaro.setGlobalVariable("Syno_Status1", "1") self:updateProperty("deviceIcon", 1042) -- Mettre ici le code pour l'icone allumé self.tcp:close() if callBack then callBack() end end, error = function(message) self:trace("erreur " ..message) self:updateProperty("deviceIcon", 1043) -- mettre ici le code pour l'icone éteint self:updateView("lbl1", "text", "Serveur connecté: N/A") self:updateView("lbl2", "text", "Serveur: Éteint") self:updateView("lbl3", "text", "Mémoire: N/A") self:updateView("lbl4", "text", "Température Système: NA") self:updateView("lbl5", "text", "Température diques: N/A") self:updateView("lbl6", "text", "Volume des disques: N/A") fibaro.setGlobalVariable("Syno_Status1", "0") -------------------------------------------------------------------------------------- -- ENVOI PUSH TOUTES LES DIX MINUTES -------------------------------------------------------------------------------------- if self.nbCheck%60 == 0 then fibaro.alert("push", {26}, "NAS Synology DS 416 Play est éteint: " ..os.date("%H:%M:%S")) end end }) end -------------------------------------------------------------------------------------- -- REDÉMARRAGE DU DISK STATION -------------------------------------------------------------------------------------- -- Bouton Reboot function QuickApp:uiRebootOnP(event) self:CheckConnect( function() if self.isCheckin == false then self.isCheckin = true self:DoAction(function () self:Reboot() end, 1) end end) end -- Code Reboot function QuickApp:Reboot() payload = "/webapi"..self.cgiUsed_sys.."?api="..self.apiUsed_sys.."&version=1&method=reboot&_sid="..self.SID; self:GETRequest(payload, function(data) jsonTable = json.decode(data); if jsonTable.success == true then self:trace("Redémarrage Disk Station Synology OK"); end end) end -------------------------------------------------------------------------------------- -- ARRÊT DU DISK STATION -------------------------------------------------------------------------------------- -- ShutDown the disk station function QuickApp:uiShutdownOnP(event) self:CheckConnect( function() if self.isCheckin == false then self.isCheckin = true self:DoAction(function () self:ShutDown() end, 1) end end) end function QuickApp:ShutDown() payload = "/webapi"..self.cgiUsed_sys.."?api="..self.apiUsed_sys.."&version=1&method=shutdown&_sid="..self.SID; self:GETRequest(payload, function(data) jsonTable = json.decode(data); if jsonTable.success == true then self:trace("Le Disk Station s'est arrêté"); end end) end -------------------------------------------------------------------------------------- -- FIN DU CODE -- -------------------------------------------------------------------------------------- QuickApp: QA-NAS_Synology.fqa Icônes:
  6. Bonjour à tous, Quelques mots au sujet de ma prise en main de la HC3. Tout d'abord, bien suivre la procédure initiale jusqu'au bout, afin de paramétrer le compte, les accès réseaux (éthernet et wifi), etc.. Au sujet de l'interface, quelle fluidité par rapport à la HC2 ! Fini le "flash" blanc entre chaque changement de "page" et les petits points bleus qui tournent en rond. Il va falloir aussi "réapprendre une nouvelle interface, avec une disposition et une philosophie différentes (mais on s'y fait assez vite). Par contre il existe de nouvelles "pages" telles que "Climat", "Jardin", "Profil", qui sont je pense à la fois un apport de nouvelles options et une redistribution des anciennes. Dans le genre, exit l'onglet "Panneaux", et par exemple celui des "Notifications". Apres quelques tests, les notifications (push) s'écrivent directement dans le code (sauf découverte ultérieure). Un peut déroutante également, la zone "Lua", avec à gauche une partie "Déclarations" et à droite une partie "Code". Si je ne me trompe, la partie "Déclaration" doit correspondre à l'ancien entête des scènes ( --[ ... ]-- ) ? Pour taper un peu sur le sempiternel "copper" promotionnel au sujet des LED's de facade, hé ben non ! Y'en a une qui reste(ra) rouge : celle dédiée à "l'installateur Fibaro" - agaçant... J'ai essayé de m'y coller. Hélas non ! Il faut un vrai compte d'installateur. Au sujet cette fois des icônes, toujours en 128 x 128 (j'aurais espéré 512...) Maintenant au taf ! Pas question d'importer le contenu de ma HC2 "brut de forge". Il va falloir un remaniement complet des scènes je pense (sauf si l'importation fait le transcodage). Je m'explique : getGlobalValue() devient getGlobalVariable() ! Dans le même veine : fibaro:getGlobal... devient fibaro.getGlobal... Il doit sûrement y avoir d'autres "subtilités" de ce genre. A toutes fins utiles, le lien vers le manuel Fibaro dédié au Lua "spécial" HC3 : https://manuals.fibaro.com/home-center-3-lua-scenes/ Photo de famille pour finir...
  7. Sauvegarde Home Center 3 sur NAS Synology Version 3.20 - Janvier 2021 Voici un script Shell à installer sur un NAS Synology, permettant d'automatiser la sauvegarde de la box Home Center 3. La sauvegarde est externalisée et stockée sur le NAS. Un rapport par email est envoyé, ainsi qu'une notification dans l'interface Web de DSM. Installation Télécharger le fichier backup-hc3.sh ci-joint, et le copier sur le NAS. Modifier le script afin de paramétrer les options suivantes : HC3 Address HC3_ADDRESS : Adresse IP de la HC3. Par exemple "192.168.1.1" HC3 Authentication : echo -n 'user:password' | base64 ou https://www.base64decode.org/ HC3_AUTHENTICATION : Identifiants de connexions encodés en base64. Utiliser le site https://www.base64decode.org/ par exemple pour admin:password cela donne "YWRtaW46cGFzc3dvcmQ=". L'utilisateur doit avoir les droits "Administrateur" sur la box. HC3 Backup History HC3_BACKUP_HISTORY : doit prendre la valeur "YES" afin de sauvegarder l'historique. Si la sauvegarde est trop longue ou trop grosse, il est possible de désactiver la sauvegarde de l'historique en attribuant n'importe quelle autre valeur à cette variable, par exemple "NO". HC3 Global Variable HC3_VARIABLE_NAME : nom d'une variable à tester pour bloquer le déclenchement de la sauvegarde, par exemple "Vacances" HC3_VARIABLE_IS_VALUE : valeur que doit avoir la variable éventuellement définie pour déclencher la sauvegarde, par exemple "0" HC3 Active Profile (on peut filtrer sur aucun profil, 1 seul, ou les 2, dans ce dernier cas c'est un ET logique qui est effectué, c'est à dire que les 2 conditions doivent être vraies) : HC3_PROFIL_IS_VALUE : ID du profil actif permettant de déclencher la sauvegarde. Si le profil actif est égal à cette valeur, alors la sauvegarde est démarrée. HC3_PROFIL_NOT_VALUE : ID du profil qui ne doit pas être actif pour déclencher la sauvegarde. Si le profil actif est égal à cette valeur, alors la sauvegarde est bloquée. NAS NAS_PATH : chemin complet sur le NAS dans lequel copier le fichier sauvegarder, normalement il s'agit du même répertoire qui contient le script, par exemple "/volume1/backup/HC3" Email MAIL_FROM : adresse email source, par exemple : "HC3 <moi@domaine.com>" MAIL_TO : adresse email cible, par exemple "Moi <moi@domaine.com>" MAIL_SUBJECT : titre de l'email, par exemple "Backup HC3" Notification NOTIF_TO : destinataire des notifications sur le NAS, par exemple "@administrators" NOTIF_TITLE : titre de la notification, par exemple "Sauvegarde" Backup timeout TIMEOUT : durée maximale en secondes de la sauvegarde autorisée avant que le script ne considère que la box est plantée, par exemple pour 10 minutes : 600 Reboot CLEAN_REBOOT : focer un reboot complet de la box après chaque sauvegarde, valeur par défaut "No" FORCE_REBOOT : forcer le reboto de la box si les services n'ont pas correctement redémarrés après la sauvegarde, valeur par défaut "Yes" Sur l'interface Web de DSM, ouvrir le Panneau de configuration, sélectionner le Planificateur de tâches, puis Créer / Tâche planifiée / Script défini par l'utilisateur : Dans l'onglet "Général", taper un nom de tâche et utiliser le compte "admin" : Dans l'onglet "Programmer", sélectionner un jour et une heure, par exemple chaque dimanche à 3h du matin : Dans l'onglet "Paramèters de la tâche", entrer l'adresse email destinataire des rapports, et la commande suivante pour exécuter le script (remplacer éventuellement le chemin s'il est différent chez vous) : set -o pipefail; "/volume1/backup/HC3/backup-hc3.sh" 2>&1 | tee -a "/volume1/backup/HC3/backup-hc3.out" Utilisation Attendre... Lorsque la planification se déclenche, un email est envoyé : Une notification apparait dans l'interface Web de DSM : Un nouveau fichier fbi contenant la sauvegarde (chiffrée) est présent sur le NAS, ainsi qu'un fichier journal backup-hc3.out : Exécution immédiate : Si on est impatient et qu'on veut tester immédiatement le script, le plus efficace est d'ouvrir une session SSH en ligne de commande (utiliser PuTTY sous Windows) et de l'exécuter directement : admin@DiskStation:~$ /volume1/backup/HC3/backup-hc3.sh Backup Fibaro Home Center : Saturday 11/07/2020 19:10:03 Vérification de la valeur de la variable globale 'Vacances'... Variable globale 'Vacances' = '0' identique à '0' => Sauvegarde Vérification du profil actif... Profil actif = '1' => Sauvegarde Sauvegarde avec historique... ........................................................................... Sauvegarde terminée Téléchargement de backup_HC3-00000000_2020_07_11-19_10_28.fbi... % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 794k 100 794k 0 0 8028k 0 --:--:-- --:--:-- --:--:-- 8108k Téléchargement terminé Pas de reboot du Home Center Backup terminé avec succès : Saturday 11/07/2020 19:12:02 (penser à activer préalablement le serveur SSH dans le panneau de configuration de DSM si ce n'est pas déjà fait) Téléchargement : backup-hc3.sh Bonus : script pour HC2 & HCL : backup-hc2.sh
  8. Xiaomi Roborock Vacuum Version 2.00 Présentation :  Ce QuickApp permet de piloter les robots aspirateurs Xiaomi / Roborock  Le mode est de type "Binary switch", c'est à dire qu'il est possible de lancer/stopper le nettoyage simplement en cliquant sur son icône (ou via les actions turnOn / turnOff du module) Autre intérêt, la visualisation immédiate de son activité / inactivité, particulièrement utile dans les scénarios de détection de mouvement (c'est à dire que tout mouvement dans une pièce peut être ignoré dans vos scénarios si le robot est en cours de mouvement, information qui se trouve dans sa propriété value) Remarque : le turnOff stoppe immédiatement le robot, c'est à dire qu'il ne rentre pas tout seul à la base, pour cela il faut cliquer sur le bouton dédié du QuickApp (ou appeler la méthode correspondante, voir plus loin dans ce tutoriel) Les actions suivantes sont possible dans la version actuelle : Démarrage du nettoyage Pause Arrêt du nettoyage Retour à la station Trouvez-moi Réglage des 4 niveaux de puissance d'aspiration Réglage des 4 niveaux d'eau pour la serpillère A noter que le QuickApp est multi-langue, c'est à dire que son affichage (labels et boutons) change selon le langage paramétré dans la box HC3. Actuellement l'anglais et le français sont supportés (l'anglais est la langue par défaut si la langue est inconnue) Je l'ai testé avec le Roborock S6 MaxV, je ne sais pas comment le QuickApp se comportera avec les modèles moins évolués, j'attends vos retours à ce sujet Merci à @ADN182 pour l'inspiration et le module virtuel original pour HC2, même si ce QuickApp est une réécriture intégrale du code LUA : Pré-requis : Il faut obtenir le Token de votre aspirateur. Pour cela il est impératif que le robot soit géré avec l'application Xiaomi Home, car cela ne fonctionnera pas avec l'application Roborock : Google Play Store : https://play.google.com/store/apps/details?id=com.xiaomi.smarthome Apple App Store : https://apps.apple.com/fr/app/xiaomi-home-xiaomi-smarthome/id957323480 La méthode pour récupérer le token varie selon l'époque (Xiaomi ayant renforcé la sécurité) et la plateforme utilisée, je vous donne quelques pistes, vous choisissez celle qui vous convient : https://www.maison-et-domotique.com/76309-mini-guide-integrer-le-robot-aspirateur-xiaomi-dans-jeedom/ https://www.domotique-fibaro.fr/topic/11336-xiaomi-vaccum/?page=2&amp;tab=comments#comment-186696 https://xiaomirobot.wordpress.com/android-recuperer-son-token-jeton-methode-1/ https://community.jeedom.com/t/xiaomi-home-token-new-way-pour-le-trouver/51896 Et plein d'autres disponibles sur votre moteur de recherche préféré... Personnellement j'ai procédé de la façon suivante : désinstaller Xiaomi Home installer une ancienne version de MI Home téléchargée ici : https://www.apkmirror.com/apk/xiaomi-inc/mihome/mihome-5-0-9-release/mihome-5-0-9-android-apk-download/ lancer l'app et se connecter avec son compte Xiaomi, l'aspirateur est retrouvé automatiquement utiliser MiToolKit dispo ici https://github.com/ultrara1n/MiToolkit/releases (il faut avoir déjà Java installé sur le PC, avoir activé le débogage USB sur son smartphone, et avoir autorisé le PC, heureusement tout ça j'avais déjà fait) récupérer le token désinstaller Mi Home puis réinstaller la dernière version de Xiaomi Home sur le Play Store Installation du QuickApp : Importer le QuickApp (fichier fqa) de façon habituelle sur la box Home Center 3, puis changer les paramètres suivants dans l'onglet Variables : Address : adresse IP du robot aspirateur, par exemple : 192.168.1.1 Port : port de communication, normalement : 54321 Token : clé récupérée précédemment, par exemple : 0123456789abcdef0123456789abcdef Refresh : intervalle de rafraichissement des informations en secondes, par exemple : 60 (il n'est pas forcément judicieux de baisser cette valeur, j'ai constaté que l'occupation CPU de la HC3 augmentait très significativement avec un intervalle de 10 seconde, à cause de la puissance requise pour les opérations de chiffrement/déchiffrement des trames échangées avec le robot)  Icônes : Je vous propose les icônes suivantes, sinon d'autres sont disponibles sur le topic du VD pour HC2. ON OFF Utilisation : Depuis l'interface Web ou l'application mobile : Un clic sur l'icône du module permet de démarrer le nettoyage ou de l'arrêter immédiatement (pas de retour à la station) Un clic sur les boutons du QuickApp permet de piloter le robot Glisser le slider permet de régler le volume sonore des notifications Dans le code LUA d'un QuickApp ou d'une Scène, utiliser la fonction fibaro.call() avec l'une des syntaxes suivantes : fibaro.call(123, "turnOn") -- Démarre le nettoyage fibaro.call(123, "clean") -- Démarre le nettoyage fibaro.call(123, "turnOff") -- Arrête immédiatement le nettoyage et laisse le robot à la position en cours fibaro.call(123, "stop") -- Arrête immédiatement le nettoyage et laisse le robot à la position en cours fibaro.call(123, "pause") -- Met le nettoyage en pause fibaro.call(123, "dock") -- Arrête immédiatement le nettoyage et retourne à la station fibaro.call(123, "findRobot") -- Trouve le robot fibaro.call(123, "setFanSilent") -- Règle la puissance d'aspiration sur Silencieux fibaro.call(123, "setFanNormal") -- Règle la puissance d'aspiration sur Normal fibaro.call(123, "setFanTurbo") -- Règle la puissance d'aspiration sur Turbo fibaro.call(123, "setFanMax") -- Règle la puissance d'aspiration sur Maximum fibaro.call(123, "setWaterOff") -- Règle la quantité d'eau de la serpillère sur Désactivé fibaro.call(123, "setWaterLow") -- Règle la quantité d'eau de la serpillère sur Faible fibaro.call(123, "setWaterMedium") -- Règle la quantité d'eau de la serpillère sur Moyen fibaro.call(123, "setWaterHigh") -- Règle la quantité d'eau de la serpillère sur Élevé fibaro.call(123, "setVolume", 100) -- Règle le volume audio des notifications sonores au niveau spécifié (0 à 100) fibaro.call(123, "testVolume") -- Teste le niveau audio des notifications sonores Les propriétés suivantes peuvent être lues dans le JSON du module : value : boolean : true|false -- Statut de mouvement/arrêt du robot batteryLevel : integer : 0-100 -- Niveau de batterie en % model : string : "..." -- Modèle du robot dead : boolean : true|false -- Statut de la connexion réseau avec le robot Évidemment tous les Labels peuvent également être lus et exploités. Exemple d'utilisation basique avec GEA : GEA.add({"Profile", "Away"}, 5*60, "Plus personne à la maison depuis 5 minutes, lancement du nettoyage", {"TurnOn", id["XIAOMI"]}) GEA.add({{"Profile", "Home"}, {"(Value)", id["XIAOMI"], true}}, -1, "Voilà le chef, vite retour à la station", {"QuickApp", id["XIAOMI"], "dock"}) Changelog : v2.00 : Avril 2021 Version initiale v2.01 : Avril 2021 Ajout du support des modèles plus anciens Téléchargement : Xiaomi_Roborock_Vaccum_v2.00.fqa => faire la mise à jour 2.01 proposée ici : https://www.domotique-fibaro.fr/topic/15043-quick-app-xiaomi-roborock-vacuum/?do=findComment&amp;comment=239019
  9. Doorbird Manager Manager Préambule : Après quelques recherches sur la market place, j'ai bien trouvé quelques QuickApp pour les équipements Doorbird, mais aucun n'était assez complet à mon gout. Ayant fait l'acquisition tout récemment d'une HC3, je me suis lancer dans le développement de ma premier Quick App. Du coup, j'ai entrepris de capitaliser sur le travail de @Lazer sur son VD Surveillance Station HC3 en reprenant sa structure de code et l'addapter à mon Doorbird Manager.  Le Projet : L'idée générale étant de disposer sur nos HC3 d'une Quick App pour dialoguer avec les portiers vidéos de chez Doorbird en utilisant leur API. Les principales fonctionnalités sont les suivantes : Un module principal sur lequel s'affiche : l'état de la connexion avec le portier vidéo la désignation du modèle du portier vidéo la liste des realais disponibles (uniquement sur certains modèles du portier vidéo) la liste des date et heure dernière sollicitation des différents des différents modules fils (voir ci-dessous) un bouton pour créer les module fils (Childs) Des modules Fils (Childs) reprenant les principale fonctionnalité de l'API disponibles, à savoir : Un actionneur pour activer la lumière infrarouge Des actionneurs pour chaque relais disponibles (permettant par exemple de piloter l'ouverture d'une serrure). Disponible uniquement sur certains modèles du portier vidéo. Un détecteur liée à la sonnette du portier vidéo Un détecteur de mouvement reprenant les détections du portier vidéo Des détecteurs d'utilisation des badges RFID. Disponible uniquement sur certains modèles du portier vidéo. Les usages se font en fonction du type de modules fils, soit : Pour les actionneurs, les modules fils vont permettre de donner un ordre au portier vidéo (activation de la lumière infrarouge, activation des relais) Pour les détecteurs, les modules fils vont vont recevoir des notifications (requête http) correspondant aux actions effectuées sur le boitier vidéo (Appui sur le bouton de la sonnette, détection d'un mouvement, activation d'un badge RFID) Cette Quick App s'adapte automatiquement aux différents modèles de portiers vidéos Doorbird actuellement disponibles accessible depuis l'API Doorbird. voir documentation ci-dessous. Pré-requis : Disposer d'une HC3 Disposer d'un portier vidéo Doorbird compatible, à savoir les séries D10x/D20x/D21x/B10x (RFID supporté uniquement sur la série D21x) Une mise à jour du firmware selon la série (version 000099 et plus pour les séries D10x, D20x, B10x et 000108 et plus pour la série D21x) Une connexion réseau de la HC3 et du portier vidéo sur le même réseau LAN. Installation : Télécharger la dernière version de la Quick App disponible ci-dessous. Installation de la Quick App (Fibaro Quick Apps manual: https://manuals.fibaro.com/home-center-3/ (see installing a quick APP)) Ouvrir le menu paramètres. Aller dans Dispositif. Cliquer sur : Choisir autres appareil Choisir Téléverser un fichier Choisir le fichier : Doorbird Manager Vx.xx.fqa (fichier disponible en fin de Tuto.) Configuration : Configurer les variables de la Quick App. Personnaliser les variables utilisateurs disponibles dans le module "main" de la Quick App Personnaliser les tables de variables systèmes (mais attention de bien respecter la structure des tables et ne pas tout casser Cette personnalisation n'est utile que si vous disposez de relais additionnels (au-delà des 2 de base, disponible en option sur certains modèles) des badges RFID (actuellement dans les tableaux, il y un exemple pour 2 badges RFID), vous pouvez en créer autant que vous voulez. Personnaliser les icônes pour les modules (Lumière infrarouge, Sonnette, badge RDFI), les icônes sont disponibles en fin de tuto. Cliquer sur le bouton de génération des modules fils (child). Attention à effectuer seulement après avoir réaliser les étapes de configuration précédentes. Sous peine de devoir supprimer les modules fils et relancer leur création. Voir détail ci-dessous : En cours de rédaction. En attendant, les variables sont relativement explicites. Dans le module "main" vous avez des indications dans l'entête pour la configuration et la personnalisation et les utilisations possibles. 1. Configurer les variables de la Quick App. Protocol : protocole à utiliser, normalement : http Address : adresse IP du NAS, par exemple : 192.168.0.10 Port : port de communication, normalement : 80 User : utilisateur Doorbird habilité à utiliser l'API préalablement créé dans l'application mobile Doorbird, par exemple : fsfdetj0001. Je conseil de créer un compte dédié pour votre HC3. Password : mot de passe du compte Doorbird debug : true/false. Pour activer des traces détaillées Refresh : intervalle de rafraichissement des informations (vérification de liaison avec le portier vidéo) en secondes, par exemple : 60 2. Personnaliser les variables utilisateurs disponibles dans le module "main" de la Quick App Paramètre de la langue pour les affichages sur l'écran du module principal (actuellement 2 langues sont disponibles : FR = Français, EN=Anglais) Personnalisation des libellés affichés pour statut et étapes de la connexion entre la Quick App et le portier vidéo. Vous pouvez adapter cette table pour par exemple pour ajouter une autre langue (à mettre en cohérence avec le paramètre de langue évoqué précédemment) Personnalisation des labels afficher dans le module principale. Vous pouvez adapter la table "QuickApp.LabeldesignationValues" pour par exemple pour : ` ajouter une autre langue (à mettre en cohérence avec le paramètre de langue évoqué précédemment). si nécessaire (et disponible pour votre modèle) ajouter des labels pour des relais ou badges RFID additionnels Exemple pour un badge RFID : dupliquer la ligne Modifier ce ligne duppliquée en modifiant les valeurs de la façon suivante : Il convient de mémoriser le nom que vous aurez donné à ce label pour les étapes suivantes. Paramètres de la durée du maintient ouvert d'un relais. A faire pour chaque relais et à faire correspondre avec la valeur renseignée dans l'application Doorbird. Veiller à bien respecter l'ordre des numéros. Liste des modules fils (créés lors de l'appui sur le bouton prévu à ce effet dans le visuel du module principal). Voulez changer le nom des modules avant des les créer, mais attention, il ne faut plus les modifier après dans l'interface de la HC3. Sinon il faudra supprimer le module et relancer sa création via le bouton prévu à cet effet. Vous pouvez adapter cette table pour par exemple ajouter (si disponible pour votre modèle) des relais ou badges RFID additionnels. Veiller à bien respecter l'ordre des numéros. Dans le cas d'ajout de relais ou badges RFID, il faut également ajouter des lignes au tableau des variables QuickApp.Labels et QuickApp.Child. Voir ci-après les explications. Ajout de Relais ou badges RFID et modification des variables QuickApp.Labels. Pour l'ajout d'un relais additionnel, dupliquer et insérer la ligne encadrée en bleu ci-dessus. Modifier la première valeur "LabelLastRelay2" par un nouvelle valeur comme par exemple : "LabelLastRelay3". Attention cette valeur devra correspondre à celle que vous aurez ajoutée dans le table de variable "QuickApp.LabeldesignationValues" Idem pour la deuxième valeur nommée "labelID" avec la même nouvelle valeur. Idem pour la quatrième valeur nommée "designation" avec la même nouvelle valeur. Pour l'ajout d'un badge RFID additionnel, dupliquer et insérer la ligne encadrée en vert ci-dessus. Modifier la première valeur "LabelLastRFID2" par un nouvelle valeur comme par exemple : "LabelLastRFID3". Attention cette valeur devra correspondre à celle que vous aurez ajoutée dans le table de variable "QuickApp.LabeldesignationValues" Idem pour la deuxième valeur nommée "labelID" avec la même nouvelle valeur. Idem pour la quatrième valeur nommée "designation" avec la même nouvelle valeur. Il convient également d'ajouter dans l'écran du module main les labels correspondants Sélection le bouton "Label" et le glisser dans la partie du dessus Configurer le label de la façon suivante en mettant dans ID le nom du nouveau label renseigné précédemment. Exemple : LabelLastRelay3 ou LabelLastRFID3 Etiquette une désignation similaire aux autres labels. Exemple Last RFID #3 : ou Last Relay #3. Sachant que cette désignation sera remplacée par celle que vous aurez renseignez dans la table "QuickApp.LabeldesignationValues" Ajout de Relais ou badges RFID et modification des variables QuickApp.Child. Pour l'ajout d'un relais additionnel, dupliquer et insérer la ligne encadrée en vert ci-dessus. Modifier la première valeur ["2"] par un nouvelle valeur comme par exemple : ["3"]. Ce chiffre correspond à l'indice du relais indiqué dans le label LabelRelays affiché dans l'écran du module parent (main) comme par exemple : "Relais disponibles : ["1", "2", "gggaaa@1","gggaaa@2"]". utiliser ["4"] pour le quatrième relais Idem pour la deuxième valeur nommée "QuickApp.ChildNames["DoorbirdRelay"]["2"]" avec la même nouvelle valeur, comme par exemple : ["3"]. Modifier la sixième valeur nommée "labelAssociateLastUpdatelabel = "LabelLastRelay2" avec la même valeur renseignée précédemment dans le tableau QuickApp.Labels et QuickApp.Child comme par exemple : "LabelLastRelay3". Modifier la septième valeur nommée secondeToClose = QuickApp.RelaySecondeToClose["2"] avec la même nouvelle valeur, comme par exemple : ["3"]. Dans la section nommée variables, modifier la valeur nommée QuickApp.Child["DoorbirdRelay"].devices["2"] avec la même nouvelle valeur, comme par exemple : ["3"]. Dans la ligne juste en dessous, il convient de modifier la valeur nommée value = "2" avec la même nouvelle valeur, comme par exemple : "3". Dans la dernière ligne , il convient de modifier la valeur nommée QuickApp.DeviceRelays[2] avec la même nouvelle valeur, comme par exemple :[2]. Pour l'ajout d'un badge RFID additionnel, dupliquer et insérer la ligne encadrée en vert ci-dessus. Modifier la première valeur ["2"] par un nouvelle valeur comme par exemple : ["3"]. Vous pouvez ajouter autant de badge RFID que vous voulez. Idem pour la deuxième valeur nommée "QuickApp.ChildNames["DoorbirdRFID"]["2"]" avec la même nouvelle valeur, comme par exemple : ["3"]. Modifier la sixième valeur nommée "labelAssociateLastUpdatelabel = "LabelLastRFID2" avec la même valeur renseignée précédemment dans le tableau QuickApp.Labels et QuickApp.Child comme par exemple : "LabelLastRFID3". Dans la section nommée variables, modifier la valeur nommée QuickApp.Child["DoorbirdRelay"].devices["2"] avec la même nouvelle valeur, comme par exemple : ["3"]. Dans la ligne juste en dessous, il convient de modifier la valeur nommée value = "2" avec la même nouvelle valeur, comme par exemple : "3". 3.Personnaliser les icônes pour les modules, les icônes sont disponibles en fin de tuto. A faire pour chaque module fils (Lumière infrarouge, Sonnette, badge RDFI) Aller dans l'onglet de vos module fils et charger les icônes correspondant chacun des types de module. Charge les 2 icônes en appuyant sur le bouton "Ajouter une Icône" Sélectionner l'icône chargée Sauvegarder 4. Cliquer sur le bouton de génération des modules fils (child) : Dans le module main Doorbird Manager, cliquer sur le bouton illustré ci-dessous : Attention : à effectuer seulement après avoir réaliser les étapes de configuration précédentes. Sous peine de devoir supprimer les modules fils et relancer leur création. Utilisation de la Quick App : 1. Personnaliser votre application pour envoyer les requêtes HTTP vers votre HC3. Il convient dans l'application smartphone Doorbird de définir et ajouter des Appels HTTP(s) avec les URL suivantes pour la sonnette, pour les relays, pour la détection de mouvements : http://xxx.xxx.xxx.xxx/api/callAction?deviceID=zzz&name=push&arg1=true&arg2=value&arg3=breached xxx.xxx.xxx.xxx = Correspond à l'adresse IP de votre HC3 zzz = Correspond à l'ID de votre module fils (Child) sonnette, badge RFID ou détecteur de mouvements Par la suite, il convient de paramétrer votre sonnette, badge RFID ou détecteur de mouvements dans l'application smartphone Doorbird et selon vos plages de déclenchements des requêtes HTTP. Voir documentation Doorbird. 2. Paramétrer des commandes sur votre HC3 pour inter-agir avec votre portier vidéo pour les commandes relatives à l'allumage de la lumière infrarouge et l'ouverture des relais (sur certains modèles) pour l'allumage de la lumière infrarouge, utiliser les commandes suivantes : fibaro.call(zzz, "turnOn") http://xxx.xxx.xxx.xxx/api/callAction?deviceID=zzz&name=turnOn zzz = Correspond à l'ID de votre module fils (Child) de la lumière infrarouge note: le module fils (child) lumière infrarouge vas automatiquement s'arrêter (en mode TurnOff) au bout 5 minutes pour l'allumage de l'ouverture des relais, utiliser les commandes suivantes : fibaro.call(zzz, "unsecure") http://xxx.xxx.xxx.xxx/api/callAction?deviceID=zzz&name=unsecure zzz = Correspond à l'ID de votre module fils (Child) du relais note: le module fils (child) du relais vas automatiquement s'arrêter (en mode secure) au bout de la durée définit dans la variable secondsToClose évoquée dans le paragraphe 2 du chapitre Configuration et concernant la variable QuickApp.RelaySecondeToClose Versions : V1.00 : du 19/12/2020 -> Intialisation du projet Evolutions à venir : Pourvoir lancer un redémarrage du portier vidéo Création automatique des requête HTTP dans le portier vidéo pour permettre leur utilisation dans l'application Doorbird Simplification du code pour les tableaux de variables pour les Relays et Bagde RFID additionnel et ne pas être obligé de modère manuellement les variable systèmes Probablement quelques correction et amélioration du code A voir selon vos suggestions Dernière version du VD : Quick App : Doorbird_Manager V1.00.fqa Icônes : Dernière version de la documentation de l'API : LAN-2-LAN API FOR DOORBIRD AND BIRDGUARD
  10. idomotique

    Notification en LUA sur HC3

    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", })
  11. Network Monitor Version 2.0  Voici un Quick App pour HC3 permettant de surveiller des équipements sur le réseau (local et Internet), et d'envoyer des notifications en cas de problème détecté. Cela va bien au-delà du simple ping réseau, car ce QuickApp permet de vérifier le bon fonctionnement des services (envoi d'une requête, vérification de la réponse) Il s'agit de la v2, car il fait suite au Module Virtuel Network Monitor v1.x initialement développé pour HC2. Screenshot peu esthétique, en espérant que Fibaro propose rapidement de personnaliser l'apparence visuelle des QA. Cependant, ce n'est pas son rôle premier, l'objectif est bien de recevoir des notifications instantanées en cas de souci détecté : Configuration :  Après téléchargement et import du QuickApp, modifier la variable QuickApp.config dans la section "User Variables" au début du code LUA. Exemple : -- -- User variables -- QuickApp.config = { notifications = { email = { -- Email notification users = { -- /api/users "Lazer" }, title = "HC3 Network Monitor", }, push = { -- Push notification mobiles = { -- /api/iosDevices "Pixel 2 XL", "Google Pixel C", }, }, sms = { -- SMS notification quickapp = { -- /devices?interface=quickApp id = "SMS", method = "sendSMS", }, }, vg = { -- Global Variable notification names = { -- /api/globalVariables/ "Notification" } } }, devices = { {name = "Serveur SSH" , address = "192.168.1.1" , port = 22, protocol = "tcp" , timeout = 1, senddata = nil , retdata = "OpenSSH", retry = 1, interval = 30, notification = {"push", "email" }, vg = nil, conditions = nil}, {name = "Ubiquiti Unifi AP-AC-Pro" , address = "192.168.1.2" , port = 22, protocol = "tcp" , timeout = 1, senddata = nil , retdata = "SSH" , retry = 1, interval = 60, notification = {"push", "email", "sms"}, vg = nil, conditions = nil}, {name = "Ubiquiti Unifi Switch" , address = "192.168.1.3" , port = 22, protocol = "tcp" , timeout = 1, senddata = nil , retdata = "SSH" , retry = 1, interval = 60, notification = {"push", "email" }, vg = nil, conditions = nil}, {name = "Ubiquiti Unifi Controller" , address = "192.168.1.4" , port = 8443, protocol = "https", timeout = 2, url = "/manage/account/login" , retcode = 200, retdata = "UniFi Network" , retry = 1, interval = 60, notification = {"push", "email", }, vg = nil, conditions = nil}, {name = "Ubiquiti EdgeRouter" , address = "192.168.1.5" , port = 443, protocol = "https", timeout = 1, url = "/" , retcode = 200, retdata = "EdgeRouter" , retry = 1, interval = 30, notification = { "sms"}, vg = nil, conditions = nil}, {name = "Switch Cisco" , address = "192.168.1.6" , port = 80, protocol = "http" , timeout = 1, url = "/" , retcode = 200, retdata = "cisco" , retry = 1, interval = 30, notification = {"push", "email", "sms"}, vg = nil, conditions = nil}, {name = "Switch Netgear GS105Ev2" , address = "192.168.1.7" , port = 80, protocol = "http" , timeout = 1, url = "/login.cgi" , retcode = 200, retdata = "NETGEAR" , retry = 1, interval = 60, notification = {"push", "email" }, vg = nil, conditions = nil}, {name = "Switch Netgear GS108Tv2" , address = "192.168.1.8" , port = 80, protocol = "http" , timeout = 1, url = "/" , retcode = 200, retdata = "NETGEAR" , retry = 1, interval = 60, notification = {"push", "email" }, vg = nil, conditions = nil}, {name = "HP ProLiant Remote Access Card", address = "192.168.1.9" , port = 80, protocol = "http" , timeout = 1, url = "/login.html" , retcode = 200, retdata = "Remote Access Card" , retry = 1, interval = 60, notification = { "email" }, vg = nil, conditions = nil}, {name = "HP ProLiant Gen8 ILO" , address = "192.168.1.10" , port = 443, protocol = "https", timeout = 1, url = "/" , retcode = 200, retdata = "iLO" , retry = 1, interval = 60, notification = { "email" }, vg = nil, conditions = nil}, {name = "VMware ESXi" , address = "192.168.1.11" , port = 443, protocol = "https", timeout = 1, url = "/" , retcode = 200, retdata = "VMware ESXi" , retry = 1, interval = 60, notification = {"push", "email", "sms"}, vg = nil, conditions = nil}, {name = "Onduleur Eaton 5P" , address = "192.168.1.12" , port = 80, protocol = "http" , timeout = 1, url = "/" , retcode = 200, retdata = "Network Management Card", retry = 1, interval = 60, notification = {"push", "email" }, vg = nil, conditions = nil}, {name = "Synology DiskStation" , address = "192.168.1.13" , port = 5000, protocol = "http" , timeout = 5, url = "/" , retcode = 200, retdata = "DiskStation" , retry = 1, interval = 30, notification = {"push", "email", "sms"}, vg = nil, conditions = nil}, {name = "Serveur Web Apache" , address = "192.168.1.14" , port = 80, protocol = "http" , timeout = 1, url = "/" , retcode = 200, retdata = "Apache" , retry = 1, interval = 60, notification = { "email" }, vg = nil, conditions = nil}, {name = "GCE Eco-Devices" , address = "192.168.1.15" , port = 80, protocol = "http" , timeout = 1, url = "/index1.htm" , retcode = 200, retdata = "Eco Devices" , retry = 1, interval = 30, notification = {"push", "email", "sms"}, vg = nil, conditions = nil}, {name = "GCE IPX800 v4" , address = "192.168.1.16" , port = 80, protocol = "http" , timeout = 1, url = "/user/index2.htm" , retcode = 200, retdata = "IPX800" , retry = 1, interval = 30, notification = {"push", "email", "sms"}, vg = nil, conditions = nil}, {name = "Caméra Hikvision" , address = "192.168.1.17" , port = 80, protocol = "http" , timeout = 1, url = "/doc/page/login.asp" , retcode = 200, retdata = "login" , retry = 1, interval = 30, notification = {"push", "email", "sms"}, vg = nil, conditions = nil}, {name = "Caméra Foscam" , address = "192.168.1.18" , port = 88, protocol = "http" , timeout = 1, url = "/" , retcode = 200, retdata = "IPCam Client" , retry = 1, interval = 60, notification = {"push", "email", "sms"}, vg = nil, conditions = { vg = "Vacances" , operator = "==", value = "0"}, }, {name = "JPI SMS Gateway" , address = "192.168.1.19" , port = 8080, protocol = "http" , timeout = 10, url = "/JPI/" , retcode = 200, retdata = "JPI" , retry = 6, interval = 30, notification = {"push", "email" }, vg = nil, conditions = { vg = "Monitor_JPI" , operator = "==", value = "0"}, }, {name = "FHEM" , address = "192.168.1.20" , port = 8083, protocol = "http" , timeout = 1, url = "/fhem" , retcode = 401, retdata = "" , retry = 1, interval = 30, notification = {"push", "email", "sms"}, vg = nil, conditions = nil}, {name = "HA Bridge" , address = "192.168.1.21" , port = 80, protocol = "http" , timeout = 1, url = "/#!/" , retcode = 200, retdata = "HA Bridge" , retry = 1, interval = 60, notification = {"push", "email" }, vg = nil, conditions = nil}, {name = "Google" , address = "www.google.fr", port = 80, protocol = "http" , timeout = 1, url = "/" , retcode = 200, retdata = "Recherche Google" , retry = 1, interval = 1, notification = { "sms"}, vg = nil, conditions = nil}, {name = "Yamaha MusicCast" , address = "192.168.1.22" , port = 80, protocol = "http" , timeout = 1, url = "/YamahaExtendedControl", retcode = 200, retdata = "response_code" , retry = 1, interval = 60, notification = { "email" }, vg = nil, conditions = nil}, {name = "Projecteur Epson EH-TW9300" , address = "192.168.1.23" , port = 80, protocol = "http" , timeout = 1, url = "/" , retcode = 404, retdata = "Not Found" , retry = 1, interval = 60, notification = { "email" }, vg = nil, conditions = { vg = "Vacances" , operator = "==", value = "1"}, }, {name = "Nvidia Shield TV" , address = "192.168.1.24" , port = 8008, protocol = "http" , timeout = 1, url = "/" , retcode = 404, retdata = "" , retry = 1, interval = 60, notification = { "email" }, vg = nil, conditions = { operator = "any", conditions = { { vg = "Vacances" , operator = "==", value = "1"}, { operator = "all", conditions = { { vg = "Saison", operator = "==", value = "Eté"}, { operator = "any", conditions = { { vg = "Nuit" , operator = "==", value = "1"}, { vg = "Absence" , operator = "==", value = "1"} } } } } } } }, }, } Cela risque d'être peu lisible sur votre écran, dans ce cas il faut utiliser l'ascenseur horizontal pour faire défiler, ou alors insérer des sauts de lignes) Cependant j'aime bien cette présentation qui se rapproche d'un tableau et est parfaitement lisible sur un grand écran. Ce QuickApp est relativement complexe à paramétrer, car les options sont nombreuses : notifications email : users : integer | string : liste séparée par des virgules des utilisateurs à qui envoyer un email. Il faut renseigner soit l'ID de l'utilisateur, soit son nom, informations accessibles via /api/users push : mobiles : integer | string : liste séparée par des virgules des mobiles à qui envoyer une notification Push. Il faut renseigner soit l'ID du mobile, soit son nom, informations accessibles via /api/iosDevices sms : quickapp : QuickApp qui sera appelé pour éxecuter un code LUA externe, par exemple envoyer un SMS, ou un mesage via Telegram, ou autre service de notification. id : integer | string : ID ou nom du QuickApp, informations accessibles via /api/devices?interface=quickApp method : string : nom de la fonction à appeler dans le QuickApp vg : names : string : liste séparée par des virgules des variables globales qui contiendront le message de notification, informations accessibles via /api/globalVariables devices name : obligatoire : string : Nom de l'équipement qui apparaitra dans la notification address : obligatoire : string : Adresse IP ou nom DNS de l'équipement à monitorer port : facultatif si protocole http/https | obligatoire si protocole tcp : Port TCP. Dans le cas des connexions HTTP et HTTPS, si ce n'est pas spécifié, le port par défaut sera utilisé (80 pour HTTP, et 443 pour HTTPS) protocol : obligatoire : string : "http" | "https" | "tcp" : ces 3 protocoles sont supportés. Le mode tcp est un mode raw, c'est à dire que les données sont lues/écrites telles quelles sur la socket. timeout : facultatif : integer : Valeur par défaut = 1 seconde : Durée autorisée de la connexion en secondes avant réponse du client. Doit être augmenté si le client met trop de temps à répondre. url : obligatoire si protocole http/https | inutile si protocole tcp : string : URL de la page Web à charger retcode : obligatoire si protocole http/https | inutile si protocole tcp : integer : code de retour HTTP attendu (200 la plupart du temps) senddata : inutile si protocole http/https | facultatif si protocole tcp : string : chaine de caractère à envoyer lors de l'établissement de la connexion TCP. Cela peut être nécessaire pour certains équipements qui n'envoient pas de réponse avant d'avoir reçu une instruction. retdata : facultatif : string : chaine de caractère recherchée dans la réponse retry : facultatif : integer : valeur par défaut = 1 : nombre de tentatives de connexion à effectuer. Augmenter cette valeur peut être utile pour certains équipements dont la connexion est instable, notamment via Wi-Fi. interval : facultatif : integer : valeur par défaut = 1 minute : intervalle en minutes entre 2 vérifications. J'ai testé jusqu'à 1440 minutes, soit 24 heures. notification : obligatoire : table : "push" | "email" | "sms" | "vg" | "service" : type de notification à envoyer, configurée préalablement. vg : facultatif : string : nom facultatif d'une variable globale à incrémenter, celle-ci sera automatiquement créée si nécessaire. Elle est remise à 0 dès que l'appareil surveillé est de nouveau disponible. conditions : facultatif : table : permet d'annuler le monitoring d'un équipement particulier en fonction de conditions sur des variables globales. Les conditions sont combinables avec des instructions booléennes "any" (= or) et "all" (= and). La syntaxe est inspirée du moteur de triggers des scènes sur HC3. Téléchargement : Network_Monitor_v2.0.fqa
  12. Quick App - Chauffage Fil Pilote Qubino Bonjour, Voici un QA pour le pilotage du chauffage avec un Qubino Fil Pilote. Je n'ai pas ré-inventé la roue mais simplement inspiré l'un des VD trouvé sur le forum pour la HC2. Pour cette version j'utilise une variable globale (Chauffage_Salon). Le paramétrage est très simple, il suffit de changer l'ID de votre module Qubino FP ainsi que sa valeur en fonction de vos envies. Code: -- QA de gestion pour un chauffage électrique en fil pilote 6 ordres piloté par un module Qubino -- Fonnctionne avec une Variable Globale qu'il faut créer (pas de création automatique de la VG pour le moment) -- VG = Chauffage_Salon {Confort, Confort-1, Confort-2, Éco, Hors-Gel, Arrêt} -- Créé par fredokl pour le forum www.domotique-fibaro.fr -- Version: 1.0 function QuickApp:onInit() self:debug("onInit") __TAG = "QA_"..plugin.mainDeviceId.."Chauffage Salon" -- Mise à jour variable sur label local ModeCh = fibaro.getGlobalVariable("Chauffage_Salon") self:updateProperty("Temperature", ModeCh) self:updateView("lblMode", "text", "Le chauffage du Salon est en mode ".. ModeCh) self:TemperatureSalon() end -- Température du Salon function QuickApp:TemperatureSalon(event) local tempSalon = fibaro.getValue(34, "value") -- Capteur température self:updateProperty("Temperature", tempSalon) self:updateView("lblTemp", "text", "La température du Salon est de ".. tostring(tempSalon) .." C°") self:debug("Température du Salon ".. tostring(tempSalon) .." C°") -- Rafraîchissement toutes les 15 minutes fibaro.setTimeout(1000 * 60 * 15, function() self.TemperatureSalon() end) end -- Mode Confort function QuickApp:uiConfortOnR(event) fibaro.call(62, "setValue", 99) fibaro.setGlobalVariable("Chauffage_Salon", "Confort") self:debug("Chauffage en mode Confort") self:onInit() end -- Mode Confort-1 function QuickApp:uiConfort_1OnR(event) fibaro.call(62, "setValue", 41) fibaro.setGlobalVariable("Chauffage_Salon", "Confort-1") self:debug("Chauffage en mode Confort-1") self:onInit() end -- Mode Confort-2 function QuickApp:uiConfort_2OnR(event) fibaro.call(62, "setValue", 31) fibaro.setGlobalVariable("Chauffage_Salon", "Confort-2") self:debug("Chauffage en mode Confort-2") self:onInit() end -- Mode Éco function QuickApp:uiEcoOnR(event) fibaro.call(62, "setValue", 21) fibaro.setGlobalVariable("Chauffage_Salon", "Éco") self:debug("Chauffage en mode Éco") self:onInit() end -- Mode Hors-Gel function QuickApp:uiHGOnR(event) fibaro.call(62, "setValue", 11) fibaro.setGlobalVariable("Chauffage_Salon", "Hors-Gel") self:debug("Chauffage en mode Hors-Gel") self:onInit() end -- Mode Arrêt function QuickApp:uiArretOnR(event) fibaro.call(62, "setValue", 0) fibaro.setGlobalVariable("Chauffage_Salon", "Arrêt") self:debug("Chauffage à l'arrêt") self:onInit() end Bien entendu ce code peut être modifié selon vos désirs. QuickApp: QA-Chauffage_FP.fqa
  13. Hi Elle est arrivée, désolé oublié de copier les modifs Mise en place effectuée RAS sauf reboot long 4 minutes A+ What's new: Dashboard Unified text size and colour on the right sidebar. Status toasts after performing actions on devices using the right sidebar. No limit to the number of devices. * System notification after exceeding the recommended number of devices. * Devices Unified content of Advanced tab for devices of the same type. Advanced tab for all types of linked devices. Current/total energy consumption view switch. Critical push notifications available only for life danger events. Requiring confirmation before clearing the energy data. Sum function available for linked devices of the multilevel sensor type. Two possible configurations of the energy meter device. Support for Heatit Z-Smoke Detector 230V version 4.2. Support for Heatit Z-Temp2 version 1.2. Network Possibility of adding a second Wi-Fi network for emergency auto-switching. Connecting to emergency network after losing connection to main network. Storing the credentials of added Wi-Fi networks after its disconnecting. Retrying to connect to main network each 30 minutes when connected to emergency network. Possibility of testing the connection to emergency network. Nice ** Backing up Nice devices in the system configuration backup. Nice remotes available as scene triggers. Improved view of adding new device. Changes on the binding view. Support for NiceHome devices. Other Tooltips on the interface menu icons. Possibility of skipping the ongoing first system configuration process at any step. Profiles Door locks available to open/close in any profile. Quick Apps Option of hiding the button. Rooms Possibility of choosing the main room energy meter. Scenes Redirection to expanded scene view from scenes dashboard. Bug fixes: Access Incorrect limit of characters when editing a user's e-mail address. No auto-logging when accessing the gateway via remote access. Alarm Cannot arm the whole house if there are unconfigured alarm zones. Dashboard Unable to manually set the temperature on Fibaro Heat Controller from the right sidebar. Unable to override the temperature on third-party thermostats from the right sidebar. Devices Scenes added from device Advanced tab are not displayed in this tab. Linked device of thermostat type is always equipped with all operating modes. Notifications from devices come too often and not according to selected interval. Possibility to set the ID of an icon that no longer exists. Gateway Connection No central scene events from devices added to slave gateways. Scenes based on scene activation events from devices added to slave gateways do not work. Cannot change icons of devices added to slave gateways. Unable to force the removal of devices from slave gateways. Unable to change wakeup interval of battery devices added to slave gateway. Wrong message about restoring default password when removing disconnected slave gateway. No possibility to set polling time and run mesh reconfiguration on slave gateways. Error after removing a disconnected slave gateway. Restored local backup does not include slave gateways. Connect and Replace buttons available inadequately. History Users see events from devices to which they do not have permission. Network Unexpected Wi-Fi connection loss. * Nice ** Scenes with Nice Mono and BiDi devices do not work. Notifications Duplicated notifications of available template after rebooting the gateway. Unexpected Nice radio protocol connection timeout notification. Other Numerical values are rounded incorrectly. Cannot close toast messages. Performance Significant delays in Z-Wave network communication. Few minutes after rebooting system is not available. In some cases, the gateway does not start after performing an update. Low gateway performance with MJPG stream preview. * Long gateway booting time. * Profiles Cannot set actions in profile. Quick Apps Invalid support of 'secured' property for door locks. Recovery Cannot upload beta version from local file when using Repair option. In some cases page does not load properly. * Scenes Value set on slider is zeroed and locked when editing existing block scene. Scenes based on sunrise and sunset do not function properly. In some cases, scenes require editing to work after creating backup. Syntax of fibaro.profile function is prompted incorrectly. Cannot select device in single device block. Inverted door lock condition states. * - applies only to Home Center 3 Lite ** - not available for Home Center 3 Lite
  14. Sowliny

    Intégration NICE

    Je viens de recevoir un mail relatif à un module passerelle entre le système Nice et Fibaro (HC3). Le bidule s'appelle "BiDi-ZWave" Et voici le pdf de présentation : Nice BiDi-ZWave - InstalatON.pl.pdf Et les notices : Nice BiDi-ZWave - InstalatON.pl.pdf Guide FG-IBT4ZWAVE .pdf Déjà en vente chez Domadoo... Bonne lecture ! Notice IBT4ZWAVE.pdf
  15. TonyC

    HC3 - 5.050.13 - Stable - 09/10/2020

    EDIT LE 09/10/2020 Suite à de trop nombreux problèmes, cette mise à jour à été suspendue et ne peut donc plus être installée. Note peso: Je ne rencontre pas de problèmes majeurs dans mon cas d'usage, hormis l'interface ARP qui était déjà down en 5.041.50 le reste est stable donc je ne downgrade pas et attends bien sagement la prochaine version ... En cours d'installation Thank you for using the FIBARO Home Center 3! Our constant improvements are to make your experience better. Be sure to update to the latest version to enjoy new features. What's new (5.050): Plugins Fibaro Heat Activator plugin known from HC2/HCL as Warming Prioritizer. Bug fixes (5.050): Devices Configuration endpoint is not automically hidden when finished adding a new Z-Wave device. Notifications The Nice EEPROM notification does not contain a translation and cannot be deleted. Plugins Broken api/networkDiscovery/arp request resulting in a failed network scan. What's new (5.041 Beta): Block Scenes Selecting user or device in Notification/Push action block. Simplified conditions for Z-Wave door locks. Climate Brand new climate zones control dashboard, available to any user: Setting selected zone or whole house to manual or vacation mode. Going back to schedule from manual or vacation mode. Dashboard Control of door lock type devices from the right sidebar. Devices Nice BiDi-ZWave notifications of obstacle detection, force exceeding, and hardware failure: Inactive by default in device notifications settings. To be displayed in system notifications panel or sent as push or e-mail messages. Generate relevant events to history panel. Available as conditions in block scenes. Improved time shifter with four different timespans under device charts. Possibility of copying the Z-Wave configuration parameters settings from another device. New linked device - Multilevel Sensor with four possible statistical functions. Notification when any device belonging to linked device was removed. Possibility to set theoretical power consumption for devices without power metering. Increased the maximum number of digits in Z-Wave door locks pin codes to eight. Support for Era Inn Edge Tubular Motor version 1.1 or higher. Support for REHAU RE.GUARD Smart water control system. Support for Steinel RS LED D2 Z-Wave. Garden Displaying name of the weekday for a next watering sequence. History Added button to quickly go back to the top of the list. Improved readability of events related to device reconfiguration. Lua Scenes Blocked the possibility of sending an empty push/interactive-push message. Network Improved the responsiveness of network settings page for mobile devices. Nice Support for Nice bi-directional devices using PLN2+ communication protocol. Possibility to force the Nice device synchronization if the device does not respond. Assigning default device category based on its type when adding a new Nice device. Backup and restore of Nice mono-directional devices. Other Redesigned order of items in the left sidebar. Indication of sortable columns in the tables. Minor fixes to the dark theme of the interface. Unified behaviour of drop-down lists. Two new language versions: Chinese simplified and Portuguese BR. Improving the performance of the interface. Quick Apps Displaying the complete view of the Quick App in the FIBARO Home Center mobile app. Autocompletion of global variables names in getGlobal() and getVariables() functions. Prompting for a list of actions and device properties in the left sidebar. Possibility to set a role of the roller shutter device type. Improved closing and removing of edited control. Added support for WebSockets. Scenes Brand new scenes control dashboard, available to any user: Running a scene with one click on the tile. Scenes divided into active and inactive. Displaying when the scene was recently launched. Filtering scenes by categories or using a search bar. Possibility of showing scenes which are hidden. Added search engine in scene settings. Unified order of scene categories. Update Possibility of cancelling the downloaded update before its installation. Improved displaying of current and available software version. Bug fixes (5.041 Beta): Block Scenes Action block for a group of devices is not available. Editing any block scene results in an excess of requests that overload the interface. Dashboard Showing and hiding hidden rooms results in the wrong devices being displayed. Devices No icon of an unconfigured device when adding a new Z-Wave device. Removing a device belonging to a climate zone from a linked device results in system crash. No camera image preview for a video gate linked device. No notifications from devices are sent when set to active by default in the latest update. Values on device charts are not sorted according to timestamp. General No possibility to set date and time manually. History Incorrect icons for FIBARO RGBW 2 (FGRGBW-442). Nice Internal server error when adding a new Nice device. Other Services are not restarted automatically when restoring the backup was cancelled. Plugins No camera image preview for FIBARO Intercom when using a remote access. Profiles Enabling any profile that runs the block scene results in an excess of requests. The profile to which the user has no access does not refresh automatically. Recovery Resetting the network settings requires a manual reboot of the gateway. Scenes Copying a few scenes one by one makes the interface unavailable for several minutes. Scenes based on user's location are not triggered properly. Update Error 409 when trying to cancel an ongoing update download process.
  16. jjacques68

    HC3 - 5.061.36 - BETA - 22/12/2020

    What's new: Alarm Added column with alarm scene ID. Backup Disabling backup creation button when reached the backups limit. Optional saving of the history content when creating backup manually. Dashboard Serial number displayed as a tooltip after hovering on FIBARO logo. Exact value from the api displayed as a tooltip on device tile and on the right sidebar. Possibility to control com.fibaro.player devices from the right sidebar. Possibility to open video gate from the right sidebar. Thermostat preview available from the FIBARO Home Center app. Icons for opening and closing states of roller shutters. Devices Power consumption charts in device Advanced tab. Three new icon sets for valves. Support for Heatit Z-Smoke Detector 230V version 4.1. Support for Heatit Z-Temp2 version 1.1. Support for Heatit Z-TRM3 version 4.0. Support for Sensative Strip Guard in any version. Support for U-Fairy Valve Shut-Off Controller. Gateway Connection Unlocked early access feature of connecting two or more gateways: FIBARO Home Centers 3 may be connected only to other Home Centers 3. Slave gateway must be empty or will be restored to factory settings. All gateways must have the same version installed. Backing up connected gateways together using the master gateway. Updating connected gateways one after another starting from slave gateways. Possibility to update all gateways or master gateway only. Possibility to restore backup for all gateways or master gateway only. Possibility to access slave gateways via generated password. History Displaying events related to power consumption of devices. Improved displaying events from FIBARO RGBW Controllers. Notifications Critical push notifications available as a new channel in device notifications. Other Beta version status displayed on the login screen and in General Settings. Optimized services performance and events handling. Optimized database write and read times. Plugins Tedee lock plugin. Quick Apps Buttons and sliders available as actions in block scenes. Update Notice of the necessary local connection to perform the update. Redirection to current system status after starting the update. Bug fixes: Alarm Possibility to add Z-Wave devices to Satel alarm zones. Cannot add alarm zones during the First Time Installation. Backup Cannot migrate cloud backups from one Home Center 3 to another. Incorrect states when creating backups. Cancellation of downloading an update stops creating/restoring the backup. Cameras No pause button on camera image preview. Complex stream paths are improperly translated. Devices Temperature setpoint chart is displayed incorrectly. Energy data on device Advanced tab is not cleared. No possibility to add FIBARO RGBW 2 (FGRGBW-442) in security mode. History Incorrect units for events from multilevel sensors. Filtering events by rooms does not work properly. Network Services do not start if there is a network connection without the Internet. Notifications Critical push notifications are not sent. No notifications from BiDi Z-Wave device after rebooting the gateway. Other Chinese language version choice is not saved. Services do not start after leaving the stand-by mode. Power diode is not lit after leaving the stand-by mode. Plugins Planika fireplace plugin status is refreshed too often and results in mobile app crash. Profiles Scene in which the active profile is a condition does not start after rebooting. Quick Apps Non-admin users get the login screen when opening the quick app on the mobile app. Non-admin users get only the custom part of quick app on the mobile app. The first letter in labels is automatically changed to a capital letter. No button for removing the device after leaving the edit mode. No family section in general device settings. Recovery Large systems in some cases start up in recovery mode. Scenes Scene Activation IDs are not displayed when creating block scene. Deactivation of a running scene does not stop the scene. Soft reconfiguration of the device is required to run scenes with Access Control Events. No protection against running the same scene at short time intervals.
  17. TonyC

    HC3 - 5.031.33 - 28/05/2020

    Changelog : (je vais le mettre un peu en forme ds qlqs minutes) ... Access Dark Theme - come to the dark side! Possibility to switch active theme automatically based on sunrise and sunset. Alarm Added column with zone ID and missing labels. Block Scenes Option to set time for which triggering device has not changed its state. Shorter loading time for items in the drop-down lists. Dashboard Displaying camera image preview on the right sidebar. Displaying both temperatures on the device tile for thermostat in auto or away mode. Enlarged area on the device tile which opens the right sidebar. Possibility to control slats of rollerShutter devices from the right sidebar. Displaying device ID on the right sidebar. Displaying humidity measured by humidifier on the device tile. Devices Temperature history charts for temperature sensors in device Advanced tab. Smoke history charts for FIBARO smoke sensors in device Advanced tab. Added possibility not to hide included devices when creating linked device. Possibility of moving to hidden device from linked devices family view. Support for Dome Siren (DMS01). Support for Dome Water Main Shut-Off (DMWV1). Support for Eurotronics Spirit TRV. Support for Sensative Strips Comfort. Support for Sensative Strips Drip. Early Access Features Support for Nice mono-directional devices using Flor and Opera communication protocols. Displaying Nice devices on system dashboard with control from the right sidebar. Nice devices available as actors in scenes and profiles. General Deactivated possibility of changing time zone when using manual time setting. Improved readability of current system configuration report. Improved layout and readability of the map displayed in Location. Lua Scenes Added HTTP and HTTPS clients support. Other Swagger and full-screen console available in remote access. Default console filters applied automatically depending on from where has been opened. Quick Apps Displaying generic and custom device view together on the right sidebar. Autocompletion of used functions and variables. Asynchronous sending of actions to prevent blocking the interface by awaiting requests. Added fibaro.clearTimeout function. Added three thermostat device types (auto, cool, heat). Plugins Support for IP Cameras using Digest authentication. Recovery Mode Eight new languages (de, fr, es, it, nl, no, sv, cs). Scenes Copied or converted scene keeps the same running mode as source scene. Scene view is expanded after its copying or converting. Added column with scene ID. Bug fixes: Backup Backup is not saved if its name contains special characters. Block Scenes No conditions and actions for FIBARO Walli Roller Shutter (FGWREU-111). Redundant fields in Philips Hue plugin blocks. Dashboard Multi-digit values do not fit the device tile and display incorrectly. No weather data when using external weather provider. Devices Sprinkler linked device is assigned to Lights category instead of Climate. Lua Scenes Function fibaro.getGlobalVariable does not work properly. Notifications E-mail notifications are sent to previous admin after transferring role to another user. Rejecting \n, \t and ' in notifications content. Other Time in backups, diagnostics, notifications, and general settings ignores set time zone. User can see events from devices without sufficient access rights. Plugins Incorrect state of devices belonging to Philips Hue plugin. Cannot remove YR Weather plugin. Quick Apps Incorrect operation of autocompletion. Switching to https results in console errors when using localhost (127.0.0.1). Code of large Quick App disappears after performing update. Update No reboot after performing update in some cases. Trying to install downloaded update in some cases results in error 502. Z-Wave Energy data is not removed from all endpoints of the device.
  18. idomotique

    Popp z-rain sur HC3

    Bonjour à tous, Dernièrement j'ai eu pas mal de soucis avec le capteur de pluie Z-Rain de POPP sur la HC3. En effet il y a un bug de communication entre le capteur et la centrale qui fait que l'indication de niveau de pluie est erronée. Problème Ce capteur possède 3 valeurs dans la HC3: La première valeur est utilisé pour la commande de début de pluie ou de forte pluie (qui n'est pas utilisé par défaut) que nous verrons plus tard. La 2ème est le niveau de pluie en mm/h et la 3ème est la quantité totale de pluie que le capteur à enregistré. Pour commencer je me suis intéressé à la 2ème valeur qui indique le niveau de pluie et qui pour moi logiquement va démarrer mes scènes lorsqu'il pleut trop fort. Voila ce que j'ai remarqué Lorsque la pluie commence la bascule va s'incliner une fois. On obtient alors la valeur suivante: Jusque la tout va bien, la pluie continue et le capteur augmente à 7mm/h ce qui me parait tout à fait correct: C'est la que ça se gâte. tout à coup la valeur augmente subitement à 194.5 mm/h. ce qui me parait légèrement trop: J'observe également que la valeur de la quantité totale à également changée: Voila j'imagine que comme moi à ce point vous avez fait le liens entre la quantité d'eau totale et le niveau de pluie. En effet dés que la valeur de la quantité d'eau totale est modifiée, elle écrase la valeur du niveau de pluie. ce qui est assez problématique. Voila un exemple un peu plus complet pour comprendre le phénomène: De plus un autre effet dérangeant est que cette même valeur repasse systématiquement à 0 après avoir été écrasée. Solution Il y a probablement plusieurs solutions à cela mais personnellement j'en vois 2 utilisables. Solution 1: En écrivant un petit code en LUA et en ignorant les valeurs plus grandes que 255 ce qui est la limite du capteur de niveau il est possible de ne garder que les valeurs " juste". Cela pose cependant 2 problèmes. Le premier est qu'il faut corriger la valeur du capteur d'eau totale pour la faire commencer à 255. vous pouvez le faire en modifiant le paramètre 1 du capteur ou si vous avez envie de vous amuser en faisant aller la bascule jusqu'à atteindre ce niveau. le 2ème est que cette valeur est régulièrement remise à 0 sans raison ce qui nécessite de mettre un timer de 2 minutes qui ignore également la valeur après une valeur supérieur à 255 avec le risque de perdre des données. Bref pour ces différentes raison je ne suis pas convaincu par cette solution. Solution 2: Voila la solution que je privilège Pour commencer nous allons ajouter les paramètres pour ce capteur étant donné que par défaut il ne sont pas visible. commencer par ajouter 7 paramètres avec les valeurs par défaut: Sauvegardez le tout et appuyez une fois sur le bouton TX du capteur pour le réveiller. Pour cette solution nous allons utiliser les commandes du capteur - début pluie - fin pluie - début forte pluie - fin forte pluie Pour cela nous devons faire en sorte que ces commandes arrivent à la box. Nous allons donc activer les associations entre les groupe 2,3 et la box de la manière suivante: il vous demande à chaque fois de réveiller le capteur, vous pouvez cliquer sur passez nous le ferons plus tard. Vous devriez maintenant avoir accès aux différents paramètres du capteur. Nous allons donc définir les valeurs pour ces paramètres: Compteur total d'eau: pas nécessaire de modifier Commande de début de pluie. Je vous propose de mettre une valeur à : 1 Commande de fin de pluie. Je vous propose de mettre une valeur à : 0 Multiplicateur de niveau de pluie. la c'est à vous de choisir ce paramètre ne sert qu'à l'affichage de la quantité d'eau totale. Valeur limite pour déterminer la forte pluie. à vous de déterminer. pour ma part une valeur de 20mm/h me parait intéressante pour commencer, je la modifierais peut être par la suite. Commande de début de forte pluie. Je vous propose de mettre une valeur à : 11 Commande de fin de forte pluie. Je vous propose de mettre une valeur à : 10 Une fois que vous avez réglé ces paramètres réveillez votre capteur en appuyant sur le bouton TX. Voila il ne vous reste plus qu'à créer vos scènes en fonction de la première valeur de votre capteur. voici un petit code pour tester: Trigger { conditions = { { id = 916, isTrigger = true, operator = "anyValue", property = "value", type = "device" } }, operator = "any" } Code local commandePluieID = 916 fibaro.trace("Pluie","Pluie: " .. fibaro.getValue(commandePluieID, "value") .. " / quantité: " .. fibaro.getValue(commandePluieID+1, "value") .. " / total: " .. fibaro.getValue(commandePluieID+2, "value")) Indiquez dans les 2 bloc l'id de votre capteur voila le résultat: Dés le premier basculement -> après 3 basculement dans un délais assez court -> après 5 minute sans basculement -> On voit la que le capteur de pluie est déjà à 0. Cela démontre le problème de la première solution. après 8 minutes sans basculement -> On voit que nous avons reçu la commande 0 puis 10 ce qui indique fin de pluie et fin de Forte pluie. Malheureusement lorsque la forte pluie est détectée il faut attendre la fin complète de la pluie pour que la commande de fin de forte pluie soit renvoyée. Voila, j'espère que cela pourra aider certains d'entre vous. N'hésitez pas à commenter ou à poser des questions. SPAM (liens commerciaux) supprimé
  19. jjacques68

    [HC3] QuickApps pour IPX800 v3

    Pour ceux que ça intéresse : Les QA prennent tous leurs sens avec un IPX, c'est génial !! je partage : Principe ultra simple : Le QA permet de piloter la sortie de l'IPX. Le retour d'état de la sortie se fait via les messages PUSH de l'IPX. DANS LA HC3 : - il faut créer un utilisateur spécifique pour que l'IPX puisse se connecter à la HC3 (et prendre autre chose que le super user...) - il faut créer un QA avec comme type rôle Binary Swicth. - vous choisissez les icones qui vont bien, les différents réglages de notifications, la pièce, ... - Vous lui donnez un type (lights, sprinkler, ...) - vous créez 3 variables dans le QA : IP = adresse IP de l'IPX password = user:password encodé en base 64 (celui permettant de se connecter sur l'IPX) IpxOutNumber=N° de la sortie que vous voulez qu'il pilote - vous créez un label avec comme nom "LBL_State" (permettra de récupérer les éventuels messages d'erreur) et dans le code vous insérez cela : function QuickApp:onInit() self:debug("onInit") end ------------------------------------------------------------------------------------- -- Méthodes pouvant être appelées de partout ------------------------------------------------------------------------------------- function QuickApp:turnOn() self:Switch(self:getVariable("IpxOutNumber"),1) end function QuickApp:turnOff() self:Switch(self:getVariable("IpxOutNumber"),0) end ------------------------------------------------------------------------------------- -- Function pour actionner la sortie défini dans la variable ------------------------------------------------------------------------------------- function QuickApp:Switch(Num,State) self.http = net.HTTPClient({timeout=3000}) self.http:request("http://"..self:getVariable("IP").."/preset.htm?set"..Num.."="..State, { options = { headers = {['Authorization']='Basic '..self:getVariable("password")}, method = 'GET' }, success = function(response) self:updateView("LBL_State", "text", tostring(response.data)) end, error = function(err) self:updateView("LBL_State", "text", tostring(err)) end }) end ------------------------------------------------------------------------------------- -- Function pour réceptionner le retour d'état de la sortie ------------------------------------------------------------------------------------- function QuickApp:ReceiveState(status) self:debug(status) if status == 1 then self:updateProperty("value", true) else self:updateProperty("value", false) end end Dans l'IPX : les messages push de chaque sortie seront sous la forme : /api/callAction?deviceID=284&name=ReceiveState&arg1=1 en rouge = adresse IP de la HC3 en vert = le user:mot_de_passe (en clair) pour se connecter à la HC3 (avec l'utilisateur créé plus haut) en jaune = l'ID du QA que vous avez créé il ne faut pas oublier, dans la gestion des accès de la HC3, d'autoriser le user, créé spécifiquement plus haut, à utiliser le QA !!! pour piloter le QA depuis une scène en LUA : --pour le pilotage fibaro.call(284, "turnOn") --pour connaitre son status fibaro.getValue(284, "value") Divers : Pour créé rapidement d'autres QA, il suffit d'exporter le QA qui vient d'être créé (fichier .fqa) et de l'importer pour passer à une autre sortie. Il faudra alors, modifier la variable "IpxOutNumber" du QA. Attention de penser au droits d'accès pour ce nouveau QA du coup... Fichier DEMO : Demo_IPX.fqa
  20. Voici 2 petits scripts LUA pour explorer les objets accessibles dans les QuickApps et les Scènes sur HC3. Quand on développe, il est toujours intéressant de découvrir des variables et fonctions non documentées, ou voir quelles fonctions sont disponibles dans les QuickApps ou dans les Scènes car il y a pas mal de différences. Cela permettra aussi de suivre les ajouts de fonctions par Fibaro au fur et à mesure des nouveaux firmwares. Les résultats donnés dans ce post sont été obtenus avec le firmware 5.031.33 QuickApps Créer un QA avec un seul bouton pour lancer l'exécution du code : function QuickApp:browse(racine, tableau) local variables, functions, objects = {}, {}, {} for k, v in pairs(tableau) do if type(v) == "table" then if v ~= _G then local variables2, functions2, objects2 = self:browse(racine .. k .. ".", v) for i = 1, #variables2 do variables[#variables+1] = variables2[i] end for i = 1, #functions2 do functions[#functions+1] = functions2[i] end for i = 1, #objects2 do objects[#objects+1] = objects2[i] end end elseif type(v) == "function" then functions[#functions+1] = racine .. k .. '()' elseif type(v) == "string" then variables[#variables+1] = racine .. k .. ' = "' .. v .. '"' elseif type(v) == "number" then variables[#variables+1] = racine .. k .. ' = ' .. tostring(v) elseif type(v) == "integer" then variables[#variables+1] = racine .. k .. ' = ' .. tostring(v) elseif type(v) == "boolean" then variables[#variables+1] = racine .. k .. ' = ' .. tostring(v) else objects[#objects+1] = racine .. k .. " => " .. type(v) end end table.sort(variables) table.sort(functions) table.sort(objects) return variables, functions, objects end function QuickApp:onButtonClic(event) self:trace("") local variables, functions, objects = self:browse("", _G) self:trace("Variables :") for _, v in ipairs(variables) do self:debug(v) end self:trace("Fonctions :") for _, v in ipairs(functions) do self:debug(v) end self:trace("Objets :") for _, v in ipairs(objects) do self:debug(v) end self:debug("Terminé") end function QuickApp:onInit() end Résultat : Variables : _VERSION = "Lua 5.3" __TAG = "QuickApp152" json._COPYRIGHT = "Copyright (c) 2007-2017 Thomas Harning Jr. " json._DESCRIPTION = "LuaJSON : customizable JSON decoder/encoder" json._VERSION = "1.3.4" json.decode.simple.array.allowEmptyElement = false json.decode.simple.array.trailingComma = true json.decode.simple.calls.allowEmptyElement = false json.decode.simple.calls.allowUndefined = false json.decode.simple.calls.trailingComma = true json.decode.simple.number.exp = true json.decode.simple.number.frac = true json.decode.simple.number.hex = false json.decode.simple.number.inf = true json.decode.simple.number.nan = true json.decode.simple.object.allowEmptyElement = false json.decode.simple.object.identifier = true json.decode.simple.object.number = true json.decode.simple.object.trailingComma = true json.decode.simple.others.allowUndefined = true json.decode.simple.others.null = false json.decode.simple.others.undefined = false json.decode.simple.strings.additionalEscapes = false json.decode.simple.strings.badChars = "" json.decode.simple.strings.strict_quotes = false json.decode.strict.array.allowEmptyElement = false json.decode.strict.array.trailingComma = false json.decode.strict.calls.allowEmptyElement = false json.decode.strict.calls.allowUndefined = false json.decode.strict.calls.trailingComma = true json.decode.strict.initialObject = true json.decode.strict.nothrow = false json.decode.strict.number.exp = true json.decode.strict.number.frac = true json.decode.strict.number.hex = false json.decode.strict.number.inf = false json.decode.strict.number.nan = false json.decode.strict.object.allowEmptyElement = false json.decode.strict.object.identifier = false json.decode.strict.object.number = false json.decode.strict.object.trailingComma = false json.decode.strict.others.allowUndefined = false json.decode.strict.strings.additionalEscapes = false json.decode.strict.strings.badChars = " " json.decode.strict.strings.strict_quotes = true json.decode.strict.unicodeWhitespace = true json.decode.util.DecimalLpegVersion = 1.0 json.encode.default.number.inf = true json.encode.default.number.nan = true json.encode.default.others.allowUndefined = true json.encode.default.strings.encodeSet = "\"/%z-" json.encode.default.strings.xEncode = false json.encode.strict.initialObject = true json.encode.strict.number.inf = false json.encode.strict.number.nan = false json.encode.strict.others.allowUndefined = false json.encode.strict.strings.encodeSet = "\"/%z-" json.encode.strict.strings.xEncode = false logger.DEBUG = 1 logger.ERROR = 4 logger.FATAL = 5 logger.INFO = 2 logger.TRACE = 0 logger.WARNING = 3 math.huge = inf math.maxinteger = 9223372036854775807 math.mininteger = -9223372036854775808 math.pi = 3.1415926535898 plugin.mainDeviceId = 152 utf8.charpattern = "[-�-�][�-�]*" Fonctions : __assert_type() __fibaroSleep() __fibaroUseAsyncHandler() __fibaro_add_debug_message() __fibaro_get_device() __fibaro_get_device_property() __fibaro_get_devices() __fibaro_get_global_variable() __fibaro_get_room() __fibaro_get_scene() __print() __ternary() api.delete() api.get() api.post() api.put() assert() bit32.arshift() bit32.band() bit32.bnot() bit32.bor() bit32.btest() bit32.bxor() bit32.extract() bit32.lrotate() bit32.lshift() bit32.replace() bit32.rrotate() bit32.rshift() class() clearInterval() clearTimeout() collectgarbage() configure() error() fibaro.__houseAlarm() fibaro.alarm() fibaro.alert() fibaro.call() fibaro.callGroupAction() fibaro.clearTimeout() fibaro.debug() fibaro.emitCustomEvent() fibaro.error() fibaro.get() fibaro.getDevicesID() fibaro.getGlobalVariable() fibaro.getIds() fibaro.getName() fibaro.getRoomID() fibaro.getRoomName() fibaro.getRoomNameByDeviceID() fibaro.getSectionID() fibaro.getType() fibaro.getValue() fibaro.profile() fibaro.scene() fibaro.setGlobalVariable() fibaro.setTimeout() fibaro.sleep() fibaro.trace() fibaro.useAsyncHandler() fibaro.wakeUpDeadDevice() fibaro.warning() getHierarchy() ipairs() json.array() json.decode.decode() json.decode.getDecoder() json.decode.simple.object.setObjectKey() json.decode.simple.strings.decodeUnicode() json.decode.strict.object.setObjectKey() json.decode.strict.others.null() json.decode.strict.others.undefined() json.decode.strict.strings.decodeUnicode() json.decode.util.denied() json.decode.util.get_invalid_character_info() json.decode.util.setObjectKeyForceNumber() json.decode.util.unexpected() json.encode.default.array.isArray() json.encode.default.others.null() json.encode.default.others.undefined() json.encode.encode() json.encode.getEncoder() json.encode.strict.array.isArray() json.encode.strict.others.null() json.encode.strict.others.undefined() json.null() json.util.InitArray() json.util.IsArray() json.util.buildCall() json.util.clone() json.util.decodeCall() json.util.doOptionMerge() json.util.isCall() json.util.merge() json.util.null() json.util.printValue() json.util.undefined() logger.debug() logger.error() logger.fatal() logger.getLevel() logger.info() logger.log() logger.setLevel() logger.trace() logger.warning() math.abs() math.acos() math.asin() math.atan() math.atan2() math.ceil() math.cos() math.cosh() math.deg() math.exp() math.floor() math.fmod() math.frexp() math.ldexp() math.log() math.log10() math.max() math.min() math.modf() math.pow() math.rad() math.random() math.randomseed() math.sin() math.sinh() math.sqrt() math.tan() math.tanh() math.tointeger() math.type() math.ult() next() onAction() onUIEvent() os.clock() os.date() os.difftime() os.exit() os.time() pairs() pcall() plugin.createChildDevice() plugin.deleteDevice() plugin.getChildDevices() plugin.getDevice() plugin.getProperty() plugin.restart() print() property() rawlen() select() setInterval() setTimeout() string.byte() string.char() string.dump() string.find() string.format() string.gmatch() string.gsub() string.len() string.lower() string.match() string.pack() string.packsize() string.rep() string.reverse() string.split() string.starts() string.sub() string.unpack() string.upper() super() table.concat() table.insert() table.move() table.pack() table.remove() table.sort() table.unpack() tonumber() tostring() type() unpack() utf8.char() utf8.codepoint() utf8.codes() utf8.len() utf8.offset() xpcall() Objets : Device => userdata Hierarchy => userdata QuickApp => userdata QuickAppBase => userdata QuickAppChild => userdata core.EventTarget => userdata json.decode.simple.strings.escapeCheck => userdata json.decode.strict.strings.escapeCheck => userdata json.decode.util.ascii_ignored => userdata json.decode.util.ascii_space => userdata json.decode.util.comment => userdata json.decode.util.comments.c => userdata json.decode.util.comments.cpp => userdata json.decode.util.hex => userdata json.decode.util.hexpair => userdata json.decode.util.identifier => userdata json.decode.util.unicode_ignored => userdata json.decode.util.unicode_space => userdata mqtt.Client => userdata mqtt.ConnectReturnCode => userdata mqtt.QoS => userdata net.HTTPClient => userdata net.TCPSocket => userdata quickApp => userdata Scènes Créer une scène LUA en exécution manuelle avec ce code : local function browse(racine, tableau) local variables, functions, objects = {}, {}, {} for k, v in pairs(tableau) do if type(v) == "table" then if v ~= _G and v ~= _ENV and v ~= __index and k ~= "__index" then local variables2, functions2, objects2 = browse(racine .. k .. ".", v) for i = 1, #variables2 do variables[#variables+1] = variables2[i] end for i = 1, #functions2 do functions[#functions+1] = functions2[i] end for i = 1, #objects2 do objects[#objects+1] = objects2[i] end end elseif type(v) == "function" then functions[#functions+1] = racine .. k .. '()' elseif type(v) == "string" then variables[#variables+1] = racine .. k .. ' = "' .. v .. '"' elseif type(v) == "number" then variables[#variables+1] = racine .. k .. ' = ' .. tostring(v) elseif type(v) == "integer" then variables[#variables+1] = racine .. k .. ' = ' .. tostring(v) elseif type(v) == "boolean" then variables[#variables+1] = racine .. k .. ' = ' .. tostring(v) else objects[#objects+1] = racine .. k .. " => " .. type(v) end end table.sort(variables) table.sort(functions) table.sort(objects) return variables, functions, objects end fibaro.trace(tag, "") local variables, functions, objects = browse("", _ENV) fibaro.trace(tag, "Variables :") for _, v in ipairs(variables) do fibaro.debug(tag, v) end fibaro.trace(tag, "Fonctions :") for _, v in ipairs(functions) do fibaro.debug(tag, v) end fibaro.trace(tag, "Objets :") for _, v in ipairs(objects) do fibaro.debug(tag, v) end fibaro.debug(tag, "Terminé") Résultat : Variables : fibaro.version = "1.0.0" json._version = "0.1.0" math.huge = inf math.maxinteger = 9223372036854775807 math.mininteger = -9223372036854775808 math.pi = 3.1415926535898 sceneId = 10 sourceTrigger.id = 2 sourceTrigger.property = "execute" sourceTrigger.type = "user" tag = "Scene10" Fonctions : api.delete() api.get() api.post() api.put() assert() error() fibaro.alarm() fibaro.alert() fibaro.call() fibaro.callGroupAction() fibaro.debug() fibaro.emitCustomEvent() fibaro.error() fibaro.get() fibaro.getAllDeviceIds() fibaro.getDevicesID() fibaro.getGlobalVariable() fibaro.getIds() fibaro.getName() fibaro.getRoomID() fibaro.getRoomName() fibaro.getRoomNameByDeviceID() fibaro.getSectionID() fibaro.getType() fibaro.getValue() fibaro.homeCenter.climate.setClimateZoneToManualMode() fibaro.homeCenter.climate.setClimateZoneToScheduleMode() fibaro.homeCenter.climate.setClimateZoneToVacationMode() fibaro.homeCenter.notificationService.publish() fibaro.homeCenter.notificationService.remove() fibaro.homeCenter.notificationService.update() fibaro.homeCenter.popupService.publish() fibaro.homeCenter.systemService.reboot() fibaro.homeCenter.systemService.suspend() fibaro.profile() fibaro.scene() fibaro.setGlobalVariable() fibaro.setTimeout() fibaro.sleep() fibaro.trace() fibaro.wakeUpDeadDevice() fibaro.warning() ipairs() json.decode() json.encode() math.abs() math.acos() math.asin() math.atan() math.atan2() math.ceil() math.cos() math.cosh() math.deg() math.exp() math.floor() math.fmod() math.frexp() math.ldexp() math.log() math.log10() math.max() math.min() math.modf() math.pow() math.rad() math.random() math.randomseed() math.sin() math.sinh() math.sqrt() math.tan() math.tanh() math.tointeger() math.type() math.ult() net.HTTPClient.new() net.HTTPClient.request() next() os.date() os.time() pairs() pcall() print() select() string.byte() string.char() string.dump() string.find() string.format() string.gmatch() string.gsub() string.len() string.lower() string.match() string.pack() string.packsize() string.rep() string.reverse() string.sub() string.unpack() string.upper() table.concat() table.insert() table.move() table.pack() table.remove() table.sort() table.unpack() tonumber() tostring() type()
  21. QuickApp Onduleur Eaton Version 3.0 1. Présentation Voici un Quick App pour HC3 permettant de monitorer un onduleur Eaton via le réseau grâce au protocole standardisé SNMP. Ce QuickApp fait suite au Module Virtuel initialement développé pour HC2 : 2. Fonctionnalités  Surveillance de l'état de l'onduleur au travers de la carte de management réseau "Network Management Card" Mise à jour des labels du QuickApp et des attributs suivants : Statut de l'alimentation secteur : propriété "value", valeur binaire true ou false Consommation : propriété "power", unité Watts Niveau de charge de la batterie : propriété "batteryLevel", unité % Création et mise à jour de modules enfants (child devices) : Autonomie : type "com.fibaro.multilevelSensor", propriété "value", unité minutes Tension : type "com.fibaro.multilevelSensor", propriété "value", unité Volts Température : type "com.fibaro.temperatureSensor", propriété "value", unité °C Humidité : type "com.fibaro.humiditySensor", propriété "value", unité %HR Mise à jour de variables globales Notifications par Email, Push, et SMS en cas d'événement (perte du secteur et basculement sur batterie, puis retour à la normale) Récupère la température et l'humidité si une sonde environnementale EMP est connectée au port dédié de l'onduleur. 3. Prérequis Obligatoire : disposer de la carte réseau "Network Card-MS" : Optionnel : la sonde environnementale "Environmental Monitoring Probe" (EMP) permet d'ajouter les mesures externes de température et d'humidité : 4. Limitations Protocole SNMP v1 uniquement (pas de sécurité : authentification, chiffrement) Fait du polling à intervalle régulier, ne supporte pas les Traps SNMP. 5. Installation  5.1. Import du QuickApp  Importer le QuickApp (fichier fqa) de façon habituelle sur la box HC3, puis changer les paramètres suivants dans l'onglet Variables : SNMP_Protocol : protocole à utiliser, normalement : udp SNMP_Address : adresse IP de la carte de management de l'onduleur, par exemple : 192.168.1.1 SNMP_Port : port de communication, normalement : 161 SNMP_Community : communauté SNMP, normalement : public SNMP_Version : version du protocole SNMP, seule version supportée actuellement : 1 Refresh : intervalle de rafraichissement des informations en secondes, par exemple : 3 Notif_Users : ID ou Nom des utilisateurs à qui envoyer un email en cas d'échec d'envoi du SMS, séparés par des virgules. La liste des utilisateurs peut être récupérée dans le panneau Accès de la HC3, ou directement via l'API /api/users. Par exemple : Lazer Notif_Mobiles : ID ou Nom des smartphones à qui envoyer une notification Push en cas d'échec d'envoi du SMS, séparés par des virgules. La liste des mobiles peut être récupérée via l'API /api/iosDevices. Par exemple : Nokia 3310, iPhone 42 Notif_SMS : ID ou Nom du QuickApp et Fonction qui sera appelé pour exécuter un code LUA externe, par exemple envoyer un SMS, un message via Telegram, ou autre service de notification. Par exemple : JPI = sendSMS 5.2. Modules enfants Cliquer sur le bouton "Create devices". Les modules enfants sont automatiquement créés dans l'interface. Les appuis suivants sont inutiles, et sans danger, car les modules enfants ne seront pas créés plusieurs fois. 5.3. Icônes 6. Téléchargement Onduleur_Eaton_v3.0.fqa
  22. fredokl

    QuickApp - Remote Denon

    Quick App - Remote Denon Voici un QA pour piloter un amplificateur Audio-Vidéo de la Marque DENON. Il est calibré selon mes besoins mais vous pouvez ajouter facilement les fonctions que vous souhaitez sur votre amplificateur. Avec mon neveu (et oui encore lui) nous sommes parti du Vd réalisé par @sebcbien sur le forum pour les amplificateur MARANTZ qui est une filiale de DENON. Les codes sont presque tous les mêmes. Les commandes passent par Telnet (port 23 par défaut). Le QA n'est peut-être pas parfait mais je n'ai pas eu de bugs. Vous pouvez le modifier et l'améliorer à votre convenance. Pour le paramètrage, tout est expliqué dans le header. Code: -------------------------------------------------------------------------------------------------------------------------------------- -- QuickApp Amplificateur Audio-Vidéo DENON AVR-X3200W -- Commutateur binaire -- HISTORIQUE -- Adapté de https://www.domotique-fibaro.fr/topic/3263-telecommande-pour-marantz-sr6008-et-similaires-5008-7008-etc/?tab=comments#comment-46332 -- V3.2 (10/01/2015) Remote Marantz de SebcBien -- HC3 Version: -- V1.0 (14/05/2020) Remote Denon pour Home center 3 par fredokl et Maxime pour le site www.domotique-fibaro.fr -- Utilistaion : -- La connexion à l'amplifivateur Audio-Vidéo se fait par TELNET (port:23 par défaut) -- Créer les variables "ip" & "port" -- Ajouter les commandes que vous souhaitez dans la partie "RÉGLAGES UTILISATEUR" -- Toutes les modifications se font dans la partie "RÉGLAGES UTILISATEUR" -- À l'excepter des noms des appareils que vous utilisez chez vous -- ==> voir QuickApp:onDataReceived(data) -- ==> VOS APPAREILS ICI -- Vous pouvez le modifier et l'améliorer à votre guise. -------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------- -- PARAMÈTRES UTILISATEUR -- -------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------- QuickApp._VERSION = "1.0" function QuickApp:onInit() __TAG = "QA_"..plugin.mainDeviceId.."DENON" self:trace("DEBUT ========================================================") self.ip = self:getVariable("ip") self.port = tonumber(self:getVariable("port")) self:setVariable("mute", "0") self.sock = net.TCPSocket() -- création d'une instance TCPSocket self.isOn = false self.isconnected = false self:connect() self.pollingTime = 1000*60 -- 1min self:refresh() end -------------------------------------------------------------------------------------------------------------------------------------- -- ON & OFF -------------------------------------------------------------------------------------------------------------------------------------- function QuickApp:turnOn() self:debug("Turn On") self:sendCommand("PWON") self:getinfo() end function QuickApp:uibtnonOnReleased(event) self:turnOn() end function QuickApp:turnOff()self:debug("Turn off") self:sendCommand("PWSTANDBY") self:getinfo() end function QuickApp:uibtnoffOnReleased(event) self:turnOff() end -------------------------------------------------------------------------------------------------------------------------------------- -- Boutons de volume -------------------------------------------------------------------------------------------------------------------------------------- function QuickApp:uibtnvol30OnReleased(event) self:SetVol(30) self:getinfo() end function QuickApp:uibtnvol40OnReleased(event) self:SetVol(40) self:getinfo() end function QuickApp:uibtnvol50OnReleased(event) self:SetVol(50) self:getinfo() end function QuickApp:uibtnvol60OnReleased(event) self:SetVol(60) self:getinfo() end function QuickApp:uibtnmuteOnOff(event) if self:getVariable("mute") == "0" then self:setVariable("mute","1") self:sendCommand("MUON") self:updateProperty("value", true) self:getinfo() elseif self:getVariable("mute") == "1" then self:setVariable("mute", "0") self:sendCommand("MUOFF") self:updateProperty("value", false) self:getinfo() end end -------------------------------------------------------------------------------------------------------------------------------------- -- FORMATS SONORS -------------------------------------------------------------------------------------------------------------------------------------- function QuickApp:uiddOnReleased(event) self:debug("Dolby Digital") self:sendCommand("MSDOLBY DIGITAL") self:getinfo() end function QuickApp:uidtsOnReleased(event) self:debug("DTS") self:sendCommand("MSDTS SURROUND") self:getinfo() end function QuickApp:ui7chstOnReleased(event) self:debug("7 Canaux Stereo") self:sendCommand("MSMCH STEREO") self:getinfo() end -------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------- -- NE RIEN TOUCHER À PARTIR D'ICI -- -------------------------------------------------------------------------------------------------------------------------------------- -- VOLUME & SLIDER -------------------------------------------------------------------------------------------------------------------------------------- function QuickApp:SetVol(value) if value < 10 then value = "0" ..value end self:sendCommand("MV" ..tostring(value)) self:trace("Volume", value) end function QuickApp:uivolumeOnChanged(event) local value = event.values[1] self:SetVol(value) self:getinfo() end -------------------------------------------------------------------------------------------------------------------------------------- -- REQUÊTE HTTP -------------------------------------------------------------------------------------------------------------------------------------- function QuickApp:getinfo() self:sendCommand("PW?") -- Power self:sendCommand("SI?") -- source self:sendCommand("MS?") -- format sono self:sendCommand("MV?") -- volume end function QuickApp:uigetinfo() self:getinfo() end function QuickApp:sendCommand(strToSend) local command = strToSend .."\r" self.sock:write(command, { success = function() -- fonction qui sera déclenchée lorsque les données seront correctement envoyées --self:trace("data sent" ..command) end, error = function(err) -- fonction qui sera déclenchée en cas d'erreur de transmission de données self:trace("error while sending data") end }) end -- méthode pour lire les données du socket -- puisque la méthode elle-même a été bouclée, elle ne doit pas être appelée depuis un autre emplacement que QuickApp:connect() function QuickApp:waitForResponseFunction() self.sock:read({ -- lire un paquet de données depuis le socket success = function(data) self:onDataReceived(data) -- traitement des données reçues self:waitForResponseFunction() -- lecture en boucle des données end, error = function() -- une fonction qui sera appelée en cas d'erreur lors de la tentative de réception de données, par ex. déconnexion d'un socket self:trace("response error") self.sock:close() -- socket fermé fibaro.setTimeout(5000, function() self:connect() end) -- tentative de reconnexion (toutes les 5 secondes) end }) end -- méthode pour ouvrir une connexion TCP. -- si la connexion réussit, la boucle de lecture des données sera appelée QuickApp:waitForResponseFunction () function QuickApp:connect() self.sock:connect(self.ip, self.port, { -- connexion à l'appareil avec l'adresse IP et le port spécifiés success = function() -- la fonction sera déclenchée si la connexion est correcte self:trace("connected") self.isconnected = true self:waitForResponseFunction() -- lancement d'une "boucle" de lecture de données end, error = function(err) -- une fonction qui sera déclenchée en cas de connexion incorrecte, par ex. timeout self.sock:close() -- fermeture du socket self:warning("connection error") self:updateView("lblSource", "text", "Source: N/A") self:updateView("lblSur", "text", "Format Sonor: N/A") self:updateView("lblVolStat", "text", "Volume: N/A") self:updateView("Slidervolume", "value", "0") fibaro.setTimeout(5000, function() self:connect() end) -- tentative de reconnexion (toutes les 5 secondes) end, }) end -- fonction de gestion des données lues -- normalement c'est là que les données rapportées par l'appareil seront traitées function QuickApp:onDataReceived(data) --self:trace("onDataReceived", data) power = string.find(data, "PW.") volume = string.find(data, "MV%d") formatsonor = string.find(data, "MS.") source = string.find(data, "SI.") if power then if string.sub(data, 3, #data - 1) == "STANDBY" then self.isOn = false self:updateView("lblSource", "text", "Source: N/A") self:updateView("lblSur", "text", "Format Sonor: N/A") self:updateView("lblVolStat", "text", "Volume: N/A") self:updateView("Slidervolume", "value", "0") self:updateProperty("value", false) else self.isOn = true self:updateProperty("value", true) end end if self.isOn then if volume then local statSliderVol = string.sub(data, 3, #data-1) if string.len(statSliderVol) == 3 then statSliderVol = string.sub(statSliderVol, 1, 2) end self:updateView("lblVolStat", "text", "Volume: " ..statSliderVol .." %") self:updateView("Slidervolume", "value", statSliderVol) -- updating the text for 'Slidervolume'. end if formatsonor then self:updateView("lblSur", "text", "Mode Surround: " ..string.sub(data, formatsonor + 2)) self:trace("Mode Surround: " ..string.sub(data, formatsonor + 2)) end if source then source = string.sub(data, source + 2) sourcetable = { -- VOS APPAREILS ICI ------------------------------------------- MPLAY = "APPLE TV4", --SAT/CBL = "FREEBOX", --A VERIFIER SUR AMPLI ET PC BD = "PS4", TV = "TV SONY" -- VOS APPAREILS ICI ------------------------------------------- } translatesource = sourcetable[string.sub(source, 1, #source -1)] if translatesource == nil then translatesource = source end self:updateView("lblSource", "text", "Appareil connecté: " ..translatesource) self:trace("Appareil connecté: " ..translatesource) self:trace("FIN ========================================================") end end end -------------------------------------------------------------------------------------------------------------------------------------- -- REFRESH -------------------------------------------------------------------------------------------------------------------------------------- -- fonction refresh du QA function QuickApp:refresh() if self.isconnected then self:getinfo() end fibaro.setTimeout(self.pollingTime, function() self:refresh() end) -- looping part end -------------------------------------------------------------------------------------------------------------------------------------- -- FIN DU CODE -- -------------------------------------------------------------------------------------------------------------------------------------- QuickApp: QA-DENON.fqa Icônes On & Off:
  23. Moicphil

    Intégration des caméras IP sur HC3

    Salut J'ai essayé d'ajouter une des caméras sur la HC3 mais j'ai pas de flux qui apparaît. Étrange car l'URL donnée par la HC3 avec l'ip et mes crédentials sont OK, j'ai bien la vidéo ! C'est correct chez vous ?
  24. ericl78

    Imperihome

    Bonjour La société qui possède imperihome "Ziblue" est en faillite ! Aujourd'hui, avec ma HC2, j'utilise à fond ce produit pour contrôler ma domotique; Avez vous des infos si tout de même Imperihome va être mis à jour ou pas ? J'ai envoyer un email en posant la question à l'éditeur, si j'ai des news, je posterai. J'ai essayé tout de même dans le cas ou, mais rien à faire, Imperihome ne se connecte pas à nos HC3 A plus
  25. idomotique

    Les tableaux en LUA

    Bonjour, Après m'être cassé la tête pendant plusieurs jours pour arriver à formater des tableaux sur HC3 dans la zone de debug voici la solution: 1. Création du Tableau local TabToPrint = {} -- Création du tableau vide 2. Création de la ligne de titre Je ne vais pas vous faire un cours HTML mais sachez que le secret sur la HC3 (ne le dites à personne hein ) c'est que le HTML5 n'est pas supporté. Il faut donc utiliser les balises HTML4. Donc nous commençons par créer une ligne de titre avec la balise "<table>" qui ouvre le tableau, la balise "<tr>" qui crée une nouvelle ligne et la balise "<th>" qui ouvre un nouvel élément titre. Bien entendu sans oublier de refermer chaque balise sauf la balise "<table>" que l'on fermera à la fin du tableau. Cette ligne est affectée à la première ligne du tableau avec "TabToPrint[1] = " TabToPrint[1] = "<table><tr><th>Description</th><th>Valeur</th></tr>"; on voit dans cet exemple que j'ai crée 2 colonnes "Description" et "Valeur" 3.Création des éléments du tableau Nous utilisons basiquement la même commande que pour la ligne de titre au détail prêt que nous remplaçons la balise "<th>" par la balise "<td>" pour un élément de tableau. Pour être honnête cela ne change pas grand chose mais c'est plus propre et cela vous aidera à vous y retrouver dans votre code. TabToPrint[#TabToPrint+1] = "<tr><td>Current firmware version</td><td>" data.version "</td></tr>"; Vous remarquerez le début de la ligne "TabToPrint[#TabToPrint+1]" cela permet de récupérer la dernière ligne du tableau et de rajouter notre ligne à sa suite. Vous pouvez aussi utiliser "TabToPrint[2]" et incrémenter manuellement mais vous avez de bonnes chances de faire une erreur et d'écraser des lignes. Il est également possible d'intégrer des variables comme éléments du tableau comme dans cet exemple le "data.version"qui est une variable locale. 4. Impression du tableau Lorsque vous avez crée tous vos éléments vous pouvez imprimer le tableau dans l'interface de debug avec la commande suivante. fibaro.trace("Scene145", table.concat(TabToPrint) .. "</table>") l'élément "table.concat() " permet de concaténer tous les éléments de votre tableau et comme expliqué au début il faut également fermer votre tableau avec la balise "</table>" voila vous obtenez un premier tableau Bon c'est pas bien joli pour le moment alors mettons y un peu les formes.... 5. formater le tableau Pour formater notre tableau nous allons utiliser des attributs tels que "bgcolor = "green"". Oui mais alors la c'est un peu délicat vu que l'on doit utiliser des guillemets pour notre attribut ce qui aura pour conséquence de fermer notre string dans la commande et lua va considérer "green" comme une variable ce qui n'est pas notre but. Pour contourner cela un 2ème petit secret: en LUA il es possible d'utiliser le caractère "\" pour que le caractère qui suit immédiatement ne soit pas interprété par lua. En clair avec la commande "bgcolor = \"green\"" les guillemets qui entourent "green" seront considérés par le compilateur comme du texte. Voici donc quelques exemples de formatage du tableau Appliquer une couleur de fond attribut: bgcolor = \"green\" appliquer sur: table, ligne ou éléments du tableau TabToPrint[1] = "<table bgcolor = \"green\"><tr><th>Description</th><th>Valeur</th></tr>"; résultat: Ajout de bordures attribut: border = \"1\" appliquer sur: table TabToPrint[1] = "<table bgcolor = \"green\" border = \"1\"><tr><th>Description</th><th>Valeur</th></tr>"; résultat: Changer la couleur d'un texte: attribut: <font color=red> appliquer sur: texte TabToPrint[1] = "<table bgcolor = \"green\" border = \"1\"><tr><th><font color=red>Description</th><th><font color=red>Valeur</th></tr>"; résultat: vous trouverez d'autres possiblités de formattage avec les balises html ici 5. Exemple Voici un exemple de formatage d'un éléments de réponse d'une requête API sur un interrupteur Dingz: -- configuration des tableaux local styleElement= "<font color=black size=\"3\">" local styleTitre = "<font color= \"#E4022E\" size=\"5\">" local styleTableau ="bgcolor = \"#a6ff19\" border = \"1\" cellpadding = \"5\" width = \"1000\"" -- Ligne de titre TabToPrint[1] = "<table "..styleTableau.."><tr><th>".. styleTitre .. "Description</th><th>".. styleTitre .. "Valeur</th></tr>"; -- Remplissage du tableau TabToPrint[#TabToPrint+1] = "<tr><td>"..styleElement.. "Current firmware version</td><td>"..styleElement.. tostring(data.version) .."</td></tr>"; TabToPrint[#TabToPrint+1] = "<tr><td"..styleElement.. ">MAC address, without any delimiters</td><td>"..styleElement.. tostring(data.mac) .."</td></tr>"; TabToPrint[#TabToPrint+1] = "<tr><td>"..styleElement.. "Device type it always have value 108</td><td>"..styleElement.. tostring(data.type) .."</td></tr>"; TabToPrint[#TabToPrint+1] = "<tr><td>"..styleElement.. "SSID of the currently connected network</td><td>"..styleElement.. tostring(data.ssid) .."</td></tr>"; TabToPrint[#TabToPrint+1] = "<tr><td>"..styleElement.. "Current ip address</td><td>"..styleElement.. tostring(data.ip) .."</td></tr>"; TabToPrint[#TabToPrint+1] = "<tr><td>"..styleElement.. "Mask of the current network</td><td>".. styleElement .. tostring(data.mask) .."</td></tr>"; TabToPrint[#TabToPrint+1] = "<tr><td>"..styleElement.. "Gateway of the current network</td><td>".. styleElement .. tostring(data.gateway) .."</td></tr>"; TabToPrint[#TabToPrint+1] = "<tr><td>"..styleElement.. "DNS of the curent network</td><td>".. styleElement .. tostring(data.dns) .."</td></tr>"; TabToPrint[#TabToPrint+1] = "<tr><td>"..styleElement.. "Wether or not the ip address is static</td><td>"..styleElement.. tostring(data.static) .."</td></tr>"; --impression du tableau fibaro.trace("Scene145", table.concat(TabToPrint) .. "</table>") Vous remarquerez que pour simplifier les choses j'ai crée des variables "style..." avec les attributs. cela permet de rassembler le tout à un endroit et de ne pas avoir a grailler dans vos tableau. résultat: Voila il je ne suis absolument pas un pro du HTML donc si vous avez des remarques ou des conseil pour faire mieux je suis volontiers preneur mais avec ces explications vous avez une base pour faire quelques tableaux. PS: interdiction formelle de se moquer de mon sens artistique
×