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 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: []