aemo 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/aemo/dispatchable.rb +2 -2
- data/lib/aemo/exceptions/invalid_nmi_allocation_type.rb +1 -1
- data/lib/aemo/exceptions/time_error.rb +20 -0
- data/lib/aemo/market/interval.rb +4 -4
- data/lib/aemo/market/node.rb +9 -3
- data/lib/aemo/market.rb +2 -4
- data/lib/aemo/msats.rb +70 -54
- data/lib/aemo/nem12/data_stream_suffix.rb +1 -1
- data/lib/aemo/nem12/quality_method.rb +14 -10
- data/lib/aemo/nem12/unit_of_measurement.rb +42 -42
- data/lib/aemo/nem12.rb +300 -94
- data/lib/aemo/nem13.rb +1 -2
- data/lib/aemo/nmi/allocation.rb +6 -7
- data/lib/aemo/nmi.rb +48 -38
- data/lib/aemo/region.rb +4 -3
- data/lib/aemo/register.rb +7 -7
- data/lib/aemo/struct.rb +3 -0
- data/lib/aemo/time.rb +112 -0
- data/lib/aemo/version.rb +1 -2
- data/lib/aemo.rb +13 -11
- data/lib/data/xml_to_json.rb +2 -4
- data/spec/aemo_spec.rb +0 -7
- data/spec/lib/aemo/market/interval_spec.rb +30 -12
- data/spec/lib/aemo/market/node_spec.rb +11 -9
- data/spec/lib/aemo/market_spec.rb +5 -4
- data/spec/lib/aemo/meter_spec.rb +2 -2
- data/spec/lib/aemo/msats_spec.rb +68 -56
- data/spec/lib/aemo/nem12_spec.rb +154 -43
- data/spec/lib/aemo/nmi/allocation_spec.rb +23 -18
- data/spec/lib/aemo/nmi_spec.rb +98 -72
- data/spec/lib/aemo/region_spec.rb +23 -18
- data/spec/spec_helper.rb +13 -13
- metadata +21 -443
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e034dcfeaf28060aa39be81b16e66a689ba571d7c5394f668665b2a9a2f0d0bf
|
4
|
+
data.tar.gz: aaaeef50ee4cdbf78d33b4ce992ac8aa268e03e4ad33d272c4e2e7d784a54db2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5fca44605b1d54f5199bfd8ba8e078703c74a9fb5c62628f1a9570508b64f2057187955842dadc764d7bc0d03c5851657ded9820fa79ee8ac962036377de3729
|
7
|
+
data.tar.gz: e0af286ab7bef3952a4159c0765389bdba82669b8f7c43c3fd03a4fdfff184e5480f0aad2f26d1850675ee94958e66cc36af94a5352e6929decb8555b39d5f73
|
data/lib/aemo/dispatchable.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
module AEMO
|
4
4
|
class Region
|
5
5
|
DISPATCH_TYPE = ['Generator', 'Load Norm Off', 'Network Service Provider'].freeze
|
6
|
-
CATEGORY = [
|
7
|
-
CLASSIFICATION = [
|
6
|
+
CATEGORY = %w[Market Non-Market].freeze
|
7
|
+
CLASSIFICATION = %w[Scheduled Semi-Scheduled Non-Scheduled].freeze
|
8
8
|
end
|
9
9
|
end
|
@@ -8,7 +8,7 @@ module AEMO
|
|
8
8
|
# @since 0.3.0
|
9
9
|
class InvalidNMIAllocationType < ArgumentError
|
10
10
|
DEFAULT_MESSAGE = 'Not a valid allocation type, try one of ' \
|
11
|
-
"#{AEMO::NMI::Allocation::SUPPORTED_TYPES.join(' |')}"
|
11
|
+
"#{AEMO::NMI::Allocation::SUPPORTED_TYPES.join(' |')}".freeze
|
12
12
|
|
13
13
|
# Initialize an InvalidNMIAllocationType
|
14
14
|
#
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module AEMO
|
4
|
+
# AEMO::TimeError
|
5
|
+
#
|
6
|
+
# @author Joel Courtney
|
7
|
+
# @abstract An exception for time errors.
|
8
|
+
# @since 0.6.0
|
9
|
+
class TimeError < ArgumentError
|
10
|
+
DEFAULT_MESSAGE = 'Not a valid time'
|
11
|
+
|
12
|
+
# Initialize an TimeError
|
13
|
+
#
|
14
|
+
# @param [String] msg the error message
|
15
|
+
# @return [AEMO::TimeError]
|
16
|
+
def initialize(msg: DEFAULT_MESSAGE)
|
17
|
+
super
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/aemo/market/interval.rb
CHANGED
@@ -22,7 +22,7 @@ module AEMO
|
|
22
22
|
# @param [Hash] options Hash of optional data values
|
23
23
|
# @return [AEMO::Market::Interval]
|
24
24
|
def initialize(datetime, options = {})
|
25
|
-
@datetime = Time.parse("#{datetime} +1000")
|
25
|
+
@datetime = ::Time.parse("#{datetime} +1000")
|
26
26
|
@region = options['REGION']
|
27
27
|
@total_demand = options['TOTALDEMAND']
|
28
28
|
@rrp = options['RRP']
|
@@ -35,7 +35,7 @@ module AEMO
|
|
35
35
|
# All AEMO Data aggregates to the trailing edge of the period (this makes it difficult to do daily aggregations :( )
|
36
36
|
# @param [Boolean] trailing_edge selection of either the trailing edge of the period or the rising edge of the period for the date time
|
37
37
|
# @return [Time] a time object of the trailing edge of the interval
|
38
|
-
def datetime(trailing_edge
|
38
|
+
def datetime(trailing_edge: true)
|
39
39
|
t = @datetime
|
40
40
|
# If the datetime requested is the trailing edge, offset as per interval requirement
|
41
41
|
unless trailing_edge
|
@@ -51,7 +51,7 @@ module AEMO
|
|
51
51
|
|
52
52
|
# @return [Time] the time of the
|
53
53
|
def interval_length
|
54
|
-
Time.at(300)
|
54
|
+
::Time.at(300)
|
55
55
|
end
|
56
56
|
|
57
57
|
# @return [Symbol] :dispatch or :trading
|
@@ -72,7 +72,7 @@ module AEMO
|
|
72
72
|
# @return [Float] the value of the interval in Australian Dollars
|
73
73
|
def value
|
74
74
|
@value ||= Float::NAN
|
75
|
-
@value = (@total_demand * @rrp).round(2) if @total_demand.
|
75
|
+
@value = (@total_demand * @rrp).round(2) if @total_demand.instance_of?(Float) && @rrp.instance_of?(Float)
|
76
76
|
@value
|
77
77
|
end
|
78
78
|
end
|
data/lib/aemo/market/node.rb
CHANGED
@@ -13,7 +13,11 @@ module AEMO
|
|
13
13
|
attr_accessor :identifier
|
14
14
|
|
15
15
|
def initialize(identifier)
|
16
|
-
|
16
|
+
unless IDENTIFIERS.include?(identifier.upcase)
|
17
|
+
raise ArgumentError,
|
18
|
+
"Node Identifier '#{identifier}' is not valid."
|
19
|
+
end
|
20
|
+
|
17
21
|
@identifier = identifier
|
18
22
|
@current_trading = []
|
19
23
|
@current_dispatch = []
|
@@ -23,7 +27,7 @@ module AEMO
|
|
23
27
|
#
|
24
28
|
# @return [Array<AEMO::Market::Interval>]
|
25
29
|
def current_dispatch
|
26
|
-
@current_dispatch = AEMO::Market.current_dispatch(@identifier) if @current_dispatch.empty? || @current_dispatch.last.datetime != (Time.now - Time.now.to_i % 300)
|
30
|
+
@current_dispatch = AEMO::Market.current_dispatch(@identifier) if @current_dispatch.empty? || @current_dispatch.last.datetime != (::Time.now - (::Time.now.to_i % 300))
|
27
31
|
@current_dispatch
|
28
32
|
end
|
29
33
|
|
@@ -31,7 +35,9 @@ module AEMO
|
|
31
35
|
#
|
32
36
|
# @return [Array<AEMO::Market::Interval>]
|
33
37
|
def current_trading
|
34
|
-
if @current_trading.empty? || @current_trading.select
|
38
|
+
if @current_trading.empty? || @current_trading.select do |i|
|
39
|
+
i.period_type == 'TRADE'
|
40
|
+
end.last.datetime != (::Time.now - (::Time.now.to_i % 300))
|
35
41
|
@current_trading = AEMO::Market.current_trading(@identifier)
|
36
42
|
end
|
37
43
|
@current_trading
|
data/lib/aemo/market.rb
CHANGED
@@ -20,8 +20,7 @@ module AEMO
|
|
20
20
|
region = AEMO::Region.new(region) if region.is_a?(String)
|
21
21
|
|
22
22
|
response = get "/mms.GRAPHS/GRAPHS/GRAPH_5#{region}1.csv"
|
23
|
-
|
24
|
-
values
|
23
|
+
parse_response(response)
|
25
24
|
end
|
26
25
|
|
27
26
|
# Description of method
|
@@ -32,8 +31,7 @@ module AEMO
|
|
32
31
|
region = AEMO::Region.new(region) if region.is_a?(String)
|
33
32
|
|
34
33
|
response = get "/mms.GRAPHS/GRAPHS/GRAPH_30#{region}1.csv"
|
35
|
-
|
36
|
-
values
|
34
|
+
parse_response(response)
|
37
35
|
end
|
38
36
|
|
39
37
|
# Return an array of historic trading values based on a start and finish
|
data/lib/aemo/msats.rb
CHANGED
@@ -13,9 +13,9 @@ module AEMO
|
|
13
13
|
class MSATS
|
14
14
|
# Globally set request headers
|
15
15
|
HEADERS = {
|
16
|
-
'User-Agent'
|
17
|
-
'Accept'
|
18
|
-
'Content-Type'
|
16
|
+
'User-Agent' => 'Ruby.AEMO.MSATS.Api',
|
17
|
+
'Accept' => 'text/xml',
|
18
|
+
'Content-Type' => 'text/xml'
|
19
19
|
}.freeze
|
20
20
|
|
21
21
|
# We like to party
|
@@ -31,8 +31,7 @@ module AEMO
|
|
31
31
|
|
32
32
|
# Class Methods
|
33
33
|
class << self
|
34
|
-
attr_accessor :auth
|
35
|
-
attr_accessor :participant_id
|
34
|
+
attr_accessor :auth, :participant_id
|
36
35
|
|
37
36
|
# Single NMI Master (C4) Report
|
38
37
|
# /C4/PARTICIPANT_IDENTIFIER?transactionId=XXX&nmi=XXX&checksum=X&type=XXX&reason=XXX
|
@@ -52,22 +51,23 @@ module AEMO
|
|
52
51
|
options[:inittransId] ||= nil
|
53
52
|
|
54
53
|
query = {
|
55
|
-
transactionId:
|
56
|
-
#
|
57
|
-
NMI:
|
58
|
-
fromDate:
|
59
|
-
toDate:
|
60
|
-
asatDate:
|
61
|
-
participantId:
|
62
|
-
roleId:
|
63
|
-
inittransId:
|
54
|
+
transactionId: transaction_id,
|
55
|
+
# NOTE: AEMO has case sensitivity but no consistency across requests.
|
56
|
+
NMI: nmi.nmi,
|
57
|
+
fromDate: from_date,
|
58
|
+
toDate: to_date,
|
59
|
+
asatDate: as_at_date,
|
60
|
+
participantId: @participant_id,
|
61
|
+
roleId: options[:role_id],
|
62
|
+
inittransId: options[:init_trans_id]
|
64
63
|
}
|
65
64
|
|
66
|
-
response = get("/C4/#{@participant_id}", basic_auth: @auth, headers: HEADERS, query
|
67
|
-
|
68
|
-
|
69
|
-
else
|
65
|
+
response = get("/C4/#{@participant_id}", basic_auth: @auth, headers: HEADERS, query:,
|
66
|
+
verify: (options[:verify_ssl] != false))
|
67
|
+
if response.response.code == '200'
|
70
68
|
response.parsed_response['aseXML']['Transactions']['Transaction']['ReportResponse']['ReportResults']
|
69
|
+
else
|
70
|
+
response
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
@@ -77,13 +77,14 @@ module AEMO
|
|
77
77
|
# @return [Hash] The report results from the MSATS Limits web service query
|
78
78
|
def msats_limits(options = {})
|
79
79
|
query = {
|
80
|
-
transactionId:
|
80
|
+
transactionId: transaction_id
|
81
81
|
}
|
82
|
-
response = get("/MSATSLimits/#{@participant_id}", basic_auth: @auth, headers: HEADERS, query
|
83
|
-
|
84
|
-
|
85
|
-
else
|
82
|
+
response = get("/MSATSLimits/#{@participant_id}", basic_auth: @auth, headers: HEADERS, query:,
|
83
|
+
verify: (options[:verify_ssl] != false))
|
84
|
+
if response.response.code == '200'
|
86
85
|
response.parsed_response['aseXML']['Transactions']['Transaction']['ReportResponse']['ReportResults']
|
86
|
+
else
|
87
|
+
response
|
87
88
|
end
|
88
89
|
end
|
89
90
|
|
@@ -93,21 +94,30 @@ module AEMO
|
|
93
94
|
# @param [Integer] delivery_point_identifier Delivery Point Identifier
|
94
95
|
# @return [Hash] The response
|
95
96
|
def nmi_discovery_by_delivery_point_identifier(jurisdiction_code, delivery_point_identifier, options = {})
|
96
|
-
raise ArgumentError, 'jurisdiction_code is not valid' unless %w[ACT NEM NSW QLD SA VIC
|
97
|
-
|
98
|
-
|
97
|
+
raise ArgumentError, 'jurisdiction_code is not valid' unless %w[ACT NEM NSW QLD SA VIC
|
98
|
+
TAS].include?(jurisdiction_code)
|
99
|
+
|
100
|
+
unless delivery_point_identifier.respond_to?('to_i')
|
101
|
+
raise ArgumentError,
|
102
|
+
'delivery_point_identifier is not valid'
|
103
|
+
end
|
104
|
+
if delivery_point_identifier.to_i < 10_000_000 || delivery_point_identifier.to_i > 99_999_999
|
105
|
+
raise ArgumentError,
|
106
|
+
'delivery_point_identifier is not valid'
|
107
|
+
end
|
99
108
|
|
100
109
|
query = {
|
101
|
-
transactionId:
|
110
|
+
transactionId: transaction_id,
|
102
111
|
jurisdictionCode: jurisdiction_code,
|
103
112
|
deliveryPointIdentifier: delivery_point_identifier.to_i
|
104
113
|
}
|
105
114
|
|
106
|
-
response = get("/NMIDiscovery/#{@participant_id}", basic_auth: @auth, headers: HEADERS, query
|
107
|
-
|
108
|
-
|
109
|
-
else
|
115
|
+
response = get("/NMIDiscovery/#{@participant_id}", basic_auth: @auth, headers: HEADERS, query:,
|
116
|
+
verify: (options[:verify_ssl] != false))
|
117
|
+
if response.response.code == '200'
|
110
118
|
response.parsed_response['aseXML']['Transactions']['Transaction']['NMIDiscoveryResponse']['NMIStandingData']
|
119
|
+
else
|
120
|
+
response
|
111
121
|
end
|
112
122
|
end
|
113
123
|
|
@@ -117,19 +127,21 @@ module AEMO
|
|
117
127
|
# @param [Integer] meter_serial_number The meter's serial number
|
118
128
|
# @return [Hash] The response
|
119
129
|
def nmi_discovery_by_meter_serial_number(jurisdiction_code, meter_serial_number, options = {})
|
120
|
-
raise ArgumentError, 'jurisdiction_code is not valid' unless %w[ACT NEM NSW QLD SA VIC
|
130
|
+
raise ArgumentError, 'jurisdiction_code is not valid' unless %w[ACT NEM NSW QLD SA VIC
|
131
|
+
TAS].include?(jurisdiction_code)
|
121
132
|
|
122
133
|
query = {
|
123
|
-
transactionId:
|
134
|
+
transactionId: transaction_id,
|
124
135
|
jurisdictionCode: jurisdiction_code,
|
125
136
|
meterSerialNumber: meter_serial_number.to_i
|
126
137
|
}
|
127
138
|
|
128
|
-
response = get("/NMIDiscovery/#{@participant_id}", basic_auth: @auth, headers: HEADERS, query
|
129
|
-
|
130
|
-
|
131
|
-
else
|
139
|
+
response = get("/NMIDiscovery/#{@participant_id}", basic_auth: @auth, headers: HEADERS, query:,
|
140
|
+
verify: (options[:verify_ssl] != false))
|
141
|
+
if response.response.code == '200'
|
132
142
|
response.parsed_response['aseXML']['Transactions']['Transaction']['NMIDiscoveryResponse']['NMIStandingData']
|
143
|
+
else
|
144
|
+
response
|
133
145
|
end
|
134
146
|
end
|
135
147
|
|
@@ -139,7 +151,8 @@ module AEMO
|
|
139
151
|
# @param [Integer] meter_serial_number The meter's serial number
|
140
152
|
# @return [Hash] The response
|
141
153
|
def nmi_discovery_by_address(jurisdiction_code, options = {})
|
142
|
-
raise ArgumentError, 'jurisdiction_code is not valid' unless %w[ACT NEM NSW QLD SA VIC
|
154
|
+
raise ArgumentError, 'jurisdiction_code is not valid' unless %w[ACT NEM NSW QLD SA VIC
|
155
|
+
TAS].include?(jurisdiction_code)
|
143
156
|
|
144
157
|
options[:building_or_property_name] ||= nil
|
145
158
|
options[:location_descriptor] ||= nil
|
@@ -158,7 +171,7 @@ module AEMO
|
|
158
171
|
options[:state_or_territory] ||= jurisdiction_code
|
159
172
|
|
160
173
|
query = {
|
161
|
-
transactionId:
|
174
|
+
transactionId: transaction_id,
|
162
175
|
jurisdictionCode: jurisdiction_code,
|
163
176
|
buildingOrPropertyName: options[:building_or_property_name],
|
164
177
|
locationDescriptor: options[:location_descriptor],
|
@@ -177,12 +190,13 @@ module AEMO
|
|
177
190
|
stateOrTerritory: options[:state_or_territory]
|
178
191
|
}
|
179
192
|
|
180
|
-
response = get("/NMIDiscovery/#{@participant_id}", basic_auth: @auth, headers: HEADERS, query
|
181
|
-
|
182
|
-
|
183
|
-
else
|
193
|
+
response = get("/NMIDiscovery/#{@participant_id}", basic_auth: @auth, headers: HEADERS, query:,
|
194
|
+
verify: (options[:verify_ssl] != false))
|
195
|
+
if response.response.code == '200'
|
184
196
|
myresponse = response.parsed_response['aseXML']['Transactions']['Transaction']['NMIDiscoveryResponse']['NMIStandingData']
|
185
197
|
myresponse.is_a?(Hash) ? [myresponse] : myresponse
|
198
|
+
else
|
199
|
+
response
|
186
200
|
end
|
187
201
|
end
|
188
202
|
|
@@ -204,11 +218,12 @@ module AEMO
|
|
204
218
|
reason: options[:reason]
|
205
219
|
}
|
206
220
|
|
207
|
-
response = get("/NMIDetail/#{@participant_id}", basic_auth: @auth, headers: HEADERS, query
|
208
|
-
|
209
|
-
|
210
|
-
else
|
221
|
+
response = get("/NMIDetail/#{@participant_id}", basic_auth: @auth, headers: HEADERS, query:,
|
222
|
+
verify: (options[:verify_ssl] != false))
|
223
|
+
if response.response.code == '200'
|
211
224
|
response.parsed_response['aseXML']['Transactions']['Transaction']['NMIStandingDataResponse']['NMIStandingData']
|
225
|
+
else
|
226
|
+
response
|
212
227
|
end
|
213
228
|
end
|
214
229
|
|
@@ -218,13 +233,14 @@ module AEMO
|
|
218
233
|
# @return [Hash] The report results from the Participant System Status web service query
|
219
234
|
def system_status(options = {})
|
220
235
|
query = {
|
221
|
-
transactionId:
|
236
|
+
transactionId: transaction_id
|
222
237
|
}
|
223
|
-
response = get("/ParticipantSystemStatus/#{@participant_id}", basic_auth: @auth, headers: HEADERS,
|
224
|
-
|
225
|
-
|
226
|
-
else
|
238
|
+
response = get("/ParticipantSystemStatus/#{@participant_id}", basic_auth: @auth, headers: HEADERS,
|
239
|
+
query:, verify: (options[:verify_ssl] != false))
|
240
|
+
if response.response.code == '200'
|
227
241
|
response.parsed_response['aseXML']['Transactions']['Transaction']['ReportResponse']['ReportResults']
|
242
|
+
else
|
243
|
+
response
|
228
244
|
end
|
229
245
|
end
|
230
246
|
|
@@ -235,7 +251,7 @@ module AEMO
|
|
235
251
|
# @return [Hash] authentication credentials
|
236
252
|
def authorize(participant_id, username, password)
|
237
253
|
@participant_id = participant_id
|
238
|
-
@auth = { username
|
254
|
+
@auth = { username:, password: }
|
239
255
|
end
|
240
256
|
|
241
257
|
# Check if credentials are available to use
|
@@ -249,7 +265,7 @@ module AEMO
|
|
249
265
|
#
|
250
266
|
# @return [String] the transaction id
|
251
267
|
def transaction_id
|
252
|
-
Digest::SHA1.hexdigest(Time.now.to_s)[0..35]
|
268
|
+
Digest::SHA1.hexdigest(::Time.now.to_s)[0..35]
|
253
269
|
end
|
254
270
|
end
|
255
271
|
|
@@ -29,7 +29,7 @@ module AEMO
|
|
29
29
|
'U' => { stream: 'Check', description: '', units: 'kVAh' },
|
30
30
|
'Y' => { stream: 'Check', description: 'Q Metering', units: 'Qh' },
|
31
31
|
'W' => { stream: 'Check', description: 'Par Metering Path', units: '' },
|
32
|
-
'Z' => { stream: 'Check', description: 'Volts or V2h or Amps or A2h', units: '' }
|
32
|
+
'Z' => { stream: 'Check', description: 'Volts or V2h or Amps or A2h', units: '' }
|
33
33
|
# Net Meter Streams
|
34
34
|
# AEMO: NOTE THAT D AND J ARE PREVIOUSLY DEFINED
|
35
35
|
# 'D' => { stream: 'Net', description: 'Net', units: 'kWh' },
|
@@ -5,12 +5,12 @@ module AEMO
|
|
5
5
|
# @since 0.1.4
|
6
6
|
class NEM12
|
7
7
|
QUALITY_FLAGS = {
|
8
|
-
'A'
|
9
|
-
'E'
|
10
|
-
'F'
|
11
|
-
'N'
|
12
|
-
'S'
|
13
|
-
'V'
|
8
|
+
'A' => 'Actual Data',
|
9
|
+
'E' => 'Forward Estimated Data',
|
10
|
+
'F' => 'Final Substituted Data',
|
11
|
+
'N' => 'Null Data',
|
12
|
+
'S' => 'Substituted Data',
|
13
|
+
'V' => 'Variable Data'
|
14
14
|
}.freeze
|
15
15
|
|
16
16
|
METHOD_FLAGS = {
|
@@ -23,17 +23,21 @@ module AEMO
|
|
23
23
|
17 => { type: %w[SUB], installation_type: [1, 2, 3, 4], short_descriptor: 'Linear', description: '' },
|
24
24
|
18 => { type: %w[SUB], installation_type: [1, 2, 3, 4], short_descriptor: 'Alternate', description: '' },
|
25
25
|
19 => { type: %w[SUB], installation_type: [1, 2, 3, 4], short_descriptor: 'Zero', description: '' },
|
26
|
-
20 => { type: %w[SUB], installation_type: [1, 2, 3, 4], short_descriptor: 'Churn Correction (Like Day)',
|
27
|
-
|
26
|
+
20 => { type: %w[SUB], installation_type: [1, 2, 3, 4], short_descriptor: 'Churn Correction (Like Day)',
|
27
|
+
description: '' },
|
28
|
+
21 => { type: %w[SUB], installation_type: [1, 2, 3, 4], short_descriptor: 'Five-minute No Historical Data',
|
29
|
+
description: '' },
|
28
30
|
51 => { type: %w[EST SUB], installation_type: 5, short_descriptor: 'Previous Year', description: '' },
|
29
31
|
52 => { type: %w[EST SUB], installation_type: 5, short_descriptor: 'Previous Read', description: '' },
|
30
32
|
53 => { type: %w[SUB], installation_type: 5, short_descriptor: 'Revision', description: '' },
|
31
33
|
54 => { type: %w[SUB], installation_type: 5, short_descriptor: 'Linear', description: '' },
|
32
34
|
55 => { type: %w[SUB], installation_type: 5, short_descriptor: 'Agreed', description: '' },
|
33
|
-
56 => { type: %w[EST SUB], installation_type: 5, short_descriptor: 'Prior to First Read - Agreed',
|
35
|
+
56 => { type: %w[EST SUB], installation_type: 5, short_descriptor: 'Prior to First Read - Agreed',
|
36
|
+
description: '' },
|
34
37
|
57 => { type: %w[EST SUB], installation_type: 5, short_descriptor: 'Customer Class', description: '' },
|
35
38
|
58 => { type: %w[EST SUB], installation_type: 5, short_descriptor: 'Zero', description: '' },
|
36
|
-
59 => { type: %w[EST SUB], installation_type: 5, short_descriptor: 'Five-minute No Historical Data',
|
39
|
+
59 => { type: %w[EST SUB], installation_type: 5, short_descriptor: 'Five-minute No Historical Data',
|
40
|
+
description: '' },
|
37
41
|
61 => { type: %w[EST SUB], installation_type: 6, short_descriptor: 'Previous Year', description: '' },
|
38
42
|
62 => { type: %w[EST SUB], installation_type: 6, short_descriptor: 'Previous Read', description: '' },
|
39
43
|
63 => { type: %w[EST SUB], installation_type: 6, short_descriptor: 'Customer Class', description: '' },
|
@@ -5,55 +5,55 @@ module AEMO
|
|
5
5
|
# @since 0.1.4
|
6
6
|
class NEM12
|
7
7
|
UOM = {
|
8
|
-
'MWh'
|
9
|
-
'kWh'
|
10
|
-
'Wh'
|
11
|
-
'MW'
|
12
|
-
'kW'
|
13
|
-
'W'
|
8
|
+
'MWh' => { name: 'Megawatt Hour', multiplier: 1e6 },
|
9
|
+
'kWh' => { name: 'Kilowatt Hour', multiplier: 1e3 },
|
10
|
+
'Wh' => { name: 'Watt Hour', multiplier: 1 },
|
11
|
+
'MW' => { name: 'Megawatt', multiplier: 1e6 },
|
12
|
+
'kW' => { name: 'Kilowatt', multiplier: 1e3 },
|
13
|
+
'W' => { name: 'Watt', multiplier: 1 },
|
14
14
|
'MVArh' => { name: 'Megavolt Ampere Reactive Hour', multiplier: 1e6 },
|
15
15
|
'kVArh' => { name: 'Kilovolt Ampere Reactive Hour', multiplier: 1e3 },
|
16
|
-
'VArh'
|
17
|
-
'MVAr'
|
18
|
-
'kVAr'
|
19
|
-
'VAr'
|
20
|
-
'MVAh'
|
21
|
-
'kVAh'
|
22
|
-
'VAh'
|
23
|
-
'MVA'
|
24
|
-
'kVA'
|
25
|
-
'VA'
|
26
|
-
'kV'
|
27
|
-
'V'
|
28
|
-
'kA'
|
29
|
-
'A'
|
30
|
-
'pf'
|
16
|
+
'VArh' => { name: 'Volt Ampere Reactive Hour', multiplier: 1 },
|
17
|
+
'MVAr' => { name: 'Megavolt Ampere Reactive', multiplier: 1e6 },
|
18
|
+
'kVAr' => { name: 'Kilovolt Ampere Reactive', multiplier: 1e3 },
|
19
|
+
'VAr' => { name: 'Volt Ampere Reactive', multiplier: 1 },
|
20
|
+
'MVAh' => { name: 'Megavolt Ampere Hour', multiplier: 1e6 },
|
21
|
+
'kVAh' => { name: 'Kilovolt Ampere Hour', multiplier: 1e3 },
|
22
|
+
'VAh' => { name: 'Volt Ampere Hour', multiplier: 1 },
|
23
|
+
'MVA' => { name: 'Megavolt Ampere', multiplier: 1e6 },
|
24
|
+
'kVA' => { name: 'Kilovolt Ampere', multiplier: 1e3 },
|
25
|
+
'VA' => { name: 'Volt Ampere', multiplier: 1 },
|
26
|
+
'kV' => { name: 'Kilovolt', multiplier: 1e3 },
|
27
|
+
'V' => { name: 'Volt', multiplier: 1 },
|
28
|
+
'kA' => { name: 'Kiloampere', multiplier: 1e3 },
|
29
|
+
'A' => { name: 'Ampere', multiplier: 1 },
|
30
|
+
'pf' => { name: 'Power Factor', multiplier: 1 }
|
31
31
|
}.freeze
|
32
32
|
|
33
33
|
UOM_NON_SPEC_MAPPING = {
|
34
|
-
'MWH'
|
35
|
-
'KWH'
|
36
|
-
'WH'
|
37
|
-
'MW'
|
38
|
-
'KW'
|
39
|
-
'W'
|
34
|
+
'MWH' => 'MWh',
|
35
|
+
'KWH' => 'kWh',
|
36
|
+
'WH' => 'Wh',
|
37
|
+
'MW' => 'MW',
|
38
|
+
'KW' => 'kW',
|
39
|
+
'W' => 'W',
|
40
40
|
'MVARH' => 'MVArh',
|
41
41
|
'KVARH' => 'kVArh',
|
42
|
-
'VARH'
|
43
|
-
'MVAR'
|
44
|
-
'KVAR'
|
45
|
-
'VAR'
|
46
|
-
'MVAH'
|
47
|
-
'KVAH'
|
48
|
-
'VAH'
|
49
|
-
'MVA'
|
50
|
-
'KVA'
|
51
|
-
'VA'
|
52
|
-
'KV'
|
53
|
-
'V'
|
54
|
-
'KA'
|
55
|
-
'A'
|
56
|
-
'PF'
|
42
|
+
'VARH' => 'VArh',
|
43
|
+
'MVAR' => 'MVAr',
|
44
|
+
'KVAR' => 'kVAr',
|
45
|
+
'VAR' => 'VAr',
|
46
|
+
'MVAH' => 'MVAh',
|
47
|
+
'KVAH' => 'kVAh',
|
48
|
+
'VAH' => 'VAh',
|
49
|
+
'MVA' => 'MVA',
|
50
|
+
'KVA' => 'kVA',
|
51
|
+
'VA' => 'VA',
|
52
|
+
'KV' => 'kV',
|
53
|
+
'V' => 'V',
|
54
|
+
'KA' => 'kA',
|
55
|
+
'A' => 'A',
|
56
|
+
'PF' => 'pf'
|
57
57
|
}.freeze
|
58
58
|
end
|
59
59
|
end
|