Class: Sunnycarcharger::Agent::Fronius

Inherits:
Object
  • Object
show all
Defined in:
lib/sunnycarcharger/agent/fronius.rb

Instance Method Summary collapse

Constructor Details

#initialize(ips: Config.fronius_ips) ⇒ Fronius

Returns a new instance of Fronius.

Raises:

  • (ArgumentError)


4
5
6
7
# File 'lib/sunnycarcharger/agent/fronius.rb', line 4

def initialize(ips: Config.fronius_ips)
  raise ArgumentError, "Missing Fronius IP addresses" unless ips
  @ips = ips
end

Instance Method Details

#clientObject



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/sunnycarcharger/agent/fronius.rb', line 9

def client
  @client ||= begin
    successful_client = nil
    @ips.find do |ip|
      successful_client = Faraday.new(
        "http://" + ip,
        headers: {"User-Agent" => "sunnycarcharger-agent"}
      ) do |conn|
        conn.request :json
        conn.response :json
        conn.response :raise_error
        # conn.request :retry, retry_options if retry_options # Must be registered after :raise_error
        conn.adapter Faraday.default_adapter
        conn.options.timeout = 3
      end
      true
    rescue Faraday::ConnectionFailed, Errno::ECONNREFUSED
      false
    end
    successful_client || raise("Could not connect to any of the provided Fronius IP addresses")
  end
end

#connected?Boolean

Returns:

  • (Boolean)


62
63
64
65
66
67
# File 'lib/sunnycarcharger/agent/fronius.rb', line 62

def connected?
  fetch
  true
rescue Faraday::ConnectionFailed, Errno::ECONNREFUSED
  false
end

#fetchObject



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/sunnycarcharger/agent/fronius.rb', line 32

def fetch
  data = Sunnycarcharger::Agent::InvertorData.new

  response = client.get("/solar_api/v1/GetPowerFlowRealtimeData.fcgi").body
  body = response.dig("Body", "Data", "Site")
  data.power_from_grid = body.dig("P_Grid").to_i
  data.power_to_load = -1 * body.dig("P_Load").to_i
  data.power_from_solar = body.dig("P_PV").to_i
  data.solar_energy_today = body.dig("E_Day").to_i

  begin
    response = client.get("/solar_api/v1/GetMeterRealtimeData.cgi?Scope=System").body
    body = response.dig("Body", "Data", "0")
    data.energy_consumed = body.dig("EnergyReal_WAC_Sum_Consumed").to_i
    data.energy_produced = body.dig("EnergyReal_WAC_Sum_Produced").to_i
    data.serial = body.dig("Details", "Serial")
  rescue => e
    puts "Error fetching energy_consumed and energy_produced: #{e}"
  end

  data
end

#inverter_detailsObject

“Model”=>“CCS WattNode WND-3D-480-MB”, “Serial”=>“123456”



56
57
58
59
60
# File 'lib/sunnycarcharger/agent/fronius.rb', line 56

def inverter_details
  response = client.get("/solar_api/v1/GetMeterRealtimeData.cgi?Scope=System").body
  body = response.dig("Body", "Data", "0")
  body.dig("Details")
end