wizrb 1.1.2 → 1.2.0
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/README.md +7 -12
- data/exe/wizrb +1 -1
- data/lib/wizrb/cli.rb +16 -16
- data/lib/wizrb/lighting/discover.rb +7 -7
- data/lib/wizrb/lighting/events/set_brightness_event.rb +2 -2
- data/lib/wizrb/lighting/events/set_cold_white_event.rb +2 -2
- data/lib/wizrb/lighting/events/set_color_temp_event.rb +3 -3
- data/lib/wizrb/lighting/events/set_rgb_event.rb +5 -5
- data/lib/wizrb/lighting/events/set_scene_event.rb +3 -3
- data/lib/wizrb/lighting/events/set_speed_event.rb +2 -2
- data/lib/wizrb/lighting/events/set_warm_white_event.rb +2 -2
- data/lib/wizrb/lighting/group.rb +1 -1
- data/lib/wizrb/lighting/products/dimable_light.rb +2 -2
- data/lib/wizrb/lighting/products/light.rb +19 -10
- data/lib/wizrb/lighting/products/rgb_light.rb +2 -2
- data/lib/wizrb/lighting/products/tunable_light.rb +2 -2
- data/lib/wizrb/lighting/scenes/scene.rb +8 -6
- data/lib/wizrb/lighting/scenes/spooky_scene.rb +2 -2
- data/lib/wizrb/lighting/state.rb +2 -2
- data/lib/wizrb/power/discover.rb +5 -5
- data/lib/wizrb/power/group.rb +1 -1
- data/lib/wizrb/power/products/smart_plug.rb +2 -2
- data/lib/wizrb/shared/connection.rb +9 -9
- data/lib/wizrb/shared/discover.rb +15 -15
- data/lib/wizrb/shared/events/base.rb +2 -2
- data/lib/wizrb/shared/events/power_event.rb +3 -3
- data/lib/wizrb/shared/events/reboot_event.rb +2 -2
- data/lib/wizrb/shared/events/refresh_event.rb +2 -2
- data/lib/wizrb/shared/events/reset_event.rb +2 -2
- data/lib/wizrb/shared/group.rb +10 -10
- data/lib/wizrb/shared/products/device.rb +16 -16
- data/lib/wizrb/shared/state.rb +2 -2
- data/lib/wizrb/version.rb +1 -1
- data/lib/wizrb.rb +12 -12
- metadata +13 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: acfb68d7507a35c4556c19733918d8a1b5e2dcede554301d5352e5e39df46784
|
4
|
+
data.tar.gz: 70618d85bd75d2db6f7a8c69563162ddfe027edaf3f98df305d1b6fa7646f8c0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e3b40750c2e4529e678408904ee963301b2cf3575c5d26c1b219570f1cb761fc7beb020f81466a189b6a2d0bddf37a0a1a840375025912151a6f232523281a46
|
7
|
+
data.tar.gz: 874e025e3343e95c3bda66b6cc1e49a229da3308117acaf63750bb71bb20429e2ac767ab689daf3ac24221eb40e00df42f7a40c33514e224a372d68e9875f1e8
|
data/README.md
CHANGED
@@ -21,20 +21,15 @@ Testers with other (supported) Philips WiZ devices are welcome!
|
|
21
21
|
|
22
22
|
## Installation
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
gem 'wizrb'
|
24
|
+
Install via Bundler:
|
25
|
+
```bash
|
26
|
+
bundle add wizrb
|
28
27
|
```
|
29
28
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
Or install it yourself as:
|
35
|
-
|
36
|
-
$ gem install wizrb
|
37
|
-
|
29
|
+
Or install it manually:
|
30
|
+
```bash
|
31
|
+
gem install wizrb
|
32
|
+
```
|
38
33
|
## Usage
|
39
34
|
|
40
35
|
Most of the documentation on how to use this gem is located within [Wizrb Devices](doc/devices.md).
|
data/exe/wizrb
CHANGED
data/lib/wizrb/cli.rb
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "thor"
|
4
|
+
require "wizrb"
|
5
5
|
|
6
6
|
module Wizrb
|
7
7
|
class CLI < Thor
|
8
8
|
include Thor::Actions
|
9
9
|
|
10
|
-
package_name
|
10
|
+
package_name "Wizrb"
|
11
11
|
|
12
|
-
desc
|
13
|
-
method_option :scene, aliases:
|
12
|
+
desc "scene [SCENE]", "Start a scene on all lights"
|
13
|
+
method_option :scene, aliases: "-s", type: :string, required: true
|
14
14
|
def scene
|
15
15
|
scene_type = load_scene
|
16
16
|
return unless scene_type
|
@@ -27,31 +27,31 @@ module Wizrb
|
|
27
27
|
private
|
28
28
|
|
29
29
|
def scene_class(string)
|
30
|
-
name = string.split(
|
30
|
+
name = string.split("_").map(&:capitalize).join
|
31
31
|
Object.const_get("Wizrb::Lighting::Scenes::#{name}Scene")
|
32
32
|
rescue NameError
|
33
33
|
nil
|
34
34
|
end
|
35
35
|
|
36
36
|
def load_scene
|
37
|
-
say(
|
37
|
+
say("Loading scene... ")
|
38
38
|
scene_type = scene_class(options[:scene])
|
39
39
|
|
40
40
|
if scene_type
|
41
|
-
say(
|
41
|
+
say("DONE", :green)
|
42
42
|
else
|
43
|
-
say(
|
43
|
+
say("INVALID SCENE", :red)
|
44
44
|
end
|
45
45
|
|
46
46
|
scene_type
|
47
47
|
end
|
48
48
|
|
49
49
|
def find_lights
|
50
|
-
say(
|
50
|
+
say("Finding lights... ")
|
51
51
|
group = Wizrb::Lighting::Discover.all(wait: 10)
|
52
52
|
|
53
53
|
if group.count == 0
|
54
|
-
say(
|
54
|
+
say("NONE FOUND", :red)
|
55
55
|
return nil
|
56
56
|
else
|
57
57
|
say("#{group.count} FOUND", :green)
|
@@ -61,19 +61,19 @@ module Wizrb
|
|
61
61
|
end
|
62
62
|
|
63
63
|
def start(scene)
|
64
|
-
say(
|
64
|
+
say("Starting scene... ")
|
65
65
|
scene.start
|
66
|
-
say(
|
66
|
+
say("DONE", :green)
|
67
67
|
end
|
68
68
|
|
69
69
|
def prompt_stop
|
70
|
-
nil until yes?(
|
70
|
+
nil until yes?("Would you like to stop? [y, yes]")
|
71
71
|
end
|
72
72
|
|
73
73
|
def stop(scene)
|
74
|
-
say(
|
74
|
+
say("Stopping scene... ")
|
75
75
|
scene.stop
|
76
|
-
say(
|
76
|
+
say("DONE", :green)
|
77
77
|
end
|
78
78
|
end
|
79
79
|
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
4
|
-
require_relative
|
5
|
-
require_relative
|
6
|
-
require_relative
|
7
|
-
require_relative
|
3
|
+
require_relative "../shared/discover"
|
4
|
+
require_relative "group"
|
5
|
+
require_relative "products/dimable_light"
|
6
|
+
require_relative "products/tunable_light"
|
7
|
+
require_relative "products/rgb_light"
|
8
8
|
|
9
9
|
module Wizrb
|
10
10
|
module Lighting
|
@@ -13,10 +13,10 @@ module Wizrb
|
|
13
13
|
|
14
14
|
def parse_response(data, addr)
|
15
15
|
response = JSON.parse(data)
|
16
|
-
return unless response.dig(
|
16
|
+
return unless response.dig("result", "success") && addr[1] && addr[2]
|
17
17
|
|
18
18
|
resolve_device(ip: addr[2], port: addr[1])
|
19
|
-
rescue
|
19
|
+
rescue
|
20
20
|
nil
|
21
21
|
end
|
22
22
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
3
|
+
require_relative "../../shared/events/base"
|
4
4
|
|
5
5
|
module Wizrb
|
6
6
|
module Lighting
|
@@ -11,7 +11,7 @@ module Wizrb
|
|
11
11
|
|
12
12
|
def initialize(value)
|
13
13
|
validate!(value)
|
14
|
-
super(method:
|
14
|
+
super(method: "setState", params: {dimming: value.to_i})
|
15
15
|
end
|
16
16
|
|
17
17
|
private
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
3
|
+
require_relative "../../shared/events/base"
|
4
4
|
|
5
5
|
module Wizrb
|
6
6
|
module Lighting
|
@@ -11,7 +11,7 @@ module Wizrb
|
|
11
11
|
|
12
12
|
def initialize(value)
|
13
13
|
validate!(value)
|
14
|
-
super(method:
|
14
|
+
super(method: "setState", params: {c: value})
|
15
15
|
end
|
16
16
|
|
17
17
|
private
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
3
|
+
require_relative "../../shared/events/base"
|
4
4
|
|
5
5
|
module Wizrb
|
6
6
|
module Lighting
|
@@ -11,7 +11,7 @@ module Wizrb
|
|
11
11
|
|
12
12
|
def initialize(value)
|
13
13
|
validate!(value)
|
14
|
-
super(method:
|
14
|
+
super(method: "setState", params: {temp: value})
|
15
15
|
end
|
16
16
|
|
17
17
|
private
|
@@ -21,7 +21,7 @@ module Wizrb
|
|
21
21
|
raise ArgumentError, "Temperature must be between #{MIN_VALUE} and #{MAX_VALUE} kelvin"
|
22
22
|
end
|
23
23
|
|
24
|
-
raise ArgumentError,
|
24
|
+
raise ArgumentError, "Temperature must be divisible by 100" unless value % 100 == 0
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
3
|
+
require_relative "../../shared/events/base"
|
4
4
|
|
5
5
|
module Wizrb
|
6
6
|
module Lighting
|
@@ -10,10 +10,10 @@ module Wizrb
|
|
10
10
|
MAX_VALUE = 255
|
11
11
|
|
12
12
|
def initialize(red, green, blue)
|
13
|
-
validate_color!(
|
14
|
-
validate_color!(
|
15
|
-
validate_color!(
|
16
|
-
super(method:
|
13
|
+
validate_color!("Red", red)
|
14
|
+
validate_color!("Green", green)
|
15
|
+
validate_color!("Blue", blue)
|
16
|
+
super(method: "setState", params: {r: red, g: green, b: blue})
|
17
17
|
end
|
18
18
|
|
19
19
|
private
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
3
|
+
require_relative "../../shared/events/base"
|
4
4
|
|
5
5
|
module Wizrb
|
6
6
|
module Lighting
|
@@ -8,13 +8,13 @@ module Wizrb
|
|
8
8
|
class SetSceneEvent < Wizrb::Shared::Events::Base
|
9
9
|
def initialize(value)
|
10
10
|
validate!(value)
|
11
|
-
super(method:
|
11
|
+
super(method: "setState", params: {sceneId: Wizrb::Lighting::SCENES[value]})
|
12
12
|
end
|
13
13
|
|
14
14
|
private
|
15
15
|
|
16
16
|
def validate!(value)
|
17
|
-
raise ArgumentError,
|
17
|
+
raise ArgumentError, "Invalid scene" unless Wizrb::Lighting::SCENES.include?(value)
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
3
|
+
require_relative "../../shared/events/base"
|
4
4
|
|
5
5
|
module Wizrb
|
6
6
|
module Lighting
|
@@ -11,7 +11,7 @@ module Wizrb
|
|
11
11
|
|
12
12
|
def initialize(value)
|
13
13
|
validate!(value)
|
14
|
-
super(method:
|
14
|
+
super(method: "setState", params: {speed: value})
|
15
15
|
end
|
16
16
|
|
17
17
|
private
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
3
|
+
require_relative "../../shared/events/base"
|
4
4
|
|
5
5
|
module Wizrb
|
6
6
|
module Lighting
|
@@ -11,7 +11,7 @@ module Wizrb
|
|
11
11
|
|
12
12
|
def initialize(value)
|
13
13
|
validate!(value)
|
14
|
-
super(method:
|
14
|
+
super(method: "setState", params: {w: value})
|
15
15
|
end
|
16
16
|
|
17
17
|
private
|
data/lib/wizrb/lighting/group.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
3
|
+
require_relative "light"
|
4
4
|
|
5
5
|
module Wizrb
|
6
6
|
module Lighting
|
7
7
|
module Products
|
8
8
|
class DimableLight < Wizrb::Lighting::Products::Light
|
9
|
-
MODULE_NAME_IDENTIFIER =
|
9
|
+
MODULE_NAME_IDENTIFIER = "DW"
|
10
10
|
FEATURES = {
|
11
11
|
brightness: true,
|
12
12
|
color_temp: false,
|
@@ -1,9 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require_relative
|
6
|
-
require_relative
|
3
|
+
require "json"
|
4
|
+
require "socket"
|
5
|
+
require_relative "../../shared/products/device"
|
6
|
+
require_relative "../state"
|
7
7
|
|
8
8
|
module Wizrb
|
9
9
|
module Lighting
|
@@ -14,12 +14,7 @@ module Wizrb
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def white_range
|
17
|
-
@white_range ||=
|
18
|
-
user_config&.dig('whiteRange') ||
|
19
|
-
model_config&.dig('extRange') ||
|
20
|
-
model_config&.dig('cctRange') ||
|
21
|
-
user_config&.dig('extRange') ||
|
22
|
-
user_config&.dig('cctRange')
|
17
|
+
@white_range ||= primary_white_range || secondary_white_range || tertiary_white_range
|
23
18
|
end
|
24
19
|
|
25
20
|
def brightness(value)
|
@@ -49,6 +44,20 @@ module Wizrb
|
|
49
44
|
def scene(value)
|
50
45
|
dispatch_event(Wizrb::Lighting::Events::SetSceneEvent.new(value))
|
51
46
|
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def primary_white_range
|
51
|
+
user_config&.dig("whiteRange")
|
52
|
+
end
|
53
|
+
|
54
|
+
def secondary_white_range
|
55
|
+
model_config&.dig("extRange") || model_config&.dig("cctRange")
|
56
|
+
end
|
57
|
+
|
58
|
+
def tertiary_white_range
|
59
|
+
user_config&.dig("extRange") || user_config&.dig("cctRange")
|
60
|
+
end
|
52
61
|
end
|
53
62
|
end
|
54
63
|
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
3
|
+
require_relative "light"
|
4
4
|
|
5
5
|
module Wizrb
|
6
6
|
module Lighting
|
7
7
|
module Products
|
8
8
|
class RgbLight < Wizrb::Lighting::Products::Light
|
9
|
-
MODULE_NAME_IDENTIFIER =
|
9
|
+
MODULE_NAME_IDENTIFIER = "RGB"
|
10
10
|
FEATURES = {
|
11
11
|
brightness: true,
|
12
12
|
color_temp: true,
|
@@ -1,12 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
3
|
+
require_relative "light"
|
4
4
|
|
5
5
|
module Wizrb
|
6
6
|
module Lighting
|
7
7
|
module Products
|
8
8
|
class TunableLight < Wizrb::Lighting::Products::Light
|
9
|
-
MODULE_NAME_IDENTIFIER =
|
9
|
+
MODULE_NAME_IDENTIFIER = "TW"
|
10
10
|
FEATURES = {
|
11
11
|
brightness: true,
|
12
12
|
color_temp: true,
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
3
|
+
require_relative "../group"
|
4
4
|
|
5
5
|
module Wizrb
|
6
6
|
module Lighting
|
@@ -35,25 +35,27 @@ module Wizrb
|
|
35
35
|
|
36
36
|
protected
|
37
37
|
|
38
|
-
def before_start
|
38
|
+
def before_start
|
39
|
+
end
|
39
40
|
|
40
41
|
def step
|
41
|
-
raise Wizrb::Error,
|
42
|
+
raise Wizrb::Error, "You failed to implement #step on your scene"
|
42
43
|
end
|
43
44
|
|
44
|
-
def after_stop
|
45
|
+
def after_stop
|
46
|
+
end
|
45
47
|
|
46
48
|
private
|
47
49
|
|
48
50
|
def validate!(value)
|
49
51
|
return if value.is_a?(Wizrb::Lighting::Group)
|
50
52
|
|
51
|
-
raise Wizrb::Error,
|
53
|
+
raise Wizrb::Error, "Scenes can only be activated on lighting groups"
|
52
54
|
end
|
53
55
|
|
54
56
|
def save_state
|
55
57
|
@state_events = @group.map do |device|
|
56
|
-
Wizrb::Shared::Events::Base.new(method:
|
58
|
+
Wizrb::Shared::Events::Base.new(method: "setState", params: device.refresh.state)
|
57
59
|
end
|
58
60
|
end
|
59
61
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
3
|
+
require_relative "scene"
|
4
4
|
|
5
5
|
module Wizrb
|
6
6
|
module Lighting
|
@@ -34,7 +34,7 @@ module Wizrb
|
|
34
34
|
next if Random.rand > 0.25
|
35
35
|
|
36
36
|
dispatch(BLACKOUT_EVENTS, sync: @sync)
|
37
|
-
sleep(Random.rand > 0.98 ? 3 : 0.125)
|
37
|
+
sleep((Random.rand > 0.98) ? 3 : 0.125)
|
38
38
|
dispatch(DEFAULT_STATE_EVENTS, sync: true)
|
39
39
|
end
|
40
40
|
end
|
data/lib/wizrb/lighting/state.rb
CHANGED
@@ -6,7 +6,7 @@ module Wizrb
|
|
6
6
|
STATE_KEYS = %i[state w c r g b temp dimming speed sceneId].freeze
|
7
7
|
|
8
8
|
def parse!(response)
|
9
|
-
result = response&.dig(
|
9
|
+
result = response&.dig("result")
|
10
10
|
return unless result
|
11
11
|
|
12
12
|
@state = result.transform_keys(&:to_sym).slice(*STATE_KEYS)
|
@@ -22,7 +22,7 @@ module Wizrb
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def rgb
|
25
|
-
{
|
25
|
+
{red: @state[:r], green: @state[:g], blue: @state[:b]}
|
26
26
|
end
|
27
27
|
|
28
28
|
def color_temp
|
data/lib/wizrb/power/discover.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
4
|
-
require_relative
|
5
|
-
require_relative
|
3
|
+
require_relative "../shared/discover"
|
4
|
+
require_relative "group"
|
5
|
+
require_relative "products/smart_plug"
|
6
6
|
|
7
7
|
module Wizrb
|
8
8
|
module Power
|
@@ -11,10 +11,10 @@ module Wizrb
|
|
11
11
|
|
12
12
|
def parse_response(data, addr)
|
13
13
|
response = JSON.parse(data)
|
14
|
-
return unless response.dig(
|
14
|
+
return unless response.dig("result", "success") && addr[1] && addr[2]
|
15
15
|
|
16
16
|
resolve_device(ip: addr[2], port: addr[1])
|
17
|
-
rescue
|
17
|
+
rescue
|
18
18
|
nil
|
19
19
|
end
|
20
20
|
|
data/lib/wizrb/power/group.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
3
|
+
require_relative "../../shared/products/device"
|
4
4
|
|
5
5
|
module Wizrb
|
6
6
|
module Power
|
7
7
|
module Products
|
8
8
|
class SmartPlug < Wizrb::Shared::Products::Device
|
9
|
-
MODULE_NAME_IDENTIFIER =
|
9
|
+
MODULE_NAME_IDENTIFIER = "SOCKET"
|
10
10
|
|
11
11
|
def initialize(ip:, port: 38_899)
|
12
12
|
super
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "json"
|
4
|
+
require "socket"
|
5
5
|
|
6
6
|
module Wizrb
|
7
7
|
module Shared
|
@@ -13,13 +13,13 @@ module Wizrb
|
|
13
13
|
@port = port
|
14
14
|
@connection_id = Time.now.to_i.to_s(16)
|
15
15
|
@socket = UDPSocket.new
|
16
|
-
log(
|
16
|
+
log("Created")
|
17
17
|
end
|
18
18
|
|
19
19
|
def connect
|
20
20
|
with_error_logging do
|
21
21
|
socket.connect(ip, port)
|
22
|
-
log(
|
22
|
+
log("Connected")
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
@@ -27,7 +27,7 @@ module Wizrb
|
|
27
27
|
with_error_logging do
|
28
28
|
connect
|
29
29
|
log("Sending: #{data.to_json}")
|
30
|
-
socket.send(data.to_json.encode(
|
30
|
+
socket.send(data.to_json.encode("UTF-8"), 0)
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
@@ -46,7 +46,7 @@ module Wizrb
|
|
46
46
|
|
47
47
|
def test
|
48
48
|
with_error_logging do
|
49
|
-
send({
|
49
|
+
send({method: "getPilot", params: {}})
|
50
50
|
receive
|
51
51
|
end
|
52
52
|
end
|
@@ -56,18 +56,18 @@ module Wizrb
|
|
56
56
|
def parse_response(data)
|
57
57
|
response = JSON.parse(data)
|
58
58
|
|
59
|
-
raise Wizrb::ConnectionError, response[
|
59
|
+
raise Wizrb::ConnectionError, response["error"] if response.key?("error")
|
60
60
|
|
61
61
|
response
|
62
62
|
end
|
63
63
|
|
64
64
|
def log(message)
|
65
|
-
puts "[Wizrb::Connection##{connection_id} #{ip}:#{port}] #{message}" if ENV[
|
65
|
+
puts "[Wizrb::Connection##{connection_id} #{ip}:#{port}] #{message}" if ENV["DEBUG"]
|
66
66
|
end
|
67
67
|
|
68
68
|
def with_error_logging
|
69
69
|
yield
|
70
|
-
rescue
|
70
|
+
rescue => e
|
71
71
|
log("Error: #{e.message}")
|
72
72
|
raise
|
73
73
|
end
|
@@ -1,24 +1,24 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require_relative
|
7
|
-
require_relative
|
3
|
+
require "ipaddr"
|
4
|
+
require "socket"
|
5
|
+
require "json"
|
6
|
+
require_relative "group"
|
7
|
+
require_relative "products/device"
|
8
8
|
|
9
9
|
module Wizrb
|
10
10
|
module Shared
|
11
11
|
class Discover
|
12
|
-
MULTICAST_ADDR =
|
13
|
-
BIND_ADDR =
|
12
|
+
MULTICAST_ADDR = "224.0.0.1"
|
13
|
+
BIND_ADDR = "0.0.0.0"
|
14
14
|
PORT = 38_899
|
15
15
|
REGISTRATION_MESSAGE = {
|
16
|
-
method:
|
16
|
+
method: "registration",
|
17
17
|
params: {
|
18
|
-
phoneMac:
|
18
|
+
phoneMac: "ABCDEFGHIJKL",
|
19
19
|
register: false,
|
20
|
-
phoneIp:
|
21
|
-
id:
|
20
|
+
phoneIp: "1.2.3.4",
|
21
|
+
id: "1"
|
22
22
|
}
|
23
23
|
}.to_json
|
24
24
|
|
@@ -40,11 +40,11 @@ module Wizrb
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def home(id)
|
43
|
-
all(filters: {
|
43
|
+
all(filters: {"homeId" => id})
|
44
44
|
end
|
45
45
|
|
46
46
|
def room(id)
|
47
|
-
all(filters: {
|
47
|
+
all(filters: {"roomId" => id})
|
48
48
|
end
|
49
49
|
|
50
50
|
def self.all(wait: 2, filters: {})
|
@@ -101,10 +101,10 @@ module Wizrb
|
|
101
101
|
|
102
102
|
def parse_response(data, addr)
|
103
103
|
response = JSON.parse(data)
|
104
|
-
return unless response.dig(
|
104
|
+
return unless response.dig("result", "success") && addr[1] && addr[2]
|
105
105
|
|
106
106
|
Wizrb::Shared::Products::Device.new(ip: addr[2], port: addr[1])
|
107
|
-
rescue
|
107
|
+
rescue
|
108
108
|
nil
|
109
109
|
end
|
110
110
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "json"
|
4
4
|
|
5
5
|
module Wizrb
|
6
6
|
module Shared
|
@@ -14,7 +14,7 @@ module Wizrb
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def to_json(*_args)
|
17
|
-
@to_json ||= {
|
17
|
+
@to_json ||= {method: @method, params: @params}.to_json
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
3
|
+
require_relative "base"
|
4
4
|
|
5
5
|
module Wizrb
|
6
6
|
module Shared
|
@@ -8,13 +8,13 @@ module Wizrb
|
|
8
8
|
class PowerEvent < Wizrb::Shared::Events::Base
|
9
9
|
def initialize(value)
|
10
10
|
validate!(value)
|
11
|
-
super(method:
|
11
|
+
super(method: "setPilot", params: {state: value})
|
12
12
|
end
|
13
13
|
|
14
14
|
private
|
15
15
|
|
16
16
|
def validate!(value)
|
17
|
-
raise ArgumentError,
|
17
|
+
raise ArgumentError, "Power state must be a boolean" unless [true, false].include?(value)
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
@@ -1,13 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
3
|
+
require_relative "base"
|
4
4
|
|
5
5
|
module Wizrb
|
6
6
|
module Shared
|
7
7
|
module Events
|
8
8
|
class RebootEvent < Wizrb::Shared::Events::Base
|
9
9
|
def initialize
|
10
|
-
super(method:
|
10
|
+
super(method: "reboot")
|
11
11
|
end
|
12
12
|
end
|
13
13
|
end
|
@@ -1,13 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
3
|
+
require_relative "base"
|
4
4
|
|
5
5
|
module Wizrb
|
6
6
|
module Shared
|
7
7
|
module Events
|
8
8
|
class RefreshEvent < Wizrb::Shared::Events::Base
|
9
9
|
def initialize
|
10
|
-
super(method:
|
10
|
+
super(method: "getPilot")
|
11
11
|
end
|
12
12
|
end
|
13
13
|
end
|
@@ -1,13 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
3
|
+
require_relative "base"
|
4
4
|
|
5
5
|
module Wizrb
|
6
6
|
module Shared
|
7
7
|
module Events
|
8
8
|
class ResetEvent < Wizrb::Shared::Events::Base
|
9
9
|
def initialize
|
10
|
-
super(method:
|
10
|
+
super(method: "reset")
|
11
11
|
end
|
12
12
|
end
|
13
13
|
end
|
data/lib/wizrb/shared/group.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
4
|
-
require_relative
|
5
|
-
require_relative
|
6
|
-
require_relative
|
7
|
-
require_relative
|
3
|
+
require_relative "events/base"
|
4
|
+
require_relative "events/power_event"
|
5
|
+
require_relative "events/reboot_event"
|
6
|
+
require_relative "events/refresh_event"
|
7
|
+
require_relative "events/reset_event"
|
8
8
|
|
9
9
|
module Wizrb
|
10
10
|
module Shared
|
@@ -17,8 +17,8 @@ module Wizrb
|
|
17
17
|
@devices = devices
|
18
18
|
end
|
19
19
|
|
20
|
-
def each(&
|
21
|
-
@devices.each(&
|
20
|
+
def each(&)
|
21
|
+
@devices.each(&)
|
22
22
|
end
|
23
23
|
|
24
24
|
def power_on
|
@@ -39,7 +39,7 @@ module Wizrb
|
|
39
39
|
|
40
40
|
def dispatch_event(event)
|
41
41
|
unless event.is_a?(Wizrb::Shared::Events::Base)
|
42
|
-
raise ArgumentError,
|
42
|
+
raise ArgumentError, "Not an instance of Wizrb::Shared::Events::Base"
|
43
43
|
end
|
44
44
|
|
45
45
|
dispatch(event)
|
@@ -48,12 +48,12 @@ module Wizrb
|
|
48
48
|
def dispatch_events(*events)
|
49
49
|
events.each do |event|
|
50
50
|
unless event.is_a?(Wizrb::Shared::Events::Base)
|
51
|
-
raise ArgumentError,
|
51
|
+
raise ArgumentError, "Not an instance of Wizrb::Shared::Events::Base"
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
55
|
params = events.reduce({}) { |h, e| h.merge(e.params) }
|
56
|
-
dispatch_event(Wizrb::Shared::Events::Base.new(method:
|
56
|
+
dispatch_event(Wizrb::Shared::Events::Base.new(method: "setState", params: params))
|
57
57
|
end
|
58
58
|
|
59
59
|
private
|
@@ -1,14 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require_relative
|
6
|
-
require_relative
|
7
|
-
require_relative
|
8
|
-
require_relative
|
9
|
-
require_relative
|
10
|
-
require_relative
|
11
|
-
require_relative
|
3
|
+
require "json"
|
4
|
+
require "socket"
|
5
|
+
require_relative "../connection"
|
6
|
+
require_relative "../state"
|
7
|
+
require_relative "../events/base"
|
8
|
+
require_relative "../events/power_event"
|
9
|
+
require_relative "../events/reboot_event"
|
10
|
+
require_relative "../events/refresh_event"
|
11
|
+
require_relative "../events/reset_event"
|
12
12
|
|
13
13
|
module Wizrb
|
14
14
|
module Shared
|
@@ -24,19 +24,19 @@ module Wizrb
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def system_config
|
27
|
-
@system_config ||= dispatch({
|
27
|
+
@system_config ||= dispatch({method: "getSystemConfig", params: {}})&.dig("result")
|
28
28
|
end
|
29
29
|
|
30
30
|
def model_config
|
31
|
-
@model_config ||= dispatch({
|
31
|
+
@model_config ||= dispatch({method: "getModelConfig", params: {}})&.dig("result")
|
32
32
|
end
|
33
33
|
|
34
34
|
def user_config
|
35
|
-
@user_config ||= dispatch({
|
35
|
+
@user_config ||= dispatch({method: "getUserConfig", params: {}})&.dig("result")
|
36
36
|
end
|
37
37
|
|
38
38
|
def module_name
|
39
|
-
@module_name ||= system_config&.dig(
|
39
|
+
@module_name ||= system_config&.dig("moduleName")
|
40
40
|
end
|
41
41
|
|
42
42
|
def power_on
|
@@ -71,7 +71,7 @@ module Wizrb
|
|
71
71
|
|
72
72
|
def dispatch_event(event)
|
73
73
|
unless event.is_a?(Wizrb::Shared::Events::Base)
|
74
|
-
raise ArgumentError,
|
74
|
+
raise ArgumentError, "Not an instance of Wizrb::Shared::Events::Base"
|
75
75
|
end
|
76
76
|
|
77
77
|
dispatch(event)
|
@@ -80,12 +80,12 @@ module Wizrb
|
|
80
80
|
def dispatch_events(*events)
|
81
81
|
events.each do |event|
|
82
82
|
unless event.is_a?(Wizrb::Shared::Events::Base)
|
83
|
-
raise ArgumentError,
|
83
|
+
raise ArgumentError, "Not an instance of Wizrb::Shared::Events::Base"
|
84
84
|
end
|
85
85
|
end
|
86
86
|
|
87
87
|
params = events.reduce({}) { |h, e| h.merge(e.params) }
|
88
|
-
dispatch_event(Wizrb::Shared::Events::Base.new(method:
|
88
|
+
dispatch_event(Wizrb::Shared::Events::Base.new(method: "setState", params: params))
|
89
89
|
end
|
90
90
|
|
91
91
|
private
|
data/lib/wizrb/shared/state.rb
CHANGED
@@ -6,11 +6,11 @@ module Wizrb
|
|
6
6
|
STATE_KEYS = %i[state].freeze
|
7
7
|
|
8
8
|
def initialize
|
9
|
-
@state = {
|
9
|
+
@state = {state: false}
|
10
10
|
end
|
11
11
|
|
12
12
|
def parse!(response)
|
13
|
-
result = response&.dig(
|
13
|
+
result = response&.dig("result")
|
14
14
|
return unless result
|
15
15
|
|
16
16
|
@state = result.transform_keys(&:to_sym).slice(*STATE_KEYS)
|
data/lib/wizrb/version.rb
CHANGED
data/lib/wizrb.rb
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
4
|
-
require_relative
|
5
|
-
require_relative
|
6
|
-
require_relative
|
7
|
-
require_relative
|
8
|
-
require_relative
|
9
|
-
require_relative
|
10
|
-
require_relative
|
11
|
-
require_relative
|
12
|
-
require_relative
|
13
|
-
require_relative
|
3
|
+
require_relative "wizrb/version"
|
4
|
+
require_relative "wizrb/shared/connection"
|
5
|
+
require_relative "wizrb/shared/discover"
|
6
|
+
require_relative "wizrb/shared/group"
|
7
|
+
require_relative "wizrb/shared/state"
|
8
|
+
require_relative "wizrb/lighting"
|
9
|
+
require_relative "wizrb/lighting/discover"
|
10
|
+
require_relative "wizrb/lighting/group"
|
11
|
+
require_relative "wizrb/lighting/state"
|
12
|
+
require_relative "wizrb/power/discover"
|
13
|
+
require_relative "wizrb/power/group"
|
14
14
|
|
15
15
|
Dir["#{File.dirname(__FILE__)}/wizrb/shared/products/*.rb"].sort.each { |file| require file }
|
16
16
|
Dir["#{File.dirname(__FILE__)}/wizrb/shared/events/*.rb"].sort.each { |file| require file }
|
@@ -25,7 +25,7 @@ module Wizrb
|
|
25
25
|
class ConnectionError < Wizrb::Error; end
|
26
26
|
|
27
27
|
class ConnectionTimeoutError < Wizrb::ConnectionError
|
28
|
-
def initialize(msg =
|
28
|
+
def initialize(msg = "Connection timeout waiting for response.")
|
29
29
|
super
|
30
30
|
end
|
31
31
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wizrb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bert McCutchen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-08-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -16,14 +16,20 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1.
|
19
|
+
version: '1.3'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.3.1
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
27
|
- - "~>"
|
25
28
|
- !ruby/object:Gem::Version
|
26
|
-
version: '1.
|
29
|
+
version: '1.3'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 1.3.1
|
27
33
|
description: Manage the state of your Philips WiZ devices.
|
28
34
|
email:
|
29
35
|
- mail@bertm.dev
|
@@ -79,6 +85,7 @@ metadata:
|
|
79
85
|
homepage_uri: https://github.com/bert-mccutchen/wizrb
|
80
86
|
source_code_uri: https://github.com/bert-mccutchen/wizrb
|
81
87
|
changelog_uri: https://github.com/bert-mccutchen/wizrb/blob/master/CHANGELOG.md
|
88
|
+
rubygems_mfa_required: 'true'
|
82
89
|
post_install_message:
|
83
90
|
rdoc_options: []
|
84
91
|
require_paths:
|
@@ -87,14 +94,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
87
94
|
requirements:
|
88
95
|
- - ">="
|
89
96
|
- !ruby/object:Gem::Version
|
90
|
-
version:
|
97
|
+
version: '3.1'
|
91
98
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
92
99
|
requirements:
|
93
100
|
- - ">="
|
94
101
|
- !ruby/object:Gem::Version
|
95
102
|
version: '0'
|
96
103
|
requirements: []
|
97
|
-
rubygems_version: 3.
|
104
|
+
rubygems_version: 3.5.11
|
98
105
|
signing_key:
|
99
106
|
specification_version: 4
|
100
107
|
summary: State management for Philips WiZ devices.
|