senec 0.7.2 → 0.9.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: eabf3cf6c200b6e167e68ba309a8a0365f1ad3c388bc6e6797460606ba81d13e
4
- data.tar.gz: e7d1742ca594b43bb8a1636e3faea98784a468efc1a4fc86b96052a9b613f26b
3
+ metadata.gz: c99082ac76970b9dd8c23b3d847c329bae0a1499108cb4da23cc6890db0799c1
4
+ data.tar.gz: 2a7b3fd24ec219b64ad3345745d3dbe783293327849bf225356d63b3b02a1ca8
5
5
  SHA512:
6
- metadata.gz: 9a7ac30d46616071e3d0a6d57151ff21f3c2a219e347aceda27423f82fefa9c5b7dddbcdcbeff840573f4b35c82fff575e2d3bbbc3caa526822b147a82b705b5
7
- data.tar.gz: 511506136b9baf3839e92aa9ca66fb7a9354e7a924c6290e0a24ba9ce47d2d64d1f501bcc8caba0f58def09d620b57f9021781ce06f3bff5d76094a17cdeb150
6
+ metadata.gz: 046047abcc8df94341e6da4e1209bd828045a93c0d64f4970b49fdffa41afd88c815194b64372ceee09cacf30dbdacdd12be36a6d6d0bdf40a6b5a8f04a367c7
7
+ data.tar.gz: 4620d56810a324f10a9a14607afb35f198e6275c77eea18d41aa5ee1339ce0f97e207ba82a5f9d12636bcaacef8709e273dcd8dc1f524bf9b0ea2825b8a06421
@@ -2,11 +2,8 @@ module Senec
2
2
  # For a full list of available vars, see http://[IP-of-your-SENEC]/vars.html
3
3
  # Comments taken from https://gist.github.com/smashnet/82ad0b9d7f0ba2e5098e6649ba08f88a
4
4
  BASIC_REQUEST = {
5
- STATISTIC: {
6
- CURRENT_STATE: '', # Current state of the system (int, see SYSTEM_STATE_NAME)
7
- MEASURE_TIME: '' # Unix timestamp for above values (ms)
8
- },
9
5
  ENERGY: {
6
+ STAT_STATE: '', # Current state of the system (int, see SYSTEM_STATE_NAME)
10
7
  GUI_BAT_DATA_CURRENT: '', # Battery charge current: negative if discharging, positiv if charging (A)
11
8
  GUI_BAT_DATA_FUEL_CHARGE: '', # Remaining battery (percent)
12
9
  GUI_BAT_DATA_POWER: '', # Battery charge power: negative if discharging, positiv if charging (W)
@@ -16,6 +13,10 @@ module Senec
16
13
  GUI_INVERTER_POWER: '', # PV production (W)
17
14
  STAT_HOURS_OF_OPERATION: '' # Appliance hours of operation
18
15
  },
16
+ RTC: {
17
+ UTC_OFFSET: '',
18
+ WEB_TIME: ''
19
+ },
19
20
  PV1: {
20
21
  MPP_POWER: '' # List: MPP power (W)
21
22
  },
data/lib/senec/request.rb CHANGED
@@ -4,11 +4,14 @@ require 'senec/constants'
4
4
 
5
5
  module Senec
6
6
  class Request
7
- def initialize(host:, state_names: nil)
7
+ def initialize(host:, schema: 'http', state_names: nil)
8
8
  @host = host
9
+ @schema = schema
9
10
  @state_names = state_names
10
11
  end
11
12
 
13
+ attr_reader :host, :schema, :state_names
14
+
12
15
  def house_power
13
16
  get('ENERGY', 'GUI_HOUSE_POW')
14
17
  end
@@ -50,17 +53,20 @@ module Senec
50
53
  end
51
54
 
52
55
  def current_state
53
- get('STATISTIC', 'CURRENT_STATE')
56
+ get('ENERGY', 'STAT_STATE')
54
57
  end
55
58
 
56
59
  def current_state_name
57
- throw RuntimeError, 'No state names provided!' unless @state_names
60
+ throw RuntimeError, 'No state names provided!' unless state_names
58
61
 
59
- @state_names[current_state]
62
+ state_names[current_state]
60
63
  end
61
64
 
62
65
  def measure_time
63
- get('STATISTIC', 'MEASURE_TIME')
66
+ web_time = get('RTC', 'WEB_TIME')
67
+ utc_offset = get('RTC', 'UTC_OFFSET')
68
+
69
+ web_time - (utc_offset * 60)
64
70
  end
65
71
 
66
72
  private
@@ -72,9 +78,13 @@ module Senec
72
78
  value.map do |v|
73
79
  Senec::Value.new(v).decoded
74
80
  end
75
- else
81
+ elsif value
76
82
  Senec::Value.new(value).decoded
83
+ else
84
+ raise Senec::Error, "Value missing for #{keys.join('.')}"
77
85
  end
86
+ rescue DecodingError => e
87
+ raise Senec::Error, "Decoding failed for #{keys.join('.')}: #{e.message}"
78
88
  end
79
89
 
80
90
  def response
@@ -84,7 +94,8 @@ module Senec
84
94
  body: JSON.generate(Senec::BASIC_REQUEST),
85
95
  headers: {
86
96
  'Content-Type' => 'application/x-www-form-urlencoded; charset=UTF-8'
87
- }
97
+ },
98
+ verify: false
88
99
  )
