Skip to content

Commit

Permalink
Add meter inof to at export
Browse files Browse the repository at this point in the history
  • Loading branch information
haneslinger committed Jan 9, 2025
1 parent 3a0fb44 commit 6ad9dbb
Show file tree
Hide file tree
Showing 2 changed files with 107 additions and 1 deletion.
39 changes: 38 additions & 1 deletion seed/audit_template/audit_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,12 @@
from lxml.builder import ElementMaker
from quantityfield.units import ureg

from seed.analysis_pipelines.better.buildingsync import SEED_TO_BSYNC_RESOURCE_TYPE
from seed.building_sync import validation_client
from seed.building_sync.mappings import BUILDINGSYNC_URI, NAMESPACES
from seed.lib.progress_data.progress_data import ProgressData
from seed.lib.superperms.orgs.models import Organization
from seed.models import PropertyView
from seed.models import Meter, MeterReading, PropertyView
from seed.utils.encrypt import decrypt

_log = logging.getLogger(__name__)
Expand Down Expand Up @@ -334,6 +335,42 @@ def build_xml(self, state, report_type, display_field):
),
E.Reports(
E.Report(
E.Scenarios(
{},
E.Scenario(
{"ID": "ScenarioType-69817879941680"},
E.ResourceUses(
{},
*[
E.ResourceUse(
{"ID": f"ResourceUseType-{meter.id}"},
E.EnergyResource(SEED_TO_BSYNC_RESOURCE_TYPE.get(meter.type, "Other")),
E.ResourceUnits(
"kBtu"
if Meter.ENERGY_TYPE_BY_METER_TYPE.get(meter.type)
in Organization._default_display_meter_units
else "Gallons"
),
)
for meter in Meter.objects.filter(property_id=view.property_id)
],
),
E.TimeSeriesData(
{},
*[
E.TimeSeries(
{"ID": f"TimeSeriesType-{i}"},
E.StartTimestamp(meter_reading.start_time.isoformat()),
E.EndTimestamp(meter_reading.end_time.isoformat()),
E.IntervalReading(str(meter_reading.reading)),
)
for i, meter_reading in enumerate(
MeterReading.objects.filter(meter__property_id=view.property_id)
)
],
),
),
),
{"ID": "ReportType-69909846999993"},
E.LinkedPremisesOrSystem(
E.Building(E.LinkedBuildingID({"IDref": "BuildingType-69909846999992"})),
Expand Down
69 changes: 69 additions & 0 deletions seed/tests/test_audit_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,13 @@
from django.test import TestCase
from django.urls import reverse
from django.utils import timezone
from django.utils import timezone as tz
from lxml import etree

# from seed.audit_template.audit_template import build_xml
from seed.audit_template.audit_template import AuditTemplate
from seed.landing.models import SEEDUser as User
from seed.models import Meter, MeterReading
from seed.test_helpers.fake import FakeCycleFactory, FakePropertyFactory, FakePropertyStateFactory, FakePropertyViewFactory
from seed.utils.organizations import create_organization

Expand Down Expand Up @@ -163,6 +166,72 @@ def test_build_xml_from_property(self):
self.assertEqual("error", messages[0])
self.assertEqual(exp_error, messages[1])

def test_build_xml_from_property_with_meter(self):
# Set Up
self.meter = Meter.objects.create(property_id=self.view1.property_id, type=Meter.ELECTRICITY_GRID)

# Action
at = AuditTemplate(self.org.id)
response = at.build_xml(self.state1, "Demo City Report", self.state1.pm_property_id)

# Assert
# # is tree
self.assertEqual(tuple, type(response))
tree = etree.XML(response[0])

# # has 1 scenario
scenarios = tree.findall("auc:Facilities/auc:Facility/auc:Reports/auc:Report/auc:Scenarios/auc:Scenario", namespaces=tree.nsmap)
self.assertEqual(1, len(scenarios))
scenario = scenarios[0]

# # scenario has 1 meter
meters = scenario.findall("auc:ResourceUses/auc:ResourceUse", namespaces=tree.nsmap)
self.assertEqual(1, len(meters))
meter = meters[0]

# # meter type
meter_type = meter.find("auc:EnergyResource", namespaces=tree.nsmap)
meter_unit = meter.find("auc:ResourceUnits", namespaces=tree.nsmap)
self.assertEqual(meter_type.text, "Electricity")
self.assertEqual(meter_unit.text, "kBtu")

def test_build_xml_from_property_with_meter_readings(self):
# Set Up
self.meter = Meter.objects.create(property_id=self.view1.property_id, type=Meter.ELECTRICITY_GRID)
MeterReading.objects.create(
start_time=datetime(2019, 1, 1, 0, 0, 0, tzinfo=tz.utc),
end_time=datetime(2019, 2, 1, 0, 0, 0, tzinfo=tz.utc),
reading=123,
meter_id=self.meter.id,
conversion_factor=1,
)

# Action
at = AuditTemplate(self.org.id)
response = at.build_xml(self.state1, "Demo City Report", self.state1.pm_property_id)

# Assert
# # is tree
self.assertEqual(tuple, type(response))
tree = etree.XML(response[0])

# # has 1 scenario
scenarios = tree.findall("auc:Facilities/auc:Facility/auc:Reports/auc:Report/auc:Scenarios/auc:Scenario", namespaces=tree.nsmap)
self.assertEqual(1, len(scenarios))
scenario = scenarios[0]

# # scenario has 1 meter reading
meter_readings = scenario.findall("auc:TimeSeriesData/auc:TimeSeries", namespaces=tree.nsmap)
self.assertEqual(1, len(meter_readings))
meter_reading = meter_readings[0]

start_time = meter_reading.find("auc:StartTimestamp", namespaces=tree.nsmap)
end_time = meter_reading.find("auc:EndTimestamp", namespaces=tree.nsmap)
reading = meter_reading.find("auc:IntervalReading", namespaces=tree.nsmap)
self.assertEqual(start_time.text, datetime(2019, 1, 1, 0, 0, 0, tzinfo=tz.utc).isoformat())
self.assertEqual(end_time.text, datetime(2019, 2, 1, 0, 0, 0, tzinfo=tz.utc).isoformat())
self.assertEqual(float(reading.text), 123)

@mock.patch("requests.request")
def test_export_to_audit_template(self, mock_request):
"""
Expand Down

0 comments on commit 6ad9dbb

Please sign in to comment.