Jeedom | Plugin JeeRhasspy

Plugin pour le support de l'assistant vocal Rhasspy dans Jeedom

JeeRhasspy - Plugin pour Jeedom

Lien market
Rhasspy Assistant Tips n Tricks

Plugin pour le support de l’assistant vocal Rhasspy dans Jeedom. Vous devez au préalable avoir un assistant Rhasspy fonctionnel, en version 2.5 minimum.

Changelog

Configuration du plugin JeeRhasspy
Utilisation
Configuration Rhasspy
Callback Scénario
Commandes
Scripting

Configuration du plugin JeeRhasspy

Après installation du plugin, il vous suffit de l’activer. Il apparaîtra alors dans le menu Plugins > Communication.

Vous devez alors renseigner, sur la page de configuration du plugin :

Configuration

Utilisation

Une fois le plugin configuré, il faut une première fois importer l’assistant Rhasspy.

A l’importation, il y a trois options possible: Lors de la première importation, ces options n’ont pas d’incidence.

L’importation de l’assistant va créer :

Tip

Vous pouvez supprimer des intentions de trois façons:

  • En réimportant votre assistant, suivant l’option choisie (voir ci-dessus).
  • En utilisant le bouton Supprimer les intentions, qui supprimera tous vos Intents actuels du plugin.
  • Sur une intention, utilisez le bouton Supprimer.

Si vous avez également des satellites reliés à votre Rhasspy, créez les dans le plugin avec le bouton Ajouter un satellite. Vous devrez renseigner l’url complète du satellite.

Configuration de Rhasspy

Pour le maître (master) et chaque satellite, vous disposez sous son icône de plusieurs boutons:

Tip

Pour nommer votre device Rhasspy, vous devez :

  • Sur l’interface de Rhasspy, aller sur l’onglet Settings
  • Renseigner un nom dans le champ siteId

Configuration Rhasspy

Pour que Rhasspy envoie les événements souhaités à Jeedom, vous devez modifier son profile.

Si vous avez des satellites, il faudra le faire sur chacun d’entre eux.

Vous pouvez le faire:

Par l'interface de Rhasspy, ou directement en éditant le profile.json sur le Rhasspy - Intent recognized : Par l'interface de Rhasspy, onglet *Settings*, puis *Intent Handling* : Use a remote HTTP server to handle intents : cochez l'option et renseignez l'url. En éditant `.config\rhasspy\profiles\fr\profile.json` : ```json "handle": { "system": "remote", "remote": { "url": "http://x.x.x.x:80/core/api/jeeApi.php?plugin=jeerhasspy&apikey=---apikey---&plugin=jeerhasspy&type=jeerhasspy" } }, ``` - Wakeword detected : Cette option n'est pas disponible par l'interface de Rhasspy. En éditant `.config\rhasspy\profiles\fr\profile.json` : ```json "webhooks": { "awake": ["http://x.x.x.x:80/core/api/jeeApi.php?plugin=jeerhasspy&apikey=---apikey---&plugin=jeerhasspy&type=jeerhasspy"] }, ```

Callback Scénario

Pour chaque Intention (Intent), vous devez :

Configuration d'une Intention

Tip

Vous pouvez aussi utiliser les interactions de Jeedom en cochant la case Interaction

Exemple de scénario

Voici un exemple de scénario.

Exemple de scénario

Le premier bloc SI sera commun à la plupart de ce type de scénario : On veut savoir d’où vient la demande pour pouvoir la traiter correctement. house_room est un slot de rhasspy, par exemple, si on lui demande :

Allume la lumière de la cuisine

Voici ce que rhasspy va envoyer au plugin : ```json { "intent": { "name": "lightsTurnOnJeedom", "confidence": 1 }, "entities": [{ "entity": "house_room", "value": "cuisine", } ], "text": "allume les lumière de la cuisine", "wakeId": "someoneHere", "siteId": "salon" } ```

Le plugin sait donc de quelle intention il s’agit, et lance alors le scénario correspondant avec les tags suivant :

Start : Lancement provoque. Tags : {"#intent#":"lightsTurnOnJeedom","#confidence#":"1","#wakeword#":"someoneHere","#query#":"allume les lumière de la cuisine","#siteId#":"salon","#house_room#":"cuisine"}

Donc si a on pas de tag(house_room), car on peut simplement lui demander d’allumer la lumière sans préciser où, on a deux solutions :

