sunnycarcharger-agent 1.0.2 → 1.1.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: d1521d41056f5682fc870c43ba5c1568be1085f2ccd90c0df1cf633f534e2821
4
- data.tar.gz: 64f40fa8d301bcdf823358acadbd980b147e6ae46feeea6e8f1bad0a28fd659a
3
+ metadata.gz: e597967d1cfd8c1ee46871b7a305827914023f8beeb15e79b3a6aaf1b0682d1b
4
+ data.tar.gz: d59ea067d905fc3f28b5c25f330bf91351bd41574fd8eb8b3030799417633fb0
5
5
  SHA512:
6
- metadata.gz: 4501815a3e3688f24006c82ac7de05875d136be46a26c4dd6717c325dd76fcc5af2cd329f50aa1c095ed457eaf0059b68eef7b9514893bd4066072013f127390
7
- data.tar.gz: 421fa9325aebb37f67ebc331db771b7487722099c0b9c1bffd171ef3dd02498fa0281d8fd3c74c6bde6da17eb84163f6c5532ee5ca994d63d2e0910a35dc897a
6
+ metadata.gz: 71a65178b4a571925bed92ef6b3cc4b59a9804ae3e9dde69def469183a666c23535e417e6f33da634c33f817e1502199bc22089b1c0db3bd2aed0bc045dc56d8
7
+ data.tar.gz: 1b2a926d280593da53996986ed39d8e32c9b6a99393560321b9a1c3044b1990262afb016e31c5850b0382cbbb4929a70e173ec4d5dc1dbb72fd27a5a8b842a41
data/README.md CHANGED
@@ -20,9 +20,13 @@ gem install sunnycarcharger-agent
20
20
  ## Usage
21
21
 
22
22
  ```plain
23
- FRONIUS_IP=192.168.1.2 WEB_TOKEN=<token from sunnycarcharger.com> sunnycarcharger-agent
23
+ FRONIUS_IP=192.168.1.2:5757 WEB_TOKEN=<token from sunnycarcharger.com> sunnycarcharger-agent
24
+ # or
25
+ FRONIUS_IPS=192.168.1.2:5757,192.168.1.3:5757 WEB_TOKEN=<token from sunnycarcharger.com> sunnycarcharger-agent
24
26
  ```
25
27
 
28
+ Use either `$FRONIUS_IPS` or `$FRONIUS_IP` to provide a comma separated list of IP address that the Fronius inverter might be available on. Include the `:port` if its not the default port of `80`.
29
+
26
30
  ## License
27
31
 
28
32
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
@@ -2,14 +2,16 @@
2
2
 
3
3
  require "sunnycarcharger/agent"
4
4
 
5
- puts "Fronius IP address: #{Config.fronius_ip}"
5
+ puts "Fronius IP addresses: #{Config.fronius_ips.join(", ")}"
6
6
  puts "Web URL: #{Config.web_url}"
7
7
 
8
8
  startup_errors = false
9
9
 
10
10
  fronius_client = Sunnycarcharger::Agent::Fronius.new
11
11
  unless fronius_client.connected?
12
- warn "ERROR: Fronius #{Config.fronius_ip} could not be connected"
12
+ Config.fronius_ips.each do |ip|
13
+ warn "ERROR: Fronius #{ip} could not be connected"
14
+ end
13
15
  startup_errors = true
14
16
  end
15
17
  web_client = Sunnycarcharger::Agent::Web.new
@@ -24,7 +26,9 @@ loop do
24
26
  begin
25
27
  invertor_data = fronius_client.fetch
26
28
  rescue Faraday::ConnectionFailed, Errno::ECONNREFUSED
27
- warn "ERROR: Fronius #{Config.fronius_ip} could not be connected"
29
+ Config.fronius_ips.each do |ip|
30
+ warn "ERROR: Fronius #{ip} could not be connected"
31
+ end
28
32
  end
29
33
 
30
34
  begin
@@ -8,12 +8,23 @@ class AgentConfig < Anyway::Config
8
8
  attr_config refresh_interval: 1 # minutes
9
9
 
10
10
  attr_config :fronius_ip
