spark_counter/pzem-004_probe.rb

53 lines
1.8 KiB
Ruby
Executable File

#!/usr/bin/env ruby
# encoding: utf-8
# ruby: 1.9.3
=begin
script to queries the measurements from a peacefair PZEM-004 power meter
the command and data payload are copied from the manual
here the device address is set to 192.168.1.2 in all messages
=end
require 'serialport'
@serial = SerialPort.open("/dev/ttyUSB0",{ baud: 9600, databits: 8, parity: SerialPort::NONE, stop_bit: 1, flow_control: SerialPort::NONE})
@serial.baud = 9600
# set address
cmd = [0xB4,0xC0,0xA8,0x01,0x02,0x00,0x1F]
@serial.write(cmd.pack("C*"))
puts "< "+cmd.collect { |b| sprintf("%02X ",b) }.join
data = @serial.read(7).unpack("C*")
puts "> "+data.collect { |b| sprintf("%02X ",b) }.join
puts "address set (192.168.0.1)"
# get voltage
cmd = [0xB0,0xC0,0xA8,0x01,0x02,0x00,0x1B]
@serial.write(cmd.pack("C*"))
puts "< "+cmd.collect { |b| sprintf("%02X ",b) }.join
data = @serial.read(7).unpack("C*")
puts "> "+data.collect { |b| sprintf("%02X ",b) }.join
puts "voltage: #{(data[1]<<8)+data[2]}.#{data[3]} V"
# get current
cmd = [0xB1,0xC0,0xA8,0x01,0x02,0x00,0x1C]
@serial.write(cmd.pack("C*"))
puts "< "+cmd.collect { |b| sprintf("%02X ",b) }.join
data = @serial.read(7).unpack("C*")
puts "> "+data.collect { |b| sprintf("%02X ",b) }.join
puts "current: #{(data[1]<<8)+data[2]}.#{data[3]} A"
# get power
cmd = [0xB2,0xC0,0xA8,0x01,0x02,0x00,0x1D]
@serial.write(cmd.pack("C*"))
puts "< "+cmd.collect { |b| sprintf("%02X ",b) }.join
data = @serial.read(7).unpack("C*")
puts "> "+data.collect { |b| sprintf("%02X ",b) }.join
puts "power: #{(data[1]<<8)+data[2]}.#{data[3]} W"
# get energy
cmd = [0xB3,0xC0,0xA8,0x01,0x02,0x00,0x1E]
@serial.write(cmd.pack("C*"))
puts "< "+cmd.collect { |b| sprintf("%02X ",b) }.join
data = @serial.read(7).unpack("C*")
puts "> "+data.collect { |b| sprintf("%02X ",b) }.join
puts "energy: #{(data[1]<<16)+(data[2]<<8)+data[3]} Wh"