树莓派PZEM-004T模块实时数据存入MongoDB分步指导需求
分步实现树莓派PZEM-004T数据存储至MongoDB(优先后端搭建)
一、MongoDB后端环境搭建
不管你是把MongoDB装在树莓派本地,还是单独的云/本地服务器,先按以下步骤完成基础配置:
1. 安装MongoDB(以Debian/Raspbian系统为例)
sudo apt update sudo apt install mongodb
- 验证安装:
mongod --version - 启动服务并设置开机自启:
sudo systemctl start mongodb sudo systemctl enable mongodb
2. 配置远程访问(若MongoDB不在树莓派本地)
编辑MongoDB配置文件:
sudo nano /etc/mongodb.conf
找到bindIp字段,将默认的127.0.0.1改为0.0.0.0(生产环境建议限制为树莓派的固定IP,提高安全性),保存后重启服务:
sudo systemctl restart mongodb
3. 创建专用数据库与授权用户
进入MongoDB shell:
mongo
执行以下命令创建数据库和读写权限用户:
// 创建并切换到pzem_data数据库 use pzem_data // 创建具备读写权限的用户 db.createUser({ user: "pzem_user", pwd: "your_strong_password", // 替换为你的安全密码 roles: [{ role: "readWrite", db: "pzem_data" }] })
退出shell:exit
(可选)开启身份认证:再次编辑配置文件,找到security段落,添加authorization: enabled,重启服务生效。
二、树莓派端基础准备(衔接后端必备)
1. 安装PZEM-004T依赖
用Python操作模块的话,直接安装专用库:
pip install pzem-004t pyserial
2. 安装MongoDB Python驱动
pip install pymongo
三、数据上传脚本编写
下面是核心的Python脚本,实现读取PZEM数据并写入MongoDB:
import serial from pymongo import MongoClient import time from pzem import PZEM004T # 连接MongoDB(替换为你的MongoDB地址、用户名、密码) client = MongoClient('mongodb://pzem_user:your_strong_password@192.168.1.100:27017/pzem_data') db = client['pzem_data'] readings_col = db['real_time_data'] # 初始化PZEM串口连接(根据你的实际串口路径调整,比如/dev/ttyUSB0或/dev/ttyAMA0) ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1) pzem = PZEM004T(ser) try: while True: # 读取PZEM数据 data = pzem.read() if data: # 构造带时间戳的数据文档 reading_doc = { 'voltage': data['voltage'], 'current': data['current'], 'power': data['power'], 'energy': data['energy'], 'frequency': data['frequency'], 'power_factor': data['power_factor'], 'record_time': time.strftime('%Y-%m-%d %H:%M:%S') } # 插入数据库 readings_col.insert_one(reading_doc) print(f"已存储数据: {reading_doc}") # 每5秒读取一次,可根据需求调整间隔 time.sleep(5) except KeyboardInterrupt: # 程序终止时关闭连接 ser.close() client.close() print("程序已停止")
四、验证数据存储
运行脚本后,进入MongoDB shell验证数据:
mongo -u pzem_user -p your_strong_password --authenticationDatabase pzem_data use pzem_data # 查看最新的5条数据 db.real_time_data.find().sort({'record_time': -1}).limit(5)
如果能看到带时间戳的PZEM读数,说明后端搭建和数据上传流程正常。
内容的提问来源于stack exchange,提问作者AMAYE GATALAWAR
相关产品推荐
相关产品推荐

