Aller au contenu

Rechercher dans la communauté

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



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

14 résultats trouvés

  1. Lazer

    Quick App - KODI + Addon

    QuickApp + Addon pour KODI Version 2.0 1. QuickApp 1.1. Présentation Ce QuickApp permet de piloter le lecteur multimédia KODI depuis la box Fibaro Home Center 3. Les fonctionnalités suivantes sont disponibles : PowerON / PowerOFF Lecture, Pause, Stop Précédent, Suivant Baisser ou monter le volume d'un cran Silencieux Slider de réglage du volume Ouverture et lecture d'un média spécifié Notification texte en surimpression Affichage de caméra en surimpression Réglage de la synchronisation du décalage audio/vidéo Réglage du décalage vers le haut ou le bas de l'image pour les films avec bandes noires (concernant ces 2 dernières fonctionnalités, je ne les utilise pas en direct depuis le QuickApp, mais au travers d'un raccourci sur ma télécommande) Un retour d'état est raffrachit à intervalle régulier (paramétrable), indiquand les informations suivantes : Statut de l'alimentation Statut du lecteur (playing, paused, stopped) Type de média lu (video, music, etc...) Titre du média en cours de lecture Timing de lecture et durée totale du média Niveau du volume via le slider A noter que ce module est de type Lecteur "com.fibaro.player". Il n'y a pas d'utilisation de modules enfants. 1.2. Pré-requis Dans les paramètres de Kodi, il faut Autoriser le contrôle à distance via HTTP, et spécifier le Port, le Nom d'utilisateur, et le Mot de passe : 1.3. Installation Importer le QuickApp (fichier fqa) de façon habituelle sur la box HC3, puis changer les paramètres suivants dans l'onglet Variables : Protocol : protocole à utiliser, normalement : http Address : adresse IP de Kodi, par exemple : 192.168.1.1 Port : port de communication, par exemple : 8080 User : utilisateur DSM préalablement configuré, par exemple : kodi Password : mot de passe du compte RefreshON : intervalle de rafraichissement des informations en secondes quand Kodi est allumé, par exemple : 3 RefreshOFF : intervalle de rafraichissement des informations en secondes quand Kodi est éteint, par exemple : 60 PowerON_Method : l'une des méthodes suivantes pour démarrer Kodi, à personnaliser en fonction de votre installation, les méthodes proposées permettent un large éventail de possibilités : MacAddress = 00:00:00:00:00:00 => adresse MAC de Kodi, afin de le réveiller grâce au paquet magique Wake-On-LAN Device = 123 => allume (turnOn) un device spécifié par son ID (par exemple un switch FGS ou un module universel FGBS) Device = Module => allume (turnOn) un device spécifié par son Nom (par exemple un switch FGS ou un module universel FGBS) QuickApp = 123, Method => Appelle la fonction "Method" du QuickApp spécifié par son ID QuickApp = Module, Method => Appelle la fonction "Method" du QuickApp spécifié par son Nom Note : l'intervalle de raffraichissement variable permet de conserver une bonne réactivité de mise à jour lorsque Kodi est en fonctionnement, sans pour autant surcharger inutilement de requête réseau le reste du temps. 1.4. Utilisation Depuis l'interface Web ou l'application mobile : Un clic sur les boutons permet de piloter Kodi 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é (0 à 100) fibaro.call(123, "setVolume", "decrement") -- Diminue le volume audio d'un pourcent fibaro.call(123, "setVolume", "increment") -- Augmente le volume audio d'un pourcent fibaro.call(123, "setMute") -- Bascule le mode silencieux fibaro.call(123, "setMute", true) -- Audio en sourdine fibaro.call(123, "setMute", false) -- Audio normal fibaro.call(123, "open", "smb://SERVER/Share/Path/Movie.mkv") -- Ouvre et lance la lecture du media spécifié par le nom de fichier complet avec le chemin fibaro.call(123, "notification", "title", "message") -- Affiche un popup de notification à l'écran fibaro.call(123, "camera", 1) -- Affiche l'image vidéo de la caméra n°1 à l'écran (nécessite l'Addon pour Kodi) fibaro.call(123, "camera", 1, 10, 1000) -- Affiche l'image vidéo de la caméra n°1 à l'écran pour une durée de 10 secondes avec un intervalle de rafraichissement de 1000 ms soit 1 seconde (nécessite l'Addon pour Kodi) fibaro.call(123, "audioDelay", "audiodelayminus") -- Diminue le décallage audio fibaro.call(123, "audioDelay", "audiodelayplus") -- Augmente le décallage audio fibaro.call(123, "verticalShift", "verticalshiftup") -- Décalle l'image vers le haut (si présence de barres noires) fibaro.call(123, "verticalShift", "verticalshiftdown") -- Décalle l'image vers le bas (si présence de barres noires) Les propriétés suivantes peuvent être lues dans le JSON du module : power : boolean : true|false -- Statut d'alimentation de Kodi state : string : ""|"stopped"|"playing"|"paused" -- Statut du lecteur Kodi volume : integer : 0-100 -- Volume audio mute : boolean : true|false -- Silencieux audio 2. Addon pour Kodi 2.1. Présentation Cet Addon est une extension de type programme qui s'installe dans Kodi et permet une communication bidirectionnelle entre le QuickApp et Kodi. Il a été initialement développé par @ADN182 : Je me suis contenté de l'adapter au fonctionnement de la HC3 (QuickApp). Je me permet de copier/coller une partie de son tuto pour une meilleure comprehension ici-même. 2.2. Installation Pour l'installer, importer le fichier ZIP dans Kodi, puis aller dans les paramètres de l'extension pour configurer les paramètres (en rouge ceux qui sont requis, en vert veux que vous ne devriez pas toucher en temps normal) Adresse IP de la HC3 Port (par défaut 80) Nom d’utilisateur HC3 (il est fortement suggérer de créer un utilisateur dédié dans le panneau d'accès de la HC3 avec les droits nécessaire aux modules à piloter depuis Kodi.... à minima le QuickApp importé précédemment) Mot de passe HC3 Nom du Quickapp sur la HC3 (celui qui a importé précédemment sur la HC3) Nom d'une Scène Nom de l'Instance (permet d’identifier le MediaCenter dans la HC3. Si vous en avez plusieurs mettre un nom différents pour chaque MediaCenter, exemple : KODI_Salon et KODI_Chambre) Temps d'affichage de la caméra (délai pendant lequel la caméra reste affiché, défaut : 14 secondes) Fréquence de rafraîchissement (délai entre chaque récupération d'image de la caméra, défaut : 500 millisecondes)  Temps d'attente entre chaque mise à jour de déclenchement de scène (défaut : 10 millisecondes) Temps d'attente pour la récupération des informations Audio/Videos (défaut : 50 millisecondes) Timeout des requêtes HTTP (défaut : 5 secondes)  Note : la scène et l'instance sont conservées pour des raisons de rétrocompatibilité et d'accompagnement dans la migration des utilisateurs de la HC2 vers la HC3, mais elles n'ont plus réellement lieu d'être utilisées, le QuickApp permettant de remplacer tout cela. Ensuite sélectionner les événements que vous désirez activer (Accès au Menu Home, Play Video, Pause Audio...). S’ils ne sont pas activés ils ne remonteront pas dans la HC3. Exemple : Si on laisse « Accès au Menu Home » à "No" alors la HC3 ne sera pas capable de déclencher une action lorsque vous serez sur la page d’accueil de votre média-center préféré. Les caméras détectées après redémarrage de l'Addon s'afficheront dans l'écran suivant. L'ID de chaque caméra est celui qui doit être utilisé lorsqu'on désire afficher une caméra depuis un script LUA à l'aide de la commande fibaro.call(123, "camera", 1) documentée précédemment. 2.3. Utilisation Chaque événement de Kodi (changement de menu, événement de lecteur, etc) qui a été coché dans la configuration de l'addon remonte instantanément dans le QuickApp, permettant une mise à jour en temps réel (fonctionnement en mode push) De plus, il est possible de personnaliser les actions associées à chaque événement. Pour cela il faut modifier le fichier custom du QuickApp. Chaque nom de fonction est parlant, il suffit d'insérer les instructions LUA désirées pour personnaliser son installation (gestion des lumières, volets, etc) : 2.4. Menu Un menu peut être affiché à l'écran, permettant de piloter directement tous les modules de la HC3 dont on a donné accès à l'utiliateur Kodi : Pour afficher ce menu, il faut exécuter l'Addon en cliquant sur son icone (Extension de type Programme) ou bien en appuyant sur une touche, pour ce faire il faut ajouter un fichier "keyboard.xml" dans le dossier utilisateur (userdata) de Kodi. Emplacement sur Windows : C:\Users\<USER>\AppData\Roaming\Kodi\userdata\keymaps\keyboard.xml Documentation de référence : http://kodi.wiki/view/Keymaps Pour la Nvidia Shield TV voici le lien afin de pouvoir utiliser les bouttons rouge, bleu... : https://forum.xda-developers.com/shield-tv/general/shield-harmony-hub-keyboard-characters-t3722002 Exemple de fichier keyboard.xml permettant d'afficher le menu à l'aide de la combinaison de touches « Ctrl+Y » : <keymap> <global> <keyboard> <y mod="ctrl">SetProperty(FibaroMenu,true,10000)</y> <!--CTRL + Y pour afficher le Menu --> <menu mod="longpress">SetProperty(FibaroMenu,true,10000)</menu> <!-- Appuie long sur la touche Menu --> <X>RunScript("HC2.addon", "fonction=ActiveCamera", "name=macamera")</X> <!-- Permet d'afficher la camera "macamera" à l'aide de la touche X --> </keyboard> <remote> <red>SetProperty(FibaroMenu,true,10000)</red> <!--Touche rouge de la télécomande multimédia pour afficher le Menu --> <blue>SetProperty(FibaroMenu,true,10000)</blue> </remote> </global> <fullscreenvideo> <keyboard> <menu mod="longpress">SetProperty(FibaroMenu,true,10000)</menu> <X>RunScript("HC2.addon", "fonction=ActiveCamera", "name=macamera")</X> <!-- Permet d'afficher la camera "macamera" à l'aide de la touche X --> </keyboard> </fullscreenvideo> </keymap> Note : redémarrer Kodi une fois celui-ci mis en place 3. Changelog v2.0 : Initial public release  4. Téléchargements Kodi_v2.0.fqa HC3.addon-1.0.0.zip
  2. 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
  3. QuickApp Synology Surveillance Station Version 5.0  Présentation  Ce QuickApp permet de piloter les caméras gérées par l'outil Surveillance Station qu'on trouve sur les NAS Synology : activer/désactiver les caméras démarrer/arrêter l'enregistrement des caméras piloter le positionnement PTZ des caméras motorisées. Ce QuickApp créé un module enfant (Child Device) pour chaque caméra gérée, permettant de visualiser : l'icône indique si le NAS est en train d'enregistrer le flux vidéo de la caméra ou non le message provisoire "Transfert OK" en vert indique le changement d'état le message permanent en rouge indique le défaut de fonctionnement de la caméra (désactivée, déconnectée, etc...) A noter que les modules enfants sont de type Commutateur binaire "com.fibaro.binarySwitch", ce qui les rends cliquables pour forcer/stopper l'enregistrement forcé du flux vidéo de chaque caméra. Ce QuickApp fait suite au Module Virtuel initialement développé pour HC2 : Pré-requis Au moins une caméra doit être gérée par Surveillance Station : Il est conseillé de paramétrer la caméra en détection de mouvement permanente : Reconnaissance d'image effectuée par le NAS : Détection de mouvement (en vert) Reconnaissance d'image effectuée par la caméra : Personnaliser 1 (en orange), et sélectionner les options proposés dans la liste déroulante (variable selon la caméra). L'intérêt de la reconnaissance d'image par la caméra est de décharger le processeur du NAS. Si la caméra en est capable, des positions prédéfinies doivent être mémorisées pour les caméras à piloter : Création d'un utilisateur dédié Bien que non-obligatoire, il est conseillé pour des raisons de sécurité de créer un utilisateur dédié dans DSM. Ainsi, le mot de passe du compte administrateur principal du NAS n'est pas exposé dans la box domotique. Ouvrir le panneau de configuration : Ouvrir le panneau des utilisateurs : Cliquer sur le bouton "Créer", et entrer les informations utiles. Note : il est judicieux de cocher la case "Ne pas autoriser l'utilisateur à changer le mot de passe du compte" afin d'éviter de bloquer le bon fonctionnement du QuickApp le cas échéant : Cocher le groupe "users" : Cocher les cases "Pas d'accès" pour l'ensemble des dossiers partagés : Ne définir aucun quota : N'autoriser les privilèges que pour "Surveillance Station", et refuser toutes les autres applications : Ne modifier aucune limite de vitesse : Vérifier que tout est bon, et cliquer sur le bouton "Appliquer" : De retour dans Surveillance Station, ouvrir le panneau Utilisateur, puis sélectionner l'utilisateur Fibaro préalablement créé, et cliquer sur le bouton "Privilège" : Dans la liste déroulante "Profil de privilège", sélectionner "Gestionnaire tout objet (Directeur)", puis cliquer sur le bouton "Enregistrer" : Confirmer : L'utilisateur dispose maintenant des droits Directeur : 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 du NAS, par exemple : 192.168.1.1 Port : port de communication, normalement : 5000 User : utilisateur DSM préalablement créé, par exemple : Fibaro Password : mot de passe du compte Refresh : intervalle de rafraichissement des informations en secondes, par exemple : 3 Création des modules enfants Cliquer sur le bouton "Create Cameras". 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. Icônes Pour les modules enfants, permet de visualiser en un coup d’œil si le NAS est en train d'enregistrer le flux vidéo de la caméra ou non. Utilisation  Depuis l'interface Web ou l'application mobile : Un clic sur une caméra force ou désactive l'enregistrement forcé de la caméra. A noter que si l'enregistrement automatique sur mouvement est activé au niveau du NAS, celui-ci peut très bien enregistrer le flux vidéo d'une caméra même si l'enregistrement forcé est désactivé. Dans ce cas, le statut du module se mettra à jour dans l'interface de la HC3 (propriété value, icône) 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(ID, "enable") => Active une caméra fibaro.call(ID, "disable") => Désactive une caméra fibaro.call(ID, "turnOn") => Démarre l'enregistrement forcé d'une caméra indéfiniment (la caméra est automatiquement activée si elle ne l'était pas préalablement) fibaro.call(ID, "record") => Démarre l'enregistrement forcé d'une caméra indéfiniment (la caméra est automatiquement activée si elle ne l'était pas préalablement) fibaro.call(ID, "record", 60) => Démarre l'enregistrement forcé d'une caméra pendant le temps spécifié en secondes, par exemple 60 (la caméra est automatiquement activée si elle ne l'était pas préalablement, à la fin du délai l'enregistrement forcé s'arrête et la caméra reste activée) fibaro.call(ID, "turnOff") => Stoppe l'enregistrement forcé d'une caméra fibaro.call(ID, "PTZ", 1) => Déplace la caméra motorisée au preset spécifié Les propriétés suivantes peuvent être lues dans le JSON du chaque module enfant : value : boolean : true|false => Enregistrement du flux vidéo en cours sur le NAS dead : boolean : true|false => Statut de la connexion réseau entre le NAS et la caméra deadReason : string : ""|"Disabled"|"Connection failed"|"Setting"|... => Raison de la déconnexion Changelog v5.0 : Initial release  Téléchargement Surveillance_Station_v5.0.fqa
  4. Network Monitor Version 2.0  Voici un Quick App pour HC3 permettant de surveiller des équipements sur le réseau (local et Internet), et d'envoyer des notifications en cas de problème détecté. Cela va bien au-delà du simple ping réseau, car ce QuickApp permet de vérifier le bon fonctionnement des services (envoi d'une requête, vérification de la réponse) Il s'agit de la v2, car il fait suite au Module Virtuel Network Monitor v1.x initialement développé pour HC2. Screenshot peu esthétique, en espérant que Fibaro propose rapidement de personnaliser l'apparence visuelle des QA. Cependant, ce n'est pas son rôle premier, l'objectif est bien de recevoir des notifications instantanées en cas de souci détecté : Configuration :  Après téléchargement et import du QuickApp, modifier la variable QuickApp.config dans la section "User Variables" au début du code LUA. Exemple : -- -- User variables -- QuickApp.config = { notifications = { email = { -- Email notification users = { -- /api/users "Lazer" }, title = "HC3 Network Monitor", }, push = { -- Push notification mobiles = { -- /api/iosDevices "Pixel 2 XL", "Google Pixel C", }, }, sms = { -- SMS notification quickapp = { -- /devices?interface=quickApp id = "SMS", method = "sendSMS", }, }, vg = { -- Global Variable notification names = { -- /api/globalVariables/ "Notification" } } }, devices = { {name = "Serveur SSH" , address = "192.168.1.1" , port = 22, protocol = "tcp" , timeout = 1, senddata = nil , retdata = "OpenSSH", retry = 1, interval = 30, notification = {"push", "email" }, vg = nil, conditions = nil}, {name = "Ubiquiti Unifi AP-AC-Pro" , address = "192.168.1.2" , port = 22, protocol = "tcp" , timeout = 1, senddata = nil , retdata = "SSH" , retry = 1, interval = 60, notification = {"push", "email", "sms"}, vg = nil, conditions = nil}, {name = "Ubiquiti Unifi Switch" , address = "192.168.1.3" , port = 22, protocol = "tcp" , timeout = 1, senddata = nil , retdata = "SSH" , retry = 1, interval = 60, notification = {"push", "email" }, vg = nil, conditions = nil}, {name = "Ubiquiti Unifi Controller" , address = "192.168.1.4" , port = 8443, protocol = "https", timeout = 2, url = "/manage/account/login" , retcode = 200, retdata = "UniFi Network" , retry = 1, interval = 60, notification = {"push", "email", }, vg = nil, conditions = nil}, {name = "Ubiquiti EdgeRouter" , address = "192.168.1.5" , port = 443, protocol = "https", timeout = 1, url = "/" , retcode = 200, retdata = "EdgeRouter" , retry = 1, interval = 30, notification = { "sms"}, vg = nil, conditions = nil}, {name = "Switch Cisco" , address = "192.168.1.6" , port = 80, protocol = "http" , timeout = 1, url = "/" , retcode = 200, retdata = "cisco" , retry = 1, interval = 30, notification = {"push", "email", "sms"}, vg = nil, conditions = nil}, {name = "Switch Netgear GS105Ev2" , address = "192.168.1.7" , port = 80, protocol = "http" , timeout = 1, url = "/login.cgi" , retcode = 200, retdata = "NETGEAR" , retry = 1, interval = 60, notification = {"push", "email" }, vg = nil, conditions = nil}, {name = "Switch Netgear GS108Tv2" , address = "192.168.1.8" , port = 80, protocol = "http" , timeout = 1, url = "/" , retcode = 200, retdata = "NETGEAR" , retry = 1, interval = 60, notification = {"push", "email" }, vg = nil, conditions = nil}, {name = "HP ProLiant Remote Access Card", address = "192.168.1.9" , port = 80, protocol = "http" , timeout = 1, url = "/login.html" , retcode = 200, retdata = "Remote Access Card" , retry = 1, interval = 60, notification = { "email" }, vg = nil, conditions = nil}, {name = "HP ProLiant Gen8 ILO" , address = "192.168.1.10" , port = 443, protocol = "https", timeout = 1, url = "/" , retcode = 200, retdata = "iLO" , retry = 1, interval = 60, notification = { "email" }, vg = nil, conditions = nil}, {name = "VMware ESXi" , address = "192.168.1.11" , port = 443, protocol = "https", timeout = 1, url = "/" , retcode = 200, retdata = "VMware ESXi" , retry = 1, interval = 60, notification = {"push", "email", "sms"}, vg = nil, conditions = nil}, {name = "Onduleur Eaton 5P" , address = "192.168.1.12" , port = 80, protocol = "http" , timeout = 1, url = "/" , retcode = 200, retdata = "Network Management Card", retry = 1, interval = 60, notification = {"push", "email" }, vg = nil, conditions = nil}, {name = "Synology DiskStation" , address = "192.168.1.13" , port = 5000, protocol = "http" , timeout = 5, url = "/" , retcode = 200, retdata = "DiskStation" , retry = 1, interval = 30, notification = {"push", "email", "sms"}, vg = nil, conditions = nil}, {name = "Serveur Web Apache" , address = "192.168.1.14" , port = 80, protocol = "http" , timeout = 1, url = "/" , retcode = 200, retdata = "Apache" , retry = 1, interval = 60, notification = { "email" }, vg = nil, conditions = nil}, {name = "GCE Eco-Devices" , address = "192.168.1.15" , port = 80, protocol = "http" , timeout = 1, url = "/index1.htm" , retcode = 200, retdata = "Eco Devices" , retry = 1, interval = 30, notification = {"push", "email", "sms"}, vg = nil, conditions = nil}, {name = "GCE IPX800 v4" , address = "192.168.1.16" , port = 80, protocol = "http" , timeout = 1, url = "/user/index2.htm" , retcode = 200, retdata = "IPX800" , retry = 1, interval = 30, notification = {"push", "email", "sms"}, vg = nil, conditions = nil}, {name = "Caméra Hikvision" , address = "192.168.1.17" , port = 80, protocol = "http" , timeout = 1, url = "/doc/page/login.asp" , retcode = 200, retdata = "login" , retry = 1, interval = 30, notification = {"push", "email", "sms"}, vg = nil, conditions = nil}, {name = "Caméra Foscam" , address = "192.168.1.18" , port = 88, protocol = "http" , timeout = 1, url = "/" , retcode = 200, retdata = "IPCam Client" , retry = 1, interval = 60, notification = {"push", "email", "sms"}, vg = nil, conditions = { vg = "Vacances" , operator = "==", value = "0"}, }, {name = "JPI SMS Gateway" , address = "192.168.1.19" , port = 8080, protocol = "http" , timeout = 10, url = "/JPI/" , retcode = 200, retdata = "JPI" , retry = 6, interval = 30, notification = {"push", "email" }, vg = nil, conditions = { vg = "Monitor_JPI" , operator = "==", value = "0"}, }, {name = "FHEM" , address = "192.168.1.20" , port = 8083, protocol = "http" , timeout = 1, url = "/fhem" , retcode = 401, retdata = "" , retry = 1, interval = 30, notification = {"push", "email", "sms"}, vg = nil, conditions = nil}, {name = "HA Bridge" , address = "192.168.1.21" , port = 80, protocol = "http" , timeout = 1, url = "/#!/" , retcode = 200, retdata = "HA Bridge" , retry = 1, interval = 60, notification = {"push", "email" }, vg = nil, conditions = nil}, {name = "Google" , address = "www.google.fr", port = 80, protocol = "http" , timeout = 1, url = "/" , retcode = 200, retdata = "Recherche Google" , retry = 1, interval = 1, notification = { "sms"}, vg = nil, conditions = nil}, {name = "Yamaha MusicCast" , address = "192.168.1.22" , port = 80, protocol = "http" , timeout = 1, url = "/YamahaExtendedControl", retcode = 200, retdata = "response_code" , retry = 1, interval = 60, notification = { "email" }, vg = nil, conditions = nil}, {name = "Projecteur Epson EH-TW9300" , address = "192.168.1.23" , port = 80, protocol = "http" , timeout = 1, url = "/" , retcode = 404, retdata = "Not Found" , retry = 1, interval = 60, notification = { "email" }, vg = nil, conditions = { vg = "Vacances" , operator = "==", value = "1"}, }, {name = "Nvidia Shield TV" , address = "192.168.1.24" , port = 8008, protocol = "http" , timeout = 1, url = "/" , retcode = 404, retdata = "" , retry = 1, interval = 60, notification = { "email" }, vg = nil, conditions = { operator = "any", conditions = { { vg = "Vacances" , operator = "==", value = "1"}, { operator = "all", conditions = { { vg = "Saison", operator = "==", value = "Eté"}, { operator = "any", conditions = { { vg = "Nuit" , operator = "==", value = "1"}, { vg = "Absence" , operator = "==", value = "1"} } } } } } } }, }, } Cela risque d'être peu lisible sur votre écran, dans ce cas il faut utiliser l'ascenseur horizontal pour faire défiler, ou alors insérer des sauts de lignes) Cependant j'aime bien cette présentation qui se rapproche d'un tableau et est parfaitement lisible sur un grand écran. Ce QuickApp est relativement complexe à paramétrer, car les options sont nombreuses : notifications email : users : integer | string : liste séparée par des virgules des utilisateurs à qui envoyer un email. Il faut renseigner soit l'ID de l'utilisateur, soit son nom, informations accessibles via /api/users push : mobiles : integer | string : liste séparée par des virgules des mobiles à qui envoyer une notification Push. Il faut renseigner soit l'ID du mobile, soit son nom, informations accessibles via /api/iosDevices sms : quickapp : QuickApp qui sera appelé pour éxecuter un code LUA externe, par exemple envoyer un SMS, ou un mesage via Telegram, ou autre service de notification. id : integer | string : ID ou nom du QuickApp, informations accessibles via /api/devices?interface=quickApp method : string : nom de la fonction à appeler dans le QuickApp vg : names : string : liste séparée par des virgules des variables globales qui contiendront le message de notification, informations accessibles via /api/globalVariables devices name : obligatoire : string : Nom de l'équipement qui apparaitra dans la notification address : obligatoire : string : Adresse IP ou nom DNS de l'équipement à monitorer port : facultatif si protocole http/https | obligatoire si protocole tcp : Port TCP. Dans le cas des connexions HTTP et HTTPS, si ce n'est pas spécifié, le port par défaut sera utilisé (80 pour HTTP, et 443 pour HTTPS) protocol : obligatoire : string : "http" | "https" | "tcp" : ces 3 protocoles sont supportés. Le mode tcp est un mode raw, c'est à dire que les données sont lues/écrites telles quelles sur la socket. timeout : facultatif : integer : Valeur par défaut = 1 seconde : Durée autorisée de la connexion en secondes avant réponse du client. Doit être augmenté si le client met trop de temps à répondre. url : obligatoire si protocole http/https | inutile si protocole tcp : string : URL de la page Web à charger retcode : obligatoire si protocole http/https | inutile si protocole tcp : integer : code de retour HTTP attendu (200 la plupart du temps) senddata : inutile si protocole http/https | facultatif si protocole tcp : string : chaine de caractère à envoyer lors de l'établissement de la connexion TCP. Cela peut être nécessaire pour certains équipements qui n'envoient pas de réponse avant d'avoir reçu une instruction. retdata : facultatif : string : chaine de caractère recherchée dans la réponse retry : facultatif : integer : valeur par défaut = 1 : nombre de tentatives de connexion à effectuer. Augmenter cette valeur peut être utile pour certains équipements dont la connexion est instable, notamment via Wi-Fi. interval : facultatif : integer : valeur par défaut = 1 minute : intervalle en minutes entre 2 vérifications. J'ai testé jusqu'à 1440 minutes, soit 24 heures. notification : obligatoire : table : "push" | "email" | "sms" | "vg" | "service" : type de notification à envoyer, configurée préalablement. vg : facultatif : string : nom facultatif d'une variable globale à incrémenter, celle-ci sera automatiquement créée si nécessaire. Elle est remise à 0 dès que l'appareil surveillé est de nouveau disponible. conditions : facultatif : table : permet d'annuler le monitoring d'un équipement particulier en fonction de conditions sur des variables globales. Les conditions sont combinables avec des instructions booléennes "any" (= or) et "all" (= and). La syntaxe est inspirée du moteur de triggers des scènes sur HC3. Téléchargement : Network_Monitor_v2.0.fqa
  5. 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()
  6. Quick App - Jour Férié Ce QA est une adaptation du VD de @hansolo et @steven Retourne OUI si le jour courant et J+1 est un jour chômé (WE ou férié) Adapté de http://gurau-audibert.hd.free.fr/josdblog/2014/01/lua-vacances-jours-chomes-et-jours-feries/ Pour la HC2 par Hansolo V1 26/06/2014 Initié par HANSOLO V2 27/06/2014 Amélioré par STEVEN, gestion des JS SUISSE et calcul J et J+1 V3 10/05/2020 QA pour Home Center 3 (ne fonction pas sur HC2 ou HCL) réalisé par mprinfo V4 24/05/2020 QA pour Home Center 3 (ne fonction pas sur HC2 ou HCL) réalisé par mprinfo réécriture complète du VD Je n'ai pas encore implémenté la partie icones pour le moment c'est pas ma priorité Ce QA a été complément réécrit il ne fonctionne que pour la france les départements : 57, 67, 68 doivent mettre la variable "Prusse" à true Prusse = true -- Mettre prusse = true si départements (57, 67, 68) Le QA : Utilise les variables du QA et non plus des variables Globales Ce met a jour à 0h00 Ce met a jour automatique lors de l'installation pour @nico 2 jours de congés en plus il suffit de mettre Prusse = true   Pour récupèrer les Variables d'un QA voir : Lien de téléchargement : QA_-Jour_Ferie_V4.00.fqa
  7. 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:
  8. Quick App - Mobiles devices informations (Android et IOS) Permet de visualiser les informations des appareils mobiles (smartphones et tablettes, tant Android que IOS) présent sur la HC3 + Envoi d'un push si on le désir Ce QA récupère les informations via l 'api de la box /api/iosDevices Lien du fichier : IOS Ver2.0.fqa
  9. Quick App - Calendrier Variables QA Variable global Utilisation : Exemple : pour avoir le 2° mardi du mois local Mois = json.decode(fibaro.getGlobalVariable("Jours_Mois")) local Jour = "Mardi" local resultat = Mois[Jour][2] print (resultat) Pour connaitre le nombre de jeudi dans le mois local Mois = json.decode(fibaro.getGlobalVariable("Jours_Mois")) local Jour = "Jeudi" local resultat = #Mois[Jour] print (resultat) QA_-_CalendrierV2.0.fqa
  10. fredokl

    QuickApp - Remote Denon

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

    QuickApp Color controller

    Bonjour, J'ai un souci avec les QuickApp de type color controler. Lorsque j'utilise le slider de l'app mobile ou les couleurs favorites je n'arrive pas à récupérer le code "rgbw" complet, seulement le "r". Par contre si je fait un call: fibaro.call(134, "setColor", "204,75,194,0") Avez-vous une idée? Merci d'avance.
  14. fredokl

    QuickApp - FreeSms

    Bonjour à tous, Voici un QuickApp pour pouvoir envoyer des sms avec un compte Free Mobile. Le code est adapté de celui de @Krikroff pour la HC2. Je me suis fait aider par mon neveu qui maitrise le code beaucoup mieux que moi. Il fonctionne parfaitement. Il est libre de modification et d'amélioration. Code: -- FREESMS pour Fibaro HC3 -- Le code suivant a été adapté sur celui-ci de Krikroff du forum www.domotique-fibaro.fr -- Adaptation par fredokl pour www.domotique-fibaro.fr -------------------------------------------------------- -- Paramètres utilisateur -------------------------------------------------------- local username = "IDENTIFIANT FREE" local password = "CLÉ IDENTIFICATION" -------------------------------------------------------- -- Paramètrages des boutons avec les messages à envoyer -------------------------------------------------------- function QuickApp:uimsg1OnR(event) self:debug("Message 1") self:sendmsg("Hello World!") end function QuickApp:uimsg2OnR(event) self:debug("Message 2") self:sendmsg("Salut le Monde!") end function QuickApp:uimsg3OnR(event) self:debug("Message 3") self:sendmsg("Tout va bien?") end function QuickApp:uimsg4OnR(event) self:debug("Message 4") self:sendmsg("Moi ça va.") end function QuickApp:uimsg5OnR(event) self:debug("Message 5") self:sendmsg("Bye bye!") end -------------------------------------------------------- -- Ne rien modifier sous cette ligne -------------------------------------------------------- function QuickApp:sendmsg(message) self:debug("Envoi du message") self:setVariable("FreeSMS", message) self:updateProperty("value", true) local query = string.format("user=%s&pass=%s&msg=%s", username, password, message) self:sendCommand(query) end function QuickApp:sendCommand(query) local message = self:getVariable("FreeSMS") local url = "https://smsapi.free-mobile.fr/sendmsg" url = url .. "?" .. query self:debug("Envoi de la commande:", url) self.http:request(url, { options= { headers= { ["Connection"] = "keep-alive", }, method = "POST" }, success = function(response) self:controle_status(response.status) end, error = function(message) self:debug("error:", message) end }) self:debug("Fin de commande") end -------------------------------------------------------- -- Liste des codes retour HTTP de Free Mobile -------------------------------------------------------- local code_retour = { [200]=" - Le SMS a été envoyé sur votre mobile", [400]=" - Un des paramètres obligatoires est manquant", [402]=" - Trop de SMS ont été envoyés en trop peu de temps", [403]=" - Le service n’est pas activé sur l’espace abonné, ou login / clé incorrect", [500]=" - Erreur côté serveur. Veuillez réessayez ultérieurement" } -------------------------------------------------------- -- Fonction contrôle du code retour HTTP Free Mobile -------------------------------------------------------- function QuickApp:controle_status(status) if Contains(code_retour, tonumber(status)) then self:debug(os.date() .. ' - status = ' .. status .. (code_retour[tonumber(status)])) end end function Contains(table, valeur) for key,value in pairs(table) do if (key == valeur) then return true end end return false end function QuickApp:onInit() self.http = net.HTTPClient({ timeout = 2000 }) self:setVariable("FreeSMS","") self:debug("onInit") end Utilisation: Remplir les champs par identifiant Free Mobile et votre clé d'identification ----------------------------------------------------- -- Paramètres utilisateur ----------------------------------------------------- local username = "IDENTIFIANT FREE" local password = "CLÉ IDENTIFICATION" Créer autant de boutons que souhaité ----------------------------------------------------- -- Paramètrages des boutons avec les messages à envoyer ----------------------------------------------------- function QuickApp:uimsg1OnR(event) self:debug("Message 1") self:sendmsg("Hello World!") end Voilà, c'est mon premier code officiel sur le forum je crois. Soyez indulgent. Je vous joints le fichier complet à adapter en fonction de vos besoins. FreeSMS.fqa
×