somfy_sdn 2.3.3 → 2.4.1

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: 56cba5482b3b557eca27f00d01dc5664f1ec3d38f2392b0dc9433fce98bf1e9f
4
- data.tar.gz: e2bdc5db2364b924d2487741351ceed052f89cd8653b1a362f907eae8115160b
3
+ metadata.gz: 9e1e1adfb127498d09f9df75ebcbe479aef58ee8412f4a9cb977d8b11e45b119
4
+ data.tar.gz: 140db72e519d25a12028f901f0287ee6a41fd7c6071f25df406fd115616883ab
5
5
  SHA512:
6
- metadata.gz: 66b9d45f728a44d2ad04347110265aa13e515c904735aa874fef32abe1e0c1d5d9e93eff6a91fa27013623ed8607334d03d9d757da485ea231ad4963303726c0
7
- data.tar.gz: 75377942f774df2292445cdde5a17891eaca546a6a20bbc899f0fdf3635c46d0e25f71d7807b15bed7c5b2f25638bb78699d43a638a9266ed3c0ce977fd378bb
6
+ metadata.gz: e42ed8ef8086f84247e70743e73f3d4f1dccc2a83e541d4f88bb2bb7d719f85ff16c95375de660e4398adc305517e76e43d766a9bf84de8f9247e32d1bc2fceb
7
+ data.tar.gz: 879ab6fc00ba20c2c0b0bc1946ab2760702c791fc458955b65cc2c27db4687ccb8d95d112aedce0953f10e2d7ba88f7e54d20998e89bbd3519c0230971a79b7c
data/exe/somfy_sdn CHANGED
@@ -27,6 +27,8 @@ class SomfySDNCLI < Thor
27
27
  option :"base-topic", default: "homie", desc: "The base Homie topic"
28
28
  option :"auto-discover", type: :boolean, default: true, desc: "Do a discovery at startup"
29
29
  option :address, type: :array, desc: "Specify a known motor address to speed discovery"
30
+ option :homie, type: :boolean, desc: "Enable Homie discovery", default: true
31
+ option :"home-assistant", type: :boolean, desc: "Enable Home Assistant discovery", default: true
30
32
  def mqtt(port, mqtt_uri)
31
33
  sdn = handle_global_options(port)
32
34
 
@@ -37,7 +39,9 @@ class SomfySDNCLI < Thor
37
39
  device_id: options["device-id"],
38
40
  base_topic: options["base-topic"],
39
41
  auto_discover: options["auto-discover"],
40
- known_motors: options["address"])
42
+ known_motors: options["address"],
43
+ homie: options["homie"],
44
+ home_assistant: options["home-assistant"])
41
45
  end
42
46
 
43
47
  desc "provision PORT [ADDRESS]", "Provision a motor (label and set limits) at PORT"
@@ -19,7 +19,7 @@ module SDN
19
19
  follow_ups = []
20
20
  case message
21
21
  when Message::PostNodeLabel
22
- publish("#{motor.addr}/$name", message.label) if motor.publish(:label, message.label)
22
+ publish("#{motor.addr}/$name", message.label) if motor.publish(:label, message.label) && @homie
23
23
  when Message::PostMotorPosition,
24
24
  Message::ILT2::PostMotorPosition
25
25
  if message.is_a?(Message::ILT2::PostMotorPosition)
data/lib/sdn/cli/mqtt.rb CHANGED
@@ -32,13 +32,23 @@ module SDN
32
32
  device_id: "somfy",
33
33
  base_topic: "homie",
34
34
  auto_discover: true,
35
- known_motors: [])
35
+ known_motors: [],
36
+ homie: true,
37
+ home_assistant: true)
38
+ @homie = homie
39
+ @home_assistant = home_assistant
36
40
  @base_topic = "#{base_topic}/#{device_id}"
37
41
  @device_id = device_id
38
42
  @mqtt = ::MQTT::Client.new(mqtt_uri)
39
43
  @mqtt.set_will("#{@base_topic}/$state", "lost", retain: true)
40
44
  @mqtt.connect
41
45
 
46
+ @availability = [{
47
+ topic: "#{@base_topic}/$state",
48
+ payload_available: "ready",
49
+ payload_not_available: "lost"
50
+ }.freeze].freeze
51
+
42
52
  @motors = {}
43
53
  @groups = {}
44
54
 
@@ -95,35 +105,40 @@ module SDN
95
105
 
96
106
  def publish_basic_attributes
97
107
  @mqtt.batch_publish do
98
- publish("$homie", "4.0.0")
99
- publish("$name", "Somfy SDN Network")
100
- publish("$state", "init")
101
- publish("$nodes", "FFFFFF")
102
-
103
- publish("FFFFFF/$name", "Broadcast")
104
- publish("FFFFFF/$type", "sdn")
105
- publish("FFFFFF/$properties", "discover")
106
-
107
- publish("FFFFFF/discover/$name", "Trigger Motor Discovery")
108
- publish("FFFFFF/discover/$datatype", "enum")
109
- publish("FFFFFF/discover/$format", "discover")
110
- publish("FFFFFF/discover/$settable", "true")
111
- publish("FFFFFF/discover/$retained", "false")
108
+ if @homie
109
+ publish("$homie", "4.0.0")
110
+ publish("$name", "Somfy SDN Network")
111
+ publish("$state", "init")
112
+ publish("$nodes", "FFFFFF")
113
+
114
+ publish("FFFFFF/$name", "Broadcast")
115
+ publish("FFFFFF/$type", "sdn")
116
+ publish("FFFFFF/$properties", "discover")
117
+
118
+ publish("FFFFFF/discover/$name", "Trigger Motor Discovery")
119
+ publish("FFFFFF/discover/$datatype", "enum")
120
+ publish("FFFFFF/discover/$format", "discover")
121
+ publish("FFFFFF/discover/$settable", "true")
122
+ publish("FFFFFF/discover/$retained", "false")
123
+ end
112
124
 
113
- hass_device = {
114
- name: "Somfy SDN Bridge",
115
- identifiers: @device_id,
116
- sw_version: SDN::VERSION
117
- }
118
- @mqtt.publish_hass_button("discover",
119
- command_topic: "#{@base_topic}/FFFFFF/discover/set",
120
- device: hass_device,
121
- icon: "mdi:search-add",
122
- name: "Discover Motors",
123
- node_id: @device_id,
124
- object_id: "discover",
125
- unique_id: "#{@device_id}_discover",
126
- payload_press: "true")
125
+ if @home_assistant
126
+ hass_device = {
127
+ name: "Somfy SDN Bridge",
128
+ identifiers: @device_id,
129
+ sw_version: SDN::VERSION
130
+ }
131
+ @mqtt.publish_hass_button("discover",
132
+ command_topic: "#{@base_topic}/FFFFFF/discover/set",
133
+ device: hass_device,
134
+ icon: "mdi:search-add",
135
+ name: "Discover Motors",
136
+ node_id: @device_id,
137
+ object_id: "discover",
138
+ unique_id: "#{@device_id}_discover",
139
+ payload_press: "true",
140
+ availability: @availability)
141
+ end
127
142
 
