Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
sjackle committed Sep 2, 2024
2 parents 489fa9d + f6cf8f2 commit 5bfa4be
Show file tree
Hide file tree
Showing 41 changed files with 6,528 additions and 1 deletion.
15 changes: 15 additions & 0 deletions vendor/atomsenses/as-201-codec.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Uplink decoder decodes binary data uplink into a JSON object (optional)
# For documentation on writing encoders and decoders, see: https://www.thethingsindustries.com/docs/integrations/payload-formatters/javascript/
uplinkDecoder:
fileName: as-201.js
examples:
- description: 3 in 1 Ambience Monitoring Sensors (example 1) - Atomsenses
input:
fPort: 85
bytes: [0x01, 0x75, 0x5C, 0x03, 0x67, 0x34, 0x01, 0x04, 0x68, 0x65, 0x07, 0x7D, 0xE7, 0x04]
output:
data:
battery: 92
co2: 1255
humidity: 50.5
temperature: 30.8
47 changes: 47 additions & 0 deletions vendor/atomsenses/as-201-profile.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# LoRaWAN MAC version: 1.0, 1.0.1, 1.0.2, 1.0.3, 1.0.4 or 1.1
macVersion: '1.0.3'
# LoRaWAN Regional Parameters version. Values depend on the LoRaWAN version:
# 1.0: TS001-1.0
# 1.0.1: TS001-1.0.1
# 1.0.2: RP001-1.0.2 or RP001-1.0.2-RevB
# 1.0.3: RP001-1.0.3-RevA
# 1.0.4: RP002-1.0.0 or RP002-1.0.1
# 1.1: RP001-1.1-RevA or RP001-1.1-RevB
regionalParametersVersion: 'RP001-1.0.3-RevA'

# Whether the end device supports join (OTAA) or not (ABP)
supportsJoin: true
# If your device is an ABP device (supportsJoin is false), uncomment the following fields:
# RX1 delay
#rx1Delay: 5
# RX1 data rate offset
#rx1DataRateOffset: 0
# RX2 data rate index
#rx2DataRateIndex: 0
# RX2 frequency (MHz)
#rx2Frequency: 869.525
# Factory preset frequencies (MHz)
#factoryPresetFrequencies: [868.1, 868.3, 868.5, 867.1, 867.3, 867.5, 867.7, 867.9]

# Maximum EIRP
maxEIRP: 16
# Whether the end device supports 32-bit frame counters
supports32bitFCnt: true

# Whether the end device supports class B
supportsClassB: false
# If your device supports class B, uncomment the following fields:
# Maximum delay for the end device to answer a MAC request or confirmed downlink frame (seconds)
#classBTimeout: 60
# Ping slot period (seconds)
#pingSlotPeriod: 128
# Ping slot data rate index
#pingSlotDataRateIndex: 0
# Ping slot frequency (MHz). Set to 0 if the band supports ping slot frequency hopping.
#pingSlotFrequency: 869.525

# Whether the end device supports class C
supportsClassC: false
# If your device supports class C, uncomment the following fields:
# Maximum delay for the end device to answer a MAC request or confirmed downlink frame (seconds)
#classCTimeout: 60
92 changes: 92 additions & 0 deletions vendor/atomsenses/as-201.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@

function decodeUplink(input) {
var res = Decoder(input.bytes, input.fPort);
if (res.error) {
return {
errors: [res.error],
};
}
return {
data: res,
};
}

/**
* Payload Decoder for The Things Network
*
* Copyright 2024 Atomsenses
*
* @product AS201
*/
function Decoder(bytes, port) {
var decoded = {};

for (var i = 0; i < bytes.length;) {
var channel_id = bytes[i++];
var channel_type = bytes[i++];
// BATTERY
if (channel_id === 0x01 && channel_type === 0x75) {
decoded.battery = bytes[i];
i += 1;
}
// TEMPERATURE
else if (channel_id === 0x03 && channel_type === 0x67) {
// ℃
decoded.temperature = readInt16LE(bytes.slice(i, i + 2)) / 10;
i += 2;

// ℉
// decoded.temperature = readInt16LE(bytes.slice(i, i + 2)) / 10 * 1.8 + 32;
// i +=2;
}
// HUMIDITY
else if (channel_id === 0x04 && channel_type === 0x68) {
decoded.humidity = bytes[i] / 2;
i += 1;
}
// PIR
else if (channel_id === 0x05 && channel_type === 0x6A) {
decoded.activity = readUInt16LE(bytes.slice(i, i + 2));
i += 2;
}
// LIGHT
else if (channel_id === 0x06 && channel_type === 0x65) {
decoded.illumination = readUInt16LE(bytes.slice(i, i + 2));
decoded.infrared_and_visible = readUInt16LE(bytes.slice(i + 2, i + 4));
decoded.infrared = readUInt16LE(bytes.slice(i + 4, i + 6));
i += 6;
}
// CO2
else if (channel_id === 0x07 && channel_type === 0x7D) {
decoded.co2 = readUInt16LE(bytes.slice(i, i + 2));
i += 2;
}
// TVOC
else if (channel_id === 0x08 && channel_type === 0x7D) {
decoded.tvoc = readUInt16LE(bytes.slice(i, i + 2));
i += 2;
}
// PRESSURE
else if (channel_id === 0x09 && channel_type === 0x73) {
decoded.pressure = readUInt16LE(bytes.slice(i, i + 2)) / 10;
i += 2;
} else {
break;
}
}

return decoded;
}

/* ******************************************
* bytes to number
********************************************/
function readUInt16LE(bytes) {
var value = (bytes[1] << 8) + bytes[0];
return value & 0xffff;
}

