refactor(hass): restructure files with sentences
All checks were successful
Discord / discord commits (push) Has been skipped

This commit is contained in:
matt1432 2024-12-02 11:12:33 -05:00
parent ce4f9c23ec
commit fdb7c08643
6 changed files with 346 additions and 323 deletions

View file

@ -8,9 +8,10 @@
./bluetooth.nix ./bluetooth.nix
./firmware.nix ./firmware.nix
./frontend.nix ./frontend.nix
./netdaemon ./netdaemon
./spotify.nix ./spotify
./timer.nix ./timer
self.nixosModules.ha-plus self.nixosModules.ha-plus
]; ];

View file

@ -1,108 +0,0 @@
{
language = "en";
intents = {
PlayAlbum.data = [
{
sentences = [
"play[ing] [the] album {album} from [the] [artist] {artist}"
];
}
{
sentences = [
"play[ing] [the] album {album}"
];
slots.artist = "";
}
];
PlayArtist.data = [
{
sentences = [
"play[ing] [some] music from [the] [artist] {artist}"
"play[ing] [the] artist {artist}"
];
}
];
PlayPlaylist.data = [
{
sentences = [
"play[ing] [(the|my)] playlist {playlist}"
];
}
];
PlaySong.data = [
{
sentences = [
"play[ing] [the] (song|track) {song} from [the] [artist] {artist}"
];
}
{
sentences = [
"play[ing] [the] (song|track) {song}"
];
slots.artist = "";
}
];
Pause.data = [
{
sentences = [
"(pause|stop) [the] [(song|track|music)]"
"(pause|stop) spotify"
];
}
];
Unpause.data = [
{
sentences = [
"(unpause|resume) [the] [(song|track|music)]"
"(unpause|resume) spotify"
];
}
];
};
lists = {
album.wildcard = true;
artist.wildcard = true;
playlist.wildcard = true;
song.wildcard = true;
};
responses.intents = {
PlayAlbum.default = ''
Searching for the album {{ slots.album }}
{% if slots.artist != "" %}
by {{ slots.artist }}
{% endif %}
on Spotify and playing it.
'';
PlayArtist.default = ''
Searching for the artist {{ slots.artist }} on Spotify and playing their top songs.
'';
PlayPlaylist.default = ''
Searching for {{ slots.playlist }} in your favorites, or elsewhere if not found, and playing it.
'';
PlaySong.default = ''
Searching for the song {{ slots.song }}
{% if slots.artist != "" %}
by {{ slots.artist }}
{% endif %}
on Spotify and playing it.
'';
Pause.default = ''
Pausing the music.
'';
Unpause.default = ''
Resuming the music.
'';
};
}

View file

@ -16,7 +16,7 @@
"spotify" "spotify"
]; ];
customSentences."assist_spotify" = import ./spotify-sentences.nix; customSentences."assist_spotify" = import ./sentences.nix;
configFiles. configFiles.
".storage/SpotifyWebApiPython_librespot_credentials.json" ".storage/SpotifyWebApiPython_librespot_credentials.json"

View file

@ -0,0 +1,129 @@
{
language = "en";
lists = {
album.wildcard = true;
artist.wildcard = true;
playlist.wildcard = true;
song.wildcard = true;
};
# ---------------------------------------
# PlayAlbum
# ---------------------------------------
intents.PlayAlbum.data = [
{
sentences = [
"play[ing] [the] album {album} from [the] [artist] {artist}"
];
}
{
sentences = [
"play[ing] [the] album {album}"
];
slots.artist = "";
}
];
responses.intents.PlayAlbum.default = ''
Searching for the album {{ slots.album }}
{% if slots.artist != "" %}
by {{ slots.artist }}
{% endif %}
on Spotify and playing it.
'';
# ---------------------------------------
# PlayArtist
# ---------------------------------------
intents.PlayArtist.data = [
{
sentences = [
"play[ing] [some] music from [the] [artist] {artist}"
"play[ing] [the] artist {artist}"
];
}
];
responses.intents.PlayArtist.default = ''
Searching for the artist {{ slots.artist }} on Spotify and playing their top songs.
'';
# ---------------------------------------
# PlayPlaylist
# ---------------------------------------
intents.PlayPlaylist.data = [
{
sentences = [
"play[ing] [(the|my)] playlist {playlist}"
];
}
];
responses.intents.PlayPlaylist.default = ''
Searching for {{ slots.playlist }} in your favorites, or elsewhere if not found, and playing it.
'';
# ---------------------------------------
# PlaySong
# ---------------------------------------
intents.PlaySong.data = [
{
sentences = [
"play[ing] [the] (song|track) {song} from [the] [artist] {artist}"
];
}
{
sentences = [
"play[ing] [the] (song|track) {song}"
];
slots.artist = "";
}
];
responses.intents.PlaySong.default = ''
Searching for the song {{ slots.song }}
{% if slots.artist != "" %}
by {{ slots.artist }}
{% endif %}
on Spotify and playing it.
'';
# ---------------------------------------
# Pause
# ---------------------------------------
intents.Pause.data = [
{
sentences = [
"(pause|stop) [the] [(song|track|music)]"
"(pause|stop) spotify"
];
}
];
responses.intents.Pause.default = ''
Pausing the music.
'';
# ---------------------------------------
# Unpause
# ---------------------------------------
intents.Unpause.data = [
{
sentences = [
"(unpause|resume) [the] [(song|track|music)]"
"(unpause|resume) spotify"
];
}
];
responses.intents.Unpause.default = ''
Resuming the music.
'';
}

