somfy_sdn 2.1.0 → 2.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/sdn/cli/mqtt.rb +36 -25
- data/lib/sdn/client.rb +13 -1
- data/lib/sdn/version.rb +1 -1
- metadata +8 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 636b137221c1ccd49cd089e38447f59625be071352da630a61bb3b85c73a9b93
|
4
|
+
data.tar.gz: cd9bd4040fe5b209d56c7e1a7c70ee98f068b3da044e3f82ac3680fceafac781
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 612535efe5bb8cbe7191e8b8ac318a4192def9689743f0387df25e7c75a86856457ba97dc8693b6329bdbc45024f66068c5838b651b0af834eddc075d98f62a5
|
7
|
+
data.tar.gz: 81eaced8fc720b9ba2b3a11b9578d13691038fc2962a4a4940fecc5fc710488860ea1bc04293ebcb0ea7f56c4851f833992fea6f00f40d6b366132e2fcebb527
|
data/lib/sdn/cli/mqtt.rb
CHANGED
@@ -25,7 +25,7 @@ module SDN
|
|
25
25
|
def initialize(port, mqtt_uri, device_id: "somfy", base_topic: "homie", auto_discover: true)
|
26
26
|
@base_topic = "#{base_topic}/#{device_id}"
|
27
27
|
@mqtt = ::MQTT::Client.new(mqtt_uri)
|
28
|
-
@mqtt.set_will("#{@base_topic}/$state", "lost", true)
|
28
|
+
@mqtt.set_will("#{@base_topic}/$state", "lost", retain: true)
|
29
29
|
@mqtt.connect
|
30
30
|
|
31
31
|
@motors = {}
|
@@ -45,9 +45,10 @@ module SDN
|
|
45
45
|
|
46
46
|
@sdn = Client.new(port)
|
47
47
|
|
48
|
+
Thread.abort_on_exception = true
|
48
49
|
read_thread = Thread.new { read }
|
49
50
|
write_thread = Thread.new { write }
|
50
|
-
@mqtt.get { |
|
51
|
+
@mqtt.get { |packet| handle_message(packet.topic, packet.payload) }
|
51
52
|
end
|
52
53
|
|
53
54
|
def publish(topic, value)
|
@@ -72,14 +73,14 @@ module SDN
|
|
72
73
|
@mqtt.subscribe("#{topic}/#")
|
73
74
|
@mqtt.unsubscribe("#{topic}/#", wait_for_ack: true)
|
74
75
|
while !@mqtt.queue_empty?
|
75
|
-
|
76
|
-
@mqtt.publish(topic, nil, retain: true)
|
76
|
+
packet = @mqtt.get
|
77
|
+
@mqtt.publish(packet.topic, nil, retain: true)
|
77
78
|
end
|
78
79
|
end
|
79
80
|
|
80
81
|
def publish_basic_attributes
|
81
82
|
@mqtt.batch_publish do
|
82
|
-
publish("$homie", "
|
83
|
+
publish("$homie", "4.0.0")
|
83
84
|
publish("$name", "Somfy SDN Network")
|
84
85
|
publish("$state", "init")
|
85
86
|
publish("$nodes", "FFFFFF")
|
@@ -94,29 +95,39 @@ module SDN
|
|
94
95
|
publish("FFFFFF/discover/$settable", "true")
|
95
96
|
publish("FFFFFF/discover/$retained", "false")
|
96
97
|
|
97
|
-
|
98
|
-
subscribe("+/label/set")
|
99
|
-
subscribe("+/control/set")
|
100
|
-
subscribe("+/jog-ms/set")
|
101
|
-
subscribe("+/jog-pulses/set")
|
102
|
-
subscribe("+/position-pulses/set")
|
103
|
-
subscribe("+/position-percent/set")
|
104
|
-
subscribe("+/ip/set")
|
105
|
-
subscribe("+/reset/set")
|
106
|
-
subscribe("+/direction/set")
|
107
|
-
subscribe("+/up-speed/set")
|
108
|
-
subscribe("+/down-speed/set")
|
109
|
-
subscribe("+/slow-speed/set")
|
110
|
-
subscribe("+/up-limit/set")
|
111
|
-
subscribe("+/down-limit/set")
|
112
|
-
subscribe("+/groups/set")
|
113
|
-
(1..16).each do |ip|
|
114
|
-
subscribe("+/ip#{ip}-pulses/set")
|
115
|
-
subscribe("+/ip#{ip}-percent/set")
|
116
|
-
end
|
98
|
+
subscribe_all
|
117
99
|
|
118
100
|
publish("$state", "ready")
|
119
101
|
end
|
102
|
+
|
103
|
+
@mqtt.on_reconnect do
|
104
|
+
subscribe_all
|
105
|
+
publish("$state", :init)
|
106
|
+
publish("$state", :ready)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def subscribe_all
|
111
|
+
subscribe("+/discover/set")
|
112
|
+
subscribe("+/label/set")
|
113
|
+
subscribe("+/control/set")
|
114
|
+
subscribe("+/jog-ms/set")
|
115
|
+
subscribe("+/jog-pulses/set")
|
116
|
+
subscribe("+/position-pulses/set")
|
117
|
+
subscribe("+/position-percent/set")
|
118
|
+
subscribe("+/ip/set")
|
119
|
+
subscribe("+/reset/set")
|
120
|
+
subscribe("+/direction/set")
|
121
|
+
subscribe("+/up-speed/set")
|
122
|
+
subscribe("+/down-speed/set")
|
123
|
+
subscribe("+/slow-speed/set")
|
124
|
+
subscribe("+/up-limit/set")
|
125
|
+
subscribe("+/down-limit/set")
|
126
|
+
subscribe("+/groups/set")
|
127
|
+
(1..16).each do |ip|
|
128
|
+
subscribe("+/ip#{ip}-pulses/set")
|
129
|
+
subscribe("+/ip#{ip}-percent/set")
|
130
|
+
end
|
120
131
|
end
|
121
132
|
|
122
133
|
def publish_motor(addr, node_type)
|
data/lib/sdn/client.rb
CHANGED
@@ -58,18 +58,30 @@ module SDN
|
|
58
58
|
unless message
|
59
59
|
break unless messages.empty?
|
60
60
|
|
61
|
+
# one EOF is just serial ports saying they have no data;
|
62
|
+
# several EOFs in a row is the file is dead and gone
|
63
|
+
eofs = 0
|
61
64
|
begin
|
62
65
|
block = @io.read_nonblock(64 * 1024)
|
63
66
|
SDN.logger.debug "read #{block.unpack("H*").first.gsub(/\h{2}/, "\\0 ")}"
|
64
67
|
@buffer.concat(block)
|
65
68
|
next
|
66
|
-
rescue IO::WaitReadable, EOFError
|
69
|
+
rescue IO::WaitReadable, EOFError => e
|
70
|
+
if e.is_a?(EOFError)
|
71
|
+
eofs += 1
|
72
|
+
else
|
73
|
+
eofs = 0
|
74
|
+
end
|
75
|
+
raise if eofs == 5
|
76
|
+
|
67
77
|
wait = @buffer.empty? ? timeout : WAIT_TIME
|
68
78
|
if @io.wait_readable(wait).nil?
|
69
79
|
# timed out; just discard everything
|
70
80
|
SDN.logger.debug "discarding #{@buffer.unpack("H*").first.gsub(/\h{2}/, "\\0 ")} due to timeout"
|
71
81
|
@buffer = ""
|
72
82
|
end
|
83
|
+
|
84
|
+
retry
|
73
85
|
end
|
74
86
|
next
|
75
87
|
end
|
data/lib/sdn/version.rb
CHANGED
metadata
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: somfy_sdn
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cody Cutrer
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-01-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name: ccutrer
|
14
|
+
name: mqtt-ccutrer
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
@@ -108,7 +108,7 @@ dependencies:
|
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '13.0'
|
111
|
-
description:
|
111
|
+
description:
|
112
112
|
email: cody@cutrer.com'
|
113
113
|
executables:
|
114
114
|
- somfy_sdn
|
@@ -142,7 +142,7 @@ homepage: https://github.com/ccutrer/somfy_sdn
|
|
142
142
|
licenses:
|
143
143
|
- MIT
|
144
144
|
metadata: {}
|
145
|
-
post_install_message:
|
145
|
+
post_install_message:
|
146
146
|
rdoc_options: []
|
147
147
|
require_paths:
|
148
148
|
- lib
|
@@ -157,8 +157,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
157
157
|
- !ruby/object:Gem::Version
|
158
158
|
version: '0'
|
159
159
|
requirements: []
|
160
|
-
rubygems_version: 3.1.
|
161
|
-
signing_key:
|
160
|
+
rubygems_version: 3.1.2
|
161
|
+
signing_key:
|
162
162
|
specification_version: 4
|
163
163
|
summary: Library for communication with Somfy SDN RS-485 motorized shades
|
164
164
|
test_files: []
|