From 79bff8840eb99fb22000708390b7f2651012ef47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristjan=20Jam=C5=A1ek?= Date: Tue, 20 Dec 2016 04:38:54 -0800 Subject: [PATCH] MSA-1660: The Qubino Weatherstation device is a RF 433MHz to Z-Wave bridge device, that translates the data reported by RF sensors into a Z-Wave Multichannel device. It provides two channel temperature and humidity measurements (reported by separate sensors) along with the rain rate, wind gust, wind velocity, wind direction and temperature measurement. The device handler is compatible with most available automation SmartApps that do not allow for non-capability attributes to be used (the channel 1 temperature and humidity are mirrored for these), whereas with SmartApps that allow custom attributes to be used as condition triggers it is fully compatible. The device handler takes care of setting up a multichannel lifeline association in order to receive pushed multichannel encapsulated reports from the device's endpoints, allowing for less network congestion as would be present in a polling approach. --- .../qubino-weatherstation.groovy | 486 ++++++++++++++++++ 1 file changed, 486 insertions(+) create mode 100644 devicetypes/goap/qubino-weatherstation.src/qubino-weatherstation.groovy diff --git a/devicetypes/goap/qubino-weatherstation.src/qubino-weatherstation.groovy b/devicetypes/goap/qubino-weatherstation.src/qubino-weatherstation.groovy new file mode 100644 index 0000000..9300660 --- /dev/null +++ b/devicetypes/goap/qubino-weatherstation.src/qubino-weatherstation.groovy @@ -0,0 +1,486 @@ +/** + * Qubino Weatherstation + * Device Handler + * Version 1.0 + * Date: 16.12.2016 + * Author: Kristjan Jamšek (Kjamsek), Goap d.o.o. + * Copyright 2016 Kristjan Jamšek + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License + * for the specific language governing permissions and limitations under the License. + * + * - DEVICE HANDLER FOR QUBINO WEATHERSTATION Z-WAVE DEVICE - + * The handler supports all unsecure functions of the Qubino Weatherstation device. Configuration parameters and + * association groups can be set in the device's preferences screen, but they are applied on the device only after + * pressing the 'Set configuration' and 'Set associations' buttons on the bottom of the details view. + * + * This device handler supports data values that are currently not implemented as capabilities, so custom attribute + * states are used. Please use a SmartApp that supports custom attribute monitoring with this device in your rules. + * By default the 'Temperature Measurement' and 'Relative Humidity Measurement' capability states are mirrored from + * the custom attribute state values 'temperatureCh1' and 'humidityCh1'. + * + * This device handler uses hubAction in configure() method in order to set a MultiChannel Lifeline association to the + * device, so reports from all endpoints can be received. + * + * + * CHANGELOG: + * 0.99: Final release code cleanup and commenting + * 1.00: Added comments to code for readability + */ +metadata { + definition (name: "Qubino Weatherstation", namespace: "Goap", author: "Kristjan Jamšek") { + capability "Configuration" //Needed for configure() function to set MultiChannel Lifeline Association Set + capability "Temperature Measurement" //Used on main tile, needed in order to have the device appear in capabilities lists, mirrors temperatureCh1 attribute states + capability "Relative Humidity Measurement" //Needed in order to have the device appear in capabilities lists, mirrors humidityCh1 attribute states + capability "Sensor" // - Tagging capability + + attribute "temperatureCh1", "number" // temperature attribute for Ch1 Temperature reported by device's endpoint 1 + attribute "windDirection", "number" // wind direction attribute for Wind Gauge - Direction reported by device's endpoint 2 + attribute "windVelocity", "number" // wind velocity attribute for Wind Gauge - Velocity reported by device's endpoint 3 + attribute "windGust", "number" // wind gust velocity attribute for Wind Gauge - Wind gust reported by device's endpoint 4 + attribute "windTemperature", "number" // wind temperature attribute for Wind Gauge - Temperature reported by device's endpoint 5 + attribute "windChillTemperature", "number" // wind chill temperature attribute for Wind Gauge - Wind Chill reported by device's endpoint 6 + attribute "rainRate", "number" // rain rate attribute for Rain Sensor data reported by device's endpoint 7 + attribute "humidityCh1", "number" // humidity attribute for Ch1 Humidity reported by device's endpoint 8 + attribute "temperatureCh2", "number" // temperature attribute for Ch2 Temperature reported by device's endpoint 9 + attribute "humidityCh2", "number" // humidity attribute for Ch2 Humidity reported by device's endpoint 10 + + attribute "setConfigParams", "string" // attribute for tile element for setConfigurationParams command + attribute "setAssocGroups", "string" // attribute for tile element for setAssociations command + + command "setConfigurationParams" // command to issue Configuration Set command sequence according to user's preferences + command "setAssociations" // command to issue Association Set command sequence according to user's preferences + + fingerprint mfr:"0159", prod:"0007", model:"0053" //Manufacturer Information values for Qubino Weatherstation + } + + + simulator { + // TESTED WITH PHYSICAL DEVICE - UNNEEDED + } + + tiles(scale: 2) { + valueTile("temperature", "device.temperature") { + state("temperature", label:'${currentValue} °', unit:"°", icon: "st.Weather.weather2", backgroundColors: [ + // Celsius Color Range + [value: 0, color: "#153591"], + [value: 7, color: "#1e9cbb"], + [value: 15, color: "#90d2a7"], + [value: 23, color: "#44b621"], + [value: 29, color: "#f1d801"], + [value: 33, color: "#d04e00"], + [value: 36, color: "#bc2323"], + // Fahrenheit Color Range + [value: 40, color: "#153591"], + [value: 44, color: "#1e9cbb"], + [value: 59, color: "#90d2a7"], + [value: 74, color: "#44b621"], + [value: 84, color: "#f1d801"], + [value: 92, color: "#d04e00"], + [value: 96, color: "#bc2323"] + ]) + } + valueTile("humidity", "device.humidity") { + state("humidity", label:'${currentValue} %', unit:"%", display:false) + } + standardTile("temperatureCh1", "device.temperatureCh1", width: 3, height: 3) { + state("temperatureCh1", label:'Temperature Ch1: ${currentValue} °', unit:'°', icon: 'st.Weather.weather2') + } + standardTile("windDirection", "device.windDirection", width: 3, height: 3) { + state("windDirection", label:'Wind Direction: ${currentValue} °', unit: "°", icon: 'st.Outdoor.outdoor20') + } + standardTile("windVelocity", "device.windVelocity", width: 3, height: 3) { + state("windVelocity", label:'Wind Velocity: ${currentValue} m/s', unit:"m/s", icon: 'st.Weather.weather1') + } + standardTile("windGust", "device.windGust", width: 3, height: 3) { + state("windGust", label:'Wind Gust: ${currentValue} m/s', unit:"m/s", icon: 'st.Weather.weather1') + } + standardTile("windTemperature", "device.windTemperature", width: 3, height: 3) { + state("windTemperature", label:'Wind Temperature: ${currentValue} °', unit:'°', icon: 'st.Weather.weather2') + } + standardTile("windChillTemperature", "device.windChillTemperature", width: 3, height: 3) { + state("windChillTemperature", label:'Wind Chill: ${currentValue} °', unit:'°', icon: 'st.Weather.weather2') + } + standardTile("rainRate", "device.rainRate", width: 3, height: 3) { + state("rainRate", label:'Rain Sensor: ${currentValue} mm/h', unit:"mm/h", icon: 'st.Weather.weather10') + } + standardTile("humidityCh1", "device.humidityCh1", width: 3, height: 3) { + state("humidityCh1", label:'Humidity Ch1: ${currentValue} %', unit:"%", icon: 'st.Weather.weather12') + } + standardTile("temperatureCh2", "device.temperatureCh2", width: 3, height: 3) { + state("temperatureCh2", label:'Temperature Ch2: ${currentValue} °', unit:'°', icon: 'st.Weather.weather2') + } + standardTile("humidityCh2", "device.humidityCh2", width: 3, height: 3) { + state("humidityCh2", label:'Humidity Ch2: ${currentValue} %', unit:"%", icon: 'st.Weather.weather12') + } + standardTile("setConfigParams", "device.setConfigParams", decoration: "flat", width: 3, height: 3) { + state("setConfigParams", label:'Set configuration', action:'setConfigurationParams', icon: "st.secondary.tools") + } + standardTile("setAssocGroups", "device.setAssocGroups", decoration: "flat", width: 3, height: 3) { + state("setAssocGroups", label:'Set associations', action:'setAssociations', icon: "st.secondary.tools") + } + + main("temperature") + details(["temperatureCh1", "humidityCh1", "windDirection", "windVelocity", "windGust", "windTemperature", "windChillTemperature", "rainRate", "temperatureCh2", "humidityCh2", "setConfigParams", "setAssocGroups"]) + + } + preferences { +/** +* -------- CONFIGURATION PARAMETER SECTION -------- +*/ + input name: "param1", type: "number", range: "0..8800", required: false, + title: "1. Wind Gauge, Wind Gust Top Value. " + + "If the Wind Gust is higher than the parameter value, the device triggers an association.\n" + + "Available settings:\n" + + "0 ... 8800 = value from 0,00 m/s to 88,00 m/s,\n" + + "Default value: 1000 (10,00 m/s)." + input name: "param2", type: "number", range: "0..30000", required: false, + title: "2. Rain Gauge, Rain Rate Top Value. " + + "If the Rain Sensor Rain Rate is higher than the parameter value, the device triggers an association.\n" + + "Available settings:\n" + + "0 ... 30000 = value from 0,00 mm/h to 300,00 mm/h,\n" + + "Default value: 200 (2,00 mm/h)." + input name: "param3", type: "enum", required: false, + options: ["0" : "0", + "1" : "1"], + title: "3. Wind Gauge, Wind Gust. " + + "Available settings:\n" + + "0 = If the Wind Gust is higher than the parameter number 1 value, then the device sends a Basic Set 0x00,\n" + + "1 = If the Wind Gust is higher than the parameter number 1 value, then the device sends a Basic Set 0xFF,\n" + + "Default value: 1." + input name: "param4", type: "enum", required: false, + options: ["0" : "0", + "1" : "1"], + title: "4. Rain Gauge, Rain Rate. " + + "Available settings:\n" + + "0 = If the Rain Rate is higher than the parameter number 2 value, then the device sends a Basic Set 0x00,\n" + + "1 = If the Rain Rate is higher than the parameter number 2 value, then the device sends a Basic Set 0xFF,\n" + + "Default value: 1." + input name: "param5", type: "enum", required: false, + options: ["0" : "0", + "1" : "1"], + title: "5. Endpoint 1 - Unsolicited Report enable/disable. " + + "Available settings:\n" + + "0 = Unsolicited Report disabled,\n" + + "1 = Unsolicited Report enabled,\n" + + "Default value: 1." + input name: "param6", type: "enum", required: false, + options: ["0" : "0", + "1" : "1"], + title: "6. Endpoint 2 - Unsolicited Report enable/disable. " + + "Available settings:\n" + + "0 = Unsolicited Report disabled,\n" + + "1 = Unsolicited Report enabled,\n" + + "Default value: 1." + input name: "param7", type: "enum", required: false, + options: ["0" : "0", + "1" : "1"], + title: "7. Endpoint 3 - Unsolicited Report enable/disable. " + + "Available settings:\n" + + "0 = Unsolicited Report disabled,\n" + + "1 = Unsolicited Report enabled,\n" + + "Default value: 1." + input name: "param8", type: "enum", required: false, + options: ["0" : "0", + "1" : "1"], + title: "8. Endpoint 4 - Unsolicited Report enable/disable. " + + "Available settings:\n" + + "0 = Unsolicited Report disabled,\n" + + "1 = Unsolicited Report enabled,\n" + + "Default value: 1." + input name: "param9", type: "enum", required: false, + options: ["0" : "0", + "1" : "1"], + title: "9. Endpoint 5 - Unsolicited Report enable/disable. " + + "Available settings:\n" + + "0 = Unsolicited Report disabled,\n" + + "1 = Unsolicited Report enabled,\n" + + "Default value: 1." + input name: "param10", type: "enum", required: false, + options: ["0" : "0", + "1" : "1"], + title: "10. Endpoint 6 - Unsolicited Report enable/disable. " + + "Available settings:\n" + + "0 = Unsolicited Report disabled,\n" + + "1 = Unsolicited Report enabled,\n" + + "Default value: 1." + input name: "param11", type: "enum", required: false, + options: ["0" : "0", + "1" : "1"], + title: "11. Endpoint 7 - Unsolicited Report enable/disable. " + + "Available settings:\n" + + "0 = Unsolicited Report disabled,\n" + + "1 = Unsolicited Report enabled,\n" + + "Default value: 1." + input name: "param12", type: "enum", required: false, + options: ["0" : "0", + "1" : "1"], + title: "12. Endpoint 8 - Unsolicited Report enable/disable. " + + "Available settings:\n" + + "0 = Unsolicited Report disabled,\n" + + "1 = Unsolicited Report enabled,\n" + + "Default value: 1." + input name: "param13", type: "enum", required: false, + options: ["0" : "0", + "1" : "1"], + title: "13. Endpoint 9 - Unsolicited Report enable/disable. " + + "Available settings:\n" + + "0 = Unsolicited Report disabled,\n" + + "1 = Unsolicited Report enabled,\n" + + "Default value: 1." + input name: "param14", type: "enum", required: false, + options: ["0" : "0", + "1" : "1"], + title: "14. Endpoint 10 - Unsolicited Report enable/disable. " + + "Available settings:\n" + + "0 = Unsolicited Report disabled,\n" + + "1 = Unsolicited Report enabled,\n" + + "Default value: 1." + input name: "param15", type: "enum", required: false, + options: ["0" : "0", + "1" : "1"], + title: "15. Random ID enable/disable " + + "Available settings:\n" + + "0 = Random ID disabled,\n" + + "1 = Random ID enabled,\n" + + "Default value: 0." +/** +* -------- ASSOCIATION GROUP SECTION -------- +*/ + input name: "assocGroup2", type: "text", required: false, + title: "Association group 2: \n" + + "Basic On/Off command will be sent to associated nodes when the Wind Gust of the Wind Gauge exceeds the Configuration parameter 1 value. \n" + + "NOTE: Insert the node Id value of the devices you wish to associate this group with. Multiple nodeIds can also be set at once by separating individual values by a comma (2,3,...)." + + input name: "assocGroup3", type: "text", required: false, + title: "Association group 3: \n" + + "Basic On/Off command will be sent to associated nodes when the Rain Rate exceeds the Configuration parameter 2 value. \n" + + "NOTE: Insert the node Id value of the devices you wish to associate this group with. Multiple nodeIds can also be set at once by separating individual values by a comma (2,3,...)." + } +} +/** +* -------- HELPER METHODS SECTION -------- +*/ +/** + * Converts a list of String type node id values to Integer type. + * + * @param stringList - a list of String type node id values. + * @return stringList - a list of Integer type node id values. +*/ +def convertStringListToIntegerList(stringList){ + for(int i=0;i