使用Python从串行设备读取数据,并使用Raspberry Pi将其保存到PostgreSQL

2024-10-03 02:43:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试从一个有FTDI芯片的智能仪表读取数据。编写了一个简单的Python串行程序来将命令传递给meter,然后meter返回响应。仪表的数据被转换成浮点数并存储在字典中。在

现在我想将字典存储到DB,这里是将数据放入表中的代码。

import psycopg2

conn = psycopg2.connect(database="smartmeter", user="postgres", password="12345", host="localhost", port="5432")

cur = conn.cursor()

cur.execute('''CREATE TABLE metertable (ID      SERIAL  PRIMARY KEY     NOT NULL,meter  TEXT    NOT NULL,temperature    TEXT    NOT NULL,freq   TEXT    NOT NULL,penergy        TEXT    NOT NULL,qenergy    TEXT    NOT NULL,senergy        TEXT    NOT NULL,cospi  TEXT    NOT NULL,irms   TEXT    NOT NULL,ppower TEXT    NOT NULL,qpower TEXT    NOT NULL,spower TEXT    NOT NULL);''')
while 1:
    data=dict[]
    data={
                'time':timestamp,
                'meter':m0_data,
                'temperature':m1_data,
                'freq':m2_data,
                'penergy':m3_data,
                'qenergy':m6_data,
                'senergy':m7_data,
                'cospi':m11_data,
                'irms':m15_data,
                'vrms':m16_data,
                'ppower':realpower,
                'qpower':reactivepower,
                'spower':apparentpower
        }
        cur.executemany ("""INSERT INTO metertable(time,meter,temperature,freq,penergy,qenergy,senergy,cospi,irms,vrms,ppower,qpower,spower) VALUES (%(time)s, %(meter)s), %(temperature)s), %(freq)s), %(penergy)s), %(qenergy)s), %(senergy)s), %(cospi)s), %(irms)s), %(vrms)s), %(ppower)s) %(qpower)s) %(spower)s)""", data)

我遇到这样的错误

^{pr2}$

我向数据库输入数据的方向是否正确?请推荐一些最好的方法。在


Tags: textdatanotnullmeterfreqtemperatureirms
3条回答

谢谢你的帮助。错误出在执行器上。我使用type(variable)来获取变量类型,并在那些表中更改为当前执行. 但当我运行代码时。我在数据库中看不到数据保存。 这是代码

import serial
import psycopg2

port=serial.Serial("/dev/ttyUSB0",baudrate=9600,timeout=.1)

conn =psycopg2.connect(database="smartmeternode",user="postgres",password="amma",host="localhost",port="5432")
cur=conn.cursor
data2=dict()
while 1:
   port.write('m0\r')
   meter=port.read()
   port.write('m2\r')
   temp=port.read()
   ph=meter*temp
   time=timestamp
   data={'meter':meter,'temp':temp,'ph':ph,'time':time}
   cur.execute("INSERT INTO METERDATATEST(meter,temp,ph,time) VALUES(%(meter)s,%(temp)s,%(ph)s,%(time)s;",data)
   cur.commit
cur.close
conn.close

程序将在有限时间内运行,我使用ctrl+Z停止程序。当我检查数据库时,它仍然是空的。我错过了什么?我希望数据在从我的智能仪表读取后立即存储在PSQL数据库中

^{pr2}$

您有额外的右括号和缺少逗号:

cur.executemany ("""
    INSERT INTO metertable(
        time,meter,temperature,freq,penergy,qenergy,senergy,cospi,irms,vrms,ppower,qpower,spower
    ) VALUES (
        %(time)s, %(meter)s, %(temperature)s, %(freq)s, %(penergy)s, %(qenergy)s, %(senergy)s,
        %(cospi)s, %(irms)s, %(vrms)s, %(ppower)s, %(qpower)s, %(spower)s
    )
""", data)

错误说明:您尝试将一些字段推送到数据库中是字符串字段,但您将推送整数值。

确保数据值与数据库表字段匹配。在

相关问题 更多 >