128
143
  subscribe_all
129
144
 
@@ -172,8 +187,10 @@ module SDN
172
187
  }
173
188
  node_id = "#{@device_id}_#{addr}"
174
189
 
175
- publish("#{addr}/$name", addr)
176
- publish("#{addr}/$type", node_type.to_s)
190
+ if @homie
191
+ publish("#{addr}/$name", addr)
192
+ publish("#{addr}/$type", node_type.to_s)
193
+ end
177
194
  properties = %w[
178
195
  discover
179
196
  label
@@ -200,313 +217,388 @@ module SDN
200
217
  "slow-speed")
201
218
  end
202
219
 
203
- publish("#{addr}/$properties", properties.join(","))
220
+ if @homie
221
+ publish("#{addr}/$properties", properties.join(","))
204
222
 
205
- publish("#{addr}/discover/$name", "Trigger Motor Discovery")
206
- publish("#{addr}/discover/$datatype", "enum")
207
- publish("#{addr}/discover/$format", "discover")
208
- publish("#{addr}/discover/$settable", "true")
209
- publish("#{addr}/discover/$retained", "false")
223
+ publish("#{addr}/discover/$name", "Trigger Motor Discovery")
224
+ publish("#{addr}/discover/$datatype", "enum")
225
+ publish("#{addr}/discover/$format", "discover")
226
+ publish("#{addr}/discover/$settable", "true")
227
+ publish("#{addr}/discover/$retained", "false")
228
+ end
210
229
 
211
- @mqtt.publish_hass_button("discover",
212
- command_topic: "#{@base_topic}/#{addr}/discover/set",
213
- device: hass_device,
214
- icon: "mdi:search-add",
215
- name: "Rediscover",
216
- node_id: node_id,
217
- object_id: "discover",
218
- payload_press: "true",
219
- unique_id: "#{node_id}_discover")
220
-
221
- publish("#{addr}/label/$name", "Node label")
222
- publish("#{addr}/label/$datatype", "string")
223
- publish("#{addr}/label/$settable", "true")
224
- @mqtt.publish_hass_text("label",
225
- command_topic: "#{@base_topic}/#{addr}/label/set",
226
- device: hass_device,
227
- entity_category: :config,
228
- icon: "mdi:rename",
229
- max: 16,
230
- name: "Label",
231
- node_id: node_id,
232
- unique_id: "#{node_id}_label")
233
-
234
- publish("#{addr}/state/$name", "Current state of the motor")
235
- publish("#{addr}/state/$datatype", "enum")
236
- publish("#{addr}/state/$format", Message::PostMotorStatus::STATE.keys.join(","))
237
-
238
- publish("#{addr}/control/$name", "Control motor")
239
- publish("#{addr}/control/$datatype", "enum")
240
- publish("#{addr}/control/$format", "up,down,stop,wink,next_ip,previous_ip,refresh")
241
- publish("#{addr}/control/$settable", "true")
242
- publish("#{addr}/control/$retained", "false")
243
-
244
- publish("#{addr}/jog-ms/$name", "Jog motor by ms")
245
- publish("#{addr}/jog-ms/$datatype", "integer")
246
- publish("#{addr}/jog-ms/$format", "-65535:65535")
247
- publish("#{addr}/jog-ms/$unit", "ms")
248
- publish("#{addr}/jog-ms/$settable", "true")
249
- publish("#{addr}/jog-ms/$retained", "false")
250
-
251
- publish("#{addr}/jog-pulses/$name", "Jog motor by pulses")
252
- publish("#{addr}/jog-pulses/$datatype", "integer")
253
- publish("#{addr}/jog-pulses/$format", "-65535:65535")
254
- publish("#{addr}/jog-pulses/$unit", "pulses")
255
- publish("#{addr}/jog-pulses/$settable", "true")
256
- publish("#{addr}/jog-pulses/$retained", "false")
257
-
258
- publish("#{addr}/position-percent/$name", "Position (in %)")
259
- publish("#{addr}/position-percent/$datatype", "integer")
260
- publish("#{addr}/position-percent/$format", "0:100")
261
- publish("#{addr}/position-percent/$unit", "%")
262
- publish("#{addr}/position-percent/$settable", "true")
263
-
264
- @mqtt.publish_hass_cover("motor",
265
- command_topic: "#{@base_topic}/#{addr}/control/set",
266
- device: hass_device,
267
- icon: "mdi:roller-shade",
268
- name: "Motor",
269
- node_id: node_id,
270
- payload_close: "down",
271
- payload_open: "up",
272
- payload_stop: "stop",
273
- position_open: 0,
274
- position_closed: 100,
275
- position_topic: "#{@base_topic}/#{addr}/position-percent",
276
- set_position_topic: "#{@base_topic}/#{addr}/position-percent/set",
277
- state_topic: "#{@base_topic}/#{addr}/hass-state",
278
- unique_id: "#{node_id}_motor")
279
- {
280
- Wink: "mdi:emoticon-wink",
281
- Next_IP: "mdi:skip-next",
282
- Previous_IP: "mdi:skip-previous",
283
- Refresh: "mdi:refresh"
284
- }.each do |command, icon|
285
- @mqtt.publish_hass_button(command.to_s.downcase,
286
- command_topic: "#{@base_topic}/#{addr}/control/set",
230
+ if @home_assistant
231
+ @mqtt.publish_hass_button("discover",
232
+ command_topic: "#{@base_topic}/#{addr}/discover/set",
287
233
  device: hass_device,
288
- icon: icon,
289
- name: command.to_s.sub("_", " "),
234
+ icon: "mdi:search-add",
235
+ name: "Rediscover",
290
236
  node_id: node_id,
291
- payload_press: command.to_s.downcase,
292
- unique_id: "#{node_id}_#{command.to_s.downcase}")
237
+ object_id: "discover",
238
+ payload_press: "true",
239
+ unique_id: "#{node_id}_discover",
240
+ availability: @availability)
293
241
  end
294
242
 
295
- publish("#{addr}/position-pulses/$name", "Position from up limit (in pulses)")
296
- publish("#{addr}/position-pulses/$datatype", "integer")
297
- publish("#{addr}/position-pulses/$format", "0:65535")
298
- publish("#{addr}/position-pulses/$unit", "pulses")
299
- publish("#{addr}/position-pulses/$settable", "true")
243
+ if @homie
244
+ publish("#{addr}/label/$name", "Node label")
245
+ publish("#{addr}/label/$datatype", "string")
246
+ publish("#{addr}/label/$settable", "true")
247
+ end
300
248
 
