/
resources.yaml
222 lines (219 loc) · 8.4 KB
/
resources.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
template:
- binary_sensor:
- name: "Grid Feed"
device_class: power
state: "{{ states('sensor.grid_frequency') | int(0) > 0 }}"
icon: >-
{% if states('sensor.grid_frequency') | int(0) > 0 %}
mdi:transmission-tower
{% else %}
mdi:transmission-tower-off
{% endif %}
- sensor:
- name: "Home Power"
unique_id: "ec13fb72-1d08-427a-918b-e7549539a1be"
unit_of_measurement: W
device_class: power
# battery power goes positive and negative (postive power means the battery is charging)
state: "{{ states('sensor.grid_power') | int(0) + states('sensor.pv_power') | int(0) - states('sensor.battery_power') | int(0) }}"
- name: "Home Power kW"
unique_id: "0d70dd0f-a7e4-416b-a293-cb1d518bdfcf"
unit_of_measurement: kW
device_class: power
state: "{{ ((states('sensor.home_power') | int(0)) / 1000) | round(3) }}"
- name: "Solar Reserve"
unique_id: "cdff01dd-8401-4c0e-a661-1a72d74dbb01"
unit_of_measurement: W
device_class: power
state: >-
{% set pv_potential = states('sensor.power_production_now') | int(0) %}
{% set pv_power = states('sensor.pv_power') | int(0) %}
{% set battery_power = states('sensor.battery_power') | int(0) %}
{%- if (pv_power > pv_potential and pv_power > 10) or (pv_power > 10 and battery_power < 0) %}
0
{% elif pv_potential > 0 %}
{{ pv_potential - pv_power }}
{% else %}
0
{% endif %}
- name: "Solar Consumption Percentage"
icon: mdi:solar-power
unit_of_measurement: "%"
state: >
{% set pv_potential = states('sensor.power_production_now') | int(0) %}
{% set pv_power = states('sensor.pv_power') | int(0) %}
{% set battery_power = states('sensor.battery_power') | int(0) %}
{%- if (pv_power > pv_potential and pv_power > 10) or (pv_power > 10 and battery_power < 0) %}
100
{% elif pv_potential > 0 %}
{{ (pv_power / pv_potential * 100) | round(0) }}
{% else %}
0
{% endif %}
- name: "Solar Reserve Percentage"
icon: mdi:solar-power
unit_of_measurement: "%"
state: >
{% if states('sensor.power_production_now') | int(0) > 0 %}
{{ 100 - states('sensor.solar_consumption_percentage') | int(0) }}
{% else %}
0
{% endif %}
- name: "Battery Status"
icon: >-
{% set state = states('sensor.battery_state_of_charge') | int(0) %}
{% set charging = "-charging" if states('sensor.battery_status') == "Charging" else "" %}
{% set suffix = ((state + 5) // 10) * 10 %}
{# empty #}
{% if suffix <= 0 %}
mdi:battery-alert-variant-outline
{# full #}
{% elif suffix == 100 %}
{# choose the right full battery #}
{% if charging != "" %}
mdi:battery-charging-100
{% else %}
mdi:battery
{% endif %}
{# everything in between #}
{% else %}
mdi:battery{{ charging }}-{{ suffix }}
{% endif %}
state: >
{%- set threshold = 100 -%}
{%- if states('sensor.battery_power') | int(0) > threshold -%}
Charging
{%- elif states('sensor.battery_power') | int(0) < -threshold -%}
Discharging
{%- else -%}
Trickling
{%- endif %}
- name: "Battery Time To Full"
device_class: duration
unit_of_measurement: s
state: >
{% set battery_status = states('sensor.battery_status') %}
{% set rate = states('sensor.battery_change_of_charge') | float(0) | abs %}
{% set current_charge = states('sensor.battery_state_of_charge') | float(0) %}
{% if battery_status == 'Charging' %}
{{ (100 - current_charge) * 60 * 60 / rate }}
{% else %}
0
{% endif %}
- name: "Battery Time To Empty"
device_class: duration
unit_of_measurement: s
state: >
{% set battery_status = states('sensor.battery_status') %}
{% set rate = states('sensor.battery_change_of_charge') | float(0) | abs %}
{% set current_charge = states('sensor.battery_state_of_charge') | float(0) %}
{% if battery_status == 'Discharging' -%}
{{ (current_charge - 20) * 60 * 60 / rate }}
{% else %}
0
{% endif %}
sensor:
- platform: derivative
source: sensor.battery_state_of_charge
name: "Battery Change of Charge"
round: 1
unit_time: h
unit: "%/h"
time_window: "00:05:00"
# digital power meter in db
- platform: integration
name: "Total Electricity Consumption"
source: sensor.current_power
unit_prefix: k
unit_time: h
method: left
round: 3
- platform: integration
name: "Home Energy"
source: sensor.home_power
unit_prefix: k
unit_time: h
method: left
round: 3
- platform: template
sensors:
monthly_grid_energy_consumption_forecast:
unique_id: "5a0d7a1b-0bbd-42b0-9b21-5daf97eeade0"
unit_of_measurement: "kWh"
# alternative:
# {{ ((now().replace(day=1) + timedelta(days=31)).replace(day=1) - timedelta(days=1)).day }}
# from: https://community.home-assistant.io/t/calculate-estimated-monthly-kwh-value/558816/4
value_template: >
{% set now = now() %}
{% set month = now.month %}
{% set year = now.year %}
{% set days = None %}
{# feb: leap years #}
{% if month == 2 and year is divisibleby 4 and not year is divisibleby 400 %}
{% set days = 29 %}
{# jan, mar, may, jul, aug, oct, dec #}
{% elif month in [1,3,5,7,8,10,12] %}
{% set days = 31 %}
{# apr, jun, sep, nov #}
{% elif month in [4,6,9,11] %}
{% set days = 30 %}
{# feb #}
{% else %}
{% set days = 28 %}
{% endif %}
{{ ((states('sensor.monthly_grid_energy_consumption') | int) / now.day * days) | round(3) }}
monthly_home_energy_consumption_forecast:
unique_id: "9a1c2a4e-76cd-416d-8680-fe1ea588f254"
unit_of_measurement: "kWh"
value_template: >
{% set n = now() %}
{% set days = ((n.replace(day=1) + timedelta(days=-31)).replace(day=1) - timedelta(days=1)).day %}
{{ ((states('sensor.monthly_home_energy_consumption') | int) / n.day * days) | round(3) }}
utility_meter:
daily_grid_energy_consumption:
unique_id: "cb11e11e-259d-43dc-bc65-a9752b0bd31a"
source: sensor.grid_energy_in
cycle: daily
monthly_grid_energy_consumption:
unique_id: "be9b3cac-80e0-4d59-8557-403d17100b22"
source: sensor.grid_energy_in
cycle: monthly
daily_home_energy_consumption:
unique_id: "765e119e-60ef-4e0b-87f0-e7d64adad81a"
source: sensor.home_energy
cycle: daily
monthly_home_energy_consumption:
unique_id: "ffcf90f5-5f22-47be-a389-8e74876ecead"
source: sensor.home_energy
cycle: monthly
automation:
- alias: "Notify If Grid Feed Status Changed"
id: "b233b973-cf9b-44b5-94e4-5f0813e6eefa"
initial_state: true
trigger:
platform: state
entity_id: binary_sensor.grid_feed
action:
- service: notify.mobile_app_ceres
data:
title: "Home"
message: >-
{% set after = "" %}
{% set seconds = (as_timestamp(utcnow()) - as_timestamp(trigger.from_state.last_changed)) | int %}
{% if seconds < 60 %}
{% set after = seconds ~ " sec" %}
{% elif seconds < 60*60 %}
{% set after = seconds // 60 ~ " min" %}
{% else %}
{% set h = seconds // (60*60) %}
{% set m = ((seconds / (60*60) - seconds // (60*60)) * 60) | round %}
{% if m < 10 %}
{% set after = h ~ "h0" ~ m %}
{% else %}
{% set after = h ~ "h" ~ m %}
{% endif %}
{% endif %}
The grid feed has been {{ 'restored after ' ~ after ~ '.' if is_state('binary_sensor.grid_feed', 'on') else 'cut.' }}
data:
group: "home-electricity"
url: homeassistant://navigate/lovelace/resources