hiveline 0.0.5 → 0.0.6

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
  SHA1:
3
- metadata.gz: 8fe530f7a8271b82f9ea3931ac6c09c648f5990b
4
- data.tar.gz: 73d5b882c0957023eb2b0d3c2d49226bc1115a53
3
+ metadata.gz: c3d9806ec2d28bb69b9618c42c926cbf7d8eb78a
4
+ data.tar.gz: 9180f209cfbffd935973a68300855ce7c9e717e0
5
5
  SHA512:
6
- metadata.gz: a88ceae109b7436354fc433ad70177e4accded4b887266903bb2b656f53c2765ea9c5103778c165141d3cb1bf7547c90ffbbbde375fc946ee10dbcdd92ce2190
7
- data.tar.gz: 9048d8a64e64966e538403cce56f7a6ed296188adc11887c874a5db7f024b07f20d0f53dd2723ce3ceb2ff539d3bfe7e2bff1c157a5eb79fc0e66c4bed611abb
6
+ metadata.gz: 3c0561b0b060cbab1811037cd96da4802218eeb81df2771ceeb674bb6d723ce4e2c13160b7be92fd64a9a0f87c399337e47ee183482f0acf8e12c0f979df1b46
7
+ data.tar.gz: 85d58deca29ef22806e3d52292a600d0dc4305c024d934a4f0d2eea1064cde44d74458d96fd369893471363e63d540b2a078a7e8f5006de7d0eb6a496d7f5ea9
data/README.md CHANGED
@@ -33,8 +33,8 @@ Get temperature
33
33
  ```bash
34
34
  $ hiveline
35
35
 
36
- Inside Temperature: 19.9°C
37
- Weather in London: Cloudy With Light Rain (2.8°C)
36
+ Inside Temperature: 16.8°C (17°C todays average)
37
+ Outide Temperature: 7.2°C (Partly Cloudy)
38
38
  ```
39
39
 
40
40
  Set temperature
data/bin/hiveline CHANGED
@@ -51,9 +51,9 @@ end
51
51
 
52
52
  def set_temperature(client, temp)
53
53
  print "Setting temperature to #{temp}°C\n"
54
- temperature = client.set_temperature(temp)
55
- unless temperature.nil?
56
- print "Successfully updated temperature. Set to #{temperature}°C\n"
54
+ response_success = client.set_temperature(temp)
55
+ if response_success
56
+ print "Successfully updated temperature. Set to #{temp}°C\n"
57
57
  else
58
58
  unknown_error
59
59
  end
@@ -62,11 +62,11 @@ end
62
62
  def lookup_temperature(client)
63
63
  print "Retrieving temperature information\n"
64
64
  environment = client.get_temperature
65
+ inside = environment["inside"]
66
+ outside = environment["outside"]
65
67
  unless environment.nil?
66
- print "Inside Temperature: #{environment["inside"]}°C\n"
67
- if environment['weather'] && environment['outside']
68
- print "Weather in #{environment["city"]}: #{environment['weather'].split('_').map{|e| e.capitalize}.join(" ")} (#{environment["outside"]}°C)\n"
69
- end
68
+ print "Inside Temperature: #{inside["now"]}°C (#{inside["averages"]["today"]}°C todays average)\n"
69
+ print "Outide Temperature: #{outside["now"]}°C (#{outside["weather"]["description"]})\n"
70
70
  else
71
71
  unknown_error
72
72
  end
@@ -92,6 +92,10 @@ def pretty_print_temp(p, max)
92
92
  d = DateTime.parse(p["date"])
93
93
  print d.strftime("%H %p ")
94
94
  temp = p["temperature"]
95
+ if temp.instance_of? String
96
+ print "\n"
97
+ return
98
+ end
95
99
  bar_length = ((temp / max) * max_width).round
96
100
  bar_length.times { print '=' }
97
101
  (max_width - bar_length).times { print ' ' }
@@ -101,7 +105,14 @@ end
101
105
 
102
106
  if options[:history]
103
107
  history = lookup_history client
104
- max = history["data"].map { |p| p["temperature"] }.max
108
+ max = history["data"].map do |p|
109
+ temp = p["temperature"]
110
+ if temp.instance_of? String
111
+ 0
112
+ else
113
+ temp
114
+ end
115
+ end.max
105
116
  history["data"]
106
117
  .reject { |p| DateTime.parse(p["date"]).strftime("%M") != "00" }
107
118
  .each { |p| pretty_print_temp p, max }
data/lib/hiveline.rb CHANGED
@@ -5,43 +5,45 @@ require 'json'
5
5
  module Hiveline
6
6
  class Client
7
7
  include HTTParty
