"""Architecture-level FMEA for zone vehicle EEA."""
from dataclasses import dataclass
from typing import List
@dataclass
class FMEAEntry:
fmea_id: str
element: str # which architecture element
failure_mode: str # how it can fail
local_effect: str # effect on this element
system_effect: str # effect at vehicle level
severity: int # S1-S3
occurrence: int # O1-O10
detection: int # D1-D10 (1=easily detected)
safety_measure: str # what prevents/mitigates
status: str # open/closed/accepted
def rpn(self) -> int:
return self.severity * self.occurrence * self.detection
ARCH_FMEA: List[FMEAEntry] = [
FMEAEntry(
fmea_id="FMEA-001",
element="Chassis CAN bus",
failure_mode="Bus-off: permanent CAN bus error",
local_effect="All CAN nodes on chassis bus lose communication",
system_effect="ABS/EPS lose wheel speed signals; degraded braking/steering",
severity=3, occurrence=3, detection=2, # RPN=18
safety_measure="Bus-off recovery; wheel speed backup via wheel pulse counter",
status="closed"
),
FMEAEntry(
fmea_id="FMEA-002",
element="Zone ECU Front-L power supply",
failure_mode="12V supply undervoltage (< 9V)",
local_effect="Zone ECU Front-L resets",
system_effect="Window, door, mirror controls lost; left front camera lost",
severity=1, occurrence=4, detection=1, # RPN=4
safety_measure="Power supervisor IC; UDS DTC logged; driver warning",
status="closed"
),
]
high_rpn = [f for f in ARCH_FMEA if f.rpn() > 100]
print(f"High RPN items (>100): {len(high_rpn)}")
for f in sorted(ARCH_FMEA, key=lambda x: -x.rpn()):
print(f" [{f.fmea_id}] RPN={f.rpn()} | {f.element}: {f.failure_mode[:40]}")