diff --git a/examples/13-TargetStates/DEV_DoorsWindows.h b/examples/13-TargetStates/DEV_DoorsWindows.h index a42fa6c..02999c4 100644 --- a/examples/13-TargetStates/DEV_DoorsWindows.h +++ b/examples/13-TargetStates/DEV_DoorsWindows.h @@ -5,8 +5,8 @@ struct DEV_GarageDoor : Service::GarageDoorOpener { // A Garage Door Opener - SpanCharacteristic *current; // reference to the Current Door State Characteristic (specific to Garage Door Openers) - SpanCharacteristic *target; // reference to the Target Door State Characteristic (specific to Garage Door Openers) + Characteristic::CurrentDoorState *current; // reference to the Current Door State Characteristic (specific to Garage Door Openers) + Characteristic::TargetDoorState *target; // reference to the Target Door State Characteristic (specific to Garage Door Openers) SpanCharacteristic *obstruction; // reference to the Obstruction Detected Characteristic (specific to Garage Door Openers) DEV_GarageDoor() : Service::GarageDoorOpener(){ // constructor() method diff --git a/src/Span.h b/src/Span.h index 015a408..7ae6675 100644 --- a/src/Span.h +++ b/src/Span.h @@ -408,47 +408,47 @@ namespace Service { // Macro to define Span Characteristic structures based on name of HAP Characteristic, default value, and min/max value (not applicable for STRING or BOOL which default to min=0, max=1) -#define CREATE_CHAR(TYPE,HAPCHAR,DEFVAL,MINVAL,MAXVAL) \ - struct HAPCHAR : SpanCharacteristic { HAPCHAR(TYPE val=DEFVAL, boolean nvsStore=false) : SpanCharacteristic {&hapChars.HAPCHAR} { init(val,nvsStore,(TYPE)MINVAL,(TYPE)MAXVAL); } }; +#define CREATE_CHAR(TYPE,HAPCHAR,DEFVAL,MINVAL,MAXVAL,...) \ + struct HAPCHAR : SpanCharacteristic { __VA_OPT__(enum{) __VA_ARGS__ __VA_OPT__(};) HAPCHAR(TYPE val=DEFVAL, boolean nvsStore=false) : SpanCharacteristic {&hapChars.HAPCHAR} { init(val,nvsStore,(TYPE)MINVAL,(TYPE)MAXVAL); } }; namespace Characteristic { CREATE_CHAR(uint32_t,AccessoryFlags,1,1,1); - CREATE_CHAR(uint8_t,Active,0,0,1); + CREATE_CHAR(uint8_t,Active,0,0,1,INACTIVE,ACIVE); CREATE_CHAR(uint32_t,ActiveIdentifier,0,0,255); - CREATE_CHAR(uint8_t,AirQuality,0,0,5); + CREATE_CHAR(uint8_t,AirQuality,0,0,5,UNKNOWN,EXCELLENT,GOOD,FAIR,INFERIOR,POOR); CREATE_CHAR(uint8_t,BatteryLevel,0,0,100); CREATE_CHAR(int,Brightness,0,0,100); CREATE_CHAR(double,CarbonMonoxideLevel,0,0,100); CREATE_CHAR(double,CarbonMonoxidePeakLevel,0,0,100); - CREATE_CHAR(uint8_t,CarbonMonoxideDetected,0,0,1); + CREATE_CHAR(uint8_t,CarbonMonoxideDetected,0,0,1,NORMAL,ABNORMAL); CREATE_CHAR(double,CarbonDioxideLevel,0,0,100000); CREATE_CHAR(double,CarbonDioxidePeakLevel,0,0,100000); - CREATE_CHAR(uint8_t,CarbonDioxideDetected,0,0,1); - CREATE_CHAR(uint8_t,ChargingState,0,0,2); + CREATE_CHAR(uint8_t,CarbonDioxideDetected,0,0,1,NORMAL,ABNORMAL); + CREATE_CHAR(uint8_t,ChargingState,0,0,2,NOT_CHARGING,CHARGING,NOT_CHARGEABLE); CREATE_CHAR(uint8_t,ClosedCaptions,0,0,1); CREATE_CHAR(double,CoolingThresholdTemperature,10,10,35); CREATE_CHAR(uint32_t,ColorTemperature,200,140,500); - CREATE_CHAR(uint8_t,ContactSensorState,1,0,1); + CREATE_CHAR(uint8_t,ContactSensorState,1,0,1,DETECTED,NOT_DETECTED); CREATE_CHAR(const char *,ConfiguredName,"unnamed",0,1); CREATE_CHAR(double,CurrentAmbientLightLevel,1,0.0001,100000); CREATE_CHAR(int,CurrentHorizontalTiltAngle,0,-90,90); - CREATE_CHAR(uint8_t,CurrentAirPurifierState,1,0,2); - CREATE_CHAR(uint8_t,CurrentSlatState,0,0,2); + CREATE_CHAR(uint8_t,CurrentAirPurifierState,1,0,2,INACTIVE,IDLE,PURIFYING); + CREATE_CHAR(uint8_t,CurrentSlatState,0,0,2,FIXED,JAMMED,SWINGING); CREATE_CHAR(uint8_t,CurrentPosition,0,0,100); CREATE_CHAR(int,CurrentVerticalTiltAngle,0,-90,90); CREATE_CHAR(uint8_t,CurrentVisibilityState,0,0,1); - CREATE_CHAR(uint8_t,CurrentHumidifierDehumidifierState,1,0,3); - CREATE_CHAR(uint8_t,CurrentDoorState,1,0,4); - CREATE_CHAR(uint8_t,CurrentFanState,1,0,2); - CREATE_CHAR(uint8_t,CurrentHeatingCoolingState,0,0,2); - CREATE_CHAR(uint8_t,CurrentHeaterCoolerState,1,0,3); + CREATE_CHAR(uint8_t,CurrentHumidifierDehumidifierState,1,0,3,INACTIVE,IDLE,HUMIDIFYING,DEHUMIDIFYING); + CREATE_CHAR(uint8_t,CurrentDoorState,1,0,4,OPEN,CLOSED,OPENING,CLOSING,STOPPED); + CREATE_CHAR(uint8_t,CurrentFanState,1,0,2,INACTIVE,IDLE,BLOWING); + CREATE_CHAR(uint8_t,CurrentHeatingCoolingState,0,0,2,OFF,HEATING,COOLING); + CREATE_CHAR(uint8_t,CurrentHeaterCoolerState,1,0,3,INACTIVE,IDLE,HEATING,COOLING); CREATE_CHAR(uint8_t,CurrentMediaState,0,0,5); CREATE_CHAR(double,CurrentRelativeHumidity,0,0,100); CREATE_CHAR(double,CurrentTemperature,0,0,100); CREATE_CHAR(int,CurrentTiltAngle,0,-90,90); CREATE_CHAR(double,FilterLifeLevel,0,0,100); - CREATE_CHAR(uint8_t,FilterChangeIndication,0,0,1); + CREATE_CHAR(uint8_t,FilterChangeIndication,0,0,1,NO_CHANGE_NEEDED,CHANGE_NEEDED); CREATE_CHAR(const char *,FirmwareRevision,"1.0.0",0,1); CREATE_CHAR(const char *,HardwareRevision,"1.0.0",0,1); CREATE_CHAR(double,HeatingThresholdTemperature,16,0,25); @@ -458,64 +458,64 @@ namespace Characteristic { CREATE_CHAR(uint32_t,Identifier,0,0,255); CREATE_CHAR(uint8_t,InputDeviceType,0,0,6); CREATE_CHAR(uint8_t,InputSourceType,0,0,10); - CREATE_CHAR(uint8_t,InUse,0,0,1); - CREATE_CHAR(uint8_t,IsConfigured,0,0,1); - CREATE_CHAR(uint8_t,LeakDetected,0,0,1); - CREATE_CHAR(uint8_t,LockCurrentState,0,0,3); - CREATE_CHAR(uint8_t,LockPhysicalControls,0,0,1); - CREATE_CHAR(uint8_t,LockTargetState,0,0,1); + CREATE_CHAR(uint8_t,InUse,0,0,1,NOT_IN_USE,IN_USE); + CREATE_CHAR(uint8_t,IsConfigured,0,0,1,NOT_CONFIGURED,CONFIGURED); + CREATE_CHAR(uint8_t,LeakDetected,0,0,1,NOT_DETECTED,DETECTED); + CREATE_CHAR(uint8_t,LockCurrentState,0,0,3,UNLOCKED,LOCKED,JAMMED,UNKNOWN); + CREATE_CHAR(uint8_t,LockPhysicalControls,0,0,1,CONTROL_LOCK_DISABLED,CONTROL_LOCK_ENABLED); + CREATE_CHAR(uint8_t,LockTargetState,0,0,1,UNLOCK,LOCK); CREATE_CHAR(const char *,Manufacturer,"HomeSpan",0,1); CREATE_CHAR(const char *,Model,"HomeSpan-ESP32",0,1); CREATE_CHAR(boolean,MotionDetected,false,0,1); - CREATE_CHAR(boolean,Mute,false,0,1); + CREATE_CHAR(boolean,Mute,false,0,1,OFF,ON); CREATE_CHAR(const char *,Name,"unnamed",0,1); CREATE_CHAR(double,NitrogenDioxideDensity,0,0,1000); CREATE_CHAR(boolean,ObstructionDetected,false,0,1); CREATE_CHAR(double,PM25Density,0,0,1000); - CREATE_CHAR(uint8_t,OccupancyDetected,0,0,1); + CREATE_CHAR(uint8_t,OccupancyDetected,0,0,1,NOT_DETECTED,DETECTED); CREATE_CHAR(boolean,OutletInUse,false,0,1); CREATE_CHAR(boolean,On,false,0,1); CREATE_CHAR(double,OzoneDensity,0,0,1000); CREATE_CHAR(uint8_t,PictureMode,0,0,13); CREATE_CHAR(double,PM10Density,0,0,1000); - CREATE_CHAR(uint8_t,PositionState,2,0,2); + CREATE_CHAR(uint8_t,PositionState,2,0,2,GOING_TO_MINIMUM,GOING_TO_MAXIMUM,STOPPED); CREATE_CHAR(uint8_t,PowerModeSelection,0,0,1); - CREATE_CHAR(uint8_t,ProgramMode,0,0,2); - CREATE_CHAR(uint8_t,ProgrammableSwitchEvent,0,0,2); + CREATE_CHAR(uint8_t,ProgramMode,0,0,2,NONE,SCHEDULED,SCHEDULE_OVERRIDEN); + CREATE_CHAR(uint8_t,ProgrammableSwitchEvent,0,0,2,SINGLE_PRESS,DOUBLE_PRESS,LONG_PRESS); CREATE_CHAR(double,RelativeHumidityDehumidifierThreshold,50,0,100); CREATE_CHAR(double,RelativeHumidityHumidifierThreshold,50,0,100); CREATE_CHAR(uint32_t,RemainingDuration,60,0,3600); CREATE_CHAR(uint8_t,RemoteKey,0,0,16); CREATE_CHAR(uint8_t,ResetFilterIndication,0,1,1); - CREATE_CHAR(int,RotationDirection,0,0,1); + CREATE_CHAR(int,RotationDirection,0,0,1,CLOCKWISE,COUNTERCLOCKWISE); CREATE_CHAR(double,RotationSpeed,0,0,100); CREATE_CHAR(double,Saturation,0,0,100); - CREATE_CHAR(uint8_t,SecuritySystemAlarmType,0,0,1); - CREATE_CHAR(uint8_t,SecuritySystemCurrentState,3,0,4); - CREATE_CHAR(uint8_t,SecuritySystemTargetState,3,0,3); + CREATE_CHAR(uint8_t,SecuritySystemAlarmType,0,0,1,KNOWN,UNKNOWN); + CREATE_CHAR(uint8_t,SecuritySystemCurrentState,3,0,4,ARMED_STAY,ARMED_AWAY,ARMED_NIGHT,DISARMED,ALARM_TRIGGERED); + CREATE_CHAR(uint8_t,SecuritySystemTargetState,3,0,3,ARM_STAY,ARM_AWAY,ARM_NIGHT,DISARM); CREATE_CHAR(const char *,SerialNumber,"HS-12345",0,1); CREATE_CHAR(uint8_t,ServiceLabelIndex,1,1,255); - CREATE_CHAR(uint8_t,ServiceLabelNamespace,1,0,1); - CREATE_CHAR(uint8_t,SlatType,0,0,1); + CREATE_CHAR(uint8_t,ServiceLabelNamespace,1,0,1,DOTS,NUMERALS); + CREATE_CHAR(uint8_t,SlatType,0,0,1,HORIZONTAL,VERTICAL); CREATE_CHAR(uint8_t,SleepDiscoveryMode,0,0,1); - CREATE_CHAR(uint8_t,SmokeDetected,0,0,1); + CREATE_CHAR(uint8_t,SmokeDetected,0,0,1,NOT_DETECTED,DETECTED); CREATE_CHAR(boolean,StatusActive,true,0,1); - CREATE_CHAR(uint8_t,StatusFault,0,0,1); - CREATE_CHAR(uint8_t,StatusJammed,0,0,1); - CREATE_CHAR(uint8_t,StatusLowBattery,0,0,1); - CREATE_CHAR(uint8_t,StatusTampered,0,0,1); + CREATE_CHAR(uint8_t,StatusFault,0,0,1,NO_FAULT,FAULT); + CREATE_CHAR(uint8_t,StatusJammed,0,0,1,NOT_JAMMED,JAMMED); + CREATE_CHAR(uint8_t,StatusLowBattery,0,0,1,NOT_LOW_BATTERY,LOW_BATTERY); + CREATE_CHAR(uint8_t,StatusTampered,0,0,1,NOT_TAMPERED,TAMPERED); CREATE_CHAR(double,SulphurDioxideDensity,0,0,1000); - CREATE_CHAR(uint8_t,SwingMode,0,0,1); - CREATE_CHAR(uint8_t,TargetAirPurifierState,1,0,1); - CREATE_CHAR(uint8_t,TargetFanState,1,0,1); + CREATE_CHAR(uint8_t,SwingMode,0,0,1,SWING_DISABLED,SWING_ENABLED); + CREATE_CHAR(uint8_t,TargetAirPurifierState,1,0,1,MANUAL,AUTO); + CREATE_CHAR(uint8_t,TargetFanState,1,0,1,MANUAL,AUTO); CREATE_CHAR(int,TargetTiltAngle,0,-90,90); - CREATE_CHAR(uint8_t,TargetHeaterCoolerState,0,0,2); + CREATE_CHAR(uint8_t,TargetHeaterCoolerState,0,0,2,AUTO,HEAT,COOL); CREATE_CHAR(uint32_t,SetDuration,60,0,3600); CREATE_CHAR(int,TargetHorizontalTiltAngle,0,-90,90); - CREATE_CHAR(uint8_t,TargetHumidifierDehumidifierState,0,0,2); + CREATE_CHAR(uint8_t,TargetHumidifierDehumidifierState,0,0,2,AUTO,HUMIDIFY,DEHUMIDIFY); CREATE_CHAR(uint8_t,TargetPosition,0,0,100); - CREATE_CHAR(uint8_t,TargetDoorState,1,0,1); - CREATE_CHAR(uint8_t,TargetHeatingCoolingState,0,0,3); + CREATE_CHAR(uint8_t,TargetDoorState,1,0,1,OPEN,CLOSED); + CREATE_CHAR(uint8_t,TargetHeatingCoolingState,0,0,3,OFF,HEAT,COOL,AUTO); CREATE_CHAR(uint8_t,TargetMediaState,0,0,2); CREATE_CHAR(double,TargetRelativeHumidity,0,0,100); CREATE_CHAR(double,TargetTemperature,16,10,38);