add home assistant unifi cameras, datetimes, and voice notes
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
# Home Assistant
|
# Home Assistant
|
||||||
|
|
||||||
- [Home Assistant](#home-assistant)
|
- [Home Assistant](#home-assistant)
|
||||||
|
- [Certificates](#certificates)
|
||||||
- [Setup and Configuration](#setup-and-configuration)
|
- [Setup and Configuration](#setup-and-configuration)
|
||||||
- [Schlage Door Lock](#schlage-door-lock)
|
- [Schlage Door Lock](#schlage-door-lock)
|
||||||
- [Philips Hue Lights](#philips-hue-lights)
|
- [Philips Hue Lights](#philips-hue-lights)
|
||||||
@@ -13,8 +14,38 @@
|
|||||||
- [Roku Remote](#roku-remote)
|
- [Roku Remote](#roku-remote)
|
||||||
- [Flair Vent Battery](#flair-vent-battery)
|
- [Flair Vent Battery](#flair-vent-battery)
|
||||||
- [Voice](#voice)
|
- [Voice](#voice)
|
||||||
|
- [Changing the Voice of TTS](#changing-the-voice-of-tts)
|
||||||
- [Custom Sentences](#custom-sentences)
|
- [Custom Sentences](#custom-sentences)
|
||||||
|
- [Overriding Default Sentences](#overriding-default-sentences)
|
||||||
- [Notifications](#notifications)
|
- [Notifications](#notifications)
|
||||||
|
- [Unifi Cameras](#unifi-cameras)
|
||||||
|
- [Multiple Entity Triggers with Custom Names](#multiple-entity-triggers-with-custom-names)
|
||||||
|
- [Philips Hue Switches](#philips-hue-switches)
|
||||||
|
- [Datetimes](#datetimes)
|
||||||
|
- [LG TV Switch](#lg-tv-switch)
|
||||||
|
|
||||||
|
## Certificates
|
||||||
|
|
||||||
|
Note, self signed certs won't work on the hass android app.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Generate the key/cert
|
||||||
|
# Note, 36159 days == 99 years
|
||||||
|
openssl req \
|
||||||
|
-sha256 \
|
||||||
|
-addext "subjectAltName = IP:10.2.0.230" \
|
||||||
|
-newkey rsa:4096 \
|
||||||
|
-nodes \
|
||||||
|
-keyout privkey.pem \
|
||||||
|
-x509 \
|
||||||
|
-days 36159 \
|
||||||
|
-out fullchain.pem
|
||||||
|
|
||||||
|
http:
|
||||||
|
server_port: 8123
|
||||||
|
ssl_certificate: /ssl/fullchain.pem
|
||||||
|
ssl_key: /ssl/privkey.pem
|
||||||
|
```
|
||||||
|
|
||||||
## Setup and Configuration
|
## Setup and Configuration
|
||||||
|
|
||||||
@@ -400,10 +431,47 @@ Flair vents report low battery at 2.4v. 3v is nominal/full.
|
|||||||
|
|
||||||
## Voice
|
## Voice
|
||||||
|
|
||||||
|
### Changing the Voice of TTS
|
||||||
|
|
||||||
|
Select a media player -> play TTS -> select voice -> copy voice ID.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
options:
|
||||||
|
voice: DavisNeural||chat
|
||||||
|
```
|
||||||
|
|
||||||
### Custom Sentences
|
### Custom Sentences
|
||||||
|
|
||||||
<https://developers.home-assistant.io/docs/voice/intent-recognition/template-sentence-syntax/#sentence-templates-syntax>
|
<https://developers.home-assistant.io/docs/voice/intent-recognition/template-sentence-syntax/#sentence-templates-syntax>
|
||||||
|
|
||||||
|
### Overriding Default Sentences
|
||||||
|
|
||||||
|
1. Identify if your sentence conflicts with [Home Assistant's default
|
||||||
|
sentences](https://github.com/OHF-Voice/intents/tree/main/sentences/en)
|
||||||
|
2. Create a new file at `/config/custom_sentences/en/overrides.yaml`
|
||||||
|
3. As an example, to override the `HassGetWeather` sentence:
|
||||||
|
1. Copy the contents of `weather_HassGetWeather.yaml` into `overrides.yaml`
|
||||||
|
2. Rename `HassGetWeather` to `HassGetWeather_Custom`
|
||||||
|
3. Delete the required context `weather`
|
||||||
|
4. Now in `configuration.yaml`, under a section called `intent_script`, add the following
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
HassGetWeather_Custom:
|
||||||
|
speech:
|
||||||
|
text: >-
|
||||||
|
It's {{ int(states("sensor.backyard_weather_station_temp")) }} degrees
|
||||||
|
with {{ states("sensor.backyard_weather_station_humidity") }}% humidity.
|
||||||
|
I'm seeing {{ int(states("sensor.backyard_weather_station_wind_speed"))
|
||||||
|
}}mph wind. It's rained {{
|
||||||
|
int(states("sensor.backyard_weather_station_hourly_rain_rate")) }} inches
|
||||||
|
in the last hour.
|
||||||
|
```
|
||||||
|
|
||||||
|
5. Restart Home Assistant
|
||||||
|
6. Navigate to Settings -> Voice Assistants -> Click the 3 dots next to
|
||||||
|
your voice assistant -> Debug -> Click the icon in the top right -> Run
|
||||||
|
text pipeline -> "What's the weather"
|
||||||
|
|
||||||
## Notifications
|
## Notifications
|
||||||
|
|
||||||
Notification Information:
|
Notification Information:
|
||||||
@@ -413,3 +481,230 @@ Notification Information:
|
|||||||
```yaml
|
```yaml
|
||||||
Triggered by {{ trigger.entity_id }}, Date: {{ now().strftime('%Y-%m-%d') }}, Time: {{ now().strftime('%H:%M') }}
|
Triggered by {{ trigger.entity_id }}, Date: {{ now().strftime('%Y-%m-%d') }}, Time: {{ now().strftime('%H:%M') }}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Unifi Cameras
|
||||||
|
|
||||||
|
Create image/video previews of events with the following automation:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
alias: Vehicle Driveway Notification
|
||||||
|
description: Sends a notification with video upon motion detection.
|
||||||
|
triggers:
|
||||||
|
- entity_id:
|
||||||
|
- binary_sensor.driveway_camera_vehicle_detected
|
||||||
|
trigger: state
|
||||||
|
from: "on"
|
||||||
|
to: "off"
|
||||||
|
actions:
|
||||||
|
- data:
|
||||||
|
message: Vehicle detected on Driveway Camera
|
||||||
|
data:
|
||||||
|
image: >-
|
||||||
|
/api/unifiprotect/thumbnail/{{ config_entry_id(trigger.entity_id)
|
||||||
|
}}/{{ trigger.from_state.attributes.event_id }}
|
||||||
|
video: >-
|
||||||
|
/api/unifiprotect/video/{{ config_entry_id(trigger.entity_id) }}/{{
|
||||||
|
trigger.from_state.attributes.event_id }}
|
||||||
|
action: notify.notify
|
||||||
|
mode: single
|
||||||
|
max_exceeded: silent
|
||||||
|
```
|
||||||
|
|
||||||
|
## Multiple Entity Triggers with Custom Names
|
||||||
|
|
||||||
|
You can set an "id" for a trigger that can be used as a human readable name.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
alias: Notify when a Door Opened
|
||||||
|
description: ""
|
||||||
|
triggers:
|
||||||
|
- trigger: state
|
||||||
|
entity_id:
|
||||||
|
- binary_sensor.my_front_door
|
||||||
|
from: "off"
|
||||||
|
to: "on"
|
||||||
|
id: Front Door
|
||||||
|
- trigger: state
|
||||||
|
entity_id:
|
||||||
|
- binary_sensor.my_back_door
|
||||||
|
from: "off"
|
||||||
|
to: "on"
|
||||||
|
id: Back Door
|
||||||
|
- trigger: state
|
||||||
|
entity_id:
|
||||||
|
- binary_sensor.super_secret_door
|
||||||
|
from: "off"
|
||||||
|
to: "on"
|
||||||
|
id: Trap Door
|
||||||
|
conditions: []
|
||||||
|
actions:
|
||||||
|
- action: notify.notify
|
||||||
|
metadata: {}
|
||||||
|
data:
|
||||||
|
message: "{{ trigger.id }} Opened"
|
||||||
|
mode: single
|
||||||
|
```
|
||||||
|
|
||||||
|
## Philips Hue Switches
|
||||||
|
|
||||||
|
Philips Hue Switches don't expose entities, but rather trigger "zha_event" events.
|
||||||
|
|
||||||
|
To see events fired by these devices: Developer tools -> Events -> Listen to events `zha_event`
|
||||||
|
|
||||||
|
You can use this in automations like so:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
alias: Some Switch
|
||||||
|
description: ""
|
||||||
|
triggers:
|
||||||
|
- device_id: bb54b111ec77fb7d5356bb600789098f
|
||||||
|
domain: zha
|
||||||
|
type: remote_button_short_press
|
||||||
|
subtype: turn_on
|
||||||
|
trigger: device
|
||||||
|
id: "on"
|
||||||
|
- device_id: bb54b111ec77fb7d5356bb600789098f
|
||||||
|
domain: zha
|
||||||
|
type: remote_button_long_press
|
||||||
|
subtype: turn_on
|
||||||
|
trigger: device
|
||||||
|
id: on-con
|
||||||
|
conditions: []
|
||||||
|
actions:
|
||||||
|
- action: scene.turn_on
|
||||||
|
metadata: {}
|
||||||
|
data: {}
|
||||||
|
target:
|
||||||
|
entity_id: scene.some_scene
|
||||||
|
mode: single
|
||||||
|
```
|
||||||
|
|
||||||
|
## Datetimes
|
||||||
|
|
||||||
|
Stolen from Reddit
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
## Set placeholder templates for reference in this template
|
||||||
|
## 'dt' substitutes 'now()'
|
||||||
|
## eg. if currently 5 March 2024 at 09:08:07 (AM)
|
||||||
|
eg_now = {% set eg_now = "2024-03-05 09:08:07.123456+00:00" %}{{ eg_now }}
|
||||||
|
dt = {% set dt = eg_now | as_datetime %}{{ dt }}
|
||||||
|
ts = {% set ts = eg_now | as_timestamp %}{{ ts }}
|
||||||
|
|
||||||
|
## Basic Time & Date Functions
|
||||||
|
time_now: {{ now() }}
|
||||||
|
time_local: {{ now() | as_local }}
|
||||||
|
time_timestamp: {{ now() | as_timestamp }}
|
||||||
|
|
||||||
|
## Time Conversions
|
||||||
|
seconds_per_min : {% set spm = 60 | int %}{{ spm }}
|
||||||
|
seconds_per_hour: {% set sph = ( spm * 60 ) | int %}{{ sph }}
|
||||||
|
seconds_per_day : {% set spd = 86400 | int %}{{ spd }}
|
||||||
|
seconds_per_week: {% set spw = ( spd * 7 ) | int %}{{ spw }}
|
||||||
|
minutes_per_day : {% set mpd = ( spd / 60 ) | int %}{{ mpd }}
|
||||||
|
minutes_per_week: {% set mpw = ( mpd * 7 ) | int %}{{ mpw }}
|
||||||
|
hours_per_week : {% set hpw = ( 24 * 7 ) | int %}{{ hpw }}
|
||||||
|
|
||||||
|
## Time Calculations
|
||||||
|
## with DATETIME use timedelta:
|
||||||
|
* CURRENT TIME : {{ dt }}
|
||||||
|
+ 1 YEAR : {{ dt + timedelta(days=365) }}
|
||||||
|
- 1 DAY (24H) : {{ dt - timedelta(days=1) }}
|
||||||
|
+ 3 DAYS (72H) : {{ dt + timedelta(days=3) }}
|
||||||
|
- 3 HOURS : {{ dt - timedelta(hours=3) }}
|
||||||
|
+ 1 HR 26 MIN : {{ dt + timedelta(hours=1, minutes=26) }}
|
||||||
|
+ 1D 2H 3M 4S : {{ dt + timedelta(days=1, hours=2, minutes=3, seconds=4) }}
|
||||||
|
|
||||||
|
## with TIMESTAMP use maths and then convert:
|
||||||
|
## Referencing earlier calculations for ease
|
||||||
|
* TIMESTAMP : {{ ts }}
|
||||||
|
* CURRENT TIME : {{ ts | as_datetime }}
|
||||||
|
+ 1 YEAR : {{ ( ts + (spd * 365) ) | as_datetime }}
|
||||||
|
- 1 DAY (24H) : {{ ( ts - spd ) | as_datetime }}
|
||||||
|
+ 3 DAYS (72H) : {{ ( ts + (spd * 3) ) | as_datetime }}
|
||||||
|
- 3 HOURS : {{ ( ts - (sph * 3) ) | as_datetime }}
|
||||||
|
+ 1 HR 26 MIN : {{ ( ts + sph + (spm * 26) ) | as_datetime }}
|
||||||
|
+ 1D 2H 3M 4S : {{ ( ts + spd + (sph * 2) + (spm * 3) + 4 ) | as_datetime }}
|
||||||
|
|
||||||
|
## Adjusting Time & Date For Calculations
|
||||||
|
Start Of Today: {% set start_today = dt.replace(hour=0, minute=0, second=0, microsecond=0) %}{{ start_today }}
|
||||||
|
End Of Today : {% set start_tomorrow = start_today + timedelta(days=1) %}{{ start_tomorrow }}
|
||||||
|
|
||||||
|
## Use Relative Time For DATETIME in the PAST
|
||||||
|
relative_time: {{ relative_time( start_today ) }} ago
|
||||||
|
|
||||||
|
## For time in the FUTURE you can use:
|
||||||
|
{% set current_time = dt %}{% set future_time = as_local(dt) %}{% set time_distance = future_time - current_time %}
|
||||||
|
relative_future: In {{ relative_time(current_time - time_distance) }}
|
||||||
|
|
||||||
|
## Use Time Templates combined with History Stats Sensor:
|
||||||
|
sensor:
|
||||||
|
- platform: history_stats
|
||||||
|
name: Lamp ON today
|
||||||
|
entity_id: light.my_lamp
|
||||||
|
state: "on"
|
||||||
|
```
|
||||||
|
|
||||||
|
Stolen from <https://www.fabriziomusacchio.com/blog/2021-08-15-strftime_Cheat_Sheet/>
|
||||||
|
|
||||||
|
| Format | Example | Description |
|
||||||
|
| ------ | ------------------------ | -------------------------------------------------------------------------------------------------- |
|
||||||
|
| %c | Thu Jan 28 12:32:01 2014 | locale’s appropriate date and time representation |
|
||||||
|
| %D | 23/05/12 | formats the date |
|
||||||
|
| %F | 2002-01-30 | date in ISO 8601 format YYYY-MM-DD |
|
||||||
|
| %x | 02/10/11 | locale’s appropriate date representation |
|
||||||
|
| %X | 14:22:01 | locale’s appropriate time representation |
|
||||||
|
| %r | 3:44:12 AM | 12-hour time |
|
||||||
|
| %R | 15:21 | 24-hour time HH:MM |
|
||||||
|
| %T | 15:21:59 | time in ISO 8601 format HH:MM:SS |
|
||||||
|
| %A | Monday | full weekday name |
|
||||||
|
| %a | Mon | abbreviated weekday name |
|
||||||
|
| %w | 0-6 | day of the week with Sunday as 0 |
|
||||||
|
| %d | 01-31 | day of the month (with a leading zero) |
|
||||||
|
| %e | 1-31 | day of the month (without a leading zero) |
|
||||||
|
| %B | April | full month name |
|
||||||
|
| %b | Apr | abbreviated month name |
|
||||||
|
| %m | 01-12 | month of the year (with a leading zero) |
|
||||||
|
| %-m | 1-12 | month of the year (without a leading zero) |
|
||||||
|
| %Y | 2003 | year |
|
||||||
|
| %y | 00-99 | year without a century (last two digits, with a leading zero) |
|
||||||
|
| %-y | 0-99 | year without a century (last two digits, without a leading zero) |
|
||||||
|
| %H | 00-23 | hour of the day, 24-hour time (with a leading zero) |
|
||||||
|
| %k | 0-23 | hour of the day, 24-hour time (without a leading zero) |
|
||||||
|
| %I | 01-11 | hour of the day, 12-hour time (with a leading zero) |
|
||||||
|
| %-I | 1-11 | hour of the day, 12-hour time (without a leading zero) |
|
||||||
|
| %P | am, pm | am or pm designation |
|
||||||
|
| %p | AM, PM | AM or PM designation |
|
||||||
|
| %M | 00-59 | minute of the hour (with a leading zero) |
|
||||||
|
| %-M | 0-59 | minute of the hour (without a leading zero) |
|
||||||
|
| %S | 00-60 | second of the minute (with a leading zero) |
|
||||||
|
| %-S | 0-60 | second of the minute (without a leading zero) |
|
||||||
|
| %f | 000000-999999 | microsecond of the second (with a leading zero) |
|
||||||
|
| %Z | UTC | timezone name or abbreviation |
|
||||||
|
| %z | +0000 | UTC offset in the form +HHMM or -HHMM |
|
||||||
|
| %s | | amount of seconds since 1970-01-01 00:00:00 UTC |
|
||||||
|
| %% | | % sign |
|
||||||
|
| %j | 001-366 | day of the year (with a leading zeroes) |
|
||||||
|
| %U | 00-53 | week number with the first Sunday as the first day of week one |
|
||||||
|
| %W | 00-53 | week number of the current year, starting with the first Monday as the first day of the first week |
|
||||||
|
| %V | 01-53 | week number in ISO 8601 format |
|
||||||
|
|
||||||
|
## LG TV Switch
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- platform: wake_on_lan
|
||||||
|
mac: b4:b2:91:8e:ce:20
|
||||||
|
name: loft_lg_tv_wol
|
||||||
|
turn_off:
|
||||||
|
service: media_player.turn_off
|
||||||
|
target:
|
||||||
|
device_id: "{{device_id('media_player.loft_lg_tv')}}"
|
||||||
|
|
||||||
|
- platform: wake_on_lan
|
||||||
|
mac: 60:8d:26:2c:4d:45
|
||||||
|
name: living_room_lg_tv_wol
|
||||||
|
turn_off:
|
||||||
|
service: media_player.turn_off
|
||||||
|
target:
|
||||||
|
device_id: "{{device_id('media_player.living_room_lg_tv')}}"
|
||||||
|
```
|
||||||
|
|||||||
Reference in New Issue
Block a user