atrea_control 1.2.1 → 1.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3801a6bbd9c137e26eecbf9adcb43d8d1ba7fd7dbcc19be4a95ff1ae5a189a47
4
- data.tar.gz: efd8adb1f53738b28aac974260c0fca23d46ab3329ec745d2fce6d5bb73c43cf
3
+ metadata.gz: 4a5ccc9d8596b46a4ec4c2eb98e26b820c62bfdbf91c8c1b732adc9f858f31bf
4
+ data.tar.gz: bac1c0183608fe7f16c679578203fba54c10d8e2270be7d0bf68fb1f17d7cce4
5
5
  SHA512:
6
- metadata.gz: a22728dedc9c10022d86dc433d81cacd91193a1851f4302d066763fa8f600c9a632dc02d235f97560d7300f72618ce25c57f83e4581085d049d41c36f7e0b340
7
- data.tar.gz: e4348ee806d25350c3b2d1f861cec60f8b77504005aabd57115a82966ebb084735f7a8d04a4f79538dbbaa9dff777a34429551d90f302ebdf20dfddc632a09a2
6
+ metadata.gz: 657e441b8aa3ecfaa5eb8905ff6e22064d70d43984156bd15c6b7dfc17f6ed92e1a7c8318cd7febeb2ce68c621ff06f69561cd8861b642f2313f4421df098597
7
+ data.tar.gz: 97dcc1fa4810f952e4b89d2f610c93a2359debb663b0138f8bf3d5771ca9e4ddfb96be2d9c8e0a0a2a2667f1daa4533606704adfc9a89571a4d0852800cf7bf1
data/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
+ .DS_Store
1
2
  /.idea
2
3
  /.bundle/
3
4
  /.yardoc
data/CHANGELOG.md CHANGED
@@ -1,4 +1,9 @@
1
1
  ## [Unreleased]
2
+ ## [1.3.0] - 2021-12-11
3
+ ### Changed
4
+ - store auth tokens outside
5
+ - minimize selenium only for login
6
+
2
7
  ## [1.2.1] - 2021-10-30
3
8
  ### Changed
4
9
  - login procedure
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- atrea_control (1.2.1)
4
+ atrea_control (1.3.0)
5
5
  nokogiri (~> 1.12)
6
6
  rest-client (~> 2.1)
7
7
  selenium-webdriver (~> 3.142)
@@ -25,9 +25,9 @@ GEM
25
25
  http-cookie (1.0.4)
26
26
  domain_name (~> 0.5)
27
27
  method_source (1.0.0)
28
- mime-types (3.3.1)
28
+ mime-types (3.4.1)
29
29
  mime-types-data (~> 3.2015)
30
- mime-types-data (3.2021.0901)
30
+ mime-types-data (3.2021.1115)
31
31
  netrc (0.11.0)
32
32
  nokogiri (1.12.5-x86_64-darwin)
33
33
  racc (~> 1.4)
@@ -14,6 +14,8 @@ module AtreaControl
14
14
  # @return [DateTime] store time of last update
15
15
  attr_reader :valid_for
16
16
 
17
+ attr_accessor :user_id, :unit_id, :auth_token
18
+
17
19
  # @param [String] login
18
20
  # @param [String] password
19
21
  # @param [Hash] sensors_map which box is related to sensor ID
@@ -32,7 +34,7 @@ module AtreaControl
32
34
 
33
35
  options = Selenium::WebDriver::Firefox::Options.new
34
36
  options.headless! unless ENV["NO_HEADLESS"]
35
- @driver ||= Selenium::WebDriver.for :firefox, options: options
37
+ @driver ||= Selenium::WebDriver.for :firefox, capabilities: [options]
36
38
  end
37
39
 
38
40
  def logged?
@@ -48,10 +50,12 @@ module AtreaControl
48
50
  @login_in_progress = true
49
51
  logger.debug "start new login"
50
52
  driver.get CONTROL_URI
51
- submit_login_form if user.nil? || !logged?
53
+ submit_login_form unless logged?
52
54
  finish_login
53
- @login_in_progress = false
55
+ refresh!
54
56
  inspect
57
+ ensure
58
+ @login_in_progress = false
55
59
  end
56
60
 
57
61
  # Submit given credentials and proceed login
@@ -70,26 +74,30 @@ module AtreaControl
70
74
  def open_dashboard
71
75
  uri = driver.find_element(tag_name: "object").attribute "data"
72
76
  driver.get uri
77
+ user_id && unit_id && auth_token
73
78
  logger.debug "#{name} login success"
74
79
  end
75
80
 
76
81
  # @return [String]
77
82
  def name
78
- return unless logged?
79
-
80
- container = driver.find_element css: "div#pageTitle > h2"
81
- container.text
82
- end
83
-
84
- # @return [String] ID of logged user
85
- def user_id
86
- @user_id ||= driver.execute_script("return window._user")
87
- end
88
-
89
- # @return [String] ID of recuperation unit
90
- def unit_id
91
- @unit_id ||= driver.execute_script("return window._unit")
92
- end
83
+ @name ||= driver.find_element(css: "div#pageTitle > h2")&.text if logged?
84
+ @name
85
+ end
86
+
87
+ # # @return [String] ID of logged user
88
+ # def user_id
89
+ # @user_id ||= driver.execute_script("return window._user")
90
+ # end
91
+ #
92
+ # # @return [String] ID of recuperation unit
93
+ # def unit_id
94
+ # @unit_id ||= driver.execute_script("return window._unit")
95
+ # end
96
+ #
97
+ # # @return [String] session token
98
+ # def auth_token
99
+ # @auth_token ||= user&.[]("auth")
100
+ # end
93
101
 