301
- @mqtt.publish_hass_number("position-pulses",
302
- command_topic: "#{@base_topic}/#{addr}/position-pulses/set",
303
- device: hass_device,
304
- enabled_by_default: false,
305
- max: 65_536,
306
- min: 0,
307
- name: "Position (Pulses)",
308
- node_id: node_id,
309
- object_id: "position-pulses",
310
- state_topic: "#{@base_topic}/#{addr}/position-pulses",
311
- step: 10,
312
- unit_of_measurement: "pulses",
313
- unique_id: "#{node_id}_position-pulses")
314
-
315
- publish("#{addr}/ip/$name", "Intermediate Position")
316
- publish("#{addr}/ip/$datatype", "integer")
317
- publish("#{addr}/ip/$format", "1:16")
318
- publish("#{addr}/ip/$settable", "true")
319
- publish("#{addr}/ip/$retained", "false") if node_type == :st50ilt2
320
-
321
- @mqtt.publish_hass_number("ip",
322
- command_topic: "#{@base_topic}/#{addr}/ip/set",
323
- device: hass_device,
324
- name: "Intermediate Position",
325
- max: 16,
326
- min: 0,
327
- node_id: node_id,
328
- object_id: "ip",
329
- payload_reset: "",
330
- state_topic: "#{@base_topic}/#{addr}/ip",
331
- unique_id: "#{node_id}_ip")
332
-
333
- publish("#{addr}/down-limit/$name", "Down limit")
334
- publish("#{addr}/down-limit/$datatype", "integer")
335
- publish("#{addr}/down-limit/$format", "0:65535")
336
- publish("#{addr}/down-limit/$unit", "pulses")
337
- publish("#{addr}/down-limit/$settable", "true")
338
-
339
- @mqtt.publish_hass_number("down-limit",
340
- command_topic: "#{@base_topic}/#{addr}/down-limit/set",
249
+ if @home_assistant
250
+ @mqtt.publish_hass_text("label",
251
+ command_topic: "#{@base_topic}/#{addr}/label/set",
341
252
  device: hass_device,
342
253
  entity_category: :config,
343
- icon: "mdi:roller-shade-closed",
344
- max: 65_536,
345
- min: 0,
254
+ icon: "mdi:rename",
255
+ max: 16,
256
+ name: "Label",
346
257
  node_id: node_id,
347
- payload_reset: "",
348
- state_topic: "#{@base_topic}/#{addr}/down-limit",
349
- step: 10,
350
- unit_of_measurement: "pulses",
351
- unique_id: "#{node_id}_down-limit")
258
+ unique_id: "#{node_id}_label",
259
+ availability: @availability)
260
+ end
352
261
 
353
- publish("#{addr}/last-direction/$name", "Direction of last motion")
354
- publish("#{addr}/last-direction/$datatype", "enum")
355
- publish("#{addr}/last-direction/$format", Message::PostMotorStatus::DIRECTION.keys.join(","))
262
+ if @homie
263
+ publish("#{addr}/state/$name", "Current state of the motor")
264
+ publish("#{addr}/state/$datatype", "enum")
265
+ publish("#{addr}/state/$format", Message::PostMotorStatus::STATE.keys.join(","))
266
+
267
+ publish("#{addr}/control/$name", "Control motor")
268
+ publish("#{addr}/control/$datatype", "enum")
269
+ publish("#{addr}/control/$format", "up,down,stop,wink,next_ip,previous_ip,refresh")
270
+ publish("#{addr}/control/$settable", "true")
271
+ publish("#{addr}/control/$retained", "false")
272
+
273
+ publish("#{addr}/jog-ms/$name", "Jog motor by ms")
274
+ publish("#{addr}/jog-ms/$datatype", "integer")
275
+ publish("#{addr}/jog-ms/$format", "-65535:65535")
276
+ publish("#{addr}/jog-ms/$unit", "ms")
277
+ publish("#{addr}/jog-ms/$settable", "true")
278
+ publish("#{addr}/jog-ms/$retained", "false")
279
+
280
+ publish("#{addr}/jog-pulses/$name", "Jog motor by pulses")
281
+ publish("#{addr}/jog-pulses/$datatype", "integer")
282
+ publish("#{addr}/jog-pulses/$format", "-65535:65535")
283
+ publish("#{addr}/jog-pulses/$unit", "pulses")
284
+ publish("#{addr}/jog-pulses/$settable", "true")
285
+ publish("#{addr}/jog-pulses/$retained", "false")
286
+
287
+ publish("#{addr}/position-percent/$name", "Position (in %)")
288
+ publish("#{addr}/position-percent/$datatype", "integer")
289
+ publish("#{addr}/position-percent/$format", "0:100")
290
+ publish("#{addr}/position-percent/$unit", "%")
291
+ publish("#{addr}/position-percent/$settable", "true")
292
+ end
356
293
 
357
- unless node_type == :st50ilt2
358
- publish("#{addr}/reset/$name", "Recall factory settings")
359
- publish("#{addr}/reset/$datatype", "enum")
360
- publish("#{addr}/reset/$format", Message::SetFactoryDefault::RESET.keys.join(","))
361
- publish("#{addr}/reset/$settable", "true")
362
- publish("#{addr}/reset/$retained", "false")
363
-
364
- Message::SetFactoryDefault::RESET.each_key do |key|
365
- @mqtt.publish_hass_button("reset_#{key}",
366
- command_topic: "#{@base_topic}/#{addr}/reset/set",
294
+ if @home_assistant
295
+ @mqtt.publish_hass_cover("motor",
296
+ command_topic: "#{@base_topic}/#{addr}/control/set",
297
+ device: hass_device,
298
+ icon: "mdi:roller-shade",
299
+ name: "Motor",
300
+ node_id: node_id,
301
+ payload_close: "down",
302
+ payload_open: "up",
303
+ payload_stop: "stop",
304
+ position_open: 0,
305
+ position_closed: 100,
306
+ position_topic: "#{@base_topic}/#{addr}/position-percent",
307
+ set_position_topic: "#{@base_topic}/#{addr}/position-percent/set",
308
+ state_topic: "#{@base_topic}/#{addr}/hass-state",
309
+ unique_id: "#{node_id}_motor",
310
+ availability: @availability)
311
+ {
312
+ Wink: "mdi:emoticon-wink",
313
+ Next_IP: "mdi:skip-next",
314
+ Previous_IP: "mdi:skip-previous",
315
+ Refresh: "mdi:refresh"
316
+ }.each do |command, icon|
317
+ @mqtt.publish_hass_button(command.to_s.downcase,
318
+ command_topic: "#{@base_topic}/#{addr}/control/set",
367
319
  device: hass_device,
368
- enabled_by_default: false,
369
- entity_category: :config,
370
- name: "Reset #{key.to_s.sub("_", " ")}",
320
+ icon: icon,
321
+ name: command.to_s.sub("_", " "),
371
322
  node_id: node_id,
372
- payload_press: key,
373
- unique_id: "#{node_id}_#{key}")
323
+ payload_press: command.to_s.downcase,
324
+ unique_id: "#{node_id}_#{command.to_s.downcase}",
325
+ availability: @availability)
374
326
  end
327
+ end
375
328
 