11
+ attr_config fronius_ips: []
11
12
 
12
13
  extend_options do |parser, config|
13
14
  parser.on_tail "-h", "--help" do
14
15
  puts parser
15
16
  end
16
17
  end
18
+
19
+ on_load do
20
+ if fronius_ip
21
+ if fronius_ip.is_a?(Array)
22
+ self.fronius_ips = fronius_ip
23
+ elsif fronius_ip.is_a?(String)
24
+ self.fronius_ips = [fronius_ip]
25
+ end
26
+ end
27
+ end
17
28
  end
18
29
 
19
30
  Config = AgentConfig.new
@@ -1,36 +1,64 @@
1
1
  require "faraday"
2
2
 
3
3
  class Sunnycarcharger::Agent::Fronius
4
- def initialize(ip: Config.fronius_ip)
5
- raise ArgumentError, "Missing Fronius IP address" unless ip
6
- @ip = ip
4
+ def initialize(ips: Config.fronius_ips)
5
+ raise ArgumentError, "Missing Fronius IP addresses" unless ips
6
+ @ips = ips
7
7
  end
8
8
 
9
9
  def client
10
- @client ||= Faraday.new(
11
- "http://" + @ip,
12
- headers: {"User-Agent" => "sunnycarcharger-agent"}
13
- ) do |conn|
14
- conn.request :json
15
- conn.response :json
16
- conn.response :raise_error
17
- # conn.request :retry, retry_options if retry_options # Must be registered after :raise_error
18
- conn.adapter Faraday.default_adapter
19
- conn.options.timeout = 1
10
+ @client ||= begin
11
+ successful_client = nil
12
+ @ips.find do |ip|
13
+ successful_client = Faraday.new(
14
+ "http://" + ip,
15
+ headers: {"User-Agent" => "sunnycarcharger-agent"}
16
+ ) do |conn|
17
+ conn.request :json
18
+ conn.response :json
19
+ conn.response :raise_error
20
+ # conn.request :retry, retry_options if retry_options # Must be registered after :raise_error
21
+ conn.adapter Faraday.default_adapter
22
+ conn.options.timeout = 3
23
+ end
24
+ true
25
+ rescue Faraday::ConnectionFailed, Errno::ECONNREFUSED
26
+ false
27
+ end
28
+ successful_client || raise("Could not connect to any of the provided Fronius IP addresses")
20
29
  end
21
30
  end
22
31
 
23
32
  def fetch
24
- path = "/solar_api/v1/GetPowerFlowRealtimeData.fcgi"
25
- response = client.get(path).body
26
33
  data = Sunnycarcharger::Agent::InvertorData.new
27
- data.power_from_grid = response.dig("Body", "Data", "Site", "P_Grid").to_i
28
- data.power_to_load = -1 * response.dig("Body", "Data", "Site", "P_Load").to_i
29
- data.power_from_solar = response.dig("Body", "Data", "Site", "P_PV").to_i
30
- data.solar_energy_today = response.dig("Body", "Data", "Site", "E_Day").to_i
34
+
35
+ response = client.get("/solar_api/v1/GetPowerFlowRealtimeData.fcgi").body
36
+ body = response.dig("Body", "Data", "Site")
37
+ data.power_from_grid = body.dig("P_Grid").to_i
38
+ data.power_to_load = -1 * body.dig("P_Load").to_i
39
+ data.power_from_solar = body.dig("P_PV").to_i
40
+ data.solar_energy_today = body.dig("E_Day").to_i
41
+
42
+ begin
43
+ response = client.get("/solar_api/v1/GetMeterRealtimeData.cgi?Scope=System").body
44
+ body = response.dig("Body", "Data", "0")
45
+ data.energy_consumed = body.dig("EnergyReal_WAC_Sum_Consumed").to_i
46
+ data.energy_produced = body.dig("EnergyReal_WAC_Sum_Produced").to_i
47
+ data.serial = body.dig("Details", "Serial")
48
+ rescue => e
49
+ puts "Error fetching energy_consumed and energy_produced: #{e}"
50
+ end
51
+
31
52
  data
32
53
  end
33
54
 
