From 7e3d982ee53f5d0b4cc0b8e8f82495081ec4b7c6 Mon Sep 17 00:00:00 2001 From: Gregg Date: Fri, 5 Mar 2021 22:34:55 -0600 Subject: [PATCH] Added min/max Range defaults for all Characteristics Also added new flag "staticRange" for all Characteristics that indicates whether the min/max range can be changed. An ERROR will be thrown if setRange is attempted for a Characteristic having staticRange=true. --- src/Characteristics.h | 201 ++++++++++++++++++++-------------------- src/HomeSpan.cpp | 1 + src/HomeSpan.h | 12 ++- src/Span.h | 209 +++++++++++++++++++++--------------------- 4 files changed, 211 insertions(+), 212 deletions(-) diff --git a/src/Characteristics.h b/src/Characteristics.h index a05a1c6..5bfa525 100644 --- a/src/Characteristics.h +++ b/src/Characteristics.h @@ -58,113 +58,114 @@ struct HapChar { const char *hapName; PERMS perms; FORMAT format; + boolean staticRange; }; /////////////////////////////// -#define HAPCHAR(hapName,type,perms,format) HapChar hapName {#type,#hapName,(PERMS)(perms),format} +#define HAPCHAR(hapName,type,perms,format,staticRange) HapChar hapName {#type,#hapName,(PERMS)(perms),format,staticRange} struct HapCharacteristics { - HAPCHAR( Active, B0, PW+PR+EV, UINT8 ); - HAPCHAR( AirQuality, 95, PR+EV, UINT8 ); - HAPCHAR( BatteryLevel, 68, PR+EV, UINT8 ); - HAPCHAR( Brightness, 8, PR+PW+EV, INT ); - HAPCHAR( CarbonMonoxideLevel, 90, PR+EV, FLOAT ); - HAPCHAR( CarbonMonoxidePeakLevel, 91, PR+EV, FLOAT ); - HAPCHAR( CarbonDioxideDetected, 92, PR+EV, UINT8 ); - HAPCHAR( CarbonDioxideLevel, 93, PR+EV, FLOAT ); - HAPCHAR( CarbonDioxidePeakLevel, 94, PR+EV, FLOAT ); - HAPCHAR( CarbonMonoxideDetected, 69, PR+EV, UINT8 ); - HAPCHAR( ChargingState, 8F, PR+EV, UINT8 ); - HAPCHAR( CoolingThresholdTemperature, D, PR+PW+EV, FLOAT ); - HAPCHAR( ColorTemperature, CE, PR+PW+EV, UINT32 ); - HAPCHAR( ContactSensorState, 6A, PR+EV, UINT8 ); - HAPCHAR( CurrentAmbientLightLevel, 6B, PR+EV, FLOAT ); - HAPCHAR( CurrentHorizontalTiltAngle, 6C, PR+EV, INT ); - HAPCHAR( CurrentAirPurifierState, A9, PR+EV, UINT8 ); - HAPCHAR( CurrentSlatState, AA, PR+EV, UINT8 ); - HAPCHAR( CurrentPosition, 6D, PR+EV, UINT8 ); - HAPCHAR( CurrentVerticalTiltAngle, 6E, PR+EV, INT ); - HAPCHAR( CurrentHumidifierDehumidifierState, B3, PR+EV, UINT8 ); - HAPCHAR( CurrentDoorState, E, PR+EV, UINT8 ); - HAPCHAR( CurrentFanState, AF, PR+EV, UINT8 ); - HAPCHAR( CurrentHeatingCoolingState, F, PR+EV, UINT8 ); - HAPCHAR( CurrentHeaterCoolerState, B1, PR+EV, UINT8 ); - HAPCHAR( CurrentRelativeHumidity, 10, PR+EV, FLOAT ); - HAPCHAR( CurrentTemperature, 11, PR+EV, FLOAT ); - HAPCHAR( CurrentTiltAngle, C1, PR+EV, INT ); - HAPCHAR( FilterLifeLevel, AB, PR+EV, FLOAT ); - HAPCHAR( FilterChangeIndication, AC, PR+EV, UINT8 ); - HAPCHAR( FirmwareRevision, 52, PR, STRING ); - HAPCHAR( HardwareRevision, 53, PR, STRING ); - HAPCHAR( HeatingThresholdTemperature, 12, PR+PW+EV, FLOAT ); - HAPCHAR( HoldPosition, 6F, PW, BOOL ); - HAPCHAR( Hue, 13, PR+PW+EV, FLOAT ); - HAPCHAR( Identify, 14, PW, BOOL ); - HAPCHAR( InUse, D2, PR+EV, UINT8 ); - HAPCHAR( IsConfigured, D6, PR+EV, UINT8 ); - HAPCHAR( LeakDetected, 70, PR+EV, UINT8 ); - HAPCHAR( LockCurrentState, 1D, PR+EV, UINT8 ); - HAPCHAR( LockPhysicalControls, A7, PW+PR+EV, UINT8 ); - HAPCHAR( LockTargetState, 1E, PW+PR+EV, UINT8 ); - HAPCHAR( Manufacturer, 20, PR, STRING ); - HAPCHAR( Model, 21, PR, STRING ); - HAPCHAR( MotionDetected, 22, PR+EV, BOOL ); - HAPCHAR( Mute, 11A, PW+PR+EV, BOOL ); - HAPCHAR( Name, 23, PR, STRING ); - HAPCHAR( NitrogenDioxideDensity, C4, PR+EV, FLOAT ); - HAPCHAR( ObstructionDetected, 24, PR+EV, BOOL ); - HAPCHAR( PM25Density, C6, PR+EV, FLOAT ); - HAPCHAR( OccupancyDetected, 71, PR+EV, UINT8 ); - HAPCHAR( OutletInUse, 26, PR+EV, BOOL ); - HAPCHAR( On, 25, PR+PW+EV, BOOL ); - HAPCHAR( OzoneDensity, C3, PR+EV, FLOAT ); - HAPCHAR( PM10Density, C7, PR+EV, FLOAT ); - HAPCHAR( PositionState, 72, PR+EV, UINT8 ); - HAPCHAR( ProgramMode, D1, PR+EV, UINT8 ); - HAPCHAR( ProgrammableSwitchEvent, 73, PR+EV+NV, UINT8 ); - HAPCHAR( RelativeHumidityDehumidifierThreshold, C9, PR+PW+EV, FLOAT ); - HAPCHAR( RelativeHumidityHumidifierThreshold, CA, PR+PW+EV, FLOAT ); - HAPCHAR( RemainingDuration, D4, PR+EV, UINT32 ); - HAPCHAR( ResetFilterIndication, AD, PW, UINT8 ); - HAPCHAR( RotationDirection, 28, PR+PW+EV, INT ); - HAPCHAR( RotationSpeed, 29, PR+PW+EV, FLOAT ); - HAPCHAR( Saturation, 2F, PR+PW+EV, FLOAT ); - HAPCHAR( SecuritySystemAlarmType, 8E, PR+EV, UINT8 ); - HAPCHAR( SecuritySystemCurrentState, 66, PR+EV, UINT8 ); - HAPCHAR( SecuritySystemTargetState, 67, PW+PR+EV, UINT8 ); - HAPCHAR( SerialNumber, 30, PR, STRING ); - HAPCHAR( ServiceLabelIndex, CB, PR, UINT8 ); - HAPCHAR( ServiceLabelNamespace, CD, PR, UINT8 ); - HAPCHAR( SlatType, C0, PR, UINT8 ); - HAPCHAR( SmokeDetected, 76, PR+EV, UINT8 ); - HAPCHAR( StatusActive, 75, PR+EV, BOOL ); - HAPCHAR( StatusFault, 77, PR+EV, UINT8 ); - HAPCHAR( StatusJammed, 78, PR+EV, UINT8 ); - HAPCHAR( StatusLowBattery, 79, PR+EV, UINT8 ); - HAPCHAR( StatusTampered, 7A, PR+EV, UINT8 ); - HAPCHAR( SulphurDioxideDensity, C5, PR+EV, FLOAT ); - HAPCHAR( SwingMode, B6, PR+EV+PW, UINT8 ); - HAPCHAR( TargetAirPurifierState, A8, PW+PR+EV, UINT8 ); - HAPCHAR( TargetFanState, BF, PW+PR+EV, UINT8 ); - HAPCHAR( TargetTiltAngle, C2, PW+PR+EV, INT ); - HAPCHAR( TargetHeaterCoolerState, B2, PW+PR+EV, UINT8 ); - HAPCHAR( SetDuration, D3, PW+PR+EV, UINT32 ); - HAPCHAR( TargetHorizontalTiltAngle, 7B, PW+PR+EV, INT ); - HAPCHAR( TargetHumidifierDehumidifierState, B4, PW+PR+EV, UINT8 ); - HAPCHAR( TargetPosition, 7C, PW+PR+EV, UINT8 ); - HAPCHAR( TargetDoorState, 32, PW+PR+EV, UINT8 ); - HAPCHAR( TargetHeatingCoolingState, 33, PW+PR+EV, UINT8 ); - HAPCHAR( TargetRelativeHumidity, 34, PW+PR+EV, FLOAT ); - HAPCHAR( TargetTemperature, 35, PW+PR+EV, FLOAT ); - HAPCHAR( TemperatureDisplayUnits, 36, PW+PR+EV, UINT8 ); - HAPCHAR( TargetVerticalTiltAngle, 7D, PW+PR+EV, INT ); - HAPCHAR( ValveType, D5, PR+EV, UINT8 ); - HAPCHAR( Version, 37, PR, STRING ); - HAPCHAR( VOCDensity, C8, PR+EV, FLOAT ); - HAPCHAR( Volume, 119, PW+PR+EV, UINT8 ); - HAPCHAR( WaterLevel, B5, PR+EV, FLOAT ); + HAPCHAR( Active, B0, PW+PR+EV, UINT8, true ); + HAPCHAR( AirQuality, 95, PR+EV, UINT8, true ); + HAPCHAR( BatteryLevel, 68, PR+EV, UINT8, false ); + HAPCHAR( Brightness, 8, PR+PW+EV, INT, false ); + HAPCHAR( CarbonMonoxideLevel, 90, PR+EV, FLOAT, false ); + HAPCHAR( CarbonMonoxidePeakLevel, 91, PR+EV, FLOAT, false ); + HAPCHAR( CarbonDioxideDetected, 92, PR+EV, UINT8, true ); + HAPCHAR( CarbonDioxideLevel, 93, PR+EV, FLOAT, false ); + HAPCHAR( CarbonDioxidePeakLevel, 94, PR+EV, FLOAT, false ); + HAPCHAR( CarbonMonoxideDetected, 69, PR+EV, UINT8, true ); + HAPCHAR( ChargingState, 8F, PR+EV, UINT8, true ); + HAPCHAR( CoolingThresholdTemperature, D, PR+PW+EV, FLOAT, false ); + HAPCHAR( ColorTemperature, CE, PR+PW+EV, UINT32, false ); + HAPCHAR( ContactSensorState, 6A, PR+EV, UINT8, true ); + HAPCHAR( CurrentAmbientLightLevel, 6B, PR+EV, FLOAT, false ); + HAPCHAR( CurrentHorizontalTiltAngle, 6C, PR+EV, INT, false ); + HAPCHAR( CurrentAirPurifierState, A9, PR+EV, UINT8, true ); + HAPCHAR( CurrentSlatState, AA, PR+EV, UINT8, true ); + HAPCHAR( CurrentPosition, 6D, PR+EV, UINT8, false ); + HAPCHAR( CurrentVerticalTiltAngle, 6E, PR+EV, INT, false ); + HAPCHAR( CurrentHumidifierDehumidifierState, B3, PR+EV, UINT8, true ); + HAPCHAR( CurrentDoorState, E, PR+EV, UINT8, true ); + HAPCHAR( CurrentFanState, AF, PR+EV, UINT8, true ); + HAPCHAR( CurrentHeatingCoolingState, F, PR+EV, UINT8, true ); + HAPCHAR( CurrentHeaterCoolerState, B1, PR+EV, UINT8, true ); + HAPCHAR( CurrentRelativeHumidity, 10, PR+EV, FLOAT, false ); + HAPCHAR( CurrentTemperature, 11, PR+EV, FLOAT, false ); + HAPCHAR( CurrentTiltAngle, C1, PR+EV, INT, false ); + HAPCHAR( FilterLifeLevel, AB, PR+EV, FLOAT, false ); + HAPCHAR( FilterChangeIndication, AC, PR+EV, UINT8, true ); + HAPCHAR( FirmwareRevision, 52, PR, STRING, true ); + HAPCHAR( HardwareRevision, 53, PR, STRING, true ); + HAPCHAR( HeatingThresholdTemperature, 12, PR+PW+EV, FLOAT, false ); + HAPCHAR( HoldPosition, 6F, PW, BOOL, true ); + HAPCHAR( Hue, 13, PR+PW+EV, FLOAT, false ); + HAPCHAR( Identify, 14, PW, BOOL, true ); + HAPCHAR( InUse, D2, PR+EV, UINT8, true ); + HAPCHAR( IsConfigured, D6, PR+EV, UINT8, true ); + HAPCHAR( LeakDetected, 70, PR+EV, UINT8, true ); + HAPCHAR( LockCurrentState, 1D, PR+EV, UINT8, true ); + HAPCHAR( LockPhysicalControls, A7, PW+PR+EV, UINT8, true ); + HAPCHAR( LockTargetState, 1E, PW+PR+EV, UINT8, true ); + HAPCHAR( Manufacturer, 20, PR, STRING, true ); + HAPCHAR( Model, 21, PR, STRING, true ); + HAPCHAR( MotionDetected, 22, PR+EV, BOOL, true ); + HAPCHAR( Mute, 11A, PW+PR+EV, BOOL, true ); + HAPCHAR( Name, 23, PR, STRING, true ); + HAPCHAR( NitrogenDioxideDensity, C4, PR+EV, FLOAT, false ); + HAPCHAR( ObstructionDetected, 24, PR+EV, BOOL, true ); + HAPCHAR( PM25Density, C6, PR+EV, FLOAT, false ); + HAPCHAR( OccupancyDetected, 71, PR+EV, UINT8, true ); + HAPCHAR( OutletInUse, 26, PR+EV, BOOL, true ); + HAPCHAR( On, 25, PR+PW+EV, BOOL, true ); + HAPCHAR( OzoneDensity, C3, PR+EV, FLOAT, false ); + HAPCHAR( PM10Density, C7, PR+EV, FLOAT, false ); + HAPCHAR( PositionState, 72, PR+EV, UINT8, true ); + HAPCHAR( ProgramMode, D1, PR+EV, UINT8, true ); + HAPCHAR( ProgrammableSwitchEvent, 73, PR+EV+NV, UINT8, true ); + HAPCHAR( RelativeHumidityDehumidifierThreshold, C9, PR+PW+EV, FLOAT, false ); + HAPCHAR( RelativeHumidityHumidifierThreshold, CA, PR+PW+EV, FLOAT, false ); + HAPCHAR( RemainingDuration, D4, PR+EV, UINT32, false ); + HAPCHAR( ResetFilterIndication, AD, PW, UINT8, true ); + HAPCHAR( RotationDirection, 28, PR+PW+EV, INT, true ); + HAPCHAR( RotationSpeed, 29, PR+PW+EV, FLOAT, false ); + HAPCHAR( Saturation, 2F, PR+PW+EV, FLOAT, false ); + HAPCHAR( SecuritySystemAlarmType, 8E, PR+EV, UINT8, true ); + HAPCHAR( SecuritySystemCurrentState, 66, PR+EV, UINT8, true ); + HAPCHAR( SecuritySystemTargetState, 67, PW+PR+EV, UINT8, true ); + HAPCHAR( SerialNumber, 30, PR, STRING, true ); + HAPCHAR( ServiceLabelIndex, CB, PR, UINT8, true ); + HAPCHAR( ServiceLabelNamespace, CD, PR, UINT8, true ); + HAPCHAR( SlatType, C0, PR, UINT8, true ); + HAPCHAR( SmokeDetected, 76, PR+EV, UINT8, true ); + HAPCHAR( StatusActive, 75, PR+EV, BOOL, true ); + HAPCHAR( StatusFault, 77, PR+EV, UINT8, true ); + HAPCHAR( StatusJammed, 78, PR+EV, UINT8, true ); + HAPCHAR( StatusLowBattery, 79, PR+EV, UINT8, true ); + HAPCHAR( StatusTampered, 7A, PR+EV, UINT8, true ); + HAPCHAR( SulphurDioxideDensity, C5, PR+EV, FLOAT, false ); + HAPCHAR( SwingMode, B6, PR+EV+PW, UINT8, true ); + HAPCHAR( TargetAirPurifierState, A8, PW+PR+EV, UINT8, true ); + HAPCHAR( TargetFanState, BF, PW+PR+EV, UINT8, true ); + HAPCHAR( TargetTiltAngle, C2, PW+PR+EV, INT, false ); + HAPCHAR( TargetHeaterCoolerState, B2, PW+PR+EV, UINT8, true ); + HAPCHAR( SetDuration, D3, PW+PR+EV, UINT32, false ); + HAPCHAR( TargetHorizontalTiltAngle, 7B, PW+PR+EV, INT, false ); + HAPCHAR( TargetHumidifierDehumidifierState, B4, PW+PR+EV, UINT8, true ); + HAPCHAR( TargetPosition, 7C, PW+PR+EV, UINT8, false ); + HAPCHAR( TargetDoorState, 32, PW+PR+EV, UINT8, true ); + HAPCHAR( TargetHeatingCoolingState, 33, PW+PR+EV, UINT8, true ); + HAPCHAR( TargetRelativeHumidity, 34, PW+PR+EV, FLOAT, false ); + HAPCHAR( TargetTemperature, 35, PW+PR+EV, FLOAT, false ); + HAPCHAR( TemperatureDisplayUnits, 36, PW+PR+EV, UINT8, true ); + HAPCHAR( TargetVerticalTiltAngle, 7D, PW+PR+EV, INT, false ); + HAPCHAR( ValveType, D5, PR+EV, UINT8, true ); + HAPCHAR( Version, 37, PR, STRING, true ); + HAPCHAR( VOCDensity, C8, PR+EV, FLOAT, false ); + HAPCHAR( Volume, 119, PW+PR+EV, UINT8, false ); + HAPCHAR( WaterLevel, B5, PR+EV, FLOAT, false ); }; extern HapCharacteristics hapChars; diff --git a/src/HomeSpan.cpp b/src/HomeSpan.cpp index da10762..9a18457 100644 --- a/src/HomeSpan.cpp +++ b/src/HomeSpan.cpp @@ -1460,6 +1460,7 @@ SpanCharacteristic::SpanCharacteristic(HapChar *hapChar){ perms=hapChar->perms; hapName=hapChar->hapName; format=hapChar->format; + staticRange=hapChar->staticRange; homeSpan.configLog+="---->Characteristic " + String(hapName); diff --git a/src/HomeSpan.h b/src/HomeSpan.h index f1951c8..50801b4 100644 --- a/src/HomeSpan.h +++ b/src/HomeSpan.h @@ -243,6 +243,7 @@ struct SpanCharacteristic{ UVal minValue; // Characteristic minimum (not applicable for STRING) UVal maxValue; // Characteristic maximum (not applicable for STRING) UVal stepValue; // Characteristic step size (not applicable for STRING) + boolean staticRange; // Flag that indiates whether Range is static and cannot be changed with setRange() boolean customRange=false; // Flag for custom ranges boolean *ev; // Characteristic Event Notify Enable (per-connection) @@ -341,10 +342,10 @@ struct SpanCharacteristic{ template SpanCharacteristic *setRange(A min, B max, S step=0){ char c[256]; - homeSpan.configLog+="------>Range: "; + homeSpan.configLog+=String("------>Set Range for ") + String(hapName) + "-" + String(iid); - if(format==BOOL || format==STRING){ - sprintf(c,"*** ERROR! Can't change range for STRING or BOOL Characteristics! ***\n",hapName); + if(staticRange){ + sprintf(c," *** ERROR! Can't change range for this Characteristic! ***\n"); homeSpan.nFatalErrors++; } else { @@ -354,9 +355,9 @@ struct SpanCharacteristic{ customRange=true; if(step>0) - sprintf(c,"%s/%s/%s\n",uvPrint(minValue),uvPrint(maxValue),uvPrint(stepValue)); + sprintf(c,": %s/%s/%s\n",uvPrint(minValue),uvPrint(maxValue),uvPrint(stepValue)); else - sprintf(c,"%s/%s\n",uvPrint(minValue),uvPrint(maxValue)); + sprintf(c,": %s/%s\n",uvPrint(minValue),uvPrint(maxValue)); } homeSpan.configLog+=c; return(this); @@ -364,6 +365,7 @@ struct SpanCharacteristic{ } // setRange() template void init(T val, A min=0, B max=1){ + uvSet(value,val); uvSet(newValue,val); uvSet(minValue,min); diff --git a/src/Span.h b/src/Span.h index 7e95597..7069572 100644 --- a/src/Span.h +++ b/src/Span.h @@ -381,116 +381,111 @@ namespace Service { // SPAN CHARACTERISTICS (HAP Chapter 9) // ////////////////////////////////////////// -// Macro to define Span Characteristic structures based on name of HAP Characteristic, default value, and mix/max value (not applicable for STRING) +// Macro to define Span Characteristic structures based on name of HAP Characteristic, default value, and mix/max value (not applicable for STRING or BOOL which default to min=0, max=1) -#define CREATE_CHAR_FLOAT(HAPCHAR,DEFVAL,MINVAL,MAXVAL) struct HAPCHAR : SpanCharacteristic { HAPCHAR(double val=DEFVAL) : SpanCharacteristic {&hapChars.HAPCHAR} { init(val,(double)MINVAL,(double)MAXVAL); } }; -#define CREATE_CHAR_INT(HAPCHAR,DEFVAL) struct HAPCHAR : SpanCharacteristic { HAPCHAR(int val=DEFVAL) : SpanCharacteristic {&hapChars.HAPCHAR} { init(val); } }; -#define CREATE_CHAR_UINT8(HAPCHAR,DEFVAL) struct HAPCHAR : SpanCharacteristic { HAPCHAR(uint8_t val=DEFVAL) : SpanCharacteristic {&hapChars.HAPCHAR} { init(val); } }; -#define CREATE_CHAR_UINT16(HAPCHAR,DEFVAL) struct HAPCHAR : SpanCharacteristic { HAPCHAR(uint16_t val=DEFVAL) : SpanCharacteristic {&hapChars.HAPCHAR} { init(val); } }; -#define CREATE_CHAR_UINT32(HAPCHAR,DEFVAL) struct HAPCHAR : SpanCharacteristic { HAPCHAR(uint32_t val=DEFVAL) : SpanCharacteristic {&hapChars.HAPCHAR} { init(val); } }; -#define CREATE_CHAR_UINT64(HAPCHAR,DEFVAL) struct HAPCHAR : SpanCharacteristic { HAPCHAR(uint64_t val=DEFVAL) : SpanCharacteristic {&hapChars.HAPCHAR} { init(val); } }; -#define CREATE_CHAR_BOOL(HAPCHAR,DEFVAL) struct HAPCHAR : SpanCharacteristic { HAPCHAR(boolean val=DEFVAL) : SpanCharacteristic {&hapChars.HAPCHAR} { init(val); } }; -#define CREATE_CHAR_STRING(HAPCHAR,DEFVAL) struct HAPCHAR : SpanCharacteristic { HAPCHAR(const char *val=DEFVAL) : SpanCharacteristic {&hapChars.HAPCHAR} { init(val); } }; +#define CREATE_CHAR(TYPE,HAPCHAR,DEFVAL,MINVAL,MAXVAL) \ + struct HAPCHAR : SpanCharacteristic { HAPCHAR(TYPE val=DEFVAL) : SpanCharacteristic {&hapChars.HAPCHAR} { init(val,(TYPE)MINVAL,(TYPE)MAXVAL); } }; namespace Characteristic { - CREATE_CHAR_UINT8(Active,0); - CREATE_CHAR_UINT8(AirQuality,0); - CREATE_CHAR_UINT8(BatteryLevel,0); - CREATE_CHAR_INT(Brightness,0); - CREATE_CHAR_FLOAT(CarbonMonoxideLevel,0,0,100); - CREATE_CHAR_FLOAT(CarbonMonoxidePeakLevel,0,0,100); - CREATE_CHAR_UINT8(CarbonMonoxideDetected,0); - CREATE_CHAR_FLOAT(CarbonDioxideLevel,0,0,100000); - CREATE_CHAR_FLOAT(CarbonDioxidePeakLevel,0,0,100000); - CREATE_CHAR_UINT8(CarbonDioxideDetected,0); - CREATE_CHAR_UINT8(ChargingState,0); - CREATE_CHAR_FLOAT(CoolingThresholdTemperature,10,10,35); - CREATE_CHAR_UINT32(ColorTemperature,200); - CREATE_CHAR_UINT8(ContactSensorState,1); - CREATE_CHAR_FLOAT(CurrentAmbientLightLevel,1,0.0001,100000); - CREATE_CHAR_INT(CurrentHorizontalTiltAngle,0); - CREATE_CHAR_UINT8(CurrentAirPurifierState,1); - CREATE_CHAR_UINT8(CurrentSlatState,0); - CREATE_CHAR_UINT8(CurrentPosition,0); - CREATE_CHAR_INT(CurrentVerticalTiltAngle,0); - CREATE_CHAR_UINT8(CurrentHumidifierDehumidifierState,1); - CREATE_CHAR_UINT8(CurrentDoorState,1); - CREATE_CHAR_UINT8(CurrentFanState,1); - CREATE_CHAR_UINT8(CurrentHeatingCoolingState,0); - CREATE_CHAR_UINT8(CurrentHeaterCoolerState,1); - CREATE_CHAR_FLOAT(CurrentRelativeHumidity,0,0,100); - CREATE_CHAR_FLOAT(CurrentTemperature,0,0,100); - CREATE_CHAR_INT(CurrentTiltAngle,0); - CREATE_CHAR_FLOAT(FilterLifeLevel,0,0,100); - CREATE_CHAR_UINT8(FilterChangeIndication,0); - CREATE_CHAR_STRING(FirmwareRevision,"1.0.0"); - CREATE_CHAR_STRING(HardwareRevision,"1.0.0"); - CREATE_CHAR_FLOAT(HeatingThresholdTemperature,16,0,25); - CREATE_CHAR_BOOL(HoldPosition,false); - CREATE_CHAR_FLOAT(Hue,0,0,360); - CREATE_CHAR_BOOL(Identify,false); - CREATE_CHAR_UINT8(InUse,0); - CREATE_CHAR_UINT8(IsConfigured,0); - CREATE_CHAR_UINT8(LeakDetected,0); - CREATE_CHAR_UINT8(LockCurrentState,0); - CREATE_CHAR_UINT8(LockPhysicalControls,0); - CREATE_CHAR_UINT8(LockTargetState,0); - CREATE_CHAR_STRING(Manufacturer,"HomeSpan"); - CREATE_CHAR_STRING(Model,"HomeSpan-ESP32"); - CREATE_CHAR_BOOL(MotionDetected,false); - CREATE_CHAR_BOOL(Mute,false); - CREATE_CHAR_STRING(Name,"unnamed"); - CREATE_CHAR_FLOAT(NitrogenDioxideDensity,0,0,1000); - CREATE_CHAR_BOOL(ObstructionDetected,false); - CREATE_CHAR_FLOAT(PM25Density,0,0,1000); - CREATE_CHAR_UINT8(OccupancyDetected,0); - CREATE_CHAR_BOOL(OutletInUse,false); - CREATE_CHAR_BOOL(On,false); - CREATE_CHAR_FLOAT(OzoneDensity,0,0,1000); - CREATE_CHAR_FLOAT(PM10Density,0,0,1000); - CREATE_CHAR_UINT8(PositionState,2); - CREATE_CHAR_UINT8(ProgramMode,0); - CREATE_CHAR_UINT8(ProgrammableSwitchEvent,0); - CREATE_CHAR_FLOAT(RelativeHumidityDehumidifierThreshold,50,0,100); - CREATE_CHAR_FLOAT(RelativeHumidityHumidifierThreshold,50,0,100); - CREATE_CHAR_UINT32(RemainingDuration,60); - CREATE_CHAR_UINT8(ResetFilterIndication,0); - CREATE_CHAR_INT(RotationDirection,0); - CREATE_CHAR_FLOAT(RotationSpeed,0,0,100); - CREATE_CHAR_FLOAT(Saturation,0,0,100); - CREATE_CHAR_UINT8(SecuritySystemAlarmType,0); - CREATE_CHAR_UINT8(SecuritySystemCurrentState,3); - CREATE_CHAR_UINT8(SecuritySystemTargetState,3); - CREATE_CHAR_STRING(SerialNumber,"HS-12345"); - CREATE_CHAR_UINT8(ServiceLabelIndex,1); - CREATE_CHAR_UINT8(ServiceLabelNamespace,1); - CREATE_CHAR_UINT8(SlatType,0); - CREATE_CHAR_UINT8(SmokeDetected,0); - CREATE_CHAR_BOOL(StatusActive,true); - CREATE_CHAR_UINT8(StatusFault,0); - CREATE_CHAR_UINT8(StatusJammed,0); - CREATE_CHAR_UINT8(StatusLowBattery,0); - CREATE_CHAR_UINT8(StatusTampered,0); - CREATE_CHAR_FLOAT(SulphurDioxideDensity,0,0,1000); - CREATE_CHAR_UINT8(SwingMode,0); - CREATE_CHAR_UINT8(TargetAirPurifierState,1); - CREATE_CHAR_UINT8(TargetFanState,1); - CREATE_CHAR_INT(TargetTiltAngle,0); - CREATE_CHAR_UINT32(SetDuration,60); - CREATE_CHAR_INT(TargetHorizontalTiltAngle,0); - CREATE_CHAR_UINT8(TargetHumidifierDehumidifierState,0); - CREATE_CHAR_UINT8(TargetPosition,0); - CREATE_CHAR_UINT8(TargetDoorState,1); - CREATE_CHAR_UINT8(TargetHeatingCoolingState,0); - CREATE_CHAR_FLOAT(TargetRelativeHumidity,0,0,100); - CREATE_CHAR_FLOAT(TargetTemperature,16,10,38); - CREATE_CHAR_UINT8(TemperatureDisplayUnits,0); - CREATE_CHAR_INT(TargetVerticalTiltAngle,0); - CREATE_CHAR_UINT8(ValveType,0); - CREATE_CHAR_STRING(Version,"1.0.0"); - CREATE_CHAR_FLOAT(VOCDensity,0,0,1000); - CREATE_CHAR_UINT8(Volume,0); - CREATE_CHAR_FLOAT(WaterLevel,0,0,100); + CREATE_CHAR(uint8_t,Active,0,0,1); + CREATE_CHAR(uint8_t,AirQuality,0,0,5); + 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(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(double,CoolingThresholdTemperature,10,10,35); + CREATE_CHAR(uint32_t,ColorTemperature,200,140,500); + CREATE_CHAR(uint8_t,ContactSensorState,1,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,CurrentPosition,0,0,100); + CREATE_CHAR(int,CurrentVerticalTiltAngle,0,-90,90); + 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(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(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); + CREATE_CHAR(boolean,HoldPosition,false,0,1); + CREATE_CHAR(double,Hue,0,0,360); + CREATE_CHAR(boolean,Identify,false,0,1); + 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(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(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(boolean,OutletInUse,false,0,1); + CREATE_CHAR(boolean,On,false,0,1); + CREATE_CHAR(double,OzoneDensity,0,0,1000); + CREATE_CHAR(double,PM10Density,0,0,1000); + CREATE_CHAR(uint8_t,PositionState,2,0,2); + CREATE_CHAR(uint8_t,ProgramMode,0,0,2); + CREATE_CHAR(uint8_t,ProgrammableSwitchEvent,0,0,2); + 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,ResetFilterIndication,0,1,1); + CREATE_CHAR(int,RotationDirection,0,0,1); + 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(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,SmokeDetected,0,0,1); + 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(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(int,TargetTiltAngle,0,-90,90); + CREATE_CHAR(uint8_t,TargetHeaterCoolerState,0,0,2); + 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,TargetPosition,0,0,100); + CREATE_CHAR(uint8_t,TargetDoorState,1,0,1); + CREATE_CHAR(uint8_t,TargetHeatingCoolingState,0,0,3); + CREATE_CHAR(double,TargetRelativeHumidity,0,0,100); + CREATE_CHAR(double,TargetTemperature,16,10,38); + CREATE_CHAR(uint8_t,TemperatureDisplayUnits,0,0,1); + CREATE_CHAR(int,TargetVerticalTiltAngle,0,-90,90); + CREATE_CHAR(uint8_t,ValveType,0,0,3); + CREATE_CHAR(const char *,Version,"1.0.0",0,1); + CREATE_CHAR(double,VOCDensity,0,0,1000); + CREATE_CHAR(uint8_t,Volume,0,0,100); + CREATE_CHAR(double,WaterLevel,0,0,100); }