Class: Sunscout::SolarLog::SolarLog

Inherits:
Object
  • Object
show all
Defined in:
lib/sunscout/solar_log/solar_log.rb

Overview

High-level binding to the SolarLog HTTP API

Examples:

Basic usage

require 'sunscout'
sl = Sunscout::SolarLog::SolarLog.new('http://10.60.1.10', timezone: 'CEST')
puts "AC power: #{ sl.power_ac }W (DC: #{ sl.power_dc }W, Efficiency #{ (sl.efficiency*100).round(0) }%)"
puts "Remaining power: #{ sl.power_available }W"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(host, timezone: '+0000') ⇒ SolarLog

Initialize a new instance of the class.

This also immediately queries data from the SolarLog API.

Parameters:

  • host (String)

    URI of the SolarLog web interface

  • timezone (String) (defaults to: '+0000')

    Timezone (or offset) which the SolarLog station resides in. If none is specified, assume UTC.



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/sunscout/solar_log/solar_log.rb', line 77

def initialize(host, timezone: '+0000')
  client = Sunscout::SolarLog::Client.new(host)
  data = client.get_data

  # SolarLog returns the time a) without a timezone indicator and b) as whatever the station is configured.
  # Hence, the user has to specify what timezone it is in - otherwise we'll just fall back to UTC.
  time = "#{ data.fetch(:time) } #{ timezone }"
  @time = DateTime.strptime(time, '%d.%m.%y %H:%M:%s %Z')

  @power_ac    = data.fetch :power_ac
  @power_dc    = data.fetch :power_dc
  @power_total = data.fetch :power_total

  @voltage_ac = data.fetch :voltage_ac
  @voltage_dc = data.fetch :voltage_dc

  @yield_day       = data.fetch :yield_day
  @yield_yesterday = data.fetch :yield_yesterday
  @yield_month     = data.fetch :yield_month
  @yield_year      = data.fetch :yield_year
  @yield_total     = data.fetch :yield_total

  @consumption_ac        = data.fetch :consumption_ac
  @consumption_day       = data.fetch :consumption_day
  @consumption_yesterday = data.fetch :consumption_yesterday
  @consumption_month     = data.fetch :consumption_month
  @consumption_year      = data.fetch :consumption_year
  @consumption_total     = data.fetch :consumption_total
end

Instance Attribute Details

#consumption_acFixnum (readonly)

Current consumption in W

Returns:

  • (Fixnum)


53
54
55
# File 'lib/sunscout/solar_log/solar_log.rb', line 53

def consumption_ac
  @consumption_ac
end

#consumption_dayFixnum (readonly)

Today’s consumption in Wh

Returns:

  • (Fixnum)


56
57
58
# File 'lib/sunscout/solar_log/solar_log.rb', line 56

def consumption_day
  @consumption_day
end

#consumption_monthFixnum (readonly)

This month’s consumption in Wh

Returns:

  • (Fixnum)


62
63
64
# File 'lib/sunscout/solar_log/solar_log.rb', line 62

def consumption_month
  @consumption_month
end

#consumption_totalFixnum (readonly)

Total consumption in Wh

Returns:

  • (Fixnum)


68
69
70
# File 'lib/sunscout/solar_log/solar_log.rb', line 68

def consumption_total
  @consumption_total
end

#consumption_yearFixnum (readonly)

This year’s consumption in Wh

Returns:

  • (Fixnum)


65
66
67
# File 'lib/sunscout/solar_log/solar_log.rb', line 65

def consumption_year
  @consumption_year
end

#consumption_yesterdayFixnum (readonly)

Yesterday’s consumption in Wh

Returns:

  • (Fixnum)


59
60
61
# File 'lib/sunscout/solar_log/solar_log.rb', line 59

def consumption_yesterday
  @consumption_yesterday
end

#power_acFixnum (readonly)

AC power in W

Returns:

  • (Fixnum)


20
21
22
# File 'lib/sunscout/solar_log/solar_log.rb', line 20

def power_ac
  @power_ac
end

#power_dcFixnum (readonly)

DC power in W

Returns:

  • (Fixnum)


23
24
25
# File 'lib/sunscout/solar_log/solar_log.rb', line 23

def power_dc
  @power_dc
end

#power_totalFixnum (readonly)

Maximum DC power in W

Returns:

  • (Fixnum)


26
27
28
# File 'lib/sunscout/solar_log/solar_log.rb', line 26

