Rainforest EAGLE-200 Energy Gateway - Does you have one?

In my case, SDGE does not configure the meter to have the $ amount. So I ended up creating a set of sensors/automations that calculate the tariff type (superoffpeak, offpeak, onpeak) and then use the utility_meter to accumulate the kWh and amount over days/months.

Is far from ideal, but gives me a good idea on how my energy consumption is going.

Notes:

  • I noticed that the meter has a different “time” (a couple of minutes off), so I am going to eventually move to use that for automations that trigger “energy consumption events” (e.g. pool pump, car charging, tesla gateway mode, etc)
  • The holiday calendar will require updating every year. This is me being lazy, I could pull it down from their webpage.
  • I have not discriminated the prices for exporting energy. I just got solar.
  • I am on EV-TOU-5 (thanks Tesla). Therefore I do not have baseline. The change of tariff will be the same for any TOU plan, but the price will change based on your consumption vs baseline and the plan you are actually on.
  • SDGE has a weird way to do their bill cycle. I am using month cycle, eventually I will move to use their billing cycle.

These are extracts of it:
In configuration.yaml

utility_meter:
  energy_meter_monthly_imported:
    source: sensor.energy_meter_imported
    cycle: monthly
    tariffs:
      - onpeak
      - offpeak
      - superoffpeak

An automation that switches the tariff:

# EV-TOU-5
# https://www.sdge.com/residential/pricing-plans/about-our-pricing-plans/electric-vehicle-plans
# Winter: Nov 1 - May 31
# Summer: June 1 - Oct 31
# On-Peak: Winter: 24c, Summer: 52c
#   Everyday: 16:00 - 21:00
# Super Off-Peak: Winter: 9c, Summer: 9c
#   Weekdays: 00:00 - 06:00
#   Weekends and holidays: 00:00 - 14:00
# Off-Peak: Winter: 24c, Summer: 28c
#   Weekdays: 06:00 - 16:00, 21:00 - 00:00
#   Weekends and holidays: 14:00 - 16:00, 21:00 - 00:00
# Holidays:
# January 1 (New Year's Day) February 18 (Presidents' Day) April 10 (No Read Day) May 27 (Memorial Day) July 4 (Independence Day)
# September 2 (Labor Day) October 30 (No Read Day) November 28 (Thanksgiving Day) December 25 (Christmas Day)
# Holiday's list: 0101, 0218, 0410, 0527, 0704, 0902, 1030, 1128, 1225

alias: energy_tariff
trigger:
- platform: time
  at: '00:00:00'
- platform: time
  at: '06:00:00'
- platform: time
  at: '14:00:00'
- platform: time
  at: '16:00:00'
- platform: time
  at: '21:00:00'
- platform: homeassistant
  event: start
action:
- service: utility_meter.select_tariff
  data_template:
    entity_id:
    - utility_meter.energy_meter_monthly_imported
    - utility_meter.energy_meter_daily_imported
    - utility_meter.energy_meter_monthly_exported
    - utility_meter.energy_meter_daily_exported
    tariff: >
      {% set current_date = now().strftime("%m%d") | int %}
      {% set day_of_week = now().strftime("%w") | int %}
      {% set current_time = now().strftime("%H%M%S") | int %}
      {% if current_time < 60000 %}
        superoffpeak
      {% elif current_time < 140000 and (day_of_week == 6 or day_of_week == 0 or current_date in [0101, 0218, 0410, 0527, 0704, 0902, 1030, 1128, 1225]) %}
        superoffpeak
      {% elif current_time < 160000 %}
        offpeak
      {% elif current_time < 210000 %}
        onpeak
      {% else %}
        offpeak
      {% endif %}

Then some template sensors:

