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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: df44cc648ee7fa0079f6067deee6b8fa488c1cbdc31acc252d9803eb1a32cdf3
4
- data.tar.gz: 17cda1e8629bc58d88cb202286a7d9b5bb4d88de28d3a9c133c669796b979c60
3
+ metadata.gz: 636b137221c1ccd49cd089e38447f59625be071352da630a61bb3b85c73a9b93
4
+ data.tar.gz: cd9bd4040fe5b209d56c7e1a7c70ee98f068b3da044e3f82ac3680fceafac781
5
5
  SHA512:
6
- metadata.gz: 7915001ae78047ac6e0669d2f362bcb165db06fe6ca29c8a155150c04093044abd9f158b89ee81c836dcece92114a60a39ca139f30317791f08bb99a132b5ad1
7
- data.tar.gz: 7f97633393e8daeefdf9bafb8e12f4534e1c724939b161357543df808a630815ff34dc42af5fc172dc45d09101bf9bf4bccd24fb53cb181eebb37447287bd32e
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 { |topic, value| handle_message(topic, value) }
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
- topic, value = @mqtt.get
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", "v4.0.0")
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
- subscribe("+/discover/set")
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
@@ -1,3 +1,3 @@
1
1
  module SDN
2
- VERSION = '2.1.0'
2
+ VERSION = '2.1.4'
3
3
  end
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.0
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: 2021-02-16 00:00:00.000000000 Z
11
+ date: 2022-01-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: ccutrer-mqtt
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.4
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: []