def power_total
  @power_total
end

#timeDateTime (readonly)

Timestamp of the data.

Returns:

  • (DateTime)


16
17
18
# File 'lib/sunscout/solar_log/solar_log.rb', line 16

def time
  @time
end

#voltage_acFixnum (readonly)

AC voltage in V

Returns:

  • (Fixnum)


30
31
32
# File 'lib/sunscout/solar_log/solar_log.rb', line 30

def voltage_ac
  @voltage_ac
end

#voltage_dcFixnum (readonly)

DC voltage in V

Returns:

  • (Fixnum)


33
34
35
# File 'lib/sunscout/solar_log/solar_log.rb', line 33

def voltage_dc
  @voltage_dc
end

#yield_dayFixnum (readonly)

Today’s yield in Wh

Returns:

  • (Fixnum)


37
38
39
# File 'lib/sunscout/solar_log/solar_log.rb', line 37

def yield_day
  @yield_day
end

#yield_monthFixnum (readonly)

This month’s yield in Wh

Returns:

  • (Fixnum)


43
44
45
# File 'lib/sunscout/solar_log/solar_log.rb', line 43

def yield_month
  @yield_month
end

#yield_totalFixnum (readonly)

Total yield in Wh

Returns:

  • (Fixnum)


49
50
51
# File 'lib/sunscout/solar_log/solar_log.rb', line 49

def yield_total
  @yield_total
end

#yield_yearFixnum (readonly)

This year’s yield in Wh

Returns:

  • (Fixnum)


46
47
48
# File 'lib/sunscout/solar_log/solar_log.rb', line 46

def yield_year
  @yield_year
end

#yield_yesterdayFixnum (readonly)

Yesterday’s yield in WH

Returns:

  • (Fixnum)


40
41
42
# File 'lib/sunscout/solar_log/solar_log.rb', line 40

def yield_yesterday
  @yield_yesterday
end

Instance Method Details

#alternator_lossFixnum

Loss of DC to AC conversion.

Examples:

solar_log.power_ac #=> 94
solar_log.power_dc #=> 100
solar_log.alternator_loss #=> 6

Returns:

  • (Fixnum)

    Loss of alternator in Watt.



126
127
128
# File 'lib/sunscout/solar_log/solar_log.rb', line 126

def alternator_loss
  power_dc - power_ac
end

#capacityFloat

Capacity of peak power generation.

Examples:

solar_log.power_dc #=> 8000
solar_log.power_total #=> 10000
solar_log.capacity #=> 0.8

Returns:

  • (Float)

    Percentage of peak power generation.



170
171
172
173
# File 'lib/sunscout/solar_log/solar_log.rb', line 170

def capacity
  return 0 if power_total == 0
  power_dc / power_total
end

#efficiencyFloat

Efficiency of DC to AC conversion.

Examples:

solar_log.power_ac #=> 94
solar_log.power_dc #=> 100
solar_log.efficiency #=> 0.94

Returns:

  • (Float)

    Efficiency as percentage between 0 and 1.



114
115
116
117
# File 'lib/sunscout/solar_log/solar_log.rb', line 114

def efficiency
  return 0 if @power_dc == 0
  power_ac.to_f / power_dc
end

#power_availableFixnum

Surplus AC power.

Examples:

Usage <100%

solar_log.consumption_ac #=> 50
solar_log.power_ac #=> 100
solar_log.power_available #=> 50

Usage >100%

solar_log.consumption_ac #=> 200
solar_log.power_ac #=> 100
solar_log.power_available #=> -100

Returns:

  • (Fixnum)

    Surplus AC power in Watt. Negative if more power consumed than generated.



159
160
161
# File 'lib/sunscout/solar_log/solar_log.rb', line 159

def power_available
  power_ac - consumption_ac
end

#usageFloat

Usage of AC power.

Examples:

Usage <100%

solar_log.consumption_ac #=> 50
solar_log.power_ac #=> 100
solar_log.usage #=> 0.5

Usage >100%

solar_log.consumption_ac #=> 200
solar_log.power_ac #=> 100
solar_log.usage #=> 2

Returns:

  • (Float)

    Usage of AC power as percentage. >1 if more power consumed than generated.



142
143
144
145
# File 'lib/sunscout/solar_log/solar_log.rb', line 142

def usage
  return 0 if @power_ac == 0
  consumption_ac.to_f / power_ac
end