mirror of
https://github.com/CCOSTAN/Home-AssistantConfig.git
synced 2025-12-12 01:52:16 +00:00
Compare commits
13 Commits
1835b1203f
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c245c1ca78 | ||
|
|
96e86d6587 | ||
|
|
3345bf3b95 | ||
|
|
a8eca6f4bb | ||
|
|
d900c642dd | ||
|
|
1e490e53f6 | ||
|
|
5892711916 | ||
|
|
1ff1d9d81c | ||
|
|
02a554a793 | ||
|
|
2265f2b282 | ||
|
|
ea8d57393a | ||
|
|
ddda9e6573 | ||
|
|
aec426e602 |
@@ -0,0 +1,27 @@
|
||||
blueprint:
|
||||
name: Invert a binary sensor
|
||||
description: Creates a binary_sensor which holds the inverted value of a reference binary_sensor
|
||||
domain: template
|
||||
source_url: https://github.com/home-assistant/core/blob/dev/homeassistant/components/template/blueprints/inverted_binary_sensor.yaml
|
||||
input:
|
||||
reference_entity:
|
||||
name: Binary sensor to be inverted
|
||||
description: The binary_sensor which needs to have its value inverted
|
||||
selector:
|
||||
entity:
|
||||
domain: binary_sensor
|
||||
variables:
|
||||
reference_entity: !input reference_entity
|
||||
binary_sensor:
|
||||
state: >
|
||||
{% if states(reference_entity) == 'on' %}
|
||||
off
|
||||
{% elif states(reference_entity) == 'off' %}
|
||||
on
|
||||
{% else %}
|
||||
{{ states(reference_entity) }}
|
||||
{% endif %}
|
||||
# delay_on: not_used in this example
|
||||
# delay_off: not_used in this example
|
||||
# auto_off: not_used in this example
|
||||
availability: "{{ states(reference_entity) not in ('unknown', 'unavailable') }}"
|
||||
@@ -45,7 +45,7 @@ Live collection of plug-and-play Home Assistant packages. Each YAML file in this
|
||||
| [lightning.yaml](lightning.yaml) | Blitzortung lightning counter monitoring with snoozeable push actions. | `sensor.blitzortung_lightning_counter`, `input_boolean.snooze_lightning`, notify engine actions |
|
||||
| [phynplus.yaml](phynplus.yaml) | Tie the Phyn Plus smart shutoff into HA notifications, automations, and valve overrides. | `valve.phyn_shutoff_valve`, `binary_sensor.phyn_leak_test_running`, `script.notify_engine_two_button` |
|
||||
| [powerwall.yaml](powerwall.yaml) | Track Tesla Powerwall grid status and shed loads automatically when off-grid. | `binary_sensor.powerwall_grid_status`, `sensor.powerwall_*`, `script.notify_engine` |
|
||||
| [vacuum.yaml](vacuum.yaml) | Dreame (ex-Neato) vacuum orchestration with maintenance reminders and reset helpers. | `sensor.l10s_vacuum_task_status`, `sensor.l10s_vacuum_sensor_dirty_left`, `button.l10s_vacuum_reset_sensor` |
|
||||
| [vacuum.yaml](vacuum.yaml) | Dreame (ex-Neato) vacuum orchestration with continuous phased sweep/mop cycles. | `input_select.l10s_vacuum_phase`, `input_text.l10s_vacuum_room_queue`, `sensor.l10s_vacuum_task_status` |
|
||||
| [hass_agent_homepc.yaml](hass_agent_homepc.yaml) | Mirrors PC lock/unlock state from HASS.Agent to the office lamp for instant desk presence cues. | `sensor.carlo_homepc_carlo_homepc_sessionstate`, `switch.office_lamp_switch` |
|
||||
| [finance.yaml](finance.yaml) | Yahoo Finance sensor bundle for portfolio glances and Lovelace cards. | `sensor.tsla`, `sensor.aapl`, `sensor.amzn`, `sensor.msft` |
|
||||
|
||||
@@ -60,8 +60,8 @@ Live collection of plug-and-play Home Assistant packages. Each YAML file in this
|
||||

|
||||
|
||||
### Dreame vacuum automations
|
||||
- Logic lives in [vacuum.yaml](vacuum.yaml): weekday sweeping/weekend mopping, room-queue segment cleaning that pauses/docks on arrival, resumes after charging, and per-room notifications/briefing summaries.
|
||||
- Uses the Dreame HACS integration with map-based segments and daily resets to cover the whole house without repeating rooms.
|
||||
- Logic lives in [vacuum.yaml](vacuum.yaml): continuous four-phase loop (sweep main, sweep baths, mop main, mop baths) driven by `input_select.l10s_vacuum_phase` and `input_text.l10s_vacuum_room_queue`, with per-room notifications and automatic reseeding between phases.
|
||||
- Uses the Dreame HACS integration with segment IDs to enforce bathrooms last in each sweep/mop pass, dock on arrival, and auto-run if idle for 3+ days.
|
||||