55
+ # {"Manufacturer"=>"Fronius", "Model"=>"CCS WattNode WND-3D-480-MB", "Serial"=>"123456"}
56
+ def inverter_details
57
+ response = client.get("/solar_api/v1/GetMeterRealtimeData.cgi?Scope=System").body
58
+ body = response.dig("Body", "Data", "0")
59
+ body.dig("Details")
60
+ end
61
+
34
62
  def connected?
35
63
  fetch
36
64
  true
@@ -1,5 +1,7 @@
1
1
  class Sunnycarcharger::Agent::InvertorData
2
+ attr_accessor :serial
2
3
  attr_accessor :power_from_grid, :power_to_load, :power_from_solar, :solar_energy_today
4
+ attr_accessor :energy_consumed, :energy_produced
3
5
 
4
6
  def power_to_grid
5
7
  -power_from_grid
@@ -7,10 +9,13 @@ class Sunnycarcharger::Agent::InvertorData
7
9
 
8
10
  def as_json
9
11
  {
12
+ serial: serial,
10
13
  power_from_grid: power_from_grid,
11
14
  power_to_load: power_to_load,
12
15
  power_from_solar: power_from_solar,
13
- solar_energy_today: solar_energy_today
16
+ solar_energy_today: solar_energy_today,
17
+ energy_consumed: energy_consumed,
18
+ energy_produced: energy_produced
14
19
  }
15
20
  end
16
21
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Sunnycarcharger
4
4
  module Agent
5
- VERSION = "1.0.2"
5
+ VERSION = "1.1.1"
6
6
  end
7
7
  end
@@ -77,4 +77,103 @@ http_interactions:
77
77
  }
78
78
  }
79
79
  recorded_at: Sun, 09 Jul 2023 04:03:53 GMT