8
- attr_accessor :username, :password, :session
8
+ attr_accessor :username, :password, :session_cache
9
9
 
10
10
  def initialize(username, password)
11
11
  @username = username
12
12
  @password = password
13
13
  end
14
14
 
15
+ def api_session
16
+ session[:ApiSession]
17
+ end
18
+
19
+ def hub_ids
20
+ session[:hubIds]
21
+ end
22
+
15
23
  def session
16
- @session ||= retrieve_session
24
+ @session_cache ||= get_session
17
25
  end
18
26
 
19
27
  def set_temperature(temp)
20
- heating_url = "https://my.hivehome.com/heating/target"
21
- id = self.session
28
+ heating_url = "https://api.hivehome.com/v5/users/#{self.username}/widgets/climate/targetTemperature"
22
29
  response = self.class.put(heating_url, {
23
30
  body: {
24
- id:1,
25
- target:temp
31
+ temperature: temp,
32
+ temperatureUnit: "C"
26
33
  },
27
34
  headers: {
28
- "Cookie" => "hsid=#{id}"
35
+ "Cookie" => "ApiSession=#{self.api_session}",
29
36
  },
30
37
  follow_redirects: false
31
38
  })
32
-
33
- if response.code == 200
34
- JSON.parse(response.body)["target"]
35
- else
36
- nil
37
- end
39
+ response.code == 204
38
40
  end
39
41
 
40
42
  def get_temperature
41
- weather_url = "https://my.hivehome.com/weather"
43
+ weather_url = "https://api.hivehome.com/v5/users/#{self.username}/widgets/temperature"
42
44
  response = self.class.get(weather_url, {
43
45
  headers: {
44
- "Cookie" => "hsid=#{self.session}",
46
+ "Cookie" => "ApiSession=#{self.api_session}",
45
47
  "Content-Type" => "application/json"
46
48
  },
47
49
  follow_redirects: false
@@ -54,10 +56,14 @@ module Hiveline
54
56
  end
55
57
 
56
58
  def get_history
57
- history_url = "https://my.hivehome.com/history/today"
59
+ # Just get the first device, ignore others
60
+ hub_id = hub_ids[0]
61
+ thermostat = get_thermostat hub_id
62
+ thermostat_id = thermostat["id"]
63
+ history_url = "https://api.hivehome.com/v5/users/#{self.username}/widgets/temperature/#{thermostat_id}/history?period=today"
58
64
  response = self.class.get(history_url, {
59
65
  headers: {
60
- "Cookie" => "hsid=#{self.session}",
66
+ "Cookie" => "ApiSession=#{self.api_session}",
61
67
  "Content-Type" => "application/json"
62
68
  },
63
69
  follow_redirects: false
@@ -69,32 +75,37 @@ module Hiveline
69
75
  end
70
76
  end
71
77
 
72
- private
73
-
74
- def retrieve_session
75
- extract_session_id login
78
+ def get_devices(hub_id)
79
+ devices_url = "https://api.hivehome.com/v5/users/#{self.username}/hubs/#{hub_id}/devices"
80
+ response = self.class.get(devices_url, {
81
+ headers: {
82
+ "Cookie" => "ApiSession=#{self.api_session}"
83
+ },
84
+ follow_redirects: false
85
+ })
86
+ if response.code == 200
87
+ JSON.parse(response.body)
88
+ else
89
+ nil
90
+ end
76
91
  end
77
-
78
- def extract_session_id(response)
79
- id_attribute_regex = /^hsid=/
80
- set_cookie_header = response.headers["set-cookie"]
81
- set_cookie_header
82
- .split(";")
83
- .each(&:strip!)
84
- .grep(id_attribute_regex)
85
- .first
86
- .gsub(id_attribute_regex, "")
92
+
93
+ def get_thermostat(hub_id)
94
+ get_devices(hub_id).select { |device| device["type"] == "HAHVACThermostat" }.pop
87
95
  end
88
96
 
89
- def login
90
- login_url = "https://my.hivehome.com/login"
91
- self.class.post(login_url, {
97
+ private
98
+
99
+ def get_session
100
+ login_url = "https://api.hivehome.com/v5/login"
101
+ response = self.class.post(login_url, {
92
102
  body: {
93
103
  username: @username,
94
104
  password: @password
95
105
  },
96
106
  follow_redirects: false
97
107
  })
108
+ JSON.parse(response.body, symbolize_names: true)
98
109
  end
99
110
  end
100
111
  end
@@ -1,3 +1,3 @@
1
1
  module Hiveline
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.6"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hiveline
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Blanchard
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-21 00:00:00.000000000 Z
11
+ date: 2015-04-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty