找回密码
 立即注册
查看: 60|回复: 0

[UI界面] 分享一个国家电网的卡片(峰谷电电费计算)

[复制链接]

2

主题

7

回帖

49

积分

新手上路

积分
49
金钱
40
HASS币
0
发表于 2025-5-25 13:27:03 | 显示全部楼层 |阅读模式
本帖最后由 yantao 于 2025-5-26 20:54 编辑

Github:
我目前用的是这个,利用青龙,用起来目前效果还算不错
案例展示:

                               
登录/注册后可看大图

type: custom:apexcharts-card
header:
  show: true
  title: 最近7天用电量折线柱状图
graph_span: 8d
span:
  end: day
series:
  - entity: sensor.dian_fei_yu_e
    name: 用电量 (度)
    unit: 度
    type: line
    float_precision: 2
    show:
      datalabels: true
      legend_value: true
    data_generator: |
      const dayList = entity.attributes.dayList || [];
      if (!Array.isArray(dayList) || dayList.length === 0) {
        return [];
      }
      const yesterday = new Date();
      yesterday.setDate(yesterday.getDate() - 1);
      const yStr = yesterday.toISOString().slice(0,10);
      const filtered = dayList.filter(d => d.day <= yStr);
      const last7 = filtered.slice(0,7).reverse();
      return last7.map(item => [item.day, parseFloat(item.dayElePq) || 0]);
  - entity: sensor.dian_fei_yu_e
    name: 峰电 (度)
    unit: 度
    type: column
    float_precision: 2
    show:
      datalabels: false
      legend_value: true
    data_generator: |
      const dayList = entity.attributes.dayList || [];
      if (!Array.isArray(dayList) || dayList.length === 0) {
        return [];
      }
      const yesterday = new Date();
      yesterday.setDate(yesterday.getDate() - 1);
      const yStr = yesterday.toISOString().slice(0,10);
      const filtered = dayList.filter(d => d.day <= yStr);
      const last7 = filtered.slice(0,7).reverse();
      return last7.map(item => [item.day, parseFloat(item.thisPPq) || 0]);
  - entity: sensor.dian_fei_yu_e
    name: 谷电 (度)
    unit: 度
    type: column
    float_precision: 2
    show:
      datalabels: false
      legend_value: true
    data_generator: |
      const dayList = entity.attributes.dayList || [];
      if (!Array.isArray(dayList) || dayList.length === 0) {
        return [];
      }
      const yesterday = new Date();
      yesterday.setDate(yesterday.getDate() - 1);
      const yStr = yesterday.toISOString().slice(0,10);
      const filtered = dayList.filter(d => d.day <= yStr);
      const last7 = filtered.slice(0,7).reverse();
      return last7.map(item => [item.day, parseFloat(item.thisVPq) || 0]);
apex_config:
  chart:
    stacked: false
  xaxis:
    type: datetime
    labels:
      rotate: -45
      style:
        fontSize: 12px
  stroke:
    curve: smooth
    width: 3
  markers:
    size: 6
    colors:
      - "#FFA500"
    strokeWidth: 2
  tooltip:
    shared: true
    followCursor: true
  dataLabels:
    enabled: true
    offsetY: -10
    style:
      colors:
        - "#000"
yaxis:
  - min: 0


                               
登录/注册后可看大图

type: custom:apexcharts-card
header:
  show: true
  title: 最近7天峰谷电和阶梯电费金额折线图
graph_span: 8d
span:
  end: day
