diff --git a/src/xeto/ph.attrs/actuator.xeto b/src/xeto/ph.attrs/actuator.xeto new file mode 100644 index 0000000..910a913 --- /dev/null +++ b/src/xeto/ph.attrs/actuator.xeto @@ -0,0 +1,16 @@ +// +// Copyright (c) 2026, Project-Haystack +// Licensed under the Academic Free License version 3.0 +// +// History: +// 10 Mar 2026 Adam Garnhart Creation +// + +// Actuator fail position specified by engineer (failOpen, failClosed, etc.) +ActuatorFailPositionDesignAttr : EnumAttr { design, actuator, val: ActuatorFailPosition } + +// Actuator control action from manufacturer (modulating, twoPosition, floating) +ActuatorControlActionRatedAttr : EnumAttr { rated, actuator, val: ActuatorControlAction } + +// Actuator physical mechanism from manufacturer (electricMotor, pneumatic, etc.) +ActuatorMechanismRatedAttr : EnumAttr { rated, actuator, val: ActuatorMechanism } diff --git a/src/xeto/ph.attrs/base.xeto b/src/xeto/ph.attrs/base.xeto index d3d1624..28e33b2 100644 --- a/src/xeto/ph.attrs/base.xeto +++ b/src/xeto/ph.attrs/base.xeto @@ -16,6 +16,11 @@ DateAttr: Attr { val: Date // Date value of the attribute } +// Attribute with an enum value type +EnumAttr: Attr { + val: Obj // Enum value of the attribute +} + // Attribute with a number value type NumberAttr: Attr { val: Number // Number value of the attribute diff --git a/src/xeto/ph.attrs/valve.xeto b/src/xeto/ph.attrs/valve.xeto new file mode 100644 index 0000000..b71875a --- /dev/null +++ b/src/xeto/ph.attrs/valve.xeto @@ -0,0 +1,16 @@ +// +// Copyright (c) 2026, Project-Haystack +// Licensed under the Academic Free License version 3.0 +// +// History: +// 10 Mar 2026 Adam Garnhart Creation +// + +// Valve function specified by engineer (isolation, control, mixing, etc.) +ValveFunctionDesignAttr : EnumAttr { design, valve, val: ValveFunction } + +// Valve port configuration from manufacturer (twoWay, threeWay, fourWay) +ValvePortsRatedAttr : EnumAttr { rated, valve, val: ValvePorts } + +// Valve body construction type from manufacturer (globe, butterfly, ball, etc.) +ValveBodyTypeRatedAttr : EnumAttr { rated, valve, val: ValveBodyType } diff --git a/src/xeto/ph/entity.xeto b/src/xeto/ph/entity.xeto index 923ae09..755e918 100644 --- a/src/xeto/ph/entity.xeto +++ b/src/xeto/ph/entity.xeto @@ -1448,6 +1448,11 @@ PhEntity: Entity { // may provide an interface for setpoint control. *thermostat: Marker + // Self-actuated temperature regulation. Used as a feature marker on + // valves (e.g. thermostatic mixing valve) and other equipment where + // temperature drives the control action without an external actuator. + *thermostatic: Marker + // Three-phase AC electricity. Power is provided by three AC voltage // sources, each separated from the others by a 120-degree phase angle. // May have a 4-wire connection with a neutral (Wye) or a 3-wire connection diff --git a/src/xeto/ph/enums.xeto b/src/xeto/ph/enums.xeto index 6a8069f..37c8652 100644 --- a/src/xeto/ph/enums.xeto +++ b/src/xeto/ph/enums.xeto @@ -4,6 +4,41 @@ // Auto-generated 17-Jan-2025 // +// Control behavior of an actuator. Determines whether the actuator +// positions continuously (modulating), snaps between discrete states +// (twoPosition), or is driven by raise/lower signals without position +// feedback (floating). +ActuatorControlAction: Enum { + modulating // continuous proportional positioning (0-100%) + twoPosition // discrete open/closed (binary) + floating // motor driven by raise/lower signals, no position feedback +} + +// Relationship between command signal direction and physical position. +// The Haystack convention is 0% = closed and 100% = open. The +// actuatorDirection tells tools when the raw BAS signal is inverted. +ActuatorDirection: Enum { + directActing // 0% signal = closed, 100% signal = open + reverseActing // 0% signal = open, 100% signal = closed +} + +// Position an actuator assumes on loss of control signal or power. +// Applies to both valve and damper actuators. +ActuatorFailPosition: Enum { + failOpen // actuator drives/springs to fully open + failClosed // actuator drives/springs to fully closed + failInPlace // actuator holds last position (no spring return) + failToPosition // actuator drives to a configurable intermediate position +} + +// Physical mechanism used by the actuator to produce motion. +ActuatorMechanism: Enum { + electricMotor // gear motor actuator (rotary or linear) + pneumatic // compressed air diaphragm or piston + hydraulic // hydraulic fluid piston + solenoid // electromagnetic coil (linear, typically on/off) +} + // Status of point's current value reading. The [ph::PhEntity.curVal] is only available // when curStatus is "ok" or "stale". However a "stale" value should // be used with caution since the local system does not have a fresh value. @@ -521,6 +556,40 @@ PrimaryFunction: Enum { zoo } +// Valve body construction type +ValveBodyType: Enum { + ball // quarter-turn spherical closure element + butterfly // quarter-turn rotating disc + gate // linear multi-turn wedge or knife + globe // linear rising-stem plug + needle // fine-adjustment variant of globe + plug // quarter-turn tapered or cylindrical plug +} + +// Functional role of a valve in a piping system. +// Features like pressureIndependent and thermostatic are layered +// as separate markers rather than enum values. +ValveFunction: Enum { + balancing // proportional flow balancing + bypass // diverts flow around equipment + check // prevents reverse flow (non-return) + control // modulating or two-position BAS control + diverting // splits one inlet to two outlets + expansion // thermal expansion relief + isolation // on/off service isolation + mixing // blends two inlets to one outlet + pressureReducing // downstream pressure regulation + relief // overpressure safety relief + safety // code-required overpressure protection (ASME rated) +} + +// Number of ports on a valve body +ValvePorts: Enum { + twoWay // single inlet, single outlet + threeWay // two inlets/one outlet or one inlet/two outlets + fourWay // two inlets, two outlets (rare) +} + // Enumeration of weather conditions WeatherCondEnum: Enum { unknown diff --git a/src/xeto/ph/equip.xeto b/src/xeto/ph/equip.xeto index bcf531c..48a88ad 100644 --- a/src/xeto/ph/equip.xeto +++ b/src/xeto/ph/equip.xeto @@ -47,6 +47,7 @@ AcEvsePort: EvsePort { // hydraulics, or pneumatics. Actuator: Equip { actuator + actuatorDirection: ActuatorDirection? } // Air Handling Unit: An enclosure with a fan that delivers air to a space @@ -174,12 +175,19 @@ Crac: Fcu { crac } -// Actuator to regulate the flow of air. -DamperActuator: Actuator { +// Equipment to regulate the flow of air in ductwork. Dampers may be +// manually operated or automated via an actuator. Non-actuated dampers +// such as manual balancing dampers, backdraft dampers, and fire dampers +// use this spec directly. BAS-controlled dampers use DamperActuator. +Damper: Equip { damper ductSection: DuctSection? } +// Actuator to regulate the flow of air. +DamperActuator: Actuator & Damper { +} + // DC Electricity meter. // See [ph.doc::Meters] chapter. DcElecMeter: ElecMeter { @@ -481,13 +489,21 @@ Ups: Equip { ups } -// Actuator to regulate the flow of fluid. -ValveActuator: Actuator { +// Equipment to regulate the flow of fluid in piping. Valves may be +// manually operated, self-actuated, or automated via an actuator. +// Non-actuated valves such as manual isolation valves, check valves, +// pressure-reducing valves, and thermostatic mixing valves use this +// spec directly. BAS-controlled valves use ValveActuator. +Valve: Equip { valve pipeFluid: Fluid? pipeSection: PipeSection? } +// Actuator to regulate the flow of fluid. +ValveActuator: Actuator & Valve { +} + // Variable air volume terminal unit. VAV systems use a constant air // temperature with a variable air flow rate. See [ph.doc::VAVs] chapter. Vav: AirTerminalUnit {