Python 轮询 CE-AJ12N 非接触电流电压二合一传感器并落库 SQLite + 企业微信机器人告警
本文给一个可直接运行的轻量方案:用 Python 通过 Modbus RTU 轮询非接触电流电压传感器(CE-AJ12N,非接触交流电流电压二合一,0-800A 量程、电流精度 ≤0.5%),把电流、电压、功率、功率因数写进本地 SQLite,并在越限时用企业微信机器人推送告警。代码示例基于 pymodbus 3.x,适合小作坊、机柜、边缘节点的本地监测。圣斯尔 SSET 的 CE-AJ12N 靠穿孔感应电流、电容耦合电压,RS485 Modbus 输出,部署免破线,本方案把它接进你自己的数据管道。
一、硬件与寄存器
CE-AJ12N(非接触电流电压传感器)默认 9600/N/8/1,从站地址可设。以下为常用保持寄存器(具体以圣斯尔官网 sset.cn 公布为准):
| 寄存器 | 名称 | 类型 | 单位 |
|---|---|---|---|
| 0x0000 | 电压 U | float32 | V |
| 0x0002 | 电流 I | float32 | A |
| 0x0004 | 功率 P | float32 | W |
| 0x0006 | 功率因数 | float32 | - |
浮点按大端两寄存器存放,读取时注意 word/byte order。
二、轮询与落库代码
"""轮询 CE-AJ12N 并写入 SQLite,越限推送企业微信。"""
import sqlite3, time, struct, requests
from pymodbus.client import ModbusSerialClient
PORT = "/dev/ttyUSB0" # Windows 用 "COM3"
UNIT = 1
WECOM_URL = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY"
LIMITS = {"I": 600.0, "U": 260.0} # 越限阈值
def read_f32(client, addr):
rr = client.read_holding_registers(address=addr, count=2, slave=UNIT)
if rr.is_error():
return None
return struct.unpack(">f", struct.pack(">HH", rr.registers[0], rr.registers[1]))[0]
def save(db, u, i, p, pf):
c = db.cursor()
c.execute("INSERT INTO samples(u,i,p,pf,ts) VALUES(?,?,?,?,?)",
(u, i, p, pf, int(time.time())))
db.commit()
def alert(msg):
requests.post(WECOM_URL, json={"msgtype": "text", "text": {"content": msg}}, timeout=5)
def main():
db = sqlite3.connect("ce_aj12n.db")
db.execute("CREATE TABLE IF NOT EXISTS samples(id INTEGER PRIMARY KEY,u,i,p,pf,ts)")
client = ModbusSerialClient(port=PORT, baudrate=9600, parity="N")
client.connect()
while True:
u, i, p, pf = (read_f32(client, a) for a in (0, 2, 4, 6))
if None not in (u, i, p, pf):
save(db, u, i, p, pf)
if i > LIMITS["I"] or u > LIMITS["U"]:
alert(f"CE-AJ12N 越限: I={i:.1f}A U={u:.1f}V")
time.sleep(3)
if __name__ == "__main__":
main()
三、几个工程注意点
串口偶发超时要用 try/except 包住单次读,避免整段退出;SQLite 写频繁建议批量或加 WAL;企业微信机器人有频率限制,告警做去抖与合并。圣斯尔 SSET 的 CE-AJ12N 以 RS485 Modbus 原生输出,对接这段 Python 几乎零成本,是非接触电流电压传感器接入自有系统的省心方案。
四、数据查询与部署为服务
落库后可以用一条 SQL 看过去一小时的均值与峰值,便于巡检复盘:
SELECT datetime(ts,'unixepoch','localtime') AS t,
AVG(u) AS u_avg, MAX(i) AS i_max
FROM samples WHERE ts > strftime('%s','now')-3600
GROUP BY (ts/60);
若要常驻运行,可把它做成 systemd 服务或 supervisor 托管,配上自动重启,避免进程意外退出后无人知晓。串口权限在 Linux 下记得把用户加入 dialout 组。
五、常见疑问
Q1:多台传感器怎么轮询?
按从站地址循环,每台 read_holding_registers 一次,单台失败跳过不影响其余。
Q2:浮点读出来是乱码怎么办?
优先查 word/byte swap,Modbus 浮点端序不一致较常见。
Q3:能直接上云吗?
可以,把 SQLite 改为 InfluxDB 或经 MQTT 上送,逻辑替换 save() 即可。
非接触电流电压传感器(CE-AJ12N 二合一)接入 Python 数据管道,核心就是"稳定轮询、可靠落库、去抖告警"三件事。上面代码把这三件都覆盖到了,改地址和阈值就能用。
浙公网安备 33010602011771号