EPA-PM-API-Wrapper 0.3.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- epa_pm_api_wrapper/__init__.py +30 -0
- epa_pm_api_wrapper/__main__.py +4 -0
- epa_pm_api_wrapper/cli.py +413 -0
- epa_pm_api_wrapper/client.py +507 -0
- epa_pm_api_wrapper/exceptions.py +67 -0
- epa_pm_api_wrapper/models/__init__.py +1451 -0
- epa_pm_api_wrapper/models/accept_reject_type.py +12 -0
- epa_pm_api_wrapper/models/account.py +15 -0
- epa_pm_api_wrapper/models/account_info.py +58 -0
- epa_pm_api_wrapper/models/account_type.py +122 -0
- epa_pm_api_wrapper/models/account_type_language_preference.py +9 -0
- epa_pm_api_wrapper/models/additional_identifier.py +58 -0
- epa_pm_api_wrapper/models/additional_identifier_type.py +60 -0
- epa_pm_api_wrapper/models/additional_identifier_type_group.py +10 -0
- epa_pm_api_wrapper/models/additional_identifier_types.py +19 -0
- epa_pm_api_wrapper/models/additional_identifiers.py +19 -0
- epa_pm_api_wrapper/models/address_type.py +84 -0
- epa_pm_api_wrapper/models/address_type_state.py +159 -0
- epa_pm_api_wrapper/models/adult_education.py +17 -0
- epa_pm_api_wrapper/models/agency_type.py +41 -0
- epa_pm_api_wrapper/models/agency_type_country.py +242 -0
- epa_pm_api_wrapper/models/alerts.py +16 -0
- epa_pm_api_wrapper/models/alerts_type.py +47 -0
- epa_pm_api_wrapper/models/alerts_type_alert.py +29 -0
- epa_pm_api_wrapper/models/all_energy_meters_type.py +32 -0
- epa_pm_api_wrapper/models/all_meter_types.py +130 -0
- epa_pm_api_wrapper/models/ambulatory_surgical_center.py +16 -0
- epa_pm_api_wrapper/models/amount_of_laundry_processed_annually.py +17 -0
- epa_pm_api_wrapper/models/amount_of_laundry_processed_annually_type.py +28 -0
- epa_pm_api_wrapper/models/amount_of_laundry_processed_annually_units_type.py +9 -0
- epa_pm_api_wrapper/models/annual_research_expenditure.py +16 -0
- epa_pm_api_wrapper/models/annual_research_expenditure_type.py +22 -0
- epa_pm_api_wrapper/models/annual_research_expenditure_type_value.py +10 -0
- epa_pm_api_wrapper/models/aquarium.py +17 -0
- epa_pm_api_wrapper/models/area_of_all_walk_in_refrigeration_units.py +19 -0
- epa_pm_api_wrapper/models/average_effluent_biological_oxygen_demand.py +16 -0
- epa_pm_api_wrapper/models/average_influent_biological_oxygen_demand.py +16 -0
- epa_pm_api_wrapper/models/average_number_of_residents.py +15 -0
- epa_pm_api_wrapper/models/average_number_of_vehicles_in_inventory.py +16 -0
- epa_pm_api_wrapper/models/bank_branch.py +16 -0
- epa_pm_api_wrapper/models/bank_branch_type.py +35 -0
- epa_pm_api_wrapper/models/bank_branch_type_use_details.py +58 -0
- epa_pm_api_wrapper/models/bar_nightclub.py +17 -0
- epa_pm_api_wrapper/models/barracks.py +17 -0
- epa_pm_api_wrapper/models/barracks_type.py +35 -0
- epa_pm_api_wrapper/models/barracks_type_use_details.py +58 -0
- epa_pm_api_wrapper/models/baseline_and_target.py +16 -0
- epa_pm_api_wrapper/models/baseline_and_target_type.py +27 -0
- epa_pm_api_wrapper/models/baseline_type.py +41 -0
- epa_pm_api_wrapper/models/billboard_metric_setting.py +21 -0
- epa_pm_api_wrapper/models/billboard_metric_type.py +33 -0
- epa_pm_api_wrapper/models/billboard_metrics.py +11 -0
- epa_pm_api_wrapper/models/billboard_metrics_type.py +26 -0
- epa_pm_api_wrapper/models/bowling_alley.py +40 -0
- epa_pm_api_wrapper/models/bowling_alley_use_details.py +58 -0
- epa_pm_api_wrapper/models/building.py +11 -0
- epa_pm_api_wrapper/models/casino.py +16 -0
- epa_pm_api_wrapper/models/category_type.py +17 -0
- epa_pm_api_wrapper/models/cegep.py +15 -0
- epa_pm_api_wrapper/models/cegep_type.py +35 -0
- epa_pm_api_wrapper/models/cegep_type_use_details.py +131 -0
- epa_pm_api_wrapper/models/ceiling_height.py +15 -0
- epa_pm_api_wrapper/models/ceiling_height_units_type.py +27 -0
- epa_pm_api_wrapper/models/clear_height.py +16 -0
- epa_pm_api_wrapper/models/clear_height_units_type.py +26 -0
- epa_pm_api_wrapper/models/college_university.py +15 -0
- epa_pm_api_wrapper/models/college_university_type.py +37 -0
- epa_pm_api_wrapper/models/college_university_type_use_details.py +131 -0
- epa_pm_api_wrapper/models/common_entrance.py +16 -0
- epa_pm_api_wrapper/models/community_center_and_social_meeting_hall.py +46 -0
- epa_pm_api_wrapper/models/community_center_and_social_meeting_hall_use_details.py +58 -0
- epa_pm_api_wrapper/models/completely_enclosed_footage.py +15 -0
- epa_pm_api_wrapper/models/construction_status_type.py +9 -0
- epa_pm_api_wrapper/models/contact_type.py +70 -0
- epa_pm_api_wrapper/models/convenience_store_with_gas_station.py +19 -0
- epa_pm_api_wrapper/models/convenience_store_with_gas_station_type.py +37 -0
- epa_pm_api_wrapper/models/convenience_store_with_gas_station_type_use_details.py +140 -0
- epa_pm_api_wrapper/models/convenience_store_without_gas_station.py +19 -0
- epa_pm_api_wrapper/models/convenience_store_without_gas_station_type.py +37 -0
- epa_pm_api_wrapper/models/convenience_store_without_gas_station_type_use_details.py +140 -0
- epa_pm_api_wrapper/models/convention_center.py +16 -0
- epa_pm_api_wrapper/models/cooking_facilities.py +15 -0
- epa_pm_api_wrapper/models/cooking_located_onsite.py +16 -0
- epa_pm_api_wrapper/models/cooling_equipment_redundancy.py +15 -0
- epa_pm_api_wrapper/models/cooling_equipment_redundancy_type.py +22 -0
- epa_pm_api_wrapper/models/cooling_equipment_redundancy_type_value.py +12 -0
- epa_pm_api_wrapper/models/country_code.py +16 -0
- epa_pm_api_wrapper/models/country_list.py +493 -0
- epa_pm_api_wrapper/models/courthouse.py +16 -0
- epa_pm_api_wrapper/models/courthouse_type.py +35 -0
- epa_pm_api_wrapper/models/courthouse_type_use_details.py +58 -0
- epa_pm_api_wrapper/models/custom_field.py +109 -0
- epa_pm_api_wrapper/models/custom_field_list.py +20 -0
- epa_pm_api_wrapper/models/custom_field_list_custom_field.py +17 -0
- epa_pm_api_wrapper/models/custom_field_valid_characters.py +15 -0
- epa_pm_api_wrapper/models/custom_field_when_to_prompt.py +15 -0
- epa_pm_api_wrapper/models/custom_metric.py +49 -0
- epa_pm_api_wrapper/models/custom_units_type.py +19 -0
- epa_pm_api_wrapper/models/custom_use.py +15 -0
- epa_pm_api_wrapper/models/custom_use_detail1.py +15 -0
- epa_pm_api_wrapper/models/custom_use_detail2.py +15 -0
- epa_pm_api_wrapper/models/custom_use_details_type.py +50 -0
- epa_pm_api_wrapper/models/custom_use_details_type_data_type.py +8 -0
- epa_pm_api_wrapper/models/custom_use_type.py +35 -0
- epa_pm_api_wrapper/models/custom_use_type_use_details.py +27 -0
- epa_pm_api_wrapper/models/customer.py +77 -0
- epa_pm_api_wrapper/models/customer_language_preference.py +9 -0
- epa_pm_api_wrapper/models/data_center.py +17 -0
- epa_pm_api_wrapper/models/data_center_type.py +35 -0
- epa_pm_api_wrapper/models/data_center_type_use_details.py +50 -0
- epa_pm_api_wrapper/models/data_exchange_settings.py +37 -0
- epa_pm_api_wrapper/models/data_exchange_settings_supported_meter_types.py +20 -0
- epa_pm_api_wrapper/models/data_exchange_settings_terms_of_use.py +40 -0
- epa_pm_api_wrapper/models/data_request.py +88 -0
- epa_pm_api_wrapper/models/data_request_locations.py +19 -0
- epa_pm_api_wrapper/models/data_request_locations_location.py +22 -0
- epa_pm_api_wrapper/models/data_request_requester_details.py +32 -0
- epa_pm_api_wrapper/models/data_request_status_type.py +13 -0
- epa_pm_api_wrapper/models/data_response.py +47 -0
- epa_pm_api_wrapper/models/data_response_properties.py +20 -0
- epa_pm_api_wrapper/models/data_type.py +9 -0
- epa_pm_api_wrapper/models/delivery_facility.py +16 -0
- epa_pm_api_wrapper/models/demand_tracking_type.py +35 -0
- epa_pm_api_wrapper/models/design.py +15 -0
- epa_pm_api_wrapper/models/design_base_type.py +83 -0
- epa_pm_api_wrapper/models/design_base_type_estimated_energy_list.py +17 -0
- epa_pm_api_wrapper/models/design_base_type_property_uses.py +709 -0
- epa_pm_api_wrapper/models/design_base_type_target.py +34 -0
- epa_pm_api_wrapper/models/design_unit_of_measure.py +37 -0
- epa_pm_api_wrapper/models/detail_type.py +22 -0
- epa_pm_api_wrapper/models/details_types.py +20 -0
- epa_pm_api_wrapper/models/disposal_destination_type.py +60 -0
- epa_pm_api_wrapper/models/distribution_center.py +17 -0
- epa_pm_api_wrapper/models/distribution_center_type.py +37 -0
- epa_pm_api_wrapper/models/distribution_center_type_use_details.py +76 -0
- epa_pm_api_wrapper/models/drinking_water_treatment_and_distribution.py +18 -0
- epa_pm_api_wrapper/models/drinking_water_treatment_and_distribution_type.py +37 -0
- epa_pm_api_wrapper/models/drinking_water_treatment_and_distribution_type_use_details.py +18 -0
- epa_pm_api_wrapper/models/e_grid_subregion.py +38 -0
- epa_pm_api_wrapper/models/e_grid_subregion_country.py +242 -0
- epa_pm_api_wrapper/models/e_grid_subregion_list.py +19 -0
- epa_pm_api_wrapper/models/edu.py +64 -0
- epa_pm_api_wrapper/models/edu_list.py +18 -0
- epa_pm_api_wrapper/models/electric_vehicle_charging_station.py +15 -0
- epa_pm_api_wrapper/models/empty_string.py +7 -0
- epa_pm_api_wrapper/models/empty_type.py +7 -0
- epa_pm_api_wrapper/models/enclosed_floor_area.py +15 -0
- epa_pm_api_wrapper/models/enclosed_mall.py +16 -0
- epa_pm_api_wrapper/models/energy_meter_assoc_and_config_type.py +25 -0
- epa_pm_api_wrapper/models/energy_performance_project.py +11 -0
- epa_pm_api_wrapper/models/energy_performance_project_type.py +136 -0
- epa_pm_api_wrapper/models/energy_power_station.py +20 -0
- epa_pm_api_wrapper/models/energy_uom_type.py +11 -0
- epa_pm_api_wrapper/models/enrollment.py +11 -0
- epa_pm_api_wrapper/models/error_type.py +29 -0
- epa_pm_api_wrapper/models/errors_type.py +25 -0
- epa_pm_api_wrapper/models/estimated_energy_list_type.py +19 -0
- epa_pm_api_wrapper/models/estimated_energy_type.py +58 -0
- epa_pm_api_wrapper/models/estimates_applied.py +15 -0
- epa_pm_api_wrapper/models/ev_charging_station_type.py +37 -0
- epa_pm_api_wrapper/models/ev_charging_station_type_use_details.py +41 -0
- epa_pm_api_wrapper/models/evaluation_period_type.py +35 -0
- epa_pm_api_wrapper/models/exterior_entrance_to_the_public.py +15 -0
- epa_pm_api_wrapper/models/fast_food_restaurant.py +17 -0
- epa_pm_api_wrapper/models/fast_food_restaurant_type.py +37 -0
- epa_pm_api_wrapper/models/fast_food_restaurant_type_use_details.py +84 -0
- epa_pm_api_wrapper/models/federal_agencies.py +19 -0
- epa_pm_api_wrapper/models/financial_office.py +16 -0
- epa_pm_api_wrapper/models/financial_office_type.py +35 -0
- epa_pm_api_wrapper/models/financial_office_type_use_details.py +58 -0
- epa_pm_api_wrapper/models/fire_station.py +16 -0
- epa_pm_api_wrapper/models/fire_station_type.py +35 -0
- epa_pm_api_wrapper/models/fire_station_type_use_details.py +92 -0
- epa_pm_api_wrapper/models/fitness_center_health_club_gym.py +42 -0
- epa_pm_api_wrapper/models/fitness_center_health_club_gym_use_details.py +58 -0
- epa_pm_api_wrapper/models/fixed_film_trickle_filtration_process.py +15 -0
- epa_pm_api_wrapper/models/floor_area_type_base.py +23 -0
- epa_pm_api_wrapper/models/food_sales.py +17 -0
- epa_pm_api_wrapper/models/food_sales_type.py +35 -0
- epa_pm_api_wrapper/models/food_sales_type_use_details.py +114 -0
- epa_pm_api_wrapper/models/food_service.py +17 -0
- epa_pm_api_wrapper/models/full_service_spa_floor_area.py +15 -0
- epa_pm_api_wrapper/models/generation_location_type.py +41 -0
- epa_pm_api_wrapper/models/government_subsidized_housing.py +16 -0
- epa_pm_api_wrapper/models/grant_dollars.py +11 -0
- epa_pm_api_wrapper/models/green_power_fuel_source_enum.py +13 -0
- epa_pm_api_wrapper/models/green_power_type_enum.py +15 -0
- epa_pm_api_wrapper/models/gross_floor_area_hotel_conference_space.py +18 -0
- epa_pm_api_wrapper/models/gross_floor_area_that_is_exhibit_space.py +19 -0
- epa_pm_api_wrapper/models/gross_floor_area_type.py +24 -0
- epa_pm_api_wrapper/models/gross_floor_area_units_type.py +8 -0
- epa_pm_api_wrapper/models/gross_floor_area_used_for_food_preparation.py +19 -0
- epa_pm_api_wrapper/models/gym_center_floor_area.py +15 -0
- epa_pm_api_wrapper/models/gymnasium_floor_area.py +15 -0
- epa_pm_api_wrapper/models/has_computer_lab.py +15 -0
- epa_pm_api_wrapper/models/has_dining_hall.py +15 -0
- epa_pm_api_wrapper/models/has_laboratory.py +15 -0
- epa_pm_api_wrapper/models/hey.py +11 -0
- epa_pm_api_wrapper/models/hey_type.py +29 -0
- epa_pm_api_wrapper/models/hey_type_meter.py +35 -0
- epa_pm_api_wrapper/models/hey_type_meter_meter_data.py +22 -0
- epa_pm_api_wrapper/models/hey_type_property_info.py +35 -0
- epa_pm_api_wrapper/models/hierarchy.py +16 -0
- epa_pm_api_wrapper/models/hierarchy_type.py +84 -0
- epa_pm_api_wrapper/models/highest_award_level.py +17 -0
- epa_pm_api_wrapper/models/highest_award_level_type.py +20 -0
- epa_pm_api_wrapper/models/highest_award_level_type_value.py +11 -0
- epa_pm_api_wrapper/models/hospital.py +22 -0
- epa_pm_api_wrapper/models/hospital_type.py +35 -0
- epa_pm_api_wrapper/models/hospital_type_use_details.py +132 -0
- epa_pm_api_wrapper/models/hotel.py +17 -0
- epa_pm_api_wrapper/models/hotel_type.py +41 -0
- epa_pm_api_wrapper/models/hotel_type_use_details.py +140 -0
- epa_pm_api_wrapper/models/hours_per_day_guests_onsite.py +16 -0
- epa_pm_api_wrapper/models/hours_per_day_guests_onsite_type.py +22 -0
- epa_pm_api_wrapper/models/hours_per_day_guests_onsite_type_value.py +9 -0
- epa_pm_api_wrapper/models/ice_curling_rink.py +27 -0
- epa_pm_api_wrapper/models/ice_curling_rink_type.py +35 -0
- epa_pm_api_wrapper/models/ice_curling_rink_type_use_details.py +78 -0
- epa_pm_api_wrapper/models/ice_events.py +15 -0
- epa_pm_api_wrapper/models/individual_meter.py +86 -0
- epa_pm_api_wrapper/models/indoor_arena.py +17 -0
- epa_pm_api_wrapper/models/indoor_arena_type.py +35 -0
- epa_pm_api_wrapper/models/indoor_arena_type_use_details.py +104 -0
- epa_pm_api_wrapper/models/international_weather_station_list.py +26 -0
- epa_pm_api_wrapper/models/irrigation_area_type.py +28 -0
- epa_pm_api_wrapper/models/irrigation_area_type_base.py +30 -0
- epa_pm_api_wrapper/models/irrigation_area_units_type.py +10 -0
- epa_pm_api_wrapper/models/is_high_school.py +16 -0
- epa_pm_api_wrapper/models/is_tertiary_care.py +17 -0
- epa_pm_api_wrapper/models/it_energy_configuration_type.py +20 -0
- epa_pm_api_wrapper/models/it_energy_configuration_type_value.py +14 -0
- epa_pm_api_wrapper/models/it_energy_meter_configuration.py +16 -0
- epa_pm_api_wrapper/models/k12_school.py +16 -0
- epa_pm_api_wrapper/models/k12_school_type.py +35 -0
- epa_pm_api_wrapper/models/k12_school_type_use_details.py +126 -0
- epa_pm_api_wrapper/models/laboratory.py +17 -0
- epa_pm_api_wrapper/models/laundry_facility.py +16 -0
- epa_pm_api_wrapper/models/length_of_all_commercial_kitchen_hoods.py +19 -0
- epa_pm_api_wrapper/models/length_of_all_open_closed_refrigeration_units.py +21 -0
- epa_pm_api_wrapper/models/length_of_use_detail_type.py +26 -0
- epa_pm_api_wrapper/models/length_units_type.py +8 -0
- epa_pm_api_wrapper/models/library.py +17 -0
- epa_pm_api_wrapper/models/library_type.py +35 -0
- epa_pm_api_wrapper/models/library_type_use_details.py +58 -0
- epa_pm_api_wrapper/models/license.py +60 -0
- epa_pm_api_wrapper/models/license_list.py +19 -0
- epa_pm_api_wrapper/models/licensed_bed_capacity.py +19 -0
- epa_pm_api_wrapper/models/lifestyle_center.py +18 -0
- epa_pm_api_wrapper/models/link_type.py +52 -0
- epa_pm_api_wrapper/models/links_type.py +19 -0
- epa_pm_api_wrapper/models/log.py +11 -0
- epa_pm_api_wrapper/models/log_type.py +79 -0
- epa_pm_api_wrapper/models/mailing_center_post_office.py +16 -0
- epa_pm_api_wrapper/models/mailing_center_post_office_type.py +37 -0
- epa_pm_api_wrapper/models/mailing_center_post_office_type_use_details.py +74 -0
- epa_pm_api_wrapper/models/manufacturing_industrial_plant.py +17 -0
- epa_pm_api_wrapper/models/manufacturing_industrial_plant_type.py +37 -0
- epa_pm_api_wrapper/models/manufacturing_industrial_plant_type_use_details.py +49 -0
- epa_pm_api_wrapper/models/mapping.py +11 -0
- epa_pm_api_wrapper/models/mapping_type.py +23 -0
- epa_pm_api_wrapper/models/maximum_number_of_floors.py +15 -0
- epa_pm_api_wrapper/models/maximum_resident_capacity.py +15 -0
- epa_pm_api_wrapper/models/medical_office.py +16 -0
- epa_pm_api_wrapper/models/medical_office_type.py +35 -0
- epa_pm_api_wrapper/models/medical_office_type_use_details.py +82 -0
- epa_pm_api_wrapper/models/meter.py +11 -0
- epa_pm_api_wrapper/models/meter_category_type.py +9 -0
- epa_pm_api_wrapper/models/meter_consumption.py +15 -0
- epa_pm_api_wrapper/models/meter_consumption_type.py +110 -0
- epa_pm_api_wrapper/models/meter_data.py +11 -0
- epa_pm_api_wrapper/models/meter_data_type.py +41 -0
- epa_pm_api_wrapper/models/meter_delivery.py +11 -0
- epa_pm_api_wrapper/models/meter_delivery_type.py +68 -0
- epa_pm_api_wrapper/models/meter_list_type.py +23 -0
- epa_pm_api_wrapper/models/meter_property_association_list.py +18 -0
- epa_pm_api_wrapper/models/meter_property_association_list_type.py +38 -0
- epa_pm_api_wrapper/models/meter_property_use_association_list.py +16 -0
- epa_pm_api_wrapper/models/meter_type.py +131 -0
- epa_pm_api_wrapper/models/meter_type_unit_of_measure.py +40 -0
- epa_pm_api_wrapper/models/metric.py +71 -0
- epa_pm_api_wrapper/models/months_in_use.py +15 -0
- epa_pm_api_wrapper/models/months_in_use_type.py +21 -0
- epa_pm_api_wrapper/models/months_main_indoor_ice_rink_in_use.py +15 -0
- epa_pm_api_wrapper/models/months_school_in_use_type.py +21 -0
- epa_pm_api_wrapper/models/movie_theater.py +15 -0
- epa_pm_api_wrapper/models/multifamily_housing.py +16 -0
- epa_pm_api_wrapper/models/multifamily_housing_type.py +37 -0
- epa_pm_api_wrapper/models/multifamily_housing_type_use_details.py +124 -0
- epa_pm_api_wrapper/models/museum.py +26 -0
- epa_pm_api_wrapper/models/museum_type.py +35 -0
- epa_pm_api_wrapper/models/museum_type_use_details.py +78 -0
- epa_pm_api_wrapper/models/non_refrigerated_warehouse.py +16 -0
- epa_pm_api_wrapper/models/non_refrigerated_warehouse_type.py +37 -0
- epa_pm_api_wrapper/models/non_refrigerated_warehouse_type_use_details.py +76 -0
- epa_pm_api_wrapper/models/notification_list.py +16 -0
- epa_pm_api_wrapper/models/notification_list_type.py +19 -0
- epa_pm_api_wrapper/models/notification_type.py +106 -0
- epa_pm_api_wrapper/models/number_of_annual_emergency_incidents.py +17 -0
- epa_pm_api_wrapper/models/number_of_bedrooms.py +15 -0
- epa_pm_api_wrapper/models/number_of_cash_registers.py +15 -0
- epa_pm_api_wrapper/models/number_of_commercial_refrigeration_units.py +16 -0
- epa_pm_api_wrapper/models/number_of_commercial_washing_machines.py +16 -0
- epa_pm_api_wrapper/models/number_of_computers.py +15 -0
- epa_pm_api_wrapper/models/number_of_concert_show_events_per_year.py +15 -0
- epa_pm_api_wrapper/models/number_of_cooking_equipment_units.py +15 -0
- epa_pm_api_wrapper/models/number_of_curling_sheets.py +16 -0
- epa_pm_api_wrapper/models/number_of_dc_fast_ev_charging_stations.py +15 -0
- epa_pm_api_wrapper/models/number_of_emergency_vehicles.py +16 -0
- epa_pm_api_wrapper/models/number_of_fteworkers.py +16 -0
- epa_pm_api_wrapper/models/number_of_full_time_students_enrolled_january_to_april.py +16 -0
- epa_pm_api_wrapper/models/number_of_full_time_students_enrolled_may_to_august.py +16 -0
- epa_pm_api_wrapper/models/number_of_full_time_students_enrolled_september_to_december.py +16 -0
- epa_pm_api_wrapper/models/number_of_guest_meals_served_per_year.py +15 -0
- epa_pm_api_wrapper/models/number_of_hotel_rooms.py +15 -0
- epa_pm_api_wrapper/models/number_of_indoor_ice_rinks.py +18 -0
- epa_pm_api_wrapper/models/number_of_laundry_hookups_in_all_units.py +16 -0
- epa_pm_api_wrapper/models/number_of_laundry_hookups_in_common_area.py +16 -0
- epa_pm_api_wrapper/models/number_of_letters_packages_per_year.py +17 -0
- epa_pm_api_wrapper/models/number_of_level_one_ev_charging_stations.py +15 -0
- epa_pm_api_wrapper/models/number_of_level_two_ev_charging_stations.py +15 -0
- epa_pm_api_wrapper/models/number_of_mri_machines.py +15 -0
- epa_pm_api_wrapper/models/number_of_open_closed_refrigeration_units.py +27 -0
- epa_pm_api_wrapper/models/number_of_paint_bays.py +16 -0
- epa_pm_api_wrapper/models/number_of_people.py +15 -0
- epa_pm_api_wrapper/models/number_of_repair_bays.py +16 -0
- epa_pm_api_wrapper/models/number_of_residential_lift_systems.py +15 -0
- epa_pm_api_wrapper/models/number_of_residential_living_units.py +20 -0
- epa_pm_api_wrapper/models/number_of_residential_living_units_high_rise_setting.py +18 -0
- epa_pm_api_wrapper/models/number_of_residential_living_units_low_rise_setting.py +18 -0
- epa_pm_api_wrapper/models/number_of_residential_living_units_mid_rise_setting.py +18 -0
- epa_pm_api_wrapper/models/number_of_residential_washing_machines.py +15 -0
- epa_pm_api_wrapper/models/number_of_rooms.py +16 -0
- epa_pm_api_wrapper/models/number_of_special_other_events_per_year.py +16 -0
- epa_pm_api_wrapper/models/number_of_sporting_events_per_year.py +15 -0
- epa_pm_api_wrapper/models/number_of_staffed_beds.py +15 -0
- epa_pm_api_wrapper/models/number_of_sterilization_units.py +15 -0
- epa_pm_api_wrapper/models/number_of_surgical_operating_beds.py +16 -0
- epa_pm_api_wrapper/models/number_of_walk_in_refrigeration_units.py +16 -0
- epa_pm_api_wrapper/models/number_of_warming_heating_equipment_units.py +15 -0
- epa_pm_api_wrapper/models/number_of_weekdays_open.py +17 -0
- epa_pm_api_wrapper/models/number_of_weekdays_type.py +21 -0
- epa_pm_api_wrapper/models/number_of_weekly_ice_resurfacing_for_all_rinks.py +23 -0
- epa_pm_api_wrapper/models/number_of_weekly_ice_resurfacing_type.py +20 -0
- epa_pm_api_wrapper/models/number_of_workers.py +16 -0
- epa_pm_api_wrapper/models/nutrient_removal.py +16 -0
- epa_pm_api_wrapper/models/occupancy_type.py +27 -0
- epa_pm_api_wrapper/models/office.py +16 -0
- epa_pm_api_wrapper/models/office_type.py +35 -0
- epa_pm_api_wrapper/models/office_type_use_details.py +58 -0
- epa_pm_api_wrapper/models/offsite_green_power_purchase.py +11 -0
- epa_pm_api_wrapper/models/offsite_green_power_purchase_type.py +224 -0
- epa_pm_api_wrapper/models/offsite_green_power_purchase_type_amount_purchased.py +31 -0
- epa_pm_api_wrapper/models/offsite_green_power_purchase_type_amount_purchased_percentage.py +46 -0
- epa_pm_api_wrapper/models/offsite_green_power_purchase_type_amount_purchased_percentage_meters.py +21 -0
- epa_pm_api_wrapper/models/offsite_green_power_purchase_type_amount_purchased_quantity.py +31 -0
- epa_pm_api_wrapper/models/offsite_green_power_purchase_type_cost.py +31 -0
- epa_pm_api_wrapper/models/offsite_green_power_purchase_type_fuel_sources.py +22 -0
- epa_pm_api_wrapper/models/offsite_green_power_purchase_type_fuel_sources_fuel_source.py +35 -0
- epa_pm_api_wrapper/models/offsite_green_power_purchase_type_rated_capacity.py +31 -0
- epa_pm_api_wrapper/models/offsite_green_power_purchase_type_renewable_generation_technologies.py +21 -0
- epa_pm_api_wrapper/models/on_site_laundry_facility.py +15 -0
- epa_pm_api_wrapper/models/onsite_laundry_type.py +20 -0
- epa_pm_api_wrapper/models/onsite_laundry_type_value.py +10 -0
- epa_pm_api_wrapper/models/onsite_renewable_detail.py +11 -0
- epa_pm_api_wrapper/models/onsite_renewable_detail_type.py +60 -0
- epa_pm_api_wrapper/models/onsite_renewable_details.py +28 -0
- epa_pm_api_wrapper/models/onsite_renewable_optional_info.py +13 -0
- epa_pm_api_wrapper/models/onsite_renewable_optional_info_type.py +134 -0
- epa_pm_api_wrapper/models/onsite_renewable_optional_info_type_rated_capacity.py +31 -0
- epa_pm_api_wrapper/models/onsite_renewable_optional_info_type_renewable_generation_technologies.py +21 -0
- epa_pm_api_wrapper/models/onsite_usage_detail_type.py +70 -0
- epa_pm_api_wrapper/models/open_footage.py +15 -0
- epa_pm_api_wrapper/models/open_on_weekends.py +16 -0
- epa_pm_api_wrapper/models/optional_floor_area_type.py +19 -0
- epa_pm_api_wrapper/models/organization_type.py +77 -0
- epa_pm_api_wrapper/models/other.py +16 -0
- epa_pm_api_wrapper/models/other_education.py +18 -0
- epa_pm_api_wrapper/models/other_entertainment_public_assembly.py +17 -0
- epa_pm_api_wrapper/models/other_lodging_residential.py +19 -0
- epa_pm_api_wrapper/models/other_mall.py +17 -0
- epa_pm_api_wrapper/models/other_public_services.py +21 -0
- epa_pm_api_wrapper/models/other_recreation.py +16 -0
- epa_pm_api_wrapper/models/other_restaurant_bar.py +17 -0
- epa_pm_api_wrapper/models/other_services.py +16 -0
- epa_pm_api_wrapper/models/other_speciality_hospital.py +17 -0
- epa_pm_api_wrapper/models/other_stadium.py +16 -0
- epa_pm_api_wrapper/models/other_stadium_type.py +35 -0
- epa_pm_api_wrapper/models/other_stadium_type_use_details.py +104 -0
- epa_pm_api_wrapper/models/other_technology_science.py +16 -0
- epa_pm_api_wrapper/models/other_type.py +35 -0
- epa_pm_api_wrapper/models/other_type_use_details.py +42 -0
- epa_pm_api_wrapper/models/other_utility.py +16 -0
- epa_pm_api_wrapper/models/outpatient_rehabilitation_physical_therapy.py +16 -0
- epa_pm_api_wrapper/models/owned_by.py +16 -0
- epa_pm_api_wrapper/models/owned_by_type.py +20 -0
- epa_pm_api_wrapper/models/owned_by_type_value.py +9 -0
- epa_pm_api_wrapper/models/parking.py +15 -0
- epa_pm_api_wrapper/models/parking_type.py +35 -0
- epa_pm_api_wrapper/models/parking_type_use_details.py +40 -0
- epa_pm_api_wrapper/models/partially_enclosed_footage.py +16 -0
- epa_pm_api_wrapper/models/ped.py +26 -0
- epa_pm_api_wrapper/models/pending_accounts_type.py +58 -0
- epa_pm_api_wrapper/models/pending_list.py +15 -0
- epa_pm_api_wrapper/models/pending_list_type.py +53 -0
- epa_pm_api_wrapper/models/pending_meters_type.py +104 -0
- epa_pm_api_wrapper/models/pending_properties_type.py +77 -0
- epa_pm_api_wrapper/models/percent_cooled.py +16 -0
- epa_pm_api_wrapper/models/percent_cooled_type.py +20 -0
- epa_pm_api_wrapper/models/percent_cooled_type_value.py +17 -0
- epa_pm_api_wrapper/models/percent_heated.py +16 -0
- epa_pm_api_wrapper/models/percent_heated_type.py +20 -0
- epa_pm_api_wrapper/models/percent_heated_type_value.py +17 -0
- epa_pm_api_wrapper/models/percent_of_gross_floor_area_that_is_common_space_only.py +16 -0
- epa_pm_api_wrapper/models/percent_of_lab_floor_area.py +16 -0
- epa_pm_api_wrapper/models/percent_office_cooled.py +11 -0
- epa_pm_api_wrapper/models/percent_office_cooled_type.py +20 -0
- epa_pm_api_wrapper/models/percent_office_cooled_type_value.py +9 -0
- epa_pm_api_wrapper/models/percent_office_heated.py +11 -0
- epa_pm_api_wrapper/models/percent_office_heated_type.py +20 -0
- epa_pm_api_wrapper/models/percent_office_heated_type_value.py +9 -0
- epa_pm_api_wrapper/models/percent_used_for_cold_storage.py +18 -0
- epa_pm_api_wrapper/models/performance_target_type.py +42 -0
- epa_pm_api_wrapper/models/performance_target_type_target_metric.py +10 -0
- epa_pm_api_wrapper/models/performance_target_type_target_value.py +107 -0
- epa_pm_api_wrapper/models/performing_arts.py +15 -0
- epa_pm_api_wrapper/models/period_type.py +8 -0
- epa_pm_api_wrapper/models/personal_services.py +17 -0
- epa_pm_api_wrapper/models/pgp.py +56 -0
- epa_pm_api_wrapper/models/pgp_list.py +18 -0
- epa_pm_api_wrapper/models/plant_data_type.py +28 -0
- epa_pm_api_wrapper/models/plant_data_type_value.py +71 -0
- epa_pm_api_wrapper/models/plant_design_flow_rate.py +16 -0
- epa_pm_api_wrapper/models/plant_design_flow_rate_type.py +22 -0
- epa_pm_api_wrapper/models/plant_design_flow_rate_units_type.py +8 -0
- epa_pm_api_wrapper/models/plant_type.py +17 -0
- epa_pm_api_wrapper/models/police_station.py +16 -0
- epa_pm_api_wrapper/models/pool_location.py +15 -0
- epa_pm_api_wrapper/models/pool_size.py +16 -0
- epa_pm_api_wrapper/models/pool_size_type.py +20 -0
- epa_pm_api_wrapper/models/pool_size_type_value.py +9 -0
- epa_pm_api_wrapper/models/pool_type.py +20 -0
- epa_pm_api_wrapper/models/pool_type_value.py +8 -0
- epa_pm_api_wrapper/models/precision_controls_for_temperature_and_humidity.py +16 -0
- epa_pm_api_wrapper/models/preschool_daycare.py +17 -0
- epa_pm_api_wrapper/models/preschool_daycare_type.py +35 -0
- epa_pm_api_wrapper/models/preschool_daycare_type_use_details.py +68 -0
- epa_pm_api_wrapper/models/primary_business_type.py +33 -0
- epa_pm_api_wrapper/models/primary_function_type.py +95 -0
- epa_pm_api_wrapper/models/prison.py +17 -0
- epa_pm_api_wrapper/models/professional_designation_list.py +23 -0
- epa_pm_api_wrapper/models/professional_designation_list_professional_designation.py +41 -0
- epa_pm_api_wrapper/models/property.py +11 -0
- epa_pm_api_wrapper/models/property_design_type.py +66 -0
- epa_pm_api_wrapper/models/property_metrics.py +15 -0
- epa_pm_api_wrapper/models/property_metrics_list.py +19 -0
- epa_pm_api_wrapper/models/property_metrics_type.py +58 -0
- epa_pm_api_wrapper/models/property_representation.py +59 -0
- epa_pm_api_wrapper/models/property_representation_property_representation_type.py +27 -0
- epa_pm_api_wrapper/models/property_type.py +192 -0
- epa_pm_api_wrapper/models/property_use.py +22 -0
- epa_pm_api_wrapper/models/race_track.py +16 -0
- epa_pm_api_wrapper/models/rated_capacity_uom_type.py +8 -0
- epa_pm_api_wrapper/models/rec_ownership_enum.py +10 -0
- epa_pm_api_wrapper/models/refrigerated_warehouse.py +17 -0
- epa_pm_api_wrapper/models/refrigerated_warehouse_type.py +37 -0
- epa_pm_api_wrapper/models/refrigerated_warehouse_type_use_details.py +66 -0
- epa_pm_api_wrapper/models/renewable_generation_technology_enum.py +11 -0
- epa_pm_api_wrapper/models/report.py +72 -0
- epa_pm_api_wrapper/models/report_error.py +53 -0
- epa_pm_api_wrapper/models/report_error_missing_metrics.py +21 -0
- epa_pm_api_wrapper/models/report_error_missing_metrics_property_missing_metric.py +43 -0
- epa_pm_api_wrapper/models/report_error_missing_metrics_property_missing_metric_metric.py +33 -0
- epa_pm_api_wrapper/models/report_metric_values_ws.py +57 -0
- epa_pm_api_wrapper/models/report_metrics.py +26 -0
- epa_pm_api_wrapper/models/report_metrics_group.py +36 -0
- epa_pm_api_wrapper/models/report_metrics_group_metrics.py +24 -0
- epa_pm_api_wrapper/models/report_metrics_group_metrics_metric.py +62 -0
- epa_pm_api_wrapper/models/report_properties.py +20 -0
- epa_pm_api_wrapper/models/report_status.py +11 -0
- epa_pm_api_wrapper/models/report_status_def.py +62 -0
- epa_pm_api_wrapper/models/report_status_type.py +33 -0
- epa_pm_api_wrapper/models/report_template.py +11 -0
- epa_pm_api_wrapper/models/report_template_type.py +63 -0
- epa_pm_api_wrapper/models/report_template_type_metrics.py +21 -0
- epa_pm_api_wrapper/models/report_type.py +17 -0
- epa_pm_api_wrapper/models/reporting_interval_type.py +15 -0
- epa_pm_api_wrapper/models/residence_hall_dormitory.py +16 -0
- epa_pm_api_wrapper/models/residence_hall_dormitory_type.py +37 -0
- epa_pm_api_wrapper/models/residence_hall_dormitory_type_use_details.py +58 -0
- epa_pm_api_wrapper/models/resident_population.py +16 -0
- epa_pm_api_wrapper/models/resident_population_type.py +20 -0
- epa_pm_api_wrapper/models/resident_population_type_value.py +12 -0
- epa_pm_api_wrapper/models/residential_care_facility.py +16 -0
- epa_pm_api_wrapper/models/residential_care_facility_type.py +37 -0
- epa_pm_api_wrapper/models/residential_care_facility_type_use_details.py +120 -0
- epa_pm_api_wrapper/models/response.py +11 -0
- epa_pm_api_wrapper/models/response_status.py +36 -0
- epa_pm_api_wrapper/models/response_status_errors.py +19 -0
- epa_pm_api_wrapper/models/response_type.py +59 -0
- epa_pm_api_wrapper/models/restaurant.py +20 -0
- epa_pm_api_wrapper/models/restaurant_type.py +35 -0
- epa_pm_api_wrapper/models/restaurant_type_use_details.py +84 -0
- epa_pm_api_wrapper/models/retail.py +17 -0
- epa_pm_api_wrapper/models/retail_type.py +35 -0
- epa_pm_api_wrapper/models/retail_type_use_details.py +130 -0
- epa_pm_api_wrapper/models/roller_rink.py +16 -0
- epa_pm_api_wrapper/models/school_district.py +15 -0
- epa_pm_api_wrapper/models/search_result_type.py +23 -0
- epa_pm_api_wrapper/models/search_results.py +15 -0
- epa_pm_api_wrapper/models/seating_capacity.py +16 -0
- epa_pm_api_wrapper/models/self_storage_facility.py +15 -0
- epa_pm_api_wrapper/models/self_storage_facility_type.py +37 -0
- epa_pm_api_wrapper/models/self_storage_facility_type_use_details.py +84 -0
- epa_pm_api_wrapper/models/send_data_response.py +43 -0
- epa_pm_api_wrapper/models/send_data_response_additional_email_addresses.py +17 -0
- epa_pm_api_wrapper/models/send_data_response_file_format.py +8 -0
- epa_pm_api_wrapper/models/senior_living_community.py +16 -0
- epa_pm_api_wrapper/models/senior_living_community_type.py +37 -0
- epa_pm_api_wrapper/models/senior_living_community_type_use_details.py +120 -0
- epa_pm_api_wrapper/models/share_level_type.py +12 -0
- epa_pm_api_wrapper/models/sharing_response.py +16 -0
- epa_pm_api_wrapper/models/sharing_response_type.py +34 -0
- epa_pm_api_wrapper/models/single_family_home.py +16 -0
- epa_pm_api_wrapper/models/single_family_home_type.py +35 -0
- epa_pm_api_wrapper/models/single_family_home_type_use_details.py +34 -0
- epa_pm_api_wrapper/models/single_store.py +15 -0
- epa_pm_api_wrapper/models/size_of_electronic_score_boards.py +15 -0
- epa_pm_api_wrapper/models/spectator_seating_capacity.py +16 -0
- epa_pm_api_wrapper/models/stadium_closed.py +17 -0
- epa_pm_api_wrapper/models/stadium_closed_type.py +35 -0
- epa_pm_api_wrapper/models/stadium_closed_type_use_details.py +104 -0
- epa_pm_api_wrapper/models/stadium_open.py +17 -0
- epa_pm_api_wrapper/models/stadium_open_type.py +35 -0
- epa_pm_api_wrapper/models/stadium_open_type_use_details.py +104 -0
- epa_pm_api_wrapper/models/state_code.py +159 -0
- epa_pm_api_wrapper/models/station.py +45 -0
- epa_pm_api_wrapper/models/status_type.py +8 -0
- epa_pm_api_wrapper/models/strip_mall.py +17 -0
- epa_pm_api_wrapper/models/student_seating_capacity.py +16 -0
- epa_pm_api_wrapper/models/supermarket.py +17 -0
- epa_pm_api_wrapper/models/supermarket_type.py +35 -0
- epa_pm_api_wrapper/models/supermarket_type_use_details.py +114 -0
- epa_pm_api_wrapper/models/supplemental_heating.py +15 -0
- epa_pm_api_wrapper/models/surgery_center_floor_area.py +16 -0
- epa_pm_api_wrapper/models/swimming_pool.py +15 -0
- epa_pm_api_wrapper/models/swimming_pool_type.py +35 -0
- epa_pm_api_wrapper/models/swimming_pool_type_use_details.py +34 -0
- epa_pm_api_wrapper/models/system_determined_string.py +7 -0
- epa_pm_api_wrapper/models/target_finder.py +11 -0
- epa_pm_api_wrapper/models/target_type_percentage_type.py +17 -0
- epa_pm_api_wrapper/models/target_type_percentage_values_type.py +107 -0
- epa_pm_api_wrapper/models/target_type_score_type.py +17 -0
- epa_pm_api_wrapper/models/target_type_score_values_type.py +106 -0
- epa_pm_api_wrapper/models/template_type.py +19 -0
- epa_pm_api_wrapper/models/template_type_value.py +15 -0
- epa_pm_api_wrapper/models/tenant_common_area_energy_type.py +21 -0
- epa_pm_api_wrapper/models/tenant_common_area_energy_use_information_type.py +31 -0
- epa_pm_api_wrapper/models/terminate_share_response_type.py +24 -0
- epa_pm_api_wrapper/models/terminate_sharing_response.py +16 -0
- epa_pm_api_wrapper/models/timeframe_type.py +103 -0
- epa_pm_api_wrapper/models/timeframe_type_baseline_period.py +18 -0
- epa_pm_api_wrapper/models/timeframe_type_compare_baseline_period.py +25 -0
- epa_pm_api_wrapper/models/timeframe_type_compare_current_period.py +25 -0
- epa_pm_api_wrapper/models/timeframe_type_current_period.py +18 -0
- epa_pm_api_wrapper/models/timeframe_type_current_vs_baseline.py +18 -0
- epa_pm_api_wrapper/models/timeframe_type_date_range.py +30 -0
- epa_pm_api_wrapper/models/timeframe_type_single_period.py +18 -0
- epa_pm_api_wrapper/models/timeframe_type_two_periods.py +24 -0
- epa_pm_api_wrapper/models/total_gross_floor_area.py +11 -0
- epa_pm_api_wrapper/models/total_ice_rink_surface_area_for_all_rinks.py +21 -0
- epa_pm_api_wrapper/models/transportation_terminal_station.py +16 -0
- epa_pm_api_wrapper/models/type_of_energy_star_partner.py +14 -0
- epa_pm_api_wrapper/models/type_of_meter.py +55 -0
- epa_pm_api_wrapper/models/type_of_waste_meter.py +122 -0
- epa_pm_api_wrapper/models/type_of_waste_meter_data_entry_method.py +18 -0
- epa_pm_api_wrapper/models/type_of_waste_meter_unit_of_measure.py +15 -0
- epa_pm_api_wrapper/models/un_auth_design_type.py +100 -0
- epa_pm_api_wrapper/models/un_auth_design_type_estimated_energy_list.py +17 -0
- epa_pm_api_wrapper/models/un_auth_design_type_property_uses.py +709 -0
- epa_pm_api_wrapper/models/un_auth_design_type_target.py +34 -0
- epa_pm_api_wrapper/models/ups_system_redundancy.py +16 -0
- epa_pm_api_wrapper/models/ups_system_redundancy_type.py +20 -0
- epa_pm_api_wrapper/models/ups_system_redundancy_type_value.py +12 -0
- epa_pm_api_wrapper/models/urgent_care_clinic_other_outpatient.py +17 -0
- epa_pm_api_wrapper/models/use_attribute_base.py +65 -0
- epa_pm_api_wrapper/models/use_attribute_base_default.py +9 -0
- epa_pm_api_wrapper/models/use_decimal_type.py +21 -0
- epa_pm_api_wrapper/models/use_details.py +1086 -0
- epa_pm_api_wrapper/models/use_integer_type.py +20 -0
- epa_pm_api_wrapper/models/use_string_type.py +19 -0
- epa_pm_api_wrapper/models/use_yes_no_type.py +20 -0
- epa_pm_api_wrapper/models/vehicle_dealership.py +16 -0
- epa_pm_api_wrapper/models/vehicle_dealership_type.py +37 -0
- epa_pm_api_wrapper/models/vehicle_dealership_type_use_details.py +84 -0
- epa_pm_api_wrapper/models/vehicle_repair_services.py +19 -0
- epa_pm_api_wrapper/models/vehicle_repair_services_type.py +37 -0
- epa_pm_api_wrapper/models/vehicle_repair_services_type_use_details.py +74 -0
- epa_pm_api_wrapper/models/verification.py +96 -0
- epa_pm_api_wrapper/models/veterinary_office.py +15 -0
- epa_pm_api_wrapper/models/vocational_school.py +16 -0
- epa_pm_api_wrapper/models/warning_type.py +29 -0
- epa_pm_api_wrapper/models/warnings_type.py +25 -0
- epa_pm_api_wrapper/models/waste_data.py +15 -0
- epa_pm_api_wrapper/models/waste_data_list.py +11 -0
- epa_pm_api_wrapper/models/waste_meter.py +11 -0
- epa_pm_api_wrapper/models/waste_meter_assoc_and_config_type.py +18 -0
- epa_pm_api_wrapper/models/waste_meter_data_type.py +32 -0
- epa_pm_api_wrapper/models/waste_meter_entry_type.py +113 -0
- epa_pm_api_wrapper/models/waste_meter_entry_type_average_percent_full.py +11 -0
- epa_pm_api_wrapper/models/waste_meter_type.py +81 -0
- epa_pm_api_wrapper/models/wastewater_treatment_plant.py +15 -0
- epa_pm_api_wrapper/models/wastewater_treatment_plant_type.py +37 -0
- epa_pm_api_wrapper/models/wastewater_treatment_plant_type_use_details.py +63 -0
- epa_pm_api_wrapper/models/water_meter_assoc_and_config_type.py +25 -0
- epa_pm_api_wrapper/models/weekly_building_occupied_hours.py +16 -0
- epa_pm_api_wrapper/models/weekly_operating_hours.py +19 -0
- epa_pm_api_wrapper/models/wholesale_club_supercenter.py +16 -0
- epa_pm_api_wrapper/models/wholesale_club_supercenter_type.py +37 -0
- epa_pm_api_wrapper/models/wholesale_club_supercenter_type_use_details.py +130 -0
- epa_pm_api_wrapper/models/worship_facility.py +19 -0
- epa_pm_api_wrapper/models/worship_facility_type.py +35 -0
- epa_pm_api_wrapper/models/worship_facility_type_use_details.py +102 -0
- epa_pm_api_wrapper/models/yes_no.py +8 -0
- epa_pm_api_wrapper/models/zoo.py +16 -0
- epa_pm_api_wrapper/py.typed +1 -0
- epa_pm_api_wrapper/resources/__init__.py +172 -0
- epa_pm_api_wrapper/resources/_base.py +22 -0
- epa_pm_api_wrapper/resources/account.py +37 -0
- epa_pm_api_wrapper/resources/association.py +145 -0
- epa_pm_api_wrapper/resources/building.py +89 -0
- epa_pm_api_wrapper/resources/consumption_data.py +142 -0
- epa_pm_api_wrapper/resources/custom_metric.py +91 -0
- epa_pm_api_wrapper/resources/customer.py +45 -0
- epa_pm_api_wrapper/resources/data_exchange.py +111 -0
- epa_pm_api_wrapper/resources/green_power.py +237 -0
- epa_pm_api_wrapper/resources/hey.py +22 -0
- epa_pm_api_wrapper/resources/hierarchy.py +59 -0
- epa_pm_api_wrapper/resources/identifier.py +92 -0
- epa_pm_api_wrapper/resources/meter.py +277 -0
- epa_pm_api_wrapper/resources/metrics.py +185 -0
- epa_pm_api_wrapper/resources/property.py +450 -0
- epa_pm_api_wrapper/resources/property_use.py +277 -0
- epa_pm_api_wrapper/resources/report.py +169 -0
- epa_pm_api_wrapper/resources/share.py +139 -0
- epa_pm_api_wrapper/resources/target_finder.py +34 -0
- epa_pm_api_wrapper/resources/verification.py +201 -0
- epa_pm_api_wrapper/resources/waste_data.py +124 -0
- epa_pm_api_wrapper/retry.py +219 -0
- epa_pm_api_wrapper-0.3.0.dist-info/METADATA +137 -0
- epa_pm_api_wrapper-0.3.0.dist-info/RECORD +654 -0
- epa_pm_api_wrapper-0.3.0.dist-info/WHEEL +4 -0
- epa_pm_api_wrapper-0.3.0.dist-info/entry_points.txt +2 -0
- epa_pm_api_wrapper-0.3.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"""ID hierarchy resource — `/idHierarchy/{resource}/{id}` endpoints."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from epa_pm_api_wrapper.models import Hierarchy
|
|
6
|
+
|
|
7
|
+
from ._base import AsyncResource, Resource
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class HierarchyResource(Resource):
|
|
11
|
+
def property(self, property_id: int) -> Hierarchy:
|
|
12
|
+
"""Get account/property identifiers for a property."""
|
|
13
|
+
return self._client._request("GET", f"idHierarchy/property/{property_id}", response_type=Hierarchy)
|
|
14
|
+
|
|
15
|
+
def meter(self, meter_id: int) -> Hierarchy:
|
|
16
|
+
"""Get account/property/meter identifiers for a meter."""
|
|
17
|
+
return self._client._request("GET", f"idHierarchy/meter/{meter_id}", response_type=Hierarchy)
|
|
18
|
+
|
|
19
|
+
def property_use(self, property_use_id: int) -> Hierarchy:
|
|
20
|
+
"""Get account/property/propertyUse identifiers for a property use."""
|
|
21
|
+
return self._client._request("GET", f"idHierarchy/propertyUse/{property_use_id}", response_type=Hierarchy)
|
|
22
|
+
|
|
23
|
+
def consumption_data(self, consumption_data_id: int) -> Hierarchy:
|
|
24
|
+
"""Get account/property/meter identifiers for a consumption data record."""
|
|
25
|
+
return self._client._request(
|
|
26
|
+
"GET", f"idHierarchy/consumptionData/{consumption_data_id}", response_type=Hierarchy
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
def use_details(self, use_details_id: int) -> Hierarchy:
|
|
30
|
+
"""Get account/property/propertyUse identifiers for a use-details record."""
|
|
31
|
+
return self._client._request("GET", f"idHierarchy/useDetails/{use_details_id}", response_type=Hierarchy)
|
|
32
|
+
|
|
33
|
+
def waste_data(self, waste_data_id: int) -> Hierarchy:
|
|
34
|
+
"""Get account/property/meter identifiers for a waste-data record."""
|
|
35
|
+
return self._client._request("GET", f"idHierarchy/wasteData/{waste_data_id}", response_type=Hierarchy)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class AsyncHierarchyResource(AsyncResource):
|
|
39
|
+
async def property(self, property_id: int) -> Hierarchy:
|
|
40
|
+
return await self._client._arequest("GET", f"idHierarchy/property/{property_id}", response_type=Hierarchy)
|
|
41
|
+
|
|
42
|
+
async def meter(self, meter_id: int) -> Hierarchy:
|
|
43
|
+
return await self._client._arequest("GET", f"idHierarchy/meter/{meter_id}", response_type=Hierarchy)
|
|
44
|
+
|
|
45
|
+
async def property_use(self, property_use_id: int) -> Hierarchy:
|
|
46
|
+
return await self._client._arequest(
|
|
47
|
+
"GET", f"idHierarchy/propertyUse/{property_use_id}", response_type=Hierarchy
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
async def consumption_data(self, consumption_data_id: int) -> Hierarchy:
|
|
51
|
+
return await self._client._arequest(
|
|
52
|
+
"GET", f"idHierarchy/consumptionData/{consumption_data_id}", response_type=Hierarchy
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
async def use_details(self, use_details_id: int) -> Hierarchy:
|
|
56
|
+
return await self._client._arequest("GET", f"idHierarchy/useDetails/{use_details_id}", response_type=Hierarchy)
|
|
57
|
+
|
|
58
|
+
async def waste_data(self, waste_data_id: int) -> Hierarchy:
|
|
59
|
+
return await self._client._arequest("GET", f"idHierarchy/wasteData/{waste_data_id}", response_type=Hierarchy)
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"""Property additional identifier resource — `/property/{propertyId}/identifier`
|
|
2
|
+
endpoints plus the catalog at `/property/identifier/list`.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from epa_pm_api_wrapper.models import (
|
|
8
|
+
AdditionalIdentifier,
|
|
9
|
+
AdditionalIdentifiers,
|
|
10
|
+
AdditionalIdentifierTypes,
|
|
11
|
+
Response,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
from ._base import AsyncResource, Resource
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class IdentifierResource(Resource):
|
|
18
|
+
def list(self, property_id: int) -> AdditionalIdentifiers:
|
|
19
|
+
"""List additional identifiers attached to a property."""
|
|
20
|
+
return self._client._request(
|
|
21
|
+
"GET", f"property/{property_id}/identifier/list", response_type=AdditionalIdentifiers
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
def add(self, property_id: int, data: AdditionalIdentifier) -> Response:
|
|
25
|
+
"""Add an additional identifier to a property."""
|
|
26
|
+
return self._client._request("POST", f"property/{property_id}/identifier", data=data, response_type=Response)
|
|
27
|
+
|
|
28
|
+
def get(self, property_id: int, identifier_id: int) -> AdditionalIdentifier:
|
|
29
|
+
"""Get a specific additional identifier on a property."""
|
|
30
|
+
return self._client._request(
|
|
31
|
+
"GET",
|
|
32
|
+
f"property/{property_id}/identifier/{identifier_id}",
|
|
33
|
+
response_type=AdditionalIdentifier,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
def update(self, property_id: int, identifier_id: int, data: AdditionalIdentifier) -> Response:
|
|
37
|
+
"""Update a specific additional identifier on a property."""
|
|
38
|
+
return self._client._request(
|
|
39
|
+
"PUT",
|
|
40
|
+
f"property/{property_id}/identifier/{identifier_id}",
|
|
41
|
+
data=data,
|
|
42
|
+
response_type=Response,
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
def delete(self, property_id: int, identifier_id: int) -> Response:
|
|
46
|
+
"""Remove a specific additional identifier from a property."""
|
|
47
|
+
return self._client._request(
|
|
48
|
+
"DELETE",
|
|
49
|
+
f"property/{property_id}/identifier/{identifier_id}",
|
|
50
|
+
response_type=Response,
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
def types(self) -> AdditionalIdentifierTypes:
|
|
54
|
+
"""List EPA-approved additional identifier types (catalog)."""
|
|
55
|
+
return self._client._request("GET", "property/identifier/list", response_type=AdditionalIdentifierTypes)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class AsyncIdentifierResource(AsyncResource):
|
|
59
|
+
async def list(self, property_id: int) -> AdditionalIdentifiers:
|
|
60
|
+
return await self._client._arequest(
|
|
61
|
+
"GET", f"property/{property_id}/identifier/list", response_type=AdditionalIdentifiers
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
async def add(self, property_id: int, data: AdditionalIdentifier) -> Response:
|
|
65
|
+
return await self._client._arequest(
|
|
66
|
+
"POST", f"property/{property_id}/identifier", data=data, response_type=Response
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
async def get(self, property_id: int, identifier_id: int) -> AdditionalIdentifier:
|
|
70
|
+
return await self._client._arequest(
|
|
71
|
+
"GET",
|
|
72
|
+
f"property/{property_id}/identifier/{identifier_id}",
|
|
73
|
+
response_type=AdditionalIdentifier,
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
async def update(self, property_id: int, identifier_id: int, data: AdditionalIdentifier) -> Response:
|
|
77
|
+
return await self._client._arequest(
|
|
78
|
+
"PUT",
|
|
79
|
+
f"property/{property_id}/identifier/{identifier_id}",
|
|
80
|
+
data=data,
|
|
81
|
+
response_type=Response,
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
async def delete(self, property_id: int, identifier_id: int) -> Response:
|
|
85
|
+
return await self._client._arequest(
|
|
86
|
+
"DELETE",
|
|
87
|
+
f"property/{property_id}/identifier/{identifier_id}",
|
|
88
|
+
response_type=Response,
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
async def types(self) -> AdditionalIdentifierTypes:
|
|
92
|
+
return await self._client._arequest("GET", "property/identifier/list", response_type=AdditionalIdentifierTypes)
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
"""Meter resource — `/meter` and `/property/{propertyId}/meter` endpoints."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING
|
|
6
|
+
|
|
7
|
+
from epa_pm_api_wrapper.models import (
|
|
8
|
+
AdditionalIdentifier,
|
|
9
|
+
AdditionalIdentifiers,
|
|
10
|
+
AdditionalIdentifierTypes,
|
|
11
|
+
CustomFieldList,
|
|
12
|
+
IndividualMeter,
|
|
13
|
+
Meter,
|
|
14
|
+
Response,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
from ._base import AsyncResource, Resource
|
|
18
|
+
|
|
19
|
+
if TYPE_CHECKING:
|
|
20
|
+
from epa_pm_api_wrapper.client import EpaPmAsyncClient, EpaPmClient
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class MeterIdentifierResource(Resource):
|
|
24
|
+
"""Mirrors :class:`IdentifierResource` but for meter identifiers."""
|
|
25
|
+
|
|
26
|
+
def list(self, meter_id: int) -> AdditionalIdentifiers:
|
|
27
|
+
"""List additional identifiers attached to a meter."""
|
|
28
|
+
return self._client._request("GET", f"meter/{meter_id}/identifier/list", response_type=AdditionalIdentifiers)
|
|
29
|
+
|
|
30
|
+
def add(self, meter_id: int, data: AdditionalIdentifier) -> Response:
|
|
31
|
+
"""Add an additional identifier to a meter."""
|
|
32
|
+
return self._client._request("POST", f"meter/{meter_id}/identifier", data=data, response_type=Response)
|
|
33
|
+
|
|
34
|
+
def get(self, meter_id: int, identifier_id: int) -> AdditionalIdentifier:
|
|
35
|
+
"""Get a specific additional identifier on a meter."""
|
|
36
|
+
return self._client._request(
|
|
37
|
+
"GET",
|
|
38
|
+
f"meter/{meter_id}/identifier/{identifier_id}",
|
|
39
|
+
response_type=AdditionalIdentifier,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
def update(self, meter_id: int, identifier_id: int, data: AdditionalIdentifier) -> Response:
|
|
43
|
+
"""Update a specific additional identifier on a meter."""
|
|
44
|
+
return self._client._request(
|
|
45
|
+
"PUT",
|
|
46
|
+
f"meter/{meter_id}/identifier/{identifier_id}",
|
|
47
|
+
data=data,
|
|
48
|
+
response_type=Response,
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
def delete(self, meter_id: int, identifier_id: int) -> Response:
|
|
52
|
+
"""Remove a specific additional identifier from a meter."""
|
|
53
|
+
return self._client._request(
|
|
54
|
+
"DELETE",
|
|
55
|
+
f"meter/{meter_id}/identifier/{identifier_id}",
|
|
56
|
+
response_type=Response,
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
def types(self) -> AdditionalIdentifierTypes:
|
|
60
|
+
"""List EPA-approved additional identifier types for meters (catalog)."""
|
|
61
|
+
return self._client._request("GET", "meter/identifier/list", response_type=AdditionalIdentifierTypes)
|
|
62
|
+
|
|
63
|
+
def list_for_property(self, property_id: int) -> AdditionalIdentifiers:
|
|
64
|
+
"""List identifier values across all meters of a property."""
|
|
65
|
+
return self._client._request(
|
|
66
|
+
"GET",
|
|
67
|
+
f"property/{property_id}/meter/identifier/list",
|
|
68
|
+
response_type=AdditionalIdentifiers,
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class AggregateMeterResource(Resource):
|
|
73
|
+
"""Aggregation operations on a meter — get aggregate info, manage individual meters.
|
|
74
|
+
|
|
75
|
+
Note the URL split: list/add operations on the parent meter use ``/meter/{id}/...``,
|
|
76
|
+
but individual-meter records have their own top-level path ``/meter/individual/{id}``.
|
|
77
|
+
"""
|
|
78
|
+
|
|
79
|
+
def get(self, meter_id: int) -> Meter:
|
|
80
|
+
"""Get aggregate meter info (returns the meter with its ``aggregateMeter`` flag)."""
|
|
81
|
+
return self._client._request("GET", f"meter/{meter_id}/aggregateMeter", response_type=Meter)
|
|
82
|
+
|
|
83
|
+
def list_individuals(self, meter_id: int) -> Response:
|
|
84
|
+
"""List individual meters that compose an aggregate meter."""
|
|
85
|
+
return self._client._request("GET", f"meter/{meter_id}/individual/list", response_type=Response)
|
|
86
|
+
|
|
87
|
+
def add_individual(self, meter_id: int, data: IndividualMeter) -> Response:
|
|
88
|
+
"""Add an individual meter to an aggregate."""
|
|
89
|
+
return self._client._request("POST", f"meter/{meter_id}/individual", data=data, response_type=Response)
|
|
90
|
+
|
|
91
|
+
def delete_all_individuals(self, meter_id: int) -> Response:
|
|
92
|
+
"""Remove every individual meter from an aggregate."""
|
|
93
|
+
return self._client._request("DELETE", f"meter/{meter_id}/individual", response_type=Response)
|
|
94
|
+
|
|
95
|
+
def get_individual(self, individual_meter_id: int) -> IndividualMeter:
|
|
96
|
+
"""Get a specific individual meter record."""
|
|
97
|
+
return self._client._request("GET", f"meter/individual/{individual_meter_id}", response_type=IndividualMeter)
|
|
98
|
+
|
|
99
|
+
def update_individual(self, individual_meter_id: int, data: IndividualMeter) -> Response:
|
|
100
|
+
"""Update a specific individual meter record."""
|
|
101
|
+
return self._client._request(
|
|
102
|
+
"PUT", f"meter/individual/{individual_meter_id}", data=data, response_type=Response
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
def delete_individual(self, individual_meter_id: int) -> Response:
|
|
106
|
+
"""Remove a specific individual meter from its aggregate."""
|
|
107
|
+
return self._client._request("DELETE", f"meter/individual/{individual_meter_id}", response_type=Response)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
class MeterResource(Resource):
|
|
111
|
+
def __init__(self, client: EpaPmClient) -> None:
|
|
112
|
+
super().__init__(client)
|
|
113
|
+
self.aggregate = AggregateMeterResource(client)
|
|
114
|
+
self.identifier = MeterIdentifierResource(client)
|
|
115
|
+
|
|
116
|
+
def list(self, property_id: int, my_access_only: bool | None = None) -> Response:
|
|
117
|
+
"""List meters under a property."""
|
|
118
|
+
params = {"myAccessOnly": "true" if my_access_only else "false"} if my_access_only is not None else None
|
|
119
|
+
return self._client._request("GET", f"property/{property_id}/meter/list", params=params, response_type=Response)
|
|
120
|
+
|
|
121
|
+
def get(self, meter_id: int) -> Meter:
|
|
122
|
+
"""Get details for a specific meter."""
|
|
123
|
+
return self._client._request("GET", f"meter/{meter_id}", response_type=Meter)
|
|
124
|
+
|
|
125
|
+
def create(self, property_id: int, meter_data: Meter) -> Response:
|
|
126
|
+
"""Add a new meter under a property."""
|
|
127
|
+
return self._client._request("POST", f"property/{property_id}/meter", data=meter_data, response_type=Response)
|
|
128
|
+
|
|
129
|
+
def update(self, meter_id: int, meter_data: Meter) -> Response:
|
|
130
|
+
"""Update an existing meter."""
|
|
131
|
+
return self._client._request("PUT", f"meter/{meter_id}", data=meter_data, response_type=Response)
|
|
132
|
+
|
|
133
|
+
def delete(self, meter_id: int) -> Response:
|
|
134
|
+
"""Delete a meter."""
|
|
135
|
+
return self._client._request("DELETE", f"meter/{meter_id}", response_type=Response)
|
|
136
|
+
|
|
137
|
+
def custom_fields(self, meter_id: int) -> CustomFieldList:
|
|
138
|
+
"""List custom field values stored on a meter."""
|
|
139
|
+
return self._client._request("GET", f"meter/{meter_id}/customFieldList", response_type=CustomFieldList)
|
|
140
|
+
|
|
141
|
+
def what_changed(
|
|
142
|
+
self,
|
|
143
|
+
customer_id: int | None = None,
|
|
144
|
+
property_id: int | None = None,
|
|
145
|
+
date: str | None = None,
|
|
146
|
+
) -> Response:
|
|
147
|
+
"""List meters modified on/after ``date`` (YYYY-MM-DD).
|
|
148
|
+
|
|
149
|
+
Pass exactly one of ``customer_id`` (scopes to all meters under a connected
|
|
150
|
+
customer) or ``property_id`` (scopes to one property's meters).
|
|
151
|
+
"""
|
|
152
|
+
if (customer_id is None) == (property_id is None):
|
|
153
|
+
raise ValueError("Pass exactly one of customer_id or property_id")
|
|
154
|
+
if date is None:
|
|
155
|
+
raise ValueError("date is required (YYYY-MM-DD)")
|
|
156
|
+
path = (
|
|
157
|
+
f"customer/{customer_id}/meter/whatChanged"
|
|
158
|
+
if customer_id is not None
|
|
159
|
+
else f"property/{property_id}/meter/whatChanged"
|
|
160
|
+
)
|
|
161
|
+
return self._client._request("GET", path, params={"date": date}, response_type=Response)
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
class AsyncMeterIdentifierResource(AsyncResource):
|
|
165
|
+
async def list(self, meter_id: int) -> AdditionalIdentifiers:
|
|
166
|
+
return await self._client._arequest(
|
|
167
|
+
"GET", f"meter/{meter_id}/identifier/list", response_type=AdditionalIdentifiers
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
async def add(self, meter_id: int, data: AdditionalIdentifier) -> Response:
|
|
171
|
+
return await self._client._arequest("POST", f"meter/{meter_id}/identifier", data=data, response_type=Response)
|
|
172
|
+
|
|
173
|
+
async def get(self, meter_id: int, identifier_id: int) -> AdditionalIdentifier:
|
|
174
|
+
return await self._client._arequest(
|
|
175
|
+
"GET",
|
|
176
|
+
f"meter/{meter_id}/identifier/{identifier_id}",
|
|
177
|
+
response_type=AdditionalIdentifier,
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
async def update(self, meter_id: int, identifier_id: int, data: AdditionalIdentifier) -> Response:
|
|
181
|
+
return await self._client._arequest(
|
|
182
|
+
"PUT",
|
|
183
|
+
f"meter/{meter_id}/identifier/{identifier_id}",
|
|
184
|
+
data=data,
|
|
185
|
+
response_type=Response,
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
async def delete(self, meter_id: int, identifier_id: int) -> Response:
|
|
189
|
+
return await self._client._arequest(
|
|
190
|
+
"DELETE",
|
|
191
|
+
f"meter/{meter_id}/identifier/{identifier_id}",
|
|
192
|
+
response_type=Response,
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
async def types(self) -> AdditionalIdentifierTypes:
|
|
196
|
+
return await self._client._arequest("GET", "meter/identifier/list", response_type=AdditionalIdentifierTypes)
|
|
197
|
+
|
|
198
|
+
async def list_for_property(self, property_id: int) -> AdditionalIdentifiers:
|
|
199
|
+
return await self._client._arequest(
|
|
200
|
+
"GET",
|
|
201
|
+
f"property/{property_id}/meter/identifier/list",
|
|
202
|
+
response_type=AdditionalIdentifiers,
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
class AsyncAggregateMeterResource(AsyncResource):
|
|
207
|
+
async def get(self, meter_id: int) -> Meter:
|
|
208
|
+
return await self._client._arequest("GET", f"meter/{meter_id}/aggregateMeter", response_type=Meter)
|
|
209
|
+
|
|
210
|
+
async def list_individuals(self, meter_id: int) -> Response:
|
|
211
|
+
return await self._client._arequest("GET", f"meter/{meter_id}/individual/list", response_type=Response)
|
|
212
|
+
|
|
213
|
+
async def add_individual(self, meter_id: int, data: IndividualMeter) -> Response:
|
|
214
|
+
return await self._client._arequest("POST", f"meter/{meter_id}/individual", data=data, response_type=Response)
|
|
215
|
+
|
|
216
|
+
async def delete_all_individuals(self, meter_id: int) -> Response:
|
|
217
|
+
return await self._client._arequest("DELETE", f"meter/{meter_id}/individual", response_type=Response)
|
|
218
|
+
|
|
219
|
+
async def get_individual(self, individual_meter_id: int) -> IndividualMeter:
|
|
220
|
+
return await self._client._arequest(
|
|
221
|
+
"GET", f"meter/individual/{individual_meter_id}", response_type=IndividualMeter
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
async def update_individual(self, individual_meter_id: int, data: IndividualMeter) -> Response:
|
|
225
|
+
return await self._client._arequest(
|
|
226
|
+
"PUT", f"meter/individual/{individual_meter_id}", data=data, response_type=Response
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
async def delete_individual(self, individual_meter_id: int) -> Response:
|
|
230
|
+
return await self._client._arequest("DELETE", f"meter/individual/{individual_meter_id}", response_type=Response)
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
class AsyncMeterResource(AsyncResource):
|
|
234
|
+
def __init__(self, client: EpaPmAsyncClient) -> None:
|
|
235
|
+
super().__init__(client)
|
|
236
|
+
self.aggregate = AsyncAggregateMeterResource(client)
|
|
237
|
+
self.identifier = AsyncMeterIdentifierResource(client)
|
|
238
|
+
|
|
239
|
+
async def list(self, property_id: int, my_access_only: bool | None = None) -> Response:
|
|
240
|
+
params = {"myAccessOnly": "true" if my_access_only else "false"} if my_access_only is not None else None
|
|
241
|
+
return await self._client._arequest(
|
|
242
|
+
"GET", f"property/{property_id}/meter/list", params=params, response_type=Response
|
|
243
|
+
)
|
|
244
|
+
|
|
245
|
+
async def get(self, meter_id: int) -> Meter:
|
|
246
|
+
return await self._client._arequest("GET", f"meter/{meter_id}", response_type=Meter)
|
|
247
|
+
|
|
248
|
+
async def create(self, property_id: int, meter_data: Meter) -> Response:
|
|
249
|
+
return await self._client._arequest(
|
|
250
|
+
"POST", f"property/{property_id}/meter", data=meter_data, response_type=Response
|
|
251
|
+
)
|
|
252
|
+
|
|
253
|
+
async def update(self, meter_id: int, meter_data: Meter) -> Response:
|
|
254
|
+
return await self._client._arequest("PUT", f"meter/{meter_id}", data=meter_data, response_type=Response)
|
|
255
|
+
|
|
256
|
+
async def delete(self, meter_id: int) -> Response:
|
|
257
|
+
return await self._client._arequest("DELETE", f"meter/{meter_id}", response_type=Response)
|
|
258
|
+
|
|
259
|
+
async def custom_fields(self, meter_id: int) -> CustomFieldList:
|
|
260
|
+
return await self._client._arequest("GET", f"meter/{meter_id}/customFieldList", response_type=CustomFieldList)
|
|
261
|
+
|
|
262
|
+
async def what_changed(
|
|
263
|
+
self,
|
|
264
|
+
customer_id: int | None = None,
|
|
265
|
+
property_id: int | None = None,
|
|
266
|
+
date: str | None = None,
|
|
267
|
+
) -> Response:
|
|
268
|
+
if (customer_id is None) == (property_id is None):
|
|
269
|
+
raise ValueError("Pass exactly one of customer_id or property_id")
|
|
270
|
+
if date is None:
|
|
271
|
+
raise ValueError("date is required (YYYY-MM-DD)")
|
|
272
|
+
path = (
|
|
273
|
+
f"customer/{customer_id}/meter/whatChanged"
|
|
274
|
+
if customer_id is not None
|
|
275
|
+
else f"property/{property_id}/meter/whatChanged"
|
|
276
|
+
)
|
|
277
|
+
return await self._client._arequest("GET", path, params={"date": date}, response_type=Response)
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"""Property metrics resource — `/property/{propertyId}/metrics*` and
|
|
2
|
+
`/property/{propertyId}/reasonsFor*` endpoints.
|
|
3
|
+
|
|
4
|
+
All four metric endpoints take the metric specification via the ``PM-Metrics``
|
|
5
|
+
HTTP header (comma-separated list of metric names — the same names returned by
|
|
6
|
+
``client.report.metrics``). ``measurementSystem`` is a query param; valid values
|
|
7
|
+
include "EPA" and "EU". Each endpoint validates which metric names it accepts,
|
|
8
|
+
so a metric valid for ``/metrics`` may be rejected by ``/metrics/monthly``.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from epa_pm_api_wrapper.models import Alerts, PropertyMetrics
|
|
14
|
+
|
|
15
|
+
from ._base import AsyncResource, Resource
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _metric_header(metrics: list[str] | str) -> str:
|
|
19
|
+
return metrics if isinstance(metrics, str) else ",".join(metrics)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class MetricsResource(Resource):
|
|
23
|
+
def get(
|
|
24
|
+
self,
|
|
25
|
+
property_id: int,
|
|
26
|
+
metrics: list[str] | str,
|
|
27
|
+
year: int,
|
|
28
|
+
month: int,
|
|
29
|
+
measurement_system: str = "EPA",
|
|
30
|
+
) -> PropertyMetrics:
|
|
31
|
+
"""Get period-ending metric values for a property."""
|
|
32
|
+
return self._client._request(
|
|
33
|
+
"GET",
|
|
34
|
+
f"property/{property_id}/metrics",
|
|
35
|
+
params={"year": year, "month": month, "measurementSystem": measurement_system},
|
|
36
|
+
extra_headers={"PM-Metrics": _metric_header(metrics)},
|
|
37
|
+
response_type=PropertyMetrics,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
def monthly(
|
|
41
|
+
self,
|
|
42
|
+
property_id: int,
|
|
43
|
+
metrics: list[str] | str,
|
|
44
|
+
year: int,
|
|
45
|
+
month: int,
|
|
46
|
+
measurement_system: str = "EPA",
|
|
47
|
+
) -> PropertyMetrics:
|
|
48
|
+
"""Get monthly metric values for a property."""
|
|
49
|
+
return self._client._request(
|
|
50
|
+
"GET",
|
|
51
|
+
f"property/{property_id}/metrics/monthly",
|
|
52
|
+
params={"year": year, "month": month, "measurementSystem": measurement_system},
|
|
53
|
+
extra_headers={"PM-Metrics": _metric_header(metrics)},
|
|
54
|
+
response_type=PropertyMetrics,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
def use_details(
|
|
58
|
+
self,
|
|
59
|
+
property_id: int,
|
|
60
|
+
metrics: list[str] | str,
|
|
61
|
+
year: int,
|
|
62
|
+
month: int,
|
|
63
|
+
measurement_system: str = "EPA",
|
|
64
|
+
) -> PropertyMetrics:
|
|
65
|
+
"""Get time-weighted use-detail metric values for a property."""
|
|
66
|
+
return self._client._request(
|
|
67
|
+
"GET",
|
|
68
|
+
f"property/{property_id}/useDetails/metrics",
|
|
69
|
+
params={"year": year, "month": month, "measurementSystem": measurement_system},
|
|
70
|
+
extra_headers={"PM-Metrics": _metric_header(metrics)},
|
|
71
|
+
response_type=PropertyMetrics,
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
def design(
|
|
75
|
+
self,
|
|
76
|
+
property_id: int,
|
|
77
|
+
metrics: list[str] | str,
|
|
78
|
+
measurement_system: str = "EPA",
|
|
79
|
+
) -> PropertyMetrics:
|
|
80
|
+
"""Get metric values for a property design (no time period)."""
|
|
81
|
+
return self._client._request(
|
|
82
|
+
"GET",
|
|
83
|
+
f"property/{property_id}/design/metrics",
|
|
84
|
+
params={"measurementSystem": measurement_system},
|
|
85
|
+
extra_headers={"PM-Metrics": _metric_header(metrics)},
|
|
86
|
+
response_type=PropertyMetrics,
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
def reasons_for_no_score(self, property_id: int, year: int, month: int) -> Alerts:
|
|
90
|
+
"""Explain why a property cannot receive an ENERGY STAR score for a period."""
|
|
91
|
+
return self._client._request(
|
|
92
|
+
"GET",
|
|
93
|
+
f"property/{property_id}/reasonsForNoScore",
|
|
94
|
+
params={"year": year, "month": month},
|
|
95
|
+
response_type=Alerts,
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
def reasons_for_no_water_score(self, property_id: int, year: int, month: int) -> Alerts:
|
|
99
|
+
"""Explain why a property cannot receive an ENERGY STAR water score for a period."""
|
|
100
|
+
return self._client._request(
|
|
101
|
+
"GET",
|
|
102
|
+
f"property/{property_id}/reasonsForNoWaterScore",
|
|
103
|
+
params={"year": year, "month": month},
|
|
104
|
+
response_type=Alerts,
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
class AsyncMetricsResource(AsyncResource):
|
|
109
|
+
async def get(
|
|
110
|
+
self,
|
|
111
|
+
property_id: int,
|
|
112
|
+
metrics: list[str] | str,
|
|
113
|
+
year: int,
|
|
114
|
+
month: int,
|
|
115
|
+
measurement_system: str = "EPA",
|
|
116
|
+
) -> PropertyMetrics:
|
|
117
|
+
return await self._client._arequest(
|
|
118
|
+
"GET",
|
|
119
|
+
f"property/{property_id}/metrics",
|
|
120
|
+
params={"year": year, "month": month, "measurementSystem": measurement_system},
|
|
121
|
+
extra_headers={"PM-Metrics": _metric_header(metrics)},
|
|
122
|
+
response_type=PropertyMetrics,
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
async def monthly(
|
|
126
|
+
self,
|
|
127
|
+
property_id: int,
|
|
128
|
+
metrics: list[str] | str,
|
|
129
|
+
year: int,
|
|
130
|
+
month: int,
|
|
131
|
+
measurement_system: str = "EPA",
|
|
132
|
+
) -> PropertyMetrics:
|
|
133
|
+
return await self._client._arequest(
|
|
134
|
+
"GET",
|
|
135
|
+
f"property/{property_id}/metrics/monthly",
|
|
136
|
+
params={"year": year, "month": month, "measurementSystem": measurement_system},
|
|
137
|
+
extra_headers={"PM-Metrics": _metric_header(metrics)},
|
|
138
|
+
response_type=PropertyMetrics,
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
async def use_details(
|
|
142
|
+
self,
|
|
143
|
+
property_id: int,
|
|
144
|
+
metrics: list[str] | str,
|
|
145
|
+
year: int,
|
|
146
|
+
month: int,
|
|
147
|
+
measurement_system: str = "EPA",
|
|
148
|
+
) -> PropertyMetrics:
|
|
149
|
+
return await self._client._arequest(
|
|
150
|
+
"GET",
|
|
151
|
+
f"property/{property_id}/useDetails/metrics",
|
|
152
|
+
params={"year": year, "month": month, "measurementSystem": measurement_system},
|
|
153
|
+
extra_headers={"PM-Metrics": _metric_header(metrics)},
|
|
154
|
+
response_type=PropertyMetrics,
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
async def design(
|
|
158
|
+
self,
|
|
159
|
+
property_id: int,
|
|
160
|
+
metrics: list[str] | str,
|
|
161
|
+
measurement_system: str = "EPA",
|
|
162
|
+
) -> PropertyMetrics:
|
|
163
|
+
return await self._client._arequest(
|
|
164
|
+
"GET",
|
|
165
|
+
f"property/{property_id}/design/metrics",
|
|
166
|
+
params={"measurementSystem": measurement_system},
|
|
167
|
+
extra_headers={"PM-Metrics": _metric_header(metrics)},
|
|
168
|
+
response_type=PropertyMetrics,
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
async def reasons_for_no_score(self, property_id: int, year: int, month: int) -> Alerts:
|
|
172
|
+
return await self._client._arequest(
|
|
173
|
+
"GET",
|
|
174
|
+
f"property/{property_id}/reasonsForNoScore",
|
|
175
|
+
params={"year": year, "month": month},
|
|
176
|
+
response_type=Alerts,
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
async def reasons_for_no_water_score(self, property_id: int, year: int, month: int) -> Alerts:
|
|
180
|
+
return await self._client._arequest(
|
|
181
|
+
"GET",
|
|
182
|
+
f"property/{property_id}/reasonsForNoWaterScore",
|
|
183
|
+
params={"year": year, "month": month},
|
|
184
|
+
response_type=Alerts,
|
|
185
|
+
)
|