Skip to content

Instantly share code, notes, and snippets.

@jschlyter
Last active January 23, 2025 21:30
Show Gist options
  • Save jschlyter/a4f6ed52ff78de3cfad7dc8e84304a34 to your computer and use it in GitHub Desktop.
Save jschlyter/a4f6ed52ff78de3cfad7dc8e84304a34 to your computer and use it in GitHub Desktop.
Home Assistant Hourly Tariff
utility_meter:
energy_consumed_meter_hourly:
source: sensor.smart_meter_real_energy_consumed
cycle: hourly
template:
- trigger:
platform: time_pattern
minutes: 59
seconds: 59
sensor:
- name: mains_power_hourly_tariff
unit_of_measurement: W
device_class: power
state: >
{% if now().hour < 6 or now().hour >= 22 %}
{{ ( states('sensor.energy_consumed_meter_hourly') | float(0) * 500 ) | round(0) }}
{% else %}
{{ ( states('sensor.energy_consumed_meter_hourly') | float(0) * 1000 ) | round(0) }}
{% endif %}
-- Last month
SELECT
AVG(max_daily_peek_power) AS average_monthly_peek_power
FROM (
SELECT
DATE_FORMAT(FROM_UNIXTIME(last_updated_ts), "%Y%-%m-%d") AS tariff_date,
MAX(CONVERT(state, UNSIGNED)) AS max_daily_peek_power
FROM
states
LEFT JOIN state_attributes ON (
states.attributes_id = state_attributes.attributes_id
)
WHERE
metadata_id = (
SELECT metadata_id
FROM states_meta
WHERE entity_id = "sensor.mains_power_hourly_tariff"
)
AND state > 0
AND last_updated_ts >= UNIX_TIMESTAMP(DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 2 MONTH)), INTERVAL 1 DAY))
AND last_updated_ts < UNIX_TIMESTAMP(DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 1 MONTH)), INTERVAL 1 DAY))
GROUP BY tariff_date
ORDER BY max_daily_peek_power DESC
LIMIT 3
) AS max_power_per_date;
-- Current month
SELECT
AVG(max_daily_peek_power) AS average_monthly_peek_power
FROM (
SELECT
DATE_FORMAT(FROM_UNIXTIME(last_updated_ts), "%Y%-%m-%d") AS tariff_date,
MAX(CONVERT(state, UNSIGNED)) AS max_daily_peek_power
FROM
states
LEFT JOIN state_attributes ON (
states.attributes_id = state_attributes.attributes_id
)
WHERE
metadata_id = (
SELECT metadata_id
FROM states_meta
WHERE entity_id = "sensor.mains_power_hourly_tariff"
)
AND state > 0
AND last_updated_ts >= UNIX_TIMESTAMP(DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 1 MONTH)), INTERVAL 1 DAY))
AND last_updated_ts < UNIX_TIMESTAMP(DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 0 MONTH)), INTERVAL 1 DAY))
GROUP BY tariff_date
ORDER BY max_daily_peek_power DESC
LIMIT 3
) AS max_power_per_date;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment