Bonjour,
Ce que je vais décrire ci-dessous fonctionne ainsi : si je mets en charge un appareil style GSM, tablette … Rhasspy doit me poser la question s’il doit surveiller l’évolution de la charge - La surveillance de charge a pour but de m’alerter quand cette dernière atteint 90% … Je peux ainsi arrêter la charge.
Le fonctionnement de Rhasspy est donc différent de son comportement normal : attente du wake-word, puis de la commande. Cette fois, il pose la question et attend votre réponse.
Le hot_word est une particularité : quand j’ai trop de bruit ambiant (TV, musique, …), je désactive le wake-word pour éviter des « je n’ai pas compris » … Condition à virer si besoin.
Il faudra par contre déclarer le input_text : texte_libre
Le passage par une annonce textuelle puis le StartSession de Rhasspy est du au fait que je passe par un TTS externe dans Rhasspy : et là, il calcule mal la fin de lecture du fichier wav. Il termine prématurément la session. Donc, j’ai été obligé de faire court pour le message qui va avec le InitSession et coller un délai pour laisser le temps au 1er message.
J’ai 4 automations :
- une qui surveille la mise en charge d’un mobile,
- une qui surveille l’état de charge des mobiles
- une qui traite les réponses « affirmatives »
- une qui traite les réponse « négatives »
Voici pour la surveillance des mobiles, 3 à ce jour, il faut aussi déclarer un input_boolean qui sert à savoir quel mobile est à surveiller :
input_boolean:
# gestion du mode de suivi de la charge mobile & tablette
suivi_sonore_phone_alain:
name: Indique si avec ou sans message Rhasspy pour GSM alain
suivi_sonore_tab_a10:
name: Indique si avec ou sans message Rhasspy pour tablette Tab A10
suivi_sonore_tab_snote:
name: Indique si avec ou sans message Rhasspy pour tablette S Note
L’automation qui surveille la mise en charge
- id: batterie_mobiles_demarre
## quand un mobile est mis en charge, demander si surveillance si pas en mode sourdine
alias: batterie_mobiles_demarre
description: ''
trigger:
- platform: state
entity_id: binary_sensor.gt_n8010_is_charging_3
from: "off"
to: "on"
- platform: state
entity_id: binary_sensor.alain_pro_is_charging
from: "off"
to: "on"
- platform: state
entity_id: binary_sensor.alain_tablette_is_charging
from: "off"
to: "on"
condition:
condition: state
entity_id: input_boolean.hot_word
state: "on"
action:
## init du texte avant d'entamer la conversation
- service: input_text.set_value
target:
entity_id: input_text.texte_libre
data:
value: ""
- delay: 00:00:04
## est-ce que c'est le GSM d'Alain qui est mis en charge
- service: input_text.set_value
target:
entity_id: input_text.texte_libre
data:
value: >
{{ iif(is_state('binary_sensor.alain_pro_is_charging', 'on'), "le GSM d'Alain", "") }}
## est-ce que c'est la tablette A10 qui est mise en charge
- service: input_text.set_value
target:
entity_id: input_text.texte_libre
data:
value: >
{% if is_state('input_text.texte_libre', '') %}
{{iif(is_state('binary_sensor.alain_tablette_is_charging','on') ,"la tablette A10","")}}
{% else %}
{{ states('input_text.texte_libre')}} {{iif(is_state('binary_sensor.alain_tablette_is_charging','on') ,"et la tablette A10","")}}
{% endif %}
## est-ce que c'est la tablette S NOTE qui est mise en charge
- service: input_text.set_value
target:
entity_id: input_text.texte_libre
data:
value: >
{% if is_state('input_text.texte_libre', '') %}
{{iif(is_state('binary_sensor.gt_n8010_is_charging','on') ,"la tablette S note","")}}
{% else %}
{{ states('input_text.texte_libre')}} {{iif(is_state('binary_sensor.gt_n8010_is_charging','on') ,"et la tablette S note","")}}
{% endif %}
## préparation du message de situation
- service: input_text.set_value
target:
entity_id: input_text.texte_libre
data:
value: >
{{ states('input_text.texte_libre')}}
{{iif(('et la' in states('input_text.texte_libre')) == false,' est en charge.',' sont en charge.')}}
## message de situation
- service: rest_command.tts_rhasspy
data:
site: 'maitre'
lemessage: "{{ states('input_text.texte_libre') }}"
- service: input_select.select_option
target:
entity_id:
- input_select.objet
data:
option: survmobilcharge
## préparation du texte final à prononcer
- service: input_text.set_value
target:
entity_id: input_text.texte_libre
data:
value: >
{{iif(('et la' in states('input_text.texte_libre')) == false,'Dois-je surveiller son niveau de charge ?','Dois-je surveiller leur niveau de charge ?')}}
- delay: 00:00:04
- service: mqtt.publish
data:
payload_template: " { \"init\": { \"type\": \"action\", \"canBeEnqueued\": \"false\", \"text\": \"{{ states('input_text.texte_libre') }}\", \"intentFilter\":[\"Negatif\",\"Affirmatif\"], \"sendIntentNotRecognized\": \"true\" }, \"siteId\": \"maitre\" }"
topic: hermes/dialogueManager/startSession
mode: single
Pour la gestion des réponses « oui / non » à la question sur la surveillance, j’ai ceci dans la config de Rhasspy :
[Affirmatif]
(oui | okay | ouais | yep | yes | affirmatif | bien sur | évidemment | cela va de soi | ouaip | absolument | tout a fait | aussi)
[Negatif]
(non | niet | négatif | pas la peine | pas nécessaire | surtout pas | pas du tout)
Puis voici le cas de l’automation qui gère le « oui » et qui a besoin de la déclaration d’un input_select objet qui me permet de savoir à quoi se rapporte la réponse « oui/non » car j’ai d’autres cas de dialogues avec Rhasspy :
input_select:
# quel élément est ciblé par la question oui/non de rhasppy
objet:
options:
- rien
- ampli
- tv
- sourde
- survmobilcharge
initial: rien
L’automation qui gère le « oui »
- id: rhasspy_affirmatif
## traitement des réponses positives
alias: rhasspy_affirmatif
description: ''
trigger:
- platform: event
event_type: rhasspy_Affirmatif
condition: []
action:
- choose:
## pour la surveillance de la charge des mobiles
- conditions:
- condition: state
entity_id: input_select.objet
state: survmobilcharge
sequence:
- service: input_boolean.turn_off
target:
entity_id:
- input_boolean.suivi_sonore_phone_alain
- input_boolean.suivi_sonore_tab_a10
- input_boolean.suivi_sonore_tab_snote
- service: tts.edge_tts_say
data:
entity_id: media_player.mpd
message: okay, je surveille
## et test si la tablette TAB A10 en charge
- choose:
- conditions:
- condition: state
entity_id: binary_sensor.alain_tablette_is_charging
state: "on"
sequence:
- service: input_boolean.turn_on
target:
entity_id: input_boolean.suivi_sonore_tab_a10
default:
## et test si GSM Alain en charge
- choose:
- conditions:
- condition: state
entity_id: binary_sensor.alain_pro_is_charging
state: "on"
sequence:
- service: input_boolean.turn_on
target:
entity_id: input_boolean.suivi_sonore_phone_alain
default:
## et test si tablette S note en charge
- choose:
- conditions:
- condition: state
entity_id: binary_sensor.gt_n8010_is_charging
state: "on"
sequence:
- service: input_boolean.turn_on
target:
entity_id: input_boolean.suivi_sonore_tab_snote
default:
default: []
- service: script.objet_rien
mode: parallel
Pour l’automation qui gère le « non » et qui a aussi besoin de l’input_select objet :
- id: rhasspy_negatif
## traitement des réponses négatives
alias: rhasspy_negatif
description: ''
trigger:
- platform: event
event_type: rhasspy_Negatif
condition: []
action:
- choose:
## pour la surveillance des mobiles
- conditions:
- condition: state
entity_id: input_select.objet
state: survmobilcharge
sequence:
- service: input_boolean.turn_off
target:
entity_id:
- input_boolean.suivi_sonore_phone_alain
- input_boolean.suivi_sonore_tab_a10
- input_boolean.suivi_sonore_tab_snote
- service: tts.edge_tts_say
data:
entity_id: media_player.mpd
message: okay, je ne surveille pas
- service: script.objet_rien
default: []
mode: parallel
Et pour finir, l’automation qui surveille le dépassement du seuil de 90% de charge et envoie un message vocal si on a répondu oui à la question. A noter, que si pas de message vocal il y a néanmoins envoi d’une notification sur 2 appareils principaux :
- id: batterie_mobiles_terminer
## surveillance du niveau de charge à 90% des mobiles avec alerte sonore si enclenchée
alias: batterie_mobiles_terminer
description: ''
trigger:
- platform: numeric_state
entity_id: sensor.gt_n8010_battery_level_3
above: 90
- platform: numeric_state
entity_id: sensor.alain_pro_battery_level
above: 90
- platform: numeric_state
entity_id: sensor.alain_tablette_battery_level
above: 90
action:
## notification envoyée sur mon GSM et ma tablette
- service: notify.mobile_app_alain_pro
data:
message: attention, charge presque complète pour {{ state_attr(trigger.entity_id,'friendly_name').split(" Batt")[0] }}
- service: notify.mobile_app_alain_tablette
data:
message: attention, charge presque complète pour {{ state_attr(trigger.entity_id,'friendly_name').split(" Batt")[0] }}
## message sonore sur cas de la tablette TAB A10 qui est à 90%
- choose:
- conditions:
- condition: and
conditions:
- condition: state
entity_id: binary_sensor.alain_tablette_is_charging
state: "on"
- condition: state
entity_id: input_boolean.suivi_sonore_tab_a10
state: "on"
sequence:
- service: input_boolean.turn_off
target:
entity_id: input_boolean.suivi_sonore_tab_a10
- service: tts.edge_tts_say
data:
entity_id: media_player.mpd
message: la tablette tab A10 est maintenant chargée a {{ states.sensor.alain_tablette_battery_level.state }} %
default:
## message sonore sur cas du GSM Alain qui est à 90%
- choose:
- conditions:
- condition: and
conditions:
- condition: state
entity_id: binary_sensor.alain_pro_is_charging
state: "on"
- condition: state
entity_id: input_boolean.suivi_sonore_phone_alain
state: "on"
sequence:
- service: input_boolean.turn_off
target:
entity_id: input_boolean.suivi_sonore_phone_alain
- service: tts.edge_tts_say
data:
entity_id: media_player.mpd
message: le gsm pro d'alain est maintenant chargé a {{ states.sensor.alain_pro_battery_level.state }} %
default:
## message sonore sur cas de la vieille tablette NOTE S qui est à 90%
- choose:
- conditions:
- condition: and
conditions:
- condition: state
entity_id: binary_sensor.gt_n8010_is_charging_3
state: "on"
- condition: state
entity_id: input_boolean.suivi_sonore_tab_snote
state: "on"
sequence:
- service: input_boolean.turn_off
target:
entity_id: input_boolean.suivi_sonore_tab_snote
- service: tts.edge_tts_say
data:
entity_id: media_player.mpd
message: la tablette S note est maintenant chargée a {{ states.sensor.alain_pro_battery_level.state }} %
default:
mode: single