累计电表先按同一仪表、寄存器和连续计数段还原区间增量,再决定能否分配到业务日。读数下降不能一律归零或取绝对值,跨日缺测也不能凭两端读数恢复每天的真实用电。本篇讨论内部经营与能耗分析的数据处理;结算计量、法定检定和电气保护另有要求,不能用这里的分析规则替代。
输入必须说明读数是什么、何时有效
首先区分功率与电量。kW 是功率,kWh 是累计能量单位;只有功率随时间的有效积分才得到电量。累计寄存器相邻值作差与对瞬时功率做积分是两条不同路径,不能把功率样本当累计值求差,也不能把累计值逐行相加当总能耗。还应区分正向有功、反向有功和净电量,双向净值下降未必是设备清零。
OpenEnergyMonitor 的日用电文档分别处理功率输入、不随掉电清零的电量输入,以及重启清零的累计输入。[1] 这是其设备和软件的处理说明,不能证明任意现场仪表都具有相同保留行为。接入前读取具体型号的寄存器定义、倍率、单位、清零及回绕说明;没有这些资料时,下降记录应待核查,不猜设备机制。
每条原始记录至少保留测点、物理仪表标识、寄存器、事件时间、接收时间、原读数、单位、倍率配置版本、质量码、来源序号和原始批次。测点表示被计量的位置,仪表表示实际设备,两者在换表时不能混用。事件时间用于安排计量先后,接收时间用于解释补传和当时数据可见性;收到得晚不代表消耗发生得晚。
另建连续计数段标识 epoch_id,表示同一累积基线下的一段读数;可信清零或换表后建立新段。记录新段起点、初值、旧段终值和对应维护证据。这个字段是本文建议的数据模型,不假定设备原生提供;证据不全时可以先分段并保留未知交界,不能为了凑齐字段而编造零点。
OpenTelemetry 的稳定 Temporality 说明区分累计与增量时间语义,并用起始时间帮助解释连续序列。[2] 这可作为数据契约的参考,但它不是电表协议;同页 Resets and Gaps 部分仍标记 Development。实施者应固定自身采集版本和字段含义,不能把遥测约定直接写成现场设备已满足的保证。
从两天原始读数算出可复核的区间账本
假设一家企业记录测点 P1 的正向累计电量,仪表 M1、寄存器 R1,单位为已经换算后的 kWh,倍率为1,时区 Asia/Shanghai。第一计数段 E1 的读数依次为:11月10日00:00为1000,06:00为1030,18:00为1090,11月11日06:00为1150,12:00为1180。开始时缺少11月11日00:00的记录。所有给定读数质量正常,期间没有未登记清零或倍率变化。
维护记录确认11月11日12:00先读取 E1 终值1180,再清零并读取新段 E2 初值0,两个动作顺序明确且此例假设切换不产生计量空隙。E2 的18:00读数为24,11月12日00:00为48。两条12:00记录属于不同段,不能靠任意排序把1180与0当同一段的普通相邻点。
E1 四个区间的电量依次为1030减1000等于30、1090减1030等于60、1150减1090等于60、1180减1150等于30,共180 kWh。E2 两个区间为24减0等于24、48减24等于24,共48。两天总量因此为228 kWh。直接用全局末值48减首值1000得到负952,没有业务意义。
区间账本逐项保存左、右事件时间,两端原记录标识、仪表及计数段、增量、质量状态和计算版本。例如跨日一项为11月10日18:00至11月11日06:00、1090至1150、60 kWh、总量已确认但日归属待确定。这里只知道十二小时合计60,不知道每小时都用5,也不知道两天各用了30。
使用边界应统一约定,例如增量归于相邻观测之间的时间段,日汇总覆盖本地00:00至次日00:00。边界瞬间的表示不能导致相邻区间重复贡献。若没有可信午夜读数或其他日界证据,结果可保留跨日区间,不应把其60全部记到接收记录的11月11日。区间完整与每日完整是两项不同验收。
缺一个午夜读数,会改变日分配而不改变两天总量
若业务只需两天合计,228已有本例所需的连续性证据;若要比较每天单位产量能耗,则必须先处理跨日60的归属。可以等待仪表补传真实日界读数,也可以在业务明确允许时生成估计视图,但不能把两种结果标成同等证据。日指标所用产量也要采用相同日界和修订截止。
假设暂用线性分配:跨日十二小时均分,午夜两侧各六小时,因此60各分30。11月10日估计电量为30加60加30等于120;11月11日估计为30加30加24加24等于108;合计仍为228。这只表达均匀负载假设,不是从累计值推导出的真实日曲线。
随后补传的真实11月11日00:00读数为1130。原跨日区间应被两段替换:1130减1090等于40,1150减1130等于20。11月10日修订为30加60加40等于130;11月11日修订为20加30加24加24等于98,总量仍为228。只校验两天总和会漏掉原来每天各10 kWh的分配差异。
OpenEnergyMonitor 的 Join 处理会跨缺口连直线。[1] Prometheus 的 increase 会调整计数下降并对所选时间范围作外推。[3] 这些行为有各自用途,却不能凭函数返回值就宣称恢复了真实午夜读数。本文建议将实际区间量、估计日量、估计方法和未确认跨度分别存放,展示与导出都保留状态。
已有的工业传感器重采样与缺失处理方法解释了插值为何不等于观测。本例进一步要求电量守恒:估计分配各段之和等于可信跨段总量,同时保留它不是日度真值的限制。若不同方法分别估计日量、班次量和小时量,应检查层级汇总能否对齐,不能让三个看板各自生成互相矛盾的分配。
补传后产生新的结果版本,记录原120/108、修订130/98、来源记录及修订时间。已发布分析引用的旧版本需要能够找回;是否更新经营结论由使用方决定。数据管道负责交付修订差异,不能静默替换历史后声称当时就掌握了真实日量。
清零、换表和回绕需要三种不同证据
清零改变同一设备的计数起点。上述1180至0有维护记录和两侧读数,才能把新段从0累计。如果只收到清零后的24,而缺少清零前终值,就不知道上一条旧读数之后、清零之前用了多少;即使清零后初值0已确认,也只能确认新段24和交界未知。把负差裁成0会掩盖缺口;取绝对值则会制造大额能耗。
换表改变物理仪表身份。继续假设11月12日00:00卸下 M1,终值48;同一测点安装 M2,初值500,06:00为518。若安装交界完整且无计量空隙,新表这六小时贡献18 kWh,不能把500减48得到的452当用电。若拆装存在未计量时段,必须单列未知范围,不能由两台表的读数推算它。
回绕是已知有限容量计数器越过上限后从头继续。假设设备资料明确模数 M 为10000 kWh,即一次完整循环的容量;同段先读9980、三小时后读25,且没有清零或换表。一次回绕候选增量为10000减9980加25等于45。模数不是最后可显示数值9999,精度和计数步长要与设备定义一致。
45并不总能证明恰好一次回绕。若间隔很长,实际增量还可能为45加若干个10000。若本例已有可信工程上限20 kW,三小时最大60 kWh,45不超上限而另加一圈显然超出,才可排除多圈;这一上限是假设条件,不是通用阈值。没有设备模数、连续性或上限证据时,保留回绕待确认。
即使差值为正,也不能单凭符号证明连续:设备可能在两次采样之间清零后又增长到更高值,或先发生倍率变更。应结合维护事件、配置历史和采集完整性判断。若底层没有相关证据,系统应报告可确认范围,不能通过“所有负差都修复了”宣称所有计数异常均已解决。
两种实现路径,各自保留不同的证据成本
路径一是在明细存储中生成可追溯区间账本。先按授权来源与修订规则处理重复记录,再按仪表、寄存器和计数段分组排序,连接相邻可信观测。PostgreSQL 18 的 lag 可取得分组内前一行,默认缺前行时返回 NULL,且不会自动跳过 NULL。[4] 因而不能把首行前值默认设为0,也不能假定数据库会替你判定无效读数。
表达式示例为 lag(reading_kwh) OVER (PARTITION BY meter_id, register_id, epoch_id ORDER BY event_time, source_sequence)。这是用于说明分组与顺序的 SQL 片段,未作数据库运行测试。source_sequence 只能在来源定义明确时解决顺序;同一时刻两条冲突读数应先核查,不能靠随便排一个序号就形成事实。
有可信相邻值后,先检查单位、倍率和连续性,再计算普通差分或经证据批准的回绕修正。查询一个业务日时要取到必要的前后锚点,不能先只筛日内行再做 lag,否则首段可能丢失。锚点跨日并不授权随意插值;跨边界但缺真实日界的区间仍应输出待分配或明确估计。
路径二是使用时序系统的计数器函数支持运行趋势。它适合数据类型、重启语义、标签与采样方式都已明确,且业务接受该函数估计边界的场景。Prometheus increase 的外推及下降处理是其既定语义。[3] 对必须逐笔解释的日度核算,不能只保留最终函数值而丢掉原始读数和分段依据。
Flux 0.7.1 及以上的 difference 文档说明了相邻值、空值及 nonNegative、initialZero 的行为;默认通常比输入少一行,保留首行时其差值为空。[5] 参数选择会改变下降后的结果,不能将名称含“非负”误解为已正确处理换表、回绕和故障。实际版本、分组与排序都应固定,用本篇反例核查输出。
账本路径增加存储、版本维护和修订处理,但能逐段解释来源;时序函数路径接入趋势较方便,却需要额外确认是否允许外推、怎样处理重启及标签变化。两者可以并存:运行看板使用已验收的趋势口径,经营报表引用可追溯版本;不能把同一个字段名用于两种不同证据的结果。
补传与更正不能只重算新到的一行
11月11日午夜1130插入后,原1090至1150的一条60区间必须失效,并生成40与20两条新段。如果只追加新的40,又保留旧60,区间贡献就重复。建议用两端原记录及规则版本生成区间身份,明确旧区间被哪个修订版本替代;重试同一批修订应得到同一有效区间集合。
读数更正也会影响前后两段。例如把中间点从1030改为1032,前段由30变32,后段由60变58,端点不变时两段合计仍90。只更新当前差值会破坏守恒;只看累计总量又可能忽略班次分配变化。因此需要定位该点的前驱和后继,再刷新受影响的日、班次及下游指标版本。
重复回传应区分完全相同的原记录与真正修订。稳定来源编号相同且内容相同可以幂等接收;编号相同却值不同,应按来源修订协议处理或隔离,不能盲目以后到为准。乱序先恢复事件时间顺序,再计算;接收时间仅用于解释系统何时获得了证据。
倍率改变不能简单把全历史读数乘今天的倍率。先确认寄存器记录的是一次侧还是二次侧电量、设备是否已内置倍率、变更发生时是否有边界读数,再按版本分段。否则可能重复乘倍率,或把变更前累计基线一起重新缩放。无法确认变更边界时,应限制跨边界差分并保留原始值。
失效质量码也不能只删行了事。若设备持续正确累积、只是传输缺测,两端值可能仍支持整段总量;若计量本身故障,跨过去求差可能没有可信含义。需要根据故障类型决定是否连接两端,保留缺口原因和批准依据。未知故障不自动降级成普通通信延迟。
用六组反例验收数字、状态与修复流程
第一组检验跨日缺测:输入1090和1150但无午夜点,预期十二小时60可以确认,日分配仍未知或明确标为30/30估计。补入1130后必须变成40/20,旧区间失效、两天总量不变。检查区间键、估计标记和结果版本;发现重复贡献时修订替代逻辑,再重复补传两次验证幂等。
第二组检验有证据与无证据的清零:先使用1180、清零0、24,预期新段24;再移除旧段终值,预期交界未知,不能给出完整总量。检查维护单和端点记录,补齐获准证据或限制发布后复验。测试要同时证明正常清零可处理,缺证据不会被自动“修好”。
第三组检验换表:同一测点的 M1 终值48、M2 初值500和后值518,预期仅新表区间18,不产生452。删除换表交界记录后应暴露未覆盖时段。若系统跨设备相减,修正物理身份和有效期,再把两台仪表乱序上传,确认仍按事件归属计算。
第四组检验回绕:模数10000、9980到25、三小时且上限20 kW,预期候选45在给定条件下通过;去掉模数或放宽间隔到可能多圈时,预期不能唯一确定。检查型号资料、上限来源和事件证据。修正后既测正常回绕,也测人为负跳变,防止两者共用无条件公式。
第五组检验重复、冲突与单位:同一来源记录回传两次,预期不增加电量;相同身份与时刻的1030和1032没有修订证据时应隔离;把同值单位从kWh改成Wh,应按版本正确换算或阻断。检查原记录、冲突明细和配置版本,修复后复算前后相邻段,不只核对总行数。
第六组检验窗口与空值:首条有效点不应从0起算,日内筛选不得丢掉必要前驱;质量失效的中间点也不能默认等于零。预期输出明确缺少锚点或计量连续性未知。检查查询边界和质量规则,补正确锚点后再核对时长与增量。以上是构造验收用例,不代表已在某款设备或生产系统实测通过。
让日汇总带着覆盖范围和维护责任交付
一份可交接的日结果至少包括测点与仪表范围、业务时区、起止边界、真实区间量、估计分配量、未知跨度、原始记录版本和修订版本。估计值与真实值可以在批准用途下合并展示,但要能分别查询;缺关键边界时不得只返回一个没有质量状态的总数。
监控重点包括未解释下降、身份冲突、单位变化、过长缺口、补传积压和修订失败。阈值来自具体设备与业务承诺,不用统一的负值比例替代调查。值班人员应能从异常结果回到两端原记录、维护事件和倍率版本,再判断是数据修正、设备核查还是业务用途限制。
规模上,假设10000个测点每分钟一条,一天就是1440万条,30天约4.32亿条,尚未包含重传和版本。这个行数推算不是容量基准。可按测点与时间组织存储、保留原始证据并建立增量修订队列;索引、保留期和重算窗口应在真实负载下验证,不能因使用窗口函数就承诺足够吞吐。
规则升级时,先以固定输入同时生成旧、新区间与日结果,比较增量、未知范围和修订集合;只有差异得到解释后才切换读取版本。回退应切回完整旧结果与规则组合,而非只换程序却保留混合输出。负责采集的人确认原始证据,数据团队确认分段和守恒,业务负责人确认哪些估计可用于哪种决策。
