stekker_easee 1.0.0 → 1.0.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: 2e78ab3f32f01b4210e1d26b6022e5a5600720c59bca4ccb21f41109cb7add51
4
- data.tar.gz: 914f32cb07c37b7d0260a9e6cd9baeb2c51ef0afb8fe1b55e3c25abb09219c79
3
+ metadata.gz: f1cb2855dca8dd2bd2bc7670e2da0db9b31c083e6dd35a80c0eacb78031d173f
4
+ data.tar.gz: 3aabf9fe36a3eb46f2af3062d1daca8db14946e39f6a69002472e0d9a185117d
5
5
  SHA512:
6
- metadata.gz: e71594d0bf1f64c3d010d4d0f4df140927266bf3f8537b62c5b04b4ea375bec003bc01bc2d7f2804f26b92c4332718bcdfa8d00630ec480d4599ee7b146a3b69
7
- data.tar.gz: 57261c2b415fc0e8bdb8a86de3684afcc554040d1539f7ab3b27cc6897ea4186a22634efb697e4d9bbe1b064bd389d6493e44bba44399afb27772ab04fb59c5f
6
+ metadata.gz: b19294d36bbea358b1f67a97b0fd3a726c6d6b113596ce631adf8585b9731dc6af0e258597fe92414ecea34736b6cfd1232253d1b1b4925786e83e94e03b8759
7
+ data.tar.gz: 1c0d69be491fd212755acaea9fd1b0e7f24801cabe177e7c4aaa419088632d51c9be26b7b4e7db312ffd1394c71051abfeb263bbd0e344f0d83d84887357b38a
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- stekker_easee (1.0.0)
4
+ stekker_easee (1.0.1)
5
5
  activemodel
6
6
  activesupport
7
7
  faraday
@@ -10,16 +10,17 @@ PATH
10
10
  GEM
11
11
  remote: https://rubygems.org/
12
12
  specs:
13
- activemodel (7.0.4.3)
14
- activesupport (= 7.0.4.3)
15
- activesupport (7.0.4.3)
13
+ activemodel (7.0.8)
14
+ activesupport (= 7.0.8)
15
+ activesupport (7.0.8)
16
16
  concurrent-ruby (~> 1.0, >= 1.0.2)
17
17
  i18n (>= 1.6, < 2)
18
18
  minitest (>= 5.1)
19
19
  tzinfo (~> 2.0)
20
- addressable (2.8.1)
20
+ addressable (2.8.5)
21
21
  public_suffix (>= 2.0.2, < 6.0)
22
22
  ast (2.4.2)
23
+ base64 (0.1.1)
23
24
  concurrent-ruby (1.2.2)
24
25
  crack (0.4.5)
25
26
  rexml
@@ -51,61 +52,69 @@ GEM
51
52
  faraday (~> 1.0)
52
53
  gem-release (2.2.2)
53
54
  hashdiff (1.0.1)
54
- i18n (1.12.0)
55
+ i18n (1.14.1)
55
56
  concurrent-ruby (~> 1.0)
56
57
  json (2.6.3)
57
- minitest (5.18.0)
58
+ language_server-protocol (3.17.0.3)
59
+ minitest (5.20.0)
58
60
  multipart-post (2.3.0)
59
- parallel (1.22.1)
60
- parser (3.2.1.1)
61
+ parallel (1.23.0)
62
+ parser (3.2.2.3)
61
63
  ast (~> 2.4.1)
62
- public_suffix (5.0.1)
63
- rack (3.0.7)
64
+ racc
65
+ public_suffix (5.0.3)
66
+ racc (1.7.1)
67
+ rack (3.0.8)
64
68
  rainbow (3.1.1)
65
69
  rake (13.0.6)
66
- regexp_parser (2.7.0)
67
- rexml (3.2.5)
70
+ regexp_parser (2.8.1)
71
+ rexml (3.2.6)
68
72
  rspec (3.12.0)
69
73
  rspec-core (~> 3.12.0)
70
74
  rspec-expectations (~> 3.12.0)
71
75
  rspec-mocks (~> 3.12.0)
72
- rspec-core (3.12.1)
76
+ rspec-core (3.12.2)
73
77
  rspec-support (~> 3.12.0)
74
- rspec-expectations (3.12.2)
78
+ rspec-expectations (3.12.3)
75
79
  diff-lcs (>= 1.2.0, < 2.0)
76
80
  rspec-support (~> 3.12.0)
77
- rspec-mocks (3.12.4)
81
+ rspec-mocks (3.12.6)
78
82
  diff-lcs (>= 1.2.0, < 2.0)
79
83
  rspec-support (~> 3.12.0)
80
- rspec-support (3.12.0)
81
- rubocop (1.48.1)
84
+ rspec-support (3.12.1)
85
+ rubocop (1.56.3)
86
+ base64 (~> 0.1.1)
82
87
  json (~> 2.3)
88
+ language_server-protocol (>= 3.17.0)
83
89
  parallel (~> 1.10)
84
- parser (>= 3.2.0.0)
90
+ parser (>= 3.2.2.3)
85
91
  rainbow (>= 2.2.2, < 4.0)
