atrea_control 1.2.1 → 1.3.0

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: 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