diff --git a/active/device_home_assistant/home_assistant.md b/active/device_home_assistant/home_assistant.md index d13fbcc..56b1a65 100644 --- a/active/device_home_assistant/home_assistant.md +++ b/active/device_home_assistant/home_assistant.md @@ -1,6 +1,7 @@ # Home Assistant - [Home Assistant](#home-assistant) + - [Certificates](#certificates) - [Setup and Configuration](#setup-and-configuration) - [Schlage Door Lock](#schlage-door-lock) - [Philips Hue Lights](#philips-hue-lights) @@ -13,8 +14,38 @@ - [Roku Remote](#roku-remote) - [Flair Vent Battery](#flair-vent-battery) - [Voice](#voice) + - [Changing the Voice of TTS](#changing-the-voice-of-tts) - [Custom Sentences](#custom-sentences) + - [Overriding Default Sentences](#overriding-default-sentences) - [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 @@ -400,10 +431,47 @@ Flair vents report low battery at 2.4v. 3v is nominal/full. ## Voice +### Changing the Voice of TTS + +Select a media player -> play TTS -> select voice -> copy voice ID. + +```yaml +options: + voice: DavisNeural||chat +``` + ### Custom Sentences +### 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 Notification Information: @@ -413,3 +481,230 @@ Notification Information: ```yaml 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 + +| 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')}}" +```