View file

@ -1,3 +1,4 @@
# TODO: rewrite this in NetDaemon
# From https://github.com/don86nl/ha_intents/blob/main/config/packages/assist_timers.yaml # From https://github.com/don86nl/ha_intents/blob/main/config/packages/assist_timers.yaml
{lib, ...}: let {lib, ...}: let
inherit (lib) concatStrings concatStringsSep; inherit (lib) concatStrings concatStringsSep;
@ -39,7 +40,7 @@
}; };
in { in {
services.home-assistant = { services.home-assistant = {
customSentences."assist_timers" = import ./timer-sentences.nix; customSentences."assist_timers" = import ./sentences.nix;
config = { config = {
homeassistant.customize."script.assist_timerstart" = {inherit settings;}; homeassistant.customize."script.assist_timerstart" = {inherit settings;};

View file

@ -123,6 +123,217 @@
]; ];
}; };
responses.intents = {
TimerDuration.default = ''
{%- set timer_amount = states.timer
| selectattr('state','eq','active')
| selectattr('entity_id','match','timer.assist_timer*')
| map(attribute='entity_id')
| list
| length -%}
{% if timer_amount == 0 %}
There are no timers active.
{% else %}
{%- if slots.entity_id != 'all' and slots.entity_id != 'null' %}
{%- set active_timers = states.timer
| selectattr('state','eq','active')
| selectattr('entity_id','match',slots.entity_id)
| list -%}
{%- else%}
{%- set active_timers = states.timer
| selectattr('state','eq','active')
| selectattr('entity_id','match','timer.assist_timer*')
| list -%}
{%- endif %}
{% if active_timers|length == 0 %}
{%- if slots.entity_id != 'all' and slots.entity_id != 'null' %}
This timer is not active.
{%- else %}
There are no timers active.
{%- endif %}
{% elif active_timers|length > 1 %}
There are {{active_timers|length }} timers active.
{% endif %}
{% for timer in active_timers %}
{% set timer_id = timer.entity_id %}
{% set timer_finishes_at = state_attr(timer_id, 'finishes_at') %}
{% set time_remaining = as_datetime(timer_finishes_at) - now() %}
{% set hours_remaining = time_remaining.total_seconds() // 3600 %}
{% set minutes_remaining = (time_remaining.total_seconds() % 3600) // 60 %}
{% set seconds_remaining = time_remaining.total_seconds() % 60 %}
{% if timer.state == "active" or timer.state == "paused" %}
{% if slots.entity_id != timer_id %}
{{ state_attr(timer_id, 'friendly_name')[9:] }}
{% if timer.state == "paused" %}
is paused and
{% endif %}
has
{% else %}
There are
{% endif %}
{% if hours_remaining > 0 %}
{{ hours_remaining | round }} hours
{% endif %}
{% if minutes_remaining == 1 %}
1 minute
{% endif %}
{% if minutes_remaining > 1 %}
{{ minutes_remaining | round }} minutes
{% endif %}
{% if seconds_remaining == 1 and hours_remaining == 0%}
1 seconde
{% endif %}
{% if seconds_remaining > 1 and hours_remaining == 0 %}
{{ seconds_remaining | round }} seconds
{% endif %}
remaining.
{% endif %}
{% endfor %}
{% endif %}
'';
TimerPause.default = ''
{%- if slots.timer_action is set or slots.timer_action != "" -%}
{%- set timer_action = slots.timer_action -%}
{%- else -%}
{%- set timer_action = "resume" -%}
{%- endif -%}
{%- set timer_amount = states.timer
| selectattr('state','eq','active')
| selectattr('entity_id','match','timer.assist_timer*')
| map(attribute='entity_id')
| list
| length -%}
{% if timer_amount == 0 %}
There are no timers active.
{% elif timer_amount > 1 and slots.entity_id == 'null' %}
There are multiple timers active.
{{ (["Please specify which timer you mean.", "Please specify which timer.", "Specify which timer you mean.", ""] | random) }}
{% elif slots.entity_id == 'all' %}
{{ (["Understood. ", "Okay. ", "Of course. ", ""] | random) }}.
All timers
{% if timer_action == "pause" %}
paused
{% else %}
resumed
{% endif %}
.
{% elif (as_timestamp(now()) - as_timestamp(states.timer.assist_timer1.last_changed) < 3 and states('timer.assist_timer1') == 'idle') or
(as_timestamp(now()) - as_timestamp(states.timer.assist_timer2.last_changed) < 3 and states('timer.assist_timer2') == 'idle') or
(as_timestamp(now()) - as_timestamp(states.timer.assist_timer3.last_changed) < 3 and states('timer.assist_timer3') == 'idle') %}
Timer
{% if timer_action == "pause" %}
paused
{% else %}
resumed
{% endif %}
.
{% elif (timer_amount == 1 and slots.entity_id == 'null') or
(slots.entity_id == 'timer.assist_timer1' and states('timer.assist_timer1') != 'idle') or
(slots.entity_id == 'timer.assist_timer2' and states('timer.assist_timer2') != 'idle') or
(slots.entity_id == 'timer.assist_timer3' and states('timer.assist_timer3') != 'idle') %}
{{ (["Understood. ", "Okay. ", "Of course. ", ""] | random) }}Timer
{% if timer_action == "pause" %}
paused
{% else %}
resumed
{% endif %}
.
{% else %}
This timer is not active.
{% endif %}
'';
TimerStart.default = ''
{{ (["Understood. ", "Okay. ", "Of course. ", ""] | random) +
(["I will start a timer for ", "Timer started with ", "Starting timer with ", "Timer active for "] | random)}}
{% if (slots.hours | int(default=0)) == 1 %}
1 hour
{% elif (slots.hours | int(default=0)) > 1 %}
{{ (slots.hours | int)}} hours
{% endif %}
{% if (slots.hours | int(default=0)) > 0 and ((slots.minutes | int(default=0)) > 0 or (slots.seconds | int(default=0)) > 0) %}
and
{% endif %}
{% if (slots.minutes | int(default=0)) == 1 %}
1 minute
{% elif (slots.minutes | int(default=0)) > 1 %}
{{ (slots.minutes | int)}} minutes
{% endif %}
{% if (slots.minutes | int(default=0)) > 0 and (slots.seconds | int(default=0)) > 0 %}
and
{% endif %}
{% if (slots.seconds | int(default=0)) == 1 %}
1 second
{% elif (slots.seconds | int(default=0)) > 1 %}
{{ (slots.seconds | int)}} secondes
{% endif %}.
'';
TimerStop.default = ''
{%- set timer_amount = states.timer
| selectattr('state','eq','active')
| selectattr('entity_id','match','timer.assist_timer*')
| map(attribute='entity_id')
| list
| length -%}
{% set mediaplayer = namespace(entity=[]) %}
{% for player in states.media_player %}
{%- if ((state_attr(player.entity_id, 'media_content_id') | lower != 'none'
and state_attr(player.entity_id, 'media_content_id')[:47][38:] == 'Timer.mp3')
or state_attr(player.entity_id, 'media_title') | lower == 'timer')
and states(player.entity_id) == 'playing' -%}
{%- set mediaplayer.entity = player.entity_id -%}
{% endif -%}
{% endfor %}
{% if mediaplayer.entity[:12] == 'media_player' %}
{{ (["Understood. ", "Okay. ", "Of course. ", ""] | random) }}Timer stopped.
{% elif timer_amount == 0 and
(as_timestamp(now()) - as_timestamp(states.timer.assist_timer1.last_changed) > 3 and states('timer.assist_timer1') == 'idle') and
(as_timestamp(now()) - as_timestamp(states.timer.assist_timer2.last_changed) > 3 and states('timer.assist_timer2') == 'idle') and
(as_timestamp(now()) - as_timestamp(states.timer.assist_timer3.last_changed) > 3 and states('timer.assist_timer3') == 'idle') %}
There are no timers active.
{% elif (slots_entity_id == 'timer.assist_timer1' and states('timer.assist_timer1') == 'idle') or
(slots_entity_id == 'timer.assist_timer2' and states('timer.assist_timer2') == 'idle') or
(slots_entity_id == 'timer.assist_timer3' and states('timer.assist_timer3') == 'idle') %}
This timer is not active.
{% elif timer_amount > 1 and slots_entity_id == 'null' %}
There are multiple timers active.
{{ (["Please specify which timer you mean.", "Please specify which timer.", "Specify which timer you mean.", ""] | random) }}
{% elif slots_entity_id == 'all' %}
{{ (["Understood. ", "Okay. ", "Of course. ", ""] | random) }}All timers stopped.
{% else %}
{{ (["Understood. ", "Okay. ", "Of course. ", ""] | random) }}Timer stopped.
{% endif %}
'';
};
lists = { lists = {
entity_id.values = [ entity_id.values = [
{ {
@ -728,215 +939,4 @@
} }
]; ];
}; };
responses.intents = {
TimerDuration.default = ''
{%- set timer_amount = states.timer
| selectattr('state','eq','active')
| selectattr('entity_id','match','timer.assist_timer*')
| map(attribute='entity_id')
| list
| length -%}
{% if timer_amount == 0 %}
There are no timers active.
{% else %}
{%- if slots.entity_id != 'all' and slots.entity_id != 'null' %}
{%- set active_timers = states.timer
| selectattr('state','eq','active')
| selectattr('entity_id','match',slots.entity_id)
| list -%}
{%- else%}
{%- set active_timers = states.timer
| selectattr('state','eq','active')
| selectattr('entity_id','match','timer.assist_timer*')
| list -%}
{%- endif %}
{% if active_timers|length == 0 %}
{%- if slots.entity_id != 'all' and slots.entity_id != 'null' %}
This timer is not active.
{%- else %}
There are no timers active.
{%- endif %}
{% elif active_timers|length > 1 %}
There are {{active_timers|length }} timers active.
{% endif %}
{% for timer in active_timers %}
{% set timer_id = timer.entity_id %}
{% set timer_finishes_at = state_attr(timer_id, 'finishes_at') %}
{% set time_remaining = as_datetime(timer_finishes_at) - now() %}
{% set hours_remaining = time_remaining.total_seconds() // 3600 %}
{% set minutes_remaining = (time_remaining.total_seconds() % 3600) // 60 %}
{% set seconds_remaining = time_remaining.total_seconds() % 60 %}
{% if timer.state == "active" or timer.state == "paused" %}
{% if slots.entity_id != timer_id %}
{{ state_attr(timer_id, 'friendly_name')[9:] }}
{% if timer.state == "paused" %}
is paused and
{% endif %}
has
{% else %}
There are
{% endif %}
{% if hours_remaining > 0 %}
{{ hours_remaining | round }} hours
{% endif %}
{% if minutes_remaining == 1 %}
1 minute
{% endif %}
{% if minutes_remaining > 1 %}
{{ minutes_remaining | round }} minutes
{% endif %}
{% if seconds_remaining == 1 and hours_remaining == 0%}
1 seconde
{% endif %}
{% if seconds_remaining > 1 and hours_remaining == 0 %}
{{ seconds_remaining | round }} seconds
{% endif %}
remaining.
{% endif %}
{% endfor %}
{% endif %}
'';
TimerPause.default = ''
{%- if slots.timer_action is set or slots.timer_action != "" -%}
{%- set timer_action = slots.timer_action -%}
{%- else -%}
{%- set timer_action = "resume" -%}
{%- endif -%}
{%- set timer_amount = states.timer
| selectattr('state','eq','active')
| selectattr('entity_id','match','timer.assist_timer*')
| map(attribute='entity_id')
| list
| length -%}
{% if timer_amount == 0 %}
There are no timers active.
{% elif timer_amount > 1 and slots.entity_id == 'null' %}
There are multiple timers active.
{{ (["Please specify which timer you mean.", "Please specify which timer.", "Specify which timer you mean.", ""] | random) }}
{% elif slots.entity_id == 'all' %}
{{ (["Understood. ", "Okay. ", "Of course. ", ""] | random) }}.
All timers
{% if timer_action == "pause" %}
paused
{% else %}
resumed
{% endif %}
.
{% elif (as_timestamp(now()) - as_timestamp(states.timer.assist_timer1.last_changed) < 3 and states('timer.assist_timer1') == 'idle') or
(as_timestamp(now()) - as_timestamp(states.timer.assist_timer2.last_changed) < 3 and states('timer.assist_timer2') == 'idle') or
(as_timestamp(now()) - as_timestamp(states.timer.assist_timer3.last_changed) < 3 and states('timer.assist_timer3') == 'idle') %}
Timer
{% if timer_action == "pause" %}
paused
{% else %}
resumed
{% endif %}
.
{% elif (timer_amount == 1 and slots.entity_id == 'null') or
(slots.entity_id == 'timer.assist_timer1' and states('timer.assist_timer1') != 'idle') or
(slots.entity_id == 'timer.assist_timer2' and states('timer.assist_timer2') != 'idle') or
(slots.entity_id == 'timer.assist_timer3' and states('timer.assist_timer3') != 'idle') %}
{{ (["Understood. ", "Okay. ", "Of course. ", ""] | random) }}Timer
{% if timer_action == "pause" %}
paused
{% else %}
resumed
{% endif %}
.
{% else %}
This timer is not active.
{% endif %}
'';
TimerStart.default = ''
{{ (["Understood. ", "Okay. ", "Of course. ", ""] | random) +
(["I will start a timer for ", "Timer started with ", "Starting timer with ", "Timer active for "] | random)}}
{% if (slots.hours | int(default=0)) == 1 %}
1 hour
{% elif (slots.hours | int(default=0)) > 1 %}
{{ (slots.hours | int)}} hours
{% endif %}
{% if (slots.hours | int(default=0)) > 0 and ((slots.minutes | int(default=0)) > 0 or (slots.seconds | int(default=0)) > 0) %}
and
{% endif %}
{% if (slots.minutes | int(default=0)) == 1 %}
1 minute
{% elif (slots.minutes | int(default=0)) > 1 %}
{{ (slots.minutes | int)}} minutes
{% endif %}
{% if (slots.minutes | int(default=0)) > 0 and (slots.seconds | int(default=0)) > 0 %}
and
{% endif %}
{% if (slots.seconds | int(default=0)) == 1 %}
1 second
{% elif (slots.seconds | int(default=0)) > 1 %}
{{ (slots.seconds | int)}} secondes
{% endif %}.
'';
TimerStop.default = ''
{%- set timer_amount = states.timer
| selectattr('state','eq','active')
| selectattr('entity_id','match','timer.assist_timer*')
| map(attribute='entity_id')
| list
| length -%}
{% set mediaplayer = namespace(entity=[]) %}
{% for player in states.media_player %}
{%- if ((state_attr(player.entity_id, 'media_content_id') | lower != 'none'
and state_attr(player.entity_id, 'media_content_id')[:47][38:] == 'Timer.mp3')
or state_attr(player.entity_id, 'media_title') | lower == 'timer')
and states(player.entity_id) == 'playing' -%}
{%- set mediaplayer.entity = player.entity_id -%}
{% endif -%}
{% endfor %}
{% if mediaplayer.entity[:12] == 'media_player' %}
{{ (["Understood. ", "Okay. ", "Of course. ", ""] | random) }}Timer stopped.
{% elif timer_amount == 0 and
(as_timestamp(now()) - as_timestamp(states.timer.assist_timer1.last_changed) > 3 and states('timer.assist_timer1') == 'idle') and
(as_timestamp(now()) - as_timestamp(states.timer.assist_timer2.last_changed) > 3 and states('timer.assist_timer2') == 'idle') and
(as_timestamp(now()) - as_timestamp(states.timer.assist_timer3.last_changed) > 3 and states('timer.assist_timer3') == 'idle') %}
There are no timers active.
{% elif (slots_entity_id == 'timer.assist_timer1' and states('timer.assist_timer1') == 'idle') or
(slots_entity_id == 'timer.assist_timer2' and states('timer.assist_timer2') == 'idle') or
(slots_entity_id == 'timer.assist_timer3' and states('timer.assist_timer3') == 'idle') %}
This timer is not active.
{% elif timer_amount > 1 and slots_entity_id == 'null' %}
There are multiple timers active.
{{ (["Please specify which timer you mean.", "Please specify which timer.", "Specify which timer you mean.", ""] | random) }}
{% elif slots_entity_id == 'all' %}
{{ (["Understood. ", "Okay. ", "Of course. ", ""] | random) }}All timers stopped.
{% else %}
{{ (["Understood. ", "Okay. ", "Of course. ", ""] | random) }}Timer stopped.
{% endif %}
'';
};
} }