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

55 résultats trouvés

  1. GEA Gestionnaire d’Événements Automatique Version 7.37 Voici le célèbre GEA de @Steven porté sur Home Center 3. Cette version de GEA est basée sur la version 6.13, les fonctionnalités sont donc identiques, à quelques différences près documentées plus bas. Ce n'est plus une scène, mais un QuickApp. La notion d'instances multiples des scènes n'a plus lieu d'être, car le QuickApp est mono-instance par nature, mais son principe d'exécution asynchrone du code LUA permet d'obtenir le même résultat, à savoir : - une boucle automatique de détection des événements à intervalle régulier de 30 secondes - un déclenchement instantané sur événement (avec le paramètre -1 pour la durée) Au sujet des événements, il n'y a plus besoin (et de toute façon il n'est pas possible) de définir des triggers pour le déclenchement. C'était une opération fastidieuse, car il fallait saisir manuellement les ID des modules dans l'en-tête de la scène. Cette nouvelle version de GEA détecte donc automatiquement les triggers, et surveille les événements via l'API refreshStates. Actuellement j'ai positionné cet intervalle de surveillance à 100 ms, c'est à dire un dixième de seconde. Ce n'est donc pas de l'instantanéité absolue, mais ça ne l'était de toute façon pas sur les scènes de la HC2, et ça reste inférieur au seuil de perception humain. Pour l'instant cela n'a posé aucun problème de performance lors de mes tests.... on verra ultérieurement s'il y a lieu de faire évoluer cet intervalle. La syntaxe de GEA est strictement identique à celle de la HC2 : GEA.add( ... ) Pour cette raison, ce topic est ouvert uniquement pour les discussions concernant le développement de GEA, les nouvelles fonctionnalités, et les rapports de bugs constatés. Pour les questions sur l'utilisation et la syntaxe de GEA, se reporter au topic unique "Support GEA" où vous trouverez toute l'aide nécessaire : En clair : Une règle GEA fonctionne sur HC2, mais ne fonctionne pas sur HC3 => je viens poster ici pour qu'on puisse corriger le bug Autrement : je supprimerai les messages sans préavis, j'ai autre chose à faire que de déplacer les messages postés sur le mauvais topic... avis aux contrevenants Le topic de référence concernant la syntaxe de GEA se trouve ici, comme d'habitude : Remarque : j'ai mis à jour le fichier de référence GEA_Syntaxe à télécharger en bas de ce message. Changements de GEA pour HC3 par rapport à HC2 Supprimé : "VirtualDevice", "VD" => remplacé par "QuickApp" et "QA" "SetrunConfigScenario" => remplacé par "SetRunModeScenario" et "RunModeScene" "RebootHC2" => remplacé par "RebootHC3" "ShutdownHC2" => remplacé par "ShutdownHC3" "multiAlarm" => remplacé par "Alarm" "setMode" => remplacé par "ThermostatMode" "setThermostatSetpoint" => remplacé par "CoolingThermostatSetpoint" et "HeatingThermostatSetpoint" "ThermostatLevel" "ThermostatTime" "DebugMessage" "PluginScenario" "Popup" Ajouté : "QuickApp" | "QA" : {"QuickApp", <id_module>, <méthode>, [paramètres]} "DeviceIcon" | "CurrentIcon" : {"CurrentIcon", <id_module>, <no_icon>} "Color" | "RGB" : {"Color", <id_module>, <intensité_rouge>, <intensité_vert>, <intensité_bleu>, <intensité_blanc>} "RunModeScene" | "SetRunModeScenario" : {"RunModeScene", <id_scene>} | {"SetRunModeScenario", <id_scene>, <run_valeur>} - <run_valeur> : "manual" | "automatic" "isSceneRunning" | "RunningScene" : {"isSceneRunning", <id_scene>} "ThermostatMode" : {"ThermostatMode", <id_thermostat>, <mode>} "ThermostatFanMode" : {"ThermostatFanMode", <id_thermostat>, <fan>} "CoolingThermostatSetpoint" : {"CoolingThermostatSetpoint", <id_thermostat>, <valeur>} "HeatingThermostatSetpoint" : {"HeatingThermostatSetpoint", <id_thermostat>, <valeur>} "Profile" : {"Profile", <id_profil>} "RebootHC3" : {"RebootHC3"} "SuspendHC3" : {"SuspendHC3"} "ShutdownHC3" : {"ShutdownHC3"} "Parameter" "Climate" "Breached" "VariableQuickApp" | "VariableQA" "CustomEvent" "WOL" "httpGet" "Call" "isEvenDay" Modifié : "Armed", "Disarmed", "setArmed", "setDisarmed" => Prend l'ID de la zone Amélioré : GEA.portables = {123, "Nokia 3310"} : ID du mobile, ou nom du mobile "Email" : ID du mobile, ou nom de l'utilisateur : {"Email", <id_user>, <"Message du mail">, <"Sujet du mail">} | {"Email", <id_user>, <"Message du mail">} "Picture" : ID ou nom de l'utilisateur : {"Picture", <id_camera>, <id_user>} | {"Picture", <id_camera>, <"nom_user">} "VariableCache" : utilisable dans les règles à déclenchement instantané avec -1 (en tant que condition, actions, mais pas comme déclencheur) "Alarm" : remplace "Alarm" et "MultiAlarm" : peut contenir autant d'alarmes que voulu "Ask" : exécute une scène, une méthode d'un QuickApp, ou une action GEA Les zones d'alarme, les profils, et les zones de climat peuvent être identifiés par leur nom Note : les actions "Reboot", "Suspend", et "Shutdown" ne fonctionnent plus depuis le firmware 5.050.13... Installation Importer le fichier fqa ci-joint. Ne modifier que le contenu de config pour vos propres règles : Mise à jour Copier/coller simplement tout le contenu du fichier LUA téléchargé dans le fichier main du QuickApp. Téléchargement Nouvelle installation : GEA_v7.36.fqa Mise à jour : Fichier main : GEA v7.37.lua Fichier tools : Library - tools v2.20.lua Documentation de référence sur la syntaxe : GEA v7.36 Syntaxe.lua
  2. 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 modules fils (voir ci-dessous) un bouton pour créer les module fils (Childs) un bouton pour créer les favoris HTTP qui permettent d'interagir depuis le Doorbird avec le QuickApp 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 (favoris 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 "config" de la Quick App Personnaliser la tables de variables user (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. Cliquer sur le bouton de génération des favoris HTTP. Cette fonction est optionnelle, Elle va potentiellement écraser les favoris que vous auriez déjà créés. Vous pouvez modifier l'indice de départ à partir duquel les favoris seront créés. Voir paramètre "FirstFavoriteID" 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 Doorbird_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. Doorbird_PSW : mot de passe correspondant du compte Doorbird_User. Il convient de supprimer cette variable et la recréer de type Variable secrète HC3_User : utilisateur HC3 habilité à solliciter l'API de la HC3 préalablement créé dans la HC3, par exemple : doorbird. Je conseil de créer un compte dédié pour votre Doorbird. Il conviendra donner l'accès à cet utilisateur aux modules fils (de type détecteurs) pour que les requêtes HTTP exécutées par le Doorbird puissent interagir sur les modules fils. HC3_PSW : mot de passe correspondant du compte HC3_User. Il convient de supprimer cette variable et la recréer de type Variable secrète debug : true/false. Pour activer des traces détaillées FirstFavoriteID : Indice que sera utilisé pour la création des favoris HTTP. Si vous aviez déjà créé des favoris HTTP sur votre applications Doorbird, ils risquent d'être écrasé par la génération automatique. Pour éviter cela, il convient de modifier cet indice avec une valeur plus grande que le nombre de favoris que vous aviez déjà créés précédemment. S'ils ne sont plus utiles, vous pouvez laisser la valeur à zéro. 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 "config" 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. Attention : La suite de la documentation reste à corriger suite à la nouvelle version de la Quick App. En attendant, se référer aux explications présentes dans le fichier Config et Main. 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.23 : du 16/06/22 -> Correction d'un bug qui empêche la création automatique des Devices Si vous disposiez déjà la version V1.21, il convient : de charger le fichier fqa ci-dessous en version V1.23 copier le code contenu dans le module - main de cette nouvelle version et le coller/remplacer votre version actuelle du module main de votre QuickApp copier le code contenu dans le module - main de cette nouvelle version et le coller/remplacer votre version actuelle du module main de votre QuickApp Sauvegarder votre qui QuickApp Supprimer la nouvelle version que V1.23 que vous avez chargée Si c'est votre première installation, il convient de charger le fichier fqa en version V1.23 et suivre les instructions de configuration V1.21 : du 22/11/2021 -> Révision du QuickApp. Nécessite de recharger intégralement le fichier fqa (modification dans les propriétés des Childs) Possibilité d'avoir 2 sonnettes. Notamment pour le DoorBird D2102V qui en possède 2 Corrections de bugs, notamment en mode Debug Attention : la documentation ci-dessus n'est pas encore totalement actualisée. Dans l'immédiat il convient de se fier aux descriptions et explications contenues dans les fichier Main et Config du QuickApp. V1.10 : du 18/11/2021 -> Refonte du QuickApp. Nécessite de recharger intégralement le fichier fqa (trop d'évolutions ont été apportées) Simplification du paramétrage dans une table à compléter dans le fichier config et ajout de nouveaux paramètres Possibilité de générer automatiquement dans le Doorbird les requêtes HTTP (via un bouton prévu à cet effet) qui permettent d'interagir avec le QuickApp Corrections de bugs V1.00 : du 19/12/2020 -> Intialisation du projet Evolutions à venir : Probablement quelques corrections et améliorations du code Fait probablement en partie. Ne pas hésiter à signaler ceux qui restent. Création automatique de labels correspondant aux Badges RFID, Relais et Sonnettes additionnels. Création automatique des planning associés aux favoris HTTP. A étudier si vraiment nécessaire, c'est très rapide de le faire manuellement dans l'application Doorbird A voir selon vos suggestions Dernière version du VD : Code du module main du QuickApp : Quick App : Doorbird_Manager V1.23.fqa Icônes : Dernière version de la documentation de l'API : LAN-2-LAN API FOR DOORBIRD AND BIRDGUARD
  3. DomoCharts Version 7.11 Sommaire : 1. Présentation 2. Pré-requis 3. Installation 3.1 Synology 3.2 Pages Web 3.3 Plages horaires d'énergie électrique 3.4 Base de données MySQL/MariaDB 3.5 QuickApp 4. Mise à jour  5. Utilisation 6. Changelog 7. Téléchargement 1. Présentation Voici DomoCharts pour HC3, qui succède à DomoCharts sur HC2 introduit ici : Les fonctionnalités sont plus ou moins les mêmes, c'est à dire l'affichage de graphiques en plein écran sur une page Web hébergée sur un NAS, serveur Web en ligne, bref n'importe quel serveur Web faisant tourner le langage PHP et stockant les mesures dans une base de données MySQL/MariaDB. Le module virtuel récoltant les mesures sur la HC2 a été entièrement réécrit en QuickApp pour la HC3. Liste des capteurs supportés : Température (en °C) Humidité (en %HR) Luminosité (en lux) Pluie (en mm) Vent (en km/h) Eau (en litre) Gaz (en ppm) Son (en dB) Pression (en millibar) Particules (en μg/m3) Tension (en Volt) Courant (en Ampère) Puissance (en Watt) Energie (en kWh) Remarque : les modules cachés (hidden), morts (dead), ou désactivés (disabled) sont ignorés. DomoCharts se compose des éléments suivants : Un QuickApp à installer sur la box domotique HC3 qui collecte les données Un package ZIP (contenant des fichiers HTML, PHP, JavaScript, ...) à déployer sur un serveur Web Une base de données MySQL/MariaDB permettant de stocker les données, installé avec le serveur Web A noter que cette version de DomoCharts crée de nouvelles tables dans la base de données SQL, donc les données éventuellement existantes ne sont ni reprises ni supprimées. Je proposerai plus tard des requêtes SQL permettant de récupérer manuellement les données. Je n'ai pas voulu automatiser le processus car c'est un peu complexe, avec les ID qui changent, etc... je pense qu'il sera préférable de le faire à la main au cas par cas. 2. Pré-requis Un serveur Web supportant PHP (NAS Synology, hébergement mutualisé, ...) Un serveur hébergeant une base de données MySQL/MariaDB (Idem) Une Fibaro Home Center 3 / Home Center 3 Lite 3. Installation  3.1 Synology Etapes facultatives pour les utilisateurs débutants d'un NAS Synology avec DSM. Ces étapes doivent être effectuées à l'aide du compte admin via l'interface Web (accessible par défaut sur le port 5000). 3.1.1 Installation de WebStation Dans le Centre de paquets, rechercher et installer WebStation si ce n'est pas déjà fait : 3.1.2 Installation de PHP Dans le Centre de paquets, rechercher et installer la dernière version de PHP disponible (7.3 dans mon exemple) : 3.1.3 Installation de MariaDB (MySQL) Dans le Centre de paquets, rechercher et installer MariaDB : Dès que l'installation est terminée, cliquer sur l’icône de MariaDB afin d'accéder à l'écran de configuration, puis cliquer sur le bouton Changer le mot de passe : Noter également le numéro du port, DSM semble forcer le numéro 3307 depuis MariaDB 10. De plus, cocher la case "Activer la connexion TCP/IP". Par défaut, le mot de passe MariaDB est vide, cliquer alors sur le bouton Réinitialiser le mot de passe MariaDB : Confirmer en cliquant sur le bouton Oui : Le seul compte existant est root, il faut donc créer un mot de passe (note : ce compte root est différent du compte root du Syno, il est donc tout à fait possible d'avoir des mots de passes différents) : 3.1.4 Configuration de WebStation Dans le menu principal de DSM, ouvrir WebStation, la dernière version de PHP doit apparait installée en bas de la liste : Aller dans Paramètres généraux, et s'assurer que le profil PHP correspondant à la dernière version est sélectionné dans la liste déroulante : Aller dans les Paramètres PHP, sélectionner le profil correspondant à votre version de PHP, et cliquer sur le bouton Modifier : Il faut au minimum que l'extension pdo_mysql soit cochée : Le Syno est prêt. 3.2 Pages Web  Transférer toute l'arborescence contenue dans le fichier ZIP vers le répertoire /domocharts sur le serveur Web via FTP ou montage réseau. Ensuite, éditer le fichier config.inc.php afin d'y modifier les paramètres de connexion à la base de données MySQL : // MySQL Server hostname or IP address $server = 'server'; // MySQL User account $login = 'login'; // MySQL User password $password = 'password'; // MySQL Database name $database = 'database'; Note : si vous utilisez le mini-tuto Synology ci-dessus, les paramètres devraient ressemble à quelques chose comme cela (seul le mot de passe doit être personnalisé) : // MySQL Server hostname or IP address $server = '127.0.0.1:3307'; // MySQL User account $login = 'root'; // MySQL User password $password = 'MonSuperPassword'; // MySQL Database name $database = 'domotique'; Note : Pour des raisons de sécurité, si vous maitrisez MySQL et phpMyAdmin, vous devez créer un utilisateur dédié (différent de root). Je ne détaille pas cette procédure qui est hors du cadre de ce tutoriel. 3.3 Plages horaires d'énergie électrique  Dans le fichier config.inc.php, une rubrique concerne la configuration des horaires de l'abonnement au fournisseur d'électricité (imposés par le distributeur Enedis). La variable $TimeSource doit avoir la valeur 'STATIC' : //*** Teleinfo time for energy // // Variable = 'Value' // Comment : Allowed values // -------- ------- // ------------------------------------------ : --------------- $TimeSource = 'STATIC'; // Source of information for date and time : TELEINFO|STATIC // ---------------------------- // Valid only if TELEINFO TimeSource is used : --------------- $teleinfoTable = 'teleinfo'; // MySQL table name : xxxxxxxx $teleinfoDelay = 60; // Teleinfo Delay in Seconds : ss // ---------------------------- // Valid only if STATIC TimeSource is used : --------------- $TimeHCHP = array( // HC/HP start times for each EDF rate : 'hh:mm' => '<BASE|HC|HP>' '00:00' => 'HC', '06:30' => 'HP', '22:30' => 'HC' ); Sont actuellement supportés les abonnements de type Normal ('BASE'), et Heures Pleines/Heures Creuses ('HP' et 'HC'). Dans l'exemple du dessus, j'ai configuré les horaires HP de 6:30 à 22:30, et des horaires HC de 22:30 à 6:30. Notez que la variable $TimeHCHP doit obligatoirement commencer à 00:00. Vous pouvez ensuite ajouter autant de tranches horaires que nécessaires, car certains abonnements proposent 2 tranches HC réparties dans la journée. Si vous avez un abonnement Normal, c'est plus simple, puisqu'il suffit d'indiquer 'BASE' à partir de 00:00 : $TimeHCHP = array( '00:00' => 'BASE' ); Avec ces informations, le bouton Energy du module virtuel sera ensuite capable d'interroger l'API de la HC3 afin de récupérer les consommations des différentes équipements pour chaque tranche horaire de chaque journée. A l'heure actuelle, le graphique d'énergie électrique affiche la somme des kWh pour chaque journée, mais les informations nécessaires sont stockées dès aujourd'hui dans la base de données afin d'effectuer les calculs de coà»ts financiers ultérieurement. 3.4 Base de données SQL Afin de créer ou migrer les tables dans la base de données MySQL/MariaDB, il faut appeler la page /domocharts/install.php sur le serveur Web. Si tout se passe bien, la page affiche une longue liste de création de tables avec le statut OK, puis le message "Finished with success" : Sinon, vous pouvez demander du support sur le forum, en copiant/collant le texte des messages d'erreurs. 3.3 QuickApp pour HC3 Ce QuickApp est responsable de l'envoi des données vers la base de données SQL au travers de pages Web dédiées à l'insertion des données. Dans la HC3, aller dans Paramètres, puis Dispositifs, puis cliquer sur le bouton "+", choisir "Autre appareil", et enfin "Téléverser un fichier". Sélectionner aller le fichier DomoCharts_v7.0.fqa. Dans les Variables du QuickApp, il est possible de configurer les options suivantes : NAS_Protocol : protocole à utiliser, normalement : http NAS_Address : adresse IP du NAS, par exemple : 192.168.1.1 NAS_Port : port de communication, normalement : 80 (ne rien mettre) NAS_User : utilisateur optionnel, sinon ne rien mettre NAS_Password : mot de passe optionnel, sinon ne rien mettre NAS_Path : si vous avez suivi le tuto, c'est "/domocharts", mais vous pouvez changer le chemin Refresh : intervalle de rafraichissement des informations, par défaut 60 secondes Memory : nombre de mesures à conserver en mémoire en cas d'indisponibilité temporaire du NAS. J'ai testé jusqu'à 10000 sans aucun souci sur HC3. Si le QuickApp releve 100 mesures chaque minutes, dans ce cas cela fait une mémoire de 100 minutes, soit 1h40. Battery_Hour : heure à laquelle sont relevées les niveaux de batteries des modules, par exemple chaque soir à 23h debug : affiche plein d'informations dans la zone de debug du QuickApp, utile seulement pour demander de l'aide, valeur par défaut false. L'icône du QuickApp DomoCharts apparait dans l'interface, on peut la cacher si elle gêne : La zone de logs doit ressembler à ceci si la collecte des mesures et l'insertion en base de données se passent bien : 4. Mise à jour Rien pour le moment. 5. Utilisation Pour visualiser les graphes, il suffit d'aller chercher avec son navigateur l'adresse du serveur Web avec le chemin "/domocharts", par exemple : http://192.168.1.1/domocharts/ Pour l'administration, aller sur la page admin.php : http://192.168.1.1/domocharts/admin.php Cette page permet d'ordonner les modules, de donner une couleur à chaque courbe, et d'en cacher certains : Si une valeur aberrante apparait sur un graph, il zoomer suffisamment dans la zone temporelle, puis cliquer sur le point. Dans le popup qui apparait, un bouton Delete permet de supprimer la valeur, afin de conserver une courbe homogène :  6. Changelog : v7.00 : Février 2021 Version initiale  v7.01 : Mars 2021 Correction des consommations d'énergies électriques quotidiennes qui ne sont pas générées dans certain cas v7.11 : Janvier 2022 Correctifs et améliorations diverses 7. Téléchargement Package pour le NAS : domocharts_v7.0.zip QuickApp : DomoCharts_v7.11.fqa Icône : Mise à jour du QuickApp existant (contenu à copier/coller par dessus le fichier original ) : Fichier main : DomoCharts v7.11.lua Fichier DomoCharts : Library - DomoCharts v7.10.lua Fichier tools : Library - tools v2.20.lua
  4. 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", })
  5. Felig

    QuickApp pour les Nuls

    Pour ceux qui connaissent HC2 mais débutent en HC3, voici des réponses aux principales questions que je me suis posées ces derniers jours. Rien de nouveau, tout est sur le forum (et en plusieurs exemplaires !) mais l'idée est de faire un post avec les principes de base et questions fréquentes (actualisé si besoin en fonction de vos commentaires/corrections), pour les débutants en HC3 qui comme moi sont très mauvais avec les moteurs de recherche. Sources et liens essentiels: ils sont indiqués par @Lazer ici. Un grand merci à lui, beaucoup de mes apprentissages viennent de ses posts. Qu'est-ce qu'un QuickApp (QA) ? Un QA est 3 composants en 1 : Un script LUA, qui peut être organisé en plusieurs fichiers: par exemple un fichier pour votre programme principal ("main"), un fichier pour une librairie de tools, un fichier pour la config utilisateur, etc. Pour utiliser une fonction du fichier tools, il suffit de l'appeler par son nom dans l'onglet principal. Pour créer un nouveau fichier, cliquer sur l’icône Files dans la marge à gauche de l'interface UI. Un module virtuel (device). Contrairement aux VD de HC2, le module virtuel d'un QA simule un module physique (interrupteur, détecteur, sonde, etc.). C'est pour ça que chaque fois qu'on crée un QA il faut choisir le type de device associé. En fonction du type, vous aurez des propriétés ("lastBreached" pour un détecteur par exemple), des icônes, et une interface utilisateur spécifiques équivalentes à ce que vous auriez pour un QA physique du même type. L'idée est que ce module virtuel soit piloté par la HC3 de la même manière que s’il était réel, via des appels fibaro.get(), fibaro.getValue(), fibaro.call() et même via l’API. Le grand avantage est que vous pouvez personnaliser et modifier son « micro-programme » et son interface (UI), ce qui n'est pas possible pour un module réel. La liste des types disponibles et propriétés associées est ici (fichier excel à la fin du post). C'est aussi si besoin une interface (UI) avec des labels, boutons, sliders, comme un VD de HC2. Attention, l'interface par défaut dépend du type de device que vous sélectionnez à la création du QA (cf. ci-dessus). Chaque composant est optionnel. Comme illustré ici il est possible d'avoir des modules QA qui fonctionnent sans une ligne de code (pilotés par des calls externes). Et inversement, si vous n'avez pas besoin de module virtuel, vous pouvez sélectionner l'option "Appareil désactivé" ("Device disabled") dans l'onglet "Avancé" du QA : le QA ne pourra plus être appelé par des calls fibaro, mais le programme LUA fonctionnera normalement et l'interface UI aussi (par contre j'ai l'impression que ça fait disparaitre le QA de l'interface mobile, donc pas forcément une bonne idée...). Comment fonctionnent les variables persistantes dans un QA ? Dans HC2, si on veut une variable persistante, on a le choix entre un label de VD ou une variable globale. Les variables globales existent toujours dans la HC3, elles sont gérées par les fonctions fibaro.getGlobalVariable(var) et fibaro.setGlobalVariable(var, value). Par contre les labels de QA ne sont plus persistants (réinitialisés à chaque démarrage du QA), et leur contenu n'est pas facile à lire (pas de fonction fibaro, il faut passer par le JSON du QA). Mais heureusement ils sont remplacés par les "variables QA" (« quickVars ») : des variables persistantes, mais internes au QA. Ces variables sont gérées par les fonctions QuickApp:getVariable(var) et QuickApp:setVariable(var, value). A noter : Si la "quickVar" n'existe pas, QuickApp:getVariable() renverra une valeur "" et non nil. Il y aura juste un warning dans le log du QA si la variable n'existe pas. Si vous utilisez QuickApp:setVariable() sur une quickVar qui n'existe pas, elle sera créée. Les quickVars peuvent aussi être créées, modifiées ou supprimées dans les paramètres du QA (onglet Variables). MAIS : toute valeur saisie manuellement dans l’interface Web sera convertie en format string (« 99 » au lieu de 99). Pour utiliser un autre format (numérique ou table), il faut utiliser QuickApp:setVariable(). Il est possible de récupérer le contenu des quickVars d'autres QA par des fonctions détournées (mais ce n'était pas l'intention des développeurs). Les variables globales HC3 peuvent être gérées dans l'onglet Variables du menu Réglages/Général (basique, mais j'ai mis du temps à le trouver!). Comment fonctionnent les fonctions dans un QA ? Compte tenu de ce qui précède, ça ne devrait pas vous étonner qu’on ait deux types de fonction : les fonctions normales de n’importe quel code LUA (function test(x) return x+x end) et les fonctions QuickApp qui sont ajoutées au code du module virtuel (son « micro-programme » pour reprendre mon image initiale). L’intérêt principal des fonctions QuickApp est qu’elles sont appelables par d’autres QA. L’autre intérêt est que chaque QA vient avec des fonctions déjà existantes qui sont bien utiles (ex : QuickApp:debug(), QuickApp:getVariable(), etc.). La fonction de gestion de l’interface UI notamment est une fonction QuickApp. Le QA simule une logique de langage orienté objet. Pour faire un parallèle avec Python (le seul langage orienté objet que je pratique un peu), QuickApp est une classe qui contient des fonctions (ou méthodes) mais aussi des variables (QuickApp.id est l'id du QA par exemple). Au sein d'une fonction QuickApp les autres fonctions et variables du QA peuvent être appelées par self:fonction() ou self.variable. L’appel d'une fonction d’un autre QA se fait via fibaro.call(id, "maFonction", arg1, arg2, etc.). L'inconvénient de cette méthode est qu'il n'y a pas de retour (pas de confirmation de succès, ni possibilité de renvoyer une variable au QA d'origine). Là aussi, il est possible de régler le problème par des contournements, comme expliqué ici. Comment est structuré le code LUA d’un QA ? La structure normale du code LUA d’un QuickApp est comme suit : Le code est exécuté une première fois de haut en bas. C'est l'occasion de déclarer les variables et fonctions. Ensuite, le QA lance la fonction QuickApp:onInit() si elle existe. C'est dans cette fonction que votre code doit commencer normalement. Voici un exemple (fonctionne avec un QA de type "multilevel sensor", qui accepte des valeurs numériques pour sa propriété "value"): function QuickApp:turnOn() -- appelable par fibaro.call(id, "turnOn") self:updateProperty("value", "99") afficheValeur(self) end function QuickApp:turnOff() -- appelable par fibaro.call(id, "turnOff") self:updateProperty("value", "0") afficheValeur(self) end function afficheValeur(self) self:debug("Valeur du module "..self.id.." : "..self.properties.value) end function QuickApp:onInit() self:debug("onInit - Démarrage du module "..self.id) --afficheValeur(self) setTimeout(function() afficheValeur(self) end, 0) end Contrairement au code des VD HC2, le code des QA ne s’exécute qu’une seule fois. Si vous souhaitez une boucle, il faut créer une fonction mainLoop() appelée via une fonction setInterval(). Tout est expliqué ici. Pourquoi on voit souvent l'instruction setTimeout(function() maFonction(self) end, 0) à la fin de la fonction QuickApp:onInit() ? C’est expliqué ici. En résumé, ça permet d’avoir accès à une variable LUA globale « quickApp » qui contient toutes les propriétés et méthodes de la classe QuickApp (instanciation), mais qui ne s’initialise que si la fonction QuickApp:onInit() est terminée. Même si on n'utilise pas cette variable, c'est une bonne habitude de laisser la fonction QuickApp:onInit() se terminer avant de lancer la fonction suivante.
  6. Xiaomi Roborock Vacuum Version 2.10 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 Déplace le robot à une position spécifiée Lance le nettoyage d'une zone spécifiée Lance le nettoyage d'une ou plusieurs pièce(s) spécifiée(s) 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 Remarque : malheureusement ce QuickApp n'est pas compatible avec la box Home Center Lite, qui ne dispose pas du CPU suffisant pour effectuer les calculs du chiffrement nécessaire au protocole de communication avec l'aspirateur. 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 RefreshON : intervalle de rafraichissement des informations en secondes lorsque l'aspirateur est en fonctionnement, par exemple : 10 RefreshOFF : intervalle de rafraichissement des informations en secondes lorsque l'aspirateur est à l'arrêt, par exemple : 60 Remarque : il n'est pas forcément judicieux de baisser les valeurs de rafraichissement, 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") -- Emmet un message vocal permettant de retrouver 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 fibaro.call(123, "goTo", {x, y}) -- Déplace le robot aux coordonnées X et Y spécifiées en mm, sachant que {25000, 25000} correspond à l'emplacement de la base. Exemple : {27000, 22500} fibaro.call(123, "cleanZone", {x1, y1, x2, y2}) -- Lance le nettoyage de la zone spécifiée par ses coordonnées. Voir le tuto de @ADN182 pour utiliser la feuille de calcul Excel permettant de retrovuer les valeurs à utiliser. fibaro.call(123, "cleanRoom", 16) -- Si l'aspirateur le supporte, lance le nettoyage de la pièce spécifiée par son numéro (à partir de 16, voir la liste des pièces détectées dans le log au lancement du QuickApp). On peut aussi spécifier plusieurs numéros de pièces dans une table. 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"}) Optionnellement : gestion des pièces prédéfinies : Si votre modèle de robot aspirateur le supporte, les pièces configurées dans l'application mobile Xiaomi seront automatiquement détectées et affichées dans le journal de log au démarrage du QuickApp. Cependant, seuls les ID sont récupérables, le nom des pièces ne peut pas être obtenu. Il faudra donc procéder par essais successifs pour identifier les ID avec les pièces réelles de votre logement. Ces ID peuvent ensuite être utilisées avec la fonction cleanRoom(), comme décrit dans le paragraphe précédent. Optionnellement : créer un bouton personnalisé : Comme expliqué précédemment, toutes les fonctions peuvent être appelées depuis un autre QuickApp ou Scène dansa la HC3. En ce qui concerne les fonctions goTo(), cleanZone(), et cleanRoom(), elles nécessitent un paramètre pour spécifier les coordonnées précises. Ces coordonnées dépendent du lieu d'installation de chaque aspirateur. Par conséquent des boutons permettant d'appeler ces 3 fonctions n'existent pas par défaut. Noter qu'il est bien entendu possible d'appeler les 3 fonctions depuis un autre QuickApp ou Scène sans avoir besoin de créer ces boutons. Il est possible de créer ses propres boutons dans le QuickApp lui-même, si vous le souhaitez. Dans le mode d'édition du QuickApp, ouvrir le fichier custom, puis créer un nouveau bouton, lui donner un texte, et un nom qui doit correspondre au nom de la fonction dans le fichier custom, et spécifier vos propres coordonnées (utiliser le fichier Excel partagé par @ADN182) Changelog : v2.00 : Avril 2021 Version initiale v2.01 : Avril 2021 Ajout du support des modèles plus anciens v2.10 : Janvier 2022 Ajout de la fonction goTo() permettant de positionner le robot à la position désirée spécifiée par ses coordonnées Ajout de la fonction cleanZone() permettant de lancer le nettoyage d'une zone spécifiée par ses coordonnées Ajout de la fonction cleanRoom() permettant de lancer le nettoyage d'une pièce préconfigurée dans l'application mobile (pour les modèles d'aspirateur supportant cette fonctionnalité. Voir les journaux de log pour voir les pièces découvertes) Intervalle de rafraichissement variable en fonction de l'activité du robot Amélioration de la gestion du nœud mort en cas de problème de communication réseau, et gestion du réveil forcé Le statut en cours du robot est affiché dans la propriété log, donc également affiché sous l'icône du module Un message d'avertissement est affiché si le modèle d'aspirateur n'est pas supporté Améliorations et correctifs divers Téléchargement : Nouvelle installation : Xiaomi_Roborock_Vaccum_v2.10.fqa Mise à jour : Fichier main : Xiaomi Roborock Vacuum v2.10 - Main.lua Fichier Xiaomi : Library - Xiaomi v1.10.lua Fichier tools : Library - tools v2.20.lua
  7. Poulailler 2.0 et FBGS-222 Mon fils de 8 ans voulait un poulailler pour ramasser ses œufs, mais il voulait aussi avoir des poussins, bref faire toute la chaine de l'œuf à la poule. Au moment où j'écrit ces lignes les œufs sont dans la couveuse. Etant bricoleur j'ai pris pour but de faire un poulailler sans dépenser des milles et des cents, mais mon coté geek est aussi ressortit et j'ai décidé d'avoir une porte automatique. Hors de question d'acheter un portier sur internet, ayant une HC3 je me suis dis que je pourrai piloter ma porte avec un smart Implant. Fabrication du poulailler J'avais récupéré des palettes et avec un outils de ma conception j'ai récupéré les lattes. Une scie, une visseuse et quelques vis et hop la structure est faite. 4 Pour le toit, j'ai opté pour des anciennes ardoises que mon voisin m'a donné. Un coup de lasure et ca fait propre ! Motorisation de la porte: Dans un 1er temps j'ai réaliser le fonctionnement de la porte en mode "manu", c'est à dire 2 boutons, j'appui sur l'un ca monte, je le relâche ca s'arrête et pareil dans l'autre sens. J'y ai rajouter quelques sécurité... hé oui c'est pour les enfants, dans le cas où l'idée leurs venaient de voir si on peut monter la porte plus haut que la toiture, j'ai équipé cette dernière de fin de course haut et bas. J'ai aussi prévu le cas où ils essayeraient d'appuyé sur les 2 boutons en même temps ! Pas con ces gamins ! Afin de pas trop compliquer le câblage je n'ai pas mis d'auto-maintiens sur l'ordre de montée ou descente. Pour réaliser la porte j'ai utilisé 2 chutes de profilé alu pour réaliser les glissières et une tôle comme porte. Pour la mécanique j'ai acheter un petit moteur 24Vcc équipé d'un réducteur pour servir de treuil. Vitesse du treuil 40tr/min. J'ai calculé cette vitesse en fonction du tambour de mon treuil et du temps désiré pour ouvrir ma porte (une 10aine de secondes). Je ne suis pas encore pleinement satisfait du "câble" qui s'enroule autour de mon tambour. J'ai utilisé de la ficelle à rôti ... ( je fais une mise en service industriel avec, il me reste encore 15jours avant éclosion, la porte s'ouvre et se ferme tout les jours à voir combien cela va résister), du câble de frein de vélo étant trop rigide et n'ayant rien d'autre sous la main au moment du montage ... je mettrai peut être du gros fils de pêche. Mais la ficelle à rôti se love très bien sur mon tambour. Pour la partie automatisation de la porte, je me suis dit que j'allais "implanter" mon Smart Implant FBGS-222 dans mon câblage. Ce module a été crée pour ca, pour se greffer sur nos appareils du quotidien. Les 2 sorties logiques commanderons la montée et la descente de la porte. Les 2 entrées logiques me permettrons de surveiller l'état de la porte: fermée ou ouverte. Ce module pouvant recevoir des sondes de température, autant l'utiliser, y ai donc rajouter une sonde DS18B20 pour voir si mes poules ne se les cailles pas trop en hiver ! (Jdm pourri !) Lors de la conception du schéma électrique, j'ai choisi de relayer la partie puissance du moteur pour ne pas faire passer l'intensité du moteur par les contacts du FBGS, même si ces derniers auraient surement pu prendre la charge. Mais ne connaissant pas l'intensité utilisé par le moteur en charge, j'ai pas pris de risque. Le relayage est réalisé par des relais de Type RHN412B de chez Schneider que j'ai récupéré au taff. On aurait pu aussi utiliser des relais de chez Finder qui sont moins nettement moins onéreux. Pour l'intégration du Smart Implant les fils sont petits, je les ai donc soudé sur une carte de prototypage PCB afin de pourvoir faire le lien avec les fils de mon circuit qui sont beaucoup plus gros. Comme j'avais un peu de place sur cette petite carte j'y ai fixé le Smart Implant dessus avec du scotch double face. J'ai intégré tout le système dans une grande boite étanche que j'ai équipé de presse-étoupes pour faire passer les câbles. Ci-dessous le schéma électrique de l'ensemble. A noter que les fin de courses de la porte sont volontairement positionnés en aval des bobines des relais sur la partie -24Vcc. Mes fin de courses ont 3 broches une pour le contact NO, une pour le NC et une pour le commun, les entrées logiques du Smart Implant monte sur une polarité négative, il fallait donc que mes fins de courses puissent me remonter un moins ! Paramétrage du module FBGS-222 et difficultés rencontrés (sur HC3): J'ai pas mal bataillé car certaines options ne sont pas forcément très explicite et disponible que si d'autres paramètres sont dans un état et certaines infos remonte que si et lorsque .... bref je vais m'expliquer ! 1- Les entrées sont connectées aux sorties En effet de basse lorsque l'entrée n°1 est monté cela à pour effet de monter le relais de sortie n°1. Dans les options du dispositif de configuration lorsque l'on veux les dissociés nous aurions simplement à activé cet option, mais malheureusement le système rejette le paramètre. Sur la vue ci-dessous les options sont activé. Mais pour cela il faut modifié les paramètres de sécurité des sorties. Dans l'onglet "avancé" des options des "Relais ON/OFF", il faut paramétrer correctement la protection d'accès. ces options ne sont pas disponibles dans le listing "Paramètres". Dans mon cas j'ai activé la protection "locale" afin que les entrées du module ne commande pas mes sorties. A contrario je n'ai pas activé la protection à distance afin que mes sortie soit commandable via le réseau Z-wave. Il faut paramétrer chaque relais. 2- Faire fonctionner sa sonde DS18B20 Avant d'intégrer mon module à mon poulailler j'ai effectué mes tests de fonctionnement sur mon PC avec le module et une batterie. J'ai galéré pour faire remonter la température de ma sonde. J'avais soudé les fils comme il faut mais la 2ème température de mon implant été identique à la température interne ... après pas mal de recherche et d'essai mon erreur a été de connecter ma sonde alors que j'avais déjà inclus mon module. J'ai donc exclu le module en lançant via l'interface de ma HC3 la procédure d'exclusion et en appuyant 3 fois sur le bouton de mon implant. J'ai relancé l'inclusion de module et la miracle la température était correcte ! Automatisation de l'ouverture et fermeture de la porte: Ne sachant (pas encore) programmer en LUA, j'ai crée 2 scénarios un pour l'ouverture et un pour la fermeture en bloc. Les retours de positions de la porte me servent à conditionner l'envoie des ordres. En effet si la porte est déjà fermé pas la peine d'envoyé l'ordre. Pour l'arrêt de la commande j'ai paramétré les relais en "Auto-Off" => parm. 156 et 157 à 14sec. chacun sachant que mon moteur se sera déjà arrêté lorsque la porte sera sur le fin de course. Mes scénarios sont en V1, en effet pour le moment je reçois une notification comme quoi l'ordre d'ouverture ou de fermeture est envoyé, il serait plus judicieux d'avoir une alerte si après la tombé de la nuit la porte est tjrs ouverte. Choix technique, tarifs... Pourquoi avoir choisi de travailler en 24Vcc: Un jour j'avais acheté une batterie sur Aliexpress pour une petite moto trial électrique, c'était pas cher mais ca n'a pas fait l'affaire pas assez d'autonomie, donc pour ne pas la laisser prendre la poussière dans le garage je l'ai mise dans le poulailler ! Moteur 24 Vcc: J'ai choisi ce moteur pour son prix, 25€ sur amazon. J'avais aussi vu des actionneurs linaires, cela m'aurai évité de faire le système avec la ficelle mais le prix n'était pas le même environ 50-60€ avec une force qui ne m'était pas utile. Fin de courses et relais: Matériel de récupération donc autant s'en servir, pour les fins de course il fallait voir comment et où les fixer sur le poulailler pour que cela fasse pas trop moche. Plaque de prototypage PCB: 16€ le lot de 10 plaques, j'aurai de quoi faire pleins de bricolage. FBGS-222: Pasque Fibaro c'est quand même pas mal ! Environ 30€ chez n'importe quel boutique en ligne. Voila Voilou le Poulailler 2.0 en détail ! Il n'attend plus que ses hôtes et nous leurs œufs.
  8. QuickApp Yamaha MusicCast Version 2.00 Présentation :  Ce QuickApp permet de piloter les enceintes et amplificateurs connectés Yamaha MusicCast depuis la box Fibaro Home Center 3.  Les fonctionnalités suivantes sont disponibles : PowerON / PowerOFF Lecture, Pause, Stop Précédent, Suivant Slider de réglage du volume Baisser ou monter le volume d'un cran Silencieux Choix de la source Si l'ampli le permet : choix du DSP et du volume des dialogues Un retour d'état est rafraichit à intervalle régulier (paramétrable), indiquant les informations suivantes : Statut de l'alimentation Statut du lecteur (playing, paused, stopped) Source de la musique Artiste/Album/Titre du média en cours de lecture Niveau du volume via le slider Remarques : Le QuickApp est multi-langue, c'est à dire que son affichage (labels) 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). Le module est de type Lecteur "com.fibaro.player". Il n'y a pas d'utilisation de modules enfants. Par conséquent, si vous avez plusieurs appareils MusicCast, il faut importer autant de QuickApps que nécessaire, chacun gérant un seul appareil. Le QuickApp détecte automatiquement les Sources et crée les boutons correspondants lors de la première connexion à l'appareil. Il est possible de suppimer les boutons inutiles pour alléger l'affichage. Ce QuickApp fait suite au Module Virtuel initialement développé pour HC2 : 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 : Protocol : protocole à utiliser, normalement : http Address : adresse IP de l'appareil, par exemple : 192.168.1.1 Port : port de communication, normalement : 80 Zone : si l'ampli home-cinéma est configuré et câblé pour gérer des zones supplémentaires : main, zone2, zone3, zone4 RefreshON : intervalle de rafraichissement des informations en secondes, quand l'ampli est allumé RefreshOFF : intervalle de rafraichissement des informations en secondes, quand l'ampli est éteint Note : l'intervalle de raffraichissement variable permet de conserver une bonne réactivité de mise à jour lorsque l'appareil est en fonctionnement, sans pour autant surcharger inutilement de requête réseau le reste du temps. Utilisation : Depuis l'interface Web ou l'application mobile : Un clic sur les boutons permet de piloter l'appareil Glisser le slider permet de régler le volume sonore 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") -- Power ON fibaro.call(123, "turnOff") -- Power OFF fibaro.call(123, "play") -- Lecture fibaro.call(123, "pause") -- Pause fibaro.call(123, "stop") -- Stop fibaro.call(123, "prev") -- Précédent fibaro.call(123, "next") -- Suivant fibaro.call(123, "setVolume", 100) -- Règle le volume audio au niveau spécifié (en pourcents : 0 à 100) fibaro.call(123, "setVolume", "up") -- Diminue le volume audio d'un pourcent fibaro.call(123, "setVolume", "down") -- Augmente le volume audio d'un pourcent fibaro.call(123, "setMute", true) -- Audio en sourdine fibaro.call(123, "setMute", false) -- Audio normal fibaro.call(123, "setInput", "bluetooth") -- Sélectionne une source (et allume automatiquement l'appareil si celui-ci est éteint) fibaro.call(123, "setSoundProgram", "enhanced") -- Sélectionne un mode traitement audio DSP (si l'ampli le supporte) fibaro.call(123, "setDialogueLevel", 1) -- Sélectionne le niveau des voix (si l'ampli le supporte) fibaro.call(123, "setSleep", 60) -- Programme l'extinction automatique (en minutes : 0, 30, 60, 90, 120) fibaro.call(123, "setDimmer", 2) -- Règle le niveau d'intensité des LED (si l'appareil le supporte) fibaro.call(123, "recallPreset", -- Rappelle un favori préenregistré Les propriétés suivantes peuvent être lues dans le JSON du module : power : boolean : true|false -- Statut d'alimentation de l'appareil state : string : ""|"play|"pause"|"stop" -- Statut du lecteur volume : integer : 0-100 -- Volume audio mute : boolean : true|false -- Silencieux audio dead : boolean : true|false -- Appareil connecté/déconnecté du réseau model : string : "XXX" -- Référence de l'appareil userDescription : string : "XXX" -- Pièce (zone) de l'appareil telle que paramétrée dans l'application mobile Changelog : v2.00 : Août 2021 Version initiale Téléchargement : Yamaha_MusicCast_v2.00.fqa
  9. 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
  10. Sauvegarde Home Center 3 sur NAS Synology Version 3.21 - Avril 2022 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 Pour HC2 à partir du firmware 4.621 : voir script de @speedoxx007 en page 4.
  11. Bonjour à tous, Voila je viens vous voir car je suis dans un Dilem! je suis actuellement dans la construction de ma nouvelle maison je réalise l'électricité moi même et j'aimerais y inclure de la domotique je pensais de base mettre une installation Niko home control mais vu les tarif et le peut d'interconnexion avec d'autre matériel je ne sais plus trop quoi faire. donc ayant eu une HC2 dans ma précédente habitation je me penchais sur le cas de la HC3 qui a l'air super bien foutue! mais j'ai quelque question et j'aimerais votre avis. de plus qui dit nouvelle construction dis control Vinçotte pour l'électricité est-ce bien dans les normes belge tout ces modules ? Si je place du Fibaro je me vois mal le placer partout dans la maison, donc je pensais mettre tout mes modules dans le même coffret sur rail Din et la HC3 dans la baie informatique juste a coté mais pour quel résultat ? qu'en pensez-vous ? quelqu'un aurait-il déjà fait ce genre de montage ? Merci pour vôtre aide je me sent un peut perdu....
  12. Manu31

    Domotiser sa piscine

    Bonjour, Suite à la domotisation de ma piscine (pompe à filtration + éclairage), voici mon retour d'expérience / mon partage Prérequis : 1x module Fibaro FGS-223 "Double Switch 2" https://www.domotique-store.fr/domotique/modules-domotiques/micromodules/micromodules-switch-domotique-sans-fil/668-fibaro-fgs-223-double-switch-2-micromodule-interrupteur-double-on-off-z-wave-avec-mesure-de-consommation.html?search_query=fibaro+fgs&amp;results=92 1x module FGDW-001 (001 important car les nouveaux intègre le capteur de température) OU Aeotec ZWA008 - Door/Window Sensor 7 https://www.domotique-store.fr/domotique/modules-domotiques/detecteurs-capteurs-mesure/ouverture-porte-fenetre/1078-aeotec-zwa008-doorwindow-sensor-7-detecteur-z-wave-d-ouverture-de-portefenetre-avec-entree-contact-sec.html 1x 1/2 pouce - capteur ds18b20 con doigt de gant 1/2 acier inoxydable immersion pour thermomètre de 30mm ref = https://www.amazon.fr/gp/product/B07FH7BQVG/ref=ppx_yo_dt_b_asin_title_o09_s00?ie=UTF8&amp;th=1 Installation dans le coffret : A savoir : Le bouton de filtration piscine possède 3 états : Filtration manuel / Eteint / Filtration programmé Le but est donc de se passer du module de programmation de la filtration. Mais que la filtration manuelle continue de marcher Voici une photo "schématique" du câblage : Une photo de ce que ca donne "IRL" dans mon coffret : Mais aussi de la sonde de température relié à mon FGDW-001 : Côté HC3, nous pouvons voir que tout remonte bien et que tout marche Programmation : Et maintenant on passe à la phase de "programmation" et donc mes questions : La filtration de la piscine dépend de beaucoup de facteur (nombre de personnes qui se baignent / température de l'eau / puissance de la pompe / etc.). Mon souhait serait "simple" : En dessous de 10°C = pas de filtration De 10°C à 15°C = 5h de filtration Au dessus de 15°C = température la plus haute détecté (Y) dans la journée de 8h à 20h / 2 = X qui serait le nombre d'heures de filtration Voilà, en éspérent que ca puisse en aider certain(e)s d'entre nous
  13. 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
  14. Bonjour, débutant en LUA et scène, j'aimerai retourner la valeur de l'appareil (Aeotec meter Gen5) et pas seulement faire un déclanchement de la scène si > x par exemple ? Merci, HC3, 5.100.22
  15. 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()
  16. Bonjour, Je suis vraiment un newborn sur fibaro. Je découvre le LUA (je connais un peut le C++ PHP JAVA... JSON) Mon installation est pour l'instant très simple avec seulement la box + FGBS 222 Je souhaite utiliser le contact sec out1 ça c'est facile... (pour un automatise de portail) En suite je souhaite le retour d'états grâce à IN1. Pour l'instant je fait les tests sur mon bureau avec un contact tout bête . Le problème est sur ce contact IN1 je l'ai bien séparé de OUT1 grâce à la fonction 20 (qui d'ailleurs n'est pas vraiment la fct 20 dans Home Center il faut aller sur le FGBS-222 et le menu avancé) Mon historique m'affiche "presque" correctement l'état de l'entrée (pourquoi Home Security ??comment changer l'état du logo?) je n'arrive pas a récupérer grâce à : print(fibaro.getValue(54, "value")) la valeur est toujours false alors que l'historique est bien changeant. Par la suite j'aimerais que l'état du logo de la commande d'ouverture soit dépendant de IN1 et n'ont pas de l'état de la sortie. Je ne sais pas si je dois utiliser d'autres outils que home center. Y a t'il un moyen de connaitre l'arborescence JSON d'un ID ? Désolé si je dit des bêtises.
  17. Network Monitor Version 2.12  Ce Quick App pour HC3 permet 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, et 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 : Importer le QuickApp (fichier fqa) de façon habituelle sur la box HC3, puis changer les paramètres suivants dans l'onglet Variables :  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 : Asterix, Obelix 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 : Nom du QuickApp et nom de sa fonction qui sera appelée pour exécuter un code LUA externe, par exemple envoyer un SMS, ou un mesage via Telegram, ou autre service de notification. Ensuite, aller dans l'onglet "Modifier et prévisualiser", puis cliquer sur le bouton "Modifier" afin d'entrer dans l'éditeur LUA. Il faut éditer le tableau DEVICES dans le fichier CONFIG. Exemple : 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 = { { profil = "" , operator = "==", value = "Vacances"}, { operator = "all", conditions = { { vg = "Chauffage", operator = "==", value = "Été"}, { operator = "any", conditions = { { profil = "", operator = "==", value = "Nuit"}, { profil = "", operator = "==", value = "Absent"} } } } } } } }, } 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 pour DEVICES sont nombreuses : 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. login : facultatif si protocole http/https | inutile si protocole tcp : string : Nom d'utilisateur à utiliser dans l'en-tête de la connexion HTTP/HTTPS. password : facultatif si protocole http/https | inutile si protocole tcp : string : Mot de passe à utiliser dans l'en-tête de la connexion HTTP/HTTPS. 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. delay : facultatif : integer : valeur par défaut = 0 : délay en seconde avant d'effectuer une nouvelle tentative de connexion. Augmenter cette valeur peut être utile si l'équipement met un certain temps avant d'être de nouveau joignable après une déconnexion. 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. On peut utiliser des conditions de vg ou de profil. Téléchargement : Nouvelle installation : Network_Monitor_v2.12.fqa Mise à jour : Fichier main : Network Monitor v2.12.lua Fichier CONFIG : Network Monitor - Config Tuto.lua Fichier tools : Library - tools v2.20.lua Fichier Notifications : Library - Notifications v2.2.lua
  18. Wencepili

    HC3 & Nice Oxibd Robus 400

    bonjour , j'ai une HC3 et depuis peu , un portail coulissant équipé d'un moteur NICE et d'un module oxibd. le moteur fonctionne bien avec une telecommande Era On BD. j'ai voulu le coupler avec ma HC3 : test 1 : appareillage direct depuis l'e module oxibd. => le HC3 trouve bien mon moteur => les 4 tests ouverture , fermeture , partiel, pas à pas sont OK . => j'effectue la validation finale , la fenêtre se ferme . j'ai l'impression que tout s'est passé correctement , mais je ne vois rien , aucun module Nice à l'horizon . test2 : appareillage avec la télecommande . => comme pour le premier test , tout se passe bien , mais je ne vois aucun module Nice appareillé . j'ai refait les tests apres une maj du dernier firmware, cela n'a rien changé. si quelqu'un a une idée , je suis preneur , parce que la , je seche . Merci à tous
  19. Bonjour, Si comme moi, vous avez plus de 200 périphériques ZWAVE, il se peut que vous ne puissiez plus en ajouter d'autres. Voici l'erreur dans les log : [03.12.2021] [22:56:01] [TRACE] [ZWAVE]: Learning mode error. Try again. [03.12.2021] [22:56:02] [TRACE] [ZWAVE]: Adding devices complete Et voici "l'aide" (qui est plus un contournement) du support Fibaro : Si ça peut servir à d'autres... Bonne journée
  20. Sowliny

    Intégration NICE-Fibaro BiDi-ZWave

    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
  21. Quick App - Mettre a jour un QA tout les jours a 0h00 voici un bout de code pour mettre a jour un QuickApp tout les jours a minuit function QuickApp:onInit() self:debug("onInit") self.refresh = 0 -- Boucle principale self:loop(self.refresh) end ---------------------------------------------------------- --- Boucle loop ---------------------------------------------------------- function QuickApp:loop(refresh) local JourHeure = os.date("*t") local refresh = 24*60 if JourHeure.hour ~= 0 and JourHeure.min ~= 0 then refresh = ((23-JourHeure.hour)*60)+60-JourHeure.min end self:trace("Le QA a été mise a jour : Prochane mise a jours dans ",refresh,"mn") self:demmarrefonction()--------------on met ici la fonction qui démmarre le QA fibaro.setTimeout(refresh * 60 * 1000, function() self:loop(refresh) end) end
  22. tempo29

    Bonjour

    Bonjour à tous, Je viens de découvrir le forum (en français) qui semble être une vrai source de trouvailles et astuces pour le Home center 3. Ca tombe bien j'en ai moi-même quelqu'une que je compte bien partager et améliorer ici. Au plaisirs de vous lire, Tempo.
  23. ericl78

    Les ports ouverts sur HC3

    Bonjour à tous Je viens par curiosité de scanner les ports ouverts sur ma hc3, voici le résultat : 22,80,443,500,5060,5061,9999 Pour 22 SSH, 80 HTTP, 443 HTTPS, 500 peut être VPN avec Fibaro mais pour le reste, avez vous une idée de l'utilisation possible ? Merci
  24. 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:
  25. ericl78

    Générer un nombre aléatoire

    Bonjour à vous, Je cherche à générer un nombre aléatoire compris entre -30 et plus 30. Je voudrais, lors de mon absence, éteindre les lumières à une heure différente tous les soirs afin de simuler ma présence. Savez-vous comment générer ce nombre aléatoire ?. Merci
×