如何用MySQL计算OpenHAB持久化表中灯具的总能耗?
计算OpenHAB持久化表中灯具总能耗的方法
核心逻辑
能耗的本质是功率 × 时长,这里的关键规则是:每条记录的功率从当前时间生效,持续到下一条记录的时间点。只需要为每条功率值匹配对应的持续时长,累加所有时段的能耗即可。
具体操作步骤
1. 计算相邻记录的时间差
确保数据按时间顺序排列(你的数据已经是有序的),对每一条记录(除最后一条),计算它和下一条记录的时间间隔(单位:秒)。比如:
- 第一条记录
2022-10-08 21:48:08(功率0W)到下一条2022-10-08 21:56:52,时间差是524秒 - 第二条记录
2022-10-08 21:56:52(13.48W)到下一条2022-10-08 21:56:57,时间差是5秒
2. 单时段能耗计算
用当前记录的功率乘以时间差,得到该时段的能耗(单位:瓦秒,Ws)。比如:
- 第一条时段能耗:
0W × 524s = 0 Ws - 第二条时段能耗:
13.48W ×5s = 67.4 Ws
3. 累加并转换单位
把所有时段的能耗相加得到总瓦秒,再转换成常用单位:
- 1瓦时(Wh)= 3600瓦秒(Ws),总Wh = 总Ws ÷ 3600
- 1千瓦时(kWh)= 1000瓦时(Wh),总kWh = 总Wh ÷ 1000
批量处理代码示例(Python)
如果数据量较大,可以用代码自动计算:
from datetime import datetime # 替换成你的持久化数据 data = [ ("2022-10-08 21:48:08", 0), ("2022-10-08 21:56:52", 13.48), ("2022-10-08 21:56:57", 13.63), ("2022-10-08 21:57:06", 13.68), ("2022-10-08 21:57:09", 13.63), ("2022-10-08 21:57:22", 13.68), ("2022-10-08 21:57:39", 13.73), ("2022-10-08 21:57:52", 13.68), ("2022-10-08 21:57:54", 13.73), ("2022-10-08 21:58:06", 13.78), ("2022-10-08 21:58:09", 13.73), ("2022-10-08 21:58:22", 13.78), ("2022-10-08 21:58:37", 13.73), ("2022-10-08 21:58:39", 13.78), ("2022-10-08 21:58:54", 13.83), ("2022-10-08 21:59:06", 13.78), ("2022-10-08 21:59:22", 13.73), ("2022-10-08 21:59:24", 13.78), ("2022-10-08 22:00:11", 13.73), ] total_ws = 0 # 遍历计算每段的能耗 for i in range(len(data) - 1): current_time = datetime.strptime(data[i][0], "%Y-%m-%d %H:%M:%S") next_time = datetime.strptime(data[i+1][0], "%Y-%m-%d %H:%M:%S") duration = (next_time - current_time).total_seconds() total_ws += data[i][1] * duration # 转换为常用单位 total_wh = total_ws / 3600 total_kwh = total_wh / 1000 print(f"总能耗(瓦秒):{total_ws:.2f} Ws") print(f"总能耗(瓦时):{total_wh:.4f} Wh") print(f"总能耗(千瓦时):{total_kwh:.6f} kWh")
注意点
- 最后一条记录如果没有后续数据,需要手动指定结束时间(比如当前时间)来计算它的持续时长,否则这段能耗会被遗漏
- 必须确保数据按时间顺序排列,无序的话要先做排序处理
内容的提问来源于stack exchange,提问作者Patric
相关产品推荐
相关产品推荐

