sappho-heatmiser-proxy 0.0.7 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
@@ -21,7 +21,7 @@ module Sappho
|
|
21
21
|
TraceLog.instance.info "#{NAME} version #{VERSION} - #{HOMEPAGE}"
|
22
22
|
Thread.new do
|
23
23
|
clients = ClientRegister.instance
|
24
|
-
port =
|
24
|
+
port = SystemConfiguration.instance.port
|
25
25
|
log = TraceLog.instance
|
26
26
|
log.info "opening proxy server port #{port}"
|
27
27
|
TCPServer.open port do | server |
|
@@ -21,19 +21,15 @@ module Sappho
|
|
21
21
|
status = HeatmiserStatus.instance
|
22
22
|
queue = CommandQueue.instance
|
23
23
|
log = TraceLog.instance
|
24
|
-
config = SystemConfiguration.instance
|
25
|
-
hostname = config['heatmiser.address']
|
26
|
-
|
27
|
-
pin = Integer config['heatmiser.pin']
|
28
|
-
pinLo = pin & 0xFF
|
29
|
-
pinHi = (pin >> 8) & 0xFF
|
30
|
-
queryCommand = HeatmiserCRC.new([0x93, 0x0B, 0x00, pinLo, pinHi, 0x00, 0x00, 0xFF, 0xFF]).appendCRC
|
24
|
+
config = SystemConfiguration.instance
|
25
|
+
hostname = config.config['heatmiser.address']
|
26
|
+
queryCommand = HeatmiserCRC.new([0x93, 0x0B, 0x00, config.pinLo, config.pinHi, 0x00, 0x00, 0xFF, 0xFF]).appendCRC
|
31
27
|
loop do
|
32
28
|
status.invalidate
|
33
29
|
begin
|
34
|
-
log.info "opening connection to heatmiser at #{hostname}:#{port}"
|
35
|
-
TCPSocket.open hostname, port do | socket |
|
36
|
-
log.info "connected to heatmiser at #{hostname}:#{port}"
|
30
|
+
log.info "opening connection to heatmiser at #{hostname}:#{config.port}"
|
31
|
+
TCPSocket.open hostname, config.port do | socket |
|
32
|
+
log.info "connected to heatmiser at #{hostname}:#{config.port}"
|
37
33
|
loop do
|
38
34
|
begin
|
39
35
|
sleep 5
|
@@ -45,7 +41,7 @@ module Sappho
|
|
45
41
|
timeNow = Time.now
|
46
42
|
dayOfWeek = timeNow.wday
|
47
43
|
dayOfWeek = 7 if dayOfWeek == 0
|
48
|
-
command = HeatmiserCRC.new([0xA3, 0x12, 0x00, pinLo, pinHi, 0x01, 0x2B, 0x00, 0x07,
|
44
|
+
command = HeatmiserCRC.new([0xA3, 0x12, 0x00, config.pinLo, config.pinHi, 0x01, 0x2B, 0x00, 0x07,
|
49
45
|
timeNow.year - 2000,
|
50
46
|
timeNow.month,
|
51
47
|
timeNow.day,
|
@@ -76,14 +72,14 @@ module Sappho
|
|
76
72
|
end
|
77
73
|
end
|
78
74
|
rescue Timeout::Error
|
79
|
-
log.info "heatmiser at #{hostname}:#{port} is not responding - assuming connection down"
|
75
|
+
log.info "heatmiser at #{hostname}:#{config.port} is not responding - assuming connection down"
|
80
76
|
break
|
81
77
|
rescue => error
|
82
78
|
log.error error
|
83
79
|
break
|
84
80
|
end
|
85
81
|
end
|
86
|
-
log.info "closing connection to heatmiser at #{hostname}:#{port}"
|
82
|
+
log.info "closing connection to heatmiser at #{hostname}:#{config.port}"
|
87
83
|
socket.close
|
88
84
|
end
|
89
85
|
rescue => error
|
@@ -12,6 +12,7 @@ module Sappho
|
|
12
12
|
require 'sappho-heatmiser-proxy/heatmiser_status'
|
13
13
|
require 'sappho-heatmiser-proxy/command_queue'
|
14
14
|
require 'sappho-heatmiser-proxy/client_register'
|
15
|
+
require 'sappho-heatmiser-proxy/system_configuration'
|
15
16
|
|
16
17
|
class HeatmiserClient
|
17
18
|
|
@@ -25,6 +26,7 @@ module Sappho
|
|
25
26
|
end
|
26
27
|
|
27
28
|
def communicate
|
29
|
+
config = SystemConfiguration.instance
|
28
30
|
active = true
|
29
31
|
while active do
|
30
32
|
begin
|
@@ -36,13 +38,15 @@ module Sappho
|
|
36
38
|
'error: no response from heatmiser unit in last minute' :
|
37
39
|
@status.valid ? 'ok' : 'error: last response from heatmiser unit was invalid'
|
38
40
|
}
|
39
|
-
@log.info "client
|
41
|
+
@log.info "client #{@ip} checking status - reply: #{reply}"
|
40
42
|
@client.write "#{reply}\r\n"
|
41
43
|
active = false
|
42
44
|
else
|
43
45
|
command = command.unpack('c*')
|
44
46
|
@log.debug "header: #{TraceLog.hex command}" if @log.debug?
|
45
|
-
|
47
|
+
raise ClientDataError, "invalid pin" unless (command[3] & 0xFF) == config.pinLo and (command[4] & 0xFF) == config.pinHi
|
48
|
+
packetSize = (command[1] & 0xFF) | ((command[2] << 8) & 0xFF00)
|
49
|
+
raise ClientDataError, "invalid packet size" if packetSize < 7 or packetSize > 128
|
46
50
|
command += read(packetSize - 5).unpack('c*')
|
47
51
|
CommandQueue.instance.push @ip, command unless (command[0] & 0xFF) == 0x93
|
48
52
|
@status.get { @client.write @status.raw.pack('c*') if @status.valid }
|
@@ -50,10 +54,10 @@ module Sappho
|
|
50
54
|
end
|
51
55
|
end
|
52
56
|
rescue Timeout::Error
|
53
|
-
@log.info "
|
57
|
+
@log.info "timeout on client #{@ip} so presuming it dormant"
|
54
58
|
active = false
|
55
|
-
rescue
|
56
|
-
@log.info "
|
59
|
+
rescue ClientDataError => error
|
60
|
+
@log.info "data error from client #{@ip}: #{error.message}"
|
57
61
|
active = false
|
58
62
|
rescue => error
|
59
63
|
@log.error error
|
@@ -69,11 +73,11 @@ module Sappho
|
|
69
73
|
|
70
74
|
def read size
|
71
75
|
data = @client.read size
|
72
|
-
raise
|
76
|
+
raise ClientDataError, "nothing received so presuming it has disconnected" unless data and data.size == size
|
73
77
|
data
|
74
78
|
end
|
75
79
|
|
76
|
-
class
|
80
|
+
class ClientDataError < Interrupt
|
77
81
|
end
|
78
82
|
|
79
83
|
end
|
@@ -14,10 +14,14 @@ module Sappho
|
|
14
14
|
|
15
15
|
include Singleton
|
16
16
|
|
17
|
-
attr_reader :config
|
17
|
+
attr_reader :config, :port, :pinLo, :pinHi
|
18
18
|
|
19
19
|
def initialize
|
20
20
|
@config = YAML.load_file(File.expand_path(ARGV[0] || 'heatmiser-proxy.yml'))
|
21
|
+
@port = Integer @config['heatmiser.port']
|
22
|
+
pin = Integer @config['heatmiser.pin']
|
23
|
+
@pinLo = pin & 0xFF
|
24
|
+
@pinHi = (pin >> 8) & 0xFF
|
21
25
|
end
|
22
26
|
|
23
27
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sappho-heatmiser-proxy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 8
|
10
|
+
version: 0.0.8
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Andrew Heald
|