diff --git a/automations/people/Clint/wake_clint.yaml b/automations/people/Clint/wake_clint.yaml
index 7126e56..8287f33 100644
--- a/automations/people/Clint/wake_clint.yaml
+++ b/automations/people/Clint/wake_clint.yaml
@@ -22,7 +22,7 @@ action:
- action: media_player.volume_set
data:
entity_id: media_player.ma_home_assistant_voice_097b44_media_player
- volume_level: 0.50
+ volume_level: 0.60
- action: input_select.select_option
data:
@@ -35,7 +35,10 @@ action:
entity_id: media_player.ma_home_assistant_voice_097b44_media_player
data:
media_type: playlist
- media_id: library://playlist/32
+ #media_id: library://playlist/7
+ media_id: >
+ {% set playlists = ['library://playlist/33','library://playlist/32','library://playlist/21','library://playlist/28','library://playlist/27','library://playlist/22','library://playlist/29','library://playlist/36','library://playlist/23','library://playlist/12','library://playlist/34','library://playlist/35','library://playlist/19'] %}
+ {{ playlists|random }}
enqueue: replace
- action: script.wake_the_bedroom
diff --git a/automations/rooms/boys_room/boys_room_out_of_bed.yaml b/automations/rooms/boys_room/boys_room_out_of_bed.yaml
index 2830931..571257a 100644
--- a/automations/rooms/boys_room/boys_room_out_of_bed.yaml
+++ b/automations/rooms/boys_room/boys_room_out_of_bed.yaml
@@ -98,7 +98,7 @@ action:
- action: webrtc.dash_cast
data:
entity_id: media_player.computer_area_hub
- url: rtsp_cam01_sub
+ url: cam01_sub_opus
force: true
extra:
mode: webrtc
@@ -112,7 +112,7 @@ action:
- action: webrtc.dash_cast
data:
entity_id: media_player.front_room_hub
- url: rtsp_cam01_sub
+ url: cam01_sub_opus
force: true
extra:
mode: webrtc
diff --git a/automations/rooms/boys_room/boys_room_white_noise_on.yaml b/automations/rooms/boys_room/boys_room_white_noise_on.yaml
index 02a4f7c..df32d35 100644
--- a/automations/rooms/boys_room/boys_room_white_noise_on.yaml
+++ b/automations/rooms/boys_room/boys_room_white_noise_on.yaml
@@ -28,31 +28,10 @@ action:
target:
entity_id: media_player.ma_boys_room_clock
- - action: media_player.volume_set
- data:
- volume_level: 0.30
- target:
- entity_id: media_player.ma_boys_room_clock
-
- #- action: script.goodnight_kids_youtube_music
-
- - action: media_player.shuffle_set
- metadata: {}
+ - action: script.search_and_play_playlist
data:
+ speaker: media_player.ma_boys_room_clock
+ search_term: CleverThunderstorm
+ volume: 0.3
+ repeat: all
shuffle: false
- target:
- entity_id: media_player.ma_boys_room_clock
- - action: media_player.repeat_set
- metadata: {}
- data:
- repeat: "all"
- target:
- entity_id: media_player.ma_boys_room_clock
- - action: music_assistant.play_media
- metadata: {}
- data:
- media_id: library://track/101
- media_type: track
- enqueue: replace
- target:
- entity_id: media_player.ma_boys_room_clock
diff --git a/automations/rooms/furnace_room_lights.yaml b/automations/rooms/furnace_room_lights.yaml
index eff01c3..a7b71b7 100644
--- a/automations/rooms/furnace_room_lights.yaml
+++ b/automations/rooms/furnace_room_lights.yaml
@@ -4,7 +4,7 @@ description: "Handles the lights in the furnace room"
mode: queued
triggers:
- id: door_open
- entity_id: binary_sensor.water_softener_multisensor_door
+ entity_id: binary_sensor.furnace_room_multisensor_door
from: "off"
to: "on"
trigger: state
@@ -12,7 +12,7 @@ triggers:
When one of the door sensors detect that the furnace room door has been
opened
- id: door_closed
- entity_id: binary_sensor.water_softener_multisensor_door
+ entity_id: binary_sensor.furnace_room_multisensor_door
to: "off"
for: "00:10:00"
trigger: state
diff --git a/automations/rooms/girls_room/girls_room_out_of_bed.yaml b/automations/rooms/girls_room/girls_room_out_of_bed.yaml
index 1336975..0e5357a 100644
--- a/automations/rooms/girls_room/girls_room_out_of_bed.yaml
+++ b/automations/rooms/girls_room/girls_room_out_of_bed.yaml
@@ -103,7 +103,7 @@ action:
- action: webrtc.dash_cast
data:
entity_id: media_player.computer_area_hub
- url: rtsp_cam08_sub
+ url: cam08_sub_opus
force: true
extra:
mode: webrtc
@@ -117,7 +117,7 @@ action:
- action: webrtc.dash_cast
data:
entity_id: media_player.front_room_hub
- url: rtsp_cam08_sub
+ url: cam08_sub_opus
force: true
extra:
mode: webrtc
diff --git a/automations/rooms/girls_room/girls_room_white_noise_on.yaml b/automations/rooms/girls_room/girls_room_white_noise_on.yaml
index d60752d..56a60c1 100644
--- a/automations/rooms/girls_room/girls_room_white_noise_on.yaml
+++ b/automations/rooms/girls_room/girls_room_white_noise_on.yaml
@@ -29,31 +29,10 @@ action:
target:
entity_id: media_player.ma_girls_room_hub
- - action: media_player.volume_set
+ - action: script.search_and_play_playlist
data:
- volume_level: 0.25
- target:
- entity_id: media_player.ma_girls_room_hub
-
- #- action: script.goodnight_kids_youtube_music
-
- - action: media_player.shuffle_set
- metadata: {}
- data:
- shuffle: false
- target:
- entity_id: media_player.ma_girls_room_hub
- - action: media_player.repeat_set
- metadata: {}
- data:
- repeat: "all"
- target:
- entity_id: media_player.ma_girls_room_hub
- - action: music_assistant.play_media
- metadata: {}
- data:
- media_id: library://track/101
- media_type: track
- enqueue: replace
- target:
- entity_id: media_player.ma_girls_room_hub
+ speaker: media_player.ma_girls_room_hub
+ search_term: Clever Kids Goodnight Songs
+ volume: 0.25
+ repeat: all
+ shuffle: false
\ No newline at end of file
diff --git a/automations/rooms/master_bedroom/master_bedroom_white_noise_on.yaml b/automations/rooms/master_bedroom/master_bedroom_white_noise_on.yaml
index a33a910..e05f47f 100644
--- a/automations/rooms/master_bedroom/master_bedroom_white_noise_on.yaml
+++ b/automations/rooms/master_bedroom/master_bedroom_white_noise_on.yaml
@@ -7,35 +7,10 @@ trigger:
to: "on"
action:
- #- action: input_select.select_option
- # data:
- # entity_id: input_select.master_bedroom_mode
- # option: 'Off'
- - action: media_player.volume_set
+ - action: script.search_and_play_playlist
data:
- volume_level: 0.25
- target:
- device_id: 8350a88218fdf3807d190142a9e2dc18
-
- #- action: script.goodnight_kids_youtube_music
- - action: music_assistant.play_media
- metadata: {}
- data:
- media_id: library://track/101
- media_type: track
- enqueue: replace
- target:
- device_id: 8350a88218fdf3807d190142a9e2dc18
-
- # - action: media_player.shuffle_set
- # metadata: {}
- # data:
- # shuffle: false
- # target:
- # entity_id: media_player.ma_home_assistant_voice_097b44_media_player
- # - action: media_player.repeat_set
- # metadata: {}
- # data:
- # repeat: "all"
- # target:
- # entity_id: media_player.ma_home_assistant_voice_097b44_media_player
+ speaker: media_player.ma_home_assistant_voice_097b44_media_player
+ search_term: CleverThunderstorm
+ volume: 0.25
+ repeat: all
+ shuffle: false
\ No newline at end of file
diff --git a/automations/rooms/utility_room/utility_room_lights_to_on.yaml b/automations/rooms/utility_room/utility_room_lights_to_on.yaml
index d8ba06a..fbe018f 100644
--- a/automations/rooms/utility_room/utility_room_lights_to_on.yaml
+++ b/automations/rooms/utility_room/utility_room_lights_to_on.yaml
@@ -33,6 +33,12 @@ condition:
entity_id: light.utility_room_vanity
state: "on"
+variables:
+ switch_name: switch.utility_room_motion_switch
+ light_name: utility_room_hue
+ mode_name: input_select.utility_room_mode
+ automatic_profile: input_select.automatic_light_profile
+
action:
- alias: "Make sure Z-Wave switch is turned on"
action: homeassistant.turn_on
@@ -47,10 +53,10 @@ action:
sequence:
- action: scene.turn_on
target:
- entity_id: "scene.utility_room_hue_{{states('input_select.automatic_light_profile').lower().replace(' ','_')}}"
+ entity_id: "scene.{{light_name}}_{{states(automatic_profile).lower().replace(' ','_')}}"
default:
- action: scene.turn_on
target:
- entity_id: "scene.utility_room_hue_{{states('input_select.utility_room_mode').lower().replace(' ','_')}}"
+ entity_id: "scene.{{light_name}}_{{states(mode_name).lower().replace(' ','_')}}"
- delay: 1
diff --git a/blueprints/automation/Blackshome/appliance-notifications.yaml b/blueprints/automation/Blackshome/appliance-notifications.yaml
new file mode 100644
index 0000000..f83bc21
--- /dev/null
+++ b/blueprints/automation/Blackshome/appliance-notifications.yaml
@@ -0,0 +1,2387 @@
+blueprint:
+ name: Appliance Notifications & Actions
+ description: "# \U0001F4F3 Appliance Notifications & Actions\n**Version: 3.8**\n\n\U0001F914
+ Watts your appliance up to, you're always in the know from start to finish! \U0001F6CE️\U0001F50C\U0001F4B8\n\n**If
+ you like my blueprints, and would like to show your support or just say thank
+ you?** [Click Here](https://www.paypal.com/donate/?hosted_button_id=WAZS3QSDTPGA8)
+ \U0001F642\n\n The Automation Process: \U0001F448
\n\n
+ \ - **Appliance Trigger:**\n - Enter the power sensor entity that measures
+ the live current draw of the appliance. Common devices with these sensors include
+ smart plugs, energy meters, etc.\n - The automation is triggered when the
+ appliance's current draw exceeds a set wattage.\n - The automation ends when
+ the appliance's current draw falls below a set value.\n\n - **Notification Options:**\n
+ \ - Send notification messages to one or multiple devices when the appliance
+ starts, finishes or the watchdog is triggered.\n - Your end message can also
+ include estimates of total power consumption and cost.\n - Include duration
+ tracking in your end message to track the appliance's operational time for the
+ task or cycle.\n - Opt to sends a repeated notifications to remind you when
+ the appliance cycle is complete.\n - Limit when notifications can be sent
+ by using Notify Time Restrictions - helpful for avoiding alerts while you're asleep.\n
+ \ - Notifications are compatible with both Apple iOS and Android devices,
+ ensuring universal accessibility.\n\n - **Run Status:**\n - Display your
+ appliance's run status on your dashboard.\n\n - **Notify Time Restrictions:**\n
+ \ - Restrict notifications to the specified start and end times on the selected
+ days. Notifications outside this time range will be skipped.\n\n - **Energy Tracking:**\n
+ \ - Use energy tracking to estimate the total energy usage (kWh) for each
+ completed cycle. You can also choose to include the estimated cost of that cycle
+ in the end notification.\n - Or simply update the start and end helpers without
+ including any energy information in the end notification - useful for your own
+ custom actions or other Home Assistant logic.\n \n ⚠️ **Disclaimer**
+ - These values are estimates and should only be used as a guide. Please avoid
+ relying solely on these estimates for accuracy and use them at your own risk.
+ We cannot be held responsible for any inaccuracies or resulting losses, damages,
+ inconvenience, or anything else that may occur.\n\n - **Time Tracking:**\n -
+ Runtime Tracking - Records the total runtime of your appliance by updating a text
+ helper each time it completes a full cycle.\n - Duration Tracking - Tracks
+ how long the appliance was running during each individual cycle and includes this
+ duration in the end notification message.\n\n - **Cycle Counter:**\n - Use
+ the cycle counter to track the total number of cycles completed by your appliance.
+ You can also choose to include this information in your end message.\n\n - **Service
+ Reminders:**\n - Service reminders help you track appliance usage and perform
+ timely maintenance.\n - Cycle-Based Reminder - Notifies you when a service
+ is due based on the number of cycles completed.\n - Time-Based Reminder -
+ Notifies you when a service is due based on the total time the appliance has been
+ in use since the last service.\n\n - **Watchdog:**\n - The watchdog option
+ monitors an appliance cycle completion.\n - It sends a notification if a
+ cycle completion fails within the specified time frame.\n\n - **Device Tracker:**\n
+ \ - You can choose to use the device tracker for Start, End, and Watchdog
+ notifications.\n - When enabled, only selected devices currently inside the
+ chosen zone will receive those notifications.\n\n - **Custom Actions:**\n -
+ Tailor custom actions to suit your preferences and needs, enhancing the automation's
+ functionality.\n - Configure actions such as triggering announcements on
+ platforms like The Voice (HA), Google, Alexa, etc., to keep you informed about
+ appliance events.\n\n - **Custom Conditions:**\n - Enter any custom conditions
+ to further customize the automation process.\n \n\nNeed help? \n- FAQ:
+ [Click Here](https://community.home-assistant.io/t/650166/2)\n- Community Support
+ Including Updates: [Click Here](https://community.home-assistant.io/t/650166)\n\nRequired
+ = *\n"
+ domain: automation
+ input:
+ appliance_power_settings:
+ name: Power Settings *
+ icon: mdi:current-ac
+ collapsed: true
+ input:
+ power_sensor:
+ name: Power Sensor *
+ description: 'Please enter the power sensor entity that measures the live
+ current draw of the appliance. Common devices that have these sensors
+ include smart plugs. This sensor is essential for triggering the automation
+ when the appliance starts and when it finishes.
+
+ '
+ default: []
+ selector:
+ entity:
+ filter:
+ - domain:
+ - sensor
+ multiple: false
+ reorder: false
+ start_appliance_power:
+ name: Start - Appliance Power Setpoint
+ description: 'Specify the threshold that the power must exceed to indicate
+ the appliance has started its cycle. The power must transition from below
+ to above this setpoint.
+
+ '
+ default: 10
+ selector:
+ number:
+ min: 1.0
+ max: 30.0
+ step: 1.0
+ unit_of_measurement: watts
+ mode: slider
+ start_time_delay:
+ name: Start - Power Time Delay
+ description: 'Specify the duration for which the power must remain above
+ the threshold to indicate the appliance has started its cycle. The power
+ must remain above its setpoint for the specified time delay. If the power
+ falls below the setpoint again within this time frame, it will not trigger.
+ This will help prevent a false trigger.
+
+ '
+ default: 1
+ selector:
+ number:
+ min: 0.25
+ max: 5.0
+ step: 0.25
+ unit_of_measurement: minutes
+ mode: slider
+ running_dead_zone:
+ name: Running - Dead Zone
+ description: 'After the appliance starts, implementing a dead zone can prevent
+ false end triggers, especially if the power briefly dips below the appliance''s
+ end setpoint during the cycle after startup. Setting the running dead
+ zone beyond this point ensures a reliable conclusion by preventing a premature
+ end trigger.
+
+
+ Additionally, the option to use ''End - Repeat Count'' provides a similar
+ functionality without being subjected to any specific time frame. You
+ can choose to use both the ''Running - Dead Zone'' and ''End - Repeat
+ Count,'' with the ''End - Repeat Count'' occurring after the ''Running
+ - Dead Zone''.
+
+ '
+ default: 0
+ selector:
+ number:
+ min: 0.0
+ max: 120.0
+ step: 1.0
+ unit_of_measurement: minutes
+ mode: slider
+ end_appliance_power:
+ name: End - Appliance Power Setpoint
+ description: 'Specify the threshold that the power must stay below to indicate
+ the appliance has finished its cycle. The power must transition from above
+ to below this setpoint.
+
+ '
+ default: 5
+ selector:
+ number:
+ min: 1.0
+ max: 30.0
+ step: 1.0
+ unit_of_measurement: watts
+ mode: slider
+ end_time_delay:
+ name: End - Power Time Delay
+ description: 'Specify the duration for which the power must remain below
+ the threshold to indicate the appliance has finished its cycle. The power
+ must remain below its setpoint for the specified time delay. If the power
+ exceeds the setpoint again within this time frame, it will not trigger.
+
+ '
+ default: 1
+ selector:
+ number:
+ min: 0.25
+ max: 5.0
+ step: 0.25
+ unit_of_measurement: minutes
+ mode: slider
+ end_repeat_count:
+ name: End - Repeat Count
+ description: 'The number of times the ''End - Appliance Power Setpoint +
+ End - Power Time Delay'' condition should be met before triggering the
+ end of the cycle.
+
+ '
+ default: 1
+ selector:
+ number:
+ min: 1.0
+ max: 10.0
+ mode: slider
+ step: 1.0
+ start_notify_settings:
+ name: Start Notify
+ icon: mdi:bell-check-outline
+ collapsed: true
+ input:
+ include_start_notify:
+ name: Use the Start Notify Options (Optional)
+ description: "Select 'Enable Start Notify Options' if you would like to
+ receive a notification when the appliance starts. \n"
+ default: disable_start_notify_options
+ selector:
+ select:
+ options:
+ - label: Enable Start Notify Options
+ value: enable_start_notify_options
+ - label: Disable Start Notify Options
+ value: disable_start_notify_options
+ multiple: false
+ custom_value: false
+ sort: false
+ start_notify_device:
+ name: Devices Notified
+ description: 'Select the devices to be notified when the appliance starts.
+
+ '
+ default: []
+ selector:
+ device:
+ filter:
+ - integration: mobile_app
+ multiple: true
+ start_title:
+ name: Title
+ description: 'Enter in the notification title that you would like to receive
+ when the appliance starts.
+
+ '
+ default: Washing Machine
+ selector:
+ text:
+ multiple: false
+ multiline: false
+ start_message:
+ name: Message
+ description: 'Enter in the notification message that you would like to receive
+ when the appliance starts.
+
+ '
+ default: YES! Another load is ON :)
+ selector:
+ text:
+ multiple: false
+ multiline: false
+ start_notify_tag:
+ name: Notification Tag
+ description: 'Use a tag to keep your notifications organized. When a new
+ notification with the same tag is sent, it replaces the old one, so you
+ won''t get cluttered with multiple notifications for the same appliance.
+
+
+ You can use the same tag across start, end, and watchdog notifications
+ to ensure only one active notification remains throughout the appliance
+ cycle.
+
+
+ If this input is left blank, no tag will be applied and each notification
+ will be treated as separate.
+
+
+ For best results, use short, unique tags for each automation - for example:
+ `washing-clothes`, `drying-clothes`, `washing-dishes`, etc.
+
+ '
+ default: []
+ selector:
+ text:
+ multiple: false
+ multiline: false
+ start_notify_interruption_level:
+ name: Interruption Level - iOS Only
+ description: 'On devices running iOS 15 and later, you can configure the
+ interruption level for your notifications to ensure they are delivered
+ according to your preferences. Choose the desired interruption level from
+ the dropdown list. Critical and time-sensitive notifications must be turned
+ ON within the Home Assistant App, and time-sensitive notifications must
+ be allowed in your Focus settings.
+
+
+ For more information on interruption levels [Click Here](https://community.home-assistant.io/t/650166/278)
+
+ '
+ default: active
+ selector:
+ select:
+ mode: dropdown
+ options:
+ - label: Default
+ value: active
+ - label: Critical Notifications
+ value: critical
+ - label: Time Sensitive Notifications
+ value: time-sensitive
+ - label: Quiet Notifications Without Waking Screen
+ value: passive
+ multiple: false
+ custom_value: false
+ sort: false
+ start_notify_sound:
+ name: Notification Sound - iOS Only
+ description: 'The Home Assistant app for iOS includes built-in notification
+ sounds, and you can import sounds from your iOS device into the app. Custom
+ sounds can also be added via iTunes or from your cloud storage. When entering
+ a sound, ensure you use the full filename, including the extension.
+
+
+ For more information on using sounds in the Home Assistant app, [Click
+ Here](https://community.home-assistant.io/t/650166/278)
+
+ '
+ default: []
+ selector:
+ text:
+ multiple: false
+ multiline: false
+ start_notify_data:
+ name: Android Only Options (Optional)
+ description: '**High Priority** notifications ensure that you receive important
+ alerts immediately. These notifications bypass normal delivery delays
+ and are delivered instantly to your device.
+
+
+ **Sticky Notification** ensure that important alerts are not dismissed
+ when selected. They remain on your notification screen until you actively
+ clear or swipe them away, ensuring that critical information stays visible
+ until addressed.
+
+
+ **Notification Channel** allow you to easily organize different notification
+ settings, including notification sounds, vibrations, and other device-specific
+ features. If you choose this option, please enter your desired channel
+ name below.
+
+
+ **Icon** allows you to replace the default Home Assistant icon with one
+ of your choice. If selected, choose your preferred icon using the **Icon
+ - Android Only** option below, and set the icon colour using **Icon Colour
+ - Android Only**.
+
+
+ For more information on notification options [Click Here](https://community.home-assistant.io/t/650166/278)
+
+ '
+ default: []
+ selector:
+ select:
+ multiple: true
+ options:
+ - label: High Priority
+ value: high_priority
+ - label: Sticky Notification
+ value: sticky
+ - label: Notification Channel
+ value: channel
+ - label: Icon
+ value: icon
+ custom_value: false
+ sort: false
+ start_notify_channel:
+ name: Notification Channel - Android Only
+ description: 'If you have chosen to use a notification channel, simply enter
+ the name of an existing channel to apply its pre-configured settings.
+ If you don''t have a channel yet, you can create a new one by entering
+ a name here. When your automation sends the first notification, it will
+ create the channel on your device. After the channel is created, you can
+ customize its notification settings to your preference directly on your
+ device.
+
+ '
+ default: []
+ selector:
+ text:
+ multiple: false
+ multiline: false
+ start_notify_icon:
+ name: Icon - Android Only
+ description: 'Select a custom icon to replace the default Home Assistant
+ icon in the notification. This setting applies only if the **Icon** option
+ is selected in **Android Only Options** above.
+
+ '
+ default: mdi:washing-machine
+ selector:
+ icon: {}
+ start_notify_icon_colour:
+ name: Icon Colour - Android Only
+ description: 'Choose a colour for your custom notification icon. This setting
+ applies only if the **Icon** option is selected in **Android Only Options**
+ above.
+
+ '
+ default:
+ - 41
+ - 121
+ - 255
+ selector:
+ color_rgb: {}
+ end_notify_settings:
+ name: End Notify
+ icon: mdi:bell-ring-outline
+ collapsed: true
+ input:
+ include_end_notify:
+ name: Use the End Notify Options (Optional)
+ description: "Select 'Enable End Notify Options' if you would like to receive
+ a notification when the appliance finishes. \n"
+ default: disable_end_notify_options
+ selector:
+ select:
+ options:
+ - label: Enable End Notify Options
+ value: enable_end_notify_options
+ - label: Disable End Notify Options
+ value: disable_end_notify_options
+ multiple: false
+ custom_value: false
+ sort: false
+ end_notify_device:
+ name: Devices Notified
+ description: 'Select the devices to be notified when the appliance has finished.
+
+ '
+ default: []
+ selector:
+ device:
+ filter:
+ - integration: mobile_app
+ multiple: true
+ end_message_title:
+ name: Title
+ description: 'Enter in the notification title that you would like to receive
+ when the appliance has finished.
+
+ '
+ default: Washing Machine
+ selector:
+ text:
+ multiple: false
+ multiline: false
+ end_message:
+ name: Message
+ description: 'Enter in the notification message that you would like to receive
+ when the appliance has finished.
+
+ '
+ default: Yippee the washing machine is finished!
+ selector:
+ text:
+ multiple: false
+ multiline: false
+ end_notify_tag:
+ name: Notification Tag
+ description: 'Use a tag to keep your notifications organized. When a new
+ notification with the same tag is sent, it replaces the old one, so you
+ won''t get cluttered with multiple notifications for the same appliance.
+
+
+ You can use the same tag across start, end, and watchdog notifications
+ to ensure only one active notification remains throughout the appliance
+ cycle.
+
+
+ If this input is left blank, no tag will be applied and each notification
+ will be treated as separate.
+
+
+ For best results, use short, unique tags for each automation - for example:
+ `washing-clothes`, `drying-clothes`, `washing-dishes`, etc.
+
+ '
+ default: []
+ selector:
+ text:
+ multiple: false
+ multiline: false
+ end_notify_interruption_level:
+ name: Interruption Level - iOS Only
+ description: 'On devices running iOS 15 and later, you can configure the
+ interruption level for your notifications to ensure they are delivered
+ according to your preferences. Choose the desired interruption level from
+ the dropdown list. Critical and time-sensitive notifications must be turned
+ ON within the Home Assistant App, and time-sensitive notifications must
+ be allowed in your Focus settings.
+
+
+ For more information on interruption levels [Click Here](https://community.home-assistant.io/t/650166/278)
+
+ '
+ default: active
+ selector:
+ select:
+ mode: dropdown
+ options:
+ - label: Default
+ value: active
+ - label: Critical Notifications
+ value: critical
+ - label: Time Sensitive Notifications
+ value: time-sensitive
+ - label: Quiet Notifications Without Waking Screen
+ value: passive
+ multiple: false
+ custom_value: false
+ sort: false
+ end_notify_sound:
+ name: Notification Sound - iOS Only
+ description: 'The Home Assistant app for iOS includes built-in notification
+ sounds, and you can import sounds from your iOS device into the app. Custom
+ sounds can also be added via iTunes or from your cloud storage. When entering
+ a sound, ensure you use the full filename, including the extension.
+
+
+ For more information on using sounds in the Home Assistant app, [Click
+ Here](https://community.home-assistant.io/t/650166/278)
+
+ '
+ default: []
+ selector:
+ text:
+ multiple: false
+ multiline: false
+ end_notify_data:
+ name: Android Only Options (Optional)
+ description: '**High Priority** notifications ensure that you receive important
+ alerts immediately. These notifications bypass normal delivery delays
+ and are delivered instantly to your device.
+
+
+ **Sticky Notification** ensure that important alerts are not dismissed
+ when selected. They remain on your notification screen until you actively
+ clear or swipe them away, ensuring that critical information stays visible
+ until addressed.
+
+
+ **Notification Channel** allow you to easily organize different notification
+ settings, including notification sounds, vibrations, and other device-specific
+ features. If you choose this option, please enter your desired channel
+ name below.
+
+
+ **Icon** allows you to replace the default Home Assistant icon with one
+ of your choice. If selected, choose your preferred icon using the **Icon
+ - Android Only** option below, and set the icon colour using **Icon Colour
+ - Android Only**.
+
+
+ For more information on notification options [Click Here](https://community.home-assistant.io/t/650166/278)
+
+ '
+ default: []
+ selector:
+ select:
+ multiple: true
+ options:
+ - label: High Priority
+ value: high_priority
+ - label: Sticky Notification
+ value: sticky
+ - label: Notification Channel
+ value: channel
+ - label: Icon
+ value: icon
+ custom_value: false
+ sort: false
+ end_notify_channel:
+ name: Notification Channel - Android Only
+ description: 'If you have chosen to use a notification channel, simply enter
+ the name of an existing channel to apply its pre-configured settings.
+ If you don''t have a channel yet, you can create a new one by entering
+ a name here. When your automation sends the first notification, it will
+ create the channel on your device. After the channel is created, you can
+ customize its notification settings to your preference directly on your
+ device.
+
+ '
+ default: []
+ selector:
+ text:
+ multiple: false
+ multiline: false
+ end_notify_icon:
+ name: Icon - Android Only
+ description: 'Select a custom icon to replace the default Home Assistant
+ icon in the notification. This setting applies only if the **Icon** option
+ is selected in **Android Only Options** above.
+
+ '
+ default: mdi:washing-machine
+ selector:
+ icon: {}
+ end_notify_icon_colour:
+ name: Icon Colour - Android Only
+ description: 'Choose a colour for your custom notification icon. This setting
+ applies only if the **Icon** option is selected in **Android Only Options**
+ above.
+
+ '
+ default:
+ - 0
+ - 200
+ - 83
+ selector:
+ color_rgb: {}
+ end_reminder_notification:
+ name: Reminder Notification Options (Optional)
+ description: "Set this option to receive repeated notifications reminding
+ you that the appliance cycle is complete. Notifications will continue
+ until the specified **Reminder Notification Entity** is **ON** or the
+ **Reminder Notification Maximum Count** is reached, helping ensure you
+ don't miss the end of the cycle while avoiding excessive reminders.\n\nYou
+ can choose to:\n\n \n - **Enable Reminder Notification**: Receive repeated
+ reminders until the\n **Reminder Notification Entity** is ON or the
+ maximum notification\n count is reached.\n\n - **Enable Reminder Notification
+ + Notify When Done**: Receive repeated\n reminders until the **Reminder
+ Notification Entity** is ON or the maximum\n notification count is
+ reached. When the entity turns ON, a one-time\n notification will be
+ sent using the **Notify When Done Message**.\n\n - **Enable Reminder
+ Notification + Clear When Done**: Receive repeated\n reminders until
+ the **Reminder Notification Entity** is ON or the maximum\n notification
+ count is reached. When the entity turns ON, the notification\n will
+ be cleared.\n\n\n *Note: You must set the **End Notification Tag**
+ above for this option to work.*\n\n - **Disable Reminder Notification**:
+ No reminder notifications will be sent.\n"
+ default: disable_reminder_notification
+ selector:
+ select:
+ options:
+ - label: Enable Reminder Notification
+ value: enable_reminder_notification
+ - label: Enable Reminder Notification + Notify When Done
+ value: enable_reminder_notification_notify
+ - label: Enable Reminder Notification + Clear When Done
+ value: enable_reminder_notification_clear
+ - label: Disable Reminder Notification
+ value: disable_reminder_notification
+ multiple: false
+ custom_value: false
+ sort: false
+ end_reminder_notification_entity:
+ name: Reminder Notification Entity
+ description: "Select the entity that signals someone has attended to the
+ appliance (e.g., opened the washing machine door, emptied the dishwasher,
+ etc.).\n\nThis entity is used to:\n - Stop repeated reminder notifications
+ when it turns **ON**.\n - Send a one-time **Notify When Done** message
+ if that option is selected above.\n - Clear the notification if the **Clear
+ When Done** option is selected above (requires an **End Notification Tag**).\n\n\nTypically,
+ this will be a binary sensor such as a door or lid sensor that turns **ON**
+ when opened.\n\n*Note: The behaviour of this entity depends on the selected
+ option under **Reminder Notification Options** above.*\n"
+ default: []
+ selector:
+ entity:
+ filter:
+ - domain:
+ - binary_sensor
+ multiple: false
+ reorder: false
+ end_reminder_notification_message:
+ name: Reminder Notification Message
+ description: 'Enter the message you would like to receive as a reminder
+ that the appliance has finished its cycle. This message will be sent repeatedly
+ until the specified **Reminder Notification Entity** is ON or the maximum
+ notification count is reached.
+
+ '
+ default: Hey! Your fresh laundry is ready, don't leave it hanging!
+ selector:
+ text:
+ multiple: false
+ multiline: false
+ end_reminder_notification_time_delay:
+ name: Reminder Notification Time Delay
+ description: 'Specify the duration to wait between reminder messages. This
+ sets the time interval at which the reminder will be sent repeatedly until
+ the specified **Reminder Notification Entity** is ON or the maximum notification
+ count is reached.
+
+ '
+ default: 10
+ selector:
+ number:
+ min: 1.0
+ max: 60.0
+ step: 1.0
+ unit_of_measurement: minutes
+ mode: slider
+ end_reminder_notification_max_count:
+ name: Reminder Notification Maximum Count
+ description: 'Specify the maximum number of times the reminder notification
+ will be sent before stopping. This ensures you won''t receive excessive
+ notifications.
+
+ '
+ default: 2
+ selector:
+ number:
+ min: 1.0
+ max: 10.0
+ step: 1.0
+ mode: slider
+ end_attended_notification_message:
+ name: Notify When Done Message
+ description: 'Enter the message to send when someone has attended to the
+ appliance after its cycle completes (e.g., removed the laundry, emptied
+ the dishwasher, etc.). This message will be sent once when the **Reminder
+ Notification Entity** turns ON and the **Enable Reminder Notification
+ + Notify When Done** option is selected above.
+
+ '
+ default: YES! Fresh laundry on the move, let the drying begin!
+ selector:
+ text:
+ multiple: false
+ multiline: false
+ run_status_settings:
+ name: Run Status
+ icon: mdi:list-status
+ collapsed: true
+ input:
+ include_run_status:
+ name: Use the Run Status Option (Optional)
+ description: 'Enable this option to display your appliance''s run status
+ on your dashboard.
+
+
+ For more information on how to use Run Status [Click Here](https://community.home-assistant.io/t/650166/690)
+
+ '
+ default: run_status_disabled
+ selector:
+ select:
+ options:
+ - label: Enable run status
+ value: run_status_enabled
+ - label: Disable run status
+ value: run_status_disabled
+ multiple: false
+ custom_value: false
+ sort: false
+ run_status_entity:
+ name: Run Status Entity
+ description: 'Select the **Dropdown Helper** that contains all your run
+ statuses.
+
+
+ ⚠️ The statuses must match exactly (including case sensitivity) with the
+ ones defined below. If they don''t, the automation will stop running and
+ an error will be logged.
+
+
+ Each status input includes examples to get you started, but you can be
+ as creative as you like... have some fun with it!
+
+ '
+ default: []
+ selector:
+ entity:
+ filter:
+ - domain:
+ - input_select
+ multiple: false
+ reorder: false
+ run_status_start:
+ name: Start Status
+ description: 'Enter the status you want to display when the appliance starts.
+
+
+ For example: `Washing`, `Scrubbing Away!`, `Drying` etc
+
+ '
+ default: []
+ selector:
+ text:
+ multiple: false
+ multiline: false
+ run_status_watchdog:
+ name: Watchdog Status
+ description: 'Enter the status you want to display when the watchdog is
+ triggered.
+
+
+ If you are not using the watchdog then you can leave this input blank.
+
+
+ For example: `Error`, `Drama in the Drum!`, etc
+
+ '
+ default: []
+ selector:
+ text:
+ multiple: false
+ multiline: false
+ run_status_end:
+ name: End Status
+ description: 'Enter the status you want to display when the appliance has
+ finished.
+
+
+ This can be the final “Finished” status when your **not** using the **Reminder
+ Notification Options**.
+
+
+ For example: `Finished`, `All Done!`, etc
+
+ '
+ default: []
+ selector:
+ text:
+ multiple: false
+ multiline: false
+ run_status_end_reminder:
+ name: End Reminder Status
+ description: 'Enter the status to display when all reminders have been sent
+ and the appliance has not been attended.
+
+
+ For example: `Still Waiting`, `Wrinkle Risk Rising!`, `Please Unload Me!`
+ etc
+
+ '
+ default: []
+ selector:
+ text:
+ multiple: false
+ multiline: false
+ run_status_end_attended:
+ name: End - Attended Status
+ description: 'Enter the status to display when the **Reminder Notification
+ Entity** detects the appliance has been attended to (e.g., door opened,
+ lid lifted, etc.).
+
+
+ This is the final “Ready” status of your appliance when you are using
+ the **Reminder Notification Options**.
+
+
+ For example: `Ready`, `Next Load Please!`, `Ready & Waiting!`, etc.
+
+ '
+ default: []
+ selector:
+ text:
+ multiple: false
+ multiline: false
+ notify_time_restrictions_settings:
+ name: Notify Time Restrictions
+ icon: mdi:clock-outline
+ collapsed: true
+ input:
+ include_time:
+ name: Use the Notify Time Restriction Option (Optional)
+ description: 'Restrict notifications to the specified start and end times
+ on the selected days. Notifications outside this time range will be skipped.
+ This is useful for avoiding notifications that could wake you while you''re
+ asleep, such as when running appliances at night.
+
+ '
+ default: time_disabled
+ selector:
+ select:
+ options:
+ - label: Enable notify time restrictions
+ value: time_enabled
+ - label: Disable notify time restrictions
+ value: time_disabled
+ multiple: false
+ custom_value: false
+ sort: false
+ after_time:
+ name: Start Time
+ description: 'Set the time when notifications are allowed to begin.
+
+ '
+ default: 00:00:00
+ selector:
+ time: {}
+ before_time:
+ name: End Time
+ description: 'Set the time when notifications should stop being sent.
+
+ '
+ default: 00:00:00
+ selector:
+ time: {}
+ weekday_options:
+ name: Weekdays
+ description: 'Select which days notifications are allowed. To activate
+ this, you must enable the Notification Time Restriction option above.
+
+ '
+ default:
+ - mon
+ - tue
+ - wed
+ - thu
+ - fri
+ - sat
+ - sun
+ selector:
+ select:
+ multiple: true
+ mode: list
+ options:
+ - label: Monday
+ value: mon
+ - label: Tuesday
+ value: tue
+ - label: Wednesday
+ value: wed
+ - label: Thursday
+ value: thu
+ - label: Friday
+ value: fri
+ - label: Saturday
+ value: sat
+ - label: Sunday
+ value: sun
+ custom_value: false
+ sort: false
+ power_tracking_settings:
+ name: Energy Tracking
+ icon: mdi:meter-electric-outline
+ collapsed: true
+ input:
+ include_power_tracking:
+ name: Use the Energy Tracking Option (Optional)
+ description: "Choose whether to track energy consumption for each completed
+ cycle. This lets you monitor how much energy is used every time a cycle
+ finishes.\n\nYou can choose to:\n - Include energy usage details (kWh)
+ in the end notification.\n - Include both energy usage and an estimated
+ cost in the end notification.\n - Or simply update the start and end
+ helpers without including any energy information in the end notification
+ - useful for your own custom actions or other Home Assistant logic.\n\n\n⚠️
+ **Disclaimer** - These values are estimates and should only be used as
+ a guide. Please avoid relying solely on these estimates for accuracy and
+ use them at your own risk. We cannot be held responsible for any inaccuracies
+ or resulting losses, damages, inconvenience, or anything else that may
+ occur.\n\nFor more information on how to use energy tracking [Click Here](https://community.home-assistant.io/t/650166/97)\n"
+ default: disable_power_tracking
+ selector:
+ select:
+ options:
+ - label: Enable - End Notify with Energy Used (kWh)
+ value: enable_power_tracking
+ - label: Enable - End Notify with Energy Used + Estimated Cost
+ value: enable_power_tracking_and_cost
+ - label: Enable - Update Start & End Helpers Only
+ value: enable_start_end_helpers
+ - label: Disable - Energy Tracking
+ value: disable_power_tracking
+ multiple: false
+ custom_value: false
+ sort: false
+ power_consumption_sensor:
+ name: Energy Tracking - Energy Sensor
+ description: "Select the sensor that reports the total energy used in kilowatt-hours
+ (kWh). This can be either a cumulative total or a daily value. \n\n**Note**
+ If you select a daily total sensor that resets at midnight, the data may
+ be inaccurate for cycles that span across two days. This is because the
+ energy value should increase continuously throughout the cycle, without
+ resetting to 0.0 kWh partway through.\n\nAlso, keep in mind that the blueprint
+ takes a snapshot of the sensor's value at the start and end of the cycle.
+ If your energy sensor updates infrequently, it may not reflect the exact
+ values at those moments, which can affect the start and end helpers, as
+ well as the estimated energy usage and cost.\n"
+ default: []
+ selector:
+ entity:
+ filter:
+ - domain:
+ - sensor
+ multiple: false
+ reorder: false
+ end_message_kwh:
+ name: Energy Tracking - End Message - Energy Consumption
+ description: 'Enter the title used in the end notification for the estimated
+ energy usage value. This label is shown directly before the estimated
+ energy usage (kWh) in the end notification.
+
+ '
+ default: Consumption
+ selector:
+ text:
+ multiple: false
+ multiline: false
+ end_message_cost:
+ name: Energy Tracking - End Message - Cost
+ description: 'Enter the title used in the end notification for the estimated
+ cost. This label is shown directly before the estimated cost value in
+ the end notification.
+
+ '
+ default: Approx Cost $
+ selector:
+ text:
+ multiple: false
+ multiline: false
+ cost_per_kwh:
+ name: Energy Tracking - Cost per kWh
+ description: 'Please enter your number helper or an energy sensor to specify
+ the electricity rate per kWh.
+
+
+ **Note** - Keep in mind that the rate used is determined when the appliance
+ ends and remains constant throughout the cycle, even if your energy sensor
+ value changes based on the time of day. This may result in an inaccurate
+ estimated cost if your electricity pricing varies during the cycle.
+
+ '
+ default: []
+ selector:
+ entity:
+ filter:
+ - domain:
+ - input_number
+ - sensor
+ multiple: false
+ reorder: false
+ start_power_consumption:
+ name: Energy Tracking - Start Number Helper
+ description: 'Select a number helper to store the kWh reading at the **start**
+ of the cycle. This must be a completely independent helper, and must not
+ be the same one used in the ''Energy Tracking - End Number Helper'' input
+ below.
+
+ '
+ default: []
+ selector:
+ entity:
+ filter:
+ - domain:
+ - input_number
+ multiple: false
+ reorder: false
+ end_power_consumption:
+ name: Energy Tracking - End Number Helper
+ description: 'Select a number helper to store the kWh reading at the **end**
+ of the cycle. This must be a completely independent helper, and must not
+ be the same one used in the ''Energy Tracking - Start Number Helper''
+ input above.
+
+ '
+ default: []
+ selector:
+ entity:
+ filter:
+ - domain:
+ - input_number
+ multiple: false
+ reorder: false
+ time_tracking_settings:
+ name: Time Tracking
+ icon: mdi:timer-sand-complete
+ collapsed: true
+ input:
+ include_runtime_tracking:
+ name: Use the Runtime Tracking Option (Optional)
+ description: 'Enable Runtime Tracking option to record the total runtime
+ of your appliance by updating a text helper each time it completes a full
+ cycle. You can also choose to include the total runtime in the end notification
+ message.
+
+ '
+ default: disable_runtime_tracking
+ selector:
+ select:
+ options:
+ - label: Enable Runtime Tracking
+ value: enable_runtime_tracking
+ - label: Enable Runtime Tracking with End Notify
+ value: enable_runtime_tracking_and_notify
+ - label: Disable Runtime Tracking
+ value: disable_runtime_tracking
+ multiple: false
+ custom_value: false
+ sort: false
+ runtime_tracking_helper:
+ name: Runtime Tracking - Text Helper
+ description: 'Select the text helper that will store the appliance''s total
+ runtime (in HH:MM:SS format).
+
+ '
+ default: []
+ selector:
+ entity:
+ filter:
+ - domain:
+ - input_text
+ multiple: false
+ reorder: false
+ runtime_tracking_end_message:
+ name: Runtime Tracking - End Message
+ description: 'Enter the title to display just before the total runtime in
+ the end notification message.
+
+ '
+ default: Total Runtime
+ selector:
+ text:
+ multiple: false
+ multiline: false
+ include_duration_tracking:
+ name: Use the Duration Tracking Option (Optional)
+ description: 'Enable the Duration Tracking option to monitor how long your
+ appliance runs during a full cycle. This allows you to include the cycle''s
+ duration in the end notification message.
+
+ '
+ default: disable_duration_tracking
+ selector:
+ select:
+ options:
+ - label: Enable - End Notify Duration Tracking
+ value: enable_duration_tracking
+ - label: Disable Duration Tracking
+ value: disable_duration_tracking
+ multiple: false
+ custom_value: false
+ sort: false
+ end_message_duration_tracking:
+ name: Duration Tracking - End Message - Duration
+ description: 'Enter the title to display just before the duration tracking
+ in the end notification message.
+
+ '
+ default: Duration
+ selector:
+ text:
+ multiple: false
+ multiline: false
+ cycle_counter_settings:
+ name: Cycle Counter
+ icon: mdi:counter
+ collapsed: true
+ input:
+ include_cycle_counter:
+ name: Use the Cycle Counter Option (Optional)
+ description: 'Enable the Cycle Counter option to update a counter every
+ time the appliance completes a full cycle. You can also choose to include
+ the cycle count in the end notify message.
+
+ '
+ default: disable_cycle_counter
+ selector:
+ select:
+ options:
+ - label: Enable Cycle Counter
+ value: enable_cycle_counter
+ - label: Enable Cycle Counter with End Notify
+ value: enable_cycle_counter_and_notify
+ - label: Disable Cycle Counter
+ value: disable_cycle_counter
+ multiple: false
+ custom_value: false
+ sort: false
+ cycle_counter_helper:
+ name: Cycle Counter - Counter Helper
+ description: 'Enter a counter helper that will track the number of appliance
+ cycles.
+
+ '
+ default: []
+ selector:
+ entity:
+ filter:
+ - domain:
+ - counter
+ multiple: false
+ reorder: false
+ cycle_counter_end_message:
+ name: Cycle Counter - End Message
+ description: 'Enter the title to display just before the cycle count in
+ the end notification message.
+
+ '
+ default: Total Cycles
+ selector:
+ text:
+ multiple: false
+ multiline: false
+ service_reminders_settings:
+ name: Service Reminders
+ icon: mdi:wrench-check-outline
+ collapsed: true
+ input:
+ include_service_reminder:
+ name: Use the Cycle Counter Service Reminder Option (Optional)
+ description: 'Enable the Cycle Counter Service Reminder option to update
+ a counter every time the appliance completes a full cycle. You can also
+ choose to include the service reminder in the end notify message.
+
+ '
+ default: disable_service_reminder
+ selector:
+ select:
+ options:
+ - label: Enable Service Reminder
+ value: enable_service_reminder
+ - label: Enable Service Reminder with End Notify
+ value: enable_service_reminder_and_notify
+ - label: Disable Service Reminder
+ value: disable_service_reminder
+ multiple: false
+ custom_value: false
+ sort: false
+ service_reminder_counter_helper:
+ name: Cycle Counter Service Reminder - Counter Helper
+ description: 'Enter a counter helper that will track the number of appliance
+ cycles since the last service.
+
+ '
+ default: []
+ selector:
+ entity:
+ filter:
+ - domain:
+ - counter
+ multiple: false
+ reorder: false
+ service_reminder_cycles:
+ name: Cycle Counter Service Reminder - Service Cycles
+ description: 'Specify the number of appliance cycles required before a service
+ reminder is triggered.
+
+ '
+ default: 30
+ selector:
+ number:
+ min: 1.0
+ max: 50.0
+ step: 1.0
+ unit_of_measurement: Cycles
+ mode: slider
+ service_reminder_end_message:
+ name: Cycle Counter Service Reminder - End Message
+ description: 'Enter the message that will appear in the end notification
+ when the service reminder is triggered.
+
+
+ **NOTE** - This message will only appear if the service count reaches
+ or exceeds the specified cycle threshold.
+
+ '
+ default: ⚠️ It's time to clean the filter!
+ selector:
+ text:
+ multiple: false
+ multiline: false
+ include_time_service_reminder:
+ name: Use the Time-Based Service Reminder Option (Optional)
+ description: 'Enable the Time-Based Service Reminder option to track the
+ total time the appliance has been in use since the last service. You can
+ also choose to include the service reminder in the end notification.
+
+
+ **Note** - The time is only updated when the appliance completes a full
+ cycle.
+
+ '
+ default: disable_time_service_reminder
+ selector:
+ select:
+ options:
+ - label: Enable Time-Based Service Reminder
+ value: enable_time_service_reminder
+ - label: Enable Time-Based Service Reminder with End Notification
+ value: enable_time_service_reminder_and_notify
+ - label: Disable Time-Based Service Reminder
+ value: disable_time_service_reminder
+ multiple: false
+ custom_value: false
+ sort: false
+ service_reminder_time_helper:
+ name: Time-Based Service Reminder - Text Helper
+ description: 'Select a text helper to track the total time the appliance
+ has been in use since the last service.
+
+
+ **NOTE** - To reset the tracked time, simply enter "0" into the helper.
+
+ '
+ default: []
+ selector:
+ entity:
+ filter:
+ - domain:
+ - input_text
+ multiple: false
+ reorder: false
+ service_reminder_time_threshold:
+ name: Time-Based Service Reminder - Service Time
+ description: 'Specify the time threshold (in HH:MM:SS format) that will
+ trigger the service reminder once reached.
+
+ '
+ default:
+ hours: 0
+ minutes: 0
+ seconds: 0
+ selector:
+ duration: {}
+ service_reminder_time_end_message:
+ name: Time-Based Service Reminder - End Message
+ description: 'Enter the message that will appear in the end notification
+ when the service reminder is triggered.
+
+
+ **NOTE** - This message will only appear if the service time reaches or
+ exceeds the specified time threshold.
+
+ '
+ default: ⚠️ It's time to clean the filter!
+ selector:
+ text:
+ multiple: false
+ multiline: false
+ watchdog_settings:
+ name: Watchdog
+ icon: mdi:dog-side
+ collapsed: true
+ input:
+ include_watchdog:
+ name: Use the Watchdog Option (Optional)
+ description: 'Enable the Watchdog option to monitor whether your appliance
+ completes its cycle within the expected time frame. If it fails to do
+ so, the automation will time out and send a notification to alert you
+ of a potential issue, helping you catch problems early.
+
+
+ **NOTE** - If the Watchdog is triggered, the automation will be cancelled.
+ If you''re using Duration Tracking, Cycle Counter, or Service Reminders,
+ they will not be updated, as the exact point of failure is unknown.
+
+ '
+ default: disable_watchdog
+ selector:
+ select:
+ options:
+ - label: Enable Watchdog
+ value: enable_watchdog
+ - label: Disable Watchdog
+ value: disable_watchdog
+ multiple: false
+ custom_value: false
+ sort: false
+ watchdog_timeframe:
+ name: Time Frame
+ description: 'Specify the maximum duration for the ''Watchdog'' to wait
+ for the appliance to complete its task. If the appliance exceeds this
+ time frame, the ''Watchdog'' will trigger and notify you, indicating a
+ potential issue.
+
+ '
+ default: 00:00:00
+ selector:
+ duration: {}
+ watchdog_notify_device:
+ name: Devices Notified
+ description: 'Select the devices that should receive a notification if the
+ appliance fails to complete its task within the expected time frame, triggering
+ the Watchdog.
+
+ '
+ default: []
+ selector:
+ device:
+ filter:
+ - integration: mobile_app
+ multiple: true
+ watchdog_title:
+ name: Title
+ description: 'Enter the notification title for the Watchdog timeout.
+
+ '
+ default: ⚠️ Appliance Watchdog
+ selector:
+ text:
+ multiple: false
+ multiline: false
+ watchdog_message:
+ name: Message
+ description: 'Enter the notification message for the Watchdog timeout.
+
+ '
+ default: Uh-oh! Time to check the washing machine.
+ selector:
+ text:
+ multiple: false
+ multiline: false
+ watchdog_notify_tag:
+ name: Notification Tag
+ description: 'Use a tag to keep your notifications organized. When a new
+ notification with the same tag is sent, it replaces the old one, so you
+ won''t get cluttered with multiple notifications for the same appliance.
+
+
+ You can use the same tag across start, end, and watchdog notifications
+ to ensure only one active notification remains throughout the appliance
+ cycle.
+
+
+ If this input is left blank, no tag will be applied and each notification
+ will be treated as separate.
+
+
+ For best results, use short, unique tags for each automation - for example:
+ `washing-clothes`, `drying-clothes`, `washing-dishes`, etc.
+
+ '
+ default: []
+ selector:
+ text:
+ multiple: false
+ multiline: false
+ watchdog_notify_interruption_level:
+ name: Interruption Level - iOS Only
+ description: 'On devices running iOS 15 and later, you can configure the
+ interruption level for your notifications to ensure they are delivered
+ according to your preferences. Choose the desired interruption level from
+ the dropdown list. Critical and time-sensitive notifications must be turned
+ ON within the Home Assistant App, and time-sensitive notifications must
+ be allowed in your Focus settings.
+
+
+ For more information on interruption levels [Click Here](https://community.home-assistant.io/t/650166/278)
+
+ '
+ default: active
+ selector:
+ select:
+ mode: dropdown
+ options:
+ - label: Default
+ value: active
+ - label: Critical Notifications
+ value: critical
+ - label: Time Sensitive Notifications
+ value: time-sensitive
+ - label: Quiet Notifications Without Waking Screen
+ value: passive
+ multiple: false
+ custom_value: false
+ sort: false
+ watchdog_notify_sound:
+ name: Notification Sound - iOS Only
+ description: 'The Home Assistant app for iOS includes built-in notification
+ sounds, and you can import sounds from your iOS device into the app. Custom
+ sounds can also be added via iTunes or from your cloud storage. When entering
+ a sound, ensure you use the full filename, including the extension.
+
+
+ For more information on using sounds in the Home Assistant app, [Click
+ Here](https://community.home-assistant.io/t/650166/278)
+
+ '
+ default: []
+ selector:
+ text:
+ multiple: false
+ multiline: false
+ watchdog_notify_data:
+ name: Android Only Options (Optional)
+ description: '**High Priority** notifications ensure that you receive important
+ alerts immediately. These notifications bypass normal delivery delays
+ and are delivered instantly to your device.
+
+
+ **Sticky Notification** ensure that important alerts are not dismissed
+ when selected. They remain on your notification screen until you actively
+ clear or swipe them away, ensuring that critical information stays visible
+ until addressed.
+
+
+ **Notification Channel** allow you to easily organize different notification
+ settings, including notification sounds, vibrations, and other device-specific
+ features. If you choose this option, please enter your desired channel
+ name below.
+
+
+ **Icon** allows you to replace the default Home Assistant icon with one
+ of your choice. If selected, choose your preferred icon using the **Icon
+ - Android Only** option below, and set the icon colour using **Icon Colour
+ - Android Only**.
+
+
+ For more information on notification options [Click Here](https://community.home-assistant.io/t/650166/278)
+
+ '
+ default: []
+ selector:
+ select:
+ multiple: true
+ options:
+ - label: High Priority
+ value: high_priority
+ - label: Sticky Notification
+ value: sticky
+ - label: Notification Channel
+ value: channel
+ - label: Icon
+ value: icon
+ custom_value: false
+ sort: false
+ watchdog_notify_channel:
+ name: Notification Channel - Android Only
+ description: 'If you have chosen to use a notification channel, simply enter
+ the name of an existing channel to apply its pre-configured settings.
+ If you don''t have a channel yet, you can create a new one by entering
+ a name here. When your automation sends the first notification, it will
+ create the channel on your device. After the channel is created, you can
+ customize its notification settings to your preference directly on your
+ device.
+
+ '
+ default: []
+ selector:
+ text:
+ multiple: false
+ multiline: false
+ watchdog_notify_icon:
+ name: Icon - Android Only
+ description: 'Select a custom icon to replace the default Home Assistant
+ icon in the notification. This setting applies only if the **Icon** option
+ is selected in **Android Only Options** above.
+
+ '
+ default: mdi:washing-machine-alert
+ selector:
+ icon: {}
+ watchdog_notify_icon_colour:
+ name: Icon Colour - Android Only
+ description: 'Choose a colour for your custom notification icon. This setting
+ applies only if the **Icon** option is selected in **Android Only Options**
+ above.
+
+ '
+ default:
+ - 244
+ - 67
+ - 54
+ selector:
+ color_rgb: {}
+ device_tracker_settings:
+ name: Device Tracker
+ icon: mdi:account-multiple-check-outline
+ collapsed: true
+ input:
+ include_device_tracker:
+ name: Use Device Tracker Options (Optional)
+ description: 'Home Assistant can track the location of your mobile devices
+ using the built-in device tracker. If your devices are set up for location
+ tracking and you''ve defined one or more zones, you can enable this option
+ to send notifications **only** to the devices you''ve selected that are
+ currently located within a selected zone.
+
+
+ Choose which notification(s) this should apply to:
+
+ '
+ default: []
+ selector:
+ select:
+ multiple: true
+ options:
+ - label: Apply to Start Notify
+ value: zone_start
+ - label: Apply to End Notify
+ value: zone_end
+ - label: Apply to Watchdog
+ value: zone_watchdog
+ custom_value: false
+ sort: false
+ notify_zone:
+ name: Device Tracker - Zone
+ description: 'Select the zone to use for location-based notifications. When
+ any of the options above are enabled (Start Notify, End Notify, or Watchdog),
+ notifications will be sent **only** to the devices you''ve selected in
+ each section that are currently in this zone.
+
+ '
+ default: []
+ selector:
+ entity:
+ filter:
+ - domain:
+ - zone
+ multiple: false
+ reorder: false
+ custom_actions_settings:
+ name: Custom Actions
+ icon: mdi:code-tags
+ collapsed: true
+ input:
+ include_custom_actions:
+ name: Use the Custom Action Options (Optional)
+ description: 'Customize your automation with any action you desire, whether
+ it''s for the start, watchdog, or end of a cycle. It is commonly used
+ for playing announcements on The Voice (HA), Google, Alexa, etc. Additionally,
+ it can be utilized for other notification services or any other actions
+ you would like to perform.
+
+ '
+ default: []
+ selector:
+ select:
+ options:
+ - label: Enable Custom Actions - Start
+ value: enable_start_custom_actions
+ - label: Enable Custom Actions - Watchdog
+ value: enable_watchdog_custom_actions
+ - label: Enable Custom Actions - End
+ value: enable_end_custom_actions
+ multiple: true
+ custom_value: false
+ sort: false
+ start_custom_actions:
+ name: Custom Actions - Start
+ description: 'Enter the actions you would like to run at the start.
+
+ '
+ default: []
+ selector:
+ action: {}
+ watchdog_custom_actions:
+ name: Custom Actions - Watchdog
+ description: 'Enter the actions you would like to run when the watchdog
+ is triggered.
+
+ '
+ default: []
+ selector:
+ action: {}
+ end_custom_actions:
+ name: Custom Actions - End
+ description: 'Enter the actions you would like to run at the end.
+
+ '
+ default: []
+ selector:
+ action: {}
+ global_conditions_settings:
+ name: Global Conditions
+ icon: mdi:earth
+ collapsed: true
+ input:
+ global_conditions:
+ name: Global Conditions
+ description: 'Enter any global conditions you would like to apply to the
+ automation.
+
+ '
+ default: []
+ selector:
+ condition: {}
+ source_url: https://gist.github.com/Blackshome/42586b567d243d432887cadf54e18906
+mode: single
+max_exceeded: silent
+variables:
+ power_sensor: !input power_sensor
+ start_appliance_power: !input start_appliance_power
+ start_time_delay: !input start_time_delay
+ end_appliance_power: !input end_appliance_power
+ end_time_delay: !input end_time_delay
+ end_repeat_count: !input end_repeat_count
+ include_start_notify: !input include_start_notify
+ start_notify_device: !input start_notify_device
+ start_title: !input start_title
+ start_message: !input start_message
+ start_notify_tag: !input start_notify_tag
+ start_notify_interruption_level: !input start_notify_interruption_level
+ start_notify_sound: !input start_notify_sound
+ start_notify_data: !input start_notify_data
+ start_notify_channel: !input start_notify_channel
+ start_notify_icon: !input start_notify_icon
+ start_notify_icon_colour: !input start_notify_icon_colour
+ running_dead_zone: !input running_dead_zone
+ include_end_notify: !input include_end_notify
+ end_notify_device: !input end_notify_device
+ end_message_title: !input end_message_title
+ end_message: !input end_message
+ end_notify_tag: !input end_notify_tag
+ end_notify_interruption_level: !input end_notify_interruption_level
+ end_notify_sound: !input end_notify_sound
+ end_notify_data: !input end_notify_data
+ end_notify_channel: !input end_notify_channel
+ end_notify_icon: !input end_notify_icon
+ end_notify_icon_colour: !input end_notify_icon_colour
+ end_reminder_notification: !input end_reminder_notification
+ end_reminder_notification_entity: !input end_reminder_notification_entity
+ end_reminder_notification_message: !input end_reminder_notification_message
+ end_reminder_notification_time_delay: !input end_reminder_notification_time_delay
+ end_reminder_notification_max_count: !input end_reminder_notification_max_count
+ end_attended_notification_message: !input end_attended_notification_message
+ include_run_status: !input include_run_status
+ run_status_entity: !input run_status_entity
+ run_status_start: !input run_status_start
+ run_status_watchdog: !input run_status_watchdog
+ run_status_end: !input run_status_end
+ run_status_end_reminder: !input run_status_end_reminder
+ run_status_end_attended: !input run_status_end_attended
+ include_time: !input include_time
+ after_time: !input after_time
+ before_time: !input before_time
+ weekday_options: !input weekday_options
+ include_power_tracking: !input include_power_tracking
+ power_consumption_sensor: !input power_consumption_sensor
+ end_message_kwh: !input end_message_kwh
+ end_message_cost: !input end_message_cost
+ cost_per_kwh: !input cost_per_kwh
+ start_power_consumption: !input start_power_consumption
+ end_power_consumption: !input end_power_consumption
+ start_time: '{{ now().timestamp() }}'
+ include_runtime_tracking: !input include_runtime_tracking
+ runtime_tracking_helper: !input runtime_tracking_helper
+ runtime_tracking_end_message: !input runtime_tracking_end_message
+ include_duration_tracking: !input include_duration_tracking
+ end_message_duration_tracking: !input end_message_duration_tracking
+ include_cycle_counter: !input include_cycle_counter
+ cycle_counter_helper: !input cycle_counter_helper
+ cycle_counter_end_message: !input cycle_counter_end_message
+ include_service_reminder: !input include_service_reminder
+ service_reminder_counter_helper: !input service_reminder_counter_helper
+ service_reminder_cycles: !input service_reminder_cycles
+ service_reminder_end_message: !input service_reminder_end_message
+ include_time_service_reminder: !input include_time_service_reminder
+ service_reminder_time_helper: !input service_reminder_time_helper
+ service_reminder_time_threshold: !input service_reminder_time_threshold
+ service_reminder_time_end_message: !input service_reminder_time_end_message
+ include_watchdog: !input include_watchdog
+ watchdog_timeframe: !input watchdog_timeframe
+ watchdog_notify_device: !input watchdog_notify_device
+ watchdog_title: !input watchdog_title
+ watchdog_message: !input watchdog_message
+ watchdog_notify_tag: !input watchdog_notify_tag
+ watchdog_notify_interruption_level: !input watchdog_notify_interruption_level
+ watchdog_notify_sound: !input watchdog_notify_sound
+ watchdog_notify_data: !input watchdog_notify_data
+ watchdog_notify_channel: !input watchdog_notify_channel
+ watchdog_notify_icon: !input watchdog_notify_icon
+ watchdog_notify_icon_colour: !input watchdog_notify_icon_colour
+ include_device_tracker: !input include_device_tracker
+ notify_zone: !input notify_zone
+ include_custom_actions: !input include_custom_actions
+ start_custom_actions: !input start_custom_actions
+ watchdog_custom_actions: !input watchdog_custom_actions
+ end_custom_actions: !input end_custom_actions
+ global_conditions: !input global_conditions
+ start_message_data: "{% set message = namespace(data={}) %} {% set push = namespace(data={})
+ %} {% if start_notify_interruption_level in ['active', 'critical', 'time-sensitive',
+ 'passive'] %}\n {% set push.data = dict(push.data, **{ 'interruption-level':
+ start_notify_interruption_level }) %}\n{% endif %} {% if start_notify_sound !=
+ [] %}\n {% set push.data = dict(push.data, **{ 'sound': start_notify_sound })
+ %}\n{% endif %} {% if push.data %}\n {% set message.data = dict(message.data,
+ **{ 'push': push.data }) %}\n{% endif %} {% if 'high_priority' in start_notify_data
+ %}\n {% set message.data = dict(message.data, **{ 'ttl': 0, 'priority': 'high'
+ }) %}\n{% endif %} {% if 'channel' in start_notify_data %}\n {% set message.data
+ = dict(message.data, **{ 'channel': start_notify_channel }) %}\n{% endif %} {%
+ if 'sticky' in start_notify_data %}\n {% set message.data = dict(message.data,
+ **{ 'sticky': \"true\" }) %}\n{% endif %} {% if 'icon' in start_notify_data %}\n
+ \ {% set message.data = dict(message.data, **{ 'notification_icon': start_notify_icon
+ }) %}\n {% if start_notify_icon_colour | length == 3 %}\n {% set icon_colour
+ = '#%02x%02x%02x' | format(start_notify_icon_colour[0], start_notify_icon_colour[1],
+ start_notify_icon_colour[2]) %}\n {% set message.data = dict(message.data,
+ **{ 'color': icon_colour }) %}\n {% endif %}\n{% endif %} {% if start_notify_tag
+ != [] %}\n {% set message.data = dict(message.data, **{ 'tag': start_notify_tag
+ }) %}\n{% endif %} {{ message.data }}"
+ end_message_data: "{% set message = namespace(data={}) %} {% set push = namespace(data={})
+ %} {% if end_notify_interruption_level in ['active', 'critical', 'time-sensitive',
+ 'passive'] %}\n {% set push.data = dict(push.data, **{ 'interruption-level':
+ end_notify_interruption_level }) %}\n{% endif %} {% if end_notify_sound != []
+ %}\n {% set push.data = dict(push.data, **{ 'sound': end_notify_sound }) %}\n{%
+ endif %} {% if push.data %}\n {% set message.data = dict(message.data, **{ 'push':
+ push.data }) %}\n{% endif %} {% if 'high_priority' in end_notify_data %}\n {%
+ set message.data = dict(message.data, **{ 'ttl': 0, 'priority': 'high' }) %}\n{%
+ endif %} {% if 'channel' in end_notify_data %}\n {% set message.data = dict(message.data,
+ **{ 'channel': end_notify_channel }) %}\n{% endif %} {% if 'sticky' in end_notify_data
+ %}\n {% set message.data = dict(message.data, **{ 'sticky': \"true\" }) %}\n{%
+ endif %} {% if 'icon' in end_notify_data %}\n {% set message.data = dict(message.data,
+ **{ 'notification_icon': end_notify_icon }) %}\n {% if end_notify_icon_colour
+ | length == 3 %}\n {% set icon_colour = '#%02x%02x%02x' | format(end_notify_icon_colour[0],
+ end_notify_icon_colour[1], end_notify_icon_colour[2]) %}\n {% set message.data
+ = dict(message.data, **{ 'color': icon_colour }) %}\n {% endif %}\n{% endif %}
+ {% if end_notify_tag != [] %}\n {% set message.data = dict(message.data, **{
+ 'tag': end_notify_tag }) %}\n{% endif %} {{ message.data }}"
+ watchdog_message_data: "{% set message = namespace(data={}) %} {% set push = namespace(data={})
+ %} {% if watchdog_notify_interruption_level in ['active', 'critical', 'time-sensitive',
+ 'passive'] %}\n {% set push.data = dict(push.data, **{ 'interruption-level':
+ watchdog_notify_interruption_level }) %}\n{% endif %} {% if watchdog_notify_sound
+ != [] %}\n {% set push.data = dict(push.data, **{ 'sound': watchdog_notify_sound
+ }) %}\n{% endif %} {% if push.data %}\n {% set message.data = dict(message.data,
+ **{ 'push': push.data }) %}\n{% endif %} {% if 'high_priority' in watchdog_notify_data
+ %}\n {% set message.data = dict(message.data, **{ 'ttl': 0, 'priority': 'high'
+ }) %}\n{% endif %} {% if 'channel' in watchdog_notify_data %}\n {% set message.data
+ = dict(message.data, **{ 'channel': watchdog_notify_channel }) %}\n{% endif %}
+ {% if 'sticky' in watchdog_notify_data %}\n {% set message.data = dict(message.data,
+ **{ 'sticky': \"true\" }) %}\n{% endif %} {% if 'icon' in watchdog_notify_data
+ %}\n {% set message.data = dict(message.data, **{ 'notification_icon': watchdog_notify_icon
+ }) %}\n {% if watchdog_notify_icon_colour | length == 3 %}\n {% set icon_colour
+ = '#%02x%02x%02x' | format(watchdog_notify_icon_colour[0], watchdog_notify_icon_colour[1],
+ watchdog_notify_icon_colour[2]) %}\n {% set message.data = dict(message.data,
+ **{ 'color': icon_colour }) %}\n {% endif %}\n{% endif %} {% if watchdog_notify_tag
+ != [] %}\n {% set message.data = dict(message.data, **{ 'tag': watchdog_notify_tag
+ }) %}\n{% endif %} {{ message.data }}"
+ watchdog_duration: '{% set dead_zone_seconds = running_dead_zone * 60 %} {% set
+ hours = watchdog_timeframe.hours | default(0) %} {% set minutes = watchdog_timeframe.minutes
+ | default(0) %} {% set seconds = watchdog_timeframe.seconds | default(0) %} {%
+ set watchdog_seconds = (hours * 3600) + (minutes * 60) + seconds %} {% set duration_total_in_seconds
+ = watchdog_seconds - dead_zone_seconds %} {% set duration_hours = duration_total_in_seconds
+ // 3600 %} {% set duration_minutes = (duration_total_in_seconds % 3600) // 60
+ %} {% set duration_seconds = duration_total_in_seconds % 60 %} {{ ''%02d:%02d:%02d''
+ | format(duration_hours, duration_minutes, duration_seconds) }}'
+triggers:
+- trigger: numeric_state
+ id: t0
+ entity_id: !input power_sensor
+ above: !input start_appliance_power
+ below: '24000'
+ for:
+ minutes: !input start_time_delay
+conditions:
+- condition: and
+ conditions: !input global_conditions
+actions:
+- choose:
+ - alias: Check if power tracking is enabled
+ conditions:
+ - condition: template
+ value_template: '{{ include_power_tracking != ''disable_power_tracking'' }}'
+ sequence:
+ - action: input_number.set_value
+ target:
+ entity_id: !input start_power_consumption
+ data_template:
+ value: '{{ states(power_consumption_sensor) | float }}'
+- choose:
+ - alias: Check if start of notification is enabled
+ conditions:
+ - condition: template
+ value_template: '{{ include_start_notify == ''enable_start_notify_options''
+ }}'
+ - alias: Check if notify time restriction is enabled before sending the message
+ condition: or
+ conditions:
+ - condition: template
+ value_template: '{{ include_time == ''time_disabled'' }}'
+ - condition: and
+ conditions:
+ - condition: time
+ after: !input after_time
+ before: !input before_time
+ weekday: !input weekday_options
+ - condition: template
+ value_template: '{{ include_time == ''time_enabled'' }}'
+ sequence:
+ - variables:
+ zone_filtered_start_devices: "{% if 'zone_start' in include_device_tracker
+ %}\n {% set zone_short_name = notify_zone.split('.')[-1] | lower | trim
+ %}\n {% set ns = namespace(devices=[]) %}\n {% for device in start_notify_device
+ %}\n {% set device_status = namespace(in_zone=false) %}\n {% set trackers
+ = device_entities(device) | select('search', '^device_tracker\\\\.') | list
+ %}\n {% for tracker in trackers %}\n {% if (states(tracker) | string).lower().strip()
+ == zone_short_name %}\n {% set device_status.in_zone = true %}\n
+ \ {% endif %}\n {% endfor %}\n {% if device_status.in_zone %}\n
+ \ {% set ns.devices = ns.devices + [device] %}\n {% endif %}\n {%
+ endfor %}\n {{ ns.devices }}\n{% else %}\n {{ start_notify_device }}\n{%
+ endif %}\n"
+ - alias: Send a notification to each device
+ repeat:
+ for_each: '{{ zone_filtered_start_devices }}'
+ sequence:
+ - action: notify.mobile_app_{{ device_attr(repeat.item, 'name') | slugify
+ }}
+ data:
+ title: !input start_title
+ message: !input start_message
+ data: '{{ start_message_data }}'
+ continue_on_error: true
+- choose:
+ - alias: Perform the run status action
+ conditions:
+ - condition: template
+ value_template: '{{ include_run_status == ''run_status_enabled'' }}'
+ - condition: template
+ value_template: '{{ run_status_start != [] }}'
+ sequence:
+ - action: input_select.select_option
+ target:
+ entity_id: !input run_status_entity
+ data:
+ option: !input run_status_start
+- choose:
+ - alias: Perform the custom start action
+ conditions:
+ - condition: template
+ value_template: '{{ ''enable_start_custom_actions'' in include_custom_actions
+ }}'
+ sequence: !input start_custom_actions
+- alias: Wait the number of minutes set in running dead zone
+ delay:
+ minutes: !input running_dead_zone
+- choose:
+ - conditions:
+ - condition: template
+ value_template: '{{ include_watchdog == ''enable_watchdog'' }}'
+ sequence:
+ - alias: Wait until appliance has finished
+ repeat:
+ count: !input end_repeat_count
+ sequence:
+ - wait_for_trigger:
+ - trigger: numeric_state
+ entity_id: !input power_sensor
+ below: !input end_appliance_power
+ for:
+ minutes: !input end_time_delay
+ timeout: '{{ watchdog_duration }}'
+ - choose:
+ - conditions:
+ - condition: template
+ value_template: '{{ wait.trigger is none }}'
+ sequence:
+ - choose:
+ - alias: Check if notify time restriction is enabled before sending the
+ message
+ conditions:
+ - condition: or
+ conditions:
+ - condition: template
+ value_template: '{{ include_time == ''time_disabled'' }}'
+ - condition: and
+ conditions:
+ - condition: time
+ after: !input after_time
+ before: !input before_time
+ weekday: !input weekday_options
+ - condition: template
+ value_template: '{{ include_time == ''time_enabled'' }}'
+ sequence:
+ - variables:
+ zone_filtered_watchdog_devices: "{% if 'zone_watchdog' in include_device_tracker
+ %}\n {% set zone_short_name = notify_zone.split('.')[-1] | lower
+ | trim %}\n {% set ns = namespace(devices=[]) %}\n {% for device
+ in watchdog_notify_device %}\n {% set device_status = namespace(in_zone=false)
+ %}\n {% set trackers = device_entities(device) | select('search',
+ '^device_tracker\\\\.') | list %}\n {% for tracker in trackers
+ %}\n {% if (states(tracker) | string).lower().strip() == zone_short_name
+ %}\n {% set device_status.in_zone = true %}\n {% endif
+ %}\n {% endfor %}\n {% if device_status.in_zone %}\n {%
+ set ns.devices = ns.devices + [device] %}\n {% endif %}\n {%
+ endfor %}\n {{ ns.devices }}\n{% else %}\n {{ watchdog_notify_device
+ }}\n{% endif %}\n"
+ - alias: Send a notification to each device
+ repeat:
+ for_each: '{{ zone_filtered_watchdog_devices }}'
+ sequence:
+ - action: notify.mobile_app_{{ device_attr(repeat.item, 'name') |
+ slugify }}
+ data:
+ title: !input watchdog_title
+ message: '{{watchdog_message}}'
+ data: '{{ watchdog_message_data }}'
+ continue_on_error: true
+ - choose:
+ - alias: Perform the run status action
+ conditions:
+ - condition: template
+ value_template: '{{ include_run_status == ''run_status_enabled'' }}'
+ - condition: template
+ value_template: '{{ run_status_watchdog != [] }}'
+ sequence:
+ - action: input_select.select_option
+ target:
+ entity_id: !input run_status_entity
+ data:
+ option: !input run_status_watchdog
+ - choose:
+ - alias: Perform the custom watchdoog action
+ conditions:
+ - condition: template
+ value_template: '{{ ''enable_watchdog_custom_actions'' in include_custom_actions
+ }}'
+ sequence: !input watchdog_custom_actions
+ - stop: Stop the automation
+ - conditions:
+ - condition: template
+ value_template: '{{ include_watchdog == ''disable_watchdog'' }}'
+ sequence:
+ - alias: Wait until appliance has finished
+ repeat:
+ count: !input end_repeat_count
+ sequence:
+ - wait_for_trigger:
+ - trigger: numeric_state
+ entity_id: !input power_sensor
+ below: !input end_appliance_power
+ for:
+ minutes: !input end_time_delay
+- choose:
+ - alias: Check if power tracking is enabled
+ conditions:
+ - condition: template
+ value_template: '{{ include_power_tracking != ''disable_power_tracking'' }}'
+ sequence:
+ - action: input_number.set_value
+ target:
+ entity_id: !input end_power_consumption
+ data_template:
+ value: '{{ states(power_consumption_sensor) | float }}'
+- choose:
+ - alias: Check if Runtime tracking is enabled
+ conditions:
+ - condition: template
+ value_template: '{{ include_runtime_tracking != ''disable_runtime_tracking''
+ }}'
+ sequence:
+ - variables:
+ current_run_time_total: "{% set crtt = states(runtime_tracking_helper) %}
+ {% if ':' in crtt %}\n {% set time = crtt.split(':') %}\n {{ (time[0]|int
+ * 3600) + (time[1]|int * 60) + (time[2]|int) }}\n{% else %}\n 0\n{% endif
+ %}\n"
+ run_time: '{{ (now().timestamp() - start_time) | int }}'
+ new_run_time_seconds: '{{ current_run_time_total + run_time }}'
+ hh: '{{ (new_run_time_seconds // 3600) | int }}'
+ mm: '{{ ((new_run_time_seconds % 3600) // 60) | int }}'
+ ss: '{{ (new_run_time_seconds % 60) | int }}'
+ total_run_time: '{{ ''%02d:%02d:%02d'' | format(hh, mm, ss) }}'
+ - action: input_text.set_value
+ target:
+ entity_id: !input runtime_tracking_helper
+ data:
+ value: '{{ total_run_time }}'
+- choose:
+ - alias: Check if time-based service reminder is enabled
+ conditions:
+ - condition: template
+ value_template: '{{ include_time_service_reminder != ''disable_time_service_reminder''
+ }}'
+ sequence:
+ - variables:
+ current_service_time_total: "{% set cstt = states(service_reminder_time_helper)
+ %} {% if ':' in cstt %}\n {% set time = cstt.split(':') %}\n {{ (time[0]|int
+ * 3600) + (time[1]|int * 60) + (time[2]|int) }}\n{% else %}\n 0\n{% endif
+ %}\n"
+ run_time: '{{ (now().timestamp() - start_time) | int }}'
+ new_service_time_seconds: '{{ current_service_time_total + run_time }}'
+ hh: '{{ (new_service_time_seconds // 3600) | int }}'
+ mm: '{{ ((new_service_time_seconds % 3600) // 60) | int }}'
+ ss: '{{ (new_service_time_seconds % 60) | int }}'
+ total_service_time: '{{ ''%02d:%02d:%02d'' | format(hh, mm, ss) }}'
+ - action: input_text.set_value
+ target:
+ entity_id: !input service_reminder_time_helper
+ data:
+ value: '{{ total_service_time }}'
+- choose:
+ - alias: Check if cycle count is enabled
+ conditions:
+ - condition: template
+ value_template: '{{ include_cycle_counter != ''disable_cycle_counter'' }}'
+ sequence:
+ - action: counter.increment
+ target:
+ entity_id: !input cycle_counter_helper
+- choose:
+ - alias: Check if service cycle count is enabled
+ conditions:
+ - condition: template
+ value_template: '{{ include_service_reminder != ''disable_service_reminder''
+ }}'
+ sequence:
+ - action: counter.increment
+ target:
+ entity_id: !input service_reminder_counter_helper
+- choose:
+ - alias: Perform the run status action
+ conditions:
+ - condition: template
+ value_template: '{{ include_run_status == ''run_status_enabled'' }}'
+ - condition: template
+ value_template: '{{ run_status_end != [] }}'
+ sequence:
+ - action: input_select.select_option
+ target:
+ entity_id: !input run_status_entity
+ data:
+ option: !input run_status_end
+- alias: Parallel actions for custom end actions & end notification
+ parallel:
+ - sequence:
+ - choose:
+ - alias: Perform the custom end action
+ conditions:
+ - condition: template
+ value_template: '{{ ''enable_end_custom_actions'' in include_custom_actions
+ }}'
+ sequence: !input end_custom_actions
+ - sequence:
+ - choose:
+ - alias: Check if end of notification is enabled
+ conditions:
+ - condition: template
+ value_template: '{{ include_end_notify == ''enable_end_notify_options''
+ }}'
+ - alias: Check if notify time restriction is enabled before sending the message
+ condition: or
+ conditions:
+ - condition: template
+ value_template: '{{ include_time == ''time_disabled'' }}'
+ - condition: and
+ conditions:
+ - condition: time
+ after: !input after_time
+ before: !input before_time
+ weekday: !input weekday_options
+ - condition: template
+ value_template: '{{ include_time == ''time_enabled'' }}'
+ sequence:
+ - variables:
+ zone_filtered_end_devices: "{% if 'zone_end' in include_device_tracker
+ %}\n {% set zone_short_name = notify_zone.split('.')[-1] | lower |
+ trim %}\n {% set ns = namespace(devices=[]) %}\n {% for device in
+ end_notify_device %}\n {% set device_status = namespace(in_zone=false)
+ %}\n {% set trackers = device_entities(device) | select('search',
+ '^device_tracker\\\\.') | list %}\n {% for tracker in trackers %}\n
+ \ {% if (states(tracker) | string).lower().strip() == zone_short_name
+ %}\n {% set device_status.in_zone = true %}\n {% endif %}\n
+ \ {% endfor %}\n {% if device_status.in_zone %}\n {% set ns.devices
+ = ns.devices + [device] %}\n {% endif %}\n {% endfor %}\n {{ ns.devices
+ }}\n{% else %}\n {{ end_notify_device }}\n{% endif %}\n"
+ message: "{% set message = namespace(text='') %} {% if include_service_reminder
+ == 'enable_service_reminder_and_notify' %}\n {% set service_count =
+ states(service_reminder_counter_helper) | int(0) %}\n {% set service_threshold
+ = service_reminder_cycles | int %}\n {% if service_count >= service_threshold
+ %}\n {% set message.text = message.text + service_reminder_end_message
+ + '\\n' %}\n {% endif %}\n{% endif %} {% if include_time_service_reminder
+ == 'enable_time_service_reminder_and_notify' %}\n {% set service_reminder_helper_value
+ = states(service_reminder_time_helper) %}\n {% if ':' in service_reminder_helper_value
+ %}\n {% set time = service_reminder_helper_value.split(':') %}\n
+ \ {% set service_reminder_helper_seconds = (time[0] | int * 3600)
+ + (time[1] | int * 60) + (time[2] | int) %}\n {% else %}\n {% set
+ service_reminder_helper_seconds = 0 %}\n {% endif %}\n {% set service_reminder_time_threshold_seconds
+ =\n (service_reminder_time_threshold.hours | int * 3600) +\n (service_reminder_time_threshold.minutes
+ | int * 60) +\n (service_reminder_time_threshold.seconds | int)\n
+ \ %}\n {% if service_reminder_helper_seconds >= service_reminder_time_threshold_seconds
+ %}\n {% set message.text = message.text + service_reminder_time_end_message
+ + '\\n' %}\n {% endif %}\n{% endif %} {% set message.text = message.text
+ + end_message %} {% if include_power_tracking == 'enable_power_tracking'
+ %}\n {% set kwh = (states(end_power_consumption) | float - states(start_power_consumption)
+ | float) %}\n {% set message.text = message.text + '\\n' + end_message_kwh
+ + ' ' + (kwh | round(2) | string) + ' kWh' %}\n{% endif %} {% if include_power_tracking
+ == 'enable_power_tracking_and_cost' %}\n {% set kwh = (states(end_power_consumption)
+ | float - states(start_power_consumption) | float) %}\n {% set cost
+ = kwh * (states(cost_per_kwh) | float) %}\n {% set message.text = message.text
+ + '\\n' + end_message_kwh + ' ' + (kwh | round(2) | string) + ' kWh'
+ %}\n {% set message.text = message.text + '\\n' + end_message_cost
+ + (cost | round(2) | string) %}\n{% endif %} {% if include_runtime_tracking
+ == 'enable_runtime_tracking_and_notify' %}\n {% set run_time = states(runtime_tracking_helper)
+ %}\n {% set message.text = message.text + '\\n' + runtime_tracking_end_message
+ + ' ' + run_time %}\n{% endif %} {% if include_duration_tracking ==
+ 'enable_duration_tracking' %}\n {% set end_time = now().timestamp()
+ %}\n {% set duration = (end_time - start_time) | int %}\n {% set hours
+ = (duration // 3600) %}\n {% set minutes = ((duration % 3600) // 60)
+ %}\n {% set seconds = (duration % 60) %}\n {% set message.text = message.text
+ + '\\n' + end_message_duration_tracking + ' ' + '%02d:%02d:%02d' | format(hours,
+ minutes, seconds) %}\n{% endif %} {% if include_cycle_counter == 'enable_cycle_counter_and_notify'
+ %}\n {% set cycle_count = states(cycle_counter_helper) | int(0) %}\n
+ \ {% set message.text = message.text + '\\n' + cycle_counter_end_message
+ + ' ' + (cycle_count | string) %}\n{% endif %} {{ message.text }}"
+ - alias: Send a notification to each device
+ repeat:
+ for_each: '{{ zone_filtered_end_devices }}'
+ sequence:
+ - action: notify.mobile_app_{{ device_attr(repeat.item, 'name') | slugify
+ }}
+ data:
+ title: !input end_message_title
+ message: '{{message}}
+
+ '
+ data: '{{ end_message_data }}'
+ continue_on_error: true
+ - choose:
+ - alias: Check if end reminder notification is enabled
+ conditions:
+ - condition: template
+ value_template: '{{ end_reminder_notification != ''disable_reminder_notification''
+ }}'
+ sequence:
+ - variables:
+ reminder_message: "{% set message = namespace(text='') %} {% if include_service_reminder
+ == 'enable_service_reminder_and_notify' %}\n {% set service_count
+ = states(service_reminder_counter_helper) | int(0) %}\n {% set
+ service_threshold = service_reminder_cycles | int %}\n {% if service_count
+ >= service_threshold %}\n {% set message.text = message.text
+ + service_reminder_end_message + '\\n' %}\n {% endif %}\n{% endif
+ %} {% if include_time_service_reminder == 'enable_time_service_reminder_and_notify'
+ %}\n {% set service_reminder_helper_value = states(service_reminder_time_helper)
+ %}\n {% if ':' in service_reminder_helper_value %}\n {% set
+ time = service_reminder_helper_value.split(':') %}\n {% set service_reminder_helper_seconds
+ = (time[0] | int * 3600) + (time[1] | int * 60) + (time[2] | int)
+ %}\n {% else %}\n {% set service_reminder_helper_seconds = 0
+ %}\n {% endif %}\n {% set service_reminder_time_threshold_seconds
+ =\n (service_reminder_time_threshold.hours | int * 3600) +\n
+ \ (service_reminder_time_threshold.minutes | int * 60) +\n (service_reminder_time_threshold.seconds
+ | int)\n %}\n {% if service_reminder_helper_seconds >= service_reminder_time_threshold_seconds
+ %}\n {% set message.text = message.text + service_reminder_time_end_message
+ + '\\n' %}\n {% endif %}\n{% endif %} {% set message.text = message.text
+ + end_reminder_notification_message %} {{ message.text }}"
+ - wait_for_trigger:
+ - trigger: state
+ entity_id: !input end_reminder_notification_entity
+ to: 'on'
+ timeout:
+ minutes: !input end_reminder_notification_time_delay
+ - repeat:
+ while:
+ - condition: template
+ value_template: '{{ (is_state(end_reminder_notification_entity,
+ ''off'')) and (repeat.index <= end_reminder_notification_max_count)
+ }}'
+ sequence:
+ - variables:
+ zone_filtered_end_devices: "{% if 'zone_end' in include_device_tracker
+ %}\n {% set zone_short_name = notify_zone.split('.')[-1] |
+ lower | trim %}\n {% set ns = namespace(devices=[]) %}\n {%
+ for device in end_notify_device %}\n {% set device_status
+ = namespace(in_zone=false) %}\n {% set trackers = device_entities(device)
+ | select('search', '^device_tracker\\\\.') | list %}\n {%
+ for tracker in trackers %}\n {% if (states(tracker) | string).lower().strip()
+ == zone_short_name %}\n {% set device_status.in_zone
+ = true %}\n {% endif %}\n {% endfor %}\n {% if device_status.in_zone
+ %}\n {% set ns.devices = ns.devices + [device] %}\n {%
+ endif %}\n {% endfor %}\n {{ ns.devices }}\n{% else %}\n {{
+ end_notify_device }}\n{% endif %}\n"
+ - repeat:
+ for_each: '{{ zone_filtered_end_devices }}'
+ sequence:
+ - action: notify.mobile_app_{{ device_attr(repeat.item, 'name')
+ | slugify }}
+ data:
+ title: !input end_message_title
+ message: '{{reminder_message}}
+
+ '
+ data: '{{ end_message_data }}'
+ continue_on_error: true
+ - choose:
+ - alias: Check reminder notification entity is OFF and max count
+ is less before waiting
+ conditions:
+ - condition: template
+ value_template: '{{ (is_state(end_reminder_notification_entity,
+ ''off'')) and (repeat.index <= end_reminder_notification_max_count
+ - 1) }}'
+ sequence:
+ - wait_for_trigger:
+ - trigger: state
+ entity_id: !input end_reminder_notification_entity
+ to: 'on'
+ timeout:
+ minutes: !input end_reminder_notification_time_delay
+ - choose:
+ - alias: Perform the run status action
+ conditions:
+ - condition: template
+ value_template: '{{ include_run_status == ''run_status_enabled''
+ }}'
+ - condition: template
+ value_template: '{{ run_status_end_reminder != [] }}'
+ - condition: state
+ entity_id: !input end_reminder_notification_entity
+ state: 'off'
+ sequence:
+ - action: input_select.select_option
+ target:
+ entity_id: !input run_status_entity
+ data:
+ option: !input run_status_end_reminder
+ - choose:
+ - alias: Entity is ON, check run status options
+ conditions:
+ - condition: state
+ entity_id: !input end_reminder_notification_entity
+ state: 'on'
+ sequence:
+ - choose:
+ - alias: Perform the run status action
+ conditions:
+ - condition: template
+ value_template: '{{ include_run_status == ''run_status_enabled''
+ }}'
+ - condition: template
+ value_template: '{{ run_status_end_attended != [] }}'
+ sequence:
+ - action: input_select.select_option
+ target:
+ entity_id: !input run_status_entity
+ data:
+ option: !input run_status_end_attended
+ - alias: Entity is OFF, wait for it to turn ON
+ conditions:
+ - condition: state
+ entity_id: !input end_reminder_notification_entity
+ state: 'off'
+ sequence:
+ - wait_for_trigger:
+ - trigger: state
+ entity_id: !input end_reminder_notification_entity
+ to: 'on'
+ - choose:
+ - alias: Perform the run status action
+ conditions:
+ - condition: template
+ value_template: '{{ include_run_status == ''run_status_enabled''
+ }}'
+ - condition: template
+ value_template: '{{ run_status_end_attended != [] }}'
+ sequence:
+ - action: input_select.select_option
+ target:
+ entity_id: !input run_status_entity
+ data:
+ option: !input run_status_end_attended
+ - choose:
+ - alias: Check if end reminder notification + notify is enabled
+ conditions:
+ - condition: template
+ value_template: '{{ end_reminder_notification == ''enable_reminder_notification_notify''
+ }}'
+ sequence:
+ - variables:
+ zone_filtered_end_devices: "{% if 'zone_end' in include_device_tracker
+ %}\n {% set zone_short_name = notify_zone.split('.')[-1] |
+ lower | trim %}\n {% set ns = namespace(devices=[]) %}\n {%
+ for device in end_notify_device %}\n {% set device_status
+ = namespace(in_zone=false) %}\n {% set trackers = device_entities(device)
+ | select('search', '^device_tracker\\\\.') | list %}\n {%
+ for tracker in trackers %}\n {% if (states(tracker) | string).lower().strip()
+ == zone_short_name %}\n {% set device_status.in_zone
+ = true %}\n {% endif %}\n {% endfor %}\n {% if device_status.in_zone
+ %}\n {% set ns.devices = ns.devices + [device] %}\n {%
+ endif %}\n {% endfor %}\n {{ ns.devices }}\n{% else %}\n {{
+ end_notify_device }}\n{% endif %}\n"
+ attended_message: "{% set message = namespace(text='') %} {% if
+ include_service_reminder == 'enable_service_reminder_and_notify'
+ %}\n {% set service_count = states(service_reminder_counter_helper)
+ | int(0) %}\n {% set service_threshold = service_reminder_cycles
+ | int %}\n {% if service_count >= service_threshold %}\n {%
+ set message.text = message.text + service_reminder_end_message
+ + '\\n' %}\n {% endif %}\n{% endif %} {% if include_time_service_reminder
+ == 'enable_time_service_reminder_and_notify' %}\n {% set service_reminder_helper_value
+ = states(service_reminder_time_helper) %}\n {% if ':' in service_reminder_helper_value
+ %}\n {% set time = service_reminder_helper_value.split(':')
+ %}\n {% set service_reminder_helper_seconds = (time[0] |
+ int * 3600) + (time[1] | int * 60) + (time[2] | int) %}\n {%
+ else %}\n {% set service_reminder_helper_seconds = 0 %}\n
+ \ {% endif %}\n {% set service_reminder_time_threshold_seconds
+ =\n (service_reminder_time_threshold.hours | int * 3600)
+ +\n (service_reminder_time_threshold.minutes | int * 60)
+ +\n (service_reminder_time_threshold.seconds | int)\n %}\n
+ \ {% if service_reminder_helper_seconds >= service_reminder_time_threshold_seconds
+ %}\n {% set message.text = message.text + service_reminder_time_end_message
+ + '\\n' %}\n {% endif %}\n{% endif %} {% set message.text =
+ message.text + end_attended_notification_message %} {{ message.text
+ }}"
+ - alias: Send a notification to each device to notify it has been
+ attended to
+ repeat:
+ for_each: '{{ zone_filtered_end_devices }}'
+ sequence:
+ - action: notify.mobile_app_{{ device_attr(repeat.item, 'name')
+ | slugify }}
+ data:
+ title: !input end_message_title
+ message: '{{attended_message}}
+
+ '
+ data: '{{ end_message_data }}'
+ continue_on_error: true
+ - choose:
+ - alias: Check if end reminder notification + clear is enabled
+ conditions:
+ - condition: template
+ value_template: '{{ end_reminder_notification == ''enable_reminder_notification_clear''
+ }}'
+ sequence:
+ - alias: Send a notification to each device to clear notification
+ repeat:
+ for_each: !input end_notify_device
+ sequence:
+ - action: notify.mobile_app_{{ device_attr(repeat.item, 'name')
+ | slugify }}
+ data:
+ message: clear_notification
+ data:
+ tag: !input end_notify_tag
+ continue_on_error: true
diff --git a/blueprints/automation/Blackshome/bathroom-humidity-exhaust-fan.yaml b/blueprints/automation/Blackshome/bathroom-humidity-exhaust-fan.yaml
new file mode 100644
index 0000000..0d63bcc
--- /dev/null
+++ b/blueprints/automation/Blackshome/bathroom-humidity-exhaust-fan.yaml
@@ -0,0 +1,4359 @@
+blueprint:
+ name: Bathroom Humidity Exhaust Fan
+ description: "# \U0001F6BF Bathroom Humidity Exhaust Fan\n**Version: 2.6**\n\nStep
+ into the future of freshness - customize it your way and experience the convenience
+ of automated humidity control! \U0001F33F\U0001F6BF\n\n**If you like my blueprints,
+ and would like to show your support or just say thank you?** [Click Here](https://www.paypal.com/donate/?hosted_button_id=WAZS3QSDTPGA8)
+ \U0001F642\n\n The Automation Process: \U0001F448
\n\n
+ \ - **Auto Trigger:**\n - When the derivative percentage rises above a set
+ value, the fan turns ON\n - When the derivative percentage falls below a
+ set value, the automation waits for a time delay and then turns the fan OFF.\n
+ \ - Optional - Set a maximum humidity percentage to trigger the fan ON. This
+ is useful when having back-to-back showers.\n \n **Note:** You must
+ have a humidity sensor in the bathroom and set up a 'Derivative Helper' for this
+ automation to work.\n\n - **Manual Trigger Option:**\n - This feature allows
+ you to manually trigger the automation.\n\n - **Multi-Speed Fan Control Option:**\n
+ \ - You have the option to use fan speeds to control the staging of your fan.\n
+ \ - You can choose to stage your fan in your preferred configuration, such
+ as High/Off, High/Low, High/Low/Off, High/Med/Low, etc.\n\n - **Winter Mode Option:**\n
+ \ - You have the option to use 'Winter Mode.' This mode allows for different
+ settings to be applied, accommodating the typically higher humidity levels experienced
+ in winter compared to summer.\n\n - **Light Control Option:**\n - Use the
+ \"Light Control\" option to turn ON lights, adjusting brightness levels, colour
+ temperatures, and transition times.\n - This feature is commonly utilized
+ with LED lights in a shower niche.\n - For expanded lighting options, consider
+ integrating my \U0001F4A1[Sensor Light](https://community.home-assistant.io/t/481048)
+ blueprint, which utilizes the automation link feature.\n\n - **Manual Control
+ Option:**\n - Use a manual fan switch to toggle the fan ON/OFF.\n -
+ Opt to use the auto-OFF option for timer-like functionality.\n - This is
+ particularly useful for removing unwanted fumes from deodorant, hairspray, or
+ the toilet.\n\n - **Automation Link Option:**\n - This feature simplifies
+ the process of automatically disabling your other automations by providing an
+ automation linking mechanism.\n\n - **Bypass Functionality Option:**\n -
+ This allows you to bypass the automation, offering manual control and additional
+ customization capabilities.\n\n - **Safety Measures:**\n - Set a maximum
+ runtime safeguard for the fan to prevent continuous operation.\n - Benefit
+ from built-in safeguards to ensure smooth operation and reliability, even if Home
+ Assistant restarts.\n\n - **Blueprint Add-On Integration:**\n - Sensor Light:
+ Control your lights in the bathroom. [Click Here](https://community.home-assistant.io/t/509992/240)
+ to learn more.\n - Toilet Exhaust Fan: Integrate with a toilet in the bathroom.
+ [Click Here](https://community.home-assistant.io/t/509992/387) to learn more.\n \n\nNeed
+ help?\n- FAQ: [Click Here](https://community.home-assistant.io/t/509992/2?u=blacky)\n-
+ Community Support Including Updates: [Click Here](https://community.home-assistant.io/t/509992)\n\nRequired
+ = *\n"
+ domain: automation
+ input:
+ trigger_settings:
+ name: Auto Triggers *
+ icon: mdi:cog-outline
+ description: ⚠️ To use an auto trigger, you need to configure a humidity derivative
+ sensor. *
+ collapsed: true
+ input:
+ trigger:
+ name: Trigger - Humidity Derivative Sensor *
+ description: 'Select your humidity derivative sensor. This is the main key
+ trigger for this automation. To ensure the auto trigger functions correctly,
+ you need to create a derivative helper and select it here.
+
+
+ For more information on how to set up a humidity derivative sensor [Click
+ Here](https://community.home-assistant.io/t/509992/3)'
+ default: []
+ selector:
+ entity:
+ filter:
+ - domain:
+ - sensor
+ multiple: false
+ reorder: false
+ bathroom_humidity_sensor:
+ name: Bathroom Humidity Sensor (Optional)
+ description: You will have the option to use 'The Maximum Humidity Option'
+ below in 'Default - Summer Mode' and in 'Winter Mode'. This will be the
+ reference humidity sensor used in both options if selected. However, you
+ will still need to create a humidity derivative sensor and enter it above
+ for this blueprint to work
+ default: []
+ selector:
+ entity:
+ filter:
+ - domain:
+ - sensor
+ multiple: false
+ reorder: false
+ manual_settings:
+ name: Manual Trigger
+ icon: mdi:gesture-tap-button
+ collapsed: true
+ input:
+ include_manual_trigger:
+ name: Use The Manual Trigger Option (Optional)
+ description: 'This feature allows you to manually trigger the automation.
+ It replaces the humidity derivative settings in either ''Default - Summer
+ Mode'' or ''Winter Mode,'' configurations. Turning it ON initiates the
+ automation process, and turning it OFF starts the time delay. Note that
+ auto triggers can and will override the manual trigger option if triggered.
+
+
+ If you choose option 1, the ''Safeguard - Maximum Run Time'' will be active
+ in ''Default - Summer Mode'' or ''Winter Mode'' and will turn OFF the
+ manual trigger if you forget to do so. Alternatively, option 2 allows
+ you to customize different auto OFF time delays for both ''Default - Summer
+ Mode'' and ''Winter Mode'' settings. If using the winter mode, ensure
+ it is enabled below in the ''Winter Mode'' section.
+
+
+ This feature can operate with or without a humidity sensor, which is particularly
+ useful if the humidity sensor malfunctions, allowing time for repairs
+ and reducing stress levels. Additionally, it can initiate the fan to turn
+ ON before a shower, aiding in humidity removal before the auto triggers
+ take over. It is designed with good spouse approval in mind.
+
+
+ For more information on this feature and its capabilities, [click here.](https://community.home-assistant.io/t/509992/483?u=blacky)'
+ default: disable_manual_trigger
+ selector:
+ select:
+ options:
+ - label: 1 - Enable manual trigger
+ value: enable_manual_trigger
+ - label: 2 - Enable manual trigger + auto off time delay
+ value: enable_manual_trigger_time_delay
+ - label: Disable manual trigger
+ value: disable_manual_trigger
+ multiple: false
+ custom_value: false
+ sort: false
+ manual_trigger:
+ name: Manual Trigger
+ description: 'Enter an entity that will manually trigger the automation.
+
+
+ **NOTE** - The Manual Trigger entity cannot be your actual Fan Switch
+ entity; it must be a completely different entity. Alternatively, if you
+ prefer to use the same Fan Switch entity for the Manual Trigger function,
+ you can create a trigger-based template binary sensor to ensure the automation
+ functions correctly.
+
+
+ To learn how to create a trigger-based template binary sensor [Click here](https://community.home-assistant.io/t/509992/496).'
+ default: []
+ selector:
+ entity:
+ multiple: true
+ filter:
+ - domain:
+ - switch
+ - binary_sensor
+ - input_boolean
+ reorder: false
+ manual_trigger_default_time_delay:
+ name: Default - Auto Off Time Delay
+ description: If you've selected option 2 in the 'Manual Trigger Option'
+ above, please set the auto OFF time delay. This will determine the time
+ delay used in 'Default - Summer Mode' to automatically turn OFF the manual
+ trigger after it has been turned ON.
+ default: 15
+ selector:
+ number:
+ min: 0.0
+ max: 40.0
+ step: 0.5
+ unit_of_measurement: minutes
+ mode: slider
+ manual_trigger_winter_time_delay:
+ name: Winter - Auto Off Time Delay
+ description: If you've selected option 2 in the 'Manual Trigger Option'
+ above, please set the auto OFF time delay. This will determine the time
+ delay used in 'Winter Mode' to automatically turn OFF the manual trigger
+ after it has been turned ON.
+ default: 15
+ selector:
+ number:
+ min: 0.0
+ max: 40.0
+ step: 0.5
+ unit_of_measurement: minutes
+ mode: slider
+ fan_settings:
+ name: Fan *
+ icon: mdi:fan
+ collapsed: true
+ input:
+ fan_switch:
+ name: Fan Switch *
+ description: 'Select the fan you would like to turn ON. Fans, switches,
+ scripts & input boolean are allowed. If you''d like to turn on lights,
+ please refer to the ''Lights'' section below.
+
+
+ **NOTE** - Only entities should be used, as devices will result in an
+ error log.
+
+
+ **Script** - If you are only selecting a script, it is recommended to
+ create a dummy toggle helper and then select it here to ensure the automation
+ functions correctly.
+
+
+ For more information if you are only selecting a script [Click Here](https://community.home-assistant.io/t/509992/239?u=blacky).'
+ default: []
+ selector:
+ target:
+ entity:
+ - domain:
+ - fan
+ - switch
+ - script
+ - input_boolean
+ fan_speed_low:
+ name: Fan Speed - Low Speed Switch (Optional)
+ description: 'You will have the option to use ''The Fan Speed Options''
+ below in ''Default - Summer Mode'' and ''Winter Mode''. This reference
+ entity will turn the fan ON to low speed in both options if selected.
+ Please DO NOT select the same entities that are chosen above in ''Fan
+ Switch'' or below in ''Fan Speed - Switch Off'', as the automation will
+ not work.
+
+
+ **NOTE** - If you are only selecting a script, it is recommended to create
+ a dummy toggle helper and then select it here to ensure the automation
+ functions correctly.
+
+
+ For more information if you are only selecting a script [Click Here](https://community.home-assistant.io/t/509992/239?u=blacky).'
+ default: []
+ selector:
+ entity:
+ multiple: true
+ filter:
+ - domain:
+ - fan
+ - switch
+ - script
+ - input_boolean
+ reorder: false
+ fan_speed_off:
+ name: Fan Speed - Switch Off (Optional)
+ description: 'You will have the option to use ''The Fan Speed Options''
+ below in ''Default - Summer Mode'' and ''Winter Mode''. This reference
+ entity will turn the fan OFF in both options if selected. Please DO NOT
+ select the same entities that are chosen above in ''Fan Switch'' or ''Fan
+ Speed - Low Speed Switch'', as the automation will not work.
+
+
+ **Note** - If you''d like the fan to run continuously at a low speed 24/7,
+ you can select that speed here.'
+ default: []
+ selector:
+ entity:
+ multiple: true
+ filter:
+ - domain:
+ - fan
+ - switch
+ - script
+ - input_boolean
+ reorder: false
+ default_settings:
+ name: Default - Summer Mode
+ icon: mdi:weather-sunny
+ collapsed: true
+ input:
+ rising_humidity:
+ name: Rising Humidity Derivative
+ description: Specify the percentage increase that the derivative sensor
+ must exceed to indicate a shower has started, thus activating the fan.
+ The derivative sensor percentage must transition from below to above this
+ setpoint to trigger the automation.
+ default: 1
+ selector:
+ number:
+ min: 0.0
+ max: 5.0
+ step: 0.1
+ unit_of_measurement: '%'
+ mode: slider
+ falling_humidity:
+ name: Falling Humidity Derivative
+ description: Specify the percentage decrease that the derivative sensor
+ must fall below to indicate the shower has completed, thus activating
+ the time delay. The derivative sensor percentage must transition from
+ above to below this setpoint to trigger the automation.
+ default: -1
+ selector:
+ number:
+ min: -5.0
+ max: 0.0
+ step: 0.1
+ unit_of_measurement: '%'
+ mode: slider
+ time_delay:
+ name: Time Delay
+ description: After the falling humidity derivative percentage has been achieved
+ or the set safeguard time has elapsed, this time delay will determine
+ how long the fan will run before turning OFF. Alternatively, if you've
+ selected option 1 in the 'Fan Speed Options' below, the fan will transition
+ to low speed after this time delay.
+ default: 10
+ selector:
+ number:
+ min: 0.0
+ max: 20.0
+ step: 0.5
+ unit_of_measurement: minutes
+ mode: slider
+ time_out:
+ name: Safeguard - Maximum Run Time
+ description: Specify the maximum run time for the safeguard. If the automation
+ turns the fan ON and the falling humidity derivative condition fails to
+ execute within this time frame, the safeguard will bypass the falling
+ humidity derivative condition and proceed to the time delay.
+ default: 20
+ selector:
+ number:
+ min: 5.0
+ max: 60.0
+ step: 0.5
+ unit_of_measurement: minutes
+ mode: slider
+ include_max_humidity:
+ name: Use The Maximum Humidity Option (Optional)
+ description: 'Sometimes after a shower, humidity levels may take longer
+ to return to normal. As a result, the humidity may not rise significantly
+ when taking another shower before returning to its normal level, thus
+ not triggering the automation. Enabling this option allows the fan to
+ be turned ON when the humidity rises above the set value, regardless of
+ the rate of increase in rising humidity derivative percentage.
+
+
+ **NOTE** - Please ensure that you input your ''Bathroom Humidity Sensor''
+ above in the ''Triggers'' section for this option to work correctly.'
+ default: maximum_humidity_disabled
+ selector:
+ select:
+ options:
+ - label: Enable the maximum humidity option
+ value: maximum_humidity_enabled
+ - label: Disable the maximum humidity option
+ value: maximum_humidity_disabled
+ multiple: false
+ custom_value: false
+ sort: false
+ max_humidity:
+ name: Maximum Humidity
+ description: If you have enabled the maximum humidity option above, please
+ set the maximum humidity percentage. When using this option, it's recommended
+ to set this value as high as possible to minimize false triggers.
+ default: 100
+ selector:
+ number:
+ min: 80.0
+ max: 100.0
+ step: 0.5
+ unit_of_measurement: '%'
+ mode: slider
+ include_fan_speed:
+ name: Use The Fan Speed Options (Optional)
+ description: 'If you''re using a multi-speed fan, you can choose one of
+ the following options to determine how the fan will be staged when turning
+ OFF.
+
+
+ **NOTE** - Please ensure that you input your ''Fan Speeds'' entities above
+ in the ''Fan'' section for this option to work properly.'
+ default: fan_speed_disabled
+ selector:
+ select:
+ options:
+ - label: 1 - Enable the fan speed - Switch to low speed then turn off
+ option
+ value: fan_low_speed_enabled
+ - label: 2 - Enable the fan speed - Turn off option
+ value: fan_speed_off_enabled
+ - label: Disable the fan speed options
+ value: fan_speed_disabled
+ multiple: false
+ custom_value: false
+ sort: false
+ time_delay_low_speed:
+ name: Fan Speed - Low Speed Time Delay
+ description: If you've selected option 1 in the 'Fan Speed Options' above,
+ please set the low speed time delay. This additional delay allows the
+ fan to run at low speed before turning OFF.
+ default: 5
+ selector:
+ number:
+ min: 0.0
+ max: 20.0
+ step: 0.5
+ unit_of_measurement: minutes
+ mode: slider
+ winter_settings:
+ name: Winter Mode
+ icon: mdi:snowflake
+ collapsed: true
+ input:
+ include_winter_mode:
+ name: Use The Winter Mode Option (Optional)
+ description: Enabling this option will automatically apply a 'Winter Mode'
+ to the months you select below, allowing you to apply different settings
+ for the colder months of the year.
+ default: winter_mode_disabled
+ selector:
+ select:
+ options:
+ - label: Enable winter mode option
+ value: winter_mode_enabled
+ - label: Disable winter mode option
+ value: winter_mode_disabled
+ multiple: false
+ custom_value: false
+ sort: false
+ month_winter_mode:
+ name: Months For Winter Mode
+ description: Choose the months during which you want the winter mode settings
+ to be applied.
+ default: []
+ selector:
+ select:
+ multiple: true
+ mode: list
+ options:
+ - label: January
+ value: '1'
+ - label: February
+ value: '2'
+ - label: March
+ value: '3'
+ - label: April
+ value: '4'
+ - label: May
+ value: '5'
+ - label: June
+ value: '6'
+ - label: July
+ value: '7'
+ - label: August
+ value: '8'
+ - label: September
+ value: '9'
+ - label: October
+ value: '10'
+ - label: November
+ value: '11'
+ - label: December
+ value: '12'
+ custom_value: false
+ sort: false
+ winter_rising_humidity:
+ name: Winter Rising Humidity Derivative
+ description: Specify the percentage increase that the derivative sensor
+ must exceed to indicate a shower has started, thus activating the fan.
+ The derivative sensor percentage must transition from below to above this
+ setpoint to trigger the automation.
+ default: 1
+ selector:
+ number:
+ min: 0.0
+ max: 5.0
+ step: 0.1
+ unit_of_measurement: '%'
+ mode: slider
+ winter_falling_humidity:
+ name: Winter Falling Humidity Derivative
+ description: Specify the percentage decrease that the derivative sensor
+ must fall below to indicate the shower has completed, thus activating
+ the time delay. The derivative sensor percentage must transition from
+ above to below this setpoint to trigger the automation.
+ default: -1
+ selector:
+ number:
+ min: -5.0
+ max: 0.0
+ step: 0.1
+ unit_of_measurement: '%'
+ mode: slider
+ winter_time_delay:
+ name: Winter Time Delay
+ description: After the falling humidity derivative percentage has been achieved
+ or the set safeguard time has elapsed, this time delay will determine
+ how long the fan will run before turning OFF. Alternatively, if you've
+ selected option 1 in the 'Fan Speed Options' below, the fan will transition
+ to low speed after this time delay.
+ default: 10
+ selector:
+ number:
+ min: 0.0
+ max: 20.0
+ step: 0.5
+ unit_of_measurement: minutes
+ mode: slider
+ winter_time_out:
+ name: Winter Safeguard - Maximum Run Time
+ description: Specify the maximum run time for the safeguard. If the automation
+ turns the fan ON and the falling humidity derivative condition fails to
+ execute within this time frame, the safeguard will bypass the falling
+ humidity derivative condition and proceed to the time delay.
+ default: 20
+ selector:
+ number:
+ min: 5.0
+ max: 60.0
+ step: 0.5
+ unit_of_measurement: minutes
+ mode: slider
+ winter_include_max_humidity:
+ name: Winter - Use The Maximum Humidity Option (Optional)
+ description: 'In colder months, after a shower, humidity levels may take
+ longer to return to normal. As a result, the humidity may not rise significantly
+ when taking another shower before returning to its normal level, thus
+ not triggering the automation. Enabling this option allows the fan to
+ be turned ON when the humidity rises above the set value, regardless of
+ the rate of increase in rising humidity derivative percentage.
+
+
+ **NOTE** - Please ensure that you input your ''Bathroom Humidity Sensor''
+ above in the ''Triggers'' section for this option to work correctly.'
+ default: maximum_humidity_disabled
+ selector:
+ select:
+ options:
+ - label: Enable the maximum humidity option
+ value: maximum_humidity_enabled
+ - label: Disable the maximum humidity option
+ value: maximum_humidity_disabled
+ multiple: false
+ custom_value: false
+ sort: false
+ winter_max_humidity:
+ name: Winter Maximum Humidity
+ description: If you have enabled the maximum humidity option above, please
+ set the maximum humidity percentage. When using this option, it's recommended
+ to set this value as high as possible to minimize false triggers.
+ default: 100
+ selector:
+ number:
+ min: 80.0
+ max: 100.0
+ step: 0.5
+ unit_of_measurement: '%'
+ mode: slider
+ winter_include_fan_speed:
+ name: Winter - Use The Fan Speed Options (Optional)
+ description: 'If you''re using a multi-speed fan, you can choose one of
+ the following options to determine how the fan will be staged when turning
+ OFF.
+
+
+ **NOTE** - Please ensure that you input your ''Fan Speeds'' entities above
+ in the ''Fan'' section for this option to work properly.'
+ default: fan_speed_disabled
+ selector:
+ select:
+ options:
+ - label: 1 - Enable the fan speed - Switch to low speed then turn off
+ option
+ value: fan_low_speed_enabled
+ - label: 2 - Enable the fan speed - Turn off option
+ value: fan_speed_off_enabled
+ - label: Disable the fan speed options
+ value: fan_speed_disabled
+ multiple: false
+ custom_value: false
+ sort: false
+ winter_time_delay_low_speed:
+ name: Winter Fan Speed - Low Speed Time Delay
+ description: If you've selected option 1 in the 'Fan Speed Options' above,
+ please set the low speed time delay. This additional delay allows the
+ fan to run at low speed before turning OFF.
+ default: 5
+ selector:
+ number:
+ min: 0.0
+ max: 20.0
+ step: 0.5
+ unit_of_measurement: minutes
+ mode: slider
+ lights_settings:
+ name: Lights
+ icon: mdi:lightbulb-on-outline
+ collapsed: true
+ input:
+ include_lights:
+ name: Use The Lights Options (Optional)
+ description: "This option is handy for activating various lights while showering,
+ especially if you have LED lights in a shower niche. If you're looking
+ to enhance your bathroom lighting further, check out my \U0001F4A1[Sensor
+ Light](https://community.home-assistant.io/t/481048) blueprint. When used
+ together, the automation link ensures the lights stay on while showering.
+ You can find the automation link section below."
+ default: lights_disabled
+ selector:
+ select:
+ options:
+ - label: Enable the lights options
+ value: lights_enabled
+ - label: Disable the lights options
+ value: lights_disabled
+ multiple: false
+ custom_value: false
+ sort: false
+ light_switch:
+ name: Lights
+ description: 'Select the lights that will be turned on by the trigger sensor.
+
+
+ **NOTE** - You can only use entities. Areas, devices and labels are not
+ supported.'
+ default: {}
+ selector:
+ target:
+ entity:
+ - domain:
+ - light
+ light_time_delay:
+ name: Lights - Time Delay
+ description: After the falling humidity derivative percentage has been achieved
+ or the set safeguard time has elapsed, this time delay will determine
+ how long the lights will remain ON before turning OFF.
+ default: 10
+ selector:
+ number:
+ min: 0.0
+ max: 40.0
+ step: 0.5
+ unit_of_measurement: minutes
+ mode: slider
+ include_light_control:
+ name: Use The Light Control Options (Optional)
+ description: Select any option you would like to use. It will only control
+ a 'light' entity that supports each option you select. The settings are
+ below for each option.
+ default: []
+ selector:
+ select:
+ multiple: true
+ options:
+ - label: Use brightness
+ value: use_brightness
+ - label: Use colour temperature
+ value: use_colour_temperature
+ - label: Use transition
+ value: use_transition
+ custom_value: false
+ sort: false
+ light_brightness:
+ name: Brightness
+ description: The brightness setting for the lights when they are turned
+ ON.
+ default: 100
+ selector:
+ number:
+ min: 1.0
+ max: 100.0
+ mode: slider
+ step: 1.0
+ unit_of_measurement: '%'
+ light_colour_temperature:
+ name: Colour Temperature
+ description: The colour temperature setting for the lights when they are
+ turned ON.
+ default: 5000
+ selector:
+ number:
+ min: 2000.0
+ max: 8000.0
+ mode: slider
+ step: 100.0
+ unit_of_measurement: kelvin
+ light_transition_on:
+ name: Transition - ON
+ description: The transition setting for the lights when they are turned
+ ON.
+ default: 1
+ selector:
+ number:
+ min: 0.0
+ max: 5.0
+ mode: slider
+ step: 0.5
+ unit_of_measurement: seconds
+ light_transition_off:
+ name: Transition - OFF
+ description: The transition setting for the lights when they are turned
+ OFF.
+ default: 1
+ selector:
+ number:
+ min: 0.0
+ max: 30.0
+ mode: slider
+ step: 1.0
+ unit_of_measurement: seconds
+ manual_switch_settings:
+ name: Manual Fan Switch
+ icon: mdi:toggle-switch-outline
+ collapsed: true
+ input:
+ include_manual_fan_switch:
+ name: Use The Manual Fan Switch Option (Optional)
+ description: This feature allows you to manually switch the fan ON and OFF
+ while still enabling the automation to take control when needed. It's
+ particularly useful for removing unwanted fumes from deodorant, hairspray,
+ or the toilet. Option 2's auto-off time delay ensures you never forget
+ to turn the fan OFF.
+ default: disable_manual_fan_switch
+ selector:
+ select:
+ options:
+ - label: 1 - Enable manual fan switch option
+ value: enable_manual_fan_switch
+ - label: 2 - Enable manual fan switch + auto off option
+ value: enable_manual_fan_switch_auto_off
+ - label: Disable manual fan switch
+ value: disable_manual_fan_switch
+ multiple: false
+ custom_value: false
+ sort: false
+ manual_fan_switch:
+ name: Manual Fan Switch
+ description: 'Enter a switch that will toggle the fan ON/OFF. When the switch
+ turns the fan OFF, it will also deactivate the automation link and any
+ lights, if the option is enabled.
+
+
+ **NOTE** - The Manual Fan Switch cannot be your actual Fan Switch entity;
+ it must be a completely different entity. Alternatively, if you prefer
+ to use the same Fan Switch entity for the Manual Fan Switch function,
+ you can create a trigger-based template binary sensor to ensure the automation
+ functions correctly.
+
+
+ To learn how to create a trigger-based template binary sensor [Click here](https://community.home-assistant.io/t/509992/496).'
+ default: []
+ selector:
+ entity:
+ multiple: true
+ filter:
+ - domain:
+ - switch
+ - binary_sensor
+ - input_boolean
+ reorder: false
+ manual_fan_switch_time_delay:
+ name: Manual Fan Switch Auto OFF - Time Delay
+ description: If you've enabled option 2 above, please set the auto OFF time
+ delay.
+ default: 10
+ selector:
+ number:
+ min: 0.0
+ max: 40.0
+ step: 0.5
+ unit_of_measurement: minutes
+ mode: slider
+ automation_link_settings:
+ name: Automation Link
+ icon: mdi:link-variant
+ collapsed: true
+ input:
+ include_automation_link:
+ name: Use The Automation Link Option (Optional)
+ description: "This feature simplifies the process of automatically disabling
+ your other automations by providing an automation linking mechanism. It's
+ particularly useful if you're using my \U0001F4A1[Sensor Light](https://community.home-assistant.io/t/481048)
+ blueprint in your bathroom and want to disable it when this automation
+ is ON. This ensures that your bathroom lights stay ON even when your motion
+ sensor is unable to detect motion while you're in the shower.\n\nFor more
+ information on how to set up the Automation Link Option [Click Here](https://community.home-assistant.io/t/509992/240?u=blacky)"
+ default: disable_automation_link
+ selector:
+ select:
+ options:
+ - label: Enable automation link
+ value: enable_automation_link
+ - label: Disable automation link
+ value: disable_automation_link
+ multiple: false
+ custom_value: false
+ sort: false
+ automation_link:
+ name: Automation Link - Bypass Control
+ description: 'Please enter the bypass entity of the other automations you
+ would like to turn ON, thereby disabling it when this automation is ON.
+
+
+ **Note** -Your other automations must include a bypass switch that you
+ enter here.'
+ default: []
+ selector:
+ entity:
+ multiple: true
+ filter:
+ - domain:
+ - input_boolean
+ reorder: false
+ automation_link_time_delay:
+ name: Automation Link - Time Delay
+ description: After the falling humidity derivative percentage has been achieved
+ or the set safeguard time has elapsed, this time delay will determine
+ how long the automation link entities will remain ON before turning OFF.
+ default: 10
+ selector:
+ number:
+ min: 0.0
+ max: 40.0
+ step: 0.5
+ unit_of_measurement: minutes
+ mode: slider
+ bypass_settings:
+ name: Bypass
+ icon: mdi:cog-pause-outline
+ collapsed: true
+ input:
+ include_bypass:
+ name: Use The Trigger Sensor Bypass Option (Optional)
+ description: 'All the bypass options will allow manual control of your fan.
+ Each option determines what should happen when you turn the bypass ON.
+ Choose the action that you would like to activate.
+
+
+
+ **Note** - If the lights or automation link options are enabled, they
+ will be included in the action.'
+ default: bypass_disabled
+ selector:
+ select:
+ options:
+ - label: 1 - Enable the bypass - Turn the fan, lights & automation link
+ ON
+ value: bypass_enabled_turn_on
+ - label: 2 - Enable the bypass - Turn the fan, lights & automation link
+ OFF
+ value: bypass_enabled
+ - label: 3 - Enable the bypass - Keep the current fan, lights & automation
+ link state
+ value: bypass_enabled_stop
+ - label: Disable the bypass option
+ value: bypass_disabled
+ multiple: false
+ custom_value: false
+ sort: false
+ by_pass:
+ name: Bypass Switch
+ description: 'Select a switch that will bypass the humidity derivative sensor
+ and enable manual control of your fan.
+
+
+ **Note** - Ensure that the chosen entity is not included in the ''Fan''
+ selection, as it will cause the automation to malfunction.'
+ default: []
+ selector:
+ entity:
+ multiple: false
+ reorder: false
+ bypass_options:
+ name: Bypass - Extra Option
+ description: Please indicate whether you would like to use this option.
+ default: []
+ selector:
+ select:
+ multiple: true
+ options:
+ - label: When you turn the bypass off - Turn the fan, lights & automation
+ link OFF and do not run the automation.
+ value: bypass_turn_fan_off
+ custom_value: false
+ sort: false
+ include_bypass_auto_off:
+ name: Use The Bypass Auto OFF Option (Optional)
+ description: Select this option if you want the bypass to automatically
+ turn OFF after a set time delay. It can also function as a timer to turn
+ the fan ON and then OFF if you've chosen option 1 'Enable the bypass -
+ Turn the fan, lights & automation link ON' above.
+ default: bypass_auto_off_disabled
+ selector:
+ select:
+ options:
+ - label: Enable the bypass auto off option
+ value: bypass_auto_off_enabled
+ - label: Disable the bypass auto off option
+ value: bypass_auto_off_disabled
+ multiple: false
+ custom_value: false
+ sort: false
+ bypass_auto_off_delay:
+ name: Bypass Auto OFF - Time Delay
+ description: Please set the auto OFF time delay for the bypass.
+ default: 60
+ selector:
+ number:
+ min: 1.0
+ max: 240.0
+ step: 1.0
+ unit_of_measurement: minutes
+ mode: slider
+ source_url: https://gist.github.com/Blackshome/8e09a8213b834f1be4ab49ba880abed8
+mode: restart
+max_exceeded: silent
+variables:
+ trigger: !input trigger
+ bathroom_humidity_sensor: !input bathroom_humidity_sensor
+ include_manual_trigger: !input include_manual_trigger
+ manual_trigger: !input manual_trigger
+ manual_trigger_default_time_delay: !input manual_trigger_default_time_delay
+ manual_trigger_winter_time_delay: !input manual_trigger_winter_time_delay
+ fan_switch: !input fan_switch
+ fan_speed_low: !input fan_speed_low
+ fan_speed_off: !input fan_speed_off
+ rising_humidity: !input rising_humidity
+ falling_humidity: !input falling_humidity
+ time_delay: !input time_delay
+ time_out: !input time_out
+ include_max_humidity: !input include_max_humidity
+ max_humidity: !input max_humidity
+ include_fan_speed: !input include_fan_speed
+ time_delay_low_speed: !input time_delay_low_speed
+ include_winter_mode: !input include_winter_mode
+ month_winter_mode: !input month_winter_mode
+ winter_rising_humidity: !input winter_rising_humidity
+ winter_falling_humidity: !input winter_falling_humidity
+ winter_time_delay: !input winter_time_delay
+ winter_time_out: !input winter_time_out
+ winter_include_max_humidity: !input winter_include_max_humidity
+ winter_max_humidity: !input winter_max_humidity
+ winter_include_fan_speed: !input winter_include_fan_speed
+ winter_time_delay_low_speed: !input winter_time_delay_low_speed
+ include_lights: !input include_lights
+ light_switch: !input light_switch
+ light_time_delay: !input light_time_delay
+ include_light_control: !input include_light_control
+ light_brightness: !input light_brightness
+ brightness_value: '{{ iif (''use_brightness'' in include_light_control , light_brightness,
+ ) }}'
+ light_colour_temperature: !input light_colour_temperature
+ temperature_value: '{{ iif (''use_colour_temperature'' in include_light_control
+ , light_colour_temperature, [] ) }}'
+ light_transition_on: !input light_transition_on
+ light_transition_off: !input light_transition_off
+ transition_on_value: '{{ iif (''use_transition'' in include_light_control, light_transition_on,
+ ) }}'
+ transition_off_value: '{{ iif (''use_transition'' in include_light_control, light_transition_off,
+ ) }}'
+ include_manual_fan_switch: !input include_manual_fan_switch
+ manual_fan_switch: !input manual_fan_switch
+ manual_fan_switch_time_delay: !input manual_fan_switch_time_delay
+ include_automation_link: !input include_automation_link
+ automation_link: !input automation_link
+ automation_link_time_delay: !input automation_link_time_delay
+ include_bypass: !input include_bypass
+ by_pass: !input by_pass
+ bypass_options: !input bypass_options
+ include_bypass_auto_off: !input include_bypass_auto_off
+ bypass_auto_off_delay: !input bypass_auto_off_delay
+ light_entities: "{% set a = light_switch and light_switch.entity_id %} {% if a
+ %}\n {{ expand(a) | selectattr('domain', 'eq', 'light') | map(attribute='entity_id')
+ | list }}\n{% else %}\n []\n{% endif %}"
+triggers:
+- trigger: numeric_state
+ id: t0
+ entity_id: !input trigger
+ above: !input winter_rising_humidity
+ below: '100'
+- trigger: numeric_state
+ id: t1
+ entity_id: !input bathroom_humidity_sensor
+ above: !input winter_max_humidity
+ below: '100'
+- trigger: homeassistant
+ id: t2
+ event: start
+- trigger: numeric_state
+ id: t3
+ entity_id: !input trigger
+ above: !input rising_humidity
+ below: '100'
+- trigger: numeric_state
+ id: t4
+ entity_id: !input bathroom_humidity_sensor
+ above: !input max_humidity
+ below: '100'
+- trigger: state
+ id: t5
+ entity_id: !input by_pass
+ from: 'off'
+ to: 'on'
+- trigger: state
+ id: t6
+ entity_id: !input by_pass
+ from: 'on'
+ to: 'off'
+- trigger: state
+ id: t7
+ entity_id: !input manual_fan_switch
+ from: 'off'
+ to: 'on'
+- trigger: state
+ id: t8
+ entity_id: !input manual_trigger
+ from: 'off'
+ to: 'on'
+condition:
+- condition: or
+ conditions:
+ - condition: and
+ conditions:
+ - '{{ include_winter_mode == ''winter_mode_enabled'' }}'
+ - condition: template
+ value_template: '{{ (now().month | string in month_winter_mode ) }}'
+ - condition: trigger
+ id: t0
+ - condition: and
+ conditions:
+ - '{{ (include_winter_mode == ''winter_mode_enabled'') and (winter_include_max_humidity
+ == ''maximum_humidity_enabled'') }}'
+ - condition: template
+ value_template: '{{ (now().month | string in month_winter_mode ) }}'
+ - condition: trigger
+ id: t1
+ - condition: and
+ conditions:
+ - '{{ (expand(fan_switch.entity_id) | selectattr(''state'', ''=='', ''on'') |
+ list | count > 0) or ((include_fan_speed == ''fan_low_speed_enabled'') and (expand(fan_speed_low)
+ | selectattr(''state'', ''=='', ''on'') | list | count > 0)) or ((winter_include_fan_speed
+ == ''fan_low_speed_enabled'') and (expand(fan_speed_low) | selectattr(''state'',
+ ''=='', ''on'') | list | count > 0)) or ((include_automation_link == ''enable_automation_link'')
+ and (expand(automation_link) | selectattr(''state'', ''=='', ''on'') | list
+ | count > 0)) }}'
+ - condition: trigger
+ id: t2
+ - condition: and
+ conditions:
+ - condition: trigger
+ id:
+ - t2
+ - '{{ ''winter_mode_disabled'' in include_winter_mode }}'
+ - condition: numeric_state
+ entity_id: !input trigger
+ above: !input rising_humidity
+ below: '100'
+ - condition: and
+ conditions:
+ - condition: trigger
+ id:
+ - t2
+ - '{{ ''winter_mode_enabled'' in include_winter_mode }}'
+ - condition: template
+ value_template: '{{ (now().month | string not in month_winter_mode ) }}'
+ - condition: numeric_state
+ entity_id: !input trigger
+ above: !input rising_humidity
+ below: '100'
+ - condition: and
+ conditions:
+ - condition: trigger
+ id:
+ - t2
+ - '{{ ''winter_mode_enabled'' in include_winter_mode }}'
+ - condition: template
+ value_template: '{{ (now().month | string in month_winter_mode ) }}'
+ - condition: numeric_state
+ entity_id: !input trigger
+ above: !input winter_rising_humidity
+ below: '100'
+ - condition: and
+ conditions:
+ - condition: trigger
+ id:
+ - t2
+ - '{{ ''winter_mode_disabled'' in include_winter_mode }}'
+ - '{{ ''maximum_humidity_enabled'' in include_max_humidity }}'
+ - condition: numeric_state
+ entity_id: !input bathroom_humidity_sensor
+ above: !input max_humidity
+ below: '100'
+ - condition: and
+ conditions:
+ - condition: trigger
+ id:
+ - t2
+ - '{{ ''winter_mode_enabled'' in include_winter_mode }}'
+ - '{{ ''maximum_humidity_enabled'' in include_max_humidity }}'
+ - condition: template
+ value_template: '{{ (now().month | string not in month_winter_mode ) }}'
+ - condition: numeric_state
+ entity_id: !input bathroom_humidity_sensor
+ above: !input max_humidity
+ below: '100'
+ - condition: and
+ conditions:
+ - condition: trigger
+ id:
+ - t2
+ - '{{ ''winter_mode_enabled'' in include_winter_mode }}'
+ - '{{ ''maximum_humidity_enabled'' in winter_include_max_humidity }}'
+ - condition: template
+ value_template: '{{ (now().month | string in month_winter_mode ) }}'
+ - condition: numeric_state
+ entity_id: !input bathroom_humidity_sensor
+ above: !input winter_max_humidity
+ below: '100'
+ - condition: and
+ conditions:
+ - condition: template
+ value_template: '{{ (include_winter_mode == ''winter_mode_disabled'') or ((include_winter_mode
+ == ''winter_mode_enabled'') and not (now().month | string in month_winter_mode
+ )) }}'
+ - condition: trigger
+ id: t3
+ - condition: and
+ conditions:
+ - condition: template
+ value_template: '{{ ((include_winter_mode == ''winter_mode_disabled'') and (include_max_humidity
+ == ''maximum_humidity_enabled'')) or ((include_winter_mode == ''winter_mode_enabled'')
+ and (include_max_humidity == ''maximum_humidity_enabled'') and not (now().month
+ | string in month_winter_mode )) }}'
+ - condition: trigger
+ id: t4
+ - condition: and
+ conditions:
+ - condition: trigger
+ id: t5
+ - '{{ (include_bypass == ''bypass_enabled_turn_on'') or (include_bypass == ''bypass_enabled'')
+ or (include_bypass == ''bypass_enabled_stop'') }}'
+ - condition: and
+ conditions:
+ - condition: trigger
+ id: t6
+ - '{{ (include_bypass != ''bypass_disabled'') }}'
+ - '{{ (include_bypass == ''bypass_enabled'') or (include_bypass == ''bypass_enabled_stop'')
+ or (include_bypass == ''bypass_enabled_turn_on'') }}'
+ - '{{ (expand(fan_switch.entity_id) | selectattr(''state'', ''=='', ''on'') |
+ list | count > 0 ) or ((include_fan_speed == ''fan_low_speed_enabled'') and
+ (expand(fan_speed_low) | selectattr(''state'', ''=='', ''on'') | list | count
+ > 0)) or ((winter_include_fan_speed == ''fan_low_speed_enabled'') and (expand(fan_speed_low)
+ | selectattr(''state'', ''=='', ''on'') | list | count > 0)) or ((include_lights
+ == ''lights_enabled'') and (expand(light_switch.entity_id) | selectattr(''state'',
+ ''=='', ''on'') | list | count > 0)) or ((include_automation_link == ''enable_automation_link'')
+ and (expand(automation_link) | selectattr(''state'', ''=='', ''on'') | list
+ | count > 0)) or ((include_manual_fan_switch == ''enable_manual_fan_switch'')
+ or (include_manual_fan_switch == ''enable_manual_fan_switch_auto_off'') and
+ (expand(manual_fan_switch) | selectattr(''state'', ''=='', ''on'') | list |
+ count > 0)) }}'
+ - condition: and
+ conditions:
+ - condition: trigger
+ id:
+ - t6
+ - '{{ (include_bypass != ''bypass_disabled'') }}'
+ - '{{ ''winter_mode_disabled'' in include_winter_mode }}'
+ - '{{ (expand(fan_switch.entity_id) | selectattr(''state'', ''=='', ''off'') |
+ list | count > 0 ) or ((include_fan_speed == ''fan_low_speed_enabled'') and
+ (expand(fan_speed_low) | selectattr(''state'', ''=='', ''off'') | list | count
+ > 0)) or ((include_lights == ''lights_enabled'') and (expand(light_switch.entity_id)
+ | selectattr(''state'', ''=='', ''off'') | list | count > 0)) or ((include_automation_link
+ == ''enable_automation_link'') and (expand(automation_link) | selectattr(''state'',
+ ''=='', ''on'') | list | count > 0))}}'
+ - condition: numeric_state
+ entity_id: !input trigger
+ above: !input rising_humidity
+ below: '100'
+ - condition: and
+ conditions:
+ - condition: trigger
+ id:
+ - t6
+ - '{{ (include_bypass != ''bypass_disabled'') }}'
+ - '{{ ''winter_mode_enabled'' in include_winter_mode }}'
+ - '{{ (expand(fan_switch.entity_id) | selectattr(''state'', ''=='', ''off'') |
+ list | count > 0 ) or ((include_fan_speed == ''fan_low_speed_enabled'') and
+ (expand(fan_speed_low) | selectattr(''state'', ''=='', ''off'') | list | count
+ > 0)) or ((include_lights == ''lights_enabled'') and (expand(light_switch.entity_id)
+ | selectattr(''state'', ''=='', ''off'') | list | count > 0)) or ((include_automation_link
+ == ''enable_automation_link'') and (expand(automation_link) | selectattr(''state'',
+ ''=='', ''on'') | list | count > 0)) }}'
+ - condition: template
+ value_template: '{{ (now().month | string not in month_winter_mode ) }}'
+ - condition: numeric_state
+ entity_id: !input trigger
+ above: !input rising_humidity
+ below: '100'
+ - condition: and
+ conditions:
+ - condition: trigger
+ id:
+ - t6
+ - '{{ (include_bypass != ''bypass_disabled'') }}'
+ - '{{ ''winter_mode_enabled'' in include_winter_mode }}'
+ - '{{ (expand(fan_switch.entity_id) | selectattr(''state'', ''=='', ''off'') |
+ list | count > 0 ) or ((winter_include_fan_speed == ''fan_low_speed_enabled'')
+ and (expand(fan_speed_low) | selectattr(''state'', ''=='', ''off'') | list |
+ count > 0)) or ((include_lights == ''lights_enabled'') and (expand(light_switch.entity_id)
+ | selectattr(''state'', ''=='', ''off'') | list | count > 0)) or ((include_automation_link
+ == ''enable_automation_link'') and (expand(automation_link) | selectattr(''state'',
+ ''=='', ''on'') | list | count > 0)) }}'
+ - condition: template
+ value_template: '{{ (now().month | string in month_winter_mode ) }}'
+ - condition: numeric_state
+ entity_id: !input trigger
+ above: !input winter_rising_humidity
+ below: '100'
+ - condition: and
+ conditions:
+ - condition: state
+ entity_id: !input manual_fan_switch
+ match: any
+ state: 'on'
+ - condition: trigger
+ id:
+ - t7
+ - '{{ (include_manual_fan_switch == ''enable_manual_fan_switch'') or (include_manual_fan_switch
+ == ''enable_manual_fan_switch_auto_off'') }}'
+ - condition: and
+ conditions:
+ - condition: state
+ entity_id: !input manual_trigger
+ match: any
+ state: 'on'
+ - condition: trigger
+ id:
+ - t8
+ - '{{ (include_manual_trigger == ''enable_manual_trigger'') or (include_manual_trigger
+ == ''enable_manual_trigger_time_delay'') }}'
+- condition: or
+ conditions:
+ - '{{ include_bypass == ''bypass_disabled'' }}'
+ - '{{ by_pass == [] }}'
+ - '{{ (include_bypass == ''bypass_enabled_turn_on'') and (states[by_pass].state
+ == ''off'') }}'
+ - '{{ (include_bypass == ''bypass_enabled'') and (states[by_pass].state == ''off'')
+ }}'
+ - '{{ (include_bypass == ''bypass_enabled_stop'') and (states[by_pass].state ==
+ ''off'') }}'
+ - '{{ (include_bypass_auto_off == ''bypass_auto_off_enabled'') and (states[by_pass].state
+ == ''off'') }}'
+ - '{{ (include_bypass_auto_off == ''bypass_auto_off_enabled'') and (states[by_pass].state
+ == ''on'') and (trigger.id == ''t2'') }}'
+ - condition: trigger
+ id: t5
+action:
+- choose:
+ - alias: For winter mode when enabled and within the set winter months
+ conditions:
+ - condition: or
+ conditions:
+ - condition: and
+ conditions:
+ - condition: trigger
+ id:
+ - t0
+ - t1
+ - condition: and
+ conditions:
+ - '{{ include_winter_mode == ''winter_mode_enabled'' }}'
+ - condition: template
+ value_template: '{{ (now().month | string in month_winter_mode ) }}'
+ - condition: trigger
+ id:
+ - t2
+ - t5
+ - t6
+ - t7
+ - t8
+ sequence:
+ - choose:
+ - alias: By-pass is turned on & check by-pass option - turn fan off
+ conditions:
+ - condition: trigger
+ id: t5
+ - condition: template
+ value_template: '{{ include_bypass == ''bypass_enabled'' }}'
+ sequence:
+ - choose:
+ - alias: Check if the manual trigger option is enabled and switch is on
+ conditions:
+ - '{{ (include_manual_trigger == ''enable_manual_trigger'') or (include_manual_trigger
+ == ''enable_manual_trigger_time_delay'') }}'
+ - '{{ expand(manual_trigger) | selectattr(''state'', ''=='', ''on'') |
+ list | count > 0 }}'
+ sequence:
+ - alias: Turn OFF manual trigger
+ action: homeassistant.turn_off
+ entity_id: !input manual_trigger
+ - choose:
+ - alias: Check if the manual fan switch option is enabled and switch is
+ on
+ conditions:
+ - '{{ (include_manual_fan_switch == ''enable_manual_fan_switch'') or (include_manual_fan_switch
+ == ''enable_manual_fan_switch_auto_off'') }}'
+ - '{{ expand(manual_fan_switch) | selectattr(''state'', ''=='', ''on'')
+ | list | count > 0 }}'
+ sequence:
+ - alias: Turn OFF manual fan switch
+ action: homeassistant.turn_off
+ entity_id: !input manual_fan_switch
+ - alias: Parallel Actions for the fan and lights
+ parallel:
+ - sequence:
+ - alias: Turn off the fan
+ action: homeassistant.turn_off
+ target: !input fan_switch
+ - choose:
+ - alias: Check if the fan speed switch to low speed then off option
+ is enabled
+ conditions:
+ - '{{ winter_include_fan_speed == ''fan_low_speed_enabled'' }}'
+ sequence:
+ - alias: Fan low speed OFF - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_low
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - alias: Check if the fan speed off option is enabled
+ conditions:
+ - '{{ winter_include_fan_speed == ''fan_speed_off_enabled'' }}'
+ sequence:
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - sequence:
+ - choose:
+ - alias: Check if the lights are enabled
+ conditions:
+ - '{{ include_lights == ''lights_enabled'' }}'
+ sequence:
+ - choose:
+ - alias: If transition is selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_off_value }}'
+ - alias: If transition is not selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' not in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ - sequence:
+ - choose:
+ - alias: Check if the automation link is enabled
+ conditions:
+ - '{{ include_automation_link == ''enable_automation_link'' }}'
+ sequence:
+ - alias: Turn off the automation link
+ action: homeassistant.turn_off
+ target:
+ entity_id: !input automation_link
+ - alias: Check by-pass settings and preform the correct action
+ if:
+ - alias: Check if the by-pass auto off is enabled
+ condition: template
+ value_template: '{{ include_bypass_auto_off == ''bypass_auto_off_enabled''
+ }}'
+ then:
+ - alias: Wait the number of minutes set in the by-pass auto off time delay
+ delay:
+ minutes: !input bypass_auto_off_delay
+ - alias: Turn off the by-pass
+ action: homeassistant.turn_off
+ entity_id: !input by_pass
+ - stop: Stop the automation
+ - alias: By-pass is turned on & check by-pass option - keep the current fan
+ state
+ conditions:
+ - condition: trigger
+ id: t5
+ - condition: template
+ value_template: '{{ include_bypass == ''bypass_enabled_stop'' }}'
+ sequence:
+ - choose:
+ - alias: Check if the manual trigger option is enabled and switch is on
+ conditions:
+ - '{{ (include_manual_trigger == ''enable_manual_trigger'') or (include_manual_trigger
+ == ''enable_manual_trigger_time_delay'') }}'
+ - '{{ expand(manual_trigger) | selectattr(''state'', ''=='', ''on'') |
+ list | count > 0 }}'
+ sequence:
+ - alias: Turn OFF manual trigger
+ action: homeassistant.turn_off
+ entity_id: !input manual_trigger
+ - choose:
+ - alias: Check if the manual fan switch option is enabled and switch is
+ on
+ conditions:
+ - '{{ (include_manual_fan_switch == ''enable_manual_fan_switch'') or (include_manual_fan_switch
+ == ''enable_manual_fan_switch_auto_off'') }}'
+ - '{{ expand(manual_fan_switch) | selectattr(''state'', ''=='', ''on'')
+ | list | count > 0 }}'
+ sequence:
+ - alias: Turn OFF manual fan switch
+ action: homeassistant.turn_off
+ entity_id: !input manual_fan_switch
+ - alias: Check by-pass settings and preform the correct action
+ if:
+ - alias: Check if the by-pass auto off is enabled
+ condition: template
+ value_template: '{{ include_bypass_auto_off == ''bypass_auto_off_enabled''
+ }}'
+ then:
+ - alias: Wait the number of minutes set in the by-pass auto off time delay
+ delay:
+ minutes: !input bypass_auto_off_delay
+ - alias: Turn off the by-pass
+ action: homeassistant.turn_off
+ entity_id: !input by_pass
+ - stop: Stop the automation
+ else:
+ - stop: Stop the automation
+ - choose:
+ - alias: By-pass is turned off & preform the correct action
+ conditions:
+ - condition: trigger
+ id: t6
+ sequence:
+ - choose:
+ - alias: Check if the manual trigger option is enabled and switch is on
+ conditions:
+ - '{{ (include_manual_trigger == ''enable_manual_trigger'') or (include_manual_trigger
+ == ''enable_manual_trigger_time_delay'') }}'
+ - '{{ expand(manual_trigger) | selectattr(''state'', ''=='', ''on'') |
+ list | count > 0 }}'
+ sequence:
+ - alias: Turn OFF manual trigger
+ action: homeassistant.turn_off
+ entity_id: !input manual_trigger
+ - choose:
+ - alias: Check if the manual fan switch option is enabled and switch is
+ on
+ conditions:
+ - '{{ (include_manual_fan_switch == ''enable_manual_fan_switch'') or (include_manual_fan_switch
+ == ''enable_manual_fan_switch_auto_off'') }}'
+ - '{{ expand(manual_fan_switch) | selectattr(''state'', ''=='', ''on'')
+ | list | count > 0 }}'
+ sequence:
+ - alias: Turn OFF manual fan switch
+ action: homeassistant.turn_off
+ entity_id: !input manual_fan_switch
+ - choose:
+ - alias: Check by-pass options - turn fan off is enabled
+ conditions:
+ - condition: template
+ value_template: '{{ ''bypass_turn_fan_off'' in bypass_options }}'
+ sequence:
+ - alias: Parallel Actions for the fan and lights
+ parallel:
+ - sequence:
+ - alias: Turn off the fan
+ action: homeassistant.turn_off
+ target: !input fan_switch
+ - choose:
+ - alias: Check if the fan speed switch to low speed then off option
+ is enabled
+ conditions:
+ - '{{ winter_include_fan_speed == ''fan_low_speed_enabled'' }}'
+ sequence:
+ - alias: Fan low speed OFF - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_low
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - alias: Check if the fan speed off option is enabled
+ conditions:
+ - '{{ winter_include_fan_speed == ''fan_speed_off_enabled'' }}'
+ sequence:
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - sequence:
+ - choose:
+ - alias: Check if the lights are enabled
+ conditions:
+ - '{{ include_lights == ''lights_enabled'' }}'
+ sequence:
+ - choose:
+ - alias: If transition is selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_off_value }}'
+ - alias: If transition is not selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' not in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ - sequence:
+ - choose:
+ - alias: Check if the automation link is enabled
+ conditions:
+ - '{{ include_automation_link == ''enable_automation_link'' }}'
+ sequence:
+ - alias: Turn off the automation link
+ action: homeassistant.turn_off
+ target:
+ entity_id: !input automation_link
+ - stop: Stop the automation
+ - alias: Check if the sensor is below falling humidity & by-pass options
+ - turn fan off is disabled
+ conditions:
+ - alias: Check sensor is below falling
+ condition: numeric_state
+ entity_id: !input trigger
+ below: !input winter_falling_humidity
+ - condition: not
+ conditions:
+ - condition: template
+ value_template: '{{ ''bypass_turn_fan_off'' in bypass_options }}'
+ sequence:
+ - alias: Parallel Actions for the fan and lights
+ parallel:
+ - sequence:
+ - alias: Wait the number of minutes that has been set for the time
+ delay
+ delay:
+ minutes: !input winter_time_delay
+ - alias: Turn off the fan
+ action: homeassistant.turn_off
+ target: !input fan_switch
+ - choose:
+ - alias: Check if the fan speed switch to low speed then off option
+ is enabled
+ conditions:
+ - '{{ winter_include_fan_speed == ''fan_low_speed_enabled'' }}'
+ sequence:
+ - alias: Fan Speed - Switch Off - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_off
+ - alias: Fan low speed ON
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_low
+ - alias: Wait the number of minutes set in the low speed time
+ delay
+ delay:
+ minutes: !input winter_time_delay_low_speed
+ - alias: Fan low speed OFF - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_low
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - alias: Check if the fan speed off option is enabled
+ conditions:
+ - '{{ winter_include_fan_speed == ''fan_speed_off_enabled'' }}'
+ sequence:
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - sequence:
+ - choose:
+ - alias: Check if the lights are enabled
+ conditions:
+ - '{{ include_lights == ''lights_enabled'' }}'
+ sequence:
+ - alias: Wait the number of minutes set in the lights time delay
+ delay:
+ minutes: !input light_time_delay
+ - choose:
+ - alias: If transition is selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_off_value }}'
+ - alias: If transition is not selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' not in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ - sequence:
+ - choose:
+ - alias: Check if the automation link is enabled
+ conditions:
+ - '{{ include_automation_link == ''enable_automation_link'' }}'
+ sequence:
+ - alias: Wait the number of minutes set in the automation link
+ time delay
+ delay:
+ minutes: !input automation_link_time_delay
+ - alias: Turn off the automation link
+ action: homeassistant.turn_off
+ target:
+ entity_id: !input automation_link
+ - stop: Stop the automation
+ - alias: Check if the sensor is above winter rising humidity & by-pass options
+ - turn fan off is disabled
+ conditions:
+ - alias: Check sensor is above rising
+ condition: numeric_state
+ entity_id: !input trigger
+ above: !input winter_rising_humidity
+ - '{{ (expand(fan_switch.entity_id) | selectattr(''state'', ''=='', ''off'')
+ | list | count > 0 ) or ((include_lights == ''lights_enabled'') and
+ (expand(light_switch.entity_id) | selectattr(''state'', ''=='', ''off'')
+ | list | count > 0)) or ((include_automation_link == ''enable_automation_link'')
+ and (expand(automation_link) | selectattr(''state'', ''=='', ''off'')
+ | list | count > 0)) }}'
+ - condition: not
+ conditions:
+ - condition: template
+ value_template: '{{ ''bypass_turn_fan_off'' in bypass_options }}'
+ sequence:
+ - alias: We need something here to continue
+ delay:
+ milliseconds: 10
+ default:
+ - alias: Wait until Humidity Derivative Sensor drops or it times out
+ wait_for_trigger:
+ - trigger: numeric_state
+ entity_id: !input trigger
+ below: !input winter_falling_humidity
+ timeout:
+ minutes: !input winter_time_out
+ - alias: Parallel Actions for the fan and lights
+ parallel:
+ - sequence:
+ - alias: Wait the number of minutes that has been set for the time delay
+ delay:
+ minutes: !input winter_time_delay
+ - alias: Turn off the fan
+ action: homeassistant.turn_off
+ target: !input fan_switch
+ - choose:
+ - alias: Check if the fan speed switch to low speed then off option
+ is enabled
+ conditions:
+ - '{{ winter_include_fan_speed == ''fan_low_speed_enabled'' }}'
+ sequence:
+ - alias: Fan Speed - Switch Off - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_off
+ - alias: Fan low speed ON
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_low
+ - alias: Wait the number of minutes set in the low speed time delay
+ delay:
+ minutes: !input winter_time_delay_low_speed
+ - alias: Fan low speed OFF - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_low
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - alias: Check if the fan speed off option is enabled
+ conditions:
+ - '{{ winter_include_fan_speed == ''fan_speed_off_enabled'' }}'
+ sequence:
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - sequence:
+ - choose:
+ - alias: Check if the lights are enabled
+ conditions:
+ - '{{ include_lights == ''lights_enabled'' }}'
+ sequence:
+ - alias: Wait the number of minutes set in the lights time delay
+ delay:
+ minutes: !input light_time_delay
+ - choose:
+ - alias: If transition is selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_off_value }}'
+ - alias: If transition is not selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' not in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ - sequence:
+ - choose:
+ - alias: Check if the automation link is enabled
+ conditions:
+ - '{{ include_automation_link == ''enable_automation_link'' }}'
+ sequence:
+ - alias: Wait the number of minutes set in the automation link time
+ delay
+ delay:
+ minutes: !input automation_link_time_delay
+ - alias: Turn off the automation link
+ action: homeassistant.turn_off
+ target:
+ entity_id: !input automation_link
+ - stop: Stop the automation
+ - choose:
+ - alias: Preform the manual fan switch option
+ conditions:
+ - condition: trigger
+ id: t7
+ sequence:
+ - choose:
+ - alias: Check if the manual trigger option is enabled and switch is on
+ conditions:
+ - '{{ (include_manual_trigger == ''enable_manual_trigger'') or (include_manual_trigger
+ == ''enable_manual_trigger_time_delay'') }}'
+ - '{{ expand(manual_trigger) | selectattr(''state'', ''=='', ''on'') |
+ list | count > 0 }}'
+ sequence:
+ - alias: Turn OFF manual trigger
+ action: homeassistant.turn_off
+ entity_id: !input manual_trigger
+ - choose:
+ - alias: Check if fan speeds are enabled
+ conditions:
+ - '{{ winter_include_fan_speed == ''fan_low_speed_enabled'' }}'
+ sequence:
+ - alias: Fan Speed - Low Speed Switch - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_low
+ - choose:
+ - alias: Check if fan speeds are enabled
+ conditions:
+ - '{{ (winter_include_fan_speed == ''fan_low_speed_enabled'') or (winter_include_fan_speed
+ == ''fan_speed_off_enabled'')}}'
+ sequence:
+ - alias: Fan Speed - Switch Off - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_off
+ - alias: Turn on the fan
+ action: homeassistant.turn_on
+ target: !input fan_switch
+ - choose:
+ - alias: Check if manual fan switch auto off is enabled
+ conditions:
+ - '{{ include_manual_fan_switch == ''enable_manual_fan_switch_auto_off''
+ }}'
+ sequence:
+ - alias: Wait until manual fan switch is turned off or the time delay
+ passes
+ wait_for_trigger:
+ - trigger: state
+ entity_id: !input manual_fan_switch
+ from: 'on'
+ to: 'off'
+ timeout:
+ minutes: !input manual_fan_switch_time_delay
+ - alias: Check if manual fan switch is enabled
+ conditions:
+ - '{{ include_manual_fan_switch == ''enable_manual_fan_switch'' }}'
+ sequence:
+ - alias: Wait until manual fan switch is turned off
+ wait_for_trigger:
+ - trigger: state
+ entity_id: !input manual_fan_switch
+ from: 'on'
+ to: 'off'
+ - alias: Parallel Actions for the fan, lights and automation link
+ parallel:
+ - sequence:
+ - alias: Turn off the fan
+ action: homeassistant.turn_off
+ target: !input fan_switch
+ - choose:
+ - alias: Check if the fan speed off option is enabled
+ conditions:
+ - '{{ (winter_include_fan_speed == ''fan_low_speed_enabled'') or (winter_include_fan_speed
+ == ''fan_speed_off_enabled'') }}'
+ sequence:
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - choose:
+ - alias: Check if the run on timer is switch is on
+ conditions:
+ - '{{ expand(manual_fan_switch) | selectattr(''state'', ''=='', ''on'')
+ | list | count > 0 }}'
+ sequence:
+ - alias: Turn OFF manual fan switch
+ action: homeassistant.turn_off
+ entity_id: !input manual_fan_switch
+ - sequence:
+ - choose:
+ - alias: Check if the lights are enabled
+ conditions:
+ - '{{ ((include_lights == ''lights_enabled'') and (expand(light_switch.entity_id)
+ | selectattr(''state'', ''=='', ''on'') | list | count > 0)) }}'
+ sequence:
+ - choose:
+ - alias: If transition is selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_off_value }}'
+ - alias: If transition is not selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' not in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ - sequence:
+ - choose:
+ - alias: Check if the automation link is enabled
+ conditions:
+ - '{{ ((include_automation_link == ''enable_automation_link'') and
+ (expand(automation_link) | selectattr(''state'', ''=='', ''on'')
+ | list | count > 0)) }}'
+ sequence:
+ - alias: Turn off the automation link
+ action: homeassistant.turn_off
+ target:
+ entity_id: !input automation_link
+ - stop: Stop the automation
+ - alias: Preform the manual trigger option
+ conditions:
+ - condition: trigger
+ id: t8
+ sequence:
+ - choose:
+ - alias: Check if the manual fan switch option is enabled and switch is
+ on
+ conditions:
+ - '{{ (include_manual_fan_switch == ''enable_manual_fan_switch'') or (include_manual_fan_switch
+ == ''enable_manual_fan_switch_auto_off'') }}'
+ - '{{ expand(manual_fan_switch) | selectattr(''state'', ''=='', ''on'')
+ | list | count > 0 }}'
+ sequence:
+ - alias: Turn OFF manual fan switch
+ action: homeassistant.turn_off
+ entity_id: !input manual_fan_switch
+ - choose:
+ - alias: Check if the automation link is enabled
+ conditions:
+ - '{{ include_automation_link == ''enable_automation_link'' }}'
+ sequence:
+ - alias: Turn on the automation link
+ action: homeassistant.turn_on
+ target:
+ entity_id: !input automation_link
+ - choose:
+ - alias: Check if the lights are enabled
+ conditions:
+ - '{{ include_lights == ''lights_enabled'' }}'
+ sequence:
+ - choose:
+ - alias: Set the transition for the normal lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' in include_light_control)
+ and (''use_brightness'' not in include_light_control) and (''use_colour_temperature''
+ not in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_on_value }}'
+ - alias: Set the transition and brightness for the normal lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' in include_light_control)
+ and (''use_brightness'' in include_light_control) and (''use_colour_temperature''
+ not in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_on_value }}'
+ brightness_pct: '{{ brightness_value }}'
+ - alias: Set the transition and colour temperature for the normal lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' in include_light_control)
+ and (''use_brightness'' not in include_light_control) and (''use_colour_temperature''
+ in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_on_value }}'
+ color_temp_kelvin: '{{temperature_value}}'
+ - alias: Set the transition, brightness and colour temperature for the
+ normal lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' in include_light_control)
+ and (''use_brightness'' in include_light_control) and (''use_colour_temperature''
+ in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_on_value }}'
+ brightness_pct: '{{ brightness_value }}'
+ color_temp_kelvin: '{{temperature_value}}'
+ - alias: Set the brightness for the normal lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' not in include_light_control)
+ and (''use_brightness'' in include_light_control) and (''use_colour_temperature''
+ not in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ brightness_pct: '{{ brightness_value }}'
+ - alias: Set the colour temperature for the normal lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' not in include_light_control)
+ and (''use_brightness'' not in include_light_control) and (''use_colour_temperature''
+ in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ color_temp_kelvin: '{{temperature_value}}'
+ - alias: Set the brightness and colour temperature for the normal lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' not in include_light_control)
+ and (''use_brightness'' in include_light_control) and (''use_colour_temperature''
+ in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ brightness_pct: '{{ brightness_value }}'
+ color_temp_kelvin: '{{temperature_value}}'
+ - alias: Set the default for the normal lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' not in include_light_control)
+ and (''use_brightness'' not in include_light_control) and (''use_colour_temperature''
+ not in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ - choose:
+ - alias: Check if fan speeds are enabled
+ conditions:
+ - '{{ winter_include_fan_speed == ''fan_low_speed_enabled'' }}'
+ sequence:
+ - alias: Fan Speed - Low Speed Switch - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_low
+ - choose:
+ - alias: Check if fan speeds are enabled
+ conditions:
+ - '{{ (winter_include_fan_speed == ''fan_low_speed_enabled'') or (winter_include_fan_speed
+ == ''fan_speed_off_enabled'') }}'
+ sequence:
+ - alias: Fan Speed - Switch Off - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_off
+ - alias: Turn on the fan
+ action: homeassistant.turn_on
+ target: !input fan_switch
+ - choose:
+ - alias: Check manual trigger with safeguard is selected
+ conditions:
+ - '{{ include_manual_trigger == ''enable_manual_trigger'' }}'
+ sequence:
+ - alias: Wait until manual trigger is turned off or the safeguard has
+ passes
+ wait_for_trigger:
+ - trigger: state
+ entity_id: !input manual_trigger
+ from: 'on'
+ to: 'off'
+ timeout:
+ minutes: !input winter_time_out
+ - choose:
+ - alias: Check if the manual trigger switch is ON and turn it OFF
+ conditions:
+ - '{{ expand(manual_trigger) | selectattr(''state'', ''=='', ''on'')
+ | list | count > 0 }}'
+ sequence:
+ - alias: Turn OFF the manual trigger
+ action: homeassistant.turn_off
+ entity_id: !input manual_trigger
+ - alias: Check manual trigger with time delay is selected
+ conditions:
+ - '{{ include_manual_trigger == ''enable_manual_trigger_time_delay'' }}'
+ sequence:
+ - alias: Wait until manual trigger is turned off or the time delay has
+ passes
+ wait_for_trigger:
+ - trigger: state
+ entity_id: !input manual_trigger
+ from: 'on'
+ to: 'off'
+ timeout:
+ minutes: !input manual_trigger_winter_time_delay
+ - choose:
+ - alias: Check if the manual trigger switch is ON and turn it OFF
+ conditions:
+ - '{{ expand(manual_trigger) | selectattr(''state'', ''=='', ''on'')
+ | list | count > 0 }}'
+ sequence:
+ - alias: Turn OFF the manual trigger
+ action: homeassistant.turn_off
+ entity_id: !input manual_trigger
+ - alias: Parallel Actions for the fan, lights and automation link
+ parallel:
+ - sequence:
+ - alias: Wait until the time delay has passes
+ delay:
+ minutes: !input winter_time_delay
+ - alias: Turn off the fan
+ action: homeassistant.turn_off
+ target: !input fan_switch
+ - choose:
+ - alias: Check if the fan speed switch to low speed then off option
+ is enabled
+ conditions:
+ - '{{ winter_include_fan_speed == ''fan_low_speed_enabled'' }}'
+ sequence:
+ - alias: Fan Speed - Switch Off - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_off
+ - alias: Fan low speed ON
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_low
+ - alias: Wait until the low speed time delay passes
+ delay:
+ minutes: !input winter_time_delay_low_speed
+ - alias: Fan low speed OFF - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_low
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - alias: Check if the fan speed off option is enabled
+ conditions:
+ - '{{ winter_include_fan_speed == ''fan_speed_off_enabled'' }}'
+ sequence:
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - sequence:
+ - choose:
+ - alias: Check if the lights are enabled and the lights are ON
+ conditions:
+ - '{{ ((include_lights == ''lights_enabled'') and (expand(light_switch.entity_id)
+ | selectattr(''state'', ''=='', ''on'') | list | count > 0)) }}'
+ sequence:
+ - alias: Wait until the light time delay has passes
+ delay:
+ minutes: !input light_time_delay
+ - choose:
+ - alias: If transition is selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_off_value }}'
+ - alias: If transition is not selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' not in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ - sequence:
+ - choose:
+ - alias: Check if the automation link is enabled
+ conditions:
+ - '{{ ((include_automation_link == ''enable_automation_link'') and
+ (expand(automation_link) | selectattr(''state'', ''=='', ''on'')
+ | list | count > 0)) }}'
+ sequence:
+ - alias: Wait until the automation link time delay has passes
+ delay:
+ minutes: !input automation_link_time_delay
+ - alias: Turn off the automation link
+ action: homeassistant.turn_off
+ target:
+ entity_id: !input automation_link
+ - stop: Stop the automation
+ - choose:
+ - alias: Safeguard when HA restarts
+ conditions:
+ - condition: trigger
+ id: t2
+ sequence:
+ - choose:
+ - alias: Check manual trigger with safeguard is selected and manual trigger
+ is ON
+ conditions:
+ - '{{ include_manual_trigger == ''enable_manual_trigger'' }}'
+ - '{{ expand(manual_trigger) | selectattr(''state'', ''=='', ''on'') |
+ list | count > 0 }}'
+ sequence:
+ - alias: Wait until manual trigger is turned off or the safeguard has
+ passes
+ wait_for_trigger:
+ - trigger: state
+ entity_id: !input manual_trigger
+ from: 'on'
+ to: 'off'
+ timeout:
+ minutes: !input time_out
+ - choose:
+ - alias: Check if the manual trigger switch is on and turn it OFF
+ conditions:
+ - '{{ expand(manual_trigger) | selectattr(''state'', ''=='', ''on'')
+ | list | count > 0 }}'
+ sequence:
+ - alias: Turn OFF the manual trigger
+ action: homeassistant.turn_off
+ entity_id: !input manual_trigger
+ - alias: Check manual trigger with time delay is selected and manual trigger
+ is ON
+ conditions:
+ - '{{ include_manual_trigger == ''enable_manual_trigger_time_delay'' }}'
+ - '{{ expand(manual_trigger) | selectattr(''state'', ''=='', ''on'') |
+ list | count > 0 }}'
+ sequence:
+ - alias: Wait until manual trigger is turned off or the time delay has
+ passes
+ wait_for_trigger:
+ - trigger: state
+ entity_id: !input manual_trigger
+ from: 'on'
+ to: 'off'
+ timeout:
+ minutes: !input manual_trigger_winter_time_delay
+ - choose:
+ - alias: Check if the manual trigger switch is on and turn it OFF
+ conditions:
+ - '{{ expand(manual_trigger) | selectattr(''state'', ''=='', ''on'')
+ | list | count > 0 }}'
+ sequence:
+ - alias: Turn OFF the manual trigger
+ action: homeassistant.turn_off
+ entity_id: !input manual_trigger
+ - choose:
+ - alias: Check manual fan switch is enabled and manual switch is ON
+ conditions:
+ - alias: Check if the humidity derivative sensor is above falling humidity
+ set point and fan / lights are on
+ condition: template
+ value_template: '{{ include_manual_fan_switch == ''enable_manual_fan_switch_auto_off''
+ or include_manual_fan_switch == ''enable_manual_fan_switch'' }}'
+ - '{{ expand(manual_fan_switch) | selectattr(''state'', ''=='', ''on'')
+ | list | count > 0 }}'
+ sequence:
+ - choose:
+ - alias: Check if manual fan switch is enabled
+ conditions:
+ - '{{ include_manual_fan_switch == ''enable_manual_fan_switch'' }}'
+ sequence:
+ - alias: Wait until manual fan switch is turned off
+ wait_for_trigger:
+ - trigger: state
+ entity_id: !input manual_fan_switch
+ from: 'on'
+ to: 'off'
+ - alias: Check if manual fan switch auto off is enabled
+ conditions:
+ - '{{ include_manual_fan_switch == ''enable_manual_fan_switch_auto_off''
+ }}'
+ sequence:
+ - alias: Wait until manual fan switch is turned off or the time delay
+ passes
+ wait_for_trigger:
+ - trigger: state
+ entity_id: !input manual_fan_switch
+ from: 'on'
+ to: 'off'
+ timeout:
+ minutes: !input manual_fan_switch_time_delay
+ - alias: Parallel Actions for the fan, lights and automation link
+ parallel:
+ - sequence:
+ - alias: Turn off the fan
+ action: homeassistant.turn_off
+ target: !input fan_switch
+ - choose:
+ - alias: Check if the fan speed off option is enabled
+ conditions:
+ - '{{ (winter_include_fan_speed == ''fan_low_speed_enabled'')
+ or (winter_include_fan_speed == ''fan_speed_off_enabled'') }}'
+ sequence:
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - choose:
+ - alias: Check if the run on timer is switch is on
+ conditions:
+ - '{{ expand(manual_fan_switch) | selectattr(''state'', ''=='',
+ ''on'') | list | count > 0 }}'
+ sequence:
+ - alias: Turn OFF manual fan switch
+ action: homeassistant.turn_off
+ entity_id: !input manual_fan_switch
+ - sequence:
+ - choose:
+ - alias: Check if the lights are enabled
+ conditions:
+ - '{{ ((include_lights == ''lights_enabled'') and (expand(light_switch.entity_id)
+ | selectattr(''state'', ''=='', ''on'') | list | count > 0))
+ }}'
+ sequence:
+ - choose:
+ - alias: If transition is selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_off_value }}'
+ - alias: If transition is not selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' not in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ - sequence:
+ - choose:
+ - alias: Check if the automation link is enabled
+ conditions:
+ - '{{ ((include_automation_link == ''enable_automation_link'')
+ and (expand(automation_link) | selectattr(''state'', ''=='',
+ ''on'') | list | count > 0)) }}'
+ sequence:
+ - alias: Turn off the automation link
+ action: homeassistant.turn_off
+ target:
+ entity_id: !input automation_link
+ - stop: Stop the automation
+ - alias: Check automation and preform the correct action
+ conditions:
+ - alias: Check if the winter humidity derivative sensor is below falling
+ humidity set point and fan / lights are on
+ condition: numeric_state
+ entity_id: !input trigger
+ below: !input winter_falling_humidity
+ - '{{ (expand(fan_switch.entity_id) | selectattr(''state'', ''=='', ''on'')
+ | list | count > 0) or ((winter_include_fan_speed == ''fan_low_speed_enabled'')
+ and (expand(fan_speed_low) | selectattr(''state'', ''=='', ''on'') |
+ list | count > 0)) or ((include_lights == ''lights_enabled'') and (expand(light_switch.entity_id)
+ | selectattr(''state'', ''=='', ''on'') | list | count > 0)) or ((include_automation_link
+ == ''enable_automation_link'') and (expand(automation_link) | selectattr(''state'',
+ ''=='', ''on'') | list | count > 0)) }}'
+ sequence:
+ - choose:
+ - alias: Check if the by-pass auto off is enabled and by-pass is ON
+ conditions:
+ - condition: template
+ value_template: '{{ (include_bypass_auto_off == ''bypass_auto_off_enabled'')
+ and (states[by_pass].state == ''on'') }}'
+ sequence:
+ - alias: Wait the number of minutes set in the by-pass auto off time
+ delay
+ delay:
+ minutes: !input bypass_auto_off_delay
+ - alias: Turn off the by-pass
+ action: homeassistant.turn_off
+ entity_id: !input by_pass
+ - stop: Stop the automation
+ - alias: Parallel Actions for the fan and lights
+ parallel:
+ - sequence:
+ - alias: Wait the number of minutes that has been set for the time
+ delay
+ delay:
+ minutes: !input winter_time_delay
+ - alias: Turn off the fan
+ action: homeassistant.turn_off
+ target: !input fan_switch
+ - choose:
+ - alias: Check if the fan speed switch to low speed then off option
+ is enabled
+ conditions:
+ - '{{ winter_include_fan_speed == ''fan_low_speed_enabled'' }}'
+ sequence:
+ - alias: Fan Speed - Switch Off - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_off
+ - alias: Fan low speed ON
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_low
+ - alias: Wait the number of minutes set in the low speed time
+ delay
+ delay:
+ minutes: !input winter_time_delay_low_speed
+ - alias: Fan low speed OFF - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_low
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - alias: Check if the fan speed off option is enabled
+ conditions:
+ - '{{ winter_include_fan_speed == ''fan_speed_off_enabled'' }}'
+ sequence:
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - sequence:
+ - choose:
+ - alias: Check if the lights are enabled
+ conditions:
+ - '{{ include_lights == ''lights_enabled'' }}'
+ sequence:
+ - alias: Wait the number of minutes set in the lights time delay
+ delay:
+ minutes: !input light_time_delay
+ - choose:
+ - alias: If transition is selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_off_value }}'
+ - alias: If transition is not selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' not in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ - sequence:
+ - choose:
+ - alias: Check if the automation link is enabled
+ conditions:
+ - '{{ include_automation_link == ''enable_automation_link'' }}'
+ sequence:
+ - alias: Wait the number of minutes set in the automation link
+ time delay
+ delay:
+ minutes: !input automation_link_time_delay
+ - alias: Turn off the automation link
+ action: homeassistant.turn_off
+ target:
+ entity_id: !input automation_link
+ - stop: Stop the automation
+ - alias: Check automation and preform the correct action
+ conditions:
+ - alias: Check if the winter humidity derivative sensor is above falling
+ humidity set point and fan / lights are on
+ condition: numeric_state
+ entity_id: !input trigger
+ above: !input winter_rising_humidity
+ - '{{ (expand(fan_switch.entity_id) | selectattr(''state'', ''=='', ''on'')
+ | list | count > 0) or ((winter_include_fan_speed == ''fan_low_speed_enabled'')
+ and (expand(fan_speed_low) | selectattr(''state'', ''=='', ''on'') |
+ list | count > 0)) }}'
+ - '{{ ((include_lights == ''lights_enabled'') and (expand(light_switch.entity_id)
+ | selectattr(''state'', ''=='', ''on'') | list | count > 0)) or (include_lights
+ == ''lights_disabled'') }}'
+ - '{{ ((include_automation_link == ''enable_automation_link'') and (expand(automation_link)
+ | selectattr(''state'', ''=='', ''on'') | list | count > 0)) or (include_automation_link
+ == ''disable_automation_link'') }}'
+ sequence:
+ - choose:
+ - alias: Check if the by-pass auto off is enabled and by-pass is ON
+ conditions:
+ - condition: template
+ value_template: '{{ (include_bypass_auto_off == ''bypass_auto_off_enabled'')
+ and (states[by_pass].state == ''on'') }}'
+ sequence:
+ - alias: Wait the number of minutes set in the by-pass auto off time
+ delay
+ delay:
+ minutes: !input bypass_auto_off_delay
+ - alias: Turn off the by-pass
+ action: homeassistant.turn_off
+ entity_id: !input by_pass
+ - stop: Stop the automation
+ - alias: Wait until Humidity Derivative Sensor drops or it times out
+ wait_for_trigger:
+ - trigger: numeric_state
+ entity_id: !input trigger
+ below: !input winter_falling_humidity
+ timeout:
+ minutes: !input winter_time_out
+ - alias: Parallel Actions for the fan and lights
+ parallel:
+ - sequence:
+ - alias: Wait the number of minutes that has been set for the time
+ delay
+ delay:
+ minutes: !input winter_time_delay
+ - alias: Turn off the fan
+ action: homeassistant.turn_off
+ target: !input fan_switch
+ - choose:
+ - alias: Check if the fan speed switch to low speed then off option
+ is enabled
+ conditions:
+ - '{{ winter_include_fan_speed == ''fan_low_speed_enabled'' }}'
+ sequence:
+ - alias: Fan Speed - Switch Off - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_off
+ - alias: Fan low speed ON
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_low
+ - alias: Wait the number of minutes set in the low speed time
+ delay
+ delay:
+ minutes: !input winter_time_delay_low_speed
+ - alias: Fan low speed OFF - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_low
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - alias: Check if the fan speed off option is enabled
+ conditions:
+ - '{{ winter_include_fan_speed == ''fan_speed_off_enabled'' }}'
+ sequence:
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - sequence:
+ - choose:
+ - alias: Check if the lights are enabled
+ conditions:
+ - '{{ include_lights == ''lights_enabled'' }}'
+ sequence:
+ - alias: Wait the number of minutes set in the lights time delay
+ delay:
+ minutes: !input light_time_delay
+ - choose:
+ - alias: If transition is selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_off_value }}'
+ - alias: If transition is not selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' not in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ - sequence:
+ - choose:
+ - alias: Check if the automation link is enabled
+ conditions:
+ - '{{ include_automation_link == ''enable_automation_link'' }}'
+ sequence:
+ - alias: Wait the number of minutes set in the automation link
+ time delay
+ delay:
+ minutes: !input automation_link_time_delay
+ - alias: Turn off the automation link
+ action: homeassistant.turn_off
+ target:
+ entity_id: !input automation_link
+ - stop: Stop the automation
+ - choose:
+ - alias: Check if the manual trigger option is enabled and switch is on
+ conditions:
+ - '{{ (include_manual_trigger == ''enable_manual_trigger'') or (include_manual_trigger
+ == ''enable_manual_trigger_time_delay'') }}'
+ - '{{ expand(manual_trigger) | selectattr(''state'', ''=='', ''on'') | list
+ | count > 0 }}'
+ sequence:
+ - alias: Turn OFF manual trigger
+ action: homeassistant.turn_off
+ entity_id: !input manual_trigger
+ - choose:
+ - alias: Check if the manual fan switch option is enabled and switch is on
+ conditions:
+ - '{{ (include_manual_fan_switch == ''enable_manual_fan_switch'') or (include_manual_fan_switch
+ == ''enable_manual_fan_switch_auto_off'') }}'
+ - '{{ expand(manual_fan_switch) | selectattr(''state'', ''=='', ''on'') |
+ list | count > 0 }}'
+ sequence:
+ - alias: Turn OFF manual fan switch
+ action: homeassistant.turn_off
+ entity_id: !input manual_fan_switch
+ - choose:
+ - alias: Check if fan speeds are enabled
+ conditions:
+ - '{{ winter_include_fan_speed == ''fan_low_speed_enabled'' }}'
+ sequence:
+ - alias: Fan Speed - Low Speed Switch - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_low
+ - choose:
+ - alias: Check if fan speeds are enabled
+ conditions:
+ - '{{ (winter_include_fan_speed == ''fan_low_speed_enabled'') or (winter_include_fan_speed
+ == ''fan_speed_off_enabled'')}}'
+ sequence:
+ - alias: Fan Speed - Switch Off - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_off
+ - alias: Turn on the fan
+ action: homeassistant.turn_on
+ target: !input fan_switch
+ - choose:
+ - alias: Check if the lights are enabled
+ conditions:
+ - '{{ include_lights == ''lights_enabled'' }}'
+ sequence:
+ - choose:
+ - alias: Set the transition for the winter mode lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' in include_light_control) and
+ (''use_brightness'' not in include_light_control) and (''use_colour_temperature''
+ not in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_on_value }}'
+ - alias: Set the transition and brightness for the winter mode lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' in include_light_control) and
+ (''use_brightness'' in include_light_control) and (''use_colour_temperature''
+ not in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_on_value }}'
+ brightness_pct: '{{ brightness_value }}'
+ - alias: Set the transition and colour temperature for the winter mode lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' in include_light_control) and
+ (''use_brightness'' not in include_light_control) and (''use_colour_temperature''
+ in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_on_value }}'
+ color_temp_kelvin: '{{temperature_value}}'
+ - alias: Set the transition, brightness and colour temperature for the winter
+ mode lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' in include_light_control) and
+ (''use_brightness'' in include_light_control) and (''use_colour_temperature''
+ in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_on_value }}'
+ brightness_pct: '{{ brightness_value }}'
+ color_temp_kelvin: '{{temperature_value}}'
+ - alias: Set the brightness for the winter mode lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' not in include_light_control)
+ and (''use_brightness'' in include_light_control) and (''use_colour_temperature''
+ not in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ brightness_pct: '{{ brightness_value }}'
+ - alias: Set the colour temperature for the winter mode lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' not in include_light_control)
+ and (''use_brightness'' not in include_light_control) and (''use_colour_temperature''
+ in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ color_temp_kelvin: '{{temperature_value}}'
+ - alias: Set the brightness and colour temperature for the winter mode lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' not in include_light_control)
+ and (''use_brightness'' in include_light_control) and (''use_colour_temperature''
+ in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ brightness_pct: '{{ brightness_value }}'
+ color_temp_kelvin: '{{temperature_value}}'
+ - alias: Set the default for the winter mode lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' not in include_light_control)
+ and (''use_brightness'' not in include_light_control) and (''use_colour_temperature''
+ not in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ - choose:
+ - alias: Check if the automation link is enabled
+ conditions:
+ - '{{ include_automation_link == ''enable_automation_link'' }}'
+ sequence:
+ - alias: Turn on the automation link
+ action: homeassistant.turn_on
+ target:
+ entity_id: !input automation_link
+ - choose:
+ - alias: By-pass is enabled & check by-pass option - turn fan on
+ conditions:
+ - condition: trigger
+ id: t5
+ - condition: template
+ value_template: '{{ include_bypass == ''bypass_enabled_turn_on'' }}'
+ sequence:
+ - alias: Check by-pass settings and preform the correct action
+ if:
+ - alias: Check if the by-pass auto off is enabled
+ condition: template
+ value_template: '{{ include_bypass_auto_off == ''bypass_auto_off_enabled''
+ }}'
+ then:
+ - alias: Wait the number of minutes set in the by-pass auto off time delay
+ delay:
+ minutes: !input bypass_auto_off_delay
+ - alias: Turn off the by-pass
+ action: homeassistant.turn_off
+ entity_id: !input by_pass
+ - stop: Stop the automation
+ else:
+ - stop: Stop the automation
+ - alias: Wait until Humidity Derivative Sensor drops or it times out
+ wait_for_trigger:
+ - trigger: numeric_state
+ entity_id: !input trigger
+ below: !input winter_falling_humidity
+ timeout:
+ minutes: !input winter_time_out
+ - alias: Parallel Actions for the fan and lights
+ parallel:
+ - sequence:
+ - alias: Wait the number of minutes that has been set for the time delay
+ delay:
+ minutes: !input winter_time_delay
+ - alias: Turn off the fan
+ action: homeassistant.turn_off
+ target: !input fan_switch
+ - choose:
+ - alias: Check if the fan speed switch to low speed then off option is enabled
+ conditions:
+ - '{{ winter_include_fan_speed == ''fan_low_speed_enabled'' }}'
+ sequence:
+ - alias: Fan low speed ON
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_low
+ - alias: Wait the number of minutes set in the low speed time delay
+ delay:
+ minutes: !input winter_time_delay_low_speed
+ - alias: Fan low speed OFF - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_low
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - alias: Check if the fan speed off option is enabled
+ conditions:
+ - '{{ winter_include_fan_speed == ''fan_speed_off_enabled'' }}'
+ sequence:
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - sequence:
+ - choose:
+ - alias: Check if the lights are enabled
+ conditions:
+ - '{{ include_lights == ''lights_enabled'' }}'
+ sequence:
+ - alias: Wait the number of minutes set in the lights time delay
+ delay:
+ minutes: !input light_time_delay
+ - choose:
+ - alias: If transition is selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_off_value }}'
+ - alias: If transition is not selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' not in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ - sequence:
+ - choose:
+ - alias: Check if the automation link is enabled
+ conditions:
+ - '{{ include_automation_link == ''enable_automation_link'' }}'
+ sequence:
+ - alias: Wait the number of minutes set in the automation link time delay
+ delay:
+ minutes: !input automation_link_time_delay
+ - alias: Turn off the automation link
+ action: homeassistant.turn_off
+ target:
+ entity_id: !input automation_link
+ default:
+ - alias: Check if the triggers
+ condition: trigger
+ id:
+ - t2
+ - t3
+ - t4
+ - t5
+ - t6
+ - t7
+ - t8
+ - choose:
+ - alias: By-pass is turned on & check by-pass option - turn fan off
+ conditions:
+ - condition: trigger
+ id: t5
+ - condition: template
+ value_template: '{{ include_bypass == ''bypass_enabled'' }}'
+ sequence:
+ - choose:
+ - alias: Check if the manual trigger option is enabled and switch is on
+ conditions:
+ - '{{ (include_manual_trigger == ''enable_manual_trigger'') or (include_manual_trigger
+ == ''enable_manual_trigger_time_delay'') }}'
+ - '{{ expand(manual_trigger) | selectattr(''state'', ''=='', ''on'') | list
+ | count > 0 }}'
+ sequence:
+ - alias: Turn OFF manual trigger
+ action: homeassistant.turn_off
+ entity_id: !input manual_trigger
+ - choose:
+ - alias: Check if the manual fan switch option is enabled and switch is on
+ conditions:
+ - '{{ (include_manual_fan_switch == ''enable_manual_fan_switch'') or (include_manual_fan_switch
+ == ''enable_manual_fan_switch_auto_off'') }}'
+ - '{{ expand(manual_fan_switch) | selectattr(''state'', ''=='', ''on'')
+ | list | count > 0 }}'
+ sequence:
+ - alias: Turn OFF manual fan switch
+ action: homeassistant.turn_off
+ entity_id: !input manual_fan_switch
+ - alias: Parallel Actions for the fan and lights
+ parallel:
+ - sequence:
+ - alias: Turn off the fan
+ action: homeassistant.turn_off
+ target: !input fan_switch
+ - choose:
+ - alias: Check if the fan speed switch to low speed then off option is
+ enabled
+ conditions:
+ - '{{ include_fan_speed == ''fan_low_speed_enabled'' }}'
+ sequence:
+ - alias: Fan low speed OFF - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_low
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - alias: Check if the fan speed off option is enabled
+ conditions:
+ - '{{ include_fan_speed == ''fan_speed_off_enabled'' }}'
+ sequence:
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - sequence:
+ - choose:
+ - alias: Check if the lights are enabled
+ conditions:
+ - '{{ include_lights == ''lights_enabled'' }}'
+ sequence:
+ - choose:
+ - alias: If transition is selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_off_value }}'
+ - alias: If transition is not selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' not in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ - sequence:
+ - choose:
+ - alias: Check if the automation link is enabled
+ conditions:
+ - '{{ include_automation_link == ''enable_automation_link'' }}'
+ sequence:
+ - alias: Turn off the automation link
+ action: homeassistant.turn_off
+ target:
+ entity_id: !input automation_link
+ - alias: Check by-pass settings and preform the correct action
+ if:
+ - alias: Check if the by-pass auto off is enabled
+ condition: template
+ value_template: '{{ include_bypass_auto_off == ''bypass_auto_off_enabled''
+ }}'
+ then:
+ - alias: Wait the number of minutes set in the by-pass auto off time delay
+ delay:
+ minutes: !input bypass_auto_off_delay
+ - alias: Turn off the by-pass
+ action: homeassistant.turn_off
+ entity_id: !input by_pass
+ - stop: Stop the automation
+ - alias: By-pass is turned on & check by-pass option - keep the current fan state
+ conditions:
+ - condition: trigger
+ id: t5
+ - condition: template
+ value_template: '{{ include_bypass == ''bypass_enabled_stop'' }}'
+ sequence:
+ - choose:
+ - alias: Check if the manual trigger option is enabled and switch is on
+ conditions:
+ - '{{ (include_manual_trigger == ''enable_manual_trigger'') or (include_manual_trigger
+ == ''enable_manual_trigger_time_delay'') }}'
+ - '{{ expand(manual_trigger) | selectattr(''state'', ''=='', ''on'') | list
+ | count > 0 }}'
+ sequence:
+ - alias: Turn OFF manual trigger
+ action: homeassistant.turn_off
+ entity_id: !input manual_trigger
+ - choose:
+ - alias: Check if the manual fan switch option is enabled and switch is on
+ conditions:
+ - '{{ (include_manual_fan_switch == ''enable_manual_fan_switch'') or (include_manual_fan_switch
+ == ''enable_manual_fan_switch_auto_off'') }}'
+ - '{{ expand(manual_fan_switch) | selectattr(''state'', ''=='', ''on'')
+ | list | count > 0 }}'
+ sequence:
+ - alias: Turn OFF manual fan switch
+ action: homeassistant.turn_off
+ entity_id: !input manual_fan_switch
+ - alias: Check by-pass settings and preform the correct action
+ if:
+ - alias: Check if the by-pass auto off is enabled
+ condition: template
+ value_template: '{{ include_bypass_auto_off == ''bypass_auto_off_enabled''
+ }}'
+ then:
+ - alias: Wait the number of minutes set in the by-pass auto off time delay
+ delay:
+ minutes: !input bypass_auto_off_delay
+ - alias: Turn off the by-pass
+ action: homeassistant.turn_off
+ entity_id: !input by_pass
+ - stop: Stop the automation
+ else:
+ - stop: Stop the automation
+ - choose:
+ - alias: By-pass is turned off & check if the sensor is below falling humidity
+ conditions:
+ - condition: trigger
+ id: t6
+ sequence:
+ - choose:
+ - alias: Check if the manual trigger option is enabled and switch is on
+ conditions:
+ - '{{ (include_manual_trigger == ''enable_manual_trigger'') or (include_manual_trigger
+ == ''enable_manual_trigger_time_delay'') }}'
+ - '{{ expand(manual_trigger) | selectattr(''state'', ''=='', ''on'') | list
+ | count > 0 }}'
+ sequence:
+ - alias: Turn OFF manual trigger
+ action: homeassistant.turn_off
+ entity_id: !input manual_trigger
+ - choose:
+ - alias: Check if the manual fan switch option is enabled and switch is on
+ conditions:
+ - '{{ (include_manual_fan_switch == ''enable_manual_fan_switch'') or (include_manual_fan_switch
+ == ''enable_manual_fan_switch_auto_off'') }}'
+ - '{{ expand(manual_fan_switch) | selectattr(''state'', ''=='', ''on'')
+ | list | count > 0 }}'
+ sequence:
+ - alias: Turn OFF manual fan switch
+ action: homeassistant.turn_off
+ entity_id: !input manual_fan_switch
+ - choose:
+ - alias: Check by-pass options - turn fan off is enabled
+ conditions:
+ - condition: template
+ value_template: '{{ ''bypass_turn_fan_off'' in bypass_options }}'
+ sequence:
+ - alias: Parallel Actions for the fan and lights
+ parallel:
+ - sequence:
+ - alias: Turn off the fan
+ action: homeassistant.turn_off
+ target: !input fan_switch
+ - choose:
+ - alias: Check if the fan speed switch to low speed then off option
+ is enabled
+ conditions:
+ - '{{ include_fan_speed == ''fan_low_speed_enabled'' }}'
+ sequence:
+ - alias: Fan low speed OFF - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_low
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - alias: Check if the fan speed off option is enabled
+ conditions:
+ - '{{ include_fan_speed == ''fan_speed_off_enabled'' }}'
+ sequence:
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - sequence:
+ - choose:
+ - alias: Check if the lights are enabled
+ conditions:
+ - '{{ include_lights == ''lights_enabled'' }}'
+ sequence:
+ - choose:
+ - alias: If transition is selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_off_value }}'
+ - alias: If transition is not selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' not in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ - sequence:
+ - choose:
+ - alias: Check if the automation link is enabled
+ conditions:
+ - '{{ include_automation_link == ''enable_automation_link'' }}'
+ sequence:
+ - alias: Turn off the automation link
+ action: homeassistant.turn_off
+ target:
+ entity_id: !input automation_link
+ - stop: Stop the automation
+ - alias: Check if the sensor is below falling humidity & by-pass options -
+ turn fan off is disabled
+ conditions:
+ - alias: Check sensor is below falling
+ condition: numeric_state
+ entity_id: !input trigger
+ below: !input falling_humidity
+ - condition: not
+ conditions:
+ - condition: template
+ value_template: '{{ ''bypass_turn_fan_off'' in bypass_options }}'
+ sequence:
+ - alias: Parallel Actions for the fan and lights
+ parallel:
+ - sequence:
+ - alias: Wait the number of minutes that has been set for the time delay
+ delay:
+ minutes: !input time_delay
+ - alias: Turn off the fan
+ action: homeassistant.turn_off
+ target: !input fan_switch
+ - choose:
+ - alias: Check if the fan speed switch to low speed then off option
+ is enabled
+ conditions:
+ - '{{ include_fan_speed == ''fan_low_speed_enabled'' }}'
+ sequence:
+ - alias: Fan Speed - Switch Off - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_off
+ - alias: Fan low speed ON
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_low
+ - alias: Wait the number of minutes set in the low speed time delay
+ delay:
+ minutes: !input time_delay_low_speed
+ - alias: Fan low speed OFF - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_low
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - alias: Check if the fan speed off option is enabled
+ conditions:
+ - '{{ include_fan_speed == ''fan_speed_off_enabled'' }}'
+ sequence:
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - sequence:
+ - choose:
+ - alias: Check if the lights are enabled
+ conditions:
+ - '{{ include_lights == ''lights_enabled'' }}'
+ sequence:
+ - alias: Wait the number of minutes set in the lights time delay
+ delay:
+ minutes: !input light_time_delay
+ - choose:
+ - alias: If transition is selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_off_value }}'
+ - alias: If transition is not selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' not in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ - sequence:
+ - choose:
+ - alias: Check if the automation link is enabled
+ conditions:
+ - '{{ include_automation_link == ''enable_automation_link'' }}'
+ sequence:
+ - alias: Wait the number of minutes set in the automation link time
+ delay
+ delay:
+ minutes: !input automation_link_time_delay
+ - alias: Turn off the automation link
+ action: homeassistant.turn_off
+ target:
+ entity_id: !input automation_link
+ - stop: Stop the automation
+ - alias: Check if the sensor is above rising humidity & by-pass options -
+ turn fan off is disabled
+ conditions:
+ - alias: Check sensor is above rising
+ condition: numeric_state
+ entity_id: !input trigger
+ above: !input rising_humidity
+ - '{{ (expand(fan_switch.entity_id) | selectattr(''state'', ''=='', ''off'')
+ | list | count > 0 ) or ((include_lights == ''lights_enabled'') and (expand(light_switch.entity_id)
+ | selectattr(''state'', ''=='', ''off'') | list | count > 0)) or ((include_automation_link
+ == ''enable_automation_link'') and (expand(automation_link) | selectattr(''state'',
+ ''=='', ''off'') | list | count > 0)) }}'
+ - condition: not
+ conditions:
+ - condition: template
+ value_template: '{{ ''bypass_turn_fan_off'' in bypass_options }}'
+ sequence:
+ - alias: We need something here to continue
+ delay:
+ milliseconds: 10
+ default:
+ - alias: Wait until Humidity Derivative Sensor drops or it times out
+ wait_for_trigger:
+ - trigger: numeric_state
+ entity_id: !input trigger
+ below: !input falling_humidity
+ timeout:
+ minutes: !input time_out
+ - alias: Parallel Actions for the fan and lights
+ parallel:
+ - sequence:
+ - alias: Wait the number of minutes that has been set for the time delay
+ delay:
+ minutes: !input time_delay
+ - alias: Turn off the fan
+ action: homeassistant.turn_off
+ target: !input fan_switch
+ - choose:
+ - alias: Check if the fan speed switch to low speed then off option
+ is enabled
+ conditions:
+ - '{{ include_fan_speed == ''fan_low_speed_enabled'' }}'
+ sequence:
+ - alias: Fan Speed - Switch Off - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_off
+ - alias: Fan low speed ON
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_low
+ - alias: Wait the number of minutes set in the low speed time delay
+ delay:
+ minutes: !input time_delay_low_speed
+ - alias: Fan low speed OFF - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_low
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - alias: Check if the fan speed off option is enabled
+ conditions:
+ - '{{ include_fan_speed == ''fan_speed_off_enabled'' }}'
+ sequence:
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - sequence:
+ - choose:
+ - alias: Check if the lights are enabled
+ conditions:
+ - '{{ include_lights == ''lights_enabled'' }}'
+ sequence:
+ - alias: Wait the number of minutes set in the lights time delay
+ delay:
+ minutes: !input light_time_delay
+ - choose:
+ - alias: If transition is selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_off_value }}'
+ - alias: If transition is not selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' not in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ - sequence:
+ - choose:
+ - alias: Check if the automation link is enabled
+ conditions:
+ - '{{ include_automation_link == ''enable_automation_link'' }}'
+ sequence:
+ - alias: Wait the number of minutes set in the automation link time
+ delay
+ delay:
+ minutes: !input automation_link_time_delay
+ - alias: Turn off the automation link
+ action: homeassistant.turn_off
+ target:
+ entity_id: !input automation_link
+ - stop: Stop the automation
+ - choose:
+ - alias: Preform the manual fan switch option
+ conditions:
+ - condition: trigger
+ id: t7
+ sequence:
+ - choose:
+ - alias: Check if the manual trigger option is enabled and switch is on
+ conditions:
+ - '{{ (include_manual_trigger == ''enable_manual_trigger'') or (include_manual_trigger
+ == ''enable_manual_trigger_time_delay'') }}'
+ - '{{ expand(manual_trigger) | selectattr(''state'', ''=='', ''on'') | list
+ | count > 0 }}'
+ sequence:
+ - alias: Turn OFF manual trigger
+ action: homeassistant.turn_off
+ entity_id: !input manual_trigger
+ - choose:
+ - alias: Check if fan speeds are enabled
+ conditions:
+ - '{{ include_fan_speed == ''fan_low_speed_enabled'' }}'
+ sequence:
+ - alias: Fan Speed - Low Speed Switch - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_low
+ - choose:
+ - alias: Check if fan speeds are enabled
+ conditions:
+ - '{{ (include_fan_speed == ''fan_low_speed_enabled'') or (include_fan_speed
+ == ''fan_speed_off_enabled'')}}'
+ sequence:
+ - alias: Fan Speed - Switch Off - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_off
+ - alias: Turn on the fan
+ action: homeassistant.turn_on
+ target: !input fan_switch
+ - choose:
+ - alias: Check if manual fan switch auto off is enabled
+ conditions:
+ - '{{ include_manual_fan_switch == ''enable_manual_fan_switch_auto_off''
+ }}'
+ sequence:
+ - alias: Wait until manual fan switch is turned off or the time delay passes
+ wait_for_trigger:
+ - trigger: state
+ entity_id: !input manual_fan_switch
+ from: 'on'
+ to: 'off'
+ timeout:
+ minutes: !input manual_fan_switch_time_delay
+ - alias: Check if manual fan switch is enabled
+ conditions:
+ - '{{ include_manual_fan_switch == ''enable_manual_fan_switch'' }}'
+ sequence:
+ - alias: Wait until manual fan switch is turned off
+ wait_for_trigger:
+ - trigger: state
+ entity_id: !input manual_fan_switch
+ from: 'on'
+ to: 'off'
+ - alias: Parallel Actions for the fan, lights and automation link
+ parallel:
+ - sequence:
+ - alias: Turn off the fan
+ action: homeassistant.turn_off
+ target: !input fan_switch
+ - choose:
+ - alias: Check if the fan speed off option is enabled
+ conditions:
+ - '{{ (include_fan_speed == ''fan_low_speed_enabled'') or (include_fan_speed
+ == ''fan_speed_off_enabled'') }}'
+ sequence:
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - choose:
+ - alias: Check if the manual fan switch option is enabled and switch is
+ on
+ conditions:
+ - '{{ (include_manual_fan_switch == ''enable_manual_fan_switch'') or
+ (include_manual_fan_switch == ''enable_manual_fan_switch_auto_off'')
+ }}'
+ - '{{ expand(manual_fan_switch) | selectattr(''state'', ''=='', ''on'')
+ | list | count > 0 }}'
+ sequence:
+ - alias: Turn OFF manual fan switch
+ action: homeassistant.turn_off
+ entity_id: !input manual_fan_switch
+ - sequence:
+ - choose:
+ - alias: Check if the lights are enabled
+ conditions:
+ - '{{ ((include_lights == ''lights_enabled'') and (expand(light_switch.entity_id)
+ | selectattr(''state'', ''=='', ''on'') | list | count > 0)) }}'
+ sequence:
+ - choose:
+ - alias: If transition is selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_off_value }}'
+ - alias: If transition is not selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' not in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ - sequence:
+ - choose:
+ - alias: Check if the automation link is enabled
+ conditions:
+ - '{{ ((include_automation_link == ''enable_automation_link'') and (expand(automation_link)
+ | selectattr(''state'', ''=='', ''on'') | list | count > 0)) }}'
+ sequence:
+ - alias: Turn off the automation link
+ action: homeassistant.turn_off
+ target:
+ entity_id: !input automation_link
+ - stop: Stop the automation
+ - alias: Preform the manual trigger option
+ conditions:
+ - condition: trigger
+ id: t8
+ sequence:
+ - choose:
+ - alias: Check if the manual fan switch option is enabled and switch is on
+ conditions:
+ - '{{ (include_manual_fan_switch == ''enable_manual_fan_switch'') or (include_manual_fan_switch
+ == ''enable_manual_fan_switch_auto_off'') }}'
+ - '{{ expand(manual_fan_switch) | selectattr(''state'', ''=='', ''on'')
+ | list | count > 0 }}'
+ sequence:
+ - alias: Turn OFF manual fan switch
+ action: homeassistant.turn_off
+ entity_id: !input manual_fan_switch
+ - choose:
+ - alias: Check if the automation link is enabled
+ conditions:
+ - '{{ include_automation_link == ''enable_automation_link'' }}'
+ sequence:
+ - alias: Turn on the automation link
+ action: homeassistant.turn_on
+ target:
+ entity_id: !input automation_link
+ - choose:
+ - alias: Check if the lights are enabled
+ conditions:
+ - '{{ include_lights == ''lights_enabled'' }}'
+ sequence:
+ - choose:
+ - alias: Set the transition for the normal lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' in include_light_control)
+ and (''use_brightness'' not in include_light_control) and (''use_colour_temperature''
+ not in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_on_value }}'
+ - alias: Set the transition and brightness for the normal lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' in include_light_control)
+ and (''use_brightness'' in include_light_control) and (''use_colour_temperature''
+ not in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_on_value }}'
+ brightness_pct: '{{ brightness_value }}'
+ - alias: Set the transition and colour temperature for the normal lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' in include_light_control)
+ and (''use_brightness'' not in include_light_control) and (''use_colour_temperature''
+ in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_on_value }}'
+ color_temp_kelvin: '{{temperature_value}}'
+ - alias: Set the transition, brightness and colour temperature for the
+ normal lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' in include_light_control)
+ and (''use_brightness'' in include_light_control) and (''use_colour_temperature''
+ in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_on_value }}'
+ brightness_pct: '{{ brightness_value }}'
+ color_temp_kelvin: '{{temperature_value}}'
+ - alias: Set the brightness for the normal lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' not in include_light_control)
+ and (''use_brightness'' in include_light_control) and (''use_colour_temperature''
+ not in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ brightness_pct: '{{ brightness_value }}'
+ - alias: Set the colour temperature for the normal lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' not in include_light_control)
+ and (''use_brightness'' not in include_light_control) and (''use_colour_temperature''
+ in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ color_temp_kelvin: '{{temperature_value}}'
+ - alias: Set the brightness and colour temperature for the normal lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' not in include_light_control)
+ and (''use_brightness'' in include_light_control) and (''use_colour_temperature''
+ in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ brightness_pct: '{{ brightness_value }}'
+ color_temp_kelvin: '{{temperature_value}}'
+ - alias: Set the default for the normal lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' not in include_light_control)
+ and (''use_brightness'' not in include_light_control) and (''use_colour_temperature''
+ not in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ - choose:
+ - alias: Check if fan speeds are enabled
+ conditions:
+ - '{{ include_fan_speed == ''fan_low_speed_enabled'' }}'
+ sequence:
+ - alias: Fan Speed - Low Speed Switch - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_low
+ - choose:
+ - alias: Check if fan speeds are enabled
+ conditions:
+ - '{{ (include_fan_speed == ''fan_low_speed_enabled'') or (include_fan_speed
+ == ''fan_speed_off_enabled'') }}'
+ sequence:
+ - alias: Fan Speed - Switch Off - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_off
+ - alias: Turn on the fan
+ action: homeassistant.turn_on
+ target: !input fan_switch
+ - choose:
+ - alias: Check manual trigger with safeguard is selected
+ conditions:
+ - '{{ include_manual_trigger == ''enable_manual_trigger'' }}'
+ sequence:
+ - alias: Wait until manual trigger is turned off or the safeguard has passes
+ wait_for_trigger:
+ - trigger: state
+ entity_id: !input manual_trigger
+ from: 'on'
+ to: 'off'
+ timeout:
+ minutes: !input time_out
+ - choose:
+ - alias: Check if the manual trigger switch is ON and turn it OFF
+ conditions:
+ - '{{ expand(manual_trigger) | selectattr(''state'', ''=='', ''on'')
+ | list | count > 0 }}'
+ sequence:
+ - alias: Turn OFF the manual trigger
+ action: homeassistant.turn_off
+ entity_id: !input manual_trigger
+ - alias: Check manual trigger with time delay is selected
+ conditions:
+ - '{{ include_manual_trigger == ''enable_manual_trigger_time_delay'' }}'
+ sequence:
+ - alias: Wait until manual trigger is turned off or the time delay has passes
+ wait_for_trigger:
+ - trigger: state
+ entity_id: !input manual_trigger
+ from: 'on'
+ to: 'off'
+ timeout:
+ minutes: !input manual_trigger_default_time_delay
+ - choose:
+ - alias: Check if the manual trigger switch is ON and turn it OFF
+ conditions:
+ - '{{ expand(manual_trigger) | selectattr(''state'', ''=='', ''on'')
+ | list | count > 0 }}'
+ sequence:
+ - alias: Turn OFF the manual trigger
+ action: homeassistant.turn_off
+ entity_id: !input manual_trigger
+ - alias: Parallel Actions for the fan, lights and automation link
+ parallel:
+ - sequence:
+ - alias: Wait until the time delay has passes
+ delay:
+ minutes: !input time_delay
+ - alias: Turn off the fan
+ action: homeassistant.turn_off
+ target: !input fan_switch
+ - choose:
+ - alias: Check if the fan speed switch to low speed then off option is
+ enabled
+ conditions:
+ - '{{ include_fan_speed == ''fan_low_speed_enabled'' }}'
+ sequence:
+ - alias: Fan Speed - Switch Off - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_off
+ - alias: Fan low speed ON
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_low
+ - alias: Wait until the low speed time delay passes
+ delay:
+ minutes: !input time_delay_low_speed
+ - alias: Fan low speed OFF - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_low
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - alias: Check if the fan speed off option is enabled
+ conditions:
+ - '{{ include_fan_speed == ''fan_speed_off_enabled'' }}'
+ sequence:
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - sequence:
+ - choose:
+ - alias: Check if the lights are enabled and the lights are ON
+ conditions:
+ - '{{ ((include_lights == ''lights_enabled'') and (expand(light_switch.entity_id)
+ | selectattr(''state'', ''=='', ''on'') | list | count > 0)) }}'
+ sequence:
+ - alias: Wait until the light time delay has passes
+ delay:
+ minutes: !input light_time_delay
+ - choose:
+ - alias: If transition is selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_off_value }}'
+ - alias: If transition is not selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' not in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ - sequence:
+ - choose:
+ - alias: Check if the automation link is enabled
+ conditions:
+ - '{{ ((include_automation_link == ''enable_automation_link'') and (expand(automation_link)
+ | selectattr(''state'', ''=='', ''on'') | list | count > 0)) }}'
+ sequence:
+ - alias: Wait until the automation link time delay has passes
+ delay:
+ minutes: !input automation_link_time_delay
+ - alias: Turn off the automation link
+ action: homeassistant.turn_off
+ target:
+ entity_id: !input automation_link
+ - stop: Stop the automation
+ - choose:
+ - alias: Safeguard when HA restarts
+ conditions:
+ - condition: trigger
+ id: t2
+ sequence:
+ - choose:
+ - alias: Check manual trigger with safeguard is selected and manual trigger
+ is ON
+ conditions:
+ - '{{ include_manual_trigger == ''enable_manual_trigger'' }}'
+ - '{{ expand(manual_trigger) | selectattr(''state'', ''=='', ''on'') | list
+ | count > 0 }}'
+ sequence:
+ - alias: Wait until manual trigger is turned off or the safeguard has passes
+ wait_for_trigger:
+ - trigger: state
+ entity_id: !input manual_trigger
+ from: 'on'
+ to: 'off'
+ timeout:
+ minutes: !input time_out
+ - choose:
+ - alias: Check if the manual trigger switch is on and turn it OFF
+ conditions:
+ - '{{ expand(manual_trigger) | selectattr(''state'', ''=='', ''on'')
+ | list | count > 0 }}'
+ sequence:
+ - alias: Turn OFF the manual trigger
+ action: homeassistant.turn_off
+ entity_id: !input manual_trigger
+ - alias: Check manual trigger with time delay is selected and manual trigger
+ is ON
+ conditions:
+ - '{{ include_manual_trigger == ''enable_manual_trigger_time_delay'' }}'
+ - '{{ expand(manual_trigger) | selectattr(''state'', ''=='', ''on'') | list
+ | count > 0 }}'
+ sequence:
+ - alias: Wait until manual trigger is turned off or the time delay has passes
+ wait_for_trigger:
+ - trigger: state
+ entity_id: !input manual_trigger
+ from: 'on'
+ to: 'off'
+ timeout:
+ minutes: !input manual_trigger_default_time_delay
+ - choose:
+ - alias: Check if the manual trigger switch is on and turn it OFF
+ conditions:
+ - '{{ expand(manual_trigger) | selectattr(''state'', ''=='', ''on'')
+ | list | count > 0 }}'
+ sequence:
+ - alias: Turn OFF the manual trigger
+ action: homeassistant.turn_off
+ entity_id: !input manual_trigger
+ - choose:
+ - alias: Check manual fan switch is enabled and manual switch is ON
+ conditions:
+ - alias: Check if the humidity derivative sensor is above falling humidity
+ set point and fan / lights are on
+ condition: template
+ value_template: '{{ include_manual_fan_switch == ''enable_manual_fan_switch_auto_off''
+ or include_manual_fan_switch == ''enable_manual_fan_switch'' }}'
+ - '{{ expand(manual_fan_switch) | selectattr(''state'', ''=='', ''on'')
+ | list | count > 0 }}'
+ sequence:
+ - choose:
+ - alias: Check if manual fan switch is enabled
+ conditions:
+ - '{{ include_manual_fan_switch == ''enable_manual_fan_switch'' }}'
+ sequence:
+ - alias: Wait until manual fan switch is turned off
+ wait_for_trigger:
+ - trigger: state
+ entity_id: !input manual_fan_switch
+ from: 'on'
+ to: 'off'
+ - alias: Check if manual fan switch auto off is enabled
+ conditions:
+ - '{{ include_manual_fan_switch == ''enable_manual_fan_switch_auto_off''
+ }}'
+ sequence:
+ - alias: Wait until manual fan switch is turned off or the time delay
+ passes
+ wait_for_trigger:
+ - trigger: state
+ entity_id: !input manual_fan_switch
+ from: 'on'
+ to: 'off'
+ timeout:
+ minutes: !input manual_fan_switch_time_delay
+ - alias: Parallel Actions for the fan, lights and automation link
+ parallel:
+ - sequence:
+ - alias: Turn off the fan
+ action: homeassistant.turn_off
+ target: !input fan_switch
+ - choose:
+ - alias: Check if the fan speed off option is enabled
+ conditions:
+ - '{{ (include_fan_speed == ''fan_low_speed_enabled'') or (include_fan_speed
+ == ''fan_speed_off_enabled'') }}'
+ sequence:
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - choose:
+ - alias: Check if the manual fan switch option is enabled and switch
+ is on
+ conditions:
+ - '{{ (include_manual_fan_switch == ''enable_manual_fan_switch'')
+ or (include_manual_fan_switch == ''enable_manual_fan_switch_auto_off'')
+ }}'
+ - '{{ expand(manual_fan_switch) | selectattr(''state'', ''=='',
+ ''on'') | list | count > 0 }}'
+ sequence:
+ - alias: Turn OFF manual fan switch
+ action: homeassistant.turn_off
+ entity_id: !input manual_fan_switch
+ - sequence:
+ - choose:
+ - alias: Check if the lights are enabled
+ conditions:
+ - '{{ ((include_lights == ''lights_enabled'') and (expand(light_switch.entity_id)
+ | selectattr(''state'', ''=='', ''on'') | list | count > 0)) }}'
+ sequence:
+ - choose:
+ - alias: If transition is selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_off_value }}'
+ - alias: If transition is not selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' not in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ - sequence:
+ - choose:
+ - alias: Check if the automation link is enabled
+ conditions:
+ - '{{ ((include_automation_link == ''enable_automation_link'') and
+ (expand(automation_link) | selectattr(''state'', ''=='', ''on'')
+ | list | count > 0)) }}'
+ sequence:
+ - alias: Turn off the automation link
+ action: homeassistant.turn_off
+ target:
+ entity_id: !input automation_link
+ - stop: Stop the automation
+ - alias: Check automation and preform the correct action
+ conditions:
+ - alias: Check if the humidity derivative sensor is below falling humidity
+ set point and fan / lights are on
+ condition: numeric_state
+ entity_id: !input trigger
+ below: !input falling_humidity
+ - '{{ (expand(fan_switch.entity_id) | selectattr(''state'', ''=='', ''on'')
+ | list | count > 0) or ((include_fan_speed == ''fan_low_speed_enabled'')
+ and (expand(fan_speed_low) | selectattr(''state'', ''=='', ''on'') | list
+ | count > 0)) or ((include_lights == ''lights_enabled'') and (expand(light_switch.entity_id)
+ | selectattr(''state'', ''=='', ''on'') | list | count > 0)) or ((include_automation_link
+ == ''enable_automation_link'') and (expand(automation_link) | selectattr(''state'',
+ ''=='', ''on'') | list | count > 0)) }}'
+ sequence:
+ - choose:
+ - alias: Check if the by-pass auto off is enabled and by-pass is ON
+ conditions:
+ - condition: template
+ value_template: '{{ (include_bypass_auto_off == ''bypass_auto_off_enabled'')
+ and (states[by_pass].state == ''on'') }}'
+ sequence:
+ - alias: Wait the number of minutes set in the by-pass auto off time
+ delay
+ delay:
+ minutes: !input bypass_auto_off_delay
+ - alias: Turn off the by-pass
+ action: homeassistant.turn_off
+ entity_id: !input by_pass
+ - stop: Stop the automation
+ - alias: Parallel Actions for the fan and lights
+ parallel:
+ - sequence:
+ - alias: Wait the number of minutes that has been set for the time delay
+ delay:
+ minutes: !input time_delay
+ - alias: Turn off the fan
+ action: homeassistant.turn_off
+ target: !input fan_switch
+ - choose:
+ - alias: Check if the fan speed switch to low speed then off option
+ is enabled
+ conditions:
+ - '{{ include_fan_speed == ''fan_low_speed_enabled'' }}'
+ sequence:
+ - alias: Fan Speed - Switch Off - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_off
+ - alias: Fan low speed ON
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_low
+ - alias: Wait the number of minutes set in the low speed time delay
+ delay:
+ minutes: !input time_delay_low_speed
+ - alias: Fan low speed OFF - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_low
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - alias: Check if the fan speed off option is enabled
+ conditions:
+ - '{{ include_fan_speed == ''fan_speed_off_enabled'' }}'
+ sequence:
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - sequence:
+ - choose:
+ - alias: Check if the lights are enabled
+ conditions:
+ - '{{ include_lights == ''lights_enabled'' }}'
+ sequence:
+ - alias: Wait the number of minutes set in the lights time delay
+ delay:
+ minutes: !input light_time_delay
+ - choose:
+ - alias: If transition is selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_off_value }}'
+ - alias: If transition is not selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' not in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ - sequence:
+ - choose:
+ - alias: Check if the automation link is enabled
+ conditions:
+ - '{{ include_automation_link == ''enable_automation_link'' }}'
+ sequence:
+ - alias: Wait the number of minutes set in the automation link time
+ delay
+ delay:
+ minutes: !input automation_link_time_delay
+ - alias: Turn off the automation link
+ action: homeassistant.turn_off
+ target:
+ entity_id: !input automation_link
+ - stop: Stop the automation
+ - alias: Check automation and preform the correct action
+ conditions:
+ - alias: Check if the humidity derivative sensor is above falling humidity
+ set point and fan / lights are on
+ condition: numeric_state
+ entity_id: !input trigger
+ above: !input rising_humidity
+ - '{{ (expand(fan_switch.entity_id) | selectattr(''state'', ''=='', ''on'')
+ | list | count > 0) or ((include_fan_speed == ''fan_low_speed_enabled'')
+ and (expand(fan_speed_low) | selectattr(''state'', ''=='', ''on'') | list
+ | count > 0)) }}'
+ - '{{ ((include_lights == ''lights_enabled'') and (expand(light_switch.entity_id)
+ | selectattr(''state'', ''=='', ''on'') | list | count > 0)) or (include_lights
+ == ''lights_disabled'') }}'
+ - '{{ ((include_automation_link == ''enable_automation_link'') and (expand(automation_link)
+ | selectattr(''state'', ''=='', ''on'') | list | count > 0)) or (include_automation_link
+ == ''disable_automation_link'') }}'
+ sequence:
+ - choose:
+ - alias: Check if the by-pass auto off is enabled and by-pass is ON
+ conditions:
+ - condition: template
+ value_template: '{{ (include_bypass_auto_off == ''bypass_auto_off_enabled'')
+ and (states[by_pass].state == ''on'') }}'
+ sequence:
+ - alias: Wait the number of minutes set in the by-pass auto off time
+ delay
+ delay:
+ minutes: !input bypass_auto_off_delay
+ - alias: Turn off the by-pass
+ action: homeassistant.turn_off
+ entity_id: !input by_pass
+ - stop: Stop the automation
+ - alias: Wait until Humidity Derivative Sensor drops or it times out
+ wait_for_trigger:
+ - trigger: numeric_state
+ entity_id: !input trigger
+ below: !input falling_humidity
+ timeout:
+ minutes: !input time_out
+ - alias: Parallel Actions for the fan and lights
+ parallel:
+ - sequence:
+ - alias: Wait the number of minutes that has been set for the time delay
+ delay:
+ minutes: !input time_delay
+ - alias: Turn off the fan
+ action: homeassistant.turn_off
+ target: !input fan_switch
+ - choose:
+ - alias: Check if the fan speed switch to low speed then off option
+ is enabled
+ conditions:
+ - '{{ include_fan_speed == ''fan_low_speed_enabled'' }}'
+ sequence:
+ - alias: Fan Speed - Switch Off - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_off
+ - alias: Fan low speed ON
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_low
+ - alias: Wait the number of minutes set in the low speed time delay
+ delay:
+ minutes: !input time_delay_low_speed
+ - alias: Fan low speed OFF - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_low
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - alias: Check if the fan speed off option is enabled
+ conditions:
+ - '{{ include_fan_speed == ''fan_speed_off_enabled'' }}'
+ sequence:
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - sequence:
+ - choose:
+ - alias: Check if the lights are enabled
+ conditions:
+ - '{{ include_lights == ''lights_enabled'' }}'
+ sequence:
+ - alias: Wait the number of minutes set in the lights time delay
+ delay:
+ minutes: !input light_time_delay
+ - choose:
+ - alias: If transition is selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_off_value }}'
+ - alias: If transition is not selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' not in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ - sequence:
+ - choose:
+ - alias: Check if the automation link is enabled
+ conditions:
+ - '{{ include_automation_link == ''enable_automation_link'' }}'
+ sequence:
+ - alias: Wait the number of minutes set in the automation link time
+ delay
+ delay:
+ minutes: !input automation_link_time_delay
+ - alias: Turn off the automation link
+ action: homeassistant.turn_off
+ target:
+ entity_id: !input automation_link
+ - stop: Stop the automation
+ - choose:
+ - alias: Check if the manual trigger option is enabled and switch is on
+ conditions:
+ - '{{ (include_manual_trigger == ''enable_manual_trigger'') or (include_manual_trigger
+ == ''enable_manual_trigger_time_delay'') }}'
+ - '{{ expand(manual_trigger) | selectattr(''state'', ''=='', ''on'') | list
+ | count > 0 }}'
+ sequence:
+ - alias: Turn OFF manual trigger
+ action: homeassistant.turn_off
+ entity_id: !input manual_trigger
+ - choose:
+ - alias: Check if the manual fan switch option is enabled and switch is on
+ conditions:
+ - '{{ (include_manual_fan_switch == ''enable_manual_fan_switch'') or (include_manual_fan_switch
+ == ''enable_manual_fan_switch_auto_off'') }}'
+ - '{{ expand(manual_fan_switch) | selectattr(''state'', ''=='', ''on'') | list
+ | count > 0 }}'
+ sequence:
+ - alias: Turn OFF manual fan switch
+ action: homeassistant.turn_off
+ entity_id: !input manual_fan_switch
+ - choose:
+ - alias: Check if fan speeds are enabled
+ conditions:
+ - '{{ include_fan_speed == ''fan_low_speed_enabled'' }}'
+ sequence:
+ - alias: Fan Speed - Low Speed Switch - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_low
+ - choose:
+ - alias: Check if fan speeds are enabled
+ conditions:
+ - '{{ (include_fan_speed == ''fan_low_speed_enabled'') or (include_fan_speed
+ == ''fan_speed_off_enabled'')}}'
+ sequence:
+ - alias: Fan Speed - Switch Off - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_off
+ - alias: Turn on the fan
+ action: homeassistant.turn_on
+ target: !input fan_switch
+ - choose:
+ - alias: Check if the lights are enabled
+ conditions:
+ - '{{ include_lights == ''lights_enabled'' }}'
+ sequence:
+ - choose:
+ - alias: Set the transition for the normal lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' in include_light_control) and
+ (''use_brightness'' not in include_light_control) and (''use_colour_temperature''
+ not in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_on_value }}'
+ - alias: Set the transition and brightness for the normal lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' in include_light_control) and
+ (''use_brightness'' in include_light_control) and (''use_colour_temperature''
+ not in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_on_value }}'
+ brightness_pct: '{{ brightness_value }}'
+ - alias: Set the transition and colour temperature for the normal lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' in include_light_control) and
+ (''use_brightness'' not in include_light_control) and (''use_colour_temperature''
+ in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_on_value }}'
+ color_temp_kelvin: '{{temperature_value}}'
+ - alias: Set the transition, brightness and colour temperature for the normal
+ lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' in include_light_control) and
+ (''use_brightness'' in include_light_control) and (''use_colour_temperature''
+ in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_on_value }}'
+ brightness_pct: '{{ brightness_value }}'
+ color_temp_kelvin: '{{temperature_value}}'
+ - alias: Set the brightness for the normal lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' not in include_light_control)
+ and (''use_brightness'' in include_light_control) and (''use_colour_temperature''
+ not in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ brightness_pct: '{{ brightness_value }}'
+ - alias: Set the colour temperature for the normal lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' not in include_light_control)
+ and (''use_brightness'' not in include_light_control) and (''use_colour_temperature''
+ in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ color_temp_kelvin: '{{temperature_value}}'
+ - alias: Set the brightness and colour temperature for the normal lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' not in include_light_control)
+ and (''use_brightness'' in include_light_control) and (''use_colour_temperature''
+ in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ brightness_pct: '{{ brightness_value }}'
+ color_temp_kelvin: '{{temperature_value}}'
+ - alias: Set the default for the normal lights
+ conditions:
+ - condition: template
+ value_template: '{{ (''use_transition'' not in include_light_control)
+ and (''use_brightness'' not in include_light_control) and (''use_colour_temperature''
+ not in include_light_control) }}'
+ sequence:
+ - action: light.turn_on
+ target:
+ entity_id: '{{ light_entities }}'
+ - choose:
+ - alias: Check if the automation link is enabled
+ conditions:
+ - '{{ include_automation_link == ''enable_automation_link'' }}'
+ sequence:
+ - alias: Turn on the automation link
+ action: homeassistant.turn_on
+ target:
+ entity_id: !input automation_link
+ - choose:
+ - alias: By-pass is enabled & check by-pass option - turn fan on
+ conditions:
+ - condition: trigger
+ id: t5
+ - condition: template
+ value_template: '{{ include_bypass == ''bypass_enabled_turn_on'' }}'
+ sequence:
+ - alias: Check by-pass settings and preform the correct action
+ if:
+ - alias: Check if the by-pass auto off is enabled
+ condition: template
+ value_template: '{{ include_bypass_auto_off == ''bypass_auto_off_enabled''
+ }}'
+ then:
+ - alias: Wait the number of minutes set in the by-pass auto off time delay
+ delay:
+ minutes: !input bypass_auto_off_delay
+ - alias: Turn off the by-pass
+ action: homeassistant.turn_off
+ entity_id: !input by_pass
+ - stop: Stop the automation
+ else:
+ - stop: Stop the automation
+ - alias: Wait until Humidity Derivative Sensor drops or it times out
+ wait_for_trigger:
+ - trigger: numeric_state
+ entity_id: !input trigger
+ below: !input falling_humidity
+ timeout:
+ minutes: !input time_out
+ - alias: Parallel Actions for the fan and lights
+ parallel:
+ - sequence:
+ - alias: Wait the number of minutes that has been set for the time delay
+ delay:
+ minutes: !input time_delay
+ - alias: Turn off the fan
+ action: homeassistant.turn_off
+ target: !input fan_switch
+ - choose:
+ - alias: Check if the fan speed switch to low speed then off option is enabled
+ conditions:
+ - '{{ include_fan_speed == ''fan_low_speed_enabled'' }}'
+ sequence:
+ - alias: Fan low speed ON
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_low
+ - alias: Wait the number of minutes set in the low speed time delay
+ delay:
+ minutes: !input time_delay_low_speed
+ - alias: Fan low speed OFF - Safeguard
+ action: homeassistant.turn_off
+ entity_id: !input fan_speed_low
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - alias: Check if the fan speed off option is enabled
+ conditions:
+ - '{{ include_fan_speed == ''fan_speed_off_enabled'' }}'
+ sequence:
+ - alias: Fan off speed
+ action: homeassistant.turn_on
+ entity_id: !input fan_speed_off
+ - sequence:
+ - choose:
+ - alias: Check if the lights are enabled
+ conditions:
+ - '{{ include_lights == ''lights_enabled'' }}'
+ sequence:
+ - alias: Wait the number of minutes set in the lights time delay
+ delay:
+ minutes: !input light_time_delay
+ - choose:
+ - alias: If transition is selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' in include_light_control }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ data:
+ transition: '{{ transition_off_value }}'
+ - alias: If transition is not selected
+ conditions:
+ - condition: template
+ value_template: '{{ ''use_transition'' not in include_light_control
+ }}'
+ sequence:
+ - alias: Turn off the lights
+ action: light.turn_off
+ target:
+ entity_id: '{{ light_entities }}'
+ - sequence:
+ - choose:
+ - alias: Check if the automation link is enabled
+ conditions:
+ - '{{ include_automation_link == ''enable_automation_link'' }}'
+ sequence:
+ - alias: Wait the number of minutes set in the automation link time delay
+ delay:
+ minutes: !input automation_link_time_delay
+ - alias: Turn off the automation link
+ action: homeassistant.turn_off
+ target:
+ entity_id: !input automation_link
diff --git a/components/binary_sensors/rooms/master_bathroom_occupied.yaml b/components/binary_sensors/rooms/master_bathroom_occupied.yaml
index 6f91130..d9f6381 100644
--- a/components/binary_sensors/rooms/master_bathroom_occupied.yaml
+++ b/components/binary_sensors/rooms/master_bathroom_occupied.yaml
@@ -30,12 +30,6 @@ observations:
prob_given_false: 0.01
to_state: 'on'
- # - platform: template
- # value_template: >
- # {{ states('sensor.master_bathroom_thermostat_humidity') | float(default=0) - states('sensor.master_bedroom_multisensor_humidity') | float(default=0) > 30 }}
- # prob_given_true: 0.99
- # prob_given_false: 0.01
-
# - entity_id: input_boolean.home_occupied
# platform: state
# prob_given_true: .01
diff --git a/components/binary_sensors/template.yaml b/components/binary_sensors/template.yaml
index 973907f..87a9fd1 100644
--- a/components/binary_sensors/template.yaml
+++ b/components/binary_sensors/template.yaml
@@ -136,18 +136,17 @@ sensors:
friendly_name: Bathroom Getting Humid
delay_off:
minutes: 5
- #value_template: "{{ is_state('binary_sensor.trend_bathroom_humidity','on') or states('sensor.master_bathroom_thermostat_humidity') | int(default=0) - states('sensor.master_bedroom_multisensor_humidity') | int(default=100) > 5}}"
- value_template: "{{ states('sensor.master_bathroom_thermostat_humidity') | float(default=0) - states('sensor.upstairs_mean_humidity') | float(default=100) > 10 }}"
+ value_template: "{{ states('sensor.bathroom_multisensor_relative_humidity') | float(default=0) - states('sensor.upstairs_mean_humidity') | float(default=100) > 10 }}"
icon_template: >
- {% if states('sensor.master_bathroom_thermostat_humidity') | float(default=0) - states('sensor.upstairs_mean_humidity') | float(default=100) > 10 %}
+ {% if states('sensor.bathroom_multisensor_relative_humidity') | float(default=0) - states('sensor.upstairs_mean_humidity') | float(default=100) > 10 %}
mdi:water-percent
{% else %}
mdi:water-off
{% endif %}
attribute_templates:
- room_humidity: "{{ states('sensor.master_bathroom_thermostat_humidity') | float(default=0) }}"
+ room_humidity: "{{ states('sensor.bathroom_multisensor_relative_humidity') | float(default=0) }}"
mean_humidity: "{{ states('sensor.upstairs_mean_humidity') | float(default=0) }}"
- difference: "{{ states('sensor.master_bathroom_thermostat_humidity') | float(default=0) - states('sensor.upstairs_mean_humidity') | float(default=0) }}"
+ difference: "{{ states('sensor.bathroom_multisensor_relative_humidity') | float(default=0) - states('sensor.upstairs_mean_humidity') | float(default=0) }}"
utility_room_getting_humid:
unique_id: templatebinarysensor.utility_room_getting_humid
@@ -584,7 +583,7 @@ sensors:
mancave_light_left_on:
unique_id: templatebinarysensor.mancave_light_left_on
friendly_name: Mancave Light Left On
- value_template: "{{ is_state('light.mancave','on') }}"
+ value_template: "{{ is_state('light.mancave','on') and is_state('input_boolean.mancave_occupied','off') }}"
delay_on:
seconds: 30
@@ -687,7 +686,7 @@ sensors:
need_salt:
unique_id: templatebinarysensor.need_salt
friendly_name: Need Salt
- value_template: "{{ is_state('binary_sensor.water_softener_multisensor_status', 'on') and is_state('sensor.water_softener_multisensor_salt_level_in_bags','0') }}"
+ value_template: "{{ is_state('binary_sensor.furnace_room_multisensor_status', 'on') and is_state('sensor.furnace_room_multisensor_salt_level_in_bags','1') }}"
icon_template: mdi:shaker-outline
delay_on:
seconds: 900
diff --git a/components/packages/camera_casting.yaml b/components/packages/camera_casting.yaml
index 78b1935..78f1f1a 100644
--- a/components/packages/camera_casting.yaml
+++ b/components/packages/camera_casting.yaml
@@ -82,25 +82,25 @@ script:
# {% endif %}
# url: >
# {% if is_state('input_select.camera_dropdown', 'Boys Room') %}
- # rtsp://192.168.1.11:8554/rtsp_cam01_sub
+ # rtsp://192.168.1.11:8554/cam01_sub_opus
# {% elif is_state('input_select.camera_dropdown', 'Kitchen') %}
- # rtsp://192.168.1.11:8554/rtsp_cam12_sub
+ # rtsp://192.168.1.11:8554/cam12_sub_opus
# {% elif is_state('input_select.camera_dropdown', 'Computer Area') %}
- # rtsp://192.168.1.11:8554/rtsp_cam03_sub
+ # rtsp://192.168.1.11:8554/cam03_sub_opus
# {% elif is_state('input_select.camera_dropdown', 'Garage') %}
- # rtsp://192.168.1.11:8554/rtsp_cam04_sub
+ # rtsp://192.168.1.11:8554/cam04_sub_opus
# {% elif is_state('input_select.camera_dropdown', 'Master Bedroom') %}
- # rtsp://192.168.1.11:8554/rtsp_cam06_sub
+ # rtsp://192.168.1.11:8554/cam06_sub_opus
# {% elif is_state('input_select.camera_dropdown', 'Nursery') %}
- # rtsp://192.168.1.11:8554/rtsp_cam08_sub
+ # rtsp://192.168.1.11:8554/cam08_sub_opus
# {% elif is_state('input_select.camera_dropdown', 'Back Yard') %}
- # rtsp://192.168.1.11:8554/rtsp_cam14_sub
+ # rtsp://192.168.1.11:8554/cam14_sub_opus
# {% elif is_state('input_select.camera_dropdown', 'Front Yard') %}
- # rtsp://192.168.1.11:8554/rtsp_cam18_sub
+ # rtsp://192.168.1.11:8554/cam18_sub_opus
# {% elif is_state('input_select.camera_dropdown', 'Front Door') %}
- # rtsp://192.168.1.11:8554/rtsp_cam19_sub
+ # rtsp://192.168.1.11:8554/cam19_sub_opus
# {% elif is_state('input_select.camera_dropdown', 'Front Room') %}
- # rtsp://192.168.1.11:8554/rtsp_cam13_sub
+ # rtsp://192.168.1.11:8554/cam13_sub_opus
# {% endif %}
# force: true
# extra:
diff --git a/components/packages/esphome_devices.yaml b/components/packages/esphome_devices.yaml
index ce38cd9..ff15a38 100644
--- a/components/packages/esphome_devices.yaml
+++ b/components/packages/esphome_devices.yaml
@@ -48,4 +48,11 @@ template:
state: "{{ states.update | selectattr('state', 'eq', 'on') | map(attribute='entity_id') | select ('in',integration_entities('esphome')) | list | count }}"
icon: mdi:chip
attributes:
- devices: "{{ states.update | selectattr('state', 'eq', 'on') | map(attribute='entity_id') | select ('in',integration_entities('esphome')) | list }}"
\ No newline at end of file
+ devices: "{{ states.update | selectattr('state', 'eq', 'on') | map(attribute='entity_id') | select ('in',integration_entities('esphome')) | list }}"
+
+ - name: ESPHome Offline Devices
+ unique_id: c17e967e-e3ff-42dd-a85c-a5c1d1e9ae63
+ state: "{{ integration_entities('esphome') | select('search', 'status') | select('is_state', 'off') | list | count }}"
+ icon: mdi:chip
+ attributes:
+ devices: "{{ integration_entities('esphome') | select('search', 'status') | select('is_state', 'off') | list }}"
\ No newline at end of file
diff --git a/esphome/archive/circuit-sensor.yaml b/esphome/archive/circuit-sensor.yaml
new file mode 100644
index 0000000..6e84176
--- /dev/null
+++ b/esphome/archive/circuit-sensor.yaml
@@ -0,0 +1,798 @@
+substitutions:
+ devicename: circuit-sensor
+ entity_name: circuit_sensor
+ friendly_name: Circuit Sensor
+ board: esp32-s3-devkitc-1
+ framework: esp-idf
+ comment: Clever ${friendly_name}
+ name_prefix: 'PM:'
+ static_ip: !secret circuit-sensor-ip
+ update_time: 500ms
+ kwh_report_interval: 60s
+ watt_heartbeat: 60s
+ throttle_time: 60s
+ watt_delta: "50.0"
+ grid_watt_delta: "200.0"
+
+# Current Transformer Names
+ ct01Name: 'Grid Phase A'
+ ct04Name: 'Grid Phase B'
+
+ ct22Name: 'Well' # 1, 3 # sct010 - O
+ ct12Name: 'Kitchen 1' # 5 # sct006 - L
+ ct16Name: 'Kitchen 2' # 7 # sct006 - S
+ ct18Name: 'Laundry Plug' # 9 # sct006 - N
+ ct08Name: 'Microwave Plug' # 11 # sct006 - H
+ ct17Name: 'Bathroom Plug' # 13 # sct006 - R
+ ct11Name: 'Heat Pump' # 15, 17 - M
+ ct24Name: 'Basement Bedroom and Furnace Room Lights' # 19 # sct006 - K
+ ct05Name: 'Basement Plugs' # 21a # sct006 - E
+ ct23Name: 'Basement and Laundry Lights and Plugs' # 21b # sct006 - W
+ ct07Name: 'Sump Pump Plug' # 23 # sct006 - C
+
+ ct06Name: 'Nursery, Dining, Kitchen Lights' # 2 # sct006 - F
+ ct20Name: 'Master Suite' # 4 # sct006 - T
+ ct03Name: 'Furnace' # 6 # sct006 - D
+ ct15Name: 'Basement Stairs and Lights' # 8 # sct006 - P
+ ct21Name: 'Dishwasher' # 10 # sct006 - V
+ ct13Name: 'Garage Outside and Front Garage Lights' # 12 # sct006 - U
+ ct10Name: 'Front Room Plugs' # 14 # sct006 - J
+ ct14Name: 'Garage and Outside Plugs' # 16 # sct006 - Q
+ ct09Name: 'Stove' # 18, 20 # sct016 - I
+ ct02Name: 'Dryer' # 22, 24 # sct010 - G
+
+ ct19Name: 'Unused'
+
+# Current Transformers:
+ sct006: '11143'
+ sct010: '41660'
+ sct013: '27518'
+ sct016: '41787'
+ voltage_cal: '7305'
+
+# Sensor Pins
+ spi_clk: 7
+ spi_miso: 5
+ spi_mosi: 6
+ ic1_main: 8
+ ic1_addon1: 0
+ ic1_addon2: 7
+ ic1_addon3: 2
+ ic2_main: 4
+ ic2_addon1: 16
+ ic2_addon2: 17
+ ic2_addon3: 21
+
+packages:
+ network: !include common/waveshare_esp32_s3_eth.yaml
+ device_base: !include common/device_base.yaml
+ web_server: !include common/web_server.yaml
+
+esp32:
+ board: ${board}
+ framework:
+ type: ${framework}
+
+time:
+ - platform: sntp
+ id: sntp_time
+ timezone: America/Detroit
+
+
+# TODO: If I want to use this board, I'd need to translate PINs
+# https://www.waveshare.com/esp32-s3-eth.htm
+# Use a 40 pin ribbon cable so that the esp can be outside the breaker box?
+
+# https://github.com/CircuitSetup/Expandable-6-Channel-ESP32-Energy-Meter/blob/master/Software/ESPHome/README.md
+
+# QUESTION: Is there a way to separate the power so this can use POE
+# Either way, the power from the adapter would need to make it to the main board somehow.
+
+spi:
+ clk_pin: ${spi_clk}
+ miso_pin: ${spi_miso}
+ mosi_pin: ${spi_mosi}
+ interface: any
+
+sensor:
+#IC1 Main
+ - platform: atm90e32
+ cs_pin: ${ic1_main}
+ phase_a:
+ voltage:
+ name: ${name_prefix} [V]
+ id: ic1Volts
+ filters:
+ - throttle_average: 60s
+ accuracy_decimals: 1
+ current:
+ name: ${name_prefix} ${ct01Name} [A]
+ id: ct1Amps
+ filters:
+ - or:
+ - delta: 2
+ - throttle_average: ${throttle_time}
+ # - heartbeat: ${watt_heartbeat}
+ power:
+ name: ${name_prefix} ${ct01Name} [W]
+ id: ct1Watts
+ filters:
+ - or:
+ - delta: ${grid_watt_delta}
+ - throttle_average: ${throttle_time}
+ # - heartbeat: ${watt_heartbeat}
+ accuracy_decimals: 1
+ gain_voltage: ${voltage_cal}
+ gain_ct: ${sct016}
+ phase_b:
+ power:
+ name: ${name_prefix} ${ct02Name} [W]
+ id: ct2Watts
+ filters:
+ - or:
+ - delta: ${watt_delta}
+ - throttle_average: ${throttle_time}
+ # - heartbeat: ${watt_heartbeat}
+ accuracy_decimals: 1
+ gain_voltage: ${voltage_cal}
+ gain_ct: ${sct010}
+ phase_c:
+ power:
+ name: ${name_prefix} ${ct03Name} [W]
+ id: ct3Watts
+ filters:
+ - or:
+ - delta: ${watt_delta}
+ - throttle_average: ${throttle_time}
+ # - heartbeat: ${watt_heartbeat}
+ accuracy_decimals: 1
+ gain_voltage: ${voltage_cal}
+ gain_ct: ${sct006}
+ frequency:
+ name: ${name_prefix} Freq A
+ filters:
+ - or:
+ - delta: 0.05
+ - throttle_average: ${throttle_time}
+ # - heartbeat: ${watt_heartbeat}
+ line_frequency: 60Hz
+ gain_pga: 1X
+ update_interval: ${update_time}
+
+#IC2 Main
+ - platform: atm90e32
+ cs_pin: ${ic2_main}
+ phase_a:
+ current:
+ name: ${name_prefix} ${ct04Name} [A]
+ id: ct4Amps
+ filters:
+ - or:
+ - delta: ${grid_watt_delta}
+ - throttle_average: ${throttle_time}
+ # - heartbeat: ${watt_heartbeat}
+ accuracy_decimals: 1
+ power:
+ name: ${name_prefix} ${ct04Name} [W]
+ id: ct4Watts
+ filters:
+ - or:
+ - delta: ${watt_delta}
+ - throttle_average: ${throttle_time}
+ # - heartbeat: ${watt_heartbeat}
+ gain_voltage: ${voltage_cal}
+ gain_ct: ${sct016}
+ phase_b:
+ power:
+ name: ${name_prefix} ${ct05Name} [W]
+ id: ct5Watts
+ filters:
+ - or:
+ - delta: ${watt_delta}
+ - throttle_average: ${throttle_time}
+ # - heartbeat: ${watt_heartbeat}
+ accuracy_decimals: 1
+ gain_voltage: ${voltage_cal}
+ gain_ct: ${sct006}
+ phase_c:
+ power:
+ name: ${name_prefix} ${ct06Name} [W]
+ id: ct6Watts
+ filters:
+ - or:
+ - delta: ${watt_delta}
+ - throttle_average: ${throttle_time}
+ # - heartbeat: ${watt_heartbeat}
+ accuracy_decimals: 1
+ gain_voltage: ${voltage_cal}
+ gain_ct: ${sct006}
+ frequency:
+ name: ${name_prefix} Freq B
+ filters:
+ - or:
+ - delta: 0.05
+ - throttle_average: ${throttle_time}
+ # - heartbeat: ${watt_heartbeat}
+ line_frequency: 60Hz
+ gain_pga: 1X
+ update_interval: ${update_time}
+
+
+#IC1 AddOn 1
+ - platform: atm90e32
+ cs_pin: ${ic1_addon1}
+ phase_a:
+ power:
+ name: ${name_prefix} ${ct07Name} [W]
+ id: ct7Watts
+ filters:
+ - or:
+ - delta: ${watt_delta}
+ - throttle_average: ${throttle_time}
+ # - heartbeat: ${watt_heartbeat}
+ accuracy_decimals: 1
+ gain_voltage: ${voltage_cal}
+ gain_ct: ${sct006}
+ phase_b:
+ power:
+ name: ${name_prefix} ${ct08Name} [W]
+ id: ct8Watts
+ filters:
+ - or:
+ - delta: ${watt_delta}
+ - throttle_average: ${throttle_time}
+ # - heartbeat: ${watt_heartbeat}
+ - multiply: -1
+ accuracy_decimals: 1
+ gain_voltage: ${voltage_cal}
+ gain_ct: ${sct006}
+ phase_c:
+ power:
+ name: ${name_prefix} ${ct09Name} [W]
+ id: ct9Watts
+ filters:
+ - or:
+ - delta: ${watt_delta}
+ - throttle_average: ${throttle_time}
+ # - heartbeat: ${watt_heartbeat}
+ accuracy_decimals: 1
+ gain_voltage: ${voltage_cal}
+ gain_ct: ${sct013}
+ line_frequency: 60Hz
+ gain_pga: 1X
+ update_interval: ${update_time}
+#IC2 AddOn 1
+ - platform: atm90e32
+ cs_pin: ${ic2_addon1}
+ phase_a:
+ power:
+ name: ${name_prefix} ${ct10Name} [W]
+ id: ct10Watts
+ filters:
+ - or:
+ - delta: ${watt_delta}
+ - throttle_average: ${throttle_time}
+ # - heartbeat: ${watt_heartbeat}
+ accuracy_decimals: 1
+ gain_voltage: ${voltage_cal}
+ gain_ct: ${sct006}
+ phase_b:
+ power:
+ name: ${name_prefix} ${ct11Name} [W]
+ id: ct11Watts
+ filters:
+ - or:
+ - delta: ${watt_delta}
+ - throttle_average: ${throttle_time}
+ # - heartbeat: ${watt_heartbeat}
+ - multiply: -1
+ accuracy_decimals: 1
+ gain_voltage: ${voltage_cal}
+ gain_ct: ${sct010}
+ phase_c:
+ power:
+ name: ${name_prefix} ${ct12Name} [W]
+ id: ct12Watts
+ filters:
+ - or:
+ - delta: ${watt_delta}
+ - throttle_average: ${throttle_time}
+ # - heartbeat: ${watt_heartbeat}
+ - multiply: -1
+ accuracy_decimals: 1
+ gain_voltage: ${voltage_cal}
+ gain_ct: ${sct006}
+ line_frequency: 60Hz
+ gain_pga: 1X
+ update_interval: ${update_time}
+
+#IC1 AddOn 2
+ - platform: atm90e32
+ cs_pin: ${ic1_addon2}
+ phase_a:
+ power:
+ name: ${name_prefix} ${ct13Name} [W]
+ id: ct13Watts
+ filters:
+ - or:
+ - delta: ${watt_delta}
+ - throttle_average: ${throttle_time}
+ # - heartbeat: ${watt_heartbeat}
+ - multiply: -1
+ accuracy_decimals: 1
+ gain_voltage: ${voltage_cal}
+ gain_ct: ${sct006}
+ phase_b:
+ power:
+ name: ${name_prefix} ${ct14Name} [W]
+ id: ct14Watts
+ filters:
+ - or:
+ - delta: ${watt_delta}
+ - throttle_average: ${throttle_time}
+ # - heartbeat: ${watt_heartbeat}
+ - multiply: -1
+ accuracy_decimals: 1
+ gain_voltage: ${voltage_cal}
+ gain_ct: ${sct006}
+ phase_c:
+ power:
+ name: ${name_prefix} ${ct15Name} [W]
+ id: ct15Watts
+ filters:
+ - or:
+ - delta: ${watt_delta}
+ - throttle_average: ${throttle_time}
+ # - heartbeat: ${watt_heartbeat}
+ - multiply: -1
+ accuracy_decimals: 1
+ gain_voltage: ${voltage_cal}
+ gain_ct: ${sct006}
+ line_frequency: 60Hz
+ gain_pga: 1X
+ update_interval: ${update_time}
+#IC2 AddOn 2
+ - platform: atm90e32
+ cs_pin: ${ic2_addon2}
+ phase_a:
+ power:
+ name: ${name_prefix} ${ct16Name} [W]
+ id: ct16Watts
+ filters:
+ - or:
+ - delta: ${watt_delta}
+ - throttle_average: ${throttle_time}
+ # - heartbeat: ${watt_heartbeat}
+ accuracy_decimals: 1
+ gain_voltage: ${voltage_cal}
+ gain_ct: ${sct006}
+ phase_b:
+ power:
+ name: ${name_prefix} ${ct17Name} [W]
+ id: ct17Watts
+ filters:
+ - or:
+ - delta: ${watt_delta}
+ - throttle_average: ${throttle_time}
+ # - heartbeat: ${watt_heartbeat}
+ - multiply: -1
+ accuracy_decimals: 1
+ gain_voltage: ${voltage_cal}
+ gain_ct: ${sct006}
+ phase_c:
+ power:
+ name: ${name_prefix} ${ct18Name} [W]
+ id: ct18Watts
+ filters:
+ - or:
+ - delta: ${watt_delta}
+ - throttle_average: ${throttle_time}
+ # - heartbeat: ${watt_heartbeat}
+ - multiply: -1
+ accuracy_decimals: 1
+ gain_voltage: ${voltage_cal}
+ gain_ct: ${sct006}
+ line_frequency: 60Hz
+ gain_pga: 1X
+ update_interval: ${update_time}
+#IC1 AddOn 3
+ - platform: atm90e32
+#do not use GPIO2 if ESP32 has an on-board LED assigned to it
+ cs_pin: ${ic1_addon3}
+ phase_a:
+ power:
+ name: ${name_prefix} ${ct19Name} [W]
+ id: ct19Watts
+ filters:
+ - or:
+ - delta: ${watt_delta}
+ - throttle_average: ${throttle_time}
+ # - heartbeat: ${watt_heartbeat}
+ accuracy_decimals: 1
+ gain_voltage: ${voltage_cal}
+ gain_ct: ${sct006}
+ phase_b:
+ power:
+ name: ${name_prefix} ${ct20Name} [W]
+ id: ct20Watts
+ filters:
+ - or:
+ - delta: ${watt_delta}
+ - throttle_average: ${throttle_time}
+ # - heartbeat: ${watt_heartbeat}
+ gain_voltage: ${voltage_cal}
+ gain_ct: ${sct006}
+ phase_c:
+ power:
+ name: ${name_prefix} ${ct21Name} [W]
+ id: ct21Watts
+ filters:
+ - or:
+ - delta: ${watt_delta}
+ - throttle_average: ${throttle_time}
+ # - heartbeat: ${watt_heartbeat}
+ accuracy_decimals: 1
+ gain_voltage: ${voltage_cal}
+ gain_ct: ${sct006}
+ line_frequency: 60Hz
+ gain_pga: 1X
+ update_interval: ${update_time}
+#IC2 AddOn 3
+ - platform: atm90e32
+ cs_pin: ${ic2_addon3}
+ phase_a:
+ power:
+ #name: ${name_prefix} ${ct22Name} [W]
+ internal: true
+ id: ct22Watts
+ filters:
+ - or:
+ - delta: ${watt_delta}
+ - throttle_average: ${throttle_time}
+ # - heartbeat: ${watt_heartbeat}
+ accuracy_decimals: 1
+ gain_voltage: ${voltage_cal}
+ gain_ct: ${sct010}
+ phase_b:
+ power:
+ name: ${name_prefix} ${ct23Name} [W]
+ id: ct23Watts
+ filters:
+ - or:
+ - delta: ${watt_delta}
+ - throttle_average: ${throttle_time}
+ # - heartbeat: ${watt_heartbeat}
+ - multiply: -1
+ accuracy_decimals: 1
+ gain_voltage: ${voltage_cal}
+ gain_ct: ${sct006}
+ phase_c:
+ power:
+ name: ${name_prefix} ${ct24Name} [W]
+ id: ct24Watts
+ filters:
+ - or:
+ - delta: ${watt_delta}
+ - throttle_average: ${throttle_time}
+ # - heartbeat: ${watt_heartbeat}
+ - multiply: -1
+ accuracy_decimals: 1
+ gain_voltage: ${voltage_cal}
+ gain_ct: ${sct006}
+ line_frequency: 60Hz
+ gain_pga: 1X
+ update_interval: ${update_time}
+
+#Total Amps From Grid
+ - platform: template
+ name: ${name_prefix} Grid Total [A]
+ id: totalAmpsFromGrid
+ lambda: return id(ct1Amps).state + id(ct4Amps).state ;
+ accuracy_decimals: 1
+ unit_of_measurement: A
+ device_class: current
+ state_class: measurement
+ update_interval: ${update_time}
+ filters:
+ - or:
+ - delta: 2.0
+ - throttle_average: ${throttle_time}
+ # - heartbeat: ${watt_heartbeat}
+
+#Total Watts From Grid
+ - platform: template
+ name: ${name_prefix} Grid Total [W]
+ id: totalWattsFromGrid
+ lambda: return id(ct1Watts).state + id(ct4Watts).state ;
+ accuracy_decimals: 1
+ unit_of_measurement: W
+ device_class: power
+ state_class: measurement
+ update_interval: ${update_time}
+ filters:
+ - or:
+ - delta: 5.0
+ - throttle_average: ${throttle_time}
+ # - heartbeat: ${watt_heartbeat}
+
+#kWh From Grid
+ - platform: total_daily_energy
+ name: ${name_prefix} Grid [kWh]
+ power_id: totalWattsFromGrid
+ filters:
+ - multiply: 0.001
+ # - heartbeat: ${kwh_report_interval}
+ unit_of_measurement: kWh
+ device_class: energy
+ state_class: total_increasing
+ # min_save_interval: ${update_time}
+
+# The CT for the Well needs to be calibrated.
+# In the interim, I'm using this lambda
+ - platform: template
+ name: ${name_prefix} ${ct22Name} [W]
+ id: ct22WattsPositive
+ state_class: measurement
+ lambda: |-
+ if (id(ct22Watts).state < 0){
+ return 0;
+ } else {
+ return id(ct22Watts).state ;
+ }
+ accuracy_decimals: 1
+ unit_of_measurement: W
+ icon: mdi:lightning-bolt-circle
+ update_interval: ${update_time}
+ filters:
+ - delta: 5.0
+ # - heartbeat: ${watt_heartbeat}
+
+# kWh from CT1
+# This is included in the grid calculation
+
+# kWh from CT2 (the dryer)
+ - platform: total_daily_energy
+ name: ${name_prefix} ${ct02Name} [kWh]
+ power_id: ct2Watts
+ filters:
+ - multiply: 0.001
+ unit_of_measurement: kWh
+ device_class: energy
+ state_class: total_increasing
+ # min_save_interval: ${update_time}
+
+#kWh From CT 3
+ - platform: total_daily_energy
+ name: ${name_prefix} ${ct03Name} [kWh]
+ power_id: ct3Watts
+ filters:
+ - multiply: 0.001
+ unit_of_measurement: kWh
+ device_class: energy
+ state_class: total_increasing
+ # min_save_interval: ${update_time}
+
+# kWh From CT 4
+# This is included in the Grid calculation area
+
+#kWh From CT 5
+ - platform: total_daily_energy
+ name: ${name_prefix} ${ct05Name} [kWh]
+ power_id: ct5Watts
+ filters:
+ - multiply: 0.001
+ unit_of_measurement: kWh
+ device_class: energy
+ state_class: total_increasing
+ # min_save_interval: ${update_time}
+
+#kWh From CT 6
+ - platform: total_daily_energy
+ name: ${name_prefix} ${ct06Name} [kWh]
+ power_id: ct6Watts
+ filters:
+ - multiply: 0.001
+ unit_of_measurement: kWh
+ device_class: energy
+ state_class: total_increasing
+ # min_save_interval: ${update_time}
+
+#kWh From CT 7
+ - platform: total_daily_energy
+ name: ${name_prefix} ${ct07Name} [kWh]
+ power_id: ct7Watts
+ filters:
+ - multiply: 0.001
+ unit_of_measurement: kWh
+ device_class: energy
+ state_class: total_increasing
+ # min_save_interval: ${update_time}
+
+#kWh From CT 8
+ - platform: total_daily_energy
+ name: ${name_prefix} ${ct08Name} [kWh]
+ power_id: ct8Watts
+ filters:
+ - multiply: 0.001
+ unit_of_measurement: kWh
+ device_class: energy
+ state_class: total_increasing
+ # min_save_interval: ${update_time}
+
+#kWh From CT 9
+ - platform: total_daily_energy
+ name: ${name_prefix} ${ct09Name} [kWh]
+ power_id: ct9Watts
+ filters:
+ - multiply: 0.001
+ unit_of_measurement: kWh
+ device_class: energy
+ state_class: total_increasing
+ # min_save_interval: ${update_time}
+
+#kWh From CT 10
+ - platform: total_daily_energy
+ name: ${name_prefix} ${ct10Name} [kWh]
+ power_id: ct10Watts
+ filters:
+ - multiply: 0.001
+ unit_of_measurement: kWh
+ device_class: energy
+ state_class: total_increasing
+ # min_save_interval: ${update_time}
+
+#kWh From CT 11 (Heat Pump)
+ - platform: total_daily_energy
+ name: ${name_prefix} ${ct11Name} [kWh]
+ power_id: ct11Watts
+ filters:
+ - multiply: 0.001
+ unit_of_measurement: kWh
+ device_class: energy
+ state_class: total_increasing
+ # min_save_interval: ${update_time}
+
+#kWh From CT 12
+ - platform: total_daily_energy
+ name: ${name_prefix} ${ct12Name} [kWh]
+ power_id: ct12Watts
+ filters:
+ - multiply: 0.001
+ unit_of_measurement: kWh
+ device_class: energy
+ state_class: total_increasing
+ # min_save_interval: ${update_time}
+
+#kWh From CT 13
+ - platform: total_daily_energy
+ name: ${name_prefix} ${ct13Name} [kWh]
+ power_id: ct13Watts
+ filters:
+ - multiply: 0.001
+ unit_of_measurement: kWh
+ device_class: energy
+ state_class: total_increasing
+ # min_save_interval: ${update_time}
+
+#kWh From CT 14
+ - platform: total_daily_energy
+ name: ${name_prefix} ${ct14Name} [kWh]
+ power_id: ct14Watts
+ filters:
+ - multiply: 0.001
+ unit_of_measurement: kWh
+ device_class: energy
+ state_class: total_increasing
+ # min_save_interval: ${update_time}
+
+#kWh From CT 15
+ - platform: total_daily_energy
+ name: ${name_prefix} ${ct15Name} [kWh]
+ power_id: ct15Watts
+ filters:
+ - multiply: 0.001
+ unit_of_measurement: kWh
+ device_class: energy
+ state_class: total_increasing
+ # min_save_interval: ${update_time}
+
+#kWh From CT 16
+ - platform: total_daily_energy
+ name: ${name_prefix} ${ct16Name} [kWh]
+ power_id: ct16Watts
+ filters:
+ - multiply: 0.001
+ unit_of_measurement: kWh
+ device_class: energy
+ state_class: total_increasing
+ # min_save_interval: ${update_time}
+
+#kWh From CT 17
+ - platform: total_daily_energy
+ name: ${name_prefix} ${ct17Name} [kWh]
+ power_id: ct17Watts
+ filters:
+ - multiply: 0.001
+ unit_of_measurement: kWh
+ device_class: energy
+ state_class: total_increasing
+ # min_save_interval: ${update_time}
+
+#kWh From CT 18
+ - platform: total_daily_energy
+ name: ${name_prefix} ${ct18Name} [kWh]
+ power_id: ct18Watts
+ filters:
+ - multiply: 0.001
+ unit_of_measurement: kWh
+ device_class: energy
+ state_class: total_increasing
+ # min_save_interval: ${update_time}
+
+#kWh From CT 19
+# this is not used
+ # - platform: total_daily_energy
+ # name: ${name_prefix} ${ct19Name} [kWh]
+ # power_id: ct19Watts
+ # filters:
+ # - multiply: 0.001
+ # - throttle_average: ${kwh_report_interval}
+ # unit_of_measurement: kWh
+ # device_class: energy
+ # state_class: total_increasing
+ # # min_save_interval: ${update_time}
+
+#kWh From CT 20
+ - platform: total_daily_energy
+ name: ${name_prefix} ${ct20Name} [kWh]
+ power_id: ct20Watts
+ filters:
+ - multiply: 0.001
+ unit_of_measurement: kWh
+ device_class: energy
+ state_class: total_increasing
+ # min_save_interval: ${update_time}
+
+#kWh From CT 21
+ - platform: total_daily_energy
+ name: ${name_prefix} ${ct21Name} [kWh]
+ power_id: ct21Watts
+ filters:
+ - multiply: 0.001
+ unit_of_measurement: kWh
+ device_class: energy
+ state_class: total_increasing
+ # min_save_interval: ${update_time}
+
+#kWh From CT 22
+ - platform: total_daily_energy
+ name: ${name_prefix} ${ct22Name} [kWh]
+ power_id: ct22WattsPositive
+ filters:
+ - multiply: 0.001
+ unit_of_measurement: kWh
+ device_class: energy
+ state_class: total_increasing
+ # min_save_interval: ${update_time}
+
+#kWh From CT 23
+ - platform: total_daily_energy
+ name: ${name_prefix} ${ct23Name} [kWh]
+ power_id: ct23Watts
+ filters:
+ - multiply: 0.001
+ unit_of_measurement: kWh
+ device_class: energy
+ state_class: total_increasing
+ # min_save_interval: ${update_time}
+
+#kWh From CT 24
+ - platform: total_daily_energy
+ name: ${name_prefix} ${ct24Name} [kWh]
+ power_id: ct24Watts
+ filters:
+ - multiply: 0.001
+ unit_of_measurement: kWh
+ device_class: energy
+ state_class: total_increasing
+ # min_save_interval: ${update_time}
diff --git a/esphome/archive/furnace-room-multisensor-back.yaml b/esphome/archive/furnace-room-multisensor-back.yaml
deleted file mode 100644
index 8568bb5..0000000
--- a/esphome/archive/furnace-room-multisensor-back.yaml
+++ /dev/null
@@ -1,220 +0,0 @@
-# 3v3 en svp sun 34 35 32 33 25 26 27 14 12 gnd 13 sd2 sd3 gnd 5v
-substitutions:
- devicename: furnace-room-multisensor
- entity_name: furnace_room_multisensor
- friendly_name: Furnace Room MultiSensor
- comment: Clever MultiSensor
- platform: ESP32
- board: wemos_d1_mini32
- static_ip: !secret furnace-room-multisensor-ip
-
- one_wire_pin: GPIO14
- sda_pin: GPIO21
- scl_pin: GPIO22
- door_pin: GPIO34
- trigger_pin: GPIO33
- echo_pin: GPIO35
- #mdc_pin: GPIO23
- #mdio_pin: GPIO18
- #clk_mode: GPIO17_OUT
- #power_pin: GPIO5
-
-packages:
- #wifi: !include common/wifi_no_power_save.yaml
- ethernet: !include common/ethernet.yaml
- device_base: !include common/device_base.yaml
- ble_proxy: !include common/ble_proxy.yaml
-
-esphome:
- name: ${devicename}
- friendly_name: ${friendly_name}
-
-esp32:
- board: ${board}
- framework:
- type: esp-idf
-
-# Enable logging
-logger:
-
-api: # Using settings from common/device_base.yaml
-
-ota: # Using settings from common/device_base.yaml
-
-esp32_ble_tracker:
-
-globals:
- - id: screen_power
- type: bool
- restore_value: yes
- initial_value: 'true'
-
-font:
- - file: 'CascadiaMonoPL.ttf'
- id: font1
- size: 17
-
-one_wire:
- - platform: gpio
- pin: ${one_wire_pin}
-
-i2c:
- sda: ${sda_pin}
- scl: ${scl_pin}
- frequency: 800kHz
-
-display:
- - platform: ssd1306_i2c
- id: oled
- model: "SSD1306 128x64"
- #reset_pin: GPIO14 #D0
- address: 0x3C
- lambda: |-
- it.print(0, 0, id(font1), "Delt:");
- it.printf(128, 0, id(font1), TextAlign::TOP_RIGHT, "%.1f°F", id(hvac_delta).state);
- it.print(0, 16, id(font1), "HVAC:");
- it.printf(128, 16, id(font1), TextAlign::TOP_RIGHT, "%.1f°F", id(hvac).state);
- it.print(0, 32, id(font1), "Retn:");
- it.printf(128, 32, id(font1), TextAlign::TOP_RIGHT, "%.1f°F", id(hvac_return).state);
- it.print(0, 48, id(font1), "Ambt:");
- it.printf(128, 48, id(font1), TextAlign::TOP_RIGHT, "%.1f°F", id(ambient).state);
-
-sensor:
- - platform: dallas_temp
- address: 0xB33C01B607798528
- name: "Return Temperature"
- id: hvac_return
- update_interval: 10s
- filters:
- - lambda: return x * (9.0/5.0) + 32.0;
- unit_of_measurement: "°F"
- state_class: measurement
-
- - platform: dallas_temp
- address: 0x0F3C01B6070C1328
- name: "Supply Temperature"
- id: hvac_supply
- update_interval: 10s
- filters:
- - lambda: return x * (9.0/5.0) + 32.0;
- unit_of_measurement: "°F"
- state_class: measurement
-
- - platform: dallas_temp
- address: 0xFA3C01B607005B28
- name: "Ambient Temperature"
- id: ambient
- update_interval: 10s
- filters:
- - lambda: return x * (9.0/5.0) + 32.0;
- unit_of_measurement: "°F"
- state_class: measurement
-
- - platform: template
- name: "Delta Temperature"
- id: hvac_delta
- lambda: |-
- return (id(hvac_supply).state - id(hvac_return).state);
- update_interval: 10s
- unit_of_measurement: "°F"
- state_class: measurement
- filters:
- - or:
- - throttle: 60s
- - delta: 1.0
-
- - platform: ultrasonic
- trigger_pin: ${trigger_pin}
- echo_pin: ${echo_pin}
- id: ultrasonic_source
- #update_interval: 5s
- internal: True
- filters:
- - sliding_window_moving_average:
- window_size: 5
- send_every: 5
- send_first_at: 1
- on_value:
- then:
- - sensor.template.publish:
- id: distance_from_bottom
- state: !lambda 'return id(ultrasonic_source).state;'
-
- - sensor.template.publish:
- id: distance_from_top
- state: !lambda 'return id(ultrasonic_source).state;'
-
- - platform: template
- unit_of_measurement: "cm"
- state_class: measurement
- id: distance_from_bottom
- name: "Salt Level in CM"
- #update_interval: 5s
- filters:
- - lambda: 'return (0.94 - (id(ultrasonic_source).state)) * 100;'
- on_value:
- then:
- - sensor.template.publish:
- id: level_in_bags
- state: !lambda 'return id(distance_from_bottom).state;'
-
- - platform: template
- unit_of_measurement: "cm"
- state_class: measurement
- id: distance_from_top
- name: "Salt Level From Top in CM"
- #update_interval: 5s
- filters:
- - lambda: 'return (id(ultrasonic_source).state) * 100;'
-
- - platform: template
- unit_of_measurement: "bags"
- state_class: measurement
- id: level_in_bags
- name: "Salt Level in Bags"
- #update_interval: 5s
- filters:
- - lambda: 'return (id(distance_from_bottom).state) / 17.5;'
-
-binary_sensor:
- - platform: gpio
- name: "Door"
- device_class: door
- pin:
- number: ${door_pin}
- mode: INPUT_PULLUP
-
- - platform: homeassistant
- internal: true
- id: light_state
- entity_id: light.furnace_room
- on_state:
- then:
- - if:
- condition:
- lambda: 'return id(light_state).state;'
- then:
- - logger.log: "The light is on"
- else:
- - logger.log: "The is off. Turning off display"
- - switch.turn_off: display_switch
-
-switch:
- - platform: template
- id: display_switch
- name: "Display"
- lambda: |-
- if (id(screen_power)) {
- id(oled).turn_on();
- } else {
- id(oled).turn_off();
- }
- return id(screen_power);
- turn_on_action:
- - lambda: |-
- id(screen_power) = true;
- // id(oled).turn_on();
- turn_off_action:
- - lambda: |-
- id(screen_power) = false;
- // id(oled).turn_off();
diff --git a/esphome/archive/furnace-room-multisensor.yaml b/esphome/archive/furnace-room-multisensor.yaml
index 2914e9d..560e86b 100644
--- a/esphome/archive/furnace-room-multisensor.yaml
+++ b/esphome/archive/furnace-room-multisensor.yaml
@@ -1,141 +1,141 @@
-# 3v3 en svp sun 34 35 32 33 25 26 27 14 12 gnd 13 sd2 sd3 gnd 5v
substitutions:
devicename: furnace-room-multisensor
entity_name: furnace_room_multisensor
friendly_name: Furnace Room MultiSensor
comment: Clever MultiSensor
- platform: ESP32
- board: wemos_d1_mini32
+ board: nodemcuv2
static_ip: !secret furnace-room-multisensor-ip
- sda_pin: GPIO21
- scl_pin: GPIO22
- door_pin: GPIO19
+# For the reed switches
+ door: 35
+ moisture: 36
- one_wire_pin: GPIO14
- trigger_pin: GPIO04
- echo_pin: GPIO12
- #mdc_pin: GPIO23
- #mdio_pin: GPIO18
- #clk_mode: GPIO17_OUT
- #power_pin: GPIO5
+# For the ultrasonic sensor
+ trigger: 14
+ echo: 15
-packages:
- #wifi: !include common/wifi_no_power_save.yaml
- ethernet: !include common/ethernet.yaml
- device_base: !include common/device_base.yaml
- ble_proxy: !include common/ble_proxy.yaml
+# Infrared Sensor
+ ir_tx: 12
+ ir_rx: 39
+
+# I2C Pins
+ i2c_sda: 13
+ i2c_scl: 16
+
+# For the ethernet adapter
+ ethernet_mdc_pin: 23
+ ethernet_mdio_pin: 18
+ ethernet_clk_pin: 0
+
+# For the relays
+ relay1: 32
+ relay2: 33
+
+# Built-in button
+ button1: 34
+
+# For the HVAC temperature sensors
+ one_wire: 17
+
+one_wire:
+ - platform: gpio
+ pin: ${one_wire}
esphome:
name: ${devicename}
friendly_name: ${friendly_name}
+ name_add_mac_suffix: false
-esp32:
- board: ${board}
- framework:
- type: esp-idf
+packages:
+ network: !include common/olimex_evb.yaml
+ device_base: !include common/device_base.yaml
+
+
+# Included in common/olimex-evb.yaml
+# esp32:
+# board: esp32dev
+# framework:
+# type: esp-idf
# Enable logging
logger:
-api: # Using settings from common/device_base.yaml
+web_server:
+ port: 80
+ version: 3
+ include_internal: True
-ota: # Using settings from common/device_base.yaml
+# # Enable Home Assistant API
+# api:
+# encryption:
+# key: "mupTLNBggWPdKHxBeY1yV47qXgyhVJUgIVVAvfGrZ40="
-esp32_ble_tracker:
+# ota:
+# - platform: esphome
+# password: "b43bd5c6f724d64a9bd4e92504830d8f"
-globals:
- - id: screen_power
- type: bool
- restore_value: yes
- initial_value: 'true'
+remote_receiver:
+ pin: ${ir_rx}
+ dump: all
-font:
- - file: 'CascadiaMonoPL.ttf'
- id: font1
- size: 17
-
-one_wire:
- - platform: gpio
- pin: ${one_wire_pin}
+remote_transmitter:
+ pin: ${ir_tx}
+ carrier_duty_percent: 50%
i2c:
- sda: ${sda_pin}
- scl: ${scl_pin}
- frequency: 800kHz
+ sda: ${i2c_sda}
+ scl: ${i2c_scl}
+ scan: true
+ id: bus_a
-display:
- - platform: ssd1306_i2c
- id: oled
- model: "SSD1306 128x64"
- #reset_pin: GPIO14 #D0
- address: 0x3C
- lambda: |-
- it.print(0, 0, id(font1), "Delta:");
- it.printf(128, 0, id(font1), TextAlign::TOP_RIGHT, "%.1f°F", id(hvac_delta).state);
- it.print(0, 16, id(font1), "Supply:");
- it.printf(128, 16, id(font1), TextAlign::TOP_RIGHT, "%.1f°F", id(hvac_supply).state);
- it.print(0, 32, id(font1), "Return:");
- it.printf(128, 32, id(font1), TextAlign::TOP_RIGHT, "%.1f°F", id(hvac_return).state);
- it.print(0, 48, id(font1), "Ambient:");
- it.printf(128, 48, id(font1), TextAlign::TOP_RIGHT, "%.1f°F", id(ambient).state);
+binary_sensor:
+ - platform: gpio
+ name: "ESP32-EVB button"
+ pin: ${button1}
+
+ - platform: gpio
+ name: "Door"
+ device_class: door
+ filters:
+ - invert:
+ pin:
+ number: ${door}
+ # mode: INPUT_PULLUP
+
+ - platform: gpio
+ name: "Moisture"
+ device_class: moisture
+ pin:
+ number: ${moisture}
+ # mode: INPUT_PULLUP
+
+
+switch:
+ - platform: gpio
+ pin: ${relay1}
+ name: "Relay1"
+
+ - platform: gpio
+ pin: ${relay2}
+ name: "Relay2"
sensor:
- - platform: dallas_temp
- address: 0xB33C01B607798528
- name: "Return Temperature"
- id: hvac_return
- update_interval: 10s
- filters:
- - lambda: return x * (9.0/5.0) + 32.0;
- unit_of_measurement: "°F"
- state_class: measurement
-
- - platform: dallas_temp
- address: 0x0F3C01B6070C1328
- name: "Supply Temperature"
- id: hvac_supply
- update_interval: 10s
- filters:
- - lambda: return x * (9.0/5.0) + 32.0;
- unit_of_measurement: "°F"
- state_class: measurement
-
- - platform: dallas_temp
- address: 0xFA3C01B607005B28
- name: "Ambient Temperature"
- id: ambient
- update_interval: 10s
- filters:
- - lambda: return x * (9.0/5.0) + 32.0;
- unit_of_measurement: "°F"
- state_class: measurement
-
- - platform: template
- name: "Delta Temperature"
- id: hvac_delta
- lambda: |-
- return (id(hvac_supply).state - id(hvac_return).state);
- update_interval: 10s
- unit_of_measurement: "°F"
- state_class: measurement
- filters:
- - or:
- - throttle: 60s
- - delta: 1.0
-
- platform: ultrasonic
- trigger_pin: ${trigger_pin}
- echo_pin: ${echo_pin}
+ trigger_pin: ${trigger}
+ echo_pin: ${echo}
id: ultrasonic_source
- #update_interval: 5s
+ update_interval: 1s
internal: True
filters:
- - sliding_window_moving_average:
- window_size: 5
- send_every: 5
- send_first_at: 1
+ - sliding_window_moving_average:
+ window_size: 5
+ send_every: 5
+ send_first_at: 1
+ - lambda: 'return round( x * 10.0) / 10.0;'
+ - clamp:
+ min_value: 0.0
+ max_value: 150.0
on_value:
then:
- sensor.template.publish:
@@ -151,9 +151,15 @@ sensor:
state_class: measurement
id: distance_from_bottom
name: "Salt Level in CM"
+ icon: mdi:arrow-collapse-up
+ disabled_by_default: true
#update_interval: 5s
filters:
- - lambda: 'return (0.94 - (id(ultrasonic_source).state)) * 100;'
+ - lambda: 'return (0.94 - x) * 100;'
+ - clamp:
+ min_value: 0.0
+ max_value: 150.0
+
on_value:
then:
- sensor.template.publish:
@@ -165,58 +171,28 @@ sensor:
state_class: measurement
id: distance_from_top
name: "Salt Level From Top in CM"
+ icon: mdi:arrow-collapse-down
+ disabled_by_default: true
#update_interval: 5s
filters:
- - lambda: 'return (id(ultrasonic_source).state) * 100;'
+ - lambda: 'return x * 100;'
+ - round: 1
+ - clamp:
+ min_value: 0.0
+ max_value: 150.0
+
- platform: template
unit_of_measurement: "bags"
state_class: measurement
id: level_in_bags
name: "Salt Level in Bags"
+ icon: mdi:counter
+ disabled_by_default: true
#update_interval: 5s
filters:
- - lambda: 'return (id(distance_from_bottom).state) / 17.5;'
-
-binary_sensor:
- - platform: gpio
- name: "Door"
- device_class: door
- pin:
- number: ${door_pin}
- mode: INPUT_PULLUP
-
- - platform: homeassistant
- internal: true
- id: light_state
- entity_id: light.furnace_room
- on_state:
- then:
- - if:
- condition:
- lambda: 'return id(light_state).state;'
- then:
- - logger.log: "The light is on"
- else:
- - logger.log: "The is off. Turning off display"
- - switch.turn_off: display_switch
-
-switch:
- - platform: template
- id: display_switch
- name: "Display"
- lambda: |-
- if (id(screen_power)) {
- id(oled).turn_on();
- } else {
- id(oled).turn_off();
- }
- return id(screen_power);
- turn_on_action:
- - lambda: |-
- id(screen_power) = true;
- // id(oled).turn_on();
- turn_off_action:
- - lambda: |-
- id(screen_power) = false;
- // id(oled).turn_off();
+ - lambda: 'return x / 17.5;'
+ - round: 1
+ - clamp:
+ min_value: 0.0
+ max_value: 10.0
\ No newline at end of file
diff --git a/esphome/archive/hvac-multisensor.yaml b/esphome/archive/hvac-multisensor.yaml
index 39a8680..dcc7dc5 100644
--- a/esphome/archive/hvac-multisensor.yaml
+++ b/esphome/archive/hvac-multisensor.yaml
@@ -4,243 +4,35 @@ substitutions:
entity_name: hvac_multisensor
friendly_name: HVAC MultiSensor
comment: Clever MultiSensor
- platform: ESP32
- board: esp32-wroom-32d
- variant: esp32
+ platform: ESP8266
+ board: d1_mini
+ #variant: esp32
# framework: esp-idf
- framework: arduino
+ #framework: arduino
static_ip: !secret hvac-multisensor-ip
-# Backlight Button
- backlight_button: GPIO34
-
-# For TFT Display
- tft_dc_pin: GPIO02
- tft_reset_pin: GPIO04
- tft_cs_pin: GPIO15
- tft_backlight_pin: GPIO32
-
-# For SPI and TFT
- spi_miso_pin: GPIO19
- spi_mosi_pin: GPIO23
- spi_clock_pin: GPIO18
-
-# For Touchscreen
- touchscreen_irq_pin: GPIO27
-
-# For Ultrasonic Sensor
- trigger_pin: GPIO14
- echo_pin: GPIO16
-
-# For i2c devices
- sda_pin: GPIO21
- scl_pin: GPIO22
-
-# For additional devices
- passive_buzzer_pin: GPIO26
- one_wire_pin: GPIO17
- moisture_pin: GPIO33
- door_pin: GPIO34
-
packages:
- # network: !include common/ethernet.yaml
network: !include common/wifi.yaml
device_base: !include common/device_base.yaml
- # ble_proxy: !include common/ble_proxy.yaml
esphome:
name: ${devicename}
friendly_name: ${friendly_name}
name_add_mac_suffix: false
-esp32:
- # board: ${board}
- variant: ${variant}
- framework:
- type: ${framework}
+esp8266:
+ board: ${board}
# Enable logging
logger:
#level: VERBOSE
-time:
- - id: !remove homeassistant_time
- - platform: sntp
- id: sntp_time
- timezone: America/Detroit
- on_time:
- - hours: 2,3,4,5
- minutes: 5
- seconds: 0
- then:
- - switch.turn_on: switch_antiburn
- - hours: 2,3,4,5
- minutes: 35
- seconds: 0
- then:
- - switch.turn_off: switch_antiburn
-
-api: # Using settings from common/device_base.yaml
- actions:
- - action: play_rtttl
- variables:
- song_str: string
- then:
- - rtttl.play: !lambda 'return song_str;'
- on_client_connected:
- - logger.log:
- format: "Client %s connected to API with IP %s"
- args: ["client_info.c_str()", "client_address.c_str()"]
- - if:
- condition:
- lambda: 'return (0 == client_info.find("Home Assistant "));'
- then:
- - lvgl.widget.show: lbl_hastatus
- on_client_disconnected:
- - logger.log:
- format: "Client %s disconnected to API with IP %s"
- args: ["client_info.c_str()", "client_address.c_str()"]
- - if:
- condition:
- lambda: 'return (0 == client_info.find("Home Assistant "));'
- then:
- - lvgl.widget.hide: lbl_hastatus
-
-ota: # Using settings from common/device_base.yaml
-
-font:
- - file: 'fonts/RobotoCondensed-Regular.ttf'
- id: regular_20
- size: 20
- bpp: 4
- extras:
- - file: "fonts/materialdesignicons-webfont.ttf"
- glyphs: [
- "\U000F02DC", # mdi-home
- "\U000F035E", # mdi-menu-left
- "\U000F035F", # mdi-menu-right
- "\U000F05A9", # mdi-wifi
- "\U000F19B2", # mdi-arrow-up-thin
- "\U000F19B3", # mdi-arrow-down-thin
- "\U000F04DB", # mdi-stop
- ]
-
one_wire:
- platform: gpio
- pin:
- number: ${one_wire_pin}
- # mode:
- # input: true
- # pullup: true
-
-i2c:
- - id: bus_a
- sda: ${sda_pin}
- scl: ${scl_pin}
- #frequency: 800kHz
-
-spi:
- clk_pin: ${spi_clock_pin}
- mosi_pin: ${spi_mosi_pin}
- miso_pin: ${spi_miso_pin}
-
-output:
- - platform: ledc
- pin: ${tft_backlight_pin}
- id: backlight_pwm
-
- - platform: ledc
- pin: ${passive_buzzer_pin}
- id: rtttl_out
-
-rtttl:
- output: rtttl_out
- id: buzzer
- gain: 60%
-
-switch:
- - platform: template
- name: Antiburn
- id: switch_antiburn
- icon: mdi:television-shimmer
- optimistic: true
- entity_category: "config"
- turn_on_action:
- - logger.log: "Starting Antiburn"
- - if:
- condition: lvgl.is_paused
- then:
- - lvgl.resume:
- - lvgl.widget.redraw:
- - lvgl.pause:
- show_snow: true
- turn_off_action:
- - logger.log: "Stopping Antiburn"
- - if:
- condition: lvgl.is_paused
- then:
- - lvgl.resume:
- - lvgl.widget.redraw:
-
-light:
- - platform: monochromatic
- output: backlight_pwm
- name: "Display Backlight"
- id: display_backlight
- restore_mode: RESTORE_DEFAULT_OFF
-
-number:
- - platform: template
- name: LVGL Screen timeout
- optimistic: true
- id: display_timeout
- unit_of_measurement: "s"
- initial_value: 30
- restore_value: true
- min_value: 10
- max_value: 180
- step: 5
- mode: box
-
-# binary_sensor:
-# - platform: gpio
-# pin:
-# number: ${backlight_button}
-# id: backlight_switch
-# filters:
-# - delayed_on: 10ms
-# - delayed_off: 10ms
-# on_press:
-# - light.toggle:
-# id: display_backlight
-
-binary_sensor:
- - platform: gpio
- name: "Door"
- device_class: door
- pin:
- number: ${door_pin}
- inverted: True
+ pin: D5
sensor:
- - platform: ultrasonic
- trigger_pin: ${trigger_pin}
- echo_pin: ${echo_pin}
- name: "Ultrasonic Sensor"
- update_interval: 1s
-
- - platform: bme280_i2c
- i2c_id: bus_a
- address: 0x76
- update_interval: 10s
- temperature:
- name: "BME280 76A Temperature"
- pressure:
- name: "BME280 76A Pressure"
- humidity:
- name: "BME280 76A Humidity"
-
- platform: dallas_temp
address: 0x5a3c01d6078a2e28
name: "Probe 1"
@@ -257,6 +49,9 @@ sensor:
- clamp:
min_value: 0.0
max_value: 150.0
+ - or:
+ - throttle: 60s
+ - delta: 1.0
unit_of_measurement: "°F"
state_class: measurement
@@ -271,6 +66,9 @@ sensor:
- clamp:
min_value: 0.0
max_value: 150.0
+ - or:
+ - throttle: 60s
+ - delta: 1.0
unit_of_measurement: "°F"
state_class: measurement
@@ -285,6 +83,9 @@ sensor:
- clamp:
min_value: 0.0
max_value: 150.0
+ - or:
+ - throttle: 60s
+ - delta: 1.0
unit_of_measurement: "°F"
state_class: measurement
@@ -293,409 +94,17 @@ sensor:
id: hvac_delta
icon: mdi:thermometer-lines
lambda: |-
- return (id(probe1).state - id(probe2).state);
+ return round( (id(probe1).state - id(probe2).state) * 100.0) / 100.0;
update_interval: 10s
unit_of_measurement: "°F"
state_class: measurement
+ device_class: ""
+ accuracy_decimals: 1
filters:
- - lambda: 'return round( x * 100.0) / 100.0;'
+ #- lambda: 'return round( (id(probe1).state - id(probe2).state) * 100.0) / 100.0;'
- clamp:
min_value: -100.0
max_value: 100.0
- or:
- throttle: 60s
- delta: 1.0
-
-display:
- - platform: ili9xxx
- id: main_display
- # data_rate: 20MHz
- # spi_mode: MODE3
- # color_palette: 8BIT
- invert_colors: false
- auto_clear_enabled: false
- update_interval: never
- model: ili9488
- dc_pin: ${tft_dc_pin}
- reset_pin: ${tft_reset_pin}
- cs_pin: ${tft_cs_pin}
- transform:
- swap_xy: true
- mirror_x: true
- dimensions:
- height: 480
- width: 320
-
-touchscreen:
- # - platform: ft5x06
- # Uses i2c
- - platform: ft63x6
- i2c_id: bus_a
- id: main_touchscreen
- display: main_display
- transform:
- swap_xy: true
- mirror_y: true
- interrupt_pin: ${touchscreen_irq_pin}
- # on_touch:
- # - lambda: |-
- # ESP_LOGI("cal", "x=%d, y=%d, x_raw=%d, y_raw=%0d",
- # touch.x,
- # touch.y,
- # touch.x_raw,
- # touch.y_raw
- # );
- on_release:
- - if:
- condition: lvgl.is_paused
- then:
- - logger.log: "LVGL resuming"
- - lvgl.resume:
- - lvgl.widget.redraw:
- - if:
- condition:
- light.is_off: display_backlight
- then:
- - light.turn_on: display_backlight
-
-lvgl:
- buffer_size: 25%
- displays: main_display
- top_layer:
- widgets:
- - label:
- text: "\U000F05A9"
- id: lbl_hastatus
- hidden: true
- align: top_right
- x: -2
- y: 7
- text_align: right
-
- - buttonmatrix:
- align: bottom_mid
- styles: header_footer
- pad_all: 0
- outline_width: 0
- id: top_layer
- items:
- styles: header_footer
- rows:
- - buttons:
- - id: page_prev
- text: "\U000F035E"
- on_press:
- then:
- lvgl.page.previous:
- - id: page_home
- text: "\U000F02DC"
- on_press:
- then:
- lvgl.page.show: main_page
- - id: page_next
- text: "\U000F035F"
- on_press:
- then:
- lvgl.page.next:
- on_idle:
- timeout: !lambda "return (id(display_timeout).state * 1000);"
- then:
- - logger.log: "LVGL is idle"
- - light.turn_off: display_backlight
- - lvgl.pause:
-
- pages:
- - id: room_page
- widgets:
- - obj: # a properly placed coontainer object for all these controls
- align: CENTER
- width: 400
- height: 256
- pad_all: 2
- bg_color: 0x414559
- bg_opa: TRANSP
- border_opa: TRANSP
- layout: # enable the GRID layout for the children widgets
- pad_row: 6
- pad_column: 8
- type: GRID # split the rows and the columns proportionally
- grid_columns: [FR(1), FR(1), FR(1)] # equal
- grid_rows: [FR(10), FR(30), FR(30), FR(30)] # like percents
- widgets:
- - label:
- text: "Red"
- grid_cell_column_pos: 0 # place the widget in
- grid_cell_row_pos: 0 # the corresponding cell
- grid_cell_x_align: STRETCH
- grid_cell_y_align: STRETCH
- - button:
- id: but_cov_up_east
- bg_color: 0xFF0000
- grid_cell_column_pos: 0
- grid_cell_row_pos: 1
- grid_cell_x_align: STRETCH
- grid_cell_y_align: STRETCH
- widgets:
- - label:
- id: cov_up_east
- align: CENTER
- text: "\U000F19B2"
- - button:
- id: but_cov_stop_east
- bg_color: 0xFF0000
- grid_cell_column_pos: 0
- grid_cell_row_pos: 2
- grid_cell_x_align: STRETCH
- grid_cell_y_align: STRETCH
- widgets:
- - label:
- id: cov_stop_east
- align: CENTER
- text: "\U000F04DB"
- - button:
- id: but_cov_down_east
- bg_color: 0xFF0000
- grid_cell_column_pos: 0
- grid_cell_row_pos: 3
- grid_cell_x_align: STRETCH
- grid_cell_y_align: STRETCH
- widgets:
- - label:
- id: cov_down_east
- align: CENTER
- text: "\U000F19B3"
-
- - label:
- text: "Green"
- grid_cell_column_pos: 1
- grid_cell_row_pos: 0
- grid_cell_x_align: STRETCH
- grid_cell_y_align: STRETCH
- - button:
- id: but_cov_up_south
- bg_color: 0x00FF00
- grid_cell_column_pos: 1
- grid_cell_row_pos: 1
- grid_cell_x_align: STRETCH
- grid_cell_y_align: STRETCH
- widgets:
- - label:
- id: cov_up_south
- align: CENTER
- text: "\U000F19B2"
- - button:
- id: but_cov_stop_south
- bg_color: 0x00FF00
- grid_cell_column_pos: 1
- grid_cell_row_pos: 2
- grid_cell_x_align: STRETCH
- grid_cell_y_align: STRETCH
- widgets:
- - label:
- id: cov_stop_south
- align: CENTER
- text: "\U000F04DB"
- - button:
- id: but_cov_down_south
- bg_color: 0x00FF00
- grid_cell_column_pos: 1
- grid_cell_row_pos: 3
- grid_cell_x_align: STRETCH
- grid_cell_y_align: STRETCH
- widgets:
- - label:
- id: cov_down_south
- align: CENTER
- text: "\U000F19B3"
-
- - label:
- text: "Blue"
- grid_cell_column_pos: 2
- grid_cell_row_pos: 0
- grid_cell_x_align: STRETCH
- grid_cell_y_align: STRETCH
- - button:
- id: but_cov_up_west
- bg_color: 0x0000FF
- grid_cell_column_pos: 2
- grid_cell_row_pos: 1
- grid_cell_x_align: STRETCH
- grid_cell_y_align: STRETCH
- widgets:
- - label:
- id: cov_up_west
- align: CENTER
- text: "\U000F19B2"
- - button:
- id: but_cov_stop_west
- bg_color: 0x0000FF
- grid_cell_column_pos: 2
- grid_cell_row_pos: 2
- grid_cell_x_align: STRETCH
- grid_cell_y_align: STRETCH
- widgets:
- - label:
- id: cov_stop_west
- align: CENTER
- text: "\U000F04DB"
- - button:
- id: but_cov_down_west
- bg_color: 0x0000FF
- grid_cell_column_pos: 2
- grid_cell_row_pos: 3
- grid_cell_x_align: STRETCH
- grid_cell_y_align: STRETCH
- widgets:
- - label:
- id: cov_down_west
- align: CENTER
- text: "\U000F19B3"
- - id: main_page
- widgets:
- - obj:
- align: TOP_MID
- styles: header_footer
- widgets:
- - label:
- text: "ESPHome LVGL Display"
- align: CENTER
- text_align: CENTER
- - label:
- align: CENTER
- text: 'Hello World!'
- - label:
- align: LEFT_MID
- text: 'Left Mid'
- - label:
- align: RIGHT_MID
- text: 'Right Mid'
- - id: second_page
- widgets:
- - obj:
- align: TOP_MID
- styles: header_footer
- widgets:
- - label:
- text: "A second page"
- align: CENTER
- text_align: CENTER
- - label:
- align: CENTER
- text: 'Hello Again!'
- - id: third_page
- widgets:
- - obj:
- align: TOP_MID
- styles: header_footer
- widgets:
- - label:
- text: "A third page"
- align: CENTER
- text_align: CENTER
- - label:
- align: CENTER
- text: 'I am the very model of a modern major general'
- - id: fourth_page
- widgets:
- - obj:
- align: TOP_MID
- styles: header_footer
- widgets:
- - label:
- text: "A fourth page"
- align: CENTER
- text_align: CENTER
- - label:
- align: CENTER
- text: "I've information vegetable animal and mineral"
-
- theme:
- label:
- text_font: regular_20 # set all your labels to use your custom defined font
- text_color: 0xcad3f5
- button:
- bg_color: 0x24273a
- bg_grad_color: 0x005782
- bg_grad_dir: VER
- bg_opa: COVER
- border_color: 0x0077b3
- border_width: 1
- text_color: 0xcad3f5
- pressed: # set some button colors to be different in pressed state
- bg_color: 0x006699
- bg_grad_color: 0x00334d
- checked: # set some button colors to be different in checked state
- bg_color: 0x1d5f96
- bg_grad_color: 0x03324A
- text_color: 0xfff300
- buttonmatrix:
- bg_opa: TRANSP
- border_color: 0x0077b3
- border_width: 0
- text_color: 0xcad3f5
- pad_all: 0
- items: # set all your buttonmatrix buttons to use your custom defined styles and font
- bg_color: 0x24273a
- bg_grad_color: 0x005782
- bg_grad_dir: VER
- bg_opa: COVER
- border_color: 0x0077b3
- border_width: 1
- text_color: 0xcad3f5
- text_font: regular_20
- pressed:
- bg_color: 0x006699
- bg_grad_color: 0x00334d
- checked:
- bg_color: 0x1d5f96
- bg_grad_color: 0x03324A
- text_color: 0x005580
- switch:
- bg_color: 0xC0C0C0
- bg_grad_color: 0xb0b0b0
- bg_grad_dir: VER
- bg_opa: COVER
- checked:
- bg_color: 0x1d5f96
- bg_grad_color: 0x03324A
- bg_grad_dir: VER
- bg_opa: COVER
- knob:
- bg_color: 0xFFFFFF
- bg_grad_color: 0xC0C0C0
- bg_grad_dir: VER
- bg_opa: COVER
- slider:
- border_width: 1
- border_opa: 15%
- bg_color: 0xcccaca
- bg_opa: 15%
- indicator:
- bg_color: 0x1d5f96
- bg_grad_color: 0x03324A
- bg_grad_dir: VER
- bg_opa: COVER
- knob:
- bg_color: 0x24273a
- bg_grad_color: 0x005782
- bg_grad_dir: VER
- bg_opa: COVER
- border_color: 0x0077b3
- border_width: 1
- text_color: 0xcad3f5
-
- style_definitions:
- - id: header_footer
- bg_color: 0x24273a
- bg_grad_color: 0x005782
- bg_grad_dir: VER
- bg_opa: COVER
- border_opa: TRANSP
- radius: 0
- pad_all: 0
- pad_row: 0
- pad_column: 0
- border_color: 0x0077b3
- text_color: 0xcad3f5
- width: 100%
- height: 30
\ No newline at end of file
diff --git a/esphome/water-softener-multisensor.yaml b/esphome/archive/to-dining-room-or-garage.yaml
similarity index 56%
rename from esphome/water-softener-multisensor.yaml
rename to esphome/archive/to-dining-room-or-garage.yaml
index 3eeee23..560e86b 100644
--- a/esphome/water-softener-multisensor.yaml
+++ b/esphome/archive/to-dining-room-or-garage.yaml
@@ -1,42 +1,129 @@
-# 3v3 en svp sun 34 35 32 33 25 26 27 14 12 gnd 13 sd2 sd3 gnd 5v
substitutions:
- devicename: water-softener-multisensor
- entity_name: water_softener_multisensor
- friendly_name: Water Softener MultiSensor
- comment: Clever Water Softener MultiSensor
+ devicename: furnace-room-multisensor
+ entity_name: furnace_room_multisensor
+ friendly_name: Furnace Room MultiSensor
+ comment: Clever MultiSensor
board: nodemcuv2
- static_ip: !secret water-softener-multisensor-ip
+ static_ip: !secret furnace-room-multisensor-ip
- door_pin: D5
+
+# For the reed switches
+ door: 35
+ moisture: 36
# For the ultrasonic sensor
- trigger_pin: D7
- echo_pin: D6
+ trigger: 14
+ echo: 15
-packages:
- # network: !include common/ethernet.yaml
- network: !include common/wifi.yaml
- device_base: !include common/device_base.yaml
+# Infrared Sensor
+ ir_tx: 12
+ ir_rx: 39
+
+# I2C Pins
+ i2c_sda: 13
+ i2c_scl: 16
+
+# For the ethernet adapter
+ ethernet_mdc_pin: 23
+ ethernet_mdio_pin: 18
+ ethernet_clk_pin: 0
+
+# For the relays
+ relay1: 32
+ relay2: 33
+
+# Built-in button
+ button1: 34
+
+# For the HVAC temperature sensors
+ one_wire: 17
+
+one_wire:
+ - platform: gpio
+ pin: ${one_wire}
esphome:
name: ${devicename}
friendly_name: ${friendly_name}
name_add_mac_suffix: false
-esp8266:
- board: ${board}
+packages:
+ network: !include common/olimex_evb.yaml
+ device_base: !include common/device_base.yaml
+
+
+# Included in common/olimex-evb.yaml
+# esp32:
+# board: esp32dev
+# framework:
+# type: esp-idf
# Enable logging
logger:
-api: # Using settings from common/device_base.yaml
+web_server:
+ port: 80
+ version: 3
+ include_internal: True
-ota: # Using settings from common/device_base.yaml
+# # Enable Home Assistant API
+# api:
+# encryption:
+# key: "mupTLNBggWPdKHxBeY1yV47qXgyhVJUgIVVAvfGrZ40="
+
+# ota:
+# - platform: esphome
+# password: "b43bd5c6f724d64a9bd4e92504830d8f"
+
+remote_receiver:
+ pin: ${ir_rx}
+ dump: all
+
+remote_transmitter:
+ pin: ${ir_tx}
+ carrier_duty_percent: 50%
+
+i2c:
+ sda: ${i2c_sda}
+ scl: ${i2c_scl}
+ scan: true
+ id: bus_a
+
+binary_sensor:
+ - platform: gpio
+ name: "ESP32-EVB button"
+ pin: ${button1}
+
+ - platform: gpio
+ name: "Door"
+ device_class: door
+ filters:
+ - invert:
+ pin:
+ number: ${door}
+ # mode: INPUT_PULLUP
+
+ - platform: gpio
+ name: "Moisture"
+ device_class: moisture
+ pin:
+ number: ${moisture}
+ # mode: INPUT_PULLUP
+
+
+switch:
+ - platform: gpio
+ pin: ${relay1}
+ name: "Relay1"
+
+ - platform: gpio
+ pin: ${relay2}
+ name: "Relay2"
sensor:
- platform: ultrasonic
- trigger_pin: ${trigger_pin}
- echo_pin: ${echo_pin}
+ trigger_pin: ${trigger}
+ echo_pin: ${echo}
id: ultrasonic_source
update_interval: 1s
internal: True
@@ -108,16 +195,4 @@ sensor:
- round: 1
- clamp:
min_value: 0.0
- max_value: 10.0
-
-
-binary_sensor:
- - platform: gpio
- name: "Door"
- device_class: door
- pin:
- number: ${door_pin}
- mode: INPUT_PULLUP
- # filters:
- # - invert:
-
+ max_value: 10.0
\ No newline at end of file
diff --git a/esphome/bathroom-multisensor.yaml b/esphome/bathroom-multisensor.yaml
index 3bd1a1a..6ae5036 100644
--- a/esphome/bathroom-multisensor.yaml
+++ b/esphome/bathroom-multisensor.yaml
@@ -5,11 +5,13 @@ substitutions:
comment: Clever MultiSensor
platform: ESP8266
board: nodemcu
+ i2c_id: bus_a
static_ip: !secret bathroom-multisensor-ip
packages:
network: !include common/wifi.yaml
device_base: !include common/device_base.yaml
+ bme680: !include common/bme680.yaml
esphome:
name: ${devicename}
@@ -29,207 +31,6 @@ web_server:
include_internal: True
i2c:
- - id: bus_a
+ - id: ${i2c_id}
sda: D2
scl: D1
-
-bme680_bsec:
- i2c_id: bus_a
-
- # i2c address
- # -----------
- # Common values are:
- # - 0x76
- # - 0x77
- # Default: 0x76
- address: 0x77
-
- # Temperature offset
- # ------------------
- # Useful if device is in enclosure and reads too high
- # Default: 0
- temperature_offset: 0
-
- # IAQ calculation mode
- # --------------------
- # Available options:
- # - static (for fixed position devices)
- # - mobile (for on person or other moveable devices)
- # Default: static
- iaq_mode: static
-
- # Sample rate
- # -----------
- # This controls the sampling rate for gas-dependant sensors and will govern the interval
- # at which the sensor heater is operated.
- # By default this rate will also be used for temperature, pressure and humidity sensors
- # but these can be overridden on a per-sensor level if required.
- #
- # Available options:
- # - lp (low power - samples every 3 seconds)
- # - ulp (ultra low power - samples every 5 minutes)
- # Default: lp
- sample_rate: lp
-
- # Interval at which to save BSEC state
- # ------------------------------------
- # Default: 6h
- state_save_interval: 6h
-
-sensor:
- # - platform: bme680
- # i2c_id: bus_a
- # address: 0x77
- # update_interval: 3s
- # temperature:
- # name: "Standard Temperature"
- # oversampling: 16x
- # device_class: temperature
- # unit_of_measurement: "°C"
- # web_server:
- # sorting_weight: 10
- # pressure:
- # name: "Standard Pressure"
- # device_class: atmospheric_pressure
- # unit_of_measurement: hPa
- # web_server:
- # sorting_weight: 20
- # humidity:
- # id: "humidity"
- # name: "Standard Humidity"
- # device_class: humidity
- # unit_of_measurement: "%"
- # web_server:
- # sorting_weight: 30
- # gas_resistance:
- # id: "gas_resistance"
- # name: "Standard Gas Resistance"
- # unit_of_measurement: "Ω"
- # web_server:
- # sorting_weight: 40
-
- # - platform: template
- # name: "Standard Indoor Air Quality"
- # id: iaq
- # icon: "mdi:gauge"
- # # calculation: comp_gas = log(R_gas[ohm]) + 0.04 log(Ohm)/%rh * hum[%rh]
- # lambda: |-
- # return log(id(gas_resistance).state) + 0.04 * id(humidity).state;
- # state_class: "measurement"
- # web_server:
- # sorting_weight: 50
-
- - platform: bme680_bsec
- temperature:
- # Temperature in °C
- name: "Temperature"
- id: temp
- sample_rate: lp
- unit_of_measurement: "°C"
- web_server:
- sorting_weight: 11
- filters:
- - median
- pressure:
- # Pressure in hPa
- name: "Pressure"
- id: pressure
- sample_rate: lp
- unit_of_measurement: "hPa"
- web_server:
- sorting_weight: 21
- filters:
- - median
- humidity:
- # Relative humidity %
- id: humidity
- name: "Relative Humidity"
- sample_rate: lp
- unit_of_measurement: "%"
- web_server:
- sorting_weight: 31
- filters:
- - median
- gas_resistance:
- # Gas resistance in Ω
- name: "Gas Resistance"
- id: gas_resistance
- unit_of_measurement: "Ω"
- disabled_by_default: True
- web_server:
- sorting_weight: 41
- filters:
- - median
- iaq:
- # Indoor air quality value
- name: "Air Quality Index"
- unit_of_measurement: "AQI"
- id: iaq
- web_server:
- sorting_weight: 51
- filters:
- - median
- iaq_accuracy:
- # IAQ accuracy as a numeric value of 0, 1, 2, 3
- name: "Numeric IAQ Accuracy"
- id: iaq_accuracy
- disabled_by_default: True
- web_server:
- sorting_weight: 71
- co2_equivalent:
- # CO2 equivalent estimate in ppm
- name: "CO2 Equivalent"
- id: co2
- unit_of_measurement: "ppm"
- web_server:
- sorting_weight: 81
- filters:
- - median
- breath_voc_equivalent:
- # Volatile organic compounds equivalent estimate in ppm
- name: "Breath VOC Equivalent"
- id: breath_voc
- unit_of_measurement: "ppm"
- web_server:
- sorting_weight: 91
- filters:
- - median
-
-text_sensor:
- - platform: template
- name: "IAQ Classification"
- icon: "mdi:checkbox-marked-circle-outline"
- web_server:
- sorting_weight: 60
- lambda: |-
- if (int(id(iaq).state) <= 50) {
- return {"Excellent"};
- }
- else if (int(id(iaq).state) <= 100) {
- return {"Good"};
- }
- else if (int(id(iaq).state) <= 150) {
- return {"Lightly polluted"};
- }
- else if (int(id(iaq).state) <= 200) {
- return {"Moderately polluted"};
- }
- else if (int(id(iaq).state) <= 250) {
- return {"Heavily polluted"};
- }
- else if (int(id(iaq).state) <= 350) {
- return {"Severely polluted"};
- }
- else if (int(id(iaq).state) <= 500) {
- return {"Extremely polluted"};
- }
- else {
- return {"unknown"};
- }
-
- - platform: bme680_bsec
- iaq_accuracy:
- # IAQ accuracy as a text value of Stabilizing, Uncertain, Calibrating, Calibrated
- name: "AQI Accuracy"
- web_server:
- sorting_weight: 61
\ No newline at end of file
diff --git a/esphome/bed-presence-2d14a4.yaml b/esphome/bed-presence-2d14a4.yaml
index 227c381..fc056e1 100644
--- a/esphome/bed-presence-2d14a4.yaml
+++ b/esphome/bed-presence-2d14a4.yaml
@@ -1,7 +1,14 @@
-esphome:
+substitutions:
name: bed-presence-2d14a4
+ devicename: bed-presence-2d14a4
friendly_name: Bed Presence 2d14a4
comment: White Bed Sensor
+ static_ip: !secret white-bed-ip
+
+esphome:
+ name: ${name}
+ friendly_name: ${friendly_name}
+ comment: ${comment}
min_version: 2024.6.0
name_add_mac_suffix: false
project:
@@ -18,27 +25,11 @@ esp32:
CONFIG_BT_BLE_42_FEATURES_SUPPORTED: y
CONFIG_BT_BLE_50_FEATURES_SUPPORTED: n
-# Enable logging
-logger:
-
-# Enable Home Assistant API
-api:
-
-# Enable wifi
-wifi:
- # Set up a wifi access point
- ap: {}
-
-# In combination with the `ap` this allows the user
-# to provision wifi credentials to the device via WiFi AP.
-captive_portal:
-
-# Enable esphome OTA updates
-ota:
-- platform: esphome
################################################################################
packages:
+ base: !include common/device_base.yaml
+ network: !include common/wifi.yaml
remote_package:
url: https://github.com/ElevatedSensors/sensor-configs
ref: main
@@ -47,6 +38,15 @@ packages:
- bed-presence-mk1/base.yaml
- esphome-common/bluetooth-proxy.yaml
+
+binary_sensor:
+ - id: !remove bed_presence_status
+
+button:
+ - id: !remove btn_restart
+
+sensor:
+ - id: !remove bed_presence_uptime
# See https://github.com/ElevatedSensors/sensor-configs/blob/main/bed-presence-mk1/sensor.yaml for a detailed
# description of available substitutions.
#
diff --git a/esphome/bed-presence-c175a4.yaml b/esphome/bed-presence-c175a4.yaml
index fb09d92..97c00f0 100644
--- a/esphome/bed-presence-c175a4.yaml
+++ b/esphome/bed-presence-c175a4.yaml
@@ -1,7 +1,14 @@
-esphome:
+substitutions:
name: bed-presence-c175a4
+ devicename: bed-presence-c175a4
friendly_name: Bed Presence c175a4
comment: Master Bed Sensor
+ static_ip: !secret master-bed-ip
+
+esphome:
+ name: ${name}
+ friendly_name: ${friendly_name}
+ comment: ${comment}
min_version: 2024.6.0
name_add_mac_suffix: false
project:
@@ -18,27 +25,11 @@ esp32:
CONFIG_BT_BLE_42_FEATURES_SUPPORTED: y
CONFIG_BT_BLE_50_FEATURES_SUPPORTED: n
-# Enable logging
-logger:
-
-# Enable Home Assistant API
-api:
-
-# Enable wifi
-wifi:
- # Set up a wifi access point
- ap: {}
-
-# In combination with the `ap` this allows the user
-# to provision wifi credentials to the device via WiFi AP.
-captive_portal:
-
-# Enable esphome OTA updates
-ota:
-- platform: esphome
################################################################################
packages:
+ base: !include common/device_base.yaml
+ network: !include common/wifi.yaml
remote_package:
url: https://github.com/ElevatedSensors/sensor-configs
ref: main
@@ -47,6 +38,14 @@ packages:
- bed-presence-mk1/base.yaml
- esphome-common/bluetooth-proxy.yaml
+binary_sensor:
+ - id: !remove bed_presence_status
+
+button:
+ - id: !remove btn_restart
+
+sensor:
+ - id: !remove bed_presence_uptime
# See https://github.com/ElevatedSensors/sensor-configs/blob/main/bed-presence-mk1/sensor.yaml for a detailed
# description of available substitutions.
#
diff --git a/esphome/circuit-sensor.yaml b/esphome/circuit-sensor.yaml
new file mode 100644
index 0000000..ad50b5e
--- /dev/null
+++ b/esphome/circuit-sensor.yaml
@@ -0,0 +1,19 @@
+substitutions:
+ devicename: circuit-sensor
+ entity_name: circuit_sensor
+ friendly_name: Circuit Sensor
+ board: esp32-s3-devkitc-1
+ framework: esp-idf
+ comment: Clever ${friendly_name}
+ static_ip: !secret circuit-sensor-ip
+
+packages:
+ network: !include common/waveshare_esp32_s3_eth.yaml
+ device_base: !include common/device_base.yaml
+ web_server: !include common/web_server.yaml
+
+esp32:
+ board: ${board}
+ framework:
+ type: ${framework}
+
diff --git a/esphome/common/bme680.yaml b/esphome/common/bme680.yaml
new file mode 100644
index 0000000..9ed5ff0
--- /dev/null
+++ b/esphome/common/bme680.yaml
@@ -0,0 +1,336 @@
+web_server:
+ port: 80
+ version: 3
+ include_internal: true
+ sorting_groups:
+ - id: sorting_group_temperature_settings
+ name: "Temperature Settings"
+ sorting_weight: 10
+ - id: sorting_group_humidity_settings
+ name: "Humidity Settings"
+ sorting_weight: 20
+ - id: sorting_group_pressure_settings
+ name: "Pressure Settings"
+ sorting_weight: 30
+ - id: sorting_group_quality_settings
+ name: "Quality Settings"
+ sorting_weight: 40
+
+
+bme680_bsec:
+ i2c_id: ${i2c_id}
+
+ # i2c address
+ # -----------
+ # Common values are:
+ # - 0x76
+ # - 0x77
+ # Default: 0x76
+ address: 0x77
+
+ # Temperature offset
+ # ------------------
+ # Useful if device is in enclosure and reads too high
+ # Default: 0
+ temperature_offset: 0
+
+ # IAQ calculation mode
+ # --------------------
+ # Available options:
+ # - static (for fixed position devices)
+ # - mobile (for on person or other moveable devices)
+ # Default: static
+ iaq_mode: static
+
+ # Sample rate
+ # -----------
+ # This controls the sampling rate for gas-dependant sensors and will govern the interval
+ # at which the sensor heater is operated.
+ # By default this rate will also be used for temperature, pressure and humidity sensors
+ # but these can be overridden on a per-sensor level if required.
+ #
+ # Available options:
+ # - lp (low power - samples every 3 seconds)
+ # - ulp (ultra low power - samples every 5 minutes)
+ # Default: lp
+ sample_rate: lp
+
+ # Interval at which to save BSEC state
+ # ------------------------------------
+ # Default: 6h
+ state_save_interval: 6h
+
+sensor:
+ - platform: bme680_bsec
+ temperature:
+ # Temperature in °C
+ id: temperature
+ internal: true
+ sample_rate: lp
+ unit_of_measurement: "°C"
+ web_server:
+ sorting_weight: 11
+ sorting_group_id: sorting_group_temperature_settings
+
+ humidity:
+ # Relative humidity %
+ id: humidity
+ internal: true
+ sample_rate: lp
+ unit_of_measurement: "%"
+ web_server:
+ sorting_weight: 21
+ sorting_group_id: sorting_group_humidity_settings
+
+ pressure:
+ # Pressure in hPa
+ id: pressure
+ internal: true
+ sample_rate: lp
+ unit_of_measurement: "hPa"
+ web_server:
+ sorting_weight: 31
+ sorting_group_id: sorting_group_pressure_settings
+
+ gas_resistance:
+ # Gas resistance in Ω
+ id: resistance
+ internal: true
+ unit_of_measurement: "Ω"
+ disabled_by_default: True
+ web_server:
+ sorting_weight: 41
+ sorting_group_id: sorting_group_pressure_settings
+
+ iaq:
+ # Indoor air quality value
+ id: iaq
+ internal: true
+ unit_of_measurement: "AQI"
+ web_server:
+ sorting_weight: 51
+ sorting_group_id: sorting_group_quality_settings
+
+ co2_equivalent:
+ # CO2 equivalent estimate in ppm
+ id: co2
+ internal: true
+ unit_of_measurement: "ppm"
+ web_server:
+ sorting_weight: 61
+ sorting_group_id: sorting_group_quality_settings
+
+ breath_voc_equivalent:
+ # Volatile organic compounds equivalent estimate in ppm
+ id: breath_voc
+ internal: true
+ unit_of_measurement: "ppm"
+ web_server:
+ sorting_weight: 71
+ sorting_group_id: sorting_group_quality_settings
+
+ iaq_accuracy:
+ # IAQ accuracy as a numeric value of 0, 1, 2, 3
+ name: "Numeric IAQ Accuracy"
+ id: iaq_accuracy
+ disabled_by_default: True
+ web_server:
+ sorting_weight: 81
+ sorting_group_id: sorting_group_quality_settings
+ filters:
+ - median:
+ window_size: 20
+ send_every: 20
+ send_first_at: 1
+
+# These source sensors update every 3 seconds
+# An average with a window size of 10 and send_every of 10 means that an average is pushed out every 30 seconds
+
+ - platform: copy
+ source_id: temperature
+ device_class: temperature
+ unit_of_measurement: "°C"
+ name: "Air Temperature"
+ filters:
+ - sliding_window_moving_average:
+ window_size: 10
+ send_every: 10
+ send_first_at: 1
+ web_server:
+ sorting_weight: 12
+ sorting_group_id: sorting_group_temperature_settings
+
+# These derivatives attempt to calculate the change per minute
+
+ - platform: copy
+ source_id: temperature
+ device_class: temperature
+ unit_of_measurement: "°C/m"
+ name: "Air Temperature Change"
+ icon: mdi:chart-line
+ disabled_by_default: true
+ filters:
+ - lambda: |-
+ static float last_value = 0;
+ static float last_time = 0;
+ float time = (float) millis();
+ if (last_time == 0){
+ last_value = x;
+ last_time = time;
+ return {};
+ }
+ float change = ( ( x - last_value ) / ( time - last_time ) ) *1000*5;
+ last_value = x;
+ last_time = time;
+ return change;
+ - sliding_window_moving_average:
+ window_size: 10
+ send_every: 10
+ send_first_at: 1
+ web_server:
+ sorting_weight: 13
+ sorting_group_id: sorting_group_temperature_settings
+
+ - platform: copy
+ source_id: humidity
+ device_class: humidity
+ unit_of_measurement: "%"
+ name: "Relative Humidity"
+ filters:
+ - sliding_window_moving_average:
+ window_size: 10
+ send_every: 10
+ send_first_at: 1
+ web_server:
+ sorting_weight: 22
+ sorting_group_id: sorting_group_humidity_settings
+
+ - platform: copy
+ source_id: humidity
+ device_class: humidity
+ unit_of_measurement: "%/m"
+ name: "Relative Humidity Change"
+ icon: mdi:chart-line
+ disabled_by_default: true
+ filters:
+ - lambda: |-
+ static float last_value = 0;
+ static float last_time = 0;
+ float time = (float) millis();
+ if (last_time == 0){
+ last_value = x;
+ last_time = time;
+ return {};
+ }
+ float change = ( ( x - last_value ) / ( time - last_time ) ) *1000*5;
+ last_value = x;
+ last_time = time;
+ return change;
+ - sliding_window_moving_average:
+ window_size: 10
+ send_every: 10
+ send_first_at: 1
+ web_server:
+ sorting_weight: 23
+ sorting_group_id: sorting_group_humidity_settings
+
+ - platform: copy
+ source_id: pressure
+ unit_of_measurement: "hPa"
+ name: "Pressure"
+ filters:
+ - sliding_window_moving_average:
+ window_size: 10
+ send_every: 10
+ send_first_at: 1
+ web_server:
+ sorting_group_id: sorting_group_pressure_settings
+
+ - platform: copy
+ source_id: resistance
+ unit_of_measurement: "Ω"
+ name: "Gas Resistance"
+ filters:
+ - sliding_window_moving_average:
+ window_size: 10
+ send_every: 10
+ send_first_at: 1
+ web_server:
+ sorting_group_id: sorting_group_pressure_settings
+
+ - platform: copy
+ source_id: iaq
+ unit_of_measurement: "AQI"
+ name: "Air Quality Index"
+ filters:
+ - sliding_window_moving_average:
+ window_size: 10
+ send_every: 10
+ send_first_at: 1
+ web_server:
+ sorting_group_id: sorting_group_quality_settings
+
+ - platform: copy
+ source_id: co2
+ unit_of_measurement: "ppm"
+ name: "CO2 Equivalent"
+ filters:
+ - sliding_window_moving_average:
+ window_size: 10
+ send_every: 10
+ send_first_at: 1
+ web_server:
+ sorting_group_id: sorting_group_quality_settings
+
+ - platform: copy
+ source_id: breath_voc
+ unit_of_measurement: "ppm"
+ name: "Breath VOC Equivalent"
+ filters:
+ - sliding_window_moving_average:
+ window_size: 10
+ send_every: 10
+ send_first_at: 1
+ web_server:
+ sorting_group_id: sorting_group_quality_settings
+
+text_sensor:
+ - platform: template
+ name: "IAQ Classification"
+ icon: "mdi:checkbox-marked-circle-outline"
+ web_server:
+ sorting_weight: 60
+ sorting_group_id: sorting_group_quality_settings
+ lambda: |-
+ if (int(id(iaq).state) <= 50) {
+ return {"Excellent"};
+ }
+ else if (int(id(iaq).state) <= 100) {
+ return {"Good"};
+ }
+ else if (int(id(iaq).state) <= 150) {
+ return {"Lightly polluted"};
+ }
+ else if (int(id(iaq).state) <= 200) {
+ return {"Moderately polluted"};
+ }
+ else if (int(id(iaq).state) <= 250) {
+ return {"Heavily polluted"};
+ }
+ else if (int(id(iaq).state) <= 350) {
+ return {"Severely polluted"};
+ }
+ else if (int(id(iaq).state) <= 500) {
+ return {"Extremely polluted"};
+ }
+ else {
+ return {"unknown"};
+ }
+
+ - platform: bme680_bsec
+ iaq_accuracy:
+ # IAQ accuracy as a text value of Stabilizing, Uncertain, Calibrating, Calibrated
+ name: "AQI Accuracy"
+ web_server:
+ sorting_weight: 61
+ sorting_group_id: sorting_group_quality_settings
\ No newline at end of file
diff --git a/esphome/common/device_base.yaml b/esphome/common/device_base.yaml
index 596c9f0..9c0dfc1 100644
--- a/esphome/common/device_base.yaml
+++ b/esphome/common/device_base.yaml
@@ -16,9 +16,12 @@ time:
# Enable Home Assistant API
api:
reboot_timeout: 15min
+ encryption:
+ key: !secret api-encryption-key
ota:
- platform: esphome
+ password: !secret ota-password
binary_sensor:
- <<: !include binary_sensor/status_sensor.config.yaml
diff --git a/esphome/common/ethernet.yaml b/esphome/common/ethernet.yaml
index 6303907..f24a608 100644
--- a/esphome/common/ethernet.yaml
+++ b/esphome/common/ethernet.yaml
@@ -16,7 +16,6 @@ ethernet:
gateway: !secret iot_default_gateway
subnet: !secret iot_subnet_mask
dns1: !secret iot_default_dns1
- dns2: !secret iot_default_dns2
text_sensor:
- <<: !include text_sensor/ethernet_info.config.yaml
\ No newline at end of file
diff --git a/esphome/common/olimex_evb.yaml b/esphome/common/olimex_evb.yaml
index edb6a43..ac5f2e6 100644
--- a/esphome/common/olimex_evb.yaml
+++ b/esphome/common/olimex_evb.yaml
@@ -21,7 +21,6 @@ ethernet:
gateway: !secret iot_default_gateway
subnet: !secret iot_subnet_mask
dns1: !secret iot_default_dns1
- dns2: !secret iot_default_dns2
text_sensor:
- <<: !include text_sensor/ethernet_info.config.yaml
\ No newline at end of file
diff --git a/esphome/common/waveshare-esp32-eth-example.yaml b/esphome/common/waveshare-esp32-eth-example.yaml
new file mode 100644
index 0000000..fc50d06
--- /dev/null
+++ b/esphome/common/waveshare-esp32-eth-example.yaml
@@ -0,0 +1,82 @@
+esphome:
+ name: ${devicename}
+ platformio_options:
+ board_build.arduino.memory_type: qio_opi
+ board_build.flash_mode: dio
+ upload_speed: 921600
+ monitor_speed: 115200
+
+esp32:
+ board: ${board}
+ flash_size: 16MB
+ framework:
+ type: ${framework}
+ sdkconfig_options:
+ CONFIG_ESP32_S3_BOX_BOARD: "y"
+
+psram:
+ mode: octal
+ speed: 80MHz
+
+# logger:
+
+# api:
+# encryption:
+# key: !secret api_encryption_psk
+
+# ota:
+# - platform: esphome
+# password: !secret ota-password
+
+ethernet:
+ type: W5500
+ clk_pin: GPIO13
+ mosi_pin: GPIO11
+ miso_pin: GPIO12
+ cs_pin: GPIO14
+ interrupt_pin: GPIO10
+ reset_pin: GPIO9
+
+######################################
+### Camera
+######################################
+
+# esp32_camera:
+# name: ${room_friendly_name} Camera
+# external_clock:
+# pin: GPIO3
+# frequency: 20MHz
+# i2c_pins:
+# sda: GPIO48
+# scl: GPIO47
+# data_pins: [GPIO41, GPIO45, GPIO46, GPIO42, GPIO40, GPIO38, GPIO15, GPIO18]
+# vsync_pin: GPIO1
+# href_pin: GPIO2
+# pixel_clock_pin: GPIO39
+# power_down_pin: GPIO8
+# resolution: 640x480
+# jpeg_quality: 10
+# #resolution: 1280x1024
+# #jpeg_quality: 30
+# vertical_flip: false
+# horizontal_mirror: false
+# # aec_mode: MANUAL
+# # aec_value: 1200
+# # brightness: 2
+# # wb_mode: HOME
+# # agc_mode: AUTO
+
+
+#######################################
+### Bluetooth Proxy
+#######################################
+
+esp32_ble_tracker:
+ scan_parameters:
+ # only use these values on Ethernet not WIFI
+ interval: 1100ms
+ window: 1100ms
+ active: true
+
+bluetooth_proxy:
+ active: true
\ No newline at end of file
diff --git a/esphome/common/waveshare_esp32_s3_eth_poe.yaml b/esphome/common/waveshare_esp32_s3_eth.yaml
similarity index 51%
rename from esphome/common/waveshare_esp32_s3_eth_poe.yaml
rename to esphome/common/waveshare_esp32_s3_eth.yaml
index 98b09f1..cc2f97e 100644
--- a/esphome/common/waveshare_esp32_s3_eth_poe.yaml
+++ b/esphome/common/waveshare_esp32_s3_eth.yaml
@@ -1,8 +1,22 @@
+esphome:
+ name: ${devicename}
+ platformio_options:
+ board_build.arduino.memory_type: qio_opi
+ board_build.flash_mode: dio
+ upload_speed: 921600
+ monitor_speed: 115200
+
esp32:
- board: esp32-s3
+ board: ${board}
+ flash_size: 16MB
framework:
- #type: arduino
- type: esp-idf
+ type: ${framework}
+ sdkconfig_options:
+ CONFIG_ESP32_S3_BOX_BOARD: "y"
+
+psram:
+ mode: octal
+ speed: 80MHz
ethernet:
id: eth
@@ -21,7 +35,9 @@ ethernet:
gateway: !secret iot_default_gateway
subnet: !secret iot_subnet_mask
dns1: !secret iot_default_dns1
- dns2: !secret iot_default_dns2
+
+packages:
+ ble_proxy: !include ../common/ble_proxy.yaml
text_sensor:
- <<: !include text_sensor/ethernet_info.config.yaml
\ No newline at end of file
diff --git a/esphome/common/wifi.yaml b/esphome/common/wifi.yaml
index a59309e..6e013a2 100644
--- a/esphome/common/wifi.yaml
+++ b/esphome/common/wifi.yaml
@@ -2,29 +2,27 @@ esphome:
captive_portal:
wifi:
- #power_save_mode: none
- networks:
- - ssid: !secret Wifi_SSID
- password: !secret Wifi_PWD
+ # Enable fast connect
+ fast_connect: true
+ min_auth_mode: WPA2
+ use_address: ${devicename}.local
- #- ssid: !secret IoT_Wifi_SSID
- # password: !secret IoT_Wifi_PWD
+ networks:
+ - ssid: !secret wifi_ssid
+ password: !secret wifi_password
+ hidden: true
manual_ip:
static_ip: ${static_ip}
gateway: !secret iot_default_gateway
subnet: !secret iot_subnet_mask
-
- use_address: ${devicename}.local
+ dns1: !secret iot_default_dns1
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "${friendly_name}"
password: !secret fallback_ap_password
- # Enable fast connect
- fast_connect: true
-
sensor:
- <<: !include sensor/rssi_sensor.config.yaml
diff --git a/esphome/common/wifi_dhcp.yaml b/esphome/common/wifi_dhcp.yaml
index d1bbee4..4a9882f 100644
--- a/esphome/common/wifi_dhcp.yaml
+++ b/esphome/common/wifi_dhcp.yaml
@@ -1,16 +1,17 @@
+esphome:
captive_portal:
wifi:
- power_save_mode: none
- networks:
- - ssid: !secret Wifi_SSID
- password: !secret Wifi_PWD
-
- - ssid: !secret IoT_Wifi_SSID
- password: !secret IoT_Wifi_PWD
-
+ # Enable fast connect
+ fast_connect: true
+ min_auth_mode: WPA2
use_address: ${devicename}.local
+ networks:
+ - ssid: !secret wifi_ssid
+ password: !secret wifi_password
+ hidden: true
+
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "${friendly_name}"
diff --git a/esphome/common/wifi_no_power_save.yaml b/esphome/common/wifi_no_power_save.yaml
deleted file mode 100644
index bff325f..0000000
--- a/esphome/common/wifi_no_power_save.yaml
+++ /dev/null
@@ -1,30 +0,0 @@
-esphome:
-captive_portal:
-
-wifi:
- ssid: !secret Wifi_SSID
- password: !secret Wifi_PWD
-
- #- ssid: !secret IoT_Wifi_SSID
- # password: !secret IoT_Wifi_PWD
-
- use_address: ${devicename}.local
-
- manual_ip:
- static_ip: ${static_ip}
- gateway: !secret iot_default_gateway
- subnet: !secret iot_subnet_mask
-
- # Enable fallback hotspot (captive portal) in case wifi connection fails
- ap:
- ssid: "${friendly_name}"
- password: !secret fallback_ap_password
-
- # Enable fast connect
- fast_connect: true
-
-sensor:
- - <<: !include sensor/rssi_sensor.config.yaml
-
-text_sensor:
- - <<: !include text_sensor/wifi_sensor.config.yaml
\ No newline at end of file
diff --git a/esphome/everything-presence-lite-8fa4fc.yaml b/esphome/everything-presence-lite-8fa4fc.yaml
index e4464a8..86cd027 100644
--- a/esphome/everything-presence-lite-8fa4fc.yaml
+++ b/esphome/everything-presence-lite-8fa4fc.yaml
@@ -53,25 +53,19 @@
substitutions:
name: everything-presence-lite-8fa4fc
+ devicename: everything-presence-lite-8fa4fc
friendly_name: Everything Presence Great Room
+ static_ip: !secret everything-presence-greate-room-ip
+
packages:
+ base: !include common/device_base.yaml
+ network: !include common/wifi.yaml
EverythingSmartTechnology.Everything_Presence_Lite: github://everythingsmarthome/everything-presence-lite/everything-presence-lite-ha.yaml@main
+
esphome:
name: ${name}
name_add_mac_suffix: false
friendly_name: ${friendly_name}
-api:
- encryption:
- key: Qi7Fi+ayleijFB6gE1/jnEtuI95NCEiwNM/QnqB+e28=
-
-
-wifi:
- ssid: !secret wifi_ssid
- password: !secret wifi_password
-
-binary_sensor:
- - platform: status
- name: "Status"
# sensor:
# - platform: bme280_i2c
diff --git a/esphome/furnace-room-multisensor.yaml b/esphome/furnace-room-multisensor.yaml
index 560e86b..44bc6c1 100644
--- a/esphome/furnace-room-multisensor.yaml
+++ b/esphome/furnace-room-multisensor.yaml
@@ -1,3 +1,4 @@
+# 3v3 en svp sun 34 35 32 33 25 26 27 14 12 gnd 13 sd2 sd3 gnd 5v
substitutions:
devicename: furnace-room-multisensor
entity_name: furnace_room_multisensor
@@ -6,126 +7,42 @@ substitutions:
board: nodemcuv2
static_ip: !secret furnace-room-multisensor-ip
+ moisture: D1
+ door: D2
+ one_wire: D5
+ ultrasonic_trigger: D6
+ ultrasonic_echo: D7
-# For the reed switches
- door: 35
- moisture: 36
-
-# For the ultrasonic sensor
- trigger: 14
- echo: 15
-
-# Infrared Sensor
- ir_tx: 12
- ir_rx: 39
-
-# I2C Pins
- i2c_sda: 13
- i2c_scl: 16
-
-# For the ethernet adapter
- ethernet_mdc_pin: 23
- ethernet_mdio_pin: 18
- ethernet_clk_pin: 0
-
-# For the relays
- relay1: 32
- relay2: 33
-
-# Built-in button
- button1: 34
-
-# For the HVAC temperature sensors
- one_wire: 17
-
-one_wire:
- - platform: gpio
- pin: ${one_wire}
+packages:
+ network: !include common/wifi.yaml
+ device_base: !include common/device_base.yaml
+ web_server: !include common/web_server.yaml
esphome:
name: ${devicename}
friendly_name: ${friendly_name}
name_add_mac_suffix: false
-packages:
- network: !include common/olimex_evb.yaml
- device_base: !include common/device_base.yaml
-
-
-# Included in common/olimex-evb.yaml
-# esp32:
-# board: esp32dev
-# framework:
-# type: esp-idf
+esp8266:
+ board: ${board}
# Enable logging
logger:
-web_server:
- port: 80
- version: 3
- include_internal: True
+api: # Using settings from common/device_base.yaml
-# # Enable Home Assistant API
-# api:
-# encryption:
-# key: "mupTLNBggWPdKHxBeY1yV47qXgyhVJUgIVVAvfGrZ40="
+ota: # Using settings from common/device_base.yaml
-# ota:
-# - platform: esphome
-# password: "b43bd5c6f724d64a9bd4e92504830d8f"
-
-remote_receiver:
- pin: ${ir_rx}
- dump: all
-
-remote_transmitter:
- pin: ${ir_tx}
- carrier_duty_percent: 50%
-
-i2c:
- sda: ${i2c_sda}
- scl: ${i2c_scl}
- scan: true
- id: bus_a
-
-binary_sensor:
+one_wire:
- platform: gpio
- name: "ESP32-EVB button"
- pin: ${button1}
-
- - platform: gpio
- name: "Door"
- device_class: door
- filters:
- - invert:
- pin:
- number: ${door}
- # mode: INPUT_PULLUP
-
- - platform: gpio
- name: "Moisture"
- device_class: moisture
- pin:
- number: ${moisture}
- # mode: INPUT_PULLUP
-
-
-switch:
- - platform: gpio
- pin: ${relay1}
- name: "Relay1"
-
- - platform: gpio
- pin: ${relay2}
- name: "Relay2"
+ pin: ${one_wire}
sensor:
- platform: ultrasonic
- trigger_pin: ${trigger}
- echo_pin: ${echo}
+ trigger_pin: ${ultrasonic_trigger}
+ echo_pin: ${ultrasonic_echo}
id: ultrasonic_source
- update_interval: 1s
+ update_interval: 60s
internal: True
filters:
- sliding_window_moving_average:
@@ -136,17 +53,9 @@ sensor:
- clamp:
min_value: 0.0
max_value: 150.0
- on_value:
- then:
- - sensor.template.publish:
- id: distance_from_bottom
- state: !lambda 'return id(ultrasonic_source).state;'
- - sensor.template.publish:
- id: distance_from_top
- state: !lambda 'return id(ultrasonic_source).state;'
-
- - platform: template
+ - platform: copy
+ source_id: ultrasonic_source
unit_of_measurement: "cm"
state_class: measurement
id: distance_from_bottom
@@ -160,13 +69,8 @@ sensor:
min_value: 0.0
max_value: 150.0
- on_value:
- then:
- - sensor.template.publish:
- id: level_in_bags
- state: !lambda 'return id(distance_from_bottom).state;'
-
- - platform: template
+ - platform: copy
+ source_id: ultrasonic_source
unit_of_measurement: "cm"
state_class: measurement
id: distance_from_top
@@ -180,9 +84,9 @@ sensor:
- clamp:
min_value: 0.0
max_value: 150.0
-
-
- - platform: template
+
+ - platform: copy
+ source_id: distance_from_bottom
unit_of_measurement: "bags"
state_class: measurement
id: level_in_bags
@@ -195,4 +99,89 @@ sensor:
- round: 1
- clamp:
min_value: 0.0
- max_value: 10.0
\ No newline at end of file
+ max_value: 10.0
+
+ - platform: dallas_temp
+ address: 0x5a3c01d6078a2e28
+ name: "Probe 1"
+ id: probe1
+ device_class: "temperature"
+ update_interval: 5s
+ filters:
+ - lambda: return x * (9.0/5.0) + 32.0;
+ - clamp:
+ min_value: 0.0
+ max_value: 150.0
+ - round: 2
+ - or:
+ - throttle: 60s
+ - delta: 1.0
+ unit_of_measurement: "°F"
+ state_class: measurement
+
+ - platform: dallas_temp
+ address: 0x6b3c01d6077bbb28
+ name: "Probe 2"
+ id: probe2
+ device_class: "temperature"
+ update_interval: 5s
+ filters:
+ - clamp:
+ min_value: 0.0
+ max_value: 150.0
+ - or:
+ - throttle: 60s
+ - delta: 1.0
+ - lambda: return round( (x * (9.0/5.0) + 32.0) * 100.0) / 100.0;
+ unit_of_measurement: "°F"
+ state_class: measurement
+
+ - platform: dallas_temp
+ address: 0x2a3c01d6073e0728
+ name: "Probe 3"
+ id: probe3
+ device_class: "temperature"
+ update_interval: 5s
+ filters:
+ - lambda: return round( (x * (9.0/5.0) + 32.0) * 100.0) / 100.0;
+ - clamp:
+ min_value: 0.0
+ max_value: 150.0
+ - or:
+ - throttle: 60s
+ - delta: 1.0
+ accuracy_decimals: 2
+ unit_of_measurement: "°F"
+ state_class: measurement
+
+ - platform: template
+ name: "Delta"
+ id: hvac_delta
+ icon: mdi:thermometer-lines
+ lambda: |-
+ return id(probe1).state - id(probe2).state;
+ update_interval: 10s
+ unit_of_measurement: "°F"
+ state_class: measurement
+ device_class: ""
+ accuracy_decimals: 2
+ filters:
+ - or:
+ - throttle: 60s
+ - delta: 1.0
+
+binary_sensor:
+ - platform: gpio
+ name: "Door"
+ device_class: door
+ pin:
+ number: ${door}
+ mode: INPUT_PULLUP
+
+ - platform: gpio
+ name: "Leak"
+ device_class: moisture
+ pin:
+ number: ${moisture}
+ mode: INPUT_PULLUP
+ inverted: true
diff --git a/esphome/home-assistant-voice-097b44.yaml b/esphome/home-assistant-voice-097b44.yaml
index 03e5920..d11cacc 100644
--- a/esphome/home-assistant-voice-097b44.yaml
+++ b/esphome/home-assistant-voice-097b44.yaml
@@ -9,8 +9,7 @@ esphome:
friendly_name: ${friendly_name}
api:
encryption:
- key: iAx9Roq7zrUefNVRfIGGd+5u7QXMYdCMoCPXfIIACpk=
-
+ key: !secret api-encryption-key
wifi:
ssid: !secret wifi_ssid
diff --git a/esphome/hvac-multisensor.yaml b/esphome/hvac-multisensor.yaml
deleted file mode 100644
index dcc7dc5..0000000
--- a/esphome/hvac-multisensor.yaml
+++ /dev/null
@@ -1,110 +0,0 @@
-# 3v3 en svp sun 34 35 32 33 25 26 27 14 12 gnd 13 sd2 sd3 gnd 5v
-substitutions:
- devicename: hvac-multisensor
- entity_name: hvac_multisensor
- friendly_name: HVAC MultiSensor
- comment: Clever MultiSensor
- platform: ESP8266
- board: d1_mini
- #variant: esp32
- # framework: esp-idf
- #framework: arduino
- static_ip: !secret hvac-multisensor-ip
-
-packages:
- network: !include common/wifi.yaml
- device_base: !include common/device_base.yaml
-
-esphome:
- name: ${devicename}
- friendly_name: ${friendly_name}
- name_add_mac_suffix: false
-
-esp8266:
- board: ${board}
-
-# Enable logging
-logger:
- #level: VERBOSE
-
-
-one_wire:
- - platform: gpio
- pin: D5
-
-sensor:
- - platform: dallas_temp
- address: 0x5a3c01d6078a2e28
- name: "Probe 1"
- id: probe1
- icon: mdi:thermostat
- update_interval: 10s
- filters:
- - lambda: |-
- float val = x;
- if (isnan(val)) {
- val = 0.0;
- }
- return val * (9.0/5.0) + 32.0;
- - clamp:
- min_value: 0.0
- max_value: 150.0
- - or:
- - throttle: 60s
- - delta: 1.0
- unit_of_measurement: "°F"
- state_class: measurement
-
- - platform: dallas_temp
- address: 0x6b3c01d6077bbb28
- name: "Probe 2"
- id: probe2
- icon: mdi:thermostat
- update_interval: 10s
- filters:
- - lambda: return x * (9.0/5.0) + 32.0;
- - clamp:
- min_value: 0.0
- max_value: 150.0
- - or:
- - throttle: 60s
- - delta: 1.0
- unit_of_measurement: "°F"
- state_class: measurement
-
- - platform: dallas_temp
- address: 0x2a3c01d6073e0728
- name: "Probe 3"
- id: probe3
- icon: mdi:thermostat
- update_interval: 10s
- filters:
- - lambda: return x * (9.0/5.0) + 32.0;
- - clamp:
- min_value: 0.0
- max_value: 150.0
- - or:
- - throttle: 60s
- - delta: 1.0
- unit_of_measurement: "°F"
- state_class: measurement
-
- - platform: template
- name: "Delta"
- id: hvac_delta
- icon: mdi:thermometer-lines
- lambda: |-
- return round( (id(probe1).state - id(probe2).state) * 100.0) / 100.0;
- update_interval: 10s
- unit_of_measurement: "°F"
- state_class: measurement
- device_class: ""
- accuracy_decimals: 1
- filters:
- #- lambda: 'return round( (id(probe1).state - id(probe2).state) * 100.0) / 100.0;'
- - clamp:
- min_value: -100.0
- max_value: 100.0
- - or:
- - throttle: 60s
- - delta: 1.0
diff --git a/esphome/power-monitor.yaml b/esphome/power-monitor.yaml
index 495c8eb..0775728 100644
--- a/esphome/power-monitor.yaml
+++ b/esphome/power-monitor.yaml
@@ -78,6 +78,30 @@ substitutions:
# >= v1.3: 7305
voltage_cal: '7305'
+
+ spi_clk: 18
+ spi_miso: 19
+ spi_mosi: 23
+ ic1_main: 5
+ ic1_addon1: 0
+ ic1_addon2: 27
+ ic1_addon3: 2
+ ic2_main: 4
+ ic2_addon1: 16
+ ic2_addon2: 17
+ ic2_addon3: 21
+
+# ethernet:
+# id: eth
+# type: W5500
+# clk_pin: GPIO13
+# mosi_pin: GPIO11
+# miso_pin: GPIO12
+# cs_pin: GPIO14
+# interrupt_pin: GPIO10
+# reset_pin: GPIO9
+
+
packages:
wifi: !include common/wifi.yaml
# device_base: !include common/complex_esp32_base.yaml
@@ -95,19 +119,19 @@ time:
timezone: America/Detroit
logger:
- level: DEBUG
- logs:
- sensor: DEBUG
+ # level: DEBUG
+ # logs:
+ # sensor: DEBUG
spi:
- clk_pin: 18
- miso_pin: 19
- mosi_pin: 23
+ clk_pin: ${spi_clk}
+ miso_pin: ${spi_miso}
+ mosi_pin: ${spi_mosi}
sensor:
#IC1 Main
- platform: atm90e32
- cs_pin: 5
+ cs_pin: ${ic1_main}
phase_a:
voltage:
name: ${friendly_name} [V]
@@ -171,7 +195,7 @@ sensor:
#IC2 Main
- platform: atm90e32
- cs_pin: 4
+ cs_pin: ${ic2_main}
phase_a:
current:
name: ${friendly_name} ${ct04Name} [A]
@@ -230,7 +254,7 @@ sensor:
#IC1 AddOn 1
- platform: atm90e32
- cs_pin: 0
+ cs_pin: ${ic1_addon1}
phase_a:
power:
name: ${friendly_name} ${ct07Name} [W]
@@ -273,7 +297,7 @@ sensor:
update_interval: ${update_time}
#IC2 AddOn 1
- platform: atm90e32
- cs_pin: 16
+ cs_pin: ${ic2_addon1}
phase_a:
power:
name: ${friendly_name} ${ct10Name} [W]
@@ -318,7 +342,7 @@ sensor:
#IC1 AddOn 2
- platform: atm90e32
- cs_pin: 27
+ cs_pin: ${ic1_addon2}
phase_a:
power:
name: ${friendly_name} ${ct13Name} [W]
@@ -363,7 +387,7 @@ sensor:
update_interval: ${update_time}
#IC2 AddOn 2
- platform: atm90e32
- cs_pin: 17
+ cs_pin: ${ic2_addon2}
phase_a:
power:
name: ${friendly_name} ${ct16Name} [W]
@@ -408,7 +432,7 @@ sensor:
#IC1 AddOn 3
- platform: atm90e32
#do not use GPIO2 if ESP32 has an on-board LED assigned to it
- cs_pin: 2
+ cs_pin: ${ic1_addon3}
phase_a:
power:
name: ${friendly_name} ${ct19Name} [W]
@@ -449,7 +473,7 @@ sensor:
update_interval: ${update_time}
#IC2 AddOn 3
- platform: atm90e32
- cs_pin: 21
+ cs_pin: ${ic2_addon3}
phase_a:
power:
#name: ${friendly_name} ${ct22Name} [W]
diff --git a/esphome/test-device-1.yaml b/esphome/test-device-1.yaml
index 3619802..5e44b34 100644
--- a/esphome/test-device-1.yaml
+++ b/esphome/test-device-1.yaml
@@ -1,56 +1,42 @@
-esphome:
- name: test-device-1
+substitutions:
+ devicename: test-device-1
+ entity_name: test_device_1
friendly_name: Test Device 1
+ board: esp32dev
+ framework: esp-idf
+ comment: Clever Device
esp32:
- board: esp32dev
+ board: ${board}
framework:
- type: esp-idf
+ type: ${framework}
-# Enable logging
-logger:
-
-# Enable Home Assistant API
-api:
- encryption:
- key: "PySr6PXZw6crnoT/oQJC3hYyVnPlXi2OwF8CAuA1d1U="
-
-ota:
- - platform: esphome
- password: "d9ccd2607c37bc67061f8f76971ec953"
-
-wifi:
- ssid: !secret wifi_ssid
- password: !secret wifi_password
-
- # Enable fallback hotspot (captive portal) in case wifi connection fails
- ap:
- ssid: "Test-Device-1 Fallback Hotspot"
- password: "ELfuAtKmRwOC"
+packages:
+ network: !include common/wifi_dhcp.yaml
+ device_base: !include common/device_base.yaml
+ web_server: !include common/web_server.yaml
# For Ultrasonic Sensor
# trigger_pin: GPIO13
# echo_pin: GPIO14
-captive_portal:
+# i2c:
+# - id: bus_a
+# sda: 21
+# scl: 22
+# scan: true
-i2c:
- - id: bus_a
- sda: 21
- scl: 22
- scan: true
+# - id: bus_b
+# sda: 32
+# scl: 33
+# scan: true
- - id: bus_b
- sda: 32
- scl: 33
- scan: true
-
-sensor:
- - platform: ultrasonic
- update_interval: 1s
- trigger_pin: GPIO13
- echo_pin: GPIO14
- name: "Ultrasonic Sensor"
+# sensor:
+ # - platform: ultrasonic
+ # update_interval: 1s
+ # trigger_pin: GPIO13
+ # echo_pin: GPIO14
+ # name: "Ultrasonic Sensor"
# - platform: bme280_i2c
# i2c_id: bus_a
@@ -74,63 +60,63 @@ sensor:
# humidity:
# name: "BME280 76B Humidity"
- - platform: bme680
- i2c_id: bus_a
- temperature:
- name: "BME680 Temperature"
- oversampling: 16x
- pressure:
- name: "BME680 Pressure"
- humidity:
- id: "humidity"
- name: "BME680 Humidity"
- gas_resistance:
- id: "gas_resistance"
- name: "BME680 Gas Resistance"
- address: 0x77
- update_interval: 60s
- - platform: template
- name: "BME680 Indoor Air Quality"
- id: iaq
- icon: "mdi:gauge"
- # calculation: comp_gas = log(R_gas[ohm]) + 0.04 log(Ohm)/%rh * hum[%rh]
- lambda: |-
- return log(id(gas_resistance).state) + 0.04 * id(humidity).state;
- state_class: "measurement"
+# - platform: bme680
+# i2c_id: bus_a
+# temperature:
+# name: "BME680 Temperature"
+# oversampling: 16x
+# pressure:
+# name: "BME680 Pressure"
+# humidity:
+# id: "humidity"
+# name: "BME680 Humidity"
+# gas_resistance:
+# id: "gas_resistance"
+# name: "BME680 Gas Resistance"
+# address: 0x77
+# update_interval: 60s
+# - platform: template
+# name: "BME680 Indoor Air Quality"
+# id: iaq
+# icon: "mdi:gauge"
+# # calculation: comp_gas = log(R_gas[ohm]) + 0.04 log(Ohm)/%rh * hum[%rh]
+# lambda: |-
+# return log(id(gas_resistance).state) + 0.04 * id(humidity).state;
+# state_class: "measurement"
-text_sensor:
- - platform: template
- name: "BME680 IAQ Classification"
- icon: "mdi:checkbox-marked-circle-outline"
- lambda: |-
- if (int(id(iaq).state) <= 50) {
- return {"Excellent"};
- }
- else if (int(id(iaq).state) <= 100) {
- return {"Good"};
- }
- else if (int(id(iaq).state) <= 150) {
- return {"Lightly polluted"};
- }
- else if (int(id(iaq).state) <= 200) {
- return {"Moderately polluted"};
- }
- else if (int(id(iaq).state) <= 250) {
- return {"Heavily polluted"};
- }
- else if (int(id(iaq).state) <= 350) {
- return {"Severely polluted"};
- }
- else if (int(id(iaq).state) <= 500) {
- return {"Extremely polluted"};
- }
- else {
- return {"unknown"};
- }
+# text_sensor:
+# - platform: template
+# name: "BME680 IAQ Classification"
+# icon: "mdi:checkbox-marked-circle-outline"
+# lambda: |-
+# if (int(id(iaq).state) <= 50) {
+# return {"Excellent"};
+# }
+# else if (int(id(iaq).state) <= 100) {
+# return {"Good"};
+# }
+# else if (int(id(iaq).state) <= 150) {
+# return {"Lightly polluted"};
+# }
+# else if (int(id(iaq).state) <= 200) {
+# return {"Moderately polluted"};
+# }
+# else if (int(id(iaq).state) <= 250) {
+# return {"Heavily polluted"};
+# }
+# else if (int(id(iaq).state) <= 350) {
+# return {"Severely polluted"};
+# }
+# else if (int(id(iaq).state) <= 500) {
+# return {"Extremely polluted"};
+# }
+# else {
+# return {"unknown"};
+# }
-esp32_touch:
+# esp32_touch:
binary_sensor:
diff --git a/esphome/utility-room-multisensor.yaml b/esphome/utility-room-multisensor.yaml
index d75f05c..3497c31 100644
--- a/esphome/utility-room-multisensor.yaml
+++ b/esphome/utility-room-multisensor.yaml
@@ -5,11 +5,13 @@ substitutions:
comment: Clever MultiSensor
platform: ESP8266
board: nodemcu
+ i2c_id: bus_a
static_ip: !secret utility-room-multisensor-ip
packages:
network: !include common/wifi.yaml
device_base: !include common/device_base.yaml
+ bme680: !include common/bme680.yaml
esphome:
name: ${devicename}
@@ -29,207 +31,6 @@ web_server:
include_internal: True
i2c:
- - id: bus_a
+ - id: ${i2c_id}
sda: D6
scl: D5
-
-bme680_bsec:
- i2c_id: bus_a
-
- # i2c address
- # -----------
- # Common values are:
- # - 0x76
- # - 0x77
- # Default: 0x76
- address: 0x77
-
- # Temperature offset
- # ------------------
- # Useful if device is in enclosure and reads too high
- # Default: 0
- temperature_offset: 0
-
- # IAQ calculation mode
- # --------------------
- # Available options:
- # - static (for fixed position devices)
- # - mobile (for on person or other moveable devices)
- # Default: static
- iaq_mode: static
-
- # Sample rate
- # -----------
- # This controls the sampling rate for gas-dependant sensors and will govern the interval
- # at which the sensor heater is operated.
- # By default this rate will also be used for temperature, pressure and humidity sensors
- # but these can be overridden on a per-sensor level if required.
- #
- # Available options:
- # - lp (low power - samples every 3 seconds)
- # - ulp (ultra low power - samples every 5 minutes)
- # Default: lp
- sample_rate: lp
-
- # Interval at which to save BSEC state
- # ------------------------------------
- # Default: 6h
- state_save_interval: 6h
-
-sensor:
- # - platform: bme680
- # i2c_id: bus_a
- # address: 0x77
- # update_interval: 3s
- # temperature:
- # name: "Standard Temperature"
- # oversampling: 16x
- # device_class: temperature
- # unit_of_measurement: "°C"
- # web_server:
- # sorting_weight: 10
- # pressure:
- # name: "Standard Pressure"
- # device_class: atmospheric_pressure
- # unit_of_measurement: hPa
- # web_server:
- # sorting_weight: 20
- # humidity:
- # id: "humidity"
- # name: "Standard Humidity"
- # device_class: humidity
- # unit_of_measurement: "%"
- # web_server:
- # sorting_weight: 30
- # gas_resistance:
- # id: "gas_resistance"
- # name: "Standard Gas Resistance"
- # unit_of_measurement: "Ω"
- # web_server:
- # sorting_weight: 40
-
- # - platform: template
- # name: "Standard Indoor Air Quality"
- # id: iaq
- # icon: "mdi:gauge"
- # # calculation: comp_gas = log(R_gas[ohm]) + 0.04 log(Ohm)/%rh * hum[%rh]
- # lambda: |-
- # return log(id(gas_resistance).state) + 0.04 * id(humidity).state;
- # state_class: "measurement"
- # web_server:
- # sorting_weight: 50
-
- - platform: bme680_bsec
- temperature:
- # Temperature in °C
- name: "Temperature"
- id: temp
- sample_rate: lp
- unit_of_measurement: "°C"
- web_server:
- sorting_weight: 11
- filters:
- - median
- pressure:
- # Pressure in hPa
- name: "Pressure"
- id: pressure
- sample_rate: lp
- unit_of_measurement: "hPa"
- web_server:
- sorting_weight: 21
- filters:
- - median
- humidity:
- # Relative humidity %
- id: humidity
- name: "Relative Humidity"
- sample_rate: lp
- unit_of_measurement: "%"
- web_server:
- sorting_weight: 31
- filters:
- - median
- gas_resistance:
- # Gas resistance in Ω
- name: "Gas Resistance"
- id: gas_resistance
- unit_of_measurement: "Ω"
- disabled_by_default: True
- web_server:
- sorting_weight: 41
- filters:
- - median
- iaq:
- # Indoor air quality value
- name: "Air Quality Index"
- unit_of_measurement: "AQI"
- id: iaq
- web_server:
- sorting_weight: 51
- filters:
- - median
- iaq_accuracy:
- # IAQ accuracy as a numeric value of 0, 1, 2, 3
- name: "Numeric IAQ Accuracy"
- id: iaq_accuracy
- disabled_by_default: True
- web_server:
- sorting_weight: 71
- co2_equivalent:
- # CO2 equivalent estimate in ppm
- name: "CO2 Equivalent"
- id: co2
- unit_of_measurement: "ppm"
- web_server:
- sorting_weight: 81
- filters:
- - median
- breath_voc_equivalent:
- # Volatile organic compounds equivalent estimate in ppm
- name: "Breath VOC Equivalent"
- id: breath_voc
- unit_of_measurement: "ppm"
- web_server:
- sorting_weight: 91
- filters:
- - median
-
-text_sensor:
- - platform: template
- name: "IAQ Classification"
- icon: "mdi:checkbox-marked-circle-outline"
- web_server:
- sorting_weight: 60
- lambda: |-
- if (int(id(iaq).state) <= 50) {
- return {"Excellent"};
- }
- else if (int(id(iaq).state) <= 100) {
- return {"Good"};
- }
- else if (int(id(iaq).state) <= 150) {
- return {"Lightly polluted"};
- }
- else if (int(id(iaq).state) <= 200) {
- return {"Moderately polluted"};
- }
- else if (int(id(iaq).state) <= 250) {
- return {"Heavily polluted"};
- }
- else if (int(id(iaq).state) <= 350) {
- return {"Severely polluted"};
- }
- else if (int(id(iaq).state) <= 500) {
- return {"Extremely polluted"};
- }
- else {
- return {"unknown"};
- }
-
- - platform: bme680_bsec
- iaq_accuracy:
- # IAQ accuracy as a text value of Stabilizing, Uncertain, Calibrating, Calibrated
- name: "AQI Accuracy"
- web_server:
- sorting_weight: 61
\ No newline at end of file
diff --git a/groups.yaml b/groups.yaml
index 4177ee5..aec302b 100644
--- a/groups.yaml
+++ b/groups.yaml
@@ -106,7 +106,6 @@ kitchen_motion:
icon: mdi:motion-sensor
name: Kitchen Motion
entities:
- - binary_sensor.kitchen_motion_sensor_home_security_motion_detection
- binary_sensor.kitchen_multisensor_home_security_motion_detection
great_room_motion:
diff --git a/lovelace/cameras/view-camera-01.yaml b/lovelace/cameras/view-camera-01.yaml
index 241a76d..a0dbe94 100644
--- a/lovelace/cameras/view-camera-01.yaml
+++ b/lovelace/cameras/view-camera-01.yaml
@@ -19,7 +19,7 @@ card:
go2rtc:
modes:
- webrtc
- stream: rtsp_cam01_sub
+ stream: cam01_sub_opus
icon: mdi:earth
title: Boys Room
id: boys_room
diff --git a/lovelace/cameras/view-camera-03.yaml b/lovelace/cameras/view-camera-03.yaml
index 25fd2c7..5bdd406 100644
--- a/lovelace/cameras/view-camera-03.yaml
+++ b/lovelace/cameras/view-camera-03.yaml
@@ -19,7 +19,7 @@ card:
go2rtc:
modes:
- webrtc
- stream: rtsp_cam03_sub
+ stream: cam03_sub_opus
icon: mdi:desktop-classic
title: Computer Area
id: computer_area
diff --git a/lovelace/cameras/view-camera-04.yaml b/lovelace/cameras/view-camera-04.yaml
index 63b71ca..b7e65ed 100644
--- a/lovelace/cameras/view-camera-04.yaml
+++ b/lovelace/cameras/view-camera-04.yaml
@@ -19,7 +19,7 @@ card:
go2rtc:
modes:
- webrtc
- stream: rtsp_cam04_sub
+ stream: cam04_sub_opus
live:
preload: true
draggable: true
diff --git a/lovelace/cameras/view-camera-06.yaml b/lovelace/cameras/view-camera-06.yaml
index 54ec5c4..a724fe5 100644
--- a/lovelace/cameras/view-camera-06.yaml
+++ b/lovelace/cameras/view-camera-06.yaml
@@ -19,7 +19,7 @@ card:
go2rtc:
modes:
- webrtc
- stream: rtsp_cam06_sub
+ stream: cam06_sub_opus
live:
preload: true
draggable: true
diff --git a/lovelace/cameras/view-camera-07.yaml b/lovelace/cameras/view-camera-07.yaml
index 1263d16..69fd4da 100644
--- a/lovelace/cameras/view-camera-07.yaml
+++ b/lovelace/cameras/view-camera-07.yaml
@@ -19,7 +19,7 @@ card:
go2rtc:
modes:
- webrtc
- stream: rtsp_cam07_sub
+ stream: cam07_sub_opus
live:
preload: true
draggable: true
diff --git a/lovelace/cameras/view-camera-08.yaml b/lovelace/cameras/view-camera-08.yaml
index df65a9c..6ba68ae 100644
--- a/lovelace/cameras/view-camera-08.yaml
+++ b/lovelace/cameras/view-camera-08.yaml
@@ -19,7 +19,7 @@ card:
go2rtc:
modes:
- webrtc
- stream: rtsp_cam08_sub
+ stream: cam08_sub_opus
live:
preload: true
draggable: true
diff --git a/lovelace/cameras/view-camera-12.yaml b/lovelace/cameras/view-camera-12.yaml
index c83656e..62bd7e4 100644
--- a/lovelace/cameras/view-camera-12.yaml
+++ b/lovelace/cameras/view-camera-12.yaml
@@ -17,7 +17,7 @@ card:
go2rtc:
modes:
- webrtc
- stream: rtsp_cam12_sub
+ stream: cam12_sub_opus
cast:
method: dashboard
dashboard:
diff --git a/lovelace/cameras/view-camera-13.yaml b/lovelace/cameras/view-camera-13.yaml
index faccbf1..22089ca 100644
--- a/lovelace/cameras/view-camera-13.yaml
+++ b/lovelace/cameras/view-camera-13.yaml
@@ -19,7 +19,7 @@ card:
go2rtc:
modes:
- webrtc
- stream: rtsp_cam13_sub
+ stream: cam13_sub_opus
live:
preload: true
draggable: true
diff --git a/lovelace/cameras/view-camera-14.yaml b/lovelace/cameras/view-camera-14.yaml
index ac81e6f..8c140f6 100644
--- a/lovelace/cameras/view-camera-14.yaml
+++ b/lovelace/cameras/view-camera-14.yaml
@@ -19,7 +19,7 @@ card:
go2rtc:
modes:
- webrtc
- stream: rtsp_cam14_sub
+ stream: cam14_sub_opus
live:
preload: true
draggable: true
diff --git a/lovelace/cameras/view-camera-18.yaml b/lovelace/cameras/view-camera-18.yaml
index 6dc99b0..14914f7 100644
--- a/lovelace/cameras/view-camera-18.yaml
+++ b/lovelace/cameras/view-camera-18.yaml
@@ -19,7 +19,7 @@ card:
go2rtc:
modes:
- webrtc
- stream: rtsp_cam18_sub
+ stream: cam18_sub_opus
live:
preload: true
draggable: true
diff --git a/lovelace/cameras/view-camera-19.yaml b/lovelace/cameras/view-camera-19.yaml
index 716cfa0..d62714e 100644
--- a/lovelace/cameras/view-camera-19.yaml
+++ b/lovelace/cameras/view-camera-19.yaml
@@ -19,7 +19,7 @@ card:
go2rtc:
modes:
- webrtc
- stream: rtsp_cam19_sub
+ stream: cam19_sub_opus
live:
preload: true
draggable: true
diff --git a/lovelace/cameras/view-camera-mbr.yaml b/lovelace/cameras/view-camera-mbr.yaml
index 4fff2f6..8d47333 100644
--- a/lovelace/cameras/view-camera-mbr.yaml
+++ b/lovelace/cameras/view-camera-mbr.yaml
@@ -28,7 +28,7 @@ card:
disable_except:
- live
go2rtc:
- stream: rtsp_cam06_sub
+ stream: cam06_sub_opus
modes:
- webrtc
title: MBR Left
@@ -46,7 +46,7 @@ card:
disable_except:
- live
go2rtc:
- stream: rtsp_cam07_sub
+ stream: cam07_sub_opus
modes:
- webrtc
title: MBR Right
diff --git a/lovelace/details/view-hvac.yaml b/lovelace/details/view-hvac.yaml
index 1fcdf81..68c1af3 100644
--- a/lovelace/details/view-hvac.yaml
+++ b/lovelace/details/view-hvac.yaml
@@ -1389,11 +1389,11 @@ sections:
heading_style: title
badges:
- type: entity
- entity: sensor.master_bathroom_thermostat_temperature
+ entity: sensor.bathroom_multisensor_air_temperature
tap_action:
action: more-info
- type: entity
- entity: sensor.master_bathroom_thermostat_humidity
+ entity: sensor.bathroom_multisensor_relative_humidity
tap_action:
action: more-info
- type: custom:mushroom-template-card
diff --git a/lovelace/details/view-people-frigate.yaml b/lovelace/details/view-people-frigate.yaml
index f7f1a39..817bb94 100644
--- a/lovelace/details/view-people-frigate.yaml
+++ b/lovelace/details/view-people-frigate.yaml
@@ -10,7 +10,7 @@ cards:
- camera_entity: camera.frigate_cam03
live_provider: webrtc-card
webrtc_card:
- url: rtsp://192.168.1.7:8554/rtsp_cam03_sub
+ url: rtsp://192.168.1.7:8554/cam03_sub_opus
- frigate:
camera_name: frigate_cam03
label: person
@@ -39,4 +39,4 @@ cards:
frigate:
label: person
zone: front_room
- image: {}
\ No newline at end of file
+ image: {}
diff --git a/lovelace/frigate/view-ai-cam03.yaml b/lovelace/frigate/view-ai-cam03.yaml
index eaf20b0..08898ca 100644
--- a/lovelace/frigate/view-ai-cam03.yaml
+++ b/lovelace/frigate/view-ai-cam03.yaml
@@ -9,8 +9,8 @@ cards:
- !include /config/lovelace/cameras/view-camera-03.yaml
# - type: horizontal-stack
# cards:
- #- !include /config/lovelace/cameras/view-camera-03.yaml
- #- !include /config/lovelace/raw-cameras/computer-area-card.yaml
+ #- !include /config/lovelace/cameras/view-camera-03.yaml
+ #- !include /config/lovelace/raw-cameras/computer-area-card.yaml
- type: vertical-stack
view_layout:
@@ -97,7 +97,7 @@ cards:
go2rtc:
modes:
- webrtc
- stream: rtsp_cam03_sub
+ stream: cam03_sub_opus
frigate:
camera_name: frigate_cam03
zone: great_room
diff --git a/lovelace/phone/boys-room.yaml b/lovelace/phone/boys-room.yaml
index ad52455..7587bab 100644
--- a/lovelace/phone/boys-room.yaml
+++ b/lovelace/phone/boys-room.yaml
@@ -106,7 +106,7 @@ cards:
layout: vertical
secondary_info: none
- type: custom:mushroom-entity-card
- entity: binary_sensor.furnace_room_door_contact
+ entity: binary_sensor.furnace_room_multisensor_door
name: Furnace
layout: vertical
secondary_info: none
diff --git a/lovelace/phone/furnace-room.yaml b/lovelace/phone/furnace-room.yaml
index 948e61f..a627177 100644
--- a/lovelace/phone/furnace-room.yaml
+++ b/lovelace/phone/furnace-room.yaml
@@ -55,11 +55,11 @@ cards:
title: Water Softener
columns: 3
entities:
- - entity: sensor.water_softener_multisensor_salt_level_in_bags
+ - entity: sensor.furnace_room_multisensor_salt_level_in_bags
name: Salt (cm)
- - entity: sensor.water_softener_multisensor_salt_level_in_cm
+ - entity: sensor.furnace_room_multisensor_salt_level_in_cm
name: From Bottom (cm)
- - entity: sensor.water_softener_multisensor_salt_level_from_top_in_cm
+ - entity: sensor.furnace_room_multisensor_salt_level_from_top_in_cm
name: From Top (cm)
- type: vertical-stack
cards:
diff --git a/lovelace/phone/home.yaml b/lovelace/phone/home.yaml
index 4f618af..a189960 100644
--- a/lovelace/phone/home.yaml
+++ b/lovelace/phone/home.yaml
@@ -352,8 +352,8 @@ cards:
hold_action:
action: toggle
secondary: |-
- {{states('sensor.master_bathroom_thermostat_temperature')}}°F
- {{states('sensor.master_bathroom_thermostat_humidity')}}%
+ {{states('sensor.bathroom_multisensor_air_temperature')}}°F
+ {{states('sensor.bathroom_multisensor_relative_humidity')}}%
icon_color: "{{iif(is_state('light.master_bathroom_hue','on'),'yellow')}}"
multiline_secondary: true
layout: vertical
diff --git a/lovelace/phone/master-bathroom.yaml b/lovelace/phone/master-bathroom.yaml
index d61da51..117352b 100644
--- a/lovelace/phone/master-bathroom.yaml
+++ b/lovelace/phone/master-bathroom.yaml
@@ -14,7 +14,7 @@ cards:
- hours_to_show: 24
graph: line
type: sensor
- entity: sensor.bathroom_multisensor_temperature
+ entity: sensor.bathroom_multisensor_air_temperature
detail: 1
name: Multisensor
- hours_to_show: 24
@@ -28,14 +28,14 @@ cards:
- hours_to_show: 24
graph: line
type: sensor
- entity: sensor.master_bathroom_thermostat_temperature
+ entity: sensor.bathroom_multisensor_air_temperature
detail: 1
name: Thermostat
- hours_to_show: 24
graph: line
type: sensor
detail: 1
- entity: sensor.master_bathroom_thermostat_humidity
+ entity: sensor.bathroom_multisensor_relative_humidity
name: Thermostat
- type: horizontal-stack
cards:
diff --git a/lovelace/phone/utility-room.yaml b/lovelace/phone/utility-room.yaml
index 9dec3ba..ebcca1a 100644
--- a/lovelace/phone/utility-room.yaml
+++ b/lovelace/phone/utility-room.yaml
@@ -14,7 +14,7 @@ cards:
- hours_to_show: 24
graph: line
type: sensor
- entity: sensor.utility_room_multisensor_temperature
+ entity: sensor.utility_room_multisensor_air_temperature
detail: 1
name: Multisensor
- hours_to_show: 24
diff --git a/lovelace/raw-cameras/back-yard-card.yaml b/lovelace/raw-cameras/back-yard-card.yaml
index 735c4f3..a70f758 100644
--- a/lovelace/raw-cameras/back-yard-card.yaml
+++ b/lovelace/raw-cameras/back-yard-card.yaml
@@ -5,7 +5,7 @@ cameras:
go2rtc:
modes:
- webrtc
- stream: rtsp_cam14_sub
+ stream: cam14_sub_opus
live:
auto_mute: all
preload: true
diff --git a/lovelace/raw-cameras/boys-room-card.yaml b/lovelace/raw-cameras/boys-room-card.yaml
index 8e1c464..34d58ee 100644
--- a/lovelace/raw-cameras/boys-room-card.yaml
+++ b/lovelace/raw-cameras/boys-room-card.yaml
@@ -1,27 +1,44 @@
type: custom:advanced-camera-card
-cameras:
- - camera_entity: camera.frigate_cam01
- live_provider: go2rtc
- go2rtc:
- modes:
- - webrtc
- stream: rtsp_cam01_sub
-live:
- auto_mute: all
- preload: true
- draggable: false
- show_image_during_load: true
- lazy_load: false
- controls:
- title:
- mode: none
- timeline:
- mode: none
- thumbnails:
- mode: none
+status_bar:
+ style: none
menu:
buttons:
frigate:
enabled: false
-performance:
- profile: low
\ No newline at end of file
+ style: none
+cameras:
+ - camera_entity: camera.frigate_cam01
+ live_provider: go2rtc
+ id: frigate-cam01
+ capabilities:
+ disable: []
+ disable_except:
+ - live
+ go2rtc:
+ stream: cam01_sub_opus
+ modes:
+ - webrtc
+view:
+ default: live
+profiles: []
+grid_options:
+ columns: full
+live:
+ preload: true
+ draggable: false
+ show_image_during_load: false
+ lazy_load: false
+ controls:
+ timeline:
+ mode: none
+ thumbnails:
+ mode: none
+ builtin: false
+ next_previous:
+ style: none
+ zoomable: false
+ auto_play:
+ - selected
+ transition_effect: slide
+ display:
+ mode: single
\ No newline at end of file
diff --git a/lovelace/raw-cameras/computer-area-card.yaml b/lovelace/raw-cameras/computer-area-card.yaml
index 0bc9f7a..3b141c1 100644
--- a/lovelace/raw-cameras/computer-area-card.yaml
+++ b/lovelace/raw-cameras/computer-area-card.yaml
@@ -1,27 +1,44 @@
type: custom:advanced-camera-card
+# status_bar:
+# style: none
+# menu:
+# buttons:
+# frigate:
+# enabled: false
+# style: none
cameras:
- camera_entity: camera.frigate_cam03
live_provider: go2rtc
+ id: frigate-cam03
+ capabilities:
+ disable: []
+ disable_except:
+ - live
go2rtc:
+ stream: cam03_opus
modes:
- webrtc
- stream: rtsp_cam03_sub
-live:
- auto_mute: all
- preload: true
- draggable: false
- show_image_during_load: true
- lazy_load: false
- controls:
- title:
- mode: none
- timeline:
- mode: none
- thumbnails:
- mode: none
-menu:
- buttons:
- frigate:
- enabled: false
-performance:
- profile: low
\ No newline at end of file
+# view:
+# default: live
+# profiles: []
+# grid_options:
+# columns: full
+# live:
+# preload: true
+# draggable: false
+# show_image_during_load: false
+# lazy_load: false
+# controls:
+# timeline:
+# mode: none
+# thumbnails:
+# mode: none
+# builtin: false
+# next_previous:
+# style: none
+# zoomable: false
+# auto_play:
+# - selected
+# transition_effect: slide
+# display:
+# mode: single
\ No newline at end of file
diff --git a/lovelace/raw-cameras/front-porch-card.yaml b/lovelace/raw-cameras/front-porch-card.yaml
index bc4bd09..3dd5674 100644
--- a/lovelace/raw-cameras/front-porch-card.yaml
+++ b/lovelace/raw-cameras/front-porch-card.yaml
@@ -1,27 +1,44 @@
type: custom:advanced-camera-card
-cameras:
- - camera_entity: camera.frigate_cam19
- live_provider: go2rtc
- go2rtc:
- modes:
- - webrtc
- stream: rtsp_cam19_sub
-live:
- auto_mute: all
- preload: true
- draggable: false
- show_image_during_load: true
- lazy_load: false
- controls:
- title:
- mode: none
- timeline:
- mode: none
- thumbnails:
- mode: none
+status_bar:
+ style: none
menu:
buttons:
frigate:
enabled: false
-performance:
- profile: low
\ No newline at end of file
+ style: none
+cameras:
+ - camera_entity: camera.frigate_cam19
+ live_provider: go2rtc
+ id: frigate-cam19
+ capabilities:
+ disable: []
+ disable_except:
+ - live
+ go2rtc:
+ stream: cam19_sub_opus
+ modes:
+ - webrtc
+view:
+ default: live
+profiles: []
+grid_options:
+ columns: full
+live:
+ preload: true
+ draggable: false
+ show_image_during_load: false
+ lazy_load: false
+ controls:
+ timeline:
+ mode: none
+ thumbnails:
+ mode: none
+ builtin: false
+ next_previous:
+ style: none
+ zoomable: false
+ auto_play:
+ - selected
+ transition_effect: slide
+ display:
+ mode: single
\ No newline at end of file
diff --git a/lovelace/raw-cameras/front-room-card.yaml b/lovelace/raw-cameras/front-room-card.yaml
index 1af572c..12317d6 100644
--- a/lovelace/raw-cameras/front-room-card.yaml
+++ b/lovelace/raw-cameras/front-room-card.yaml
@@ -5,7 +5,7 @@ cameras:
go2rtc:
modes:
- webrtc
- stream: rtsp_cam13_sub
+ stream: cam13_sub_opus
live:
auto_mute: all
preload: true
@@ -24,4 +24,4 @@ menu:
frigate:
enabled: false
performance:
- profile: low
\ No newline at end of file
+ profile: low
diff --git a/lovelace/raw-cameras/front-yard-card.yaml b/lovelace/raw-cameras/front-yard-card.yaml
index 8d2f26e..3f825bf 100644
--- a/lovelace/raw-cameras/front-yard-card.yaml
+++ b/lovelace/raw-cameras/front-yard-card.yaml
@@ -1,27 +1,44 @@
type: custom:advanced-camera-card
-cameras:
- - camera_entity: camera.frigate_cam18
- live_provider: go2rtc
- go2rtc:
- modes:
- - webrtc
- stream: rtsp_cam18_sub
-live:
- auto_mute: all
- preload: true
- draggable: false
- show_image_during_load: true
- lazy_load: false
- controls:
- title:
- mode: none
- timeline:
- mode: none
- thumbnails:
- mode: none
+status_bar:
+ style: none
menu:
buttons:
frigate:
enabled: false
-performance:
- profile: low
\ No newline at end of file
+ style: none
+cameras:
+ - camera_entity: camera.frigate_cam18
+ live_provider: go2rtc
+ id: frigate-cam18
+ capabilities:
+ disable: []
+ disable_except:
+ - live
+ go2rtc:
+ stream: cam18_sub_opus
+ modes:
+ - webrtc
+view:
+ default: live
+profiles: []
+grid_options:
+ columns: full
+live:
+ preload: true
+ draggable: false
+ show_image_during_load: false
+ lazy_load: false
+ controls:
+ timeline:
+ mode: none
+ thumbnails:
+ mode: none
+ builtin: false
+ next_previous:
+ style: none
+ zoomable: false
+ auto_play:
+ - selected
+ transition_effect: slide
+ display:
+ mode: single
\ No newline at end of file
diff --git a/lovelace/raw-cameras/garage-card.yaml b/lovelace/raw-cameras/garage-card.yaml
index f1c7bab..69a42d6 100644
--- a/lovelace/raw-cameras/garage-card.yaml
+++ b/lovelace/raw-cameras/garage-card.yaml
@@ -1,27 +1,44 @@
type: custom:advanced-camera-card
-cameras:
- - camera_entity: camera.frigate_cam04
- live_provider: go2rtc
- go2rtc:
- modes:
- - webrtc
- stream: rtsp_cam04_sub
-live:
- auto_mute: all
- preload: true
- draggable: false
- show_image_during_load: true
- lazy_load: false
- controls:
- title:
- mode: none
- timeline:
- mode: none
- thumbnails:
- mode: none
+status_bar:
+ style: none
menu:
buttons:
frigate:
enabled: false
-performance:
- profile: low
\ No newline at end of file
+ style: none
+cameras:
+ - camera_entity: camera.frigate_cam04
+ live_provider: go2rtc
+ id: frigate-cam04
+ capabilities:
+ disable: []
+ disable_except:
+ - live
+ go2rtc:
+ stream: cam04_sub_opus
+ modes:
+ - webrtc
+view:
+ default: live
+profiles: []
+grid_options:
+ columns: full
+live:
+ preload: true
+ draggable: false
+ show_image_during_load: false
+ lazy_load: false
+ controls:
+ timeline:
+ mode: none
+ thumbnails:
+ mode: none
+ builtin: false
+ next_previous:
+ style: none
+ zoomable: false
+ auto_play:
+ - selected
+ transition_effect: slide
+ display:
+ mode: single
\ No newline at end of file
diff --git a/lovelace/raw-cameras/indoor-camera-card.yaml b/lovelace/raw-cameras/indoor-camera-card.yaml
index 1df9e39..5c86f59 100644
--- a/lovelace/raw-cameras/indoor-camera-card.yaml
+++ b/lovelace/raw-cameras/indoor-camera-card.yaml
@@ -6,7 +6,7 @@ cameras:
go2rtc:
modes:
- webrtc
- stream: rtsp_cam08_sub
+ stream: cam08_sub_opus
triggers:
occupancy: false
motion: false
@@ -19,7 +19,7 @@ cameras:
go2rtc:
modes:
- webrtc
- stream: rtsp_cam01_sub
+ stream: cam01_sub_opus
triggers:
occupancy: false
motion: false
@@ -32,7 +32,7 @@ cameras:
go2rtc:
modes:
- webrtc
- stream: rtsp_cam12_sub
+ stream: cam12_sub_opus
triggers:
occupancy: false
motion: false
@@ -45,7 +45,7 @@ cameras:
go2rtc:
modes:
- webrtc
- stream: rtsp_cam13_sub
+ stream: cam13_sub_opus
triggers:
occupancy: false
motion: false
@@ -57,7 +57,7 @@ cameras:
go2rtc:
modes:
- webrtc
- stream: rtsp_cam03_sub
+ stream: cam03_sub_opus
triggers:
occupancy: false
motion: false
@@ -71,7 +71,7 @@ cameras:
go2rtc:
modes:
- webrtc
- stream: rtsp_cam06_sub
+ stream: cam06_sub_opus
triggers:
occupancy: false
motion: false
@@ -83,36 +83,36 @@ cameras:
go2rtc:
modes:
- webrtc
- stream: rtsp_cam07_sub
+ stream: cam07_sub_opus
triggers:
occupancy: false
motion: false
entities:
- binary_sensor.bed_presence_c175a4_bed_occupied_either
-timeline:
- media: snapshots
- show_recordings: false
-view:
- scan:
- enabled: true
- untrigger_seconds: 10
- untrigger_reset: true
- default: live
- camera_select: live
- dark_mode: "on"
- update_cycle_camera: true
- update_seconds: 10
-menu:
- buttons:
- clips:
- enabled: false
- timeline:
- enabled: false
- snapshots:
- enabled: false
- media_player:
- enabled: false
-live:
- lazy_load: true
- preload: true
- lazy_unload: hidden
+# timeline:
+# media: snapshots
+# show_recordings: false
+# view:
+# scan:
+# enabled: true
+# untrigger_seconds: 10
+# untrigger_reset: true
+# default: live
+# camera_select: live
+# dark_mode: "on"
+# update_cycle_camera: true
+# update_seconds: 10
+# menu:
+# buttons:
+# clips:
+# enabled: false
+# timeline:
+# enabled: false
+# snapshots:
+# enabled: false
+# media_player:
+# enabled: false
+# live:
+# lazy_load: true
+# preload: true
+# lazy_unload: hidden
diff --git a/lovelace/raw-cameras/kitchen-card.yaml b/lovelace/raw-cameras/kitchen-card.yaml
index 08bd175..15355a2 100644
--- a/lovelace/raw-cameras/kitchen-card.yaml
+++ b/lovelace/raw-cameras/kitchen-card.yaml
@@ -1,27 +1,44 @@
type: custom:advanced-camera-card
-cameras:
- - camera_entity: camera.frigate_cam12
- live_provider: go2rtc
- go2rtc:
- modes:
- - webrtc
- stream: rtsp_cam12_sub
-live:
- auto_mute: all
- preload: true
- draggable: false
- show_image_during_load: true
- lazy_load: false
- controls:
- title:
- mode: none
- timeline:
- mode: none
- thumbnails:
- mode: none
+status_bar:
+ style: none
menu:
buttons:
frigate:
enabled: false
-performance:
- profile: low
\ No newline at end of file
+ style: none
+cameras:
+ - camera_entity: camera.frigate_cam12
+ live_provider: go2rtc
+ id: frigate-cam12
+ capabilities:
+ disable: []
+ disable_except:
+ - live
+ go2rtc:
+ stream: cam12_sub_opus
+ modes:
+ - webrtc
+view:
+ default: live
+profiles: []
+grid_options:
+ columns: full
+live:
+ preload: true
+ draggable: false
+ show_image_during_load: false
+ lazy_load: false
+ controls:
+ timeline:
+ mode: none
+ thumbnails:
+ mode: none
+ builtin: false
+ next_previous:
+ style: none
+ zoomable: false
+ auto_play:
+ - selected
+ transition_effect: slide
+ display:
+ mode: single
\ No newline at end of file
diff --git a/lovelace/raw-cameras/master-bedroom-left-card.yaml b/lovelace/raw-cameras/master-bedroom-left-card.yaml
index 3415d9a..8e0cf89 100644
--- a/lovelace/raw-cameras/master-bedroom-left-card.yaml
+++ b/lovelace/raw-cameras/master-bedroom-left-card.yaml
@@ -1,27 +1,44 @@
type: custom:advanced-camera-card
-cameras:
- - camera_entity: camera.frigate_cam06
- live_provider: go2rtc
- go2rtc:
- modes:
- - webrtc
- stream: rtsp_cam06_sub
-live:
- auto_mute: all
- preload: true
- draggable: false
- show_image_during_load: true
- lazy_load: false
- controls:
- title:
- mode: none
- timeline:
- mode: none
- thumbnails:
- mode: none
+status_bar:
+ style: none
menu:
buttons:
frigate:
enabled: false
-performance:
- profile: low
\ No newline at end of file
+ style: none
+cameras:
+ - camera_entity: camera.frigate_cam06
+ live_provider: go2rtc
+ id: frigate-cam06
+ capabilities:
+ disable: []
+ disable_except:
+ - live
+ go2rtc:
+ stream: cam06_sub_opus
+ modes:
+ - webrtc
+view:
+ default: live
+profiles: []
+grid_options:
+ columns: full
+live:
+ preload: true
+ draggable: false
+ show_image_during_load: false
+ lazy_load: false
+ controls:
+ timeline:
+ mode: none
+ thumbnails:
+ mode: none
+ builtin: false
+ next_previous:
+ style: none
+ zoomable: false
+ auto_play:
+ - selected
+ transition_effect: slide
+ display:
+ mode: single
\ No newline at end of file
diff --git a/lovelace/raw-cameras/master-bedroom-right-card.yaml b/lovelace/raw-cameras/master-bedroom-right-card.yaml
index 6aaf0c8..06cd786 100644
--- a/lovelace/raw-cameras/master-bedroom-right-card.yaml
+++ b/lovelace/raw-cameras/master-bedroom-right-card.yaml
@@ -1,27 +1,44 @@
type: custom:advanced-camera-card
-cameras:
- - camera_entity: camera.frigate_cam07
- live_provider: go2rtc
- go2rtc:
- modes:
- - webrtc
- stream: rtsp_cam07_sub
-live:
- auto_mute: all
- preload: true
- draggable: false
- show_image_during_load: true
- lazy_load: false
- controls:
- title:
- mode: none
- timeline:
- mode: none
- thumbnails:
- mode: none
+status_bar:
+ style: none
menu:
buttons:
frigate:
enabled: false
-performance:
- profile: low
\ No newline at end of file
+ style: none
+cameras:
+ - camera_entity: camera.frigate_cam07
+ live_provider: go2rtc
+ id: frigate-cam07
+ capabilities:
+ disable: []
+ disable_except:
+ - live
+ go2rtc:
+ stream: cam07_sub_opus
+ modes:
+ - webrtc
+view:
+ default: live
+profiles: []
+grid_options:
+ columns: full
+live:
+ preload: true
+ draggable: false
+ show_image_during_load: false
+ lazy_load: false
+ controls:
+ timeline:
+ mode: none
+ thumbnails:
+ mode: none
+ builtin: false
+ next_previous:
+ style: none
+ zoomable: false
+ auto_play:
+ - selected
+ transition_effect: slide
+ display:
+ mode: single
\ No newline at end of file
diff --git a/lovelace/raw-cameras/nursery-card.yaml b/lovelace/raw-cameras/nursery-card.yaml
index 1845d3c..d23a653 100644
--- a/lovelace/raw-cameras/nursery-card.yaml
+++ b/lovelace/raw-cameras/nursery-card.yaml
@@ -1,27 +1,44 @@
type: custom:advanced-camera-card
-cameras:
- - camera_entity: camera.frigate_cam08
- live_provider: go2rtc
- go2rtc:
- modes:
- - webrtc
- stream: rtsp_cam08_sub
-live:
- auto_mute: all
- preload: true
- draggable: false
- show_image_during_load: true
- lazy_load: false
- controls:
- title:
- mode: none
- timeline:
- mode: none
- thumbnails:
- mode: none
+status_bar:
+ style: none
menu:
buttons:
frigate:
enabled: false
-performance:
- profile: low
\ No newline at end of file
+ style: none
+cameras:
+ - camera_entity: camera.frigate_cam08
+ live_provider: go2rtc
+ id: frigate-cam08
+ capabilities:
+ disable: []
+ disable_except:
+ - live
+ go2rtc:
+ stream: cam08_sub_opus
+ modes:
+ - webrtc
+view:
+ default: live
+profiles: []
+grid_options:
+ columns: full
+live:
+ preload: true
+ draggable: false
+ show_image_during_load: false
+ lazy_load: false
+ controls:
+ timeline:
+ mode: none
+ thumbnails:
+ mode: none
+ builtin: false
+ next_previous:
+ style: none
+ zoomable: false
+ auto_play:
+ - selected
+ transition_effect: slide
+ display:
+ mode: single
\ No newline at end of file
diff --git a/lovelace/raw-cameras/outdoor-camera-card.yaml b/lovelace/raw-cameras/outdoor-camera-card.yaml
index a1f6063..e977cf2 100644
--- a/lovelace/raw-cameras/outdoor-camera-card.yaml
+++ b/lovelace/raw-cameras/outdoor-camera-card.yaml
@@ -6,52 +6,25 @@ cameras:
go2rtc:
modes:
- webrtc
- stream: rtsp_cam04_sub
+ stream: cam04_sub_opus
# - camera_entity: camera.frigate_cam14
# title: Back Yard
# live_provider: go2rtc
# go2rtc:
# modes:
# - webrtc
- # stream: rtsp_cam14_sub
+ # stream: cam14_sub_opus
- camera_entity: camera.frigate_cam18
title: Front Yard
live_provider: go2rtc
go2rtc:
modes:
- webrtc
- stream: rtsp_cam18_sub
+ stream: cam18_sub_opus
- camera_entity: camera.frigate_cam19
title: Front Porch
live_provider: go2rtc
go2rtc:
modes:
- webrtc
- stream: rtsp_cam19_sub
-timeline:
- media: snapshots
- show_recordings: false
-view:
- scan:
- enabled: true
- untrigger_seconds: 10
- untrigger_reset: true
- default: live
- camera_select: live
- dark_mode: "on"
- update_cycle_camera: true
- update_seconds: 10
-menu:
- buttons:
- clips:
- enabled: false
- timeline:
- enabled: false
- snapshots:
- enabled: false
- media_player:
- enabled: false
-live:
- lazy_load: false
- preload: true
- lazy_unload: hidden
+ stream: cam19_sub_opus
diff --git a/lovelace/room_cards/boys_room.yaml b/lovelace/room_cards/boys_room.yaml
index 1531083..981bb4f 100644
--- a/lovelace/room_cards/boys_room.yaml
+++ b/lovelace/room_cards/boys_room.yaml
@@ -70,7 +70,7 @@ elements:
top: 9%
#top icon spot #1
- type: state-icon
- entity: binary_sensor.furnace_room_door_contact
+ entity: binary_sensor.furnace_room_multisensor_door
style:
left: 76%
top: 9%
@@ -173,9 +173,8 @@ elements:
action: toggle
hold_action:
action: more-info
-
# 12,31,50,69,88
# 14,38,62,86
# 25,50,75
# 33,66
-# 50
\ No newline at end of file
+# 50
diff --git a/lovelace/room_cards/furnace_room.yaml b/lovelace/room_cards/furnace_room.yaml
index 53928c2..9f1261e 100644
--- a/lovelace/room_cards/furnace_room.yaml
+++ b/lovelace/room_cards/furnace_room.yaml
@@ -35,7 +35,7 @@ elements:
# left: 76%
# top: 9%
- type: state-icon
- entity: binary_sensor.furnace_room_door_contact
+ entity: binary_sensor.furnace_room_multisensor_door
style:
left: 84%
top: 9%
@@ -94,8 +94,8 @@ elements:
action: more-info
- type: custom:mushroom-template-card
- primary: "{{ states('sensor.hvac_multisensor_delta') | float | round(2) }}"
- entity: sensor.hvac_multisensor_delta
+ primary: "{{ states('sensor.hvac_delta_temperature') | float | round(2) }}"
+ entity: sensor.hvac_delta_temperature
tap_action:
action: more-info
style:
diff --git a/lovelace/room_cards/master_bathroom.yaml b/lovelace/room_cards/master_bathroom.yaml
index ab62124..321cf0f 100644
--- a/lovelace/room_cards/master_bathroom.yaml
+++ b/lovelace/room_cards/master_bathroom.yaml
@@ -13,13 +13,13 @@ elements:
top: 88%
- type: state-label
- entity: sensor.master_bathroom_thermostat_temperature
+ entity: sensor.bathroom_multisensor_air_temperature
style:
left: 15%
top: 35%
font-size: 180%
- type: state-label
- entity: sensor.master_bathroom_thermostat_humidity
+ entity: sensor.bathroom_multisensor_relative_humidity
style:
left: 85%
top: 35%
diff --git a/lovelace/stretch-cameras/back-yard-card.yaml b/lovelace/stretch-cameras/back-yard-card.yaml
index b1bc869..bc7ac27 100644
--- a/lovelace/stretch-cameras/back-yard-card.yaml
+++ b/lovelace/stretch-cameras/back-yard-card.yaml
@@ -22,7 +22,7 @@ cards:
disable_except:
- live
go2rtc:
- stream: rtsp_cam14_sub
+ stream: cam14_sub_opus
modes:
- webrtc
always_error_if_entity_unavailable: false
@@ -62,4 +62,4 @@ cards:
mode: single
dimensions:
aspect_ratio_mode: static
- aspect_ratio: '16:10'
\ No newline at end of file
+ aspect_ratio: "16:10"
diff --git a/lovelace/stretch-cameras/boys-room-card.yaml b/lovelace/stretch-cameras/boys-room-card.yaml
index 4928ac1..23fe719 100644
--- a/lovelace/stretch-cameras/boys-room-card.yaml
+++ b/lovelace/stretch-cameras/boys-room-card.yaml
@@ -22,7 +22,7 @@ cards:
disable_except:
- live
go2rtc:
- stream: rtsp_cam01_sub
+ stream: cam01_sub_opus
modes:
- webrtc
always_error_if_entity_unavailable: false
diff --git a/lovelace/stretch-cameras/computer-area-card.yaml b/lovelace/stretch-cameras/computer-area-card.yaml
index 1ac6dac..8d536ef 100644
--- a/lovelace/stretch-cameras/computer-area-card.yaml
+++ b/lovelace/stretch-cameras/computer-area-card.yaml
@@ -22,7 +22,7 @@ cards:
disable_except:
- live
go2rtc:
- stream: rtsp_cam03_sub
+ stream: cam03_sub_opus
modes:
- webrtc
always_error_if_entity_unavailable: false
@@ -62,4 +62,4 @@ cards:
mode: single
dimensions:
aspect_ratio_mode: static
- aspect_ratio: '16:10'
\ No newline at end of file
+ aspect_ratio: "16:10"
diff --git a/lovelace/stretch-cameras/dual-camera-view.yaml b/lovelace/stretch-cameras/dual-camera-view.yaml
index 3b271c5..b7d0492 100644
--- a/lovelace/stretch-cameras/dual-camera-view.yaml
+++ b/lovelace/stretch-cameras/dual-camera-view.yaml
@@ -7,4 +7,6 @@ cards:
- type: horizontal-stack
cards:
- !include /config/lovelace/stretch-cameras/indoor-camera-cycler.yaml
- - !include /config/lovelace/stretch-cameras/outdoor-camera-cycler.yaml
\ No newline at end of file
+ - !include /config/lovelace/stretch-cameras/outdoor-camera-cycler.yaml
+ # - !include /config/lovelace/stretch-cameras/indoor-camera-view.yaml
+ # - !include /config/lovelace/stretch-cameras/outdoor-camera-view.yaml
\ No newline at end of file
diff --git a/lovelace/stretch-cameras/front-porch-card.yaml b/lovelace/stretch-cameras/front-porch-card.yaml
index ecf8134..30f0df7 100644
--- a/lovelace/stretch-cameras/front-porch-card.yaml
+++ b/lovelace/stretch-cameras/front-porch-card.yaml
@@ -22,7 +22,7 @@ cards:
disable_except:
- live
go2rtc:
- stream: rtsp_cam19_sub
+ stream: cam19_sub_opus
modes:
- webrtc
always_error_if_entity_unavailable: false
@@ -62,4 +62,4 @@ cards:
mode: single
dimensions:
aspect_ratio_mode: static
- aspect_ratio: '16:10'
\ No newline at end of file
+ aspect_ratio: "16:10"
diff --git a/lovelace/stretch-cameras/front-room-card.yaml b/lovelace/stretch-cameras/front-room-card.yaml
index 071f9f9..c02f7b3 100644
--- a/lovelace/stretch-cameras/front-room-card.yaml
+++ b/lovelace/stretch-cameras/front-room-card.yaml
@@ -22,7 +22,7 @@ cards:
disable_except:
- live
go2rtc:
- stream: rtsp_cam13_sub
+ stream: cam13_sub_opus
modes:
- webrtc
always_error_if_entity_unavailable: false
@@ -62,4 +62,4 @@ cards:
mode: single
dimensions:
aspect_ratio_mode: static
- aspect_ratio: '16:10'
\ No newline at end of file
+ aspect_ratio: "16:10"
diff --git a/lovelace/stretch-cameras/front-yard-card.yaml b/lovelace/stretch-cameras/front-yard-card.yaml
index 8d171e3..2790557 100644
--- a/lovelace/stretch-cameras/front-yard-card.yaml
+++ b/lovelace/stretch-cameras/front-yard-card.yaml
@@ -22,7 +22,7 @@ cards:
disable_except:
- live
go2rtc:
- stream: rtsp_cam18_sub
+ stream: cam18_sub_opus
modes:
- webrtc
always_error_if_entity_unavailable: false
@@ -62,4 +62,4 @@ cards:
mode: single
dimensions:
aspect_ratio_mode: static
- aspect_ratio: '16:10'
\ No newline at end of file
+ aspect_ratio: "16:10"
diff --git a/lovelace/stretch-cameras/garage-card.yaml b/lovelace/stretch-cameras/garage-card.yaml
index 4077083..c33ebb7 100644
--- a/lovelace/stretch-cameras/garage-card.yaml
+++ b/lovelace/stretch-cameras/garage-card.yaml
@@ -22,7 +22,7 @@ cards:
disable_except:
- live
go2rtc:
- stream: rtsp_cam04_sub
+ stream: cam04_sub_opus
modes:
- webrtc
always_error_if_entity_unavailable: false
@@ -62,4 +62,4 @@ cards:
mode: single
dimensions:
aspect_ratio_mode: static
- aspect_ratio: '16:10'
\ No newline at end of file
+ aspect_ratio: "16:10"
diff --git a/lovelace/stretch-cameras/girls-room-card.yaml b/lovelace/stretch-cameras/girls-room-card.yaml
index 3dc8aae..5091849 100644
--- a/lovelace/stretch-cameras/girls-room-card.yaml
+++ b/lovelace/stretch-cameras/girls-room-card.yaml
@@ -22,7 +22,7 @@ cards:
disable_except:
- live
go2rtc:
- stream: rtsp_cam08_sub
+ stream: cam08_sub_opus
modes:
- webrtc
always_error_if_entity_unavailable: false
@@ -62,4 +62,4 @@ cards:
mode: single
dimensions:
aspect_ratio_mode: static
- aspect_ratio: '16:10'
\ No newline at end of file
+ aspect_ratio: "16:10"
diff --git a/lovelace/stretch-cameras/indoor-camera-cycler.yaml b/lovelace/stretch-cameras/indoor-camera-cycler.yaml
index 70a4d57..df824ba 100644
--- a/lovelace/stretch-cameras/indoor-camera-cycler.yaml
+++ b/lovelace/stretch-cameras/indoor-camera-cycler.yaml
@@ -22,7 +22,7 @@ cards:
disable_except:
- live
go2rtc:
- stream: rtsp_cam03_sub
+ stream: cam03_sub_opus
modes:
- webrtc
always_error_if_entity_unavailable: false
@@ -38,7 +38,7 @@ cards:
disable_except:
- live
go2rtc:
- stream: rtsp_cam04_sub
+ stream: cam04_sub_opus
modes:
- webrtc
always_error_if_entity_unavailable: false
@@ -54,44 +54,44 @@ cards:
disable_except:
- live
go2rtc:
- stream: rtsp_cam12_sub
+ stream: cam12_sub_opus
modes:
- webrtc
always_error_if_entity_unavailable: false
triggers:
motion: false
entities: []
- view:
- default: live
- default_reset:
- every_seconds: 5
- after_interaction: true
- interaction_mode: all
- default_cycle_camera: true
- triggers:
- filter_selected_camera: false
- profiles: []
- grid_options:
- columns: full
- live:
- preload: true
- draggable: false
- show_image_during_load: false
- lazy_load: false
- controls:
- timeline:
- mode: none
- thumbnails:
- mode: none
- builtin: false
- next_previous:
- style: none
- zoomable: false
- auto_play:
- - selected
- transition_effect: slide
- display:
- mode: single
- dimensions:
- aspect_ratio_mode: static
- aspect_ratio: '16:10'
+ # view:
+ # default: live
+ # default_reset:
+ # every_seconds: 5
+ # after_interaction: true
+ # interaction_mode: all
+ # default_cycle_camera: true
+ # triggers:
+ # filter_selected_camera: false
+ # profiles: []
+ # grid_options:
+ # columns: full
+ # live:
+ # preload: true
+ # draggable: false
+ # show_image_during_load: false
+ # lazy_load: false
+ # controls:
+ # timeline:
+ # mode: none
+ # thumbnails:
+ # mode: none
+ # builtin: false
+ # next_previous:
+ # style: none
+ # zoomable: false
+ # auto_play:
+ # - selected
+ # transition_effect: slide
+ # display:
+ # mode: single
+ # dimensions:
+ # aspect_ratio_mode: static
+ # aspect_ratio: "16:10"
diff --git a/lovelace/stretch-cameras/kitchen-card.yaml b/lovelace/stretch-cameras/kitchen-card.yaml
index 9c158f7..7842b03 100644
--- a/lovelace/stretch-cameras/kitchen-card.yaml
+++ b/lovelace/stretch-cameras/kitchen-card.yaml
@@ -23,7 +23,7 @@ cards:
disable_except:
- live
go2rtc:
- stream: rtsp_cam12_sub
+ stream: cam12_sub_opus
modes:
- webrtc
always_error_if_entity_unavailable: false
diff --git a/lovelace/stretch-cameras/master-bedroom-card.yaml b/lovelace/stretch-cameras/master-bedroom-card.yaml
index 1c72733..3be5bf8 100644
--- a/lovelace/stretch-cameras/master-bedroom-card.yaml
+++ b/lovelace/stretch-cameras/master-bedroom-card.yaml
@@ -22,7 +22,7 @@ cards:
disable_except:
- live
go2rtc:
- stream: rtsp_cam06_sub
+ stream: cam06_sub_opus
modes:
- webrtc
title: MBR Left
@@ -40,7 +40,7 @@ cards:
disable_except:
- live
go2rtc:
- stream: rtsp_cam07_sub
+ stream: cam07_sub_opus
modes:
- webrtc
title: MBR Right
@@ -82,4 +82,4 @@ cards:
mode: single
dimensions:
aspect_ratio_mode: static
- aspect_ratio: '16:10'
+ aspect_ratio: "16:10"
diff --git a/lovelace/stretch-cameras/outdoor-camera-cycler.yaml b/lovelace/stretch-cameras/outdoor-camera-cycler.yaml
index 89144dc..2955467 100644
--- a/lovelace/stretch-cameras/outdoor-camera-cycler.yaml
+++ b/lovelace/stretch-cameras/outdoor-camera-cycler.yaml
@@ -22,7 +22,7 @@ cards:
disable_except:
- live
go2rtc:
- stream: rtsp_cam18_sub
+ stream: cam18_sub_opus
modes:
- webrtc
always_error_if_entity_unavailable: false
@@ -38,7 +38,7 @@ cards:
disable_except:
- live
go2rtc:
- stream: rtsp_cam04_sub
+ stream: cam04_sub_opus
modes:
- webrtc
always_error_if_entity_unavailable: false
@@ -54,7 +54,7 @@ cards:
disable_except:
- live
go2rtc:
- stream: rtsp_cam19_sub
+ stream: cam19_sub_opus
modes:
- webrtc
always_error_if_entity_unavailable: false
@@ -94,4 +94,4 @@ cards:
mode: single
dimensions:
aspect_ratio_mode: static
- aspect_ratio: '16:10'
+ aspect_ratio: "16:10"
diff --git a/lovelace/view-devices.yaml b/lovelace/view-devices.yaml
index 04481f2..78c9082 100644
--- a/lovelace/view-devices.yaml
+++ b/lovelace/view-devices.yaml
@@ -16,6 +16,7 @@ cards:
entities:
- entity: device_tracker.chevrolet_mylink
- entity: device_tracker.chevrolet_traverse_location
+ - entity: device_tracker.alpsalpine_co_ltd
- type: entities
title: Bridget's Tablet
diff --git a/lovelace/view-ha-floorplan.yaml b/lovelace/view-ha-floorplan.yaml
index 3f15f0e..b73969f 100644
--- a/lovelace/view-ha-floorplan.yaml
+++ b/lovelace/view-ha-floorplan.yaml
@@ -291,6 +291,7 @@ cards:
- media_player.front_room_hub
- media_player.girls_room_hub
- media_player.boys_room_clock
+ - media_player.ma_home_assistant_voice_097b44_media_player
states:
- state: "playing"
class: "squeezebox-on"
@@ -363,7 +364,7 @@ cards:
- sensor.master_bedroom_multisensor_air_temperature
- sensor.thermostat_temperature
- sensor.utility_room_thermostat_temperature
- - sensor.master_bathroom_thermostat_temperature
+ - sensor.bathroom_multisensor_relative_humidity
- sensor.downstairs_temperature
- sensor.computer_area_multisensor_air_temperature
- sensor.mancave_thermostat_temperature
@@ -475,7 +476,7 @@ cards:
# Bathrooms are expected to be a bit more humid
- entities:
- - sensor.master_bathroom_thermostat_humidity
+ - sensor.bathroom_multisensor_relative_humidity
- sensor.utility_room_thermostat_humidity
text_template: '${entity.state ? Math.ceil(entity.state) : "unknown"} %'
class_template: '
@@ -566,7 +567,7 @@ cards:
'
- entities:
- - sensor.water_softener_multisensor_salt_level_in_bags
+ - sensor.furnace_room_multisensor_salt_level_in_bags
text_template: '${entity.state ? Math.floor(entity.state) : "undefined"}'
class_template: '
var bags = parseFloat(entity.state);
@@ -749,8 +750,7 @@ cards:
- binary_sensor.storage_room_door_contact
- binary_sensor.mancave_door_contact
- binary_sensor.boys_room_door_contact
- - binary_sensor.water_softener_multisensor_door
- #- binary_sensor.furnace_room_door_contact
+ - binary_sensor.furnace_room_multisensor_door
- binary_sensor.utility_room_door_contact
states:
- state: "off"
diff --git a/lovelace/view-media.yaml b/lovelace/view-media.yaml
index 2f48e0b..dd99ac3 100644
--- a/lovelace/view-media.yaml
+++ b/lovelace/view-media.yaml
@@ -38,8 +38,7 @@ cards:
type: custom:mini-media-player
group: true
artwork: cover
- tts:
- platform: google_translate
+
- entity: media_player.kitchen
name: Kitchen
#type: media-control
@@ -47,8 +46,7 @@ cards:
group: true
artwork: cover
show_source: true
- tts:
- platform: google_translate
+
- entity: media_player.bathroom_mini
name: Bathroom
#type: media-control
@@ -56,8 +54,7 @@ cards:
group: true
artwork: cover
show_source: true
- tts:
- platform: google_translate
+
- entity: media_player.girls_room_hub
name: Nursery
#type: media-control
@@ -65,8 +62,7 @@ cards:
group: true
artwork: cover
show_source: true
- tts:
- platform: google_translate
+
- entity: media_player.master_bedroom_clock
name: Master Bedroom
#type: media-control
@@ -74,8 +70,15 @@ cards:
group: true
artwork: cover
show_source: true
- tts:
- platform: google_translate
+
+ - entity: media_player.ma_home_assistant_voice_097b44_media_player
+ name: Master Bedroom
+ #type: media-control
+ type: custom:mini-media-player
+ group: true
+ artwork: cover
+ show_source: true
+
- entity: media_player.computer_area_hub
name: Computer Area
#type: media-control
@@ -83,8 +86,7 @@ cards:
group: true
artwork: cover
show_source: true
- tts:
- platform: google_translate
+
- entity: media_player.garage
name: Garage
#type: media-control
@@ -92,8 +94,7 @@ cards:
group: true
artwork: cover
show_source: true
- tts:
- platform: google_translate
+
- entity: media_player.deck
name: Deck
#type: media-control
@@ -101,8 +102,7 @@ cards:
group: true
artwork: cover
show_source: true
- tts:
- platform: google_translate
+
- entity: media_player.great_room
name: Great Room
#type: media-control
@@ -110,8 +110,7 @@ cards:
group: true
artwork: cover
show_source: true
- tts:
- platform: google_translate
+
- entity: media_player.boys_room_clock
name: Boys Room
#type: media-control
@@ -119,8 +118,6 @@ cards:
group: true
artwork: cover
show_source: true
- tts:
- platform: google_translate
- type: vertical-stack
cards:
@@ -140,9 +137,6 @@ cards:
group: true
artwork: material
show_source: true
- tts:
- platform: google_translate
- entity_id: media_player.all_downstairs_speakers
hide:
controls: false
- entity: media_player.all_public_speakers
@@ -152,9 +146,6 @@ cards:
group: true
artwork: material
show_source: true
- tts:
- platform: google_translate
- entity_id: media_player.all_public_speakers
hide:
controls: false
- entity: media_player.all_upstairs_speakers
@@ -164,9 +155,6 @@ cards:
group: true
artwork: material
show_source: true
- tts:
- platform: google_translate
- entity_id: media_player.all_upstairs_speakers
hide:
controls: false
- entity: media_player.downstairs_public
@@ -176,9 +164,6 @@ cards:
group: true
artwork: material
show_source: true
- tts:
- platform: google_translate
- entity_id: media_player.downstairs_public
hide:
controls: false
- entity: media_player.front_yard
@@ -188,9 +173,6 @@ cards:
group: true
artwork: material
show_source: true
- tts:
- platform: google_translate
- entity_id: media_player.front_yard
hide:
controls: false
- entity: media_player.inside_and_outside #All indoors and outdoor speakers
@@ -200,9 +182,6 @@ cards:
group: true
artwork: material
show_source: true
- tts:
- platform: google_translate
- entity_id: media_player.inside_and_outside
hide:
controls: false
- entity: media_player.outside
@@ -212,9 +191,6 @@ cards:
group: true
artwork: material
show_source: true
- tts:
- platform: google_translate
- entity_id: media_player.outside
hide:
controls: false
- entity: media_player.upstairs_public
@@ -224,9 +200,6 @@ cards:
group: true
artwork: material
show_source: true
- tts:
- platform: google_translate
- entity_id: media_player.upstairs_public
hide:
controls: false
diff --git a/lovelace/view-more-charts.yaml b/lovelace/view-more-charts.yaml
index 0d697c4..fe45ceb 100644
--- a/lovelace/view-more-charts.yaml
+++ b/lovelace/view-more-charts.yaml
@@ -44,7 +44,7 @@ cards:
title: Upstairs Humidity
type: history-graph
- entities:
- - entity: sensor.master_bathroom_thermostat_temperature
+ - entity: sensor.bathroom_multisensor_relative_humidity
name: Master Bathroom
- entity: sensor.utility_room_thermostat_temperature
name: Utility Room
@@ -85,7 +85,7 @@ cards:
title: Downstairs Humidity
type: history-graph
- entities:
- - entity: sensor.master_bathroom_thermostat_humidity
+ - entity: sensor.bathroom_multisensor_relative_humidity
name: Master Bathroom
- entity: sensor.utility_room_thermostat_humidity
name: Utility Room
diff --git a/lovelace/view-overview.yaml b/lovelace/view-overview.yaml
index e2c1fce..534a5dc 100644
--- a/lovelace/view-overview.yaml
+++ b/lovelace/view-overview.yaml
@@ -433,7 +433,7 @@ badges:
- type: conditional
conditions:
- entity: sensor.watchman_missing_entities
- state_not: unavailable
+ state_not: unavailable, unknowne
- entity: sensor.watchman_missing_entities
state_not: "0"
chip:
@@ -1059,12 +1059,6 @@ cards:
action: toggle
hold_action:
action: more-info
- - entity: light.garage_overhead
- name: Garage
- tap_action:
- action: toggle
- hold_action:
- action: more-info
- entity: light.front_porch_overhead
name: Porch
tap_action:
@@ -1107,7 +1101,7 @@ cards:
- entity: binary_sensor.black_bed_status
state_filter:
- "off"
- - entity: binary_sensor.hvac_multisensor_status
+ - entity: binary_sensor.furnace_room_multisensor_status
state_filter:
- "off"
diff --git a/scripts/cameras/cam03_sub_computer_area.yaml b/scripts/cameras/cam03_sub_computer_area.yaml
index 35e583d..1dcd8b9 100644
--- a/scripts/cameras/cam03_sub_computer_area.yaml
+++ b/scripts/cameras/cam03_sub_computer_area.yaml
@@ -3,7 +3,7 @@ sequence:
- action: webrtc.dash_cast
data:
entity_id: media_player.computer_area_hub
- url: rtsp_cam03_sub
+ url: cam03_sub_opus
force: true
extra:
mode: webrtc
diff --git a/scripts/cameras/cam08_computer_area.yaml b/scripts/cameras/cam08_computer_area.yaml
index ed6e0e7..55dea5f 100644
--- a/scripts/cameras/cam08_computer_area.yaml
+++ b/scripts/cameras/cam08_computer_area.yaml
@@ -3,6 +3,6 @@ sequence:
- action: webrtc.dash_cast
data:
entity_id: media_player.computer_area_hub
- url: rtsp_cam08_sub
+ url: cam08_sub_opus
extra:
mode: webrtc
diff --git a/scripts/cameras/cam08_front_room.yaml b/scripts/cameras/cam08_front_room.yaml
index fd01d6e..3ae8571 100644
--- a/scripts/cameras/cam08_front_room.yaml
+++ b/scripts/cameras/cam08_front_room.yaml
@@ -3,7 +3,7 @@ sequence:
- action: webrtc.dash_cast
data:
entity_id: media_player.front_room_hub
- url: rtsp_cam08_sub
+ url: cam08_sub_opus
force: true
extra:
mode: webrtc
diff --git a/scripts/cameras/cam13_computer_area.yaml b/scripts/cameras/cam13_computer_area.yaml
index 43bad05..dfc3dd7 100644
--- a/scripts/cameras/cam13_computer_area.yaml
+++ b/scripts/cameras/cam13_computer_area.yaml
@@ -3,7 +3,7 @@ sequence:
- action: webrtc.dash_cast
data:
entity_id: media_player.computer_area_hub
- url: rtsp_cam13_sub
+ url: cam13_sub_opus
force: true
extra:
mode: webrtc
diff --git a/scripts/cameras/cam13_front_room.yaml b/scripts/cameras/cam13_front_room.yaml
index 4cab01c..dd7ad28 100644
--- a/scripts/cameras/cam13_front_room.yaml
+++ b/scripts/cameras/cam13_front_room.yaml
@@ -3,7 +3,7 @@ sequence:
- action: webrtc.dash_cast
data:
entity_id: media_player.front_room_hub
- url: rtsp_cam13_sub
+ url: cam13_sub_opus
force: true
extra:
mode: webrtc
diff --git a/scripts/cameras/cam19_computer_area.yaml b/scripts/cameras/cam19_computer_area.yaml
index f68b1dc..23b4b5e 100644
--- a/scripts/cameras/cam19_computer_area.yaml
+++ b/scripts/cameras/cam19_computer_area.yaml
@@ -3,7 +3,7 @@ sequence:
- action: webrtc.dash_cast
data:
entity_id: media_player.computer_area_hub
- url: rtsp_cam19_sub
+ url: cam19_sub_opus
force: true
extra:
mode: webrtc
diff --git a/scripts/cameras/cam19_front_room.yaml b/scripts/cameras/cam19_front_room.yaml
index 1fa00e4..386a9fa 100644
--- a/scripts/cameras/cam19_front_room.yaml
+++ b/scripts/cameras/cam19_front_room.yaml
@@ -3,7 +3,7 @@ sequence:
- action: webrtc.dash_cast
data:
entity_id: media_player.front_room_hub
- url: rtsp_cam19_sub
+ url: cam19_sub_opus
force: true
extra:
mode: webrtc
diff --git a/scripts/cameras/create_camera_link.yaml b/scripts/cameras/create_camera_link.yaml
index 9a61e66..7035628 100644
--- a/scripts/cameras/create_camera_link.yaml
+++ b/scripts/cameras/create_camera_link.yaml
@@ -8,7 +8,7 @@ sequence:
link_id: "{{ link_id }}" # create a random or permanent link ID
# url: rtsp://rtsp:12345678@192.168.1.123:554/av_stream/ch0
# entity: camera.sonoff # you can use camera entity_id or url
- url: rtsp://192.168.1.7:8554/rtsp_cam03_sub
+ url: rtsp://192.168.1.7:8554/cam03_sub_opus
open_limit: 1 # how many times a link can be opened (0 - unlimit, 1 - default)
time_to_live: 60 # how many seconds will the link live (0 - unlimit, 60 - default)
diff --git a/scripts/master_bedroom/wake_up_the_master_bedroom.yaml b/scripts/master_bedroom/wake_up_the_master_bedroom.yaml
index fc517b5..fb812c6 100644
--- a/scripts/master_bedroom/wake_up_the_master_bedroom.yaml
+++ b/scripts/master_bedroom/wake_up_the_master_bedroom.yaml
@@ -35,7 +35,7 @@ sequence:
entity_id: tts.google_translate_en_com
data:
media_player_entity_id: media_player.ma_home_assistant_voice_097b44_media_player
- message: "Its {{ now().strftime('%-I:%M %p') }} so you need to get out of bed and get ready for work and get the kids ready for school"
+ message: "Pick up the kids at 7 for Donuts with Dads! Its {{ now().strftime('%-I:%M %p') }} so you need to get out of bed and get ready for work and get the kids ready for school"
# - action: tts.speak
# target:
diff --git a/www/floorplan/fullsized_floorplan.svg b/www/floorplan/fullsized_floorplan.svg
index f674051..db95fa2 100644
--- a/www/floorplan/fullsized_floorplan.svg
+++ b/www/floorplan/fullsized_floorplan.svg
@@ -38,9 +38,9 @@
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
- inkscape:zoom="0.014142135"
- inkscape:cx="55118.976"
- inkscape:cy="30935.923"
+ inkscape:zoom="0.019999999"
+ inkscape:cx="53125.003"
+ inkscape:cy="33525.002"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
@@ -1605,14 +1605,14 @@
style="stroke-width:0.012145"
transform="scale(-1)" />
+ inkscape:label="binary_sensor.furnace_room_multisensor_door" />
-
inkscape:label="light.front_porch_overhead" />
+ id="media_player.ma_home_assistant_voice_097b44_media_player"
+ transform="matrix(0,-0.03802678,0.03802678,0,305.56768,-17320.257)"
+ inkscape:label="media_player.ma_home_assistant_voice_097b44_media_player">
+
+
+
+
+
+