Map remaining Peabody EXTERNAL elements

This commit is contained in:
Daniel Roth 2026-01-23 17:11:11 +00:00
parent 8cdbe107e5
commit 2d77511650
3 changed files with 137 additions and 50 deletions

View file

@ -20,17 +20,30 @@ class Element(str, Enum):
# EXTERNAL ROOF
# ======================
ROOF = "roof"
PITCHED_ROOF_COVERING = "pitched_roof_covering"
FLAT_ROOF_COVERING = "flat_roof_covering"
RAINWATER_GOODS = "rainwater_goods"
LOFT_INSULATION = "loft_insulation"
PORCH_CANOPY = "porch_canopy"
CHIMNEY = "chimney"
FASCIA = "fascia"
SOFFIT = "soffit"
FASCIA_SOFFIT_BARGEBOARDS = "fascia_soffit_bargeboards"
GUTTERS = "gutters"
GARAGE_ROOF = "garage_roof"
# ======================
# EXTERNAL WALLS
# ======================
EXTERNAL_WALL = "external_wall"
EXTERNAL_NOISE_INSULATION = "external_noise_insulation"
PRIMARY_WALL = "primary_wall"
SECONDARY_WALL = "secondary_wall"
DOWNPIPES = "downpipes"
EXTERNAL_DECORATION = "external_decoration"
CLADDING = "cladding"
SPANDREL_PANELS = "spandrel_panels"
GARAGE_WALLS = "garage_walls"
# ======================
# EXTERNAL WINDOWS
@ -50,6 +63,8 @@ class Element(str, Enum):
COMMUNAL_ENTRANCE_DOOR = "communal_entrance_door"
MAIN_DOOR = "main_door"
BLOCK_ENTRANCE_DOOR = "block_entrance_door"
LINTEL = "lintel"
PATIO_FRENCH_DOOR = "patio_french_door"
# ======================
# EXTERNAL AREAS
@ -57,7 +72,11 @@ class Element(str, Enum):
PATHS_AND_HARDSTANDINGS = "paths_and_hardstandings"
PARKING_AREAS = "parking_areas"
BOUNDARY_WALLS = "boundary_walls"
FENCING = "fencing"
FRONT_FENCING = "front_fencing"
REAR_FENCING = "rear_fencing"
SIDE_FENCING = "side_fencing"
REAR_GATE = "rear_gate"
FRONT_GATE = "front_gate"
GATES = "gates"
RETAINING_WALLS = "retaining_walls"
PRIVATE_BALCONY = "private_balcony"
@ -66,6 +85,8 @@ class Element(str, Enum):
GARAGE_STRUCTURE = "garage_structure"
PAVING = "paving"
ROADS = "roads"
SOIL_AND_VENT = "soil_and_vent"
SOLAR_THERMALS = "solar_thermals"
# ======================
# INTERNAL KITCHEN

View file

