Alexa Echo avec Jeedom sur RaspBerry

Alexa et Jeedom

On est tellement de geek à avoir acquit un Echo pour sa sortie et à essayer de le faire fonctionner avec Jeedom avant la sortie du plugins officiel que voici mon retour d’expérience.

Deux solutions, une simple avec le plugins HomeBridge, mais cette solution n’apporte pas de grandes possibilités, et une autre solution avec HA-Bridge qui est plus complexe à mettre en place.

Solution HomeBridge

Sur cloudwatch

Créez un compte sur le portail : https://homebridge.cloudwatch.net/

Dans Jeedom
Dans Jeedom : Installez le plugins HomeBridge, activez le plugins.
Allez dans la configuration du plugins pour vérifier que le status du Démon est bien OK. De mon côté ce n’était pas le cas.
J’ai du cliquer sur le bouton « Relancer » dans dépendances pour installer les dépendances.
Après cela tout était au vert !

A partir de ce moment là, allez en ssh sur votre jeedom, et lancez l’installation du plugin homebridge-alexa :

sudo npm install -g homebridge-alexa

Attendre un peu, et le tour est joué 😉

Toujours dans Jeedom et dans la configuration du plugins :

  • Mettez AlexaLikesApples dans la phrase secrète, et sauvegardez.
  • Cliquez sur le bouton pour déclarer des plateformes, et insérez le code ci-dessous,
    en y remplaçant votre identifiant et pass cloudwatch et votre PIN :

     

    {
    "platform": "Alexa",
    "name": "Alexa",
    "username": "login_cloudwatch",
    "password": "mdp_cloudwatch",
    "pin":"000-00-000",
    "refresh":5
    }
  • Mettez le log sur debug (cela sera utile par la suite)

Dans le plugins HomeBridge, allez faire votre (dé)sélection de ce que vous voulez partager et contrôler via Alexa (pensez à sauvegarder).

Dans Alexa.amazon.fr ou sur l’application mobile

Installez le Skill HomeBridge et activez le avec le compte précédemment créé.
Le Skill est dispo ici : https://www.amazon.fr/Northern-Man-54-Homebridge/dp/B07B9QMTFQ

Un check

Retournez dans Jeedom, et aller dans le panneau configuration du plugins HomeBridge.
Il va falloir être rapide sur cette manipulation 🙂
Cliquez sur le deuxième bouton d’affichage des Logs : Homebrige_deamon
Cliquez sur Vider et fermer (histoire d’avoir un log propre).
Cliquez sur (Re)Démarrer et allez vite cliquer sur Homebrige_deamon à nouveau.

Surveillez et faite même une pause dans le log, les lignes suivantes doivent apparaître :

[2018-7-25 18:00:03] Loaded plugin: homebridge-alexa
[2018-7-25 18:00:03] Registering platform ‘homebridge-alexa.Alexa’
[2018-7-25 18:00:03] —
[2018-7-25 18:00:03] Loaded config.json with 0 accessories and 1 platforms.
[2018-7-25 18:00:03] —
[2018-7-25 18:00:03] Loading 1 platforms…
[2018-7-25 18:00:03] [Alexa] Initializing Alexa platform…

Tout semble ok, on continue

Dans Alexa, allez dans Maison connecté, puis cliquez sur Détecter. De mon côté, ça a fonctionné directement, mais apparemment certains ont dû attendre quelques minutes pour que la détection se fasse (n’hésitez pas à réessayer de temps en temps).

Enfin, renommez vos équipements dans Alexa pour pouvoir les contrôler facilement (Lumière du séjour par exemple).

Pour des équipements autres que des lumières, il vous faudra gruger avec des virtuels jeedom 😉

Solution Ha-bridge

Cette solution est techniquement plus complexe, mais elle ouvre toutes les possibilités !

Ha-bridge est dispo ici : https://github.com/bwssytems/ha-bridge

Ma box jeedom est installée sur le port 80, et je veux installer ha-bridge sur le port 8088 (histoire de mettre un port non utilisé)

Allez, hop go full ssh sur jeedom (on aime ça!)
On aime pas taper sudo à chaque ligne ! on se root :

su -

Installez la bonne version de java
(Perso j’avais une trop vieille version de linux, j’ai du faire un petit apt update; apt upgade)

apt-get update && apt-get install oracle-java8-jdk
update-alternatives --config java

Sélectionnez JDK 8 (/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/jre/bin/java) si nécessaire.

Télécharger ha-bridge
J’installe ha-bridge dans le dossier plugins, pour qu’il soit sauvegardé quand on lance un backup de jeedom

cd /var/www/html/plugins/
mkdir ha-bridge
cd ha-bridge
wget https://github.com/bwssytems/ha-bridge/releases/download/v5.2.1/ha-bridge-5.2.1.jar

On trouvera le lien vers la dernière version sur cette page : https://github.com/bwssytems/ha-bridge/releases

Vérifier que le port 8088 est dispo :

netstat -tlnp | grep 8088

Si aucune réponse, c’est ok, le port est dispo

Créer le dossier de config (non nécessaire je pense)

cd /var/www/html/plugins/ha-bridge
mkdir data

Installation du service (le deamon)

cd /etc/systemd/system
nano ha-bridge.service

Collez le code suivant :

[Unit]
Description=HA Bridge
Wants=network.target
After=network.target

[Service]
Type=simple

WorkingDirectory=/var/www/html/plugins/ha-bridge
ExecStart=/usr/bin/java -jar -Dconfig.file=/var/www/html/plugins/ha-bridge/data/habridge.config -Dserver.port=8088 /var/www/html/plugins/ha-bridge/ha-bridge-5.2.1.jar

[Install]
WantedBy=multi-user.target

On reload et on démarre le service

systemctl daemon-reload
systemctl start ha-bridge.service

Testez si aucun messages d’erreurs

systemctl status ha-bridge.service

→ Vérifier s’il y a des erreurs
Et faire que le service soit activé (au démarrage)

systemctl enable ha-bridge.service

Quelques checks :
Testez enfin http://ip_jeedom:8088 pour afficher l’interface de Ha-bridge
Faire

cat /var/www/html/plugins/ha-bridge/data/habridge.config

pour vérifier la présence du fichier de config (et qu’il soit plein de ….)

Pour que Alexa détecte les équipements, il faut que les api ha-bridge soient accessibles sur le port 80.
Pour cela on doit rediriger tous les requêtes http://ip_jeedom/api vers http://ip_jeedom:8088/api (de ha-bridge).

On active la gestion des redirections dans apache :

a2enmod proxy proxy_http headers

et on modifie la config apache :

nano /etc/apache2/sites-available/000-default.conf

Dessous la ligne :

<VirtualHost *:80>

Insérez les lignes :

ProxyPass /api http://localhost:8088/api nocanon
ProxyPassReverse /api http://localhost:8088/api
ProxyRequests Off
AllowEncodedSlashes NoDecode

#Local reverse proxy authorization override
#Most unix distribution deny proxy by default (ie /etc/apache2/mods-enabled/proxy.conf in Ubuntu)
<Proxy http://localhost:8088/api*>
Order deny,allow
#Allow from all
deny from all
allow from 192.168.2.0/24
</Proxy>

On reload et redémarre le service :

systemctl daemon-reload
service apache2 restart

Tester si l’api répond bien sur le port de jeedom :
http://ip_jeedom/api/status
et http://ip_jeedom/api/devices (qui donne la liste des équipements, donc au début, c’est vide)

Les problèmes commencent XD

Apache ne redémarre pas : 
Faire un

systemctl status apache2.service

Si l’erreur est SSLProtocol, faire : 

a2enmod ssl
systemctl restart apache2

 

Une erreur apache : Si ce n’est pas accessible et que vous avez un message d’erreur apache du style :

Service Unavailable
The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.

Aller dans jeedom → Analyse → Logs → http.error
Si erreur ap_proxy_connect_backend disabling worker for (localhost) for 60s
Tentez de mettre l’ip du jeedom à la place de localhost dans le fichier /etc/apache2/sites-available/000-default.conf (3 modifications)

J’ai aussi lu que certains mettraient retry=0 après nocanon (je n’en ai pas eu besoin).

Ajouter un équipement dans Ha-bridge

Allez sur http://ip_jeedom:8088

Bouton Add/Edit
Renseignez un nom dans name : Lumière Télévision (se sera le nom utilisé lors de l’appel vocal Alexa)
Plus bas, nous avons On Items, Dim ItemsOff Items, etc…
On Items c’est la commande Alexa « Allume »
Off Items c’est la commande « Eteind »
Dim Items c’est la commande « Met Lumière Télévision à 50 » pour la mettre à 50% par exemple.

Pour chaque ordre, nous allons utiliser un appel à l’api de votre jeedom.
Donc dans Type on mettra : Requête HTTP
Dans Target Item : http://ip_jeedom/core/api/jeeApi.php?apikey=cle_api_jeedom&type=cmd&id=id_commande_a_executer
Dans Http Verb on met GET
Dans Content Type on met application/json
Cliquez sur le bouton Add, sinon c’est perdu, la commande n’est pas enregistrée 😉 (oui, je me suis fait avoir)

Vous l’aurez compris, pour une commande, on peut donc exécuter plusieurs appels API Jeedom : très pratique pour par exemple éteindre toutes les lumières de la maison en un seul appel vocal Alexa.
A vous de voir si vous mettez un delay entre deux commandes (en millisecondes attention).

Pour trouvez la clé api jeedom, allez dans le menu Jeedom :
La roue crantée en haut à droite –> Configuration –>  API –> A droite de Clé API

Pour trouver l’id_commande_a_executer, déjà il faut pour rappel comprendre qu’il y a un id commande pour l’état de l’équipement, un pour le mettre en route, et un pour l’arrêter.
Allez dans votre équipement, et le plus simple est de cliquer sur « Configuration avancée » en haut à droite,
vous aurez la liste des commandes en bas, et pour chacune une roue crantée.
Cliquez sur la roue crantée, en haut à gauche vous aurez l’ID commande,
et vous pourrez même copier l’URL API en face de URL directe : Un clic droit, copier l’URL du lien et hop le tour est joué.

Sauvez votre équipement (device dans Ha-bridge) et pour les suivants, le mieux est de dupliquer un Device : Cliquez sur Edit/Copy, Cliquez sur Change Edit Mode pour modifier facilement les id de commandes, et cliquez sur Add Bridge Device pour créer un nouvel équipement.

Faire reconnaître ces équipements à Alexa

Dans un premier temps il faut afficher le bouton Link :
HA Bridge : Bridge control → Update security settings
Cocher Use Link Button et Save

Que se soit la première fois, ou pour ajouter ou mettre à jour un équipement il faut faire cette manipulation :
(Oui 2 fois Oui…. je n’ai pas trouver d’autres moyens)

Aller sur Alexa → Maison connectée → Appareils → Détecter
HA-Bridge → Bridge device → Cliquer Link
Si rien sur Alexa refaire rapidement (quasi à chaque fois) :
Aller sur Alexa → Maison connectée → Appareils → Détecter
HA-Bridge → Bridge device → Cliquer Link

Voilà les équipements de Ha-bridge doivent maintenant apparaître dans votre Alexa.
Amusez-vous bien.

Une page intéressante pour les appels api : https://jeedom.github.io/core/fr_FR/api_http

Si la découverte ne fonctionne pas : 

Dans le fichier device.db, vérifiez que les uniqueid soient bien du format  « uniqueid »: »69:74:ce:5a:c6:60:0c:2b-0b » (avec 9 groupements de 2 chiffres)

Mettre à jour HA Bridge avec la dernière release : https://github.com/bwssytems/ha-bridge/releases
(Cliquez sur le premier lien et télécharger)

Lancer en ligne de commande pour savoir d’où vient le problème. Exemple : /usr/bin/java -jar -Dconfig.file=/var/www/html/plugins/haBridge/ressources/data/habridge.config -Dserver.port=8088 /var/www/html/plugins/haBridge/ressources/ha-bridge-5.4.0.jar

Ouvrir les ports du firewall, et retester (parfois un port fermé peut tout bloquer) : UDP OUT : 50000, 5353 et 80. UPD IN 1900
S’il ne démarre toujours pas, démarrer en ligne de commande et faire un journalctl -f pour voir les ports bloqués par le firewall.

DEBUG : Quand HA est démarré, on peut aller dans log et en bas passer en DEBUG, puis en ssh journalctl -f | grep java

Tracer les requêtes UPNP : Dans ha bridge cocher Trace UPNP Call, et Trace State Changes, puis mettre le log sur TRACE.