Aller au contenu

Rechercher dans la communauté

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



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
    • Annonces et suggestions
    • Nouveau ? Présentez-vous
    • Le bistrot
    • Mon installation domotique
    • Autres Solutions Domotiques
  • La HC2 et ses périphériques
    • La Home Center pour les nuls
    • Home Center 2 & Lite
    • Modules Fibaro
    • Modules Z-wave
    • Périphériques et matériels autres
    • Plugins
    • Alarme & Vidéo-surveillance
    • Multimédia
    • Chauffage et Energie
    • Actionneurs & Ouvrants (Portail, volets...)
    • Eclairage
    • Applications Smartphones et Tablettes
    • English Section
  • Les objets connectés
    • Les Assistants Vocaux
  • Fibaro's Awards
    • Membre du mois
    • Jeux concours & Cadeaux
  • 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

6 résultats trouvés

  1. Introduction : Suite à une discussion tenue il y a quelques temps dans le sujet Accès HC2 de l'extérieur, je propose un tutoriel sur le mise en Å“uvre d'un Reverse Proxy avec HAProxy sur un NAS Synology. Certes, c'est de l'informatique, et non pas de la domotique, mais le but principal est d'accéder à nos équipements domotiques (en particulier les box Fibaro Home Center 2 ou Home Center Lite) depuis l'extérieur. La discussion citée précédemment décrit différentes méthodes d'accès aux ressources du réseau local depuis Internet, notamment la technique du Port Forwarding, qui consiste à ouvrir un port TCP coté WAN pour chaque équipement interne à joindre. Cette méthode fonctionne bien si on se connecte à son HC2 depuis la connexion Internet d'un ami, depuis un hôtel, depuis le partage d'accès 3G/4G de son smartphone, ou depuis une entreprise qui ne filtre pas trop les connexions. Mais la plupart des entreprises mettent en place des proxy filtrants, qui ne laissent assez souvent passer que les ports 80 (HTTP) et 443 (HTTPS). Même les connexions FTP, VPN, SSH, etc... sont bloquées, donc forcément les ports personnalisés qu'on a choisi. Donc on doit mettre en place un Reverse Proxy. Sur Synology, on peut utiliser HAProxy, ou sinon on se créer son propre serveur Linux qui fera le boulot. Le principe de fonctionnement est simple : avec notre domaine DNS, on crée autant de sous-domaines qu'on souhaite joindre d'équipements dans notre LAN. Par exemple, dsm.domaine.com, hc2.domaine.com, ecodevice.domaine.com, etc... dans l'interface d'administration du routeur, on redirige le port TCP 80 externe vers le port 80 du NAS qui héberge HAProxy au sein du LAN. dans la configuration de HAProxy, on crée toutes les règles pour rediriger les sous-domaines vers la bonne adresse IP dans le LAN. Le schéma est donc le suivant : Utilisateur sur le WAN => Routeur ADSL => Reverse Proxy => Equipement final (HC2, ...) Glossaire simplifié des termes employés dans ce tutoriel : LAN = Local Area Network, désigne le réseau local domestique WAN = Wide Area Network, désigne Internet Routeur = équipement réseau assurant la communication entre le LAN et le WAN. En France, nous sommes majoritairement équipés de Box Internet prêtées par les fournisseurs d'accès à Internet, telles que Freebox, LiveBox, etc... Adresse IP = adresse sur 4 nombres (par exemple 192.168.1.1) permettant d'identifier un équipement sur le réseau, que ce soit le LAN ou le WAN. A noter que coté WAN, les adresses IP sont uniques sur tout Internet, tandis que coté LAN, on utilise des plages d'adresses dites "privées" (192.168.x.y, ou 172.16.x.y, ou 10.x.y.z) c'est à dire qu'elle ne sont pas visibles depuis Internet. Le routeur se charge d'effectuer de la translation d'adresse, si bien que lorsque nous surfons sur Internet, ce n'est pas l'adresse IP de notre ordinateur/téléphone/tablette qui est vue, mais l'adresse IP externe du routeur. Adresse IP fixe : l'adresse IP fournie par le fournisseur d'accès à Internet peut être fixe (notamment chez Free) ou variable, c'est à dire qu'elle sera différente à chaque nouvelle connexion (ou tranche de 24h, cela dépend). Les adresses IP fixes sont bien sà»r préférables pour pouvoir se connecter chez soit depuis l'extérieur, mais la méthode du DynDNS existe pour s'en sortir même avec une adresse IP variable. Nom de Domaine DNS : sur Internet, nous n'utilisons couramment pas les adresses IP, mais plutôt les noms de domaine, tels que google.com ou domotique-fibaro.fr. Pour chaque domaine, on peut créer pratiquement autant de sous-domaine que l'on souhaite, qui sont placés en préfixe du nom de domaine. Le plus célèbre d'entre eux est www, ce qui donne www.google.com ou www.domotique-fibaro.fr. Il est bien entendu possible de créer le sous-domaine de son choix, afin d'obtenir des adresses telles que hc2.mondomaine.com, ou ecodevices.mondomaine.fr, ... Limitations de ce tutoriel : Je me limite volontairement à l'utilisation du port 80 avec le protocole http non-sécurisé. En effet, si il pourrait paraitre tentant d'utiliser le protocole https sur le port 443, il faut savoir que nous n'avons qu'un certificat auto-signé, donc non reconnu par les navigateurs Web, et donc également par les proxy d'entreprises, qui peuvent rejeter la connexion pour les plus filtrants, par mesure de sécurité. Le but de mon tutoriel étant de passer au travers d'un maximum de proxy d'entreprise, cela a plus de chance de réussir en utilisant le port 80. Dans la pratique, tant que votre nom de domaine n'est pas blacklisté, cela devrait fonctionner. Si vraiment la sécurité est nécessaire, il faut acheter un certificat SSL et l'importer dans la configuration de HAProxy, ce qui sort du cadre de ce tutoriel. De plus, je tourne sous la version 4.3 de DSM, pour plusieurs raisons : C'est un version stable et en production chez moi Comme j'utilise Xpenology dans une machine virtuelle VMware ESXi, la version 5.0 n'est pas encore suffisamment stable à mon goà»t (les derniers patchs posent problème) Cependant, je pense qu'il est aisé de suivre le tutoriel sous la version 5.0 de DSM qui est assez similaire, exceptée la refonte de l'interface graphique. Pré-requis pour ce tutoriel : Une box/routeur Internet Un NAS Synology Un nom de domaine DNS Une adresse IP fixe, ou à défaut un système de DynDNS Liens permettant d'approfondir le sujet : http://forum.hardware.fr/hfr/reseauxpersosoho/Reseaux/synology-dsm-disponible-sujet_5497_686.htm#t741030 http://www.nas-forum.com/forum/topic/39737-tuto-haproxy-et-regroupement-des-parametrages-trouves-sur-le-fofo/
  2. Bonsoir, Si comme moi vous souhaitez piloter votre TV Sony mais que le Plugin Sony développé par Fibaro ne fonctionne pas, , voici une scéne et un VD qui permettont de piloter la TV via notre HC2. Pour commencer : _ Créer une variable globale en la nommant : cmd_sony_tv _ Créer une scène en LUA et copier ce code : --[[ %% autostart %% properties %% globals --]] local ip = 'xxx.xxx.x.xx' local port = '80' local xAuthPSK = '1111' local irCode = json.decode([[ [ {"name":"Num1","value":"AAAAAQAAAAEAAAAAAw=="}, {"name":"Num2","value":"AAAAAQAAAAEAAAABAw=="}, {"name":"Num3","value":"AAAAAQAAAAEAAAACAw=="}, {"name":"Num4","value":"AAAAAQAAAAEAAAADAw=="}, {"name":"Num5","value":"AAAAAQAAAAEAAAAEAw=="}, {"name":"Num6","value":"AAAAAQAAAAEAAAAFAw=="}, {"name":"Num7","value":"AAAAAQAAAAEAAAAGAw=="}, {"name":"Num8","value":"AAAAAQAAAAEAAAAHAw=="}, {"name":"Num9","value":"AAAAAQAAAAEAAAAIAw=="}, {"name":"Num0","value":"AAAAAQAAAAEAAAAJAw=="}, {"name":"Num11","value":"AAAAAQAAAAEAAAAKAw=="}, {"name":"Num12","value":"AAAAAQAAAAEAAAALAw=="}, {"name":"Enter","value":"AAAAAQAAAAEAAAALAw=="}, {"name":"GGuide","value":"AAAAAQAAAAEAAAAOAw=="}, {"name":"ChannelUp","value":"AAAAAQAAAAEAAAAQAw=="}, {"name":"ChannelDown","value":"AAAAAQAAAAEAAAARAw=="}, {"name":"VolumeUp","value":"AAAAAQAAAAEAAAASAw=="}, {"name":"VolumeDown","value":"AAAAAQAAAAEAAAATAw=="}, {"name":"Mute","value":"AAAAAQAAAAEAAAAUAw=="}, {"name":"TvPower","value":"AAAAAQAAAAEAAAAVAw=="}, {"name":"Audio","value":"AAAAAQAAAAEAAAAXAw=="}, {"name":"MediaAudioTrack","value":"AAAAAQAAAAEAAAAXAw=="}, {"name":"Tv","value":"AAAAAQAAAAEAAAAkAw=="}, {"name":"Input","value":"AAAAAQAAAAEAAAAlAw=="}, {"name":"TvInput","value":"AAAAAQAAAAEAAAAlAw=="}, {"name":"TvAntennaCable","value":"AAAAAQAAAAEAAAAqAw=="}, {"name":"WakeUp","value":"AAAAAQAAAAEAAAAuAw=="}, {"name":"PowerOff","value":"AAAAAQAAAAEAAAAvAw=="}, {"name":"Sleep","value":"AAAAAQAAAAEAAAAvAw=="}, {"name":"Right","value":"AAAAAQAAAAEAAAAzAw=="}, {"name":"Left","value":"AAAAAQAAAAEAAAA0Aw=="}, {"name":"SleepTimer","value":"AAAAAQAAAAEAAAA2Aw=="}, {"name":"Analog2","value":"AAAAAQAAAAEAAAA4Aw=="}, {"name":"TvAnalog","value":"AAAAAQAAAAEAAAA4Aw=="}, {"name":"Display","value":"AAAAAQAAAAEAAAA6Aw=="}, {"name":"Jump","value":"AAAAAQAAAAEAAAA7Aw=="}, {"name":"PicOff","value":"AAAAAQAAAAEAAAA+Aw=="}, {"name":"PictureOff","value":"AAAAAQAAAAEAAAA+Aw=="}, {"name":"Teletext","value":"AAAAAQAAAAEAAAA\/Aw=="}, {"name":"Video1","value":"AAAAAQAAAAEAAABAAw=="}, {"name":"Video2","value":"AAAAAQAAAAEAAABBAw=="}, {"name":"AnalogRgb1","value":"AAAAAQAAAAEAAABDAw=="}, {"name":"Home","value":"AAAAAQAAAAEAAABgAw=="}, {"name":"Exit","value":"AAAAAQAAAAEAAABjAw=="}, {"name":"PictureMode","value":"AAAAAQAAAAEAAABkAw=="}, {"name":"Confirm","value":"AAAAAQAAAAEAAABlAw=="}, {"name":"Up","value":"AAAAAQAAAAEAAAB0Aw=="}, {"name":"Down","value":"AAAAAQAAAAEAAAB1Aw=="}, {"name":"ClosedCaption","value":"AAAAAgAAAKQAAAAQAw=="}, {"name":"Component1","value":"AAAAAgAAAKQAAAA2Aw=="}, {"name":"Component2","value":"AAAAAgAAAKQAAAA3Aw=="}, {"name":"Wide","value":"AAAAAgAAAKQAAAA9Aw=="}, {"name":"EPG","value":"AAAAAgAAAKQAAABbAw=="}, {"name":"PAP","value":"AAAAAgAAAKQAAAB3Aw=="}, {"name":"TenKey","value":"AAAAAgAAAJcAAAAMAw=="}, {"name":"BSCS","value":"AAAAAgAAAJcAAAAQAw=="}, {"name":"Ddata","value":"AAAAAgAAAJcAAAAVAw=="}, {"name":"Stop","value":"AAAAAgAAAJcAAAAYAw=="}, {"name":"Pause","value":"AAAAAgAAAJcAAAAZAw=="}, {"name":"Play","value":"AAAAAgAAAJcAAAAaAw=="}, {"name":"Rewind","value":"AAAAAgAAAJcAAAAbAw=="}, {"name":"Forward","value":"AAAAAgAAAJcAAAAcAw=="}, {"name":"DOT","value":"AAAAAgAAAJcAAAAdAw=="}, {"name":"Rec","value":"AAAAAgAAAJcAAAAgAw=="}, {"name":"Return","value":"AAAAAgAAAJcAAAAjAw=="}, {"name":"Blue","value":"AAAAAgAAAJcAAAAkAw=="}, {"name":"Red","value":"AAAAAgAAAJcAAAAlAw=="}, {"name":"Green","value":"AAAAAgAAAJcAAAAmAw=="}, {"name":"Yellow","value":"AAAAAgAAAJcAAAAnAw=="}, {"name":"SubTitle","value":"AAAAAgAAAJcAAAAoAw=="}, {"name":"CS","value":"AAAAAgAAAJcAAAArAw=="}, {"name":"BS","value":"AAAAAgAAAJcAAAAsAw=="}, {"name":"Digital","value":"AAAAAgAAAJcAAAAyAw=="}, {"name":"Options","value":"AAAAAgAAAJcAAAA2Aw=="}, {"name":"Media","value":"AAAAAgAAAJcAAAA4Aw=="}, {"name":"Prev","value":"AAAAAgAAAJcAAAA8Aw=="}, {"name":"Next","value":"AAAAAgAAAJcAAAA9Aw=="}, {"name":"DpadCenter","value":"AAAAAgAAAJcAAABKAw=="}, {"name":"CursorUp","value":"AAAAAgAAAJcAAABPAw=="}, {"name":"CursorDown","value":"AAAAAgAAAJcAAABQAw=="}, {"name":"CursorLeft","value":"AAAAAgAAAJcAAABNAw=="}, {"name":"CursorRight","value":"AAAAAgAAAJcAAABOAw=="}, {"name":"ShopRemoteControlForcedDynamic","value":"AAAAAgAAAJcAAABqAw=="}, {"name":"FlashPlus","value":"AAAAAgAAAJcAAAB4Aw=="}, {"name":"FlashMinus","value":"AAAAAgAAAJcAAAB5Aw=="}, {"name":"AudioQualityMode","value":"AAAAAgAAAJcAAAB7Aw=="}, {"name":"DemoMode","value":"AAAAAgAAAJcAAAB8Aw=="}, {"name":"Analog","value":"AAAAAgAAAHcAAAANAw=="}, {"name":"Mode3D","value":"AAAAAgAAAHcAAABNAw=="}, {"name":"DigitalToggle","value":"AAAAAgAAAHcAAABSAw=="}, {"name":"DemoSurround","value":"AAAAAgAAAHcAAAB7Aw=="}, {"name":"*AD","value":"AAAAAgAAABoAAAA7Aw=="}, {"name":"AudioMixUp","value":"AAAAAgAAABoAAAA8Aw=="}, {"name":"AudioMixDown","value":"AAAAAgAAABoAAAA9Aw=="}, {"name":"PhotoFrame","value":"AAAAAgAAABoAAABVAw=="}, {"name":"Tv_Radio","value":"AAAAAgAAABoAAABXAw=="}, {"name":"SyncMenu","value":"AAAAAgAAABoAAABYAw=="}, {"name":"Hdmi1","value":"AAAAAgAAABoAAABaAw=="}, {"name":"Hdmi2","value":"AAAAAgAAABoAAABbAw=="}, {"name":"Hdmi3","value":"AAAAAgAAABoAAABcAw=="}, {"name":"Hdmi4","value":"AAAAAgAAABoAAABdAw=="}, {"name":"TopMenu","value":"AAAAAgAAABoAAABgAw=="}, {"name":"PopUpMenu","value":"AAAAAgAAABoAAABhAw=="}, {"name":"OneTouchTimeRec","value":"AAAAAgAAABoAAABkAw=="}, {"name":"OneTouchView","value":"AAAAAgAAABoAAABlAw=="}, {"name":"DUX","value":"AAAAAgAAABoAAABzAw=="}, {"name":"FootballMode","value":"AAAAAgAAABoAAAB2Aw=="}, {"name":"iManual","value":"AAAAAgAAABoAAAB7Aw=="}, {"name":"Netflix","value":"AAAAAgAAABoAAAB8Aw=="}, {"name":"Assists","value":"AAAAAgAAAMQAAAA7Aw=="}, {"name":"ActionMenu","value":"AAAAAgAAAMQAAABLAw=="}, {"name":"Help","value":"AAAAAgAAAMQAAABNAw=="}, {"name":"TvSatellite","value":"AAAAAgAAAMQAAABOAw=="}, {"name":"WirelessSubwoofer","value":"AAAAAgAAAMQAAAB+Aw=="} ] ]]) function printIrCode() for i in pairs(irCode) do print(irCode[i].name) end end function irCodeLookup(irName) for i in pairs(irCode) do if (irCode[i].name == irName) then return irCode[i].value end end end -- Escape string to make suitable for embedding in HTML. function htmlize(s) s = s:gsub('&', '&') s = s:gsub('<', '<') s = s:gsub('>', '>') return s end --Helper for priniting nested table function deep_print(tbl) if (type(tbl) == "table") then for i, v in pairs(tbl) do if type(v) == "table" then deep_print(v) else print(i, v) end end else print(htmlize(tbl)); end end local successCallback = function(resp) print('At ' .. os.date() .. ' - status = ' .. resp.status) deep_print(resp.data) end local errorCallback = function(err) print('error = ' .. err) end function sendIrCode(name) local value = irCodeLookup(name) if (value == nil) then print('IR Code not found') return end local httpClient = net.HTTPClient(); httpClient:request('http://'..ip..':'..port..'/sony/IRCC', { success = successCallback, error = errorCallback, options = { method = 'POST', headers = { ['Content-Type'] = 'text/xml; charset=UTF-8', ['X-Auth-PSK'] = xAuthPSK, ['User-Agent'] = 'HC2/537.36 (KHTML, like Gecko)', ['SOAPACTION'] = '"urn:schemas-sony-com:service:IRCC:1#X_SendIRCC"' }, data = [[<?xml version="1.0"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:X_SendIRCC xmlns:u="urn:schemas-sony-com:service:IRCC:1"><IRCCCode>]]..value..[[</IRCCCode></u:X_SendIRCC></s:Body></s:Envelope>]] } }); end local value = fibaro:getGlobalValue("cmd_sony_tv"); if (string.len(value) > 0) then print(''..value) sendIrCode(value) end _ Renseigner l'adresse IP de votre TV dans la scène. _ Importer le VD : Telecommande_Sony_TV.vfib _ Noter l"ID de la scène créée et renseigner l'id pour chaque bouton du VD dans la ligne : fibaro:startScene(4); Il est possible d'ajouter des boutons supplémentaires (se référer aux commandes qui se trouvent au début de la scène). J'ai mis les fonctions principales dont je me sers le plus souvent donc libre à vous de personnaliser votre télécommande en fonction de vos besoin. Je tiens à remercier @Krikroff pour son aide et sa dispo Toujours prêt à rendre service notre Jc.
  3. Présentation Voici un Module Virtuel permettant de activer/désactiver les caméras, et démarrer/arrêter l'enregistrement des caméras gérées par l'outil Surveillance Station qu'on trouve sur les NAS Synology. Ce module permet également de piloter le positionnement PTZ des caméras motorisées. Ce module virtuel dispose de 5 boutons : Start : démarrer l'enregistrement Stop : arrêter l'enregistrement Enable : activer la/les caméra(s) Disable : désactiver la/les caméra(s) List : permet de récupérer l'ID des caméras connues par Surveillance Station. Pour utiliser ce bouton, il faut ouvrir la fenêtre de Debug car c'est pour le moment la seule façon que j'ai trouvé d'afficher les informations à l'écran. Ainsi que d'un nombre de boutons paramétrables : Un bouton pour chaque position mémoriséeDe plus, la main loop permet de surveiller le statut des caméras et d'adapter l’icône du module virtuel en conséquence. . Pré-requis : Au moins une caméra doit être gérée par Surveillance Station : Il est conseillé de paramétrer la caméra en détection de mouvement permanente : Si la caméra en est capable, des positions prédéfinies doivent être mémorisées pour les caméras à piloter : . Création d'un utilisateur dédié : Bien que non-obligatoire, il est conseillé pour des raisons de sécurité de créer un utilisateur dédié dans DSM. Ainsi, le mot de passe du compte admin n'est pas exposé dans le code source du module virtuel. Note : la version 4.3 est utilisée pour les screenshots suivants, mais la méthode est strictement identique pour les versions 5.x de DSM. Ouvrir le panneau de configuration : Ouvrir le panneau des utilisateurs : Cliquer sur le bouton "Créer", et entrer les informations utiles. Note : il est judicieux de cocher la case "Ne pas autoriser l'utilisateur à changer le mot de passe du compte" : Cocher le groupe "users" : Cocher les cases "Pas d'accès" pour l'ensemble des dossiers partagés : Ne rien cocher : Décocher les cases de tous les privilèges, et ne cocher que la case "Surveillance Station" : Ne rien modifier : Vérifier que tout est bon, et cliquer sur le bouton "Appliquer" : De retour dans Surveillance Station, ouvrir le panneau Utilisateur, puis sélectionner l'utilisateur Fibaro préalablement créé, et cliquer sur le bouton "Modifier" : Dans la liste déroulante "Profil de privilège", sélectionner "Gestionnaire tout objet", puis cliquer sur le bouton "OK" : L'utilisateur dispose maintenant des droits Directeur : . Import du module virtuel : Dans l'interface du Home Center 2, importer le fichier Surveillance_Station.vfib : Modifier les icônes du module et de tous les boutons avec les images suivantes : Module virtuel : surveillancestation_128.png Start : surveillancestation_rec_128.png Stop : surveillancestation_stop_128.png Enable : surveillancestation_enable_128.png Disable : surveillancestation_disable_128.png List : surveillancestation_list_128.png Move : surveillancestation_ptz_128.png . Configuration : Modifier les propriétés du module virtuel, et entrer les informations correctes pour joindre le Synology : Adresse IP et Port TCP : Modifier les propriétés avancées du module virtuel, et modifier les premières lignes de chacun des boutons avec vos paramètres : -- User configurable variables local login = "user" -- Utilisateur Synology local password = "password" -- Mot de passe Synology. Pour les boutons PTZ, il faut spécifier le preset correspondant à chaque bouton (la caméra positionnée sera obligatoirement la première caméra listée dans la main loop, voir plus bas) : local preset = 1 -- ID de la position PTZ . Pour récupérer l'ID des caméras, et les ID des positions PTZ, il faut utiliser le mode "Debug" sur le bouton "List". Dans l'exemple ci-dessous, il y a une seule caméra avec l'ID n°2, et 4 positions PTZ avec les ID n°1, 2, 3, 4 : . Remarque : lors de l'importation du module virtuel, le Virtual Device possède 4 boutons PTZ, mais ceci est à modifier en fonction de votre propre environnement. Il faut 1 bouton par position et par caméra. Main Loop : Ce module virtuel dispose d'une Main Loop qui surveille le statut des caméras avec un intervalle de rafraichissement de 10 secondes et met à jour : l’icône du module virtuel un label du module virtuel une variable globale Pour la configuration de cette main loop, il faut modifier les paramètres suivants : login : Utilisateur Synology password : Mot de passe Synology cameras : {0} => détection automatique des caméras. Par conséquent, les boutons d'action Enable/Disable/Start/Stop agiront sur toutes les caméras simultanément. {1} ou {2} ou {1, 2, 3} ... => ID de la (ou des) caméra(s) à gérer. On peut envisager de ne piloter qu'une seule caméra, et de multiplier les modules virtuels, afin que chaque module virtuel ne soit responsable que d'une seule caméra (voir aussi VG_status ci-dessous) VG_status : SurvStation_Status => variable globale par défaut créée automatiquement, qui contient le statut de la (ou des) caméra(s), pouvant être exploité dans des scripts LUA. Valeur personnalisée => nécessaire si plusieurs instances du VD afin de piloter différentes caméras (voir aussi cameras ci-dessus). Celle-ci sera également automatiquement créée au démarrage du VD. refresh : intervalle de rafraichissement du statut, par défaut à 10 secondes. standbyIcon, recordIcon, disableIcon : ID des icônes Standby, Recording, et Disabled -- User configurable variables local login = "user" local password = "password" local cameras = {0} -- {1,2,4,5,6} -- Liste de une ou plusieurs caméras, pour les boutons Start, Stop, Enable, Disable local VG_status = "SurvStation_Status" local refresh = 10 -- seconds local standbyIcon = 1010 local recordIcon = 1011 local disableIcon = 1029 Pour récupérer les ID des 3 icônes, le plus simple est d'utiliser le Toolkit HC2 de Krikroff, on sélectionne l'onglet Virtual Devices, puis Get API Raw Data, puis là on cherche la valeur du paramètre buttonIcon des boutons Start, Stop, et Disable : . Utilisation : - Un clic sur les boutons "Enable" ou "Disable", a pour effet d'activer/désactiver la caméra dans Surveillance Station, donc d'activer ou désactiver la détection de mouvement par le Syno. - Un clic sur le bouton "Start" a pour effet de forcer le démarrage de l'enregistrement continu des caméras sur le disque dur du NAS. - Un clic sur le bouton "Stop" a pour effet d'arrêter l'enregistrement continu des caméras, qui est équivalent à repasser en détection de mouvement - Un clic sur les boutons de position PTZ permet de déplacer la caméra. - La Main Loop surveille l'enregistrement des caméras, et ajuste l’icône du module virtuel en conséquence, ainsi qu'un petit message en vert en bas du module si un enregistrement est en cours. Ensuite, vous pouvez appeler ces boutons depuis vos scènes, par exemple à heure fixe programmée, ou en fonction des scénarios tels que la mise en fonctionnement de l'alarme, ou la détection de mouvement. . Changelog : v1.0 : Initial release v1.01 : Minor bug fixes v2.0 : Main Loop and PTZ control v4.0 : Improved main loop, Add Enable/Disable buttons, Add cameras auto-detection v4.3 : Improved SID connection, added Status global variable v4.4 : Enhanced management of single or multiple camera SurveillanceStation_v1.01.zip SurveillanceStation_v2.zip SurveillanceStation_v4.zip SurveillanceStation_v4.3.zip SurveillanceStation_v4.4.zip
  4. Je vous partage mon script que j'ai créer pour être régulièrement notifié de ma production photovoltaà¯que. A savoir que ce script est facilement adaptable pour suivre sa consommation Electrique générale compteur + coà»t Petit rappel pour récupérer les valeur de l'écodevice et envoyer cela dans des variables : HC2 = Net.FHttp("192.168.0.151")-- ip de l'écodevice response = HC2:GET("/api/xdevices.json?cmd=10") -- enregistrement du retour de l API dans une table response = json.decode(response) fibaro:setGlobal("ABO", response.T1_PTEC) fibaro:setGlobal("CONSO", response.T1_PAPP) fibaro:setGlobal("IHP", response.T1_HCHP) fibaro:setGlobal("IHC", response.T1_HCHC) fibaro:setGlobal("PROD", response.T2_PAPP) fibaro:setGlobal("INDEXPROD", response.T2_BASE) fibaro:log(fibaro:getGlobalValue("CONSO").." W Tarif : "..fibaro:getGlobalValue("ABO").." Index HP : "..fibaro:getGlobalValue("IHP").." Index HC :" ..fibaro:getGlobalValue("IHC") ) Tout d'abord, il va falloir créer 4 variables globales: -index ( index relevé à minuit ) -indexprod ( index à l'instant "t" ) -indexmois ( index relevé le 1er du mois ) -index28/07 ( index relevé à la date du contrat erdf ) J'ai crée un vd avec 4 boutons, 3 boutons renseignent donc ces variables à des moments précis --récupération de l'index de production local indexprod = fibaro:getGlobal("INDEXPROD") fibaro:debug(indexprod) --affectation de la prod dans la var "index" / a faire à minuit fibaro:setGlobal("index", indexprod); --récupération de l'index de production local indexprod = fibaro:getGlobal("INDEXPROD") fibaro:debug(indexprod) --affectation de la prod dans la var "indexmois" / a faire au 1er du mois fibaro:setGlobal("indexmois", indexprod); --recupération de l'index de production local indexprod = fibaro:getGlobal("INDEXPROD") fibaro:debug(indexprod) --affectation de la prod dans la var "index2807" / a faire à la date souhaitée fibaro:setGlobal("index2807", indexprod); Le dernier bouton servant à faire les relevés d'index et calcul : -- Formattage des chiffres --- function formatIndex(value) local sous = (indexprod - value)/1000;--soustraction return string.format("%010.3f", sous) end indexprod = tonumber(fibaro:getGlobal("INDEXPROD") or 0); fibaro:debug("index actuel: "..indexprod.."");--récup prod actuelle local index = tonumber(formatIndex(tonumber(fibaro:getGlobal("index") or 0))); local minuit = tonumber(fibaro:getGlobal("index") or 0); fibaro:debug("index à minuit: "..minuit.."");--récup prod à minuit local indexmois = tonumber(formatIndex(tonumber(fibaro:getGlobal("indexmois") or 0))); local mois = tonumber(fibaro:getGlobal("indexmois") or 0); fibaro:debug("index au 1er: "..mois.."")--récup prod du mois local index2807 = tonumber(formatIndex(tonumber(fibaro:getGlobal("index2807") or 0))); local date = tonumber(fibaro:getGlobal("index2807") or 0); fibaro:debug("index au 28/07: "..date.."")--récup prod à la date choisie local euro = tonumber(0.465)--prix d'achat erdf --------------- local prixjour = (euro * index) jour = string.sub(prixjour, 1, 4) --fibaro:debug(jour) fibaro:debug("Prod du jour : "..index.." Kwh - soit: "..jour.." €"); ------------- local prixmois = (euro * indexmois) mois = string.sub(prixmois, 1, 6) --fibaro:debug(mois) fibaro:debug("Prod du mois : "..indexmois.." Kwh - soit: "..mois.." €"); ------------- local prixannee = (euro * index2807) annee = string.sub(prixannee, 1, 7) --fibaro:debug(annee) fibaro:debug("Prod depuis le 28/07 : "..index2807.." Kwh - soit: "..annee.." €"); ------------- message = ("Production solaire du jour : "..index.." Kwh - soit: "..jour.." € / Production mensuelle : "..indexmois.." Kwh - soit: "..mois.." € / Production annuelle :"..index2807.." Kwh - soit: "..annee.." €") fibaro:debug(message); fibaro:setGlobal("pushover", message); fibaro:call(198, "pressButton", "2"); --pushover lua fibaro:sleep(1000); fibaro:setGlobal("pushover", "" );--raz variable En "debug" : [DEBUG] 18:19:32: index actuel: 8715878 [DEBUG] 18:19:32: index à minuit: 8698402 [DEBUG] 18:19:32: index au 1er: 8485402 [DEBUG] 18:19:32: index au 28/07: 6340400 [DEBUG] 18:19:32: 8.12 [DEBUG] 18:19:32: Prod du jour : 17.476 Kwh - soit: 8.12 € [DEBUG] 18:19:32: 107.17 [DEBUG] 18:19:32: Prod du mois : 230.476 Kwh - soit: 107.17 € [DEBUG] 18:19:32: 1104.59 [DEBUG] 18:19:32: Prod depuis le 28/07 : 2375.478 Kwh - soit: 1104.59 € [DEBUG] 18:19:32: Production solaire du jour : 17.476 Kwh - soit: 8.12 € / Production mensuelle : 230.476 Kwh - soit: 107.17 € / Production annuelle :2375.478 Kwh - soit: 1104.59 € Personnellement, j'ai choisi d’être informé 2 fois par jour avec l'application "pushover". J'ai donc créé une scène qui "appui" sur le bouton n°4 et qui me notifie quotidiennement ma production :
  5. Je souhaitais me simplifier la vie et pouvoir confirmer un ordre par TTS sur mes squeezebox (ex l'allumage du fer à repasser depuis le second alors qu'il est au sous-sol). J'en ai 5 (Cuisine, Salon, Garage, Chambre du Haut et Chambre du Bas). J'ai donc fait un module virtuel "EmissionSqueeze" qui me permet d'émettre une phrase depuis n'importe qu'elle scène (ou bouton) en 5 lignes ! Voici le code qui vous permettra d'appeler ce module virtuel en 4 ligne depuis n'importe où : -- Faire un copier/coller de ce code dans le bouton -- depuis lequel on souhaite diffuser un message -- Le niveau sonore est attribué à chaque squeeze individuellement -- à la suite du nom avec comme valeur de 01 à 99 (pas 100 ! on doit rester sur 2 chiffres) -- SqueezeNom -> Cuisine ; Salon ; ChambreB ; ChambreH ; Garage -- Attention à ne pas se tromper sur l'orthographe des Squeezes !!! -- Messager -> Texte pour la TTS (inutile de mettre des %20) --Liste des squeezes sous la forme {"Cuisine30","Garage80","Salon60","ChambreH30","ChambreB50"} local ListeSqueeze = {"Cuisine55","Garage99","Salon60","ChambreH30","ChambreB30"} fibaro:setGlobal("SqueezeNom" , json.encode(ListeSqueeze)) -- Taper le message fibaro:setGlobal('Messager' , "Ouverture du portail") fibaro:call(144, "pressButton", "1"); -- fin annonce Squeezebox Voici le code principal du bouton 1 du module virtuel 144 : -- JossAlf ; 02/07/14 (V2.1) 21/06/14 (V2.0) 17/06/14 (V1.3) ; 22/05/14 (V1.1) ; 23/05/14 (V1.2) -- V2.1 : Ajout du réglage individuel duniveau sonore pour chaque squeeze en ajoutant 2 chiffre après le nom -- V2.0 : Simplification du code et possibilité d'allumer 1,2,3,4 ou 5 squeeze. -- Scène permettant simplifier la diffusion de messages sur 1 ou plusieurs squeezeboxes. -- Nécessite de créer les Variables Globales : SqueezeNom ; Messager -- (Ne pas utiliser dans une scène le json bug) -- l'appel de module virtuel se fera dans un autre module virtuel de façon simple -- en affectant les valeurs aux variables Globales -- puis en simulant le clic sur un bouton : exemple -> fibaro:call(144, "pressButton", "1"); local ListeSqueeze = fibaro:getGlobal("SqueezeNom"); local TableauSqueezeNom = json.decode(ListeSqueeze); local player = nil -- Adresse IP du Logitech Media Server local ipadd = "192.168.0.46" -- le port du serveur local portno = 9090 local Squeezers = { ['Cuisine'] = "00:04:xx:xx:xx:00 ", ['Salon'] = "00:04:xx:xx:xx:3e ", ['ChambreB'] = "00:04:xx:xx:xx:fe ", ['ChambreH'] = "00:04:xx:xx:xx:ba ", ['Garage'] = "00:04:xx:xx:xx:bc ", } --On allume toutes les squeezes for i = 1, #TableauSqueezeNom do --on récupère uniquement le nom en retirant les 2 derniers caractères qui correspondent au niveau sonore local player = string.sub(TableauSqueezeNom[i], 1 , -3) fibaro:debug(player) local player = Squeezers[player] local cmnd = "power 1 " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) -- on règle le son -- on prend que les 2 dernier caractères qui correspondent au niveau sonore. local VolumeSon = string.sub(TableauSqueezeNom[i], -2) local cmnd = "mixer volume " .. VolumeSon .. " " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) end -- on laisse une seconde pour laisser le temps à toutes les squeeze de s'allumer fibaro:sleep(1000) -- On envoie le message en utilisant la première radio local player = string.sub(TableauSqueezeNom[1], 1 , -3) local player = Squeezers[player] local notification = fibaro:getGlobalValue('Messager') -- On remplace les espaces par des %20 local notification = string.gsub((notification)," ", "%%20"); fibaro:debug(notification) -- Attention google ne fonctionne plus il vaut mieux utiliser VoiceRSS pour le TTS -- local cmnd = "playlist play http://translate.google.com/translate_tts?tl=FR&ie=UTF-8&q=" .. notification; -- Voicerss TTS local cmnd = "playlist play http://www.voicerss.org/controls/speech.ashx?hl=fr-fr&src=" .. notification; local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) -- OFF des squeezeBoxs après 10 secondes fibaro:sleep(20*1000) -- on éteint les squeezes for i = 1, #TableauSqueezeNom do fibaro:debug("debut de la boucle") local player = string.sub(TableauSqueezeNom[i], 1 , -3) local player = Squeezers[player] local cmnd = "power 0 " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) end MAJ : Simplification du code avec une boucle et le passage des "paramètres" sous forme de variable traduite en tableau en passant par un json. On peux maintenant choisir d'émettre sur une ou plusieurs radio en les nommants. Attention à bien renseigner le nom de votre squeeze avec le niveau sonore collé (exemple "Cuisine80") si non ... Pour la diffusion d'un message/fichier MP3, se référer au message 20 de ce sujet. PS : Merci à Steven pour le coup du Json (pour obtenir un tableau) et pour Shad et la boucle "for". MAJ2 : Evolution du code afin de choisir individuellement le niveau sonore des squeezer. MAJ3 : Google ne fonctionne plus en lien directe (à la ligne 62) Je l'ai remplacé par VoiceRSS (ligne 65) qui fait très bien le travail http://www.voicerss.org/controls/speech.ashx?hl=fr-fr&src= J'en parle ici : #80
  6. Shad

    Association De Module

    Associations des Modules Ce tutoriel à pour but d'expliquer comment associer efficacement des modules entre eux tous en évitant de faire des changements d'états inutiles. Pour quoi éviter les associations avec la Fibaro: Trop fouillis pour moi Faut une bonne mémoire pour ce rappeler de toutes les associations Peut-être difficile à débugger en cas de problème 1- Pour commencer l'entête du script, on y mettra les ID qui doivent démarrer la scène: --[[ %% properties 12 value 50 value 60 value 64 value %% globals --]] 2- On définie nos locals et nos modules : local startSource = fibaro:getSourceTrigger(); --Settings debug = "no"; --IdDevice lightMasterBathRoom = 12; ledMasterBathRoom = 26; rgbwMasterBathRoom = 30; lightKitchen = 60; lightSalleManger = 64; lightSalleManger2 = 62; spotKitchen = 88; lightRoom2 = 50; light2Room2 = 52; La fonction debug affichera en rouge un turnOn, en bleue un turOn, en vert un valeur et en orange la valeur et l'id de lu module de commande 3- La fonction qui permet d'éviter les changements d'états inutile. function StateDevice (typeDevice, idDevice, valueDevice) if (typeDevice == "contactDevice") then if (valueDevice == "turnOff") then if ( tonumber(fibaro:getValue(idDevice, "value")) == 1) then fibaro:call(idDevice, "turnOff"); if (debug == "yes") then fibaro:debug("<font color='blue'>Id: " .. idDevice .. ", value: TurnOff</font> "); end end elseif (valueDevice == "turnOn") then if ( tonumber(fibaro:getValue(idDevice, "value")) == 0) then fibaro:call(idDevice, "turnOn"); if (debug == "yes") then fibaro:debug("<font color='red'>Id: " .. idDevice .. ", value: TurnOn </font> "); end end end end if (typeDevice == "RgbwDevice") then if (valueDevice == "turnOff") then if ( tonumber(fibaro:getValue(idDevice, "value")) ~= 0) then fibaro:call(idDevice, "turnOff"); if (debug == "yes") then fibaro:debug("<font color='blue'>Id: " .. idDevice .. ", value: TurnOff </font> "); end end elseif (valueDevice == "turnOn") then if ( tonumber(fibaro:getValue(idDevice, "value")) == 0) then fibaro:call(idDevice, "turnOn"); if (debug == "yes") then fibaro:debug("<font color='red'>Id: " .. idDevice .. ", value: TurnOn </font> "); end end end end if (typeDevice == "DimmerDevice") then if (valueDevice == "turnOn" or valueDevice == "turnOff") then if (valueDevice == "turnOff") then if ( tonumber(fibaro:getValue(idDevice, "value")) ~= valueDevice) then fibaro:call(idDevice, "turnOff"); if (debug == "yes") then fibaro:debug("<font color='blue'>Id: " .. idDevice .. ", value: TurnOff </font> "); end end elseif (valueDevice == "turnOn") then if ( tonumber(fibaro:getValue(idDevice, "value")) == valueDevice) then fibaro:call(idDevice, "turnOn"); if (debug == "yes") then fibaro:debug("<font color='red'>Id: " .. idDevice .. ", value: TurnOn </font> "); end end end elseif ( tonumber(fibaro:getValue(idDevice, "value")) ~= valueDevice) then fibaro:call(idDevice, "setValue", valueDevice); if (debug == "yes") then fibaro:debug("<font color='green'>Id: " .. idDevice .. ", value: " .. valueDevice .. " </font> "); end end elseif (typeDevice == "contactBlind") then if (valueDevice == "Close" or valueDevice == "Open") then if (valueDevice ~= "Close") then if ( tonumber(fibaro:getValue(idDevice, "value")) ~= 0) then fibaro:call(idDevice, "close"); if (debug == "yes") then fibaro:debug("<font color='blue'>Id: " .. idDevice .. ", value: Fermé </font> "); end end elseif (valueDevice == "Open") then if ( tonumber(fibaro:getValue(idDevice, "value")) ~= 99) then fibaro:call(idDevice, "open"); if (debug == "yes") then fibaro:debug("<font color='red'>Id: " .. idDevice .. ", value: Ouvert </font> "); end end end elseif ( tonumber(fibaro:getValue(idDevice, "value")) ~= valueDevice) then fibaro:call(idDevice, "setValue", valueDevice); if (debug == "yes") then fibaro:debug("<font color='green'>Id: " .. idDevice .. ", value: " .. valueDevice .. " </font> "); end end end end La fonction StateDevice a besoin de 3 paramètres: typeDevice qui a pour valeur: contactDevice/RgbwDevice/DimmerDevice/contactBlind idDevice: l'id du device qu'il faut modifier l'état valueDevice qui a pour valeur: turnOn/turnOff/Close/Open/0-99 Attention, vue qu'il y a un problème pour les volets avec la box, le contactBlind ne fonctionne pas. 4- Et pour finir on met notre code d'associations: if (startSource['type']=='property') then if (debug == "yes") then fibaro:debug("<font color='green'>Id:" .. startSource['deviceID'] .. ", value: " .. tonumber(fibaro:getValue(startSource['deviceID'], "value")) .. "</font> "); end -- Lumière salle de bain Master if (startSource['deviceID'] == lightMasterBathRoom) then if ( tonumber(fibaro:getValue(lightMasterBathRoom, "value")) == 99 ) then StateDevice ("contactDevice", ledMasterBathRoom, "turnOn"); StateDevice ("RgbwDevice", rgbwMasterBathRoom, "turnOn"); elseif ( tonumber(fibaro:getValue(lightMasterBathRoom, "value")) <= 95 ) then StateDevice ("contactDevice", ledMasterBathRoom, "turnOff"); StateDevice ("RgbwDevice", rgbwMasterBathRoom, "turnOff"); end elseif (startSource['deviceID'] == lightKitchen) then if ( tonumber(fibaro:getValue(lightKitchen, "value")) == 99 ) then StateDevice ("contactDevice", spotKitchen, "turnOn"); elseif ( tonumber(fibaro:getValue(lightKitchen, "value")) < 99 ) then StateDevice ("contactDevice", spotKitchen, "turnOff"); end elseif (startSource['deviceID'] == lightRoom2) then if ( tonumber(fibaro:getValue(lightRoom2, "value")) == 99 ) then --StateDevice ("contactDevice", spotKitchen, "turnOn"); fibaro:call(52, "setValue", "99") elseif ( tonumber(fibaro:getValue(lightRoom2, "value")) < 99 ) then --StateDevice ("contactDevice", spotKitchen, "turnOff"); fibaro:call(52, "setValue", "0") end elseif (startSource['deviceID'] == lightSalleManger) then StateDevice ("DimmerDevice", lightSalleManger2, fibaro:getValue(lightSalleManger, "value")); end end Je vous ai mis qu'une partie de mon code pour voir un peu le fonctionnement. Amusez-vous bien.
×