series:
  - entity: sensor.dian_fei_yu_e
    name: 峰电金额 (元)
    unit: 元
    type: line
    float_precision: 2
    show:
      datalabels: true
      legend_value: true
    data_generator: |
      const dayList = entity.attributes.dayList || [];
      if (!Array.isArray(dayList) || dayList.length === 0) return [];

      // 阶梯峰电价区间
      const peakTier1 = 0.568;
      const peakTier2 = 0.618;
      const peakTier3 = 0.868;

      const yesterday = new Date();
      yesterday.setDate(yesterday.getDate() - 1);
      const yStr = yesterday.toISOString().slice(0,10);
      const filtered = dayList.filter(d => d.day <= yStr);
      const last7 = filtered.slice(0, 7).reverse();

      let cumulative = 0;
      return last7.map(item => {
        const peakEle = parseFloat(item.thisPPq) || 0;
        cumulative += peakEle;

        let price = 0;
        if (cumulative <= 2760) {
          price = peakTier1;
        } else if (cumulative <= 4800) {
          price = peakTier2;
        } else {
          price = peakTier3;
        }
        return [item.day, +(peakEle * price).toFixed(2)];
      });
  - entity: sensor.dian_fei_yu_e
    name: 谷电金额 (元)
    unit: 元
    type: line
    float_precision: 2
    show:
      datalabels: true
      legend_value: true
    data_generator: |
      const dayList = entity.attributes.dayList || [];
      if (!Array.isArray(dayList) || dayList.length === 0) return [];

      // 阶梯谷电价区间
      const valleyTier1 = 0.288;
      const valleyTier2 = 0.338;
      const valleyTier3 = 0.588;

      const yesterday = new Date();
      yesterday.setDate(yesterday.getDate() - 1);
      const yStr = yesterday.toISOString().slice(0,10);
      const filtered = dayList.filter(d => d.day <= yStr);
      const last7 = filtered.slice(0, 7).reverse();

      let cumulative = 0;
      return last7.map(item => {
        const valleyEle = parseFloat(item.thisVPq) || 0;
        cumulative += valleyEle;

        let price = 0;
        if (cumulative <= 2760) {
          price = valleyTier1;
        } else if (cumulative <= 4800) {
          price = valleyTier2;
        } else {
          price = valleyTier3;
        }
        return [item.day, +(valleyEle * price).toFixed(2)];
      });
  - entity: sensor.dian_fei_yu_e
    name: 阶梯电金额 (元)
    unit: 元
    type: line
    float_precision: 2
    show:
      datalabels: true
      legend_value: true
    data_generator: |
      const dayList = entity.attributes.dayList || [];
      if (!Array.isArray(dayList) || dayList.length === 0) return [];

      const tier1Price = 0.538;
      const tier2Price = 0.588;
      const tier3Price = 0.838;

      const yesterday = new Date();
      yesterday.setDate(yesterday.getDate() - 1);
      const yStr = yesterday.toISOString().slice(0,10);
      const filtered = dayList.filter(d => d.day <= yStr);
      const last7 = filtered.slice(0, 7).reverse();

      let cumulative = 0;
      return last7.map(item => {
        const dayEle = parseFloat(item.dayElePq) || 0;
        cumulative += dayEle;

        let fee = 0;
        if (cumulative <= 2760) {
          fee = dayEle * tier1Price;
        } else if (cumulative <= 4800) {
          const remain1 = 2760 - (cumulative - dayEle);
          const tier1Part = remain1 > 0 ? remain1 : 0;
          const tier2Part = dayEle - tier1Part;
          fee = tier1Part * tier1Price + tier2Part * tier2Price;
        } else {
          const remain1 = 2760 - (cumulative - dayEle);
          const tier1Part = remain1 > 0 ? remain1 : 0;

          const remain2 = 4800 - (cumulative - dayEle) - tier1Part;
          const tier2Part = remain2 > 0 ? remain2 : 0;

          const tier3Part = dayEle - tier1Part - tier2Part;
          fee = tier1Part * tier1Price + tier2Part * tier2Price + tier3Part * tier3Price;
        }
        return [item.day, +fee.toFixed(2)];
      });
apex_config:
  xaxis:
    type: datetime
    labels:
      rotate: -45
      style:
        fontSize: 12px
  stroke:
    curve: smooth
    width: 3
  markers:
    size: 6
    colors:
      - "#FF4500"
      - "#1E90FF"
      - "#228B22"
    strokeWidth: 2
  tooltip:
    shared: true
    followCursor: true
  dataLabels:
    enabled: true
    offsetY: -10
    style:
      colors:
        - "#FF4500"
        - "#1E90FF"
        - "#228B22"
yaxis:
  - min: 0


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian ( 晋ICP备17001384号-1 )

GMT+8, 2025-6-16 05:44 , Processed in 0.461571 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表