diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 5fdb4e9..fdd605f 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -1,9 +1,13 @@ name: Deploy Documentation +# Docs deploy only when a public version ships: after the "Publish to PyPI" +# workflow finishes successfully, or on a manual run. Routine pushes to main +# (and work on develop) do NOT update the public site. on: - push: - branches: - - main + workflow_run: + workflows: ["Publish to PyPI"] + types: [completed] + workflow_dispatch: # allow manual rebuilds permissions: contents: read @@ -17,11 +21,15 @@ concurrency: jobs: build: runs-on: ubuntu-latest + # Only build on a successful publish, or when triggered manually. + if: > + github.event_name == 'workflow_dispatch' + || github.event.workflow_run.conclusion == 'success' steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Install uv - uses: astral-sh/setup-uv@v4 + uses: astral-sh/setup-uv@v8.2.0 - name: Set up Python run: uv python install 3.12 @@ -33,7 +41,7 @@ jobs: run: uv run mkdocs build - name: Upload artifact - uses: actions/upload-pages-artifact@v3 + uses: actions/upload-pages-artifact@v5 with: path: site @@ -42,8 +50,10 @@ jobs: runs-on: ubuntu-latest environment: name: github-pages - url: ${{ steps.deployment.outputs.page_url }} + # Canonical public URL; deploy-pages' page_url output reports GitHub's + # internal *.pages.github.io alias for org repos, so hardcode it. + url: https://pnnl.github.io/comcheckweb-api-python/ steps: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v4 + uses: actions/deploy-pages@v5 diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 763a567..e6a185e 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -15,10 +15,10 @@ jobs: runs-on: ubuntu-latest environment: pypi steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Install uv - uses: astral-sh/setup-uv@v4 + uses: astral-sh/setup-uv@v8.2.0 - name: Set version (if provided) if: ${{ inputs.version != '' }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..10eb4dd --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,32 @@ +name: Tests + +# Run the offline test suite on every PR into main or develop (and on pushes +# to those branches). Live API tests skip automatically without a key. +on: + pull_request: + branches: + - main + - develop + push: + branches: + - main + - develop + workflow_dispatch: + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + + - name: Install uv + uses: astral-sh/setup-uv@v8.2.0 + + - name: Set up Python + run: uv python install 3.12 + + - name: Install dependencies + run: uv sync + + - name: Run tests + run: uv run pytest -q diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index f6faacb..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,123 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), -and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - -## [Unreleased] - -### Fixed -- Made BASE_URL configurable via COMCHECK_API_URL environment variable - -### To Be Added -- Logging implementation to replace print statements -- Custom exception classes for better error handling -- Comprehensive API documentation -- Additional examples and tutorials - -### To Be Fixed -- Fix import path documentation in __init__.py -- Security: Remove .env from version control - -## [0.1.0] - 2025-03-XX - -### Added -- Initial release of COMcheck Web API Python client -- Core API service layer with httpx HTTP client -- High-level client interface (COMcheckClient) -- Project CRUD operations (get, list, update) -- Building component management: - - Envelope operations (walls, roofs, windows, doors, skylights) - - Building area operations - - Lighting, HVAC, and control systems -- Energy simulation support: - - Start simulation - - Check simulation status - - Retrieve simulation results -- Compliance checking before simulation -- Type-safe Pydantic models for all data structures -- Context manager support for automatic resource cleanup -- Project template and default constants -- Data managers for building areas and envelope components -- Utility functions for project operations -- Comprehensive examples: - - Client operations (simulation, user functions) - - Data manager usage - - Project operations -- Development tooling: - - Black code formatter - - MyPy type checking - - Pre-commit hooks - - pytest test framework -- Schema generation from COMcheck API -- Package management with uv - -### Dependencies -- httpx >= 0.27.0 (HTTP client) -- pydantic >= 2.12.5 (data validation) -- jsonschema >= 4.23.0 (schema validation) -- python-dotenv >= 1.0.0 (environment configuration) -- types-jsonschema >= 4.23.0 (type stubs) - -### Development Dependencies -- black >= 26.1.0 (code formatting) -- datamodel-code-generator >= 0.54.1 (type generation) -- mypy >= 1.19.1 (type checking) -- pre-commit >= 4.5.1 (git hooks) -- pytest >= 9.0.2 (testing) - -### Requirements -- Python >= 3.12 - -### Known Issues -- API key must be provided manually (no OAuth flow yet) -- Some print() statements used instead of proper logging -- Limited error handling with custom exceptions - -### Breaking Changes -None (initial release) - ---- - -## Release Notes - -### Version 0.1.0 - Initial Alpha Release - -This is the first alpha release of the COMcheck Web API Python client. The library provides a clean, type-safe interface for interacting with the COMcheck Web API to perform building energy code compliance checks. - -**Key Features:** -- Easy-to-use client interface -- Full project lifecycle management -- Building component operations -- Energy simulation and compliance checking -- Type-safe with Pydantic models -- Well-documented with examples - -**Not Yet Stable:** -This is an alpha release. The API may change in future versions. Not recommended for production use without thorough testing. - -**What's Next:** -- API stabilization for v1.0.0 -- Enhanced documentation -- More examples and tutorials -- Performance optimizations -- Better error handling - ---- - -## Migration Guides - -### Upgrading to 0.1.0 -Initial release - no migration needed. - ---- - -## Deprecation Notices - -None yet. - ---- - -*For detailed technical improvements and roadmap, see [docs/IMPROVEMENTS.md](docs/IMPROVEMENTS.md)* -*For version control strategy, see [docs/VERSION_CONTROL.md](docs/VERSION_CONTROL.md)* diff --git a/README.md b/README.md index 0143450..17996b8 100644 --- a/README.md +++ b/README.md @@ -145,6 +145,32 @@ Pass `--global` to install into the user-global skills dirs (`~/.claude/skills/` and/or `~/.agents/skills/`) for every session instead of per-project. +## Support + +This is a publicly available library maintained by PNNL. While the code is open source and free to use, **external contributions are not accepted** at this time. + +### Reporting Issues + +If you encounter bugs or have questions: +- Open an issue on GitHub for bug reports +- Check the [examples/](examples/) directory for usage guidance +- Review the [documentation](https://pnnl.github.io/comcheckweb-api-python/) for detailed information + +**Note:** Issues are welcome, but pull requests from external contributors will not be accepted. + +## License + +See the `LICENSE` file at the repository root for license details. + +See the [`DISCLAIMER.md`](DISCLAIMER.md) file for the warranty and +liability disclaimer. + +--- + +> **Note:** The sections below are for the PNNL team that maintains this +> package. External contributions and pull requests are not accepted, so +> this tooling is not required to *use* the published package. + ## Development Clone the repository and follow the commands below to set up developer tooling. @@ -197,20 +223,3 @@ uv run mkdocs build # Fail on warnings (good before committing) uv run mkdocs build --strict ``` - -## Support - -This is a publicly available library maintained by PNNL. While the code is open source and free to use, **external contributions are not accepted** at this time. - -### Reporting Issues - -If you encounter bugs or have questions: -- Open an issue on GitHub for bug reports -- Check the [examples/](examples/) directory for usage guidance -- Review the [documentation](docs/) for detailed information - -**Note:** Issues are welcome, but pull requests from external contributors will not be accepted. - -## License - -See the `LICENSE` file at the repository root for license details. diff --git a/examples/README.md b/examples/README.md index 60c91e8..8c75843 100644 --- a/examples/README.md +++ b/examples/README.md @@ -10,9 +10,6 @@ examples/ ├── client/ # API client examples │ ├── simulation.py # Simulation API workflow examples │ └── user_functions.py # User-facing function examples -├── data_manager/ # Data manager examples -│ ├── building_area.py # Building area manager examples -│ └── envelope.py # Envelope manager examples └── project_operations/ # Project operations examples ├── building_area_operations.py # Building area operations └── envelope_operations.py # Envelope operations @@ -51,36 +48,7 @@ python examples/client/user_functions.py --- -### 2. Data Manager Examples (`data_manager/`) -Examples demonstrating data manager functionality. - -#### Building Area Manager (`data_manager/building_area.py`) -Examples for building area manager operations. - -**What it demonstrates:** -- Building area list management -- Building area data operations - -**Usage:** -```bash -python examples/data_manager/building_area.py -``` - -#### Envelope Manager (`data_manager/envelope.py`) -Examples for envelope component management. - -**What it demonstrates:** -- Envelope component list management -- Envelope data operations - -**Usage:** -```bash -python examples/data_manager/envelope.py -``` - ---- - -### 3. Project Operations Examples (`project_operations/`) +### 2. Project Operations Examples (`project_operations/`) Examples demonstrating project operations. #### Building Area Operations (`project_operations/building_area_operations.py`) @@ -123,9 +91,8 @@ Creates JSON snapshots in `testProjectJson/` directory showing project state aft ## Best Practices 1. **Start with client examples** (`client/`) to understand basic API operations -2. **Explore data manager examples** (`data_manager/`) to learn about data management -3. **Use project operations examples** (`project_operations/`) for end-to-end workflows -4. **Check example output** in `testProjectJson/` to understand the results +2. **Use project operations examples** (`project_operations/`) for end-to-end workflows +3. **Check example output** in `testProjectJson/` to understand the results --- diff --git a/examples/data_manager/building_area.py b/examples/data_manager/building_area.py deleted file mode 100644 index a1a3276..0000000 --- a/examples/data_manager/building_area.py +++ /dev/null @@ -1,19 +0,0 @@ -"""Example of using the BuildingAreaListManager.""" - -from comcheck_api.managers.components.building_area import BuildingAreaListManager -from comcheck_api.constants.building_area_constants import DEFAULT_BUILDING_AREA -from comcheck_api.types.core_types import WholeBuildingTypeOptions - -# Create a manager instance -manager = BuildingAreaListManager([]) - -# Add a default building area -building_area = manager.add_new(DEFAULT_BUILDING_AREA) -print("Added default building area:", building_area) - -# Update building area properties -building_area[0].wholeBldgType = WholeBuildingTypeOptions.WHOLE_BUILDING_COURT_HOUSE -building_area[0].areaDescription = "Example Building Area" -building_area[0].floorArea = 2500 - -print("\nUpdated building area:", manager.get_all()) diff --git a/examples/data_manager/envelope.py b/examples/data_manager/envelope.py deleted file mode 100644 index 7399497..0000000 --- a/examples/data_manager/envelope.py +++ /dev/null @@ -1,27 +0,0 @@ -"""Example of using envelope component managers.""" - -from comcheck_api.managers.components.envelope.ag_wall import AgWallListManager -from comcheck_api.managers.components.envelope.roof import RoofListManager -from pytest_fixtures.components import SAMPEL_SKYLIGHT, SAMPLE_AG_WALL, SAMPLE_ROOF - -# Example 1: Working with above-grade walls -ag_wall_manager = AgWallListManager([]) - -# Add a new wall -wall = ag_wall_manager.add_new(SAMPLE_AG_WALL) -print("Added wall:", wall) - -# Add a thermal bridge to the wall -ag_wall_manager.add_new_thermal_bridge(wall[0]) -print("\nWall with thermal bridge:", wall) - -# Example 2: Working with roofs -roof_manager = RoofListManager([]) - -# Add a new roof -roof = roof_manager.add_new(SAMPLE_ROOF) -print("\nAdded roof:", roof) - -roof_manager.add_new_skylight(roof[0], SAMPEL_SKYLIGHT) - -print("\nAdded skylight:", roof_manager.get_all()) diff --git a/tests/README.md b/tests/README.md index 498a9b9..fb2159f 100644 --- a/tests/README.md +++ b/tests/README.md @@ -2,7 +2,7 @@ Automated test suite for the COMcheck API Python client using pytest. -For ad-hoc manual testing during development, see the [scripts/](../scripts/) directory. +For ad-hoc manual testing during development, see the [tools/scripts/](../tools/scripts/) directory. ## Directory Structure diff --git a/tests/client/test_simulation.py b/tests/client/test_simulation.py index 740dfec..49dffee 100644 --- a/tests/client/test_simulation.py +++ b/tests/client/test_simulation.py @@ -5,7 +5,7 @@ # from comcheck_api.client import COMcheckClient # from comcheck_api.constants.common_constants import PROJECT_TEMPLATE # from comcheck_api.types.core_types import EnergyCodeOptions -# from pytest_fixtures.components import SAMPLE_BUILDING_AREA, SAMPLE_PROJECT_ENVELOPE +# from tests.test_data.components import SAMPLE_BUILDING_AREA, SAMPLE_PROJECT_ENVELOPE # @pytest.fixture diff --git a/tests/project_operation_tests/conftest.py b/tests/project_operation_tests/conftest.py index 932d977..7f44d59 100644 --- a/tests/project_operation_tests/conftest.py +++ b/tests/project_operation_tests/conftest.py @@ -1,5 +1,7 @@ from dataclasses import dataclass, field +import json import os +from pathlib import Path from typing import Callable, Optional import uuid @@ -19,37 +21,47 @@ assert_component_updated, ) - -@pytest.fixture(scope="session") -def api_key() -> str: - key = os.getenv("COM_API_KEY") - if not key: - pytest.skip("COM_API_KEY is not set in environment variables.") - return key +# Committed sample project used to build the offline `project` fixture so the +# operation tests run without a live API call. Live round-trips against the +# real server are opt-in via `--integration` (see `maybe_apply_and_reload`). +SAMPLE_PROJECT_PATH = Path(__file__).parent.parent / "test_data" / "sample_project.json" @pytest.fixture(scope="session") -def client(api_key: str) -> COMcheckClient: +def client() -> COMcheckClient: + """Client for the operation tests. + + Without ``--integration`` the tests never hit the network, so a real API + key is optional; we set it when present so ``--integration`` runs can reach + the live server. + """ c = COMcheckClient() - c.set_api_key(api_key) + key = os.getenv("COM_API_KEY") + if key: + c.set_api_key(key) return c @pytest.fixture(scope="session") -def project_id(client: COMcheckClient) -> str: - projects = client.list_projects() - if not projects or not (project_id := projects[0].get("_id")): - pytest.skip("No projects found for integration tests.") - # Export initial project state once - test_project_json = client.get_project(project_id, mode="json") - os.makedirs("testProjectJson", exist_ok=True) - export_to_json(test_project_json, "testProjectJson/initialProject.json") - return project_id - +def project(request, client: COMcheckClient) -> ComBuilding: + """Project model under test. + + With ``--integration`` this pulls a live project from the API (and snapshots + it to ``testProjectJson/initialProject.json``) so the operations write back + to a real project. Otherwise it loads the committed sample JSON offline. + """ + if request.config.getoption("--integration"): + projects = client.list_projects() + if not projects or not (project_id := projects[0].get("_id")): + pytest.skip("No projects found for integration tests.") + snapshot = client.get_project(project_id, mode="json") + os.makedirs("testProjectJson", exist_ok=True) + export_to_json(snapshot, "testProjectJson/initialProject.json") + project = client.get_project(project_id) + else: + data = json.loads(SAMPLE_PROJECT_PATH.read_text()) + project = client._parse_data(data, "python") -@pytest.fixture(scope="session") -def project(client: COMcheckClient, project_id: str): - project = client.get_project(project_id) assert project is not None return project diff --git a/tests/test_comcheck_client.py b/tests/test_comcheck_client.py index b1eac95..e3ca7c2 100644 --- a/tests/test_comcheck_client.py +++ b/tests/test_comcheck_client.py @@ -1,4 +1,9 @@ -"""Tests for COMcheckClient.""" +"""Live tests for COMcheckClient. + +These hit the real COMcheck Web API and need a valid ``COM_API_KEY``. They +skip (rather than fail) when no key is set or the key is rejected, so the +offline suite stays green; provide a valid key to exercise them. +""" import os @@ -6,6 +11,7 @@ from dotenv import load_dotenv from comcheck_api.client import COMcheckClient +from comcheck_api.exceptions import COMCheckHTTPError # Load environment variables load_dotenv() @@ -16,7 +22,7 @@ def client(): """Fixture to create and configure COMcheckClient.""" api_key = os.getenv("COM_API_KEY") if not api_key: - pytest.fail("COM_API_KEY is not set in environment variables.") + pytest.skip("COM_API_KEY is not set; skipping live client tests.") client = COMcheckClient() client.set_api_key(api_key) @@ -25,13 +31,27 @@ def client(): def test_fetch_project_list(client: COMcheckClient): """Test fetching the project list.""" - project_list = client.list_projects() + try: + project_list = client.list_projects() + except COMCheckHTTPError as exc: + if exc.status_code in (401, 403): + pytest.skip( + f"COM_API_KEY rejected ({exc.status_code}); skipping live test." + ) + raise assert isinstance(project_list, list) def test_fetch_single_project(client: COMcheckClient): """Test fetching a single project if any exist.""" - project_list = client.list_projects() + try: + project_list = client.list_projects() + except COMCheckHTTPError as exc: + if exc.status_code in (401, 403): + pytest.skip( + f"COM_API_KEY rejected ({exc.status_code}); skipping live test." + ) + raise if project_list and project_list[0].get("_id"): project = client.get_project(project_list[0]["_id"]) diff --git a/pytest_fixtures/__init__.py b/tests/test_data/__init__.py similarity index 100% rename from pytest_fixtures/__init__.py rename to tests/test_data/__init__.py diff --git a/pytest_fixtures/components.py b/tests/test_data/components.py similarity index 100% rename from pytest_fixtures/components.py rename to tests/test_data/components.py diff --git a/tests/test_data/sample_project.json b/tests/test_data/sample_project.json new file mode 100644 index 0000000..8371604 --- /dev/null +++ b/tests/test_data/sample_project.json @@ -0,0 +1,1811 @@ +{ + "id": 13966, + "bldgUseType": "ACTIVITY", + "constructionType": "NONE", + "projectType": "NEW_CONSTRUCTION", + "projectSubType": "CONSTRUCTION_COMPLETE", + "projectMechanicalType": "PROJECT_HVAC_WITH_CENTRAL", + "projectCoreAndShellCredit": 0, + "semiheated": null, + "efficiencyPackageType": null, + "heatingFuelType": "UNKNOWN_FUEL", + "isNonresidentialConditioning": true, + "isResidentialConditioning": false, + "isSemiheatedConditioning": false, + "performanceRating": 0.869509, + "energyCreditPerformanceRating": 2.0013, + "buildingUseType": "ACTIVITY", + "conditioningType": "HEATING_AND_COOLING", + "feetBldgHeight": null, + "isHistoricBuilding": 0, + "allElectric": null, + "isRenewable": null, + "hasBattery": null, + "hasCharger": null, + "hasHeatPump": null, + "project": { + "id": 14016, + "developerAddress": "", + "developerAddress2": null, + "developerCity": "", + "developerCompany": "", + "developerEmail": "", + "developerFirstName": "", + "developerLastName": "", + "developerPhone": "", + "developerState": "", + "developerZipCode": "", + "notes": "", + "ownerAddress": "", + "ownerAddress2": null, + "ownerCity": "", + "ownerCompany": "", + "ownerEmail": "", + "ownerFirstName": "", + "ownerLastName": "", + "ownerPhone": "", + "ownerState": "", + "ownerZipCode": "", + "projectAddress": "", + "projectAddress2": null, + "projectCity": "", + "projectLotNumber": null, + "projectPermitDate": "", + "projectPermitNumber": "", + "projectState": "", + "projectTaxMap": null, + "projectTitle": "Demo Project", + "projectZipCode": "", + "projectComplete": null + }, + "control": { + "id": 14013, + "code": "CEZ_90_1_2022", + "complianceMode": "UA", + "version": "" + }, + "location": { + "id": 14181, + "city": "Anytown", + "county": null, + "state": "Washington", + "epwFilename": null, + "climateZone": 5 + }, + "userProject": { + "id": 13892, + "createdDate": "2025-12-16T18:06:21.000Z", + "lastModifiedDate": "2026-04-08T22:32:25.000Z", + "projectName": null, + "urlHash": null, + "userId": 9092, + "projectStatus": "PROJECT_STATUS_DRAFT", + "runSimulation": false, + "lastRunSession": "f246bffd-6ac7-492a-9f78-f38246fa2860" + }, + "requirements": [], + "renewable": { + "id": 15567, + "renewableException": "RENEWABLE_ONSITE_EXCEPTION_NONE", + "numberOfFloors": 1, + "largestThreeFloorArea": 0, + "requiredCapacity": 0, + "proposedCapacity": 0, + "roofAreaForRenewable": 0, + "requiredOffsiteRenewableEnergy": 0, + "proposedOffsiteRenewableEnergy": 0, + "renewableSystem": [], + "offsiteRenewableProcurement": [] + }, + "swhSystem": [], + "efficiencyPackages": [], + "envelope": { + "id": 13943, + "altPctGlazingAreaReplaced": null, + "altPctSkylightAreaReplaced": null, + "postAltSkylightRoofPct": null, + "postAltWindowWallPct": null, + "useOrientDetails": true, + "useVltDetails": true, + "airBarrierComplianceType": "AIR_BARRIER_OPTION_UNKNOWN", + "applySkylightPctAllowanceForDaylighting": false, + "applyWindowPctAllowanceForDaylighting": false, + "useCoolRoofDetails": null, + "useCoolRoofPerformanceDetails": false, + "window": [ + { + "adjacentSpaceType": null, + "id": 41128, + "altExemptType": null, + "assemblyType": "Window:Window 12", + "cavityRValue": 0, + "continuousRValue": 0, + "description": "", + "frameType": "METAL", + "glazingType": "TRIPLE_PANE", + "grossArea": 300, + "orientation": "NORTH", + "preAltPropShgc": 0.25, + "preAltPropUval": 0.35, + "productType": "FACTORY_ASSEMBLED_WINDOW", + "propProjectionFactor": 0.5, + "propShgc": 0.25, + "propUValue": 0.35, + "solarType": "CLEAR", + "propVt": 0.65, + "windowOpenType": "NON_OPERABLE_WINDOW", + "feetAg": null, + "allowanceType": "ENV_ALLOWANCE_NONE", + "exemptionType": "ENV_EXEMPTION_NONE", + "constructionType": "NON_RESIDENTIAL", + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": "PERF_TYPE_NFRC", + "productId": "WIN-001", + "bldgUseKey": "4ece458a-8613-4095-aab6-5da4a6cae105", + "isSiteShading": false + }, + { + "adjacentSpaceType": null, + "id": 41129, + "altExemptType": null, + "assemblyType": "Window:Window 13", + "cavityRValue": 0, + "continuousRValue": 0, + "description": "", + "frameType": "METAL", + "glazingType": "TRIPLE_PANE", + "grossArea": 300, + "orientation": "NORTH", + "preAltPropShgc": 0.25, + "preAltPropUval": 0.35, + "productType": "FACTORY_ASSEMBLED_WINDOW", + "propProjectionFactor": 0.5, + "propShgc": 0.25, + "propUValue": 0.35, + "solarType": "CLEAR", + "propVt": 0.65, + "windowOpenType": "NON_OPERABLE_WINDOW", + "feetAg": null, + "allowanceType": "ENV_ALLOWANCE_NONE", + "exemptionType": "ENV_EXEMPTION_NONE", + "constructionType": "NON_RESIDENTIAL", + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": "PERF_TYPE_NFRC", + "productId": "WIN-001", + "bldgUseKey": "4ece458a-8613-4095-aab6-5da4a6cae105", + "isSiteShading": false + }, + { + "adjacentSpaceType": null, + "id": 41130, + "altExemptType": null, + "assemblyType": "Window:Window 14", + "cavityRValue": 0, + "continuousRValue": 0, + "description": "", + "frameType": "METAL", + "glazingType": "TRIPLE_PANE", + "grossArea": 300, + "orientation": "NORTH", + "preAltPropShgc": 0.25, + "preAltPropUval": 0.35, + "productType": "FACTORY_ASSEMBLED_WINDOW", + "propProjectionFactor": 0.5, + "propShgc": 0.25, + "propUValue": 0.35, + "solarType": "CLEAR", + "propVt": 0.65, + "windowOpenType": "NON_OPERABLE_WINDOW", + "feetAg": null, + "allowanceType": "ENV_ALLOWANCE_NONE", + "exemptionType": "ENV_EXEMPTION_NONE", + "constructionType": "NON_RESIDENTIAL", + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": "PERF_TYPE_NFRC", + "productId": "WIN-001", + "bldgUseKey": "4ece458a-8613-4095-aab6-5da4a6cae105", + "isSiteShading": false + }, + { + "adjacentSpaceType": null, + "id": 41131, + "altExemptType": null, + "assemblyType": "Window:Window 15", + "cavityRValue": 0, + "continuousRValue": 0, + "description": "", + "frameType": "METAL", + "glazingType": "TRIPLE_PANE", + "grossArea": 300, + "orientation": "NORTH", + "preAltPropShgc": 0.25, + "preAltPropUval": 0.35, + "productType": "FACTORY_ASSEMBLED_WINDOW", + "propProjectionFactor": 0.5, + "propShgc": 0.25, + "propUValue": 0.35, + "solarType": "CLEAR", + "propVt": 0.65, + "windowOpenType": "NON_OPERABLE_WINDOW", + "feetAg": null, + "allowanceType": "ENV_ALLOWANCE_NONE", + "exemptionType": "ENV_EXEMPTION_NONE", + "constructionType": "NON_RESIDENTIAL", + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": "PERF_TYPE_NFRC", + "productId": "WIN-001", + "bldgUseKey": "4ece458a-8613-4095-aab6-5da4a6cae105", + "isSiteShading": false + }, + { + "adjacentSpaceType": null, + "id": 41132, + "altExemptType": null, + "assemblyType": "Window:Window 16", + "cavityRValue": 0, + "continuousRValue": 0, + "description": "", + "frameType": "METAL", + "glazingType": "TRIPLE_PANE", + "grossArea": 300, + "orientation": "NORTH", + "preAltPropShgc": 0.25, + "preAltPropUval": 0.35, + "productType": "FACTORY_ASSEMBLED_WINDOW", + "propProjectionFactor": 0.5, + "propShgc": 0.25, + "propUValue": 0.35, + "solarType": "CLEAR", + "propVt": 0.65, + "windowOpenType": "NON_OPERABLE_WINDOW", + "feetAg": null, + "allowanceType": "ENV_ALLOWANCE_NONE", + "exemptionType": "ENV_EXEMPTION_NONE", + "constructionType": "NON_RESIDENTIAL", + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": "PERF_TYPE_NFRC", + "productId": "WIN-001", + "bldgUseKey": "4ece458a-8613-4095-aab6-5da4a6cae105", + "isSiteShading": false + }, + { + "adjacentSpaceType": null, + "id": 41133, + "altExemptType": null, + "assemblyType": "Window:Window 17", + "cavityRValue": 0, + "continuousRValue": 0, + "description": "", + "frameType": "METAL", + "glazingType": "TRIPLE_PANE", + "grossArea": 300, + "orientation": "NORTH", + "preAltPropShgc": 0.25, + "preAltPropUval": 0.35, + "productType": "FACTORY_ASSEMBLED_WINDOW", + "propProjectionFactor": 0.5, + "propShgc": 0.25, + "propUValue": 0.35, + "solarType": "CLEAR", + "propVt": 0.65, + "windowOpenType": "NON_OPERABLE_WINDOW", + "feetAg": null, + "allowanceType": "ENV_ALLOWANCE_NONE", + "exemptionType": "ENV_EXEMPTION_NONE", + "constructionType": "NON_RESIDENTIAL", + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": "PERF_TYPE_NFRC", + "productId": "WIN-001", + "bldgUseKey": "4ece458a-8613-4095-aab6-5da4a6cae105", + "isSiteShading": false + }, + { + "adjacentSpaceType": null, + "id": 41134, + "altExemptType": null, + "assemblyType": "Window:Window 18", + "cavityRValue": 0, + "continuousRValue": 0, + "description": "", + "frameType": "METAL", + "glazingType": "TRIPLE_PANE", + "grossArea": 300, + "orientation": "NORTH", + "preAltPropShgc": 0.25, + "preAltPropUval": 0.35, + "productType": "FACTORY_ASSEMBLED_WINDOW", + "propProjectionFactor": 0.5, + "propShgc": 0.25, + "propUValue": 0.35, + "solarType": "CLEAR", + "propVt": 0.65, + "windowOpenType": "NON_OPERABLE_WINDOW", + "feetAg": null, + "allowanceType": "ENV_ALLOWANCE_NONE", + "exemptionType": "ENV_EXEMPTION_NONE", + "constructionType": "NON_RESIDENTIAL", + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": "PERF_TYPE_NFRC", + "productId": "WIN-001", + "bldgUseKey": "4ece458a-8613-4095-aab6-5da4a6cae105", + "isSiteShading": false + }, + { + "adjacentSpaceType": null, + "id": 41135, + "altExemptType": null, + "assemblyType": "Window:Window 19", + "cavityRValue": 0, + "continuousRValue": 0, + "description": "", + "frameType": "METAL", + "glazingType": "TRIPLE_PANE", + "grossArea": 300, + "orientation": "NORTH", + "preAltPropShgc": 0.25, + "preAltPropUval": 0.35, + "productType": "FACTORY_ASSEMBLED_WINDOW", + "propProjectionFactor": 0.5, + "propShgc": 0.25, + "propUValue": 0.35, + "solarType": "CLEAR", + "propVt": 0.65, + "windowOpenType": "NON_OPERABLE_WINDOW", + "feetAg": null, + "allowanceType": "ENV_ALLOWANCE_NONE", + "exemptionType": "ENV_EXEMPTION_NONE", + "constructionType": "NON_RESIDENTIAL", + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": "PERF_TYPE_NFRC", + "productId": "WIN-001", + "bldgUseKey": "4ece458a-8613-4095-aab6-5da4a6cae105", + "isSiteShading": false + }, + { + "adjacentSpaceType": null, + "id": 41136, + "altExemptType": null, + "assemblyType": "Window:Window 20", + "cavityRValue": 0, + "continuousRValue": 0, + "description": "", + "frameType": "METAL", + "glazingType": "TRIPLE_PANE", + "grossArea": 300, + "orientation": "NORTH", + "preAltPropShgc": 0.25, + "preAltPropUval": 0.35, + "productType": "FACTORY_ASSEMBLED_WINDOW", + "propProjectionFactor": 0.5, + "propShgc": 0.25, + "propUValue": 0.35, + "solarType": "CLEAR", + "propVt": 0.65, + "windowOpenType": "NON_OPERABLE_WINDOW", + "feetAg": null, + "allowanceType": "ENV_ALLOWANCE_NONE", + "exemptionType": "ENV_EXEMPTION_NONE", + "constructionType": "NON_RESIDENTIAL", + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": "PERF_TYPE_NFRC", + "productId": "WIN-001", + "bldgUseKey": "4ece458a-8613-4095-aab6-5da4a6cae105", + "isSiteShading": false + }, + { + "adjacentSpaceType": null, + "id": 41137, + "altExemptType": null, + "assemblyType": "Window:Window 21", + "cavityRValue": 0, + "continuousRValue": 0, + "description": "", + "frameType": "METAL", + "glazingType": "TRIPLE_PANE", + "grossArea": 300, + "orientation": "NORTH", + "preAltPropShgc": 0.25, + "preAltPropUval": 0.35, + "productType": "FACTORY_ASSEMBLED_WINDOW", + "propProjectionFactor": 0.5, + "propShgc": 0.25, + "propUValue": 0.35, + "solarType": "CLEAR", + "propVt": 0.65, + "windowOpenType": "NON_OPERABLE_WINDOW", + "feetAg": null, + "allowanceType": "ENV_ALLOWANCE_NONE", + "exemptionType": "ENV_EXEMPTION_NONE", + "constructionType": "NON_RESIDENTIAL", + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": "PERF_TYPE_NFRC", + "productId": "WIN-001", + "bldgUseKey": "4ece458a-8613-4095-aab6-5da4a6cae105", + "isSiteShading": false + }, + { + "adjacentSpaceType": null, + "id": 41148, + "altExemptType": null, + "assemblyType": "Window:Window 22", + "cavityRValue": 0, + "continuousRValue": 0, + "description": "", + "frameType": "METAL", + "glazingType": "TRIPLE_PANE", + "grossArea": 300, + "orientation": "NORTH", + "preAltPropShgc": 0.25, + "preAltPropUval": 0.35, + "productType": "FACTORY_ASSEMBLED_WINDOW", + "propProjectionFactor": 0.5, + "propShgc": 0.25, + "propUValue": 0.35, + "solarType": "CLEAR", + "propVt": 0.65, + "windowOpenType": "NON_OPERABLE_WINDOW", + "feetAg": null, + "allowanceType": "ENV_ALLOWANCE_NONE", + "exemptionType": "ENV_EXEMPTION_NONE", + "constructionType": "NON_RESIDENTIAL", + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": "PERF_TYPE_NFRC", + "productId": "WIN-001", + "bldgUseKey": "5004dd46-afce-4b74-8f8a-5f4fa88ab264", + "isSiteShading": false + } + ], + "door": [ + { + "adjacentSpaceType": null, + "id": 31333, + "altExemptType": null, + "assemblyType": "Door:Door 1", + "cavityRValue": 0, + "continuousRValue": 0, + "description": null, + "doorEntranceType": "ENTRANCE_DOOR", + "doorOpenType": "SWINGING_DOOR", + "doorType": "INSUL_METAL_DOOR", + "frameType": null, + "glazingType": null, + "grossArea": 23, + "orientation": "UNSPECIFIED_ORIENTATION", + "preAltPropShgc": 0, + "preAltPropUval": 0, + "productType": null, + "propProjectionFactor": 0, + "propShgc": 0, + "propUValue": 0.37, + "solarType": null, + "propVt": 0, + "allowanceType": null, + "exemptionType": null, + "constructionType": null, + "glazingMaterialType": null, + "perfDataType": null, + "productId": null, + "bldgUseKey": "5004dd46-afce-4b74-8f8a-5f4fa88ab264", + "isSiteShading": null + } + ], + "skylight": [ + { + "adjacentSpaceType": null, + "id": 2026, + "altExemptType": null, + "assemblyType": "Skylight:Skylight 17", + "cavityRValue": null, + "continuousRValue": null, + "curbType": "NO_CURB_SKYLIGHT", + "description": "", + "frameType": "METAL", + "glazingType": "DOUBLE_PANE_LOWE", + "grossArea": 100, + "orientation": "UNSPECIFIED_ORIENTATION", + "preAltPropShgc": 0, + "preAltPropUval": 0, + "productType": null, + "propProjectionFactor": 0, + "propShgc": 0.6, + "propUValue": 0.55, + "solarType": "TINTED", + "propVt": 0, + "allowanceType": null, + "exemptionType": null, + "constructionType": null, + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": null, + "productId": null, + "bldgUseKey": "7f998a61-e3a2-4bed-bb9e-13e58ff83cb0", + "isSiteShading": null + } + ], + "floor": [ + { + "adjacentSpaceType": null, + "id": 8872, + "altExemptType": null, + "assemblyType": "Floor:Floor 28", + "cavityRValue": 0, + "continuousRValue": 15, + "depthOfInsulation": 4, + "description": "", + "floorType": "HEATED_SLAB_ON_GRADE", + "grossArea": 320, + "hasEdgeInsul": null, + "insulationPosition": "VERTICAL", + "orientation": "UNSPECIFIED_ORIENTATION", + "propUValue": 0.72, + "allowanceType": null, + "exemptionType": null, + "floorExposedFrameType": null, + "constructionType": null, + "slabFullInsulBelowMinRValue": 0, + "bldgUseKey": "4ece458a-8613-4095-aab6-5da4a6cae105" + }, + { + "adjacentSpaceType": null, + "id": 8873, + "altExemptType": null, + "assemblyType": "Floor:Floor 29", + "cavityRValue": 0, + "continuousRValue": 15, + "depthOfInsulation": 4, + "description": "", + "floorType": "HEATED_SLAB_ON_GRADE", + "grossArea": 320, + "hasEdgeInsul": null, + "insulationPosition": "VERTICAL", + "orientation": "UNSPECIFIED_ORIENTATION", + "propUValue": 0.72, + "allowanceType": null, + "exemptionType": null, + "floorExposedFrameType": null, + "constructionType": null, + "slabFullInsulBelowMinRValue": 0, + "bldgUseKey": "4ece458a-8613-4095-aab6-5da4a6cae105" + }, + { + "adjacentSpaceType": null, + "id": 8874, + "altExemptType": null, + "assemblyType": "Floor:Floor 30", + "cavityRValue": 0, + "continuousRValue": 15, + "depthOfInsulation": 4, + "description": "", + "floorType": "HEATED_SLAB_ON_GRADE", + "grossArea": 320, + "hasEdgeInsul": null, + "insulationPosition": "VERTICAL", + "orientation": "UNSPECIFIED_ORIENTATION", + "propUValue": 0.72, + "allowanceType": null, + "exemptionType": null, + "floorExposedFrameType": null, + "constructionType": null, + "slabFullInsulBelowMinRValue": 0, + "bldgUseKey": "4ece458a-8613-4095-aab6-5da4a6cae105" + } + ], + "bgWall": [ + { + "adjacentSpaceType": null, + "id": 1155, + "altExemptType": null, + "assemblyType": "Basement:Basement 23", + "cavityRValue": 20, + "cmuType": null, + "concreteDensity": 95, + "concreteThickness": 6, + "continuousRValue": 10, + "description": "", + "furringType": "WOOD_FURRING", + "grossArea": 3000, + "heatCapacity": 0, + "insulationPosition": null, + "orientation": "NORTH", + "propUValue": 0.037, + "wallHeight": 9, + "wallHeightBelowGrade": 6, + "wallType": "CONCRETE_BG_WALL", + "allowanceType": null, + "exemptionType": null, + "constructionType": null, + "bldgUseKey": "4ece458a-8613-4095-aab6-5da4a6cae105", + "window": [], + "door": [] + }, + { + "adjacentSpaceType": null, + "id": 1160, + "altExemptType": null, + "assemblyType": "Basement:Basement 24", + "cavityRValue": 20, + "cmuType": null, + "concreteDensity": 95, + "concreteThickness": 6, + "continuousRValue": 10, + "description": "", + "furringType": "WOOD_FURRING", + "grossArea": 3000, + "heatCapacity": 0, + "insulationPosition": null, + "orientation": "NORTH", + "propUValue": 0.037, + "wallHeight": 9, + "wallHeightBelowGrade": 6, + "wallType": "CONCRETE_BG_WALL", + "allowanceType": null, + "exemptionType": null, + "constructionType": null, + "bldgUseKey": "5004dd46-afce-4b74-8f8a-5f4fa88ab264", + "window": [], + "door": [] + } + ], + "roof": [ + { + "adjacentSpaceType": null, + "id": 10217, + "altExemptType": null, + "assemblyType": "Roof:Roof 7", + "cavityRValue": 0, + "continuousRValue": 37, + "description": "", + "grossArea": 6000, + "highAlbedoRoofType": null, + "orientation": "UNSPECIFIED_ORIENTATION", + "otherRoofType": null, + "propUValue": 0.26, + "purlinSpacing": 0, + "roofType": "ABOVE_DECK_ROOF", + "allowanceType": null, + "exemptionType": null, + "highAlbedoRoofReqType": "HA_ROOF_EXEMPTION_VEGETATED", + "roofInsulType": null, + "solarReflectance": 0, + "solarReflectanceIndex": 0, + "thermalEmittance": 0, + "constructionType": null, + "bldgUseKey": "7f998a61-e3a2-4bed-bb9e-13e58ff83cb0", + "skylight": [ + { + "adjacentSpaceType": null, + "id": 2011, + "altExemptType": null, + "assemblyType": "Skylight:Skylight 2", + "cavityRValue": null, + "continuousRValue": null, + "curbType": "NO_CURB_SKYLIGHT", + "description": "", + "frameType": "METAL", + "glazingType": "DOUBLE_PANE_LOWE", + "grossArea": 100, + "orientation": "UNSPECIFIED_ORIENTATION", + "preAltPropShgc": 0, + "preAltPropUval": 0, + "productType": null, + "propProjectionFactor": 0, + "propShgc": 0.6, + "propUValue": 0.55, + "solarType": "TINTED", + "propVt": 0, + "allowanceType": null, + "exemptionType": null, + "constructionType": null, + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": null, + "productId": null, + "bldgUseKey": "7f998a61-e3a2-4bed-bb9e-13e58ff83cb0", + "isSiteShading": null + }, + { + "adjacentSpaceType": null, + "id": 2012, + "altExemptType": null, + "assemblyType": "Skylight:Skylight 3", + "cavityRValue": null, + "continuousRValue": null, + "curbType": "NO_CURB_SKYLIGHT", + "description": "", + "frameType": "METAL", + "glazingType": "DOUBLE_PANE_LOWE", + "grossArea": 100, + "orientation": "UNSPECIFIED_ORIENTATION", + "preAltPropShgc": 0, + "preAltPropUval": 0, + "productType": null, + "propProjectionFactor": 0, + "propShgc": 0.6, + "propUValue": 0.55, + "solarType": "TINTED", + "propVt": 0, + "allowanceType": null, + "exemptionType": null, + "constructionType": null, + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": null, + "productId": null, + "bldgUseKey": "7f998a61-e3a2-4bed-bb9e-13e58ff83cb0", + "isSiteShading": null + }, + { + "adjacentSpaceType": null, + "id": 2013, + "altExemptType": null, + "assemblyType": "Skylight:Skylight 4", + "cavityRValue": null, + "continuousRValue": null, + "curbType": "NO_CURB_SKYLIGHT", + "description": "", + "frameType": "METAL", + "glazingType": "DOUBLE_PANE_LOWE", + "grossArea": 100, + "orientation": "UNSPECIFIED_ORIENTATION", + "preAltPropShgc": 0, + "preAltPropUval": 0, + "productType": null, + "propProjectionFactor": 0, + "propShgc": 0.6, + "propUValue": 0.55, + "solarType": "TINTED", + "propVt": 0, + "allowanceType": null, + "exemptionType": null, + "constructionType": null, + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": null, + "productId": null, + "bldgUseKey": "7f998a61-e3a2-4bed-bb9e-13e58ff83cb0", + "isSiteShading": null + }, + { + "adjacentSpaceType": null, + "id": 2014, + "altExemptType": null, + "assemblyType": "Skylight:Skylight 5", + "cavityRValue": null, + "continuousRValue": null, + "curbType": "NO_CURB_SKYLIGHT", + "description": "", + "frameType": "METAL", + "glazingType": "DOUBLE_PANE_LOWE", + "grossArea": 100, + "orientation": "UNSPECIFIED_ORIENTATION", + "preAltPropShgc": 0, + "preAltPropUval": 0, + "productType": null, + "propProjectionFactor": 0, + "propShgc": 0.6, + "propUValue": 0.55, + "solarType": "TINTED", + "propVt": 0, + "allowanceType": null, + "exemptionType": null, + "constructionType": null, + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": null, + "productId": null, + "bldgUseKey": "7f998a61-e3a2-4bed-bb9e-13e58ff83cb0", + "isSiteShading": null + }, + { + "adjacentSpaceType": null, + "id": 2015, + "altExemptType": null, + "assemblyType": "Skylight:Skylight 6", + "cavityRValue": null, + "continuousRValue": null, + "curbType": "NO_CURB_SKYLIGHT", + "description": "", + "frameType": "METAL", + "glazingType": "DOUBLE_PANE_LOWE", + "grossArea": 100, + "orientation": "UNSPECIFIED_ORIENTATION", + "preAltPropShgc": 0, + "preAltPropUval": 0, + "productType": null, + "propProjectionFactor": 0, + "propShgc": 0.6, + "propUValue": 0.55, + "solarType": "TINTED", + "propVt": 0, + "allowanceType": null, + "exemptionType": null, + "constructionType": null, + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": null, + "productId": null, + "bldgUseKey": "7f998a61-e3a2-4bed-bb9e-13e58ff83cb0", + "isSiteShading": null + }, + { + "adjacentSpaceType": null, + "id": 2016, + "altExemptType": null, + "assemblyType": "Skylight:Skylight 7", + "cavityRValue": null, + "continuousRValue": null, + "curbType": "NO_CURB_SKYLIGHT", + "description": "", + "frameType": "METAL", + "glazingType": "DOUBLE_PANE_LOWE", + "grossArea": 100, + "orientation": "UNSPECIFIED_ORIENTATION", + "preAltPropShgc": 0, + "preAltPropUval": 0, + "productType": null, + "propProjectionFactor": 0, + "propShgc": 0.6, + "propUValue": 0.55, + "solarType": "TINTED", + "propVt": 0, + "allowanceType": null, + "exemptionType": null, + "constructionType": null, + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": null, + "productId": null, + "bldgUseKey": "7f998a61-e3a2-4bed-bb9e-13e58ff83cb0", + "isSiteShading": null + }, + { + "adjacentSpaceType": null, + "id": 2017, + "altExemptType": null, + "assemblyType": "Skylight:Skylight 8", + "cavityRValue": null, + "continuousRValue": null, + "curbType": "NO_CURB_SKYLIGHT", + "description": "", + "frameType": "METAL", + "glazingType": "DOUBLE_PANE_LOWE", + "grossArea": 100, + "orientation": "UNSPECIFIED_ORIENTATION", + "preAltPropShgc": 0, + "preAltPropUval": 0, + "productType": null, + "propProjectionFactor": 0, + "propShgc": 0.6, + "propUValue": 0.55, + "solarType": "TINTED", + "propVt": 0, + "allowanceType": null, + "exemptionType": null, + "constructionType": null, + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": null, + "productId": null, + "bldgUseKey": "7f998a61-e3a2-4bed-bb9e-13e58ff83cb0", + "isSiteShading": null + }, + { + "adjacentSpaceType": null, + "id": 2018, + "altExemptType": null, + "assemblyType": "Skylight:Skylight 9", + "cavityRValue": null, + "continuousRValue": null, + "curbType": "NO_CURB_SKYLIGHT", + "description": "", + "frameType": "METAL", + "glazingType": "DOUBLE_PANE_LOWE", + "grossArea": 100, + "orientation": "UNSPECIFIED_ORIENTATION", + "preAltPropShgc": 0, + "preAltPropUval": 0, + "productType": null, + "propProjectionFactor": 0, + "propShgc": 0.6, + "propUValue": 0.55, + "solarType": "TINTED", + "propVt": 0, + "allowanceType": null, + "exemptionType": null, + "constructionType": null, + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": null, + "productId": null, + "bldgUseKey": "7f998a61-e3a2-4bed-bb9e-13e58ff83cb0", + "isSiteShading": null + }, + { + "adjacentSpaceType": null, + "id": 2019, + "altExemptType": null, + "assemblyType": "Skylight:Skylight 10", + "cavityRValue": null, + "continuousRValue": null, + "curbType": "NO_CURB_SKYLIGHT", + "description": "", + "frameType": "METAL", + "glazingType": "DOUBLE_PANE_LOWE", + "grossArea": 100, + "orientation": "UNSPECIFIED_ORIENTATION", + "preAltPropShgc": 0, + "preAltPropUval": 0, + "productType": null, + "propProjectionFactor": 0, + "propShgc": 0.6, + "propUValue": 0.55, + "solarType": "TINTED", + "propVt": 0, + "allowanceType": null, + "exemptionType": null, + "constructionType": null, + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": null, + "productId": null, + "bldgUseKey": "7f998a61-e3a2-4bed-bb9e-13e58ff83cb0", + "isSiteShading": null + }, + { + "adjacentSpaceType": null, + "id": 2020, + "altExemptType": null, + "assemblyType": "Skylight:Skylight 11", + "cavityRValue": null, + "continuousRValue": null, + "curbType": "NO_CURB_SKYLIGHT", + "description": "", + "frameType": "METAL", + "glazingType": "DOUBLE_PANE_LOWE", + "grossArea": 100, + "orientation": "UNSPECIFIED_ORIENTATION", + "preAltPropShgc": 0, + "preAltPropUval": 0, + "productType": null, + "propProjectionFactor": 0, + "propShgc": 0.6, + "propUValue": 0.55, + "solarType": "TINTED", + "propVt": 0, + "allowanceType": null, + "exemptionType": null, + "constructionType": null, + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": null, + "productId": null, + "bldgUseKey": "7f998a61-e3a2-4bed-bb9e-13e58ff83cb0", + "isSiteShading": null + }, + { + "adjacentSpaceType": null, + "id": 2021, + "altExemptType": null, + "assemblyType": "Skylight:Skylight 12", + "cavityRValue": null, + "continuousRValue": null, + "curbType": "NO_CURB_SKYLIGHT", + "description": "", + "frameType": "METAL", + "glazingType": "DOUBLE_PANE_LOWE", + "grossArea": 100, + "orientation": "UNSPECIFIED_ORIENTATION", + "preAltPropShgc": 0, + "preAltPropUval": 0, + "productType": null, + "propProjectionFactor": 0, + "propShgc": 0.6, + "propUValue": 0.55, + "solarType": "TINTED", + "propVt": 0, + "allowanceType": null, + "exemptionType": null, + "constructionType": null, + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": null, + "productId": null, + "bldgUseKey": "7f998a61-e3a2-4bed-bb9e-13e58ff83cb0", + "isSiteShading": null + }, + { + "adjacentSpaceType": null, + "id": 2024, + "altExemptType": null, + "assemblyType": "Skylight:Skylight 13", + "cavityRValue": null, + "continuousRValue": null, + "curbType": "NO_CURB_SKYLIGHT", + "description": "", + "frameType": "METAL", + "glazingType": "DOUBLE_PANE_LOWE", + "grossArea": 100, + "orientation": "UNSPECIFIED_ORIENTATION", + "preAltPropShgc": 0, + "preAltPropUval": 0, + "productType": null, + "propProjectionFactor": 0, + "propShgc": 0.6, + "propUValue": 0.55, + "solarType": "TINTED", + "propVt": 0, + "allowanceType": null, + "exemptionType": null, + "constructionType": null, + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": null, + "productId": null, + "bldgUseKey": "7f998a61-e3a2-4bed-bb9e-13e58ff83cb0", + "isSiteShading": null + }, + { + "adjacentSpaceType": null, + "id": 2056, + "altExemptType": null, + "assemblyType": "Skylight:Skylight 14", + "cavityRValue": null, + "continuousRValue": null, + "curbType": "NO_CURB_SKYLIGHT", + "description": "", + "frameType": "METAL", + "glazingType": "DOUBLE_PANE_LOWE", + "grossArea": 100, + "orientation": "UNSPECIFIED_ORIENTATION", + "preAltPropShgc": 0, + "preAltPropUval": 0, + "productType": null, + "propProjectionFactor": 0, + "propShgc": 0.6, + "propUValue": 0.55, + "solarType": "TINTED", + "propVt": 0, + "allowanceType": null, + "exemptionType": null, + "constructionType": null, + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": null, + "productId": null, + "bldgUseKey": "7f998a61-e3a2-4bed-bb9e-13e58ff83cb0", + "isSiteShading": null + }, + { + "adjacentSpaceType": null, + "id": 2064, + "altExemptType": null, + "assemblyType": "Skylight:Skylight 15", + "cavityRValue": null, + "continuousRValue": null, + "curbType": "NO_CURB_SKYLIGHT", + "description": "", + "frameType": "METAL", + "glazingType": "DOUBLE_PANE_LOWE", + "grossArea": 100, + "orientation": "UNSPECIFIED_ORIENTATION", + "preAltPropShgc": 0, + "preAltPropUval": null, + "productType": null, + "propProjectionFactor": 0, + "propShgc": 0.6, + "propUValue": 0.55, + "solarType": "TINTED", + "propVt": null, + "allowanceType": null, + "exemptionType": null, + "constructionType": null, + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": null, + "productId": null, + "bldgUseKey": "7f998a61-e3a2-4bed-bb9e-13e58ff83cb0", + "isSiteShading": null + } + ] + }, + { + "adjacentSpaceType": null, + "id": 10233, + "altExemptType": null, + "assemblyType": "Roof:Roof 23", + "cavityRValue": 0, + "continuousRValue": 37, + "description": "", + "grossArea": 6000, + "highAlbedoRoofType": null, + "orientation": "UNSPECIFIED_ORIENTATION", + "otherRoofType": null, + "propUValue": 0.26, + "purlinSpacing": 0, + "roofType": "ABOVE_DECK_ROOF", + "allowanceType": null, + "exemptionType": null, + "highAlbedoRoofReqType": "HA_ROOF_EXEMPTION_VEGETATED", + "roofInsulType": null, + "solarReflectance": 0, + "solarReflectanceIndex": 0, + "thermalEmittance": 0, + "constructionType": null, + "bldgUseKey": "4ece458a-8613-4095-aab6-5da4a6cae105", + "skylight": [] + }, + { + "adjacentSpaceType": null, + "id": 10240, + "altExemptType": null, + "assemblyType": "Roof:Roof 24", + "cavityRValue": 0, + "continuousRValue": 37, + "description": "", + "grossArea": 6000, + "highAlbedoRoofType": null, + "orientation": "UNSPECIFIED_ORIENTATION", + "otherRoofType": null, + "propUValue": 0.26, + "purlinSpacing": 0, + "roofType": "ABOVE_DECK_ROOF", + "allowanceType": null, + "exemptionType": null, + "highAlbedoRoofReqType": "HA_ROOF_EXEMPTION_VEGETATED", + "roofInsulType": null, + "solarReflectance": 0, + "solarReflectanceIndex": 0, + "thermalEmittance": 0, + "constructionType": null, + "bldgUseKey": "4ece458a-8613-4095-aab6-5da4a6cae105", + "skylight": [] + }, + { + "adjacentSpaceType": null, + "id": 10241, + "altExemptType": null, + "assemblyType": "Roof:Roof 25", + "cavityRValue": 0, + "continuousRValue": 37, + "description": "", + "grossArea": 6000, + "highAlbedoRoofType": null, + "orientation": "UNSPECIFIED_ORIENTATION", + "otherRoofType": null, + "propUValue": 0.26, + "purlinSpacing": 0, + "roofType": "ABOVE_DECK_ROOF", + "allowanceType": null, + "exemptionType": null, + "highAlbedoRoofReqType": "HA_ROOF_EXEMPTION_VEGETATED", + "roofInsulType": null, + "solarReflectance": 0, + "solarReflectanceIndex": 0, + "thermalEmittance": 0, + "constructionType": null, + "bldgUseKey": "4ece458a-8613-4095-aab6-5da4a6cae105", + "skylight": [] + }, + { + "adjacentSpaceType": null, + "id": 10247, + "altExemptType": null, + "assemblyType": "Roof:Roof 26", + "cavityRValue": 0, + "continuousRValue": 37, + "description": "Description 0ba0d07a-197a-4207-b353-abd27742eca5", + "grossArea": 6000, + "highAlbedoRoofType": null, + "orientation": "UNSPECIFIED_ORIENTATION", + "otherRoofType": null, + "propUValue": 0.26, + "purlinSpacing": 0, + "roofType": "ABOVE_DECK_ROOF", + "allowanceType": null, + "exemptionType": null, + "highAlbedoRoofReqType": "HA_ROOF_EXEMPTION_VEGETATED", + "roofInsulType": null, + "solarReflectance": 0, + "solarReflectanceIndex": 0, + "thermalEmittance": 0, + "constructionType": null, + "bldgUseKey": "7f998a61-e3a2-4bed-bb9e-13e58ff83cb0", + "skylight": [] + } + ], + "agWall": [ + { + "adjacentSpaceType": null, + "id": 43599, + "altExemptType": null, + "assemblyType": "AgWall:Ext Wall 8", + "cavityRValue": 20, + "cmuType": null, + "concreteDensity": 0, + "concreteThickness": 0, + "continuousRValue": 10, + "agWallExteriorFinishDetailsType": null, + "description": "", + "furringType": null, + "grossArea": 4800, + "heatCapacity": 0, + "insulationPosition": null, + "nextToUncondSpace": null, + "orientation": "NORTH", + "otherWallType": "NONE", + "propUValue": 0.048, + "wallType": "METAL_FRAME_24_AG_WALL", + "allowanceType": null, + "exemptionType": null, + "agWallConstructionDetailsType": "NONE", + "constructionType": null, + "bldgUseKey": "7f998a61-e3a2-4bed-bb9e-13e58ff83cb0", + "thermalBridgeExceptionType": "THERMAL_BRIDGE_EXCEPTION_NONE", + "effectiveUFactor": 0.054, + "thermalBridgeAdjustmentFactor": null, + "window": [ + { + "adjacentSpaceType": null, + "id": 41191, + "altExemptType": null, + "assemblyType": "Window:Window 1", + "cavityRValue": 0, + "continuousRValue": 0, + "description": "", + "frameType": "METAL", + "glazingType": "TRIPLE_PANE", + "grossArea": 300, + "orientation": "NORTH", + "preAltPropShgc": 0.25, + "preAltPropUval": 0.35, + "productType": "FACTORY_ASSEMBLED_WINDOW", + "propProjectionFactor": 0.5, + "propShgc": 0.25, + "propUValue": 0.35, + "solarType": "CLEAR", + "propVt": 0.65, + "windowOpenType": "NON_OPERABLE_WINDOW", + "feetAg": null, + "allowanceType": "ENV_ALLOWANCE_NONE", + "exemptionType": "ENV_EXEMPTION_NONE", + "constructionType": "NON_RESIDENTIAL", + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": "PERF_TYPE_NFRC", + "productId": "WIN-001", + "bldgUseKey": "7f998a61-e3a2-4bed-bb9e-13e58ff83cb0", + "isSiteShading": false + }, + { + "adjacentSpaceType": null, + "id": 41271, + "altExemptType": null, + "assemblyType": "Window:Window 2", + "cavityRValue": 0, + "continuousRValue": 0, + "description": "", + "frameType": "METAL", + "glazingType": "TRIPLE_PANE", + "grossArea": 300, + "orientation": "NORTH", + "preAltPropShgc": 0.25, + "preAltPropUval": 0.35, + "productType": "FACTORY_ASSEMBLED_WINDOW", + "propProjectionFactor": 0.5, + "propShgc": 0.25, + "propUValue": 0.35, + "solarType": "CLEAR", + "propVt": 0.65, + "windowOpenType": "NON_OPERABLE_WINDOW", + "feetAg": null, + "allowanceType": "ENV_ALLOWANCE_NONE", + "exemptionType": "ENV_EXEMPTION_NONE", + "constructionType": "NON_RESIDENTIAL", + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": "PERF_TYPE_NFRC", + "productId": "WIN-001", + "bldgUseKey": "7f998a61-e3a2-4bed-bb9e-13e58ff83cb0", + "isSiteShading": false + } + ], + "door": [], + "thermalBridge": [] + }, + { + "adjacentSpaceType": null, + "id": 43612, + "altExemptType": null, + "assemblyType": "AgWall:Ext Wall 21", + "cavityRValue": 20, + "cmuType": null, + "concreteDensity": 0, + "concreteThickness": 0, + "continuousRValue": 10, + "agWallExteriorFinishDetailsType": null, + "description": "", + "furringType": null, + "grossArea": 4800, + "heatCapacity": 0, + "insulationPosition": null, + "nextToUncondSpace": null, + "orientation": "NORTH", + "otherWallType": "NONE", + "propUValue": 0.048, + "wallType": "METAL_FRAME_24_AG_WALL", + "allowanceType": null, + "exemptionType": null, + "agWallConstructionDetailsType": "NONE", + "constructionType": null, + "bldgUseKey": "4ece458a-8613-4095-aab6-5da4a6cae105", + "thermalBridgeExceptionType": "THERMAL_BRIDGE_EXCEPTION_NONE", + "effectiveUFactor": 0.054, + "thermalBridgeAdjustmentFactor": null, + "window": [], + "door": [], + "thermalBridge": [] + }, + { + "adjacentSpaceType": null, + "id": 43613, + "altExemptType": null, + "assemblyType": "AgWall:Ext Wall 22", + "cavityRValue": 20, + "cmuType": null, + "concreteDensity": 0, + "concreteThickness": 0, + "continuousRValue": 10, + "agWallExteriorFinishDetailsType": null, + "description": "Updated agWall description", + "furringType": null, + "grossArea": 4800, + "heatCapacity": 0, + "insulationPosition": null, + "nextToUncondSpace": null, + "orientation": "NORTH", + "otherWallType": "NONE", + "propUValue": 0.048, + "wallType": "METAL_FRAME_24_AG_WALL", + "allowanceType": null, + "exemptionType": null, + "agWallConstructionDetailsType": "NONE", + "constructionType": null, + "bldgUseKey": "5004dd46-afce-4b74-8f8a-5f4fa88ab264", + "thermalBridgeExceptionType": "THERMAL_BRIDGE_EXCEPTION_NONE", + "effectiveUFactor": 0.054, + "thermalBridgeAdjustmentFactor": null, + "window": [ + { + "adjacentSpaceType": null, + "id": 41144, + "altExemptType": null, + "assemblyType": "Window:Window 4", + "cavityRValue": 0, + "continuousRValue": 0, + "description": "", + "frameType": "METAL", + "glazingType": "TRIPLE_PANE", + "grossArea": 300, + "orientation": "NORTH", + "preAltPropShgc": 0.25, + "preAltPropUval": 0.35, + "productType": "FACTORY_ASSEMBLED_WINDOW", + "propProjectionFactor": 0.5, + "propShgc": 0.25, + "propUValue": 0.35, + "solarType": "CLEAR", + "propVt": 0.65, + "windowOpenType": "NON_OPERABLE_WINDOW", + "feetAg": null, + "allowanceType": "ENV_ALLOWANCE_NONE", + "exemptionType": "ENV_EXEMPTION_NONE", + "constructionType": "NON_RESIDENTIAL", + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": "PERF_TYPE_NFRC", + "productId": "WIN-001", + "bldgUseKey": "5004dd46-afce-4b74-8f8a-5f4fa88ab264", + "isSiteShading": false + }, + { + "adjacentSpaceType": null, + "id": 41146, + "altExemptType": null, + "assemblyType": "Window:Window 5", + "cavityRValue": 0, + "continuousRValue": 0, + "description": "", + "frameType": "METAL", + "glazingType": "TRIPLE_PANE", + "grossArea": 300, + "orientation": "NORTH", + "preAltPropShgc": 0.25, + "preAltPropUval": 0.35, + "productType": "FACTORY_ASSEMBLED_WINDOW", + "propProjectionFactor": 0.5, + "propShgc": 0.25, + "propUValue": 0.35, + "solarType": "CLEAR", + "propVt": 0.65, + "windowOpenType": "NON_OPERABLE_WINDOW", + "feetAg": null, + "allowanceType": "ENV_ALLOWANCE_NONE", + "exemptionType": "ENV_EXEMPTION_NONE", + "constructionType": "NON_RESIDENTIAL", + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": "PERF_TYPE_NFRC", + "productId": "WIN-001", + "bldgUseKey": "5004dd46-afce-4b74-8f8a-5f4fa88ab264", + "isSiteShading": false + }, + { + "adjacentSpaceType": null, + "id": 41147, + "altExemptType": null, + "assemblyType": "Window:Window 6", + "cavityRValue": 0, + "continuousRValue": 0, + "description": "", + "frameType": "METAL", + "glazingType": "TRIPLE_PANE", + "grossArea": 300, + "orientation": "NORTH", + "preAltPropShgc": 0.25, + "preAltPropUval": 0.35, + "productType": "FACTORY_ASSEMBLED_WINDOW", + "propProjectionFactor": 0.5, + "propShgc": 0.25, + "propUValue": 0.35, + "solarType": "CLEAR", + "propVt": 0.65, + "windowOpenType": "NON_OPERABLE_WINDOW", + "feetAg": null, + "allowanceType": "ENV_ALLOWANCE_NONE", + "exemptionType": "ENV_EXEMPTION_NONE", + "constructionType": "NON_RESIDENTIAL", + "glazingMaterialType": "GLASS_GLAZING_MAT", + "perfDataType": "PERF_TYPE_NFRC", + "productId": "WIN-001", + "bldgUseKey": "5004dd46-afce-4b74-8f8a-5f4fa88ab264", + "isSiteShading": false + } + ], + "door": [], + "thermalBridge": [] + } + ] + }, + "lighting": { + "id": 13940, + "exteriorLightingZoneType": "EXT_ZONE_UNSPECIFIED", + "activityUse": [], + "wholeBldgUse": [ + { + "constructionType": "NON_RESIDENTIAL", + "id": 45757, + "areaDescription": "Automotive Facility", + "ceilingHeight": 0, + "floorArea": 1000, + "internalLoad": 0, + "powerDensity": 0.73, + "wholeBldgType": "WHOLE_BUILDING_AUTOMOTIVE", + "isTenantSpace": false, + "key": "4ece458a-8613-4095-aab6-5da4a6cae105", + "interiorLightingSpace": { + "description": "", + "preAltNumberFixtures": 0, + "numFixturesAlteredOrAdded": 0, + "preAltTotalWattage": 0.0, + "postAltTotalWattage": 0.0, + "altExemptType": "EXEMPT_NOT_SET", + "exemptionType": null, + "allowanceType": null, + "allowanceFloorArea": 0.0, + "rcrPerimeter": 0.0, + "rcrFloorToWorkplaneHeight": 0.0, + "rcrWorkplaneToLuminaireHeight": 0.0, + "fixture": [] + }, + "activityUse": [] + }, + { + "constructionType": "NON_RESIDENTIAL", + "id": 45758, + "areaDescription": "Automotive Facility", + "ceilingHeight": 0, + "floorArea": 1000, + "internalLoad": 0, + "powerDensity": 0.73, + "wholeBldgType": "WHOLE_BUILDING_AUTOMOTIVE", + "isTenantSpace": false, + "key": "5b7de060-2d4a-4adc-a16a-44045cd46df9", + "interiorLightingSpace": { + "description": "", + "preAltNumberFixtures": 0, + "numFixturesAlteredOrAdded": 0, + "preAltTotalWattage": 0.0, + "postAltTotalWattage": 0.0, + "altExemptType": "EXEMPT_NOT_SET", + "exemptionType": null, + "allowanceType": null, + "allowanceFloorArea": 0.0, + "rcrPerimeter": 0.0, + "rcrFloorToWorkplaneHeight": 0.0, + "rcrWorkplaneToLuminaireHeight": 0.0, + "fixture": [] + }, + "activityUse": [] + }, + { + "constructionType": "NON_RESIDENTIAL", + "id": 45759, + "areaDescription": "Automotive Facility", + "ceilingHeight": 0, + "floorArea": 1000, + "internalLoad": 0, + "powerDensity": 0.73, + "wholeBldgType": "WHOLE_BUILDING_AUTOMOTIVE", + "isTenantSpace": false, + "key": "5004dd46-afce-4b74-8f8a-5f4fa88ab264", + "interiorLightingSpace": { + "description": "", + "preAltNumberFixtures": 0, + "numFixturesAlteredOrAdded": 0, + "preAltTotalWattage": 0.0, + "postAltTotalWattage": 0.0, + "altExemptType": "EXEMPT_NOT_SET", + "exemptionType": null, + "allowanceType": null, + "allowanceFloorArea": 0.0, + "rcrPerimeter": 0.0, + "rcrFloorToWorkplaneHeight": 0.0, + "rcrWorkplaneToLuminaireHeight": 0.0, + "fixture": [] + }, + "activityUse": [] + }, + { + "constructionType": "NON_RESIDENTIAL", + "id": 45767, + "areaDescription": "Automotive Facility", + "ceilingHeight": 0, + "floorArea": 1000, + "internalLoad": 0, + "powerDensity": 0.73, + "wholeBldgType": "WHOLE_BUILDING_AUTOMOTIVE", + "isTenantSpace": false, + "key": "c9332612-164d-4315-9f7e-4214164861df", + "interiorLightingSpace": { + "description": "", + "preAltNumberFixtures": 0, + "numFixturesAlteredOrAdded": 0, + "preAltTotalWattage": 0.0, + "postAltTotalWattage": 0.0, + "altExemptType": "EXEMPT_NOT_SET", + "exemptionType": null, + "allowanceType": null, + "allowanceFloorArea": 0.0, + "rcrPerimeter": 0.0, + "rcrFloorToWorkplaneHeight": 0.0, + "rcrWorkplaneToLuminaireHeight": 0.0, + "fixture": [] + }, + "activityUse": [] + }, + { + "constructionType": "NON_RESIDENTIAL", + "id": 45768, + "areaDescription": "Automotive Facility", + "ceilingHeight": 0, + "floorArea": 1000, + "internalLoad": 0, + "powerDensity": 0.73, + "wholeBldgType": "WHOLE_BUILDING_AUTOMOTIVE", + "isTenantSpace": false, + "key": "40338da0-a206-4699-8f30-3a5f5f75cd19", + "interiorLightingSpace": { + "description": "", + "preAltNumberFixtures": 0, + "numFixturesAlteredOrAdded": 0, + "preAltTotalWattage": 0.0, + "postAltTotalWattage": 0.0, + "altExemptType": "EXEMPT_NOT_SET", + "exemptionType": null, + "allowanceType": null, + "allowanceFloorArea": 0.0, + "rcrPerimeter": 0.0, + "rcrFloorToWorkplaneHeight": 0.0, + "rcrWorkplaneToLuminaireHeight": 0.0, + "fixture": [] + }, + "activityUse": [] + }, + { + "constructionType": "NON_RESIDENTIAL", + "id": 45769, + "areaDescription": "Automotive Facility", + "ceilingHeight": 0, + "floorArea": 1000, + "internalLoad": 0, + "powerDensity": 0.73, + "wholeBldgType": "WHOLE_BUILDING_AUTOMOTIVE", + "isTenantSpace": false, + "key": "5fe5945a-578c-4a01-b63c-aa58d4c7d349", + "interiorLightingSpace": { + "description": "", + "preAltNumberFixtures": 0, + "numFixturesAlteredOrAdded": 0, + "preAltTotalWattage": 0.0, + "postAltTotalWattage": 0.0, + "altExemptType": "EXEMPT_NOT_SET", + "exemptionType": null, + "allowanceType": null, + "allowanceFloorArea": 0.0, + "rcrPerimeter": 0.0, + "rcrFloorToWorkplaneHeight": 0.0, + "rcrWorkplaneToLuminaireHeight": 0.0, + "fixture": [] + }, + "activityUse": [] + }, + { + "constructionType": "NON_RESIDENTIAL", + "id": 45770, + "areaDescription": "Automotive Facility", + "ceilingHeight": 0, + "floorArea": 1000, + "internalLoad": 0, + "powerDensity": 0.73, + "wholeBldgType": "WHOLE_BUILDING_AUTOMOTIVE", + "isTenantSpace": false, + "key": "7de270af-e9be-4a00-9720-95b3861dff14", + "interiorLightingSpace": { + "description": "", + "preAltNumberFixtures": 0, + "numFixturesAlteredOrAdded": 0, + "preAltTotalWattage": 0.0, + "postAltTotalWattage": 0.0, + "altExemptType": "EXEMPT_NOT_SET", + "exemptionType": null, + "allowanceType": null, + "allowanceFloorArea": 0.0, + "rcrPerimeter": 0.0, + "rcrFloorToWorkplaneHeight": 0.0, + "rcrWorkplaneToLuminaireHeight": 0.0, + "fixture": [] + }, + "activityUse": [] + }, + { + "constructionType": "NON_RESIDENTIAL", + "id": 45771, + "areaDescription": "Automotive Facility", + "ceilingHeight": 0, + "floorArea": 1000, + "internalLoad": 0, + "powerDensity": 0.73, + "wholeBldgType": "WHOLE_BUILDING_AUTOMOTIVE", + "isTenantSpace": false, + "key": "1bf9904e-709e-43fc-966b-9cc7e3cd1390", + "interiorLightingSpace": { + "description": "", + "preAltNumberFixtures": 0, + "numFixturesAlteredOrAdded": 0, + "preAltTotalWattage": 0.0, + "postAltTotalWattage": 0.0, + "altExemptType": "EXEMPT_NOT_SET", + "exemptionType": null, + "allowanceType": null, + "allowanceFloorArea": 0.0, + "rcrPerimeter": 0.0, + "rcrFloorToWorkplaneHeight": 0.0, + "rcrWorkplaneToLuminaireHeight": 0.0, + "fixture": [] + }, + "activityUse": [] + }, + { + "constructionType": "NON_RESIDENTIAL", + "id": 45772, + "areaDescription": "Automotive Facility", + "ceilingHeight": 0, + "floorArea": 1000, + "internalLoad": 0, + "powerDensity": 0.73, + "wholeBldgType": "WHOLE_BUILDING_AUTOMOTIVE", + "isTenantSpace": false, + "key": "36a8ddcd-ee2d-4ce5-9b8f-31b5f10fc72a", + "interiorLightingSpace": { + "description": "", + "preAltNumberFixtures": 0, + "numFixturesAlteredOrAdded": 0, + "preAltTotalWattage": 0.0, + "postAltTotalWattage": 0.0, + "altExemptType": "EXEMPT_NOT_SET", + "exemptionType": null, + "allowanceType": null, + "allowanceFloorArea": 0.0, + "rcrPerimeter": 0.0, + "rcrFloorToWorkplaneHeight": 0.0, + "rcrWorkplaneToLuminaireHeight": 0.0, + "fixture": [] + }, + "activityUse": [] + }, + { + "constructionType": "NON_RESIDENTIAL", + "id": 45773, + "areaDescription": "Automotive Facility", + "ceilingHeight": 0, + "floorArea": 1000, + "internalLoad": 0, + "powerDensity": 0.73, + "wholeBldgType": "WHOLE_BUILDING_AUTOMOTIVE", + "isTenantSpace": false, + "key": "4acd77a1-3fbe-4afd-9e93-c0d317aeb63a", + "interiorLightingSpace": { + "description": "", + "preAltNumberFixtures": 0, + "numFixturesAlteredOrAdded": 0, + "preAltTotalWattage": 0.0, + "postAltTotalWattage": 0.0, + "altExemptType": "EXEMPT_NOT_SET", + "exemptionType": null, + "allowanceType": null, + "allowanceFloorArea": 0.0, + "rcrPerimeter": 0.0, + "rcrFloorToWorkplaneHeight": 0.0, + "rcrWorkplaneToLuminaireHeight": 0.0, + "fixture": [] + }, + "activityUse": [] + }, + { + "constructionType": "NON_RESIDENTIAL", + "id": 45774, + "areaDescription": "Automotive Facility", + "ceilingHeight": 0, + "floorArea": 1000, + "internalLoad": 0, + "powerDensity": 0.73, + "wholeBldgType": "WHOLE_BUILDING_AUTOMOTIVE", + "isTenantSpace": false, + "key": "c4a7d23b-42cd-4da1-9e86-67554cb756cb", + "interiorLightingSpace": { + "description": "", + "preAltNumberFixtures": 0, + "numFixturesAlteredOrAdded": 0, + "preAltTotalWattage": 0.0, + "postAltTotalWattage": 0.0, + "altExemptType": "EXEMPT_NOT_SET", + "exemptionType": null, + "allowanceType": null, + "allowanceFloorArea": 0.0, + "rcrPerimeter": 0.0, + "rcrFloorToWorkplaneHeight": 0.0, + "rcrWorkplaneToLuminaireHeight": 0.0, + "fixture": [] + }, + "activityUse": [] + }, + { + "constructionType": "NON_RESIDENTIAL", + "id": 45775, + "areaDescription": "Automotive Facility", + "ceilingHeight": 0, + "floorArea": 1000, + "internalLoad": 0, + "powerDensity": 0.73, + "wholeBldgType": "WHOLE_BUILDING_AUTOMOTIVE", + "isTenantSpace": false, + "key": "7f998a61-e3a2-4bed-bb9e-13e58ff83cb0", + "interiorLightingSpace": { + "description": "", + "preAltNumberFixtures": 0, + "numFixturesAlteredOrAdded": 0, + "preAltTotalWattage": 0.0, + "postAltTotalWattage": 0.0, + "altExemptType": "EXEMPT_NOT_SET", + "exemptionType": null, + "allowanceType": null, + "allowanceFloorArea": 0.0, + "rcrPerimeter": 0.0, + "rcrFloorToWorkplaneHeight": 0.0, + "rcrWorkplaneToLuminaireHeight": 0.0, + "fixture": [] + }, + "activityUse": [] + } + ], + "exteriorUse": [], + "fixtureSchedule": [] + }, + "hvac": { + "id": 13939, + "hvacPlant": [], + "fanSystem": [], + "hvacSystem": [] + } +} \ No newline at end of file diff --git a/scripts/README.md b/tools/scripts/README.md similarity index 73% rename from scripts/README.md rename to tools/scripts/README.md index 143d5bd..986c004 100644 --- a/scripts/README.md +++ b/tools/scripts/README.md @@ -2,12 +2,12 @@ Manual testing scripts for ad-hoc development and debugging of the COMcheck API client. Use these for quick, interactive testing when adding new features or investigating API behavior. -For automated tests with assertions, see the [tests/](../tests/) directory. +For automated tests with assertions, see the [tests/](../../tests/) directory. ## Directory Structure ``` -scripts/ +tools/scripts/ ├── README.md ├── main.py # Script runner (runs all *_script.py files) ├── script_test_data.py # Shared test data (envelope, building area) @@ -29,22 +29,22 @@ scripts/ Run all scripts: ```bash -python scripts/main.py +python tools/scripts/main.py ``` Run a single script: ```bash -python scripts/comcheck_client_tests/user_function_script.py -python scripts/comcheck_client_tests/simulation_script.py -python scripts/project_operations_tests/building_area_operations_script.py -python scripts/project_operations_tests/envelope_operations_script.py +python tools/scripts/comcheck_client_tests/user_function_script.py +python tools/scripts/comcheck_client_tests/simulation_script.py +python tools/scripts/project_operations_tests/building_area_operations_script.py +python tools/scripts/project_operations_tests/envelope_operations_script.py ``` Some scripts support running individual tests by number: ```bash -python scripts/project_operations_tests/envelope_operations_script.py 3 +python tools/scripts/project_operations_tests/envelope_operations_script.py 3 ``` ## Output @@ -53,9 +53,9 @@ Scripts export JSON results to a `testProjectJson/` directory for manual inspect ## Scripts vs Tests -| | `scripts/` | `tests/` | +| | `tools/scripts/` | `tests/` | |---|---|---| | **Purpose** | Ad-hoc manual testing during development | Automated tests with assertions | | **When to use** | Exploring API behavior, debugging, adding new features | Validating correctness, CI, regression testing | | **Output** | Prints and JSON files for manual inspection | Pass/fail via pytest | -| **Runner** | `python scripts/main.py` or run individually | `pytest` | +| **Runner** | `python tools/scripts/main.py` or run individually | `pytest` | diff --git a/scripts/__init__.py b/tools/scripts/__init__.py similarity index 100% rename from scripts/__init__.py rename to tools/scripts/__init__.py diff --git a/scripts/comcheck_client_tests/__init__.py b/tools/scripts/comcheck_client_tests/__init__.py similarity index 100% rename from scripts/comcheck_client_tests/__init__.py rename to tools/scripts/comcheck_client_tests/__init__.py diff --git a/scripts/comcheck_client_tests/simulation_script.py b/tools/scripts/comcheck_client_tests/simulation_script.py similarity index 97% rename from scripts/comcheck_client_tests/simulation_script.py rename to tools/scripts/comcheck_client_tests/simulation_script.py index cde9f25..7aee359 100644 --- a/scripts/comcheck_client_tests/simulation_script.py +++ b/tools/scripts/comcheck_client_tests/simulation_script.py @@ -4,7 +4,7 @@ import os import sys -from scripts.script_test_data import TEST_BUILDING_AREA, TEST_PROJECT_ENVELOPE +from tools.scripts.script_test_data import TEST_BUILDING_AREA, TEST_PROJECT_ENVELOPE # Add comcheck_api to path for imports sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) diff --git a/scripts/comcheck_client_tests/user_function_script.py b/tools/scripts/comcheck_client_tests/user_function_script.py similarity index 100% rename from scripts/comcheck_client_tests/user_function_script.py rename to tools/scripts/comcheck_client_tests/user_function_script.py diff --git a/scripts/main.py b/tools/scripts/main.py similarity index 93% rename from scripts/main.py rename to tools/scripts/main.py index c385a25..ac6c74a 100644 --- a/scripts/main.py +++ b/tools/scripts/main.py @@ -2,7 +2,7 @@ from pathlib import Path -def run_scripts(base_dir: str = "scripts"): +def run_scripts(base_dir: str = "tools/scripts"): base_path = Path(base_dir) if not base_path.exists(): diff --git a/scripts/project_operations_tests/__init__.py b/tools/scripts/project_operations_tests/__init__.py similarity index 100% rename from scripts/project_operations_tests/__init__.py rename to tools/scripts/project_operations_tests/__init__.py diff --git a/scripts/project_operations_tests/building_area_operations_script.py b/tools/scripts/project_operations_tests/building_area_operations_script.py similarity index 100% rename from scripts/project_operations_tests/building_area_operations_script.py rename to tools/scripts/project_operations_tests/building_area_operations_script.py diff --git a/scripts/project_operations_tests/envelope_operations_script.py b/tools/scripts/project_operations_tests/envelope_operations_script.py similarity index 100% rename from scripts/project_operations_tests/envelope_operations_script.py rename to tools/scripts/project_operations_tests/envelope_operations_script.py diff --git a/scripts/script_test_data.py b/tools/scripts/script_test_data.py similarity index 100% rename from scripts/script_test_data.py rename to tools/scripts/script_test_data.py diff --git a/uv.lock b/uv.lock index 8b53d62..1cf6932 100644 --- a/uv.lock +++ b/uv.lock @@ -216,7 +216,7 @@ wheels = [ [[package]] name = "comcheck-api" -version = "1.0.0" +version = "1.0.1" source = { editable = "." } dependencies = [ { name = "httpx" },