88import csv
99import json
1010import os
11- from typing import Any , List , Union
11+ from typing import List , Union , Tuple , Optional , Dict
1212
13- from zepben .evolve import NetworkConsumerClient , PhaseStep , PhaseCode , AcLineSegment , \
14- Switch , normal_downstream_trace , FeederDirection , connect_with_token
15- from zepben .evolve .services .network .tracing .phases .phase_step import start_at
16- from zepben .protobuf .nc .nc_requests_pb2 import IncludedEnergizedContainers
13+ from zepben .evolve import NetworkConsumerClient , PhaseCode , AcLineSegment , \
14+ FeederDirection , connect_with_token , Tracing , downstream , NetworkTraceStep , ConductingEquipment , PowerTransformer
15+ from zepben .protobuf .nc .nc_requests_pb2 import INCLUDE_ENERGIZED_LV_FEEDERS
16+
17+ LineInfo = Tuple [str , str , Optional [Union [int , float ]]]
1718
1819
1920async def main ():
@@ -27,45 +28,38 @@ async def main():
2728 result = (await client .get_network_hierarchy ()).throw_on_error ().result
2829 print ("Connection Established" )
2930
30- switch_to_line_type : dict [str , tuple [ list [ Any ], bool ]] = {}
31+ tx_to_line_type : Dict [str , Tuple [ List [ LineInfo ], bool ]] = {}
3132
3233 os .makedirs ("csvs" , exist_ok = True )
3334 for feeder in result .feeders .values ():
3435 print (f"Fetching { feeder .mrid } " )
3536 if not (network := await get_feeder_network (channel , feeder .mrid )): # Skip feeders that fail to pull down
3637 print (f"Failed to retrieve feeder { feeder .mrid } " )
3738 continue
38- for io in network .objects (Switch ):
39+ for io in network .objects (PowerTransformer ):
40+ print (io )
3941 _loop = False
4042
4143 for t in io .terminals :
4244 t_dir = t .normal_feeder_direction
4345 if t_dir == FeederDirection .BOTH :
4446 _loop = True
4547
46- sw_name = io .name
47- sw_id = io .mrid
4848
49- # Currently using switch with the following name as a marker for LV circuit heads
50- if "Circuit Head Switch" in sw_name :
51- switch_to_line_type [sw_id ] = (
52- await get_downstream_trace (start_at (io , PhaseCode .ABCN )),
53- loop
54- )
55- await save_to_csv (switch_to_line_type , feeder .mrid )
49+ tx_to_line_type [io .mrid ] = (await get_downstream_trace (io , PhaseCode .ABCN ), _loop )
50+ await save_to_csv (tx_to_line_type , feeder .mrid )
5651
5752
58- async def save_to_csv (data : dict [str , tuple [ list [ Any ], bool ]], feeder_mrid ):
53+ async def save_to_csv (data : Dict [str , Tuple [ List [ LineInfo ], bool ]], feeder_mrid ):
5954 filename = f"csvs/conductor_types_{ feeder_mrid } .csv"
6055 with open (filename , mode = 'w' , newline = '' ) as file :
6156 writer = csv .writer (file )
62- writer .writerow (["Feeder" , "Switch " , "Line" , "Line Type" , "Length" , "Loop" ])
57+ writer .writerow (["Feeder" , "Transformer " , "Line" , "Line Type" , "Length" , "Loop" ])
6358
64- for switch , (values , loop ) in data .items ():
65- for i in range (0 , len (values ), 3 ):
66- line_type = values [i + 1 ] if i + 1 < len (values ) else ""
67- length = values [i + 2 ] if i + 2 < len (values ) else ""
68- switch_data = [feeder_mrid , switch , values [i ], line_type , length , loop ]
59+ for transformer , (values , loop ) in data .items ():
60+ for value in values :
61+ line , line_type , length = value
62+ switch_data = [feeder_mrid , transformer , line , line_type , length , loop ]
6963 writer .writerow (switch_data )
7064
7165 print (f"Data saved to { filename } " )
@@ -85,22 +79,18 @@ async def get_feeder_network(channel, feeder_mrid):
8579 return client .service
8680
8781
88- async def get_downstream_trace (ce : ConductingEquipment , phase_code : PhaseCode ) -> list [Union [str , float ]]:
89- l_type : List [Union [str , float ]] = []
90-
91- def collect_eq_in ():
92- async def add_eq (ps : NetworkTraceStep , _ ):
93- equip = ps .path .to_equipment
94- if isinstance (equip , AcLineSegment ):
95- nonlocal l_type
96- l_type .extend ((equip .mrid , equip .asset_info .name , equip .length or 0 ))
82+ async def get_downstream_trace (ce : ConductingEquipment , phase_code : PhaseCode ) -> List [LineInfo ]:
83+ l_type : List [LineInfo ] = []
9784
98- return add_eq
85+ def collect_eq_in (step : NetworkTraceStep , _ ):
86+ if isinstance (equip := step .path .to_equipment , AcLineSegment ):
87+ nonlocal l_type
88+ l_type .append ((equip .mrid , equip .asset_info .name , equip .length or 0 ))
9989
10090 await (
10191 Tracing .network_trace ()
10292 .add_condition (downstream ())
103- .add_step_action (collect_eq_in () )
93+ .add_step_action (collect_eq_in )
10494 ).run (start = ce , phases = phase_code )
10595
10696 return l_type
0 commit comments