diff --git a/vendor/mclimate/16ads-codec.yaml b/vendor/mclimate/16ads-codec.yaml new file mode 100644 index 0000000000..aba5b458cb --- /dev/null +++ b/vendor/mclimate/16ads-codec.yaml @@ -0,0 +1,11 @@ +uplinkDecoder: + fileName: 16ads.js + examples: + - description: Periodic uplink + input: + fPort: 2 + bytes: [0x01, 0x1C, 0x01] + output: + data: + internalTemperature: 28 + relayState: 'ON' diff --git a/vendor/mclimate/16ads-profile.yaml b/vendor/mclimate/16ads-profile.yaml new file mode 100644 index 0000000000..ad1fba2485 --- /dev/null +++ b/vendor/mclimate/16ads-profile.yaml @@ -0,0 +1,8 @@ +supportsClassB: false +supportsClassC: true +macVersion: 1.0.3 +regionalParametersVersion: RP001-1.0.3-RevA +supportsJoin: true +maxEIRP: 16 +supports32bitFCnt: true +classCTimeout: 60 diff --git a/vendor/mclimate/16ads.js b/vendor/mclimate/16ads.js new file mode 100644 index 0000000000..5fe49e2384 --- /dev/null +++ b/vendor/mclimate/16ads.js @@ -0,0 +1,142 @@ +const decodeUplink = (input) => { + try { + let { bytes } = input; + let data = {}; + + const handleKeepalive = (bytes, data) => { + // Temperature sign and internal temperature + const isNegative = (bytes[1] & 0x80) !== 0; // Check the 7th bit for the sign + + let temperature = bytes[1] & 0x7F; // Mask out the 7th bit to get the temperature value + data.internalTemperature = isNegative ? -temperature : temperature; + + // Relay state + data.relayState = bytes[2] === 0x01 ? "ON" : "OFF"; + + return data; + }; + + const handleResponse = (bytes, data) => { + let commands = bytes.map(byte => (`0${byte.toString(16)}`).slice(-2)).slice(0, -3); + let command_len = 0; + + commands.forEach((command, i) => { + switch (command) { + case '04': { + command_len = 2; + const hardwareVersion = commands[i + 1]; + const softwareVersion = commands[i + 2]; + data.deviceVersions = { + hardware: Number(hardwareVersion), + software: Number(softwareVersion), + }; + break; + } + case '12': { + command_len = 1; + data.keepAliveTime = parseInt(commands[i + 1], 16); + break; + } + case '19': { + command_len = 1; + const commandResponse = parseInt(commands[i + 1], 16); + const periodInMinutes = (commandResponse * 5) / 60; + data.joinRetryPeriod = periodInMinutes; + break; + } + case '1b': { + command_len = 1; + data.uplinkType = parseInt(commands[i + 1], 16); + break; + } + case '1d': { + command_len = 2; + const wdpC = commands[i + 1] === '00' ? false : parseInt(commands[i + 1], 16); + const wdpUc = commands[i + 2] === '00' ? false : parseInt(commands[i + 2], 16); + data.watchDogParams = { wdpC, wdpUc }; + break; + } + case '1f': { + command_len = 2; + data.overheatingThresholds = { + trigger: parseInt(commands[i + 1], 16), + recovery: parseInt(commands[i + 2], 16), + }; + break; + } + case '5a': { + command_len = 1; + data.afterOverheatingProtectionRecovery = parseInt(commands[i + 1], 16); + break; + } + case '5c': { + command_len = 1; + data.ledIndicationMode = parseInt(commands[i + 1], 16); + break; + } + case '5d': { + command_len = 1; + data.manualChangeRelayState = parseInt(commands[i + 1], 16) === 0x01; + break; + } + case '5f': { + command_len = 1; + data.relayRecoveryState = parseInt(commands[i + 1], 16); + break; + } + case '60': { + command_len = 2; + data.overheatingEvents = { + events: parseInt(commands[i + 1], 16), + temperature: parseInt(commands[i + 2], 16), + }; + break; + } + case '70': { + command_len = 2; + data.overheatingRecoveryTime = (parseInt(commands[i + 1], 16) << 8) | parseInt(commands[i + 2], 16); + break; + } + case 'b1': { + command_len = 1; + data.relayState = parseInt(commands[i + 1], 16) === 0x01; + break; + } + case 'a0': { + command_len = 4; + const fuota_address = parseInt( + `${commands[i + 1]}${commands[i + 2]}${commands[i + 3]}${commands[i + 4]}`, + 16 + ); + const fuota_address_raw = `${commands[i + 1]}${commands[i + 2]}${commands[i + 3]}${commands[i + 4]}`; + data.fuota = { fuota_address, fuota_address_raw }; + break; + } + case 'a4': { + command_len = 1; + data.region = parseInt(commands[i + 1], 16); + break; + } + default: + break; + } + commands.splice(i, command_len); + }); + + return data; + }; + + if (bytes[0] === 1) { + data = handleKeepalive(bytes, data); + } else { + data = handleResponse(bytes, data); + bytes = bytes.slice(-3); + data = handleKeepalive(bytes, data); + } + + return { data }; + } catch (e) { + console.log(e); + throw new Error('Unhandled data'); + } +}; diff --git a/vendor/mclimate/16ads.png b/vendor/mclimate/16ads.png new file mode 100644 index 0000000000..c3302e97f8 Binary files /dev/null and b/vendor/mclimate/16ads.png differ diff --git a/vendor/mclimate/16ads.yaml b/vendor/mclimate/16ads.yaml new file mode 100644 index 0000000000..4971f4ef7d --- /dev/null +++ b/vendor/mclimate/16ads.yaml @@ -0,0 +1,133 @@ +name: 16A Dry Switch (16ADS) +description: The МClimate 16ADS is a miniature device that features a 16A dry relay. The device is small enough to fit behind most wall switches and outlets. The device operates in LoRaWAN Class C, features FUOTA (Firmware Upgrades Over The Air) and has overheating protection + +# Hardware versions (optional, use when you have revisions) +hardwareVersions: + - version: '1.0' + numeric: 1 + +# Firmware versions (at least one is mandatory) +firmwareVersions: + - # Firmware version + version: '1.0' + numeric: 1 + hardwareVersions: + - '1.0' + + # LoRaWAN Device Profiles per region + # Supported regions are EU863-870, US902-928, AU915-928, AS923, CN779-787, EU433, CN470-510, KR920-923, IN865-867, RU864-870 + profiles: + EU863-870: + # Unique identifier of the profile (lowercase, alphanumeric with dashes, max 36 characters) + id: 16ads-profile + lorawanCertified: false + codec: 16ads-codec + +# Sensors that this device features (optional) +# Valid values are: accelerometer, altitude, auxiliary, barometer, battery, button, co2, distance, dust, gps, gyroscope, +# humidity, light, link, magnetometer, moisture, ph, pir, proximity, rssi, snr, sound, temperature, tvoc, velocity, +# vibration, water, wind direction and wind speed. +sensors: + - temperature +# Dimensions in mm (optional) +# Use width, height, length and/or diameter +dimensions: + width: 36 + length: 18 + height: 32 + +# Weight in grams (optional) +weight: 24 + +# Battery information (optional) +battery: + replaceable: false + +# Operating conditions (optional) +operatingConditions: + # Temperature (Celsius) + temperature: + min: -10 + max: 40 + # Relative humidity (fraction of 1) + relativeHumidity: + min: 0.00 + max: 0.80 + +# IP rating (optional) +ipCode: IP30 + +# Key provisioning (optional) +# Valid values are: custom (user can configure keys), join server and manifest. +keyProvisioning: + - custom + - manifest + +# Key security (optional) +# Valid values are: none, read protected and secure element. +keySecurity: read protected + +# Product and data sheet URLs (optional) +productURL: https://docs.mclimate.eu/mclimate-lorawan-devices/devices/mclimate-16a-dry-switch-16ads +dataSheetURL: https://3940008670-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-McDr-jr9h3qA888r1Yp%2Fuploads%2F4PSdg1EADYeBfci7DCmK%2FMClimate-16ADS-Datasheet.pdf?alt=media&token=8c95eed3-7cac-4859-855c-ba65ab3a6e5a +# resellerURLs: +# - name: 'Connected Things' +# region: +# - United Kingdom +# url: https://connectedthings.store/ +# - name: 'Concept13' +# region: +# - United Kingdom +# url: https://www.concept13.co.uk +# - name: 'RG2i' +# region: +# - France +# url: https://connectedthings.store/ +# - name: 'Wideco' +# region: +# - Sweden +# url: https://wideco.se +# - name: 'iioote' +# region: +# - Sweden +# url: https://iiooote.com + +# Photos +photos: + main: 16aspm.png + +# Regulatory compliances (optional) +compliances: + safety: + - body: IEC + norm: EN + standard: 62368-1:2020 + - body: IEC + norm: EN + standard: 61010-1:2010 + electromagneticCompatibility: + - body: ETSI + norm: EN + standard: 301489-1 + version: 'latest' + - body: ETSI + norm: EN + standard: 301489-17 + version: 'latest' + - body: CENELEC + norm: EN + standard: 55032:2015 + - body: CENELEC + norm: EN + standard: 55035:2017 + radioEquipment: + - body: ETSI + norm: EN + standard: 300220-1 + - body: ETSI + norm: EN + standard: 300220-2 + lowVoltageDirective: + - body: IEC + norm: EN + standard: 2014/35/EU diff --git a/vendor/mclimate/index.yaml b/vendor/mclimate/index.yaml index 23dae896a0..6004d5f644 100644 --- a/vendor/mclimate/index.yaml +++ b/vendor/mclimate/index.yaml @@ -1,11 +1,80 @@ endDevices: - - vicki - t-valve - flood-sensor + - vicki - ht-sensor - co2-sensor + - mc-button + - open-close - wireless-thermostat - co2-display - - co2-display-lite - fan-coil-thermostat + - co2-display-lite - 16aspm + - 16ads +profileIDs: + '0': + endDeviceID: 't-valve' + firmwareVersion: '6.0' + hardwareVersion: '2.3' + region: 'EU863-870' + '1': + endDeviceID: 'flood-sensor' + firmwareVersion: '6.0' + hardwareVersion: '2.4' + region: 'EU863-870' + '3': + endDeviceID: 'vicki' + firmwareVersion: '4.3' + hardwareVersion: '2.6' + region: 'EU863-870' + '4': + endDeviceID: 'ht-sensor' + firmwareVersion: '1.0' + hardwareVersion: '1.0' + region: 'EU863-870' + '5': + endDeviceID: 'co2-sensor' + firmwareVersion: '1.0' + hardwareVersion: '1.0' + region: 'EU863-870' + '6': + endDeviceID: 'mc-button' + firmwareVersion: '1.2' + hardwareVersion: '1.2' + region: 'EU863-870' + '7': + endDeviceID: 'open-close' + firmwareVersion: '1.2' + hardwareVersion: '1.3' + region: 'EU863-870' + '8': + endDeviceID: 'wireless-thermostat' + firmwareVersion: '1.5' + hardwareVersion: '3.0' + region: 'EU863-870' + '9': + endDeviceID: 'co2-display' + firmwareVersion: '1.1' + hardwareVersion: '2.6' + region: 'EU863-870' + '10': + endDeviceID: 'fan-coil-thermostat' + firmwareVersion: '1.0' + hardwareVersion: '1.1' + region: 'EU863-870' + '11': + endDeviceID: 'co2-display-lite' + firmwareVersion: '1.1' + hardwareVersion: '1.2' + region: 'EU863-870' + '13': + endDeviceID: '16aspm' + firmwareVersion: '1.2' + hardwareVersion: '1.3' + region: 'EU863-870' + '14': + endDeviceID: '16ads' + firmwareVersion: '1.0' + hardwareVersion: '1.0' + region: 'EU863-870' diff --git a/vendor/mclimate/mc-button-codec.yaml b/vendor/mclimate/mc-button-codec.yaml new file mode 100644 index 0000000000..2b81525104 --- /dev/null +++ b/vendor/mclimate/mc-button-codec.yaml @@ -0,0 +1,13 @@ +uplinkDecoder: + fileName: mc-button.js + examples: + - description: Short periodic uplink + input: + fPort: 2 + bytes: [0x01, 0xAB, 0x02, 0x9B, 0x03] + output: + data: + sensorTemperature: 66.7 + batteryVoltage: 3 + thermistorProperlyConnected: true + pressEvent: 3 diff --git a/vendor/mclimate/mc-button-profile.yaml b/vendor/mclimate/mc-button-profile.yaml new file mode 100644 index 0000000000..4b7c151785 --- /dev/null +++ b/vendor/mclimate/mc-button-profile.yaml @@ -0,0 +1,7 @@ +supportsClassB: false +supportsClassC: false +macVersion: 1.0.3 +regionalParametersVersion: RP001-1.0.3-RevA +supportsJoin: true +maxEIRP: 16 +supports32bitFCnt: true diff --git a/vendor/mclimate/mc-button.js b/vendor/mclimate/mc-button.js new file mode 100644 index 0000000000..b65a0e5b49 --- /dev/null +++ b/vendor/mclimate/mc-button.js @@ -0,0 +1,108 @@ +function decodeUplink(input) { + try { + var bytes = input.bytes; + var data = {}; + function calculateBatteryVoltage(byte) { + return byte * 8 + 1600; + } + + function calculateTemperature(rawData) { + return rawData / 10.0; + } + + function handleKeepalive(bytes, data) { + // Byte 1: Device battery voltage + var batteryVoltage = calculateBatteryVoltage(bytes[1]) / 1000; + data.batteryVoltage = Number(batteryVoltage.toFixed(1)); + + // Byte 2: Thermistor operational status and temperature data (bits 9:8) + var thermistorConnected = (bytes[2] & 0x04) === 0; // Bit 2 + var temperatureHighBits = bytes[2] & 0x03; // Bits 1:0 + + // Byte 3: Thermistor temperature data (bits 7:0) + var temperatureLowBits = bytes[3]; + var temperatureRaw = (temperatureHighBits << 8) | temperatureLowBits; + var temperatureCelsius = calculateTemperature(temperatureRaw); + data.thermistorProperlyConnected = thermistorConnected; + data.sensorTemperature = Number(temperatureCelsius.toFixed(1)); + + // Byte 4: Button event data + var buttonEventData = bytes[4]; + data.pressEvent = buttonEventData; + + return data; + } + + function handleResponse(bytes, data){ + var commands = bytes.map(function(byte){ + return ("0" + byte.toString(16)).substr(-2); + }); + commands = commands.slice(0,-5); + var command_len = 0; + + commands.map(function (command, i) { + switch (command) { + case '04': + { + command_len = 2; + var hardwareVersion = commands[i + 1]; + var softwareVersion = commands[i + 2]; + data.deviceVersions = { hardware: Number(hardwareVersion), software: Number(softwareVersion) }; + } + break; + case '12': + { + command_len = 1; + data.keepAliveTime = parseInt(commands[i + 1], 16); + } + break; + case '19': + { + command_len = 1; + var commandResponse = parseInt(commands[i + 1], 16); + var periodInMinutes = commandResponse * 5 / 60; + data.joinRetryPeriod = periodInMinutes; + } + break; + case '1b': + { + command_len = 1; + data.uplinkType = parseInt(commands[i + 1], 16) ; + } + break; + case '1d': + { + command_len = 2; + var wdpC = commands[i + 1] == '00' ? false : parseInt(commands[i + 1], 16); + var wdpUc = commands[i + 2] == '00' ? false : parseInt(commands[i + 2], 16); + data.watchDogParams= { wdpC: wdpC, wdpUc: wdpUc } ; + } + break; + case '1f': + { + command_len = 1; + data.sendEventLater = parseInt(commands[i + 1], 16) ; + } + break; + default: + break; + } + commands.splice(i,command_len); + }); + return data; + } + + if (bytes[0] == 1) { + data = handleKeepalive(bytes, data); + } else { + data = handleResponse(bytes, data); + // Handle the remaining keepalive data if required after response + bytes = bytes.slice(-5); + data = handleKeepalive(bytes, data); + } + return { data: data }; + } catch (e) { + // console.log(e); + throw new Error('Unhandled data'); + } +} diff --git a/vendor/mclimate/mc-button.png b/vendor/mclimate/mc-button.png new file mode 100644 index 0000000000..8ca237008a Binary files /dev/null and b/vendor/mclimate/mc-button.png differ diff --git a/vendor/mclimate/mc-button.yaml b/vendor/mclimate/mc-button.yaml new file mode 100644 index 0000000000..f7fca6d14d --- /dev/null +++ b/vendor/mclimate/mc-button.yaml @@ -0,0 +1,118 @@ +name: Multipurpose Button +description: MClimate Multipurpose Button LoRaWAN is a simple device with many applications. Featuring a single button with 3 types of clicks and a temperature sensor, only your imagination limits what happens when the customer presses the button. + +# Hardware versions (optional, use when you have revisions) +hardwareVersions: + - version: '1.2' + numeric: 1 + +# Firmware versions (at least one is mandatory) +firmwareVersions: + - # Firmware version + version: '1.2' + numeric: 1 + hardwareVersions: + - '1.2' + + # LoRaWAN Device Profiles per region + # Supported regions are EU863-870, US902-928, AU915-928, AS923, CN779-787, EU433, CN470-510, KR920-923, IN865-867, RU864-870 + profiles: + EU863-870: + # Unique identifier of the profile (lowercase, alphanumeric with dashes, max 36 characters) + id: mc-button-profile + lorawanCertified: false + codec: mc-button-codec + +# Sensors that this device features (optional) +# Valid values are: accelerometer, altitude, auxiliary, barometer, battery, button, co2, distance, dust, gps, gyroscope, +# humidity, light, link, magnetometer, moisture, ph, pir, proximity, rssi, snr, sound, temperature, tvoc, velocity, +# vibration, water, wind direction and wind speed. +sensors: + - temperature + +# Dimensions in mm (optional) +# Use width, height, length and/or diameter +dimensions: + width: 42 + length: 18 + height: 72 + +# Weight in grams (optional) +weight: 26 + +# Battery information (optional) +battery: + replaceable: true + type: ER10280 + +# Operating conditions (optional) +operatingConditions: + # Temperature (Celsius) + temperature: + min: 0 + max: 50 + # Relative humidity (fraction of 1) + relativeHumidity: + min: 0.00 + max: 0.80 + +# IP rating (optional) +ipCode: IP30 + +# Key provisioning (optional) +# Valid values are: custom (user can configure keys), join server and manifest. +keyProvisioning: + - custom + - join server + +# Key security (optional) +# Valid values are: none, read protected and secure element. +keySecurity: read protected + +# Product and data sheet URLs (optional) +productURL: https://docs.mclimate.eu/mclimate-lorawan-devices/devices/mclimate-multipurpose-button-lorawan +dataSheetURL: https://3940008670-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-McDr-jr9h3qA888r1Yp%2Fuploads%2FhlFLeNfhaNMg6I2AF6kM%2FMClimate-Button-LoRaWAN-Datasheet.pdf?alt=media&token=26e8699e-a84a-445c-9c64-80715dedd687 +# resellerURLs: +# - name: 'Connected Things' +# region: +# - United Kingdom +# url: https://connectedthings.store/ +# - name: 'Concept13' +# region: +# - United Kingdom +# url: https://www.concept13.co.uk +# - name: 'RG2i' +# region: +# - France +# url: https://connectedthings.store/ +# - name: 'Wideco' +# region: +# - Sweden +# url: https://wideco.se +# - name: 'iioote' +# region: +# - Sweden +# url: https://iiooote.com + +# Photos +photos: + main: mc-button.png + +# Regulatory compliances (optional) +compliances: + safety: + - body: IEC + norm: EN + standard: 62479:2010 + radioEquipment: + - body: ETSI + norm: EN + standard: 60950-1 + - body: ETSI + norm: EN + standard: 301-489 + version: 2.1.1 + - body: ETSI + norm: EN + standard: 300-220 + version: 3.1.1 diff --git a/vendor/mclimate/open-close-codec.yaml b/vendor/mclimate/open-close-codec.yaml new file mode 100644 index 0000000000..8b94022fb4 --- /dev/null +++ b/vendor/mclimate/open-close-codec.yaml @@ -0,0 +1,14 @@ +uplinkDecoder: + fileName: open-close.js + examples: + - description: Short periodic uplink + input: + fPort: 2 + bytes: [0x01, 0xAB, 0x00, 0xD9, 0x1B, 0x5C, 0xAE, 0x01] + output: + data: + temperature: 21.7 + batteryVoltage: 2.97 + thermistorProperlyConnected: true + counter: 1793198 + status: 1 diff --git a/vendor/mclimate/open-close-profile.yaml b/vendor/mclimate/open-close-profile.yaml new file mode 100644 index 0000000000..4b7c151785 --- /dev/null +++ b/vendor/mclimate/open-close-profile.yaml @@ -0,0 +1,7 @@ +supportsClassB: false +supportsClassC: false +macVersion: 1.0.3 +regionalParametersVersion: RP001-1.0.3-RevA +supportsJoin: true +maxEIRP: 16 +supports32bitFCnt: true diff --git a/vendor/mclimate/open-close.js b/vendor/mclimate/open-close.js new file mode 100644 index 0000000000..efd0d5d72c --- /dev/null +++ b/vendor/mclimate/open-close.js @@ -0,0 +1,99 @@ +function decodeUplink(input) { + var bytes = input.bytes; + + function calculateBatteryVoltage(byte) { + return byte * 8 + 1600; + } + + function calculateTemperature(rawData) { + return rawData / 10.0; + } + + function handleKeepalive(bytes, data) { + // Byte 1: Device battery voltage + var batteryVoltage = calculateBatteryVoltage(bytes[1]) / 1000; + data.batteryVoltage = Number(batteryVoltage.toFixed(2)); + + // Byte 2: Thermistor operational status and temperature data (bits 9:8) + var thermistorConnected = (bytes[2] & 0x04) === 0; // Bit 2 + var temperatureHighBits = bytes[2] & 0x03; // Bits 1:0 + + // Byte 3: Thermistor temperature data (bits 7:0) + var temperatureLowBits = bytes[3]; + var temperatureRaw = (temperatureHighBits << 8) | temperatureLowBits; + var temperatureCelsius = calculateTemperature(temperatureRaw); + data.thermistorProperlyConnected = thermistorConnected; + data.temperature = Number(temperatureCelsius.toFixed(1)); + + // Byte 4-6: Counter data + var counter = ((bytes[4] << 16) | (bytes[5] << 8) | bytes[6]); + data.counter = counter; + + // Byte 7: Status or event code + var status = parseInt(bytes[7] || '0', 16); + data.status = status; + + return data; + } + + function handleResponse(bytes, data) { + var commands = bytes.map(function (byte) { + return ("0" + byte.toString(16)).substr(-2); + }); + + commands = commands.slice(0, -5); // Adjust slice to avoid slicing too much data + var command_len = 0; + + commands.forEach(function (command, i) { + switch (command) { + case '04': + command_len = 2; + var hardwareVersion = commands[i + 1]; + var softwareVersion = commands[i + 2]; + data.deviceVersions = { hardware: Number(hardwareVersion), software: Number(softwareVersion) }; + break; + case '12': + command_len = 1; + data.keepAliveTime = parseInt(commands[i + 1], 16); + break; + case '19': + command_len = 1; + var commandResponse = parseInt(commands[i + 1], 16); + var periodInMinutes = commandResponse * 5 / 60; + data.joinRetryPeriod = periodInMinutes; + break; + case '1b': + command_len = 1; + data.uplinkType = parseInt(commands[i + 1], 16); + break; + case '1d': + command_len = 2; + var wdpC = commands[i + 1] === '00' ? false : parseInt(commands[i + 1], 16); + var wdpUc = commands[i + 2] === '00' ? false : parseInt(commands[i + 2], 16); + data.watchDogParams = { wdpC: wdpC, wdpUc: wdpUc }; + break; + case '1f': + command_len = 1; + data.sendEventLater = parseInt(commands[i + 1], 16); + break; + default: + break; + } + commands.splice(i, command_len); + }); + return data; + } + + var data = {}; + + if (bytes[0] === 1) { + data = handleKeepalive(bytes, data); + } else { + data = handleResponse(bytes, data); + // Handle the remaining keepalive data if required after response + bytes = bytes.slice(-5); + data = handleKeepalive(bytes, data); + } + + return { data: data }; +} \ No newline at end of file diff --git a/vendor/mclimate/open-close.png b/vendor/mclimate/open-close.png new file mode 100644 index 0000000000..b87bf364b8 Binary files /dev/null and b/vendor/mclimate/open-close.png differ diff --git a/vendor/mclimate/open-close.yaml b/vendor/mclimate/open-close.yaml new file mode 100644 index 0000000000..cc6722b7eb --- /dev/null +++ b/vendor/mclimate/open-close.yaml @@ -0,0 +1,119 @@ +name: Open/Close Sensor +description: MClimate Open/Close Sensor LoRaWAN® is a device detecting the event of opening or closing windows, doors, cabinets and more. It features long battery life, LED, temperature sensor and a button that triggers an uplink. The device sends an uplink for every event of opening/closing and keeps an internal counter of the total number of events. + +# Hardware versions (optional, use when you have revisions) +hardwareVersions: + - version: '1.3' + numeric: 1 + +# Firmware versions (at least one is mandatory) +firmwareVersions: + - # Firmware version + version: '1.2' + numeric: 1 + hardwareVersions: + - '1.3' + + # LoRaWAN Device Profiles per region + # Supported regions are EU863-870, US902-928, AU915-928, AS923, CN779-787, EU433, CN470-510, KR920-923, IN865-867, RU864-870 + profiles: + EU863-870: + # Unique identifier of the profile (lowercase, alphanumeric with dashes, max 36 characters) + id: open-close-profile + lorawanCertified: false + codec: open-close-codec + +# Sensors that this device features (optional) +# Valid values are: accelerometer, altitude, auxiliary, barometer, battery, button, co2, distance, dust, gps, gyroscope, +# humidity, light, link, magnetometer, moisture, ph, pir, proximity, rssi, snr, sound, temperature, tvoc, velocity, +# vibration, water, wind direction and wind speed. +sensors: + - temperature + - magnetometer + +# Dimensions in mm (optional) +# Use width, height, length and/or diameter +dimensions: + width: 20 + length: 10 + height: 72 + +# Weight in grams (optional) +weight: 26 + +# Battery information (optional) +battery: + replaceable: true + type: ER14250 + +# Operating conditions (optional) +operatingConditions: + # Temperature (Celsius) + temperature: + min: 0 + max: 50 + # Relative humidity (fraction of 1) + relativeHumidity: + min: 0.00 + max: 0.80 + +# IP rating (optional) +ipCode: IP30 + +# Key provisioning (optional) +# Valid values are: custom (user can configure keys), join server and manifest. +keyProvisioning: + - custom + - join server + +# Key security (optional) +# Valid values are: none, read protected and secure element. +keySecurity: read protected + +# Product and data sheet URLs (optional) +productURL: https://docs.mclimate.eu/mclimate-lorawan-devices/devices/mclimate-open-close-sensor-lorawan +dataSheetURL: https://3940008670-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-McDr-jr9h3qA888r1Yp%2Fuploads%2F7hmYi0hNrcCkkK0C1Faw%2FMClimate-Open-Close-Sensor-Datasheet-LoRaWAN-en.pdf?alt=media&token=311b102f-d6cd-47d3-84c2-61b280aa11d5 +# resellerURLs: +# - name: 'Connected Things' +# region: +# - United Kingdom +# url: https://connectedthings.store/ +# - name: 'Concept13' +# region: +# - United Kingdom +# url: https://www.concept13.co.uk +# - name: 'RG2i' +# region: +# - France +# url: https://connectedthings.store/ +# - name: 'Wideco' +# region: +# - Sweden +# url: https://wideco.se +# - name: 'iioote' +# region: +# - Sweden +# url: https://iiooote.com + +# Photos +photos: + main: open-close.png + +# Regulatory compliances (optional) +compliances: + safety: + - body: IEC + norm: EN + standard: 62479:2010 + radioEquipment: + - body: ETSI + norm: EN + standard: 60950-1 + - body: ETSI + norm: EN + standard: 301-489 + version: 2.1.1 + - body: ETSI + norm: EN + standard: 300-220 + version: 3.1.1 diff --git a/vendor/mclimate/wireless-thermostat.yaml b/vendor/mclimate/wireless-thermostat.yaml index 072d392fcc..30ca104d04 100644 --- a/vendor/mclimate/wireless-thermostat.yaml +++ b/vendor/mclimate/wireless-thermostat.yaml @@ -5,6 +5,8 @@ description: MClimate Wireless Thermostat is a stand-alone thermostat powered en hardwareVersions: - version: '2.5' numeric: 1 + - version: '3.0' + numeric: 1 # Firmware versions (at least one is mandatory) firmwareVersions: @@ -36,6 +38,20 @@ firmwareVersions: id: wireless-thermostat-profile lorawanCertified: false codec: wireless-thermostat-codec + - # Firmware version + version: '1.5' + numeric: 1 + hardwareVersions: + - '3.0' + + # LoRaWAN Device Profiles per region + # Supported regions are EU863-870, US902-928, AU915-928, AS923, CN779-787, EU433, CN470-510, KR920-923, IN865-867, RU864-870 + profiles: + EU863-870: + # Unique identifier of the profile (lowercase, alphanumeric with dashes, max 36 characters) + id: wireless-thermostat-profile + lorawanCertified: false + codec: wireless-thermostat-codec # Sensors that this device features (optional) # Valid values are: accelerometer, altitude, auxiliary, barometer, battery, button, co2, distance, dust, gps, gyroscope,