
关键词:中小型档案室、轻量化方案、低成本温湿度监控、八防基础搭建、PoE供电、Modbus TCP、边缘网关、告警联动、利旧改造 标签:#物联网 #Modbus #TCP/IP #POE供电 #InfluxDB #以太网温湿度传感器 #网口温湿度变送器 #机房监控 #边缘计算 #低成本部署
中小型档案室通常指机关、企事业单位内部,面积 20~200㎡,1~3 间库房,兼职人员运维,预算有限,无专职自控团队。和大型档案馆项目的差异决定了方案取向:
落地目标:单库或少量库区,温湿度连续监测+越限告警+基础联动,合规留痕,故障可回退。
八防(防火、防盗、防潮、防尘、防鼠、防虫、防高温、防光)在中小型场景下,先分可监测、可处置、可巡检三层,别一次性硬件化。
八防项 | 轻量监测点 | 基础处置/联动 | 备注 |
|---|---|---|---|
防潮/防高温 | 温湿度变送器多点 | 越限告警+通知;利旧空调/除湿机插座控制 | 控制可选,先监后控 |
防火 | 原烟感接入或增补,消防状态反馈 | 告警通知+联动停非消防电源由BA/电工执行 | 不代行消防逻辑 |
防盗 | 门磁+红外双鉴或单PIR,视频可选 | 告警通知+录像(已有NVR则接入) | 布防时段可简化 |
防尘 | 滤网状态/压差选配,环境目视巡检 | 提醒巡检 | 非控制环 |
防鼠/防虫 | 巡检+粘捕点,门缝密封 | 巡检记录 | 硬件监测价值低,流程兜底 |
防光 | 照度选配,遮光帘/门禁管理 | 提醒 | 管理手段为主 |
核心:把预算花在温湿度监测、水浸、门禁/入侵告警、网络与供电冗余上,其余进巡检SOP。
感知层:网口/RS485温湿度变送器 + 水浸(选配) + 门磁/PIR(选配)
│ Modbus TCP / RTU转TCP
边缘层:PoE交换机 + 边缘网关/工控机/树莓派类节点,跑采集容器
│ MQTT/HTTP →
平台层:本地Grafana+InfluxDB,或轻量SaaS/内网Web;告警经短信/钉钉/邮件/Webhook轻量场景用单进程轮询+批写,别引入过多依赖。
"""
light_collector.py - 中小型档案室轻量采集服务
- Modbus TCP 轮询温湿度,写 InfluxDB,经 MQTT 通知
- 含迟滞启停联动示例(控制智能继电器/插座)
"""
import asyncio, json, logging
from pymodbus.client import AsyncModbusTcpClient
from influxdb_client import InfluxDBClient, Point
from influxdb_client.client.write_api import SYNCHRONOUS
logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s")
CFG = {
"devices": {
"room-a-ret": {"host": "10.20.1.11", "unit": 1, "scale_t": 0.1, "scale_h": 0.1},
"room-a-ws": {"host": "10.20.1.12", "unit": 1, "scale_t": 0.1, "scale_h": 0.1},
},
"poll": 10.0,
"influx": {"url": "http://localhost:8086", "token": "", "org": "arch", "bucket": "env"},
"mqtt": {"host": "localhost", "topic": "archive/env"},
"ctrl": { # 可选联动
"relay_host": "10.20.1.30", "coil": 0,
"t_lo": 19.0, "t_hi": 21.0, "h_lo": 45.0, "h_hi": 55.0,
"min_run": 300, "min_off": 60
}
}
class LightCollector:
def __init__(self):
self.clients = {}
self.influx = InfluxDBClient(url=CFG["influx"]["url"], token=CFG["influx"]["token"], org=CFG["influx"]["org"])
self.wapi = self.influx.write_api(write_options=SYNCHRONOUS)
self.state = {"dev": None, "since": 0} # 简单迟滞状态机
self._stop = False
async def client(self, host):
c = self.clients.get(host)
if c is None or not c.connected:
c = AsyncModbusTcpClient(host)
await c.connect()
self.clients[host] = c
return c
async def read_dev(self, name, cfg):
try:
c = await self.client(cfg["host"])
rr = await c.read_holding_registers(0, 2, slave=cfg["unit"])
if rr.isError():
return None, None, False
raw_t, raw_h = rr.registers
# 假设16bit有符号定点,0.1℃/0.1%RH;按厂家表调整
t = raw_t * cfg["scale_t"] if False else raw_t/10.0
h = raw_h / 10.0
return t, h, True
except Exception as e:
logging.warning("read %s failed: %s", name, e)
return None, None, False
async def ctrl_loop(self, env):
# env: 聚合后的库区温湿度
c = CFG["ctrl"]
now = asyncio.get_event_loop().time()
on = self.state.get("on", False)
since = self.state.get("since", 0)
# 迟滞启停:越上限开制冷/除湿,越下限关;简化示例
if env["t"] > c["t_hi"] and not on:
await self.set_relay(True)
self.state = {"on": True, "since": now}
elif env["t"] < c["t_lo"] and on:
await self.set_relay(False)
self.state = {"on": False, "since": now}
# 运行/停机最小时间保护
if on and now - since < c.get("min_run", 300):
return
if not on and now - since < c.get("min_off", 60):
return
async def set_relay(self, on):
try:
c = await self.client(CFG["ctrl"]["relay_host"])
await c.write_coil(CFG["ctrl"]["coil"], on, slave=1)
logging.info("relay set %s", on)
except Exception as e:
logging.warning("relay ctrl failed: %s", e)
async def run(self):
while not self._stop:
agg_t, agg_h, n = [], [], 0
for name, cfg in CFG["devices"].items():
t, h, ok = await self.read_dev(name, cfg)
if ok:
p = Point("env").tag("device", name).field("temperature", t).field("humidity", h).field("quality",1)
self.wapi.write(bucket=CFG["influx"]["bucket"], org=CFG["influx"]["org"], record=p)
agg_t.append(t); agg_h.append(h); n+=1
if n:
env = {"t": sum(agg_t)/n, "h": sum(agg_h)/n}
await self.ctrl_loop(env)
await asyncio.sleep(CFG["poll"])
if __name__ == "__main__":
svc = LightCollector()
try:
asyncio.run(svc.run())
except KeyboardInterrupt:
svc._stop = True注意:
八防中硬件监测不经济的项,转管理动作:
把这些进交接文档和巡检表,审计时留记录,比堆传感器实在。
中小型档案室轻量化方案的关键,是做减法而不降底线:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。