89
100
  raise Senec::Error, res.message.to_s unless res.success?
90
101
 
@@ -93,7 +104,7 @@ module Senec
93
104
  end
94
105
 
95
106
  def url
96
- "http://#{@host}/lala.cgi"
107
+ "#{schema}://#{host}/lala.cgi"
97
108
  end
98
109
  end
99
110
  end
data/lib/senec/state.rb CHANGED
@@ -2,11 +2,12 @@ require 'httparty'
2
2
 
3
3
  module Senec
4
4
  class State
5
- def initialize(host:)
5
+ def initialize(host:, schema: 'http')
6
6
  @host = host
7
+ @schema = schema
7
8
  end
8
9
 
9
- attr_reader :host
10
+ attr_reader :host, :schema
10
11
 
11
12
  # Extract state names from JavaScript file, which is formatted like this:
12
13
  #
@@ -31,7 +32,7 @@ module Senec
31
32
 
32
33
  def response
33
34
  @response ||= begin
34
- res = HTTParty.get url
35
+ res = HTTParty.get url, verify: false
35
36
  raise Senec::Error, res.message unless res.success?
36
37
 
37
38
  res.body
@@ -40,7 +41,7 @@ module Senec
40
41
 
41
42
  # Use the JavaScript file with German names from the SENEC web interface
42
43
  def url
43
- "http://#{host}/js/DE-de.js"
44
+ "#{schema}://#{host}/js/DE-de.js"
44
45
  end
45
46
  end
46
47
  end
data/lib/senec/value.rb CHANGED
@@ -1,14 +1,17 @@
1
1
  module Senec
2
2
  class Value
3
- def initialize(data)
4
- @data = data
3
+ def initialize(raw)
4
+ @raw = raw
5
+ @prefix, @value = raw&.split('_')
5
6
  end
6
7
 
7
- def decoded
8
- parts = @data.split('_')
9
- prefix = parts[0]
10
- value = parts[1]
8
+ attr_reader :prefix, :value, :raw
9
+
10
+ def valid?
11
+ prefix && PREFIXES.include?(prefix)
12
+ end
11
13
 
14
+ def decoded
12
15
  case prefix
13
16
  when 'fl'
14
17
  decoded_float(value)
@@ -18,7 +21,7 @@ module Senec
18
21
  value
19
22
  # TODO: There are some more prefixes to handle
20
23
  else
21
- raise ArgumentError, "#{@data} has unknown prefix!"
24
+ raise Senec::DecodingError, "Unknown value '#{@raw}'"
22
25
  end
23
26
  end
24
27
 
@@ -28,6 +31,9 @@ module Senec
28
31
 
29
32
  private
30
33
 
34
+ PREFIXES = %w[fl i3 u1 u3 u6 u8 st].freeze
35
+ private_constant :PREFIXES
36
+
31
37
  def decoded_float(hex)
32
38
  ["0x#{hex}".to_i(16)].pack('L').unpack1('F').round(1)
33
39
  end
data/lib/senec/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Senec
2
- VERSION = '0.7.2'.freeze
2
+ VERSION = '0.9.0'.freeze
3
3
  end
data/lib/senec.rb CHANGED
@@ -4,4 +4,5 @@ require 'senec/request'
4
4
 
5
5
  module Senec
6
6
  class Error < StandardError; end
7
+ class DecodingError < StandardError; end
7
8
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: senec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.2
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Georg Ledermann
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-04-23 00:00:00.000000000 Z
11
+ date: 2023-08-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -73,7 +73,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
73
73
  - !ruby/object:Gem::Version
74
74
  version: '0'
75
75
  requirements: []
76
- rubygems_version: 3.4.12
76
+ rubygems_version: 3.4.19
77
77
  signing_key:
78
78
  specification_version: 4
79
79
  summary: Unofficial Ruby Client for SENEC Home