376
- publish("#{addr}/last-action-source/$name", "Source of last action")
377
- publish("#{addr}/last-action-source/$datatype", "enum")
378
- publish("#{addr}/last-action-source/$format", Message::PostMotorStatus::SOURCE.keys.join(","))
329
+ if @homie
330
+ publish("#{addr}/position-pulses/$name", "Position from up limit (in pulses)")
331
+ publish("#{addr}/position-pulses/$datatype", "integer")
332
+ publish("#{addr}/position-pulses/$format", "0:65535")
333
+ publish("#{addr}/position-pulses/$unit", "pulses")
334
+ publish("#{addr}/position-pulses/$settable", "true")
335
+ end
379
336
 
380
- @mqtt.publish_hass_sensor("last-action-source",
337
+ if @home_assistant
338
+ @mqtt.publish_hass_number("position-pulses",
339
+ command_topic: "#{@base_topic}/#{addr}/position-pulses/set",
381
340
  device: hass_device,
382
- device_class: :enum,
383
- entity_category: :diagnostic,
384
- name: "Source of last action",
341
+ enabled_by_default: false,
342
+ max: 65_536,
343
+ min: 0,
344
+ name: "Position (Pulses)",
385
345
  node_id: node_id,
386
- object_id: "last-action-source",
387
- options: Message::PostMotorStatus::SOURCE.keys,
388
- state_topic: "#{@base_topic}/#{addr}/last-action-source",
389
- unique_id: "#{node_id}_last-action-source")
346
+ object_id: "position-pulses",
347
+ state_topic: "#{@base_topic}/#{addr}/position-pulses",
348
+ step: 10,
349
+ unit_of_measurement: "pulses",
350
+ unique_id: "#{node_id}_position-pulses",
351
+ availability: @availability)
352
+ end
390
353
 
391
- publish("#{addr}/last-action-cause/$name", "Cause of last action")
392
- publish("#{addr}/last-action-cause/$datatype", "enum")
393
- publish("#{addr}/last-action-cause/$format", Message::PostMotorStatus::CAUSE.keys.join(","))
354
+ if @homie
355
+ publish("#{addr}/ip/$name", "Intermediate Position")
356
+ publish("#{addr}/ip/$datatype", "integer")
357
+ publish("#{addr}/ip/$format", "1:16")
358
+ publish("#{addr}/ip/$settable", "true")
359
+ publish("#{addr}/ip/$retained", "false") if node_type == :st50ilt2
360
+ end
394
361
 
395
- @mqtt.publish_hass_sensor("last-action-cause",
362
+ if @home_assistant
363
+ @mqtt.publish_hass_number("ip",
364
+ command_topic: "#{@base_topic}/#{addr}/ip/set",
396
365
  device: hass_device,
397
- device_class: :enum,
398
- entity_category: :diagnostic,
399
- name: "Cause of last action",
366
+ name: "Intermediate Position",
367
+ max: 16,
368
+ min: 0,
400
369
  node_id: node_id,
401
- object_id: "last-action-cause",
402
- options: Message::PostMotorStatus::CAUSE.keys,
403
- state_topic: "#{@base_topic}/#{addr}/last-action-cause",
404
- unique_id: "#{node_id}_last-action-cause")
405
-
406
- publish("#{addr}/up-limit/$name", "Up limit (always = 0)")
407
- publish("#{addr}/up-limit/$datatype", "integer")
408
- publish("#{addr}/up-limit/$format", "0:65535")
409
- publish("#{addr}/up-limit/$unit", "pulses")
410
- publish("#{addr}/up-limit/$settable", "true")
411
-
412
- @mqtt.publish_hass_number("up-limit",
413
- command_topic: "#{@base_topic}/#{addr}/up-limit/set",
370
+ object_id: "ip",
371
+ payload_reset: "",
372
+ state_topic: "#{@base_topic}/#{addr}/ip",
373
+ unique_id: "#{node_id}_ip",
374
+ availability: @availability)
375
+ end
376
+
377
+ if @homie
378
+ publish("#{addr}/down-limit/$name", "Down limit")
379
+ publish("#{addr}/down-limit/$datatype", "integer")
380
+ publish("#{addr}/down-limit/$format", "0:65535")
381
+ publish("#{addr}/down-limit/$unit", "pulses")
382
+ publish("#{addr}/down-limit/$settable", "true")
383
+ end
384
+
385
+ if @home_assistant
386
+ @mqtt.publish_hass_number("down-limit",
387
+ command_topic: "#{@base_topic}/#{addr}/down-limit/set",
414
388
  device: hass_device,
415
389
  entity_category: :config,
416
- icon: "mdi:roller-shade-open",
390
+ icon: "mdi:roller-shade-closed",
417
391
  max: 65_536,
418
392
  min: 0,
419
- name: "Up Limit",
420
393
  node_id: node_id,
421
394
  payload_reset: "",
422
- state_topic: "#{@base_topic}/#{addr}/up-limit",
395
+ state_topic: "#{@base_topic}/#{addr}/down-limit",
423
396
  step: 10,
424
397
  unit_of_measurement: "pulses",
425
- unique_id: "#{node_id}_up-limit")
398
+ unique_id: "#{node_id}_down-limit",
399
+ availability: @availability)
400
+ end
426
401
 
427
- publish("#{addr}/direction/$name", "Motor rotation direction")
428
- publish("#{addr}/direction/$datatype", "enum")
429
- publish("#{addr}/direction/$format", "standard,reversed")
430
- publish("#{addr}/direction/$settable", "true")
402
+ if @homie
403
+ publish("#{addr}/last-direction/$name", "Direction of last motion")
404
+ publish("#{addr}/last-direction/$datatype", "enum")
405
+ publish("#{addr}/last-direction/$format", Message::PostMotorStatus::DIRECTION.keys.join(","))
406
+ end
431
407
 