80
+ - request:
81
+ method: get
82
+ uri: http://192.168.86.26/solar_api/v1/GetMeterRealtimeData.cgi?Scope=System
83
+ body:
84
+ encoding: US-ASCII
85
+ string: ''
86
+ headers:
87
+ User-Agent:
88
+ - sunnycarcharger-agent
89
+ response:
90
+ status:
91
+ code: 200
92
+ message: OK
93
+ headers:
94
+ content-type:
95
+ - application/json
96
+ cache-control:
97
+ - no-cache, no-store, must-revalidate
98
+ pragma:
99
+ - no-cache
100
+ expires:
101
+ - '0'
102
+ content-length:
103
+ - '2705'
104
+ date:
105
+ - Sun, 30 Jul 2023 12:16:43 GMT
106
+ server:
107
+ - webserver
108
+ body:
109
+ encoding: UTF-8
110
+ string: |
111
+ {
112
+ "Body" : {
113
+ "Data" : {
114
+ "0" : {
115
+ "Current_AC_Phase_1" : 0.18578459322452545,
116
+ "Current_AC_Phase_2" : 2.0522370338439941,
117
+ "Current_AC_Phase_3" : 0,
118
+ "Current_AC_Sum" : 2.2380216270685196,
119
+ "Details" : {
120
+ "Manufacturer" : "Fronius",
121
+ "Model" : "CCS WattNode WND-3D-480-MB",
122
+ "Serial" : "745995"
123
+ },
124
+ "Enable" : 1,
125
+ "EnergyReal_WAC_Minus_Absolute" : 49028617,
126
+ "EnergyReal_WAC_Phase_1_Consumed" : 5359053,
127
+ "EnergyReal_WAC_Phase_1_Produced" : 30984743,
128
+ "EnergyReal_WAC_Phase_2_Consumed" : 18531328,
129
+ "EnergyReal_WAC_Phase_2_Produced" : 21950501,
130
+ "EnergyReal_WAC_Phase_3_Consumed" : 0,
131
+ "EnergyReal_WAC_Phase_3_Produced" : 0,
132
+ "EnergyReal_WAC_Plus_Absolute" : 19983755,
133
+ "EnergyReal_WAC_Sum_Consumed" : 19983755,
134
+ "EnergyReal_WAC_Sum_Produced" : 49028617,
135
+ "Frequency_Phase_Average" : 50.03289794921875,
136
+ "Meter_Location_Current" : 0,
137
+ "PowerApparent_S_Phase_1" : 43.604618072509766,
138
+ "PowerApparent_S_Phase_2" : 497.7763671875,
139
+ "PowerApparent_S_Phase_3" : 0,
140
+ "PowerApparent_S_Sum" : 541.3809814453125,
141
+ "PowerFactor_Phase_1" : 0.76950681209564209,
142
+ "PowerFactor_Phase_2" : 0.61130160093307495,
143
+ "PowerFactor_Phase_3" : 1,
144
+ "PowerFactor_Sum" : 0.62404400110244751,
145
+ "PowerReactive_Q_Phase_1" : -14.466190338134766,
146
+ "PowerReactive_Q_Phase_2" : -348.84356689453125,
147
+ "PowerReactive_Q_Phase_3" : 0,
148
+ "PowerReactive_Q_Sum" : -363.30975341796875,
149
+ "PowerReal_P_Phase_1" : 33.554050445556641,
150
+ "PowerReal_P_Phase_2" : 304.29147338867188,
151
+ "PowerReal_P_Phase_3" : 0,
152
+ "PowerReal_P_Sum" : 337.84555053710938,
153
+ "TimeStamp" : 1690719403,
154
+ "Visible" : 1,
155
+ "Voltage_AC_PhaseToPhase_12" : 414.82183837890625,
156
+ "Voltage_AC_PhaseToPhase_23" : 241.61917114257812,
157
+ "Voltage_AC_PhaseToPhase_31" : 233.82379150390625,
158
+ "Voltage_AC_Phase_1" : 234.70613098144531,
159
+ "Voltage_AC_Phase_2" : 242.55319213867188,
160
+ "Voltage_AC_Phase_3" : 0,
161
+ "Voltage_AC_Phase_Average" : 238.62966918945312
162
+ }
163
+ }
164
+ },
165
+ "Head" : {
166
+ "RequestArguments" : {
167
+ "DeviceClass" : "Meter",
168
+ "Scope" : "System"
169
+ },
170
+ "Status" : {
171
+ "Code" : 0,
172
+ "Reason" : "",
173
+ "UserMessage" : ""
174
+ },
175
+ "Timestamp" : "2023-07-30T22:16:43+10:00"
176
+ }
177
+ }
178
+ recorded_at: Sun, 30 Jul 2023 12:16:44 GMT
80
179
  recorded_with: VCR 6.2.0