@ -8,14 +8,39 @@ PEABODY_ELEMENT_MAP = {
# PROPERTY / GENERAL
# ==========================================================
(100, 1): ElementMapping(element=Element.PROPERTY, aspect_type=AspectType.TYPE),
(100, 15): ElementMapping(
element=Element.PROPERTY, aspect_type=AspectType.EXTERNAL_DECORATION
),
# (100, 3): ElementMapping(element=Element.PROPERTY, aspect_type=AspectType.AGE),
# (100, 14): ElementMapping(element="property", aspect_type="construction_type"),
# ==========================================================
# EXTERNAL WALLS
# ==========================================================
(53, 1): ElementMapping(
element=Element.BOUNDARY_WALLS, aspect_type=AspectType.PRESENCE
),
(53, 4): ElementMapping(
element=Element.EXTERNAL_DECORATION, aspect_type=AspectType.PRESENCE
),
(53, 4): ElementMapping(
element=Element.EXTERNAL_NOISE_INSULATION, aspect_type=AspectType.ADEQUACY
),
(53, 14): ElementMapping(
element=Element.GARAGE_WALLS, aspect_type=AspectType.MATERIAL
),
(53, 23): ElementMapping(
element=Element.PRIMARY_WALL, aspect_type=AspectType.FINISH
),
(53, 30): ElementMapping(
element=Element.SECONDARY_WALL, aspect_type=AspectType.FINISH
), # Should this be combined with primary wall, with different instance value?
(53, 36): ElementMapping(
element=Element.EXTERNAL_WALL, aspect_type=AspectType.INSULATION
),
(53, 40): ElementMapping(
element=Element.SPANDREL_PANELS, aspect_type=AspectType.MATERIAL
),
(53, 41): ElementMapping(element=Element.CLADDING, aspect_type=AspectType.MATERIAL),
(100, 15): ElementMapping(
element=Element.EXTERNAL_DECORATION, aspect_type=AspectType.CONDITION
),
(120, 1): ElementMapping(
element=Element.EXTERNAL_WALL, aspect_type=AspectType.STRUCTURE
),
@ -25,6 +50,22 @@ PEABODY_ELEMENT_MAP = {
# ==========================================================
# EXTERNAL ROOFS
# ==========================================================
(53, 2): ElementMapping(element=Element.CHIMNEY, aspect_type=AspectType.PRESENCE),
(53, 6): ElementMapping(
element=Element.FASCIA_SOFFIT_BARGEBOARDS, aspect_type=AspectType.MATERIAL
),
(53, 7): ElementMapping(
element=Element.FLAT_ROOF_COVERING, aspect_type=AspectType.MATERIAL
),
(53, 13): ElementMapping(
element=Element.GARAGE_ROOF, aspect_type=AspectType.MATERIAL
),
(53, 15): ElementMapping(element=Element.GUTTERS, aspect_type=AspectType.MATERIAL),
(53, 18): ElementMapping(
element=Element.PITCHED_ROOF_COVERING, aspect_type=AspectType.MATERIAL
),
(53, 22): ElementMapping(element=Element.PORCH_CANOPY, aspect_type=AspectType.TYPE),
(53, 47): ElementMapping(element=Element.ROOF, aspect_type=AspectType.STRUCTURE),
(110, 1): ElementMapping(
element=Element.ROOF, aspect_type=AspectType.MATERIAL, element_instance=1
),
@ -49,6 +90,36 @@ PEABODY_ELEMENT_MAP = {
# ==========================================================
# EXTERNAL DOORS & WINDOWS
# ==========================================================
(53, 8): ElementMapping(
element=Element.FRONT_DOOR, aspect_type=AspectType.MATERIAL
),
(53, 12): ElementMapping(
element=Element.GARAGE_DOOR, aspect_type=AspectType.MATERIAL
),
(53, 16): ElementMapping(element=Element.LINTEL, aspect_type=AspectType.PRESENCE),
(53, 19): ElementMapping(
element=Element.PATIO_FRENCH_DOOR, aspect_type=AspectType.MATERIAL
),
(53, 25): ElementMapping(
element=Element.REAR_DOOR, aspect_type=AspectType.MATERIAL
),
(53, 29): ElementMapping(
element=Element.SECONDARY_GLAZING, aspect_type=AspectType.PRESENCE
),
(53, 35): ElementMapping(
element=Element.STORE_DOOR, aspect_type=AspectType.MATERIAL
),
(53, 38): ElementMapping(
element=Element.EXTERNAL_WINDOWS,
aspect_type=AspectType.TYPE,
element_instance=1,
),
(53, 39): ElementMapping(
element=Element.EXTERNAL_WINDOWS,
aspect_type=AspectType.TYPE,
element_instance=2,
),
(53, 43): ElementMapping(element=Element.FRONT_DOOR, aspect_type=AspectType.TYPE),
(130, 1): ElementMapping(
element=Element.EXTERNAL_WINDOWS, aspect_type=AspectType.MATERIAL
),
@ -60,22 +131,58 @@ PEABODY_ELEMENT_MAP = {
),
(140, 2): ElementMapping(
element=Element.STORE_DOOR, aspect_type=AspectType.MATERIAL
),
), # Duplicate of (53, 35)
(140, 3): ElementMapping(
element=Element.GARAGE_DOOR, aspect_type=AspectType.MATERIAL
),
), # Duplicate of (53, 12)
(140, 4): ElementMapping(
element=Element.BLOCK_ENTRANCE_DOOR, aspect_type=AspectType.MATERIAL
),
# ==========================================================
# EXTERNAL AREAS
# ==========================================================
(53, 3): ElementMapping(element=Element.DOWNPIPES, aspect_type=AspectType.MATERIAL),
(53, 9): ElementMapping(
element=Element.FRONT_FENCING, aspect_type=AspectType.MATERIAL
),
(53, 10): ElementMapping(element=Element.FRONT_GATE, aspect_type=AspectType.TYPE),
(53, 17): ElementMapping(
element=Element.PARKING_AREAS, aspect_type=AspectType.MATERIAL
),
(53, 18): ElementMapping(
element=Element.PATHS_AND_HARDSTANDINGS, aspect_type=AspectType.MATERIAL
),
(53, 24): ElementMapping(
element=Element.PRIVATE_BALCONY, aspect_type=AspectType.PRESENCE
),
(53, 26): ElementMapping(
element=Element.REAR_FENCING, aspect_type=AspectType.MATERIAL
),
(53, 27): ElementMapping(element=Element.REAR_GATE, aspect_type=AspectType.TYPE),
(53, 28): ElementMapping(
element=Element.RETAINING_WALLS, aspect_type=AspectType.PRESENCE
),
(53, 31): ElementMapping(
element=Element.SIDE_FENCING, aspect_type=AspectType.MATERIAL
),
(53, 32): ElementMapping(
element=Element.SOIL_AND_VENT, aspect_type=AspectType.MATERIAL
),
(53, 34): ElementMapping(
element=Element.SOLAR_THERMALS, aspect_type=AspectType.PRESENCE
),
(53, 44): ElementMapping(
element=Element.GARAGE_STRUCTURE, aspect_type=AspectType.TYPE
),
(53, 45): ElementMapping(
element=Element.BALCONY_BALUSTRADE, aspect_type=AspectType.MATERIAL
),
(150, 1): ElementMapping(
element=Element.BLOCK_ENTRANCE_DOOR, aspect_type=AspectType.MATERIAL
),
(150, 2): ElementMapping(
element=Element.PATHS_AND_HARDSTANDINGS, aspect_type=AspectType.MATERIAL
),
), # Duplicate of (53, 18) - correct?
(150, 3): ElementMapping(element=Element.ROADS, aspect_type=AspectType.MATERIAL),
(150, 4): ElementMapping(
element=Element.BOUNDARY_WALLS, aspect_type=AspectType.MATERIAL
@ -131,7 +238,6 @@ PEABODY_ELEMENT_MAP = {
# unhandled
# 'Element: External - Code: 53, Sub-Element: Window Type 01 - Code: 38',
# 'Element: HEATING - Code: 170, Sub-Element: Boiler - Code: 1',
# 'Element: HEATING - Code: 170, Sub-Element: Heating Distribution - Code: 2',
# 'Element: ELECTRICS - Code: 180, Sub-Element: Wiring - Code: 1',
@ -159,18 +265,9 @@ PEABODY_ELEMENT_MAP = {
# 'Element: COMMUNAL - Code: 200, Sub-Element: Communal Bathroom - Code: 8',
# 'Element: COMMUNAL - Code: 200, Sub-Element: Communal Toilets - Code: 9',
# 'Element: Internal - Code: 50, Sub-Element: Wiring - Code: 24',
# 'Element: External - Code: 53, Sub-Element: Front Door Material - Code: 8',
# 'Element: External - Code: 53, Sub-Element: Primary Wall Finish - Code: 23',
# 'Element: PASSENGER LIFTS - Code: 210, Sub-Element: Lift - Code: 2',
# 'Element: Internal - Code: 50, Sub-Element: Heating Distribution Type - Code: 12',
# 'Element: External - Code: 53, Sub-Element: Downpipes - Code: 3',
# 'Element: External - Code: 53, Sub-Element: Fascia/Soffits/Bargeboards - Code: 6',
# 'Element: External - Code: 53, Sub-Element: Gutters - Code: 15',
# 'Element: External - Code: 53, Sub-Element: Paths & Hardstandings - Code: 18',
# 'Element: External - Code: 53, Sub-Element: Pitched Roof Covering Material - Code: 21',
# 'Element: Internal - Code: 50, Sub-Element: Secondary Bathroom Type - Code: 20',
# 'Element: External - Code: 53, Sub-Element: Chimney - Code: 2',
# 'Element: External - Code: 53, Sub-Element: External Decoration - Code: 4',
# 'Element: COMMUNAL - Code: 200, Sub-Element: Communal Gates - Code: 10',
# 'Element: GENERAL - Code: 100, Sub-Element: Property Age Band - Code: 3',
# 'Element: GENERAL - Code: 100, Sub-Element: Construction Type - Code: 14',
@ -179,46 +276,28 @@ PEABODY_ELEMENT_MAP = {
# 'Element: Communal - Code: 51, Sub-Element: Common Bin Store Doors - Code: 5',
# 'Element: Communal - Code: 51, Sub-Element: Common Bin Store Walls - Code: 7',
# 'Element: Communal - Code: 51, Sub-Element: Common Primary Entrance Material - Code: 28',
# 'Element: External - Code: 53, Sub-Element: Parking Areas - Code: 17',
# 'Element: External - Code: 53, Sub-Element: Front Fencing - Code: 9',
# 'Element: External - Code: 53, Sub-Element: Retaining Walls - Code: 28',
# 'Element: Communal - Code: 51, Sub-Element: Common Internal Decorations - Code: 20',
# 'Element: Communal - Code: 51, Sub-Element: Common Internal Floor Finish - Code: 22',
# 'Element: Communal - Code: 51, Sub-Element: Common Walkways Finish - Code: 36',
# 'Element: External - Code: 53, Sub-Element: Boundary Walls - Code: 1',
# 'Element: External - Code: 53, Sub-Element: Flat Roof Covering Material - Code: 7',
# 'Element: External - Code: 53, Sub-Element: Porch/Canopy - Code: 22',
# 'Element: External - Code: 53, Sub-Element: Private Balcony - Code: 24',
# 'Element: External - Code: 53, Sub-Element: Rear Gate - Code: 27',
# 'Element: Communal - Code: 51, Sub-Element: Common External Doors Other - Code: 17',
# 'Element: Communal - Code: 51, Sub-Element: Common Stair Finish - Code: 32',
# 'Element: External - Code: 53, Sub-Element: Front Gate - Code: 10',
# 'Element: External - Code: 53, Sub-Element: Rear Fencing - Code: 26',
# 'Element: External - Code: 53, Sub-Element: Side Fencing - Code: 31',
# 'Element: Communal - Code: 51, Sub-Element: Common Aerial - Code: 1',
# 'Element: Communal - Code: 51, Sub-Element: Common AOV - Code: 2',
# 'Element: Communal - Code: 51, Sub-Element: Common Door Entry System - Code: 14',
# 'Element: Communal - Code: 51, Sub-Element: Common Fire Alarm - Code: 19',
# 'Element: Communal - Code: 51, Sub-Element: Common Internal Doors - Code: 21',
# 'Element: External - Code: 53, Sub-Element: Store Door Material - Code: 35',
# 'Element: External - Code: 53, Sub-Element: Secondary Wall Finish - Code: 30',
# 'Element: Communal - Code: 51, Sub-Element: Common Emergency Lighting - Code: 16',
# 'Element: Communal - Code: 51, Sub-Element: Common Lateral Mains - Code: 24',
# 'Element: Communal - Code: 51, Sub-Element: Common Lighting - Code: 25',
# 'Element: Communal - Code: 51, Sub-Element: Common Store Roof - Code: 34',
# 'Element: Communal - Code: 51, Sub-Element: Common Store Walls - Code: 35',
# 'Element: External - Code: 53, Sub-Element: Cladding Material - Code: 41',
# 'Element: External - Code: 53, Sub-Element: Spandrel Panels - Code: 40',
# 'Element: Communal - Code: 51, Sub-Element: Common CCTV - Code: 11',
# 'Element: Communal - Code: 51, Sub-Element: Common Kitchen - Code: 23',
# 'Element: Communal - Code: 51, Sub-Element: Common Secondary Entrance Material - Code: 30',
# 'Element: Communal - Code: 51, Sub-Element: Common Warden Call System - Code: 37',
# 'Element: External - Code: 53, Sub-Element: Lintels - Code: 16',
# 'Element: Communal - Code: 51, Sub-Element: Common Boiler - Code: 9',
# 'Element: External - Code: 53, Sub-Element: Soil & Vent Material - Code: 32',
# 'Element: Communal - Code: 51, Sub-Element: Common Passenger Lift - Code: 27',
# 'Element: Communal - Code: 51, Sub-Element: Common Store Doors - Code: 33',
# 'Element: External - Code: 53, Sub-Element: Window Type 02 - Code: 39',
# 'Element: Communal - Code: 51, Sub-Element: Common BMS - Code: 8',
# 'Element: Communal - Code: 51, Sub-Element: Common Booster Pump - Code: 10',
# 'Element: Communal - Code: 51, Sub-Element: Common Dry Riser - Code: 15',
@ -226,25 +305,14 @@ PEABODY_ELEMENT_MAP = {
# 'Element: Communal - Code: 51, Sub-Element: Common Bin Store Roof - Code: 6',
# 'Element: Communal - Code: 51, Sub-Element: Common Bathroom - Code: 4',
# 'Element: Communal - Code: 51, Sub-Element: Common WC - Code: 38',
# 'Element: External - Code: 53, Sub-Element: Wall Insulation - Code: 36',
# 'Element: External - Code: 53, Sub-Element: Garage Door - Code: 12',
# 'Element: Communal - Code: 51, Sub-Element: Common Cold Water Storage Tank - Code: 13',
# 'Element: Communal - Code: 51, Sub-Element: Common Sprinker - Code: 31',
# 'Element: External - Code: 53, Sub-Element: Garage Walls - Code: 14',
# 'Element: Communal - Code: 51, Sub-Element: Communal Plug Sockets - Code: 40',
# 'Element: Communal - Code: 51, Sub-Element: Common Wet Riser - Code: 39',
# 'Element: Communal - Code: 51, Sub-Element: Common Refuse Chute - Code: 29',
# 'Element: External - Code: 53, Sub-Element: Secondary Glazing - Code: 29',
# 'Element: External - Code: 53, Sub-Element: Solar Thermals - Code: 34',
# 'Element: External - Code: 53, Sub-Element: Garage Roof - Code: 13',
# 'Element: External - Code: 53, Sub-Element: Patio/French Door - Code: 19',
# 'Element: External - Code: 53, Sub-Element: Rear Door Material - Code: 25',
# 'Element: Internal - Code: 50, Sub-Element: Party Wall Fire Break - Code: 16',
# 'Element: Internal - Code: 50, Sub-Element: Boiler Type - Code: 25',
# 'Element: External - Code: 53, Sub-Element: Roof Structure - Code: 47',
# 'Element: External - Code: 53, Sub-Element: Front Door Type - Code: 43',
# 'Element: Communal - Code: 51, Sub-Element: Common Cirulation Space - Code: 12',
# 'Element: External - Code: 53, Sub-Element: External Noise Insulation - Code: 5',
# 'Element: Internal - Code: 50, Sub-Element: Door Entry Handset - Code: 8',
# 'Element: Internal - Code: 50, Sub-Element: Cold Water Storage Tank - Code: 6',
# 'Element: Internal - Code: 50, Sub-Element: Programmable Heating - Code: 19',
@ -254,6 +322,4 @@ PEABODY_ELEMENT_MAP = {
# 'Element: Internal - Code: 50, Sub-Element: Stairlift - Code: 22',
# 'Element: Internal - Code: 50, Sub-Element: Primary Bathroom Location - Code: 17',
# 'Element: Internal - Code: 50, Sub-Element: Disabled Hoist Tracking - Code: 7',
# 'Element: External - Code: 53, Sub-Element: Garage Type - Code: 44',
# 'Element: External - Code: 53, Sub-Element: Private Balcony Balustrade Material - Code: 45',
# 'Element: Internal - Code: 50, Sub-Element: Disabled Facilities - Code: 26'

View file

@ -71,8 +71,8 @@ def test_peabody_mapper_maps_property():
),
AssetCondition(
uprn=1,
element=Element.PROPERTY,
aspect_type=AspectType.EXTERNAL_DECORATION,
element=Element.EXTERNAL_DECORATION,
aspect_type=AspectType.CONDITION,
value="Normal",
quantity=1,
install_date=None,