Le deuxième bloc SI n’est pas obligatoire. Vous pouvez lancer le même scénario pour plusieurs intents, et il sert donc à filtrer l’intent souhaité. Par exemple si on veux allumer ou éteindre une lumière.

Finalement, on vérifie de quelle lumière il s’agit : SI tag(rhasspy_room) matches "/cuisine|maison/"

En matchant cuisine ou maison, on pourra aussi demander :

Allume les lumières de la maison

On peut aussi différencier en bas, en haut pour pouvoir demander :

Allume les lumières en bas

Avec SI tag(rhasspy_room) matches "/cuisine|maison|en bas/"

Et ainsi de suite …

Commandes

Sur chaque device Rhasspy, il y a sept commandes:

Ces deux dernières commandes nécessitent HermesLedControl.

TTS

Les commandes Speak et dynamic Speak disponibles sur le Master possèdent un champ siteId:lang permettant de faire parler un satellite, et dans une langue au choix. Quelques exemples :

Speak Options

Commande dynamic Speak

Cette commande permet de construire un texte dynamique en fonction d’informations d’équipements dans Jeedom.

dynamic Speak

Par exemple, vous voulez demander à Rhasspy si le volet est ouvert. L’information dans Jeedom étant le pourcentage d’ouverture, ou 0 / 1, la réponse ne sera pas très waf (Wife Acceptance Factor).

Vous pourriez faire plusieurs blocs SI pour testant chaque possibilité et renvoyer le bon texte, mais çà complexifie énormément les scénarios.

La commande dynamic Speak va vous permettre de faire simplement :

Le volet de la salle est {#[Salon][Volet Terrasse][Etat]#|0:fermé|<99:ouvert à #[Salon][Volet Terrasse][Etat]# pourcent|99:ouvert}

Donc, on passe d’abord l’information dans un {} puis, séparés par des |, on passe les conditions si:alors avec le si comme valeur et le alors comme texte. Dès qu’une condition est trouvée, l’évaluation s’arrête. Si le volet est à 0 c’est bien ‘fermé’ qui sera énoncé, car <99 ne sera pas évalué.

Un autre exemple pour demander si une lumière est allumée ou éteinte :

La lumière est actuellement {#[Cuisine][Lumière][Etat]#|0:éteinte|1:allumée}

Commande Ask

Vous pouvez utiliser la commande interne de Jeedom Ask pour que votre Rhasspy vous pose une question, et attende votre réponse. Votre scénario pourra ensuite agir en fonction de votre réponse.

Pour cela vous devez indiquer :

Exemple Dans le screen ci-dessous, j'utilise le slot YesNo dans le champ **Réponse**. Voici l'intent correspondant: ``` [GetAskResponseJeedom] bien sur que ($YesNo){YesNo} mais ($YesNo){YesNo} surtout pas (:){YesNo:non} bien sur (:){YesNo:oui} ($YesNo){YesNo} oui{YesNo:oui} non{YesNo:non} ``` Et le slot: ``` "YesNo": [ "( non | pas | surtout pas | nan ):non", "( oui | ouais | yes | yep | bien sûr ):oui" ] ```

Voici un exemple :

Commande Ask

Si vous avez un maître et des satellites, la commande Ask devra correspondre au device d’où vient la demande.

Dans ce cas, créez un tag(profile) avec le siteId et écrivez la commande ask comme cela :

#[Rhasspy-Intents][TTS-#profile#][Ask]#

Jeedom changera alors automatiquement le nom de la commande avec le siteId, et la demande de confirmation Ask sera émise sur le bon device.

Commande Ask dynamique

Les autres commandes sont des commandes simples qui ne nécessitent pas vraiment d’explications ;-)

Scripting

Si vous souhaitez retrouver un device Rhasspy avec un plugin script ou dans un bloc code de scénario, voici la manière la plus simple et sûr de le retrouver :

$eqLogic = eqLogic::byLogicalId('TTS-'.config::byKey('masterSiteId', 'jeerhasspy'), 'jeerhasspy');


$_siteId = 'satName';
$eqLogic = eqLogic::byLogicalId('TTS-'.$_siteId, 'jeerhasspy');


Comme la commande speak du maître permet de faire parler un satellite, un petit exemple simple :

$eqLogic = eqLogic::byLogicalId('TTS-'.config::byKey('masterSiteId', 'jeerhasspy'), 'jeerhasspy');
$cmd = $eqLogic->getCmd('action', 'speak');
$options = array(
		'title'=>'monSatellite:es',
		'message'=>'Como esta ?'
		);
$cmd->execCmd($options);