Files
my-vault/01_Projects/Home-Automation/Hardware/China-Southern-Grid.md
T

64 KiB
Raw Blame History

# ==================== 南方电网完整历史数据拼接传感器 ====================
# 请将此配置添加到 configuration.yaml 文件中
# 如果已有 template: 部分,请将传感器添加到现有的 - sensor: 列表中
# ==================== 南方电网完整历史数据拼接传感器(属性类型已修正)====================
template:
  - sensor:
      # ========== 1. 核心:历史数据拼接(上月+本月每日数据) ==========
      - name: "南方电网历史拼接"
        unique_id: csg_history_combined_0800041935246530
        state: "{{ now().strftime('%Y-%m-%d') }}"
        icon: mdi:chart-line
        attributes:
          history_day_value: >
            {% set last_month = state_attr('sensor.0800041935246530_last_month_total_usage', 'last_month_by_day') %}
            {% set this_month = state_attr('sensor.0800041935246530_this_month_total_usage', 'this_month_by_day') %}
            {% set l_m = last_month if last_month is not none else [] %}
            {% set t_m = this_month if this_month is not none else [] %}
            {{ l_m + t_m }}
          total_days: >
            {% set last_month = state_attr('sensor.0800041935246530_last_month_total_usage', 'last_month_by_day') %}
            {% set this_month = state_attr('sensor.0800041935246530_this_month_total_usage', 'this_month_by_day') %}
            {% set l_m = last_month if last_month is not none else [] %}
            {% set t_m = this_month if this_month is not none else [] %}
            {{ (l_m + t_m) | length }}
          last_month_days: >
            {% set last_month = state_attr('sensor.0800041935246530_last_month_total_usage', 'last_month_by_day') %}
            {{ (last_month | length) if last_month else 0 }}
          this_month_days: >
            {% set this_month = state_attr('sensor.0800041935246530_this_month_total_usage', 'this_month_by_day') %}
            {{ (this_month | length) if this_month else 0 }}
          date_range: >
            {% set last_month = state_attr('sensor.0800041935246530_last_month_total_usage', 'last_month_by_day') %}
            {% set this_month = state_attr('sensor.0800041935246530_this_month_total_usage', 'this_month_by_day') %}
            {% set l_m = last_month if last_month is not none else [] %}
            {% set t_m = this_month if this_month is not none else [] %}
            {% set all_data = l_m + t_m %}
            {% if all_data | length > 0 %}
              {{ all_data[0].date }} 至 {{ all_data[-1].date }}
            {% else %}
              无数据
            {% endif %}
          last_update: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"
      
      # ========== 2. 年度历史数据拼接 ==========
      - name: "南方电网年度历史拼接"
        unique_id: csg_yearly_history_combined_0800041935246530
        state: "{{ now().strftime('%Y-%m') }}"
        icon: mdi:calendar-multiple
        attributes:
          history_month_value: >
            {% set last_year = state_attr('sensor.0800041935246530_last_year_total_usage', 'last_year_by_month') %}
            {% set this_year = state_attr('sensor.0800041935246530_this_year_total_usage', 'this_year_by_month') %}
            {% set l_y = last_year if last_year is not none else [] %}
            {% set t_y = this_year if this_year is not none else [] %}
            {{ l_y + t_y }}
          total_months: >
            {% set last_year = state_attr('sensor.0800041935246530_last_year_total_usage', 'last_year_by_month') %}
            {% set this_year = state_attr('sensor.0800041935246530_this_year_total_usage', 'this_year_by_month') %}
            {% set l_y = last_year if last_year is not none else [] %}
            {% set t_y = this_year if this_year is not none else [] %}
            {{ (l_y + t_y) | length }}
          last_year_months: >
            {% set last_year = state_attr('sensor.0800041935246530_last_year_total_usage', 'last_year_by_month') %}
            {{ (last_year | length) if last_year else 0 }}
          this_year_months: >
            {% set this_year = state_attr('sensor.0800041935246530_this_year_total_usage', 'this_year_by_month') %}
            {{ (this_year | length) if this_year else 0 }}
          last_update: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"
      
      # ========== 3. 近30日平均用电 ==========
      - name: "近30日平均用电"
        unique_id: csg_30days_average_0800041935246530
        unit_of_measurement: "kWh"
        device_class: energy
        state_class: measurement
        icon: mdi:chart-bar
        state: >
          {% set data = state_attr('sensor.nanfangdianwanglishipipinjie', 'history_day_value') %}
          {% if data and data|length > 0 %}
            {% set recent = data[-30:] %}
            {% set total = recent | map(attribute='kwh') | sum %}
            {% set count = recent | length %}
            {{ (total / count) | round(2) if count > 0 else 0 }}
          {% else %}
            0
          {% endif %}
        attributes:
          calculation_days: >
            {% set data = state_attr('sensor.nanfangdianwanglishipipinjie', 'history_day_value') %}
            {{ data[-30:] | length if data else 0 }}
          total_usage: >
            {% set data = state_attr('sensor.nanfangdianwanglishipipinjie', 'history_day_value') %}
            {% if data and data|length > 0 %}
              {{ (data[-30:] | map(attribute='kwh') | sum) | round(2) }}
            {% else %}
              0
            {% endif %}
      
      # ========== 4. 近30日最高用电 ==========
      - name: "近30日最高用电"
        unique_id: csg_30days_max_0800041935246530
        unit_of_measurement: "kWh"
        device_class: energy
        state_class: measurement
        icon: mdi:arrow-up-bold
        state: >
          {% set data = state_attr('sensor.nanfangdianwanglishipipinjie', 'history_day_value') %}
          {% if data and data|length > 0 %}
            {{ (data[-30:] | map(attribute='kwh') | max) | round(2) }}
          {% else %}
            0
          {% endif %}
        attributes:
          date: >
            {% set data = state_attr('sensor.nanfangdianwanglishipipinjie', 'history_day_value') %}
            {% if data and data|length > 0 %}
              {% set max_kwh = data[-30:] | map(attribute='kwh') | max %}
              {% set max_item = data[-30:] | selectattr('kwh', 'equalto', max_kwh) | first %}
              {{ max_item.date if max_item else '未知' }}
            {% else %}
              未知
            {% endif %}
          formatted_date: >
            {% set data = state_attr('sensor.nanfangdianwanglishipipinjie', 'history_day_value') %}
            {% if data and data|length > 0 %}
              {% set max_kwh = data[-30:] | map(attribute='kwh') | max %}
              {% set max_item = data[-30:] | selectattr('kwh', 'equalto', max_kwh) | first %}
              {% if max_item %}
                {{ max_item.date[5:7] }}月{{ max_item.date[8:10] }}日
              {% else %}
                未知
              {% endif %}
            {% else %}
              未知
            {% endif %}
          weekday: >
            {% set data = state_attr('sensor.nanfangdianwanglishipipinjie', 'history_day_value') %}
            {% if data and data|length > 0 %}
              {% set max_kwh = data[-30:] | map(attribute='kwh') | max %}
              {% set max_item = data[-30:] | selectattr('kwh', 'equalto', max_kwh) | first %}
              {% if max_item %}
                {% set weekdays = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] %}
                {{ weekdays[strptime(max_item.date, '%Y-%m-%d').weekday()] }}
              {% else %}
                未知
              {% endif %}
            {% else %}
              未知
            {% endif %}
      
      # ========== 5. 近30日最低用电 ==========
      - name: "近30日最低用电"
        unique_id: csg_30days_min_0800041935246530
        unit_of_measurement: "kWh"
        device_class: energy
        state_class: measurement
        icon: mdi:arrow-down-bold
        state: >
          {% set data = state_attr('sensor.nanfangdianwanglishipipinjie', 'history_day_value') %}
          {% if data and data|length > 0 %}
            {{ (data[-30:] | map(attribute='kwh') | min) | round(2) }}
          {% else %}
            0
          {% endif %}
        attributes:
          date: >
            {% set data = state_attr('sensor.nanfangdianwanglishipipinjie', 'history_day_value') %}
            {% if data and data|length > 0 %}
              {% set min_kwh = data[-30:] | map(attribute='kwh') | min %}
              {% set min_item = data[-30:] | selectattr('kwh', 'equalto', min_kwh) | first %}
              {{ min_item.date if min_item else '未知' }}
            {% else %}
              未知
            {% endif %}
          formatted_date: >
            {% set data = state_attr('sensor.nanfangdianwanglishipipinjie', 'history_day_value') %}
            {% if data and data|length > 0 %}
              {% set min_kwh = data[-30:] | map(attribute='kwh') | min %}
              {% set min_item = data[-30:] | selectattr('kwh', 'equalto', min_kwh) | first %}
              {% if min_item %}
                {{ min_item.date[5:7] }}月{{ min_item.date[8:10] }}日
              {% else %}
                未知
              {% endif %}
            {% else %}
              未知
            {% endif %}
          weekday: >
            {% set data = state_attr('sensor.nanfangdianwanglishipipinjie', 'history_day_value') %}
            {% if data and data|length > 0 %}
              {% set min_kwh = data[-30:] | map(attribute='kwh') | min %}
              {% set min_item = data[-30:] | selectattr('kwh', 'equalto', min_kwh) | first %}
              {% if min_item %}
                {% set weekdays = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] %}
                {{ weekdays[strptime(min_item.date, '%Y-%m-%d').weekday()] }}
              {% else %}
                未知
              {% endif %}
            {% else %}
              未知
            {% endif %}
      
      # ========== 6. 近7日平均用电 ==========
      - name: "近7日平均用电"
        unique_id: csg_7days_average_0800041935246530
        unit_of_measurement: "kWh"
        device_class: energy
        state_class: measurement
        icon: mdi:calendar-week
        state: >
          {% set data = state_attr('sensor.nanfangdianwanglishipipinjie', 'history_day_value') %}
          {% if data and data|length > 0 %}
            {% set recent = data[-7:] %}
            {% set total = recent | map(attribute='kwh') | sum %}
            {% set count = recent | length %}
            {{ (total / count) | round(2) if count > 0 else 0 }}
          {% else %}
            0
          {% endif %}
        attributes:
          total_usage: >
            {% set data = state_attr('sensor.nanfangdianwanglishipipinjie', 'history_day_value') %}
            {% if data and data|length > 0 %}
              {{ (data[-7:] | map(attribute='kwh') | sum) | round(2) }}
            {% else %}
              0
            {% endif %}
      
      # ========== 7. 近7日最高用电 ==========
      - name: "近7日最高用电"
        unique_id: csg_7days_max_0800041935246530
        unit_of_measurement: "kWh"
        device_class: energy
        icon: mdi:arrow-up-bold
        state: >
          {% set data = state_attr('sensor.nanfangdianwanglishipipinjie', 'history_day_value') %}
          {% if data and data|length > 0 %}
            {{ (data[-7:] | map(attribute='kwh') | max) | round(2) }}
          {% else %}
            0
          {% endif %}
      
      # ========== 8. 近7日最低用电 ==========
      - name: "近7日最低用电"
        unique_id: csg_7days_min_0800041935246530
        unit_of_measurement: "kWh"
        device_class: energy
        icon: mdi:arrow-down-bold
        state: >
          {% set data = state_attr('sensor.nanfangdianwanglishipipinjie', 'history_day_value') %}
          {% if data and data|length > 0 %}
            {{ (data[-7:] | map(attribute='kwh') | min) | round(2) }}
          {% else %}
            0
          {% endif %}
      
      # ========== 9. 工作日平均用电 ==========
      - name: "工作日平均用电"
        unique_id: csg_weekday_average_0800041935246530
        unit_of_measurement: "kWh"
        device_class: energy
        icon: mdi:briefcase
        state: >
          {% set data = state_attr('sensor.nanfangdianwanglishipipinjie', 'history_day_value') %}
          {% if data and data|length > 0 %}
            {% set weekday_data = [] %}
            {% for item in data[-30:] %}
              {% set day_of_week = strptime(item.date, '%Y-%m-%d').weekday() %}
              {% if day_of_week < 5 %}
                {% set weekday_data = weekday_data + [item.kwh] %}
              {% endif %}
            {% endfor %}
            {% if weekday_data | length > 0 %}
              {{ ((weekday_data | sum) / (weekday_data | length)) | round(2) }}
            {% else %}
              0
            {% endif %}
          {% else %}
            0
          {% endif %}
        attributes:
          days_count: >
            {% set data = state_attr('sensor.nanfangdianwanglishipipinjie', 'history_day_value') %}
            {% if data and data|length > 0 %}
              {% set count = 0 %}
              {% for item in data[-30:] %}
                {% set day_of_week = strptime(item.date, '%Y-%m-%d').weekday() %}
                {% if day_of_week < 5 %}
                  {% set count = count + 1 %}
                {% endif %}
              {% endfor %}
              {{ count }}
            {% else %}
              0
            {% endif %}
      
      # ========== 10. 周末平均用电 ==========
      - name: "周末平均用电"
        unique_id: csg_weekend_average_0800041935246530
        unit_of_measurement: "kWh"
        device_class: energy
        icon: mdi:home-heart
        state: >
          {% set data = state_attr('sensor.nanfangdianwanglishipipinjie', 'history_day_value') %}
          {% if data and data|length > 0 %}
            {% set weekend_data = [] %}
            {% for item in data[-30:] %}
              {% set day_of_week = strptime(item.date, '%Y-%m-%d').weekday() %}
              {% if day_of_week >= 5 %}
                {% set weekend_data = weekend_data + [item.kwh] %}
              {% endif %}
            {% endfor %}
            {% if weekend_data | length > 0 %}
              {{ ((weekend_data | sum) / (weekend_data | length)) | round(2) }}
            {% else %}
              0
            {% endif %}
          {% else %}
            0
          {% endif %}
        attributes:
          days_count: >
            {% set data = state_attr('sensor.nanfangdianwanglishipipinjie', 'history_day_value') %}
            {% if data and data|length > 0 %}
              {% set count = 0 %}
              {% for item in data[-30:] %}
                {% set day_of_week = strptime(item.date, '%Y-%m-%d').weekday() %}
                {% if day_of_week >= 5 %}
                  {% set count = count + 1 %}
                {% endif %}
              {% endfor %}
              {{ count }}
            {% else %}
              0
            {% endif %}
      
      # ========== 11. 预计本月电费 ==========
      - name: "预计本月电费"
        unique_id: csg_estimated_cost_0800041935246530


