Adding new sensors
This section explain how to add new sensors to the webhook server by editing the formatData function and addData function in the index.js file.
WEBHOOKS
If you need more information about the webhooks sent from the things stack you can checkout the documentation here.
You can also learn more about the JSON file sent by the webhook here
We also use a custom payload formatting script which you can read more about here
The formatData
function
formatData
functionThe JSON file
The format data function takes in the JSON file sent by things stack webhook and formats it into an array that makes it easier for the addData
function to insert data into the database.
The array returned a the end of the function contains the variables sensorData, sensorType, SensorboxConnector and sensorboxID. To get data into these variables you need to get them from the JSON file.
The JSON file from things stack is formatted in this way.
{
{
"f_port": 1,
"frm_payload": "AAAAAAAAAAA=",
"decoded_payload": {
"dataArray": ["0","0","0","0","0","0"],
"plugg": "0",
"sensor": "0"}
},
"rx_metadata": [{
"gateway_ids": {
"gateway_id": "test"
},
"rssi": 42,
"channel_rssi": 42,
"snr": 4.2
}]
}
//there is more in the message sent from things stack
//but we dont need more of the message than this
To get data into the variables you use a .
to go index the key-value pairs. This is done like this in the formatData
function.
sensorData = data.uplink_message.decoded_payload.dataArray //from the example above this will be an array ["0","0","0","0","0","0"]
sensorType = data.uplink_message.decoded_payload.sensor //from the example above this will be "0"
sensorboxConnector = data.uplink_message.decoded_payload.plugg //from the example above this will be "0"
sensorboxID = data.end_device_ids.device_id //from the example above this will be "0"
Adding new sensors to the function
To add new sensors to the function you need to add a new case in the switch with the sensor type as the case.
The case should format the hexadecimal values in the sensorData
array into usable values for the database.
The webserver contains three useful functions for formatting the hexadecimal values, hexToDecimal
, hexToNegOrPosNum
and the float-array-to-string
.
hexToDecimal() //takes in a hex value and converts it to a decimal value
hexToNegOrPosNum() //takes in a 4 byte hex value as a string and converts it to either a negative or positive decimal
float-to-array-to-string
//not used in this version of the server but converts an 4 byte array of hex values into a float value and vice versa
Three examples using the hexToDecimal
function, the hexToNegOrPosNum
function and the float-array-to-string
function.
case 48: //Soil humidity
sensorData = hexToDecimal(sensorData[0]+sensorData[1]) //takes the hex values from sensordata combines them and turns them into decimal
returnArray = [sensorType,sensorboxID,sensorboxConnector,sensorData]
break;
case 61: //SCD30 Sensor
//diffrent sensor values
var co2Sensor = hexToDecimal(sensorData[0]+sensorData[1]) //takes hex values at place [0],[1],[2] and [3] from sensorData and decodes them to a float value
var tempSensor = hexToNegPosNum(sensorData[2]+sensorData[3]+sensorData[4]+sensorData[5]) //takes hex values at place [4],[5],[6] and [7] from sensorData and decodes them to a float value
var humiditySensor = hexToDecimal(sensorData[6]+sensorData[7]) //takes hex values at place [8],[9],[10] and [11] from sensorData and decodes them to a float value
const floatConverter = require("float-array-to-string") //float-array-to-string is declared further up in the code
case 61: //SCD30 Sensor
var co2Sensor = floatConverter.decodeFloatArr(sensorData.slice(0,3)) //takes hex values at place [0],[1],[2] and [3] from sensorData and decodes them to a float value
var tempSensor = floatConverter.decodeFloatArr(sensorData.slice(4,7)) //takes hex values at place [4],[5],[6] and [7] from sensorData and decodes them to a float value
var humiditySensor = floatConverter.decodeFloatArr(sensorData.slice(7,11)) //takes hex values at place [8],[9],[10] and [11] from sensorData and decodes them to a float value
sensorData = [co2Sensor,tempSensor,humiditySensor] //places co2, temp and humidity data into sensordata
returnArray = [sensorType,sensorboxID,sensorboxConnector,sensorData] //returns [sensorType, sensorboxID,sensorboxConnector, sensorData[float,float,float],]
break;
At the end of the function you need to return the array in this order for the function to be compatible with the addData
function.
returnArray = [sensorType, sensorboxID, sensorboxConnector, sensorData]
The addData
function
addData
functionThe addData
function queries the database and inserts the data from the data
variable.
To add a new sensor you need to add a new case with the sensor address as the case. The insertRow
variable in the case should be a SQL query to insert data into the database in this format.
DATA[0] = sensorbox_type
DATA[1] = sensorbox_ID
DATA[2] = sensorbox_connector
DATA[3] = sensor value
case "sensor adress": //inserts data into the database and prints it to the console
insertRow = await client.query(`INSERT INTO "Skjetleingard_test"(sensor_type,sensorbox_id,sensorbox_connector,value) VALUES(${data[0]},'${data[1]}',${data[2]},${data[3]});`)
console.log(`Inserted ${insertRow} row`);
break;
If you get more than one value from your sensor the formatData
function will return an array as DATA[3]
to insert the values into the database then you could do something like this.
insertRow = await client.query(`INSERT INTO "Skjetleingard_test"(sensor_type, sensorbox_id, sensorbox_connector, value1, value2) VALUES(${data[0]},${String(data[1])},${data[2]},${data[3][0]},${data[3][1]});`)
Normal errors:
If you run the webserver and get an message in the console that say error at "xxxxxxx"
or column does not exist
. You need to remember to add single quotes around the data[1]
variable that contains the sensorbox_id like this '${data[1]}'
Last updated