Object Model — ER Diagram

Three properties carry all the edges: isIn (physical containment), partOf (functional membership), and dependsOn (operational dependency).

classDiagram
    direction LR
    class AREA
    class DEVICE
    class SYSTEM

    AREA   "0..*" -->  "0..1" AREA   : isInA
    DEVICE "0..*" -->  "0..1" AREA   : isInA
    DEVICE "0..*" -->  "0..1" DEVICE : isInD
    DEVICE "0..*" -->  "0..*" SYSTEM : partOf
    SYSTEM "0..*" -->  "0..1" SYSTEM : partOf
    DEVICE "0..*" ..>  "0..*" DEVICE : dependsOn

Solid arrows (-->) are structural relationships: physical containment (isIn) and functional membership (partOf). Dashed arrows (..>) are operational dependencies (dependsOn). Cardinality is shown at each end of the arrow.

Cardinality key

NotationMeaning
0..1zero or one (optional, singular — root nodes have zero)
0..*zero or many
1exactly one

Relationships

EdgePropertyLeft cardinalityRight cardinalityNotes
AREA → AREAisInzero or one parentzero or many childrenTop-level areas have no parent
DEVICE → AREAisInzero or many devices per areazero or one area per deviceAll devices should have a location
DEVICE → DEVICEisInzero or one parent devicezero or many sub-devicese.g. a circuit breaker is in a panel
DEVICE → SYSTEMpartOfzero or many devices per systemzero or many systems per deviceMany-to-many; a UPS can serve multiple systems
SYSTEM → SYSTEMpartOfzero or one parent systemzero or many sub-systemsTop-level systems have no parent
DEVICE → DEVICEdependsOnzero or many dependentszero or many dependenciesMany-to-many; traversed for root-cause analysis

Properties in use

PropertyTypeNotes
isAstringarea | system | device | term
isInlink or link[]Physical containment — upward pointer
partOflink or link[]Functional system membership
dependsOnlink[]Infrastructure this requires to operate; always an array
titlestringDisplay name for Dataview / Bases
listOfstringDrives Base view filters on this note

Semantic distinctions

QuestionProperty to follow
Where is this physically?isIn (upward to area)
What system does this serve?partOf (upward to system)
What must be working for this to work?dependsOn (to other devices)
What else breaks if this fails?reverse of dependsOn (computed by query)

dependsOn is always an array because a device typically has more than one dependency (power source and network connection at minimum). It is the key property for automated triage: an n8n workflow detecting a failure can walk the dependsOn graph to determine whether the failure is local or a cascade from an upstream dependency.

Publishing note

As of 2026-02, Obsidian Bases support on Publish is planned but not yet available. Dynamic relationship lists (devices in an area, sub-systems of a system) render correctly inside Obsidian via embedded Base views, but appear blank on the published site until Obsidian ships Bases support for Publish.