Basic tutorial of how to setup a [V3] PZEM-004T current sensor with the Raspberry Pi.
PZEM-004T Datasheet: https://innovatorsguru.com/wp-content/uploads/2019/06/PZEM-004T-V3.0-Datasheet-User-Manual.pdf
PARTS:
CanaKit Raspberry Pi 4 4GB Starter Kit – https://amzn.to/2Jrlbfj
PZEM-004T Kit – https://amzn.to/3bQ7jqB
USB to TTL Converter – https://amzn.to/3nXrsxe
Wiring Harness [US Standard]
3-Wire Power Cord – https://amzn.to/3bR4y8v
Hinged Cord Outlet – https://amzn.to/3bOe1xd
Lamp Cord – https://amzn.to/3itZlox
WIRING HARNESS SETUP:

SCHEMATIC:
PZEM-004T | USB to TTL Converter
5V <–> 5V
RX <–> TX
TX <–> RX
GND <–> GND

SETUP:
1. Enable Serial Interface
- Start raspi-config:
sudo raspi-config. - Select option 3 – Interface Options.
- Select option P6 – Serial Port.
- At the prompt
Would you like a login shell to be accessible over serial?answer ‘No’ - At the prompt
Would you like the serial port hardware to be enabled?answer ‘Yes’ - Exit raspi-config and reboot the Pi for changes to take effect.
2. Find USB Serial Device
dmesg | grep tty
3. Install modbus library
sudo pip3 install modbus-tk
CODE:
Github Source: https://gist.github.com/bandaangosta/134c9d84ae9bd317297e96dcc0b9c860
import time
import json
import serial
import modbus_tk.defines as cst
from modbus_tk import modbus_rtu
if __name__ == "__main__":
try:
# Connect to the slave
serial = serial.Serial(
port='/dev/ttyUSB0',
baudrate=9600,
bytesize=8,
parity='N',
stopbits=1,
xonxoff=0
)
master = modbus_rtu.RtuMaster(serial)
master.set_timeout(2.0)
master.set_verbose(True)
# Changing power alarm value to 100 W
# master.execute(1, cst.WRITE_SINGLE_REGISTER, 1, output_value=100)
dict_payload = dict()
while True:
data = master.execute(1, cst.READ_INPUT_REGISTERS, 0, 10)
dict_payload["voltage"]= data[0] / 10.0
dict_payload["current_A"] = (data[1] + (data[2] << 16)) / 1000.0 # [A]
dict_payload["power_W"] = (data[3] + (data[4] << 16)) / 10.0 # [W]
dict_payload["energy_Wh"] = data[5] + (data[6] << 16) # [Wh]
dict_payload["frequency_Hz"] = data[7] / 10.0 # [Hz]
dict_payload["power_factor"] = data[8] / 100.0
dict_payload["alarm"] = data[9] # 0 = no alarm
str_payload = json.dumps(dict_payload, indent=2)
print(str_payload)
time.sleep(1)
except KeyboardInterrupt:
print('exiting pzem script')
except Exception as e:
print(e)
finally:
master.close()