Page cover image

Ambiance Monitor

Product Datasheet

Device Profile for Tesenso IoT Cloud

Decoder/Payload Converter for Tesenso IoT Cloud

https://github.com/Tesenso-GmbH/Device-Decoder/blob/main/Decentlab_Ambiance_Monitor.js
//V1.0, 09.08.2021,DS
//V1.1 04.09.2021, FU: changed pir to motion

if (msg.data) {
    var decoded = decodeFromHex(msg.data);
    decoded.ts = msg.ts;
    decoded.rssi = msg.rssi;
    decoded.snr = msg.snr;
    decoded.toa = msg.toa;
    decoded.frequency = msg.frequency;
    decoded.dr = msg.dr;
    decoded.bat = decodeBattery(msg.bat);
    decoded.hex = msg.data;

    return {
        msg: decoded,
        metadata: metadata,
        msgType: msgType
    };
} else {
    return {
        msg: msg,
        metadata: metadata,
        msgType: msgType
    };
}

function decodeFromHex(data) {
    // Decode an uplink message from a buffer
    // (array) of bytes to an object of fields.
    var decoded = {};

    //Temperature
    var rawTemp = data.substr(14, 4);
    var intTemp = parseInt(rawTemp, 16);
    var doubleTemp = intTemp * 175 / 65535 - 45;
    decoded.temperature = doubleTemp;

    //Humidity
    var rawHum = data.substr(18, 4);
    var intHum = parseInt(rawHum, 16);
    var hum = 100 * intHum / 65536;
    decoded.humidity = hum;

    //Pressure
    var rawPressure = data.substr(22, 4);
    var intPressure = parseInt(rawPressure, 16);
    var pressure = intPressure * 2;
    decoded.barometricPressure = pressure;


    //CO2
    var rawCO2 = data.substr(34, 4);
    var intCO2 = parseInt(rawCO2, 16);
    var co2 = intCO2 - 32768;
    decoded.co2 = co2;

    //PIR = motion
    var rawmotion = data.substr(46, 4);
    var intmotion = parseInt(rawmotion, 16);
    var motion = intmotion;
    decoded.motion = motion;

    //VOC
    var rawVOC = data.substr(50, 4);
    var intVOC = parseInt(rawVOC, 16);
    var voc = intVOC;
    decoded.voc = voc;

    //Battery
    var rawBattery = data.substr(10, 4);
    var intBattery = parseInt(rawBattery, 16);
    var battery = intBattery/1000.00;
    decoded.batteryVoltage = battery;


    return decoded;
}

function parseHexString(hex) {
    for (var bytes = [], c = 0; c < hex.length; c += 2) {
        bytes.push(parseInt(hex.substr(c, 2), 16));
    }
    return bytes;
}

function decodeBattery(byte) {
    if (byte == 0) {
        return 'External power source';
    } else if (byte > 0 && byte < 255) {
        return byte / 254 * 100;
    } else {
        return 'Unknown battery state';
    }
}

Device Labels

in manual
dataKey
dataType
dataFormat

Battery voltage

batteryVoltage

telemetry

float

Air temperature

temperature

telemetry

float

Air humidity

humidity

telemetry

float

Barometric pressure

barometricPressure

telemetry

integer

CO2 concentration

co2

telemetry

integer

PIR sensor: activity counter

motion

telemetry

integer

Gas sensor: total VOC

voc

telemetry

integer

Downlink command encoder
Up-/Downlink documentation
Payload Test

Details

Field
Parameter Name
Type
Conversion
Unit

Header

Version

uint8

Header

Device ID

uint16

Header

Flags

uint16

Sensor 0

Battery voltage

uint16

x / 1000

V

Sensor 1

Air temperature

uint16

x / 65535 ∙ 175 − 45

°C

Sensor 1

Air humidity

uint16

x / 65535 ∙ 100

%

Sensor 2

Barometric pressure

uint16

x ∙ 2

Pa

Sensor 3

Ambient light CH0 (visible + infrared)

uint16

x

Sensor 3

