############################################################################### # PACKAGE: Free Power Time Automation ############################################################################### # VERSION: # 1.0.0 - 2026-05-08 # - Initial package. # - Adds editable free power start/end times. # - Adds master enable switch and per-action enable switches. # - Adds announcement, gas-to-heatpump changeover, tool charger control, # and underhouse dehumidifier control. # # NOTES: # - Free power start/end times can be changed in Home Assistant. # - Start time default is 9:00pm. # - End time default is midnight. # - YAML-only gas heater settings are in script.free_power_gas_heater_changeover: # gas_heater_shutdown_delay_seconds # heatpump_setpoint_offset_c # # IMPORTANT: # - input_datetime initial values are used to provide defaults. # - If you later want UI changes to survive every HA restart, remove the # initial lines after the helpers have been created and set once. ############################################################################### ############################################################################### # INPUT DATETIME ############################################################################### input_datetime: free_power_start_time: name: Free Power - Start Time has_date: false has_time: true initial: "21:00:00" icon: mdi:clock-start free_power_end_time: name: Free Power - End Time has_date: false has_time: true initial: "00:00:00" icon: mdi:clock-end ############################################################################### # ENABLE SWITCHES ############################################################################### input_boolean: free_power_automation_enabled: name: Free Power - Master Automation Enable icon: mdi:transmission-tower free_power_announcement_enabled: name: Free Power - Announcement Enable icon: mdi:bullhorn free_power_gas_heater_changeover_enabled: name: Free Power - Gas Heater Changeover Enable icon: mdi:heat-pump-outline free_power_tool_battery_chargers_enabled: name: Free Power - Tool Battery Chargers Enable icon: mdi:battery-charging free_power_underhouse_dehumidifier_enabled: name: Free Power - Underhouse Dehumidifier Enable icon: mdi:air-humidifier ############################################################################### # TEMPLATE SENSORS ############################################################################### template: - binary_sensor: - name: Free Power Time Active unique_id: free_power_time_active icon: mdi:transmission-tower state: >- {% set start = states('input_datetime.free_power_start_time') %} {% set end = states('input_datetime.free_power_end_time') %} {% set now_mins = now().hour * 60 + now().minute %} {% set start_mins = (start[0:2] | int(0)) * 60 + (start[3:5] | int(0)) %} {% set end_mins = (end[0:2] | int(0)) * 60 + (end[3:5] | int(0)) %} {% if start_mins == end_mins %} false {% elif start_mins < end_mins %} {{ start_mins <= now_mins < end_mins }} {% else %} {{ now_mins >= start_mins or now_mins < end_mins }} {% endif %} ############################################################################### # SCRIPTS ############################################################################### script: free_power_start_actions: alias: Free Power - Start Actions mode: single sequence: - condition: state entity_id: input_boolean.free_power_automation_enabled state: "on" - variables: free_power_time_label: >- {%- set raw_time = states('input_datetime.free_power_start_time') -%} {%- set hour = raw_time[0:2] | int(0) -%} {%- set minute = raw_time[3:5] | int(0) -%} {%- set suffix = 'am' if hour < 12 else 'pm' -%} {%- set hour12 = hour % 12 -%} {%- set hour12 = 12 if hour12 == 0 else hour12 -%} {{- hour12 ~ suffix if minute == 0 else hour12 ~ ':' ~ '%02d' | format(minute) ~ suffix -}} ########################################################################### # 1) Free Power Time Announcement ########################################################################### - if: - condition: state entity_id: input_boolean.free_power_announcement_enabled state: "on" then: - action: script.view_road_announcement data: channels: "lounge_google_home_voice, sony_tv_lounge" title: "View Road " short_announcement: "{{ free_power_time_label }}: Free power time" long_announcement: "It is {{ free_power_time_label }}." ########################################################################### # 2) Gas Heater Changeover ########################################################################### - if: - condition: state entity_id: input_boolean.free_power_gas_heater_changeover_enabled state: "on" then: - action: script.free_power_gas_heater_changeover ########################################################################### # 3) Tool Battery Chargers On ########################################################################### - if: - condition: state entity_id: input_boolean.free_power_tool_battery_chargers_enabled state: "on" then: - action: switch.turn_on target: entity_id: - switch.ryobi_charger_left_power_monitor_x17pp - switch.ryobi_charger_right_power_monitor_x16pp ########################################################################### # 4) Underhouse Dehumidifier On ########################################################################### - if: - condition: state entity_id: input_boolean.free_power_underhouse_dehumidifier_enabled state: "on" then: - action: switch.turn_on target: entity_id: - switch.underhouse_dehumidifier_power_plug_x10pp free_power_end_actions: alias: Free Power - End Actions mode: single sequence: - condition: state entity_id: input_boolean.free_power_automation_enabled state: "on" ########################################################################### # 3) Tool Battery Chargers Off # # If this action is enabled, the chargers are switched off at free power # end even if something else turned them on. ########################################################################### - if: - condition: state entity_id: input_boolean.free_power_tool_battery_chargers_enabled state: "on" then: - action: switch.turn_off target: entity_id: - switch.ryobi_charger_left_power_monitor_x17pp - switch.ryobi_charger_right_power_monitor_x16pp ########################################################################### # 4) Underhouse Dehumidifier Off # # If this action is enabled, the dehumidifier is switched off at free power # end even if something else turned it on. ########################################################################### - if: - condition: state entity_id: input_boolean.free_power_underhouse_dehumidifier_enabled state: "on" then: - action: switch.turn_off target: entity_id: - switch.underhouse_dehumidifier_power_plug_x10pp free_power_gas_heater_changeover: alias: Free Power - Gas Heater Changeover mode: single sequence: ########################################################################### # YAML-only settings ########################################################################### - variables: gas_heater_operation_entity: switch.rinnai_neo_gas_heater_heater_operation gas_heater_setpoint_entity: number.rinnai_neo_gas_heater_rinnai_neo_gas_heater_setpoint heatpump_climate_entity: climate.lounge gas_heater_shutdown_delay_seconds: 60 heatpump_setpoint_offset_c: 0 heatpump_setpoint: >- {{ ( (states(gas_heater_setpoint_entity) | float(0)) + (heatpump_setpoint_offset_c | float(0)) ) | round(1) }} ########################################################################### # Only change over if the gas heater is currently on. ########################################################################### - condition: template value_template: "{{ is_state(gas_heater_operation_entity, 'on') }}" ########################################################################### # Only continue if the gas setpoint can be read. ########################################################################### - condition: template value_template: >- {{ states(gas_heater_setpoint_entity) not in ['unknown', 'unavailable', 'none', 'None', ''] }} ########################################################################### # Set the Panasonic heatpump to heat mode and match the gas heater setpoint, # with the YAML-only offset applied. ########################################################################### - action: climate.set_temperature target: entity_id: climate.lounge data: hvac_mode: heat temperature: "{{ heatpump_setpoint }}" ########################################################################### # Give the heatpump time to start before turning the gas heater off. ########################################################################### - delay: seconds: "{{ gas_heater_shutdown_delay_seconds | int(60) }}" - action: switch.turn_off target: entity_id: switch.rinnai_neo_gas_heater_heater_operation ############################################################################### # AUTOMATIONS ############################################################################### automation: - id: free_power_time_start_actions alias: Free Power Time - Start Actions mode: single triggers: - trigger: time at: input_datetime.free_power_start_time actions: - action: script.free_power_start_actions - id: free_power_time_end_actions alias: Free Power Time - End Actions mode: single triggers: - trigger: time at: input_datetime.free_power_end_time actions: - action: script.free_power_end_actions