AutomationDataset/erikeidt/erikeidt_automations.yaml

1758 lines
51 KiB
YAML

- alias: EE Read Envoy Battery
id: ee_read_envoy_battery
description: ''
triggers:
- trigger: homeassistant
event: start
- trigger: template
value_template: '{{ states(this.entity_id) == "on" }}'
for:
hours: 0
minutes: 0
seconds: 1
conditions: []
actions:
- repeat:
sequence:
- variables:
request_time: '{{ now() }}'
response:
status: timeout
- action: rest_command.read_envoy_batteries
continue_on_error: true
metadata: {}
data: {}
response_variable: response
- variables:
response_time: '{{ now() }}'
latency: '{{ response_time | as_timestamp - request_time | as_timestamp
}}'
- action: notify.persistent_notification
metadata: {}
data:
message: '{{ response }}'
enabled: false
- if:
- condition: template
value_template: "{{\n response is not defined or response.status == 'timeout'\
\ or\n response.status | int(0) = 200\n}}"
then:
- action: notify.persistent_notification
metadata: {}
data:
message: '{{ now().strftime("%m/%d %H:%M:%S") }} -- Read Battery -- {{
response.status | default(response) }}'
- stop: Rest command failure
error: true
enabled: false
- delay:
hours: 0
minutes: 1
seconds: 0
milliseconds: 0
else:
- variables:
newline: '
'
content: '{{ response.content | replace(newline, '' '') }}'
devices: '{{ content[''devices:''] }}'
pwr_soc: "{% set ns = namespace(pwr=0,soc=0,batts=[]) %}\n{% for d in\
\ devices %}\n {% set ns.pwr = ns.pwr + d.real_power_mw %}\n {% set\
\ ns.soc = ns.soc + d.soc %}\n {% set ns.batts = ns.batts + [d.soc]\
\ %}\n {% set ns.batts = ns.batts + [(-d.real_power_mw)] %}\n{% endfor\
\ %}\n{{\n { \n \"pwr\": ns.pwr,\n \"soc\": ns.soc,\n \"num\"\
: devices | count,\n \"batts\": ns.batts\n }\n}}"
flow: '{{ -pwr_soc.pwr }}'
soc: '{{ pwr_soc.soc }}'
socpct: '{{ soc / pwr_soc.num }}'
batts: '{{ pwr_soc.batts }}'
- action: input_number.set_value
metadata: {}
data:
value: '{{ socpct | round(2) }}'
target:
entity_id: input_number.ee_observed_charge
- action: input_text.set_value
metadata: {}
data:
value: '{{ batts }}'
target:
entity_id: input_text.ee_observed_batteries
- action: input_datetime.set_datetime
metadata: {}
data:
time: '{{ now().strftime(''%H:%M:%S'') }}'
target:
entity_id: input_datetime.ee_envoy_battery_reporting_time
- action: input_number.set_value
metadata: {}
data:
value: '{{ (latency * 1000) | int }}'
target:
entity_id: input_number.ee_observed_envoy_read_battery_latency
- delay:
hours: 0
minutes: 0
seconds: 2
milliseconds: 0
count: 60
- action: automation.turn_off
metadata: {}
data:
stop_actions: false
target:
entity_id: '{{ this.entity_id }}'
- action: automation.turn_on
metadata: {}
data: {}
target:
entity_id: '{{ this.entity_id }}'
mode: single
- alias: EE Read Envoy Livedata
id: ee_read_envoy_livedata
description: ''
triggers:
- trigger: homeassistant
event: start
- trigger: template
value_template: '{{ states(this.entity_id) == "on" }}'
for:
hours: 0
minutes: 0
seconds: 1
conditions: []
actions:
- repeat:
sequence:
- variables:
request_time: '{{ now() }}'
response:
status: timeout
- action: rest_command.read_envoy_livedata_status
continue_on_error: true
metadata: {}
data: {}
response_variable: response
- variables:
response_time: '{{ now() }}'
just_now: '{{ (response_time | as_datetime).strftime("%H:%M:%S") }}'
latency: '{{ response_time | as_timestamp - request_time | as_timestamp
}}'
- action: notify.persistent_notification
metadata: {}
data:
message: '{{ response }}'
enabled: false
- if:
- condition: template
value_template: "{{\n response is not defined or response.status == 'timeout'\
\ or\n response.status | int(0) = 200\n}}"
then:
- action: notify.persistent_notification
metadata: {}
data:
message: '{{ now().strftime("%m/%d %H:%M:%S") }} -- Read Livedata -- {{
response.status | default(response) }}'
- stop: Rest command failed
error: true
enabled: false
- delay:
hours: 0
minutes: 1
seconds: 0
milliseconds: 0
else:
- variables:
content: '{{ response.content }}'
connection: '{{ content.connection }}'
sc_stream: '{{ connection.sc_stream }}'
- if:
- condition: template
value_template: '{{ sc_stream = ''enabled'' }}'
then:
- action: rest_command.envoy_enable_livedata_stream
metadata: {}
data: {}
response_variable: response
- action: notify.persistent_notification
metadata: {}
data:
message: '{{ now().strftime("%m/%d %H:%M:%S") }}
Enabling Stream '
- delay:
hours: 0
minutes: 1
seconds: 0
milliseconds: 0
else:
- variables:
meters: '{{ content.meters }}'
last_update: '{{ meters.last_update }}'
solar_production: '{{ meters.pv.agg_p_mw }}'
net_consumption: '{{ meters.grid.agg_p_mw }}'
battery_flow: '{{ - meters.storage.agg_p_mw }}'
home_load: '{{ meters.load.agg_p_mw }}'
total_consumption: '{{ home_load + battery_flow }}'
- action: input_number.set_value
metadata: {}
data:
value: '{{ battery_flow }}'
target:
entity_id: input_number.ee_observed_battery_flow
enabled: true
- action: input_number.set_value
metadata: {}
data:
value: '{{ solar_production }}'
target:
entity_id: input_number.ee_observed_solar_production
- action: input_number.set_value
metadata: {}
data:
value: '{{ net_consumption }}'
target:
entity_id: input_number.ee_observed_net_consumption
- action: input_number.set_value
metadata: {}
data:
value: '{{ total_consumption }}'
target:
entity_id: input_number.ee_observed_total_consumption
- action: input_number.set_value
metadata: {}
data:
value: '{{ home_load }}'
target:
entity_id: input_number.ee_observed_home_load
- action: input_datetime.set_datetime
metadata: {}
data:
time: '{{ just_now }}'
target:
entity_id: input_datetime.ee_envoy_pc_reporting_time
- action: input_number.set_value
metadata: {}
data:
value: '{{ (latency * 1000) | int }}'
target:
entity_id: input_number.ee_observed_envoy_read_livedata_latency
- action: notify.persistent_notification
metadata: {}
data:
message: '{{ last_update | as_datetime }}'
enabled: false
- delay:
hours: 0
minutes: 0
seconds: 1
milliseconds: 0
count: 60
- action: automation.turn_off
metadata: {}
data:
stop_actions: false
target:
entity_id: '{{ this.entity_id }}'
- action: automation.turn_on
metadata: {}
data: {}
target:
entity_id: '{{ this.entity_id }}'
mode: single
- alias: EE Read Envoy Relay
id: ee_read_envoy_relay
description: ''
triggers:
- trigger: time_pattern
minutes: /1
conditions: []
actions:
- action: rest_command.read_envoy_relay
metadata: {}
data: {}
response_variable: envoy_ivp_ensemble_relay
- variables:
content: '{{ envoy_ivp_ensemble_relay.content }}'
grid: '{{ content.mains_oper_state }}'
- action: input_text.set_value
metadata: {}
data:
value: '{{ grid }}'
target:
entity_id: input_text.ee_observed_grid_status
mode: single
- alias: EE Read Envoy Tariff
id: ee_read_envoy_tariff
description: ''
triggers:
- trigger: time_pattern
minutes: /1
conditions: []
actions:
- action: rest_command.read_envoy_tariff
metadata: {}
data: {}
response_variable: response
- action: script.ee_decode_tariff
metadata: {}
data:
response: '{{ response }}'
mode: single
- alias: EE Read Envoy XML Info
id: ee_read_envoy_xml_info
description: ''
triggers:
- trigger: time_pattern
hours: /12
conditions: []
actions:
- action: rest_command.read_envoy_relay
metadata: {}
data: {}
response_variable: envoy_ivp_ensemble_relay
enabled: false
- variables:
content: '{{ envoy_ivp_ensemble_relay.content }}'
grid: '{{ content.mains_oper_state == "closed" }}'
enabled: false
- action: rest_command.read_envoy_xml_info
metadata: {}
data: {}
response_variable: envoy_info_xml
- variables:
xml_text: '{{ envoy_info_xml.content }}'
time_tag: '{{ xml_text | regex_findall_index("<time>.*</time>") }}'
time: '{{ time_tag[6:-7] }}'
software_tag: '{{ xml_text | regex_findall_index("<software>.*</software>")
}}'
vers: '{{ software_tag[10:-11] }}'
enabled: false
- variables:
xml_text: '{{ envoy_info_xml.content }}'
software_tag: '{{ xml_text | regex_findall_index("<software>.*</software>")
}}'
vers: '{{ software_tag[10:-11] }}'
- action: input_text.set_value
metadata: {}
data:
value: '{{ vers }}'
target:
entity_id: input_text.ee_observed_vers
mode: single
- alias: EE Set Hour of Day
description: ''
triggers:
- trigger: time_pattern
hours: /1
- trigger: homeassistant
event: start
conditions: []
actions:
- action: input_number.set_value
metadata: {}
data:
value: '{{ now().hour }}'
target:
entity_id: input_number.ee_hour_of_day
mode: single
- alias: EE Set is TOU Workday
id: ee_set_is_tou_workday
description: Determine todays rates as to workday or holiday
triggers:
- trigger: time
at: 00:15:00
- trigger: homeassistant
event: start
conditions: []
actions:
- if:
- condition: or
conditions:
- condition: time
weekday:
- sun
- sat
- condition: template
value_template: '{{ states("calendar.utility_tou_holidays") == "on" }}'
then:
- action: input_boolean.turn_off
metadata: {}
data: {}
target:
entity_id: input_boolean.ee_solar_is_tou_workday
else:
- action: input_boolean.turn_on
metadata: {}
data: {}
target:
entity_id: input_boolean.ee_solar_is_tou_workday
- variables:
tidx: '{{ trigger.idx }}'
- if:
- condition: template
value_template: '{{ tidx = 0 }}'
then:
- action: automation.turn_off
metadata: {}
data:
stop_actions: true
target:
entity_id:
- automation.ee_while_zn
- automation.ee_while_dl
- automation.ee_while_cp
- action: automation.turn_on
metadata: {}
data: {}
target:
entity_id: automation.ee_while_cp
- delay:
hours: 0
minutes: 0
seconds: 5
milliseconds: 0
- action: automation.trigger
metadata: {}
data:
skip_condition: true
target:
entity_id:
- automation.ee_read_envoy_tariff
- delay:
hours: 0
minutes: 0
seconds: 5
milliseconds: 0
- action: automation.trigger
metadata: {}
data:
skip_condition: true
target:
entity_id:
- automation.ee_read_envoy_relay
- delay:
hours: 0
minutes: 0
seconds: 5
milliseconds: 0
- action: automation.trigger
metadata: {}
data:
skip_condition: true
target:
entity_id:
- automation.ee_read_envoy_xml_info
mode: single
- alias: EE While CP
id: ee_while_cp
description: ''
triggers:
- trigger: template
value_template: "{{\n (states('input_text.ee_observed_tariff') == 'CP' or\n \
\ states('input_text.ee_observed_tariff') == 'ZN' or \n states('input_text.ee_observed_tariff')\
\ == 'DL') and \n states('input_number.ee_observed_solar_production') | float\
\ >= 100000 and\n states(this.entity_id) == 'on'\n}}"
for:
hours: 0
minutes: 0
seconds: 20
- trigger: time
at: '16:45:00'
conditions: []
actions:
- variables:
new_reserve: '{{ states(''sensor.ee_desired_battery_reserve'') | int }}'
workday: '{{ states(''input_boolean.ee_solar_is_tou_workday'') == ''on'' }}'
dl_time: '{% set yetz = now () %}
{% set hr = yetz.hour * 100 + yetz.minute %}
{{ hr >= 1644 }}'
observed_tariff: '{{ states(''input_text.ee_observed_tariff'') }}'
observed_production: '{{ states(''input_number.ee_observed_solar_production'')
}}'
- if:
- condition: template
value_template: '{{ workday and dl_time }}'
then:
- action: automation.turn_off
metadata: {}
data:
stop_actions: false
target:
entity_id: '{{ this.entity_id }}'
- action: automation.turn_on
metadata: {}
data: {}
target:
entity_id: automation.ee_while_dl
else:
- variables:
response:
status: timeout
attempts: 0
- repeat:
sequence:
- if:
- condition: template
value_template: '{{ attempts > 0 }}'
then:
- if:
- condition: template
value_template: '{{ attempts < 10 }}'
then:
- delay:
hours: 0
minutes: 0
seconds: 2
milliseconds: 0
else:
- delay:
hours: 0
minutes: 30
seconds: 0
milliseconds: 0
- action: notify.persistent_notification
metadata: {}
data:
message: 'Tariff change fails (CP)
{{ attempts }}
{{ now().strftime(''%m/%d %H:%M:%S'') }}'
- action: rest_command.send_envoy_param_tariff
continue_on_error: true
metadata: {}
data:
peak_rule: ZN
peak_start: 420
peak_end: 1141
reserve: '{{ new_reserve }}'
response_variable: response
- variables:
attempts: '{{ attempts + 1 }}'
while:
- condition: template
value_template: '{{ attempts == 0 or response.status | int(0) = 200 and
attempts < 100 }}'
- action: script.ee_decode_tariff
metadata: {}
data:
response: '{{ response }}'
- delay:
hours: 0
minutes: 1
seconds: 0
milliseconds: 0
- action: automation.turn_off
metadata: {}
data:
stop_actions: false
target:
entity_id: '{{ this.entity_id }}'
- action: automation.turn_on
metadata: {}
data: {}
target:
entity_id: automation.ee_while_zn
mode: single
- alias: EE While DL
id: ee_while_dl
description: ''
triggers:
- trigger: time
at: '20:02:00'
conditions: []
actions:
- action: automation.turn_off
metadata: {}
data:
stop_actions: false
target:
entity_id: '{{ this.entity_id }}'
- action: automation.turn_on
metadata: {}
data: {}
target:
entity_id: automation.ee_while_cp
mode: single
- alias: EE While ZN
id: ee_while_zn
description: ''
triggers:
- alias: Climb Reserve in ZN
trigger: template
value_template: "{{\n states('input_text.ee_observed_tariff') == 'ZN' and \n\
\ states('input_number.ee_observed_tariff_battery_reserve') | float = states('sensor.ee_desired_battery_reserve')\
\ | float and\n states(this.entity_id) == 'on'\n}}"
for:
hours: 0
minutes: 0
seconds: 20
- alias: Drop out of ZN
trigger: template
value_template: "{{\n states('input_text.ee_observed_tariff') == 'ZN' and\n \
\ states('input_number.ee_observed_solar_production') | int < 50000 and\n states(this.entity_id)\
\ == 'on'\n}}"
for:
hours: 0
minutes: 0
seconds: 45
- alias: Ready for DL
trigger: time
at: '16:45:00'
conditions: []
actions:
- variables:
tidx: '{{ trigger.idx }}'
workday: '{{ states(''input_boolean.ee_solar_is_tou_workday'') == ''on'' }}'
observed_tariff: '{{ states(''input_text.ee_observed_tariff'') }}'
observed_production: '{{ states(''input_number.ee_observed_solar_production'')
}}'
- if:
- alias: Climb Trigger?
condition: template
value_template: '{{ tidx == 0 }}'
then:
- variables:
tariff: "{{\n { \n \"time\" : now().timestamp() | int,\n \"peak_rule\"\
: \"ZN\",\n \"peak_start\": 420,\n \"peak_end\": 1141,\n \"reserve\"\
: states('sensor.ee_desired_battery_reserve') | float \n }\n}}"
else:
- if:
- condition: template
value_template: '{{ tidx == 2 and not workday }}'
then:
- stop: It is 4:45pm but not workday
- variables:
tariff: "{{\n { \n \"time\" : now().timestamp() | int,\n \"peak_rule\"\
: \"DL\",\n \"peak_start\": 1021 if workday else 780,\n \"peak_end\"\
: 1201 if workday else 785,\n \"reserve\": min(50, states('input_number.ee_observed_charge')\
\ | int)\n }\n}}"
- action: automation.turn_off
metadata: {}
data:
stop_actions: false
target:
entity_id: '{{ this.entity_id }}'
- if:
- condition: and
conditions:
- condition: template
value_template: '{{ workday }}'
- condition: time
after: '16:44:00'
then:
- action: automation.turn_on
metadata: {}
data: {}
target:
entity_id: automation.ee_while_dl
else:
- action: automation.turn_on
metadata: {}
data: {}
target:
entity_id: automation.ee_while_cp
- variables:
response:
status: timeout
attempts: 0
- repeat:
sequence:
- if:
- condition: template
value_template: '{{ attempts > 0 }}'
then:
- if:
- condition: template
value_template: '{{ attempts < 10 }}'
then:
- delay:
hours: 0
minutes: 0
seconds: 2
milliseconds: 0
else:
- delay:
hours: 0
minutes: 30
seconds: 0
milliseconds: 0
- action: notify.persistent_notification
metadata: {}
data:
message: 'Tariff change fails (ZN)
{{ attempts }}
{{ now().strftime(''%m/%d %H:%M:%S'') }}'
- action: rest_command.send_envoy_param_tariff
continue_on_error: true
metadata: {}
data: '{{ tariff }}'
response_variable: response
- variables:
attempts: '{{ attempts + 1 }}'
while:
- condition: template
value_template: "{{ \n attempts == 0 or \n response.status | int(0) = 200\
\ and attempts < 100\n}}"
- action: script.ee_decode_tariff
metadata: {}
data:
response: '{{ response }}'
mode: single
- alias: EE Read Envoy Battery
id: ee_read_envoy_battery
description: ''
triggers:
- trigger: homeassistant
event: start
- trigger: template
value_template: '{{ states(this.entity_id) == "on" }}'
for:
hours: 0
minutes: 0
seconds: 1
conditions: []
actions:
- repeat:
sequence:
- variables:
request_time: '{{ now() }}'
response:
status: timeout
- action: rest_command.read_envoy_batteries
continue_on_error: true
metadata: {}
data: {}
response_variable: response
- variables:
response_time: '{{ now() }}'
latency: '{{ response_time | as_timestamp - request_time | as_timestamp
}}'
- action: notify.persistent_notification
metadata: {}
data:
message: '{{ response }}'
enabled: false
- if:
- condition: template
value_template: "{{\n response is not defined or response.status == 'timeout'\
\ or\n response.status | int(0) = 200\n}}"
then:
- action: notify.persistent_notification
metadata: {}
data:
message: '{{ now().strftime("%m/%d %H:%M:%S") }} -- Read Battery -- {{
response.status | default(response) }}'
- stop: Rest command failure
error: true
enabled: false
- delay:
hours: 0
minutes: 1
seconds: 0
milliseconds: 0
else:
- variables:
newline: '
'
content: '{{ response.content | replace(newline, '' '') }}'
devices: '{{ content[''devices:''] }}'
pwr_soc: "{% set ns = namespace(pwr=0,soc=0,batts=[]) %}\n{% for d in\
\ devices %}\n {% set ns.pwr = ns.pwr + d.real_power_mw %}\n {% set\
\ ns.soc = ns.soc + d.soc %}\n {% set ns.batts = ns.batts + [d.soc]\
\ %}\n {% set ns.batts = ns.batts + [(-d.real_power_mw)] %}\n{% endfor\
\ %}\n{{\n { \n \"pwr\": ns.pwr,\n \"soc\": ns.soc,\n \"num\"\
: devices | count,\n \"batts\": ns.batts\n }\n}}"
flow: '{{ -pwr_soc.pwr }}'
soc: '{{ pwr_soc.soc }}'
socpct: '{{ soc / pwr_soc.num }}'
batts: '{{ pwr_soc.batts }}'
- action: input_number.set_value
metadata: {}
data:
value: '{{ socpct | round(2) }}'
target:
entity_id: input_number.ee_observed_charge
- action: input_text.set_value
metadata: {}
data:
value: '{{ batts }}'
target:
entity_id: input_text.ee_observed_batteries
- action: input_datetime.set_datetime
metadata: {}
data:
time: '{{ now().strftime(''%H:%M:%S'') }}'
target:
entity_id: input_datetime.ee_envoy_battery_reporting_time
- action: input_number.set_value
metadata: {}
data:
value: '{{ (latency * 1000) | int }}'
target:
entity_id: input_number.ee_observed_envoy_read_battery_latency
- delay:
hours: 0
minutes: 0
seconds: 2
milliseconds: 0
count: 60
- action: automation.turn_off
metadata: {}
data:
stop_actions: false
target:
entity_id: '{{ this.entity_id }}'
- action: automation.turn_on
metadata: {}
data: {}
target:
entity_id: '{{ this.entity_id }}'
mode: single
- alias: EE Read Envoy Livedata
id: ee_read_envoy_livedata
description: ''
triggers:
- trigger: homeassistant
event: start
- trigger: template
value_template: '{{ states(this.entity_id) == "on" }}'
for:
hours: 0
minutes: 0
seconds: 1
conditions: []
actions:
- repeat:
sequence:
- variables:
request_time: '{{ now() }}'
response:
status: timeout
- action: rest_command.read_envoy_livedata_status
continue_on_error: true
metadata: {}
data: {}
response_variable: response
- variables:
response_time: '{{ now() }}'
just_now: '{{ (response_time | as_datetime).strftime("%H:%M:%S") }}'
latency: '{{ response_time | as_timestamp - request_time | as_timestamp
}}'
- action: notify.persistent_notification
metadata: {}
data:
message: '{{ response }}'
enabled: false
- if:
- condition: template
value_template: "{{\n response is not defined or response.status == 'timeout'\
\ or\n response.status | int(0) = 200\n}}"
then:
- action: notify.persistent_notification
metadata: {}
data:
message: '{{ now().strftime("%m/%d %H:%M:%S") }} -- Read Livedata -- {{
response.status | default(response) }}'
- stop: Rest command failed
error: true
enabled: false
- delay:
hours: 0
minutes: 1
seconds: 0
milliseconds: 0
else:
- variables:
content: '{{ response.content }}'
connection: '{{ content.connection }}'
sc_stream: '{{ connection.sc_stream }}'
- if:
- condition: template
value_template: '{{ sc_stream = ''enabled'' }}'
then:
- action: rest_command.envoy_enable_livedata_stream
metadata: {}
data: {}
response_variable: response
- action: notify.persistent_notification
metadata: {}
data:
message: '{{ now().strftime("%m/%d %H:%M:%S") }}
Enabling Stream '
- delay:
hours: 0
minutes: 1
seconds: 0
milliseconds: 0
else:
- variables:
meters: '{{ content.meters }}'
last_update: '{{ meters.last_update }}'
solar_production: '{{ meters.pv.agg_p_mw }}'
net_consumption: '{{ meters.grid.agg_p_mw }}'
battery_flow: '{{ - meters.storage.agg_p_mw }}'
home_load: '{{ meters.load.agg_p_mw }}'
total_consumption: '{{ home_load + battery_flow }}'
- action: input_number.set_value
metadata: {}
data:
value: '{{ battery_flow }}'
target:
entity_id: input_number.ee_observed_battery_flow
enabled: true
- action: input_number.set_value
metadata: {}
data:
value: '{{ solar_production }}'
target:
entity_id: input_number.ee_observed_solar_production
- action: input_number.set_value
metadata: {}
data:
value: '{{ net_consumption }}'
target:
entity_id: input_number.ee_observed_net_consumption
- action: input_number.set_value
metadata: {}
data:
value: '{{ total_consumption }}'
target:
entity_id: input_number.ee_observed_total_consumption
- action: input_number.set_value
metadata: {}
data:
value: '{{ home_load }}'
target:
entity_id: input_number.ee_observed_home_load
- action: input_datetime.set_datetime
metadata: {}
data:
time: '{{ just_now }}'
target:
entity_id: input_datetime.ee_envoy_pc_reporting_time
- action: input_number.set_value
metadata: {}
data:
value: '{{ (latency * 1000) | int }}'
target:
entity_id: input_number.ee_observed_envoy_read_livedata_latency
- action: notify.persistent_notification
metadata: {}
data:
message: '{{ last_update | as_datetime }}'
enabled: false
- delay:
hours: 0
minutes: 0
seconds: 1
milliseconds: 0
count: 60
- action: automation.turn_off
metadata: {}
data:
stop_actions: false
target:
entity_id: '{{ this.entity_id }}'
- action: automation.turn_on
metadata: {}
data: {}
target:
entity_id: '{{ this.entity_id }}'
mode: single
- alias: EE Read Envoy Relay
id: ee_read_envoy_relay
description: ''
triggers:
- trigger: time_pattern
minutes: /1
conditions: []
actions:
- action: rest_command.read_envoy_relay
metadata: {}
data: {}
response_variable: envoy_ivp_ensemble_relay
- variables:
content: '{{ envoy_ivp_ensemble_relay.content }}'
grid: '{{ content.mains_oper_state }}'
- action: input_text.set_value
metadata: {}
data:
value: '{{ grid }}'
target:
entity_id: input_text.ee_observed_grid_status
mode: single
- alias: EE Read Envoy Tariff
id: ee_read_envoy_tariff
description: ''
triggers:
- trigger: time_pattern
minutes: /1
conditions: []
actions:
- action: rest_command.read_envoy_tariff
metadata: {}
data: {}
response_variable: response
- action: script.ee_decode_tariff
metadata: {}
data:
response: '{{ response }}'
mode: single
- alias: EE Read Envoy XML Info
id: ee_read_envoy_xml_info
description: ''
triggers:
- trigger: time_pattern
hours: /12
conditions: []
actions:
- action: rest_command.read_envoy_relay
metadata: {}
data: {}
response_variable: envoy_ivp_ensemble_relay
enabled: false
- variables:
content: '{{ envoy_ivp_ensemble_relay.content }}'
grid: '{{ content.mains_oper_state == "closed" }}'
enabled: false
- action: rest_command.read_envoy_xml_info
metadata: {}
data: {}
response_variable: envoy_info_xml
- variables:
xml_text: '{{ envoy_info_xml.content }}'
time_tag: '{{ xml_text | regex_findall_index("<time>.*</time>") }}'
time: '{{ time_tag[6:-7] }}'
software_tag: '{{ xml_text | regex_findall_index("<software>.*</software>")
}}'
vers: '{{ software_tag[10:-11] }}'
enabled: false
- variables:
xml_text: '{{ envoy_info_xml.content }}'
software_tag: '{{ xml_text | regex_findall_index("<software>.*</software>")
}}'
vers: '{{ software_tag[10:-11] }}'
- action: input_text.set_value
metadata: {}
data:
value: '{{ vers }}'
target:
entity_id: input_text.ee_observed_vers
mode: single
- alias: EE Read Envoy Battery
id: ee_read_envoy_battery
description: ''
triggers:
- trigger: homeassistant
event: start
- trigger: template
value_template: '{{ states(this.entity_id) == "on" }}'
for:
hours: 0
minutes: 0
seconds: 1
conditions: []
actions:
- repeat:
sequence:
- variables:
request_time: '{{ now() }}'
response:
status: timeout
- action: rest_command.read_envoy_batteries
continue_on_error: true
metadata: {}
data: {}
response_variable: response
- variables:
response_time: '{{ now() }}'
latency: '{{ response_time | as_timestamp - request_time | as_timestamp
}}'
- action: notify.persistent_notification
metadata: {}
data:
message: '{{ response }}'
enabled: false
- if:
- condition: template
value_template: "{{\n response is not defined or response.status == 'timeout'\
\ or\n response.status | int(0) != 200\n}}"
then:
- action: notify.persistent_notification
metadata: {}
data:
message: '{{ now().strftime("%m/%d %H:%M:%S") }} -- Read Battery -- {{
response.status | default(response) }}'
- stop: Rest command failure
error: true
enabled: false
- delay:
hours: 0
minutes: 1
seconds: 0
milliseconds: 0
else:
- variables:
newline: '
'
content: '{{ response.content | replace(newline, '' '') }}'
devices: '{{ content[''devices:''] }}'
pwr_soc: "{% set ns = namespace(pwr=0,soc=0,batts=[]) %}\n{% for d in\
\ devices %}\n {% set ns.pwr = ns.pwr + d.real_power_mw %}\n {% set\
\ ns.soc = ns.soc + d.soc %}\n {% set ns.batts = ns.batts + [d.soc]\
\ %}\n {% set ns.batts = ns.batts + [(-d.real_power_mw)] %}\n{% endfor\
\ %}\n{{\n { \n \"pwr\": ns.pwr,\n \"soc\": ns.soc,\n \"num\"\
: devices | count,\n \"batts\": ns.batts\n }\n}}"
flow: '{{ -pwr_soc.pwr }}'
soc: '{{ pwr_soc.soc }}'
socpct: '{{ soc / pwr_soc.num }}'
batts: '{{ pwr_soc.batts }}'
- action: input_number.set_value
metadata: {}
data:
value: '{{ socpct | round(2) }}'
target:
entity_id: input_number.ee_observed_charge
- action: input_text.set_value
metadata: {}
data:
value: '{{ batts }}'
target:
entity_id: input_text.ee_observed_batteries
- action: input_datetime.set_datetime
metadata: {}
data:
time: '{{ now().strftime(''%H:%M:%S'') }}'
target:
entity_id: input_datetime.ee_envoy_battery_reporting_time
- action: input_number.set_value
metadata: {}
data:
value: '{{ (latency * 1000) | int }}'
target:
entity_id: input_number.ee_observed_envoy_read_battery_latency
- delay:
hours: 0
minutes: 0
seconds: 2
milliseconds: 0
count: 60
- action: automation.turn_off
metadata: {}
data:
stop_actions: false
target:
entity_id: '{{ this.entity_id }}'
- action: automation.turn_on
metadata: {}
data: {}
target:
entity_id: '{{ this.entity_id }}'
mode: single
- alias: EE Read Envoy Livedata
id: ee_read_envoy_livedata
description: ''
triggers:
- trigger: homeassistant
event: start
- trigger: template
value_template: '{{ states(this.entity_id) == "on" }}'
for:
hours: 0
minutes: 0
seconds: 1
conditions: []
actions:
- repeat:
sequence:
- variables:
request_time: '{{ now() }}'
response:
status: timeout
- action: rest_command.read_envoy_livedata_status
continue_on_error: true
metadata: {}
data: {}
response_variable: response
- variables:
response_time: '{{ now() }}'
just_now: '{{ (response_time | as_datetime).strftime("%H:%M:%S") }}'
latency: '{{ response_time | as_timestamp - request_time | as_timestamp
}}'
- action: notify.persistent_notification
metadata: {}
data:
message: '{{ response }}'
enabled: false
- if:
- condition: template
value_template: "{{\n response is not defined or response.status == 'timeout'\
\ or\n response.status | int(0) != 200\n}}"
then:
- action: notify.persistent_notification
metadata: {}
data:
message: '{{ now().strftime("%m/%d %H:%M:%S") }} -- Read Livedata -- {{
response.status | default(response) }}'
- stop: Rest command failed
error: true
enabled: false
- delay:
hours: 0
minutes: 1
seconds: 0
milliseconds: 0
else:
- variables:
content: '{{ response.content }}'
connection: '{{ content.connection }}'
sc_stream: '{{ connection.sc_stream }}'
- if:
- condition: template
value_template: '{{ sc_stream != ''enabled'' }}'
then:
- action: rest_command.envoy_enable_livedata_stream
metadata: {}
data: {}
response_variable: response
- action: notify.persistent_notification
metadata: {}
data:
message: '{{ now().strftime("%m/%d %H:%M:%S") }}
Enabling Stream '
- delay:
hours: 0
minutes: 1
seconds: 0
milliseconds: 0
else:
- variables:
meters: '{{ content.meters }}'
last_update: '{{ meters.last_update }}'
solar_production: '{{ meters.pv.agg_p_mw }}'
net_consumption: '{{ meters.grid.agg_p_mw }}'
battery_flow: '{{ - meters.storage.agg_p_mw }}'
home_load: '{{ meters.load.agg_p_mw }}'
total_consumption: '{{ home_load + battery_flow }}'
- action: input_number.set_value
metadata: {}
data:
value: '{{ battery_flow }}'
target:
entity_id: input_number.ee_observed_battery_flow
enabled: true
- action: input_number.set_value
metadata: {}
data:
value: '{{ solar_production }}'
target:
entity_id: input_number.ee_observed_solar_production
- action: input_number.set_value
metadata: {}
data:
value: '{{ net_consumption }}'
target:
entity_id: input_number.ee_observed_net_consumption
- action: input_number.set_value
metadata: {}
data:
value: '{{ total_consumption }}'
target:
entity_id: input_number.ee_observed_total_consumption
- action: input_number.set_value
metadata: {}
data:
value: '{{ home_load }}'
target:
entity_id: input_number.ee_observed_home_load
- action: input_datetime.set_datetime
metadata: {}
data:
time: '{{ just_now }}'
target:
entity_id: input_datetime.ee_envoy_pc_reporting_time
- action: input_number.set_value
metadata: {}
data:
value: '{{ (latency * 1000) | int }}'
target:
entity_id: input_number.ee_observed_envoy_read_livedata_latency
- action: notify.persistent_notification
metadata: {}
data:
message: '{{ last_update | as_datetime }}'
enabled: false
- delay:
hours: 0
minutes: 0
seconds: 1
milliseconds: 0
count: 60
- action: automation.turn_off
metadata: {}
data:
stop_actions: false
target:
entity_id: '{{ this.entity_id }}'
- action: automation.turn_on
metadata: {}
data: {}
target:
entity_id: '{{ this.entity_id }}'
mode: single
- alias: EE Read Envoy Relay
id: ee_read_envoy_relay
description: ''
triggers:
- trigger: time_pattern
minutes: /1
conditions: []
actions:
- action: rest_command.read_envoy_relay
metadata: {}
data: {}
response_variable: envoy_ivp_ensemble_relay
- variables:
content: '{{ envoy_ivp_ensemble_relay.content }}'
grid: '{{ content.mains_oper_state }}'
- action: input_text.set_value
metadata: {}
data:
value: '{{ grid }}'
target:
entity_id: input_text.ee_observed_grid_status
mode: single
- alias: EE Read Envoy Tariff
id: ee_read_envoy_tariff
description: ''
triggers:
- trigger: time_pattern
minutes: /1
conditions: []
actions:
- action: rest_command.read_envoy_tariff
metadata: {}
data: {}
response_variable: response
- action: script.ee_decode_tariff
metadata: {}
data:
response: '{{ response }}'
mode: single
- alias: EE Read Envoy XML Info
id: ee_read_envoy_xml_info
description: ''
triggers:
- trigger: time_pattern
hours: /12
conditions: []
actions:
- action: rest_command.read_envoy_relay
metadata: {}
data: {}
response_variable: envoy_ivp_ensemble_relay
enabled: false
- variables:
content: '{{ envoy_ivp_ensemble_relay.content }}'
grid: '{{ content.mains_oper_state == "closed" }}'
enabled: false
- action: rest_command.read_envoy_xml_info
metadata: {}
data: {}
response_variable: envoy_info_xml
- variables:
xml_text: '{{ envoy_info_xml.content }}'
time_tag: '{{ xml_text | regex_findall_index("<time>.*</time>") }}'
time: '{{ time_tag[6:-7] }}'
software_tag: '{{ xml_text | regex_findall_index("<software>.*</software>")
}}'
vers: '{{ software_tag[10:-11] }}'
enabled: false
- variables:
xml_text: '{{ envoy_info_xml.content }}'
software_tag: '{{ xml_text | regex_findall_index("<software>.*</software>")
}}'
vers: '{{ software_tag[10:-11] }}'
- action: input_text.set_value
metadata: {}
data:
value: '{{ vers }}'
target:
entity_id: input_text.ee_observed_vers
mode: single
- alias: EE Set Hour of Day
description: ''
triggers:
- trigger: time_pattern
hours: /1
- trigger: homeassistant
event: start
conditions: []
actions:
- action: input_number.set_value
metadata: {}
data:
value: '{{ now().hour }}'
target:
entity_id: input_number.ee_hour_of_day
mode: single
- alias: EE Set is TOU Workday
id: ee_set_is_tou_workday
description: Determine todays rates as to workday or holiday
triggers:
- trigger: time
at: 00:15:00
- trigger: homeassistant
event: start
conditions: []
actions:
- if:
- condition: or
conditions:
- condition: time
weekday:
- sun
- sat
- condition: template
value_template: '{{ states("calendar.utility_tou_holidays") == "on" }}'
then:
- action: input_boolean.turn_off
metadata: {}
data: {}
target:
entity_id: input_boolean.ee_solar_is_tou_workday
else:
- action: input_boolean.turn_on
metadata: {}
data: {}
target:
entity_id: input_boolean.ee_solar_is_tou_workday
- variables:
tidx: '{{ trigger.idx }}'
- if:
- condition: template
value_template: '{{ tidx != 0 }}'
then:
- action: automation.turn_off
metadata: {}
data:
stop_actions: true
target:
entity_id:
- automation.ee_while_zn
- automation.ee_while_dl
- automation.ee_while_cp
- action: automation.turn_on
metadata: {}
data: {}
target:
entity_id: automation.ee_while_cp
- delay:
hours: 0
minutes: 0
seconds: 5
milliseconds: 0
- action: automation.trigger
metadata: {}
data:
skip_condition: true
target:
entity_id:
- automation.ee_read_envoy_tariff
- delay:
hours: 0
minutes: 0
seconds: 5
milliseconds: 0
- action: automation.trigger
metadata: {}
data:
skip_condition: true
target:
entity_id:
- automation.ee_read_envoy_relay
- delay:
hours: 0
minutes: 0
seconds: 5
milliseconds: 0
- action: automation.trigger
metadata: {}
data:
skip_condition: true
target:
entity_id:
- automation.ee_read_envoy_xml_info
mode: single
- alias: EE While CP
id: ee_while_cp
description: ''
triggers:
- trigger: template
value_template: "{{\n (states('input_text.ee_observed_tariff') == 'CP' or\n \
\ states('input_text.ee_observed_tariff') == 'ZN' or \n states('input_text.ee_observed_tariff')\
\ == 'DL') and \n states('input_number.ee_observed_solar_production') | float\
\ >= 100000 and\n states(this.entity_id) == 'on'\n}}"
for:
hours: 0
minutes: 0
seconds: 20
- trigger: time
at: '16:45:00'
conditions: []
actions:
- variables:
new_reserve: '{{ states(''sensor.ee_desired_battery_reserve'') | int }}'
workday: '{{ states(''input_boolean.ee_solar_is_tou_workday'') == ''on'' }}'
dl_time: '{% set yetz = now () %}
{% set hr = yetz.hour * 100 + yetz.minute %}
{{ hr >= 1644 }}'
observed_tariff: '{{ states(''input_text.ee_observed_tariff'') }}'
observed_production: '{{ states(''input_number.ee_observed_solar_production'')
}}'
- if:
- condition: template
value_template: '{{ workday and dl_time }}'
then:
- action: automation.turn_off
metadata: {}
data:
stop_actions: false
target:
entity_id: '{{ this.entity_id }}'
- action: automation.turn_on
metadata: {}
data: {}
target:
entity_id: automation.ee_while_dl
else:
- variables:
response:
status: timeout
attempts: 0
- repeat:
sequence:
- if:
- condition: template
value_template: '{{ attempts > 0 }}'
then:
- if:
- condition: template
value_template: '{{ attempts < 10 }}'
then:
- delay:
hours: 0
minutes: 0
seconds: 2
milliseconds: 0
else:
- delay:
hours: 0
minutes: 30
seconds: 0
milliseconds: 0
- action: notify.persistent_notification
metadata: {}
data:
message: 'Tariff change fails (CP)
{{ attempts }}
{{ now().strftime(''%m/%d %H:%M:%S'') }}'
- action: rest_command.send_envoy_param_tariff
continue_on_error: true
metadata: {}
data:
peak_rule: ZN
peak_start: 420
peak_end: 1141
reserve: '{{ new_reserve }}'
response_variable: response
- variables:
attempts: '{{ attempts + 1 }}'
while:
- condition: template
value_template: '{{ attempts == 0 or response.status | int(0) != 200 and
attempts < 100 }}'
- action: script.ee_decode_tariff
metadata: {}
data:
response: '{{ response }}'
- delay:
hours: 0
minutes: 1
seconds: 0
milliseconds: 0
- action: automation.turn_off
metadata: {}
data:
stop_actions: false
target:
entity_id: '{{ this.entity_id }}'
- action: automation.turn_on
metadata: {}
data: {}
target:
entity_id: automation.ee_while_zn
mode: single
- alias: EE While DL
id: ee_while_dl
description: ''
triggers:
- trigger: time
at: '20:02:00'
conditions: []
actions:
- action: automation.turn_off
metadata: {}
data:
stop_actions: false
target:
entity_id: '{{ this.entity_id }}'
- action: automation.turn_on
metadata: {}
data: {}
target:
entity_id: automation.ee_while_cp
mode: single
- alias: EE While ZN
id: ee_while_zn
description: ''
triggers:
- alias: Climb Reserve in ZN
trigger: template
value_template: "{{\n states('input_text.ee_observed_tariff') == 'ZN' and \n\
\ states('input_number.ee_observed_tariff_battery_reserve') | float != states('sensor.ee_desired_battery_reserve')\
\ | float and\n states(this.entity_id) == 'on'\n}}"
for:
hours: 0
minutes: 0
seconds: 20
- alias: Drop out of ZN
trigger: template
value_template: "{{\n states('input_text.ee_observed_tariff') == 'ZN' and\n \
\ states('input_number.ee_observed_solar_production') | int < 50000 and\n states(this.entity_id)\
\ == 'on'\n}}"
for:
hours: 0
minutes: 0
seconds: 45
- alias: Ready for DL
trigger: time
at: '16:45:00'
conditions: []
actions:
- variables:
tidx: '{{ trigger.idx }}'
workday: '{{ states(''input_boolean.ee_solar_is_tou_workday'') == ''on'' }}'
observed_tariff: '{{ states(''input_text.ee_observed_tariff'') }}'
observed_production: '{{ states(''input_number.ee_observed_solar_production'')
}}'
- if:
- alias: Climb Trigger?
condition: template
value_template: '{{ tidx == 0 }}'
then:
- variables:
tariff: "{{\n { \n \"time\" : now().timestamp() | int,\n \"peak_rule\"\
: \"ZN\",\n \"peak_start\": 420,\n \"peak_end\": 1141,\n \"reserve\"\
: states('sensor.ee_desired_battery_reserve') | float \n }\n}}"
else:
- if:
- condition: template
value_template: '{{ tidx == 2 and not workday }}'
then:
- stop: It is 4:45pm but not workday
- variables:
tariff: "{{\n { \n \"time\" : now().timestamp() | int,\n \"peak_rule\"\
: \"DL\",\n \"peak_start\": 1021 if workday else 780,\n \"peak_end\"\
: 1201 if workday else 785,\n \"reserve\": min(50, states('input_number.ee_observed_charge')\
\ | int)\n }\n}}"
- action: automation.turn_off
metadata: {}
data:
stop_actions: false
target:
entity_id: '{{ this.entity_id }}'
- if:
- condition: and
conditions:
- condition: template
value_template: '{{ workday }}'
- condition: time
after: '16:44:00'
then:
- action: automation.turn_on
metadata: {}
data: {}
target:
entity_id: automation.ee_while_dl
else:
- action: automation.turn_on
metadata: {}
data: {}
target:
entity_id: automation.ee_while_cp
- variables:
response:
status: timeout
attempts: 0
- repeat:
sequence:
- if:
- condition: template
value_template: '{{ attempts > 0 }}'
then:
- if:
- condition: template
value_template: '{{ attempts < 10 }}'
then:
- delay:
hours: 0
minutes: 0
seconds: 2
milliseconds: 0
else:
- delay:
hours: 0
minutes: 30
seconds: 0
milliseconds: 0
- action: notify.persistent_notification
metadata: {}
data:
message: 'Tariff change fails (ZN)
{{ attempts }}
{{ now().strftime(''%m/%d %H:%M:%S'') }}'
- action: rest_command.send_envoy_param_tariff
continue_on_error: true
metadata: {}
data: '{{ tariff }}'
response_variable: response
- variables:
attempts: '{{ attempts + 1 }}'
while:
- condition: template
value_template: "{{ \n attempts == 0 or \n response.status | int(0) != 200\
\ and attempts < 100\n}}"
- action: script.ee_decode_tariff
metadata: {}
data:
response: '{{ response }}'
mode: single