L’eedomus comme passerelle pour Alexa – commander HA depuis l’eedomus

EDIT : Modification du php avec l’ajout des switch et la gestion des services.

Bonjour,

Un petit tuto pour indiquer comment envoyer une commande de l’eedomus vers Home Assistant en expliquant comment s’en servir pour faire de l’eedomus une passerelle vers Alexa d’Amazon.

En effet, je n’ai pas réussi à configurer l’utilisation d’Alexa depuis Home Assistant. Je n’ai pas besoin d’avoir le retour d’état dans Alexa car je n’utilise pas son interface mais juste les commandes vocales et donc l’objectif est de pouvoir faire une commande à Alexa qui la transmet à l’eedomus qui la transmet ensuite à Home Assistant.

Tout d’abord, pour les commandes vers Home Assistant, j’ai fait un page PHP (en reprenant/complétant ce qui a été fait par The Princelle comme pour la synchro eedomus-Home Assistant).

Cette page PHP utilise l’API de Home Assistant (elle n’est pas totalement finalisée, elle serait à finir mais elle est suffisante pour ce que l’on va faire).

Le code de la page TalkToHA.php :

<?php
///////////////////////////////////////////////////////////////////////////////
// Pour lire une valeur de Home Assistant                                   //
// by sbdomo                                                                //
// explication API : https://devotics.fr/utiliser-lapi-rest-home-assistant  //
//////////////////////////////////////////////////////////////////////////////

//A completer
$ipHA="";
$token = "";
////////


$auth = "Authorization: Bearer " . $token;

$action =  getArg("action");
$erreur=false;
//Recupere en XML etat et les attributs de entite par son entity_id action=get
//Syntaxe http://ipeedomus/script/?exec=TalkToHA.php&action=get&entity_id=sensor.sonoff_snzb_02d_temperature
if($action=="get") {
	$url = "http://".$ipHA.":8123/api/states/" . getArg("entity_id");
	$type= "GET";
	$json = NULL;
	$result=jsonToXML(sdk_sendToHa($url, "GET", $json));
//Recupere le state de entite par son entity_id action=state
//Syntaxe http://ipeedomus/script/?exec=TalkToHA.php&action=state&entity_id=sensor.sonoff_snzb_02d_temperature
} elseif($action=="state") {
	$url = "http://".$ipHA.":8123/api/states/" . getArg("entity_id");
	$type= "GET";
	$json = NULL;
	$req=sdk_json_decode(sdk_sendToHa($url, "GET", $json),$decode_utf8 = false);
	$result="<root><state>".$req['state']."</state></root>";
//Recupere en json la liste des services disponibles action=services
//Syntaxe http://ipeedomus/script/?exec=TalkToHA.php&action=services
} elseif ($action=="services") {
	$url = "http://".$ipHA.":8123/api/services";
	$json = NULL;
	$type= "GET";
	$result=sdk_sendToHa($url, $type, $json);
//Recupere en json toutes les entites avec les etats et attributs action=states
//Syntaxe http://ipeedomus/script/?exec=TalkToHA.php&action=states
} elseif ($action=="states") {
	$url = "http://".$ipHA.":8123/api/states";
	$json = NULL;
	$type= "GET";
	$result=sdk_sendToHa($url, $type, $json);


//Change etat de entite action=post et state= (ex: on ou off)
//Syntaxe http://ipeedomus/script/?exec=TalkToHA.php&action=post&entity_id=light.lumiere_placard_lumiere&state=on
} elseif ($action=="post") {
	$url = "http://".$ipHA.":8123/api/states/" . getArg("entity_id");
	$json='{ "state": "'.getArg("state").'" }';
	$type= "POST";
	$result=sdk_sendToHa($url, $type, $json);
//Lance un service
//Syntaxe http://ipeedomus/script/?exec=TalkToHA.php&action=service&entity_id=light.lumiere_placard_lumiere&domain=light&service=turn_on
} elseif ($action=="service") {
	$url = "http://".$ipHA.":8123/api/services/".getArg("domain")."/".getArg("service");
	$json='{ "entity_id": "'.getArg("entity_id").'" }';
	$type= "POST";
	$result=sdk_sendToHa($url, $type, $json);

	
	
//Lance le service turn_on action=turn_on (serait a faire plutot en post que en get pour avoir des services plus complets avec la possibilite de mettre des parametres en plus dans le body...)
//Syntaxe http://ipeedomus/script/?exec=TalkToHA.php&action=turn_on&entity_id=light.lumiere_placard_lumiere
} elseif ($action=="turn_on") {
	$url = "http://".$ipHA.":8123/api/services/light/turn_on";
	$json='{ "entity_id": "'.getArg("entity_id").'" }';
	$type= "POST";
	$result=sdk_sendToHa($url, $type, $json);
//Lance le service turn_off
//Syntaxe http://ipeedomus/script/?exec=TalkToHA.php&action=turn_off&entity_id=light.lumiere_placard_lumiere
} elseif ($action=="turn_off") {
	$url = "http://".$ipHA.":8123/api/services/light/turn_off";
	$json='{ "entity_id": "'.getArg("entity_id").'" }';
	$type= "POST";
	$result=sdk_sendToHa($url, $type, $json);
//Syntaxe http://ipeedomus/script/?exec=TalkToHA.php&action=switch_turn_on&entity_id=switch.prise_gite
} elseif ($action=="switch_turn_on") {
	$url = "http://".$ipHA.":8123/api/services/switch/turn_on";
	$json='{ "entity_id": "'.getArg("entity_id").'" }';
	$type= "POST";
	$result=sdk_sendToHa($url, $type, $json);
//Syntaxe http://ipeedomus/script/?exec=TalkToHA.php&action=switch_turn_off&entity_id=switch.prise_gite
} elseif ($action=="switch_turn_off") {
	$url = "http://".$ipHA.":8123/api/services/switch/turn_off";
	$json='{ "entity_id": "'.getArg("entity_id").'" }';
	$type= "POST";
	$result=sdk_sendToHa($url, $type, $json);
} elseif ($action=="open_cover") {
	$url = "http://".$ipHA.":8123/api/services/cover/open_cover";
	$json='{ "entity_id": "'.getArg("entity_id").'" }';
	$type= "POST";
	$result=sdk_sendToHa($url, $type, $json);
} elseif ($action=="close_cover") {
	$url = "http://".$ipHA.":8123/api/services/cover/close_cover";
	$json='{ "entity_id": "'.getArg("entity_id").'" }';
	$type= "POST";
	$result=sdk_sendToHa($url, $type, $json);	
} elseif ($action=="stop_cover") {
	$url = "http://".$ipHA.":8123/api/services/cover/stop_cover";
	$json='{ "entity_id": "'.getArg("entity_id").'" }';
	$type= "POST";
	$result=sdk_sendToHa($url, $type, $json);	
	
} elseif ($action=="event") {
	$url = "http://".$ipHA.":8123/api/events/" . getArg("event");
	$json = NULL;
	$type= "POST";
	$result=sdk_sendToHa($url, $type, $json);

} else {
	$erreur=true;
}