|
||||
|
||||
### Blog & video deep dives
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
#-------------------------------------------
|
||||
# @CCOSTAN
|
||||
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
||||
# Neato Support for D7 Connected Botvac - control my [Neato Vacuum](http://amzn.to/2kqnnqu) with Home Assistant.
|
||||
#-------------------------------------------
|
||||
homeassistant:
|
||||
customize_glob:
|
||||
"*.arris_tg1682g_router*":
|
||||
|
||||
|
||||
#-------------------------------------------
|
||||
|
||||
group:
|
||||
router:
|
||||
name: Router Stats
|
||||
|
||||
entities:
|
||||
- sensor.arris_tg1682g_router_bytes_received
|
||||
- sensor.arris_tg1682g_router_bytes_sent
|
||||
- sensor.arris_tg1682g_router_kbytesec_received
|
||||
- sensor.arris_tg1682g_router_kbytesec_sent
|
||||
- sensor.arris_tg1682g_router_packets_received
|
||||
- sensor.arris_tg1682g_router_packets_sent
|
||||
- sensor.arris_tg1682g_router_packetssec_received
|
||||
- sensor.arris_tg1682g_router_packetssec_sent
|
||||
@@ -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.
|
||||
@@ -1,54 +0,0 @@
|
||||
#-------------------------------------------
|
||||
# Fire Tablet Alarm Panel -
|
||||
# https://www.vcloudinfo.com/2017/07/visualizing-smart-home-using-home.html
|
||||
#-------------------------------------------
|
||||
#
|
||||
# homeassistant:
|
||||
# customize_glob:
|
||||
# "sensor.*_alarm_panel*":
|
||||
#
|
||||
#
|
||||
# "binary_sensor.*_alarm_panel*":
|
||||
#
|
||||
#
|
||||
|
||||
sensor:
|
||||
- platform: template
|
||||
sensors:
|
||||
low_battery:
|
||||
friendly_name: 'Low Battery'
|
||||
value_template: >
|
||||
{%- set threshold = 15 -%}
|
||||
{%- set domains = ['light', 'switch', 'sensor', 'zwave', 'lock', 'binary_sensor'] -%}
|
||||
{%- for domain in domains -%}
|
||||
{%- for item in states[domain] if ((item.attributes.battery_level is defined and item.attributes['battery_level'] | int < threshold) or ("battery" in item.name | lower and ((item.state | int < threshold and item.state|int != 0) or item.state | lower == "low" or item.state | lower == "unknown"))) -%}
|
||||
{{ item.attributes.friendly_name }} (
|
||||
{%- if item.attributes.battery_level is defined -%}
|
||||
{{ item.attributes.battery_level}}
|
||||
{%- else -%}
|
||||
{{item.state}}
|
||||
{%- endif -%}%)
|
||||
{%- if not loop.last -%}
|
||||
{{', '}}
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
{%- endfor -%}
|
||||
|
||||
automation:
|
||||
- alias: 'Battery Alert'
|
||||
id: 1a4f06f0-8763-4801-ba6c-55b87d1b0286
|
||||
initial_state: 'on'
|
||||
trigger:
|
||||
- platform: time
|
||||
at: '10:00:00'
|
||||
- platform: time
|
||||
at: '18:00:00'
|
||||
condition:
|
||||
condition: template
|
||||
value_template: "{% if states('sensor.low_battery') %}true{% endif %}"
|
||||
action:
|
||||
- service: script.notify_engine
|
||||
data:
|
||||
value1: "Low battery levels: {{ states('sensor.low_battery') }}"
|
||||
who: 'carlo'
|
||||
apns_id: 'information'
|
||||
@@ -413,22 +413,6 @@ automation:
|
||||
from: 'home'
|
||||
|
||||
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
|
||||
target:
|
||||
entity_id: media_player.kitchen
|
||||
|
||||
@@ -1,53 +0,0 @@
|
||||
#-------------------------------------------
|
||||
# @CCOSTAN
|
||||
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
||||
# More Info : https://www.vcloudinfo.com/
|
||||
#-------------------------------------------
|
||||
|
||||
sensor:
|
||||
- platform: command_line
|
||||
name: "Download Grafana Solar"
|
||||
command: 'curl -s -H "Authorization: Bearer eyJrIjoiZ0UwS1hpRVdCbFVVSTNSdER0Z29maHc4QmVuSXhxalYiLCJuIjoiSEFDYW1lcmEiLCJpZCI6MX0=" "http://192.168.10.10:3000/render/d/h_wosLIik/solar?orgId=1&from=now-1d%2Fd&to=now-1d%2Fd&height=750&width=1920" > /config/www/custom_ui/floorplan/images/branding/solar_readings.png'
|
||||
scan_interval: 3000
|
||||
|
||||
- platform: command_line
|
||||
name: "Download Grafana ATT SpeedTest"
|
||||
command: 'curl -s -H "Authorization: Bearer eyJrIjoiZ0UwS1hpRVdCbFVVSTNSdER0Z29maHc4QmVuSXhxalYiLCJuIjoiSEFDYW1lcmEiLCJpZCI6MX0=" "http://192.168.10.10:3000/render/d/bdR1ZnFZk/att-speedtest?viewPanel=2&orgId=1" > /config/www/custom_ui/floorplan/images/branding/att_speedtest.png'
|
||||
scan_interval: 3000
|
||||
|
||||
camera:
|
||||
- platform: generic
|
||||
name: "Grafana Solar Graph"
|
||||
still_image_url: 'http://192.168.10.10:3000/render/d/h_wosLIik/solar?orgId=1&from=now-1d%2Fd&to=now-1d%2Fd&height=750&width=1920'
|
||||
username: HA
|
||||
password: HA
|
||||
|
||||
##############################################################################
|
||||
### Automations - Detect when things are not right. Like any Good Watchdog.
|
||||
##############################################################################
|
||||
automation:
|
||||
- alias: 'Tweet Solar Production'
|
||||
id: bd698bd9-780b-4268-bf90-2c7ff6daae99
|
||||
|
||||
trigger:
|
||||
- platform: sun
|
||||
event: sunset
|
||||
offset: '+02:30:00'
|
||||
action:
|
||||
- service: script.tweet_engine_image
|
||||
data:
|
||||
tweet: >-
|
||||
{{ [
|
||||
"I have just finished crunching the numbers and here is the latest #Solar Production graph. "
|
||||
] | random + " #Charts #Tesla "
|
||||
+ [
|
||||
"(https://youtu.be/BartadUzGOA)",
|
||||
"(https://www.vcloudinfo.com/2018/01/going-green-to-save-some-green-in-2018.html)",
|
||||
"(https://www.vcloudinfo.com/2018/09/re-installing-tesla-solar-panels-again.html)"
|
||||
]| random
|
||||
}}
|
||||
image: >-
|
||||
{% set pictures = [
|
||||
"/config/www/custom_ui/floorplan/images/branding/solar_readings.png"
|
||||
] %}
|
||||
{{ pictures|random }}
|
||||
@@ -29,7 +29,7 @@ homeassistant:
|
||||
###############################################################################
|
||||
sensor:
|
||||
- platform: rest
|
||||
resource: https://raw.githubusercontent.com/CCOSTAN/Home-AssistantConfig/master/config/json_data/holidays.json
|
||||
resource: http://localhost:8123/local/json_data/holidays.json
|
||||
name: Holiday
|
||||
scan_interval: 14400
|
||||
value_template: >
|
||||
@@ -45,29 +45,22 @@ sensor:
|
||||
# Sensor Uses Flag data generated by AI
|
||||
################################################################################
|
||||
- platform: rest
|
||||
resource: https://raw.githubusercontent.com/CCOSTAN/Home-AssistantConfig/master/config/json_data/flag_days.json
|
||||
resource: http://localhost:8123/local/json_data/flag_days.json
|
||||
name: Flag
|
||||
scan_interval: 14400
|
||||
value_template: >-
|
||||
{% set now_string = now().strftime('%m/%d') %}
|
||||
{% set now_string = now().month ~ '/' ~ now().day %}
|
||||
{% set now_full_string = now().strftime('%m/%d/%Y') %}
|
||||
{% if value_json is defined and value_json.Flag_Days_US is defined %}
|
||||
{% set static_days = value_json.Flag_Days_US.static %}
|
||||
{% set dynamic_days = value_json.Flag_Days_US.dynamic %}
|
||||
{% if static_days is defined and now_string in static_days %}
|
||||
{% set flag_data = value_json.Flag_Days_US if value_json is defined and value_json.Flag_Days_US is defined else {} %}
|
||||
{% set static_days = flag_data.static if flag_data.static is defined else {} %}
|
||||
{% set dynamic_days = flag_data.dynamic if flag_data.dynamic is defined else {} %}
|
||||
{% if now_string in static_days %}
|
||||
True
|
||||
{% elif dynamic_days is defined %}
|
||||
{% for day_val in dynamic_days %}
|
||||
{% if day_val.date == now_full_string %}
|
||||
{% elif now_full_string in dynamic_days %}
|
||||
True
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
False
|
||||
{% endif %}
|
||||
{% else %}
|
||||
|
||||
{% endif %}
|
||||
|
||||
################################################################################
|
||||
# Countdown Sensor using WolfRam Alpha Natural language queries
|
||||
|
||||
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() }}"
|
||||
@@ -1,96 +0,0 @@
|
||||
#-------------------------------------------
|
||||
# @CCOSTAN
|
||||
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
||||
###################################
|
||||
## [SkyBell HD](https://amzn.to/2dcexIB)
|
||||
###################################
|
||||
|
||||
|
||||
skybell:
|
||||
username: !secret skybell_username
|
||||
password: !secret skybell_password
|
||||
|
||||
camera:
|
||||
- platform: skybell
|
||||
monitored_conditions:
|
||||
- avatar
|
||||
- activity
|
||||
activity_name: "Last Activity"
|
||||
|
||||
binary_sensor:
|
||||
- platform: skybell
|
||||
monitored_conditions:
|
||||
- button
|
||||
- motion
|
||||
|
||||
light:
|
||||
- platform: skybell # Part of the Outdoor Front Lights Group
|
||||
|
||||
sensor:
|
||||
- platform: skybell
|
||||
monitored_conditions:
|
||||
- chime_level
|
||||
|
||||
button:
|
||||
- platform: skybell
|
||||
monitored_conditions:
|
||||
# - do_not_disturb
|
||||
- motion_sensor
|
||||
|
||||
###################################
|
||||
## Automations
|
||||
###################################
|
||||
## Doorbell Press
|
||||
automation:
|
||||
- alias: 'Log SkyBell Pressed Activity'
|
||||
id: 64226512-f35d-4179-bfcb-9de158b8d3f4
|
||||
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id:
|
||||
- binary_sensor.skybell_front_door_button
|
||||
to: 'on'
|
||||
- platform: event
|
||||
event_type: skybell_pressed
|
||||
|
||||
condition:
|
||||
- condition: template
|
||||
value_template: >
|
||||
{%- if states.binary_sensor.skybell_front_door_button.attributes.last_triggered -%}
|
||||
{{ (as_timestamp(now()) - as_timestamp(states.binary_sensor.skybell_front_door_button.attributes.last_triggered)) > 200 }}
|
||||
{%- else -%}
|
||||
true
|
||||
{%- endif -%}
|
||||
|
||||
action:
|
||||
- service: script.skybell_pressed
|
||||
|
||||
|
||||
# Motion Sensing
|
||||
- alias: 'Log SkyBell Motion detection'
|
||||
id: a22c2cb7-08b2-4bd1-bc82-77201253a000
|
||||
|
||||
trigger:
|
||||
- platform: event
|
||||
event_type: skybell_motion
|
||||
|
||||
action:
|
||||
- service: script.front_house_motion
|
||||
|
||||
# Turn SkyBell Light and Neato Schedule back on if it's turned off. Like any Good Watchdog.
|
||||
|
||||
- alias: Automated Mismatch WatchDog!
|
||||
id: bff434b9-5916-42d1-8620-5723b4b1879d
|
||||
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id:
|
||||
- light.front_door
|
||||
- switch.carlo_neato_schedule
|
||||
to: 'off'
|
||||
|
||||
#Turn it back on!
|
||||
action:
|
||||
- service: homeassistant.turn_on
|
||||
data:
|
||||
entity_id: "{{ trigger.entity_id }}"
|
||||
@@ -1,20 +0,0 @@
|
||||
#-------------------------------------------
|
||||
# @CCOSTAN
|
||||
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
||||
#---Sensor Mail and Packages-----------------------------
|
||||
usps:
|
||||
username: !secret myusps_username
|
||||
password: !secret myusps_password
|
||||
|
||||
camera:
|
||||
- platform: usps
|
||||
scan_interval: 5
|
||||
|
||||
group:
|
||||
mail:
|
||||
name: Mailbox Information
|
||||
|
||||
entities:
|
||||
- sensor.usps_mail
|
||||
- sensor.usps_packages
|
||||
- camera.usps_mail
|
||||
@@ -3,8 +3,8 @@
|
||||
# For more info visit https://www.vcloudinfo.com/click-here
|
||||
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
||||
# -------------------------------------------------------------------
|
||||
# Dreame Vacuum Orchestration - Room queue, away/on-demand runs
|
||||
# Weekday sweep, weekend mop, bathrooms last, notifications
|
||||
# Dreame Vacuum Orchestration - Continuous phased sweep/mop with away/on-demand
|
||||
# Phases: sweep main, sweep baths, mop main, mop baths; notifications + idle auto-start
|
||||
# -------------------------------------------------------------------
|
||||
######################################################################
|
||||
|
||||
@@ -12,29 +12,31 @@
|
||||
######################################################################
|
||||
|
||||
input_boolean:
|
||||
l10s_vacuum_weekday_cycle_active:
|
||||
name: L10s Weekday Cleaning Active
|
||||
icon: mdi:robot-vacuum
|
||||
l10s_vacuum_on_demand:
|
||||
name: Dream Clean (On-Demand)
|
||||
icon: mdi:rocket-launch
|
||||
name: Dreame Clean (On-Demand)
|
||||
icon: mdi:robot-vacuum
|
||||
|
||||
input_datetime:
|
||||
l10s_vacuum_last_weekday_cycle:
|
||||
name: L10s Last Weekday Cleaning Cycle
|
||||
has_date: true
|
||||
has_time: true
|
||||
input_select:
|
||||
l10s_vacuum_phase:
|
||||
name: L10s Vacuum Phase
|
||||
options:
|
||||
- sweep_main
|
||||
- sweep_bath
|
||||
- mop_main
|
||||
- mop_bath
|
||||
initial: sweep_main
|
||||
icon: mdi:playlist-check
|
||||
|
||||
input_text:
|
||||
l10s_vacuum_room_queue:
|
||||
name: L10s Vacuum Room Queue
|
||||
# Room order (id:name): 14 Kitchen, 12 Dining, 10 Living, 7 Master Bedroom, 15 Foyer, 9 Stacey Office,
|
||||
# 17 Formal Dining, 13 Hallway, 8 Justin Bedroom, 6 Paige Bedroom, 4 Master Bathroom, 2 Office, 1 Pool Bath, 3 Kids Bathroom.
|
||||
icon: mdi:format-list-bulleted
|
||||
max: 255
|
||||
l10s_vacuum_room_catalog:
|
||||
name: L10s Vacuum Room Catalog
|
||||
# Room order (id:name): 14 Kitchen, 12 Dining, 10 Living, 7 Master Bedroom, 15 Foyer, 9 Stacey Office,
|
||||
# 17 Formal Dining, 13 Hallway, 8 Justin Bedroom, 6 Paige Bedroom, 4 Master Bathroom, 2 Office, 1 Pool Bath, 3 Kids Bathroom.
|
||||
initial: "14,12,10,7,15,9,17,13,8,6,4,2,1,3"
|
||||
initial: "6,7,8,9,10,12,13,14,15,17,2,4,1,3"
|
||||
icon: mdi:map
|
||||
max: 255
|
||||
l10s_vacuum_rooms_cleaned_today:
|
||||
@@ -52,54 +54,39 @@ script:
|
||||
mode: single
|
||||
sequence:
|
||||
- variables:
|
||||
# Weekday runs are sweeping (vacuum only), weekend runs are mopping
|
||||
cleaning_mode: "{{ 'mopping' if now().weekday() in [5, 6] else 'sweeping' }}"
|
||||
catalog_raw: "{{ states('input_text.l10s_vacuum_room_catalog') | default('', true) | string | replace(' ', '') }}"
|
||||
queue_raw: "{{ states('input_text.l10s_vacuum_room_queue') | default('', true) | string | replace(' ', '') }}"
|
||||
last_reset_raw: "{{ states('input_datetime.l10s_vacuum_last_weekday_cycle') }}"
|
||||
last_reset_date_str: >
|
||||
{% set dt = as_datetime(last_reset_raw, default=None) %}
|
||||
{{ dt.date().isoformat() if dt is not none else '' }}
|
||||
catalog_ints: "{{ catalog_raw | regex_findall('[0-9]+') | map('int') | select('gt', 0) | list }}"
|
||||
queue_ints: "{{ queue_raw | regex_findall('[0-9]+') | map('int') | select('gt', 0) | list }}"
|
||||
# Seed if queue is empty AND last reset was not today
|
||||
can_seed_today: "{{ last_reset_date_str == '' or last_reset_date_str != now().date().isoformat() }}"
|
||||
will_seed: >
|
||||
{% set empty_queue = queue_ints | length == 0 %}
|
||||
{% set on_demand = is_state('input_boolean.l10s_vacuum_on_demand', 'on') %}
|
||||
{{ (empty_queue or (on_demand and queue_ints | length <= 1)) and catalog_ints | length > 0 and (can_seed_today or on_demand) }}
|
||||
seeded_queue_list: "{{ catalog_ints if will_seed else queue_ints }}"
|
||||
valid_queue_list: "{{ seeded_queue_list }}"
|
||||
# Define bathroom IDs for mopping separation
|
||||
bath_ids: [1, 3, 4]
|
||||
nonbath_list: "{{ valid_queue_list | reject('in', bath_ids) | list }}"
|
||||
bath_list: "{{ valid_queue_list | select('in', bath_ids) | list }}"
|
||||
# Prioritize non-bathrooms first, then bathrooms
|
||||
segments_to_clean: >
|
||||
{% if nonbath_list | length > 0 %}
|
||||
{{ nonbath_list }}
|
||||
{% elif bath_list | length > 0 %}
|
||||
{{ bath_list }}
|
||||
main_ids: "{{ catalog_ints | reject('in', bath_ids) | list }}"
|
||||
phase_order: ['sweep_main', 'sweep_bath', 'mop_main', 'mop_bath']
|
||||
phase_state: "{{ states('input_select.l10s_vacuum_phase') }}"
|
||||
phase: "{{ phase_state if phase_state in phase_order else 'sweep_main' }}"
|
||||
cleaning_mode: "{{ 'mopping' if 'mop_' in phase else 'sweeping' }}"
|
||||
queue_raw: "{{ states('input_text.l10s_vacuum_room_queue') | default('', true) | string | replace(' ', '') }}"
|
||||
queue_ints: "{{ queue_raw | regex_findall('[0-9]+') | map('int') | select('gt', 0) | list }}"
|
||||
phase_segments: >
|
||||
{% if phase == 'sweep_main' %}
|
||||
{{ main_ids }}
|
||||
{% elif phase == 'sweep_bath' %}
|
||||
{{ bath_ids }}
|
||||
{% elif phase == 'mop_main' %}
|
||||
{{ main_ids }}
|
||||
{% else %}
|
||||
[]
|
||||
{{ bath_ids }}
|
||||
{% endif %}
|
||||
segments_to_clean: "{{ queue_ints if queue_ints | length > 0 else phase_segments }}"
|
||||
|
||||
# 1. Seed the queue if necessary
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: "{{ will_seed }}"
|
||||
value_template: "{{ queue_ints | length == 0 and phase_segments | length > 0 }}"
|
||||
sequence:
|
||||
- service: input_text.set_value
|
||||
target:
|
||||
entity_id: input_text.l10s_vacuum_room_queue
|
||||
data:
|
||||
value: "{{ catalog_raw }}"
|
||||
- service: input_datetime.set_datetime
|
||||
target:
|
||||
entity_id: input_datetime.l10s_vacuum_last_weekday_cycle
|
||||
data:
|
||||
datetime: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"
|
||||
value: "{{ phase_segments | join(',') }}"
|
||||
default: []
|
||||
|
||||
# 2. Check if there is anything to clean and stop if not
|
||||
@@ -122,9 +109,6 @@ script:
|
||||
entity_id: vacuum.l10s_vacuum
|
||||
data:
|
||||
fan_speed: Standard
|
||||
- service: input_boolean.turn_on
|
||||
target:
|
||||
entity_id: input_boolean.l10s_vacuum_weekday_cycle_active
|
||||
- service: dreame_vacuum.vacuum_clean_segment
|
||||
target:
|
||||
entity_id: vacuum.l10s_vacuum
|
||||
@@ -138,36 +122,30 @@ script:
|
||||
|
||||
automation:
|
||||
|
||||
- alias: 'Away Vacuum: Reset Queue (Mon/Sat)'
|
||||
id: 93a6e7dc-9c32-4d53-9f7c-651cd60f4b84
|
||||
- alias: 'Vacuum: Reset Cleaned List at 5am'
|
||||
id: 18f7b6d3-c02c-4ec1-88b3-0c3b8b4c6f7b
|
||||
trigger:
|
||||
- platform: time
|
||||
at: '08:55:00'
|
||||
condition:
|
||||
- condition: time
|
||||
weekday:
|
||||
- mon
|
||||
- sat
|
||||
at: '05:00:00'
|
||||
action:
|
||||
- service: input_text.set_value
|
||||
target:
|
||||
entity_id: input_text.l10s_vacuum_room_queue
|
||||
data:
|
||||
value: "{{ states('input_text.l10s_vacuum_room_catalog') }}"
|
||||
- service: input_text.set_value
|
||||
target:
|
||||
entity_id: input_text.l10s_vacuum_rooms_cleaned_today
|
||||
data:
|
||||
value: ""
|
||||
- service: input_boolean.turn_off
|
||||
target:
|
||||
entity_id: input_boolean.l10s_vacuum_weekday_cycle_active
|
||||
- service: input_datetime.set_datetime
|
||||
target:
|
||||
entity_id: input_datetime.l10s_vacuum_last_weekday_cycle
|
||||
data:
|
||||
datetime: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"
|
||||
- service: input_boolean.turn_off
|
||||
|
||||
- alias: 'Vacuum: Auto-Start if Idle 3 Days'
|
||||
id: c6b3f1e8-9a3f-4098-9b9e-1c7f2d6f1d11
|
||||
trigger:
|
||||
- platform: time
|
||||
at: '16:00:00'
|
||||
condition:
|
||||
- condition: template
|
||||
value_template: >
|
||||
{% set last = state_attr('script.l10s_vacuum_start_next_room','last_triggered') %}
|
||||
{{ last is none or (now() - last).days >= 3 }}
|
||||
action:
|
||||
- service: input_boolean.turn_on
|
||||
target:
|
||||
entity_id: input_boolean.l10s_vacuum_on_demand
|
||||
|
||||
@@ -190,6 +168,9 @@ automation:
|
||||
- condition: template
|
||||
value_template: "{{ not is_state('vacuum.l10s_vacuum', 'cleaning') }}"
|
||||
action:
|
||||
- service: input_boolean.turn_on
|
||||
target:
|
||||
entity_id: input_boolean.l10s_vacuum_on_demand
|
||||
- service: script.l10s_vacuum_start_next_room
|
||||
|
||||
- alias: 'Away Vacuum: Dock When Family Returns'
|
||||
@@ -202,9 +183,6 @@ automation:
|
||||
entity_id: input_boolean.l10s_vacuum_on_demand
|
||||
to: 'off'
|
||||
condition:
|
||||
- condition: state
|
||||
entity_id: input_boolean.l10s_vacuum_weekday_cycle_active
|
||||
state: 'on'
|
||||
- condition: template
|
||||
value_template: >
|
||||
{{ is_state('vacuum.l10s_vacuum', 'cleaning') or is_state('vacuum.l10s_vacuum', 'returning') or is_state('vacuum.l10s_vacuum', 'paused') }}
|
||||
@@ -223,52 +201,50 @@ automation:
|
||||
- platform: state
|
||||
entity_id: sensor.l10s_vacuum_current_room
|
||||
for: '00:03:00'
|
||||
- platform: state
|
||||
entity_id: vacuum.l10s_vacuum
|
||||
to: 'cleaning'
|
||||
for: '00:03:00'
|
||||
variables:
|
||||
room_map: {14:'kitchen',12:'dining-room',10:'living room',7:'master-bedroom',15:'foyer',9:'stacey-office',17:'formal-dining',13:'hallway',8:'justin-bedroom',6:'paige-bedroom',4:'master-bathroom',2:'office',1:'pool-bath',3:'kids-bathroom'}
|
||||
catalog_raw: "{{ states('input_text.l10s_vacuum_room_catalog') | default('', true) | string | replace(' ', '') }}"
|
||||
catalog_ints: "{{ catalog_raw | regex_findall('[0-9]+') | map('int') | select('gt', 0) | list }}"
|
||||
queue_raw: "{{ states('input_text.l10s_vacuum_room_queue') | default('', true) | string | replace(' ', '') }}"
|
||||
queue_ints: "{{ queue_raw | regex_findall('[0-9]+') | map('int') | select('gt', 0) | list | default([], true) }}"
|
||||
working_queue: "{{ queue_ints if queue_ints | length > 0 else catalog_ints }}"
|
||||
queue_ints: "{{ queue_raw | regex_findall('[0-9]+') | map('int') | list | default([], true) }}"
|
||||
current_room_id: "{{ trigger.to_state.attributes.room_id | default(state_attr('sensor.l10s_vacuum_current_room', 'room_id'), true) | int(0) }}"
|
||||
matched_room_id: "{{ current_room_id if current_room_id > 0 and current_room_id in (working_queue | default([], true)) else 0 }}"
|
||||
remaining_rooms: "{{ working_queue | reject('equalto', matched_room_id) | list | join(',') }}"
|
||||
remaining_value: >
|
||||
{% set rem = remaining_rooms | string %}
|
||||
{% if rem | length == 0 and working_queue | length > 1 %}
|
||||
{{ working_queue | join(',') }}
|
||||
matched_room_id: "{{ current_room_id if current_room_id > 0 and current_room_id in (queue_ints | default([], true)) else 0 }}"
|
||||
remaining_list: >
|
||||
{% set rem = [] %}
|
||||
{% set removed = namespace(done=false) %}
|
||||
{% for r in queue_ints %}
|
||||
{% if not removed.done and r == matched_room_id %}
|
||||
{% set removed.done = true %}
|
||||
{% else %}
|
||||
{% set rem = rem + [r] %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{{ rem }}
|
||||
{% endif %}
|
||||
remaining_value_str: >
|
||||
{% set rv = remaining_value %}
|
||||
{% if rv is string %}
|
||||
{{ rv }}
|
||||
{% elif rv is iterable %}
|
||||
{{ rv | map('string') | join(',') }}
|
||||
{% else %}
|
||||
{{ rv | string }}
|
||||
{% endif %}
|
||||
remaining_rooms: "{{ remaining_list | join(',') }}"
|
||||
remaining_count: "{{ remaining_list | length }}"
|
||||
phase_order: ['sweep_main', 'sweep_bath', 'mop_main', 'mop_bath']
|
||||
phase_state: "{{ states('input_select.l10s_vacuum_phase') }}"
|
||||
phase: "{{ phase_state if phase_state in phase_order else 'sweep_main' }}"
|
||||
phase_index: "{{ phase_order.index(phase) if phase in phase_order else 0 }}"
|
||||
has_next_phase: "{{ phase_index < (phase_order | length) - 1 }}"
|
||||
next_phase: "{{ phase_order[phase_index + 1] if has_next_phase else '' }}"
|
||||
|
||||
condition:
|
||||
# Only run if there's actually a queue and a room was successfully matched to the start of the queue
|
||||
- condition: template
|
||||
value_template: "{{ working_queue | length > 0 }}"
|
||||
- condition: template
|
||||
value_template: "{{ matched_room_id != 0 }}"
|
||||
value_template: "{{ queue_ints | length > 0 }}"
|
||||
- condition: template
|
||||
value_template: "{{ matched_room_id != 0 }}"
|
||||
- condition: state
|
||||
entity_id: vacuum.l10s_vacuum
|
||||
state: 'cleaning'
|
||||
- condition: state
|
||||
entity_id: input_boolean.l10s_vacuum_on_demand
|
||||
state: 'on'
|
||||
|
||||
action:
|
||||
- service: input_text.set_value
|
||||
target:
|
||||
entity_id: input_text.l10s_vacuum_room_queue
|
||||
data:
|
||||
value: "{{ remaining_value_str }}"
|
||||
value: "{{ remaining_rooms }}"
|
||||
- variables:
|
||||
cleaned_raw: "{{ states('input_text.l10s_vacuum_rooms_cleaned_today') | default('', true) | string }}"
|
||||
cleaned_parts: "{{ cleaned_raw | regex_findall('[^,]+') | map('trim') | reject('equalto','') | list }}"
|
||||
@@ -280,7 +256,6 @@ automation:
|
||||
{% else %}
|
||||
{{ parts | join(', ') }}
|
||||
{% endif %}
|
||||
remaining_count: "{{ remaining_value_str | regex_findall('[^,]+') | length if remaining_value_str | length > 0 else 0 }}"
|
||||
- service: input_text.set_value
|
||||
target:
|
||||
entity_id: input_text.l10s_vacuum_rooms_cleaned_today
|
||||
@@ -299,46 +274,42 @@ automation:
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: "{{ remaining_rooms | length > 0 }}"
|
||||
value_template: "{{ remaining_count > 0 }}"
|
||||
sequence:
|
||||
- service: script.l10s_vacuum_start_next_room
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: "{{ remaining_rooms | length == 0 }}"
|
||||
value_template: "{{ remaining_count == 0 and has_next_phase }}"
|
||||
sequence:
|
||||
- service: input_select.select_option
|
||||
target:
|
||||
entity_id: input_select.l10s_vacuum_phase
|
||||
data:
|
||||
option: "{{ next_phase }}"
|
||||
- service: input_text.set_value
|
||||
target:
|
||||
entity_id: input_text.l10s_vacuum_room_queue
|
||||
data:
|
||||
value: ""
|
||||
- service: script.l10s_vacuum_start_next_room
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: "{{ remaining_count == 0 and not has_next_phase }}"
|
||||
sequence:
|
||||
- service: input_select.select_option
|
||||
target:
|
||||
entity_id: input_select.l10s_vacuum_phase
|
||||
data:
|
||||
option: "sweep_main"
|
||||
- service: input_text.set_value
|
||||
target:
|
||||
entity_id: input_text.l10s_vacuum_room_queue
|
||||
data:
|
||||
value: ""
|
||||
- service: input_boolean.turn_off
|
||||
target:
|
||||
entity_id: input_boolean.l10s_vacuum_weekday_cycle_active
|
||||
- service: input_datetime.set_datetime
|
||||
target:
|
||||
entity_id: input_datetime.l10s_vacuum_last_weekday_cycle
|
||||
data:
|
||||
datetime: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"
|
||||
|
||||
- alias: 'Away Vacuum: Cycle Complete'
|
||||
id: 8fa7779a-957b-49a3-84e7-36ca93c2e0d2
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: sensor.l10s_vacuum_task_status
|
||||
to: 'completed'
|
||||
- platform: state
|
||||
entity_id: vacuum.l10s_vacuum
|
||||
to: 'docked'
|
||||
for: 00:05:00
|
||||
condition:
|
||||
- condition: template
|
||||
value_template: "{{ is_state('sensor.l10s_vacuum_task_status', 'completed') }}"
|
||||
- condition: template
|
||||
value_template: "{{ (states('input_text.l10s_vacuum_room_queue') | replace(' ', '')) | length == 0 }}"
|
||||
action:
|
||||
- service: input_boolean.turn_off
|
||||
target:
|
||||
entity_id: input_boolean.l10s_vacuum_weekday_cycle_active
|
||||
- service: input_datetime.set_datetime
|
||||
target:
|
||||
entity_id: input_datetime.l10s_vacuum_last_weekday_cycle
|
||||
data:
|
||||
datetime: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"
|
||||
entity_id: input_boolean.l10s_vacuum_on_demand
|
||||
- service: script.l10s_vacuum_start_next_room
|
||||
|
||||
- alias: 'Vacuum Sensor Cleaning Silencer'
|
||||
id: 6548de52-a4a4-4df2-9d66-9c2c15577a7f
|
||||
|
||||
@@ -35,11 +35,8 @@
|
||||
[Here is the current weather outside]
|
||||
{% 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) %}
|
||||
{% if aq_description %}
|
||||
Air Quality: {{ aq_description }}
|
||||
{% endif %}
|
||||
{% if aq_index >= 150 %}
|
||||
[Air quality is unhealthy; limit outdoor activity]
|
||||
{% if aq_index >= 50 %}
|
||||
[Air Quality: {{ aq_description }}]
|
||||
{% endif %}
|
||||
{% set pirateweather_metrics = states.sensor
|
||||
| selectattr('entity_id','search','pirateweather')
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
>-
|
||||
{% set pick = [
|
||||
"ThrowBack", "S01E01", "S01E02","S01E03", "S01E04","S01E05", "S01E06","S01E07", "S01E08","S01E09", "S01E10",
|
||||
"S01E11", "S01E12","S01E13", "S01E14","S01E15", "S01E16","S01E17", "S01E18","S01E19", "S01E20", "S01E21",
|
||||
"S02E01", "S02E02","S02E03", "S02E04","S02E05", "S02E06","S02E07", "S02E08","S02E09", "S02E10",
|
||||
"S02E11", "S02E12","S02E13", "S02E14","S02E15", "S02E16","S02E17", "S02E18","S02E19", "S02E20",
|
||||
"S02E22", "S02E25", "S02E26", "S02E27", "S02E28", "S02E29", "S02E30", "S02E31", "S02E32", "S02E33", "S02E34",
|
||||
"S02E35", "S02E36", "S02E37", "S02E38", "S02E39", "S02E40","S02E41", "Bearnews1", "Bearnews2", "Bearnews3", "Bearnews4",
|
||||
"S03E01", "Bearnews5", "Bearnews6", "Bearnews7", "S03E02", "S03E03", "Logger", "SolarPalmLight", "5TipsToLevelUp", "AlexaMusicCommands",
|
||||
"SolarFountainOKMEE", "NoCloudGaradget", "AlexaGuardMediaPlayer", "LightningSensor", "LEDBackboard", "CuckooClock", "NodeAnchors", "yahoostocks",
|
||||
"AugustBatteries", "Remote_Finder", "VideoProjectionMappingDemo", "FeedTheDog", "AlexaGiftNotifications","iPhoneDuplicates", "NotifyScript", "WeightLossJourney",
|
||||
"SnapPower", "LocalControl", "TossingWink", "EnergyDashboard", "IOSBrokeNoifications", "SolarDriveway", "UPS_Replacement", "VillaNERI", "GardenLED", "RokuOnHA", "RunningAutomationsCard"
|
||||
] %}
|
||||
{{ pick|random }}
|
||||
82
config/www/json_data/flag_days.json
Normal file
82
config/www/json_data/flag_days.json
Normal file
@@ -0,0 +1,82 @@
|
||||
{
|
||||
"Flag_Days_US": {
|
||||
"static": {
|
||||
"2/12": "Lincoln's Birthday",
|
||||
"5/15": "Peace Officers Memorial Day",
|
||||
"6/14": "Flag Day",
|
||||
"7/4": "Independence Day",
|
||||
"7/27": "National Korean War Veterans Armistice Day",
|
||||
"9/11": "Patriot Day",
|
||||
"9/17": "Constitution Day",
|
||||
"10/27": "Navy Day",
|
||||
"11/11": "Veterans Day",
|
||||
"12/7": "Pearl Harbor Remembrance Day"
|
||||
},
|
||||
"dynamic": {
|
||||
"01/20/2025": "Inauguration Day",
|
||||
"01/16/2023": "Martin Luther King Jr. Day",
|
||||
"01/15/2024": "Martin Luther King Jr. Day",
|
||||
"01/19/2026": "Martin Luther King Jr. Day",
|
||||
"01/18/2027": "Martin Luther King Jr. Day",
|
||||
"01/17/2028": "Martin Luther King Jr. Day",
|
||||
"01/15/2029": "Martin Luther King Jr. Day",
|
||||
"01/21/2030": "Martin Luther King Jr. Day",
|
||||
"02/20/2023": "Washington's Birthday (Presidents Day)",
|
||||
"02/19/2024": "Washington's Birthday (Presidents Day)",
|
||||
"02/17/2025": "Washington's Birthday (Presidents Day)",
|
||||
"02/16/2026": "Washington's Birthday (Presidents Day)",
|
||||
"02/15/2027": "Washington's Birthday (Presidents Day)",
|
||||
"02/21/2028": "Washington's Birthday (Presidents Day)",
|
||||
"02/19/2029": "Washington's Birthday (Presidents Day)",
|
||||
"02/18/2030": "Washington's Birthday (Presidents Day)",
|
||||
"05/20/2023": "Armed Forces Day",
|
||||
"05/18/2024": "Armed Forces Day",
|
||||
"05/17/2025": "Armed Forces Day",
|
||||
"05/16/2026": "Armed Forces Day",
|
||||
"05/15/2027": "Armed Forces Day",
|
||||
"05/20/2028": "Armed Forces Day",
|
||||
"05/19/2029": "Armed Forces Day",
|
||||
"05/18/2030": "Armed Forces Day",
|
||||
"05/29/2023": "Memorial Day",
|
||||
"05/27/2024": "Memorial Day",
|
||||
"05/26/2025": "Memorial Day",
|
||||
"05/25/2026": "Memorial Day",
|
||||
"05/31/2027": "Memorial Day",
|
||||
"05/29/2028": "Memorial Day",
|
||||
"05/28/2029": "Memorial Day",
|
||||
"05/27/2030": "Memorial Day",
|
||||
"09/04/2023": "Labor Day",
|
||||
"09/02/2024": "Labor Day",
|
||||
"09/01/2025": "Labor Day",
|
||||
"09/07/2026": "Labor Day",
|
||||
"09/06/2027": "Labor Day",
|
||||
"09/04/2028": "Labor Day",
|
||||
"09/03/2029": "Labor Day",
|
||||
"09/02/2030": "Labor Day",
|
||||
"09/15/2023": "National POW/MIA Recognition Day",
|
||||
"09/20/2024": "National POW/MIA Recognition Day",
|
||||
"09/19/2025": "National POW/MIA Recognition Day",
|
||||
"09/18/2026": "National POW/MIA Recognition Day",
|
||||
"09/17/2027": "National POW/MIA Recognition Day",
|
||||
"09/15/2028": "National POW/MIA Recognition Day",
|
||||
"09/21/2029": "National POW/MIA Recognition Day",
|
||||
"09/20/2030": "National POW/MIA Recognition Day",
|
||||
"10/09/2023": "Columbus Day",
|
||||
"10/14/2024": "Columbus Day",
|
||||
"10/13/2025": "Columbus Day",
|
||||
"10/12/2026": "Columbus Day",
|
||||
"10/11/2027": "Columbus Day",
|
||||
"10/09/2028": "Columbus Day",
|
||||
"10/08/2029": "Columbus Day",
|
||||
"10/14/2030": "Columbus Day",
|
||||
"11/07/2023": "Election Day",
|
||||
"11/05/2024": "Election Day",
|
||||
"11/04/2025": "Election Day",
|
||||
"11/03/2026": "Election Day",
|
||||
"11/02/2027": "Election Day",
|
||||
"11/07/2028": "Election Day",
|
||||
"11/06/2029": "Election Day",
|
||||
"11/05/2030": "Election Day"
|
||||
}
|
||||
}
|
||||
}
|
||||
116
config/www/json_data/holidays.json
Normal file
116
config/www/json_data/holidays.json
Normal file
@@ -0,0 +1,116 @@
|
||||
{
|
||||
"MAJOR_US": {
|
||||
"static": {
|
||||
"1/1": "New Years Day",
|
||||
"2/2": "Groundhog Day",
|
||||
"2/3": "Staceys Birthday",
|
||||
"2/14": "Valentines Day",
|
||||
"3/14": "Pi Day",
|
||||
"3/17": "St. Patricks Day",
|
||||
"3/26": "Justins Birthday",
|
||||
"4/1": "April Fools Day",
|
||||
"4/22": "Earth Day",
|
||||
"5/4": "Star Wars Day",
|
||||
"5/5": "Cinco de Mayo",
|
||||
"6/14": "Flag Day",
|
||||
"7/4": "Independence Day",
|
||||
"8/30": "Paiges Birthday",
|
||||
"9/10": "Mom and Dads Wedding Anniversary",
|
||||
"9/11": "Patriot Day",
|
||||
"10/31": "Halloween",
|
||||
"11/11": "Veterans Day",
|
||||
"11/16": "Carlos Birthday",
|
||||
"12/7": "Pearl Harbor Day",
|
||||
"12/24": "Christmas Eve",
|
||||
"12/25": "Christmas Day",
|
||||
"12/31": "New Years Eve"
|
||||
},
|
||||
"dynamic": {
|
||||
"11/23/2023": "Thanksgiving Day",
|
||||
"01/15/2024": "MLK Day",
|
||||
"02/14/2024": "Ash Wednesday",
|
||||
"02/19/2024": "Presidents Day",
|
||||
"03/24/2024": "Palm Sunday",
|
||||
"03/29/2024": "Good Friday",
|
||||
"03/31/2024": "Easter Sunday",
|
||||
"04/22/2024": "Memorial Day",
|
||||
"05/12/2024": "Mothers Day",
|
||||
"06/16/2024": "Fathers Day",
|
||||
"09/02/2024": "Labor Day",
|
||||
"10/14/2024": "Columbus Day",
|
||||
"11/28/2024": "Thanksgiving Day",
|
||||
"01/20/2025": "MLK Day",
|
||||
"02/17/2025": "Presidents Day",
|
||||
"03/05/2025": "Ash Wednesday",
|
||||
"04/13/2025": "Palm Sunday",
|
||||
"04/18/2025": "Good Friday",
|
||||
"04/20/2025": "Easter Sunday",
|
||||
"04/21/2025": "Memorial Day",
|
||||
"05/11/2025": "Mothers Day",
|
||||
"06/15/2025": "Fathers Day",
|
||||
"09/01/2025": "Labor Day",
|
||||
"10/13/2025": "Columbus Day",
|
||||
"11/27/2025": "Thanksgiving Day",
|
||||
"01/19/2026": "MLK Day",
|
||||
"02/16/2026": "Presidents Day",
|
||||
"02/18/2026": "Ash Wednesday",
|
||||
"03/29/2026": "Palm Sunday",
|
||||
"04/03/2026": "Good Friday",
|
||||
"04/05/2026": "Easter Sunday",
|
||||
"04/20/2026": "Memorial Day",
|
||||
"05/10/2026": "Mothers Day",
|
||||
"06/21/2026": "Fathers Day",
|
||||
"09/07/2026": "Labor Day",
|
||||
"10/12/2026": "Columbus Day",
|
||||
"11/26/2026": "Thanksgiving Day",
|
||||
"01/18/2027": "MLK Day",
|
||||
"02/10/2027": "Ash Wednesday",
|
||||
"02/15/2027": "Presidents Day",
|
||||
"03/21/2027": "Palm Sunday",
|
||||
"03/26/2027": "Good Friday",
|
||||
"03/28/2027": "Easter Sunday",
|
||||
"04/19/2027": "Memorial Day",
|
||||
"05/09/2027": "Mothers Day",
|
||||
"06/20/2027": "Fathers Day",
|
||||
"09/06/2027": "Labor Day",
|
||||
"10/11/2027": "Columbus Day",
|
||||
"11/25/2027": "Thanksgiving Day",
|
||||
"01/17/2028": "MLK Day",
|
||||
"02/21/2028": "Presidents Day",
|
||||
"03/01/2028": "Ash Wednesday",
|
||||
"04/09/2028": "Palm Sunday",
|
||||
"04/14/2028": "Good Friday",
|
||||
"04/16/2028": "Easter Sunday",
|
||||
"04/17/2028": "Memorial Day",
|
||||
"05/14/2028": "Mothers Day",
|
||||
"06/18/2028": "Fathers Day",
|
||||
"09/04/2028": "Labor Day",
|
||||
"10/09/2028": "Columbus Day",
|
||||
"11/23/2028": "Thanksgiving Day",
|
||||
"01/15/2029": "MLK Day",
|
||||
"02/14/2029": "Ash Wednesday",
|
||||
"02/19/2029": "Presidents Day",
|
||||
"03/25/2029": "Palm Sunday",
|
||||
"03/30/2029": "Good Friday",
|
||||
"04/01/2029": "Easter Sunday",
|
||||
"04/23/2029": "Memorial Day",
|
||||
"05/13/2029": "Mothers Day",
|
||||
"06/17/2029": "Fathers Day",
|
||||
"09/03/2029": "Labor Day",
|
||||
"10/08/2029": "Columbus Day",
|
||||
"11/22/2029": "Thanksgiving Day",
|
||||
"01/21/2030": "MLK Day",
|
||||
"02/18/2030": "Presidents Day",
|
||||
"03/06/2030": "Ash Wednesday",
|
||||
"04/14/2030": "Palm Sunday",
|
||||
"04/19/2030": "Good Friday",
|
||||
"04/21/2030": "Easter Sunday",
|
||||
"04/22/2030": "Memorial Day",
|
||||
"05/12/2030": "Mothers Day",
|
||||
"06/16/2030": "Fathers Day",
|
||||
"09/02/2030": "Labor Day",
|
||||
"10/14/2030": "Columbus Day",
|
||||
"11/28/2030": "Thanksgiving Day"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,13 +1,13 @@
|
||||
<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">
|
||||
<title>2025.12.1</title>
|
||||
<linearGradient id="zywbv" x2="0" y2="100%">
|
||||
<linearGradient id="NqPQa" x2="0" y2="100%">
|
||||
<stop offset="0" stop-opacity=".1" stop-color="#EEE"/>
|
||||
<stop offset="1" stop-opacity=".1"/>
|
||||
</linearGradient>
|
||||
<mask id="mlBIM"><rect width="685" height="200" rx="30" fill="#FFF"/></mask>
|
||||
<g mask="url(#mlBIM)">
|
||||
<mask id="tjzSG"><rect width="685" height="200" rx="30" fill="#FFF"/></mask>
|
||||
<g mask="url(#tjzSG)">
|
||||
<rect width="685" height="200" fill="#08C" x="0"/>
|
||||
<rect width="685" height="200" fill="url(#zywbv)"/>
|
||||
<rect width="685" height="200" fill="url(#NqPQa)"/>
|
||||
</g>
|
||||
<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>
|
||||
|
||||
|
Before Width: | Height: | Size: 815 B After Width: | Height: | Size: 815 B |
Reference in New Issue
Block a user