432
- @mqtt.publish_hass_select("direction",
433
- command_topic: "#{@base_topic}/#{addr}/direction/set",
434
- device: hass_device,
435
- entity_category: :config,
436
- icon: "mdi:circle-arrows",
437
- name: "Motor rotation direction",
438
- node_id: node_id,
439
- object_id: "direction",
440
- options: %w[standard reversed],
441
- state_topic: "#{@base_topic}/#{addr}/direction",
442
- unique_id: "#{node_id}_direction")
443
-
444
- publish("#{addr}/up-speed/$name", "Up speed")
445
- publish("#{addr}/up-speed/$datatype", "integer")
446
- publish("#{addr}/up-speed/$format", "6:28")
447
- publish("#{addr}/up-speed/$unit", "RPM")
448
- publish("#{addr}/up-speed/$settable", "true")
449
-
450
- publish("#{addr}/down-speed/$name", "Down speed, always = Up speed")
451
- publish("#{addr}/down-speed/$datatype", "integer")
452
- publish("#{addr}/down-speed/$format", "6:28")
453
- publish("#{addr}/down-speed/$unit", "RPM")
454
- publish("#{addr}/down-speed/$settable", "true")
455
-
456
- publish("#{addr}/slow-speed/$name", "Slow speed")
457
- publish("#{addr}/slow-speed/$datatype", "integer")
458
- publish("#{addr}/slow-speed/$format", "6:28")
459
- publish("#{addr}/slow-speed/$unit", "RPM")
460
- publish("#{addr}/slow-speed/$settable", "true")
461
-
462
- %w[Up Slow].each do |speed_type|
463
- @mqtt.publish_hass_number("#{speed_type.downcase}-speed",
464
- command_topic: "#{@base_topic}/#{addr}/#{speed_type.downcase}-speed/set",
408
+ unless node_type == :st50ilt2
409
+ if @homie
410
+ publish("#{addr}/reset/$name", "Recall factory settings")
411
+ publish("#{addr}/reset/$datatype", "enum")
412
+ publish("#{addr}/reset/$format", Message::SetFactoryDefault::RESET.keys.join(","))
413
+ publish("#{addr}/reset/$settable", "true")
414
+ publish("#{addr}/reset/$retained", "false")
415
+ end
416
+
417
+ if @home_assistant
418
+ Message::SetFactoryDefault::RESET.each_key do |key|
419
+ @mqtt.publish_hass_button("reset_#{key}",
420
+ command_topic: "#{@base_topic}/#{addr}/reset/set",
421
+ device: hass_device,
422
+ enabled_by_default: false,
423
+ entity_category: :config,
424
+ name: "Reset #{key.to_s.sub("_", " ")}",
425
+ node_id: node_id,
426
+ payload_press: key,
427
+ unique_id: "#{node_id}_#{key}",
428
+ availability: @availability)
429
+ end
430
+ end
431
+
432
+ if @homie
433
+ publish("#{addr}/last-action-source/$name", "Source of last action")
434
+ publish("#{addr}/last-action-source/$datatype", "enum")
435
+ publish("#{addr}/last-action-source/$format", Message::PostMotorStatus::SOURCE.keys.join(","))
436
+ end
437
+
438
+ if @home_assistant
439
+ @mqtt.publish_hass_sensor("last-action-source",
440
+ device: hass_device,
441
+ device_class: :enum,
442
+ entity_category: :diagnostic,
443
+ name: "Source of last action",
444
+ node_id: node_id,
445
+ object_id: "last-action-source",
446
+ options: Message::PostMotorStatus::SOURCE.keys,
447
+ state_topic: "#{@base_topic}/#{addr}/last-action-source",
448
+ unique_id: "#{node_id}_last-action-source",
449
+ availability: @availability)
450
+ end
451
+
452
+ if @homie
453
+ publish("#{addr}/last-action-cause/$name", "Cause of last action")
454
+ publish("#{addr}/last-action-cause/$datatype", "enum")
455
+ publish("#{addr}/last-action-cause/$format", Message::PostMotorStatus::CAUSE.keys.join(","))
456
+ end
457
+
458
+ if @home_assistant
459
+ @mqtt.publish_hass_sensor("last-action-cause",
460
+ device: hass_device,
461
+ device_class: :enum,
462
+ entity_category: :diagnostic,
463
+ name: "Cause of last action",
464
+ node_id: node_id,
465
+ object_id: "last-action-cause",
466
+ options: Message::PostMotorStatus::CAUSE.keys,
467
+ state_topic: "#{@base_topic}/#{addr}/last-action-cause",
468
+ unique_id: "#{node_id}_last-action-cause",
469
+ availability: @availability)
470
+ end
471
+
472
+ if @homie
473
+ publish("#{addr}/up-limit/$name", "Up limit (always = 0)")
474
+ publish("#{addr}/up-limit/$datatype", "integer")
475
+ publish("#{addr}/up-limit/$format", "0:65535")
476
+ publish("#{addr}/up-limit/$unit", "pulses")
477
+ publish("#{addr}/up-limit/$settable", "true")
478
+ end
479
+
480
+ if @home_assistant
481
+ @mqtt.publish_hass_number("up-limit",
482
+ command_topic: "#{@base_topic}/#{addr}/up-limit/set",
465
483
  device: hass_device,
466
484
  entity_category: :config,
467
- icon: "mdi:car-speed-limiter",
468
- max: 28,
469
- min: 6,
470
- name: "#{speed_type} speed",
485
+ icon: "mdi:roller-shade-open",
486
+ max: 65_536,
487
+ min: 0,
488
+ name: "Up Limit",
471
489
  node_id: node_id,
472
- state_topic: "#{@base_topic}/#{addr}/#{speed_type.downcase}-speed",
473
- unit_of_measurement: "RPM",
474
- unique_id: "#{node_id}_#{speed_type.downcase}-speed")
490
+ payload_reset: "",
491
+ state_topic: "#{@base_topic}/#{addr}/up-limit",
492
+ step: 10,
493
+ unit_of_measurement: "pulses",
494
+ unique_id: "#{node_id}_up-limit",
495
+ availability: @availability)
496
+ end
497
+
498
+ if @homie
499
+ publish("#{addr}/direction/$name", "Motor rotation direction")
500
+ publish("#{addr}/direction/$datatype", "enum")
501
+ publish("#{addr}/direction/$format", "standard,reversed")
502
+ publish("#{addr}/direction/$settable", "true")
503
+ end
504
+
505
+ if @home_assistant
506
+ @mqtt.publish_hass_select("direction",
507
+ command_topic: "#{@base_topic}/#{addr}/direction/set",
508
+ device: hass_device,
509
+ entity_category: :config,
510
+ icon: "mdi:circle-arrows",
511
+ name: "Motor rotation direction",
512
+ node_id: node_id,
513
+ object_id: "direction",
514
+ options: %w[standard reversed],
515
+ state_topic: "#{@base_topic}/#{addr}/direction",
516
+ unique_id: "#{node_id}_direction",
517
+ availability: @availability)
518
+ end
519
+
520
+ if @homie
521
+ publish("#{addr}/up-speed/$name", "Up speed")
522
+ publish("#{addr}/up-speed/$datatype", "integer")
523
+ publish("#{addr}/up-speed/$format", "6:28")
524
+ publish("#{addr}/up-speed/$unit", "RPM")
525
+ publish("#{addr}/up-speed/$settable", "true")
526
+
527
+ publish("#{addr}/down-speed/$name", "Down speed, always = Up speed")
528
+ publish("#{addr}/down-speed/$datatype", "integer")
529
+ publish("#{addr}/down-speed/$format", "6:28")
530
+ publish("#{addr}/down-speed/$unit", "RPM")
531
+ publish("#{addr}/down-speed/$settable", "true")
532
+
533
+ publish("#{addr}/slow-speed/$name", "Slow speed")
534
+ publish("#{addr}/slow-speed/$datatype", "integer")
535
+ publish("#{addr}/slow-speed/$format", "6:28")
536
+ publish("#{addr}/slow-speed/$unit", "RPM")
537
+ publish("#{addr}/slow-speed/$settable", "true")
538
+ end
539
+
540
+ if @home_assistant
541
+ %w[Up Slow].each do |speed_type|
542
+ @mqtt.publish_hass_number("#{speed_type.downcase}-speed",
543
+ command_topic: "#{@base_topic}/#{addr}/#{speed_type.downcase}-speed/set",
544
+ device: hass_device,
545
+ entity_category: :config,
546
+ icon: "mdi:car-speed-limiter",
547
+ max: 28,
548
+ min: 6,
549
+ name: "#{speed_type} speed",
550
+ node_id: node_id,
551
+ state_topic: "#{@base_topic}/#{addr}/#{speed_type.downcase}-speed",
552
+ unit_of_measurement: "RPM",
553
+ unique_id: "#{node_id}_#{speed_type.downcase}-speed",
554
+ availability: @availability)
555
+ end
475
556
  end