Ambient light CH1 (infrared)

uint16

x

Sensor 4

CO2 concentration

uint16

x - 32768

ppm

Sensor 4

CO2 sensor status

uint16

x

Sensor 4

Raw IR reading

uint16

x

Sensor 5

PIR sensor: activity counter

uint16

x

Sensor 6

Gas sensor: total VOC

uint16

x

ppb

sample Message (hex) (all sensor data included):

020bbd007f0b926a515d48bc4e0262006981c7000093d4000b0111

Field
Parameter Name
Conversion
Unit

02

Version

2

0bbd

Device ID

3005

007f

Flags

0b0000000001111111

0b92

Battery voltage

2.96

V

6a51

Air temperature

27.68

deg

5d48

Air humidity

36.44

%

bc4e

Barometric pressure

96412

Pa

0262

Ambient light CH0

610

0069

Ambient light CH1

105

81c7

CO2 concentration

455

ppm

0000

CO2 sensor status

0

93d4

Raw IR reading

37844

000b

PIR activity counter

11

0111

Gas sensor: total VOC

273

ppb

Illuminance

679

lx

sample Message(hex) (battery voltage only):

020bbd00010b92

Field
Parameter Name
Conversion
Unit

02

Version

2

0bbd

Device ID

3005

0001

Flags

0b0000000000000001

0b92

Battery voltage

2.96

V

Command List

Command
Code
Description
Firmware

set period

0x0001

Set sampling period in seconds (1...65535).

≥ 0.2.7

set period + save

0x0002

... + save settings

≥ 0.2.7

set dr

0x0003

Set default TX data rate. Used for next TX. Actual data rate for following TX may vary, if ADR is enabled.

≥ 0.2.7

set dr + save

0x0004

... + save settings

≥ 0.2.7

set adr on

0x0005

Enable ADR.

≥ 0.2.7

set adr on + save

0x0006

... + save settings

≥ 0.2.7

set adr off

0x0007

Disable ADR.

≥ 0.2.7

set adr off + save

0x0008

... + save settings

≥ 0.2.7

set dr_min

0x0009

Set minimum data rate (dr_min overrides ADR settings)

≥ 1.2.0

set dr_min + save

0x000A

... + save settings

≥ 1.2.0

set dr_max

0x000B

Set maximum data rate (dr_max overrides ADR settings)

≥ 1.2.0

set dr_max + save

0x000C

... + save settings

≥ 1.2.0

set pwridx_min

0x000D

Set minimum TX power index (overrides ADR settings)

≥ 1.2.0

set pwridx_min + save

0x000E

... + save settings

≥ 1.2.0

set pwridx_max

0x000F

Set maximum TX power index (overrides ADR settings)

≥ 1.2.0

set pwridx_max + save

0x0010

... + save settings

≥ 1.2.0

set send_period

0x0011

Set send period. Examples: 0 or 1: send after every sampling. 4: send after every fourth sampling.

≥ 1.4.0

set send_period + save

0x0012

... + save settings

≥ 1.4.0

set join_period

0x0013

Set re-join period in hours (0... 1000). Examples: 24: re-join network every 24 hours. 0: never re-join

≥ 1.4.2

set join_period + save

0x0014

... + save settings

≥ 1.4.2

set pwridx

0x0015

Set default TX power index. Used for next TX. Actual pwridx for following TX may vary, if ADR is enabled.

≥ 1.4.5

set pwridx + save

0x0016

... + save settings

≥ 1.4.5

set linkcheck_period

0x0017

Set link check period (default: 36)

≥ 1.5.0

set linkcheck_period + save

0x0018

... + save settings

≥ 1.5.0

set linkcheck_tolerance

0x0019

Set link check period (default: 6)

≥ 1.5.0

set linkcheck_tolerance + save

0x001A

... + save settings

≥ 1.5.0

set linkcheck_limit

0x001B

Set link check limit (default: 12)

≥ 1.5.0

set linkcheck_limit + save

0x001C

... + save settings

≥ 1.5.0

set port

0x001D