views:
  - title: 电力监控
    path: power-monitor
    icon: mdi:flash
    cards:
      - type: vertical-stack
        cards:
          # 仪表盘部分
          - type: grid
            columns: 2
            square: false
            cards:
              - type: gauge
                entity: sensor.0800041935246530_yesterday_kwh
                name: 昨日用电
                unit: kWh
                min: 0
                max: 50
                severity:
                  green: 0
                  yellow: 30
                  red: 40
                needle: true
                segments:
                  - from: 0
                    color: '#4CAF50'
                  - from: 30
                    color: '#FFC107'
                  - from: 40
                    color: '#F44336'
              - type: gauge
                entity: sensor.0800041935246530_this_month_total_usage
                name: 当月电量
                unit: kWh
                min: 0
                max: 1000
                severity:
                  green: 0
                  yellow: 600
                  red: 800
                needle: true
                segments:
                  - from: 0
                    color: '#4CAF50'
                  - from: 600
                    color: '#FFC107'
                  - from: 800
                    color: '#F44336'
          
          # 关键数据卡片
          - type: grid
            columns: 3
            square: false
            cards:
              - type: sensor
                entity: sensor.0800041935246530_balance
                name: 账户余额
                icon: mdi:wallet
                graph: none
              - type: sensor
                entity: sensor.0800041935246530_arrears
                name: 欠缴电费
                icon: mdi:alert-circle
                graph: none
              - type: sensor
                entity: sensor.0800041935246530_last_month_total_cost
                name: 上月电费
                icon: mdi:currency-cny
                graph: none
          
          # 本月数据
          - type: horizontal-stack
            cards:
              - type: sensor
                entity: sensor.0800041935246530_this_month_total_usage
                name: 本月用电
                icon: mdi:flash
                graph: none
              - type: sensor
                entity: sensor.0800041935246530_this_month_total_cost
                name: 本月电费
                icon: mdi:currency-cny
                graph: none
          
          # 上月数据
          - type: horizontal-stack
            cards:
              - type: sensor
                entity: sensor.0800041935246530_last_month_total_usage
                name: 上月用电
                icon: mdi:flash-outline
                graph: none
              - type: sensor
                entity: sensor.0800041935246530_last_month_total_cost
                name: 上月电费
                icon: mdi:currency-cny
                graph: none
          
          # 今年数据
          - type: horizontal-stack
            cards:
              - type: sensor
                entity: sensor.0800041935246530_this_year_total_usage
                name: 今年用电
                icon: mdi:calendar-star
                graph: none
              - type: sensor
                entity: sensor.0800041935246530_this_year_total_cost
                name: 今年电费
                icon: mdi:currency-cny
                graph: none
          
          # 去年数据
          - type: horizontal-stack
            cards:
              - type: sensor
                entity: sensor.0800041935246530_last_year_total_usage
                name: 去年用电
                icon: mdi:calendar-clock
                graph: none
              - type: sensor
                entity: sensor.0800041935246530_last_year_total_cost
                name: 去年电费
                icon: mdi:currency-cny
                graph: none
          
          # 30日统计卡片
          - type: grid
            columns: 3
            square: false
            cards:
              - type: markdown
                content: |
                  **📈 最高用电**
                  {% set data = state_attr('sensor.0800041935246530_this_month_total_usage', 'this_month_by_day') %}
                  {% if data and data|length > 0 %}
                    <h3 style="color: #EF4444; margin: 5px 0;">{{ (data[-30:] | map(attribute='kwh') | max) | round(1) }} kWh</h3>
                    <small style="color: #666;">
                    {% set max_kwh = data[-30:] | map(attribute='kwh') | max %}
                    {% set max_item = data[-30:] | selectattr('kwh', 'equalto', max_kwh) | first %}
                    {{ max_item.date[5:7] }}/{{ max_item.date[8:10] }}
                    </small>
                  {% else %}
                    <h3 style="color: #EF4444; margin: 5px 0;">暂无数据</h3>
                  {% endif %}
              - type: markdown
                content: |
                  **📉 最低用电**
                  {% set data = state_attr('sensor.0800041935246530_this_month_total_usage', 'this_month_by_day') %}
                  {% if data and data|length > 0 %}
                    <h3 style="color: #3B82F6; margin: 5px 0;">{{ (data[-30:] | map(attribute='kwh') | min) | round(1) }} kWh</h3>
                    <small style="color: #666;">
                    {% set min_kwh = data[-30:] | map(attribute='kwh') | min %}
                    {% set min_item = data[-30:] | selectattr('kwh', 'equalto', min_kwh) | first %}
                    {{ min_item.date[5:7] }}/{{ min_item.date[8:10] }}
                    </small>
                  {% else %}
                    <h3 style="color: #3B82F6; margin: 5px 0;">暂无数据</h3>
                  {% endif %}
              - type: markdown
                content: |
                  **🎯 平均用电**
                  {% set data = state_attr('sensor.0800041935246530_this_month_total_usage', 'this_month_by_day') %}
                  {% if data and data|length > 0 %}
                    <h3 style="color: #10B981; margin: 5px 0;">{{ ((data[-30:] | map(attribute='kwh') | sum) / (data[-30:] | length)) | round(1) }} kWh</h3>
                    <small style="color: #666;">近30日平均</small>
                  {% else %}
                    <h3 style="color: #10B981; margin: 5px 0;">暂无数据</h3>
                  {% endif %}
          
          # 近30日用电趋势图
          - type: custom:apexcharts-card
            header:
              show: true
              title: 📊 近30日用电趋势
              show_states: true
              colorize_states: true
            graph_span: 30d
            apex_config:
              chart:
                height: 300px
              dataLabels:
                enabled: false
              stroke:
                curve: smooth
                width: 3
              fill:
                type: gradient
                gradient:
                  shadeIntensity: 1
                  opacityFrom: 0.7
                  opacityTo: 0.3
              markers:
                size: 4
                hover:
                  size: 6
              tooltip:
                x:
                  format: MM月dd日
              grid:
                borderColor: '#e0e0e0'
                strokeDashArray: 4
            series:
              - entity: sensor.0800041935246530_this_month_total_usage
                type: area
                name: 日用电量
                color: '#8B5CF6'
                unit: kWh
                curve: smooth
                data_generator: |
                  const dailyData = entity.attributes.this_month_by_day || [];
                  const recentData = dailyData.slice(-30);
                  return recentData.map(item => {
                    const date = new Date(item.date);
                    return [date.getTime(), parseFloat(item.kwh) || 0];
                  });
            yaxis:
              - min: 0
                decimals: 1
                apex_config:
                  title:
                    text: 用电量 (kWh)
          
          # 当月每日用电详情
          - type: custom:apexcharts-card
            header:
              show: true
              title: 📅 当月每日用电详情
              show_states: true
            graph_span: 35d
            span:
              start: month
            apex_config:
              chart:
                height: 320px
              plotOptions:
                bar:
                  borderRadius: 4
                  columnWidth: 70%
              dataLabels:
                enabled: false
              stroke:
                width:
                  - 0
                  - 3
              tooltip:
                x:
                  format: MM月dd日
                shared: true
            series:
              - entity: sensor.0800041935246530_this_month_total_usage
                type: column
                data_generator: |
                  const data = entity.attributes.this_month_by_day || [];
                  return data.map(item => {
                    return [new Date(item.date).getTime(), parseFloat(item.kwh) || 0];
                  });
                extend_to: false
                float_precision: 2
                name: 每日电量
                color: '#2196F3'
                yaxis_id: power
              - entity: sensor.0800041935246530_this_month_total_cost
                type: line
                data_generator: |
                  const data = entity.attributes.this_month_by_day || [];
                  return data.map(item => {
                    return [new Date(item.date).getTime(), parseFloat(item.cost || item.fee) || 0];
                  });
                extend_to: false
                float_precision: 2
                name: 每日电费
                color: '#FF9800'
                yaxis_id: fee
                curve: smooth
            yaxis:
              - id: power
                decimals: 2
                apex_config:
                  title:
                    text: 电量 (kWh)
              - id: fee
                opposite: true
                decimals: 2
                apex_config:
                  title:
                    text: 电费 (元)
          
          # 上月每日用电详情
          - type: custom:apexcharts-card
            header:
              show: true
              title: 📊 上月每日用电详情
              show_states: true
            graph_span: 35d
            span:
              start: month
              offset: '-1M'
            apex_config:
              chart:
                height: 300px
              plotOptions:
                bar:
                  borderRadius: 4
                  columnWidth: 70%
              dataLabels:
                enabled: false
              stroke:
                width:
                  - 0
                  - 3
              tooltip:
                x:
                  format: MM月dd日
                shared: true
            series:
              - entity: sensor.0800041935246530_last_month_total_usage
                type: column
                data_generator: |
                  const data = entity.attributes.last_month_by_day || [];
                  return data.map(item => {
                    return [new Date(item.date).getTime(), parseFloat(item.kwh) || 0];
                  });
                extend_to: false
                float_precision: 2
                name: 每日电量
                color: '#9C27B0'
                yaxis_id: power
              - entity: sensor.0800041935246530_last_month_total_cost
                type: line
                data_generator: |
                  const data = entity.attributes.last_month_by_day || [];
                  return data.map(item => {
                    return [new Date(item.date).getTime(), parseFloat(item.cost || item.fee) || 0];
                  });
                extend_to: false
                float_precision: 2
                name: 每日电费
                color: '#E91E63'
                yaxis_id: fee
                curve: smooth
            yaxis:
              - id: power
                decimals: 2
                apex_config:
                  title:
                    text: 电量 (kWh)
              - id: fee
                opposite: true
                decimals: 2
                apex_config:
                  title:
                    text: 电费 (元)
          
          # 今年每月用电趋势
          - type: custom:apexcharts-card
            header:
              show: true
              title: 📈 今年每月用电趋势
              show_states: true
            graph_span: 1y
            span:
              start: year
            apex_config:
              chart:
                height: 320px
              plotOptions:
                bar:
                  borderRadius: 6
                  columnWidth: 60%
              dataLabels:
                enabled: true
                enabledOnSeries:
                  - 0
                style:
                  fontSize: 11px
              stroke:
                width:
                  - 0
                  - 3
              tooltip:
                x:
                  format: yyyy年MM月
            series:
              - entity: sensor.0800041935246530_this_year_total_usage
                type: column
                data_generator: |
                  const data = entity.attributes.this_year_by_month || [];
                  return data.map(item => {
                    return [new Date(item.month || item.date).getTime(), parseFloat(item.kwh || item.usage) || 0];
                  });
                extend_to: false
                float_precision: 2
                name: 每月电量
                color: '#4CAF50'
                yaxis_id: power
              - entity: sensor.0800041935246530_this_year_total_cost
                type: line
                data_generator: |
                  const data = entity.attributes.this_year_by_month || [];
                  return data.map(item => {
                    return [new Date(item.month || item.date).getTime(), parseFloat(item.cost || item.fee) || 0];
                  });
                extend_to: false
                float_precision: 2
                name: 每月电费
                color: '#FF5722'
                yaxis_id: fee
                curve: smooth
            yaxis:
              - id: power
                decimals: 0
                apex_config:
                  title:
                    text: 电量 (kWh)
              - id: fee
                opposite: true
                decimals: 2
                apex_config:
                  title:
                    text: 电费 (元)
          
          # 今年vs去年对比
          - type: custom:apexcharts-card
            header:
              show: true
              title: 🔄 今年 vs 去年用电对比
            graph_span: 1y
            span:
              start: year
            apex_config:
              chart:
                height: 340px
                type: bar
              plotOptions:
                bar:
                  horizontal: false
                  columnWidth: 65%
                  borderRadius: 4
              dataLabels:
                enabled: false
              stroke:
                show: true
                width: 2
                colors:
                  - transparent
              tooltip:
                x:
                  format: MM月
                shared: true
              legend:
                position: top
            series:
              - entity: sensor.0800041935246530_this_year_total_usage
                type: column
                data_generator: |
                  const data = entity.attributes.this_year_by_month || [];
                  return data.map(item => {
                    return [new Date(item.month || item.date).getTime(), parseFloat(item.kwh || item.usage) || 0];
                  });
                extend_to: false
                float_precision: 2
                name: 今年
                color: '#00BCD4'
              - entity: sensor.0800041935246530_last_year_total_usage
                type: column
                data_generator: |
                  const currentYear = new Date().getFullYear();
                  const data = entity.attributes.last_year_by_month || [];
                  return data.map(item => {
                    const date = new Date(item.month || item.date);
                    date.setFullYear(currentYear);
                    return [date.getTime(), parseFloat(item.kwh || item.usage) || 0];
                  });
                extend_to: false
                float_precision: 2
                name: 去年同期
                color: '#FFC107'
            yaxis:
              - decimals: 0
                apex_config:
                  title:
                    text: 用电量 (kWh)
          
          # 去年每月用电详情
          - type: custom:apexcharts-card
            header:
              show: true
              title: 📉 去年每月用电详情
            graph_span: 1y
            span:
              start: year
              offset: '-1y'
            apex_config:
              chart:
                height: 300px
              plotOptions:
                bar:
                  borderRadius: 4
              stroke:
                width:
                  - 0
                  - 3
              tooltip:
                x:
                  format: yyyy年MM月
            series:
              - entity: sensor.0800041935246530_last_year_total_usage
                type: column
                data_generator: |
                  const data = entity.attributes.last_year_by_month || [];
                  return data.map(item => {
                    return [new Date(item.month || item.date).getTime(), parseFloat(item.kwh || item.usage) || 0];
                  });
                extend_to: false
                float_precision: 2
                name: 去年每月电量
                color: '#9C27B0'
                yaxis_id: power
              - entity: sensor.0800041935246530_last_year_total_cost
                type: line
                data_generator: |
                  const data = entity.attributes.last_year_by_month || [];
                  return data.map(item => {
                    return [new Date(item.month || item.date).getTime(), parseFloat(item.cost || item.fee) || 0];
                  });
                extend_to: false
                float_precision: 2
                name: 去年每月电费
                color: '#E91E63'
                yaxis_id: fee
                curve: smooth
            yaxis:
              - id: power
                decimals: 0
                apex_config:
                  title:
                    text: 电量 (kWh)
              - id: fee
                opposite: true
                decimals: 2
                apex_config:
                  title:
                    text: 电费 (元)

