1 Commits

Author SHA1 Message Date
Pascal Bourque
d861a50136 fix!: Device and state properties are now optional (#170)
Updated DeviceBase, BrandInfo, and DeviceState interfaces to make most properties optional, improving flexibility for partial objects and better handling of missing data.
2025-11-01 09:33:31 -04:00
3 changed files with 53 additions and 50 deletions

View File

@@ -65,9 +65,10 @@ async function main() {
client.emitter.on('statusChanged', (status) => {
try {
const device = devices.DevicesObj[status.deviceId];
const watts = status.current !== undefined ? status.current * device.Voltage : undefined;
const watts =
status.current !== undefined && device.Voltage !== undefined ? status.current * device.Voltage : undefined;
rootLogger.info(
`[${status.deviceId}] '${device.Name}' status changed: ${status.temperature}°C, ${status.humidity}%, ${watts ?? 'na'}W`
`[${status.deviceId}] '${device.Name ?? 'Unknown'}' status changed: ${status.temperature}°C, ${status.humidity}%, ${watts ?? 'na'}W`
);
} catch (error) {
rootLogger.error(error, `Error processing status update for device '${status.deviceId}'`);
@@ -77,7 +78,9 @@ async function main() {
client.emitter.on('setPointChanged', (change) => {
try {
const device = devices.DevicesObj[change.deviceId];
rootLogger.info(`'${device.Name}' setpoint changed from ${change.previousSetPoint} to ${change.newSetPoint}`);
rootLogger.info(
`'${device.Name ?? 'Unknown'}' setpoint changed from ${change.previousSetPoint} to ${change.newSetPoint}`
);
} catch (error) {
rootLogger.error(error, `Error processing setpoint update for device '${change.deviceId}'`);
}
@@ -86,7 +89,7 @@ async function main() {
client.emitter.on('stateChanged', (change) => {
try {
const device = devices.DevicesObj[change.deviceId];
rootLogger.info(change, `'${device.Name}' state changed.`);
rootLogger.info(change, `'${device.Name ?? 'Unknown'}' state changed.`);
} catch (error) {
rootLogger.error(error, `Error processing state update for device '${change.deviceId}'`);
}
@@ -96,7 +99,7 @@ async function main() {
await Promise.all(
Object.entries(devices.DevicesObj).map(async ([deviceId, device]) => {
const serial = await client.getDeviceSerialNumber(deviceId);
rootLogger.info(`Serial number for device '${deviceId}' (${device.Name}): ${serial}`);
rootLogger.info(`Serial number for device '${deviceId}' (${device.Name ?? 'Unknown'}): ${serial}`);
await client.startRealtimeUpdates(deviceId);
})

View File

@@ -10,9 +10,9 @@ export interface BrandInfo {
/** Unique identifier for the brand */
Id: number;
/** Remote control model number for the AC device */
remoteModelNumber: string;
remoteModelNumber?: string;
/** Original Equipment Manufacturer brand name */
OEMBrand: string;
OEMBrand?: string;
}
/**
@@ -56,55 +56,55 @@ export interface ModeObj {
*/
export interface DeviceBase {
/** Button digital input configuration value */
ButtonDI: number;
ButtonDI?: number;
/** Maximum current rating as a string value */
MaxCurrent: string;
MaxCurrent?: string;
/** Device model identifier string */
Model: string;
/** Button average value configuration */
ButtonAVE: number;
ButtonAVE?: number;
/** Operating voltage of the device */
Voltage: number;
Voltage?: number;
/** Button polling interval configuration */
ButtonPolling: number;
ButtonPolling?: number;
/** Minimum brightness level (0-100) */
MinBrightness: number;
MinBrightness?: number;
/** User-assigned device name */
Name: string;
Name?: string;
/** Button low power mode configuration */
ButtonLowPower: number;
ButtonLowPower?: number;
/** Type of heater controlled by the device */
HeaterType: string;
HeaterType?: string;
/** Button repeat delay configuration in milliseconds */
ButtonRepeatDelay: number;
ButtonRepeatDelay?: number;
/** Button repeat start delay configuration in milliseconds */
ButtonRepeatStart: number;
ButtonRepeatStart?: number;
/** Display animation style setting */
Animation: string;
Animation?: string;
/** Maximum brightness level (0-100) */
MaxBrightness: number;
MaxBrightness?: number;
/** Array of user IDs allowed to control this device */
AllowedUsers: string[];
AllowedUsers?: string[];
/** Current button state indicator */
ButtonState: string;
ButtonState?: string;
/** Home identifier that this device belongs to */
Home: string;
Home?: string;
/** Button sensitivity threshold configuration */
ButtonThreshold: number;
ButtonThreshold?: number;
/** Data format version used by the device */
Format: string;
Format?: string;
/** Time zone setting for the device */
TimeZone: string;
TimeZone?: string;
/** Unix timestamp of when device was last paired */
LastPaired: number;
LastPaired?: number;
/** Minimum temperature setpoint allowed */
MinSetpoint: number;
MinSetpoint?: number;
/** Current operating mode of the device */
Mode: ModeObj;
Mode?: ModeObj;
/** User ID of the device owner */
Owner: string;
Owner?: string;
/** Maximum temperature setpoint allowed */
MaxSetpoint: number;
MaxSetpoint?: number;
/** Unique device identifier */
Id: string;
/** Optional zone assignment for the device */

View File

@@ -13,43 +13,43 @@ export interface DeviceState {
/** Overall timestamp for the device state */
Timestamp: number;
/** Time the device has been on */
OnTime: TimestampedValue<number>;
OnTime?: TimestampedValue<number>;
/** Temperature set point */
SetPoint: TimestampedValue<number>;
SetPoint?: TimestampedValue<number>;
/** Display brightness level */
Brightness: TimestampedValue<number>;
Brightness?: TimestampedValue<number>;
/** Schedule mode setting */
ScheduleMode: TimestampedValue<number>;
ScheduleMode?: TimestampedValue<number>;
/** Hold time setting */
HoldTime: TimestampedValue<number>;
HoldTime?: TimestampedValue<number>;
/** Wi-Fi signal strength */
Rssi: TimestampedValue<number>;
Rssi?: TimestampedValue<number>;
/** Thermostat mode */
TstatMode: TimestampedValue<number>;
TstatMode?: TimestampedValue<number>;
/** Available heap memory */
FreeHeap: TimestampedValue<number>;
FreeHeap?: TimestampedValue<number>;
/** Sensor temperature reading */
SensorTemp: TimestampedValue<number>;
SensorTemp?: TimestampedValue<number>;
/** Current mode */
Mode: TimestampedValue<number>;
Mode?: TimestampedValue<number>;
/** Voltage measurement */
Voltage: TimestampedValue<number>;
Voltage?: TimestampedValue<number>;
/** Temperature corrected for calibration */
CorrectedTemp: TimestampedValue<number>;
CorrectedTemp?: TimestampedValue<number>;
/** Duty cycle percentage */
Duty: TimestampedValue<number>;
Duty?: TimestampedValue<number>;
/** Heat sink temperature */
HeatSink: TimestampedValue<number>;
HeatSink?: TimestampedValue<number>;
/** Time the device has been off */
OffTime: TimestampedValue<number>;
OffTime?: TimestampedValue<number>;
/** Connection status */
Connected: TimestampedValue<boolean>;
Connected?: TimestampedValue<boolean>;
/** Current consumption */
Current: TimestampedValue<number>;
Current?: TimestampedValue<number>;
/** Humidity reading */
Humidity: TimestampedValue<number>;
Humidity?: TimestampedValue<number>;
/** Lock status */
Lock: TimestampedValue<number>;
Lock?: TimestampedValue<number>;
/** Fan speed */
FanSpeed?: TimestampedValue<number>;
}