476
557
  end
477
558
 
478
- publish("#{addr}/groups/$name", "Group Memberships (comma separated, address must start 0101xx)")
479
- publish("#{addr}/groups/$datatype", "string")
480
- publish("#{addr}/groups/$settable", "true")
559
+ if @homie
560
+ publish("#{addr}/groups/$name", "Group Memberships (comma separated, address must start 0101xx)")
561
+ publish("#{addr}/groups/$datatype", "string")
562
+ publish("#{addr}/groups/$settable", "true")
563
+ end
481
564
 
482
565
  (1..16).each do |ip|
483
- publish("#{addr}/ip#{ip}-pulses/$name", "Intermediate Position #{ip}")
484
- publish("#{addr}/ip#{ip}-pulses/$datatype", "integer")
485
- publish("#{addr}/ip#{ip}-pulses/$format", "0:65535")
486
- publish("#{addr}/ip#{ip}-pulses/$unit", "pulses")
487
- publish("#{addr}/ip#{ip}-pulses/$settable", "true")
488
-
489
- @mqtt.publish_hass_number("ip#{ip}-pulses",
490
- command_topic: "#{@base_topic}/#{addr}/ip#{ip}-pulses/set",
491
- device: hass_device,
492
- enabled_by_default: false,
493
- entity_category: :config,
494
- max: 65_536,
495
- min: 0,
496
- name: "Intermediation Position #{ip} (Pulses)",
497
- node_id: node_id,
498
- object_id: "ip#{ip}-pulses",
499
- payload_reset: "",
500
- state_topic: "#{@base_topic}/#{addr}/ip#{ip}-pulses",
501
- step: 10,
502
- unit_of_measurement: "pulses",
503
- unique_id: "#{node_id}_ip#{ip}-pulses")
566
+ if @homie
567
+ publish("#{addr}/ip#{ip}-pulses/$name", "Intermediate Position #{ip}")
568
+ publish("#{addr}/ip#{ip}-pulses/$datatype", "integer")
569
+ publish("#{addr}/ip#{ip}-pulses/$format", "0:65535")
570
+ publish("#{addr}/ip#{ip}-pulses/$unit", "pulses")
571
+ publish("#{addr}/ip#{ip}-pulses/$settable", "true")
572
+ end
573
+
574
+ if @home_assistant
575
+ @mqtt.publish_hass_number("ip#{ip}-pulses",
576
+ command_topic: "#{@base_topic}/#{addr}/ip#{ip}-pulses/set",
577
+ device: hass_device,
578
+ enabled_by_default: false,
579
+ entity_category: :config,
580
+ max: 65_536,
581
+ min: 0,
582
+ name: "Intermediation Position #{ip} (Pulses)",
583
+ node_id: node_id,
584
+ object_id: "ip#{ip}-pulses",
585
+ payload_reset: "",
586
+ state_topic: "#{@base_topic}/#{addr}/ip#{ip}-pulses",
587
+ step: 10,
588
+ unit_of_measurement: "pulses",
589
+ unique_id: "#{node_id}_ip#{ip}-pulses",
590
+ availability: @availability)
591
+ end
504
592
 
505
- publish("#{addr}/ip#{ip}-percent/$name", "Intermediate Position #{ip}")
506
- publish("#{addr}/ip#{ip}-percent/$datatype", "integer")
507
- publish("#{addr}/ip#{ip}-percent/$format", "0:100")
508
- publish("#{addr}/ip#{ip}-percent/$unit", "%")
509
- publish("#{addr}/ip#{ip}-percent/$settable", "true")
593
+ if @homie
594
+ publish("#{addr}/ip#{ip}-percent/$name", "Intermediate Position #{ip}")
595
+ publish("#{addr}/ip#{ip}-percent/$datatype", "integer")
596
+ publish("#{addr}/ip#{ip}-percent/$format", "0:100")
597
+ publish("#{addr}/ip#{ip}-percent/$unit", "%")
598
+ publish("#{addr}/ip#{ip}-percent/$settable", "true")
599
+ end
600
+
601
+ next unless @homie
510
602
 
511
603
  @mqtt.publish_hass_number("ip#{ip}-percent",
512
604
  command_topic: "#{@base_topic}/#{addr}/ip#{ip}-percent/set",
@@ -520,12 +612,13 @@ module SDN
520
612
  payload_reset: "",
521
613
  state_topic: "#{@base_topic}/#{addr}/ip#{ip}-percent",
522
614
  unit_of_measurement: "%",
523
- unique_id: "#{node_id}_ip#{ip}-percent")
615
+ unique_id: "#{node_id}_ip#{ip}-percent",
616
+ availability: @availability)
524
617
  end
525
618
 
526
619
  motor = Motor.new(self, addr, node_type)
527
620
  @motors[addr] = motor
528
- publish("$nodes", (["FFFFFF"] + @motors.keys.sort + @groups.keys.sort).join(","))
621
+ publish("$nodes", (["FFFFFF"] + @motors.keys.sort + @groups.keys.sort).join(",")) if @homie
529
622
  end
530
623
 
531
624
  sdn_addr = Message.parse_address(addr)
@@ -592,135 +685,158 @@ module SDN
592
685
  }
593
686
  node_id = "#{@device_id}_#{addr}"
594
687
 
595
- publish("#{addr}/$name", addr)
596
- publish("#{addr}/$type", "Shade Group")
597
- publish("#{addr}/$properties",
598
- "discover,control,jog-ms,jog-pulses,position-pulses,position-percent," \
599
- "ip,reset,state,last-direction,motors")
688
+ if @homie
689
+ publish("#{addr}/$name", addr)
690
+ publish("#{addr}/$type", "Shade Group")
691
+ publish("#{addr}/$properties",
692
+ "discover,control,jog-ms,jog-pulses,position-pulses,position-percent," \
693
+ "ip,reset,state,last-direction,motors")
694
+
695
+ publish("#{addr}/discover/$name", "Trigger Motor Discovery")
696
+ publish("#{addr}/discover/$datatype", "enum")
697
+ publish("#{addr}/discover/$format", "discover")
698
+ publish("#{addr}/discover/$settable", "true")
699
+ publish("#{addr}/discover/$retained", "false")
700
+ end
600
701
 