Set LoRaWAN uplink port (1...223, default: 1)

≥ 1.6.0

set port + save

0x001E

... + save settings

≥ 1.6.0

set param 0 set param 1 ... set param 15

0x0020 0x0021 ... 0x002F

Set device specific parameter 0. Range: 0...65534; 65535: parameter is ignored. Set device specific parameter 1 ... Set device specific parameter 15

≥ 1.4.0

set sensor_period 0 set sensor_period 1 ... set sensor_period 9

0x0050 0x0051 ... 0x0059

Set (sub-)sampling period of sensor 0 Set (sub-)sampling period of sensor 1 ... Set (sub-)sampling period of sensor 9

≥ 1.4.5

set sensor_period 0 + save set sensor_period 1 + save ... set sensor_period 9 + save

0x0060 0x0061 ... 0x0069

... + save settings

≥ 1.4.5

reset

0xFEFE

Reset device. Unsaved parameter changes are lost.

≥ 0.2.7

factory reset

0xFEF0

Erase settings in flash and reset

≥ 0.2.7

sleep

0xFEF1

Enter sleep mode (power off)

≥ 1.5.0

Command
Code

set period 60 seconds + save

0002003CF5A1

set dr 2 + save

0004000224C0

set send_period 20 + save

001200142EA0

reset

FEFE00003C50

factory reset

FEF00000FF31

FAQ

Macht das Abschalten der Kalibrierfunktion in einem Raum ohne Frischluft Sinn?

Antwort von Reinhard Bischoff Fr 19.07.2024 09:13 Also eine grosse Produktionshalle hat immer wieder Austausch mit Frischluft / "undichte Stellen". Vorallem dann auch über Nacht, wenn niemand vor Ort ist, gibt es schon einen Ausgleich.

(also kommt ganz auf die Produktionshalle/Anwendung an). -> zuwenig spezifisch

Ich würde mal ABC Kalibierung eingeschaltet lassen (Standardwerte) und dann beobachten.

Am Anfang ist ja das kalibiert, resp. siehst du die ca. 400 ppm.

In den ersten Tagen siehst du dann die Dynamik in dieser Halle und somit Idee ob es ab und an auf frische Luftwert kommt. (Wohl wird es ja auch eine Lüftung haben -> somit auch Frischluft Atmospäre) Also nehme ich mal an.

-> Falls doch schwierig, kann man diese Kalibrierung später noch abschalten/tunen.

-> Ich würde mit dem normalen/robusten starten, und bei Bedarf nachträglich nur korrigieren.

NB: der Wert/Offset steigt nicht rapide, sondern habe auch ein Moving Average ähnlich drin.

Wo es Sinn macht Kalibrierung zu überlegen:

Hightech Gewächshäuser. Dort wird extra CO2 angereichert, bis 1200 ppm oder auch höher. Denn bei hoher Beleuchtung / UV Strahlung braucht die Pflanze höhere CO2 Konzentration, sonst geht sie kaputt. Sprich schnelles Wachstum/viel Licht/Photosynthese braucht zwingend mehr CO2 Konzentration

-> Das ist aber nur in ganz speziellen Gewächshäuser und Hightech Agri Use Case

Anderer Fall:

Weinkeller resp. während der Gärung dort. Bei der Gärung in Weinkeller (also im Herbst, nach Lese) kann sehr hohe CO2 Konzentration im Weinkeller aufkommen. Deshalb braucht es dort manuelle Alarmgeräte für CO2 (also richtig hohe Konzentrationen) wegen Arbeitssicherheit. Sprich, kann eben gefährlich sein. -> früher (teils auch heute?) gibt es darum Kerzen im Keller. (nicht ganz sicher)

Während der Lagerung (also nach Gärung, dauert gar nicht so lange) weniger relevant. Aber ja in einem unbelüfteten Weinkeller kann es sein, dass sich ein höheres Niveau einpendelt. Aber auch dort gibt es ein Plateau.

Andere Anwendungen Saatgut etc. welches nicht belüftet ist.

Last updated