UNPKG

eufy-security-client-fork

Version:

Client to comunicate with Eufy-Security devices

858 lines 121 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.UnknownDevice = exports.SmartSafe = exports.Keypad = exports.Lock = exports.MotionSensor = exports.EntrySensor = exports.Sensor = exports.FloodlightCamera = exports.BatteryDoorbellCamera = exports.WiredDoorbellCamera = exports.DoorbellCamera = exports.IndoorCamera = exports.SoloCamera = exports.Camera = exports.Device = void 0; const tiny_typed_emitter_1 = require("tiny-typed-emitter"); const types_1 = require("./types"); const parameter_1 = require("./parameter"); const types_2 = require("../p2p/types"); const utils_1 = require("./utils"); const utils_2 = require("../p2p/utils"); const types_3 = require("../push/types"); const utils_3 = require("../utils"); const error_1 = require("./error"); class Device extends tiny_typed_emitter_1.TypedEmitter { constructor(api, device) { super(); this.eventTimeouts = new Map(); this.properties = {}; this.rawProperties = {}; this.ready = false; this.api = api; this.rawDevice = device; this.log = api.getLog(); } initializeState() { this.update(this.rawDevice); this.ready = true; setImmediate(() => { this.emit("ready", this); }); } getRawDevice() { return this.rawDevice; } update(device, cloudOnlyProperties = false) { this.rawDevice = device; const metadata = this.getPropertiesMetadata(); for (const property of Object.values(metadata)) { if (this.rawDevice[property.key] !== undefined && typeof property.key === "string") { this.updateProperty(property.name, this.rawDevice[property.key]); } else if (this.properties[property.name] === undefined && property.default !== undefined && !this.ready) { this.updateProperty(property.name, property.default); } } if (!cloudOnlyProperties) { this.rawDevice.params.forEach(param => { this.updateRawProperty(param.param_type, param.param_value); }); } this.log.debug("Normalized Properties", { deviceSN: this.getSerial(), properties: this.properties }); } updateProperty(name, value) { if ((this.properties[name] !== undefined && this.properties[name] !== value) || this.properties[name] === undefined) { const oldValue = this.properties[name]; this.properties[name] = value; if (!name.startsWith("hidden-")) { if (this.ready) this.emit("property changed", this, name, value); } try { this.handlePropertyChange(this.getPropertyMetadata(name), oldValue, this.properties[name]); } catch (error) { if (error instanceof error_1.InvalidPropertyError) { this.log.error(`Invalid Property ${name} error`, error); } else { this.log.error(`Property ${name} error`, error); } } /*} catch (error) { this.log.error("updateProperty Error:", { name: name, value: value, error: error }); }*/ return true; } return false; } updateRawProperties(values) { Object.keys(values).forEach(paramtype => { const param_type = Number.parseInt(paramtype); this.updateRawProperty(param_type, values[param_type]); }); } // eslint-disable-next-line @typescript-eslint/no-unused-vars handlePropertyChange(metadata, oldValue, newValue) { if ((metadata.key === types_1.ParamType.DETECT_MOTION_SENSITIVE || metadata.key === types_1.ParamType.DETECT_MODE) && this.isWiredDoorbell()) { //TODO: Not perfectly solved, can in certain cases briefly trigger a double event where the last event is the correct one const rawSensitivity = this.getRawProperty(types_1.ParamType.DETECT_MOTION_SENSITIVE); const rawMode = this.getRawProperty(types_1.ParamType.DETECT_MODE); if (rawSensitivity !== undefined && rawMode !== undefined) { const sensitivity = Number.parseInt(rawSensitivity); const mode = Number.parseInt(rawMode); if (mode === 3 && sensitivity === 2) { this.updateProperty(types_1.PropertyName.DeviceMotionDetectionSensitivity, 1); } else if (mode === 1 && sensitivity === 1) { this.updateProperty(types_1.PropertyName.DeviceMotionDetectionSensitivity, 2); } else if (mode === 1 && sensitivity === 2) { this.updateProperty(types_1.PropertyName.DeviceMotionDetectionSensitivity, 3); } else if (mode === 1 && sensitivity === 3) { this.updateProperty(types_1.PropertyName.DeviceMotionDetectionSensitivity, 4); } else if (mode === 2 && sensitivity === 1) { this.updateProperty(types_1.PropertyName.DeviceMotionDetectionSensitivity, 5); } } } else if (metadata.name === types_1.PropertyName.DeviceWifiRSSI) { this.updateProperty(types_1.PropertyName.DeviceWifiSignalLevel, (0, utils_1.calculateWifiSignalLevel)(this, newValue)); } } updateRawProperty(type, value) { const parsedValue = parameter_1.ParameterHelper.readValue(type, value, this.log); if ((this.rawProperties[type] !== undefined && this.rawProperties[type] !== parsedValue) || this.rawProperties[type] === undefined) { this.rawProperties[type] = parsedValue; if (this.ready) this.emit("raw property changed", this, type, this.rawProperties[type]); const metadata = this.getPropertiesMetadata(); for (const property of Object.values(metadata)) { if (property.key === type) { try { this.updateProperty(property.name, this.convertRawPropertyValue(property, this.rawProperties[type])); } catch (error) { if (error instanceof error_1.PropertyNotSupportedError) { this.log.debug("Property not supported error", error); } else { this.log.error("Property error", error); } } } } return true; } return false; } convertRawPropertyValue(property, value) { try { if (property.key === types_1.ParamType.PRIVATE_MODE || property.key === types_1.ParamType.OPEN_DEVICE || property.key === types_2.CommandType.CMD_DEVS_SWITCH) { if (this.isIndoorCamera() || this.isWiredDoorbell() || this.getDeviceType() === types_1.DeviceType.FLOODLIGHT_CAMERA_8422 || this.getDeviceType() === types_1.DeviceType.FLOODLIGHT_CAMERA_8424) { return value !== undefined ? (value === "true" ? true : false) : false; } return value !== undefined ? (value === "0" ? true : false) : false; } else if (property.key === types_2.CommandType.CMD_BAT_DOORBELL_SET_NOTIFICATION_MODE) { switch (property.name) { case types_1.PropertyName.DeviceNotificationRing: { const booleanProperty = property; try { return value !== undefined ? (Number.parseInt(value.notification_ring_onoff) === 1 ? true : false) : booleanProperty.default !== undefined ? booleanProperty.default : false; } catch (error) { this.log.error("Convert CMD_BAT_DOORBELL_SET_NOTIFICATION_MODE DeviceNotificationRing Error:", { property: property, value: value, error: error }); return booleanProperty.default !== undefined ? booleanProperty.default : false; } } case types_1.PropertyName.DeviceNotificationMotion: { const booleanProperty = property; try { return value !== undefined ? (Number.parseInt(value.notification_motion_onoff) === 1 ? true : false) : booleanProperty.default !== undefined ? booleanProperty.default : false; } catch (error) { this.log.error("Convert CMD_BAT_DOORBELL_SET_NOTIFICATION_MODE DeviceNotificationMotion Error:", { property: property, value: value, error: error }); return booleanProperty.default !== undefined ? booleanProperty.default : false; } } case types_1.PropertyName.DeviceNotificationType: { const numericProperty = property; try { return value !== undefined ? Number.parseInt(value.notification_style) : (numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0)); } catch (error) { this.log.error("Convert CMD_BAT_DOORBELL_SET_NOTIFICATION_MODE DeviceNotificationType Error:", { property: property, value: value, error: error }); return numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0); } } } } else if (property.key === types_1.ParamType.DOORBELL_NOTIFICATION_OPEN) { try { switch (property.name) { case types_1.PropertyName.DeviceNotificationRing: return value !== undefined ? (Number.parseInt(value) === 3 || Number.parseInt(value) === 1 ? true : false) : false; case types_1.PropertyName.DeviceNotificationMotion: return value !== undefined ? (Number.parseInt(value) === 3 || Number.parseInt(value) === 2 ? true : false) : false; } } catch (error) { this.log.error("Convert DOORBELL_NOTIFICATION_OPEN Error:", { property: property, value: value, error: error }); return false; } } else if (property.key === types_2.CommandType.CMD_SET_PIRSENSITIVITY) { try { if (this.getDeviceType() === types_1.DeviceType.CAMERA || this.getDeviceType() === types_1.DeviceType.CAMERA_E) { const convertedValue = ((200 - Number.parseInt(value)) / 2) + 1; return convertedValue; } else if (this.isCamera2Product()) { let convertedValue; switch (Number.parseInt(value)) { case 192: convertedValue = 1; break; case 118: convertedValue = 2; break; case 72: convertedValue = 3; break; case 46: convertedValue = 4; break; case 30: convertedValue = 5; break; case 20: convertedValue = 6; break; case 14: convertedValue = 7; break; default: convertedValue = 4; break; } return convertedValue; } } catch (error) { this.log.error("Convert CMD_SET_PIRSENSITIVITY Error:", { property: property, value: value, error: error }); return value; } } else if (property.key === types_2.CommandType.CMD_SMARTLOCK_AUTO_LOCK_SCHEDULE_STARTTIME || property.key === types_2.CommandType.CMD_SMARTLOCK_AUTO_LOCK_SCHEDULE_ENDTIME) { const tmpBuffer = Buffer.from(value, "hex"); return `${tmpBuffer.slice(0, 1).readInt8().toString().padStart(2, "0")}:${tmpBuffer.slice(1).readInt8().toString().padStart(2, "0")}`; } else if (property.key === types_2.CommandType.CMD_DOORBELL_DUAL_RADAR_WD_DETECTION_SENSITIVITY) { const numericProperty = property; try { switch (property.name) { case types_1.PropertyName.DeviceMotionDetectionSensitivityMode: return value !== undefined && value.model !== undefined ? value.model : (numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0)); case types_1.PropertyName.DeviceMotionDetectionSensitivityStandard: return value !== undefined && value.model === 0 ? (0, utils_1.getDistances)(value.block_list)[0] : (numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0)); case types_1.PropertyName.DeviceMotionDetectionSensitivityAdvancedA: return value !== undefined && value.model === 1 ? (0, utils_1.getDistances)(value.block_list)[0] : (numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0)); case types_1.PropertyName.DeviceMotionDetectionSensitivityAdvancedB: return value !== undefined && value.model === 1 ? (0, utils_1.getDistances)(value.block_list)[1] : (numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0)); case types_1.PropertyName.DeviceMotionDetectionSensitivityAdvancedC: return value !== undefined && value.model === 1 ? (0, utils_1.getDistances)(value.block_list)[2] : (numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0)); case types_1.PropertyName.DeviceMotionDetectionSensitivityAdvancedD: return value !== undefined && value.model === 1 ? (0, utils_1.getDistances)(value.block_list)[3] : (numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0)); case types_1.PropertyName.DeviceMotionDetectionSensitivityAdvancedE: return value !== undefined && value.model === 1 ? (0, utils_1.getDistances)(value.block_list)[4] : (numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0)); case types_1.PropertyName.DeviceMotionDetectionSensitivityAdvancedF: return value !== undefined && value.model === 1 ? (0, utils_1.getDistances)(value.block_list)[5] : (numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0)); case types_1.PropertyName.DeviceMotionDetectionSensitivityAdvancedG: return value !== undefined && value.model === 1 ? (0, utils_1.getDistances)(value.block_list)[6] : (numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0)); case types_1.PropertyName.DeviceMotionDetectionSensitivityAdvancedH: return value !== undefined && value.model === 1 ? (0, utils_1.getDistances)(value.block_list)[7] : (numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0)); } } catch (error) { this.log.error(`Convert CMD_DOORBELL_DUAL_RADAR_WD_DETECTION_SENSITIVITY ${property.name} Error:`, { property: property, value: value, error: error }); return numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0); } } else if (property.key === types_2.CommandType.CMD_DOORBELL_DUAL_RADAR_WD_AUTO_RESPONSE) { switch (property.name) { case types_1.PropertyName.DeviceLoiteringCustomResponseTimeFrom: { const stringProperty = property; try { return (value.setting !== undefined && value.setting.length > 0 !== undefined && value.setting[0].start_hour !== undefined && value.setting[0].start_min !== undefined) ? `${value.setting[0].start_hour.padStart(2, "0")}:${value.setting[0].start_min.padStart(2, "0")}` : stringProperty.default !== undefined ? stringProperty.default : ""; } catch (error) { this.log.error("Convert CMD_DOORBELL_DUAL_RADAR_WD_AUTO_RESPONSE DeviceLoiteringCustomResponseTimeFrom Error:", { property: property, value: value, error: error }); return stringProperty.default !== undefined ? stringProperty.default : ""; } } case types_1.PropertyName.DeviceLoiteringCustomResponseTimeTo: { const stringProperty = property; try { return (value.setting !== undefined && value.setting.length > 0 !== undefined && value.setting[0].end_hour !== undefined && value.setting[0].end_min !== undefined) ? `${value.setting[0].end_hour.padStart(2, "0")}:${value.setting[0].end_min.padStart(2, "0")}` : stringProperty.default !== undefined ? stringProperty.default : ""; } catch (error) { this.log.error("Convert CMD_DOORBELL_DUAL_RADAR_WD_AUTO_RESPONSE DeviceLoiteringCustomResponseTimeTo Error:", { property: property, value: value, error: error }); return stringProperty.default !== undefined ? stringProperty.default : ""; } } case types_1.PropertyName.DeviceLoiteringCustomResponsePhoneNotification: { const booleanProperty = property; try { return value.setting[0].push_notify === 1 ? true : booleanProperty.default !== undefined ? booleanProperty.default : false; } catch (error) { this.log.error("Convert CMD_DOORBELL_DUAL_RADAR_WD_AUTO_RESPONSE DeviceLoiteringCustomResponsePhoneNotification Error:", { property: property, value: value, error: error }); return booleanProperty.default !== undefined ? booleanProperty.default : false; } } case types_1.PropertyName.DeviceLoiteringCustomResponseHomeBaseNotification: { const booleanProperty = property; try { return value.setting[0].homebase_alert === 1 ? true : booleanProperty.default !== undefined ? booleanProperty.default : false; } catch (error) { this.log.error("Convert CMD_DOORBELL_DUAL_RADAR_WD_AUTO_RESPONSE DeviceLoiteringCustomResponseHomeBaseNotification Error:", { property: property, value: value, error: error }); return booleanProperty.default !== undefined ? booleanProperty.default : false; } } case types_1.PropertyName.DeviceLoiteringCustomResponseAutoVoiceResponse: { const booleanProperty = property; try { return value.setting[0].auto_voice_resp === 1 ? true : booleanProperty.default !== undefined ? booleanProperty.default : false; } catch (error) { this.log.error("Convert CMD_DOORBELL_DUAL_RADAR_WD_AUTO_RESPONSE DeviceLoiteringCustomResponseAutoVoiceResponse Error:", { property: property, value: value, error: error }); return booleanProperty.default !== undefined ? booleanProperty.default : false; } } case types_1.PropertyName.DeviceLoiteringCustomResponseAutoVoiceResponseVoice: { const numericProperty = property; try { return (value.setting !== undefined && value.setting.length > 0 !== undefined && value.setting[0].auto_voice_id !== undefined) ? value.setting[0].auto_voice_id : numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0); } catch (error) { this.log.error("Convert CMD_DOORBELL_DUAL_RADAR_WD_AUTO_RESPONSE DeviceLoiteringCustomResponseAutoVoiceResponseVoice Error:", { property: property, value: value, error: error }); return numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0); } } } } else if (property.key === types_2.CommandType.CMD_DOORBELL_DUAL_DELIVERY_GUARD_SWITCH) { const booleanProperty = property; try { return value !== undefined && value.ai_bottom_switch !== undefined ? value.ai_bottom_switch === 1024 : (booleanProperty.default !== undefined ? booleanProperty.default : false); } catch (error) { this.log.error("Convert CMD_DOORBELL_DUAL_DELIVERY_GUARD_SWITCH Error:", { property: property, value: value, error: error }); return booleanProperty.default !== undefined ? booleanProperty.default : false; } } else if (property.key === types_2.CommandType.CMD_DOORBELL_DUAL_PACKAGE_STRAND_TIME) { const stringProperty = property; try { return (value.start_h !== undefined && value.start_m !== undefined) ? `${value.start_h.toString().padStart(2, "0")}:${value.start_m.toString().padStart(2, "0")}` : stringProperty.default !== undefined ? stringProperty.default : ""; } catch (error) { this.log.error("Convert CMD_DOORBELL_DUAL_PACKAGE_STRAND_TIME Error:", { property: property, value: value, error: error }); return stringProperty.default !== undefined ? stringProperty.default : ""; } } else if (property.key === types_2.CommandType.CMD_DOORBELL_DUAL_RING_AUTO_RESPONSE) { switch (property.name) { case types_1.PropertyName.DeviceRingAutoResponse: { const booleanProperty = property; try { return value.setting[0].active === 1 ? true : booleanProperty.default !== undefined ? booleanProperty.default : false; } catch (error) { this.log.error("Convert CMD_DOORBELL_DUAL_RING_AUTO_RESPONSE DeviceRingAutoResponse Error:", { property: property, value: value, error: error }); return booleanProperty.default !== undefined ? booleanProperty.default : false; } } case types_1.PropertyName.DeviceRingAutoResponseVoiceResponse: { const booleanProperty = property; try { return value.setting[0].active === 1 ? true : booleanProperty.default !== undefined ? booleanProperty.default : false; } catch (error) { this.log.error("Convert CMD_DOORBELL_DUAL_RING_AUTO_RESPONSE DeviceRingAutoResponseVoiceResponse Error:", { property: property, value: value, error: error }); return booleanProperty.default !== undefined ? booleanProperty.default : false; } } case types_1.PropertyName.DeviceRingAutoResponseTimeFrom: { const stringProperty = property; try { return (value.setting !== undefined && value.setting.length > 0 !== undefined && value.setting[0].start_hour !== undefined && value.setting[0].start_min !== undefined) ? `${value.setting[0].start_hour.padStart(2, "0")}:${value.setting[0].start_min.padStart(2, "0")}` : stringProperty.default !== undefined ? stringProperty.default : ""; } catch (error) { this.log.error("Convert CMD_DOORBELL_DUAL_RING_AUTO_RESPONSE DeviceRingAutoResponseTimeFrom Error:", { property: property, value: value, error: error }); return stringProperty.default !== undefined ? stringProperty.default : ""; } } case types_1.PropertyName.DeviceRingAutoResponseTimeTo: { const stringProperty = property; try { return (value.setting !== undefined && value.setting.length > 0 !== undefined && value.setting[0].end_hour !== undefined && value.setting[0].end_min !== undefined) ? `${value.setting[0].end_hour.padStart(2, "0")}:${value.setting[0].end_min.padStart(2, "0")}` : stringProperty.default !== undefined ? stringProperty.default : ""; } catch (error) { this.log.error("Convert CMD_DOORBELL_DUAL_RING_AUTO_RESPONSE DeviceRingAutoResponseTimeTo Error:", { property: property, value: value, error: error }); return stringProperty.default !== undefined ? stringProperty.default : ""; } } case types_1.PropertyName.DeviceRingAutoResponseVoiceResponseVoice: { const numericProperty = property; try { return (value.setting !== undefined && value.setting.length > 0 !== undefined && value.setting[0].auto_voice_id !== undefined) ? value.setting[0].auto_voice_id : numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0); } catch (error) { this.log.error("Convert CMD_DOORBELL_DUAL_RING_AUTO_RESPONSE DeviceRingAutoResponseVoiceResponseVoice Error:", { property: property, value: value, error: error }); return numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0); } } } } else if (property.key === types_2.CommandType.CMD_DOORBELL_DUAL_PACKAGE_GUARD_TIME) { switch (property.name) { case types_1.PropertyName.DeviceDeliveryGuardPackageGuardingActivatedTimeFrom: { const stringProperty = property; try { return (value.start_h !== undefined && value.start_m !== undefined) ? `${value.start_h.toString().padStart(2, "0")}:${value.start_m.toString().padStart(2, "0")}` : stringProperty.default !== undefined ? stringProperty.default : ""; } catch (error) { this.log.error("Convert CMD_DOORBELL_DUAL_PACKAGE_GUARD_TIME DeviceDeliveryGuardPackageGuardingActivatedTimeFrom Error:", { property: property, value: value, error: error }); return stringProperty.default !== undefined ? stringProperty.default : ""; } } case types_1.PropertyName.DeviceDeliveryGuardPackageGuardingActivatedTimeTo: { const stringProperty = property; try { return (value.end_h !== undefined && value.end_m !== undefined) ? `${value.end_h.toString().padStart(2, "0")}:${value.end_m.toString().padStart(2, "0")}` : stringProperty.default !== undefined ? stringProperty.default : ""; } catch (error) { this.log.error("Convert CMD_DOORBELL_DUAL_PACKAGE_GUARD_TIME DeviceDeliveryGuardPackageGuardingActivatedTimeTo Error:", { property: property, value: value, error: error }); return stringProperty.default !== undefined ? stringProperty.default : ""; } } } } else if (property.key === types_2.CommandType.CMD_DOORBELL_DUAL_RADAR_WD_DISTANCE) { const numericProperty = property; try { return value !== undefined && value.radar_wd_distance !== undefined ? value.radar_wd_distance : (numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0)); } catch (error) { this.log.error("Convert CMD_DOORBELL_DUAL_RADAR_WD_DISTANCE Error:", { property: property, value: value, error: error }); return numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0); } } else if (property.key === types_2.CommandType.CMD_DOORBELL_DUAL_RADAR_WD_TIME) { const numericProperty = property; try { return value !== undefined && value.radar_wd_time !== undefined ? value.radar_wd_time : (numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0)); } catch (error) { this.log.error("Convert CMD_DOORBELL_DUAL_RADAR_WD_TIME Error:", { property: property, value: value, error: error }); return numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0); } } else if (property.key === types_2.CommandType.CMD_DOORBELL_DUAL_PACKAGE_GUARD_VOICE) { const numericProperty = property; try { return value !== undefined && value.auto_voice_id !== undefined ? value.auto_voice_id : (numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0)); } catch (error) { this.log.error("Convert CMD_DOORBELL_DUAL_PACKAGE_GUARD_VOICE Error:", { property: property, value: value, error: error }); return numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0); } } else if (property.key === types_2.CommandType.CMD_SET_SNOOZE_MODE) { switch (property.name) { case types_1.PropertyName.DeviceSnooze: { const booleanProperty = property; try { return value !== undefined && value.snooze_time !== undefined && value.snooze_time !== "" && Number.parseInt(value.snooze_time) !== 0 ? true : booleanProperty.default !== undefined ? booleanProperty.default : false; } catch (error) { this.log.error("Convert CMD_SET_SNOOZE_MODE DeviceSnooze Error:", { property: property, value: value, error: error }); return booleanProperty.default !== undefined ? booleanProperty.default : false; } } case types_1.PropertyName.DeviceSnoozeTime: { const numericProperty = property; try { return value !== undefined && value.snooze_time !== undefined && value.snooze_time !== "" ? Number.parseInt(value.snooze_time) : (numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0)); } catch (error) { this.log.error("Convert CMD_SET_SNOOZE_MODE DeviceSnoozeTime Error:", { property: property, value: value, error: error }); return numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0); } } } } else if (property.type === "number") { const numericProperty = property; try { return value !== undefined ? Number.parseInt(value) : (numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0)); } catch (error) { this.log.warn("PropertyMetadataNumeric Convert Error:", { property: property, value: value, error: error }); return numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0); } } else if (property.type === "boolean") { const booleanProperty = property; try { return value !== undefined ? (value === "1" || value.toLowerCase() === "true" ? true : false) : (booleanProperty.default !== undefined ? booleanProperty.default : false); } catch (error) { this.log.warn("PropertyMetadataBoolean Convert Error:", { property: property, value: value, error: error }); return booleanProperty.default !== undefined ? booleanProperty.default : false; } } else if (property.type === "string") { const stringProperty = property; return value !== undefined ? value : (stringProperty.default !== undefined ? stringProperty.default : ""); } } catch (error) { this.log.error("Convert Error:", { property: property, value: value, error: error }); } return value; } getPropertyMetadata(name) { const property = this.getPropertiesMetadata()[name]; if (property !== undefined) return property; throw new error_1.InvalidPropertyError(`Property ${name} invalid`); } getPropertyValue(name) { return this.properties[name]; } hasPropertyValue(name) { return this.getPropertyValue(name) !== undefined; } getRawProperty(type) { return this.rawProperties[type]; } getRawProperties() { return this.rawProperties; } getProperties() { const result = {}; for (const property of Object.keys(this.properties)) { if (!property.startsWith("hidden-")) result[property] = this.properties[property]; } return result; } getPropertiesMetadata() { const metadata = types_1.DeviceProperties[this.getDeviceType()]; if (metadata === undefined) return types_1.GenericDeviceProperties; return metadata; } hasProperty(name) { return this.getPropertiesMetadata()[name] !== undefined; } getCommands() { const commands = types_1.DeviceCommands[this.getDeviceType()]; if (commands === undefined) return []; return commands; } hasCommand(name) { return this.getCommands().includes(name); } processPushNotification(_message, _eventDurationSeconds) { // Nothing to do } setCustomPropertyValue(name, value) { const metadata = this.getPropertyMetadata(name); if (typeof metadata.key === "string" && metadata.key.startsWith("custom_")) { this.updateProperty(name, value); } } destroy() { this.eventTimeouts.forEach((timeout) => { clearTimeout(timeout); }); this.eventTimeouts.clear(); } clearEventTimeout(eventType) { const timeout = this.eventTimeouts.get(eventType); if (timeout !== undefined) { clearTimeout(timeout); this.eventTimeouts.delete(eventType); } } static isCamera(type) { if (type == types_1.DeviceType.CAMERA || type == types_1.DeviceType.CAMERA2 || type == types_1.DeviceType.CAMERA_E || type == types_1.DeviceType.CAMERA2C || type == types_1.DeviceType.INDOOR_CAMERA || type == types_1.DeviceType.INDOOR_PT_CAMERA || type == types_1.DeviceType.FLOODLIGHT || type == types_1.DeviceType.DOORBELL || type == types_1.DeviceType.BATTERY_DOORBELL || type == types_1.DeviceType.BATTERY_DOORBELL_2 || type == types_1.DeviceType.BATTERY_DOORBELL_PLUS || type == types_1.DeviceType.DOORBELL_SOLO || type == types_1.DeviceType.CAMERA2C_PRO || type == types_1.DeviceType.CAMERA2_PRO || type == types_1.DeviceType.INDOOR_CAMERA_1080 || type == types_1.DeviceType.INDOOR_PT_CAMERA_1080 || type == types_1.DeviceType.SOLO_CAMERA || type == types_1.DeviceType.SOLO_CAMERA_PRO || type == types_1.DeviceType.SOLO_CAMERA_SPOTLIGHT_1080 || type == types_1.DeviceType.SOLO_CAMERA_SPOTLIGHT_2K || type == types_1.DeviceType.SOLO_CAMERA_SPOTLIGHT_SOLAR || type == types_1.DeviceType.INDOOR_OUTDOOR_CAMERA_1080P || type == types_1.DeviceType.INDOOR_OUTDOOR_CAMERA_1080P_NO_LIGHT || type == types_1.DeviceType.INDOOR_OUTDOOR_CAMERA_2K || type == types_1.DeviceType.INDOOR_COST_DOWN_CAMERA || type == types_1.DeviceType.FLOODLIGHT_CAMERA_8422 || type == types_1.DeviceType.FLOODLIGHT_CAMERA_8423 || type == types_1.DeviceType.FLOODLIGHT_CAMERA_8424) return true; return false; } static hasBattery(type) { if (type == types_1.DeviceType.CAMERA || type == types_1.DeviceType.CAMERA2 || type == types_1.DeviceType.CAMERA_E || type == types_1.DeviceType.CAMERA2C || type == types_1.DeviceType.BATTERY_DOORBELL || type == types_1.DeviceType.BATTERY_DOORBELL_2 || type == types_1.DeviceType.BATTERY_DOORBELL_PLUS || type == types_1.DeviceType.CAMERA2C_PRO || type == types_1.DeviceType.CAMERA2_PRO || type == types_1.DeviceType.SOLO_CAMERA || type == types_1.DeviceType.SOLO_CAMERA_PRO || type == types_1.DeviceType.SOLO_CAMERA_SPOTLIGHT_1080 || type == types_1.DeviceType.SOLO_CAMERA_SPOTLIGHT_2K || type == types_1.DeviceType.SOLO_CAMERA_SPOTLIGHT_SOLAR || type == types_1.DeviceType.LOCK_WIFI || type == types_1.DeviceType.LOCK_WIFI_NO_FINGER || type == types_1.DeviceType.SMART_SAFE_7400 || type == types_1.DeviceType.SMART_SAFE_7401 || type == types_1.DeviceType.SMART_SAFE_7402 || type == types_1.DeviceType.SMART_SAFE_7403) //TODO: Add other battery devices return true; return false; } static isStation(type) { if (type == types_1.DeviceType.STATION) return true; return false; } static isSensor(type) { if (type == types_1.DeviceType.SENSOR || type == types_1.DeviceType.MOTION_SENSOR) return true; return false; } static isKeyPad(type) { return types_1.DeviceType.KEYPAD == type; } static isDoorbell(type) { if (type == types_1.DeviceType.DOORBELL || type == types_1.DeviceType.BATTERY_DOORBELL || type == types_1.DeviceType.BATTERY_DOORBELL_2 || type == types_1.DeviceType.BATTERY_DOORBELL_PLUS || type == types_1.DeviceType.DOORBELL_SOLO) return true; return false; } static isWiredDoorbell(type) { if (type == types_1.DeviceType.DOORBELL) return true; return false; } static isWiredDoorbellDual(type) { if (type == types_1.DeviceType.DOORBELL_SOLO) return true; return false; } static isIndoorCamera(type) { if (type == types_1.DeviceType.INDOOR_CAMERA || type == types_1.DeviceType.INDOOR_CAMERA_1080 || type == types_1.DeviceType.INDOOR_PT_CAMERA || type == types_1.DeviceType.INDOOR_PT_CAMERA_1080 || type == types_1.DeviceType.INDOOR_OUTDOOR_CAMERA_1080P || type == types_1.DeviceType.INDOOR_OUTDOOR_CAMERA_1080P_NO_LIGHT || type == types_1.DeviceType.INDOOR_OUTDOOR_CAMERA_2K || type == types_1.DeviceType.INDOOR_COST_DOWN_CAMERA) return true; return false; } static isPanAndTiltCamera(type) { if (type == types_1.DeviceType.INDOOR_PT_CAMERA || type == types_1.DeviceType.INDOOR_PT_CAMERA_1080 || type == types_1.DeviceType.FLOODLIGHT_CAMERA_8423 || type == types_1.DeviceType.INDOOR_COST_DOWN_CAMERA) return true; return false; } static isFloodLight(type) { if (type == types_1.DeviceType.FLOODLIGHT || type == types_1.DeviceType.FLOODLIGHT_CAMERA_8422 || type == types_1.DeviceType.FLOODLIGHT_CAMERA_8423 || type == types_1.DeviceType.FLOODLIGHT_CAMERA_8424) return true; return false; } static isLock(type) { return Device.isLockBle(type) || Device.isLockWifi(type) || Device.isLockBleNoFinger(type) || Device.isLockWifiNoFinger(type); } static isLockBle(type) { return types_1.DeviceType.LOCK_BLE == type; } static isLockBleNoFinger(type) { return types_1.DeviceType.LOCK_BLE_NO_FINGER == type; } static isLockWifi(type) { return types_1.DeviceType.LOCK_WIFI == type; } static isLockWifiNoFinger(type) { return types_1.DeviceType.LOCK_WIFI_NO_FINGER == type; } static isBatteryDoorbell1(type) { return types_1.DeviceType.BATTERY_DOORBELL == type; } static isBatteryDoorbell2(type) { return types_1.DeviceType.BATTERY_DOORBELL_2 == type; } static isBatteryDoorbellDual(type) { return types_1.DeviceType.BATTERY_DOORBELL_PLUS == type; } static isDoorbellDual(type) { return types_1.DeviceType.DOORBELL_SOLO == type; } static isBatteryDoorbell(type) { if (type == types_1.DeviceType.BATTERY_DOORBELL || type == types_1.DeviceType.BATTERY_DOORBELL_2 || type == types_1.DeviceType.BATTERY_DOORBELL_PLUS) return true; return false; } static isSoloCamera(type) { return types_1.DeviceType.SOLO_CAMERA == type; } static isSoloCameraPro(type) { return types_1.DeviceType.SOLO_CAMERA_PRO == type; } static isSoloCameraSpotlight1080(type) { return types_1.DeviceType.SOLO_CAMERA_SPOTLIGHT_1080 == type; } static isSoloCameraSpotlight2k(type) { return types_1.DeviceType.SOLO_CAMERA_SPOTLIGHT_2K == type; } static isSoloCameraSpotlightSolar(type) { return types_1.DeviceType.SOLO_CAMERA_SPOTLIGHT_SOLAR == type; } static isSoloCameras(type) { return Device.isSoloCamera(type) || Device.isSoloCameraPro(type) || Device.isSoloCameraSpotlight1080(type) || Device.isSoloCameraSpotlight2k(type) || Device.isSoloCameraSpotlightSolar(type); } static isIndoorOutdoorCamera1080p(type) { return types_1.DeviceType.INDOOR_OUTDOOR_CAMERA_1080P == type; } static isIndoorOutdoorCamera1080pNoLight(type) { return types_1.DeviceType.INDOOR_OUTDOOR_CAMERA_1080P_NO_LIGHT == type; } static isIndoorOutdoorCamera2k(type) { return types_1.DeviceType.INDOOR_OUTDOOR_CAMERA_2K == type; } static isIndoorCamMini(type) { return types_1.DeviceType.INDOOR_COST_DOWN_CAMERA == type; } static isCamera2(type) { //T8114 return types_1.DeviceType.CAMERA2 == type; } static isCamera2C(type) { //T8113 return types_1.DeviceType.CAMERA2C == type; } static isCamera2Pro(type) { //T8140 return types_1.DeviceType.CAMERA2_PRO == type; } static isCamera2CPro(type) { //T8142 return types_1.DeviceType.CAMERA2C_PRO == type; } static isCamera2Product(type) { return Device.isCamera2(type) || Device.isCamera2C(type) || Device.isCamera2Pro(type) || Device.isCamera2CPro(type); } static isEntrySensor(type) { //T8900 return types_1.DeviceType.SENSOR == type; } static isMotionSensor(type) { return types_1.DeviceType.MOTION_SENSOR == type; } static isSmartDrop(type) { return types_1.DeviceType.SMART_DROP == type; } static isSmartSafe(type) { if (type == types_1.DeviceType.SMART_SAFE_7400 || type == types_1.DeviceType.SMART_SAFE_7401 || type == types_1.DeviceType.SMART_SAFE_7402 || type == types_1.DeviceType.SMART_SAFE_7403) return true; return false; } static isIntegratedDeviceBySn(sn) { return sn.startsWith("T8420") || sn.startsWith("T820") || sn.startsWith("T8410") || sn.startsWith("T8400") || sn.startsWith("T8401") || sn.startsWith("T8411") || sn.startsWith("T8414") || sn.startsWith("T8130") || sn.startsWith("T8131") || sn.startsWith("T8422") || sn.startsWith("T8423") || sn.startsWith("T8424") || sn.startsWith("T8440") || sn.startsWith("T8441") || sn.startsWith("T8442"); } static isSoloCameraBySn(sn) { return sn.startsWith("T8130") || sn.startsWith("T8131") || sn.startsWith("T8122") || sn.startsWith("T8123") || sn.startsWith("T8124"); } isCamera() { return Device.isCamera(this.rawDevice.device_type); } isFloodLight() { return Device.isFloodLight(this.rawDevice.device_type); } isDoorbell() { return Device.isDoorbell(this.rawDevice.device_type); } isWiredDoorbell() { return Device.isWiredDoorbell(this.rawDevice.device_type); } isWiredDoorbellDual() { return Device.isWiredDoorbellDual(this.rawDevice.device_type); } isLock() { return Device.isLock(this.rawDevice.device_type); } isLockBle() { return Device.isLockBle(this.rawDevice.device_type); } isLockBleNoFinger() { return Device.isLockBleNoFinger(this.rawDevice.device_type); } isLockWifi(