94
102
  # Window.user object from atrea
95
103
  # @return [Hash, nil]
@@ -107,8 +115,8 @@ module AtreaControl
107
115
 
108
116
  # quit selenium browser
109
117
  def close
110
- @user_auth = nil
111
118
  driver.quit
119
+ ensure
112
120
  remove_instance_variable :@driver
113
121
  end
114
122
 
@@ -116,8 +124,7 @@ module AtreaControl
116
124
 
117
125
  def as_json(_options = nil)
118
126
  {
119
- logged: logged?,
120
- current_mode: current_mode_name,
127
+ current_mode: current_mode,
121
128
  current_power: current_power,
122
129
  outdoor_temperature: outdoor_temperature,
123
130
  valid_for: valid_for,
@@ -130,9 +137,9 @@ module AtreaControl
130
137
  as_json.to_json(*args)
131
138
  end
132
139
 
133
- def inspect
134
- "<AtreaControl name: '#{name}' outdoor_temperature: '#{outdoor_temperature}°C' current_power: '#{current_power}%' current_mode: '#{current_mode_name}' valid_for: '#{valid_for}'>"
135
- end
140
+ # def inspect
141
+ # "<AtreaControl name: '#{name}' outdoor_temperature: '#{outdoor_temperature}°C' current_power: '#{current_power}%' current_mode: '#{current_mode}' valid_for: '#{valid_for}'>"
142
+ # end
136
143
 
137
144
  def call_unit!
138
145
  return false if @login_in_progress
@@ -141,18 +148,25 @@ module AtreaControl
141
148
  parse_response(response_comm_unit)
142
149
  @valid_for = Time.now
143
150
  as_json
144
- rescue RestClient::Forbidden
145
- logger.debug "session expired..."
146
- close if @logged
147
- login && call_unit!
148
151
  end
149
152
 
150
153
  private
151
154
 
155
+ # @see scripts.php -> loadRD5Values(node, init)
156
+ # @note
157
+ # if(values[key]>32767) values[key]-=65536;
158
+ # if(params[key] && params[key].offset)
159
+ # values[key]=values[key]-params[key].offset;
160
+ # if(params[key] && params[key].coef)
161
+ # values[key]=values[key]/params[key].coef;
152
162
  def parse_response(response)
153
163
  xml = Nokogiri::XML response.body
154
164
  sensors_values = @sensors.transform_values do |id|
155
- xml.xpath("//O[@I=\"#{id}\"]/@V").last&.value
165
+ value = xml.xpath("//O[@I=\"#{id}\"]/@V").last&.value.to_i
166
+ value -= 65_536 if value > 32_767
167
+ # value -= 0 if "offset"
168
+ # value -= 0 if "coef"
169
+ value
156
170
  end
157
171
  refresh_data(sensors_values)
158
172
  end
@@ -160,7 +174,7 @@ module AtreaControl
160
174
  # @param [Hash] values
161
175
  # @return [Hash]
162
176
  def refresh_data(values)
163
- @outdoor_temperature = values[:outdoor_temperature].to_f / 10
177
+ @outdoor_temperature = values[:outdoor_temperature].to_f / 10.0
164
178
  @current_power = values[:current_power].to_f
165
179
  @current_mode = mode_map[values[:current_mode]]
166
180
 
@@ -169,7 +183,7 @@ module AtreaControl
169
183
 
170
184
  # ? I10204 ?
171
185
  def mode_map
172
- { "0" => "Vypnuto", "1" => "Automat", "2" => "Větrání", "6" => "Rozvážení" }
186
+ { 0 => "Vypnuto", 1 => "Automat", 2 => "Větrání", 6 => "Rozvážení" }
173
187
  end
174
188
 
175
189
  def logger
@@ -194,13 +208,21 @@ module AtreaControl
194
208
  # @return [RestClient::Response]
195
209
  def response_comm_unit
196
210
  params = {
197
- _user: user_id,
211
+ _user: user_id.to_i,
198
212
  _unit: unit_id,
199
- auth: user&.[]("auth"),
213
+ auth: auth_token || "null",
200
214
  _t: "config/xml.xml",
201
215
  }
202
216
  autologin_token = CGI.escape([@login, @password].join("\b"))
203
217
  RestClient.get "https://control.atrea.eu/comm/sw/unit.php", { Cookie: "autoLogin=#{autologin_token}", params: params }
204
218
  end
219
+
220
+ # Update tokens based on current state
221
+ def refresh!
222
+ @user_id = driver.execute_script("return window._user")
223
+ @unit_id = driver.execute_script("return window._unit")
224
+ @auth_token = user&.[]("auth")
225
+ end
226
+
205
227
  end
206
228
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module AtreaControl
4
- VERSION = "1.2.1"
4
+
5
+ VERSION = "1.3.0"
6
+
5
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: atrea_control
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lukáš Pokorný
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-10-30 00:00:00.000000000 Z
11
+ date: 2021-12-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri