Skip to content

Instantly share code, notes, and snippets.

@dotmat
Created January 15, 2020 15:30
Show Gist options
  • Save dotmat/053bfba0af0ff2a7ea9d442266a98a6e to your computer and use it in GitHub Desktop.
Save dotmat/053bfba0af0ff2a7ea9d442266a98a6e to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3
import minimalmodbus
import serial
powerMeter = minimalmodbus.Instrument('/dev/ttyUSB0', 1)
powerMeter.serial.baudrate = 9600
powerMeter.serial.bytesize = 8
powerMeter.serial.parity = serial.PARITY_NONE
powerMeter.serial.stopbits = 1
powerMeter.mode = minimalmodbus.MODE_RTU
# Print the details of the power meter here, these also include the config needed to talk to the unit.
print('Details of the power meter are:')
print(powerMeter)
def readPowerMeter():
print("Attempting to read power meter")
try:
voltageReading = powerMeter.read_register(0, 0, 4)
ampsReading = powerMeter.read_register(1, 0, 4)
wattsReading = powerMeter.read_register(3, 0, 4)
frequencyReading = powerMeter.read_register(7, 0, 4)
print("Voltage", voltageReading/10)
print("Amps", ampsReading/10)
print("Watts", wattsReading/10)
print("Frequency", frequencyReading/10)
except IOError:
print("Failed to read from instrument")
# Run the function to read the power meter.
readPowerMeter()
@gitHub-pbMay2021
Copy link

Thanks for this reference code.
The hardware documentation for the PZEM-016 indicates that the current, power, and cumulative energy measurements are contained in two adjacent registers. I could not get the multi-register read to work on the PZEM-016 so used two 16-bit reads instead and shifted the high-16 bits up before adding in the low 16-bits.

e.g.
watts = ((powerMeter.read_register(4, 0, 4) << 16) + powerMeter.read_register(3, 0, 4))/10.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment