aemo 0.1.19 → 0.1.20

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,141 @@
1
+ <?xml version="1.0" ?>
2
+ <ase:aseXML xmlns:ase="urn:aseXML:r31" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:aseXML:r31 http://www.nemmco.com.au/aseXML/schemas/r31/aseXML_r31.xsd">
3
+ <Header>
4
+ <From description="Australian Energy Market Operator Limited">NEMMCO</From>
5
+ <To description="COzero Energy Retail Pty Ltd">COZEROER</To>
6
+ <MessageID>NEMMCO-MSG-600298046</MessageID>
7
+ <MessageDate>2016-03-23T16:12:34+10:00</MessageDate>
8
+ <TransactionGroup>NMID</TransactionGroup>
9
+ <Priority>High</Priority>
10
+ <SecurityContext>NEMMCOBATCH</SecurityContext>
11
+ <Market>NEM</Market>
12
+ </Header>
13
+ <Transactions>
14
+ <Transaction transactionID="NMID-600298046" transactionDate="2016-03-23T16:12:34+10:00" initiatingTransactionID="1234567890">
15
+ <NMIDiscoveryResponse version="r17">
16
+ <NMIStandingData xsi:type="ase:ElectricityStandingData" version="r31">
17
+ <NMI checksum="7">4000000000</NMI>
18
+ <MasterData>
19
+ <Address>
20
+ <StructuredAddress>
21
+ <FlatOrUnit>
22
+ <FlatOrUnitType>SITE</FlatOrUnitType>
23
+ <FlatOrUnitNumber>0</FlatOrUnitNumber>
24
+ </FlatOrUnit>
25
+ <BuildingOrPropertyName>PARLIAMENT HOUSE</BuildingOrPropertyName>
26
+ <LocationDescriptor>HUT PARLIAMENT HOUSE TELSTRA</LocationDescriptor>
27
+ <House>
28
+ <HouseNumber>6</HouseNumber>
29
+ </House>
30
+ <Street>
31
+ <StreetName>MACQUARIE</StreetName>
32
+ <StreetType>ST</StreetType>
33
+ </Street>
34
+ </StructuredAddress>
35
+ <SuburbOrPlaceOrLocality>SYDNEY</SuburbOrPlaceOrLocality>
36
+ <StateOrTerritory>NSW</StateOrTerritory>
37
+ <PostCode>2000</PostCode>
38
+ </Address>
39
+ <CustomerClassificationCode>BUSINESS</CustomerClassificationCode>
40
+ <CustomerThresholdCode>LOW</CustomerThresholdCode>
41
+ </MasterData>
42
+ <RoleAssignments>
43
+ <RoleAssignment>
44
+ <Party>ENERGYAP</Party>
45
+ <Role>LNSP</Role>
46
+ </RoleAssignment>
47
+ </RoleAssignments>
48
+ </NMIStandingData>
49
+ <NMIStandingData xsi:type="ase:ElectricityStandingData" version="r31">
50
+ <NMI checksum="4">4000000001</NMI>
51
+ <MasterData>
52
+ <Address>
53
+ <StructuredAddress>
54
+ <BuildingOrPropertyName>PARLIAMENT HOUSE</BuildingOrPropertyName>
55
+ <LocationDescriptor>SUPPLY 3</LocationDescriptor>
56
+ <House>
57
+ <HouseNumber>6</HouseNumber>
58
+ </House>
59
+ <Street>
60
+ <StreetName>MACQUARIE</StreetName>
61
+ <StreetType>ST</StreetType>
62
+ </Street>
63
+ </StructuredAddress>
64
+ <SuburbOrPlaceOrLocality>SYDNEY</SuburbOrPlaceOrLocality>
65
+ <StateOrTerritory>NSW</StateOrTerritory>
66
+ <PostCode>2000</PostCode>
67
+ </Address>
68
+ <CustomerClassificationCode>BUSINESS</CustomerClassificationCode>
69
+ <CustomerThresholdCode>HIGH</CustomerThresholdCode>
70
+ </MasterData>
71
+ <RoleAssignments>
72
+ <RoleAssignment>
73
+ <Party>ENERGYAP</Party>
74
+ <Role>LNSP</Role>
75
+ </RoleAssignment>
76
+ </RoleAssignments>
77
+ </NMIStandingData>
78
+ <NMIStandingData xsi:type="ase:ElectricityStandingData" version="r31">
79
+ <NMI checksum="8">4000000002</NMI>
80
+ <MasterData>
81
+ <Address>
82
+ <StructuredAddress>
83
+ <BuildingOrPropertyName>PARLIAMENT HOUSE</BuildingOrPropertyName>
84
+ <House>
85
+ <HouseNumber>6</HouseNumber>
86
+ </House>
87
+ <Street>
88
+ <StreetName>MACQUARIE</StreetName>
89
+ <StreetType>ST</StreetType>
90
+ </Street>
91
+ </StructuredAddress>
92
+ <SuburbOrPlaceOrLocality>SYDNEY</SuburbOrPlaceOrLocality>
93
+ <StateOrTerritory>NSW</StateOrTerritory>
94
+ <PostCode>2000</PostCode>
95
+ </Address>
96
+ <CustomerClassificationCode>BUSINESS</CustomerClassificationCode>
97
+ <CustomerThresholdCode>LOW</CustomerThresholdCode>
98
+ </MasterData>
99
+ <RoleAssignments>
100
+ <RoleAssignment>
101
+ <Party>ENERGYAP</Party>
102
+ <Role>LNSP</Role>
103
+ </RoleAssignment>
104
+ </RoleAssignments>
105
+ </NMIStandingData>
106
+ <NMIStandingData xsi:type="ase:ElectricityStandingData" version="r31">
107
+ <NMI checksum="6">4000000003</NMI>
108
+ <MasterData>
109
+ <Address>
110
+ <StructuredAddress>
111
+ <BuildingOrPropertyName>PARLIAMENT HOUSE</BuildingOrPropertyName>
112
+ <LocationDescriptor>SUPPLIES 1 AND 2</LocationDescriptor>
113
+ <House>
114
+ <HouseNumber>6</HouseNumber>
115
+ </House>
116
+ <Street>
117
+ <StreetName>MACQUARIE</StreetName>
118
+ <StreetType>ST</StreetType>
119
+ </Street>
120
+ </StructuredAddress>
121
+ <SuburbOrPlaceOrLocality>SYDNEY</SuburbOrPlaceOrLocality>
122
+ <StateOrTerritory>NSW</StateOrTerritory>
123
+ <PostCode>2000</PostCode>
124
+ </Address>
125
+ <CustomerClassificationCode>BUSINESS</CustomerClassificationCode>
126
+ <CustomerThresholdCode>HIGH</CustomerThresholdCode>
127
+ </MasterData>
128
+ <RoleAssignments>
129
+ <RoleAssignment>
130
+ <Party>ENERGYAP</Party>
131
+ <Role>LNSP</Role>
132
+ </RoleAssignment>
133
+ </RoleAssignments>
134
+ </NMIStandingData>
135
+ <Event severity="Information">
136
+ <Code>0</Code>
137
+ </Event>
138
+ </NMIDiscoveryResponse>
139
+ </Transaction>
140
+ </Transactions>
141
+ </ase:aseXML>
@@ -0,0 +1,30 @@
1
+ <?xml version="1.0" ?>
2
+ <ase:aseXML xmlns:ase="urn:aseXML:r32" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:aseXML:r32 http://www.nemmco.com.au/aseXML/schemas/r32/aseXML_r32.xsd">
3
+ <Header>
4
+ <From description="Australian Energy Market Operator Limited">NEMMCO</From>
5
+ <To description="Energy Retail">ER</To>
6
+ <MessageID>NEMMCO-MSG-666</MessageID>
7
+ <MessageDate>2016-01-01T00:00:00+10:00</MessageDate>
8
+ <TransactionGroup>CATS</TransactionGroup>
9
+ <Priority>Medium</Priority>
10
+ <SecurityContext>NEMMCOBATCH</SecurityContext>
11
+ <Market>NEM</Market>
12
+ </Header>
13
+ <Transactions>
14
+ <Transaction transactionID="CATS-666" transactionDate="2016-01-01T00:00:00+10:00" initiatingTransactionID="1234567890">
15
+ <ReportResponse version="r10">
16
+ <ReportParameters xsi:type="ase:GenericReportParameters">
17
+ <ReportName>ParticipantSystemStatus</ReportName>
18
+ </ReportParameters>
19
+ <ReportResults xsi:type="ase:CATSParticipantSystemStatusReportFormat">
20
+ <ParticipantSystemsStatus>
21
+ </ParticipantSystemsStatus>
22
+ </ReportResults>
23
+ <Event severity="Information">
24
+ <Code>0</Code>
25
+ <Explanation>Success</Explanation>
26
+ </Event>
27
+ </ReportResponse>
28
+ </Transaction>
29
+ </Transactions>
30
+ </ase:aseXML>
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+
3
+ describe AEMO::Market::Interval do
4
+ describe 'AEMO::Market::Interval contstants' do
5
+ it 'has INTERVALS' do
6
+ expect(AEMO::Market::Interval::INTERVALS).to eq({trading: 'Trading',dispatch: 'Dispatch'})
7
+ end
8
+ end
9
+ describe 'AEMO::Market::Interval instance methods' do
10
+ before(:each) do
11
+ @interval = AEMO::Market::Interval.new("2016-03-01T00:30:00", {'REGION' => 'NSW', 'TOTALDEMAND' => 1000.23, 'RRP' => 76.54, 'PERIODTYPE' => 'TRADING'})
12
+ end
13
+ it 'creates a valid interval' do
14
+ expect {AEMO::Market::Interval.new("2016-03-01T00:30:00", {'REGION' => 'NSW', 'TOTALDEMAND' => 1000.23, 'RRP' => 76.54, 'PERIODTYPE' => 'TRADING'})}.not_to raise_error
15
+ end
16
+ it 'has a trailing datetime' do
17
+ expect(@interval.datetime).to eq(DateTime.parse("2016-03-01T00:30:00+1000"))
18
+ end
19
+ it 'has a leading datetime' do
20
+ expect(@interval.datetime(false)).to eq(DateTime.parse("2016-03-01T00:00:00+1000"))
21
+ end
22
+ it 'has a leading datetime for dispatch' do
23
+ @interval = AEMO::Market::Interval.new("2016-03-01T00:30:00", {'REGION' => 'NSW', 'TOTALDEMAND' => 1000.23, 'RRP' => 76.54, 'PERIODTYPE' => ''})
24
+ expect(@interval.datetime(false)).to eq(DateTime.parse("2016-03-01T00:25:00+1000"))
25
+ end
26
+ it 'has an interval length' do
27
+ expect(@interval.interval_length).to eq(Time.at(300))
28
+ end
29
+ it 'is a trading interval' do
30
+ expect(@interval.interval_type).to eq(:trading)
31
+ end
32
+ it 'is a trading interval' do
33
+ expect(@interval.is_trading?).to eq(true)
34
+ expect(@interval.is_dispatch?).to eq(false)
35
+ end
36
+ it 'is a dispatch interval' do
37
+ @interval = AEMO::Market::Interval.new("2016-03-01T00:30:00", {'REGION' => 'NSW', 'TOTALDEMAND' => 1000.23, 'RRP' => 76.54, 'PERIODTYPE' => ''})
38
+ expect(@interval.interval_type).to eq(:dispatch)
39
+ end
40
+ it 'is a dispatch interval' do
41
+ @interval = AEMO::Market::Interval.new("2016-03-01T00:30:00", {'REGION' => 'NSW', 'TOTALDEMAND' => 1000.23, 'RRP' => 76.54, 'PERIODTYPE' => ''})
42
+ expect(@interval.is_trading?).to eq(false)
43
+ expect(@interval.is_dispatch?).to eq(true)
44
+ end
45
+ it 'has a valid value' do
46
+ expect(@interval.value).to eq((@interval.total_demand * @interval.rrp).round(2))
47
+ end
48
+ end
49
+ end
@@ -1,16 +1,22 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe AEMO::Market do
4
- describe '.regions' do
5
- it "returns the SupportedFormats constant" do
6
- expect(AEMO::Market.regions).to eq(AEMO::Region::REGIONS)
4
+ it "returns the SupportedFormats constant for subclasses" do
5
+ class MyParser < HTTParty::Parser
6
+ SupportedFormats = {"application/atom+xml" => :atom}
7
7
  end
8
+ expect(MyParser.formats).to eq({"application/atom+xml" => :atom})
9
+ end
10
+
11
+ describe 'Dispatch data' do
12
+ it 'has an array of data' do
13
+ expect(AEMO::Market.current_dispatch('NSW').class).to eq(Array)
14
+ end
15
+ end
8
16
 
9
- it "returns the SupportedFormats constant for subclasses" do
10
- class MyParser < HTTParty::Parser
11
- SupportedFormats = {"application/atom+xml" => :atom}
12
- end
13
- expect(MyParser.formats).to eq({"application/atom+xml" => :atom})
17
+ describe 'Trading data' do
18
+ it 'has an array of data' do
19
+ expect(AEMO::Market.current_trading('NSW').class).to eq(Array)
14
20
  end
15
21
  end
16
22
  end
@@ -0,0 +1,84 @@
1
+ require 'spec_helper'
2
+
3
+ describe AEMO::MSATS do
4
+ describe 'instance methods' do
5
+ it 'creates a new instance' do
6
+ expect(AEMO::MSATS.new.class).to eq(AEMO::MSATS)
7
+ end
8
+ end
9
+
10
+ describe 'class methods' do
11
+ describe 'nmi details' do
12
+ before(:each) do
13
+ AEMO::MSATS.authorize("ER","ER","ER")
14
+ end
15
+
16
+ it 'should get data for a valid nmi' do
17
+ nmi_detail_query = AEMO::MSATS.nmi_detail('4001234567')
18
+ expect(nmi_detail_query.class).to eq(Hash)
19
+ end
20
+ it 'should get a 404 for a nonexistent nmi' do
21
+ nmi_detail_query = AEMO::MSATS.nmi_detail('4001234566')
22
+ # TODO workout what the different errors are here...
23
+ end
24
+ it 'should raise an error for a bad nmi' do
25
+ expect {AEMO::MSATS.nmi_detail('BOBISAFISH')}.to raise_error(ArgumentError)
26
+ end
27
+ end
28
+
29
+ describe '#c4' do
30
+ before(:each) do
31
+ AEMO::MSATS.authorize("ER","ER","ER")
32
+ end
33
+
34
+ it 'should return a hash of information' do
35
+ AEMO::MSATS.c4("4001234567",DateTime.now,DateTime.now,DateTime.now)
36
+ end
37
+ it 'should raise an error for a bad nmi' do
38
+ expect {AEMO::MSATS.c4('BOBISAFISH')}.to raise_error(ArgumentError)
39
+ end
40
+ it 'should return a hash of information' do
41
+ AEMO::MSATS.c4("4001234566",DateTime.now,DateTime.now,DateTime.now)
42
+ # TODO workout what the different errors are here...
43
+ end
44
+ end
45
+
46
+ describe '#msats_limits' do
47
+ before(:each) do
48
+ AEMO::MSATS.authorize("ER","ER","ER")
49
+ end
50
+
51
+ it 'should give details of msats_limits' do
52
+ expect(AEMO::MSATS.msats_limits.class).to eq(Hash)
53
+ end
54
+ end
55
+
56
+ describe '#nmi_discovery_by_*' do
57
+ before(:each) do
58
+ AEMO::MSATS.authorize("ER","ER","ER")
59
+ end
60
+ it 'should find by address' do
61
+ expect(AEMO::MSATS.nmi_discovery_by_address('NSW',{ house_number: 6, street_name: 'Macquarie', suburb_or_place_or_locality: 'Sydney', postcode: 2000}).class).to eq(Array)
62
+ end
63
+ it 'should find by meter_serial_number' do
64
+ expect(AEMO::MSATS.nmi_discovery_by_meter_serial_number('NSW',666).class).to eq(Array)
65
+ end
66
+ it 'should find by meter_serial_number' do
67
+ expect {AEMO::MSATS.nmi_discovery_by_delivery_point_identifier('NSW',666)}.to raise_error(ArgumentError)
68
+ end
69
+ it 'should find by meter_serial_number' do
70
+ expect(AEMO::MSATS.nmi_discovery_by_delivery_point_identifier('NSW',10000001).class).to eq(Array)
71
+ end
72
+ end
73
+
74
+ describe '#system_status' do
75
+ before(:each) do
76
+ AEMO::MSATS.authorize("ER","ER","ER")
77
+ end
78
+ it 'should provide a status' do
79
+ AEMO::MSATS.system_status
80
+ end
81
+ end
82
+
83
+ end
84
+ end
@@ -11,23 +11,6 @@ describe AEMO::NEM12 do
11
11
  end
12
12
  end
13
13
 
14
- describe '.valid_nmi?' do
15
- it 'should validate nmi' do
16
- json.each do |nmi|
17
- expect(AEMO::NEM12.valid_nmi?(nmi['nmi'])).to eq(true)
18
- end
19
- end
20
- end
21
-
22
- describe '#nmi_checksum' do
23
- it 'should return nmi checksum' do
24
- json.each do |nmi|
25
- nem12 = AEMO::NEM12.new(nmi['nmi'])
26
- expect(nem12.nmi_checksum).to eq(nmi['checksum'])
27
- end
28
- end
29
- end
30
-
31
14
  describe '#parse_nem12' do
32
15
  end
33
16
 
@@ -39,22 +22,37 @@ describe AEMO::NEM12 do
39
22
  end
40
23
  end
41
24
 
42
- describe 'parse_nem12_100' do
25
+ describe '#parse_nem12_100' do
26
+ it 'should raise datetime error' do
27
+ expect {AEMO::NEM12.parse_nem12_100('100,NEM12,666,CNRGYMDP,NEMMCO')}.to raise_error(ArgumentError)
28
+ end
29
+ it 'should raise datetime error' do
30
+ expect {AEMO::NEM12.parse_nem12_100('100,NEM12,666,CNRGYMDP,NEMMCO', {strict: true})}.to raise_error(ArgumentError)
31
+ end
32
+ it 'should not raise an error' do
33
+ expect {AEMO::NEM12.parse_nem12_100('100,NEM12,201603010000,CNRGYMDP,NEMMCO', {strict: true})}.not_to raise_error
34
+ end
43
35
  end
44
36
 
45
- describe 'parse_nem12_200' do
37
+ describe '#parse_nem12_200' do
38
+ before(:each) do
39
+ @nem12 = AEMO::NEM12.parse_nem12_100('100,NEM12,201603010000,CNRGYMDP,NEMMCO', {strict: true})
40
+ end
46
41
  end
47
42
 
48
- describe 'parse_nem12_300' do
43
+ describe '#parse_nem12_300' do
49
44
  end
50
45
 
51
- describe 'parse_nem12_400' do
46
+ describe '#parse_nem12_400' do
52
47
  end
53
48
 
54
- describe 'parse_nem12_500' do
49
+ describe '#parse_nem12_500' do
55
50
  end
56
51
 
57
- describe 'parse_nem12_900' do
52
+ describe '#parse_nem12_900' do
58
53
  end
59
54
 
55
+ describe '#flag_to_s' do
56
+
57
+ end
60
58
  end
@@ -131,4 +131,82 @@ describe AEMO::NMI do
131
131
  end
132
132
  end
133
133
 
134
+ describe "#friendly_address" do
135
+ it 'should return the empty string if the address is not a hash' do
136
+ nmi = AEMO::NMI.new("4001234567")
137
+ nmi.address = "An address"
138
+ expect(nmi.friendly_address).to eq('')
139
+ end
140
+ it 'should return a friendly address if the address is a hash' do
141
+ nmi = AEMO::NMI.new("4001234567")
142
+ nmi.address = { number: '1', street: 'Bob', street_type: 'Street'}
143
+ expect(nmi.friendly_address).to eq('1, Bob, Street')
144
+ end
145
+ end
146
+
147
+ describe "#current_daily_load" do
148
+ it "should return zero for no data" do
149
+ @nmi = AEMO::NMI.new("4001234567")
150
+ expect(@nmi.current_daily_load).to eq(0)
151
+ end
152
+ end
153
+
154
+ describe "#meters_by_status" do
155
+ before(:each) do
156
+ @nmi = AEMO::NMI.new("4001234567")
157
+ @nmi.meters = [OpenStruct.new(status: 'C'),OpenStruct.new(status: 'R')]
158
+ end
159
+ it 'should return current meters' do
160
+ expect(@nmi.meters_by_status.count).to eq(1)
161
+ end
162
+ it 'should return retired meters' do
163
+ expect(@nmi.meters_by_status('R').count).to eq(1)
164
+ end
165
+ it 'should return zero meters for weird status' do
166
+ expect(@nmi.meters_by_status('TMP').count).to eq(0)
167
+ end
168
+ end
169
+
170
+ describe "distribution loss factors" do
171
+ before(:each) do
172
+ @nmi = AEMO::NMI.new("4001234567")
173
+ @nmi.dlf = "BL0A"
174
+ @nmi.tni = "NGN2"
175
+ end
176
+ it "has a valid DLF Code" do
177
+ expect(@nmi.dlf).to eq("BL0A")
178
+ end
179
+ it "has a DLF value" do
180
+ expect(@nmi.dlfc_value.class).to eq(Float)
181
+ end
182
+ end
183
+
184
+ describe "transmission node identifiers and loss factors" do
185
+ before(:each) do
186
+ @nmi = AEMO::NMI.new("4001234567")
187
+ @nmi.dlf = "BL0A"
188
+ @nmi.tni = "NGN2"
189
+ end
190
+ it "has a valid TNI Code" do
191
+ expect(@nmi.tni).to eq("NGN2")
192
+ end
193
+ it "has a TNI value" do
194
+ expect(@nmi.tni_value.class).to eq(Float)
195
+ end
196
+ end
197
+
198
+ describe "MSATS functions" do
199
+ it 'should get data' do
200
+ AEMO::MSATS.authorize("ER","ER","ER")
201
+ nmi = AEMO::NMI.new('4001234567')
202
+ nmi.update_from_msats!
203
+ expect(nmi.msats_detail).to_not eq(nil)
204
+ end
205
+ it 'should return the hash of raw data' do
206
+ AEMO::MSATS.authorize("ER","ER","ER")
207
+ nmi = AEMO::NMI.new('4001234567')
208
+ expect(nmi.raw_msats_nmi_detail.class).to eq(Hash)
209
+ end
210
+ end
211
+
134
212
  end