Skip to content

Commit 25dcb5b

Browse files
committed
ADD: CurveData to DSS2XML parser
1 parent ded71ea commit 25dcb5b

1 file changed

Lines changed: 41 additions & 1 deletion

File tree

ravens/xml/opendss2xml.py

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -923,7 +923,7 @@ def _add_EnergyConnectionProfile(self, subject_uri, load: altdss.Load):
923923
else:
924924
self.add_triple(node, f"EnergyConnectionProfile.dss{attr}", obj.Name)
925925
if attr in ["Daily", "Yearly", "Duty", "CVRCurve"]:
926-
loadshape_uris.append(self._add_EnergyConsumerSchedule(subject_uri, obj))
926+
loadshape_uris.append(self._add_EnergyConsumerSchedule(subject_uri, loadshape=obj))
927927
self.uuid_map[f"EnergyConnectionProfile.{ecp_name}"] = str(node)
928928
else:
929929
for attr in ["Daily", "Duty", "Yearly", "CVRCurve"]:
@@ -1105,10 +1105,50 @@ def _add_PhotoVoltaicPhases(self, subject_uri: URIRef, solar: altdss.PVSystem, p
11051105
self.add_triple(node, "PowerElectronicsConnectionPhase.phase", self.cim[f"SinglePhaseKind.{ph}"])
11061106
self.add_triple(node, "PowerElectronicsConnectionPhase.PowerElectronicsConnection", subject_uri)
11071107

1108+
def _add_CurveData(self, subject_uri: URIRef, sequence: int, value1: float, value2: float):
1109+
node = self.build_cim_obj("CurveData", skip_mrid=True)
1110+
self.add_triple(node, "CurveData.xvalue", sequence + 1) # adjust/shift sequence number from 0 to 1.
1111+
self.add_triple(node, "CurveData.y1value", value1)
1112+
self.add_triple(node, "CurveData.y2value", value2)
1113+
self.add_triple(node, "CurveData.Curve", subject_uri)
1114+
1115+
def _add_Curve(self, subject_uri: URIRef, loadshape: altdss.LoadShape):
1116+
if f"Curve.{loadshape.Name}" not in self.uuid_map:
1117+
node = self.build_cim_obj("Curve", name=loadshape.Name)
1118+
1119+
pmult = loadshape.PMult
1120+
qmult = loadshape.QMult
1121+
1122+
if loadshape.UseActual:
1123+
self.add_triple(node, "Curve.y1Unit", "UnitSymbol.W")
1124+
self.add_triple(node, "Curve.y2Unit", "UnitSymbol.VAr")
1125+
pmult *= 1000
1126+
qmult *= 1000
1127+
else:
1128+
self.add_triple(node, "Curve.y1Unit", "UnitSymbol.none")
1129+
self.add_triple(node, "Curve.y2Unit", "UnitSymbol.none")
1130+
1131+
if qmult.size == 0:
1132+
qmult = pmult
1133+
1134+
for i, (p, q) in enumerate(zip(pmult, qmult)):
1135+
self._add_CurveData(node, i, p, q)
1136+
1137+
self.uuid_map[f"Curve.{loadshape.Name}"] = str(node)
1138+
1139+
return URIRef(self.uuid_map[f"Curve.{loadshape.Name}"])
1140+
1141+
def _add_PhotoVoltaicUnit_GenerationProfile(self, subject_uri: URIRef, solar: altdss.PVSystem):
1142+
profile = getattr(solar, "Daily")
1143+
if profile is not None:
1144+
node = self._add_Curve(subject_uri, profile)
1145+
self.add_triple(subject_uri, "PhotoVoltaicUnit.GenerationProfile", node)
1146+
11081147
def _add_PhotoVoltaicUnit(self, subject_uri: URIRef, solar: altdss.PVSystem):
11091148
node = self.build_cim_obj("PhotoVoltaicUnit", name=f"{solar.Name}_PVPanels")
11101149
self.add_triple(node, "PowerElectronicsUnit.minP", min(solar.pctCutIn, solar.pctCutOut) / 100.0 * solar.kVA * 1000.0)
11111150
self.add_triple(node, "PowerElectronicsUnit.maxP", solar.Pmpp * 1000.0)
1151+
self._add_PhotoVoltaicUnit_GenerationProfile(node, solar)
11121152

11131153
self.add_triple(subject_uri, "PowerElectronicsConnection.PowerElectronicsUnit", node)
11141154

0 commit comments

Comments
 (0)