53 lines
1.8 KiB
Ruby
Executable File
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"
|