Commandez vos enceintes Sonos depuis Domoticz

Standard

L’intégration de Sonos avec Domoticz permet de déclencher des scenarii  de démarrage pour le réveil du matin ou de mise en veille lorsque la maison est vide. Voici comment intégrer Sonos à Domoticz avec un exemple simple des actions Pause et Play sur une zone Sonos.

Node JS Sonos HTTP API

Tout d’abord, il nous faut installer node-sonos-http-api disponible sur GitHub : https://github.com/jishi/node-sonos-http-api

L’installation de ce module node est un jeu d’enfant. Il faut bien entendu une version de Node supérieure à la 0.10.

$ wget http://node-arm.herokuapp.com/node_latest_armhf.deb 
$ sudo dpkg -i node_latest_armhf.deb

Pour tester que Node est bien installé :

$ node -v

Télécharger node-sonos-http-api depuis GitHub ou simplement faites un clone si vous avez Git déjà installé :

$ git clone https://github.com/jishi/node-sonos-http-api.git

Puis, depuis la racine du dossier node-sonos-http-api executez les commandes pour effectuer l’installation :

$ cd node-sonos-http-api/
$ npm install

L’installation terminée, il suffit de lancer le serveur :

$ node server.js

Vos enceintes Sonos peuvent maintenant être commandées en HTTP en appelant simplement les URLs suivantes :

http://localhost:5005/zones
http://localhost:5005/next
http://localhost:5005/previous/
http://localhost:5005/pauseall/
http://localhost:5005/<nom de la zone>/play
http://localhost:5005/<nom de la zone>/pause
http://localhost:5005/<nom de la zone>/next
http://localhost:5005/<nom de la zone>/previous
http://localhost:5005/<nom de la zone>/sleep/
...

Intégration avec Domoticz

L’intégration avec domoticz peut se faire très simplement avec un bouton Media Player pour allumer ou éteindre la musique dans une pièce. Cliquez sur l’onglet « Interrupteurs », puis sur le bouton « Ajout manuel ».

Configuration d'un bouton Media Player

Ajoutez le dispositif puis rendez-vous dans l’onglet interrupteurs.

Dans les script en position On et Off configurez les appels HTTP.

configuration-media-player-2En position ON : http://localhost:5005/<nom de la zone>/play
En position OFF : http://localhost:5005/<nom de la zone>/pause

Pour les espaces et les caractères spéciaux, convertissez les en entités HTML. Le plus simple pour cela c’est de taper l’URL avec espace dans Firefox, elle sera convertie automatiquement.

widget-media-playerEt voilà, le bouton est prêt à l’emploi.

Démarrer le serveur node-sonos-http-api en tant que service Linux

Pour que le server.js démarre au démarrage de Linux et il faut tout d’abord installer pm2. Pour l’installer :

$ sudo npm install pm2 -g

Le démarrage du server en tant que service ce fait comme ceci (ne pas oublier l’option -x correspondant au mode fork, dans le cas contraire le process consommera 100% du CPU) :

$ pm2 -x start node_modules/node-sonos-http-api/server.js --name "node-sonos"

[PM2] Spawning PM2 daemon

[PM2] PM2 Successfully daemonized
[PM2] Starting node_modules/node-sonos-http-api/server.js in fork_mode (1 instance)
[PM2] Done.
┌────────────┬────┬──────┬──────┬────────┬─────────┬────────┬────────────┬──────────┐
│ App name   │ id │ mode │ pid  │ status │ restart │ uptime │ memory     │ watching │
├────────────┼────┼──────┼──────┼────────┼─────────┼────────┼────────────┼──────────┤
│ node-sonos │ 0  │ fork │ 9361 │ online │ 0       │ 5s     │ 6.250 MB   │ disabled │
└────────────┴────┴──────┴──────┴────────┴─────────┴────────┴────────────┴──────────┘
 Use `pm2 show <id|name>` to get more details about an app

Pour vérifier que le processus tourne bien :

$ pm2 list

Paramétrer un simulateur d’aube pour Domoticz

Standard

J’ai toujours voulu me réveiller le matin à la lueur du jour. Les simulateurs d’aube du marché sont chers et leur design ne m’a jamais plu.

C’est pour cela que j’ai tenté de créer un simulateur d’aube avec ma box Domoticz et un module de prise avec variateur. En plus de notre module de prise, il nous faudra une lampe classique avec une ampoule adaptée diffusant une lumière d’au moins 300 lux (soit 300 lumens).

Paramétrage du module variateur

Tout d’abord, il faut paramétrer le module de prise variateur en utilisant soit la télécommande fournie avec les kits DI-O, soit en émettant un signal depuis l’interface de domoticz. Voyons chacune de ces possibilités pas-à-pas.

Télécommande D-IO

Si vous avez une télécommande DI-O, allez dans la section Interrupteurs de Domoticz et cliquez sur le bouton Détection auto. En pressant le bouton On sur l’un des canaux de votre télécommande DI-O, domoticz identifiera le signal émis et l’associera à votre prise.

Configuration auto d'interrupteur dans domoticzJ’ai intitulé mon interrupteur Prise variateur chambre parentale.

Branchez votre module de prise avec variateur dans une prise murale pour le configurer. Appuyer une fois sur le bouton d’apprentissage, la led clignote lentement. En pressant le même bouton On sur votre télécommande, le code est enregistré lorsque la led cesse de clignoter. Si une lampe est branchée au module, elle doit s’allumer en pressant le bouton On, et s’étendre en pressant le bouton Off.

Si vous ne disposez pas de télécommande, dans la même section Interrupteurs, cliquez sur le bouton Ajout manuel. Puis configurer un nouvel interrupteur Dimmer avec les paramètres suivants :

Configuration manuelle interrupteur Domoticz

Bien entendu, il est recommandé de changer les paramètres House code et Unit code pour ne pas utiliser une combinaison de codes existante dans votre maison ou aux alentours.

Avant de cliquer sur le bouton Test, il est important de bancher votre module de prise avec variateur. Appuyer une fois sur le bouton d’apprentissage du module de prise, la led du module clignote lentement. Cliquer sur le bouton Test de Domoticz afin d’émettre un signal. Le code est enregistré lorsque la led cesse de clignoter. Valider le bouton Add Device de Domoticz pour ajouter votre nouvel équipement.

L’interrupteur ajouté, nous allons maintenant écrire un script permettant d’augmenter progressivement l’intensité de la lampe.

Simulateur d’aube

Domoticz est une solution très flexible et permet d’automatiser beaucoup de choses grâce aux scripts LUA. Les scripts doivent être créé dans le dossier scripts/lua de votre installation domoticz.

J’ai donc créé un script intitulé script_time_Simulateur aube.lua. Un script qui porte la mention time s’exécute toutes les minutes. Alors qu’un script qui porte la mention device s’exécutera uniquement lorsqu’un appareil a été mis à jour.

J’ai débuté mon script en vérifiant si mon module de prise était éteint ou allumé. Car s’il est éteint (Off) alors il faut l’initialisé avec la valeur la plus petite du module (dans mon cas 10% de puissance). Et s’il est allumé (On ou différent de Off dans notre cas) alors nous allons augmenter la puissance progressivement. La progression dépendra du temps du levé de soleil que nous allons simuler. J’ai arbitrairement démarré avec 20min.

commandArray = {}
if( otherdevices['Prise variateur chambre parentale'] == 'Off' ) then
    commandArray['Prise variateur chambre parentale']='Set Level 10'
end

if( otherdevices['Prise variateur chambre parentale'] ~= 'Off' ) then
    -- Durée de la simulation
    duree_simulateur = 20
    -- Augmenter l'intensité 
    -- @TODO
end

return commandArray

Pour le moment notre script ne fait pas grand chose. Il initie la luminosité à 10%. Mais que ce passe t’il s’il est éteint alors il s’allumera et ainsi toute les minutes. Il nous faut donc un drapeau (un flag en programmation) déterminant si le simulateur d’aube est activé ou non. Un flag peut être simulé par un interrupteur virtuel avec Domoticz.

Je me suis donc ajouté un nouvel interrupteur virtuel que j’ai intitulé « Simulateur aube ».

configuration-manuelle-interrupteur-virtuel-domoticz-

