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"> + + + + + +