diff --git a/.idea/Model.iml b/.idea/Model.iml
index c6561970..09f2e496 100644
--- a/.idea/Model.iml
+++ b/.idea/Model.iml
@@ -7,7 +7,7 @@
-
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 50cad4ca..fb10c6b0 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -3,7 +3,7 @@
-
+
diff --git a/asset_list/AssetList.py b/asset_list/AssetList.py
index dce929ae..da20432b 100644
--- a/asset_list/AssetList.py
+++ b/asset_list/AssetList.py
@@ -309,6 +309,17 @@ class AssetList:
'NAME OF SURVEYOR'
]
+ # Solar non-intrusive fields
+ NON_INTRUSIVES_SOLAR_COLNAMES = [
+ 'PV, ACCESS ISSUE, SEE NOTES', 'ROOF ORIENTATION',
+ 'AREA (m²) OF ROOF WHERE PV WILL BE SITUATED ', 'SHADING',
+ 'Roof Tiles - CONCRETE/SLATE/ROSEMARY',
+ 'NO. OF PANELS (Typical size of 420W panel is 1mx1.7m and need 30cm all the way around panels)',
+ 'SCAFFOLD REQUIRED? IF YES, ARE THERE ANY SURROUNDING ACCESS ISSUES - PLEASE DESCRIBE',
+ 'IF PANELS ARE GOING ON REAR PLEASE CHECK FOR SPACE FOR SCAFFOLDING - DESCRIBE ANY ISSUES BELOW',
+ 'DATE', 'NAME OF SURVEYOR'
+ ]
+
NON_INTRUSIVES_ELIGIBILITY_COLUMN = "Eligibility (Red/Yellow/Green)"
OLD_FORMAT_NON_INTRUSIVE_COLNAMES = ['WFT Findings', 'ECO Eligibility']
@@ -461,6 +472,8 @@ class AssetList:
self.new_format_non_insturives_present_v2 = 'TILE HUNG' in self.raw_asset_list.columns
+ self.solar_non_intrusives_present = "AREA (m²) OF ROOF WHERE PV WILL BE SITUATED" in self.raw_asset_list.columns
+
# Names of columns
self.landlord_property_id = landlord_property_id
self.address1_colname = address1_colname
@@ -774,6 +787,9 @@ class AssetList:
if self.new_format_non_insturives_present_v2:
non_intrusive_columns += self.NON_INTRUSIVES_NEW_FORMAT_COLNAMES_V2
+ if self.solar_non_intrusives_present:
+ non_intrusive_columns += self.NON_INTRUSIVES_SOLAR_COLNAMES
+
if self.old_format_non_intrusives_present:
# We check if we have the ECO Eligibility column, which we might not have
non_intrusive_columns = [
@@ -946,7 +962,7 @@ class AssetList:
if self.phase:
# We filter on just the properties that have had an inspection
- if self.new_format_non_insturives_present_v2:
+ if self.new_format_non_insturives_present_v2 or self.solar_non_intrusives_present:
self.standardised_asset_list = self.standardised_asset_list[
~self.standardised_asset_list['NAME OF SURVEYOR'].isin(
["YET TO BE SURVEYED", "", None]
@@ -1341,10 +1357,10 @@ class AssetList:
# for identifying cavity jobs
if self.non_intrusives_present and not self.old_format_non_intrusives_present:
- if self.new_format_non_insturives_present_v2:
+ if self.new_format_non_insturives_present_v2 or self.solar_non_intrusives_present:
existing_solar_non_intrusives_check = (
self.standardised_asset_list["non-intrusives: ROOF ORIENTATION"].str.strip().isin(
- ["ALREADY HAS SOLAR PV"]
+ ["ALREADY HAS SOLAR PV", "ALREADY HAS PV"]
)
)
else:
diff --git a/asset_list/app.py b/asset_list/app.py
index 833050fb..2903e083 100644
--- a/asset_list/app.py
+++ b/asset_list/app.py
@@ -59,6 +59,74 @@ def app():
Property UPRN
"""
+ # Hyde - solar
+ data_folder = "/Users/khalimconn-kowlessar/Documents/hestia/Customers/Hyde/Solar"
+ data_filename = "Domna Property Analysis HYDE (Chichester Removed).xlsx"
+ sheet_name = "Electric Property Inspections"
+ postcode_column = 'Postcode'
+ address1_column = None # Is only patchily populated so we create it
+ address1_method = 'house_number_extraction'
+ fulladdress_column = "Address"
+ address_cols_to_concat = []
+ missing_postcodes_method = None
+ landlord_year_built = None
+ landlord_os_uprn = None
+ landlord_property_type = "Property Type"
+ landlord_built_form = "Property Type"
+ landlord_wall_construction = "Walls "
+ landlord_roof_construction = "Roofs"
+ landlord_heating_system = "Heating"
+ landlord_existing_pv = None
+ landlord_property_id = "Address ID"
+ landlord_sap = "SAP"
+ outcomes_filename = None
+ outcomes_sheetname = None
+ outcomes_postcode = None
+ outcomes_houseno = None
+ outcomes_id = None
+ outcomes_address = None
+ master_filepaths = []
+ master_id_colnames = []
+ master_to_asset_list_filepath = None
+ phase = True
+ ecosurv_landlords = None
+ asset_list_header = 0
+ landlord_block_reference = None
+
+ # Hyde cavity
+ data_folder = "/Users/khalimconn-kowlessar/Documents/hestia/Customers/Hyde/Cavity"
+ data_filename = "Domna Property Analysis HYDE (Chichester Removed).xlsx"
+ sheet_name = "Cavity Inspections"
+ postcode_column = 'Postcode'
+ address1_column = None # Is only patchily populated so we create it
+ address1_method = 'house_number_extraction'
+ fulladdress_column = "Address"
+ address_cols_to_concat = []
+ missing_postcodes_method = None
+ landlord_year_built = None
+ landlord_os_uprn = None
+ landlord_property_type = "Property Type"
+ landlord_built_form = "Property Type"
+ landlord_wall_construction = "Walls "
+ landlord_roof_construction = "Roofs"
+ landlord_heating_system = "Heating"
+ landlord_existing_pv = None
+ landlord_property_id = "Address ID"
+ landlord_sap = "SAP"
+ outcomes_filename = None
+ outcomes_sheetname = None
+ outcomes_postcode = None
+ outcomes_houseno = None
+ outcomes_id = None
+ outcomes_address = None
+ master_filepaths = []
+ master_id_colnames = []
+ master_to_asset_list_filepath = None
+ phase = True
+ ecosurv_landlords = None
+ asset_list_header = 0
+ landlord_block_reference = None
+
# CDS - Sept 2025
data_folder = "/Users/khalimconn-kowlessar/Documents/hestia/Customers/CDS/September 2025 Programme"
data_filename = "Founder Estates CDS.xlsx"
diff --git a/asset_list/mappings/built_form.py b/asset_list/mappings/built_form.py
index bdd82883..b02b8810 100644
--- a/asset_list/mappings/built_form.py
+++ b/asset_list/mappings/built_form.py
@@ -439,5 +439,23 @@ BUILT_FORM_MAPPINGS = {
'Chalet - Wheelchair': 'unknown',
'Studio Flat': 'unknown',
'Bungalow - Attached': 'semi-detached',
- 'ND': 'unknown'
+ 'ND': 'unknown',
+
+ 'Maisonette: Mid Terrace: Mid Floor': 'mid-floor',
+ 'Maisonette: Semi Detached: Ground Floor': 'semi-detached',
+ 'Maisonette: Enclosed Mid Terrace: Ground Floor': 'enclosed mid-terrace',
+ 'Maisonette: Enclosed End Terrace: Ground Floor': 'end-terrace',
+ 'Maisonette: Mid Terrace: Ground Floor': 'mid-terrace',
+ 'Flat: Semi Detached: Basement': 'semi-detached',
+ 'Maisonette: Semi Detached: Top Floor': 'semi-detached',
+ 'Maisonette: Enclosed Mid Terrace: Mid Floor': 'enclosed mid-terrace',
+ 'Flat: Detached: Basement': 'detached',
+ 'Maisonette: Enclosed Mid Terrace: Top Floor': 'enclosed mid-terrace',
+
+ 'Maisonette: End Terrace: Top Floor': 'top-floor',
+ 'House: Mid Terrace: Ground Floor': 'ground floor',
+ 'Maisonette: Semi Detached: Mid Floor': 'detached',
+ 'Maisonette: Detached: Mid Floor': 'detached',
+ 'Bungalow: EnclosedMidTerrace': 'enclosed mid-terrace'
+
}
diff --git a/asset_list/mappings/heating_systems.py b/asset_list/mappings/heating_systems.py
index 4ab8ca72..ffd1b198 100644
--- a/asset_list/mappings/heating_systems.py
+++ b/asset_list/mappings/heating_systems.py
@@ -477,6 +477,23 @@ HEATING_MAPPINGS = {
'Heat networks Heat networks (mains gas)': 'communal heating',
'ND Oil': 'oil fuel',
- 'Boiler Biofuel': 'boiler - other fuel'
+ 'Boiler Biofuel': 'boiler - other fuel',
+
+ 'Electric (direct acting) room heaters: Water- or oil-filled radiators': 'room heaters',
+ 'Other: Electric ceiling heating': 'electric ceiling',
+ 'Heat Pump: Electric Heat pumps: Air source heat pump with flow temperature <= 35°C': 'air source heat pump',
+ 'Oil room heaters: Room heater, 2000 or later': 'room heaters',
+ 'Electric Underfloor Heating: In screed above insulation (standard or off peak)': 'electric underfloor',
+ 'Heat Pump: Electric Heat pumps: Air source heat pump in other cases': 'air source heat pump',
+ 'Electric Storage Systems: Old (large volume) storage heaters': 'electric storage heaters',
+
+ 'Gas (including LPG) room heaters: Condensing gas fire': 'room heaters',
+ 'Solid fuel room heaters: Open fire in grate': 'solid fuel',
+ 'Solid fuel room heaters: Open fire with back boiler (no radiators)': 'solid fuel',
+ 'Community Heating Systems: Community heat pump (RdSAP)': 'communal heating',
+ 'Gas (including LPG) room heaters: Gas fire, open flue, 1980 or later (open fronted), sitting proud of, '
+ 'and sealed to, fireplace opening': 'room heaters',
+ 'Boiler: A rated Regular Boiler, System 2: Boiler: C rated Regular Boiler': 'boiler - other fuel',
+ 'Boiler: G rated Combi': 'gas condensing combi'
}
diff --git a/asset_list/mappings/property_type.py b/asset_list/mappings/property_type.py
index 290e172a..88ec2934 100644
--- a/asset_list/mappings/property_type.py
+++ b/asset_list/mappings/property_type.py
@@ -343,5 +343,23 @@ PROPERTY_MAPPING = {
'bungalow': 'bungalow',
'flat': 'flat',
'FLA': 'flat',
- 'HOU': 'house'
+ 'HOU': 'house',
+
+ 'Maisonette: Mid Terrace: Mid Floor': 'maisonette',
+ 'Maisonette: Semi Detached: Ground Floor': 'maisonette',
+ 'Maisonette: Enclosed Mid Terrace: Ground Floor': 'maisonette',
+ 'Maisonette: Enclosed End Terrace: Ground Floor': 'maisonette',
+ 'Maisonette: Mid Terrace: Ground Floor': 'maisonette',
+ 'Flat: Semi Detached: Basement': 'flat',
+ 'Maisonette: Semi Detached: Top Floor': 'maisonette',
+ 'Maisonette: Enclosed Mid Terrace: Mid Floor': 'maisonette',
+ 'Flat: Detached: Basement': 'flat',
+ 'Maisonette: Enclosed Mid Terrace: Top Floor': 'maisonette',
+
+ 'Maisonette: End Terrace: Top Floor': 'maisonette',
+ 'House: Mid Terrace: Ground Floor': 'house',
+ 'Bungalow: EnclosedMidTerrace': 'bungalow',
+ 'Maisonette: Semi Detached: Mid Floor': 'maisonette',
+ 'Maisonette: Detached: Mid Floor': 'maisonette'
+
}
diff --git a/asset_list/mappings/roof.py b/asset_list/mappings/roof.py
index 8ac926c0..0857b046 100644
--- a/asset_list/mappings/roof.py
+++ b/asset_list/mappings/roof.py
@@ -275,5 +275,30 @@ ROOF_CONSTRUCTION_MAPPINGS = {
'Pitched (vaulted ceiling) Non-joist': 'pitched unknown insulation',
'ND (inferred) ND (inferred)': 'unknown',
'Flat Non-joist': 'flat insulated',
- 'Same dwelling above N/A': 'another dwelling above'
+ 'Same dwelling above N/A': 'another dwelling above',
+
+ 'Flat: As Built, PitchedNormalLoftAccess: Unknown': 'flat unknown insulation',
+ 'PitchedNormalLoftAccess: Unknown, PitchedNormalNoLoftAccess: Unknown': 'pitched unknown insulation',
+ 'PitchedNormalLoftAccess: 400mm+': 'pitched insulated',
+ 'AnotherDwellingAbove: 150mm': 'another dwelling above',
+ 'Flat: 150mm': 'flat insulated',
+ 'AnotherDwellingAbove: 50mm': 'another dwelling above',
+ 'PitchedNormalNoLoftAccess: As Built': 'pitched no access to loft',
+ 'PitchedNormalLoftAccess: 250mm, PitchedWithSlopingCeiling: As Built': 'pitched insulated',
+ 'PitchedNormalLoftAccess: 200mm, PitchedWithSlopingCeiling: As Built': 'pitched insulated',
+ 'PitchedNormalLoftAccess: 350mm': 'pitched insulated',
+ 'PitchedNormalNoLoftAccess: 270mm': 'pitched no access to loft',
+ 'AnotherDwellingAbove: 100mm': 'another dwelling above',
+
+ 'PitchedWithSlopingCeiling: Unknown': 'piched unknown insulation',
+ 'AnotherDwellingAbove: Unknown, Flat: As Built': 'another dwelling above',
+ 'Flat: Unknown, PitchedNormalLoftAccess: 25mm': 'flat unknown insulation',
+ 'SameDwellingAbove: Unknown': 'another dwelling above',
+ 'Flat: Unknown': 'flat unknown insulation',
+ 'Flat: 50mm, PitchedNormalLoftAccess: 100mm': 'flat insulated',
+ 'Flat: As Built, PitchedNormalLoftAccess: 250mm, PitchedWithSlopingCeiling: As Built': 'flat unknown insulation',
+ 'Flat: As Built, PitchedNormalLoftAccess: 400mm+': 'flat unknown insulation',
+ 'PitchedWithSlopingCeiling: As Built': 'pitched insulated',
+ 'PitchedNormalLoftAccess: As Built': 'pitched unknown insulation',
+
}
diff --git a/asset_list/mappings/walls.py b/asset_list/mappings/walls.py
index 73db586e..418ae9f8 100644
--- a/asset_list/mappings/walls.py
+++ b/asset_list/mappings/walls.py
@@ -353,4 +353,7 @@ WALL_CONSTRUCTION_MAPPINGS = {
'System built As-built': "uninsulated system built",
'System built Internal': 'insulated system built',
+ 'Cavity: AsBuilt (1976-1982), TimberFrame: AsBuilt': 'cavity unknown insulation',
+ 'Cavity: FilledCavityPlusExternal': 'filled cavity'
+
}