ha-energy
Skill16 starsChanged 7 months agoMITView on GitHub
Set up Home Assistant energy monitoring with dashboards, solar, grid, and device tracking. Use when configuring energy sensors, utility meters, statistics, or analyzing consumption. Activates on keywords: energy dashboard, solar, grid, consumption, kWh, utility meter, power monitoring, state_class, device_class: energy.
In this repository23 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- cloudflare-vpc-servicesSkill
- code-reviewerSkill
- commit-helperSkill
- esphome-box3-builderSkill
- esphome-config-helperSkill
- frigate-configuratorSkill
- grafana-billingSkill
- grafana-plugin-scaffoldingSkill
- ha-addonSkill
- ha-apiSkill
- ha-automationSkill
- ha-dashboardSkill
- ha-integrationSkill
- ha-voiceSkill
- kubernetes-healthSkill
- kubernetes-operationsSkill
- linearSkill
- tauri-v2Skill
- typescript-v6Skill
- vitest-v4Skill
- vite-v8Skill
The file
We split this skill into the rules it gives an agent
6 rules. About 0 are common, 2 are distinctive, and 4 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈2
Distinctive · estimate
This author's own choices. Worth a look.
4
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 103
Use state_class: total_increasing for cumulative meters that only increase
- Very specific: line 104
Add device_class: energy to all energy sensors
- Distinctive: line 109
Use separate sensors for grid consumption and grid return
- Very specific: line 113
Use state_class: measurement for cumulative meters (breaks statistics)
- Very specific: line 116
Create energy sensors without state_class (they won't work in energy dashboard)
- Distinctive: line 442
Before using this skill, verify:
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Home Assistant Energy Skill
Configure Home Assistant energy monitoring with dashboards, solar, grid, and device tracking.
Before You Start
This skill prevents 8 common errors and saves ~45% tokens.
| Metric | Without Skill | With Skill |
| Setup Time | 45+ min | 15 min |
| Common Errors | 8 | 0 |
| Token Usage | ~10000 | ~5500 |
Known Issues This Skill Prevents
- Incorrect
state_classvalues (must betotal,total_increasing, ormeasurement) - Missing
device_class: energyon energy sensors - Wrong
state_classfor utility_meter entities (must betotal_increasing) - Using
unit_of_measurement: kWhwithoutstate_class(breaks statistics) - Forgetting to enable statistic collection in configuration.yaml
- Configuring solar sensors without battery tracking for self-consumption
- Grid monitoring with mismatched sensor pairs (consumption vs return)
- Utility meter cycle settings that don't align with billing periods
Quick Start
Step 1: Configure Energy Sensors
# configuration.yaml
template:
- sensor:
- name: "Total Energy Consumed"
unique_id: total_energy_consumed
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
state: "{{ (states('sensor.energy_meter') | float(0)) }}"
- name: "Solar Production"
unique_id: solar_production
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
state: "{{ (states('sensor.solar_meter') | float(0)) }}"Why this matters: Proper state_class enables Home Assistant to automatically create statistics and energy dashboard integration. Without it, your sensors won't appear in the energy dashboard.
Step 2: Set Up Utility Meter for Billing Cycles
# configuration.yaml
utility_meter:
daily_energy:
source: sensor.total_energy_consumed
cycle: daily
offset: [hours: 0]
monthly_energy:
source: sensor.total_energy_consumed
cycle: monthly
offset: [days: 0]
daily_solar:
source: sensor.solar_production
cycle: daily
offset: [hours: 0]Why this matters: Utility meters automatically reset at specified intervals and track consumption periods for billing analysis.
Step 3: Enable Statistics Recorder
# configuration.yaml
recorder:
db_url: !secret database_url # Optional but recommended
auto_purge: true
auto_purge_days: 90 # Adjust retention as needed
# Include sensors with state_class for statistics
include:
entities:
- sensor.total_energy_consumed
- sensor.solar_production
- sensor.grid_consumption
- sensor.grid_returnWhy this matters: Statistics require the recorder to be properly configured. Without explicit inclusion, energy sensors may not generate statistics for long-term analysis.
Critical Rules
Always Do
- Use
state_class: total_increasingfor cumulative meters that only increase - Add
device_class: energyto all energy sensors - Set
unit_of_measurement: kWh(or appropriate unit) on energy sensors - Configure utility_meter for billing cycle tracking
- Include all energy sensors in recorder's
includelist - Reset cumulative sensors on device restart via template sensor
- Use separate sensors for grid consumption and grid return
Never Do
- Use
state_class: measurementfor cumulative meters (breaks statistics) - Forget the
offsetparameter on utility_meter (may cause midnight resets) - Mix power (W) and energy (kWh) sensors without Riemann sum integration
- Create energy sensors without
state_class(they won't work in energy dashboard) - Assume solar production should subtract from consumption (energy dashboard handles this)
- Configure bidirectional flow on single sensors (use separate consumption/return sensors)
- Skip utility_meter configuration if you need consumption tracking by period
Common Mistakes
Wrong:
sensor:
- platform: template
sensors:
total_energy:
unit_of_measurement: kWh
value_template: "{{ states('sensor.meter') }}"Correct:
template:
- sensor:
- name: "Total Energy"
unique_id: total_energy
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
state: "{{ (states('sensor.meter') | float(0)) }}"Why: Template platform is deprecated. Use template integration with proper state_class and device_class to enable energy dashboard integration.
Known Issues Prevention
| Issue | Root Cause | Solution |
| Energy dashboard shows no data | state_class missing or wrong | Use total_increasing for cumulative meters |
| Statistics not generated | Sensors not in recorder's include list | Add sensor entities to recorder config |
| Utility meter not resetting | Wrong offset or missing cycle | Verify cycle (hourly/daily/monthly) and offset settings |
| Solar self-consumption not calculated | Battery sensors not configured separately | Create charge/discharge sensors for batteries |
| Grid consumption incorrect | Using bidirectional sensor instead of separate sensors | Split into grid_consumption and grid_return |
| Sensor unavailable after restart | Cumulative meter not preserved | Add availability_template to template sensor |
| Statistics showing wrong values | Raw data has negative values or gaps | Use Riemann sum to convert power to energy |
| Utility meter shows wrong period | Offset set incorrectly for timezone | Align offset with local midnight or billing cycle |
Configuration Reference
Energy Sensor Template (YAML)
template:
- sensor:
- name: "Main Energy Meter"
unique_id: main_energy_meter
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
availability_template: "{{ states('sensor.meter_input') not in ['unavailable', 'unknown'] }}"
state: "{{ (states('sensor.meter_input') | float(0)) }}"
- name: "Instantaneous Power"
unique_id: instantaneous_power
unit_of_measurement: W
device_class: power
state_class: measurement
state: "{{ (states('sensor.power_meter') | float(0)) }}"Key settings:
device_class: energy- Identifies as energy sensor for energy dashboardstate_class: total_increasing- Cumulative meter that only increasesstate_class: measurement- Instantaneous values (power, not energy)unit_of_measurement: kWh- Energy units; use W for poweravailability_template- Prevents unavailable states from breaking statistics
Utility Meter Configuration (YAML)
utility_meter:
daily_consumption:
source: sensor.total_energy_consumed
cycle: daily
offset:
hours: 0
net_consumption: false # true for solar with self-consumption
monthly_consumption:
source: sensor.total_energy_consumed
cycle: monthly
offset:
days: 1 # Reset on 1st of month
hours: 0
peak_consumption:
source: sensor.total_energy_consumed
cycle: weekly
offset:
days: 0 # Reset on Monday
hours: 0Key settings:
cycle: hourly, daily, weekly, monthly, bimonthly, quarterly, yearlyoffset: Time adjustment for billing alignmentnet_consumption: Set to true for solar to track self-consumption
Riemann Sum Integration (for Power to Energy)
integration:
- platform: riemann_sum
name: "Daily Energy from Power"
unique_id: daily_energy_riemann
source: sensor.instantaneous_power
round: 3
unit_prefix: k # Converts W to kWh
unit_time: h
method: trapezoidalKey settings:
source: Power sensor (W) to integrateunit_prefix: k- Converts watts to kilowattsmethod: trapezoidalorleftfor integration algorithmround: 3- Decimal precision
Common Patterns
Grid Monitoring (Consumption + Return)
template:
- sensor:
- name: "Grid Consumption"
unique_id: grid_consumption
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
state: "{{ (states('sensor.grid_import') | float(0)) }}"
- name: "Grid Return"
unique_id: grid_return
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
state: "{{ (states('sensor.grid_export') | float(0)) }}"Solar Production with Battery
template:
- sensor:
- name: "Solar Production"
unique_id: solar_production
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
state: "{{ (states('sensor.solar_meter') | float(0)) }}"
- name: "Battery Charge"
unique_id: battery_charge
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
state: "{{ (states('sensor.battery_charge_meter') | float(0)) }}"
- name: "Battery Discharge"
unique_id: battery_discharge
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
state: "{{ (states('sensor.battery_discharge_meter') | float(0)) }}"Device Power Monitoring (Smart Plug)
template:
- sensor:
- name: "Device Energy Today"
unique_id: device_energy_today
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
state: "{{ (states('sensor.device_energy') | float(0)) }}"
utility_meter:
device_daily_energy:
source: sensor.device_energy_today
cycle: daily
offset:
hours: 0Bundled Resources
References
Located in references/:
state-class-guide.md- Comprehensive state_class referencedevice-class-reference.md- All energy-related device classesutility-meter-patterns.md- Billing cycle configurationsenergy-dashboard-setup.md- Step-by-step energy dashboard guidesolar-integration.md- Solar panel and battery tracking
Note: For deep dives on specific topics, see the reference files above.
Assets
Located in assets/:
energy-sensors-template.yaml- Complete sensor templateutility-meter-examples.yaml- Meter configurations for all scenariosenergy-dashboard-card.yaml- Dashboard card configuration
Copy these templates as starting points for your implementation.
Context7 Documentation
For current documentation, use these Context7 library IDs:
| Library ID | Purpose |
/home-assistant/home-assistant.io | User docs - energy, solar, grid, utility_meter |
/home-assistant/integrations | Integration docs for specific devices |
/home-assistant/template | Template sensor reference |
Official Documentation
- Energy Integration Overview
- Electricity Grid Monitoring
- Solar Panels Integration
- Utility Meter Integration
- Template Sensor
- Statistics Integration
Troubleshooting
Energy Dashboard Shows No Data
Symptoms: Energy dashboard loads but shows "No data available" or blank graphs.
Solution:
# 1. Verify sensors exist and have state_class
developer-tools > States > Search for energy/solar sensors
# 2. Check recorder includes sensors
# In configuration.yaml:
recorder:
include:
entities:
- sensor.total_energy_consumed
- sensor.solar_production
# 3. Restart Home Assistant
# 4. Wait 10 minutes for statistics to generate
# 5. Check Developer Tools > StatisticsUtility Meter Not Resetting
Symptoms: Utility meter keeps accumulating without resetting at expected time.
Solution:
# Check offset configuration
utility_meter:
daily_energy:
source: sensor.total_energy_consumed
cycle: daily
# For midnight reset in your timezone:
offset:
hours: 0
# For reset at 6 AM:
# offset:
# hours: 6Solar Self-Consumption Not Tracking
Symptoms: Self-consumption percentage is 0% or not shown.
Solution:
# Create separate battery sensors
template:
- sensor:
- name: "Battery Charge"
unique_id: battery_charge
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
state: "{{ (states('sensor.battery_charge_meter') | float(0)) }}"
- name: "Battery Discharge"
unique_id: battery_discharge
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
state: "{{ (states('sensor.battery_discharge_meter') | float(0)) }}"
# In energy dashboard configuration, set:
# - Source: Solar production sensor
# - Battery (optional): Both charge and discharge sensorsSensor Shows "unknown" or "unavailable"
Symptoms: Sensor state stuck on "unknown" or "unavailable" in Developer Tools.
Solution:
# Add availability_template
template:
- sensor:
- name: "Energy Meter"
unique_id: energy_meter
unit_of_measurement: kWh
device_class: energy
state_class: total_increasing
availability_template: "{{ states('sensor.meter_input') not in ['unavailable', 'unknown'] }}"
state: "{{ (states('sensor.meter_input') | float(0)) }}"Setup Checklist
Before using this skill, verify:
- Home Assistant is running 2023.1 or later
- You have access to configuration.yaml (File Editor or VS Code add-on)
- You have at least one energy sensor available (grid meter, smart plug, integration sensor)
- You've decided on meter types (grid consumption/return, solar, battery, individual devices)
- You understand your billing cycle (daily, monthly, etc.)
- Recorder is enabled in configuration.yaml
- You've identified all devices/meters to monitor
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