if($erreur==false) {
echo $result;
}




function sdk_sendToHa($url, $type, $json)
{
    global $auth;
	$result=httpQuery($url, $type, $post = $json, $oauth_token=NULL, $headers=array($auth), $use_cookies=false, $ignore_errors=false, $info, $user_pwd=NULL);
	return $result;
}
?>

Pour permettre l’accès à Home Assistant vous devez remplir la partie :

//A completer
$ipHA="";
$token = "";
///////

En mettant l’IP de Home assistant et les informations d’un jeton que vous avez créé.

Pour créer ce jeton :

  • Connectez-vous à votre interface Home Assistant.
  • Cliquez sur votre profil.
  • Faites défiler jusqu’au bloc Jetons d’accès de longue durée.
  • Cliquez sur créer un jeton.
  • Une fenêtre s’ouvrira, donnez-lui un nom et une fois un nom ajouté, un jeton apparaîtra.

Ensuite la page est à updloader dans la partie script de l’eedomus.

Il faut d’abord s’identifier sur l’eedomus depuis « secure.eedomus » puis se connecter à l’eedomus en local avec l’adresse « http://IPeedomus/script/ » où IPeedomus est l’adresse IP locale de l’eedomus pour y uploader le fichier.
Une doc pour les scripts : Scripts - Documentation eedomus
Eedomus_sdk

L’eedomus sait maintenant parler à Home Assistant.
Nous allons créer sous l’eedomus un Actionneur Http pour chaque entité de Home Assistant que nous voulons avoir dans Alexa.
Il faut faire la configuration complète la première fois pour une entité, il suffira ensuite de dupliquer les actionneurs pour les autres entités.

