somfy_sdn 2.1.0 → 2.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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: []
|