86
92
  regexp_parser (>= 1.8, < 3.0)
87
93
  rexml (>= 3.2.5, < 4.0)
88
- rubocop-ast (>= 1.26.0, < 2.0)
94
+ rubocop-ast (>= 1.28.1, < 2.0)
89
95
  ruby-progressbar (~> 1.7)
90
96
  unicode-display_width (>= 2.4.0, < 3.0)
91
- rubocop-ast (1.28.0)
97
+ rubocop-ast (1.29.0)
92
98
  parser (>= 3.2.1.0)
93
- rubocop-capybara (2.17.1)
99
+ rubocop-capybara (2.18.0)
94
100
  rubocop (~> 1.41)
95
- rubocop-rails (2.18.0)
101
+ rubocop-factory_bot (2.23.1)
102
+ rubocop (~> 1.33)
103
+ rubocop-rails (2.21.0)
96
104
  activesupport (>= 4.2.0)
97
105
  rack (>= 1.1)
98
106
  rubocop (>= 1.33.0, < 2.0)
99
- rubocop-rspec (2.19.0)
107
+ rubocop-rspec (2.24.0)
100
108
  rubocop (~> 1.33)
101
109
  rubocop-capybara (~> 2.17)
110
+ rubocop-factory_bot (~> 2.22)
102
111
  ruby-progressbar (1.13.0)
103
112
  ruby2_keywords (0.0.5)
104
- timecop (0.9.6)
113
+ timecop (0.9.8)
105
114
  tzinfo (2.0.6)
106
115
  concurrent-ruby (~> 1.0)
107
116
  unicode-display_width (2.4.2)
108
- webmock (3.18.1)
117
+ webmock (3.19.1)
109
118
  addressable (>= 2.8.0)
110
119
  crack (>= 0.3.2)
111
120
  hashdiff (>= 0.4.0, < 2.0.0)
data/README.md CHANGED
@@ -61,15 +61,11 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/stekke
61
61
  ## Publishing
62
62
 
63
63
  ```bash
64
- # Bump the gem version
65
- # See https://github.com/svenfuchs/gem-release#gem-bump
66
- gem bump --version [major|minor|patch]
67
-
68
- # Release the gem to rubygems.org
69
- # See https://github.com/svenfuchs/gem-release#gem-release
70
- gem release
71
-
72
- # Push the commit and tag to git
73
- git push
74
- git push --tags
64
+ # - bumps the gem version to the next major, minor or patch version.
65
+ # - creates commit for the version bump
66
+ # - tags the commit
67
+ # - pushes the commit and tag
68
+ # - publishes the gem to Rubygems
69
+ bin/release [major|minor|patch]
70
+ # See also https://github.com/svenfuchs/gem-release#gem-bump
75
71
  ```
data/bin/release ADDED
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ # Read major/minor/patch argument
7
+ version="$1"
8
+
9
+ # Do a pretend version bump to determine what the new version should be
10
+ bumped_version=$(gem bump "$version" --pretend --no-commit | awk '{ print $4 }' | tr -d '[:space:]')
11
+
12
+ # Use ruby to get the root level directory name
13
+ gem_name=$(ruby -e "puts File.basename(Dir.pwd)")
14
+
15
+ # Update version file
16
+ gem bump --version "$bumped_version" --no-commit
17
+
18
+ # Run bundle install to ensure gem version in Gemfile is updated
19
+ bundle install
20
+
21
+ # Stage Gemfile.lock and the version file
22
+ git add Gemfile.lock "lib/$gem_name/version.rb"
23
+
24
+ # Finally create the bump commit
25
+ git commit -m "Bump $gem_name to $bumped_version"
26
+
27
+ # Create a tag, push the commit and tag, and release to Rubygems
28
+ gem bump --version "$bumped_version" --no-commit --tag --push --release
@@ -0,0 +1,12 @@
1
+ module Easee
2
+ class Charger
3
+ def initialize(data)
4
+ @data = data.symbolize_keys
5
+ end
6
+
7
+ def id = @data.fetch(:id)
8
+ def name = @data.fetch(:name)
9
+ def color = @data.fetch(:color)
10
+ def product_code = @data.fetch(:productCode)
11
+ end
12
+ end
data/lib/easee/client.rb CHANGED
@@ -30,6 +30,13 @@ module Easee
30
30
  post("/api/chargers/#{charger_id}/pair", query: { pinCode: pin_code })
31
31
  end
32
32
 
33
+ # https://developer.easee.cloud/reference/get_api-chargers
34
+ def chargers
35
+ get("/api/chargers").then do |response|
36
+ response.body.map { |data| Charger.new(data) }
37
+ end
38
+ end
39
+
33
40
  # https://developer.easee.cloud/reference/get_api-chargers-id-state
34
41
  def state(charger_id)
35
42
  get("/api/chargers/#{charger_id}/state")
@@ -46,11 +53,13 @@ module Easee
46
53
  post("/api/chargers/#{charger_id}/commands/resume_charging")
47
54
  end
48
55
 
56
+ # https://developer.easee.cloud/reference/get_api-chargers-id-config
49
57
  def configuration(charger_id)