Exemple pour les lumières et prises :
Pour la première entité, ajouter sur l’eedomus un actionneur Http
http
Il faut ensuite configurer l’actionneur :
actionneurlumiere
Dans usage, mettre Lampe
Dans VAR1 mettre l’identifiant de l’entité sous Home Assistant que l’on veut ajouter dans Alexia

Il faut mettre deux valeurs pour éteindre et allumer :


On défini l’url pour la commande vers Home Assistant :

http://localhost/script/?exec=TalkToHA.php&entity_id=[VAR1]

Il faut demander une commande de type « GET » et on passe dans les paramètres la commande (action) pour compléter l’URL :
Pour allumer :

&action=turn_on

Pour éteindre :

&action=turn_off

Il faut maintenant l’ajouter à Alexa :
toilettes

Dans la page de configuration d’Alexa de l’eedomus, on choisi la valeur pour la commande Allume et la commande Eteint et on donne le nom que l’on veut avoir dans Alexa.
Il faut faire découvrir à Alexa de nouveau appareils et c’est fini.

Pour les autres lumières :
On ouvre, dans l’eedomus, une lumière déjà ajoutée, on clic sur Dupliquer, on donne un nouveau nom personnalisé et on met l’identifiant de l’entité Home Assistant dans VAR1


Penser à définir, dans la page de configuration d’Alexa, le nom à mettre…

Pour des volets :
Dupliquer une lumière créé précédemment, mettre l’usage volet/store, renseigner VAR1
volet
Dans l’onglet valeur :
Définir les 3 valeur
Mettre l’URL (la même qu’avant) :

http://localhost/script/?exec=TalkToHA.php&entity_id=[VAR1]

Et mettre des valeur pour les commandes ouverture, fermeture et stop : (&action=close_cover, &action=stop_cover, &action=open_cover).


Pour configurer pour Alexa, à vous de voir ce qui marche mais Alexa a du mal chez moi avec les volets car par défaut si je lui dit d’ouvrir le volet du salon, il n’a pas l’air de comprendre (il me le fait aussi pour les volets que j’avais mis dans l’eedomus), du coup je déclare mon volet comme étant volet 3 et j’ajoute une routine du type « Alexa, ouvre le volet du salon » qui « Allume » le volet 3…
voletAlexa
Une fois un volet ajouté, vous pouvez en mettre d’autres en le dupliquant.

Pour des prises (commutateurs ou switch) :



Il faut faire comme pour les lumières mais ici les actions sont « &action=switch_turn_off » et « &action=switch_turn_on ».

D’une manière plus générale pour utiliser un service disponible dans l’API de Home Assistant, la syntaxe est de ce type :

http://localhost/script/?exec=TalkToHA.php&action=service&domain=switch&entity_id=[VAR1]

et

&service=turn_on

Ici on utilise le domaine « switch » pour la commande de commutateurs et on lance le service « turn_on » qui allume la prise.

Pour connaitre les services disponibles : depuis un navigateur, il faut taper, en mettant l’ip locale de l’eedomus à la place de « ipeedomus » :

http://ipeedomus/script/?exec=TalkToHA.php&action=services

Dernière astuce :
Je voulais avoir dans Alexa la température de mon salon qui remonte dans Home Assistant. Cette fois, il me faut donc le retour d’état :

Il faut créer un capteur HTTP sous l’eedomus :


En usage on met « Température »

Dans l’url on met : http://localhost/script/?exec=TalkToHA.php&action=state&entity_id=[VAR1]

(cette fois, l’action, c’est « state » pour avoir l’état de l’entité)

Dans VAR1, on met l’identifiant de l’entité sous Home Assistant

et pour la fréquence de la requête, j’ai mis 20 car je considère que si l’eedomus interroge toutes les 20 minutes Home Assistant pour mettre à jour la température c’est suffisant…

2 « J'aime »

bravo pour ce tuto ! même si j’ai l’abonnement Nabu casa pour faire causer mes google home, je trouve que c’est une bonne utilisation de cette brave Eedomus (que j’ai lâchement abandonné cet été) !

Bonjour,
Une mise à jour de la page php pour commander les commutateurs ou lancer un service.

1 « J'aime »

Bonsoir sbdomo,
ça marche nickel
Merci pour ce complément et ces explications :wink:

Ouaaa quel boulo! Ca fait rêver.
Je vais tenter cette aventure pendant les vacance.

Merci.