601
- publish("#{addr}/discover/$name", "Trigger Motor Discovery")
602
- publish("#{addr}/discover/$datatype", "enum")
603
- publish("#{addr}/discover/$format", "discover")
604
- publish("#{addr}/discover/$settable", "true")
605
- publish("#{addr}/discover/$retained", "false")
702
+ if @home_assistant
703
+ @mqtt.publish_hass_button("discover",
704
+ command_topic: "#{@base_topic}/#{addr}/discover/set",
705
+ device: hass_device,
706
+ icon: "mdi:search-add",
707
+ name: "Rediscover",
708
+ node_id: node_id,
709
+ object_id: "discover",
710
+ payload_press: "discover",
711
+ unique_id: "#{node_id}_discover",
712
+ availability: @availability)
713
+ end
606
714
 
607
- @mqtt.publish_hass_button("discover",
608
- command_topic: "#{@base_topic}/#{addr}/discover/set",
609
- device: hass_device,
610
- icon: "mdi:search-add",
611
- name: "Rediscover",
612
- node_id: node_id,
613
- object_id: "discover",
614
- payload_press: "discover",
615
- unique_id: "#{node_id}_discover")
616
-
617
- publish("#{addr}/control/$name", "Control motors")
618
- publish("#{addr}/control/$datatype", "enum")
619
- publish("#{addr}/control/$format", "up,down,stop,wink,next_ip,previous_ip,refresh")
620
- publish("#{addr}/control/$settable", "true")
621
- publish("#{addr}/control/$retained", "false")
622
-
623
- @mqtt.publish_hass_cover("group",
624
- command_topic: "#{@base_topic}/#{addr}/control/set",
625
- device: hass_device,
626
- icon: "mdi:roller-shade",
627
- name: "Group",
628
- node_id: node_id,
629
- payload_close: "down",
630
- payload_open: "up",
631
- payload_stop: "stop",
632
- position_open: 0,
633
- position_closed: 100,
634
- position_topic: "#{@base_topic}/#{addr}/position-percent",
635
- set_position_topic: "#{@base_topic}/#{addr}/position-percent/set",
636
- state_topic: "#{@base_topic}/#{addr}/hass-state",
637
- unique_id: "#{node_id}_group")
638
- {
639
- Wink: "mdi:emoticon-wink",
640
- Next_IP: "mdi:skip-next",
641
- Previous_IP: "mdi:skip-previous",
642
- Refresh: "mdi:refresh"
643
- }.each do |command, icon|
644
- @mqtt.publish_hass_button(command.to_s.downcase,
645
- command_topic: "#{@base_topic}/#{addr}/control/set",
715
+ if @homie
716
+ publish("#{addr}/control/$name", "Control motors")
717
+ publish("#{addr}/control/$datatype", "enum")
718
+ publish("#{addr}/control/$format", "up,down,stop,wink,next_ip,previous_ip,refresh")
719
+ publish("#{addr}/control/$settable", "true")
720
+ publish("#{addr}/control/$retained", "false")
721
+ end
722
+
723
+ if @home_assistant
724
+ @mqtt.publish_hass_cover("group",
725
+ command_topic: "#{@base_topic}/#{addr}/control/set",
726
+ device: hass_device,
727
+ icon: "mdi:roller-shade",
728
+ name: "Group",
729
+ node_id: node_id,
730
+ payload_close: "down",
731
+ payload_open: "up",
732
+ payload_stop: "stop",
733
+ position_open: 0,
734
+ position_closed: 100,
735
+ position_topic: "#{@base_topic}/#{addr}/position-percent",
736
+ set_position_topic: "#{@base_topic}/#{addr}/position-percent/set",
737
+ state_topic: "#{@base_topic}/#{addr}/hass-state",
738
+ unique_id: "#{node_id}_group",
739
+ availability: @availability)
740
+ {
741
+ Wink: "mdi:emoticon-wink",
742
+ Next_IP: "mdi:skip-next",
743
+ Previous_IP: "mdi:skip-previous",
744
+ Refresh: "mdi:refresh"
745
+ }.each do |command, icon|
746
+ @mqtt.publish_hass_button(command.to_s.downcase,
747
+ command_topic: "#{@base_topic}/#{addr}/control/set",
748
+ device: hass_device,
749
+ icon: icon,
750
+ name: command.to_s.sub("_", " "),
751
+ node_id: node_id,
752
+ payload_press: command.to_s.downcase,
753
+ unique_id: "#{node_id}_#{command.to_s.downcase}",
754
+ availability: @availability)
755
+ end
756
+ end
757
+
758
+ if @homie
759
+ publish("#{addr}/jog-ms/$name", "Jog motors by ms")
760
+ publish("#{addr}/jog-ms/$datatype", "integer")
761
+ publish("#{addr}/jog-ms/$format", "-65535:65535")
762
+ publish("#{addr}/jog-ms/$unit", "ms")
763
+ publish("#{addr}/jog-ms/$settable", "true")
764
+ publish("#{addr}/jog-ms/$retained", "false")
765
+
766
+ publish("#{addr}/jog-pulses/$name", "Jog motors by pulses")
767
+ publish("#{addr}/jog-pulses/$datatype", "integer")
768
+ publish("#{addr}/jog-pulses/$format", "-65535:65535")
769
+ publish("#{addr}/jog-pulses/$unit", "pulses")
770
+ publish("#{addr}/jog-pulses/$settable", "true")
771
+ publish("#{addr}/jog-pulses/$retained", "false")
772
+
773
+ publish("#{addr}/position-pulses/$name", "Position from up limit (in pulses)")
774
+ publish("#{addr}/position-pulses/$datatype", "integer")
775
+ publish("#{addr}/position-pulses/$format", "0:65535")
776
+ publish("#{addr}/position-pulses/$unit", "pulses")
777
+ publish("#{addr}/position-pulses/$settable", "true")
778
+ end
779
+
780
+ if @home_assistant
781
+ @mqtt.publish_hass_number("position-pulses",
782
+ command_topic: "#{@base_topic}/#{addr}/position-pulses/set",
646
783
  device: hass_device,
647
- icon: icon,
648
- name: command.to_s.sub("_", " "),
784
+ enabled_by_default: false,
785
+ max: 65_536,
786
+ min: 0,
787
+ name: "Position (Pulses)",
649
788
  node_id: node_id,
650
- payload_press: command.to_s.downcase,
651
- unique_id: "#{node_id}_#{command.to_s.downcase}")
789
+ object_id: "position-pulses",
790
+ state_topic: "#{@base_topic}/#{addr}/position-pulses",
791
+ step: 10,
792
+ unit_of_measurement: "pulses",
793
+ unique_id: "#{node_id}_position-pulses",
794
+ availability: @availability)
652
795
  end
653
796
 
