eufy-security-client-fork
Version:
Client to comunicate with Eufy-Security devices
858 lines • 121 kB
JavaScript
"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(