50
58
  get("/api/chargers/#{charger_id}/config")
51
59
  .then { |response| Configuration.new(response.body) }
52
60
  end
53
61
 
62
+ # https://developer.easee.cloud/reference/get_api-chargers-id-site
54
63
  def site(charger_id)
55
64
  get("/api/chargers/#{charger_id}/site")
56
65
  .then { |response| Site.new(response.body) }
@@ -108,7 +117,11 @@ module Easee
108
117
  retry
109
118
  end
110
119
  rescue Faraday::Error => e
111
- raise Errors::RequestFailed.new("Request returned status #{e.response_status}", e.response)
120
+ if e.response_status == 429 # HTTP 429 TooManyRequests
121
+ raise Errors::RateLimitExceeded.new("Rate limit exceeded", e.response)
122
+ else
123
+ raise Errors::RequestFailed.new("Request returned status #{e.response_status}", e.response)
124
+ end
112
125
  end
113
126
 
114
127
  def access_token
data/lib/easee/errors.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  module Easee
2
2
  module Errors
3
- class Base < ::StandardError; end
3
+ class Base < ::StandardError
4
+ def retryable? = false
5
+ end
4
6
 
5
7
  class RequestFailed < Base
6
8
  attr_reader :response
@@ -10,5 +12,9 @@ module Easee
10
12
  super(message)
11
13
  end
12
14
  end
15
+
16
+ class RateLimitExceeded < RequestFailed
17
+ def retryable? = true
18
+ end
13
19
  end
14
20
  end
data/lib/easee/site.rb CHANGED
@@ -9,12 +9,14 @@ module Easee
9
9
  def building_number = address.fetch(:buildingNumber)
10
10
  def zip = address.fetch(:zip)
11
11
  def area = address.fetch(:area)
12
- def country_id = address.fetch(:country).fetch(:id)
12
+ def country_id = country[:id]
13
13
  def latitude = address.fetch(:latitude)
14
14
  def longitude = address.fetch(:longitude)
15
15
 
16
16
  private
17
17
 
18
+ def country = address.fetch(:country) || {}
19
+
18
20
  def address
19
21
  @address ||= @data.fetch(:address)
20
22
  end
data/lib/easee/state.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  module Easee
2
2
  class State
3
+ OP_MODE_UNKNOWN = :unknown
4
+
3
5
  CHARGER_OP_MODES = {
4
6
  0 => :offline,
5
7
  1 => :disconnected,
@@ -21,12 +23,15 @@ module Easee
21
23
  def meter_reading
22
24
  MeterReading.new(
23
25
  reading_kwh: @data.fetch(:lifetimeEnergy),
24
- timestamp: Time.current,
26
+ timestamp: Time.zone.parse(@data.fetch(:latestPulse)),
25
27
  )
26
28
  end
27
29
 
28
30
  private
29
31
 
30
- def charger_op_mode = CHARGER_OP_MODES.fetch(@data.fetch(:chargerOpMode))
32
+ def charger_op_mode
33
+ numeric_op_mode = @data.fetch(:chargerOpMode)
34
+ CHARGER_OP_MODES.fetch(numeric_op_mode) { OP_MODE_UNKNOWN }
35
+ end
31
36
  end
32
37
  end
data/lib/easee/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Easee
2
- VERSION = "1.0.0".freeze
2
+ VERSION = "1.0.1".freeze
3
3
  end
data/lib/stekker_easee.rb CHANGED
@@ -10,6 +10,7 @@ require_relative "easee/errors"
10
10
  require_relative "easee/meter_reading"
11
11
  require_relative "easee/site"
12
12
  require_relative "easee/state"
13
+ require_relative "easee/charger"
13
14
 
14
15
  module Easee
15
16
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stekker_easee
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Team Stekker
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-04-12 00:00:00.000000000 Z
11
+ date: 2023-09-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -83,9 +83,10 @@ files:
83
83
  - README.md
84
84
  - Rakefile
85
85
  - bin/console
86
+ - bin/release
86
87
  - bin/setup
87
88
  - easee.gemspec
88
- - lib/easee.rb
89
+ - lib/easee/charger.rb
89
90
  - lib/easee/client.rb
90
91
  - lib/easee/configuration.rb
91
92
  - lib/easee/errors.rb
@@ -117,7 +118,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
117
118
  - !ruby/object:Gem::Version
118
119
  version: '0'
119
120
  requirements: []
120
- rubygems_version: 3.4.6
121
+ rubygems_version: 3.4.18
121
122
  signing_key:
122
123
  specification_version: 4
123
124
  summary: Connect to your Easee charger
data/lib/easee.rb DELETED
@@ -1,15 +0,0 @@
1
- require "faraday"
2
- require "active_support/core_ext/time/calculations"
3
- require "active_support/isolated_execution_state"
4
- require "active_support/core_ext/hash"
5
-
6
- require_relative "easee/version"
7
- require_relative "easee/client"
8
- require_relative "easee/configuration"
9
- require_relative "easee/errors"
10
- require_relative "easee/meter_reading"
11
- require_relative "easee/site"
12
- require_relative "easee/state"
13
-
14
- module Easee
15
- end