Files
eufy-security-client-dz/build/http/device.js
2025-11-11 00:04:55 -06:00

4306 lines
252 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.UnknownDevice = exports.SmartDrop = exports.DoorbellLock = exports.Tracker = exports.SmartSafe = exports.Keypad = exports.LockKeypad = exports.Lock = exports.MotionSensor = exports.EntrySensor = exports.Sensor = exports.GarageCamera = exports.WallLightCam = 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");
const error_2 = require("../error");
const logging_1 = require("../logging");
const station_1 = require("./station");
class Device extends tiny_typed_emitter_1.TypedEmitter {
api;
rawDevice;
eventTimeouts = new Map();
pictureEventTimeouts = new Map();
properties = {};
config = {};
rawProperties = {};
ready = false;
constructor(api, device, deviceConfig) {
super();
this.api = api;
this.rawDevice = device;
this.config = deviceConfig;
}
initializeState() {
this.update(this.rawDevice);
this.ready = true;
setImmediate(() => {
this.emit("ready", this);
});
}
initialize() {
this.initializeState();
}
getRawDevice() {
return this.rawDevice;
}
update(device) {
this.rawDevice = device;
const metadata = this.getPropertiesMetadata(true);
for (const property of Object.values(metadata)) {
if (this.rawDevice[property.key] !== undefined && typeof property.key === "string") {
if (property.key === "cover_path" && !this.getPropertyValue(property.name) && this.rawDevice[property.key] !== "") {
// First image initialisation if no image has been set yet and a cloud value is available
this.updateProperty(property.name, this.convertRawPropertyValue(property, (0, utils_1.getImagePath)(this.rawDevice[property.key])));
}
else {
this.updateProperty(property.name, this.convertRawPropertyValue(property, this.rawDevice[property.key]));
}
}
else if (this.properties[property.name] === undefined && property.default !== undefined && !this.ready) {
this.updateProperty(property.name, property.default);
}
}
if (this.rawDevice.params) {
this.rawDevice.params.forEach(param => {
this.updateRawProperty(param.param_type, param.param_value, "http");
});
}
logging_1.rootHTTPLogger.debug("Update device cloud properties", { deviceSN: this.getSerial(), properties: this.properties });
}
updateProperty(name, value, force = false) {
if ((this.properties[name] !== undefined && this.properties[name] !== value)
|| this.properties[name] === undefined || force) {
const oldValue = this.properties[name];
this.properties[name] = value;
this.emit("property changed", this, name, value, this.ready);
try {
this.handlePropertyChange(this.getPropertyMetadata(name, true), oldValue, this.properties[name]);
}
catch (err) {
const error = (0, error_2.ensureError)(err);
if (error instanceof error_1.InvalidPropertyError) {
logging_1.rootHTTPLogger.error(`Device update property - Invalid Property error`, { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), propertyName: name, propertyValue: value, force: force });
}
else {
logging_1.rootHTTPLogger.error(`Device update property - Property error`, { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), propertyName: name, propertyValue: value, force: force });
}
}
return true;
}
return false;
}
updateRawProperties(values) {
Object.keys(values).forEach(paramtype => {
const param_type = Number.parseInt(paramtype);
this.updateRawProperty(param_type, values[param_type].value, values[param_type].source);
});
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
handlePropertyChange(metadata, oldValue, newValue) {
try {
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 && this.hasProperty(types_1.PropertyName.DeviceMotionDetectionSensitivity)) {
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.hasProperty(types_1.PropertyName.DeviceWifiSignalLevel)) {
this.updateProperty(types_1.PropertyName.DeviceWifiSignalLevel, (0, utils_1.calculateWifiSignalLevel)(this, newValue));
}
else if (metadata.name === types_1.PropertyName.DeviceCellularRSSI && this.hasProperty(types_1.PropertyName.DeviceCellularSignalLevel)) {
this.updateProperty(types_1.PropertyName.DeviceCellularSignalLevel, (0, utils_1.calculateCellularSignalLevel)(newValue));
}
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error(`Device handle property change - error`, { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), metadata: metadata, oldValue: oldValue, newValue: newValue });
}
}
updateRawProperty(type, value, source) {
const parsedValue = parameter_1.ParameterHelper.readValue(this.getStationSerial(), type, value, logging_1.rootHTTPLogger);
if (parsedValue !== undefined &&
((this.rawProperties[type] !== undefined && this.rawProperties[type].value !== parsedValue && (0, utils_1.isPrioritySourceType)(this.rawProperties[type].source, source)) || this.rawProperties[type] === undefined)) {
this.rawProperties[type] = {
value: parsedValue,
source: source
};
if (this.ready)
this.emit("raw property changed", this, type, this.rawProperties[type].value);
const metadata = this.getPropertiesMetadata(true);
for (const property of Object.values(metadata)) {
if (property.key === type) {
try {
this.updateProperty(property.name, this.convertRawPropertyValue(property, this.rawProperties[type].value));
}
catch (err) {
const error = (0, error_2.ensureError)(err);
if (error instanceof error_1.PropertyNotSupportedError) {
logging_1.rootHTTPLogger.debug("Device update raw property - Property not supported error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), type: type, value: value, source: source });
}
else {
logging_1.rootHTTPLogger.error("Device update raw property - Property error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), type: type, value: value, source: source });
}
}
}
}
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.isIndoorPanAndTiltCameraS350()) || (this.isWiredDoorbell() && !this.isWiredDoorbellT8200X()) || 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 (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_BAT_DOORBELL_SET_NOTIFICATION_MODE DeviceNotificationRing Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
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 (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_BAT_DOORBELL_SET_NOTIFICATION_MODE DeviceNotificationMotion Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
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 (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_BAT_DOORBELL_SET_NOTIFICATION_MODE DeviceNotificationType Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
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 (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - DOORBELL_NOTIFICATION_OPEN Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
return false;
}
}
else if (property.key === types_2.CommandType.CMD_SET_PIRSENSITIVITY) {
const numericProperty = property;
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;
}
else {
return value !== undefined ? Number.parseInt(value) : (numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0));
}
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_SET_PIRSENSITIVITY Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
return numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0);
}
}
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.subarray(0, 1).readInt8().toString().padStart(2, "0")}:${tmpBuffer.subarray(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 (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error(`Device convert raw property - CMD_DOORBELL_DUAL_RADAR_WD_DETECTION_SENSITIVITY ${property.name} Error`, { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
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?.length !== undefined && value?.setting?.length > 0 && 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 (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_DOORBELL_DUAL_RADAR_WD_AUTO_RESPONSE DeviceLoiteringCustomResponseTimeFrom Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
return stringProperty.default !== undefined ? stringProperty.default : "";
}
}
case types_1.PropertyName.DeviceLoiteringCustomResponseTimeTo: {
const stringProperty = property;
try {
return (value?.setting?.length !== undefined && value?.setting?.length > 0 && 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 (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_DOORBELL_DUAL_RADAR_WD_AUTO_RESPONSE DeviceLoiteringCustomResponseTimeTo Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
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 (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_DOORBELL_DUAL_RADAR_WD_AUTO_RESPONSE DeviceLoiteringCustomResponsePhoneNotification Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
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 (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_DOORBELL_DUAL_RADAR_WD_AUTO_RESPONSE DeviceLoiteringCustomResponseHomeBaseNotification Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
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 (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_DOORBELL_DUAL_RADAR_WD_AUTO_RESPONSE DeviceLoiteringCustomResponseAutoVoiceResponse Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
return booleanProperty.default !== undefined ? booleanProperty.default : false;
}
}
case types_1.PropertyName.DeviceLoiteringCustomResponseAutoVoiceResponseVoice: {
const numericProperty = property;
try {
return (value?.setting?.length !== undefined && value?.setting?.length > 0 && 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 (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_DOORBELL_DUAL_RADAR_WD_AUTO_RESPONSE DeviceLoiteringCustomResponseAutoVoiceResponseVoice Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
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 (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_DOORBELL_DUAL_DELIVERY_GUARD_SWITCH Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
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 (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_DOORBELL_DUAL_PACKAGE_STRAND_TIME Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
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 (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_DOORBELL_DUAL_RING_AUTO_RESPONSE DeviceRingAutoResponse Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
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 (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_DOORBELL_DUAL_RING_AUTO_RESPONSE DeviceRingAutoResponseVoiceResponse Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
return booleanProperty.default !== undefined ? booleanProperty.default : false;
}
}
case types_1.PropertyName.DeviceRingAutoResponseTimeFrom: {
const stringProperty = property;
try {
return (value?.setting?.length !== undefined && value?.setting?.length > 0 && 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 (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_DOORBELL_DUAL_RING_AUTO_RESPONSE DeviceRingAutoResponseTimeFrom Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
return stringProperty.default !== undefined ? stringProperty.default : "";
}
}
case types_1.PropertyName.DeviceRingAutoResponseTimeTo: {
const stringProperty = property;
try {
return (value?.setting?.length !== undefined && value?.setting?.length > 0 && 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 (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_DOORBELL_DUAL_RING_AUTO_RESPONSE DeviceRingAutoResponseTimeTo Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
return stringProperty.default !== undefined ? stringProperty.default : "";
}
}
case types_1.PropertyName.DeviceRingAutoResponseVoiceResponseVoice: {
const numericProperty = property;
try {
return (value?.setting?.length !== undefined && value?.setting?.length > 0 && 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 (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_DOORBELL_DUAL_RING_AUTO_RESPONSE DeviceRingAutoResponseVoiceResponseVoice Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
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 (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_DOORBELL_DUAL_PACKAGE_GUARD_TIME DeviceDeliveryGuardPackageGuardingActivatedTimeFrom Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
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 (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_DOORBELL_DUAL_PACKAGE_GUARD_TIME DeviceDeliveryGuardPackageGuardingActivatedTimeTo Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
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 (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_DOORBELL_DUAL_RADAR_WD_DISTANCE Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
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 (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_DOORBELL_DUAL_RADAR_WD_TIME Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
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 (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_DOORBELL_DUAL_PACKAGE_GUARD_VOICE Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
return numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0);
}
}
else if (property.key === types_2.CommandType.CMD_MOTION_SET_LEAVING_REACTIONS) {
switch (property.name) {
case types_1.PropertyName.DeviceLeavingReactionStartTime: {
const stringProperty = property;
try {
return (value !== undefined && value.start_hour !== undefined && value.start_min !== undefined) ? `${value.start_hour.padStart(2, "0")}:${value.start_min.padStart(2, "0")}` : stringProperty.default !== undefined ? stringProperty.default : "";
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_MOTION_SET_LEAVING_REACTIONS DeviceLeavingReactionStartTime Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
return stringProperty.default !== undefined ? stringProperty.default : "";
}
}
case types_1.PropertyName.DeviceLeavingReactionEndTime: {
const stringProperty = property;
try {
return (value !== undefined && value.end_hour !== undefined && value.end_min !== undefined) ? `${value.end_hour.padStart(2, "0")}:${value.end_min.padStart(2, "0")}` : stringProperty.default !== undefined ? stringProperty.default : "";
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_MOTION_SET_LEAVING_REACTIONS DeviceLeavingReactionEndTime Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
return stringProperty.default !== undefined ? stringProperty.default : "";
}
}
case types_1.PropertyName.DeviceLeavingReactionNotification: {
const booleanProperty = property;
try {
return value !== undefined && value.push_notify === 1 ? true : booleanProperty.default !== undefined ? booleanProperty.default : false;
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_MOTION_SET_LEAVING_REACTIONS DeviceLeavingReactionNotification Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
return booleanProperty.default !== undefined ? booleanProperty.default : false;
}
}
}
}
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 (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_SET_SNOOZE_MODE DeviceSnooze Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
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 (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_SET_SNOOZE_MODE DeviceSnoozeTime Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
return numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0);
}
}
case types_1.PropertyName.DeviceSnoozeStartTime: {
const numericProperty = property;
try {
return value !== undefined && value.startTime !== undefined ? Number.parseInt(value.startTime) : (numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0));
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_SET_SNOOZE_MODE DeviceSnoozeTime Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
return numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0);
}
}
case types_1.PropertyName.DeviceSnoozeHomebase: {
const booleanProperty = property;
try {
return value !== undefined && value.homebase_onoff !== undefined ? (value.homebase_onoff === 1 ? true : false) : (booleanProperty.default !== undefined ? booleanProperty.default : false);
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_SET_SNOOZE_MODE DeviceSnoozeHomebase Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
return booleanProperty.default !== undefined ? booleanProperty.default : false;
}
}
case types_1.PropertyName.DeviceSnoozeMotion: {
const booleanProperty = property;
try {
return value !== undefined && value.motion_notify_onoff !== undefined ? (value.motion_notify_onoff === 1 ? true : false) : (booleanProperty.default !== undefined ? booleanProperty.default : false);
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_SET_SNOOZE_MODE DeviceSnoozeMotion Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
return booleanProperty.default !== undefined ? booleanProperty.default : false;
}
}
case types_1.PropertyName.DeviceSnoozeChime: {
const booleanProperty = property;
try {
return value !== undefined && value.chime_onoff !== undefined ? (value.chime_onoff === 1 ? true : false) : (booleanProperty.default !== undefined ? booleanProperty.default : false);
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_SET_SNOOZE_MODE DeviceSnoozeChime Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
return booleanProperty.default !== undefined ? booleanProperty.default : false;
}
}
}
}
else if ((property.name === types_1.PropertyName.DeviceMotionDetectionTypeHuman ||
property.name === types_1.PropertyName.DeviceMotionDetectionTypeHumanRecognition ||
property.name === types_1.PropertyName.DeviceMotionDetectionTypePet ||
property.name === types_1.PropertyName.DeviceMotionDetectionTypeVehicle ||
property.name === types_1.PropertyName.DeviceMotionDetectionTypeAllOtherMotions) && this.getStationSerial().startsWith("T8030")) {
const booleanProperty = property;
try {
return (0, utils_1.isHB3DetectionModeEnabled)(Number.parseInt(value), property.name === types_1.PropertyName.DeviceMotionDetectionTypeHuman ? types_1.HB3DetectionTypes.HUMAN_DETECTION : property.name === types_1.PropertyName.DeviceMotionDetectionTypeHumanRecognition ? types_1.HB3DetectionTypes.HUMAN_RECOGNITION : property.name === types_1.PropertyName.DeviceMotionDetectionTypePet ? types_1.HB3DetectionTypes.PET_DETECTION : property.name === types_1.PropertyName.DeviceMotionDetectionTypeVehicle ? types_1.HB3DetectionTypes.VEHICLE_DETECTION : types_1.HB3DetectionTypes.ALL_OTHER_MOTION);
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - HB3 motion detection type Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
return booleanProperty.default !== undefined ? booleanProperty.default : false;
}
}
else if ((property.name === types_1.PropertyName.DeviceMotionDetectionTypeHuman ||
property.name === types_1.PropertyName.DeviceMotionDetectionTypeVehicle ||
property.name === types_1.PropertyName.DeviceMotionDetectionTypeAllOtherMotions) && this.isOutdoorPanAndTiltCamera()) {
const booleanProperty = property;
try {
return (0, utils_1.isT8170DetectionModeEnabled)(Number.parseInt(value), property.name === types_1.PropertyName.DeviceMotionDetectionTypeHuman ? types_1.T8170DetectionTypes.HUMAN_DETECTION : property.name === types_1.PropertyName.DeviceMotionDetectionTypeVehicle ? types_1.T8170DetectionTypes.VEHICLE_DETECTION : types_1.T8170DetectionTypes.ALL_OTHER_MOTION);
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - T8170 motion detection type Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
return booleanProperty.default !== undefined ? booleanProperty.default : false;
}
}
else if ((property.name === types_1.PropertyName.DeviceMotionDetectionTypeHuman ||
property.name === types_1.PropertyName.DeviceMotionDetectionTypePet ||
property.name === types_1.PropertyName.DeviceMotionDetectionTypeAllOtherMotions) && this.isIndoorPanAndTiltCameraS350()) {
const booleanProperty = property;
try {
return (0, utils_1.isIndoorS350DetectionModeEnabled)(Number.parseInt(value), property.name === types_1.PropertyName.DeviceMotionDetectionTypeHuman ? types_1.IndoorS350DetectionTypes.HUMAN_DETECTION : property.name === types_1.PropertyName.DeviceMotionDetectionTypePet ? types_1.IndoorS350DetectionTypes.PET_DETECTION : types_1.IndoorS350DetectionTypes.ALL_OTHER_MOTION);
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - T8416 motion detection type Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
return booleanProperty.default !== undefined ? booleanProperty.default : false;
}
}
else if ((property.name === types_1.PropertyName.DeviceMotionDetectionTypeHuman ||
property.name === types_1.PropertyName.DeviceMotionDetectionTypeAllOtherMotions) && this.isSoloCameras()) {
const booleanProperty = property;
try {
return property.name === types_1.PropertyName.DeviceMotionDetectionTypeHuman ? types_1.SoloCameraDetectionTypes.HUMAN_DETECTION === Number.parseInt(value) ? true : false : types_1.SoloCameraDetectionTypes.ALL_OTHER_MOTION === Number.parseInt(value) ? true : false;
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - SoloCamera motion detection type Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
return booleanProperty.default !== undefined ? booleanProperty.default : false;
}
}
else if ((property.name === types_1.PropertyName.DeviceNotificationAllOtherMotion ||
property.name === types_1.PropertyName.DeviceNotificationPerson ||
property.name === types_1.PropertyName.DeviceNotificationPet ||
property.name === types_1.PropertyName.DeviceNotificationCrying ||
property.name === types_1.PropertyName.DeviceNotificationAllSound) && this.isIndoorPanAndTiltCameraS350()) {
const booleanProperty = property;
try {
return (0, utils_1.isIndoorNotitficationEnabled)(Number.parseInt(value), property.name === types_1.PropertyName.DeviceNotificationAllOtherMotion ? types_1.IndoorS350NotificationTypes.ALL_OTHER_MOTION : property.name === types_1.PropertyName.DeviceNotificationPerson ? types_1.IndoorS350NotificationTypes.HUMAN : property.name === types_1.PropertyName.DeviceNotificationPet ? types_1.IndoorS350NotificationTypes.PET : property.name === types_1.PropertyName.DeviceNotificationCrying ? types_1.IndoorS350NotificationTypes.CRYING : types_1.IndoorS350NotificationTypes.ALL_SOUND);
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - IndoorPanAndTiltCameraS350 notification Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
return booleanProperty.default !== undefined ? booleanProperty.default : false;
}
}
else if ((property.name === types_1.PropertyName.DeviceNotificationAllOtherMotion ||
property.name === types_1.PropertyName.DeviceNotificationPerson ||
property.name === types_1.PropertyName.DeviceNotificationPet ||
property.name === types_1.PropertyName.DeviceNotificationVehicle) && this.isFloodLightT8425()) {
const booleanProperty = property;
try {
return (0, utils_1.isFloodlightT8425NotitficationEnabled)(Number.parseInt(value), property.name === types_1.PropertyName.DeviceNotificationAllOtherMotion ? types_1.FloodlightT8425NotificationTypes.ALL_OTHER_MOTION : property.name === types_1.PropertyName.DeviceNotificationPerson ? types_1.FloodlightT8425NotificationTypes.HUMAN : property.name === types_1.PropertyName.DeviceNotificationPet ? types_1.FloodlightT8425NotificationTypes.PET : types_1.FloodlightT8425NotificationTypes.VEHICLE);
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - FloodLightT8425 notification Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
return booleanProperty.default !== undefined ? booleanProperty.default : false;
}
}
else if (property.key === types_2.CommandType.CELLULAR_INFO) {
switch (property.name) {
case types_1.PropertyName.DeviceCellularSignal: {
const stringProperty = property;
return value !== undefined && value.Signal !== undefined ? String(value.Signal) : (stringProperty.default !== undefined ? stringProperty.default : "");
}
case types_1.PropertyName.DeviceCellularBand: {
const stringProperty = property;
return value !== undefined && value.band !== undefined ? String(value.band) : (stringProperty.default !== undefined ? stringProperty.default : "");
}
case types_1.PropertyName.DeviceCellularIMEI: {
const stringProperty = property;
return value !== undefined && value.imei !== undefined ? String(value.imei) : (stringProperty.default !== undefined ? stringProperty.default : "");
}
case types_1.PropertyName.DeviceCellularICCID: {
const stringProperty = property;
return value !== undefined && value.iccid !== undefined ? String(value.iccid) : (stringProperty.default !== undefined ? stringProperty.default : "");
}
}
}
else if (property.key === types_2.CommandType.CMD_BAT_DOORBELL_VIDEO_QUALITY2) {
const numericProperty = property;
const quality = value;
let mode = quality.mode_1;
if (quality.cur_mode === 0) {
mode = quality.mode_0;
}
try {
return value !== undefined && mode !== undefined && mode.quality !== undefined ? mode.quality : (numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0));
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_BAT_DOORBELL_VIDEO_QUALITY2 Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
return numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0);
}
}
else if (property.key === types_2.CommandType.CMD_BAT_DOORBELL_RECORD_QUALITY2) {
const numericProperty = property;
const quality = value;
let mode = quality.mode_1;
if (quality.cur_mode === 0) {
mode = quality.mode_0;
}
try {
return value !== undefined && mode !== undefined && mode.quality !== undefined ? mode.quality : (numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0));
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - CMD_BAT_DOORBELL_RECORD_QUALITY2 Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
return numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0);
}
}
else if (property.key === types_2.CommandType.CMD_DEV_RECORD_AUTOSTOP && this.isCameraProfessional247()) {
return value !== undefined ? (value === "0" ? true : false) : false;
}
else if (property.key === types_2.CommandType.CMD_FLOODLIGHT_SET_DETECTION_RANGE_T8425) {
const currentValue = value;
switch (property.name) {
case types_1.PropertyName.DeviceMotionDetectionRange: {
const numericProperty = property;
return currentValue !== undefined && currentValue.cur_mode !== undefined ? currentValue.cur_mode : (numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0));
}
case types_1.PropertyName.DeviceMotionDetectionRangeStandardSensitivity: {
const numericProperty = property;
return currentValue !== undefined && currentValue.mode0 !== undefined && Array.isArray(currentValue.mode0) && currentValue.mode0.length > 0 && currentValue.mode0.find((element) => element.id === 1) !== undefined ? currentValue.mode0.find((element) => element.id === 1).sst : (numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0));
}
case types_1.PropertyName.DeviceMotionDetectionRangeAdvancedLeftSensitivity: {
const numericProperty = property;
return currentValue !== undefined && currentValue.mode1 !== undefined && Array.isArray(currentValue.mode1) && currentValue.mode1.length > 0 && currentValue.mode1.find((element) => element.id === 1) !== undefined ? currentValue.mode1.find((element) => element.id === 1).sst : (numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0));
}
case types_1.PropertyName.DeviceMotionDetectionRangeAdvancedRightSensitivity: {
const numericProperty = property;
return currentValue !== undefined && currentValue.mode1 !== undefined && Array.isArray(currentValue.mode1) && currentValue.mode1.length > 0 && currentValue.mode1.find((element) => element.id === 2) !== undefined ? currentValue.mode1.find((element) => element.id === 2).sst : (numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0));
}
case types_1.PropertyName.DeviceMotionDetectionTestMode: {
const booleanProperty = property;
return currentValue !== undefined && currentValue.test_mode !== undefined ? currentValue.test_mode === 1 ? true : false : booleanProperty.default !== undefined ? booleanProperty.default : false;
}
}
}
else if (property.key === types_2.CommandType.CMD_SET_LIGHT_CTRL_BRIGHT_SCH_T8425) {
const currentValue = value;
const numericProperty = property;
return currentValue !== undefined && currentValue.brightness !== undefined ? currentValue.brightness : (numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0));
}
else if (property.key === types_2.CommandType.CMD_SET_LIGHT_CTRL_BRIGHT_PIR_T8425) {
const currentValue = value;
switch (property.name) {
case types_1.PropertyName.DeviceLightSettingsBrightnessMotion: {
const numericProperty = property;
return currentValue !== undefined && currentValue.brightness !== undefined ? currentValue.brightness : (numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0));
}
case types_1.PropertyName.DeviceLightSettingsMotionActivationMode: {
const numericProperty = property;
return currentValue !== undefined && currentValue.mode !== undefined ? currentValue.mode : (numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0));
}
case types_1.PropertyName.DeviceLightSettingsMotionTriggeredTimer: {
const numericProperty = property;
return currentValue !== undefined && currentValue.time !== undefined ? currentValue.time : (numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0));
}
case types_1.PropertyName.DeviceLightSettingsMotionTriggered: {
const booleanProperty = property;
return currentValue !== undefined && currentValue.enable !== undefined ? currentValue.enable === 1 ? true : false : booleanProperty.default !== undefined ? booleanProperty.default : false;
}
}
}
else if (property.key === types_2.CommandType.SUB1G_REP_UNPLUG_POWER_LINE) {
const numericProperty = property;
try {
const rawCharging = Number.parseInt(value);
return rawCharging !== undefined ? ((0, utils_2.isCharging)(rawCharging) ? 1 : 0) : (numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0));
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.warn("Device convert raw property - SUB1G_REP_UNPLUG_POWER_LINE Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
return numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0);
}
}
else if (property.name === types_1.PropertyName.Model && this.isLockWifiT8510P()) {
return "T8510P";
}
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 (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.warn("Device convert raw property - PropertyMetadataNumeric Convert Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
return numericProperty.default !== undefined ? numericProperty.default : (numericProperty.min !== undefined ? numericProperty.min : 0);
}
}
else if (property.type === "boolean") {
const booleanProperty = property;
try {
return value !== undefined ? (typeof value === "number" ? !!value : (value === "1" || value.toLowerCase() === "true" ? true : false)) : (booleanProperty.default !== undefined ? booleanProperty.default : false);
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.warn("Device convert raw property - PropertyMetadataBoolean Convert Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
return booleanProperty.default !== undefined ? booleanProperty.default : false;
}
}
else if (property.type === "string") {
const stringProperty = property;
return value !== undefined ? value : (stringProperty.default !== undefined ? stringProperty.default : "");
}
else if (property.type === "object") {
const objectProperty = property;
return value !== undefined ? value : (objectProperty.default !== undefined ? objectProperty.default : undefined);
}
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Device convert raw property - Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
}
return value;
}
getPropertyMetadata(name, hidden = false) {
const property = this.getPropertiesMetadata(hidden)[name];
if (property !== undefined)
return property;
throw new error_1.InvalidPropertyError("Property name is not valid", { context: { name: name } });
}
getPropertyValue(name) {
return this.properties[name];
}
hasPropertyValue(name) {
return this.getPropertyValue(name) !== undefined;
}
getRawProperty(type) {
return this.rawProperties[type]?.value;
}
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(hidden = false) {
let metadata = {
...types_1.DeviceProperties[this.getDeviceType()]
};
if (this.isFloodLightT8420X()) {
metadata = {
...types_1.FloodlightT8420XDeviceProperties
};
}
else if (this.isWiredDoorbellT8200X()) {
metadata = {
...types_1.WiredDoorbellT8200XDeviceProperties
};
}
else if (this.isLockWifiT8510P()) {
metadata = {
...types_1.LockT8510PDeviceProperties
};
metadata[types_1.PropertyName.Type].states[this.getDeviceType()] = "Smart Lock S230 (T8510P)";
}
else if (this.isLockWifiT8520P()) {
metadata = {
...types_1.LockT8520PDeviceProperties
};
metadata[types_1.PropertyName.Type].states[this.getDeviceType()] = "Smart Lock S231 (T8520P)";
}
else if (this.isSoloCameras() && station_1.Station.isStationHomeBase3BySn(this.getStationSerial())) {
const newMetadata = {
...metadata
};
newMetadata[types_1.PropertyName.DeviceAudioRecording] = types_1.DeviceAudioRecordingProperty;
newMetadata[types_1.PropertyName.DeviceMotionDetectionSensitivity] = types_1.DeviceMotionDetectionSensitivityCamera2Property;
newMetadata[types_1.PropertyName.DeviceVideoRecordingQuality] = types_1.DeviceVideoRecordingQualitySoloCamerasHB3Property;
newMetadata[types_1.PropertyName.DeviceNotificationType] = types_1.DeviceNotificationTypeProperty;
newMetadata[types_1.PropertyName.DeviceMotionDetection] = types_1.DeviceMotionDetectionProperty;
metadata = newMetadata;
}
else if (this.isIndoorPanAndTiltCameraS350() && station_1.Station.isStationHomeBase3BySn(this.getStationSerial())) {
const newMetadata = {
...metadata
};
newMetadata[types_1.PropertyName.DeviceMotionDetection] = types_1.DeviceMotionDetectionProperty;
newMetadata[types_1.PropertyName.DeviceAudioRecording] = types_1.DeviceAudioRecordingProperty;
newMetadata[types_1.PropertyName.DeviceMotionDetectionSensitivity] = types_1.DeviceMotionDetectionSensitivityBatteryDoorbellProperty;
newMetadata[types_1.PropertyName.DeviceStatusLed] = types_1.DeviceStatusLedIndoorS350Property;
metadata = newMetadata;
}
if (station_1.Station.isStationHomeBase3BySn(this.getStationSerial()) && (metadata[types_1.PropertyName.DeviceMotionDetectionType] !== undefined || metadata[types_1.PropertyName.DeviceMotionDetectionTypeAllOtherMotions] !== undefined) && this.isCamera()) {
const newMetadata = {
...metadata
};
delete newMetadata[types_1.PropertyName.DeviceMotionDetectionType];
delete newMetadata[types_1.PropertyName.DeviceLastChargingDays];
delete newMetadata[types_1.PropertyName.DeviceLastChargingFalseEvents];
delete newMetadata[types_1.PropertyName.DeviceLastChargingRecordedEvents];
delete newMetadata[types_1.PropertyName.DeviceLastChargingTotalEvents];
delete newMetadata[types_1.PropertyName.DeviceBatteryUsageLastWeek];
newMetadata[types_1.PropertyName.DeviceMotionDetectionTypeHuman] = types_1.DeviceMotionHB3DetectionTypeHumanProperty;
newMetadata[types_1.PropertyName.DeviceMotionDetectionTypeHumanRecognition] = types_1.DeviceMotionHB3DetectionTypeHumanRecognitionProperty;
newMetadata[types_1.PropertyName.DeviceMotionDetectionTypePet] = types_1.DeviceMotionHB3DetectionTypePetProperty;
newMetadata[types_1.PropertyName.DeviceMotionDetectionTypeVehicle] = types_1.DeviceMotionHB3DetectionTypeVehicleProperty;
newMetadata[types_1.PropertyName.DeviceMotionDetectionTypeAllOtherMotions] = types_1.DeviceMotionHB3DetectionTypeAllOtherMotionsProperty;
newMetadata[types_1.PropertyName.DevicePersonDetected] = types_1.DevicePersonDetectedProperty;
newMetadata[types_1.PropertyName.DeviceMotionDetected] = types_1.DeviceMotionDetectedProperty;
newMetadata[types_1.PropertyName.DevicePetDetected] = types_1.DevicePetDetectedProperty;
newMetadata[types_1.PropertyName.DeviceSoundDetected] = types_1.DeviceSoundDetectedProperty;
newMetadata[types_1.PropertyName.DeviceCryingDetected] = types_1.DeviceCryingDetectedProperty;
newMetadata[types_1.PropertyName.DeviceIdentityPersonDetected] = types_1.DeviceIdentityPersonDetectedProperty;
newMetadata[types_1.PropertyName.DeviceStrangerPersonDetected] = types_1.DeviceStrangerPersonDetectedProperty;
newMetadata[types_1.PropertyName.DeviceVehicleDetected] = types_1.DeviceVehicleDetectedProperty;
newMetadata[types_1.PropertyName.DeviceDogDetected] = types_1.DeviceDogDetectedProperty;
newMetadata[types_1.PropertyName.DeviceDogLickDetected] = types_1.DeviceDogLickDetectedProperty;
newMetadata[types_1.PropertyName.DeviceDogPoopDetected] = types_1.DeviceDogPoopDetectedProperty;
newMetadata[types_1.PropertyName.DeviceDetectionStatisticsWorkingDays] = types_1.DeviceDetectionStatisticsWorkingDaysProperty;
newMetadata[types_1.PropertyName.DeviceDetectionStatisticsDetectedEvents] = types_1.DeviceDetectionStatisticsDetectedEventsProperty;
newMetadata[types_1.PropertyName.DeviceDetectionStatisticsRecordedEvents] = types_1.DeviceDetectionStatisticsRecordedEventsProperty;
if (!this.isSmartDrop()) {
//TODO: Check with future devices if this property overriding is correct (for example with indoor cameras etc.)
newMetadata[types_1.PropertyName.DeviceEnabled] = types_1.DeviceEnabledSoloProperty;
}
metadata = newMetadata;
}
else if (Object.keys(metadata).length === 0) {
metadata = {
...types_1.GenericDeviceProperties
};
}
if (!hidden) {
for (const property of Object.keys(metadata)) {
if (property.startsWith("hidden-"))
delete metadata[property];
}
}
return metadata;
}
hasProperty(name, hidden = false) {
return this.getPropertiesMetadata(hidden)[name] !== undefined;
}
getCommands() {
const commands = types_1.DeviceCommands[this.getDeviceType()];
if (commands === undefined)
return [];
return commands;
}
hasCommand(name) {
return this.getCommands().includes(name);
}
processPushNotification(_station, _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();
this.pictureEventTimeouts.forEach((timeout) => {
clearTimeout(timeout);
});
this.pictureEventTimeouts.clear();
}
clearEventTimeout(eventType) {
const timeout = this.eventTimeouts.get(eventType);
if (timeout !== undefined) {
clearTimeout(timeout);
this.eventTimeouts.delete(eventType);
}
}
static isSupported(type) {
return types_1.DeviceProperties[type] !== undefined ? true : false;
}
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.BATTERY_DOORBELL_PLUS_E340 ||
type == types_1.DeviceType.BATTERY_DOORBELL_C30 ||
type == types_1.DeviceType.BATTERY_DOORBELL_C31 ||
type == types_1.DeviceType.DOORBELL_SOLO ||
type == types_1.DeviceType.CAMERA2C_PRO ||
type == types_1.DeviceType.CAMERA2_PRO ||
type == types_1.DeviceType.CAMERA3 ||
type == types_1.DeviceType.CAMERA3C ||
type == types_1.DeviceType.CAMERA3_PRO ||
type == types_1.DeviceType.PROFESSIONAL_247 ||
type == types_1.DeviceType.INDOOR_CAMERA_1080 ||
type == types_1.DeviceType.INDOOR_PT_CAMERA_1080 ||
type == types_1.DeviceType.OUTDOOR_PT_CAMERA ||
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.SOLO_CAMERA_SOLAR ||
type == types_1.DeviceType.SOLO_CAMERA_C210 ||
type == types_1.DeviceType.SOLO_CAMERA_E30 ||
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 ||
type == types_1.DeviceType.FLOODLIGHT_CAMERA_8425 ||
type == types_1.DeviceType.WALL_LIGHT_CAM ||
type == types_1.DeviceType.WALL_LIGHT_CAM_81A0 ||
type == types_1.DeviceType.CAMERA_GARAGE_T8453_COMMON ||
type == types_1.DeviceType.CAMERA_GARAGE_T8453 ||
type == types_1.DeviceType.CAMERA_GARAGE_T8452 ||
type == types_1.DeviceType.CAMERA_FG ||
type == types_1.DeviceType.INDOOR_PT_CAMERA_S350 ||
type == types_1.DeviceType.INDOOR_PT_CAMERA_E30 ||
type == types_1.DeviceType.INDOOR_PT_CAMERA_C210 ||
type == types_1.DeviceType.INDOOR_PT_CAMERA_C220 ||
type == types_1.DeviceType.INDOOR_PT_CAMERA_C220_V2 ||
type == types_1.DeviceType.SMART_DROP)
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.BATTERY_DOORBELL_PLUS_E340 ||
type == types_1.DeviceType.BATTERY_DOORBELL_C30 ||
type == types_1.DeviceType.BATTERY_DOORBELL_C31 ||
type == types_1.DeviceType.CAMERA2C_PRO ||
type == types_1.DeviceType.CAMERA2_PRO ||
type == types_1.DeviceType.CAMERA3 ||
type == types_1.DeviceType.CAMERA3C ||
type == types_1.DeviceType.CAMERA3_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.SOLO_CAMERA_SOLAR ||
type == types_1.DeviceType.SOLO_CAMERA_C210 ||
type == types_1.DeviceType.SOLO_CAMERA_E30 ||
type == types_1.DeviceType.LOCK_WIFI ||
type == types_1.DeviceType.LOCK_WIFI_NO_FINGER ||
type == types_1.DeviceType.LOCK_8503 ||
type == types_1.DeviceType.LOCK_8504 ||
type == types_1.DeviceType.LOCK_8530 ||
type == types_1.DeviceType.LOCK_8592 ||
type == types_1.DeviceType.LOCK_85A3 ||
type == types_1.DeviceType.LOCK_8506 ||
type == types_1.DeviceType.LOCK_8502 ||
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 ||
type == types_1.DeviceType.CAMERA_FG ||
type == types_1.DeviceType.WALL_LIGHT_CAM_81A0 ||
type == types_1.DeviceType.SMART_DROP ||
type == types_1.DeviceType.OUTDOOR_PT_CAMERA)
//TODO: Add other battery devices
return true;
return false;
}
static isStation(type) {
if (type == types_1.DeviceType.STATION || type === types_1.DeviceType.MINIBASE_CHIME)
return true;
return false;
}
static isCamera1(type) {
return types_1.DeviceType.CAMERA == type;
}
static isCameraE(type) {
return types_1.DeviceType.CAMERA_E == type;
}
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.BATTERY_DOORBELL_PLUS_E340 ||
type == types_1.DeviceType.BATTERY_DOORBELL_C30 ||
type == types_1.DeviceType.BATTERY_DOORBELL_C31 ||
type == types_1.DeviceType.DOORBELL_SOLO)
return true;
return false;
}
static isWiredDoorbell(type) {
if (type == types_1.DeviceType.DOORBELL)
return true;
return false;
}
static isWiredDoorbellT8200X(type, serialnumber) {
if (type == types_1.DeviceType.DOORBELL && serialnumber.startsWith("T8200") && serialnumber.length > 7 && serialnumber.charAt(6) === "6")
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 ||
type == types_1.DeviceType.INDOOR_PT_CAMERA_S350 ||
type == types_1.DeviceType.INDOOR_PT_CAMERA_E30 ||
type == types_1.DeviceType.INDOOR_PT_CAMERA_C210 ||
type == types_1.DeviceType.INDOOR_PT_CAMERA_C220 ||
type == types_1.DeviceType.INDOOR_PT_CAMERA_C220_V2)
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.FLOODLIGHT_CAMERA_8425 ||
type == types_1.DeviceType.INDOOR_COST_DOWN_CAMERA ||
type == types_1.DeviceType.OUTDOOR_PT_CAMERA ||
type == types_1.DeviceType.INDOOR_PT_CAMERA_S350 ||
type == types_1.DeviceType.INDOOR_PT_CAMERA_E30 ||
type == types_1.DeviceType.INDOOR_PT_CAMERA_C210 ||
type == types_1.DeviceType.INDOOR_PT_CAMERA_C220 ||
type == types_1.DeviceType.INDOOR_PT_CAMERA_C220_V2)
return true;
return false;
}
static isOutdoorPanAndTiltCamera(type) {
if (type == types_1.DeviceType.OUTDOOR_PT_CAMERA ||
type == types_1.DeviceType.SOLO_CAMERA_E30)
return true;
return false;
}
static isIndoorPanAndTiltCameraS350(type) {
if (type == types_1.DeviceType.INDOOR_PT_CAMERA_S350 ||
type == types_1.DeviceType.INDOOR_PT_CAMERA_E30 ||
type == types_1.DeviceType.INDOOR_PT_CAMERA_C210 ||
type == types_1.DeviceType.INDOOR_PT_CAMERA_C220 ||
type == types_1.DeviceType.INDOOR_PT_CAMERA_C220_V2)
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 ||
type == types_1.DeviceType.FLOODLIGHT_CAMERA_8425)
return true;
return false;
}
static isFloodLightT8420X(type, serialnumber) {
if (type == types_1.DeviceType.FLOODLIGHT && serialnumber.startsWith("T8420") && serialnumber.length > 7 && serialnumber.charAt(6) === "6")
return true;
return false;
}
static isFloodLightT8423(type) {
if (type == types_1.DeviceType.FLOODLIGHT_CAMERA_8423)
return true;
return false;
}
static isFloodLightT8425(type) {
if (type == types_1.DeviceType.FLOODLIGHT_CAMERA_8425)
return true;
return false;
}
static isWallLightCam(type) {
if (type == types_1.DeviceType.WALL_LIGHT_CAM || type == types_1.DeviceType.WALL_LIGHT_CAM_81A0)
return true;
return false;
}
static isLock(type) {
return Device.isLockBle(type) ||
Device.isLockWifi(type, "") ||
Device.isLockBleNoFinger(type) ||
Device.isLockWifiNoFinger(type) ||
Device.isLockWifiR10(type) ||
Device.isLockWifiR20(type) ||
Device.isLockWifiVideo(type) ||
Device.isLockWifiT8506(type) ||
Device.isLockWifiT8502(type);
}
static isLockKeypad(type) {
return Device.isLockWifiR10Keypad(type) || Device.isLockWifiR20Keypad(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, serialnumber) {
return types_1.DeviceType.LOCK_WIFI == type && !Device.isLockWifiT8510P(type, serialnumber) && !Device.isLockWifiT8520P(type, serialnumber);
}
static isLockWifiNoFinger(type) {
return types_1.DeviceType.LOCK_WIFI_NO_FINGER == type;
}
static isLockWifiR10(type) {
return types_1.DeviceType.LOCK_8503 == type;
}
static isLockWifiR20(type) {
return types_1.DeviceType.LOCK_8504 == type /*|| DeviceType.LOCK_8592 == type*/;
}
static isLockWifiVideo(type) {
return types_1.DeviceType.LOCK_8530 == type;
}
static isLockWifiR10Keypad(type) {
return types_1.DeviceType.LOCK_85A3 == type;
}
static isLockWifiR20Keypad(type) {
return types_1.DeviceType.LOCK_8592 == type;
}
static isLockWifiT8506(type) {
return types_1.DeviceType.LOCK_8506 == type;
}
static isLockWifiT8502(type) {
return types_1.DeviceType.LOCK_8502 == type;
}
static isLockWifiT8510P(type, serialnumber) {
if (type == types_1.DeviceType.LOCK_WIFI && serialnumber.startsWith("T8520") && serialnumber.length > 6 && serialnumber.charAt(6) === "8")
return true;
return false;
}
static isLockWifiT8520P(type, serialnumber) {
if (type == types_1.DeviceType.LOCK_WIFI && serialnumber.startsWith("T8520") && serialnumber.length > 6 && serialnumber.charAt(6) === "9")
return true;
return false;
}
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 isBatteryDoorbellDualE340(type) {
return types_1.DeviceType.BATTERY_DOORBELL_PLUS_E340 == type;
}
static isBatteryDoorbellC30(type) {
return types_1.DeviceType.BATTERY_DOORBELL_C30 == type;
}
static isBatteryDoorbellC31(type) {
return types_1.DeviceType.BATTERY_DOORBELL_C31 == 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 ||
type == types_1.DeviceType.BATTERY_DOORBELL_PLUS_E340 ||
type == types_1.DeviceType.BATTERY_DOORBELL_C30 ||
type == types_1.DeviceType.BATTERY_DOORBELL_C31)
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 isSoloCameraSolar(type) {
return types_1.DeviceType.SOLO_CAMERA_SOLAR == type;
}
static isSoloCameraC210(type) {
return types_1.DeviceType.SOLO_CAMERA_C210 == type;
}
static isSoloCameraE30(type) {
return types_1.DeviceType.SOLO_CAMERA_E30 == type;
}
static isSoloCameras(type) {
return Device.isSoloCamera(type) ||
Device.isSoloCameraPro(type) ||
Device.isSoloCameraSpotlight1080(type) ||
Device.isSoloCameraSpotlight2k(type) ||
Device.isSoloCameraSpotlightSolar(type) ||
Device.isOutdoorPanAndTiltCamera(type) ||
Device.isSoloCameraSolar(type) ||
Device.isSoloCameraC210(type) ||
Device.isSoloCameraE30(type);
}
static isStarlight4GLTE(type) {
return types_1.DeviceType.CAMERA_FG == 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 isCamera1Product(type) {
return Device.isCamera1(type) || Device.isCameraE(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 isCamera3(type) {
return types_1.DeviceType.CAMERA3 == type;
}
static isCamera3C(type) {
return types_1.DeviceType.CAMERA3C == type;
}
static isCamera3Pro(type) {
return types_1.DeviceType.CAMERA3_PRO == type;
}
static isCameraProfessional247(type) {
// T8600 - E330
return types_1.DeviceType.PROFESSIONAL_247 == type;
}
static isCamera3Product(type) {
return Device.isCamera3(type) || Device.isCamera3C(type) || Device.isCameraProfessional247(type) || Device.isCamera3Pro(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 isGarageCamera(type) {
if (type == types_1.DeviceType.CAMERA_GARAGE_T8452 ||
type == types_1.DeviceType.CAMERA_GARAGE_T8453 ||
type == types_1.DeviceType.CAMERA_GARAGE_T8453_COMMON)
return true;
return false;
}
static isIntegratedDeviceBySn(sn) {
//TODO: Update this implementation!
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("T8171") ||
sn.startsWith("T8422") ||
sn.startsWith("T8423") ||
sn.startsWith("T8424") ||
sn.startsWith("T8426") ||
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") ||
sn.startsWith("T8171") ||
sn.startsWith("T8134");
}
static isSmartDropBySn(sn) {
return sn.startsWith("T8790");
}
static isLockBySn(sn) {
return sn.startsWith("T8510") ||
sn.startsWith("T8520") ||
sn.startsWith("T8500") ||
sn.startsWith("T8501") ||
sn.startsWith("T8503") ||
sn.startsWith("T8502") ||
sn.startsWith("T8504") ||
sn.startsWith("T8506") ||
sn.startsWith("T8530");
}
static isGarageCameraBySn(sn) {
return sn.startsWith("T8453") ||
sn.startsWith("T8452");
}
static isFloodlightBySn(sn) {
return sn.startsWith("T8420") ||
sn.startsWith("T8422") ||
sn.startsWith("T8423") ||
sn.startsWith("T8424") ||
sn.startsWith("T8426");
//(sn.startsWith("T8420") && sn.length > 7 && sn[6] == "6");
}
static isIndoorCameraBySn(sn) {
return sn.startsWith("T8410") ||
sn.startsWith("T8400") ||
sn.startsWith("T8401") ||
sn.startsWith("T8411") ||
sn.startsWith("T8440") ||
sn.startsWith("T8441") ||
sn.startsWith("T8442") ||
sn.startsWith("T8414");
}
static is4GCameraBySn(sn) {
return sn.startsWith("T8150") ||
sn.startsWith("T8151") ||
sn.startsWith("T8152") ||
sn.startsWith("T8153");
}
static isSmartSafeBySn(sn) {
return sn.startsWith("T7400") ||
sn.startsWith("T7401") ||
sn.startsWith("T7402");
}
static isSmartTrackCard(type) {
if (type == types_1.DeviceType.SMART_TRACK_CARD)
return true;
return false;
}
static isSmartTrackLink(type) {
if (type == types_1.DeviceType.SMART_TRACK_LINK)
return true;
return false;
}
static isSmartTrack(type) {
if (type == types_1.DeviceType.SMART_TRACK_LINK ||
type == types_1.DeviceType.SMART_TRACK_CARD)
return true;
return false;
}
isCamera() {
return Device.isCamera(this.rawDevice.device_type);
}
isFloodLight() {
return Device.isFloodLight(this.rawDevice.device_type);
}
isFloodLightT8420X() {
return Device.isFloodLightT8420X(this.rawDevice.device_type, this.rawDevice.device_sn);
}
isFloodLightT8423() {
return Device.isFloodLightT8423(this.rawDevice.device_type);
}
isFloodLightT8425() {
return Device.isFloodLightT8425(this.rawDevice.device_type);
}
isWallLightCam() {
return Device.isWallLightCam(this.rawDevice.device_type);
}
isDoorbell() {
return Device.isDoorbell(this.rawDevice.device_type);
}
isWiredDoorbell() {
return Device.isWiredDoorbell(this.rawDevice.device_type);
}
isWiredDoorbellT8200X() {
return Device.isWiredDoorbellT8200X(this.rawDevice.device_type, this.rawDevice.device_sn);
}
isWiredDoorbellDual() {
return Device.isWiredDoorbellDual(this.rawDevice.device_type);
}
isLock() {
return Device.isLock(this.rawDevice.device_type);
}
isLockKeypad() {
return Device.isLockKeypad(this.rawDevice.device_type);
}
isLockBle() {
return Device.isLockBle(this.rawDevice.device_type);
}
isLockBleNoFinger() {
return Device.isLockBleNoFinger(this.rawDevice.device_type);
}
isLockWifi() {
return Device.isLockWifi(this.rawDevice.device_type, this.rawDevice.device_sn);
}
isLockWifiNoFinger() {
return Device.isLockWifiNoFinger(this.rawDevice.device_type);
}
isLockWifiR10() {
return Device.isLockWifiR10(this.rawDevice.device_type);
}
isLockWifiR20() {
return Device.isLockWifiR20(this.rawDevice.device_type);
}
isLockWifiVideo() {
return Device.isLockWifiVideo(this.rawDevice.device_type);
}
isLockWifiR10Keypad() {
return Device.isLockWifiR10Keypad(this.rawDevice.device_type);
}
isLockWifiR20Keypad() {
return Device.isLockWifiR20Keypad(this.rawDevice.device_type);
}
isLockWifiT8506() {
return Device.isLockWifiT8506(this.rawDevice.device_type);
}
isLockWifiT8502() {
return Device.isLockWifiT8502(this.rawDevice.device_type);
}
isLockWifiT8510P() {
return Device.isLockWifiT8510P(this.rawDevice.device_type, this.rawDevice.device_sn);
}
isLockWifiT8520P() {
return Device.isLockWifiT8520P(this.rawDevice.device_type, this.rawDevice.device_sn);
}
isBatteryDoorbell1() {
return Device.isBatteryDoorbell1(this.rawDevice.device_type);
}
isBatteryDoorbell2() {
return Device.isBatteryDoorbell2(this.rawDevice.device_type);
}
isBatteryDoorbellDual() {
return Device.isBatteryDoorbellDual(this.rawDevice.device_type);
}
isBatteryDoorbellDualE340() {
return Device.isBatteryDoorbellDualE340(this.rawDevice.device_type);
}
isBatteryDoorbellC30() {
return Device.isBatteryDoorbellC30(this.rawDevice.device_type);
}
isBatteryDoorbellC31() {
return Device.isBatteryDoorbellC31(this.rawDevice.device_type);
}
isDoorbellDual() {
return Device.isDoorbellDual(this.rawDevice.device_type);
}
isBatteryDoorbell() {
return Device.isBatteryDoorbell(this.rawDevice.device_type);
}
isSoloCamera() {
return Device.isSoloCamera(this.rawDevice.device_type);
}
isSoloCameraPro() {
return Device.isSoloCameraPro(this.rawDevice.device_type);
}
isSoloCameraSpotlight1080() {
return Device.isSoloCameraSpotlight1080(this.rawDevice.device_type);
}
isSoloCameraSpotlight2k() {
return Device.isSoloCameraSpotlight2k(this.rawDevice.device_type);
}
isSoloCameraSpotlightSolar() {
return Device.isSoloCameraSpotlightSolar(this.rawDevice.device_type);
}
isSoloCameraSolar() {
return Device.isSoloCameraSolar(this.rawDevice.device_type);
}
isSoloCameraC210() {
return Device.isSoloCameraC210(this.rawDevice.device_type);
}
isSoloCameraE30() {
return Device.isSoloCameraE30(this.rawDevice.device_type);
}
isStarlight4GLTE() {
return Device.isStarlight4GLTE(this.rawDevice.device_type);
}
isIndoorOutdoorCamera1080p() {
return Device.isIndoorOutdoorCamera1080p(this.rawDevice.device_type);
}
isIndoorOutdoorCamera1080pNoLight() {
return Device.isIndoorOutdoorCamera1080pNoLight(this.rawDevice.device_type);
}
isIndoorOutdoorCamera2k() {
return Device.isIndoorOutdoorCamera2k(this.rawDevice.device_type);
}
isIndoorCamMini() {
return Device.isIndoorCamMini(this.rawDevice.device_type);
}
isSoloCameras() {
return Device.isSoloCameras(this.rawDevice.device_type);
}
isCamera2() {
return Device.isCamera2(this.rawDevice.device_type);
}
isCamera2C() {
return Device.isCamera2C(this.rawDevice.device_type);
}
isCamera2Pro() {
return Device.isCamera2Pro(this.rawDevice.device_type);
}
isCamera2CPro() {
return Device.isCamera2CPro(this.rawDevice.device_type);
}
isCamera2Product() {
return Device.isCamera2Product(this.rawDevice.device_type);
}
isCamera3() {
return Device.isCamera3(this.rawDevice.device_type);
}
isCamera3C() {
return Device.isCamera3C(this.rawDevice.device_type);
}
isCameraProfessional247() {
return Device.isCameraProfessional247(this.rawDevice.device_type);
}
isCamera3Pro() {
return Device.isCamera3Pro(this.rawDevice.device_type);
}
isCamera3Product() {
return Device.isCamera3Product(this.rawDevice.device_type);
}
isEntrySensor() {
return Device.isEntrySensor(this.rawDevice.device_type);
}
isKeyPad() {
return Device.isKeyPad(this.rawDevice.device_type);
}
isMotionSensor() {
return Device.isMotionSensor(this.rawDevice.device_type);
}
isIndoorCamera() {
return Device.isIndoorCamera(this.rawDevice.device_type);
}
isPanAndTiltCamera() {
return Device.isPanAndTiltCamera(this.rawDevice.device_type);
}
isOutdoorPanAndTiltCamera() {
return Device.isOutdoorPanAndTiltCamera(this.rawDevice.device_type);
}
isIndoorPanAndTiltCameraS350() {
return Device.isIndoorPanAndTiltCameraS350(this.rawDevice.device_type);
}
isSmartDrop() {
return Device.isSmartDrop(this.rawDevice.device_type);
}
isSmartSafe() {
return Device.isSmartSafe(this.rawDevice.device_type);
}
isGarageCamera() {
return Device.isGarageCamera(this.rawDevice.device_type);
}
isIntegratedDevice() {
if (this.isLock() || this.isSmartDrop()) {
return this.rawDevice.device_sn === this.rawDevice.station_sn;
}
return this.isWiredDoorbellDual() || this.isFloodLight() || this.isWiredDoorbell() || this.isIndoorCamera() || this.isSoloCameras() || this.isWallLightCam();
}
isSmartTrack() {
return Device.isSmartTrack(this.rawDevice.device_type);
}
isSmartTrackCard() {
return Device.isSmartTrackCard(this.rawDevice.device_type);
}
isSmartTrackLink() {
return Device.isSmartTrackLink(this.rawDevice.device_type);
}
hasBattery() {
return Device.hasBattery(this.rawDevice.device_type);
}
getDeviceKey() {
return this.rawDevice.station_sn + this.rawDevice.device_channel;
}
getDeviceType() {
return this.rawDevice.device_type;
}
getHardwareVersion() {
return this.rawDevice.main_hw_version;
}
getSoftwareVersion() {
return this.rawDevice.main_sw_version;
}
getModel() {
return this.rawDevice.device_model;
}
getName() {
return this.rawDevice.device_name;
}
getSerial() {
return this.rawDevice.device_sn;
}
getStationSerial() {
return this.rawDevice.station_sn;
}
async setParameters(params) {
return this.api.setParameters(this.rawDevice.station_sn, this.rawDevice.device_sn, params);
}
getChannel() {
return this.rawDevice.device_channel;
}
//TODO: To remove
getStateID(state, level = 2) {
switch (level) {
case 0:
return `${this.getStationSerial()}.${this.getStateChannel()}`;
case 1:
return `${this.getStationSerial()}.${this.getStateChannel()}.${this.getSerial()}`;
default:
if (state)
return `${this.getStationSerial()}.${this.getStateChannel()}.${this.getSerial()}.${state}`;
throw new Error("No state value passed.");
}
}
getStateChannel() {
return "devices";
}
getWifiRssi() {
return this.getPropertyValue(types_1.PropertyName.DeviceWifiRSSI);
}
getStoragePath(filename) {
return (0, utils_1.getAbsoluteFilePath)(this.rawDevice.device_type, this.rawDevice.device_channel, filename);
}
isEnabled() {
return this.getPropertyValue(types_1.PropertyName.DeviceEnabled);
}
}
exports.Device = Device;
class Camera extends Device {
constructor(api, device, deviceConfig) {
super(api, device, deviceConfig);
this.properties[types_1.PropertyName.DeviceMotionDetected] = false;
this.properties[types_1.PropertyName.DevicePersonDetected] = false;
this.properties[types_1.PropertyName.DevicePersonName] = "";
}
static async getInstance(api, device, deviceConfig) {
return new Camera(api, device, deviceConfig);
}
getStateChannel() {
return "cameras";
}
convertRawPropertyValue(property, value) {
try {
switch (property.key) {
case types_2.CommandType.CMD_SET_AUDIO_MUTE_RECORD:
return value !== undefined ? (value === "0" ? true : false) : false;
}
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Camera convert raw property - Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
}
return super.convertRawPropertyValue(property, value);
}
getLastCameraImageURL() {
return this.getPropertyValue(types_1.PropertyName.DevicePictureUrl);
}
getMACAddress() {
return this.rawDevice.wifi_mac;
}
async startDetection() {
// Start camera detection.
//TODO: Deprecated. Will be removed!
await this.setParameters([{ paramType: types_1.ParamType.DETECT_SWITCH, paramValue: 1 }]).catch(err => {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Camera start detection - Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial() });
});
}
async stopDetection() {
// Stop camera detection.
await this.setParameters([{ paramType: types_1.ParamType.DETECT_SWITCH, paramValue: 0 }]);
}
getState() {
return this.getPropertyValue(types_1.PropertyName.DeviceState);
}
async close() {
//TODO: Stop other things if implemented such as detection feature
}
getLastChargingDays() {
return this.rawDevice.charging_days;
}
getLastChargingFalseEvents() {
return this.rawDevice.charging_missing;
}
getLastChargingRecordedEvents() {
return this.rawDevice.charging_reserve;
}
getLastChargingTotalEvents() {
return this.rawDevice.charing_total;
}
getBatteryValue() {
return this.getPropertyValue(types_1.PropertyName.DeviceBattery);
}
getBatteryTemperature() {
return this.getPropertyValue(types_1.PropertyName.DeviceBatteryTemp);
}
isMotionDetectionEnabled() {
return this.getPropertyValue(types_1.PropertyName.DeviceMotionDetection);
}
isLedEnabled() {
return this.getPropertyValue(types_1.PropertyName.DeviceStatusLed);
}
isAutoNightVisionEnabled() {
return this.getPropertyValue(types_1.PropertyName.DeviceAutoNightvision);
}
isRTSPStreamEnabled() {
return this.getPropertyValue(types_1.PropertyName.DeviceRTSPStream);
}
isAntiTheftDetectionEnabled() {
return this.getPropertyValue(types_1.PropertyName.DeviceAntitheftDetection);
}
getWatermark() {
return this.getPropertyValue(types_1.PropertyName.DeviceWatermark);
}
isMotionDetected() {
return this.getPropertyValue(types_1.PropertyName.DeviceMotionDetected);
}
isPersonDetected() {
return this.getPropertyValue(types_1.PropertyName.DevicePersonDetected);
}
getDetectedPerson() {
return this.getPropertyValue(types_1.PropertyName.DevicePersonName);
}
handlePropertyChange(metadata, oldValue, newValue) {
super.handlePropertyChange(metadata, oldValue, newValue);
if (metadata.name === types_1.PropertyName.DevicePersonDetected ||
metadata.name === types_1.PropertyName.DeviceIdentityPersonDetected ||
metadata.name === types_1.PropertyName.DeviceStrangerPersonDetected) {
this.emit("person detected", this, newValue, this.getPropertyValue(types_1.PropertyName.DevicePersonName));
if (metadata.name === types_1.PropertyName.DeviceStrangerPersonDetected)
this.emit("stranger person detected", this, newValue);
}
else if (metadata.name === types_1.PropertyName.DeviceMotionDetected) {
this.emit("motion detected", this, newValue);
}
else if (metadata.name === types_1.PropertyName.DeviceCryingDetected) {
this.emit("crying detected", this, newValue);
}
else if (metadata.name === types_1.PropertyName.DeviceDogDetected) {
this.emit("dog detected", this, newValue);
}
else if (metadata.name === types_1.PropertyName.DeviceDogLickDetected) {
this.emit("dog lick detected", this, newValue);
}
else if (metadata.name === types_1.PropertyName.DeviceDogPoopDetected) {
this.emit("dog poop detected", this, newValue);
}
else if (metadata.name === types_1.PropertyName.DevicePetDetected) {
this.emit("pet detected", this, newValue);
}
else if (metadata.name === types_1.PropertyName.DeviceSoundDetected) {
this.emit("sound detected", this, newValue);
}
else if (metadata.name === types_1.PropertyName.DeviceVehicleDetected) {
this.emit("vehicle detected", this, newValue);
}
}
processPushNotification(station, message, eventDurationSeconds) {
super.processPushNotification(station, message, eventDurationSeconds);
if (message.type !== undefined && message.event_type !== undefined) {
if (message.event_type === types_3.CusPushEvent.SECURITY && message.device_sn === this.getSerial()) {
try {
(0, utils_1.loadEventImage)(station, this.api, this, message, this.pictureEventTimeouts);
if (message.fetch_id !== undefined) {
// Person or someone identified
this.updateProperty(types_1.PropertyName.DevicePersonName, !(0, utils_3.isEmpty)(message.person_name) ? message.person_name : "Unknown");
this.updateProperty(types_1.PropertyName.DevicePersonDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.PersonDetected);
this.eventTimeouts.set(types_1.DeviceEvent.PersonDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DevicePersonName, "");
this.updateProperty(types_1.PropertyName.DevicePersonDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.PersonDetected);
}, eventDurationSeconds * 1000));
}
// Motion detected
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.MotionDetected);
this.eventTimeouts.set(types_1.DeviceEvent.MotionDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.MotionDetected);
}, eventDurationSeconds * 1000));
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.debug(`Camera process push notification - CusPushEvent.SECURITY - Error`, { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), message: JSON.stringify(message), eventDurationSeconds: eventDurationSeconds });
}
}
else if (message.msg_type === types_1.DeviceType.HB3) {
if (message.device_sn === this.getSerial()) {
try {
(0, utils_1.loadEventImage)(station, this.api, this, message, this.pictureEventTimeouts);
switch (message.event_type) {
case types_3.HB3PairedDevicePushEvent.PRESS_DOORBELL:
this.updateProperty(types_1.PropertyName.DeviceRinging, true);
this.clearEventTimeout(types_1.DeviceEvent.Ringing);
this.eventTimeouts.set(types_1.DeviceEvent.Ringing, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceRinging, false);
this.eventTimeouts.delete(types_1.DeviceEvent.Ringing);
}, eventDurationSeconds * 1000));
break;
case types_3.HB3PairedDevicePushEvent.MOTION_DETECTION:
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.MotionDetected);
this.eventTimeouts.set(types_1.DeviceEvent.MotionDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.MotionDetected);
}, eventDurationSeconds * 1000));
break;
case types_3.HB3PairedDevicePushEvent.FACE_DETECTION:
this.updateProperty(types_1.PropertyName.DevicePersonName, !(0, utils_3.isEmpty)(message.person_name) ? message.person_name : "Unknown");
this.updateProperty(types_1.PropertyName.DevicePersonDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.PersonDetected);
this.eventTimeouts.set(types_1.DeviceEvent.PersonDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DevicePersonName, "");
this.updateProperty(types_1.PropertyName.DevicePersonDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.PersonDetected);
}, eventDurationSeconds * 1000));
if (this.config.simultaneousDetections) {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.MotionDetected);
this.eventTimeouts.set(types_1.DeviceEvent.MotionDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.MotionDetected);
}, eventDurationSeconds * 1000));
}
break;
case types_3.HB3PairedDevicePushEvent.CRYING_DETECTION:
this.updateProperty(types_1.PropertyName.DeviceCryingDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.CryingDetected);
this.eventTimeouts.set(types_1.DeviceEvent.CryingDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceCryingDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.CryingDetected);
}, eventDurationSeconds * 1000));
break;
case types_3.HB3PairedDevicePushEvent.DOG_DETECTION:
this.updateProperty(types_1.PropertyName.DeviceDogDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.DogDetected);
this.eventTimeouts.set(types_1.DeviceEvent.DogDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceDogDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.DogDetected);
}, eventDurationSeconds * 1000));
break;
case types_3.HB3PairedDevicePushEvent.DOG_LICK_DETECTION:
this.updateProperty(types_1.PropertyName.DeviceDogLickDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.DogLickDetected);
this.eventTimeouts.set(types_1.DeviceEvent.DogLickDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceDogLickDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.DogLickDetected);
}, eventDurationSeconds * 1000));
break;
case types_3.HB3PairedDevicePushEvent.DOG_POOP_DETECTION:
this.updateProperty(types_1.PropertyName.DeviceDogPoopDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.DogPoopDetected);
this.eventTimeouts.set(types_1.DeviceEvent.DogPoopDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceDogPoopDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.DogPoopDetected);
}, eventDurationSeconds * 1000));
break;
case types_3.HB3PairedDevicePushEvent.PET_DETECTION:
this.updateProperty(types_1.PropertyName.DevicePetDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.PetDetected);
this.eventTimeouts.set(types_1.DeviceEvent.PetDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DevicePetDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.PetDetected);
}, eventDurationSeconds * 1000));
if (this.config.simultaneousDetections) {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.MotionDetected);
this.eventTimeouts.set(types_1.DeviceEvent.MotionDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.MotionDetected);
}, eventDurationSeconds * 1000));
}
break;
case types_3.HB3PairedDevicePushEvent.SOUND_DETECTION:
this.updateProperty(types_1.PropertyName.DeviceSoundDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.SoundDetected);
this.eventTimeouts.set(types_1.DeviceEvent.SoundDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceSoundDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.SoundDetected);
}, eventDurationSeconds * 1000));
break;
case types_3.HB3PairedDevicePushEvent.VEHICLE_DETECTION:
this.updateProperty(types_1.PropertyName.DeviceVehicleDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.VehicleDetected);
this.eventTimeouts.set(types_1.DeviceEvent.VehicleDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceVehicleDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.VehicleDetected);
}, eventDurationSeconds * 1000));
if (this.config.simultaneousDetections) {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.MotionDetected);
this.eventTimeouts.set(types_1.DeviceEvent.MotionDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.MotionDetected);
}, eventDurationSeconds * 1000));
}
break;
case types_3.HB3PairedDevicePushEvent.IDENTITY_PERSON_DETECTION:
this.updateProperty(types_1.PropertyName.DevicePersonName, !(0, utils_3.isEmpty)(message.person_name) ? message.person_name : "Unknown");
this.updateProperty(types_1.PropertyName.DeviceIdentityPersonDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.IdentityPersonDetected);
this.eventTimeouts.set(types_1.DeviceEvent.IdentityPersonDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DevicePersonName, "");
this.updateProperty(types_1.PropertyName.DeviceIdentityPersonDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.IdentityPersonDetected);
}, eventDurationSeconds * 1000));
if (this.config.simultaneousDetections) {
this.updateProperty(types_1.PropertyName.DevicePersonDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.PersonDetected);
this.eventTimeouts.set(types_1.DeviceEvent.PersonDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DevicePersonDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.PersonDetected);
}, eventDurationSeconds * 1000));
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.MotionDetected);
this.eventTimeouts.set(types_1.DeviceEvent.MotionDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.MotionDetected);
}, eventDurationSeconds * 1000));
}
break;
case types_3.HB3PairedDevicePushEvent.STRANGER_PERSON_DETECTION:
this.updateProperty(types_1.PropertyName.DevicePersonName, !(0, utils_3.isEmpty)(message.person_name) ? message.person_name : "Unknown");
this.updateProperty(types_1.PropertyName.DeviceStrangerPersonDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.StrangerPersonDetected);
this.eventTimeouts.set(types_1.DeviceEvent.StrangerPersonDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DevicePersonName, "");
this.updateProperty(types_1.PropertyName.DeviceStrangerPersonDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.StrangerPersonDetected);
}, eventDurationSeconds * 1000));
if (this.config.simultaneousDetections) {
this.updateProperty(types_1.PropertyName.DevicePersonDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.PersonDetected);
this.eventTimeouts.set(types_1.DeviceEvent.PersonDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DevicePersonDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.PersonDetected);
}, eventDurationSeconds * 1000));
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.MotionDetected);
this.eventTimeouts.set(types_1.DeviceEvent.MotionDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.MotionDetected);
}, eventDurationSeconds * 1000));
}
break;
default:
logging_1.rootHTTPLogger.debug("Camera process push notification - Unhandled homebase3 camera push event", message);
break;
}
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.debug(`Camera process push notification - HB3PairedDevicePushEvent - Error`, { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), message: JSON.stringify(message), eventDurationSeconds: eventDurationSeconds });
}
}
}
}
}
}
exports.Camera = Camera;
class SoloCamera extends Camera {
static async getInstance(api, device, deviceConfig) {
return new SoloCamera(api, device, deviceConfig);
}
isLedEnabled() {
return this.getPropertyValue(types_1.PropertyName.DeviceStatusLed);
}
isMotionDetectionEnabled() {
return this.getPropertyValue(types_1.PropertyName.DeviceMotionDetection);
}
convertRawPropertyValue(property, value) {
try {
switch (property.key) {
case types_2.CommandType.CMD_DEV_RECORD_AUTOSTOP:
return value !== undefined ? (value === "0" ? true : false) : false;
}
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("SoloCamera convert raw property - Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
}
return super.convertRawPropertyValue(property, value);
}
processPushNotification(station, message, eventDurationSeconds) {
super.processPushNotification(station, message, eventDurationSeconds);
if (message.type !== undefined && message.event_type !== undefined && message.msg_type !== types_1.DeviceType.HB3) {
if (message.device_sn === this.getSerial()) {
try {
(0, utils_1.loadEventImage)(station, this.api, this, message, this.pictureEventTimeouts);
switch (message.event_type) {
case types_3.IndoorPushEvent.MOTION_DETECTION:
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.MotionDetected);
this.eventTimeouts.set(types_1.DeviceEvent.MotionDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.MotionDetected);
}, eventDurationSeconds * 1000));
break;
case types_3.IndoorPushEvent.FACE_DETECTION:
this.updateProperty(types_1.PropertyName.DevicePersonName, !(0, utils_3.isEmpty)(message.person_name) ? message.person_name : "Unknown");
this.updateProperty(types_1.PropertyName.DevicePersonDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.PersonDetected);
this.eventTimeouts.set(types_1.DeviceEvent.PersonDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DevicePersonName, "");
this.updateProperty(types_1.PropertyName.DevicePersonDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.PersonDetected);
}, eventDurationSeconds * 1000));
if (this.config.simultaneousDetections) {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.MotionDetected);
this.eventTimeouts.set(types_1.DeviceEvent.MotionDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.MotionDetected);
}, eventDurationSeconds * 1000));
}
break;
default:
logging_1.rootHTTPLogger.debug("SoloCamera process push notification - Unhandled solo camera push event", message);
break;
}
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.debug(`SoloCamera process push notification - Error`, { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), message: JSON.stringify(message), eventDurationSeconds: eventDurationSeconds });
}
}
}
}
}
exports.SoloCamera = SoloCamera;
class IndoorCamera extends Camera {
constructor(api, device, deviceConfig) {
super(api, device, deviceConfig);
this.properties[types_1.PropertyName.DevicePetDetected] = false;
this.properties[types_1.PropertyName.DeviceSoundDetected] = false;
this.properties[types_1.PropertyName.DeviceCryingDetected] = false;
}
static async getInstance(api, device, deviceConfig) {
return new IndoorCamera(api, device, deviceConfig);
}
isLedEnabled() {
return this.getPropertyValue(types_1.PropertyName.DeviceStatusLed);
}
isMotionDetectionEnabled() {
return this.getPropertyValue(types_1.PropertyName.DeviceMotionDetection);
}
isPetDetectionEnabled() {
return this.getPropertyValue(types_1.PropertyName.DevicePetDetection);
}
isSoundDetectionEnabled() {
return this.getPropertyValue(types_1.PropertyName.DeviceSoundDetection);
}
isPetDetected() {
return this.getPropertyValue(types_1.PropertyName.DevicePetDetected);
}
isSoundDetected() {
return this.getPropertyValue(types_1.PropertyName.DeviceSoundDetected);
}
isCryingDetected() {
return this.getPropertyValue(types_1.PropertyName.DeviceCryingDetected);
}
processPushNotification(station, message, eventDurationSeconds) {
super.processPushNotification(station, message, eventDurationSeconds);
if (message.type !== undefined && message.event_type !== undefined && message.msg_type !== types_1.DeviceType.HB3) {
if (message.device_sn === this.getSerial()) {
try {
(0, utils_1.loadEventImage)(station, this.api, this, message, this.pictureEventTimeouts);
switch (message.event_type) {
case types_3.IndoorPushEvent.MOTION_DETECTION:
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.MotionDetected);
this.eventTimeouts.set(types_1.DeviceEvent.MotionDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.MotionDetected);
}, eventDurationSeconds * 1000));
break;
case types_3.IndoorPushEvent.FACE_DETECTION:
this.updateProperty(types_1.PropertyName.DevicePersonName, !(0, utils_3.isEmpty)(message.person_name) ? message.person_name : "Unknown");
this.updateProperty(types_1.PropertyName.DevicePersonDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.PersonDetected);
this.eventTimeouts.set(types_1.DeviceEvent.PersonDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DevicePersonName, "");
this.updateProperty(types_1.PropertyName.DevicePersonDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.PersonDetected);
}, eventDurationSeconds * 1000));
if (this.config.simultaneousDetections) {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.MotionDetected);
this.eventTimeouts.set(types_1.DeviceEvent.MotionDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.MotionDetected);
}, eventDurationSeconds * 1000));
}
break;
case types_3.IndoorPushEvent.CRYING_DETECTION:
this.updateProperty(types_1.PropertyName.DeviceCryingDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.CryingDetected);
this.eventTimeouts.set(types_1.DeviceEvent.CryingDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceCryingDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.CryingDetected);
}, eventDurationSeconds * 1000));
this.updateProperty(types_1.PropertyName.DeviceSoundDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.SoundDetected);
this.eventTimeouts.set(types_1.DeviceEvent.SoundDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceSoundDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.SoundDetected);
}, eventDurationSeconds * 1000));
break;
case types_3.IndoorPushEvent.SOUND_DETECTION:
this.updateProperty(types_1.PropertyName.DeviceSoundDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.SoundDetected);
this.eventTimeouts.set(types_1.DeviceEvent.SoundDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceSoundDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.SoundDetected);
}, eventDurationSeconds * 1000));
break;
case types_3.IndoorPushEvent.PET_DETECTION:
this.updateProperty(types_1.PropertyName.DevicePetDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.PetDetected);
this.eventTimeouts.set(types_1.DeviceEvent.PetDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DevicePetDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.PetDetected);
}, eventDurationSeconds * 1000));
if (this.config.simultaneousDetections) {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.MotionDetected);
this.eventTimeouts.set(types_1.DeviceEvent.MotionDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.MotionDetected);
}, eventDurationSeconds * 1000));
}
break;
default:
logging_1.rootHTTPLogger.debug("IndoorCamera process push notification - Unhandled indoor camera push event", message);
break;
}
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.debug(`IndoorCamera process push notification - Error`, { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), message: JSON.stringify(message), eventDurationSeconds: eventDurationSeconds });
}
}
}
}
destroy() {
super.destroy();
}
}
exports.IndoorCamera = IndoorCamera;
class DoorbellCamera extends Camera {
voices;
constructor(api, device, voices, deviceConfig) {
super(api, device, deviceConfig);
this.voices = voices;
this.properties[types_1.PropertyName.DeviceRinging] = false;
}
static async getInstance(api, device, deviceConfig) {
const voices = await api.getVoices(device.device_sn);
return new DoorbellCamera(api, device, voices, deviceConfig);
}
loadMetadataVoiceStates(propertyName, metadata) {
if (metadata[propertyName] !== undefined) {
const states = {};
for (const voice of Object.values(this.voices)) {
states[voice.voice_id] = voice.desc;
}
metadata[propertyName].states = states;
}
return metadata;
}
getVoiceName(id) {
if (this.voices[id] !== undefined)
return this.voices[id].desc;
return "";
}
getVoices() {
return this.voices;
}
getPropertiesMetadata(hidden = false) {
let metadata = super.getPropertiesMetadata(hidden);
metadata = this.loadMetadataVoiceStates(types_1.PropertyName.DeviceLoiteringCustomResponseAutoVoiceResponseVoice, metadata);
metadata = this.loadMetadataVoiceStates(types_1.PropertyName.DeviceDeliveryGuardPackageGuardingVoiceResponseVoice, metadata);
metadata = this.loadMetadataVoiceStates(types_1.PropertyName.DeviceRingAutoResponseVoiceResponseVoice, metadata);
return metadata;
}
isRinging() {
return this.getPropertyValue(types_1.PropertyName.DeviceRinging);
}
handlePropertyChange(metadata, oldValue, newValue) {
super.handlePropertyChange(metadata, oldValue, newValue);
if (metadata.name === types_1.PropertyName.DeviceRinging) {
this.emit("rings", this, newValue);
}
else if (metadata.name === types_1.PropertyName.DevicePackageDelivered) {
this.emit("package delivered", this, newValue);
}
else if (metadata.name === types_1.PropertyName.DevicePackageStranded) {
this.emit("package stranded", this, newValue);
}
else if (metadata.name === types_1.PropertyName.DevicePackageTaken) {
this.emit("package taken", this, newValue);
}
else if (metadata.name === types_1.PropertyName.DeviceSomeoneLoitering) {
this.emit("someone loitering", this, newValue);
}
else if (metadata.name === types_1.PropertyName.DeviceRadarMotionDetected) {
this.emit("radar motion detected", this, newValue);
}
}
processPushNotification(station, message, eventDurationSeconds) {
super.processPushNotification(station, message, eventDurationSeconds);
if (message.type !== undefined && message.event_type !== undefined && message.msg_type !== types_1.DeviceType.HB3) {
if (message.device_sn === this.getSerial()) {
try {
(0, utils_1.loadEventImage)(station, this.api, this, message, this.pictureEventTimeouts);
switch (message.event_type) {
case types_3.DoorbellPushEvent.MOTION_DETECTION:
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.MotionDetected);
this.eventTimeouts.set(types_1.DeviceEvent.MotionDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.MotionDetected);
}, eventDurationSeconds * 1000));
break;
case types_3.DoorbellPushEvent.FACE_DETECTION:
case types_3.DoorbellPushEvent.FAMILY_DETECTION:
this.updateProperty(types_1.PropertyName.DevicePersonName, !(0, utils_3.isEmpty)(message.person_name) ? message.person_name : "Unknown");
this.updateProperty(types_1.PropertyName.DevicePersonDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.PersonDetected);
this.eventTimeouts.set(types_1.DeviceEvent.PersonDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DevicePersonName, "");
this.updateProperty(types_1.PropertyName.DevicePersonDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.PersonDetected);
}, eventDurationSeconds * 1000));
if (this.config.simultaneousDetections) {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.MotionDetected);
this.eventTimeouts.set(types_1.DeviceEvent.MotionDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.MotionDetected);
}, eventDurationSeconds * 1000));
}
break;
case types_3.DoorbellPushEvent.PRESS_DOORBELL:
this.updateProperty(types_1.PropertyName.DeviceRinging, true);
this.clearEventTimeout(types_1.DeviceEvent.Ringing);
this.eventTimeouts.set(types_1.DeviceEvent.Ringing, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceRinging, false);
this.eventTimeouts.delete(types_1.DeviceEvent.Ringing);
}, eventDurationSeconds * 1000));
break;
case types_3.DoorbellPushEvent.PACKAGE_DELIVERED:
this.updateProperty(types_1.PropertyName.DevicePackageDelivered, true);
this.clearEventTimeout(types_1.DeviceEvent.PackageDelivered);
this.eventTimeouts.set(types_1.DeviceEvent.PackageDelivered, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DevicePackageDelivered, false);
this.eventTimeouts.delete(types_1.DeviceEvent.PackageDelivered);
}, eventDurationSeconds * 1000));
break;
case types_3.DoorbellPushEvent.PACKAGE_STRANDED:
this.updateProperty(types_1.PropertyName.DevicePackageStranded, true);
this.clearEventTimeout(types_1.DeviceEvent.PackageStranded);
this.eventTimeouts.set(types_1.DeviceEvent.PackageStranded, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DevicePackageStranded, false);
this.eventTimeouts.delete(types_1.DeviceEvent.PackageStranded);
}, eventDurationSeconds * 1000));
break;
case types_3.DoorbellPushEvent.PACKAGE_TAKEN:
this.updateProperty(types_1.PropertyName.DevicePackageTaken, true);
this.clearEventTimeout(types_1.DeviceEvent.PackageTaken);
this.eventTimeouts.set(types_1.DeviceEvent.PackageTaken, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DevicePackageTaken, false);
this.eventTimeouts.delete(types_1.DeviceEvent.PackageTaken);
}, eventDurationSeconds * 1000));
break;
case types_3.DoorbellPushEvent.SOMEONE_LOITERING:
this.updateProperty(types_1.PropertyName.DeviceSomeoneLoitering, true);
this.clearEventTimeout(types_1.DeviceEvent.SomeoneLoitering);
this.eventTimeouts.set(types_1.DeviceEvent.SomeoneLoitering, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceSomeoneLoitering, false);
this.eventTimeouts.delete(types_1.DeviceEvent.SomeoneLoitering);
}, eventDurationSeconds * 1000));
this.clearEventTimeout(types_1.DeviceEvent.PersonDetected);
this.eventTimeouts.set(types_1.DeviceEvent.PersonDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DevicePersonDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.PersonDetected);
}, eventDurationSeconds * 1000));
if (this.config.simultaneousDetections) {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.MotionDetected);
this.eventTimeouts.set(types_1.DeviceEvent.MotionDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.MotionDetected);
}, eventDurationSeconds * 1000));
}
break;
case types_3.DoorbellPushEvent.RADAR_MOTION_DETECTION:
this.updateProperty(types_1.PropertyName.DeviceRadarMotionDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.RadarMotionDetected);
this.eventTimeouts.set(types_1.DeviceEvent.RadarMotionDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceRadarMotionDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.RadarMotionDetected);
}, eventDurationSeconds * 1000));
break;
case types_3.DoorbellPushEvent.AWAY_FROM_HOME:
this.updateProperty(types_1.PropertyName.DeviceSomeoneGoing, true);
this.clearEventTimeout(types_1.DeviceEvent.SomeoneGoing);
this.eventTimeouts.set(types_1.DeviceEvent.SomeoneGoing, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceSomeoneGoing, false);
this.eventTimeouts.delete(types_1.DeviceEvent.SomeoneGoing);
}, eventDurationSeconds * 1000));
this.clearEventTimeout(types_1.DeviceEvent.PersonDetected);
this.eventTimeouts.set(types_1.DeviceEvent.PersonDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DevicePersonDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.PersonDetected);
}, eventDurationSeconds * 1000));
if (this.config.simultaneousDetections) {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.MotionDetected);
this.eventTimeouts.set(types_1.DeviceEvent.MotionDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.MotionDetected);
}, eventDurationSeconds * 1000));
}
break;
default:
logging_1.rootHTTPLogger.debug("DoorbellCamera process push notification - Unhandled doorbell push event", message);
break;
}
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.debug(`DoorbellCamera process push notification - Error`, { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), message: JSON.stringify(message), eventDurationSeconds: eventDurationSeconds });
}
}
}
}
}
exports.DoorbellCamera = DoorbellCamera;
class WiredDoorbellCamera extends DoorbellCamera {
static async getInstance(api, device, deviceConfig) {
const voices = await api.getVoices(device.device_sn);
return new WiredDoorbellCamera(api, device, voices, deviceConfig);
}
isLedEnabled() {
return this.getPropertyValue(types_1.PropertyName.DeviceStatusLed);
}
isAutoNightVisionEnabled() {
return this.getPropertyValue(types_1.PropertyName.DeviceAutoNightvision);
}
isMotionDetectionEnabled() {
return this.getPropertyValue(types_1.PropertyName.DeviceMotionDetection);
}
}
exports.WiredDoorbellCamera = WiredDoorbellCamera;
class BatteryDoorbellCamera extends DoorbellCamera {
static async getInstance(api, device, deviceConfig) {
const voices = await api.getVoices(device.device_sn);
return new BatteryDoorbellCamera(api, device, voices, deviceConfig);
}
isLedEnabled() {
return this.getPropertyValue(types_1.PropertyName.DeviceStatusLed);
}
}
exports.BatteryDoorbellCamera = BatteryDoorbellCamera;
class FloodlightCamera extends Camera {
static async getInstance(api, device, deviceConfig) {
return new FloodlightCamera(api, device, deviceConfig);
}
isLedEnabled() {
return this.getPropertyValue(types_1.PropertyName.DeviceStatusLed);
}
isMotionDetectionEnabled() {
return this.getPropertyValue(types_1.PropertyName.DeviceMotionDetection);
}
convertRawPropertyValue(property, value) {
try {
switch (property.key) {
case types_2.CommandType.CMD_DEV_RECORD_AUTOSTOP:
if (this.getDeviceType() === types_1.DeviceType.FLOODLIGHT_CAMERA_8423 || this.getDeviceType() === types_1.DeviceType.FLOODLIGHT_CAMERA_8424 || this.getDeviceType() === types_1.DeviceType.FLOODLIGHT)
return value !== undefined ? (value === "0" ? true : false) : false;
break;
case types_2.CommandType.CMD_FLOODLIGHT_SET_AUTO_CALIBRATION:
if (this.getDeviceType() === types_1.DeviceType.FLOODLIGHT_CAMERA_8423)
return value !== undefined ? (value === "0" ? true : false) : false;
break;
case types_2.CommandType.CMD_RECORD_AUDIO_SWITCH:
return value !== undefined ? (value === "0" ? true : false) : false;
case types_2.CommandType.CMD_SET_AUDIO_MUTE_RECORD:
if (this.getDeviceType() === types_1.DeviceType.FLOODLIGHT_CAMERA_8423)
return value !== undefined ? (value === "1" ? true : false) : false;
return value !== undefined ? (value === "0" ? true : false) : false;
case types_2.CommandType.CMD_SET_PIRSENSITIVITY:
switch (Number.parseInt(value)) {
case types_1.FloodlightMotionTriggeredDistance.MIN:
return 1;
case types_1.FloodlightMotionTriggeredDistance.LOW:
return 2;
case types_1.FloodlightMotionTriggeredDistance.MEDIUM:
return 3;
case types_1.FloodlightMotionTriggeredDistance.HIGH:
return 4;
case types_1.FloodlightMotionTriggeredDistance.MAX:
return 5;
default:
return 5;
}
}
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("FloodlightCamera convert raw property - Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
}
return super.convertRawPropertyValue(property, value);
}
processPushNotification(station, message, eventDurationSeconds) {
super.processPushNotification(station, message, eventDurationSeconds);
if (message.type !== undefined && message.event_type !== undefined && message.msg_type !== types_1.DeviceType.HB3) {
if (message.device_sn === this.getSerial()) {
try {
(0, utils_1.loadEventImage)(station, this.api, this, message, this.pictureEventTimeouts);
switch (message.event_type) {
case types_3.IndoorPushEvent.MOTION_DETECTION:
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.MotionDetected);
this.eventTimeouts.set(types_1.DeviceEvent.MotionDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.MotionDetected);
}, eventDurationSeconds * 1000));
break;
case types_3.IndoorPushEvent.FACE_DETECTION:
this.updateProperty(types_1.PropertyName.DevicePersonName, !(0, utils_3.isEmpty)(message.person_name) ? message.person_name : "Unknown");
this.updateProperty(types_1.PropertyName.DevicePersonDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.PersonDetected);
this.eventTimeouts.set(types_1.DeviceEvent.PersonDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DevicePersonName, "");
this.updateProperty(types_1.PropertyName.DevicePersonDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.PersonDetected);
}, eventDurationSeconds * 1000));
if (this.config.simultaneousDetections) {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.MotionDetected);
this.eventTimeouts.set(types_1.DeviceEvent.MotionDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.MotionDetected);
}, eventDurationSeconds * 1000));
}
break;
default:
logging_1.rootHTTPLogger.debug("FloodlightCamera process push notification - Unhandled floodlight push event", message);
break;
}
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.debug(`FloodlightCamera process push notification - Error`, { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), message: JSON.stringify(message), eventDurationSeconds: eventDurationSeconds });
}
}
}
}
}
exports.FloodlightCamera = FloodlightCamera;
class WallLightCam extends Camera {
static async getInstance(api, device, deviceConfig) {
return new WallLightCam(api, device, deviceConfig);
}
isLedEnabled() {
return this.getPropertyValue(types_1.PropertyName.DeviceStatusLed);
}
isMotionDetectionEnabled() {
return this.getPropertyValue(types_1.PropertyName.DeviceMotionDetection);
}
convertRawPropertyValue(property, value) {
try {
switch (property.key) {
case types_2.CommandType.CMD_DEV_RECORD_AUTOSTOP:
return value !== undefined ? (value === "0" ? true : false) : false;
case types_2.CommandType.CMD_SET_AUDIO_MUTE_RECORD:
return value !== undefined ? (value === "1" ? true : false) : false;
case types_2.CommandType.CMD_WALL_LIGHT_SETTINGS_MANUAL_COLORED_LIGHTING:
case types_2.CommandType.CMD_WALL_LIGHT_SETTINGS_MOTION_COLORED_LIGHTING:
case types_2.CommandType.CMD_WALL_LIGHT_SETTINGS_SCHEDULE_COLORED_LIGHTING:
{
const defaultColor = {
red: 0,
green: 0,
blue: 0
};
const internal = value;
return internal !== undefined ? (internal.rgb_color !== undefined ? (0, utils_2.DecimalToRGBColor)(internal.rgb_color) : defaultColor) : defaultColor;
}
case types_2.CommandType.CMD_WALL_LIGHT_SETTINGS_COLORED_LIGHTING_COLORS: {
const result = [];
for (const color of value) {
result.push((0, utils_2.DecimalToRGBColor)(color.color));
}
return result;
}
case types_2.CommandType.CMD_WALL_LIGHT_SETTINGS_DYNAMIC_LIGHTING_THEMES: {
const result = [];
for (const theme of value) {
result.push({
colors: theme.colors.map((color) => (0, utils_2.DecimalToRGBColor)(color)),
mode: theme.mode,
name: theme.name, // 1 fade 2 blink
speed: theme.speed // Control speed 500 msec to 5 sec.; 500 msec steps
});
}
return result;
}
}
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("WallLightCam convert raw property - Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
}
return super.convertRawPropertyValue(property, value);
}
getPropertiesMetadata(hidden = false) {
const metadata = super.getPropertiesMetadata(hidden);
const themes = this.getPropertyValue(types_1.PropertyName.DeviceLightSettingsDynamicLightingThemes);
if (themes !== undefined) {
const states = {};
for (let i = 0; i < themes.length; i++) {
states[i] = themes[i].name;
}
metadata[types_1.PropertyName.DeviceLightSettingsManualDynamicLighting].states = states;
metadata[types_1.PropertyName.DeviceLightSettingsScheduleDynamicLighting].states = states;
metadata[types_1.PropertyName.DeviceLightSettingsMotionDynamicLighting].states = states;
}
return metadata;
}
processPushNotification(station, message, eventDurationSeconds) {
super.processPushNotification(station, message, eventDurationSeconds);
if (message.type !== undefined && message.event_type !== undefined) {
if (message.device_sn === this.getSerial()) {
try {
(0, utils_1.loadEventImage)(station, this.api, this, message, this.pictureEventTimeouts);
switch (message.event_type) {
case types_3.IndoorPushEvent.MOTION_DETECTION:
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.MotionDetected);
this.eventTimeouts.set(types_1.DeviceEvent.MotionDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.MotionDetected);
}, eventDurationSeconds * 1000));
break;
case types_3.IndoorPushEvent.FACE_DETECTION:
this.updateProperty(types_1.PropertyName.DevicePersonName, !(0, utils_3.isEmpty)(message.person_name) ? message.person_name : "Unknown");
this.updateProperty(types_1.PropertyName.DevicePersonDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.PersonDetected);
this.eventTimeouts.set(types_1.DeviceEvent.PersonDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DevicePersonName, "");
this.updateProperty(types_1.PropertyName.DevicePersonDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.PersonDetected);
}, eventDurationSeconds * 1000));
if (this.config.simultaneousDetections) {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.MotionDetected);
this.eventTimeouts.set(types_1.DeviceEvent.MotionDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.MotionDetected);
}, eventDurationSeconds * 1000));
}
break;
default:
logging_1.rootHTTPLogger.debug("WallLightCam process push notification - Unhandled WallLightCam push event", message);
break;
}
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.debug(`WallLightCam process push notification - Error`, { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), message: JSON.stringify(message), eventDurationSeconds: eventDurationSeconds });
}
}
}
}
}
exports.WallLightCam = WallLightCam;
class GarageCamera extends Camera {
static async getInstance(api, device, deviceConfig) {
return new GarageCamera(api, device, deviceConfig);
}
isLedEnabled() {
return this.getPropertyValue(types_1.PropertyName.DeviceStatusLed);
}
isMotionDetectionEnabled() {
return this.getPropertyValue(types_1.PropertyName.DeviceMotionDetection);
}
convertRawPropertyValue(property, value) {
try {
switch (property.key) {
case types_2.CommandType.CMD_SET_AUDIO_MUTE_RECORD:
return value !== undefined ? (value === "1" ? true : false) : false;
case types_2.CommandType.CMD_CAMERA_GARAGE_DOOR_STATUS:
if (value != undefined) {
const status = Number.parseInt(value);
if (status >= 0) {
if (property.name === types_1.PropertyName.DeviceDoor1Open) {
return (status & types_1.GarageDoorState.A_OPENED) === types_1.GarageDoorState.A_OPENED;
}
else if (property.name === types_1.PropertyName.DeviceDoor2Open) {
return (status & types_1.GarageDoorState.B_OPENED) === types_1.GarageDoorState.B_OPENED;
}
}
}
return false;
case types_2.CommandType.CMD_CAMERA_GARAGE_DOOR_SENSORS:
if (value != undefined) {
const sensorsData = value;
if (property.name === types_1.PropertyName.DeviceDoorSensor1BatteryLevel) {
if (sensorsData?.data?.door_1?.power !== undefined && sensorsData?.data?.door_1?.power > 1) {
this.updateProperty(types_1.PropertyName.DeviceDoorSensor1LowBattery, false);
}
return sensorsData?.data?.door_1?.power !== undefined ? sensorsData?.data?.door_1?.power : 0;
}
else if (property.name === types_1.PropertyName.DeviceDoorSensor2BatteryLevel) {
if (sensorsData?.data?.door_2?.power !== undefined && sensorsData?.data?.door_2?.power > 1) {
this.updateProperty(types_1.PropertyName.DeviceDoorSensor1LowBattery, false);
}
return sensorsData?.data?.door_2?.power !== undefined ? sensorsData?.data?.door_2?.power : 0;
}
else if (property.name === types_1.PropertyName.DeviceDoorSensor1MacAddress) {
return sensorsData?.data?.door_1?.mac_address !== undefined ? sensorsData?.data?.door_1?.mac_address : "";
}
else if (property.name === types_1.PropertyName.DeviceDoorSensor2MacAddress) {
return sensorsData?.data?.door_2?.mac_address !== undefined ? sensorsData?.data?.door_2?.mac_address : "";
}
else if (property.name === types_1.PropertyName.DeviceDoorSensor1Name) {
return sensorsData?.data?.door_1?.name !== undefined ? sensorsData?.data?.door_1?.name : "";
}
else if (property.name === types_1.PropertyName.DeviceDoorSensor2Name) {
return sensorsData?.data?.door_2?.name !== undefined ? sensorsData?.data?.door_2?.name : "";
}
else if (property.name === types_1.PropertyName.DeviceDoorSensor1SerialNumber) {
return sensorsData?.data?.door_1?.sn !== undefined ? sensorsData?.data?.door_1?.sn : "";
}
else if (property.name === types_1.PropertyName.DeviceDoorSensor2SerialNumber) {
return sensorsData?.data?.door_2?.sn !== undefined ? sensorsData?.data?.door_2?.sn : "";
}
else if (property.name === types_1.PropertyName.DeviceDoorSensor1Version) {
return sensorsData?.data?.door_1?.version !== undefined ? sensorsData?.data?.door_1?.version : "";
}
else if (property.name === types_1.PropertyName.DeviceDoorSensor2Version) {
return sensorsData?.data?.door_2?.version !== undefined ? sensorsData?.data?.door_2?.version : "";
}
else if (property.name === types_1.PropertyName.DeviceDoorControlWarning) {
return sensorsData?.data?.door_1?.playalarm !== undefined ? sensorsData?.data?.door_1?.playalarm === 1 ? true : false : false;
}
else if (property.name === types_1.PropertyName.DeviceDoorSensor1Status) {
return sensorsData?.data?.door_1?.power !== undefined ? sensorsData?.data?.door_1?.power >= 1 && sensorsData?.data?.door_1?.sn !== "" ? 1 : 0 : 0;
}
else if (property.name === types_1.PropertyName.DeviceDoorSensor2Status) {
return sensorsData?.data?.door_2?.power !== undefined ? sensorsData?.data?.door_2?.power >= 1 && sensorsData?.data?.door_2?.sn !== "" ? 1 : 0 : 0;
}
}
break;
}
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("GarageCamera convert raw property - Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
}
return super.convertRawPropertyValue(property, value);
}
processPushNotification(station, message, eventDurationSeconds) {
super.processPushNotification(station, message, eventDurationSeconds);
if (message.type !== undefined && message.event_type !== undefined) {
if (message.device_sn === this.getSerial()) {
try {
(0, utils_1.loadEventImage)(station, this.api, this, message, this.pictureEventTimeouts);
switch (message.event_type) {
case types_3.GarageDoorPushEvent.CLOSED_DOOR_BY_APP:
case types_3.GarageDoorPushEvent.CLOSED_DOOR_WITHOUT_APP:
case types_3.GarageDoorPushEvent.TIMEOUT_CLOSED_DOOR:
if (message.door_id === 1) {
this.updateProperty(types_1.PropertyName.DeviceDoor1Open, false);
}
else if (message.door_id === 2) {
this.updateProperty(types_1.PropertyName.DeviceDoor2Open, false);
}
break;
case types_3.GarageDoorPushEvent.OPEN_DOOR_BY_APP:
case types_3.GarageDoorPushEvent.OPEN_DOOR_WITHOUT_APP:
case types_3.GarageDoorPushEvent.TIMEOUT_DOOR_OPEN_WARNING:
case types_3.GarageDoorPushEvent.TIMEOUT_DOOR_OPEN_WARNING_MINUTES:
if (message.door_id === 1) {
this.updateProperty(types_1.PropertyName.DeviceDoor1Open, true);
}
else if (message.door_id === 2) {
this.updateProperty(types_1.PropertyName.DeviceDoor2Open, true);
}
break;
case types_3.GarageDoorPushEvent.LOW_BATTERY:
//TODO: Check if low battery status resets to false after battery change
if (message.door_id === 1) {
this.updateProperty(types_1.PropertyName.DeviceDoorSensor1LowBattery, true);
}
else if (message.door_id === 2) {
this.updateProperty(types_1.PropertyName.DeviceDoorSensor2LowBattery, true);
}
break;
default:
logging_1.rootHTTPLogger.debug("GarageCamera process push notification - Unhandled GarageDoor push event", message);
break;
}
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.debug(`GarageCamera process push notification - Error`, { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), message: JSON.stringify(message), eventDurationSeconds: eventDurationSeconds });
}
}
}
}
}
exports.GarageCamera = GarageCamera;
class Sensor extends Device {
static async getInstance(api, device, deviceConfig) {
return new Sensor(api, device, deviceConfig);
}
getStateChannel() {
return "sensors";
}
getState() {
return this.getPropertyValue(types_1.PropertyName.DeviceState);
}
}
exports.Sensor = Sensor;
class EntrySensor extends Sensor {
static async getInstance(api, device, deviceConfig) {
return new EntrySensor(api, device, deviceConfig);
}
isSensorOpen() {
return this.getPropertyValue(types_1.PropertyName.DeviceSensorOpen);
}
getSensorChangeTime() {
return this.getPropertyValue(types_1.PropertyName.DeviceSensorChangeTime);
}
isBatteryLow() {
return this.getPropertyValue(types_1.PropertyName.DeviceBatteryLow);
}
processPushNotification(station, message, eventDurationSeconds) {
super.processPushNotification(station, message, eventDurationSeconds);
if (message.type !== undefined && message.event_type !== undefined) {
if (message.event_type === types_3.CusPushEvent.DOOR_SENSOR && message.device_sn === this.getSerial()) {
try {
if (message.sensor_open !== undefined) {
this.updateRawProperty(types_2.CommandType.CMD_ENTRY_SENSOR_STATUS, message.sensor_open ? "1" : "0", "push");
}
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.debug(`EntrySensor process push notification - Error`, { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), message: JSON.stringify(message), eventDurationSeconds: eventDurationSeconds });
}
}
}
}
handlePropertyChange(metadata, oldValue, newValue) {
super.handlePropertyChange(metadata, oldValue, newValue);
if (metadata.name === types_1.PropertyName.DeviceSensorOpen && metadata.key === types_2.CommandType.CMD_ENTRY_SENSOR_STATUS) {
this.emit("open", this, newValue);
}
}
}
exports.EntrySensor = EntrySensor;
class MotionSensor extends Sensor {
static MOTION_COOLDOWN_MS = 120000;
//TODO: CMD_MOTION_SENSOR_ENABLE_LED = 1607
//TODO: CMD_MOTION_SENSOR_ENTER_USER_TEST_MODE = 1613
//TODO: CMD_MOTION_SENSOR_EXIT_USER_TEST_MODE = 1610
//TODO: CMD_MOTION_SENSOR_SET_CHIRP_TONE = 1611
//TODO: CMD_MOTION_SENSOR_SET_PIR_SENSITIVITY = 1609
//TODO: CMD_MOTION_SENSOR_WORK_MODE = 1612
/*public static isMotionDetected(millis: number): { motion: boolean, cooldown_ms: number} {
const delta = new Date().getUTCMilliseconds() - millis;
if (delta < this.MOTION_COOLDOWN_MS) {
return { motion: true, cooldown_ms: this.MOTION_COOLDOWN_MS - delta};
}
return { motion: false, cooldown_ms: 0};
}
public isMotionDetected(): { motion: boolean, cooldown_ms: number} {
return MotionSensor.isMotionDetected(this.getMotionSensorPIREvent());
}*/
constructor(api, device, deviceConfig) {
super(api, device, deviceConfig);
this.properties[types_1.PropertyName.DeviceMotionDetected] = false;
}
static async getInstance(api, device, deviceConfig) {
return new MotionSensor(api, device, deviceConfig);
}
isMotionDetected() {
return this.getPropertyValue(types_1.PropertyName.DeviceMotionDetected);
}
getMotionSensorPIREvent() {
//TODO: Implement P2P Control Event over active station connection
return this.getPropertyValue(types_1.PropertyName.DeviceMotionSensorPIREvent);
}
isBatteryLow() {
return this.getPropertyValue(types_1.PropertyName.DeviceBatteryLow);
}
handlePropertyChange(metadata, oldValue, newValue) {
super.handlePropertyChange(metadata, oldValue, newValue);
if (metadata.name === types_1.PropertyName.DeviceMotionDetected) {
this.emit("motion detected", this, newValue);
}
}
processPushNotification(station, message, eventDurationSeconds) {
super.processPushNotification(station, message, eventDurationSeconds);
if (message.type !== undefined && message.event_type !== undefined) {
if (message.event_type === types_3.CusPushEvent.MOTION_SENSOR_PIR && message.device_sn === this.getSerial()) {
try {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.MotionDetected);
this.eventTimeouts.set(types_1.DeviceEvent.MotionDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceMotionDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.MotionDetected);
}, eventDurationSeconds * 1000));
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.debug(`MotionSensor process push notification - Error`, { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), message: JSON.stringify(message), eventDurationSeconds: eventDurationSeconds });
}
}
}
}
}
exports.MotionSensor = MotionSensor;
class Lock extends Device {
static VERSION_CODE_SMART_LOCK = 3;
static VERSION_CODE_LOCKV12 = 18;
static async getInstance(api, device, deviceConfig) {
return new Lock(api, device, deviceConfig);
}
getStateChannel() {
return "locks";
}
handlePropertyChange(metadata, oldValue, newValue) {
super.handlePropertyChange(metadata, oldValue, newValue);
if (metadata.name === types_1.PropertyName.DeviceLocked) {
this.emit("locked", this, newValue);
}
else if (metadata.name === types_1.PropertyName.DeviceLowBatteryAlert) {
this.emit("low battery", this, newValue);
}
else if ((metadata.key === types_2.CommandType.CMD_DOORLOCK_GET_STATE || metadata.key === types_2.CommandType.CMD_SMARTLOCK_QUERY_STATUS) && ((oldValue !== undefined && ((oldValue === 4 && newValue !== 4) || (oldValue !== 4 && newValue === 4))) || oldValue === undefined)) {
this.updateProperty(types_1.PropertyName.DeviceLocked, newValue === 4 ? true : false);
}
}
getState() {
return this.getPropertyValue(types_1.PropertyName.DeviceState);
}
getBatteryValue() {
return this.getPropertyValue(types_1.PropertyName.DeviceBattery);
}
getWifiRssi() {
return this.getPropertyValue(types_1.PropertyName.DeviceWifiRSSI);
}
isLocked() {
const param = this.getLockStatus();
return param ? (param === 4 ? true : false) : false;
}
getLockStatus() {
return this.getPropertyValue(types_1.PropertyName.DeviceLockStatus);
}
// public isBatteryLow(): PropertyValue {
// return this.getPropertyValue(PropertyName.DeviceBatteryLow);
// }
static encodeESLCmdOnOff(short_user_id, nickname, lock) {
const buf1 = Buffer.from([types_2.ESLAnkerBleConstant.a, 2]);
const buf2 = Buffer.allocUnsafe(2);
buf2.writeUInt16BE(short_user_id);
const buf3 = Buffer.from([types_2.ESLAnkerBleConstant.b, 1, lock === true ? 1 : 0, types_2.ESLAnkerBleConstant.c, 4]);
const buf4 = Buffer.from((0, utils_2.eslTimestamp)());
const buf5 = Buffer.from([types_2.ESLAnkerBleConstant.d, nickname.length]);
const buf6 = Buffer.from(nickname);
return Buffer.concat([buf1, buf2, buf3, buf4, buf5, buf6]);
}
static encodeESLCmdQueryStatus(admin_user_id) {
const buf1 = Buffer.from([types_2.ESLAnkerBleConstant.a, admin_user_id.length]);
const buf2 = Buffer.from(admin_user_id);
const buf3 = Buffer.from([types_2.ESLAnkerBleConstant.b, 4]);
const buf4 = Buffer.from((0, utils_2.eslTimestamp)());
return Buffer.concat([buf1, buf2, buf3, buf4]);
}
processPushNotification(station, message, eventDurationSeconds) {
super.processPushNotification(station, message, eventDurationSeconds);
if (message.event_type !== undefined) {
this.processNotification(message.event_type, message.event_time, message.device_sn, message.person_name, eventDurationSeconds, "push");
}
}
processMQTTNotification(message, eventDurationSeconds) {
if (message.eventType === types_3.LockPushEvent.STATUS_CHANGE) {
// Lock state event
const cmdType = this.isLockBle() || this.isLockBleNoFinger() ? types_2.CommandType.CMD_DOORLOCK_GET_STATE : types_2.CommandType.CMD_SMARTLOCK_QUERY_STATUS;
this.updateRawProperty(cmdType, message.lockState, "mqtt");
}
else if (message.eventType === types_3.LockPushEvent.OTA_STATUS) {
// OTA Status - ignore event
}
else {
this.processNotification(message.eventType, message.eventTime, this.getSerial(), message.nickName, eventDurationSeconds, "mqtt");
}
}
processNotification(eventType, eventTime, deviceSN, personName, eventDurationSeconds, source) {
if (deviceSN === this.getSerial()) {
try {
switch (eventType) {
case types_3.LockPushEvent.APP_LOCK:
case types_3.LockPushEvent.AUTO_LOCK:
case types_3.LockPushEvent.FINGER_LOCK:
case types_3.LockPushEvent.KEYPAD_LOCK:
case types_3.LockPushEvent.MANUAL_LOCK:
case types_3.LockPushEvent.PW_LOCK:
case types_3.LockPushEvent.TEMPORARY_PW_LOCK:
{
const cmdType = this.isLockBle() || this.isLockBleNoFinger() ? types_2.CommandType.CMD_DOORLOCK_GET_STATE : types_2.CommandType.CMD_SMARTLOCK_QUERY_STATUS;
this.updateRawProperty(cmdType, "4", source);
if (!(0, utils_3.isEmpty)(personName)) {
this.updateProperty(types_1.PropertyName.DevicePersonName, personName);
this.updateProperty(types_1.PropertyName.DeviceLockEventOrigin, (0, utils_1.getLockEventType)(eventType));
this.clearEventTimeout(types_1.DeviceEvent.Lock);
this.eventTimeouts.set(types_1.DeviceEvent.Lock, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DevicePersonName, "");
this.updateProperty(types_1.PropertyName.DeviceLockEventOrigin, 0);
this.eventTimeouts.delete(types_1.DeviceEvent.Lock);
}, eventDurationSeconds * 1000));
}
break;
}
case types_3.LockPushEvent.APP_UNLOCK:
case types_3.LockPushEvent.AUTO_UNLOCK:
case types_3.LockPushEvent.FINGERPRINT_UNLOCK:
case types_3.LockPushEvent.MANUAL_UNLOCK:
case types_3.LockPushEvent.PW_UNLOCK:
case types_3.LockPushEvent.TEMPORARY_PW_UNLOCK:
{
const cmdType = this.isLockBle() || this.isLockBleNoFinger() ? types_2.CommandType.CMD_DOORLOCK_GET_STATE : types_2.CommandType.CMD_SMARTLOCK_QUERY_STATUS;
this.updateRawProperty(cmdType, "3", source);
if (!(0, utils_3.isEmpty)(personName)) {
this.updateProperty(types_1.PropertyName.DevicePersonName, personName);
this.updateProperty(types_1.PropertyName.DeviceLockEventOrigin, (0, utils_1.getLockEventType)(eventType));
this.clearEventTimeout(types_1.DeviceEvent.Lock);
this.eventTimeouts.set(types_1.DeviceEvent.Lock, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DevicePersonName, "");
this.updateProperty(types_1.PropertyName.DeviceLockEventOrigin, 0);
this.eventTimeouts.delete(types_1.DeviceEvent.Lock);
}, eventDurationSeconds * 1000));
}
break;
}
case types_3.LockPushEvent.LOCK_MECHANICAL_ANOMALY:
case types_3.LockPushEvent.MECHANICAL_ANOMALY:
case types_3.LockPushEvent.VIOLENT_DESTRUCTION:
case types_3.LockPushEvent.MULTIPLE_ERRORS:
{
const cmdType = this.isLockBle() || this.isLockBleNoFinger() ? types_2.CommandType.CMD_DOORLOCK_GET_STATE : types_2.CommandType.CMD_SMARTLOCK_QUERY_STATUS;
this.updateRawProperty(cmdType, "5", source);
break;
}
case types_3.LockPushEvent.LOW_POWER:
case types_3.LockPushEvent.VERY_LOW_POWER:
this.updateProperty(types_1.PropertyName.DeviceLowBatteryAlert, true);
this.clearEventTimeout(types_1.DeviceEvent.LowBattery);
this.eventTimeouts.set(types_1.DeviceEvent.LowBattery, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceLowBatteryAlert, false);
this.eventTimeouts.delete(types_1.DeviceEvent.LowBattery);
}, eventDurationSeconds * 1000));
break;
// case LockPushEvent.LOW_POWE:
// this.updateRawProperty(CommandType.CMD_SMARTLOCK_QUERY_BATTERY_LEVEL, "10");
// break;
// case LockPushEvent.VERY_LOW_POWE:
// this.updateRawProperty(CommandType.CMD_SMARTLOCK_QUERY_BATTERY_LEVEL, "5");
// break;
default:
logging_1.rootHTTPLogger.debug("Lock process push notification - Unhandled lock notification event", eventType, eventTime, deviceSN);
break;
}
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.debug(`Lock process push notification - Error`, { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), eventType: eventType, eventTime: eventTime, eventDurationSeconds: eventDurationSeconds, source: source });
}
}
}
/*public static decodeCommand(command: number): void {
switch (command) {
case ESLCommand.ON_OFF_LOCK:
case 8:
break;
case ESLCommand.QUERY_STATUS_IN_LOCK:
case 17:
break;
case ESLCommand.NOTIFY:
case 18:
break;
default:
break;
}
}*/
static getCurrentTimeInSeconds() {
const buffer = Buffer.allocUnsafe(4);
buffer.writeUint32LE((0, utils_2.getCurrentTimeInSeconds)());
return buffer;
}
static getUInt8Buffer(value) {
const buffer = Buffer.allocUnsafe(1);
buffer.writeUInt8(value);
return buffer;
}
static getUint16LEBuffer(value) {
const buffer = Buffer.allocUnsafe(2);
buffer.writeUint16LE(value);
return buffer;
}
static getUint16BEBuffer(value) {
const buffer = Buffer.allocUnsafe(2);
buffer.writeUint16BE(value);
return buffer;
}
static encodeCmdStatus(user_id) {
const payload = new utils_1.WritePayload();
payload.write(Buffer.from(user_id, "hex"));
payload.write(this.getCurrentTimeInSeconds());
return payload.getData();
}
static encodeCmdUnlock(short_user_id, value, username) {
const payload = new utils_1.WritePayload();
payload.write(Buffer.from(short_user_id, "hex"));
payload.write(this.getUInt8Buffer(value));
payload.write(this.getCurrentTimeInSeconds());
payload.write(Buffer.from(username));
return payload.getData();
}
static encodeCmdCalibrate(user_id) {
return this.encodeCmdStatus(user_id);
}
static encodeCmdAddUser(short_user_id, passcode, username, schedule, user_permission = 4) {
const payload = new utils_1.WritePayload();
payload.write(Buffer.from(short_user_id, "hex"));
payload.write(Buffer.from(passcode, "hex"));
payload.write(Buffer.from(schedule !== undefined && schedule.startDateTime !== undefined ? (0, utils_1.hexDate)(schedule.startDateTime) : "00000000", "hex"));
payload.write(Buffer.from(schedule !== undefined && schedule.endDateTime !== undefined ? (0, utils_1.hexDate)(schedule.endDateTime) : "ffffffff", "hex"));
payload.write(Buffer.from(schedule !== undefined && schedule.week !== undefined ? (0, utils_1.hexWeek)(schedule) : "ff", "hex"));
payload.write(Buffer.from(schedule !== undefined && schedule.startDateTime !== undefined ? (0, utils_1.hexTime)(schedule.startDateTime) : "0000", "hex"));
payload.write(Buffer.from(schedule !== undefined && schedule.endDateTime !== undefined ? (0, utils_1.hexTime)(schedule.endDateTime) : "ffff", "hex"));
payload.write(this.getUInt8Buffer(user_permission));
payload.write(Buffer.from(username));
payload.write(this.getCurrentTimeInSeconds());
return payload.getData();
}
static encodeCmdAddTemporaryUser(schedule, unlimited = false) {
const payload = new utils_1.WritePayload();
payload.write(Buffer.from(schedule !== undefined && schedule.startDateTime !== undefined ? (0, utils_1.hexDate)(schedule.startDateTime) : "00000000", "hex"));
payload.write(Buffer.from(schedule !== undefined && schedule.endDateTime !== undefined ? (0, utils_1.hexDate)(schedule.endDateTime) : "ffffffff", "hex"));
payload.write(Buffer.from(schedule !== undefined && schedule.startDateTime !== undefined ? (0, utils_1.hexTime)(schedule.startDateTime) : "0000", "hex"));
payload.write(Buffer.from(schedule !== undefined && schedule.endDateTime !== undefined ? (0, utils_1.hexTime)(schedule.endDateTime) : "ffff", "hex"));
payload.write(this.getUInt8Buffer(unlimited === false ? 1 : 2));
payload.write(this.getCurrentTimeInSeconds());
return payload.getData();
}
static encodeCmdDeleteTemporaryUser(password_id) {
return this.encodeCmdStatus(password_id);
}
static encodeCmdDeleteUser(short_user_id) {
return this.encodeCmdStatus(short_user_id);
}
static encodeCmdVerifyPw(password) {
return this.encodeCmdStatus(password);
}
static encodeCmdQueryLockRecord(index) {
const payload = new utils_1.WritePayload();
payload.write(this.getUint16LEBuffer(index));
payload.write(this.getCurrentTimeInSeconds());
return payload.getData();
}
static encodeCmdQueryUser(short_user_id) {
const payload = new utils_1.WritePayload();
payload.write(Buffer.from(short_user_id, "hex"));
payload.write(this.getUInt8Buffer(0)); //TODO: eSLQueryAllUsers.index
payload.write(this.getCurrentTimeInSeconds());
return payload.getData();
}
static encodeCmdQueryPassword(password_id) {
const payload = new utils_1.WritePayload();
payload.write(Buffer.from(password_id, "hex"));
payload.write(this.getCurrentTimeInSeconds());
return payload.getData();
}
static encodeCmdModifyPassword(password_id, passcode) {
const payload = new utils_1.WritePayload();
payload.write(Buffer.from(password_id, "hex"));
payload.write(Buffer.from(passcode, "hex"));
payload.write(this.getCurrentTimeInSeconds());
return payload.getData();
}
static encodeCmdUpdateSchedule(short_user_id, schedule) {
const payload = new utils_1.WritePayload();
payload.write(Buffer.from(short_user_id, "hex"));
payload.write(Buffer.from(schedule !== undefined && schedule.startDateTime !== undefined ? (0, utils_1.hexDate)(schedule.startDateTime) : "00000000", "hex"));
payload.write(Buffer.from(schedule !== undefined && schedule.endDateTime !== undefined ? (0, utils_1.hexDate)(schedule.endDateTime) : "ffffffff", "hex"));
payload.write(Buffer.from(schedule !== undefined && schedule.week !== undefined ? (0, utils_1.hexWeek)(schedule) : "ff", "hex"));
payload.write(Buffer.from(schedule !== undefined && schedule.startDateTime !== undefined ? (0, utils_1.hexTime)(schedule.startDateTime) : "0000", "hex"));
payload.write(Buffer.from(schedule !== undefined && schedule.endDateTime !== undefined ? (0, utils_1.hexTime)(schedule.endDateTime) : "ffff", "hex"));
payload.write(this.getCurrentTimeInSeconds());
return payload.getData();
}
static encodeCmdModifyUsername(username, password_id) {
const payload = new utils_1.WritePayload();
payload.write(Buffer.from(password_id, "hex"));
payload.write(Buffer.from(username));
payload.write(this.getCurrentTimeInSeconds());
return payload.getData();
}
static encodeCmdGetLockParam(user_id) {
return this.encodeCmdStatus(user_id);
}
static encodeCmdSetLockParamAutoLock(enabled, lockTimeSeconds) {
const payload = new utils_1.WritePayload();
payload.write(this.getUint16BEBuffer(types_2.CommandType.CMD_SMARTLOCK_AUTO_LOCK));
payload.write(this.getUInt8Buffer(enabled === true ? 1 : 0));
payload.write(this.getUint16LEBuffer(lockTimeSeconds));
payload.write(this.getCurrentTimeInSeconds());
return payload.getData();
}
static hexTime = function (time) {
const buf = Buffer.allocUnsafe(2);
buf.writeUint8(Number.parseInt(time.split(":")[0]));
buf.writeUint8(Number.parseInt(time.split(":")[1]), 1);
return buf.readUInt16BE().toString(16).padStart(4, "0");
};
static encodeCmdSetLockParamAutoLockSchedule(enabled, schedule_start, schedule_end) {
const payload = new utils_1.WritePayload();
payload.write(this.getUint16BEBuffer(types_2.CommandType.CMD_SMARTLOCK_AUTO_LOCK_SCHEDULE));
payload.write(this.getUInt8Buffer(enabled === true ? 1 : 0));
payload.write(Buffer.from(Lock.hexTime(schedule_start), "hex"));
payload.write(Buffer.from(Lock.hexTime(schedule_end), "hex"));
payload.write(this.getCurrentTimeInSeconds());
return payload.getData();
}
static encodeCmdSetLockParamOneTouchLock(enabled) {
const payload = new utils_1.WritePayload();
payload.write(this.getUint16BEBuffer(types_2.CommandType.CMD_SMARTLOCK_ONE_TOUCH_LOCK));
payload.write(this.getUInt8Buffer(enabled === true ? 1 : 0));
payload.write(this.getCurrentTimeInSeconds());
return payload.getData();
}
static encodeCmdSetLockParamWrongTryProtect(enabled, lockdownTime, attempts) {
const payload = new utils_1.WritePayload();
payload.write(this.getUint16BEBuffer(types_2.CommandType.CMD_SMARTLOCK_WRONG_TRY_PROTECT));
payload.write(this.getUInt8Buffer(enabled === true ? 1 : 0));
payload.write(this.getUint16LEBuffer(lockdownTime));
payload.write(this.getUInt8Buffer(attempts));
payload.write(this.getCurrentTimeInSeconds());
return payload.getData();
}
static encodeCmdSetLockParamScramblePasscode(enabled) {
const payload = new utils_1.WritePayload();
payload.write(this.getUint16BEBuffer(types_2.CommandType.CMD_SMARTLOCK_SCRAMBLE_PASSCODE));
payload.write(this.getUInt8Buffer(enabled === true ? 1 : 0));
payload.write(this.getCurrentTimeInSeconds());
return payload.getData();
}
static encodeCmdSetLockParamSound(value) {
const payload = new utils_1.WritePayload();
payload.write(this.getUint16BEBuffer(types_2.CommandType.CMD_SMARTLOCK_LOCK_SOUND));
payload.write(this.getUInt8Buffer(value));
payload.write(this.getCurrentTimeInSeconds());
return payload.getData();
}
convertRawPropertyValue(property, value) {
try {
switch (property.key) {
case types_2.CommandType.CMD_DOORLOCK_SET_PUSH_MODE:
if (property.name === types_1.PropertyName.DeviceNotification) {
return value !== undefined ? (0, utils_1.isSmartLockNotification)(Number.parseInt(value), 1 /* SmartLockNotification.ENABLED */) : false;
}
else if (property.name === types_1.PropertyName.DeviceNotificationLocked) {
return value !== undefined ? (0, utils_1.isSmartLockNotification)(Number.parseInt(value), 4 /* SmartLockNotification.LOCKED */) : false;
}
else if (property.name === types_1.PropertyName.DeviceNotificationUnlocked) {
return value !== undefined ? (0, utils_1.isSmartLockNotification)(Number.parseInt(value), 2 /* SmartLockNotification.UNLOCKED */) : false;
}
break;
}
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("WallLightCam convert raw property - Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
}
return super.convertRawPropertyValue(property, value);
}
static encodeCmdSmartLockUnlock(adminUserId, lock, username, shortUserId) {
const payload = new utils_1.WritePayload();
payload.write(this.getCurrentTimeInSeconds());
payload.write(Buffer.from(adminUserId));
payload.write(this.getUInt8Buffer(lock ? 0 : 1));
payload.write(Buffer.from(username));
payload.write(Buffer.from(shortUserId, "hex"));
return payload.getData();
}
static encodeCmdSmartLockCalibrate(adminUserId) {
const payload = new utils_1.WritePayload();
payload.write(this.getCurrentTimeInSeconds());
payload.write(Buffer.from(adminUserId));
return payload.getData();
}
static encodeCmdSetSmartLockParamWrongTryProtect(adminUserId, enabled, attempts, lockdownTime) {
const payload = new utils_1.WritePayload();
payload.write(this.getCurrentTimeInSeconds());
payload.write(Buffer.from(adminUserId));
payload.write(this.getUInt8Buffer(2));
payload.write(this.getUInt8Buffer(enabled === true ? 1 : 0));
payload.write(this.getUInt8Buffer(attempts));
payload.write(this.getUint16LEBuffer(lockdownTime));
return payload.getData();
}
static hexTimeSmartLock = function (time) {
const buf = Buffer.allocUnsafe(2);
buf.writeUint8(Number.parseInt(time.split(":")[0]));
buf.writeUint8(Number.parseInt(time.split(":")[1]), 1);
return buf;
};
static encodeCmdSetSmartLockParamAutoLock(adminUserId, enabled, lockTimeSeconds, schedule, scheduleStart, scheduleEnd) {
const payload = new utils_1.WritePayload();
payload.write(this.getCurrentTimeInSeconds());
payload.write(Buffer.from(adminUserId));
payload.write(this.getUInt8Buffer(0));
payload.write(this.getUInt8Buffer(enabled === true ? 1 : 0));
payload.write(this.getUint16LEBuffer(lockTimeSeconds));
payload.write(this.getUInt8Buffer(schedule === true ? 1 : 0));
payload.write(this.hexTimeSmartLock(scheduleStart));
payload.write(this.hexTimeSmartLock(scheduleEnd));
return payload.getData();
}
static encodeCmdSetSmartLockParamOneTouchLock(adminUserId, enabled) {
const payload = new utils_1.WritePayload();
payload.write(this.getCurrentTimeInSeconds());
payload.write(Buffer.from(adminUserId));
payload.write(this.getUInt8Buffer(1));
payload.write(this.getUInt8Buffer(enabled === true ? 1 : 0));
return payload.getData();
}
static encodeCmdSetSmartLockParamScramblePasscode(adminUserId, enabled) {
const payload = new utils_1.WritePayload();
payload.write(this.getCurrentTimeInSeconds());
payload.write(Buffer.from(adminUserId));
payload.write(this.getUInt8Buffer(3));
payload.write(this.getUInt8Buffer(enabled === true ? 1 : 0));
return payload.getData();
}
static encodeCmdSetSmartLockParamSound(adminUserId, value) {
const payload = new utils_1.WritePayload();
payload.write(this.getCurrentTimeInSeconds());
payload.write(Buffer.from(adminUserId));
payload.write(this.getUInt8Buffer(4));
payload.write(this.getUInt8Buffer(value));
return payload.getData();
}
static encodeCmdSmartLockAddUser(adminUserId, shortUserId, passcode, username, schedule, userPermission = 4) {
const payload = new utils_1.WritePayload();
payload.write(this.getCurrentTimeInSeconds());
payload.write(Buffer.from(adminUserId));
payload.write(Buffer.from(passcode, "hex"));
payload.write(this.getUInt8Buffer(userPermission));
payload.write(Buffer.from(schedule !== undefined && schedule.startDateTime !== undefined ? (0, utils_1.hexDate)(schedule.startDateTime) : "00000000", "hex"));
payload.write(Buffer.from(schedule !== undefined && schedule.endDateTime !== undefined ? (0, utils_1.hexDate)(schedule.endDateTime) : "ffffffff", "hex"));
payload.write(Buffer.from(schedule !== undefined && schedule.week !== undefined ? (0, utils_1.hexWeek)(schedule) : "ff", "hex"));
payload.write(Buffer.from(schedule !== undefined && schedule.startDateTime !== undefined ? (0, utils_1.hexTime)(schedule.startDateTime) : "0000", "hex"));
payload.write(Buffer.from(schedule !== undefined && schedule.endDateTime !== undefined ? (0, utils_1.hexTime)(schedule.endDateTime) : "ffff", "hex"));
payload.write(this.getUInt8Buffer(userPermission === 5 ? 1 : 0));
payload.write(Buffer.from(username));
payload.write(Buffer.from(shortUserId, "hex"));
return payload.getData();
}
static encodeCmdSmartLockDeleteUser(adminUserId, shortUserId) {
const payload = new utils_1.WritePayload();
payload.write(this.getCurrentTimeInSeconds());
payload.write(Buffer.from(adminUserId));
payload.write(Buffer.from(shortUserId, "hex"));
return payload.getData();
}
static encodeCmdSmartLockUpdateSchedule(adminUserId, shortUserId, username, schedule, userPermission = 4) {
const payload = new utils_1.WritePayload();
payload.write(this.getCurrentTimeInSeconds());
payload.write(Buffer.from(adminUserId));
payload.write(this.getUInt8Buffer(userPermission));
payload.write(Buffer.from(schedule !== undefined && schedule.startDateTime !== undefined ? (0, utils_1.hexDate)(schedule.startDateTime) : "00000000", "hex"));
payload.write(Buffer.from(schedule !== undefined && schedule.endDateTime !== undefined ? (0, utils_1.hexDate)(schedule.endDateTime) : "ffffffff", "hex"));
payload.write(Buffer.from(schedule !== undefined && schedule.week !== undefined ? (0, utils_1.hexWeek)(schedule) : "ff", "hex"));
payload.write(Buffer.from(schedule !== undefined && schedule.startDateTime !== undefined ? (0, utils_1.hexTime)(schedule.startDateTime) : "0000", "hex"));
payload.write(Buffer.from(schedule !== undefined && schedule.endDateTime !== undefined ? (0, utils_1.hexTime)(schedule.endDateTime) : "ffff", "hex"));
payload.write(this.getUInt8Buffer(userPermission === 5 ? 1 : 0));
payload.write(Buffer.from(username));
payload.write(Buffer.from(shortUserId, "hex"));
return payload.getData();
}
static encodeCmdSmartLockModifyPassword(adminUserId, passwordId, passcode) {
const payload = new utils_1.WritePayload();
payload.write(this.getCurrentTimeInSeconds());
payload.write(Buffer.from(adminUserId));
payload.write(Buffer.from(passwordId, "hex"));
payload.write(Buffer.from(passcode, "hex"));
return payload.getData();
}
static encodeCmdSmartLockGetUserList(adminUserId) {
const payload = new utils_1.WritePayload();
payload.write(this.getCurrentTimeInSeconds());
payload.write(Buffer.from(adminUserId));
payload.write(this.getUInt8Buffer(0));
return payload.getData();
}
static encodeCmdSmartLockStatus(adminUserId) {
const payload = new utils_1.WritePayload();
payload.write(this.getCurrentTimeInSeconds());
payload.write(Buffer.from(adminUserId));
return payload.getData();
}
static encodeCmdSmartLockGetParams(adminUserId) {
return this.encodeCmdSmartLockStatus(adminUserId);
}
}
exports.Lock = Lock;
class LockKeypad extends Device {
static async getInstance(api, device, deviceConfig) {
return new LockKeypad(api, device, deviceConfig);
}
getStateChannel() {
return "lock_keypads";
}
}
exports.LockKeypad = LockKeypad;
class Keypad extends Device {
//TODO: CMD_KEYPAD_BATTERY_CHARGER_STATE = 1655
//TODO: CMD_KEYPAD_BATTERY_TEMP_STATE = 1654
//TODO: CMD_KEYPAD_GET_PASSWORD = 1657
//TODO: CMD_KEYPAD_GET_PASSWORD_LIST = 1662
//TODO: CMD_KEYPAD_IS_PSW_SET = 1670
//TODO: CMD_KEYPAD_SET_CUSTOM_MAP = 1660
//TODO: CMD_KEYPAD_SET_PASSWORD = 1650
static async getInstance(api, device, deviceConfig) {
return new Keypad(api, device, deviceConfig);
}
getStateChannel() {
return "keypads";
}
getState() {
return this.getPropertyValue(types_1.PropertyName.DeviceState);
}
isBatteryLow() {
return this.getPropertyValue(types_1.PropertyName.DeviceBatteryLow);
}
isBatteryCharging() {
return this.getPropertyValue(types_1.PropertyName.DeviceBatteryIsCharging);
}
convertRawPropertyValue(property, value) {
try {
switch (property.key) {
case types_2.CommandType.CMD_KEYPAD_BATTERY_CHARGER_STATE:
return value !== undefined ? (value === "0" || value === "2" ? false : true) : false;
}
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Keypad convert raw property - Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
}
return super.convertRawPropertyValue(property, value);
}
}
exports.Keypad = Keypad;
class SmartSafe extends Device {
static IV = "052E19EB3F880512E99EBB684D4DC1FE";
static DATA_HEADER = [-1, 9];
static VERSION_CODE = 1;
static PUSH_NOTIFICATION_POSITION = {
[types_1.PropertyName.DeviceNotificationUnlockByKey]: 0,
[types_1.PropertyName.DeviceNotificationUnlockByPIN]: 1,
[types_1.PropertyName.DeviceNotificationUnlockByFingerprint]: 2,
[types_1.PropertyName.DeviceNotificationUnlockByApp]: 3,
[types_1.PropertyName.DeviceNotificationDualUnlock]: 4,
[types_1.PropertyName.DeviceNotificationDualLock]: 5,
[types_1.PropertyName.DeviceNotificationWrongTryProtect]: 6,
[types_1.PropertyName.DeviceNotificationJammed]: 7,
};
static async getInstance(api, device, deviceConfig) {
return new SmartSafe(api, device, deviceConfig);
}
getStateChannel() {
return "smartsafes";
}
static getCurrentTimeInSeconds() {
const timeInSeconds = (0, utils_2.getCurrentTimeInSeconds)();
const arr = new Uint8Array(4);
for (let i = 0; i < 4; i++) {
arr[i] = ((timeInSeconds >> (i * 8)) & 255);
}
return Buffer.from(arr);
}
static getUInt8Buffer(value) {
const buffer = Buffer.allocUnsafe(1);
buffer.writeUInt8(value);
return buffer;
}
static getUint16LEBuffer(value) {
const buffer = Buffer.allocUnsafe(2);
buffer.writeUint16LE(value);
return buffer;
}
static encodeCmdSingleUInt8(user_id, value) {
const payload = new utils_1.WritePayload();
payload.write(Buffer.from(user_id));
payload.write(this.getUInt8Buffer(value));
payload.write(this.getCurrentTimeInSeconds());
return payload.getData();
}
static encodeCmdWrongTryProtect(user_id, enabled, attempts, lockdownTime) {
const payload = new utils_1.WritePayload();
payload.write(Buffer.from(user_id));
payload.write(this.getUInt8Buffer(enabled === true ? 1 : 0));
payload.write(this.getUInt8Buffer(attempts));
payload.write(this.getUInt8Buffer(lockdownTime));
payload.write(this.getCurrentTimeInSeconds());
return payload.getData();
}
static encodeCmdLeftOpenAlarm(user_id, enabled, duration) {
const payload = new utils_1.WritePayload();
payload.write(Buffer.from(user_id));
payload.write(this.getUInt8Buffer(enabled === true ? 1 : 0));
payload.write(this.getUint16LEBuffer(duration));
payload.write(this.getCurrentTimeInSeconds());
return payload.getData();
}
static encodeCmdDualUnlock(user_id, enabled) {
return SmartSafe.encodeCmdSingleUInt8(user_id, enabled === true ? 1 : 0);
}
static encodeCmdScramblePIN(user_id, enabled) {
return SmartSafe.encodeCmdSingleUInt8(user_id, enabled === true ? 1 : 0);
}
static encodeCmdPowerSave(user_id, enabled) {
return SmartSafe.encodeCmdSingleUInt8(user_id, enabled === true ? 1 : 0);
}
static encodeCmdInteriorBrightness(user_id, interiorBrightness, duration) {
let convertedinteriorBrightness = 0;
switch (interiorBrightness) {
case 25:
convertedinteriorBrightness = 1;
break;
case 60:
convertedinteriorBrightness = 2;
break;
case 100:
convertedinteriorBrightness = 3;
break;
}
const payload = new utils_1.WritePayload();
payload.write(Buffer.from(user_id));
payload.write(this.getUInt8Buffer(convertedinteriorBrightness));
payload.write(this.getUInt8Buffer(duration));
payload.write(this.getCurrentTimeInSeconds());
return payload.getData();
}
static encodeCmdTamperAlarm(user_id, option) {
return SmartSafe.encodeCmdSingleUInt8(user_id, option);
}
static encodeCmdRemoteUnlock(user_id, option) {
return SmartSafe.encodeCmdSingleUInt8(user_id, option);
}
static encodeCmdAlertVolume(user_id, volume) {
return SmartSafe.encodeCmdSingleUInt8(user_id, volume);
}
static encodeCmdPromptVolume(user_id, volume) {
return SmartSafe.encodeCmdSingleUInt8(user_id, volume);
}
static encodeCmdPushNotification(user_id, modes) {
const payload = new utils_1.WritePayload();
payload.write(Buffer.from(user_id));
payload.write(this.getUint16LEBuffer(modes));
payload.write(this.getCurrentTimeInSeconds());
return payload.getData();
}
static encodeCmdUnlock(user_id) {
return SmartSafe.encodeCmdSingleUInt8(user_id, 1);
}
static encodeCmdVerifyPIN(user_id, pin) {
const pinBuffer = Buffer.alloc(8);
pinBuffer.write(pin);
const payload = new utils_1.WritePayload();
payload.write(Buffer.from(user_id));
payload.write(pinBuffer);
payload.write(this.getCurrentTimeInSeconds());
return payload.getData();
}
convertRawPropertyValue(property, value) {
try {
if (property.key === types_2.CommandType.CMD_SMARTSAFE_REMOTE_OPEN_TYPE) {
switch (property.name) {
case types_1.PropertyName.DeviceRemoteUnlock:
{
const booleanProperty = property;
return value !== undefined ? (value === "0" || value === "1" ? true : false) : booleanProperty.default !== undefined ? booleanProperty.default : false;
}
case types_1.PropertyName.DeviceRemoteUnlockMasterPIN:
{
const booleanProperty = property;
return value !== undefined ? (value === "0" ? true : false) : booleanProperty.default !== undefined ? booleanProperty.default : false;
}
}
}
else if (property.key === types_2.CommandType.CMD_SMARTSAFE_NOTIF) {
const booleanProperty = property;
return value !== undefined ? ((Number.parseInt(value) >> SmartSafe.PUSH_NOTIFICATION_POSITION[property.name]) & 1) === 1 : booleanProperty.default !== undefined ? booleanProperty.default : false;
}
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("SmartSafe convert raw property - Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
}
return super.convertRawPropertyValue(property, value);
}
shakeEvent(event, eventDurationSeconds) {
this.updateProperty(types_1.PropertyName.DeviceShakeAlertEvent, event);
this.updateProperty(types_1.PropertyName.DeviceShakeAlert, true);
this.clearEventTimeout(types_1.DeviceEvent.ShakeAlarm);
this.eventTimeouts.set(types_1.DeviceEvent.ShakeAlarm, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceShakeAlert, false);
this.eventTimeouts.delete(types_1.DeviceEvent.ShakeAlarm);
}, eventDurationSeconds * 1000));
}
alarm911Event(event, eventDurationSeconds) {
this.updateProperty(types_1.PropertyName.Device911AlertEvent, event);
this.updateProperty(types_1.PropertyName.Device911Alert, true);
this.clearEventTimeout(types_1.DeviceEvent.Alarm911);
this.eventTimeouts.set(types_1.DeviceEvent.Alarm911, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.Device911Alert, false);
this.eventTimeouts.delete(types_1.DeviceEvent.Alarm911);
}, eventDurationSeconds * 1000));
}
jammedEvent(eventDurationSeconds) {
this.updateProperty(types_1.PropertyName.DeviceJammedAlert, true);
this.clearEventTimeout(types_1.DeviceEvent.Jammed);
this.eventTimeouts.set(types_1.DeviceEvent.Jammed, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceJammedAlert, false);
this.eventTimeouts.delete(types_1.DeviceEvent.Jammed);
}, eventDurationSeconds * 1000));
}
lowBatteryEvent(eventDurationSeconds) {
this.updateProperty(types_1.PropertyName.DeviceLowBatteryAlert, true);
this.clearEventTimeout(types_1.DeviceEvent.LowBattery);
this.eventTimeouts.set(types_1.DeviceEvent.LowBattery, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceLowBatteryAlert, false);
this.eventTimeouts.delete(types_1.DeviceEvent.LowBattery);
}, eventDurationSeconds * 1000));
}
wrongTryProtectAlarmEvent(eventDurationSeconds) {
this.updateProperty(types_1.PropertyName.DeviceWrongTryProtectAlert, true);
this.clearEventTimeout(types_1.DeviceEvent.WrontTryProtectAlarm);
this.eventTimeouts.set(types_1.DeviceEvent.WrontTryProtectAlarm, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceWrongTryProtectAlert, false);
this.eventTimeouts.delete(types_1.DeviceEvent.WrontTryProtectAlarm);
}, eventDurationSeconds * 1000));
}
processPushNotification(station, message, eventDurationSeconds) {
super.processPushNotification(station, message, eventDurationSeconds);
if (message.event_type !== undefined) {
if (message.station_sn === this.getSerial()) {
try {
switch (message.event_type) {
//TODO: Finish smart safe push notification handling implementation
case types_3.SmartSafeEvent.LOCK_STATUS:
{
const eventValues = message.event_value;
if (eventValues.action === 0) {
this.updateRawProperty(types_2.CommandType.CMD_SMARTSAFE_LOCK_STATUS, "0", "push");
/*
type values:
1: Unlocked by PIN
2: Unlocked by User
3: Unlocked by key
4: Unlocked by App
5: Unlocked by Dual Unlock
*/
}
else if (eventValues.action === 1) {
this.updateRawProperty(types_2.CommandType.CMD_SMARTSAFE_LOCK_STATUS, "1", "push");
}
else if (eventValues.action === 2) {
this.jammedEvent(eventDurationSeconds);
}
else if (eventValues.action === 3) {
this.lowBatteryEvent(eventDurationSeconds);
}
break;
}
case types_3.SmartSafeEvent.ALARM_911:
{
const eventValue = message.event_value;
this.alarm911Event(eventValue, eventDurationSeconds);
break;
}
case types_3.SmartSafeEvent.SHAKE_ALARM:
{
const eventValue = message.event_value;
this.shakeEvent(eventValue, eventDurationSeconds);
break;
}
case types_3.SmartSafeEvent.LONG_TIME_NOT_CLOSE:
{
const eventValue = message.event_value;
if (eventValue === 1) {
this.updateProperty(types_1.PropertyName.DeviceLongTimeNotCloseAlert, true);
this.clearEventTimeout(types_1.DeviceEvent.LongTimeNotClose);
this.eventTimeouts.set(types_1.DeviceEvent.LongTimeNotClose, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceLongTimeNotCloseAlert, false);
this.eventTimeouts.delete(types_1.DeviceEvent.LongTimeNotClose);
}, eventDurationSeconds * 1000));
}
break;
}
case types_3.SmartSafeEvent.LOW_POWER:
{
this.lowBatteryEvent(eventDurationSeconds);
break;
}
case types_3.SmartSafeEvent.INPUT_ERR_MAX:
{
this.wrongTryProtectAlarmEvent(eventDurationSeconds);
break;
}
default:
logging_1.rootHTTPLogger.debug("SmartSafe process push notification - Unhandled smart safe notification event", message.event_type, message.event_time, message.device_sn);
break;
}
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.debug(`SmartSafe process push notification - Error`, { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), message: JSON.stringify(message), eventDurationSeconds: eventDurationSeconds });
}
}
}
}
handlePropertyChange(metadata, oldValue, newValue) {
super.handlePropertyChange(metadata, oldValue, newValue);
if (metadata.name === types_1.PropertyName.DeviceLocked && metadata.key === types_2.CommandType.CMD_SMARTSAFE_LOCK_STATUS) {
this.emit("locked", this, newValue);
}
else if (metadata.name === types_1.PropertyName.DeviceJammedAlert) {
this.emit("jammed", this, newValue);
}
else if (metadata.name === types_1.PropertyName.DeviceLowBatteryAlert) {
this.emit("low battery", this, newValue);
}
else if (metadata.name === types_1.PropertyName.Device911Alert) {
this.emit("911 alarm", this, newValue, this.getPropertyValue(types_1.PropertyName.Device911AlertEvent));
}
else if (metadata.name === types_1.PropertyName.DeviceShakeAlert) {
this.emit("shake alarm", this, newValue, this.getPropertyValue(types_1.PropertyName.DeviceShakeAlertEvent));
}
else if (metadata.name === types_1.PropertyName.DeviceLongTimeNotCloseAlert) {
this.emit("long time not close", this, newValue);
}
else if (metadata.name === types_1.PropertyName.DeviceWrongTryProtectAlert) {
this.emit("wrong try-protect alarm", this, newValue);
}
}
getState() {
return this.getPropertyValue(types_1.PropertyName.DeviceState);
}
getBatteryValue() {
return this.getPropertyValue(types_1.PropertyName.DeviceBattery);
}
getWifiRssi() {
return this.getPropertyValue(types_1.PropertyName.DeviceWifiRSSI);
}
isLocked() {
return this.getPropertyValue(types_1.PropertyName.DeviceLocked);
}
}
exports.SmartSafe = SmartSafe;
class Tracker extends Device {
static async getInstance(api, device, deviceConfig) {
return new Tracker(api, device, deviceConfig);
}
getStateChannel() {
return "tracker";
}
convertRawPropertyValue(property, value) {
try {
switch (property.key) {
case types_2.TrackerCommandType.COMMAND_NEW_LOCATION:
{
if (value !== undefined && typeof value === "string") {
const items = value.split(",");
if (items.length === 3) {
switch (property.name) {
case types_1.PropertyName.DeviceLocationCoordinates:
return `${items[1]},${items[0]}`;
case types_1.PropertyName.DeviceLocationLastUpdate:
return Number.parseInt(items[2]);
default: break;
}
}
}
break;
}
}
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Tracker convert raw property - Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
}
return super.convertRawPropertyValue(property, value);
}
async setFindPhone(value) {
try {
const property = this.getPropertyMetadata(types_1.PropertyName.DeviceFindPhone);
(0, utils_3.validValue)(property, value);
return await this.setParameters([{
paramType: types_2.TrackerCommandType.COMMAND_TYPE_FINDMYPHONE,
paramValue: value ? "1" : "0"
}]);
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Tracker set find phone - Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), value: value });
}
return false;
}
async setLeftBehindAlarm(value) {
try {
const property = this.getPropertyMetadata(types_1.PropertyName.DeviceLeftBehindAlarm);
(0, utils_3.validValue)(property, value);
return await this.setParameters([{
paramType: types_2.TrackerCommandType.COMMAND_ANTILOST,
paramValue: value ? "1" : "0"
}]);
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Tracker set left behind alarm - Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), value: value });
}
return false;
}
async setTrackerType(value) {
try {
const property = this.getPropertyMetadata(types_1.PropertyName.DeviceTrackerType);
(0, utils_3.validValue)(property, value);
return await this.setParameters([{
paramType: types_2.TrackerCommandType.TYPE_ICON_INDEX,
paramValue: value.toString()
}]);
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("Tracker set tracker type - Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), value: value });
}
return false;
}
}
exports.Tracker = Tracker;
class DoorbellLock extends DoorbellCamera {
static async getInstance(api, device, deviceConfig) {
const voices = await api.getVoices(device.device_sn);
return new DoorbellLock(api, device, voices, deviceConfig);
}
getStateChannel() {
return "locks";
}
handlePropertyChange(metadata, oldValue, newValue) {
super.handlePropertyChange(metadata, oldValue, newValue);
if (metadata.name === types_1.PropertyName.DeviceLocked) {
this.emit("locked", this, newValue);
}
else if (metadata.name === types_1.PropertyName.DeviceLowBatteryAlert) {
this.emit("low battery", this, newValue);
}
else if ((metadata.key === types_2.CommandType.CMD_DOORLOCK_GET_STATE || metadata.key === types_2.CommandType.CMD_SMARTLOCK_QUERY_STATUS) && ((oldValue !== undefined && ((oldValue === 4 && newValue !== 4) || (oldValue !== 4 && newValue === 4))) || oldValue === undefined)) {
this.updateProperty(types_1.PropertyName.DeviceLocked, newValue === 4 ? true : false);
}
}
convertRawPropertyValue(property, value) {
try {
switch (property.key) {
case types_2.CommandType.CMD_DEV_RECORD_AUTOSTOP:
return value !== undefined ? (value === "0" ? true : false) : false;
}
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.error("DoorbellLock convert raw property - Error", { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), property: property, value: value });
}
return super.convertRawPropertyValue(property, value);
}
getState() {
return this.getPropertyValue(types_1.PropertyName.DeviceState);
}
getBatteryValue() {
return this.getPropertyValue(types_1.PropertyName.DeviceBattery);
}
getWifiRssi() {
return this.getPropertyValue(types_1.PropertyName.DeviceWifiRSSI);
}
isLocked() {
const param = this.getLockStatus();
return param ? (param === 4 ? true : false) : false;
}
getLockStatus() {
return this.getPropertyValue(types_1.PropertyName.DeviceLockStatus);
}
processPushNotification(station, message, eventDurationSeconds) {
super.processPushNotification(station, message, eventDurationSeconds);
if (message.event_type !== undefined && message.device_sn === this.getSerial()) {
try {
switch (message.event_type) {
case types_3.LockPushEvent.APP_LOCK:
case types_3.LockPushEvent.AUTO_LOCK:
case types_3.LockPushEvent.FINGER_LOCK:
case types_3.LockPushEvent.KEYPAD_LOCK:
case types_3.LockPushEvent.MANUAL_LOCK:
case types_3.LockPushEvent.PW_LOCK:
case types_3.LockPushEvent.TEMPORARY_PW_LOCK:
{
const cmdType = this.isLockBle() || this.isLockBleNoFinger() ? types_2.CommandType.CMD_DOORLOCK_GET_STATE : types_2.CommandType.CMD_SMARTLOCK_QUERY_STATUS;
this.updateRawProperty(cmdType, "4", "push");
if (!(0, utils_3.isEmpty)(message.person_name)) {
this.updateProperty(types_1.PropertyName.DevicePersonName, message.person_name);
this.updateProperty(types_1.PropertyName.DeviceLockEventOrigin, (0, utils_1.getLockEventType)(message.event_type));
this.clearEventTimeout(types_1.DeviceEvent.Lock);
this.eventTimeouts.set(types_1.DeviceEvent.Lock, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DevicePersonName, "");
this.updateProperty(types_1.PropertyName.DeviceLockEventOrigin, 0);
this.eventTimeouts.delete(types_1.DeviceEvent.Lock);
}, eventDurationSeconds * 1000));
}
break;
}
case types_3.LockPushEvent.APP_UNLOCK:
case types_3.LockPushEvent.AUTO_UNLOCK:
case types_3.LockPushEvent.FINGERPRINT_UNLOCK:
case types_3.LockPushEvent.MANUAL_UNLOCK:
case types_3.LockPushEvent.PW_UNLOCK:
case types_3.LockPushEvent.TEMPORARY_PW_UNLOCK:
{
const cmdType = this.isLockBle() || this.isLockBleNoFinger() ? types_2.CommandType.CMD_DOORLOCK_GET_STATE : types_2.CommandType.CMD_SMARTLOCK_QUERY_STATUS;
this.updateRawProperty(cmdType, "3", "push");
if (!(0, utils_3.isEmpty)(message.person_name)) {
this.updateProperty(types_1.PropertyName.DevicePersonName, message.person_name);
this.updateProperty(types_1.PropertyName.DeviceLockEventOrigin, (0, utils_1.getLockEventType)(message.event_type));
this.clearEventTimeout(types_1.DeviceEvent.Lock);
this.eventTimeouts.set(types_1.DeviceEvent.Lock, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DevicePersonName, "");
this.updateProperty(types_1.PropertyName.DeviceLockEventOrigin, 0);
this.eventTimeouts.delete(types_1.DeviceEvent.Lock);
}, eventDurationSeconds * 1000));
}
break;
}
case types_3.LockPushEvent.LOCK_MECHANICAL_ANOMALY:
case types_3.LockPushEvent.MECHANICAL_ANOMALY:
case types_3.LockPushEvent.VIOLENT_DESTRUCTION:
case types_3.LockPushEvent.MULTIPLE_ERRORS:
{
const cmdType = this.isLockBle() || this.isLockBleNoFinger() ? types_2.CommandType.CMD_DOORLOCK_GET_STATE : types_2.CommandType.CMD_SMARTLOCK_QUERY_STATUS;
this.updateRawProperty(cmdType, "5", "push");
break;
}
case types_3.LockPushEvent.LOW_POWER:
case types_3.LockPushEvent.VERY_LOW_POWER:
this.updateProperty(types_1.PropertyName.DeviceLowBatteryAlert, true);
this.clearEventTimeout(types_1.DeviceEvent.LowBattery);
this.eventTimeouts.set(types_1.DeviceEvent.LowBattery, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceLowBatteryAlert, false);
this.eventTimeouts.delete(types_1.DeviceEvent.LowBattery);
}, eventDurationSeconds * 1000));
break;
case types_3.LockPushEvent.DOOR_OPEN_LEFT: //TODO: Implement event
break;
case types_3.LockPushEvent.DOOR_TAMPER: //TODO: Implement event
break;
case types_3.LockPushEvent.DOOR_STATE_ERROR: //TODO: Implement event
break;
default:
logging_1.rootHTTPLogger.debug("DoorbellLock process push notification - Unhandled lock notification event", { eventType: message.event_type, eventTime: message.event_time, deviceSN: this.getSerial() });
break;
}
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.debug(`DoorbellLock process push notification - Error`, { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), eventType: message.event_type, eventTime: message.event_time, eventDurationSeconds: eventDurationSeconds });
}
}
}
}
exports.DoorbellLock = DoorbellLock;
class SmartDrop extends Camera {
static async getInstance(api, device, deviceConfig) {
return new SmartDrop(api, device, deviceConfig);
}
getStateChannel() {
return "boxes";
}
processPushNotification(station, message, eventDurationSeconds) {
super.processPushNotification(station, message, eventDurationSeconds);
if (message.type !== undefined && message.event_type !== undefined) {
if (message.device_sn === this.getSerial()) {
try {
(0, utils_1.loadEventImage)(station, this.api, this, message, this.pictureEventTimeouts);
if (message.event_type === types_3.CusPushEvent.SMART_DROP) {
switch (message.open) {
case types_3.SmartDropOpen.OPEN:
// Open
this.updateRawProperty(types_2.CommandType.CMD_SMART_DROP_OPEN, "1", "push");
switch (message.openType) {
case types_3.SmartDropOpenedBy.APP:
// Open remotely via App
this.updateProperty(types_1.PropertyName.DeviceOpenedByType, 1);
break;
case types_3.SmartDropOpenedBy.PIN:
// Open with PIN
if (message.pin === "0") {
// Master PIN
this.updateProperty(types_1.PropertyName.DeviceOpenedByType, 2);
}
else {
// Delivery PIN
// who: message.person_name
this.updateProperty(types_1.PropertyName.DeviceOpenedByType, 3);
this.updateProperty(types_1.PropertyName.DeviceOpenedByName, message.person_name !== undefined ? message.person_name : "");
}
break;
case types_3.SmartDropOpenedBy.WITHOUT_KEY:
// Opened without key
this.updateProperty(types_1.PropertyName.DeviceOpenedByType, 4);
break;
case types_3.SmartDropOpenedBy.EMERGENCY_RELEASE_BUTTON:
// Opened via emergency release button
this.updateProperty(types_1.PropertyName.DeviceOpenedByType, 5);
break;
case types_3.SmartDropOpenedBy.KEY:
// Opened with key
this.updateProperty(types_1.PropertyName.DeviceOpenedByType, 6);
break;
default:
logging_1.rootHTTPLogger.debug("SmartDrop process push notification - Unhandled SmartDrop push event (openType)", message);
break;
}
break;
case types_3.SmartDropOpen.CLOSED:
// Closed
this.updateRawProperty(types_2.CommandType.CMD_SMART_DROP_OPEN, "0", "push");
break;
case types_3.SmartDropOpen.LID_STUCK:
// The lid may be stuck
this.updateProperty(types_1.PropertyName.DeviceLidStuckAlert, true);
this.clearEventTimeout(types_1.DeviceEvent.LidStuckAlert);
this.eventTimeouts.set(types_1.DeviceEvent.LidStuckAlert, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceLidStuckAlert, false);
this.eventTimeouts.delete(types_1.DeviceEvent.LidStuckAlert);
}, eventDurationSeconds * 1000));
break;
case types_3.SmartDropOpen.PIN_INCORRECT:
// Someone had entered incorrect PIN
this.updateProperty(types_1.PropertyName.DevicePinIncorrectAlert, true);
this.clearEventTimeout(types_1.DeviceEvent.PinIncorrectAlert);
this.eventTimeouts.set(types_1.DeviceEvent.PinIncorrectAlert, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DevicePinIncorrectAlert, false);
this.eventTimeouts.delete(types_1.DeviceEvent.PinIncorrectAlert);
}, eventDurationSeconds * 1000));
break;
case types_3.SmartDropOpen.LEFT_OPENED:
// Has been left opened for 1 minute
this.updateProperty(types_1.PropertyName.DeviceLongTimeNotCloseAlert, true);
this.clearEventTimeout(types_1.DeviceEvent.LongTimeNotClose);
this.eventTimeouts.set(types_1.DeviceEvent.LongTimeNotClose, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceLongTimeNotCloseAlert, false);
this.eventTimeouts.delete(types_1.DeviceEvent.LongTimeNotClose);
}, eventDurationSeconds * 1000));
break;
case types_3.SmartDropOpen.LOW_TEMPERATURE_WARNING:
// Low temperature warning
this.updateProperty(types_1.PropertyName.DeviceLowTemperatureAlert, true);
this.clearEventTimeout(types_1.DeviceEvent.LowTemperatureAlert);
this.eventTimeouts.set(types_1.DeviceEvent.LowTemperatureAlert, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceLowTemperatureAlert, false);
this.eventTimeouts.delete(types_1.DeviceEvent.LowTemperatureAlert);
}, eventDurationSeconds * 1000));
break;
default:
logging_1.rootHTTPLogger.debug("SmartDrop process push notification - Unhandled SmartDrop push event (1)", message);
break;
}
}
else if (message.event_type !== 0) {
switch (message.event_type) {
case types_3.SmartDropPushEvent.LOW_BATTERY:
// Low battery warning
this.updateProperty(types_1.PropertyName.DeviceLowBatteryAlert, true);
this.clearEventTimeout(types_1.DeviceEvent.LowBattery);
this.eventTimeouts.set(types_1.DeviceEvent.LowBattery, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceLowBatteryAlert, false);
this.eventTimeouts.delete(types_1.DeviceEvent.LowBattery);
}, eventDurationSeconds * 1000));
break;
case types_3.SmartDropPushEvent.OVERHEATING_WARNING:
// Overheating warning
this.updateProperty(types_1.PropertyName.DeviceHighTemperatureAlert, true);
this.clearEventTimeout(types_1.DeviceEvent.HighTemperatureAlert);
this.eventTimeouts.set(types_1.DeviceEvent.HighTemperatureAlert, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceHighTemperatureAlert, false);
this.eventTimeouts.delete(types_1.DeviceEvent.HighTemperatureAlert);
}, eventDurationSeconds * 1000));
break;
case types_3.SmartDropPushEvent.TAMPERED_WARNING:
if (message.type === 2) {
// Warning have been tampered
this.updateProperty(types_1.PropertyName.DeviceTamperingAlert, true);
this.clearEventTimeout(types_1.DeviceEvent.TamperingAlert);
this.eventTimeouts.set(types_1.DeviceEvent.TamperingAlert, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceTamperingAlert, false);
this.eventTimeouts.delete(types_1.DeviceEvent.TamperingAlert);
}, eventDurationSeconds * 1000));
}
break;
case types_3.SmartDropPushEvent.BATTERY_FULLY_CHARGED:
// Battery fully charged
this.updateProperty(types_1.PropertyName.DeviceBatteryFullyChargedAlert, true);
this.clearEventTimeout(types_1.DeviceEvent.BatteryFullyChargedAlert);
this.eventTimeouts.set(types_1.DeviceEvent.BatteryFullyChargedAlert, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DeviceBatteryFullyChargedAlert, false);
this.eventTimeouts.delete(types_1.DeviceEvent.BatteryFullyChargedAlert);
}, eventDurationSeconds * 1000));
break;
case types_3.SmartDropPushEvent.PERSON_DETECTED:
//Someone has been spotted
this.updateProperty(types_1.PropertyName.DevicePersonName, !(0, utils_3.isEmpty)(message.person_name) ? message.person_name : "Unknown");
this.updateProperty(types_1.PropertyName.DevicePersonDetected, true);
this.clearEventTimeout(types_1.DeviceEvent.PersonDetected);
this.eventTimeouts.set(types_1.DeviceEvent.PersonDetected, setTimeout(async () => {
this.updateProperty(types_1.PropertyName.DevicePersonName, "");
this.updateProperty(types_1.PropertyName.DevicePersonDetected, false);
this.eventTimeouts.delete(types_1.DeviceEvent.PersonDetected);
}, eventDurationSeconds * 1000));
break;
default:
logging_1.rootHTTPLogger.debug("SmartDrop process push notification - Unhandled SmartDrop push event (2)", message);
}
}
else {
logging_1.rootHTTPLogger.debug("SmartDrop process push notification - Unhandled SmartDrop push event type", message);
}
}
catch (err) {
const error = (0, error_2.ensureError)(err);
logging_1.rootHTTPLogger.debug(`SmartDrop process push notification - Error`, { error: (0, utils_3.getError)(error), deviceSN: this.getSerial(), message: JSON.stringify(message), eventDurationSeconds: eventDurationSeconds });
}
}
}
}
handlePropertyChange(metadata, oldValue, newValue) {
super.handlePropertyChange(metadata, oldValue, newValue);
if (metadata.name === types_1.PropertyName.DeviceOpen) {
const open = newValue;
if (open === false) {
this.updateProperty(types_1.PropertyName.DeviceOpenedByType, 0);
this.updateProperty(types_1.PropertyName.DeviceOpenedByName, "");
}
this.emit("open", this, open);
}
else if (metadata.name === types_1.PropertyName.DeviceDeliveries) {
this.updateProperty(types_1.PropertyName.DevicePackageDelivered, newValue > 0);
}
else if (metadata.name === types_1.PropertyName.DevicePackageDelivered) {
this.emit("package delivered", this, newValue);
}
else if (metadata.name === types_1.PropertyName.DeviceLowBatteryAlert) {
this.emit("low battery", this, newValue);
}
else if (metadata.name === types_1.PropertyName.DeviceTamperingAlert) {
this.emit("tampering", this, newValue);
}
else if (metadata.name === types_1.PropertyName.DeviceLongTimeNotCloseAlert) {
this.emit("long time not close", this, newValue);
}
else if (metadata.name === types_1.PropertyName.DeviceLowTemperatureAlert) {
this.emit("low temperature", this, newValue);
}
else if (metadata.name === types_1.PropertyName.DeviceHighTemperatureAlert) {
this.emit("high temperature", this, newValue);
}
else if (metadata.name === types_1.PropertyName.DevicePinIncorrectAlert) {
this.emit("pin incorrect", this, newValue);
}
else if (metadata.name === types_1.PropertyName.DeviceLidStuckAlert) {
this.emit("lid stuck", this, newValue);
}
else if (metadata.name === types_1.PropertyName.DeviceBatteryFullyChargedAlert) {
this.emit("battery fully charged", this, newValue);
}
}
}
exports.SmartDrop = SmartDrop;
class UnknownDevice extends Device {
static async getInstance(api, device, deviceConfig) {
return new UnknownDevice(api, device, deviceConfig);
}
getStateChannel() {
return "unknown";
}
}
exports.UnknownDevice = UnknownDevice;
//# sourceMappingURL=device.js.map