mirror of
https://github.com/CCOSTAN/Home-AssistantConfig.git
synced 2025-12-12 18:12:25 +00:00
Compare commits
7 Commits
d900c642dd
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9d6c73fb05 | ||
|
|
8ec5173f4d | ||
|
|
c245c1ca78 | ||
|
|
96e86d6587 | ||
|
|
3345bf3b95 | ||
|
|
a8eca6f4bb | ||
|
|
02a554a793 |
@@ -1 +1 @@
|
|||||||
2025.12.1
|
2025.12.2
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
#-------------------------------------------
|
|
||||||
# @CCOSTAN
|
|
||||||
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
|
||||||
# Backups - Monitor backup jobs and alert on failures.
|
|
||||||
#-------------------------------------------
|
|
||||||
######################################################################
|
|
||||||
## Duplicati/backup status sensors and notifications.
|
|
||||||
######################################################################
|
|
||||||
# Added Duplicati to HA - https://github.com/CCOSTAN/Home-AssistantConfig/issues/1498
|
|
||||||
automation:
|
|
||||||
- alias: 'Backup Job Failed Notification'
|
|
||||||
id: 5b3a4c89-1234-4567-8901-23456789abcf
|
|
||||||
trigger:
|
|
||||||
- platform: state
|
|
||||||
entity_id: sensor.dockerconfigs_backup_error_message
|
|
||||||
from: '-'
|
|
||||||
action:
|
|
||||||
- service: script.notify_engine
|
|
||||||
data:
|
|
||||||
who: 'carlo'
|
|
||||||
value1: 'Backup Job Error!'
|
|
||||||
value2: "Error: {{ states('sensor.dockerconfigs_backup_error_message') }}"
|
|
||||||
|
|
||||||
- alias: 'Backup Size Change Alert'
|
|
||||||
id: 5b3a4c89-1234-4567-8901-23456789abd0
|
|
||||||
trigger:
|
|
||||||
- platform: numeric_state
|
|
||||||
entity_id: sensor.dockerconfigs_backup_target_size
|
|
||||||
above: 10000000000 # Alert if backup size is over 10GB
|
|
||||||
action:
|
|
||||||
- service: script.notify_engine
|
|
||||||
data:
|
|
||||||
who: 'carlo'
|
|
||||||
value1: 'Backup Size Warning'
|
|
||||||
value2: >
|
|
||||||
Backup target size has grown to {{ states('sensor.dockerconfigs_backup_target_size') | float / 1000000000 }} GB.
|
|
||||||
Please verify backup contents and available storage.
|
|
||||||
@@ -413,22 +413,6 @@ automation:
|
|||||||
from: 'home'
|
from: 'home'
|
||||||
|
|
||||||
action:
|
action:
|
||||||
- choose:
|
|
||||||
- conditions: "{{ is_state('binary_sensor.sleepnumber_carlo_stacey_is_in_bed','on') }}"
|
|
||||||
sequence:
|
|
||||||
- service: media_player.play_media
|
|
||||||
data:
|
|
||||||
entity_id: media_player.stacey_bedroom
|
|
||||||
media_content_id: 'show garage camera from home assistant'
|
|
||||||
media_content_type: custom
|
|
||||||
- delay: '00:10:00'
|
|
||||||
- service: media_player.play_media
|
|
||||||
data:
|
|
||||||
entity_id: media_player.stacey_bedroom
|
|
||||||
media_content_id: 'hide garage camera'
|
|
||||||
media_content_type: custom
|
|
||||||
|
|
||||||
default:
|
|
||||||
- service: media_player.play_media
|
- service: media_player.play_media
|
||||||
target:
|
target:
|
||||||
entity_id: media_player.kitchen
|
entity_id: media_player.kitchen
|
||||||
|
|||||||
96
config/packages/llmvision.yaml
Normal file
96
config/packages/llmvision.yaml
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
######################################################################
|
||||||
|
# @CCOSTAN - Follow Me on X
|
||||||
|
# For more info visit https://www.vcloudinfo.com/click-here
|
||||||
|
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# LLM Vision - Garage Cans X Check - detects reflective X on right wall
|
||||||
|
# Trigger with input_button.llmvision_garbage_check to update garbage_cans_out.
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# Notes: LLMVision analyzes camera.garagecam; expects strict "on"/"off" output.
|
||||||
|
# Docs: https://llmvision.gitbook.io/getting-started/usage/image-analyzer
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
input_button:
|
||||||
|
llmvision_garbage_check:
|
||||||
|
name: "LLM Vision: Garage cans check"
|
||||||
|
icon: mdi:delete-variant
|
||||||
|
|
||||||
|
input_boolean:
|
||||||
|
garbage_cans_out:
|
||||||
|
name: "Garbage Cans Out"
|
||||||
|
icon: mdi:trash-can
|
||||||
|
|
||||||
|
input_text:
|
||||||
|
llmvision_garbage_last_response:
|
||||||
|
name: "LLM Vision garage response"
|
||||||
|
max: 255
|
||||||
|
llmvision_garbage_last_keyframe:
|
||||||
|
name: "LLM Vision garage key frame"
|
||||||
|
max: 255
|
||||||
|
|
||||||
|
input_datetime:
|
||||||
|
llmvision_garbage_last_run:
|
||||||
|
name: "LLM Vision garage last run"
|
||||||
|
has_date: true
|
||||||
|
has_time: true
|
||||||
|
|
||||||
|
template:
|
||||||
|
- binary_sensor:
|
||||||
|
- name: "Garbage Cans Out"
|
||||||
|
unique_id: llmvision_garbage_cans_out
|
||||||
|
device_class: presence
|
||||||
|
state: "{{ is_state('input_boolean.garbage_cans_out', 'on') }}"
|
||||||
|
attributes:
|
||||||
|
last_run: "{{ states('input_datetime.llmvision_garbage_last_run') }}"
|
||||||
|
last_response: "{{ states('input_text.llmvision_garbage_last_response') }}"
|
||||||
|
last_key_frame: "{{ states('input_text.llmvision_garbage_last_keyframe') }}"
|
||||||
|
source_camera: camera.garagecam
|
||||||
|
|
||||||
|
automation:
|
||||||
|
- alias: LLM Vision - Garbage cans out
|
||||||
|
id: d88a2e6d-78f3-4bb7-9d9f-c4d06e6eb5a9
|
||||||
|
mode: restart
|
||||||
|
trigger:
|
||||||
|
- platform: state
|
||||||
|
entity_id: input_button.llmvision_garbage_check
|
||||||
|
variables:
|
||||||
|
prompt_text: >
|
||||||
|
Examine the image. I have taped a reflective X on the right wall. Look for the reflective X on the right wall. If you clearly see the X, respond exactly: on. If you cannot see the X, respond exactly: off. No other words.
|
||||||
|
action:
|
||||||
|
- service: llmvision.data_analyzer
|
||||||
|
response_variable: llmvision_result
|
||||||
|
data:
|
||||||
|
provider: !secret llmvision_provider_entry
|
||||||
|
model: gpt-4.1-nano
|
||||||
|
message: "{{ prompt_text }}"
|
||||||
|
sensor_entity: input_boolean.garbage_cans_out
|
||||||
|
image_entity:
|
||||||
|
- camera.garagecam
|
||||||
|
include_filename: false
|
||||||
|
target_width: 1280
|
||||||
|
max_tokens: 16
|
||||||
|
expose_images: true
|
||||||
|
- service: input_text.set_value
|
||||||
|
target:
|
||||||
|
entity_id: input_text.llmvision_garbage_last_response
|
||||||
|
data:
|
||||||
|
value: "{{ (llmvision_result.response_text | default('unknown'))[:250] }}"
|
||||||
|
- choose:
|
||||||
|
- conditions: "{{ llmvision_result is defined and llmvision_result.key_frame is defined }}"
|
||||||
|
sequence:
|
||||||
|
- service: input_text.set_value
|
||||||
|
target:
|
||||||
|
entity_id: input_text.llmvision_garbage_last_keyframe
|
||||||
|
data:
|
||||||
|
value: "{{ llmvision_result.key_frame }}"
|
||||||
|
default:
|
||||||
|
- service: input_text.set_value
|
||||||
|
target:
|
||||||
|
entity_id: input_text.llmvision_garbage_last_keyframe
|
||||||
|
data:
|
||||||
|
value: ""
|
||||||
|
- service: input_datetime.set_datetime
|
||||||
|
target:
|
||||||
|
entity_id: input_datetime.llmvision_garbage_last_run
|
||||||
|
data:
|
||||||
|
datetime: "{{ now() }}"
|
||||||
23
config/packages/n8n.yaml
Normal file
23
config/packages/n8n.yaml
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
######################################################################
|
||||||
|
# @CCOSTAN - Follow Me on X
|
||||||
|
# For more info visit https://www.vcloudinfo.com/click-here
|
||||||
|
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# n8n Discord Router - Route HA events to Discord via JoAnnaBot
|
||||||
|
# Central REST command into n8n's Discord routing webhook
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# <No related GitHub issue>
|
||||||
|
# REST endpoint: n8n webhook /discord-router
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
rest_command:
|
||||||
|
send_to_discord:
|
||||||
|
url: "http://192.168.10.69:5678/webhook/discord-router"
|
||||||
|
method: POST
|
||||||
|
content_type: "application/json"
|
||||||
|
payload: >
|
||||||
|
{
|
||||||
|
"topic": "{{ topic }}",
|
||||||
|
"message": "{{ message }}"
|
||||||
|
}
|
||||||
|
|
||||||
@@ -168,6 +168,9 @@ automation:
|
|||||||
- condition: template
|
- condition: template
|
||||||
value_template: "{{ not is_state('vacuum.l10s_vacuum', 'cleaning') }}"
|
value_template: "{{ not is_state('vacuum.l10s_vacuum', 'cleaning') }}"
|
||||||
action:
|
action:
|
||||||
|
- service: input_boolean.turn_on
|
||||||
|
target:
|
||||||
|
entity_id: input_boolean.l10s_vacuum_on_demand
|
||||||
- service: script.l10s_vacuum_start_next_room
|
- service: script.l10s_vacuum_start_next_room
|
||||||
|
|
||||||
- alias: 'Away Vacuum: Dock When Family Returns'
|
- alias: 'Away Vacuum: Dock When Family Returns'
|
||||||
@@ -232,6 +235,9 @@ automation:
|
|||||||
- condition: state
|
- condition: state
|
||||||
entity_id: vacuum.l10s_vacuum
|
entity_id: vacuum.l10s_vacuum
|
||||||
state: 'cleaning'
|
state: 'cleaning'
|
||||||
|
- condition: state
|
||||||
|
entity_id: input_boolean.l10s_vacuum_on_demand
|
||||||
|
state: 'on'
|
||||||
|
|
||||||
action:
|
action:
|
||||||
- service: input_text.set_value
|
- service: input_text.set_value
|
||||||
@@ -300,6 +306,9 @@ automation:
|
|||||||
entity_id: input_text.l10s_vacuum_room_queue
|
entity_id: input_text.l10s_vacuum_room_queue
|
||||||
data:
|
data:
|
||||||
value: ""
|
value: ""
|
||||||
|
- service: input_boolean.turn_off
|
||||||
|
target:
|
||||||
|
entity_id: input_boolean.l10s_vacuum_on_demand
|
||||||
- service: script.l10s_vacuum_start_next_room
|
- service: script.l10s_vacuum_start_next_room
|
||||||
|
|
||||||
- alias: 'Vacuum Sensor Cleaning Silencer'
|
- alias: 'Vacuum Sensor Cleaning Silencer'
|
||||||
|
|||||||
@@ -35,11 +35,8 @@
|
|||||||
[Here is the current weather outside]
|
[Here is the current weather outside]
|
||||||
{% set aq_description = state_attr('sensor.bear_stone_common_air_quality_index', 'description') | default('') %}
|
{% set aq_description = state_attr('sensor.bear_stone_common_air_quality_index', 'description') | default('') %}
|
||||||
{% set aq_index = states('sensor.bear_stone_common_air_quality_index') | int(0) %}
|
{% set aq_index = states('sensor.bear_stone_common_air_quality_index') | int(0) %}
|
||||||
{% if aq_description %}
|
{% if aq_index >= 50 %}
|
||||||
Air Quality: {{ aq_description }}
|
[Air Quality: {{ aq_description }}]
|
||||||
{% endif %}
|
|
||||||
{% if aq_index >= 150 %}
|
|
||||||
[Air quality is unhealthy; limit outdoor activity]
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% set pirateweather_metrics = states.sensor
|
{% set pirateweather_metrics = states.sensor
|
||||||
| selectattr('entity_id','search','pirateweather')
|
| selectattr('entity_id','search','pirateweather')
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
<svg width="68.5" height="20" viewBox="0 0 685 200" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="2025.12.1">
|
<svg width="68.5" height="20" viewBox="0 0 685 200" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="2025.12.2">
|
||||||
<title>2025.12.1</title>
|
<title>2025.12.2</title>
|
||||||
<linearGradient id="lYFaN" x2="0" y2="100%">
|
<linearGradient id="pOwrd" x2="0" y2="100%">
|
||||||
<stop offset="0" stop-opacity=".1" stop-color="#EEE"/>
|
<stop offset="0" stop-opacity=".1" stop-color="#EEE"/>
|
||||||
<stop offset="1" stop-opacity=".1"/>
|
<stop offset="1" stop-opacity=".1"/>
|
||||||
</linearGradient>
|
</linearGradient>
|
||||||
<mask id="IMiNs"><rect width="685" height="200" rx="30" fill="#FFF"/></mask>
|
<mask id="aXyHH"><rect width="685" height="200" rx="30" fill="#FFF"/></mask>
|
||||||
<g mask="url(#IMiNs)">
|
<g mask="url(#aXyHH)">
|
||||||
<rect width="685" height="200" fill="#08C" x="0"/>
|
<rect width="685" height="200" fill="#08C" x="0"/>
|
||||||
<rect width="685" height="200" fill="url(#lYFaN)"/>
|
<rect width="685" height="200" fill="url(#pOwrd)"/>
|
||||||
</g>
|
</g>
|
||||||
<g aria-hidden="true" fill="#fff" text-anchor="start" font-family="Verdana,DejaVu Sans,sans-serif" font-size="110">
|
<g aria-hidden="true" fill="#fff" text-anchor="start" font-family="Verdana,DejaVu Sans,sans-serif" font-size="110">
|
||||||
<text x="65" y="148" textLength="570" fill="#000" opacity="0.25">2025.12.1</text>
|
<text x="65" y="148" textLength="570" fill="#000" opacity="0.25">2025.12.2</text>
|
||||||
<text x="55" y="138" textLength="570">2025.12.1</text>
|
<text x="55" y="138" textLength="570">2025.12.2</text>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 815 B After Width: | Height: | Size: 815 B |
Reference in New Issue
Block a user