Wt-Series - Wt303

Sensor

Codec Description

Codec for Wt-Series - Wt303.

Codec Preview

/** * Payload Encoder * * Copyright 2025 Milesight IoT * * @product WT303 */ var RAW_VALUE = 0x00; var WITH_QUERY_CMD = 0x00; /* eslint no-redeclare: "off" */ /* eslint-disable */ // Chirpstack v4 function encodeDownlink(input) { var encoded = milesightDeviceEncode(input.data); return { bytes: encoded }; } // Chirpstack v3 function Encode(fPort, obj) { return milesightDeviceEncode(obj); } // The Things Network function Encoder(obj, port) { return milesightDeviceEncode(obj); } /* eslint-enable */ function milesightDeviceEncode(payload) { var encoded = []; if ("frame" in payload) { encoded = encoded.concat(setFrame(payload.frame)); } if ("collection_interval" in payload) { var cmd_buffer = setCollectionInterval(payload.collection_interval); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("reporting_interval" in payload) { var cmd_buffer = setReportingInterval(payload.reporting_interval); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("temperature_unit" in payload) { var cmd_buffer = setTemperatureUnit(payload.temperature_unit); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("support_mode" in payload) { var cmd_buffer = setSupportMode(payload.support_mode); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("intelligent_display_enable" in payload) { var cmd_buffer = setSmartDisplayConfig(payload.intelligent_display_enable); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("screen_object_settings" in payload) { var cmd_buffer = setScreenObjectSettings(payload.screen_object_settings); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("system_status" in payload) { var cmd_buffer = controlSystemStatus(payload.system_status); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("temperature_control_mode" in payload) { var cmd_buffer = setTemperatureControlMode(payload.temperature_control_mode); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("target_temperature_resolution" in payload) { var cmd_buffer = setTargetTemperatureResolution(payload.target_temperature_resolution); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("target_temperature_tolerance" in payload) { var cmd_buffer = setTargetTemperatureTolerance(payload.target_temperature_tolerance); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("heating_target_temperature" in payload) { var cmd_buffer = setHeatingTargetTemperature(payload.heating_target_temperature); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("cooling_target_temperature" in payload) { var cmd_buffer = setCoolingTargetTemperature(payload.cooling_target_temperature); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("heating_target_temperature_range" in payload) { var cmd_buffer = setHeatingTargetTemperatureRange(payload.heating_target_temperature_range); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("cooling_target_temperature_range" in payload) { var cmd_buffer = setCoolingTargetTemperatureRange(payload.cooling_target_temperature_range); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("dehumidify_config" in payload) { var cmd_buffer = setDehumidifyConfig(payload.dehumidify_config); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("target_humidity_range" in payload) { var cmd_buffer = setTargetHumidityRange(payload.target_humidity_range); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("fan_mode" in payload) { var cmd_buffer = setFanMode(payload.fan_mode); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("fan_speed_config" in payload) { var cmd_buffer = setFanSpeedConfig(payload.fan_speed_config); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("fan_delay_config" in payload) { var cmd_buffer = setFanDelayConfig(payload.fan_delay_config); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("child_lock_settings" in payload) { var cmd_buffer = setChildLockSettings(payload.child_lock_settings); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("temperature_alarm_settings" in payload) { var cmd_buffer = setTemperatureAlarmSettings(payload.temperature_alarm_settings); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("high_temperature_alarm_settings" in payload) { var cmd_buffer = setContinuousHighTemperatureAlarmSettings(payload.high_temperature_alarm_settings); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("low_temperature_alarm_settings" in payload) { var cmd_buffer = setContinuousLowTemperatureAlarmSettings(payload.low_temperature_alarm_settings); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("temperature_calibration_settings" in payload) { var cmd_buffer = setTemperatureCalibrationConfig(payload.temperature_calibration_settings); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("humidity_calibration_settings" in payload) { var cmd_buffer = setHumidityCalibrationConfig(payload.humidity_calibration_settings); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("plan_config" in payload) { for (var i = 0; i < payload.plan_config.length; i++) { var cmd_buffer = setPlanConfig(payload.plan_config[i]); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } } if ("valve_interface_settings" in payload) { var cmd_buffer = setValveInterfaceSettings(payload.valve_interface_settings); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("di_settings" in payload) { var cmd_buffer = setDISettings(payload.di_settings); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("di_enable" in payload) { var cmd_buffer = setDIEnable(payload.di_enable); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("window_opening_detection_settings" in payload) { var cmd_buffer = setWindowOpeningDetectionSettings(payload.window_opening_detection_settings); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("freeze_protection_settings" in payload) { var cmd_buffer = setFreezeProtectionConfig(payload.freeze_protection_settings); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("temperature_source_settings" in payload) { var cmd_buffer = setTemperatureSourceConfig(payload.temperature_source_settings); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("d2d_pairing_enable" in payload) { var cmd_buffer = setD2DEnable(payload.d2d_pairing_enable); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("d2d_pairing_settings" in payload) { for (var i = 0; i < payload.d2d_pairing_settings.length; i++) { var cmd_buffer = setD2DPairingSettings(payload.d2d_pairing_settings[i]); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } } if ("d2d_master_enable" in payload) { var cmd_buffer = setD2DMasterEnable(payload.d2d_master_enable); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("d2d_master_settings" in payload) { for (var i = 0; i < payload.d2d_master_settings.length; i++) { var cmd_buffer = setD2DMasterSettings(payload.d2d_master_settings[i]); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } } if ("d2d_slave_enable" in payload) { var cmd_buffer = setD2DSlaveEnable(payload.d2d_slave_enable); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("d2d_slave_settings" in payload) { for (var i = 0; i < payload.d2d_slave_settings.length; i++) { var cmd_buffer = setD2DSlaveSettings(payload.d2d_slave_settings[i]); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } } if ("timed_system_control_settings" in payload) { var cmd_buffer = setTimedSystemControlSettings(payload.timed_system_control_settings); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("temporary_unlock_settings" in payload) { var cmd_buffer = setButtonTemporaryUnlockedConfig(payload.temporary_unlock_settings); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("temperature_control_with_standby_fan_mode" in payload) { var cmd_buffer = setTemperatureControlWithStandbyFanMode(payload.temperature_control_with_standby_fan_mode); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("valve_opening_negative_valve_mode" in payload) { var cmd_buffer = setValveOpeningNegativeValveMode(payload.valve_opening_negative_valve_mode); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("relay_changes_report_enable" in payload) { var cmd_buffer = setRelayChangeReportEnable(payload.relay_changes_report_enable); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("time_zone" in payload) { var cmd_buffer = setTimeZone(payload.time_zone); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("daylight_saving_time" in payload) { var cmd_buffer = setDaylightSavingTimeSettings(payload.daylight_saving_time); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("auto_provisioning_enable" in payload) { var cmd_buffer = setAutoProvisioningEnable(payload.auto_provisioning_enable); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("history_transmit_settings" in payload) { var cmd_buffer = setHistoryConfig(payload.history_transmit_settings); encoded = encoded.concat(cmd_buffer); encoded = WITH_QUERY_CMD ? encoded.concat(setQueryCmd(cmd_buffer)) : encoded; } if ("reboot" in payload) { encoded = encoded.concat(reboot()); } if ("synchronize_time" in payload) { encoded = encoded.concat(synchronizeTime()); } if ("query_device_status" in payload) { encoded = encoded.concat(queryDeviceStatus()); } if ("reconnect" in payload) { encoded = encoded.concat(reconnect()); } if ("clear_history" in payload) { encoded = encoded.concat(clearHistory()); } if ("fetch_history" in payload) { encoded = encoded.concat(fetchHistory(payload.fetch_history)); } if ("stop_transmit_history" in payload) { encoded = encoded.concat(stopTransmitHistory()); } if ("temperature" in payload) { encoded = encoded.concat(setTemperature(payload.temperature)); } if ("humidity" in payload) { encoded = encoded.concat(setHumidity(payload.humidity)); } if ("opening_window_alarm" in payload) { encoded = encoded.concat(setOpeningWindowStatus(payload.opening_window_alarm)); } if ("insert_plan_id" in payload) { encoded = encoded.concat(setPlan(payload.insert_plan_id)); } if ("clear_plan" in payload) { encoded = encoded.concat(clearPlan(payload.clear_plan)); } return encoded; } /** * Set frame * @param {number} frame values: (0: normal, 1: debug) * @example { "frame": 0 } */ function setFrame(frame) { var buffer = new Buffer(2); buffer.writeUInt8(0xfe); buffer.writeUInt8(frame); return buffer.toBytes(); } /** * Set collection interval * @param {object} collection_interval * @param {number} collection_interval.unit values: (0: second, 1: minute) * @param {number} collection_interval.seconds_of_time unit: second, range: [10, 64800], default: 30s * @param {number} collection_interval.minutes_of_time unit: minute, range: [1, 1440], default: 1min * @example { "collection_interval": { "unit": 0, "seconds_of_time": 300 } } */ function setCollectionInterval(collection_interval) { var unit = collection_interval.unit; var seconds_of_time = collection_interval.seconds_of_time || 30; var minutes_of_time = collection_interval.minutes_of_time || 1; var unit_map = { 0: "second", 1: "minute" }; var unit_values = getValues(unit_map); if (unit_values.indexOf(unit) === -1) { throw new Error("collection_interval.unit must be one of " + unit_values.join(", ")); } if (getValue(unit_map, unit) === 0 && (seconds_of_time < 10 || seconds_of_time > 64800)) { throw new Error("collection_interval.seconds_of_time must be between 10 and 64800 when collection_interval.unit is 0"); } if (getValue(unit_map, unit) === 1 && (minutes_of_time < 1 || minutes_of_time > 1440)) { throw new Error("collection_interval.minutes_of_time must be between 1 and 1440 when collection_interval.unit is 1"); } var buffer = new Buffer(4); buffer.writeUInt8(0x60); buffer.writeUInt8(getValue(unit_map, unit)); buffer.writeUInt16LE(getValue(unit_map, unit) === 0 ? seconds_of_time : minutes_of_time); return buffer.toBytes(); } /** * Set report interval * @param {object} reporting_interval * @param {number} reporting_interval.unit values: (0: second, 1: minute) * @param {number} reporting_interval.seconds_of_time unit: second, range: [10, 64800], default: 600s * @param {number} reporting_interval.minutes_of_time unit: minute, range: [1, 1440], default: 10min * @example { "reporting_interval": { "unit": 0, "seconds_of_time": 300 } } */ function setReportingInterval(reporting_interval) { var unit = reporting_interval.unit; var seconds_of_time = reporting_interval.seconds_of_time || 600; var minutes_of_time = reporting_interval.minutes_of_time || 10; var unit_map = { 0: "second", 1: "minute" }; var unit_values = getValues(unit_map); if (unit_values.indexOf(unit) === -1) { throw new Error("reporting_interval.unit must be one of " + unit_values.join(", ")); } if (getValue(unit_map, unit) === 0 && (seconds_of_time < 10 || seconds_of_time > 64800)) { throw new Error("reporting_interval.seconds_of_time must be between 10 and 64800 when reporting_interval.unit is 0"); } if (getValue(unit_map, unit) === 1 && (minutes_of_time < 1 || minutes_of_time > 1440)) { throw new Error("reporting_interval.minutes_of_time must be between 1 and 1440 when reporting_interval.unit is 1"); } var buffer = new Buffer(4); buffer.writeUInt8(0x62); buffer.writeUInt8(getValue(unit_map, unit)); buffer.writeUInt16LE(getValue(unit_map, unit) === 0 ? seconds_of_time : minutes_of_time); return buffer.toBytes(); } /** * Set temperature unit * @param {number} temperature_unit values: (0: celsius, 1: fahrenheit) * @example { "temperature_unit": 0 } */ function setTemperatureUnit(temperature_unit) { var unit_map = { 0: "celsius", 1: "fahrenheit" }; var unit_values = getValues(unit_map); if (unit_values.indexOf(temperature_unit) === -1) { throw new Error("temperature_unit must be one of " + unit_values.join(", ")); } var buffer = new Buffer(2); buffer.writeUInt8(0x63); buffer.writeUInt8(getValue(unit_map, temperature_unit)); return buffer.toBytes(); } /** * Set support mode * @param {number} support_mode values: (3: fan_and_heating, 5: fan_and_cooling, 7: fan_and_heating_and_cooling) * @example { "support_mode": 3 } */ function setSupportMode(support_mode) { var mode_map = { 3: "fan_and_heating", 5: "fan_and_cooling", 7: "fan_and_heating_and_cooling" }; var mode_values = getValues(mode_map); if (mode_values.indexOf(support_mode) === -1) { throw new Error("support_mode must be one of " + mode_values.join(", ")); } var buffer = new Buffer(2); buffer.writeUInt8(0x64); buffer.writeUInt8(support_mode); return buffer.toBytes(); } /** * Set smart display config * @param {number} intelligent_display_enable values: (0: disable, 1: enable) * @example { "intelligent_display_enable": 1 } */ function setSmartDisplayConfig(intelligent_display_enable) { var enable_map = { 0: "disable", 1: "enable" }; var enable_values = getValues(enable_map); if (enable_values.indexOf(intelligent_display_enable) === -1) { throw new Error("intelligent_display_enable.enable must be one of " + enable_values.join(", ")); } var buffer = new Buffer(2); buffer.writeUInt8(0x65); buffer.writeUInt8(getValue(enable_map, intelligent_display_enable)); return buffer.toBytes(); } /** * Set display config * @param {object} screen_object_settings * @param {number} screen_object_settings.enable values: (0: disable, 1: enable) * @param {number} screen_object_settings.environment_temperature_enable values: (0: disable, 1: enable) * @param {number} screen_object_settings.environment_humidity_enable values: (0: disable, 1: enable) * @param {number} screen_object_settings.target_temperature_enable values: (0: disable, 1: enable) * @param {number} screen_object_settings.schedule_name_enable values: (0: disable, 1: enable) * @example { "screen_object_settings": { "enable": 1, "environment_temperature_enable": 1, "environment_humidity_enable": 1, "target_temperature_enable": 1, "schedule_name_enable": 1 } } */ function setScreenObjectSettings(screen_object_settings) { var enable = screen_object_settings.enable; var enable_map = { 0: "disable", 1: "enable" }; var enable_values = getValues(enable_map); var screen_object_offset = { environment_temperature_enable: 0, environment_humidity_enable: 1, target_temperature_enable: 2, schedule_name_enable: 3 }; var data = 0x00; for (var key in screen_object_offset) { if (key in screen_object_settings) { if (enable_values.indexOf(screen_object_settings[key]) === -1) { throw new Error("screen_object_settings." + key + " must be one of " + enable_values.join(", ")); } data |= getValue(enable_map, screen_object_settings[key]) << screen_object_offset[key]; } } var buffer = new Buffer(3); buffer.writeUInt8(0x66); buffer.writeUInt8(getValue(enable_map, enable)); buffer.writeUInt8(data); return buffer.toBytes(); } /** * Control system status * @param {number} system_status values: (0: off, 1: on) * @example { "system_status": 1 } */ function controlSystemStatus(system_status) { var on_off_map = { 0: "off", 1: "on" }; var on_off_values = getValues(on_off_map); if (on_off_values.indexOf(system_status) === -1) { throw new Error("system_status must be one of " + on_off_values.join(", ")); } var buffer = new Buffer(2); buffer.writeUInt8(0x67); buffer.writeUInt8(getValue(on_off_map, system_status)); return buffer.toBytes(); } /** * Set temperature control mode * @param {number} temperature_control_mode values: (0: fan, 1: heating, 2: cooling) * @example { "temperature_control_mode": 1 } */ function setTemperatureControlMode(temperature_control_mode) { var mode_map = { 0: "fan", 1: "heating", 2: "cooling" }; var mode_values = getValues(mode_map); if (mode_values.indexOf(temperature_control_mode) === -1) { throw new Error("temperature_control_mode must be one of " + mode_values.join(", ")); } var buffer = new Buffer(2); buffer.writeUInt8(0x68); buffer.writeUInt8(getValue(mode_map, temperature_control_mode)); return buffer.toBytes(); } /** * Set target temperature resolution * @param {number} target_temperature_resolution values: (0.5, 1) * @example { "target_temperature_resolution": 0.5 } */ function setTargetTemperatureResolution(target_temperature_resolution) { var resolution_values = [0.5, 1]; if (resolution_values.indexOf(target_temperature_resolution) === -1) { throw new Error("target_temperature_resolution must be one of " + resolution_values.join(", ")); } var buffer = new Buffer(2); buffer.writeUInt8(0x69); buffer.writeUInt8(resolution_values.indexOf(target_temperature_resolution)); return buffer.toBytes(); } /** * Set target temperature tolerance * @param {number} target_temperature_tolerance unit: celsius, range: [0.1, 5] * @example { "target_temperature_tolerance": 0.5 } */ function setTargetTemperatureTolerance(target_temperature_tolerance) { if (target_temperature_tolerance < 0.1 || target_temperature_tolerance > 5) { throw new Error("target_temperature_tolerance must be between 0.1 and 5"); } var buffer = new Buffer(2); buffer.writeUInt8(0x6a); buffer.writeInt16LE(target_temperature_tolerance * 100); return buffer.toBytes(); } /** * Set heating target temperature * @param {number} heating_target_temperature unit: celsius, range: [5, 35] * @example { "heating_target_temperature": 20 } */ function setHeatingTargetTemperature(heating_target_temperature) { if (heating_target_temperature < 5 || heating_target_temperature > 35) { throw new Error("heating_target_temperature must be between 5 and 35"); } var buffer = new Buffer(3); buffer.writeUInt8(0x6b); buffer.writeInt16LE(heating_target_temperature * 100); return buffer.toBytes(); } /** * Set cooling target temperature * @param {number} cooling_target_temperature unit: celsius, range: [5, 35] * @example { "cooling_target_temperature": 20 } */ function setCoolingTargetTemperature(cooling_target_temperature) { if (cooling_target_temperature < 5 || cooling_target_temperature > 35) { throw new Error("cooling_target_temperature must be between 5 and 35"); } var buffer = new Buffer(3); buffer.writeUInt8(0x6c); buffer.writeInt16LE(cooling_target_temperature * 100); return buffer.toBytes(); } /** * Set heating target temperature range * @param {object} heating_target_temperature_range * @param {number} heating_target_temperature_range.min unit: celsius, range: [5, 35] * @param {number} heating_target_temperature_range.max unit: celsius, range: [5, 35] * @example { "heating_target_temperature_range": { "min": 5, "max": 35 } } */ function setHeatingTargetTemperatureRange(heating_target_temperature_range) { var min = heating_target_temperature_range.min; var max = heating_target_temperature_range.max; if (min < 5 || min > 35) { throw new Error("heating_target_temperature_range.min must be between 5 and 35"); } if (max < 5 || max > 35) { throw new Error("heating_target_temperature_range.max must be between 5 and 35"); } var buffer = new Buffer(5); buffer.writeUInt8(0x6d); buffer.writeInt16LE(min * 100); buffer.writeInt16LE(max * 100); return buffer.toBytes(); } /** * Set cooling target temperature range * @param {object} cooling_target_temperature_range * @param {number} cooling_target_temperature_range.min unit: celsius, range: [5, 35] * @param {number} cooling_target_temperature_range.max unit: celsius, range: [5, 35] * @example { "cooling_target_temperature_range": { "min": 5, "max": 35 } } */ function setCoolingTargetTemperatureRange(cooling_target_temperature_range) { var min = cooling_target_temperature_range.min; var max = cooling_target_temperature_range.max; if (min < 5 || min > 35) { throw new Error("cooling_target_temperature_range.min must be between 5 and 35"); } if (max < 5 || max > 35) { throw new Error("cooling_target_temperature_range.max must be between 5 and 35"); } var buffer = new Buffer(5); buffer.writeUInt8(0x6e); buffer.writeInt16LE(min * 100); buffer.writeInt16LE(max * 100); return buffer.toBytes(); } /** * Set dehumidify config * @param {object} dehumidify_config * @param {number} dehumidify_config.enable values: (0: disable, 1: enable) * @param {number} dehumidify_config.temperature_tolerance unit: celsius, range: [0.1, 5] * @example { "dehumidify_config": { "enable": 1, "temperature_tolerance": 0.5 } } */ function setDehumidifyConfig(dehumidify_config) { var enable = dehumidify_config.enable; var temperature_tolerance = dehumidify_config.temperature_tolerance; var enable_map = { 0: "disable", 1: "enable" }; var enable_values = getValues(enable_map); if (enable_values.indexOf(enable) === -1) { throw new Error("dehumidify_config.enable must be one of " + enable_values.join(", ")); } var buffer = new Buffer(4); buffer.writeUInt8(0x6f); buffer.writeUInt8(getValue(enable_map, enable)); buffer.writeInt16LE(temperature_tolerance * 100); return buffer.toBytes(); } /** * Set target humidity range * @param {object} target_humidity_range * @param {number} target_humidity_range.min unit: percentage, range: [0, 100] * @param {number} target_humidity_range.max unit: percentage, range: [0, 100] * @example { "target_humidity_range": { "min": 0, "max": 100 } } */ function setTargetHumidityRange(target_humidity_range) { var min = target_humidity_range.min; var max = target_humidity_range.max; if (min < 0 || min > 100) { throw new Error("target_humidity_range.min must be between 0 and 100"); } if (max < 0 || max > 100) { throw new Error("target_humidity_range.max must be between 0 and 100"); } var buffer = new Buffer(5); buffer.writeUInt8(0x70); buffer.writeUInt16LE(min * 10); buffer.writeUInt16LE(max * 10); return buffer.toBytes(); } /** * Set fan mode * @param {number} fan_mode values: (0: auto, 1: low, 2: medium, 3: high) * @example { "fan_mode": 1 } */ function setFanMode(fan_mode) { var mode_map = { 0: "auto", 1: "low", 2: "medium", 3: "high" }; var mode_values = getValues(mode_map); if (mode_values.indexOf(fan_mode) === -1) { throw new Error("fan_mode must be one of " + mode_values.join(", ")); } var buffer = new Buffer(2); buffer.writeUInt8(0x72); buffer.writeUInt8(getValue(mode_map, fan_mode)); return buffer.toBytes(); } /** * Set fan speed config * @param {object} fan_speed_config * @param {number} fan_speed_config.delta_1 unit: percentage, range: [1.0, 15.0] * @param {number} fan_speed_config.delta_2 unit: percentage, range: [1.0, 15.0] * @example { "fan_speed_config": { "delta_1": 1.0, "delta_2": 1.0 } } */ function setFanSpeedConfig(fan_speed_config) { var delta_1 = fan_speed_config.delta_1; var delta_2 = fan_speed_config.delta_2; if (delta_1 < 1.0 || delta_1 > 15.0) { throw new Error("fan_speed_config.delta_1 must be between 1.0 and 15.0"); } if (delta_2 < 1.0 || delta_2 > 15.0) { throw new Error("fan_speed_config.delta_2 must be between 1.0 and 15.0"); } var buffer = new Buffer(5); buffer.writeUInt8(0x73); buffer.writeInt16LE(delta_1 * 100); buffer.writeInt16LE(delta_2 * 100); return buffer.toBytes(); } /** * Set fan delay config * @param {object} fan_delay_config * @param {number} fan_delay_config.enable values: (0: disable, 1: enable) * @param {number} fan_delay_config.delay unit: second, range: [1, 3600] * @example { "fan_delay_config": { "enable": 1, "delay": 10 } } */ function setFanDelayConfig(fan_delay_config) { var enable = fan_delay_config.enable; var delay_time = fan_delay_config.delay_time; var enable_map = { 0: "disable", 1: "enable" }; var enable_values = getValues(enable_map); if (enable_values.indexOf(enable) === -1) { throw new Error("fan_delay_config.enable must be one of " + enable_values.join(", ")); } if (delay_time < 1 || delay_time > 3600) { throw new Error("fan_delay_config.delay_time must be in the range of 1 to 3600 seconds"); } var buffer = new Buffer(4); buffer.writeUInt8(0x74); buffer.writeUInt8(getValue(enable_map, enable)); buffer.writeUInt16LE(delay_time); return buffer.toBytes(); } /** * Set child lock config * @param {object} child_lock_settings * @param {number} child_lock_settings.enable values: (0: disable, 1: enable) * @param {number} child_lock_settings.system_button values: (0: disable, 1: enable) * @param {number} child_lock_settings.temperature_button values: (0: disable, 1: enable) * @param {number} child_lock_settings.fan_button values: (0: disable, 1: enable) * @param {number} child_lock_settings.temperature_control_button values: (0: disable, 1: enable) * @param {number} child_lock_settings.reboot_reset_button values: (0: disable, 1: enable) * @example { "child_lock_settings": { "system_button": 1, "temperature_button": 1, "fan_button": 1, "temperature_control_button": 1, "reboot_reset_button": 1 } } */ function setChildLockSettings(child_lock_settings) { var enable = child_lock_settings.enable; var enable_map = { 0: "disable", 1: "enable" }; var enable_values = getValues(enable_map); var data = 0x00; var button_offset = { system_button: 0, temperature_button: 1, fan_button: 2, temperature_control_button: 3, reboot_reset_button: 4 }; for (var key in button_offset) { if (key in child_lock_settings) { if (enable_values.indexOf(child_lock_settings[key]) === -1) { throw new Error("child_lock_settings." + key + " must be one of " + enable_values.join(", ")); } data |= getValue(enable_map, child_lock_settings[key]) << button_offset[key]; } } var buffer = new Buffer(3); buffer.writeUInt8(0x75); buffer.writeUInt8(getValue(enable_map, enable)); buffer.writeUInt8(data); return buffer.toBytes(); } /** * Set temperature alarm settings * @param {object} temperature_alarm_settings * @param {number} temperature_alarm_settings.enable values: (0: disable, 1: enable) * @param {number} temperature_alarm_settings.condition values: (1: below, 2: above, 3: between, 4: outside) * @param {number} temperature_alarm_settings.threshold_min unit: celsius, range: [-20, 60] * @param {number} temperature_alarm_settings.threshold_max unit: celsius, range: [-20, 60] * @example { "temperature_alarm_settings": { "enable": 1, "condition": 1, "threshold_min": 20, "threshold_max": 25 } } */ function setTemperatureAlarmSettings(temperature_alarm_settings) { var enable = temperature_alarm_settings.enable; var condition = temperature_alarm_settings.condition; var threshold_min = temperature_alarm_settings.threshold_min; var threshold_max = temperature_alarm_settings.threshold_max; var enable_map = { 0: "disable", 1: "enable" }; var enable_values = getValues(enable_map); if (enable_values.indexOf(enable) === -1) { throw new Error("temperature_alarm_settings.enable must be one of " + enable_values.join(", ")); } var condition_map = { 0: "disable", 1: "below", 2: "above", 3: "between", 4: "outside" }; var condition_values = getValues(condition_map); if (condition_values.indexOf(condition) === -1) { throw new Error("temperature_alarm_settings.condition must be one of " + condition_values.join(", ")); } var buffer = new Buffer(7); buffer.writeUInt8(0x76); buffer.writeUInt8(getValue(enable_map, enable)); buffer.writeUInt8(getValue(condition_map, condition)); buffer.writeInt16LE(threshold_min * 100); buffer.writeInt16LE(threshold_max * 100); return buffer.toBytes(); } /** * Set continuous high temperature alarm settings * @param {object} high_temperature_alarm_settings * @param {number} high_temperature_alarm_settings.enable values: (0: disable, 1: enable) * @param {number} high_temperature_alarm_settings.delta_temperature unit: celsius, range: [1, 10] * @param {number} high_temperature_alarm_settings.duration unit: minute, range: [0, 60] * @example { "high_temperature_alarm_settings": { "enable": 1, "delta_temperature": 3, "duration": 10 } } */ function setContinuousHighTemperatureAlarmSettings(high_temperature_alarm_settings) { var enable = high_temperature_alarm_settings.enable; var delta_temperature = high_temperature_alarm_settings.delta_temperature; var duration = high_temperature_alarm_settings.duration; var enable_map = { 0: "disable", 1: "enable" }; var enable_values = getValues(enable_map); if (enable_values.indexOf(enable) === -1) { throw new Error("continuous_temperature_alarm_settings.enable must be one of " + enable_values.join(", ")); } if (delta_temperature < 1 || delta_temperature > 10) { throw new Error("continuous_temperature_alarm_settings.delta_temperature must be between 1 and 10"); } if (duration < 0 || duration > 60) { throw new Error("continuous_temperature_alarm_settings.duration must be between 0 and 60"); } var buffer = new Buffer(5); buffer.writeUInt8(0x77); buffer.writeUInt8(getValue(enable_map, enable)); buffer.writeInt16LE(delta_temperature * 100); buffer.writeUInt8(duration); return buffer.toBytes(); } /** * Set continuous low temperature alarm settings * @param {object} low_temperature_alarm_settings * @param {number} low_temperature_alarm_settings.enable values: (0: disable, 1: enable) * @param {number} low_temperature_alarm_settings.delta_temperature unit: celsius, range: [1, 10] * @param {number} low_temperature_alarm_settings.duration unit: minute, range: [0, 60] * @example { "low_temperature_alarm_settings": { "enable": 1, "delta_min": 1, "duration": 10 } } */ function setContinuousLowTemperatureAlarmSettings(low_temperature_alarm_settings) { var enable = low_temperature_alarm_settings.enable; var delta_temperature = low_temperature_alarm_settings.delta_temperature; var duration = low_temperature_alarm_settings.duration; var enable_map = { 0: "disable", 1: "enable" }; var enable_values = getValues(enable_map); if (enable_values.indexOf(enable) === -1) { throw new Error("low_temperature_alarm_settings.enable must be one of " + enable_values.join(", ")); } if (delta_temperature < 1 || delta_temperature > 10) { throw new Error("low_temperature_alarm_settings.delta_temperature must be between 1 and 10"); } if (duration < 0 || duration > 60) { throw new Error("low_temperature_alarm_settings.duration must be between 0 and 60"); } var buffer = new Buffer(5); buffer.writeUInt8(0x78); buffer.writeUInt8(getValue(enable_map, enable)); buffer.writeInt16LE(delta_temperature * 100); buffer.writeUInt8(duration); return buffer.toBytes(); } /** * Set temperature calibration config * @param {object} temperature_calibration_settings * @param {number} temperature_calibration_settings.enable values: (0: disable, 1: enable) * @param {number} temperature_calibration_settings.calibration_value unit: celsius, range: [-80, 80] * @example { "temperature_calibration_settings": { "enable": 1, "calibration_value": 0.5 } } */ function setTemperatureCalibrationConfig(temperature_calibration_settings) { var enable = temperature_calibration_settings.enable; var calibration_value = temperature_calibration_settings.calibration_value; var enable_map = { 0: "disable", 1: "enable" }; var enable_values = getValues(enable_map); if (enable_values.indexOf(enable) === -1) { throw new Error("temperature_calibration_settings.enable must be one of " + enable_values.join(", ")); } if (calibration_value < -80 || calibration_value > 80) { throw new Error("temperature_calibration_settings.calibration_value must be between -80 and 80"); } var buffer = new Buffer(4); buffer.writeUInt8(0x79); buffer.writeUInt8(getValue(enable_map, enable)); buffer.writeInt16LE(calibration_value * 100); return buffer.toBytes(); } /** * Set humidity calibration config * @param {object} humidity_calibration_settings * @param {number} humidity_calibration_settings.enable values: (0: disable, 1: enable) * @param {number} humidity_calibration_settings.calibration_value unit: %, range: [-100, 100] * @example { "humidity_calibration_settings": { "enable": 1, "calibration_value": 0.5 } } */ function setHumidityCalibrationConfig(humidity_calibration_settings) { var enable = humidity_calibration_settings.enable; var calibration_value = humidity_calibration_settings.calibration_value; var enable_map = { 0: "disable", 1: "enable" }; var enable_values = getValues(enable_map); if (enable_values.indexOf(enable) === -1) { throw new Error("humidity_calibration_settings.enable must be one of " + enable_values.join(", ")); } if (calibration_value < -100 || calibration_value > 100) { throw new Error("humidity_calibration_settings.calibration_value must be between -100 and 100"); } var buffer = new Buffer(4); buffer.writeUInt8(0x7a); buffer.writeUInt8(getValue(enable_map, enable)); buffer.writeInt16LE(calibration_value * 10); return buffer.toBytes(); } /** * Set plan config * @param {object} plan_config * @param {number} plan_config._item.plan_id range: [1, 16] * @param {number} plan_config._item.enable values: (0: disable, 1: enable) * @param {string} plan_config._item.name_first * @param {string} plan_config._item.name_last * @param {number} plan_config._item.fan_mode values: (0: auto, 1: low, 2: medium, 3: high) * @param {number} plan_config._item.heating_temperature unit: celsius, range: [0, 60] * @param {number} plan_config._item.cooling_temperature unit: celsius, range: [0, 60] * @param {number} plan_config._item.temperature_tolerance unit: celsius, range: [0, 60] * @param {object} plan_config._item.schedule_config * @example * { "plan_config": [ * { "plan_id": 1, "enable": 1, "name": "task 1", "fan_mode": 1, "heating_temperature": 20, "cooling_temperature": 25, "temperature_tolerance": 1, * "schedule_config": { "enable": 1, "start_time": 0, "end_time": 1440, * "weekday": { "monday": 1, "tuesday": 1, "wednesday": 1, "thursday": 1, "friday": 1, "saturday": 1, "sunday": 1 } * } * }] * } */ function setPlanConfig(plan_config) { var plan_id = plan_config.plan_id; if (plan_id < 1 || plan_id > 16) { throw new Error("plan_config._item.plan_id must be between 1 and 16"); } var data = []; if ("enable" in plan_config) { data = data.concat(setPlanEnable(plan_id - 1, plan_config.enable)); } if ("name_first" in plan_config) { data = data.concat(setPlanNameFirst(plan_id - 1, plan_config.name_first)); } if ("name_last" in plan_config) { data = data.concat(setPlanNameLast(plan_id - 1, plan_config.name_last)); } if ("fan_mode" in plan_config && "heating_temperature" in plan_config && "cooling_temperature" in plan_config && "temperature_tolerance" in plan_config) { data = data.concat(setPlanTemperatureControlConfig(plan_id - 1, plan_config)); } if ("schedule_config" in plan_config) { for (var i = 0; i < plan_config.schedule_config.length; i++) { data = data.concat(setPlanScheduleConfig(plan_id - 1, plan_config.schedule_config[i])); } } return data; } function setPlanEnable(plan_id, enable) { var enable_map = { 0: "disable", 1: "enable" }; var enable_values = getValues(enable_map); if (enable_values.indexOf(enable) === -1) { throw new Error("plan_config._item.enable must be one of " + enable_values.join(", ")); } var buffer = new Buffer(4); buffer.writeUInt8(0x7b); buffer.writeUInt8(plan_id); buffer.writeUInt8(0x00); // enable sub-command buffer.writeUInt8(getValue(enable_map, enable)); return buffer.toBytes(); } function setPlanNameFirst(plan_id, name_first) { if (name_first.length > 10) { throw new Error("plan_config._item.name_first must be less than 10 characters"); } var buffer = new Buffer(9); buffer.writeUInt8(0x7b); buffer.writeUInt8(plan_id); buffer.writeUInt8(0x01); // name1 sub-command buffer.writeBytes(encodeUtf8(name_first)); return buffer.toBytes(); } function setPlanNameLast(plan_id, name_last) { if (name_last.length > 10) { throw new Error("plan_config._item.name_last must be less than 10 characters"); } var buffer = new Buffer(7); buffer.writeUInt8(0x7b); buffer.writeUInt8(plan_id); buffer.writeUInt8(0x02); // name2 sub-command buffer.writeBytes(encodeUtf8(name_last)); return buffer.toBytes(); } /** * @param {number} plan_id * @param {object} plan_config * @param {number} plan_config.fan_mode values: (0: auto, 1: low, 2: medium, 3: high) * @param {number} plan_config.heating_temperature_enable values: (0: disable, 1: enable) * @param {number} plan_config.heating_temperature unit: celsius, range: [5, 35] * @param {number} plan_config.cooling_temperature_enable values: (0: disable, 1: enable) * @param {number} plan_config.cooling_temperature unit: celsius, range: [5, 35] * @param {number} plan_config.temperature_tolerance_enable values: (0: disable, 1: enable) * @param {number} plan_config.temperature_tolerance unit: celsius, range: [0.1, 5] */ function setPlanTemperatureControlConfig(plan_id, plan_config) { var fan_mode = plan_config.fan_mode; var heating_temperature_enable = plan_config.heating_temperature_enable; var heating_temperature = plan_config.heating_temperature || 0; var cooling_temperature_enable = plan_config.cooling_temperature_enable; var cooling_temperature = plan_config.cooling_temperature || 0; var temperature_tolerance_enable = plan_config.temperature_tolerance_enable; var temperature_tolerance = plan_config.temperature_tolerance || 0; var enable_map = { 0: "disable", 1: "enable" }; var enable_values = getValues(enable_map); var fan_mode_map = { 0: "auto", 1: "low", 2: "medium", 3: "high" }; var fan_mode_values = getValues(fan_mode_map); if (fan_mode_values.indexOf(fan_mode) === -1) { throw new Error("plan_config.schedule_config._item.fan_mode must be one of " + fan_mode_values.join(", ")); } if (getValue(enable_values, heating_temperature_enable) === 1 && (heating_temperature < 5 || heating_temperature > 35)) { throw new Error("plan_config.schedule_config._item.heating_temperature must be between 5 and 35"); } if (getValue(enable_values, cooling_temperature_enable) === 1 && (cooling_temperature < 5 || cooling_temperature > 35)) { throw new Error("plan_config.schedule_config._item.cooling_temperature must be between 5 and 35"); } var temperature_tolerance_value = temperature_tolerance * 100; if (getValue(enable_values, temperature_tolerance_enable) === 1 && (temperature_tolerance_value < 10 || temperature_tolerance_value > 500)) { throw new Error("plan_config.schedule_config._item.temperature_tolerance must be between 0.1 and 5"); } var heating_temperature_data = 0x00; var cooling_temperature_data = 0x00; var temperature_tolerance_data = 0x00; heating_temperature_data |= (heating_temperature * 100) << 1; cooling_temperature_data |= (cooling_temperature * 100) << 1; temperature_tolerance_data |= (temperature_tolerance * 100) << 1; heating_temperature_data |= getValue(enable_map, heating_temperature_enable); cooling_temperature_data |= getValue(enable_map, cooling_temperature_enable); temperature_tolerance_data |= getValue(enable_map, temperature_tolerance_enable); var buffer = new Buffer(10); buffer.writeUInt8(0x7b); buffer.writeUInt8(plan_id); buffer.writeUInt8(0x03); // plan config sub-command buffer.writeUInt8(getValue(fan_mode_map, fan_mode)); buffer.writeInt16LE(heating_temperature_data); buffer.writeInt16LE(cooling_temperature_data); buffer.writeInt16LE(temperature_tolerance_data); return buffer.toBytes(); } /** * @param {number} plan_id * @param {object} schedule_config * @param {number} schedule_config.index range: [1, 16] * @param {number} schedule_config.enable values: (0: disable, 1: enable) * @param {number} schedule_config.time unit: minute, range: [0, 1439] * @param {object} schedule_config.weekday * @param {number} schedule_config.weekday.monday values: (0: disable, 1: enable) * @param {number} schedule_config.weekday.tuesday values: (0: disable, 1: enable) * @param {number} schedule_config.weekday.wednesday values: (0: disable, 1: enable) * @param {number} schedule_config.weekday.thursday values: (0: disable, 1: enable) * @param {number} schedule_config.weekday.friday values: (0: disable, 1: enable) * @param {number} schedule_config.weekday.saturday values: (0: disable, 1: enable) * @param {number} schedule_config.weekday.sunday values: (0: disable, 1: enable) */ function setPlanScheduleConfig(plan_id, schedule_config) { var index = schedule_config.index; var enable = schedule_config.enable; var time = schedule_config.time; var enable_map = { 0: "disable", 1: "enable" }; var enable_values = getValues(enable_map); if (enable_values.indexOf(enable) === -1) { throw new Error("plan_config._item.schedule_config.enable must be one of " + enable_values.join(", ")); } if (time < 0 || time > 1439) { throw new Error("plan_config._item.schedule_config.time must be between 0 and 1439"); } if (index < 1 || index > 16) { throw new Error("plan_config._item.schedule_config.index must be between 1 and 16"); } var data = 0x00; var weekday_bits_offset = { sunday: 0, monday: 1, tuesday: 2, wednesday: 3, thursday: 4, friday: 5, saturday: 6 }; for (var key in weekday_bits_offset) { if (key in schedule_config.weekday) { if (enable_values.indexOf(schedule_config.weekday[key]) === -1) { throw new Error("plan_config._item.schedule_config.weekday." + key + " must be one of " + enable_values.join(", ")); } data |= getValue(enable_map, schedule_config.weekday[key]) << weekday_bits_offset[key]; } } var buffer = new Buffer(8); buffer.writeUInt8(0x7b); buffer.writeUInt8(plan_id); buffer.writeUInt8(0x04); buffer.writeUInt8(index - 1); buffer.writeUInt8(getValue(enable_map, enable)); buffer.writeUInt16LE(time); buffer.writeUInt8(data); return buffer.toBytes(); } /** * Valve interface config * @param {object} valve_interface_settings * @param {number} valve_interface_settings.mode values: (0: four_pipe_two_wire, 1: two_pipe_two_wire, 2: two_pipe_three_wire) * @param {object} valve_interface_settings.four_pipe_two_wire * @param {object} valve_interface_settings.two_pipe_two_wire * @param {object} valve_interface_settings.two_pipe_three_wire */ function setValveInterfaceSettings(valve_interface_settings) { var mode = valve_interface_settings.mode; var mode_map = { 0: "four_pipe_two_wire", 1: "two_pipe_two_wire", 2: "two_pipe_three_wire" }; var mode_values = getValues(mode_map); if (mode_values.indexOf(mode) === -1) { throw new Error("valve_interface_settings.mode must be one of " + mode_values.join(", ")); } var data = []; var mode_value = getValue(mode_map, mode); switch (mode_value) { case 0x00: // four_pipe_two_wire data = data.concat(setFourPipeTwoWireConfig(valve_interface_settings.four_pipe_two_wire)); break; case 0x01: // two_pipe_two_wire data = data.concat(setTwoPipeTwoWireConfig(valve_interface_settings.two_pipe_two_wire)); break; case 0x02: // two_pipe_three_wire data = data.concat(setTwoPipeThreeWireConfig(valve_interface_settings.two_pipe_three_wire)); break; } return data; } /** * @param {object} four_pipe_two_wire * @param {number} four_pipe_two_wire.cooling_valve values: (0: valve_1, 1: valve_2) * @param {number} four_pipe_two_wire.heating_valve values: (0: valve_1, 1: valve_2) */ function setFourPipeTwoWireConfig(four_pipe_two_wire) { var cooling_valve = four_pipe_two_wire.cooling_valve; var heating_valve = four_pipe_two_wire.heating_valve; var valve_map = { 0: "valve_1", 1: "valve_2" }; var valve_values = getValues(valve_map); if (valve_values.indexOf(cooling_valve) === -1) { throw new Error("four_pipe_two_wire.cooling_valve must be one of " + valve_values.join(", ")); } if (valve_values.indexOf(heating_valve) === -1) { throw new Error("four_pipe_two_wire.heating_valve must be one of " + valve_values.join(", ")); } var buffer = new Buffer(4); buffer.writeUInt8(0x7c); buffer.writeUInt8(0x00); // four_pipe_two_wire sub-command buffer.writeUInt8(getValue(valve_map, cooling_valve)); buffer.writeUInt8(getValue(valve_map, heating_valve)); return buffer.toBytes(); } /** * @param {object} two_pipe_two_wire * @param {number} two_pipe_two_wire.valve values: (0: valve_1, 1: valve_2) */ function setTwoPipeTwoWireConfig(two_pipe_two_wire) { var valve = two_pipe_two_wire.valve; var valve_map = { 0: "valve_1", 1: "valve_2" }; var valve_values = getValues(valve_map); if (valve_values.indexOf(valve) === -1) { throw new Error("two_pipe_two_wire.valve must be one of " + valve_values.join(", ")); } var buffer = new Buffer(3); buffer.writeUInt8(0x7c); buffer.writeUInt8(0x01); // two_pipe_two_wire sub-command buffer.writeUInt8(getValue(valve_map, valve)); return buffer.toBytes(); } /** * * @param {object} two_pipe_three_wire * @param {number} two_pipe_three_wire.no_valve values: (0: valve_1, 1: valve_2) * @param {number} two_pipe_three_wire.nc_valve values: (0: valve_1, 1: valve_2) */ function setTwoPipeThreeWireConfig(two_pipe_three_wire) { var no_valve = two_pipe_three_wire.no_valve; var nc_valve = two_pipe_three_wire.nc_valve; var valve_map = { 0: "valve_1", 1: "valve_2" }; var valve_values = getValues(valve_map); if (valve_values.indexOf(no_valve) === -1) { throw new Error("two_pipe_three_wire.no_valve must be one of " + valve_values.join(", ")); } if (valve_values.indexOf(nc_valve) === -1) { throw new Error("two_pipe_three_wire.nc_valve must be one of " + valve_values.join(", ")); } var buffer = new Buffer(4); buffer.writeUInt8(0x7c); buffer.writeUInt8(0x02); // two_pipe_three_wire sub-command buffer.writeUInt8(getValue(valve_map, no_valve)); buffer.writeUInt8(getValue(valve_map, nc_valve)); return buffer.toBytes(); } /** * Set DI settings * @param {object} di_settings * @param {number} di_settings.enable values: (0: disable, 1: enable) * @param {number} di_settings.type values: (0: card_control, 1: magnet_detection) * @param {object} di_settings.card_control * @param {object} di_settings.magnet_detection */ function setDISettings(di_settings) { var data = []; if ("enable" in di_settings) { data = data.concat(setDIEnable(di_settings.enable)); } if ("type" in di_settings) { var type = di_settings.type; var type_map = { 0: "card_control", 1: "magnet_detection" }; var type_values = getValues(type_map); if (type_values.indexOf(type) === -1) { throw new Error("di_settings.type must be one of " + type_values.join(", ")); } if ("card_control" in di_settings) { data = data.concat(setCardConfig(di_settings.card_control)); } if ("magnet_detection" in di_settings) { data = data.concat(setOpenWindowConfig(di_settings.magnet_detection)); } } return data; } /** * Set DI enable * @param {number} di_enable values: (0: disable, 1: enable) * @example { "di_enable": 0 } */ function setDIEnable(di_enable) { var enable_map = { 0: "disable", 1: "enable" }; var enable_values = getValues(enable_map); if (enable_values.indexOf(di_enable) === -1) { throw new Error("di_settings.enable must be one of " + enable_values.join(", ")); } var buffer = new Buffer(2); buffer.writeUInt8(0x80); buffer.writeUInt8(getValue(enable_map, di_enable)); return buffer.toBytes(); } /** * Set card config * @param {objectF} card_control * @param {number} card_control.mode values: (0: power, 1: plan) * @param {number} card_control.system_status values: (0: on, 1: off) * @param {number} card_control.in_plan_id range: [1, 16] * @param {number} card_control.out_plan_id range: [1, 16] * @example { "card_control": { "mode": 0, "system_status": 0 } } */ function setCardConfig(card_control) { var mode = card_control.mode; var mode_map = { 0: "power", 1: "plan" }; var mode_values = getValues(mode_map); if (mode_values.indexOf(mode) === -1) { throw new Error("di_settings.card_control.mode must be one of " + mode_values.join(", ")); } var mode_value = getValue(mode_map, mode); if (mode_value === 0) { var on_off_map = { 0: "off", 1: "on" }; var on_off_values = getValues(on_off_map); var system_status = card_control.system_status; if (on_off_values.indexOf(system_status) === -1) { throw new Error("di_settings.card_control.system_status must be one of " + on_off_values.join(", ")); } var buffer = new Buffer(4); buffer.writeUInt8(0x81); buffer.writeUInt8(0x00); buffer.writeUInt8(0x00); buffer.writeUInt8(getValue(on_off_map, system_status)); return buffer.toBytes(); } else if (mode_value === 1) { var in_plan_id = card_control.in_plan_id; var out_plan_id = card_control.out_plan_id; if (in_plan_id < 1 || in_plan_id > 16) { throw new Error("di_settings.card_control.in_plan_id must be between 1 and 16"); } if (out_plan_id < 1 || out_plan_id > 16) { throw new Error("di_settings.card_control.out_plan_id must be between 1 and 16"); } var buffer = new Buffer(5); buffer.writeUInt8(0x81); buffer.writeUInt8(0x00); buffer.writeUInt8(0x01); buffer.writeUInt8(in_plan_id - 1); buffer.writeUInt8(out_plan_id - 1); return buffer.toBytes(); } } /** * Set open window config * @param {object} magnet_detection * @param {number} magnet_detection.mode values: (0: normally_close, 1: normally_open) * @example { "magnet_detection": { "mode": 0 } } */ function setOpenWindowConfig(magnet_detection) { var mode = magnet_detection.mode; var mode_map = { 0: "normally_close", 1: "normally_open" }; var mode_values = getValues(mode_map); if (mode_values.indexOf(mode) === -1) { throw new Error("di_settings.magnet_detection.mode must be one of " + mode_values.join(", ")); } var buffer = new Buffer(3); buffer.writeUInt8(0x81); buffer.writeUInt8(0x01); buffer.writeUInt8(getValue(mode_map, mode)); return buffer.toBytes(); } /** * Set window opening detection settings * @param {object} window_opening_detection_settings * @param {number} window_opening_detection_settings.enable values: (0: disable, 1: enable) * @param {number} window_opening_detection_settings.type values: (0: temperature_detection, 1: magnet_detection) * @param {object} window_opening_detection_settings.temperature_detection * @param {object} window_opening_detection_settings.magnet_detection * @example { "window_opening_detection_settings": { "type": 0 } } */ function setWindowOpeningDetectionSettings(window_opening_detection_settings) { var data = []; if ("enable" in window_opening_detection_settings) { data = data.concat(setWindowOpeningDetectionEnable(window_opening_detection_settings.enable)); } if ("type" in window_opening_detection_settings) { var type = window_opening_detection_settings.type; var type_map = { 0: "temperature_detection", 1: "magnet_detection" }; var type_values = getValues(type_map); if (type_values.indexOf(type) === -1) { throw new Error("window_opening_detection_settings.type must be one of " + type_values.join(", ")); } if ("temperature_detection" in window_opening_detection_settings) { data = data.concat(setWindowOpeningDetectionTemperatureDetection(window_opening_detection_settings.temperature_detection)); } if ("magnet_detection" in window_opening_detection_settings) { data = data.concat(setWindowOpeningDetectionMagnetDetection(window_opening_detection_settings.magnet_detection)); } } return data; } /** * Set window opening detection enable * @param {number} enable values: (0: disable, 1: enable) * @example { "enable": 0 } */ function setWindowOpeningDetectionEnable(enable) { var enable_map = { 0: "disable", 1: "enable" }; var enable_values = getValues(enable_map); if (enable_values.indexOf(enable) === -1) { throw new Error("window_opening_detection_settings.enable must be one of " + enable_values.join(", ")); } var buffer = new Buffer(2); buffer.writeUInt8(0x82); buffer.writeUInt8(getValue(enable_map, enable)); return buffer.toBytes(); } /** * Set window opening detection temperature detection * @param {object} temperature_detection * @param {number} temperature_detection.delta_temperature, unit: celsius, range: [1, 10] * @param {number} temperature_detection.duration, unit: minute, range: [1, 60] * @example { "temperature_detection": { "delta_temperature": 1, "duration": 1 } } */ function setWindowOpeningDetectionTemperatureDetection(temperature_detection) { var delta_temperature = temperature_detection.delta_temperature; var duration = temperature_detection.duration; if (delta_temperature < 1 || delta_temperature > 10) { throw new Error("window_opening_detection_settings.temperature_detection.delta_temperature must be between 1 and 10"); } if (duration < 1 || duration > 60) { throw new Error("window_opening_detection_settings.temperature_detection.duration must be between 1 and 60"); } var buffer = new Buffer(5); buffer.writeUInt8(0x83); buffer.writeUInt8(0x00); // temperature detection sub-command buffer.writeInt16LE(delta_temperature * 100); buffer.writeUInt8(duration); return buffer.toBytes(); } /** * Set window opening detection magnet detection * @param {object} magnet_detection * @param {number} magnet_detection.duration, unit: minute, range: [1, 60] * @example { "magnet_detection": { "duration": 1 } } */ function setWindowOpeningDetectionMagnetDetection(magnet_detection) { var duration = magnet_detection.duration; if (duration < 1 || duration > 60) { throw new Error("window_opening_detection_settings.magnet_detection.duration must be between 1 and 60"); } var buffer = new Buffer(3); buffer.writeUInt8(0x83); buffer.writeUInt8(0x01); // magnet detection sub-command buffer.writeUInt8(duration); return buffer.toBytes(); } /** * Set freeze protection config * @param {object} freeze_protection_settings * @param {number} freeze_protection_settings.enable values: (0: disable, 1: enable) * @param {number} freeze_protection_settings.target_temperature unit: celsius, range: [1, 5] * @example { "freeze_protection_settings": { "enable": 0, "target_temperature": 0 } } */ function setFreezeProtectionConfig(freeze_protection_settings) { var enable = freeze_protection_settings.enable; var target_temperature = freeze_protection_settings.target_temperature; var enable_map = { 0: "disable", 1: "enable" }; var enable_values = getValues(enable_map); if (enable_values.indexOf(enable) === -1) { throw new Error("freeze_protection_settings.enable must be one of " + enable_values.join(", ")); } var buffer = new Buffer(4); buffer.writeUInt8(0x84); buffer.writeUInt8(getValue(enable_map, enable)); buffer.writeInt16LE(target_temperature * 100); return buffer.toBytes(); } /** * Set temperature source config * @param {object} temperature_source_settings * @param {number} temperature_source_settings.source values: (0: internal, 1: ntc, 2: lorawan, 3: d2d) * @param {number} temperature_source_settings.duration, unit: minute, range: [1, 60] * @param {number} temperature_source_settings.missing_data_action values: (0: hold, 1: off_or_fan_control, 2: switch_to_internal) * @example { "temperature_source_settings": { "source": 0 } } */ function setTemperatureSourceConfig(temperature_source_settings) { var source = temperature_source_settings.source; var source_map = { 0: "internal", 1: "ntc", 2: "lorawan", 3: "d2d" }; var source_values = getValues(source_map); if (source_values.indexOf(source) === -1) { throw new Error("temperature_source_settings.source must be one of " + source_values.join(", ")); } var source_value = getValue(source_map, source); if (source_value === 0 || source_value === 1) { var buffer = new Buffer(2); buffer.writeUInt8(0x85); buffer.writeUInt8(source_value); return buffer.toBytes(); } else if (source_value === 2 || source_value === 3) { var duration = temperature_source_settings.duration; var missing_data_action = temperature_source_settings.missing_data_action; var action_map = { 0: "hold", 1: "off_or_fan_control", 2: "switch_to_internal" }; var action_values = getValues(action_map); if (action_values.indexOf(missing_data_action) === -1) { throw new Error("temperature_source_settings.missing_value_action must be one of " + action_values.join(", ")); } var buffer = new Buffer(4); buffer.writeUInt8(0x85); buffer.writeUInt8(source_value); buffer.writeUInt8(duration); buffer.writeUInt8(getValue(action_map, missing_data_action)); return buffer.toBytes(); } } /** * Set D2D enable * @param {number} d2d_pairing_enable values: (0: disable, 1: enable) * @example { "d2d_pairing_enable": 0 } */ function setD2DEnable(d2d_pairing_enable) { var enable_map = { 0: "disable", 1: "enable" }; var enable_values = getValues(enable_map); if (enable_values.indexOf(d2d_pairing_enable) === -1) { throw new Error("d2d_pairing_enable must be one of " + enable_values.join(", ")); } var buffer = new Buffer(2); buffer.writeUInt8(0x86); buffer.writeUInt8(getValue(enable_map, d2d_pairing_enable)); return buffer.toBytes(); } /** * Set D2D config * @param {object} d2d_pairing_settings * @param {number} d2d_pairing_settings.index range: [1, 16] * @param {number} d2d_pairing_settings.enable values: (0: disable, 1: enable) * @param {string} d2d_pairing_settings.eui * @param {string} d2d_pairing_settings.name_first * @param {string} d2d_pairing_settings.name_last * @example { "d2d_pairing_settings": [{ "index": 1, "enable": 0, "eui": "0000000000000000", "name": "test" }] } */ function setD2DPairingSettings(d2d_pairing_settings) { var index = d2d_pairing_settings.index; if (index < 1 || index > 16) { throw new Error("d2d_pairing_settings._item.index must be between 1 and 16"); } var data = []; if ("enable" in d2d_pairing_settings) { data = data.concat(setD2DPairingEnable(index - 1, d2d_pairing_settings.enable)); } if ("eui" in d2d_pairing_settings) { data = data.concat(setD2DPairingDeviceEui(index - 1, d2d_pairing_settings.eui)); } if ("name_first" in d2d_pairing_settings) { data = data.concat(setD2DPairingNameFirst(index - 1, d2d_pairing_settings.name_first)); } if ("name_last" in d2d_pairing_settings) { data = data.concat(setD2DPairingNameLast(index - 1, d2d_pairing_settings.name_last)); } return data; } /** * Set D2D pairing enable * @param {number} index range: [1, 5] * @param {number} enable values: (0: disable, 1: enable) * @example { "d2d_pairing_settings": [{ "index": 1, "enable": 0 }] } */ function setD2DPairingEnable(index, enable) { var enable_map = { 0: "disable", 1: "enable" }; var enable_values = getValues(enable_map); if (enable_values.indexOf(enable) === -1) { throw new Error("d2d_pairing_settings._item.enable must be one of " + enable_values.join(", ")); } var buffer = new Buffer(4); buffer.writeUInt8(0x87); buffer.writeUInt8(index); buffer.writeUInt8(0x00); // pairing enable sub-command buffer.writeUInt8(getValue(enable_map, enable)); return buffer.toBytes(); } /** * Set D2D pairing device EUI * @param {number} index range: [1, 5] * @param {string} eui * @example { "d2d_pairing_settings": [{ "index": 1, "eui": "0000000000000000" }] } */ function setD2DPairingDeviceEui(index, eui) { if (eui.length !== 16) { throw new Error("d2d_pairing_settings._item.eui length must be 16"); } var buffer = new Buffer(11); buffer.writeUInt8(0x87); buffer.writeUInt8(index); buffer.writeUInt8(0x01); // pairing device EUI sub-command buffer.writeHexString(eui); return buffer.toBytes(); } /** * Set D2D pairing name * @param {number} index range: [1, 5] * @param {string} name * @example { "d2d_pairing_settings": [{ "index": 1, "name": "test" }] } */ function setD2DPairingNameFirst(index, name_first) { if (name_first.length > 16) { throw new Error("d2d_pairing_settings._item.name_first length must be less than 16"); } var firstBuffer = new Buffer(11); firstBuffer.writeUInt8(0x87); firstBuffer.writeUInt8(index); firstBuffer.writeUInt8(0x02); // First part command firstBuffer.writeBytes(encodeUtf8(name_first)); return firstBuffer.toBytes(); } /** * Set D2D pairing name last * @param {number} index range: [1, 5] * @param {string} name_last * @example { "d2d_pairing_settings": [{ "index": 1, "name_last": "test" }] } */ function setD2DPairingNameLast(index, name_last) { if (name_last.length > 16) { throw new Error("d2d_pairing_settings._item.name_last length must be less than 16"); } var lastBuffer = new Buffer(11); lastBuffer.writeUInt8(0x87); lastBuffer.writeUInt8(index); lastBuffer.writeUInt8(0x03); // Last part command lastBuffer.writeBytes(encodeUtf8(name_last)); return lastBuffer.toBytes(); } /** * Set D2D master enable * @param {number} d2d_master_enable values: (0: disable, 1: enable) * @example { "d2d_master_enable": 0 } */ function setD2DMasterEnable(d2d_master_enable) { var enable_map = { 0: "disable", 1: "enable" }; var enable_values = getValues(enable_map); if (enable_values.indexOf(d2d_master_enable) === -1) { throw new Error("d2d_master_enable must be one of " + enable_values.join(", ")); } var buffer = new Buffer(2); buffer.writeUInt8(0x88); buffer.writeUInt8(getValue(enable_map, d2d_master_enable)); return buffer.toBytes(); } /** * Set D2D master settings * @param {object} d2d_master_settings * @param {number} d2d_master_settings._item.trigger_source values: (0: plan_1, 1: plan_2, 2: plan_3, 3: plan_4, 4: plan_5, 5: plan_6, 6: plan_7, 7: plan_8, 8: plan_9, 9: plan_10, 10: plan_11, 11: plan_12, 12: plan_13, 14: plan_15, 15: plan_16, 16: system_status_off, 17: system_status_on) * @param {number} d2d_master_settings._item.enable values: (0: disable, 1: enable) * @param {number} d2d_master_settings._item.lora_uplink_enable values: (0: disable, 1: enable) * @param {string} d2d_master_settings._item.command * @param {number} d2d_master_settings._item.time_enable values: (0: disable, 1: enable) * @param {number} d2d_master_settings._item.time * @example { "d2d_master_settings": [{ "index": 1, "trigger_source": 0, "enable": 0, "lora_uplink_enable": 0, "command": "0000000000000000", "time_enable": 0, "time": 0 }] } */ function setD2DMasterSettings(d2d_master_settings) { var trigger_source = d2d_master_settings.trigger_source; var enable = d2d_master_settings.enable; var lora_uplink_enable = d2d_master_settings.lora_uplink_enable; var command = d2d_master_settings.command; var time_enable = d2d_master_settings.time_enable; var time = d2d_master_settings.time; var enable_map = { 0: "disable", 1: "enable" }; var enable_values = getValues(enable_map); if (enable_values.indexOf(enable) === -1) { throw new Error("d2d_master_settings._item.enable must be one of " + enable_values.join(", ")); } if (enable_values.indexOf(lora_uplink_enable) === -1) { throw new Error("d2d_master_settings._item.lora_uplink_enable must be one of " + enable_values.join(", ")); } var trigger_source_map = { 0: "plan_1", 1: "plan_2", 2: "plan_3", 3: "plan_4", 4: "plan_5", 5: "plan_6", 6: "plan_7", 7: "plan_8", 8: "plan_9", 9: "plan_10", 10: "plan_11", 11: "plan_12", 12: "plan_13", 14: "plan_15", 15: "plan_16", 16: "system_status_off", 17: "system_status_on" }; var trigger_source_values = getValues(trigger_source_map); if (trigger_source_values.indexOf(trigger_source) === -1) { throw new Error("d2d_master_settings._item.trigger_source must be one of " + trigger_source_values.join(", ")); } if (command.length !== 4) { throw new Error("d2d_master_settings._item.command length must be 4"); } var buffer = new Buffer(9); buffer.writeUInt8(0x89); buffer.writeUInt8(getValue(trigger_source_map, trigger_source)); buffer.writeUInt8(getValue(enable_map, enable)); buffer.writeUInt8(getValue(enable_map, lora_uplink_enable)); buffer.writeHexStringReverse(command); buffer.writeUInt8(getValue(enable_map, time_enable)); buffer.writeUInt16LE(time); return buffer.toBytes(); } /** * Set D2D slave enable * @param {number} d2d_slave_enable values: (0: disable, 1: enable) * @example { "d2d_slave_enable": 0 } */ function setD2DSlaveEnable(d2d_slave_enable) { var enable_map = { 0: "disable", 1: "enable" }; var enable_values = getValues(enable_map); if (enable_values.indexOf(d2d_slave_enable) === -1) { throw new Error("d2d_slave_enable must be one of " + enable_values.join(", ")); } var buffer = new Buffer(2); buffer.writeUInt8(0x8a); buffer.writeUInt8(getValue(enable_map, d2d_slave_enable)); return buffer.toBytes(); } /** * Set D2D slave settings * @param {object} d2d_slave_settings * @param {number} d2d_slave_settings._item.index range: [1, 16] * @param {number} d2d_slave_settings._item.enable values: (0: disable, 1: enable) * @param {string} d2d_slave_settings._item.command * @param {string} d2d_slave_settings._item.trigger_target values: (0: plan_1, 1: plan_2, 2: plan_3, 3: plan_4, 4: plan_5, 5: plan_6, 6: plan_7, 7: plan_8, 8: plan_9, 9: plan_10, 10: plan_11, 11: plan_12, 12: plan_13, 14: plan_15, 15: plan_16, 16: system_status_on, 17: system_status_off, 18: system_status_toggle, 19: window_open, 20: window_close) * @example { "d2d_slave_settings": [{ "index": 1, "enable": 0, "command": "0000", "trigger_target": 0 }] } */ function setD2DSlaveSettings(d2d_slave_settings) { var index = d2d_slave_settings.index; var enable = d2d_slave_settings.enable; var command = d2d_slave_settings.command; var trigger_target = d2d_slave_settings.trigger_target; var enable_map = { 0: "disable", 1: "enable" }; var enable_values = getValues(enable_map); if (enable_values.indexOf(enable) === -1) { throw new Error("d2d_slave_settings._item.enable must be one of " + enable_values.join(", ")); } var index_values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]; if (index_values.indexOf(index) === -1) { throw new Error("d2d_slave_settings._item.index must be one of " + index_values.join(", ")); } var trigger_target_map = { 0: "plan_1", 1: "plan_2", 2: "plan_3", 3: "plan_4", 4: "plan_5", 5: "plan_6", 6: "plan_7", 7: "plan_8", 8: "plan_9", 9: "plan_10", 10: "plan_11", 11: "plan_12", 12: "plan_13", 14: "plan_15", 15: "plan_16", 16: "system_status_off", 17: "system_status_on" }; var trigger_target_values = getValues(trigger_target_map); if (trigger_target_values.indexOf(trigger_target) === -1) { throw new Error("d2d_slave_settings._item.trigger_target must be one of " + trigger_target_values.join(", ")); } var buffer = new Buffer(6); buffer.writeUInt8(0x8b); buffer.writeUInt8(index - 1); buffer.writeUInt8(getValue(enable_map, enable)); buffer.writeHexStringReverse(command); buffer.writeUInt8(getValue(trigger_target_map, trigger_target)); return buffer.toBytes(); } /** * Set timed system control settings * @param {object} timed_system_control_settings * @param {number} timed_system_control_settings.enable values: (0: disable, 1: enable) * @param {Array} timed_system_control_settings.start_cycle_settings * @param {Array} timed_system_control_settings.end_cycle_settings */ function setTimedSystemControlSettings(timed_system_control_settings) { var data = []; if ("enable" in timed_system_control_settings) { data = data.concat(setTimedSystemControlEnable(timed_system_control_settings.enable)); } if ("start_cycle_settings" in timed_system_control_settings) { for (var i = 0; i < timed_system_control_settings.start_cycle_settings.length; i++) { data = data.concat(setTimedSystemControlStartTimeCycle(timed_system_control_settings.start_cycle_settings[i])); } } if ("end_cycle_settings" in timed_system_control_settings) { for (var i = 0; i < timed_system_control_settings.end_cycle_settings.length; i++) { data = data.concat(setTimedSystemControlEndTimeCycle(timed_system_control_settings.end_cycle_settings[i])); } } return data; } /** * Set timed system control enable * @param {number} enable values: (0: disable, 1: enable) * @example { "enable": 0 } */ function setTimedSystemControlEnable(enable) { var enable_map = { 0: "disable", 1: "enable" }; var enable_values = getValues(enable_map); if (enable_values.indexOf(enable) === -1) { throw new Error("timed_system_control_settings.enable must be one of " + enable_values.join(", ")); } var buffer = new Buffer(3); buffer.writeUInt8(0x8c); buffer.writeUInt8(0x00); buffer.writeUInt8(getValue(enable_map, enable)); return buffer.toBytes(); } /** * Set system auto work config * @param {object} start_cycle_settings * @param {number} start_cycle_settings._item.index range: [1, 2] * @param {number} start_cycle_settings._item.enable values: (0: disable, 1: enable) * @param {number} start_cycle_settings._item.time converter: 08:30 -> 08 * 60 + 30 = 510 * @param {object} start_cycle_settings._item.weekday * @param {number} start_cycle_settings._item.weekday.sunday values: (0: disable, 1: enable) * @param {number} start_cycle_settings._item.weekday.monday values: (0: disable, 1: enable) * @param {number} start_cycle_settings._item.weekday.tuesday values: (0: disable, 1: enable) * @param {number} start_cycle_settings._item.weekday.wednesday values: (0: disable, 1: enable) * @param {number} start_cycle_settings._item.weekday.thursday values: (0: disable, 1: enable) * @param {number} start_cycle_settings._item.weekday.friday values: (0: disable, 1: enable) * @param {number} start_cycle_settings._item.weekday.saturday values: (0: disable, 1: enable) */ function setTimedSystemControlStartTimeCycle(start_cycle_settings) { var index = start_cycle_settings.index; var enable = start_cycle_settings.enable; var time = start_cycle_settings.time; var weekday = start_cycle_settings.weekday; var index_values = [1, 2, 3, 4]; if (index_values.indexOf(index) === -1) { throw new Error("start_cycle_settings._item.index must be one of " + index_values.join(", ")); } var enable_map = { 0: "disable", 1: "enable" }; var enable_values = getValues(enable_map); if (enable_values.indexOf(enable) === -1) { throw new Error("start_cycle_settings._item.enable must be one of " + enable_values.join(", ")); } var weekday_data = 0x00; var week_bits_offset = { sunday: 0, monday: 1, tuesday: 2, wednesday: 3, thursday: 4, friday: 5, saturday: 6 }; for (var key in week_bits_offset) { if (key in weekday) { if (enable_values.indexOf(weekday[key]) === -1) { throw new Error("start_cycle_settings._item.weekday." + key + " must be one of " + enable_values.join(", ")); } weekday_data |= getValue(enable_map, weekday[key]) << week_bits_offset[key]; } } var buffer = new Buffer(7); buffer.writeUInt8(0x8c); buffer.writeUInt8(0x01); // sub-command (start time) buffer.writeUInt8(index - 1); buffer.writeUInt8(getValue(enable_map, enable)); buffer.writeUInt16LE(time); buffer.writeUInt8(weekday_data); return buffer.toBytes(); } /** * Set system auto work config * @param {object} end_cycle_settings * @param {number} end_cycle_settings._item.index range: [1, 2] * @param {number} end_cycle_settings._item.enable values: (0: disable, 1: enable) * @param {number} end_cycle_settings._item.time converter: 08:30 -> 08 * 60 + 30 = 510 * @param {object} end_cycle_settings._item.weekday * @param {number} end_cycle_settings._item.weekday.sunday values: (0: disable, 1: enable) * @param {number} end_cycle_settings._item.weekday.monday values: (0: disable, 1: enable) * @param {number} end_cycle_settings._item.weekday.tuesday values: (0: disable, 1: enable) * @param {number} end_cycle_settings._item.weekday.wednesday values: (0: disable, 1: enable) * @param {number} end_cycle_settings._item.weekday.thursday values: (0: disable, 1: enable) * @param {number} end_cycle_settings._item.weekday.friday values: (0: disable, 1: enable) * @param {number} end_cycle_settings._item.weekday.saturday values: (0: disable, 1: enable) */ function setTimedSystemControlEndTimeCycle(end_cycle_settings) { var index = end_cycle_settings.index; var enable = end_cycle_settings.enable; var time = end_cycle_settings.time; var weekday = end_cycle_settings.weekday; var index_values = [1, 2, 3, 4]; if (index_values.indexOf(index) === -1) { throw new Error("end_cycle_settings._item.index must be one of " + index_values.join(", ")); } var enable_map = { 0: "disable", 1: "enable" }; var enable_values = getValues(enable_map); if (enable_values.indexOf(enable) === -1) { throw new Error("end_cycle_settings._item.enable must be one of " + enable_values.join(", ")); } var weekday_data = 0x00; var week_bits_offset = { sunday: 0, monday: 1, tuesday: 2, wednesday: 3, thursday: 4, friday: 5, saturday: 6 }; for (var key in week_bits_offset) { if (key in weekday) { if (enable_values.indexOf(weekday[key]) === -1) { throw new Error("end_cycle_settings._item.weekday." + key + " must be one of " + enable_values.join(", ")); } weekday_data |= getValue(enable_map, weekday[key]) << week_bits_offset[key]; } } var buffer = new Buffer(7); buffer.writeUInt8(0x8c); buffer.writeUInt8(0x02); // sub-command (end time) buffer.writeUInt8(index - 1); buffer.writeUInt8(getValue(enable_map, enable)); buffer.writeUInt16LE(time); buffer.writeUInt8(weekday_data); return buffer.toBytes(); } /** * Set button temporary unlocked config * @param {object} temporary_unlock_settings * @param {number} temporary_unlock_settings.system_button values: (0: disable, 1: enable) * @param {number} temporary_unlock_settings.temperature_up_button values: (0: disable, 1: enable) * @param {number} temporary_unlock_settings.temperature_down_button values: (0: disable, 1: enable) * @param {number} temporary_unlock_settings.fan_button values: (0: disable, 1: enable) * @param {number} temporary_unlock_settings.temperature_control_mode_button values: (0: disable, 1: enable) * @param {number} temporary_unlock_settings.duration unit: seconds, range: [1, 3600] * @example { "temporary_unlock_settings": { "system_button": 0, "temperature_up_button": 0, "temperature_down_button": 0, "fan_button": 0, "temperature_control_mode_button": 0, "duration": 10 } } */ function setButtonTemporaryUnlockedConfig(temporary_unlock_settings) { var duration = temporary_unlock_settings.duration; var enable_map = { 0: "disable", 1: "enable" }; var enable_values = getValues(enable_map); if (duration < 1 || duration > 3600) { throw new Error("temporary_unlock_settings.duration must be between 1 and 3600"); } var data = 0x00; var unlock_bits_offset = { system_button: 0, temperature_up_button: 1, temperature_down_button: 2, fan_button: 3, temperature_control_mode_button: 4 }; for (var key in unlock_bits_offset) { if (key in temporary_unlock_settings) { if (enable_values.indexOf(temporary_unlock_settings[key]) === -1) { throw new Error("temporary_unlock_settings." + key + " must be one of " + enable_values.join(", ")); } data |= getValue(enable_map, temporary_unlock_settings[key]) << unlock_bits_offset[key]; } } var buffer = new Buffer(4); buffer.writeUInt8(0x8d); buffer.writeUInt8(data); buffer.writeUInt16LE(duration); return buffer.toBytes(); } /** * Set temperature control with standby fan mode * @param {number} temperature_control_with_standby_fan_mode values: (0: low, 1: stop) * @example { "temperature_control_with_standby_fan_mode": 0 } */ function setTemperatureControlWithStandbyFanMode(temperature_control_with_standby_fan_mode) { var mode = { 0: "low", 1: "stop" }; var mode_values = getValues(mode); if (mode_values.indexOf(temperature_control_with_standby_fan_mode) === -1) { throw new Error("temperature_control_with_standby_fan_mode must be one of " + mode_values.join(", ")); } var buffer = new Buffer(2); buffer.writeUInt8(0x8e); buffer.writeUInt8(getValue(mode, temperature_control_with_standby_fan_mode)); return buffer.toBytes(); } /** * Set valve opening negative valve mode * @param {number} valve_opening_negative_valve_mode values: (0: low, 1: stop) * @example { "valve_opening_negative_valve_mode": 0 } */ function setValveOpeningNegativeValveMode(valve_opening_negative_valve_mode) { var mode = { 0: "low", 1: "stop" }; var mode_values = getValues(mode); if (mode_values.indexOf(valve_opening_negative_valve_mode) === -1) { throw new Error("valve_opening_negative_valve_mode must be one of " + mode_values.join(", ")); } var buffer = new Buffer(2); buffer.writeUInt8(0x8f); buffer.writeUInt8(getValue(mode, valve_opening_negative_valve_mode)); return buffer.toBytes(); } /** * Set relay change report enable * @param {number} relay_changes_report_enable values: (0: disable, 1: enable) * @example { "relay_changes_report_enable": 1 } */ function setRelayChangeReportEnable(relay_changes_report_enable) { var enable_map = { 0: "disable", 1: "enable" }; var enable_values = getValues(enable_map); if (enable_values.indexOf(relay_changes_report_enable) === -1) { throw new Error("relay_changes_report_enable must be one of " + enable_values.join(", ")); } var buffer = new Buffer(2); buffer.writeUInt8(0x90); buffer.writeUInt8(getValue(enable_map, relay_changes_report_enable)); return buffer.toBytes(); } /** * Set time zone * @param {number} time_zone unit: minute, convert: "hh:mm" -> "hh * 60 + mm", values: ( -720: UTC-12, -660: UTC-11, -600: UTC-10, -570: UTC-9:30, -540: UTC-9, -480: UTC-8, -420: UTC-7, -360: UTC-6, -300: UTC-5, -240: UTC-4, -210: UTC-3:30, -180: UTC-3, -120: UTC-2, -60: UTC-1, 0: UTC, 60: UTC+1, 120: UTC+2, 180: UTC+3, 240: UTC+4, 300: UTC+5, 360: UTC+6, 420: UTC+7, 480: UTC+8, 540: UTC+9, 570: UTC+9:30, 600: UTC+10, 660: UTC+11, 720: UTC+12, 765: UTC+12:45, 780: UTC+13, 840: UTC+14 ) * @example { "time_zone": 480 } */ function setTimeZone(time_zone) { var timezone_map = { "-720": "UTC-12", "-660": "UTC-11", "-600": "UTC-10", "-570": "UTC-9:30", "-540": "UTC-9", "-480": "UTC-8", "-420": "UTC-7", "-360": "UTC-6", "-300": "UTC-5", "-240": "UTC-4", "-210": "UTC-3:30", "-180": "UTC-3", "-120": "UTC-2", "-60": "UTC-1", 0: "UTC", 60: "UTC+1", 120: "UTC+2", 180: "UTC+3", 210: "UTC+3:30", 240: "UTC+4", 270: "UTC+4:30", 300: "UTC+5", 330: "UTC+5:30", 345: "UTC+5:45", 360: "UTC+6", 390: "UTC+6:30", 420: "UTC+7", 480: "UTC+8", 540: "UTC+9", 570: "UTC+9:30", 600: "UTC+10", 630: "UTC+10:30", 660: "UTC+11", 720: "UTC+12", 765: "UTC+12:45", 780: "UTC+13", 840: "UTC+14" }; var timezone_values = getValues(timezone_map); if (timezone_values.indexOf(time_zone) === -1) { throw new Error("time_zone must be one of " + timezone_values.join(", ")); } var buffer = new Buffer(3); buffer.writeUInt8(0xc7); buffer.writeInt16LE(getValue(timezone_map, time_zone)); return buffer.toBytes(); } /** * Set daylight saving time settings * @param {object} daylight_saving_time * @param {number} daylight_saving_time.enable values: (0: disable, 1: enable) * @param {number} daylight_saving_time.offset unit: minute * @param {number} daylight_saving_time.start_month values: (1: January, 2: February, 3: March, 4: April, 5: May, 6: June, 7: July, 8: August, 9: September, 10: October, 11: November, 12: December) * @param {number} daylight_saving_time.start_week_num values: (1: First week, 2: Second week, 3: Third week, 4: Fourth week, 5: Last week) * @param {number} daylight_saving_time.start_week_day values: (1: Monday, 2: Tuesday, 3: Wednesday, 4: Thursday, 5: Friday, 6: Saturday, 7: Sunday) * @param {number} daylight_saving_time.start_hour_min unit: minutes * @param {number} daylight_saving_time.end_month values: (1: January, 2: February, 3: March, 4: April, 5: May, 6: June, 7: July, 8: August, 9: September, 10: October, 11: November, 12: December) * @param {number} daylight_saving_time.end_week_num values: (1: First week, 2: Second week, 3: Third week, 4: Fourth week, 5: Last week) * @param {number} daylight_saving_time.end_week_day values: (1: Monday, 2: Tuesday, 3: Wednesday, 4: Thursday, 5: Friday, 6: Saturday, 7: Sunday) * @param {number} daylight_saving_time.end_hour_min unit: minute * @example { "daylight_saving_time": { "enable": 1, "offset": 60, "start_month": 3, "start_week": 1, "start_day": 1, "start_time": 0, "end_month": 11, "end_week": 4, "end_day": 7, "end_time": 120 } } */ function setDaylightSavingTimeSettings(daylight_saving_time) { var enable = daylight_saving_time.enable; var offset = daylight_saving_time.offset; var start_month = daylight_saving_time.start_month; var start_week_num = daylight_saving_time.start_week_num; var start_week_day = daylight_saving_time.start_week_day; var start_hour_min = daylight_saving_time.start_hour_min; var end_month = daylight_saving_time.end_month; var end_week_num = daylight_saving_time.end_week_num; var end_week_day = daylight_saving_time.end_week_day; var end_hour_min = daylight_saving_time.end_hour_min; var enable_map = { 0: "disable", 1: "enable" }; var enable_values = getValues(enable_map); if (enable_values.indexOf(enable) === -1) { throw new Error("daylight_saving_time.enable must be one of " + enable_values.join(", ")); } var month_values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; if (month_values.indexOf(start_month) === -1 || month_values.indexOf(end_month) === -1) { throw new Error("daylight_saving_time.start_month and end_month must be one of " + month_values.join(", ")); } var week_values = [1, 2, 3, 4, 5]; if (week_values.indexOf(start_week_num) === -1 || week_values.indexOf(end_week_num) === -1) { throw new Error("daylight_saving_time.start_week_num and end_week_num must be one of " + week_values.join(", ")); } var day_values = [1, 2, 3, 4, 5, 6, 7]; if (day_values.indexOf(start_week_day) === -1 || day_values.indexOf(end_week_day) === -1) { throw new Error("daylight_saving_time.start_week_day and end_week_day must be one of " + day_values.join(", ")); } var start_day_value = (start_week_num << 4) | start_week_day; var end_day_value = (end_week_num << 4) | end_week_day; var buffer = new Buffer(11); buffer.writeUInt8(0xc6); buffer.writeUInt8(getValue(enable_map, enable)); buffer.writeUInt8(offset); buffer.writeUInt8(start_month); buffer.writeUInt8(start_day_value); buffer.writeUInt16LE(start_hour_min); buffer.writeUInt8(end_month); buffer.writeUInt8(end_day_value); buffer.writeUInt16LE(end_hour_min); return buffer.toBytes(); } /** * Set auto provisioning enable * @param {number} auto_provisioning_enable values: (0: disable, 1: enable) * @example { "auto_provisioning_enable": { "enable": 1 } } */ function setAutoProvisioningEnable(auto_provisioning_enable) { var enable_map = { 0: "disable", 1: "enable" }; var enable_values = getValues(enable_map); if (enable_values.indexOf(auto_provisioning_enable) === -1) { throw new Error("auto_provisioning_enable must be one of " + enable_values.join(", ")); } var buffer = new Buffer(2); buffer.writeUInt8(0xc4); buffer.writeUInt8(getValue(enable_map, auto_provisioning_enable)); return buffer.toBytes(); } /** * Set history transmit config * @param {object} history_transmit_settings * @param {number} history_transmit_settings.enable values: (0: disable, 1: enable) * @param {number} history_transmit_settings.retransmission_interval unit: seconds, range: [30, 1200] * @param {number} history_transmit_settings.resend_interval unit: seconds, range: [30, 1200] * @example { "history_transmit_settings": { "enable": 1, "retransmission_interval": 60, "resend_interval": 60 } } */ function setHistoryConfig(history_transmit_settings) { var data = []; if ("enable" in history_transmit_settings) { var enable = history_transmit_settings.enable; var enable_map = { 0: "disable", 1: "enable" }; var enable_values = getValues(enable_map); if (enable_values.indexOf(enable) === -1) { throw new Error("history_transmit_settings.enable must be one of " + enable_values.join(", ")); } var buffer = new Buffer(3); buffer.writeUInt8(0xc5); buffer.writeUInt8(0x00); buffer.writeUInt8(getValue(enable_map, enable)); data = data.concat(buffer.toBytes()); } if ("retransmission_interval" in history_transmit_settings) { var retransmission_interval = history_transmit_settings.retransmission_interval; if (retransmission_interval < 30 || retransmission_interval > 1200) { throw new Error("history_transmit_settings.retransmission_interval must be between 30 and 1200"); } var buffer = new Buffer(4); buffer.writeUInt8(0xc5); buffer.writeUInt8(0x01); buffer.writeUInt16LE(retransmission_interval); data = data.concat(buffer.toBytes()); } if ("resend_interval" in history_transmit_settings) { var resend_interval = history_transmit_settings.resend_interval; if (resend_interval < 30 || resend_interval > 1200) { throw new Error("history_transmit_settings.resend_interval must be between 30 and 1200"); } var buffer = new Buffer(4); buffer.writeUInt8(0xc5); buffer.writeUInt8(0x02); buffer.writeUInt16LE(resend_interval); data = data.concat(buffer.toBytes()); } return data; } /** * Reboot * @example { "reboot": 1 } */ function reboot() { var buffer = new Buffer(1); buffer.writeUInt8(0xbe); return buffer.toBytes(); } /** * Synchronize time * @example { "synchronize_time": 1 } */ function synchronizeTime() { var buffer = new Buffer(1); buffer.writeUInt8(0xb8); return buffer.toBytes(); } /** * Query device status * @example { "query_device_status": 1 } */ function queryDeviceStatus() { var buffer = new Buffer(1); buffer.writeUInt8(0xb9); return buffer.toBytes(); } /** * Reconnect * @example { "reconnect": 1 } */ function reconnect() { var buffer = new Buffer(1); buffer.writeUInt8(0xb6); return buffer.toBytes(); } /** * Clear history * @example { "clear_history": 1 } */ function clearHistory() { var buffer = new Buffer(1); buffer.writeUInt8(0xbd); return buffer.toBytes(); } /** * Fetch history * @example { "fetch_history": 1 } */ function fetchHistory(fetch_history) { var start_time = fetch_history.start_time; var end_time = fetch_history.end_time; var start_time = fetch_history.start_time; if ("end_time" in fetch_history) { var end_time = fetch_history.end_time; var buffer = new Buffer(9); buffer.writeUInt8(0xbb); buffer.writeUInt32LE(start_time); buffer.writeUInt32LE(end_time); return buffer.toBytes(); } else { var buffer = new Buffer(5); buffer.writeUInt8(0xba); buffer.writeUInt32LE(start_time); return buffer.toBytes(); } } /** * Stop transmit history * @example { "stop_transmit_history": 1 } */ function stopTransmitHistory() { var buffer = new Buffer(1); buffer.writeUInt8(0xbc); return buffer.toBytes(); } /** * Set temperature * @param {number} temperature unit: °C, range: [-20, 60] * @example { "temperature": 25 } */ function setTemperature(temperature) { var buffer = new Buffer(3); buffer.writeUInt8(0x5b); buffer.writeInt16LE(temperature * 100); return buffer.toBytes(); } /** * Set humidity * @param {number} humidity unit: %, range: [0, 100] * @example { "humidity": 50 } */ function setHumidity(humidity) { var buffer = new Buffer(3); buffer.writeUInt8(0x5c); buffer.writeInt16LE(humidity * 10); return buffer.toBytes(); } /** * Set opening window status * @param {number} opening_window_alarm values: (0: release, 1: trigger) * @example { "opening_window_alarm": 1 } */ function setOpeningWindowStatus(opening_window_alarm) { var alarm_map = { 0: "release", 1: "trigger" }; var alarm_values = getValues(alarm_map); if (alarm_values.indexOf(opening_window_alarm) === -1) { throw new Error("opening_window_alarm must be one of " + alarm_values.join(", ")); } var buffer = new Buffer(2); buffer.writeUInt8(0x5d); buffer.writeUInt8(getValue(alarm_map, opening_window_alarm)); return buffer.toBytes(); } /** * Set plan * @param {number} insert_plan_id, range: [1, 16] * @example { "plan": 1 } */ function setPlan(insert_plan_id) { if (insert_plan_id < 1 || insert_plan_id > 16) { throw new Error("insert_plan_id must be between 1 and 16"); } var buffer = new Buffer(2); buffer.writeUInt8(0x5e); buffer.writeUInt8(insert_plan_id - 1); return buffer.toBytes(); } /** * Clear plan * @param {object} clear_plan * @param {number} clear_plan.plan_1 values: (0: no, 1: yes) * @param {number} clear_plan.plan_2 values: (0: no, 1: yes) * @param {number} clear_plan.plan_3 values: (0: no, 1: yes) * @param {number} clear_plan.plan_4 values: (0: no, 1: yes) * @param {number} clear_plan.plan_5 values: (0: no, 1: yes) * @param {number} clear_plan.plan_6 values: (0: no, 1: yes) * @param {number} clear_plan.plan_7 values: (0: no, 1: yes) * @param {number} clear_plan.plan_8 values: (0: no, 1: yes) * @param {number} clear_plan.plan_9 values: (0: no, 1: yes) * @param {number} clear_plan.plan_10 values: (0: no, 1: yes) * @param {number} clear_plan.plan_11 values: (0: no, 1: yes) * @param {number} clear_plan.plan_12 values: (0: no, 1: yes) * @param {number} clear_plan.plan_13 values: (0: no, 1: yes) * @param {number} clear_plan.plan_14 values: (0: no, 1: yes) * @param {number} clear_plan.plan_15 values: (0: no, 1: yes) * @param {number} clear_plan.plan_16 values: (0: no, 1: yes) * @param {number} clear_plan.all values: (0: no, 1: yes) * @example { "clear_plan": { "plan_1": 1, "plan_2": 1, "plan_3": 1, "plan_4": 1, "plan_5": 1, "plan_6": 1, "plan_7": 1, "plan_8": 1, "plan_9": 1, "plan_10": 1 } } */ function clearPlan(clear_plan) { var plan_index_map = { plan_1: 0, plan_2: 1, plan_3: 2, plan_4: 3, plan_5: 4, plan_6: 5, plan_7: 6, plan_8: 7, plan_9: 8, plan_10: 9, plan_11: 10, plan_12: 11, plan_13: 12, plan_14: 13, plan_15: 14, plan_16: 15, all: 255 }; var yes_no_map = { 0: "no", 1: "yes" }; var yes_no_values = getValues(yes_no_map); var data = []; for (var key in plan_index_map) { if (key in clear_plan) { if (yes_no_values.indexOf(clear_plan[key]) === -1) { throw new Error("clear_plan." + key + " must be one of " + yes_no_values.join(", ")); } var buffer = new Buffer(2); buffer.writeUInt8(0x5f); buffer.writeUInt8(plan_index_map[key]); data = data.concat(buffer.toBytes()); } } return data; } function setQueryCmd(bytes) { var name_map = { "60": { level: 1, name: "collection_interval" }, "62": { level: 1, name: "reporting_interval" }, "63": { level: 1, name: "temperature_unit" }, "64": { level: 1, name: "support_mode" }, "65": { level: 1, name: "intelligent_display_enable" }, "66": { level: 1, name: "screen_object_settings" }, "67": { level: 1, name: "system_status" }, "68": { level: 1, name: "temperature_control_mode" }, "69": { level: 1, name: "target_temperature_resolution" }, "6a": { level: 1, name: "target_temperature_tolerance" }, "6b": { level: 1, name: "heating_target_temperature" }, "6c": { level: 1, name: "cooling_target_temperature" }, "6d": { level: 1, name: "heating_target_temperature_range" }, "6e": { level: 1, name: "cooling_target_temperature_range" }, "6f": { level: 1, name: "dehumidify_config" }, "70": { level: 1, name: "target_humidity_range" }, "72": { level: 1, name: "fan_mode" }, "73": { level: 1, name: "fan_speed_config" }, "74": { level: 1, name: "fan_delay_config" }, "75": { level: 1, name: "child_lock_settings" }, "76": { level: 1, name: "temperature_alarm_settings" }, "77": { level: 1, name: "high_temperature_alarm_settings" }, "78": { level: 1, name: "low_temperature_alarm_settings" }, "79": { level: 1, name: "temperature_calibration_settings" }, "7a": { level: 1, name: "humidity_calibration_settings" }, "7b": { level: 3, name: "plan_config" }, "7c": { level: 1, name: "valve_interface_settings" }, "80": { level: 1, name: "di_setting_enable" }, "81": { level: 1, name: "di_settings" }, "82": { level: 1, name: "window_opening_detection_enable" }, "83": { level: 1, name: "window_opening_detection_settings" }, "84": { level: 1, name: "freeze_protection_settings" }, "85": { level: 1, name: "temperature_source_settings" }, "86": { level: 1, name: "d2d_pairing_enable" }, "87": { level: 3, name: "d2d_pairing_settings" }, "88": { level: 1, name: "d2d_master_enable" }, "89": { level: 2, name: "d2d_master_settings" }, "8a": { level: 1, name: "d2d_slave_enable" }, "8b": { level: 2, name: "d2d_slave_settings" }, "8c": { level: 3, name: "timed_system_control_settings" }, "8d": { level: 1, name: "temporary_unlock_settings" }, "8e": { level: 1, name: "temperature_control_with_standby_fan_mode" }, "8f": { level: 1, name: "valve_opening_negative_valve_mode" }, "90": { level: 1, name: "relay_changes_report_enable" }, "c4": { level: 1, name: "auto_provisioning_enable" }, "c5": { level: 1, name: "history_transmit_settings" }, "c6": { level: 1, name: "daylight_saving_time" }, "c7": { level: 1, name: "time_zone" }, "b6": { level: 0, name: "reconnect" }, "b8": { level: 0, name: "synchronize_time" }, "b9": { level: 0, name: "query_device_status" }, "ba": { level: 0, name: "fetch_history" }, "bb": { level: 0, name: "fetch_history" }, "bc": { level: 0, name: "stop_transmit_history" }, "bd": { level: 0, name: "clear_history" }, "be": { level: 0, name: "reboot" }, "5b": { level: 0, name: "temperature" }, "5c": { level: 0, name: "humidity" }, "5d": { level: 0, name: "opening_window_alarm" }, "5e": { level: 0, name: "insert_plan_id" }, "5f": { level: 0, name: "clear_plan" }, }; var cmd = readHexString(bytes.slice(0, 1)); var cmd_level = name_map[cmd].level; if (cmd_level != 0) { var buffer = new Buffer(2 + cmd_level); buffer.writeUInt8(0xef); buffer.writeUInt8(cmd_level); buffer.writeBytes(bytes.slice(0, cmd_level)); return buffer.toBytes(); } return []; } function getValues(map) { var values = []; for (var key in map) { values.push(RAW_VALUE ? parseInt(key) : map[key]); } return values; } function getValue(map, value) { if (RAW_VALUE) return value; for (var key in map) { if (map[key] === value) { return parseInt(key); } } throw new Error("not match in " + JSON.stringify(map)); } function Buffer(size) { this.buffer = new Array(size); this.offset = 0; for (var i = 0; i < size; i++) { this.buffer[i] = 0; } } Buffer.prototype._write = function (value, byteLength, isLittleEndian) { var offset = 0; for (var index = 0; index < byteLength; index++) { offset = isLittleEndian ? index << 3 : (byteLength - 1 - index) << 3; this.buffer[this.offset + index] = (value >> offset) & 0xff; } }; Buffer.prototype.writeUInt8 = function (value) { this._write(value, 1, true); this.offset += 1; }; Buffer.prototype.writeInt8 = function (value) { this._write(value < 0 ? value + 0x100 : value, 1, true); this.offset += 1; }; Buffer.prototype.writeUInt16LE = function (value) { this._write(value, 2, true); this.offset += 2; }; Buffer.prototype.writeInt16LE = function (value) { this._write(value < 0 ? value + 0x10000 : value, 2, true); this.offset += 2; }; Buffer.prototype.writeUInt32LE = function (value) { this._write(value, 4, true); this.offset += 4; }; Buffer.prototype.writeInt32LE = function (value) { this._write(value < 0 ? value + 0x100000000 : value, 4, true); this.offset += 4; }; Buffer.prototype.writeBytes = function (bytes) { for (var i = 0; i < bytes.length; i++) { this.buffer[this.offset + i] = bytes[i]; } this.offset += bytes.length; }; Buffer.prototype.writeHexString = function (hexString) { var bytes = []; for (var i = 0; i < hexString.length; i += 2) { bytes.push(parseInt(hexString.substr(i, 2), 16)); } this.writeBytes(bytes); }; Buffer.prototype.writeHexStringReverse = function (hexString) { var bytes = []; for (var i = hexString.length - 2; i >= 0; i -= 2) { bytes.push(parseInt(hexString.substr(i, 2), 16)); } this.writeBytes(bytes); }; Buffer.prototype.toBytes = function () { return this.buffer; }; function encodeUtf8(str) { var byteArray = []; for (var i = 0; i < str.length; i++) { var charCode = str.charCodeAt(i); if (charCode < 0x80) { byteArray.push(charCode); } else if (charCode < 0x800) { byteArray.push(0xc0 | (charCode >> 6)); byteArray.push(0x80 | (charCode & 0x3f)); } else if (charCode < 0x10000) { byteArray.push(0xe0 | (charCode >> 12)); byteArray.push(0x80 | ((charCode >> 6) & 0x3f)); byteArray.push(0x80 | (charCode & 0x3f)); } else if (charCode < 0x200000) { byteArray.push(0xf0 | (charCode >> 18)); byteArray.push(0x80 | ((charCode >> 12) & 0x3f)); byteArray.push(0x80 | ((charCode >> 6) & 0x3f)); byteArray.push(0x80 | (charCode & 0x3f)); } } return byteArray; } function readHexString(bytes) { var temp = []; for (var idx = 0; idx < bytes.length; idx++) { temp.push(("0" + (bytes[idx] & 0xff).toString(16)).slice(-2)); } return temp.join(""); } 

This codec is sourced from Milesight-IoT. All rights belong to Milesight-IoT.

This codec is licensed under the GNU General Public License v3 (GPL v3). Modifications, if any, are clearly marked. You are free to use, modify, and distribute the codec under the terms of GPL v3.

Community Feedback