diff --git a/vendors/browan/codecs/browan-industrial-tracker.js b/vendors/browan/codecs/browan-industrial-tracker.js new file mode 100644 index 0000000..eccfac7 --- /dev/null +++ b/vendors/browan/codecs/browan-industrial-tracker.js @@ -0,0 +1,60 @@ +//Browan version:1.0.1 +function decodeUplink(input) { + let decoded = {}; + switch (input.fPort) { + case 136: + decoded.MovingMode = ((input.bytes[0] - ((input.bytes[0] >> 4) * 16)) % 8) % 2; + decoded.NoGNSSFix = (input.bytes[0] - ((input.bytes[0] >> 4) * 16)) >> 3; + decoded.GNSSerror = (input.bytes[0] >> 4); + decoded.battery_volt = (25 + (input.bytes[1] - ((input.bytes[1] >> 4) * 16))) / 10; + decoded.temperature = input.bytes[2] - 32; + let int_lat = (input.bytes[3] + input.bytes[4] * 256 + input.bytes[5] * 65536 + (input.bytes[6] - ((input.bytes[6] >> 4))) * 16777216); + let int_lon = (input.bytes[7] + input.bytes[8] * 256 + input.bytes[9] * 65536 + (input.bytes[10] - (((input.bytes[10] >> 5) << 1) * 16)) * 16777216); + let bit_lon = ((input.bytes[10] >> 4) % 2); + decoded.accuracy = Math.pow(2, ((input.bytes[10] >> 5) + 2)); + decoded.latitude = twocomplement_Lat(int_lat, 27) / 1000000; + decoded.longitude = twocomplement_Long(bit_lon, int_lon, 28) / 1000000; + decoded.altitude = 2; + // Decoded data + return {data: decoded}; + } +} + +function twocomplement_Lat(inputNum, comtimes) { + let count02 = (Math.pow(2, comtimes + 1)) - 1; + let final_Lat; + if ((inputNum >> comtimes) == 0) { + final_Lat = inputNum; + return final_Lat; + } else { + final_Lat = -(inputNum ^ count02) - 1; + return final_Lat; + } +} + +function twocomplement_Long(firstbit, inputNum, comtimes) { + let count02 = (Math.pow(2, comtimes + 1)) - 1; + let final_Long; + if (firstbit == 0) { + final_Long = inputNum; + return final_Long; + } else { + final_Long = -(inputNum ^ count02) - 1; + return final_Long; + } +} + +/** + * Encode downlink function. + * + * @param {object} input + * @param {object} input.data Object representing the payload that must be encoded. + * @param {Record} input.variables Object containing the configured device variables. + * + * @returns {{bytes: number[]}} Byte array containing the downlink payload. + */ +function encodeDownlink(input) { + return { + // bytes: [225, 230, 255, 0] + }; +} diff --git a/vendors/browan/codecs/merryiot-cd10.js b/vendors/browan/codecs/merryiot-cd10.js new file mode 100644 index 0000000..c00bf6e --- /dev/null +++ b/vendors/browan/codecs/merryiot-cd10.js @@ -0,0 +1,117 @@ +////////////* MerryIot CO2 sensor*//////////// + +//hex to binary function +function hex2bin(hex){ + return (parseInt(hex, 16).toString(2)).padStart(8, '0'); +} + +//MerryIot CO2 sensor +function decodeUplink(input) { + let fPort = input.fPort; + let payloadlens = input.bytes.length; + if(fPort==127 && payloadlens==7){ + let intput_list = input.bytes; + let battery_int = intput_list[1]; + let battery_volt = (21 + battery_int) / 10; + + let temperature_hex = intput_list[3].toString(16).padStart(2, '0') + intput_list[2].toString(16).padStart(2, '0'); + let temperature_val = parseInt(temperature_hex, 16); + let temperature = temperature_val > 1250 ? (temperature_val - 65536) / 10 : temperature_val / 10; + + let humidity = intput_list[4]; + + let co2_hex = intput_list[0].toString(16).padStart(2, '0'); + let co2_binary = hex2bin(co2_hex); + let trigger_st = co2_binary.substring(7, 8); + let button_st = co2_binary.substring(6, 7); + let co2threshold_st = co2_binary.substring(3, 4); + let co2calibration_st = co2_binary.substring(2, 3); + + let trigger = parseInt(trigger_st); + let button = parseInt(button_st); + let co2threshold = parseInt(co2threshold_st); + let co2calibration = parseInt(co2calibration_st); + + let co2ppm_hex = intput_list[6].toString(16).padStart(2, '0') + intput_list[5].toString(16).padStart(2, '0'); + let co2_ppm = parseInt(co2ppm_hex, 16); + co2_ppm = co2_ppm < 0 ? 0 : co2_ppm > 40000 ? 40000 : co2_ppm; + + return { + data: { + battery_volt, + temperature, + humidity, + trigger, + button, + co2threshold, + co2calibration, + co2_ppm + }, + }; + } + else if (fPort==127 && payloadlens==6){ + let intput_list = input.bytes; + let battery_int = intput_list[1]; + let battery_volt = (21 + battery_int) / 10; + + let temperature_int = intput_list[2]; + let temperature = temperature_int > 125 ? temperature_int - 256 : temperature_int; + + let humidity = intput_list[3]; + + let co2_hex = intput_list[0].toString(16).padStart(2, '0'); + let co2_binary = hex2bin(co2_hex); + let trigger_st = co2_binary.substring(7, 8); + let button_st = co2_binary.substring(6, 7); + let co2threshold_st = co2_binary.substring(3, 4); + let co2calibration_st = co2_binary.substring(2, 3); + + let trigger = parseInt(trigger_st); + let button = parseInt(button_st); + let co2threshold = parseInt(co2threshold_st); + let co2calibration = parseInt(co2calibration_st); + + let co2ppm_hex = intput_list[5].toString(16).padStart(2, '0') + intput_list[4].toString(16).padStart(2, '0'); + let co2_ppm = parseInt(co2ppm_hex, 16); + co2_ppm = co2_ppm < 0 ? 0 : co2_ppm > 40000 ? 40000 : co2_ppm; + + return { + data: { + battery_volt, + temperature, + humidity, + trigger, + button, + co2threshold, + co2calibration, + co2_ppm + }, + }; + } + else{ + return { + data: { + fPort: input.fPort, + payloadlength: input.bytes.length, + message: 'Invalid fPort or payload length' + }, + }; + } +} + +////////////* MerryIot CO2 sensor End !!*//////////// + +/** + * Encode downlink function. + * + * @param {object} input + * @param {object} input.data Object representing the payload that must be encoded. + * @param {Record} input.variables Object containing the configured device variables. + * + * @returns {{bytes: number[]}} Byte array containing the downlink payload. + */ +function encodeDownlink(input) { + return { + // bytes: [225, 230, 255, 0] + }; +} diff --git a/vendors/browan/codecs/merryiot-dw10.js b/vendors/browan/codecs/merryiot-dw10.js new file mode 100644 index 0000000..1605283 --- /dev/null +++ b/vendors/browan/codecs/merryiot-dw10.js @@ -0,0 +1,128 @@ +////////////* MerryIot Open/Close sensor*//////////// + +//hex to binary function +function hex2bin(hex){ + return (parseInt(hex, 16).toString(2)).padStart(8, '0'); +} + +//MerryIot Open/Close sensor +function decodeUplink(input) { + let fPort = input.fPort; + let payloadlens = input.bytes.length; + if(fPort==120 && payloadlens==10){ + let intput_list = input.bytes; + let battery_int = intput_list[1]; + let battery_volt = (21 + battery_int) / 10; + + let temperature_hex = intput_list[3].toString(16).padStart(2, '0') + intput_list[2].toString(16).padStart(2, '0'); + let temperature_val = parseInt(temperature_hex, 16); + let temperature = temperature_val > 1250 ? (temperature_val - 65536) / 10 : temperature_val / 10; + + let humi = intput_list[4]; + + let door_hex = intput_list[0].toString(16).padStart(2, '0'); + let door_binary = hex2bin(door_hex); + let open_st = door_binary.substring(7, 8); + let button_st = door_binary.substring(6, 7); + let tamper_st = door_binary.substring(5, 6); + let tilt_st = door_binary.substring(4, 5); + + let open = parseInt(open_st); + let button = parseInt(button_st); + let tamper = parseInt(tamper_st); + let tilt = parseInt(tilt_st); + + let time_hex = intput_list[6].toString(16).padStart(2, '0') + intput_list[5].toString(16).padStart(2, '0'); + let time = parseInt(time_hex, 16); + + let count_hex = intput_list[9].toString(16).padStart(2, '0') + intput_list[8].toString(16) + intput_list[7].toString(16).padStart(2, '0'); + let count = parseInt(count_hex, 16); + + return { + data: { + battery_volt, + temperature, + humi, + open, + button, + tamper, + tilt, + time, + count + }, + }; + } + else if (fPort==120 && payloadlens==9){ + let intput_list = input.bytes; + let battery_int = intput_list[1]; + let battery_volt = (21 + battery_int) / 10; + + let temperature_int = intput_list[2]; + let temperature; + if(temperature_int > 125){ + temperature = temperature_int - 256; + } else { + temperature = temperature_int; + } + + let humi = intput_list[3]; + + let door_hex = intput_list[0].toString(16).padStart(2, '0'); + let door_binary = hex2bin(door_hex); + let open_st = door_binary.substring(7, 8); + let button_st = door_binary.substring(6, 7); + let tamper_st = door_binary.substring(5, 6); + let tilt_st = door_binary.substring(4, 5); + + let open = parseInt(open_st); + let button = parseInt(button_st); + let tamper = parseInt(tamper_st); + let tilt = parseInt(tilt_st); + + let time_hex = intput_list[5].toString(16).padStart(2, '0') + intput_list[4].toString(16).padStart(2, '0'); + let time = parseInt(time_hex, 16); + + let count_hex = intput_list[8].toString(16).padStart(2, '0') + intput_list[7].toString(16).padStart(2, '0') + intput_list[6].toString(16).padStart(2, '0'); + let count = parseInt(count_hex, 16); + + return { + data: { + battery_volt, + temperature, + humi, + open, + button, + tamper, + tilt, + time, + count + }, + }; + } + else{ + return { + data: { + fPort: input.fPort, + payloadlength: input.bytes.length, + message: 'Invalid fPort or payload length' + }, + }; + } +} + +////////////* MerryIot Open/Close sensor End !!*//////////// + +/** + * Encode downlink function. + * + * @param {object} input + * @param {object} input.data Object representing the payload that must be encoded. + * @param {Record} input.variables Object containing the configured device variables. + * + * @returns {{bytes: number[]}} Byte array containing the downlink payload. + */ +function encodeDownlink(input) { + return { + // bytes: [225, 230, 255, 0] + }; +} diff --git a/vendors/browan/codecs/tabs-tbhh100.js b/vendors/browan/codecs/tabs-tbhh100.js new file mode 100644 index 0000000..5b78777 --- /dev/null +++ b/vendors/browan/codecs/tabs-tbhh100.js @@ -0,0 +1,44 @@ +function decodeUplink(input) { + const bytes = input.bytes; + const fPort = input.fPort; + const len = bytes.length; + + if (fPort === 222 && len === 17) { + const hex = bytes.map(b => b.toString(16).padStart(2, '0')).join(''); + const bootloader = hex.slice(2, 10).match(/../g).reverse().join(''); + const HW_ID = hex.slice(10, 18).match(/../g).reverse().join(''); + const FW_CRC = hex.slice(18, 26).match(/../g).reverse().join(''); + return { data: { fPort, bootloader, HW_ID, FW_CRC } }; + } + else if (fPort === 204 && len === 12) { + const hex = bytes.map(b => b.toString(16).padStart(2, '0')).join(''); + const thh_keepalive = parseInt(hex.slice(2, 6).match(/../g).reverse().join(''), 16); + const thh_Monitor = parseInt(hex.slice(8, 12).match(/../g).reverse().join(''), 16); + const thh_temptrig = bytes[7]; + const thh_rhtrig = bytes[9]; + return { data: { fPort, len, thh_keepalive, thh_Monitor, thh_temptrig, thh_rhtrig } }; + } + else if (fPort === 103 && len === 8) { + const battery_volt = (25 + (bytes[1] & 0x0F)) / 10; + const temperature = (bytes[2] & 0x7F) - 32; + const humidity = bytes[3] & 0x3F; + const thh_type = (bytes[0] >> 4) & 0x01; + return { data: { fPort, battery_volt, temperature, humidity, thh_type, CO2: 0, VOC: 0 } }; + } + return { data: { fPort, payloadlength: len, message: 'Invalid fPort or payload length' } }; +} + +/** + * Encode downlink function. + * + * @param {object} input + * @param {object} input.data Object representing the payload that must be encoded. + * @param {Record} input.variables Object containing the configured device variables. + * + * @returns {{bytes: number[]}} Byte array containing the downlink payload. + */ +function encodeDownlink(input) { + return { + // bytes: [225, 230, 255, 0] + }; +} diff --git a/vendors/browan/codecs/tabs-tbms100.js b/vendors/browan/codecs/tabs-tbms100.js new file mode 100644 index 0000000..8186c76 --- /dev/null +++ b/vendors/browan/codecs/tabs-tbms100.js @@ -0,0 +1,48 @@ +function decodeUplink(input) { + const bytes = input.bytes; + const fPort = input.fPort; + const len = bytes.length; + + if (fPort === 222 && len === 17) { + const hex = bytes.map(b => b.toString(16).padStart(2, '0')).join(''); + const bootloader = hex.slice(2, 10).match(/../g).reverse().join(''); + const HW_ID = hex.slice(10, 18).match(/../g).reverse().join(''); + const FW_CRC = hex.slice(18, 26).match(/../g).reverse().join(''); + return { data: { fPort, bootloader, HW_ID, FW_CRC } }; + } + else if (fPort === 204 && len === 16) { + const hex = bytes.map(b => b.toString(16).padStart(2, '0')).join(''); + const mot_keepalive = parseInt(hex.slice(2, 6).match(/../g).reverse().join(''), 16); + const mot_occupied = parseInt(hex.slice(8, 12).match(/../g).reverse().join(''), 16); + const mot_free = bytes[7]; + const mot_trigct = parseInt(hex.slice(18, 22).match(/../g).reverse().join(''), 16); + const mot_parmter = hex.slice(24, 32).match(/../g).reverse().join(''); + return { data: { fPort, len, mot_keepalive, mot_occupied, mot_free, mot_trigct, mot_parmter } }; + } + else if (fPort === 102 && len === 8) { + const battery_volt = (25 + (bytes[1] & 0x0F)) / 10; + const temperature = (bytes[2] & 0x7F) - 32; + const motion_st = bytes[0] & 0x01; + const mot_timehex = bytes[4].toString(16).padStart(2, '0') + bytes[3].toString(16).padStart(2, '0'); + const mot_times = parseInt(mot_timehex, 16); + const mot_counthex = bytes[6].toString(16).padStart(2, '0') + bytes[5].toString(16).padStart(2, '0'); + const mot_counts = parseInt(mot_counthex, 16); + return { data: { fPort, battery_volt, temperature, mot_motionst: motion_st, mot_times, mot_counts } }; + } + return { data: { fPort, payloadlength: len, message: 'Invalid fPort or payload length' } }; +} + +/** + * Encode downlink function. + * + * @param {object} input + * @param {object} input.data Object representing the payload that must be encoded. + * @param {Record} input.variables Object containing the configured device variables. + * + * @returns {{bytes: number[]}} Byte array containing the downlink payload. + */ +function encodeDownlink(input) { + return { + // bytes: [225, 230, 255, 0] + }; +} diff --git a/vendors/browan/codecs/test_decode_browan-industrial-tracker.json b/vendors/browan/codecs/test_decode_browan-industrial-tracker.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/vendors/browan/codecs/test_decode_browan-industrial-tracker.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/vendors/browan/codecs/test_decode_merryiot-cd10.json b/vendors/browan/codecs/test_decode_merryiot-cd10.json new file mode 100644 index 0000000..2fed51d --- /dev/null +++ b/vendors/browan/codecs/test_decode_merryiot-cd10.json @@ -0,0 +1,12 @@ +[ + { + "name": "test 1 - MerryIot Co2 Air Quality", + "input": { + "fPort": 0x7f, // fPort 127 + "bytes": [0x00,0x0f,0x19,0x20,0x0c,0x02] + }, + "expected": { + "data": {"battery_volt":3.6,"temperature":25,"humidity":32,"trigger":0,"button":0,"co2threshold":0,"co2calibration":0,"co2_ppm":524} + } + } +] \ No newline at end of file diff --git a/vendors/browan/codecs/test_decode_merryiot-dw10.json b/vendors/browan/codecs/test_decode_merryiot-dw10.json new file mode 100644 index 0000000..b173efe --- /dev/null +++ b/vendors/browan/codecs/test_decode_merryiot-dw10.json @@ -0,0 +1,12 @@ +[ + { + "name": "test 1 - MerryIot Open/Close sensor", + "input": { + "fPort": 0x78, // fPort 120 + "bytes": [0x00,0x0f,0x15,0x1c,0x00,0x00,0xd2,0x25,0x00] + }, + "expected": { + "data": {"battery_volt":3.6,"temperature":21,"humi":28,"open":0,"button":0,"tamper":0,"tilt":0,"time":0,"count":9682} + } + } +] \ No newline at end of file diff --git a/vendors/browan/codecs/test_decode_tabs-tbhh100.json b/vendors/browan/codecs/test_decode_tabs-tbhh100.json new file mode 100644 index 0000000..498a4a4 --- /dev/null +++ b/vendors/browan/codecs/test_decode_tabs-tbhh100.json @@ -0,0 +1,22 @@ +[ + { + "name": "test 1 - Tabs TBHH100 Temperature/Humidity", + "input": { + "fPort": 0x67, // fPort 103 + "bytes": [0x08,0x0b,0x23,0x2f,0xff,0xff,0xff,0xff] + }, + "expected": { + "data": {"fPort":103,"battery_volt":3.6,"temperature":3,"humidity":47,"thh_type":0,"CO2":0,"VOC":0} + } + }, + { + "name": "test 2 - Tabs TBHH100 Temperature/Humidity", + "input": { + "fPort": 0x67, // fPort 103 + "bytes": [0x08,0x0a,0x0d,0x3a,0xff,0xff,0xff,0xff] + }, + "expected": { + "data": {"fPort":103,"battery_volt":3.5,"temperature":-19,"humidity":58,"thh_type":0,"CO2":0,"VOC":0} + } + } +] \ No newline at end of file diff --git a/vendors/browan/codecs/test_decode_tabs-tbms100.json b/vendors/browan/codecs/test_decode_tabs-tbms100.json new file mode 100644 index 0000000..d2500a8 --- /dev/null +++ b/vendors/browan/codecs/test_decode_tabs-tbms100.json @@ -0,0 +1,12 @@ +[ + { + "name": "test 1 - Tabs TBMS100 IR Motion Sensor", + "input": { + "fPort": 0x66, // fPort 102 + "bytes": [0x08,0x0b,0x23,0x2f,0xff,0xff,0xff,0xff] + }, + "expected": { + "data": {"fPort":102,"battery_volt":3.6,"temperature":3,"mot_motionst":0,"mot_times":65327,"mot_counts":65535} + } + } +] \ No newline at end of file diff --git a/vendors/browan/codecs/test_encode_browan-industrial-tracker.json b/vendors/browan/codecs/test_encode_browan-industrial-tracker.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/vendors/browan/codecs/test_encode_browan-industrial-tracker.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/vendors/browan/codecs/test_encode_merryiot-cd10.json b/vendors/browan/codecs/test_encode_merryiot-cd10.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/vendors/browan/codecs/test_encode_merryiot-cd10.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/vendors/browan/codecs/test_encode_merryiot-dw10.json b/vendors/browan/codecs/test_encode_merryiot-dw10.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/vendors/browan/codecs/test_encode_merryiot-dw10.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/vendors/browan/codecs/test_encode_tabs-tbhh100.json b/vendors/browan/codecs/test_encode_tabs-tbhh100.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/vendors/browan/codecs/test_encode_tabs-tbhh100.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/vendors/browan/codecs/test_encode_tabs-tbms100.json b/vendors/browan/codecs/test_encode_tabs-tbms100.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/vendors/browan/codecs/test_encode_tabs-tbms100.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/vendors/browan/devices/browan-industrial-tracker.toml b/vendors/browan/devices/browan-industrial-tracker.toml new file mode 100644 index 0000000..d320879 --- /dev/null +++ b/vendors/browan/devices/browan-industrial-tracker.toml @@ -0,0 +1,17 @@ +[device] +id = "4ab69083-2dc9-460c-b988-9558d85abb72" +name = "Browan Industrial Tracker" +description = "Browan's Industrial GPS Tracker is a versatile GPS tracking device designed for a wide range of applications, including bicycles, vehicles, and pets. Utilizing advanced LoRaWAN® connectivity and a high-resolution GNSS module, it offers reliable location tracking without the costs associated with traditional GPRS networks. With an IP66 rating, this durable tracker is built to withstand harsh environments, ensuring consistent performance in various conditions. Its integrated 3-axis accelerometer enhances tracking accuracy, making it an ideal choice for both personal and commercial asset management." + +[[device.firmware]] +version = "1.01" +profiles = [ + "AS923-1_0_3.toml", + "AU915-1_0_3.toml", + "EU868-1_0_3.toml", + "US915-1_0_3.toml", +] +codec = "browan-industrial-tracker.js" + +[device.metadata] +product_url = "https://www.browan.com/products-detail/Industrial-GPS-Tracker/" diff --git a/vendors/browan/devices/merryiot-cd10.toml b/vendors/browan/devices/merryiot-cd10.toml new file mode 100644 index 0000000..fe8d63a --- /dev/null +++ b/vendors/browan/devices/merryiot-cd10.toml @@ -0,0 +1,8 @@ +[device] +id = "a38dbec2-7c34-41fc-89b7-5f7241bf09fa" +name = "MerryIoT CD10 Air Quality CO2" +description = "CO2, Temperature and Humidity" +firmware = [] + +[device.metadata] +product_url = "https://www.browan.com/products-detail/Air-Quality-CO2-Sensor-LoRaWAN/" diff --git a/vendors/browan/devices/merryiot-dw10.toml b/vendors/browan/devices/merryiot-dw10.toml new file mode 100644 index 0000000..390dbcf --- /dev/null +++ b/vendors/browan/devices/merryiot-dw10.toml @@ -0,0 +1,8 @@ +[device] +id = "4fed4def-1c99-48cb-a515-2e4160368363" +name = "MerryIoT DW10 Open/Close Sensor" +description = "Open/Close, Temperature, Humidity, Vibration" +firmware = [] + +[device.metadata] +product_url = "https://www.browan.com/products-detail/OpenClose-Sensor-EBL-LoRaWAN/" diff --git a/vendors/browan/devices/tabs-tbhh100-temperature-humidity-sensor.toml b/vendors/browan/devices/tabs-tbhh100-temperature-humidity-sensor.toml new file mode 100644 index 0000000..b128990 --- /dev/null +++ b/vendors/browan/devices/tabs-tbhh100-temperature-humidity-sensor.toml @@ -0,0 +1,8 @@ +[device] +id = "c81e9b35-a7ec-48fc-a8a0-6ffdb342cd17" +name = "Tabs TBHH100 Temperature & Humidity Sensor" +description = "The Tabs temperature and humidity sensor is designed for in-home and in-building usage for consumer or facility management applications. The design is optimized for high-volume manufacturing, optimal battery lifetime, and pleasing aesthetics for in-building placement." +firmware = [] + +[device.metadata] +product_url = "https://www.browan.com/products-detail/Temperature-Humidity-Sensor/" diff --git a/vendors/browan/profiles/AS923-1_0_3.toml b/vendors/browan/profiles/AS923-1_0_3.toml new file mode 100644 index 0000000..4c5b92a --- /dev/null +++ b/vendors/browan/profiles/AS923-1_0_3.toml @@ -0,0 +1,25 @@ +[profile] +id = "cd4f4bf9-8b2c-4ea4-9aea-dcbe455d11fa" +vendor_profile_id = 0 +region = "AS923" +mac_version = "1.0.3" +reg_params_revision = "A" +supports_otaa = true +supports_class_b = false +supports_class_c = false +max_eirp = 16 + +[profile.abp] +rx1_delay = 0 +rx1_dr_offset = 0 +rx2_dr = 0 +rx2_freq = 0 + +[profile.class_b] +timeout_secs = 0 +ping_slot_nb_k = 0 +ping_slot_dr = 0 +ping_slot_freq = 0 + +[profile.class_c] +timeout_secs = 0 diff --git a/vendors/browan/profiles/AU915-1_0_3.toml b/vendors/browan/profiles/AU915-1_0_3.toml new file mode 100644 index 0000000..0eece8a --- /dev/null +++ b/vendors/browan/profiles/AU915-1_0_3.toml @@ -0,0 +1,25 @@ +[profile] +id = "336ff9c3-1aee-4988-a97a-59ada331419b" +vendor_profile_id = 0 +region = "AU915" +mac_version = "1.0.3" +reg_params_revision = "A" +supports_otaa = true +supports_class_b = false +supports_class_c = false +max_eirp = 27 + +[profile.abp] +rx1_delay = 0 +rx1_dr_offset = 0 +rx2_dr = 0 +rx2_freq = 0 + +[profile.class_b] +timeout_secs = 0 +ping_slot_nb_k = 0 +ping_slot_dr = 0 +ping_slot_freq = 0 + +[profile.class_c] +timeout_secs = 0 diff --git a/vendors/browan/profiles/EU868-1_0_3.toml b/vendors/browan/profiles/EU868-1_0_3.toml new file mode 100644 index 0000000..be771d9 --- /dev/null +++ b/vendors/browan/profiles/EU868-1_0_3.toml @@ -0,0 +1,25 @@ +[profile] +id = "8ab802de-ee04-4c63-b135-a2c5aa9f4870" +vendor_profile_id = 0 +region = "EU868" +mac_version = "1.0.3" +reg_params_revision = "A" +supports_otaa = true +supports_class_b = false +supports_class_c = false +max_eirp = 16 + +[profile.abp] +rx1_delay = 0 +rx1_dr_offset = 0 +rx2_dr = 0 +rx2_freq = 0 + +[profile.class_b] +timeout_secs = 0 +ping_slot_nb_k = 0 +ping_slot_dr = 0 +ping_slot_freq = 0 + +[profile.class_c] +timeout_secs = 0 diff --git a/vendors/browan/profiles/US915-1_0_3.toml b/vendors/browan/profiles/US915-1_0_3.toml new file mode 100644 index 0000000..0d4add7 --- /dev/null +++ b/vendors/browan/profiles/US915-1_0_3.toml @@ -0,0 +1,25 @@ +[profile] +id = "d3fb7cef-7745-4d27-81b5-529942c8f7ad" +vendor_profile_id = 0 +region = "US915" +mac_version = "1.0.3" +reg_params_revision = "A" +supports_otaa = true +supports_class_b = false +supports_class_c = false +max_eirp = 27 + +[profile.abp] +rx1_delay = 0 +rx1_dr_offset = 0 +rx2_dr = 0 +rx2_freq = 0 + +[profile.class_b] +timeout_secs = 0 +ping_slot_nb_k = 0 +ping_slot_dr = 0 +ping_slot_freq = 0 + +[profile.class_c] +timeout_secs = 0 diff --git a/vendors/browan/vendor.toml b/vendors/browan/vendor.toml new file mode 100644 index 0000000..07c9ec1 --- /dev/null +++ b/vendors/browan/vendor.toml @@ -0,0 +1,15 @@ +[vendor] +id = "a782551b-91d3-4aee-b362-afdc91d537a0" +name = "Browan" +vendor_id = 613 +ouis = ["e8e1e1"] +devices = [ + "browan-industrial-tracker.toml", + "merryiot-cd10.toml", + "merryiot-dw10.toml", + "merryiot-ms10.toml", + "merryiot-wl10.toml", +] + +[vendor.metadata] +homepage = "https://www.browan.com/"