# Extract the relevant measurements into their own sensors
- platform: template
  sensors:
    energy_meter_instant_power:
      friendly_name: Instant power
      value_template: '{{ states.sensor.energy_meter.attributes.demand | float | round(3) }}'
      unit_of_measurement: kW
    energy_meter_imported:
      friendly_name: Imported
      value_template: '{{ states.sensor.energy_meter.attributes.summation_delivered | float | round(3) }}'
      unit_of_measurement: kWh
    energy_meter_exported:
      friendly_name: Exported
      value_template: '{{ states.sensor.energy_meter.attributes.summation_received | float | round(3) }}'
      unit_of_measurement: kWh

    energy_meter_imported_current_price:
      friendly_name: Current price
      entity_id: utility_meter.energy_meter_daily_imported
      unit_of_measurement: $/kWh
      value_template: >
        {% set current_date = now().strftime("%m%d") | int %}
        {% set summer_tariffs = {'superoffpeak': 0.09, 'offpeak': 0.28, 'onpeak': 0.52} %}
        {% set winter_tariffs = {'superoffpeak': 0.09, 'offpeak': 0.24, 'onpeak': 0.24} %}
        {% if current_date >= 0601 and current_date <= 1031 %}
          {{ summer_tariffs[states('utility_meter.energy_meter_daily_imported')] }}
        {% else %}
          {{ winter_tariffs[states('utility_meter.energy_meter_daily_imported')] }}
        {% endif %}
  
    energy_meter_imported_current_hour_price:
      friendly_name: Current price/h
      entity_id: sensor.energy_meter_instant_power
      unit_of_measurement: $/h
      value_template: >
        {{ (states('sensor.energy_meter_imported_current_price') | float * states('sensor.energy_meter_instant_power') | float) | round(2) }}
  
    energy_meter_daily_imported_cost_onpeak:
      friendly_name: On peak cost
      unit_of_measurement: $
      value_template: >
        {% set current_date = now().strftime("%m%d") | int %}
        {% if current_date >= 0601 and current_date <= 1031 %}
        {%   set price = 0.52 | float %}
        {% else %}
        {%   set price = 0.24 | float %}
        {% endif %}
        {{ (price * states('sensor.energy_meter_daily_imported_onpeak') | float) | round(2) }}
    energy_meter_daily_imported_cost_offpeak:
      friendly_name: Off peak cost
      unit_of_measurement: $
      value_template: >
        {% set current_date = now().strftime("%m%d") | int %}
        {% if current_date >= 0601 and current_date <= 1031 %}
        {%   set price = 0.28 | float %}
        {% else %}
        {%   set price = 0.24 | float %}
        {% endif %}
        {{ (price * states('sensor.energy_meter_daily_imported_offpeak') | float) | round(2) }}
    energy_meter_daily_imported_cost_superoffpeak:
      friendly_name: Super off peak cost
      unit_of_measurement: $
      value_template: >
        {% set current_date = now().strftime("%m%d") | int %}
        {% set price = 0.09 | float %}
        {{ (price * states('sensor.energy_meter_daily_imported_superoffpeak') | float) | round(2) }}
    
    energy_meter_monthly_imported_cost_onpeak:
      friendly_name: On peak cost
      unit_of_measurement: $
      value_template: >
        {% set current_date = now().strftime("%m%d") | int %}
        {% if current_date >= 0601 and current_date <= 1031 %}
        {%   set price = 0.52 | float %}
        {% else %}
        {%   set price = 0.24 | float %}
        {% endif %}
        {{ (price * states('sensor.energy_meter_monthly_imported_onpeak') | float) | round(2) }}
    energy_meter_monthly_imported_cost_offpeak:
      friendly_name: Off peak cost
      unit_of_measurement: $
      value_template: >
        {% set current_date = now().strftime("%m%d") | int %}
        {% if current_date >= 0601 and current_date <= 1031 %}
        {%   set price = 0.28 | float %}
        {% else %}
        {%   set price = 0.24 | float %}
        {% endif %}
        {{ (price * states('sensor.energy_meter_monthly_imported_offpeak') | float) | round(2) }}
    energy_meter_monthly_imported_cost_superoffpeak:
      friendly_name: Super off peak cost
      unit_of_measurement: $
      value_template: >
        {% set current_date = now().strftime("%m%d") | int %}
        {% set price = 0.09 | float %}
        {{ (price * states('sensor.energy_meter_monthly_imported_superoffpeak') | float) | round(2) }}

And this is my UI, I have some days missing data because SDGE unsubscribed my rainforest. I had to re-subscribed it and missed a couple of days.

5 Likes