Si cet interrupteur est On alors cela veux dire que l’on peut activer le variateur. Si il est Off alors on ne fait rien.

commandArray = {}
if(otherdevices['Simulateur aube'] == 'On' and otherdevices['Prise variateur chambre parentale'] == 'Off' ) then
    commandArray['Prise variateur chambre parentale']='Set Level 10'
end

if(otherdevices['Simulateur aube'] == 'On' and otherdevices['Prise variateur chambre parentale'] ~= 'Off' ) then
    -- Durée de la simulation
    duree_simulateur = 20

    -- Augmenter l'intensité 
    -- @TODO
end

return commandArray

Pour augmenter notre intensité, il nous faut connaitre deux paramètres.

  • Le premier la durée, nous l’avons c’est la variable duree_simulateur.
  • Le second c’est la temps entre l’heure de début de la simulation et l’heure de fin. Il nous faut donc conserver dans une variable persistante l’heure de début de la simulation.

Domoticz permet de conserver ses variables intitulées Variables utilisateur.

Nous allons donc configurer cette variable depuis l’interface Configuration > Plus d’options > Variables utilisateur :

variable-utilisateur-start_time

Et voici l’adaptation apportée au script pour augmenter la luminosité. A l’initialisation la variable start_date est initialisé avec l’heure d’exécution du script t1.

Lors de la phase d’augmentation de l’intensité, la différence entre l’heure d’exécution du script et l’heure de démarrage start_date correspond au nombre de secondes écoulées (diff) et l’on en déduira le nombre de minutes (diff/60).

L’intensité (dim) sera calculée en arrondissant 90% de l’intensité à augmenter au prorata du temps de la simulation, additionné au 10% de l’initialisation.

commandArray = {}
t1 = tostring(os.time())

if(otherdevices['Simulateur aube'] == 'On' and otherdevices['Prise variateur chambre parentale'] == 'Off' ) then
    commandArray['Prise variateur chambre parentale']='Set Level 10'
    commandArray['Variable:start_time'] = t1
end

if(otherdevices['Simulateur aube'] == 'On' and otherdevices['Prise variateur chambre parentale'] ~= 'Off' ) then

    -- Durée de la simulation
    duree_simulateur = 20

    t2 = uservariables['start_time']
    diff = (os.difftime (t1, t2))
    dim = math.floor((90/duree_simulateur) * (diff/60) ) + 10
    duree_simulateur = duree_simulateur * 60

    if(diff > duree_simulateur) then
        commandArray['Simulateur aube'] = 'Off'
    else
        commandArray['Prise variateur chambre parentale']='Set Level ' .. dim
    end
end

return commandArray

Le script ainsi programmé permet d’augmenter progressivement l’intensité durant une période de 20 min. Cette periode peut être configurable. Une variable utilisateur a été crée dans ce but.

variable-utilisateur-duree

commandArray = {}
t1 = tostring(os.time())

if(otherdevices['Simulateur aube'] == 'On' and otherdevices['Prise variateur chambre parentale'] == 'Off' ) then
    commandArray['Prise variateur chambre parentale']='Set Level 10'
    commandArray['Variable:start_time'] = t1
end

if(otherdevices['Simulateur aube'] == 'On' and otherdevices['Prise variateur chambre parentale'] ~= 'Off' ) then
    
    -- Durée de la simulation
    duree_simulateur = uservariables['duree_simulateur']
    t2 = uservariables['start_time']
    diff = (os.difftime (t1, t2))
    dim = math.floor((90/duree_simulateur) * (diff/60) ) + 10
    duree_simulateur = duree_simulateur * 60

    if(diff > duree_simulateur) then
       commandArray['Simulateur aube'] = 'Off'
    else
       commandArray['Prise variateur chambre parentale']='Set Level ' .. dim
    end
end

return commandArray

Domoticz est un outils magique qui permet de planifier le déclenchement d’un interrupteur, c’est la fonctionnalité Planing.

planning-simulateur-2 planning-simulateur

Mon simulateur d’aube se déclenchera chaque matin à partir de 7:00 pendant 20min, et le samedi à partir de 8:35.

Si vous avez besoin de plus de détails sur cette fonctionnalité n’hésitez pas à me contacter en commentant cet article.