New smartmeter
This commit is contained in:
@@ -8,10 +8,10 @@ class ConfirmingSyncPatternState < StatePattern::State
|
|||||||
while (idx < bytes.length && idx < sync_length && bytes[idx] == Synchronizer::SYNC_PATTERN[idx]) do idx = idx+1 end
|
while (idx < bytes.length && idx < sync_length && bytes[idx] == Synchronizer::SYNC_PATTERN[idx]) do idx = idx+1 end
|
||||||
|
|
||||||
if (idx == sync_length)
|
if (idx == sync_length)
|
||||||
#p "Sync pattern confirmed"
|
p "Sync pattern confirmed"
|
||||||
transition_to(InSyncState)
|
transition_to(InSyncState)
|
||||||
else
|
else
|
||||||
#p "Back to SearchingForSync state. idx = #{idx}."
|
p "Back to SearchingForSync state. idx = #{idx}."
|
||||||
transition_to(SearchingForSyncState)
|
transition_to(SearchingForSyncState)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ require "socket"
|
|||||||
|
|
||||||
class InSyncState < StatePattern::State
|
class InSyncState < StatePattern::State
|
||||||
|
|
||||||
END_OF_FRAME = "!\n"
|
END_OF_FRAME = "!****\n"
|
||||||
|
|
||||||
# def initialize(stateful, previous_state)
|
# def initialize(stateful, previous_state)
|
||||||
# # open socket to EmonHub
|
# # open socket to EmonHub
|
||||||
@@ -42,7 +42,8 @@ class InSyncState < StatePattern::State
|
|||||||
private
|
private
|
||||||
def new_frame_starts(bytes,idx,sync_pattern_length)
|
def new_frame_starts(bytes,idx,sync_pattern_length)
|
||||||
#return bytes[idx..idx+sync_pattern_length-1].eql?(Synchronizer::SYNC_PATTERN)
|
#return bytes[idx..idx+sync_pattern_length-1].eql?(Synchronizer::SYNC_PATTERN)
|
||||||
return bytes[idx..idx+sync_pattern_length-1].eql?(END_OF_FRAME)
|
#return bytes[idx..idx+sync_pattern_length-1].eql?(END_OF_FRAME)
|
||||||
|
return bytes[idx].eql?(END_OF_FRAME[0])
|
||||||
end
|
end
|
||||||
|
|
||||||
def handle_frame(frame_lines)
|
def handle_frame(frame_lines)
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
class Synchronizer
|
class Synchronizer
|
||||||
include StatePattern
|
include StatePattern
|
||||||
|
|
||||||
SYNC_PATTERN = "\n/ISk5\\2ME382-1003\n\n"
|
SYNC_PATTERN = "/CTA5ZIV\-METER\n\n"
|
||||||
|
#SYNC_PATTERN = "\n/ISk5\\2ME382-1003\n\n"
|
||||||
|
|
||||||
set_initial_state ::SearchingForSyncState
|
set_initial_state ::SearchingForSyncState
|
||||||
|
|
||||||
|
|||||||
@@ -4,13 +4,20 @@ UNKNOWN_READING = { :total_kwh_consumed_high => nil, :total_kwh_consumed_low =>
|
|||||||
|
|
||||||
class Reading < ActiveRecord::Base
|
class Reading < ActiveRecord::Base
|
||||||
|
|
||||||
|
# Round up with 1 (default) decimals
|
||||||
|
def round_up(number, decimals = 1)
|
||||||
|
factor = 10 ** decimals
|
||||||
|
(number * factor).ceil / factor.to_f
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
def eql_reading?(reading)
|
def eql_reading?(reading)
|
||||||
self.total_kwh_consumed_high == reading.total_kwh_consumed_high &&
|
self.total_kwh_consumed_high == reading.total_kwh_consumed_high &&
|
||||||
self.total_kwh_consumed_low == reading.total_kwh_consumed_low &&
|
self.total_kwh_consumed_low == reading.total_kwh_consumed_low &&
|
||||||
self.total_kwh_produced_high == reading.total_kwh_produced_high &&
|
self.total_kwh_produced_high == reading.total_kwh_produced_high &&
|
||||||
self.total_kwh_produced_low == reading.total_kwh_produced_low &&
|
self.total_kwh_produced_low == reading.total_kwh_produced_low &&
|
||||||
self.current_kw_consumed == reading.current_kw_consumed &&
|
round_up(self.current_kw_consumed) == round_up(reading.current_kw_consumed) &&
|
||||||
self.current_kw_produced == reading.current_kw_produced &&
|
round_up(self.current_kw_produced) == round_up(reading.current_kw_produced) &&
|
||||||
self.total_m3_gas_consumed == reading.total_m3_gas_consumed &&
|
self.total_m3_gas_consumed == reading.total_m3_gas_consumed &&
|
||||||
self.high_tarif == reading.high_tarif
|
self.high_tarif == reading.high_tarif
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
version: '3'
|
|
||||||
services:
|
services:
|
||||||
db:
|
db:
|
||||||
container_name: smartmeter_db
|
container_name: smartmeter_db
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ ActiveRecord::Base.establish_connection(connection_details)
|
|||||||
def open_device
|
def open_device
|
||||||
begin
|
begin
|
||||||
# Open connection to serial port
|
# Open connection to serial port
|
||||||
io_device = SerialPort.new("/dev/ttyUSB0", 9600, 7, 1, SerialPort::EVEN)
|
io_device = SerialPort.new("/dev/ttyUSB0", 115200, 8, 1, SerialPort::NONE)
|
||||||
# Make reading blocking
|
# Make reading blocking
|
||||||
io_device.read_timeout = 0
|
io_device.read_timeout = 0
|
||||||
rescue
|
rescue
|
||||||
|
|||||||
@@ -18,10 +18,10 @@ if __FILE__ == $0
|
|||||||
|
|
||||||
#params for serial port
|
#params for serial port
|
||||||
port_str = "/dev/ttyUSB0" #may be different for you
|
port_str = "/dev/ttyUSB0" #may be different for you
|
||||||
baud_rate = 9600
|
baud_rate = 115200
|
||||||
data_bits = 7
|
data_bits = 8
|
||||||
stop_bits = 1
|
stop_bits = 1
|
||||||
parity = SerialPort::EVEN
|
parity = SerialPort::NONE
|
||||||
|
|
||||||
sp = SerialPort.new(port_str, baud_rate, data_bits, stop_bits, parity)
|
sp = SerialPort.new(port_str, baud_rate, data_bits, stop_bits, parity)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user