654
- publish("#{addr}/jog-ms/$name", "Jog motors by ms")
655
- publish("#{addr}/jog-ms/$datatype", "integer")
656
- publish("#{addr}/jog-ms/$format", "-65535:65535")
657
- publish("#{addr}/jog-ms/$unit", "ms")
658
- publish("#{addr}/jog-ms/$settable", "true")
659
- publish("#{addr}/jog-ms/$retained", "false")
660
-
661
- publish("#{addr}/jog-pulses/$name", "Jog motors by pulses")
662
- publish("#{addr}/jog-pulses/$datatype", "integer")
663
- publish("#{addr}/jog-pulses/$format", "-65535:65535")
664
- publish("#{addr}/jog-pulses/$unit", "pulses")
665
- publish("#{addr}/jog-pulses/$settable", "true")
666
- publish("#{addr}/jog-pulses/$retained", "false")
667
-
668
- publish("#{addr}/position-pulses/$name", "Position from up limit (in pulses)")
669
- publish("#{addr}/position-pulses/$datatype", "integer")
670
- publish("#{addr}/position-pulses/$format", "0:65535")
671
- publish("#{addr}/position-pulses/$unit", "pulses")
672
- publish("#{addr}/position-pulses/$settable", "true")
673
-
674
- @mqtt.publish_hass_number("position-pulses",
675
- command_topic: "#{@base_topic}/#{addr}/position-pulses/set",
676
- device: hass_device,
677
- enabled_by_default: false,
678
- max: 65_536,
679
- min: 0,
680
- name: "Position (Pulses)",
681
- node_id: node_id,
682
- object_id: "position-pulses",
683
- state_topic: "#{@base_topic}/#{addr}/position-pulses",
684
- step: 10,
685
- unit_of_measurement: "pulses",
686
- unique_id: "#{node_id}_position-pulses")
687
-
688
- publish("#{addr}/position-percent/$name", "Position (in %)")
689
- publish("#{addr}/position-percent/$datatype", "integer")
690
- publish("#{addr}/position-percent/$format", "0:100")
691
- publish("#{addr}/position-percent/$unit", "%")
692
- publish("#{addr}/position-percent/$settable", "true")
693
-
694
- publish("#{addr}/ip/$name", "Intermediate Position")
695
- publish("#{addr}/ip/$datatype", "integer")
696
- publish("#{addr}/ip/$format", "1:16")
697
- publish("#{addr}/ip/$settable", "true")
698
-
699
- @mqtt.publish_hass_number("ip",
700
- command_topic: "#{@base_topic}/#{addr}/ip/set",
701
- device: hass_device,
702
- name: "Intermediate Position",
703
- max: 16,
704
- min: 0,
705
- node_id: node_id,
706
- object_id: "ip",
707
- payload_reset: "",
708
- state_topic: "#{@base_topic}/#{addr}/ip",
709
- unique_id: "#{node_id}_ip")
797
+ if @homie
798
+ publish("#{addr}/position-percent/$name", "Position (in %)")
799
+ publish("#{addr}/position-percent/$datatype", "integer")
800
+ publish("#{addr}/position-percent/$format", "0:100")
801
+ publish("#{addr}/position-percent/$unit", "%")
802
+ publish("#{addr}/position-percent/$settable", "true")
803
+
804
+ publish("#{addr}/ip/$name", "Intermediate Position")
805
+ publish("#{addr}/ip/$datatype", "integer")
806
+ publish("#{addr}/ip/$format", "1:16")
807
+ publish("#{addr}/ip/$settable", "true")
808
+ end
710
809
 
711
- publish("#{addr}/state/$name", "State of the motors")
712
- publish("#{addr}/state/$datatype", "enum")
713
- publish("#{addr}/state/$format", "#{Message::PostMotorStatus::STATE.keys.join(",")},mixed")
810
+ if @home_assistant
811
+ @mqtt.publish_hass_number("ip",
812
+ command_topic: "#{@base_topic}/#{addr}/ip/set",
813
+ device: hass_device,
814
+ name: "Intermediate Position",
815
+ max: 16,
816
+ min: 0,
817
+ node_id: node_id,
818
+ object_id: "ip",
819
+ payload_reset: "",
820
+ state_topic: "#{@base_topic}/#{addr}/ip",
821
+ unique_id: "#{node_id}_ip",
822
+ availability: @availability)
823
+ end
824
+
825
+ if @homie
826
+ publish("#{addr}/state/$name", "State of the motors")
827
+ publish("#{addr}/state/$datatype", "enum")
828
+ publish("#{addr}/state/$format", "#{Message::PostMotorStatus::STATE.keys.join(",")},mixed")
714
829
 
715
- publish("#{addr}/last-direction/$name", "Direction of last motion")
716
- publish("#{addr}/last-direction/$datatype", "enum")
717
- publish("#{addr}/last-direction/$format", "#{Message::PostMotorStatus::DIRECTION.keys.join(",")},mixed")
830
+ publish("#{addr}/last-direction/$name", "Direction of last motion")
831
+ publish("#{addr}/last-direction/$datatype", "enum")
832
+ publish("#{addr}/last-direction/$format", "#{Message::PostMotorStatus::DIRECTION.keys.join(",")},mixed")
718
833
 
719
- publish("#{addr}/motors/$name", "Comma separated motor addresses that are members of this group")
720
- publish("#{addr}/motors/$datatype", "string")
834
+ publish("#{addr}/motors/$name", "Comma separated motor addresses that are members of this group")
835
+ publish("#{addr}/motors/$datatype", "string")
836
+ end
721
837
 
722
838
  group = @groups[addr] = Group.new(self, addr)
723
- publish("$nodes", (["FFFFFF"] + @motors.keys.sort + @groups.keys.sort).join(","))
839
+ publish("$nodes", (["FFFFFF"] + @motors.keys.sort + @groups.keys.sort).join(",")) if @homie
724
840
  end
725
841
  group
726
842
  end
data/lib/sdn/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SDN
4
- VERSION = "2.3.3"
4
+ VERSION = "2.4.1"
5
5
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: somfy_sdn
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.3
4
+ version: 2.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cody Cutrer
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2025-01-07 00:00:00.000000000 Z
10
+ date: 2025-04-04 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: ccutrer-serialport
@@ -94,7 +93,6 @@ dependencies:
94
93
  - - "~>"
95
94
  - !ruby/object:Gem::Version
96
95
  version: '13.0'
97
- description:
98
96
  email: cody@cutrer.com'
99
97
  executables:
100
98
  - somfy_sdn
@@ -130,7 +128,6 @@ licenses:
130
128
  - MIT
131
129
  metadata:
132
130
  rubygems_mfa_required: 'true'
133
- post_install_message:
134
131
  rdoc_options: []
135
132
  require_paths:
136
133
  - lib
@@ -145,8 +142,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
145
142
  - !ruby/object:Gem::Version
146
143
  version: '0'
147
144
  requirements: []
148
- rubygems_version: 3.5.11
149
- signing_key:
145
+ rubygems_version: 3.6.3
150
146
  specification_version: 4
151
147
  summary: Library for communication with Somfy SDN RS-485 motorized shades
152
148
  test_files: []