diff --git a/CHANGELOG.md b/CHANGELOG.md index 3da2c8eb8489..5ae28118d6bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,23 @@ +## 13.10.1 (2024-10-25) +### Bugfixes +* Correct unit of Meter CC values (#7322) +* Bootloader mode is now detected even when short chunks of data are received (#7318) +* Corrected the wording of idle/busy queue logging (#7309) + +### Config file changes +* Add Heatit Z-TEMP3 (#7179) +* Add new parameters 17 and 18 for HeatIt TF016_TF021 FW 1.92 (#7287) +* Disable Supervision for Heatit TF021 (#7321) +* Add ZVIDAR WB04V Smartwings Day Night Shades (#7319) +* Add ZVIDAR WM25L Smartwings Smart Motor (#7312) +* Add ZVIDAR ZW881 Multi-Protocol Gateway (#7311) +* Add include, exclude, and wakeup instructions for VCZ1 (#7307) +* Add new Product ID to Namron 16A Switch (#7301) +* Add Minoston MP24Z 800LR Outdoor Smart Plug - 2 Outlet (#7302) + ## 13.10.0 (2024-10-24) ### Features * `mock-server` now supports putting the simulated controller into add and remove mode (#7314) diff --git a/package.json b/package.json index 0bfdf1376cf1..6f17577c60a9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@zwave-js/repo", - "version": "13.10.0", + "version": "13.10.1", "private": true, "description": "Z-Wave driver written entirely in JavaScript/TypeScript", "keywords": [], diff --git a/packages/cc/package.json b/packages/cc/package.json index fbc1e86e256a..65e1759e34c9 100644 --- a/packages/cc/package.json +++ b/packages/cc/package.json @@ -1,6 +1,6 @@ { "name": "@zwave-js/cc", - "version": "13.9.1", + "version": "13.10.1", "description": "zwave-js: Command Classes", "keywords": [], "publishConfig": { diff --git a/packages/cc/src/cc/MeterCC.ts b/packages/cc/src/cc/MeterCC.ts index 685aab8df739..b897946b8a7a 100644 --- a/packages/cc/src/cc/MeterCC.ts +++ b/packages/cc/src/cc/MeterCC.ts @@ -1026,7 +1026,7 @@ export class MeterCCReport extends MeterCC { this.setMetadata(ctx, valueValue, { ...valueValue.meta, label: getValueLabel(this.type, this.scale, this.rateType), - unit: scale.label, + unit: scale.unit, ccSpecific: { meterType: this.type, scale: this.scale, diff --git a/packages/config/config/devices/0x019b/tf016_tf021.json b/packages/config/config/devices/0x019b/tf016_tf021.json index 88137f08e1d4..38311397c68a 100644 --- a/packages/config/config/devices/0x019b/tf016_tf021.json +++ b/packages/config/config/devices/0x019b/tf016_tf021.json @@ -223,11 +223,45 @@ "minValue": 50, "maxValue": 400, "defaultValue": 210 + }, + { + "#": "17", + "$if": "firmwareVersion >= 1.92", + "label": "Temperature Report Interval", + "valueSize": 2, + "unit": "10 seconds", + "minValue": 0, + "maxValue": 8640, + "defaultValue": 6, + "options": [ + { + "label": "Disable", + "value": 0 + } + ] + }, + { + "#": "18", + "$if": "firmwareVersion >= 1.92", + "label": "Temperature Report Change Threshold", + "valueSize": 1, + "unit": "0.1 °C", + "minValue": 1, + "maxValue": 100, + "defaultValue": 10 } ], "compat": { // The device reports its relay state via the Basic CC - "mapBasicReport": false + "mapBasicReport": false, + // Supervision reports are sent from the root device instead of endpoints + "commandClasses": { + "remove": { + "Supervision": { + "endpoints": "*" + } + } + } }, "metadata": { "inclusion": "To include the thermostat to your home automation gateway, press Center (confirm) for 10 seconds.\nThe display will show OFF. Press Right (down) 4 times till you see Con in the display.\nNow start adding the device in your home automation software. Start inclusion mode by pressing Center (confirm) for approximately 2 seconds. The inclusion/exclusion icon will appear in the display. Confirmation will show Inc/EcL in the display. If inclusion fails, Err (error) will appear.\nLeave programming mode by choosing ESC in menu. Your thermostat is ready for use with default settings", diff --git a/packages/config/config/devices/0x019b/z-temp3.json b/packages/config/config/devices/0x019b/z-temp3.json new file mode 100644 index 000000000000..fd51e915f81c --- /dev/null +++ b/packages/config/config/devices/0x019b/z-temp3.json @@ -0,0 +1,242 @@ +{ + "manufacturer": "Heatit", + "manufacturerId": "0x019b", + "label": "Z-TEMP3", + "description": "Thermostat", + "devices": [ + { + "productType": "0x0031", + "productId": "0x3101", + "zwaveAllianceId": 4908 + } + ], + "firmwareVersion": { + "min": "0.0", + "max": "255.255" + }, + "associations": { + "1": { + "label": "Lifeline", + "maxNodes": 1, + "isLifeline": true + }, + "2": { + "label": "Binary Switch Set", + "maxNodes": 10 + }, + "3": { + "label": "Thermostat Setpoint Set", + "maxNodes": 10 + }, + "4": { + "label": "Thermostat Mode Set", + "maxNodes": 10 + } + }, + "paramInformation": [ + { + "#": "1", + "$import": "~/templates/master_template.json#base_enable_disable_inverted", + "label": "Local Control", + "defaultValue": 0 + }, + { + "#": "2", + "label": "Min Temp Limit", + "valueSize": 2, + "unit": "0.1 °C", + "minValue": 50, + "maxValue": 400, + "defaultValue": 50 + }, + { + "#": "3", + "label": "Max Temp Limit", + "valueSize": 2, + "unit": "0.1 °C", + "minValue": 50, + "maxValue": 400, + "defaultValue": 400 + }, + { + "#": "4", + "label": "Temp Sensor Calibration", + "valueSize": 1, + "unit": "0.1 °C", + "minValue": -60, + "maxValue": 60, + "defaultValue": 0, + "unsigned": false + }, + { + "#": "5", + "label": "Regulation Mode", + "valueSize": 1, + "defaultValue": 0, + "allowManualEntry": false, + "options": [ + { + "label": "Hysteresis", + "value": 0 + }, + { + "label": "PWM", + "value": 1 + } + ] + }, + { + "#": "6", + "label": "Update Interval", + "description": "Allowable range: 0, 150-2000", + "valueSize": 2, + "unit": "seconds", + "minValue": 0, + "maxValue": 65535, + "defaultValue": 3600, + "unsigned": true, + "options": [ + { + "label": "Only on change", + "value": 0 + } + ] + }, + { + "#": "7", + "label": "Temperature Control Hysteresis", + "valueSize": 1, + "unit": "0.1 °C", + "minValue": 3, + "maxValue": 30, + "defaultValue": 5 + }, + { + "#": "8", + "label": "Temperature Display", + "valueSize": 1, + "defaultValue": 0, + "allowManualEntry": false, + "options": [ + { + "label": "Setpoint", + "value": 0 + }, + { + "label": "Measured", + "value": 1 + } + ] + }, + { + "#": "9", + "label": "Active Display Brightness", + "valueSize": 1, + "unit": "10 %", + "minValue": 1, + "maxValue": 10, + "defaultValue": 10 + }, + { + "#": "10", + "label": "Temperature Report Interval", + "valueSize": 2, + "unit": "seconds", + "minValue": 150, + "maxValue": 65535, + "defaultValue": 990, + "unsigned": true + }, + { + "#": "11", + "label": "Temperature Report Hysteresis", + "valueSize": 1, + "unit": "0.1 °C", + "minValue": 1, + "maxValue": 100, + "defaultValue": 10 + }, + { + "#": "12", + "label": "Humidity Report Interval", + "valueSize": 2, + "unit": "seconds", + "minValue": 150, + "maxValue": 65535, + "defaultValue": 990, + "unsigned": true + }, + { + "#": "13", + "label": "Humidity Report Hysteresis", + "valueSize": 1, + "unit": "%", + "minValue": 1, + "maxValue": 100, + "defaultValue": 25 + }, + { + "#": "14", + "label": "Heating Setpoint", + "valueSize": 2, + "unit": "0.1 °C", + "minValue": 50, + "maxValue": 400, + "defaultValue": 210 + }, + { + "#": "15", + "label": "Cooling Setpoint", + "valueSize": 2, + "unit": "0.1 °C", + "minValue": 50, + "maxValue": 400, + "defaultValue": 250 + }, + { + "#": "16", + "label": "Eco Setpoint", + "valueSize": 2, + "unit": "0.1 °C", + "minValue": 50, + "maxValue": 400, + "defaultValue": 180 + }, + { + "#": "17", + "label": "Operating Mode", + "valueSize": 1, + "defaultValue": 1, + "allowManualEntry": false, + "options": [ + { + "label": "Off", + "value": 0 + }, + { + "label": "Heating", + "value": 1 + }, + { + "label": "Cooling", + "value": 2 + }, + { + "label": "Eco", + "value": 3 + } + ] + }, + { + "#": "18", + "$import": "~/templates/master_template.json#base_enable_disable", + "label": "Open Window Detection" + } + ], + "metadata": { + "inclusion": "Hold the Center button for 5 seconds. The display will show “OFF”\n Press the ”+” button once to see “CON” in the display.\n Start the add/remove device process in your primary controller.\n Start the configuration mode on the thermostat by holding the Center button for approximately 2 seconds.", + "exclusion": "Hold the Center button for 5 seconds. The display will show “OFF”\n Press the ”+” button once to see “CON” in the display.\n Start the add/remove device process in your primary controller.\n Start the configuration mode on the thermostat by holding the Center button for approximately 2 seconds.", + "reset": "Enter the menu by holding the Center button for about 5seconds, navigate in the menu with the ”+” button til you see FACT. Press the Center button until you see “-- --” blinking in the display, then hold for about 5 seconds to perform a reset. You may also initiate a reset by holding the Right and Center buttons for 55 seconds.", + "manual": "https://media.heatit.com/3872" + } +} diff --git a/packages/config/config/devices/0x026e/vcz1.json b/packages/config/config/devices/0x026e/vcz1.json index dd0c5051b83e..2af85c40477f 100644 --- a/packages/config/config/devices/0x026e/vcz1.json +++ b/packages/config/config/devices/0x026e/vcz1.json @@ -15,7 +15,10 @@ "max": "255.255" }, "metadata": { - "reset": "Press and hold the button on the control for approximately 15 seconds (the LED will stop flashing when complete.\n\n\"Please use this procedure only when the network primary controller is missing or otherwise inoperable.\"", + "inclusion": "Press and hold the programming button until the LED light bar begins to flash green then release the button.", + "exclusion": "Press and hold the programming button until the LED light bar begins to flash green then release the button.", + "reset": "Press and hold the programming button until the LEDs stop blinking. LEDs will blink green, amber, red, and then finally turn off (about 15 seconds). Local Reset must be performed on both the controllers and motors and should only be used if the primary controller is no longer available.", + "wakeup": "Press and release the programming button one time.", "manual": "https://products.z-wavealliance.org/ProductManual/File?folder=&filename=MarketCertificationFiles/1786/Graber%20Virtual%20Cord%20Owner's%20Manual.pdf" }, "compat": { diff --git a/packages/config/config/devices/0x0312/mp24z_800.json b/packages/config/config/devices/0x0312/mp24z_800.json new file mode 100644 index 000000000000..ebbd3152137b --- /dev/null +++ b/packages/config/config/devices/0x0312/mp24z_800.json @@ -0,0 +1,51 @@ +{ + "manufacturer": "Minoston", + "manufacturerId": "0x0312", + "label": "MP24Z", + "description": "Outdoor Smart Plug - 2 Outlet (800S)", + "devices": [ + { + "productType": "0xff01", + "productId": "0xff97", + "zwaveAllianceId": 3719 + } + ], + "firmwareVersion": { + "min": "0.0", + "max": "255.255" + }, + "paramInformation": [ + { + "#": "1", + "$import": "~/templates/master_template.json#led_indicator_three_options_inverted" + }, + { + "#": "2", + "$import": "templates/minoston_template.json#auto_off_timer", + "label": "Outlet 1 (Left): Auto Off Timer" + }, + { + "#": "3", + "$import": "templates/minoston_template.json#auto_off_timer", + "label": "Outlet 2 (Right): Auto Off Timer" + }, + { + "#": "4", + "$import": "templates/minoston_template.json#auto_on_timer", + "label": "Outlet 1 (Left): Auto On Timer" + }, + { + "#": "5", + "$import": "templates/minoston_template.json#auto_on_timer", + "label": "Outlet 2 (Right): Auto On Timer" + }, + { + "#": "6", + "$import": "~/templates/master_template.json#state_after_power_failure_off_on_prev" + }, + { + "#": "7", + "$import": "templates/minoston_template.json#led_indicator_brightness" + } + ] +} diff --git a/packages/config/config/devices/0x0438/4512746.json b/packages/config/config/devices/0x0438/4512746.json index 7ce830056195..bdbc8560818a 100644 --- a/packages/config/config/devices/0x0438/4512746.json +++ b/packages/config/config/devices/0x0438/4512746.json @@ -7,6 +7,10 @@ { "productType": "0x0004", "productId": "0xd019" + }, + { + "productType": "0x0200", + "productId": "0xd006" } ], "firmwareVersion": { diff --git a/packages/config/config/devices/0x045a/WB04V.json b/packages/config/config/devices/0x045a/WB04V.json new file mode 100644 index 000000000000..a90d4633ed0f --- /dev/null +++ b/packages/config/config/devices/0x045a/WB04V.json @@ -0,0 +1,348 @@ +{ + "manufacturer": "ZVIDAR", + "manufacturerId": "0x045a", + "label": "WB04V", + "description": "Smartwings Day Night Shades", + "devices": [ + { + "productType": "0x0004", + "productId": "0x0509" + } + ], + "firmwareVersion": { + "min": "0.0", + "max": "255.255" + }, + "associations": { + "1": { + "label": "Lifeline", + "maxNodes": 5, + "isLifeline": true + }, + "2": { + "label": "On/Off Control: EP1", + "maxNodes": 5 + }, + "3": { + "label": "Multilevel Set: EP1", + "maxNodes": 5 + }, + "4": { + "label": "Multilevel Start/Stop: EP1", + "maxNodes": 5 + }, + "5": { + "label": "On/Off Control: EP2", + "maxNodes": 5 + }, + "6": { + "label": "Multilevel Set: EP2", + "maxNodes": 5 + }, + "7": { + "label": "Multilevel Start/Stop: EP2", + "maxNodes": 5 + } + }, + "paramInformation": [ + { + "#": "1", + "label": "Motor 1: Set Direction", + "valueSize": 1, + "defaultValue": 1, + "allowManualEntry": false, + "options": [ + { + "label": "Forward", + "value": 1 + }, + { + "label": "Reverse", + "value": 2 + } + ] + }, + { + "#": "2", + "label": "Motor 2: Set Direction", + "valueSize": 1, + "defaultValue": 1, + "allowManualEntry": false, + "options": [ + { + "label": "Forward", + "value": 1 + }, + { + "label": "Reverse", + "value": 2 + } + ] + }, + { + "#": "3", + "label": "Motor 1: Set Status", + "valueSize": 1, + "defaultValue": 3, + "allowManualEntry": false, + "options": [ + { + "label": "Open (Up)", + "value": 1 + }, + { + "label": "Close (Down)", + "value": 2 + }, + { + "label": "Stop", + "value": 3 + } + ] + }, + { + "#": "4", + "label": "Motor 2: Set Status", + "valueSize": 1, + "defaultValue": 3, + "allowManualEntry": false, + "options": [ + { + "label": "Open (Up)", + "value": 1 + }, + { + "label": "Close (Down)", + "value": 2 + }, + { + "label": "Stop", + "value": 3 + } + ] + }, + { + "#": "5", + "label": "Motor 1: Set Travel Point", + "valueSize": 1, + "defaultValue": 1, + "allowManualEntry": false, + "options": [ + { + "label": "Up travel point", + "value": 1 + }, + { + "label": "Down travel point", + "value": 2 + }, + { + "label": "Third travel point", + "value": 3 + } + ] + }, + { + "#": "6", + "label": "Motor 2: Set Travel Point", + "valueSize": 1, + "defaultValue": 1, + "allowManualEntry": false, + "options": [ + { + "label": "Up travel point", + "value": 1 + }, + { + "label": "Down travel point", + "value": 2 + }, + { + "label": "Third travel point", + "value": 3 + } + ] + }, + { + "#": "7", + "label": "Motor 1: Run Travel Point", + "valueSize": 1, + "defaultValue": 1, + "allowManualEntry": false, + "options": [ + { + "label": "Up travel point", + "value": 1 + }, + { + "label": "Down travel point", + "value": 2 + }, + { + "label": "Third travel point", + "value": 3 + } + ] + }, + { + "#": "8", + "label": "Motor 2: Run Travel Point", + "valueSize": 1, + "defaultValue": 1, + "allowManualEntry": false, + "options": [ + { + "label": "Up travel point", + "value": 1 + }, + { + "label": "Down travel point", + "value": 2 + }, + { + "label": "Third travel point", + "value": 3 + } + ] + }, + { + "#": "9", + "label": "Motor 1: Delete Travel Point", + "valueSize": 1, + "defaultValue": 0, + "allowManualEntry": false, + "options": [ + { + "label": "Delete all travel", + "value": 0 + }, + { + "label": "Delete up travel", + "value": 1 + }, + { + "label": "Delete down travel", + "value": 2 + }, + { + "label": "Delete third travel", + "value": 3 + } + ] + }, + { + "#": "10", + "label": "Motor 2: Delete Travel Point", + "valueSize": 1, + "defaultValue": 0, + "allowManualEntry": false, + "options": [ + { + "label": "Delete all travel", + "value": 0 + }, + { + "label": "Delete up travel", + "value": 1 + }, + { + "label": "Delete down travel", + "value": 2 + }, + { + "label": "Delete third travel", + "value": 3 + } + ] + }, + { + "#": "11", + "label": "Motor 1: Set Moving Way", + "valueSize": 1, + "minValue": 0, + "maxValue": 19, + "defaultValue": 0 + }, + { + "#": "12", + "label": "Motor 2: Set Moving Way", + "valueSize": 1, + "minValue": 0, + "maxValue": 19, + "defaultValue": 0 + }, + { + "#": "13", + "label": "Low Battery Level Alarm Threshold", + "valueSize": 1, + "unit": "%", + "minValue": 0, + "maxValue": 50, + "defaultValue": 10 + }, + { + "#": "14", + "label": "Battery Auto Report Interval Time", + "valueSize": 4, + "unit": "seconds", + "minValue": 0, + "maxValue": 2678400, + "defaultValue": 3600 + }, + { + "#": "15", + "label": "Battery Change Report Threshold", + "valueSize": 1, + "unit": "%", + "minValue": 0, + "maxValue": 50, + "defaultValue": 5 + }, + { + "#": "16", + "label": "Curtain Status Report Command Setting", + "valueSize": 1, + "defaultValue": 6, + "allowManualEntry": false, + "options": [ + { + "label": "Send nothing", + "value": 0 + }, + { + "label": "Send Basic Report", + "value": 1 + }, + { + "label": "Send Multilevel Switch Report", + "value": 2 + }, + { + "label": "Send Window Covering Report", + "value": 3 + }, + { + "label": "Send Basic Report and Multilevel Switch Report", + "value": 4 + }, + { + "label": "Send Basic Report and Window Covering Report", + "value": 5 + }, + { + "label": "Send Multilevel Switch Report and Window Covering Report", + "value": 6 + }, + { + "label": "Send Basic Report and Multilevel Switch Report and Window Covering Report", + "value": 7 + } + ] + } + ], + "metadata": { + "inclusion": "Follow the user guide of hub to enter inclusion mode.\nPress and hold the Config Button more than 6s, enter Include Mode", + "exclusion": "Follow the user guide of hub to enter exclusion mode.\nPress and hold the Config Button more than 6s, enter Exclusion Mode", + "reset": "Press and hold the Config Button more than 10s. The Curtain will reset itself to factory default by sending a Device Reset Locally Notification to gateway when the button is released.\nNote: Please use this procedure only when the network primary controller is missing or otherwise inoperable" + } +} diff --git a/packages/config/config/devices/0x045a/WM25L.json b/packages/config/config/devices/0x045a/WM25L.json new file mode 100644 index 000000000000..d3c1422014c2 --- /dev/null +++ b/packages/config/config/devices/0x045a/WM25L.json @@ -0,0 +1,245 @@ +{ + "manufacturer": "ZVIDAR", + "manufacturerId": "0x045a", + "label": "WM25L", + "description": "Smartwings Smart Motor", + "devices": [ + { + "productType": "0x0004", + "productId": "0x050b" + } + ], + "firmwareVersion": { + "min": "0.0", + "max": "255.255" + }, + "associations": { + "1": { + "label": "Lifeline", + "maxNodes": 5, + "isLifeline": true + }, + "2": { + "label": "On/Off Control", + "maxNodes": 5 + }, + "3": { + "label": "Multilevel Set", + "maxNodes": 5 + }, + "4": { + "label": "Multilevel Start/Stop", + "maxNodes": 5 + } + }, + "paramInformation": [ + { + "#": "1", + "label": "Enable Manual Pull-Start", + "valueSize": 1, + "defaultValue": 1, + "allowManualEntry": false, + "options": [ + { + "label": "Close", + "value": 0 + }, + { + "label": "Open", + "value": 1 + } + ] + }, + { + "#": "2", + "label": "Set Motor Direction", + "valueSize": 1, + "defaultValue": 1, + "allowManualEntry": false, + "options": [ + { + "label": "Forward", + "value": 1 + }, + { + "label": "Reverse", + "value": 2 + } + ] + }, + { + "#": "3", + "label": "Manually Set Open Borders", + "valueSize": 1, + "defaultValue": 0, + "allowManualEntry": false, + "options": [ + { + "label": "Cancel", + "value": 0 + }, + { + "label": "Start", + "value": 1 + } + ] + }, + { + "#": "4", + "label": "Manually Set Close Borders", + "valueSize": 1, + "defaultValue": 0, + "allowManualEntry": false, + "options": [ + { + "label": "Cancel", + "value": 0 + }, + { + "label": "Start", + "value": 1 + } + ] + }, + { + "#": "5", + "label": "Set Motor Status", + "valueSize": 1, + "defaultValue": 3, + "allowManualEntry": false, + "options": [ + { + "label": "Open (Up)", + "value": 1 + }, + { + "label": "Close (Down)", + "value": 2 + }, + { + "label": "Stop", + "value": 3 + } + ] + }, + { + "#": "6", + "label": "Calibrate Travel Point", + "valueSize": 1, + "defaultValue": 1, + "allowManualEntry": false, + "options": [ + { + "label": "Up travel point", + "value": 1 + }, + { + "label": "Down travel point", + "value": 2 + }, + { + "label": "Third travel point", + "value": 3 + } + ] + }, + { + "#": "7", + "label": "Delete Travel Point", + "valueSize": 1, + "defaultValue": 0, + "allowManualEntry": false, + "options": [ + { + "label": "Delete all travel", + "value": 0 + }, + { + "label": "Delete up travel", + "value": 1 + }, + { + "label": "Delete down travel", + "value": 2 + }, + { + "label": "Delete third travel", + "value": 3 + } + ] + }, + { + "#": "8", + "label": "Low Battery Level Alarm Threshold", + "valueSize": 1, + "unit": "%", + "minValue": 0, + "maxValue": 50, + "defaultValue": 10 + }, + { + "#": "9", + "label": "Battery Auto Report Interval Time", + "valueSize": 4, + "unit": "seconds", + "minValue": 0, + "maxValue": 2678400, + "defaultValue": 3600 + }, + { + "#": "10", + "label": "Battery Change Report Threshold", + "valueSize": 1, + "unit": "%", + "minValue": 0, + "maxValue": 50, + "defaultValue": 5 + }, + { + "#": "11", + "label": "Curtain Status Report Command Setting", + "valueSize": 1, + "defaultValue": 6, + "allowManualEntry": false, + "options": [ + { + "label": "Send nothing", + "value": 0 + }, + { + "label": "Send Basic Report", + "value": 1 + }, + { + "label": "Send Multilevel Switch Report", + "value": 2 + }, + { + "label": "Send Window Covering Report", + "value": 3 + }, + { + "label": "Send Basic Report and Multilevel Switch Report", + "value": 4 + }, + { + "label": "Send Basic Report and Window Covering Report", + "value": 5 + }, + { + "label": "Send Multilevel Switch Report and Window Covering Report", + "value": 6 + }, + { + "label": "Send Basic Report and Multilevel Switch Report and Window Covering Report", + "value": 7 + } + ] + } + ], + "metadata": { + "inclusion": "Follow the user guide of hub to enter inclusion mode.\nPress and hold the Config Button more than 6s, enter Include Mode", + "exclusion": "Follow the user guide of hub to enter exclusion mode.\nPress and hold the Config Button more than 6s, enter Exclusion Mode", + "reset": "Press and hold the Config Button more than 10s. The Curtain will reset itself to factory default by sending a Device Reset Locally Notification to gateway when the button is released.\nNote:Please use this procedure only when the network primary controller is missing or otherwise inoperable" + } +} diff --git a/packages/config/config/devices/0x045a/zw881.json b/packages/config/config/devices/0x045a/zw881.json new file mode 100644 index 000000000000..44c6f4c7a3c8 --- /dev/null +++ b/packages/config/config/devices/0x045a/zw881.json @@ -0,0 +1,16 @@ +{ + "manufacturer": "ZVIDAR", + "manufacturerId": "0x045a", + "label": "ZW881", + "description": "Multi-Protocol Gateway", + "devices": [ + { + "productType": "0x0004", + "productId": "0x0371" + } + ], + "firmwareVersion": { + "min": "0.0", + "max": "255.255" + } +} diff --git a/packages/config/package.json b/packages/config/package.json index 5e6ba0a5a57b..42adb115da4b 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@zwave-js/config", - "version": "13.9.0", + "version": "13.10.1", "description": "zwave-js: configuration files", "publishConfig": { "access": "public" diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index 775025743180..c70807322782 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@zwave-js/eslint-plugin", - "version": "13.6.0", + "version": "13.10.1", "description": "zwave-js: custom ESLint rules", "private": true, "keywords": [], diff --git a/packages/eslint-plugin/src/utils/wordsAndNames.ts b/packages/eslint-plugin/src/utils/wordsAndNames.ts index fc41fd975f38..099530ed4b2b 100644 --- a/packages/eslint-plugin/src/utils/wordsAndNames.ts +++ b/packages/eslint-plugin/src/utils/wordsAndNames.ts @@ -33,6 +33,7 @@ const ccAndCommandNames = combinations( "Scene Activation", "Meter", "Indicator", + "Window Covering", ], [ "Command Class", diff --git a/packages/flash/package.json b/packages/flash/package.json index 1be920ff56af..0ece14bdc428 100644 --- a/packages/flash/package.json +++ b/packages/flash/package.json @@ -1,6 +1,6 @@ { "name": "@zwave-js/flash", - "version": "13.10.0", + "version": "13.10.1", "description": "zwave-js: firmware flash utility", "keywords": [], "publishConfig": { diff --git a/packages/host/package.json b/packages/host/package.json index a2b6d79a43bb..0dd77dc90b3a 100644 --- a/packages/host/package.json +++ b/packages/host/package.json @@ -1,6 +1,6 @@ { "name": "@zwave-js/host", - "version": "13.9.0", + "version": "13.10.1", "description": "zwave-js: Host abstractions", "keywords": [], "publishConfig": { diff --git a/packages/serial/package.json b/packages/serial/package.json index d977d2cfc9a2..e41ffd506f08 100644 --- a/packages/serial/package.json +++ b/packages/serial/package.json @@ -1,6 +1,6 @@ { "name": "@zwave-js/serial", - "version": "13.9.0", + "version": "13.10.1", "description": "zwave-js: Serialport driver", "publishConfig": { "access": "public" diff --git a/packages/serial/src/parsers/BootloaderParsers.ts b/packages/serial/src/parsers/BootloaderParsers.ts index d177cf4b2022..0b7c5c0b47ba 100644 --- a/packages/serial/src/parsers/BootloaderParsers.ts +++ b/packages/serial/src/parsers/BootloaderParsers.ts @@ -79,8 +79,9 @@ export class BootloaderScreenParser extends Transform { const screen = this.receiveBuffer.slice(0, nulCharIndex).trim(); this.receiveBuffer = this.receiveBuffer.slice(nulCharIndex + 1); - this.logger?.bootloaderScreen(screen); + if (screen === "") continue; + this.logger?.bootloaderScreen(screen); this.push(screen); } @@ -107,7 +108,9 @@ export class BootloaderScreenParser extends Transform { } } -export const bootloaderMenuPreamble = "Gecko Bootloader"; +// Sometimes the first chunk of the bootloader screen is relatively short, +// so we consider the following enough to detect the bootloader menu: +export const bootloaderMenuPreamble = "Gecko Boo"; const preambleRegex = /^Gecko Bootloader v(?\d+\.\d+\.\d+)/; const menuSuffix = "BL >"; const optionsRegex = /^(?\d+)\. (?