
# Payload format

You can select different payload formats in [`paxcounter.conf`](https://github.com/cyberman54/ESP32-Paxcounter/blob/master/shared/paxcounter_orig.conf):

- ***Plain*** uses big endian format and generates json fields, e.g. useful for TTN console

- ***Packed*** uses little endian format and generates json fields

- [***CayenneLPP***](https://developers.mydevices.com/cayenne/docs/lora/#lora-cayenne-low-power-payload) generates MyDevices Cayenne readable fields


```c linenums="20" title="shared/paxcounter_orig.conf"
--8<-- "shared/paxcounter_orig.conf:20:20"
```


!!! danger "Decrepated information from the things network v2"

	If you're using [TheThingsNetwork](https://www.thethingsnetwork.org/) (TTN) you may want to use a payload converter. Go to TTN Console - Application - Payload Formats and paste the code example below in tabs Decoder and Converter. This way your MQTT application can parse the fields `pax`, `ble` and `wifi`.

	To add your device to myDevices Cayenne platform select "Cayenne-LPP" from Lora device list and use the CayenneLPP payload encoder.

	To track a paxcounter device with on board GPS and at the same time contribute to TTN coverage mapping, you simply activate the [TTNmapper integration](https://www.thethingsnetwork.org/docs/applications/ttnmapper/) in TTN Console. Both formats *plain* and *packed* generate the fields `latitude`, `longitude` and `hdop` required by ttnmapper. Important: set TTN mapper port filter to '4' (paxcounter GPS Port).


Hereafter described is the default *plain* format, which uses MSB bit numbering. Under /TTN in this repository you find some ready-to-go decoders which you may copy to your TTN console:

[**plain_decoder.js**](https://github.com/cyberman54/ESP32-Paxcounter/blob/master/src/TTN/plain_decoder.js) |
[**plain_converter.js**](https://github.com/cyberman54/ESP32-Paxcounter/blob/master/src/TTN/plain_converter.js) |
[**packed_decoder.js**](https://github.com/cyberman54/ESP32-Paxcounter/blob/master/src/TTN/packed_decoder.js) |
[**packed_converter.js**](https://github.com/cyberman54/ESP32-Paxcounter/blob/master/src/TTN/packed_converter.js)

**Port #1:** Paxcount data

	byte 1-2:		Number of unique devices, seen on Wifi [00 00 if Wifi scan disabled]
	byte 3-4:		Number of unique devices, seen on Bluetooth [ommited if BT scan disabled]

**Port #2:** Device status query result

  	byte 1-2:		Battery or USB Voltage [mV], 0 if no battery probe
	byte 3-10:		Uptime [seconds]
	byte 11: 		CPU temperature [°C]
	bytes 12-15:	Free RAM [bytes]
	byte 16:		Last CPU core 0 reset reason
	bytes 17-20:	Number of restarts since last power cycle

**Port #3:** Device configuration query result

	byte 1:			Lora DR (0..15, see rcommand 0x05) [default 5]
	byte 2:			Lora TXpower (2..15) [default 15]
	byte 3:			Lora ADR (1=on, 0=off) [default 1]
	byte 4:			Screensaver status (1=on, 0=off) [default 0]
	byte 5:			Display status (1=on, 0=off) [default 0]
	byte 6:			Counter mode (0=cyclic unconfirmed, 1=cumulative, 2=cyclic confirmed) [default 0]
	bytes 7-8:		RSSI limiter threshold value (negative, MSB) [default 0]
	byte 9:			Scan and send cycle in seconds/2 (0..255) [default 120]
	byte 10:		Wifi channel hopping interval in seconds/100 (0..255), 0 means no hopping [default 50]
	byte 11:		Bluetooth channel switch interval in seconds/100 (0..255) [default 10]
	byte 12:		Bluetooth scanner status (1=on, 0=0ff) [default 1]
	byte 13:		Wifi antenna switch (0=internal, 1=external) [default 0]
	bytes 14-15:	Sleep cycle in seconds/10 (MSB) [default 0]
	byte 16:		Payloadmask (Bitmask, 0..255, see rcommand 0x14)
	byte 17:		0 (reserved)
	bytes 18-28:	Software version (ASCII format, terminating with zero)


**Port #4:** GPS data (only if device has fature GPS, and GPS data is enabled and GPS has a fix)

	bytes 1-4:		Latitude
	bytes 5-8:		Longitude
	byte 9:			Number of satellites
	bytes 10-11:	HDOP
	bytes 12-13:	Altitude [meter]

**Port #5:** Button pressed alarm

	byte 1:			static value 0x01

**Port #6:** (unused)

**Port #7:** Environmental sensor data (only if device has feature BME)

	bytes 1-2:	Temperature [°C]
	bytes 3-4:	Pressure [hPa]
	bytes 5-6:	Humidity [%]
	bytes 7-8:	Indoor air quality index (0..500), see below

	Indoor air quality classification:
	0-50		good
	51-100		average
	101-150 	little bad
	151-200 	bad
	201-300 	worse
	301-500 	very bad

**Port #8:** Battery voltage data (only if device has feature BATT)

  	bytes 1-2:	Battery or USB Voltage [mV], 0 if no battery probe

**Port #9:** Time/Date

  	bytes 1-4:	board's local time/date in UNIX epoch (number of seconds that have elapsed since January 1, 1970 (midnight UTC/GMT), not counting leap seconds)

**Ports #10, #11, #12:** User sensor data

	Format is specified by user in function `sensor_read(uint8_t sensor)`, see `src/sensor.cpp`.