@@ -0,0 +1,179 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: http://192.168.86.26/solar_api/v1/GetPowerFlowRealtimeData.fcgi
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - sunnycarcharger-agent
12
+ response:
13
+ status:
14
+ code: 200
15
+ message: OK
16
+ headers:
17
+ content-type:
18
+ - application/json
19
+ cache-control:
20
+ - no-cache, no-store, must-revalidate
21
+ pragma:
22
+ - no-cache
23
+ expires:
24
+ - '0'
25
+ content-length:
26
+ - '1105'
27
+ date:
28
+ - Sun, 30 Jul 2023 12:16:42 GMT
29
+ server:
30
+ - webserver
31
+ body:
32
+ encoding: UTF-8
33
+ string: |
34
+ {
35
+ "Body" : {
36
+ "Data" : {
37
+ "Inverters" : {
38
+ "1" : {
39
+ "DT" : 102,
40
+ "E_Day" : 34470,
41
+ "E_Total" : 40344200,
42
+ "E_Year" : 7083963.5,
43
+ "P" : 0
44
+ },
45
+ "2" : {
46
+ "DT" : 102,
47
+ "E_Day" : 27664,
48
+ "E_Total" : 41063300,
49
+ "E_Year" : 6892509.5,
50
+ "P" : 0
51
+ }
52
+ },
53
+ "Site" : {
54
+ "E_Day" : 62134,
55
+ "E_Total" : 81407500,
56
+ "E_Year" : 13976473,
57
+ "Meter_Location" : "grid",
58
+ "Mode" : "meter",
59
+ "P_Akku" : null,
60
+ "P_Grid" : 335.26931762695312,
61
+ "P_Load" : -335.26931762695312,
62
+ "P_PV" : null,
63
+ "rel_Autonomy" : 0,
64
+ "rel_SelfConsumption" : null
65
+ },
66
+ "Version" : "12"
67
+ }
68
+ },
69
+ "Head" : {
70
+ "RequestArguments" : {},
71
+ "Status" : {
72
+ "Code" : 0,
73
+ "Reason" : "",
74
+ "UserMessage" : ""
75
+ },
76
+ "Timestamp" : "2023-07-30T22:16:42+10:00"
77
+ }
78
+ }
79
+ recorded_at: Sun, 30 Jul 2023 12:16:42 GMT
80
+ - request:
81
+ method: get
82
+ uri: http://192.168.86.26/solar_api/v1/GetMeterRealtimeData.cgi?Scope=System
83
+ body:
84
+ encoding: US-ASCII
85
+ string: ''
86
+ headers:
87
+ User-Agent:
88
+ - sunnycarcharger-agent
89
+ response:
90
+ status:
91
+ code: 200
92
+ message: OK
93
+ headers:
94
+ content-type:
95
+ - application/json
96
+ cache-control:
97
+ - no-cache, no-store, must-revalidate
98
+ pragma:
99
+ - no-cache
100
+ expires:
101
+ - '0'
102
+ content-length:
103
+ - '2705'
104
+ date:
105
+ - Sun, 30 Jul 2023 12:16:43 GMT
106
+ server:
107
+ - webserver
108
+ body:
109
+ encoding: UTF-8
110
+ string: |
111
+ {
112
+ "Body" : {
113
+ "Data" : {
114
+ "0" : {
115
+ "Current_AC_Phase_1" : 0.18578459322452545,
116
+ "Current_AC_Phase_2" : 2.0522370338439941,
117
+ "Current_AC_Phase_3" : 0,
118
+ "Current_AC_Sum" : 2.2380216270685196,
119
+ "Details" : {
120
+ "Manufacturer" : "Fronius",
121
+ "Model" : "CCS WattNode WND-3D-480-MB",
122
+ "Serial" : "745995"
123
+ },
124
+ "Enable" : 1,
125
+ "EnergyReal_WAC_Minus_Absolute" : 49028617,
126
+ "EnergyReal_WAC_Phase_1_Consumed" : 5359053,
127
+ "EnergyReal_WAC_Phase_1_Produced" : 30984743,
128
+ "EnergyReal_WAC_Phase_2_Consumed" : 18531328,
129
+ "EnergyReal_WAC_Phase_2_Produced" : 21950501,
130
+ "EnergyReal_WAC_Phase_3_Consumed" : 0,
131
+ "EnergyReal_WAC_Phase_3_Produced" : 0,
132
+ "EnergyReal_WAC_Plus_Absolute" : 19983755,
133
+ "EnergyReal_WAC_Sum_Consumed" : 19983755,
134
+ "EnergyReal_WAC_Sum_Produced" : 49028617,
135
+ "Frequency_Phase_Average" : 50.03289794921875,
136
+ "Meter_Location_Current" : 0,
137
+ "PowerApparent_S_Phase_1" : 43.604618072509766,
138
+ "PowerApparent_S_Phase_2" : 497.7763671875,
139
+ "PowerApparent_S_Phase_3" : 0,
140
+ "PowerApparent_S_Sum" : 541.3809814453125,
141
+ "PowerFactor_Phase_1" : 0.76950681209564209,
142
+ "PowerFactor_Phase_2" : 0.61130160093307495,
143
+ "PowerFactor_Phase_3" : 1,
144
+ "PowerFactor_Sum" : 0.62404400110244751,
145
+ "PowerReactive_Q_Phase_1" : -14.466190338134766,
146
+ "PowerReactive_Q_Phase_2" : -348.84356689453125,
147
+ "PowerReactive_Q_Phase_3" : 0,
148
+ "PowerReactive_Q_Sum" : -363.30975341796875,
149
+ "PowerReal_P_Phase_1" : 33.554050445556641,
150
+ "PowerReal_P_Phase_2" : 304.29147338867188,
151
+ "PowerReal_P_Phase_3" : 0,
152
+ "PowerReal_P_Sum" : 337.84555053710938,
153
+ "TimeStamp" : 1690719403,
154
+ "Visible" : 1,
155
+ "Voltage_AC_PhaseToPhase_12" : 414.82183837890625,
156
+ "Voltage_AC_PhaseToPhase_23" : 241.61917114257812,
157
+ "Voltage_AC_PhaseToPhase_31" : 233.82379150390625,
158
+ "Voltage_AC_Phase_1" : 234.70613098144531,
159
+ "Voltage_AC_Phase_2" : 242.55319213867188,
160
+ "Voltage_AC_Phase_3" : 0,
161
+ "Voltage_AC_Phase_Average" : 238.62966918945312
162
+ }
163
+ }
164
+ },
165
+ "Head" : {
166
+ "RequestArguments" : {
167
+ "DeviceClass" : "Meter",
168
+ "Scope" : "System"
169
+ },
170
+ "Status" : {
171
+ "Code" : 0,
172
+ "Reason" : "",
173
+ "UserMessage" : ""
174
+ },
175
+ "Timestamp" : "2023-07-30T22:16:43+10:00"
176
+ }
177
+ }
178
+ recorded_at: Sun, 30 Jul 2023 12:16:44 GMT
179
+ recorded_with: VCR 6.2.0
@@ -4,8 +4,8 @@ require "test_helper"
4
4
 
