4306 lines
252 KiB
JavaScript
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
|