dirigera 0.1.0 → 0.1.1

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: 2bdb01129652a3672f479d750453655d23d8ba1c30376dcd012cac432d60252f
4
- data.tar.gz: 27d7c4fd79d539641b384f2f9e09b07186a7853699c03db73c8ee1f64d6b3c66
3
+ metadata.gz: 000c4ff5d39d54cdf523b1cb3d2177972061cac28144f791dd8053ddd1d28a5a
4
+ data.tar.gz: 0accf6d71a935486564c2bacb040625eedf6d81b1ae21b3fe5219d485c64f787
5
5
  SHA512:
6
- metadata.gz: 24349d5707dfd6aaffa706403edeb6423d7ce00f75edca419b41fb99f3f4ed137fdc869a1f1f5d7820640eb460fb89613b45ccc3d2ffe1a6067c0b39e84e0887
7
- data.tar.gz: 0af1066ceb05363f2012cfb1426b83ec8123aabc7fa98da55cdeba15b68e0533016378e664a321935be9e8b6039637b866d348dec9a51f8cccdfa8f2a1ff57f6
6
+ metadata.gz: 266253f0d4a5ca2f5c8f9637c34e75648450359474bc04d4e7b87a453cca13dbf6ed4df9aa8d0d72fb2af88c52d3b83150e3b15065de246093126ab5f3eab358
7
+ data.tar.gz: 914529e979786f6eeae4091046d880e0e41f53f67a058e6a4d501eda0e70464553f7f37caeb297c01db6c8003960c904d8765b29fcd18949612d016cccb0a191
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 phillipp
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,48 @@
1
+ # Dirigera Hub API client
2
+
3
+ This gem implements an API client for the IKEA Dirigera hub.
4
+
5
+ Add it to your Gemfile or install it with gem install
6
+
7
+ # Quick start
8
+
9
+ Install it via rubygems:
10
+
11
+ ```
12
+ gem install example
13
+ ```
14
+
15
+ First, you need to get a token. Run the setup.rb from this repository to get it.
16
+
17
+ Then you can use the client:
18
+
19
+ ```
20
+ require "dirigera"
21
+
22
+ client = Dirigera::Client.new(
23
+ '192.168.x.x',
24
+ 'YOURTOKEN'
25
+ )
26
+
27
+ light = client.lights.last
28
+
29
+ light.name = 'Any light'
30
+
31
+ light.on
32
+ sleep 10
33
+ light.off
34
+
35
+ blinds = client.blinds.last
36
+
37
+ blinds.up
38
+ sleep 60
39
+ blinds.down
40
+ ```
41
+
42
+ # TODO
43
+
44
+ - Yeah, I know, there is no specs...
45
+ - Scenes
46
+ - Link devices
47
+ - Set power loss behaviour
48
+ - Implement websocket to receive events
data/dirigera.gemspec ADDED
@@ -0,0 +1,16 @@
1
+ require_relative 'lib/dirigera/version'
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = 'dirigera'
5
+ s.version = Dirigera::VERSION
6
+ s.licenses = ['MIT']
7
+ s.required_ruby_version = '>= 2.7.0'
8
+ s.summary = "API client for the IKEA Dirigera hub using a local connection"
9
+ s.authors = ["Phillipp Röll"]
10
+ s.email = 'phillipp.roell@trafficplex.de'
11
+ s.files = %w[dirigera.gemspec README.md LICENSE] + `git ls-files | grep -E '^lib'`.split("\n")
12
+ s.homepage = 'https://rubygems.org/gems/dirigera'
13
+ s.metadata = { "source_code_uri" => "https://github.com/phillipp/dirigera" }
14
+
15
+ s.add_dependency 'httparty'
16
+ end
@@ -0,0 +1,30 @@
1
+ class Dirigera::Blinds < Dirigera::Device
2
+ def up
3
+ self.target_level = 0
4
+ end
5
+
6
+ def down
7
+ self.target_level = 100
8
+ end
9
+
10
+ def state
11
+ @data['attributes']['blindsState']
12
+ end
13
+
14
+ def current_level
15
+ @data['attributes']['blindsCurrentLevel']
16
+ end
17
+
18
+ def target_level
19
+ @data['attributes']['blindsTargetLevel']
20
+ end
21
+
22
+ def target_level=(level)
23
+ raise ArgumentError, 'level must be between 0 and 100' unless (0..100).include?(level)
24
+
25
+ response = @client.patch("/devices/#{id}", [{ attributes: { blindsTargetLevel: level } }])
26
+ raise 'Failed to update target level' unless response.code == 202
27
+
28
+ @data['attributes']['blindsTargetLevel'] = level
29
+ end
30
+ end
@@ -0,0 +1,61 @@
1
+ require 'httparty'
2
+
3
+ class Dirigera::Client
4
+ def initialize(ip, bearer_token)
5
+ @ip = ip
6
+ @bearer_token = bearer_token
7
+ end
8
+
9
+ def blinds
10
+ devices.select { |data| data['type'] == 'blinds' }.map { |data| make_device(data) }
11
+ end
12
+
13
+ def outlets
14
+ devices.select { |data| data['type'] == 'outlet' }.map { |data| make_device(data) }
15
+ end
16
+
17
+ def lights
18
+ devices.select { |data| data['type'] == 'light' }.map { |data| make_device(data) }
19
+ end
20
+
21
+ def devices
22
+ get("/devices")
23
+ end
24
+
25
+ def get(path, params = {})
26
+ HTTParty.get(
27
+ "#{base_url}#{path}",
28
+ query: params,
29
+ headers: headers,
30
+ verify: false
31
+ )
32
+ end
33
+
34
+ def patch(path, data)
35
+ HTTParty.patch(
36
+ "#{base_url}#{path}",
37
+ body: data.to_json,
38
+ headers: headers,
39
+ verify: false
40
+ )
41
+ end
42
+
43
+ private
44
+
45
+ def make_device(data)
46
+ Object.const_get("Dirigera::#{data['deviceType'].capitalize}").new(data, self)
47
+ rescue NameError
48
+ Dirigera::Device.new(data, self)
49
+ end
50
+
51
+ def headers
52
+ {
53
+ 'Authorization': "Bearer #{@bearer_token}",
54
+ "Content-Type": 'application/json'
55
+ }
56
+ end
57
+
58
+ def base_url
59
+ "https://#{@ip}:8443/v1"
60
+ end
61
+ end
@@ -0,0 +1,51 @@
1
+ class Dirigera::Device
2
+ def initialize(data, client)
3
+ @data = data
4
+ @client = client
5
+ end
6
+
7
+ attr_reader :client
8
+
9
+ def id
10
+ @data['id']
11
+ end
12
+
13
+ def type
14
+ @data['type']
15
+ end
16
+
17
+ def name
18
+ @data['attributes']['customName']
19
+ end
20
+
21
+ def created_at
22
+ Time.parse(@data['createdAt'])
23
+ end
24
+
25
+ def last_seen_at
26
+ Time.parse(@data['lastSeen'])
27
+ end
28
+
29
+ def battery_level
30
+ @data['attributes']['batteryPercentage']
31
+ end
32
+
33
+ def reachable?
34
+ @data['isReachable']
35
+ end
36
+
37
+ def room
38
+ @data['room']
39
+ end
40
+
41
+ def name=(new_name)
42
+ response = @client.patch("/devices/#{id}", [{ attributes: { customName: new_name } }])
43
+ raise "Failed to update name" unless response.code == 202
44
+
45
+ @data['attributes']['customName'] = new_name
46
+ end
47
+
48
+ def reload
49
+ @data = @client.get("/devices/#{id}")
50
+ end
51
+ end
@@ -0,0 +1,5 @@
1
+ require 'dirigera/on_off_behaviour'
2
+
3
+ class Dirigera::Light < Dirigera::Device
4
+ include Dirigera::OnOffBehaviour
5
+ end
@@ -0,0 +1,23 @@
1
+ module Dirigera::OnOffBehaviour
2
+ def on?
3
+ @data['attributes']['isOn']
4
+ end
5
+
6
+ def off?
7
+ !on?
8
+ end
9
+
10
+ def on
11
+ response = @client.patch("/devices/#{id}", [{ attributes: { isOn: true } }])
12
+ raise "Failed to update attribute isOn" unless response.code == 202
13
+
14
+ @data['attributes']['isOn'] = true
15
+ end
16
+
17
+ def off
18
+ response = @client.patch("/devices/#{id}", [{ attributes: { isOn: false } }])
19
+ raise "Failed to update attribute isOn" unless response.code == 202
20
+
21
+ @data['attributes']['isOn'] = false
22
+ end
23
+ end
@@ -0,0 +1,5 @@
1
+ require 'dirigera/on_off_behaviour'
2
+
3
+ class Dirigera::Outlet < Dirigera::Device
4
+ include Dirigera::OnOffBehaviour
5
+ end
@@ -0,0 +1,3 @@
1
+ module Dirigera
2
+ VERSION = '0.1.1'
3
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dirigera
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Phillipp Röll
@@ -30,7 +30,17 @@ executables: []
30
30
  extensions: []
31
31
  extra_rdoc_files: []
32
32
  files:
33
+ - LICENSE
34
+ - README.md
35
+ - dirigera.gemspec
33
36
  - lib/dirigera.rb
37
+ - lib/dirigera/blinds.rb
38
+ - lib/dirigera/client.rb
39
+ - lib/dirigera/device.rb
40
+ - lib/dirigera/light.rb
41
+ - lib/dirigera/on_off_behaviour.rb
42
+ - lib/dirigera/outlet.rb
43
+ - lib/dirigera/version.rb
34
44
  homepage: https://rubygems.org/gems/dirigera
35
45
  licenses:
36
46
  - MIT