5
5
  describe Sunnycarcharger::Agent::Fronius do
6
6
  it "fetches from fronius" do
7
- fronius_ip = "192.168.86.26"
8
- agent = Sunnycarcharger::Agent::Fronius.new(ip: fronius_ip)
7
+ fronius_ips = ["192.168.86.26"]
8
+ agent = Sunnycarcharger::Agent::Fronius.new(ips: fronius_ips)
9
9
  VCR.use_cassette("fronius-midday") do
10
10
  data = agent.fetch
11
11
 
@@ -14,6 +14,25 @@ describe Sunnycarcharger::Agent::Fronius do
14
14
  assert_equal(6444, data.power_from_solar.to_i)
15
15
  assert_equal(2844, data.power_to_load.to_i)
16
16
  assert_equal(38601, data.solar_energy_today.to_i)
17
+ assert_equal("745995", data.serial)
18
+ assert data.energy_consumed
19
+ assert data.energy_produced
20
+ end
21
+ end
22
+
23
+ it "fetches from fronius at night" do
24
+ fronius_ips = ["192.168.86.26"]
25
+ agent = Sunnycarcharger::Agent::Fronius.new(ips: fronius_ips)
26
+ VCR.use_cassette("fronius-night") do
27
+ data = agent.fetch
28
+
29
+ assert_equal(335, data.power_from_grid.to_i)
30
+ assert_equal(0, data.power_from_solar.to_i)
31
+ assert_equal(335, data.power_to_load.to_i)
32
+ assert_equal(62134, data.solar_energy_today.to_i)
33
+ assert_equal("745995", data.serial)
34
+ assert data.energy_consumed
35
+ assert data.energy_produced
17
36
  end
18
37
  end
19
38
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sunnycarcharger-agent
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dr Nic Williams
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-07-29 00:00:00.000000000 Z
11
+ date: 2023-10-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: anyway_config
@@ -103,6 +103,7 @@ files:
103
103
  - lib/sunnycarcharger/agent/version.rb
104
104
  - lib/sunnycarcharger/agent/web.rb
105
105
  - test/fixtures/vcr_cassettes/fronius-midday.yml
106
+ - test/fixtures/vcr_cassettes/fronius-night.yml
106
107
  - test/sunnycarcharger/agent/fronius_test.rb
107
108
  - test/test_helper.rb
108
109
  homepage: https://sunnycarcharger.com
@@ -128,7 +129,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
128
129
  - !ruby/object:Gem::Version
129
130
  version: '0'
130
131
  requirements: []
131
- rubygems_version: 3.4.17
132
+ rubygems_version: 3.4.20
132
133
  signing_key:
133
134
  specification_version: 4
134
135
  summary: Run agent within home network to get solar invertor data and upload to Sunny