🔌 南方电网电力监控完整配置指南

📋 目录

  1. 前置要求
  2. 完整配置文件
  3. 安装步骤
  4. 调试方法
  5. 常见问题

前置要求

必需组件

  • Home Assistant 2023.x 或更高版本
  • 南方电网集成(HACS安装)
  • ApexCharts CardHACS前端安装)

安装必需组件

# 1. HACS → 集成 → 搜索 "南方电网" → 安装
# 2. HACS → 前端 → 搜索 "ApexCharts Card" → 安装
# 3. 重启 Home Assistant

完整配置文件

📝 configuration.yaml

将以下内容添加到 configuration.yaml

template:
  - sensor:
      # ==================== 1. 历史数据拼接(上月+本月) ====================
      - name: "南方电网历史拼接"
        unique_id: csg_history_combined_0800041935246530
        state: "{{ now().strftime('%Y-%m-%d') }}"
        icon: mdi:chart-line
        attributes:
          history_day_value: >
            {% set last_month = state_attr('sensor.0800041935246530_last_month_total_usage', 'last_month_by_day') %}
            {% set this_month = state_attr('sensor.0800041935246530_this_month_total_usage', 'this_month_by_day') %}
            {% set l_m = last_month if last_month is not none else [] %}
            {% set t_m = this_month if this_month is not none else [] %}
            {{ l_m + t_m }}
          total_days: >
            {% set last_month = state_attr('sensor.0800041935246530_last_month_total_usage', 'last_month_by_day') %}
            {% set this_month = state_attr('sensor.0800041935246530_this_month_total_usage', 'this_month_by_day') %}
            {% set l_m = last_month if last_month is not none else [] %}
            {% set t_m = this_month if this_month is not none else [] %}
            {{ (l_m + t_m) | length }}
          last_month_days: >
            {% set last_month = state_attr('sensor.0800041935246530_last_month_total_usage', 'last_month_by_day') %}
            {{ (last_month | length) if last_month else 0 }}
          this_month_days: >
            {% set this_month = state_attr('sensor.0800041935246530_this_month_total_usage', 'this_month_by_day') %}
            {{ (this_month | length) if this_month else 0 }}
          date_range: >
            {% set last_month = state_attr('sensor.0800041935246530_last_month_total_usage', 'last_month_by_day') %}
            {% set this_month = state_attr('sensor.0800041935246530_this_month_total_usage', 'this_month_by_day') %}
            {% set l_m = last_month if last_month is not none else [] %}
            {% set t_m = this_month if this_month is not none else [] %}
            {% set all_data = l_m + t_m %}
            {% if all_data | length > 0 %}
              {{ all_data[0].date }} 至 {{ all_data[-1].date }}
            {% else %}
              无数据
            {% endif %}
          last_update: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"

      # ==================== 2. 年度历史拼接(去年+今年) ====================
      - name: "南方电网年度历史拼接"
        unique_id: csg_yearly_history_combined_0800041935246530
        state: "{{ now().strftime('%Y-%m') }}"
        icon: mdi:calendar-month
        attributes:
          history_month_value: >
            {% set last_year = state_attr('sensor.0800041935246530_last_year_total_usage', 'last_year_by_month') %}
            {% set this_year = state_attr('sensor.0800041935246530_this_year_total_usage', 'this_year_by_month') %}
            {% set l_y = last_year if last_year is not none else [] %}
            {% set t_y = this_year if this_year is not none else [] %}
            {{ l_y + t_y }}
          total_months: >
            {% set last_year = state_attr('sensor.0800041935246530_last_year_total_usage', 'last_year_by_month') %}
            {% set this_year = state_attr('sensor.0800041935246530_this_year_total_usage', 'this_year_by_month') %}
            {% set l_y = last_year if last_year is not none else [] %}
            {% set t_y = this_year if this_year is not none else [] %}
            {{ (l_y + t_y) | length }}
          last_year_months: >
            {% set last_year = state_attr('sensor.0800041935246530_last_year_total_usage', 'last_year_by_month') %}
            {{ (last_year | length) if last_year else 0 }}
          this_year_months: >
            {% set this_year = state_attr('sensor.0800041935246530_this_year_total_usage', 'this_year_by_month') %}
            {{ (this_year | length) if this_year else 0 }}
          last_update: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"

      # ==================== 3. 近30日统计 ====================
      - name: "近30日最高用电"
        unique_id: csg_30d_max_usage_0800041935246530
        unit_of_measurement: "kWh"
        icon: mdi:arrow-up-bold
        state: >
          {% set data = state_attr('sensor.nan_fang_dian_wang_li_shi_pin_jie', 'history_day_value') %}
          {% if data %}
            {% set recent = data[-30:] %}
            {% set max_item = recent | sort(attribute='kwh', reverse=true) | first %}
            {{ max_item.kwh if max_item else 0 }}
          {% else %}
            0
          {% endif %}
        attributes:
          date: >
            {% set data = state_attr('sensor.nan_fang_dian_wang_li_shi_pin_jie', 'history_day_value') %}
            {% if data %}
              {% set recent = data[-30:] %}
              {% set max_item = recent | sort(attribute='kwh', reverse=true) | first %}
              {{ max_item.date if max_item else 'N/A' }}
            {% else %}
              N/A
            {% endif %}
          formatted_date: >
            {% set data = state_attr('sensor.nan_fang_dian_wang_li_shi_pin_jie', 'history_day_value') %}
            {% if data %}
              {% set recent = data[-30:] %}
              {% set max_item = recent | sort(attribute='kwh', reverse=true) | first %}
              {% if max_item %}
                {{ as_timestamp(max_item.date) | timestamp_custom('%m月%d日') }}
              {% else %}
                N/A
              {% endif %}
            {% else %}
              N/A
            {% endif %}
          weekday: >
            {% set data = state_attr('sensor.nan_fang_dian_wang_li_shi_pin_jie', 'history_day_value') %}
            {% if data %}
              {% set recent = data[-30:] %}
              {% set max_item = recent | sort(attribute='kwh', reverse=true) | first %}
              {% if max_item %}
                {% set weekdays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'] %}
                {{ weekdays[as_timestamp(max_item.date) | timestamp_custom('%w') | int] }}
              {% else %}
                N/A
              {% endif %}
            {% else %}
              N/A
            {% endif %}

      - name: "近30日最低用电"
        unique_id: csg_30d_min_usage_0800041935246530
        unit_of_measurement: "kWh"
        icon: mdi:arrow-down-bold
        state: >
          {% set data = state_attr('sensor.nan_fang_dian_wang_li_shi_pin_jie', 'history_day_value') %}
          {% if data %}
            {% set recent = data[-30:] %}
            {% set min_item = recent | sort(attribute='kwh') | first %}
            {{ min_item.kwh if min_item else 0 }}
          {% else %}
            0
          {% endif %}
        attributes:
          date: >
            {% set data = state_attr('sensor.nan_fang_dian_wang_li_shi_pin_jie', 'history_day_value') %}
            {% if data %}
              {% set recent = data[-30:] %}
              {% set min_item = recent | sort(attribute='kwh') | first %}
              {{ min_item.date if min_item else 'N/A' }}
            {% else %}
              N/A
            {% endif %}
          formatted_date: >
            {% set data = state_attr('sensor.nan_fang_dian_wang_li_shi_pin_jie', 'history_day_value') %}
            {% if data %}
              {% set recent = data[-30:] %}
              {% set min_item = recent | sort(attribute='kwh') | first %}
              {% if min_item %}
                {{ as_timestamp(min_item.date) | timestamp_custom('%m月%d日') }}
              {% else %}
                N/A
              {% endif %}
            {% else %}
              N/A
            {% endif %}
          weekday: >
            {% set data = state_attr('sensor.nan_fang_dian_wang_li_shi_pin_jie', 'history_day_value') %}
            {% if data %}
              {% set recent = data[-30:] %}
              {% set min_item = recent | sort(attribute='kwh') | first %}
              {% if min_item %}
                {% set weekdays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'] %}
                {{ weekdays[as_timestamp(min_item.date) | timestamp_custom('%w') | int] }}
              {% else %}
                N/A
              {% endif %}
            {% else %}
              N/A
            {% endif %}

      - name: "近30日平均用电"
        unique_id: csg_30d_avg_usage_0800041935246530
        unit_of_measurement: "kWh"
        icon: mdi:chart-bell-curve
        state: >
          {% set data = state_attr('sensor.nan_fang_dian_wang_li_shi_pin_jie', 'history_day_value') %}
          {% if data %}
            {% set recent = data[-30:] %}
            {% set total = recent | map(attribute='kwh') | map('float') | sum %}
            {{ (total / recent | length) | round(2) if recent | length > 0 else 0 }}
          {% else %}
            0
          {% endif %}
        attributes:
          total_usage: >
            {% set data = state_attr('sensor.nan_fang_dian_wang_li_shi_pin_jie', 'history_day_value') %}
            {% if data %}
              {% set recent = data[-30:] %}
              {{ (recent | map(attribute='kwh') | map('float') | sum) | round(2) }}
            {% else %}
              0
            {% endif %}
          days_count: >
            {% set data = state_attr('sensor.nan_fang_dian_wang_li_shi_pin_jie', 'history_day_value') %}
            {{ data[-30:] | length if data else 0 }}

      # ==================== 4. 近7日统计 ====================
      - name: "近7日最高用电"
        unique_id: csg_7d_max_usage_0800041935246530
        unit_of_measurement: "kWh"
        icon: mdi:arrow-up-bold
        state: >
          {% set data = state_attr('sensor.nan_fang_dian_wang_li_shi_pin_jie', 'history_day_value') %}
          {% if data %}
            {% set recent = data[-7:] %}
            {% set max_item = recent | sort(attribute='kwh', reverse=true) | first %}
            {{ max_item.kwh if max_item else 0 }}
          {% else %}
            0
          {% endif %}

      - name: "近7日最低用电"
        unique_id: csg_7d_min_usage_0800041935246530
        unit_of_measurement: "kWh"
        icon: mdi:arrow-down-bold
        state: >
          {% set data = state_attr('sensor.nan_fang_dian_wang_li_shi_pin_jie', 'history_day_value') %}
          {% if data %}
            {% set recent = data[-7:] %}
            {% set min_item = recent | sort(attribute='kwh') | first %}
            {{ min_item.kwh if min_item else 0 }}
          {% else %}
            0
          {% endif %}

      - name: "近7日平均用电"
        unique_id: csg_7d_avg_usage_0800041935246530
        unit_of_measurement: "kWh"
        icon: mdi:chart-bell-curve
        state: >
          {% set data = state_attr('sensor.nan_fang_dian_wang_li_shi_pin_jie', 'history_day_value') %}
          {% if data %}
            {% set recent = data[-7:] %}
            {% set total = recent | map(attribute='kwh') | map('float') | sum %}
            {{ (total / recent | length) | round(2) if recent | length > 0 else 0 }}
          {% else %}
            0
          {% endif %}
        attributes:
          total_usage: >
            {% set data = state_attr('sensor.nan_fang_dian_wang_li_shi_pin_jie', 'history_day_value') %}
            {% if data %}
              {% set recent = data[-7:] %}
              {{ (recent | map(attribute='kwh') | map('float') | sum) | round(2) }}
            {% else %}
              0
            {% endif %}
          days_count: >
            {% set data = state_attr('sensor.nan_fang_dian_wang_li_shi_pin_jie', 'history_day_value') %}
            {{ data[-7:] | length if data else 0 }}

      # ==================== 5. 工作日vs周末 ====================
      - name: "工作日平均用电"
        unique_id: csg_weekday_avg_usage_0800041935246530
        unit_of_measurement: "kWh"
        icon: mdi:briefcase
        state: >
          {% set data = state_attr('sensor.nan_fang_dian_wang_li_shi_pin_jie', 'history_day_value') %}
          {% if data %}
            {% set recent = data[-30:] %}
            {% set weekday_data = [] %}
            {% for item in recent %}
              {% set day_of_week = as_timestamp(item.date) | timestamp_custom('%w') | int %}
              {% if day_of_week >= 1 and day_of_week <= 5 %}
                {% set weekday_data = weekday_data + [item.kwh | float] %}
              {% endif %}
            {% endfor %}
            {{ (weekday_data | sum / weekday_data | length) | round(2) if weekday_data | length > 0 else 0 }}
          {% else %}
            0
          {% endif %}
        attributes:
          days_count: >
            {% set data = state_attr('sensor.nan_fang_dian_wang_li_shi_pin_jie', 'history_day_value') %}
            {% if data %}
              {% set recent = data[-30:] %}
              {% set count = 0 %}
              {% for item in recent %}
                {% set day_of_week = as_timestamp(item.date) | timestamp_custom('%w') | int %}
                {% if day_of_week >= 1 and day_of_week <= 5 %}
                  {% set count = count + 1 %}
                {% endif %}
              {% endfor %}
              {{ count }}
            {% else %}
              0
            {% endif %}

      - name: "周末平均用电"
        unique_id: csg_weekend_avg_usage_0800041935246530
        unit_of_measurement: "kWh"
        icon: mdi:home
        state: >
          {% set data = state_attr('sensor.nan_fang_dian_wang_li_shi_pin_jie', 'history_day_value') %}
          {% if data %}
            {% set recent = data[-30:] %}
            {% set weekend_data = [] %}
            {% for item in recent %}
              {% set day_of_week = as_timestamp(item.date) | timestamp_custom('%w') | int %}
              {% if day_of_week == 0 or day_of_week == 6 %}
                {% set weekend_data = weekend_data + [item.kwh | float] %}
              {% endif %}
            {% endfor %}
            {{ (weekend_data | sum / weekend_data | length) | round(2) if weekend_data | length > 0 else 0 }}
          {% else %}
            0
          {% endif %}
        attributes:
          days_count: >
            {% set data = state_attr('sensor.nan_fang_dian_wang_li_shi_pin_jie', 'history_day_value') %}
            {% if data %}
              {% set recent = data[-30:] %}
              {% set count = 0 %}
              {% for item in recent %}
                {% set day_of_week = as_timestamp(item.date) | timestamp_custom('%w') | int %}
                {% if day_of_week == 0 or day_of_week == 6 %}
                  {% set count = count + 1 %}
                {% endif %}
              {% endfor %}
              {{ count }}
            {% else %}
              0
            {% endif %}

      # ==================== 6. 预测与对比 ====================
      - name: "预计本月用电"
        unique_id: csg_predicted_month_usage_0800041935246530
        unit_of_measurement: "kWh"
        icon: mdi:crystal-ball
        state: >
          {% set current_usage = states('sensor.0800041935246530_this_month_total_usage') | float(0) %}
          {% set today = now().day %}
          {% set days_in_month = (now().replace(day=1) + timedelta(days=32)).replace(day=1) - timedelta(days=1) %}
          {% set total_days = days_in_month.day %}
          {% if today > 0 %}
            {{ ((current_usage / today) * total_days) | round(2) }}
          {% else %}
            0
          {% endif %}

      - name: "预计本月电费"
        unique_id: csg_predicted_month_cost_0800041935246530
        unit_of_measurement: "元"
        icon: mdi:calculator
        state: >
          {% set current_cost = states('sensor.0800041935246530_this_month_total_cost') | float(0) %}
          {% set today = now().day %}
          {% set days_in_month = (now().replace(day=1) + timedelta(days=32)).replace(day=1) - timedelta(days=1) %}
          {% set total_days = days_in_month.day %}
          {% if today > 0 %}
            {{ ((current_cost / today) * total_days) | round(2) }}
          {% else %}
            0
          {% endif %}

      - name: "环比上月用电变动"
        unique_id: csg_mom_usage_change_0800041935246530
        unit_of_measurement: "%"
        icon: mdi:trending-up
        state: >
          {% set this_month = states('sensor.0800041935246530_this_month_total_usage') | float(0) %}
          {% set last_month = states('sensor.0800041935246530_last_month_total_usage') | float(0) %}
          {% if last_month > 0 %}
            {{ (((this_month - last_month) / last_month) * 100) | round(2) }}
          {% else %}
            0
          {% endif %}
        attributes:
          trend: >
            {% set this_month = states('sensor.0800041935246530_this_month_total_usage') | float(0) %}
            {% set last_month = states('sensor.0800041935246530_last_month_total_usage') | float(0) %}
            {% if this_month > last_month %}
              上升
            {% elif this_month < last_month %}
              下降
            {% else %}
              持平
            {% endif %}

      - name: "同比去年用电变动"
        unique_id: csg_yoy_usage_change_0800041935246530
        unit_of_measurement: "%"
        icon: mdi:calendar-compare
        state: >
          {% set this_year = states('sensor.0800041935246530_this_year_total_usage') | float(0) %}
          {% set last_year = states('sensor.0800041935246530_last_year_total_usage') | float(0) %}
          {% if last_year > 0 %}
            {{ (((this_year - last_year) / last_year) * 100) | round(2) }}
          {% else %}
            0
          {% endif %}
        attributes:
          trend: >
            {% set this_year = states('sensor.0800041935246530_this_year_total_usage') | float(0) %}
            {% set last_year = states('sensor.0800041935246530_last_year_total_usage') | float(0) %}
            {% if this_year > last_year %}
              上升
            {% elif this_year < last_year %}
              下降
            {% else %}
              持平
            {% endif %}

      # ==================== 7. 预算管理 ====================
      - name: "本月电费剩余预算"
        unique_id: csg_budget_remaining_0800041935246530
        unit_of_measurement: "元"
        icon: mdi:cash-multiple
        state: >
          {% set budget = 200 %}
          {% set current_cost = states('sensor.0800041935246530_this_month_total_cost') | float(0) %}
          {{ (budget - current_cost) | round(2) }}
        attributes:
          budget: 200
          used: >
            {{ states('sensor.0800041935246530_this_month_total_cost') | float(0) | round(2) }}
          budget_usage_percent: >
            {% set budget = 200 %}
            {% set current_cost = states('sensor.0800041935246530_this_month_total_cost') | float(0) %}
            {{ ((current_cost / budget) * 100) | round(2) if budget > 0 else 0 }}
          status: >
            {% set budget = 200 %}
            {% set current_cost = states('sensor.0800041935246530_this_month_total_cost') | float(0) %}
            {% set percent = (current_cost / budget) * 100 if budget > 0 else 0 %}
            {% if percent < 50 %}
              ✅ 预算充足
            {% elif percent < 80 %}
              ⚠️ 预算适中
            {% elif percent < 100 %}
              🔶 预算紧张
            {% else %}
              🚨 超出预算
            {% endif %}

📊 仪表板配置(dashboard.yaml

创建新仪表板或添加到现有仪表板:

views:
  - title: 电力监控
    path: power-monitor
    icon: mdi:flash
    badges:
      - entity: sensor.0800041935246530_balance
      - entity: sensor.yu_ji_ben_yue_dian_fei
      - entity: sensor.jin_30_ri_ping_jun_yong_dian
    cards:
      # ========== 顶部仪表 ==========
      - type: grid
        columns: 2
        cards:
          - type: gauge
            entity: sensor.0800041935246530_yesterday_kwh
            name: 昨日用电
            min: 0
            max: 50
            needle: true
            segments:
              - from: 0
                color: green
              - from: 30
                color: yellow
              - from: 40
                color: red
          
          - type: gauge
            entity: sensor.0800041935246530_this_month_total_usage
            name: 当月电量
            min: 0
            max: 1000
            needle: true
            segments:
              - from: 0
                color: green
              - from: 600
                color: yellow
              - from: 800
                color: red
      
      # ========== 关键数据 ==========
      - type: grid
        columns: 3
        cards:
          - type: sensor
            entity: sensor.0800041935246530_balance
            name: 账户余额
            icon: mdi:wallet
          - type: sensor
            entity: sensor.0800041935246530_arrears
            name: 欠缴电费
            icon: mdi:alert-circle
          - type: sensor
            entity: sensor.yu_ji_ben_yue_dian_fei
            name: 预计本月
            icon: mdi:calculator
      
      # ========== 预测对比 ==========
      - type: grid
        columns: 3
        cards:
          - type: sensor
            entity: sensor.yu_ji_ben_yue_yong_dian
            name: 预计用电
          - type: sensor
            entity: sensor.huan_bi_shang_yue_yong_dian_bian_dong
            name: 环比上月
          - type: sensor
            entity: sensor.tong_bi_qu_nian_yong_dian_bian_dong
            name: 同比去年
      
      # ========== 预算状态 ==========
      - type: markdown
        content: |
          ## 💰 本月预算
          **剩余:**{{ states('sensor.ben_yue_dian_fei_sheng_yu_yu_suan') }} 元
          **使用率:**{{ state_attr('sensor.ben_yue_dian_fei_sheng_yu_yu_suan', 'budget_usage_percent') }}%
          **状态:**{{ state_attr('sensor.ben_yue_dian_fei_sheng_yu_yu_suan', 'status') }}
      
      # ========== 阶梯电价 ==========
      - type: grid
        columns: 3
        cards:
          - type: sensor
            entity: sensor.0800041935246530_current_ladder
            name: 阶梯档位
          - type: sensor
            entity: sensor.0800041935246530_current_ladder_remaining_kwh
            name: 阶梯剩余
          - type: sensor
            entity: sensor.0800041935246530_current_ladder_tariff
            name: 当前电价
      
      # ========== 本月/上月 ==========
      - type: grid
        columns: 2
        cards:
          - type: sensor
            entity: sensor.0800041935246530_this_month_total_usage
            name: 本月用电
          - type: sensor
            entity: sensor.0800041935246530_this_month_total_cost
            name: 本月电费
      
      - type: grid
        columns: 2
        cards:
          - type: sensor
            entity: sensor.0800041935246530_last_month_total_usage
            name: 上月用电
          - type: sensor
            entity: sensor.0800041935246530_last_month_total_cost
            name: 上月电费
      
      # ========== 30日统计 ==========
      - type: grid
        columns: 3
        cards:
          - type: sensor
            entity: sensor.jin_30_ri_zui_gao_yong_dian
            name: 30日最高
          - type: sensor
            entity: sensor.jin_30_ri_zui_di_yong_dian
            name: 30日最低
          - type: sensor
            entity: sensor.jin_30_ri_ping_jun_yong_dian
            name: 30日平均
      
      # ========== 工作日vs周末 ==========
      - type: grid
        columns: 2
        cards:
          - type: sensor
            entity: sensor.gong_zuo_ri_ping_jun_yong_dian
            name: 工作日平均
          - type: sensor
            entity: sensor.zhou_mo_ping_jun_yong_dian
            name: 周末平均
      
      # ========== 近30日趋势图 ==========
      - type: custom:apexcharts-card
        header:
          show: true
          title: 📊 近30日用电趋势
        graph_span: 30d
        series:
          - entity: sensor.nan_fang_dian_wang_li_shi_pin_jie
            type: area
            name: 日用电量
            color: purple
            data_generator: |
              const data = entity.attributes.history_day_value || [];
              return data.slice(-30).map(item => {
                return [new Date(item.date).getTime(), parseFloat(item.kwh) || 0];
              });
      
      # ========== 近7日柱状图 ==========
      - type: custom:apexcharts-card
        header:
          show: true
          title: 📅 近7日用电详情
        graph_span: 7d
        apex_config:
          chart:
            type: bar
        series:
          - entity: sensor.nan_fang_dian_wang_li_shi_pin_jie
            type: column
            name: 日用电量
            color: blue
            data_generator: |
              const data = entity.attributes.history_day_value || [];
              return data.slice(-7).map(item => {
                return [new Date(item.date).getTime(), parseFloat(item.kwh) || 0];
              });
      
      # ========== 当月每日详情 ==========
      - type: custom:apexcharts-card
        header:
          show: true
          title: 📅 当月每日用电
        span:
          start: month
        series:
          - entity: sensor.0800041935246530_this_month_total_usage
            type: column
            name: 每日电量
            data_generator: |
              const data = entity.attributes.this_month_by_day || [];
              return data.map(item => {
                return [new Date(item.date).getTime(), parseFloat(item.kwh) || 0];
              });
      
      # ========== 今年月度趋势 ==========
      - type: custom:apexcharts-card
        header:
          show: true
          title: 📈 今年每月用电
        span:
          start: year
        series:
          - entity: sensor.0800041935246530_this_year_total_usage
            type: column
            name: 每月电量
            data_generator: |
              const data = entity.attributes.this_year_by_month || [];
              return data.map(item => {
                return [new Date(item.month || item.date).getTime(), parseFloat(item.kwh || item.usage) || 0];
              });
      
      # ========== 今年vs去年 ==========
      - type: custom:apexcharts-card
        header:
          show: true
          title: 🔄 今年 vs 去年
        span:
          start: year
        series:
          - entity: sensor.0800041935246530_this_year_total_usage
            type: column
            name: 今年
            data_generator: |
              const data = entity.attributes.this_year_by_month || [];
              return data.map(item => {
                return [new Date(item.month || item.date).getTime(), parseFloat(item.kwh || item.usage) || 0];
              });
          - entity: sensor.0800041935246530_last_year_total_usage
            type: column
            name: 去年
            data_generator: |
              const year = new Date().getFullYear();
              const data = entity.attributes.last_year_by_month || [];
              return data.map(item => {
                const date = new Date(item.month || item.date);
                date.setFullYear(year);
                return [date.getTime(), parseFloat(item.kwh || item.usage) || 0];
              });

安装步骤

1️⃣ 安装依赖

# HACS → 集成 → 南方电网
# HACS → 前端 → ApexCharts Card
# 重启 Home Assistant

2️⃣ 配置传感器

1. 编辑 configuration.yaml
2. 添加上面的传感器配置
3. 开发者工具 → YAML → 检查配置
4. 重启 Home Assistant
5. 等待 3-5 分钟传感器初始化

3️⃣ 创建仪表板

1. 设置 → 仪表板 → 添加仪表板
2. 名称:电力监控
3. 编辑仪表板 → 原始配置编辑器
4. 粘贴仪表板配置
5. 保存

调试方法

🔍 检查传感器状态

# 开发者工具 → 模板
{{ states('sensor.nan_fang_dian_wang_li_shi_pin_jie') }}
{{ state_attr('sensor.nan_fang_dian_wang_li_shi_pin_jie', 'history_day_value') | length }}

🔍 查看所有传感器

# 开发者工具 → 状态
# 搜索:nan_fang 或 jin_30 或 gong_zuo

🔍 检查数据结构

# 开发者工具 → 模板
{{ state_attr('sensor.nan_fang_dian_wang_li_shi_pin_jie', 'history_day_value')[:3] }}

🔍 验证图表数据

// 浏览器控制台(F12
console.log(entity.attributes.history_day_value);

常见问题

传感器显示 unknown

**原因:**南方电网集成未配置或数据未加载
解决:

1. 检查南方电网集成是否正常
2. 等待数据更新(可能需要24小时)
3. 手动触发更新:开发者工具 → 服务 → homeassistant.update_entity

图表不显示

**原因:**ApexCharts Card 未安装
解决:

1. HACS → 前端 → ApexCharts Card → 安装
2. 清除浏览器缓存(Ctrl+F5
3. 重启 Home Assistant

实体ID不匹配

**原因:**您的户号与示例不同
解决:

1. 开发者工具 → 状态 → 搜索 "0800041935246530"
2. 找到您的实际户号
3. 全局替换配置中的户号

配置检查失败

**原因:**YAML 语法错误
解决:

1. 检查缩进(使用2个空格,不是Tab)
2. 检查引号配对
3. 使用在线YAML验证器检查

📌 重要提示

  1. **户号替换:**将所有 0800041935246530 替换为您的实际户号
  2. **预算调整:**修改 budget: 200 为您的实际预算
  3. **数据延迟:**南方电网数据通常延迟1-2天
  4. **定期更新:**建议每月检查一次配置

🎯 功能清单

实时余额与欠费
本月/上月用电统计
今年/去年对比
阶梯电价监控
30日/7日趋势分析
工作日vs周末对比
预算管理与预警
环比/同比变动
多维度图表展示


配置完成后,您将拥有一个功能完整、美观实用的电力监控仪表板! 🎉