function readInt16LE(bytes) {
var ref = readUInt16LE(bytes);
return ref > 0x7fff ? ref - 0x10000 : ref;
}
Binary file added vendor/atomsenses/as-201.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
154 changes: 154 additions & 0 deletions vendor/atomsenses/as-201.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
name: AS201 LoRaWAN Indoor Ambient Environment Sensor # Device name can not contain the vendor name
description: 3-in-1 Temp / Humidity / CO2 Sensor

# Hardware versions (optional, use when you have revisions)
hardwareVersions:
- version: '1.0'
numeric: 1
- version: '1.0-rev-A'
numeric: 2

# Firmware versions (at least one is mandatory)
firmwareVersions:
- # Firmware version
version: '1.0'
numeric: 1
# Corresponding hardware versions (optional)
hardwareVersions:
- '1.0'

# Firmware features (optional)
# Valid values are: remote rejoin (trigger a join from the application layer), transmission interval (configure how
# often he device sends a message).
features:
- remote rejoin
- transmission interval

# 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:
AS923:
# Optional identifier of the vendor of the profile. When you specify the vendorID, the profile is loaded from
# the vendorID's folder. This allows you to reuse profiles from module or LoRaWAN end device stack vendors.
# If vendorID is empty, the current vendor ID is used. In this example, the vendorID is the current vendor ID,
# which is verbose.
vendorID: atomsenses
# Identifier of the profile (lowercase, alphanumeric with dashes, max 36 characters)
id: as-201-profile
lorawanCertified: true
codec: as-201-codec
US902-928:
id: as-201-profile
lorawanCertified: true
codec: as-201-codec
EU863-870:
id: as-201-profile
lorawanCertified: true
codec: as-201-codec

# Type of device (optional)
# Valid values are: devkit, module, cots
deviceType: cots

# Sensors that this device features (optional)
# Valid values are:
# 4-20 ma, accelerometer, altitude, analog input, auxiliary, barometer, battery, button, bvoc, co, co2, conductivity, current, digital input,
# digital output, dissolved oxygen, distance, dust, energy, gps, gyroscope, h2s, hall effect, humidity, iaq, infrared, leaf wetness, level,
# light, lightning, link, magnetometer, moisture, motion, nfc, no, no2, o3, occupancy, optical meter, particulate matter, ph, pir,
# pm2.5, pm10, potentiometer, power, precipitation, pressure, proximity, pulse count, pulse frequency, radar, rainfall, reed switch, rssi,
# sap flow, smart valve, smoke, snr, so2, solar radiation, sound, strain, surface temperature, switch, temperature, tilt, time, turbidity,
# tvoc, uv, vapor pressure, velocity, vibration, voltage, water potential, water, weight, wifi ssid, wind direction, wind speed.
sensors:
- co2
- temperature
- humidity

# Additional radios that this device has (optional)
# Valid values are: ble, nfc, wifi, cellular.
additionalRadios:
- ble
- cellular

# Bridge interfaces (optional)
# Valid values are: modbus, m-bus, can bus, rs-485, sdi-12, analog, ethernet.
bridgeInterfaces:
- m-bus
- rs-485

# Dimensions in mm (optional)
# Use width, height, length and/or diameter
dimensions:
width: 34
length: 26
height: 77

# Weight in grams (optional)
weight: 350

# Battery information (optional)
battery:
replaceable: true
type: AA

# Operating conditions (optional)
operatingConditions:
# Temperature (Celsius)
temperature:
min: -30
max: 85
# Relative humidity (fraction of 1)
relativeHumidity:
min: 0
max: 0.97

# IP rating (optional)
ipCode: IP64

# Key provisioning (optional)
# Valid values are: custom (user can configure keys), join server and manifest.
keyProvisioning:
- custom
- join server

# Key programming (optional)
# Valid values are: bluetooth, nfc, wifi, ethernet (via a webpage), serial (when the user has a serial interface to set the keys)
# and firmware (when the user should change the firmware to set the keys).
keyProgramming:
- serial
- firmware

# Key security (optional)
# Valid values are: none, read protected and secure element.
keySecurity: none

# Firmware programming (optional)
# Valid values are: serial (when the user has a serial interface to update the firmware), ethernet, fuota lorawan (when the device
# supports LoRaWAN FUOTA via standard interfaces) and fuota other (other wireless update mechanism).
firmwareProgramming:
- serial
- fuota lorawan

# Product and data sheet URLs (optional)
productURL: https://www.atomsenses.com/product/lorawan-3-in-1-co2-sensor/
dataSheetURL: https://www.atomsenses.com/wp-content/uploads/2024/07/AS-201.pdf

# Photos
photos:
main: as-201.png # Image needs to have a transparent background

# Regulatory compliances (optional)
compliances:
safety:
- body: IEC
norm: EN
standard: 62368-1
radioEquipment:
- body: ETSI
norm: EN
standard: 301 489-1
version: 2.2.0
- body: ETSI
norm: EN
standard: 301 489-3
version: 2.1.0
16 changes: 16 additions & 0 deletions vendor/atomsenses/as-202-codec.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Uplink decoder decodes binary data uplink into a JSON object (optional)
# For documentation on writing encoders and decoders, see: https://www.thethingsindustries.com/docs/integrations/payload-formatters/javascript/
uplinkDecoder:
fileName: as-202.js
examples:
- description: 4 in 1 Car Park Air Quality Monitoring Sensors (example 1) - Atomsenses
input:
fPort: 85
bytes: [0x01, 0x75, 0x5C, 0x03, 0x67, 0x34, 0x01, 0x04, 0x68, 0x65, 0x06, 0x70, 0x08, 0x07, 0x7D, 0x10, 0x00]
output:
data:
battery: 92
no2: 8
# co: 16
humidity: 50.5
temperature: 30.8
Loading

0 comments on commit 5bfa4be

Please sign in to comment.