Hardware components | ||||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
Software apps and online services | ||||||
|
Beehives are very often located at position where there is no electricity available (nothing to say about WiFi connectivity) so it is not easy to establish some kind of reliable remote monitoring with low power requirements. Using NXP Rapid IoT Development Kit I wanted to test the concept of monitoring the beehive over SigFox network.
There are two main areas I would like to cover:- Temperature monitoring - as temperature tells you the information about the health of bees
- Theft protection - as beehives are too often a subject of robbery and early warning could save not only the harvest but also bees and a beehive itself.
Device monitors the beehive and periodically (aproximately each 15 minutes) sends the data measured over the SigFox network.
In case the motion is detected device starts with beeping, red LED shines and special alert message is immediately sent over the SigFox network to notify the beekeeper.
After few seconds without any motion detected is device reset to its normal state and watches for another alert. The temperature monitoring continues.
In this concept is the SigFox message always just one float (32) number which ise received and shown in SigFox Backend.
As I am experimenting with similar solutions on my own server I decided not to use the NXP/Atmosphere cloud but instead set up a custom callback to my server.
Callback is captured at iTRUBEC server by a simple REST API written in PHP which analyses the value, determines if it is some data or an alert, stores data in local DB and (in case of an alert) notifies the beekeeper via SMS.
To send the SMS an E-mail to SMS service is used. The latency (time between the alert is triggered and the SMS received) observed is just a few seconds.
It sends an e-mail alert as a copy of the original message too.
The data is instantly visualised on iTRUBEC server.
- Concept monitors temperature only - it could be easily extended with another data like humidity, atmospherical pressure, the level of sunshine, second (outside the beehive) temperature, etc.
- There is an extra SigFox message for each mesurement. It is possible to combine (code) more values into one SigFox message to save the limited amount of messages.
- If extended with GPS module it could monitor the beehive position (especially after Theft Alert is triggered).
- I found the NXP Rapid IoT Studio behaving not always the way I would expect - but this could be caused by my strange expectations.
- I was not able to set up the monitoring interval to 15 minutes - despite the Interval element was set up to 900k miliseconds, the monitoring was performed one after another (not respecting the interval).
- I was not able to register the first SigFox Click module I ordered from MikroElektronika in SigFox backend. Simply the device ID and PAC were not recognized. Nevertheless thanks to the great user support I got the replacement soon - and it worked just great.
{
"name": "Rapid IoT Beehive Monitor",
"createVersion": "2017-08-12",
"description": "",
"lastModified": "2018-02-13T00:39:19.386Z",
"created": "2018-02-13T00:39:19.386Z",
"meta": {
"projectTypeName": "NXP Rapid IoT",
"projectTypeId": "NxpRpk"
},
"planes": {
"NXP Rapid IoT": {
"type": "mcuxpresso",
"compilerVersion": "latest",
"variants": [
"NxpRpk"
],
"meta": {},
"elements": [
{
"name": "FXOS8700AccelerometerMagnetometer",
"type": "EmbeddedFXOS8700",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\tATMO_CreateValueBool(out, true);\n\treturn ATMO_Status_Success;",
"setup": "\tATMO_FXOS8700_Config_t config;\n\tconfig.address = ATMO_PROPERTY(FXOS8700AccelerometerMagnetometer, i2cAddress);\n\tconfig.i2cDriverInstance = ATMO_PROPERTY(FXOS8700AccelerometerMagnetometer, i2cInstance);\n\tconfig.gpioDriverInstance = ATMO_PROPERTY(FXOS8700AccelerometerMagnetometer, gpioInstance);\n\tconfig.int1En = ATMO_PROPERTY(FXOS8700AccelerometerMagnetometer, interrupt1Enabled);\n config.int2En = ATMO_PROPERTY(FXOS8700AccelerometerMagnetometer, interrupt2Enabled);\n config.int1Pin = ATMO_PROPERTY(FXOS8700AccelerometerMagnetometer, interrupt1Gpio);\n config.int2Pin = ATMO_PROPERTY(FXOS8700AccelerometerMagnetometer, interrupt2Gpio);\n\n switch(ATMO_PROPERTY(FXOS8700AccelerometerMagnetometer, motionDetectType))\n {\n case FXOS8700_NoDetect:\n {\n config.freefallEnabled = false;\n config.motionEnabled = false;\n config.tapDetectionEnabled = false;\n break;\n }\n case FXOS8700_FreefallDetect:\n {\n config.freefallEnabled = true;\n config.motionEnabled = false;\n config.tapDetectionEnabled = false;\n break;\n }\n case FXOS8700_MotionDetect:\n {\n config.freefallEnabled = false;\n config.motionEnabled = true;\n config.tapDetectionEnabled = false;\n break;\n }\n case FXOS8700_TapDetect:\n {\n config.freefallEnabled = false;\n config.motionEnabled = false;\n config.tapDetectionEnabled = true;\n break; \n }\n default:\n {\n config.freefallEnabled = false;\n config.motionEnabled = false; \n config.tapDetectionEnabled = false;\n break;\n }\n }\n\n ATMO_FXOS8700_SetMotionDetectedAbilityHandle(ATMO_ABILITY(FXOS8700AccelerometerMagnetometer, detectMotion));\n ATMO_FXOS8700_SetFreefallDetectedAbilityHandle(ATMO_ABILITY(FXOS8700AccelerometerMagnetometer, detectFreefall));\n ATMO_FXOS8700_SetTapDetectedAbilityHandle(ATMO_ABILITY(FXOS8700AccelerometerMagnetometer, detectTap));\n\tATMO_FXOS8700_Init(&config);\n\n return ATMO_Status_Success;\n\t",
"setEnabled": "ATMO_FXOS8700_SetEnabled(true);\nreturn ATMO_Status_Success;",
"setDisabled": "ATMO_FXOS8700_SetEnabled(false);\nreturn ATMO_Status_Success;",
"setEnabledDisabled": "bool enabled = false;\nATMO_GetBool(in, &enabled);\nATMO_FXOS8700_SetEnabled(enabled);\nreturn ATMO_Status_Success;",
"getAccelData": " ATMO_3dFloatVector_t data;\r\n\r\n if( ATMO_FXOS8700_GetAccelData(&data) != ATMO_FXOS8700_Status_Success )\r\n {\r\n ATMO_CreateValueVoid(out);\r\n return ATMO_Status_Fail;\r\n }\r\n\r\n ATMO_CreateValue3dVectorFloat(out, &data);\r\n\r\n return ATMO_Status_Success;",
"getAccelX": "\tATMO_3dFloatVector_t data;\n\n\tif(ATMO_FXOS8700_GetAccelData(&data) != ATMO_FXOS8700_Status_Success)\n\t{\n\t\tATMO_CreateValueVoid(out);\n\t\treturn ATMO_Status_Fail;\n\t}\n\n\tATMO_CreateValueFloat(out, data.x);\n\treturn ATMO_Status_Success;\n",
"getAccelY": "\tATMO_3dFloatVector_t data;\n\n\tif(ATMO_FXOS8700_GetAccelData(&data) != ATMO_FXOS8700_Status_Success)\n\t{\n\t\tATMO_CreateValueVoid(out);\n\t\treturn ATMO_Status_Fail;\n\t}\n\n\tATMO_CreateValueFloat(out, data.y);\n\treturn ATMO_Status_Success;\n",
"getAccelZ": "\tATMO_3dFloatVector_t data;\n\n\tif(ATMO_FXOS8700_GetAccelData(&data) != ATMO_FXOS8700_Status_Success)\n\t{\n\t\tATMO_CreateValueVoid(out);\n\t\treturn ATMO_Status_Fail;\n\t}\n\n\tATMO_CreateValueFloat(out, data.z);\n\treturn ATMO_Status_Success;\n",
"getMagData": " ATMO_3dFloatVector_t data;\r\n\r\n if( ATMO_FXOS8700_GetMagData(&data) != ATMO_FXOS8700_Status_Success )\r\n {\r\n ATMO_CreateValueVoid(out);\r\n return ATMO_Status_Fail;\r\n }\r\n\r\n ATMO_CreateValue3dVectorFloat(out, &data);\r\n\r\n return ATMO_Status_Success;",
"getMagX": "\tATMO_3dFloatVector_t data;\n\n\tif(ATMO_FXOS8700_GetMagData(&data) != ATMO_FXOS8700_Status_Success)\n\t{\n\t\tATMO_CreateValueVoid(out);\n\t\treturn ATMO_Status_Fail;\n\t}\n\n\tATMO_CreateValueFloat(out, data.x);\n\treturn ATMO_Status_Success;\n",
"getMagY": "\tATMO_3dFloatVector_t data;\n\n\tif(ATMO_FXOS8700_GetMagData(&data) != ATMO_FXOS8700_Status_Success)\n\t{\n\t\tATMO_CreateValueVoid(out);\n\t\treturn ATMO_Status_Fail;\n\t}\n\n\tATMO_CreateValueFloat(out, data.y);\n\treturn ATMO_Status_Success;\n",
"getMagZ": "\tATMO_3dFloatVector_t data;\n\n\tif(ATMO_FXOS8700_GetMagData(&data) != ATMO_FXOS8700_Status_Success)\n\t{\n\t\tATMO_CreateValueVoid(out);\n\t\treturn ATMO_Status_Fail;\n\t}\n\n\tATMO_CreateValueFloat(out, data.z);\n\treturn ATMO_Status_Success;\n",
"detectTap": "\treturn ATMO_Status_Success;\n",
"detectMotion": "\treturn ATMO_Status_Success;\n",
"detectFreefall": "\treturn ATMO_Status_Success;\n",
"enableFreefallDetection": "if(ATMO_FXOS8700_EnableFreefallDetection() == ATMO_FXOS8700_Status_Success)\n{\n return ATMO_Status_Success;\n}\n\nreturn ATMO_Status_Fail;",
"enableMotionDetection": "if(ATMO_FXOS8700_EnableMotionDetection() == ATMO_FXOS8700_Status_Success)\n{\n return ATMO_Status_Success;\n}\n\nreturn ATMO_Status_Fail;",
"enableTapDetection": "if(ATMO_FXOS8700_EnableTapDetection() == ATMO_FXOS8700_Status_Success)\n{\n return ATMO_Status_Success;\n}\n\nreturn ATMO_Status_Fail;",
"disableDetection": "if(ATMO_FXOS8700_DisableAllDetection() == ATMO_FXOS8700_Status_Success)\n{\n return ATMO_Status_Success;\n}\n\nreturn ATMO_Status_Fail;"
},
"variables": {},
"embeddedPropertyConversions": {},
"codeUserChanged": {
"setup": false,
"setEnabled": false,
"setDisabled": false,
"setEnabledDisabled": false,
"getAccelData": false,
"getAccelX": false,
"getAccelY": false,
"getAccelZ": false,
"getMagData": false,
"getMagX": false,
"getMagY": false,
"getMagZ": false,
"detectTap": false,
"detectMotion": false,
"detectFreefall": false,
"enableFreefallDetection": false,
"enableMotionDetection": false,
"enableTapDetection": false,
"disableDetection": false,
"trigger": true
},
"i2cInstance": 1,
"gpioInstance": 0,
"interrupt1Enabled": false,
"interrupt2Enabled": true,
"interrupt1Gpio": "ATMO_DEFAULT_GPIO",
"interrupt2Gpio": "PTD13",
"motionDetectType": "FXOS8700_MotionDetect",
"i2cAddress": "0x1E"
},
"meta": {
"editorX": 71.33349609375,
"editorY": 42,
"lastTrigger": "motionDetected"
},
"triggers": {
"triggered": [],
"accelDataRead": [
{
"mapping": {},
"targetOrder": [],
"targetElement": "TheftAlertBuzzer",
"targetAbility": "beep"
},
{
"mapping": {},
"targetOrder": [],
"targetElement": "MotionRead",
"targetAbility": "trigger"
},
{
"mapping": {},
"targetOrder": [],
"targetElement": "EmbeddedNxpRpkRgbLed",
"targetAbility": "toggleRed"
}
],
"accelXRead": [],
"accelYRead": [],
"accelZRead": [],
"magDataRead": [],
"magXRead": [],
"magYRead": [],
"magZRead": [],
"tapDetected": [],
"motionDetected": [
{
"mapping": {},
"targetOrder": [],
"targetElement": "TheftAlertBuzzer",
"targetAbility": "beep"
},
{
"mapping": {},
"targetOrder": [],
"targetElement": "MotionRead",
"targetAbility": "trigger"
},
{
"mapping": {},
"targetOrder": [],
"targetElement": "EmbeddedNxpRpkRgbLed",
"targetAbility": "setRedOn"
},
{
"mapping": {},
"targetOrder": [],
"targetElement": "TheftAlertBuzzer",
"targetAbility": "trigger"
}
],
"freefallDetected": []
},
"interruptAbilities": {
"trigger": false,
"setup": false,
"setEnabled": false,
"setDisabled": false,
"setEnabledDisabled": false,
"getAccelData": false,
"getAccelX": false,
"getAccelY": false,
"getAccelZ": false,
"getMagData": false,
"getMagX": false,
"getMagY": false,
"getMagZ": false,
"detectTap": false,
"detectMotion": false,
"detectFreefall": false,
"enableFreefallDetection": false,
"enableMotionDetection": false,
"enableTapDetection": false,
"disableDetection": false
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
},
{
"name": "setup",
"triggers": []
},
{
"name": "setEnabled",
"triggers": []
},
{
"name": "setDisabled",
"triggers": []
},
{
"name": "setEnabledDisabled",
"triggers": []
},
{
"name": "getAccelData",
"triggers": [
"accelDataRead"
]
},
{
"name": "getAccelX",
"triggers": [
"accelXRead"
]
},
{
"name": "getAccelY",
"triggers": [
"accelYRead"
]
},
{
"name": "getAccelZ",
"triggers": [
"accelZRead"
]
},
{
"name": "getMagData",
"triggers": [
"magDataRead"
]
},
{
"name": "getMagX",
"triggers": [
"magXRead"
]
},
{
"name": "getMagY",
"triggers": [
"magYRead"
]
},
{
"name": "getMagZ",
"triggers": [
"magZRead"
]
},
{
"name": "detectTap",
"triggers": [
"tapDetected"
]
},
{
"name": "detectMotion",
"triggers": [
"motionDetected"
]
},
{
"name": "detectFreefall",
"triggers": [
"freefallDetected"
]
},
{
"name": "enableFreefallDetection",
"triggers": []
},
{
"name": "enableMotionDetection",
"triggers": []
},
{
"name": "enableTapDetection",
"triggers": []
},
{
"name": "disableDetection",
"triggers": []
}
]
},
{
"name": "TheftAlertBuzzer",
"type": "EmbeddedNxpRpkBuzzer",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables",
"rpk"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "\n\treturn ATMO_Status_Success;\n ",
"beep": "\n ATMO_MK64F_Buzzer_On();\n ATMO_PLATFORM_DelayMilliseconds(200);\n ATMO_MK64F_Buzzer_Off();\n\treturn ATMO_Status_Success;\n ",
"turnOn": "\n ATMO_MK64F_Buzzer_On();\n ATMO_CreateValueBool(out, true);\n\treturn ATMO_Status_Success;\n ",
"turnOff": "\n ATMO_MK64F_Buzzer_Off();\n ATMO_CreateValueBool(out, false);\n\treturn ATMO_Status_Success;\n ",
"toggle": "\n bool newState = false;\n ATMO_MK64F_Buzzer_Toggle(&newState);\n ATMO_CreateValueBool(out, newState);\n\treturn ATMO_Status_Success;\n ",
"setState": "\n bool on = false;\n ATMO_GetBool(in, &on);\n\n if( on )\n {\n ATMO_MK64F_Buzzer_On();\n }\n else\n {\n ATMO_MK64F_Buzzer_Off();\n }\n ATMO_CreateValueBool(out, on);\n \n\treturn ATMO_Status_Success;\n "
},
"variables": {},
"embeddedPropertyConversions": {},
"codeUserChanged": {
"setup": false,
"beep": false,
"turnOn": false,
"turnOff": false,
"toggle": false,
"setState": false
}
},
"meta": {
"editorX": 199.33349609375,
"editorY": 240,
"lastTrigger": "triggered"
},
"triggers": {
"triggered": [
{
"mapping": {},
"targetOrder": [],
"targetElement": "FuncFormatAlert",
"targetAbility": "trigger"
}
],
"buzzerStateChange": [
{
"mapping": {},
"targetOrder": [],
"targetElement": "FuncFormatAlert",
"targetAbility": "trigger"
}
]
},
"interruptAbilities": {
"trigger": false,
"setup": false,
"beep": false,
"turnOn": false,
"turnOff": false,
"toggle": false,
"setState": false
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
},
{
"name": "setup",
"triggers": []
},
{
"name": "beep",
"triggers": []
},
{
"name": "turnOn",
"triggers": [
"buzzerStateChange"
]
},
{
"name": "turnOff",
"triggers": [
"buzzerStateChange"
]
},
{
"name": "toggle",
"triggers": [
"buzzerStateChange"
]
},
{
"name": "setState",
"triggers": [
"buzzerStateChange"
]
}
]
},
{
"name": "TheftAlert_Pag",
"type": "EmbeddedIconLabelDisplay",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables",
"rpk"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"displayPage": "\n\tATMO_UI_Page_DisplayPageByCoord(ATMO_PROPERTY(TheftAlert_Pag, x), ATMO_PROPERTY(TheftAlert_Pag, y), false);\n\treturn ATMO_Status_Success;\n\t",
"onDisplayed": "\n\treturn ATMO_Status_Success;\n ",
"topRightButtonPressed": "\n\treturn ATMO_Status_Success;\n\t",
"bottomRightButtonPressed": "\n\treturn ATMO_Status_Success;\n\t",
"topLeftButtonPressed": "\n\treturn ATMO_Status_Success;\n\t",
"bottomLeftButtonPressed": "\n\treturn ATMO_Status_Success;\n\t",
"setup": "\n ATMO_UI_PAGE_Config_t config;\n\tconfig.hidden = ATMO_PROPERTY(TheftAlert_Pag, pageHidden);\n\tconfig.textColor = ATMO_PROPERTY(TheftAlert_Pag, textColor);\n config.activeButtons = ATMO_UI_Page_GetButtonMask(ATMO_PROPERTY(TheftAlert_Pag, topRightButtonEnabled),\n ATMO_PROPERTY(TheftAlert_Pag,bottomRightButtonEnabled), ATMO_PROPERTY(TheftAlert_Pag, topLeftButtonEnabled), ATMO_PROPERTY(TheftAlert_Pag, bottomLeftButtonEnabled));\n\tconfig.x = ATMO_PROPERTY(TheftAlert_Pag, x);\n config.x = ATMO_PROPERTY(TheftAlert_Pag, x);\n config.y = ATMO_PROPERTY(TheftAlert_Pag, y);\n\tstrncpy(config.topLeftButtonLabel, ATMO_PROPERTY(TheftAlert_Pag, topLeftButtonLabel), ATMO_BUTTON_LABEL_MAXLEN);\n\tstrncpy(config.topRightButtonLabel, ATMO_PROPERTY(TheftAlert_Pag, topRightButtonLabel), ATMO_BUTTON_LABEL_MAXLEN);\n\tstrncpy(config.bottomLeftButtonLabel, ATMO_PROPERTY(TheftAlert_Pag, bottomLeftButtonLabel), ATMO_BUTTON_LABEL_MAXLEN);\n\tstrncpy(config.bottomRightButtonLabel, ATMO_PROPERTY(TheftAlert_Pag, bottomRightButtonLabel), ATMO_BUTTON_LABEL_MAXLEN);\n config.spanX = ATMO_PROPERTY(TheftAlert_Pag, spanX);\n\tconfig.spanY = ATMO_PROPERTY(TheftAlert_Pag, spanY);\n config.title = ATMO_PROPERTY(TheftAlert_Pag, pageTitle);\n config.titleHidden = ATMO_PROPERTY(TheftAlert_Pag, titleHidden);\n\tATMO_UI_SINGLEICONTEXT_Init(&config);\n\tATMO_VARIABLE(TheftAlert_Pag, pageHandle) = config.templateInstance;\n ATMO_UI_SINGLEICONTEXT_SetMainText(config.templateInstance, ATMO_PROPERTY(TheftAlert_Pag, label));\n ATMO_UI_SINGLEICONTEXT_SetIcon(config.templateInstance, ATMO_PROPERTY(TheftAlert_Pag, icon));\n ATMO_UI_SINGLEICONTEXT_RegisterOnDisplayedAbilityHandle(ATMO_VARIABLE(TheftAlert_Pag,pageHandle), ATMO_ABILITY(TheftAlert_Pag, onDisplayed));\n ATMO_UI_SINGLEICONTEXT_RegisterButtonAbilityHandle(ATMO_VARIABLE(TheftAlert_Pag,pageHandle), 1, ATMO_ABILITY(TheftAlert_Pag, topRightButtonPressed));\n\tATMO_UI_SINGLEICONTEXT_RegisterButtonAbilityHandle(ATMO_VARIABLE(TheftAlert_Pag,pageHandle), 2, ATMO_ABILITY(TheftAlert_Pag, bottomRightButtonPressed));\n\tATMO_UI_SINGLEICONTEXT_RegisterButtonAbilityHandle(ATMO_VARIABLE(TheftAlert_Pag,pageHandle), 3, ATMO_ABILITY(TheftAlert_Pag, topLeftButtonPressed));\n ATMO_UI_SINGLEICONTEXT_RegisterButtonAbilityHandle(ATMO_VARIABLE(TheftAlert_Pag,pageHandle), 4, ATMO_ABILITY(TheftAlert_Pag, bottomLeftButtonPressed));\n ATMO_UI_SINGLEICONTEXT_RegisterOnLeaveAbilityHandle(config.templateInstance, ATMO_ABILITY(TheftAlert_Pag, onLeave));\n\treturn ATMO_Status_Success;\n ",
"onLeave": "\n\treturn ATMO_Status_Success;\n\t",
"setLabel": "\n char label[32];\n if(ATMO_GetString(in, label, 32) == ATMO_Status_Success)\n {\n ATMO_UI_SINGLEICONTEXT_SetMainText(ATMO_VARIABLE(TheftAlert_Pag,pageHandle), label);\n }\n else\n {\n return ATMO_Status_Fail;\n }\n\n return ATMO_Status_Success;\n "
},
"variables": {
"pageHandle": {
"type": "ATMO_DriverInstanceHandle_t"
}
},
"embeddedPropertyConversions": {
"pageTitle": "string",
"topRightButtonLabel": "string",
"bottomRightButtonLabel": "string",
"topLeftButtonLabel": "string",
"bottomLeftButtonLabel": "string",
"label": "string"
},
"codeUserChanged": {
"displayPage": false,
"onDisplayed": false,
"topRightButtonPressed": false,
"bottomRightButtonPressed": false,
"topLeftButtonPressed": false,
"bottomLeftButtonPressed": false,
"setup": false,
"onLeave": false,
"setLabel": false
},
"textColor": "GUI_RED",
"pageTitle": "Motion monitor",
"titleHidden": false,
"pageHidden": false,
"topRightButtonLabel": "",
"topRightButtonEnabled": false,
"bottomRightButtonLabel": "",
"bottomRightButtonEnabled": false,
"topLeftButtonLabel": "",
"topLeftButtonEnabled": false,
"bottomLeftButtonLabel": "",
"bottomLeftButtonEnabled": false,
"x": "0",
"y": "0",
"spanX": "1",
"spanY": 1,
"icon": "icon_applications_motion",
"label": "Beehive OK"
},
"meta": {
"editorX": 751.1666870117188,
"editorY": 139,
"lastTrigger": "onDisplayed"
},
"triggers": {
"triggered": [],
"onDisplayed": [],
"topRightButtonPressed": [],
"bottomRightButtonPressed": [],
"topLeftButtonPressed": [],
"bottomLeftButtonPressed": [],
"onLeave": []
},
"interruptAbilities": {
"trigger": false,
"displayPage": false,
"onDisplayed": false,
"topRightButtonPressed": false,
"bottomRightButtonPressed": false,
"topLeftButtonPressed": false,
"bottomLeftButtonPressed": false,
"setup": false,
"onLeave": false,
"setLabel": false
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
},
{
"name": "displayPage",
"triggers": []
},
{
"name": "onDisplayed",
"triggers": [
"onDisplayed"
]
},
{
"name": "topRightButtonPressed",
"triggers": [
"topRightButtonPressed"
]
},
{
"name": "bottomRightButtonPressed",
"triggers": [
"bottomRightButtonPressed"
]
},
{
"name": "topLeftButtonPressed",
"triggers": [
"topLeftButtonPressed"
]
},
{
"name": "bottomLeftButtonPressed",
"triggers": [
"bottomLeftButtonPressed"
]
},
{
"name": "setup",
"triggers": []
},
{
"name": "onLeave",
"triggers": [
"onLeave"
]
},
{
"name": "setLabel",
"triggers": []
}
]
},
{
"name": "MotionRead",
"type": "EmbeddedFunction",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables"
],
"properties": {
"errorData": {},
"code": {
"trigger": " ATMO_CreateValueString(out, \"Theft Alert!\");"
},
"variables": {},
"embeddedPropertyConversions": {},
"codeUserChanged": {
"trigger": true
}
},
"meta": {
"editorX": 350.33349609375,
"editorY": 141,
"lastTrigger": "triggered"
},
"triggers": {
"triggered": [
{
"mapping": {},
"targetOrder": [],
"targetElement": "TheftAlert_Pag",
"targetAbility": "setLabel"
},
{
"mapping": {},
"targetOrder": [],
"targetElement": "TheftAlert_Pag",
"targetAbility": "displayPage"
}
]
},
"interruptAbilities": {
"trigger": false
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
}
]
},
{
"name": "ResetTheftAlert",
"type": "EmbeddedFunction",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\tATMO_CreateValueString(out, \"Beehive OK\");\n\treturn ATMO_Status_Success;"
},
"variables": {},
"embeddedPropertyConversions": {},
"codeUserChanged": {
"trigger": true
}
},
"meta": {
"editorX": 653.1666870117188,
"editorY": 242,
"lastTrigger": "triggered"
},
"triggers": {
"triggered": [
{
"mapping": {},
"targetOrder": [],
"targetElement": "TheftAlert_Pag",
"targetAbility": "setLabel"
}
]
},
"interruptAbilities": {
"trigger": false
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
}
]
},
{
"name": "EmbeddedNxpRpkRgbLed",
"type": "EmbeddedNxpRpkRgbLed",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables",
"rpk"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "\n RGB_Led_Set_State(RGB_LED_BRIGHT_HIGH, RGB_LED_COLOR_BLACK);\n\treturn ATMO_Status_Success;\n\t",
"setColorPreset": "\n unsigned int desiredColor = 0;\n ATMO_GetUnsignedInt(in, &desiredColor);\n\n uint8_t brightness = 0;\n uint8_t color = 0;\n RGB_Led_Get_State(&brightness, &color);\n RGB_Led_Set_State(brightness, desiredColor);\n return ATMO_Status_Success;\n ",
"setBrightnessLow": "\n uint8_t brightness = 0;\n uint8_t color = 0;\n RGB_Led_Get_State(&brightness, &color);\n RGB_Led_Set_State(RGB_LED_BRIGHT_LOW, color);\n return ATMO_Status_Success;\n ",
"setBrightnessOff": "\n uint8_t brightness = 0;\n uint8_t color = 0;\n RGB_Led_Get_State(&brightness, &color);\n RGB_Led_Set_State(RGB_LED_BRIGHT_OFF, color);\n return ATMO_Status_Success;\n ",
"setBrightnessMedium": "\n uint8_t brightness = 0;\n uint8_t color = 0;\n RGB_Led_Get_State(&brightness, &color);\n RGB_Led_Set_State(RGB_LED_BRIGHT_MEDIUM, color);\n return ATMO_Status_Success;\n ",
"setBrightnessHigh": "\n uint8_t brightness = 0;\n uint8_t color = 0;\n RGB_Led_Get_State(&brightness, &color);\n RGB_Led_Set_State(RGB_LED_BRIGHT_HIGH, color);\n return ATMO_Status_Success;\n ",
"setRedOn": "\n RGB_Led_Set_State(RGB_LED_BRIGHT_HIGH, RGB_LED_COLOR_RED);\n\treturn ATMO_Status_Success;\n ",
"setGreenOn": "\n RGB_Led_Set_State(RGB_LED_BRIGHT_HIGH, RGB_LED_COLOR_GREEN);\n\treturn ATMO_Status_Success;\n ",
"setBlueOn": "\n RGB_Led_Set_State(RGB_LED_BRIGHT_HIGH, RGB_LED_COLOR_BLUE);\n\treturn ATMO_Status_Success;\n ",
"setWhiteOn": "\treturn ATMO_Status_Success;",
"toggleRed": "\n\tuint8_t color, brightness;\n RGB_Led_Get_State(&brightness, &color);\n if(brightness == RGB_LED_BRIGHT_OFF || color == RGB_LED_COLOR_BLACK)\n {\n brightness = RGB_LED_BRIGHT_HIGH;\n }\n else\n {\n brightness = RGB_LED_BRIGHT_OFF;\n }\n\n RGB_Led_Set_State(brightness, RGB_LED_COLOR_RED);\n return ATMO_Status_Success;\n\t",
"toggleGreen": "\n\tuint8_t color, brightness;\n RGB_Led_Get_State(&brightness, &color);\n if(brightness == RGB_LED_BRIGHT_OFF || color == RGB_LED_COLOR_BLACK)\n {\n brightness = RGB_LED_BRIGHT_HIGH;\n }\n else\n {\n brightness = RGB_LED_BRIGHT_OFF;\n }\n\n RGB_Led_Set_State(brightness, RGB_LED_COLOR_GREEN);\n return ATMO_Status_Success;\n\t",
"toggleBlue": "\n\tuint8_t color, brightness;\n RGB_Led_Get_State(&brightness, &color);\n if(brightness == RGB_LED_BRIGHT_OFF || color == RGB_LED_COLOR_BLACK)\n {\n brightness = RGB_LED_BRIGHT_HIGH;\n }\n else\n {\n brightness = RGB_LED_BRIGHT_OFF;\n }\n\n RGB_Led_Set_State(brightness, RGB_LED_COLOR_BLUE);\n return ATMO_Status_Success;\n\t",
"setOff": "\n uint8_t color, brightness;\n RGB_Led_Get_State(&brightness, &color);\n RGB_Led_Set_State(brightness, RGB_LED_COLOR_BLACK);\n\treturn ATMO_Status_Success;\n ",
"setColorHex": "\n unsigned int color = 0;\n ATMO_GetUnsignedInt(in, &color);\n uint8_t red = (color >> 16) & 0xFF;\n uint8_t green = (color >> 8) & 0xFF;\n uint8_t blue = color & 0xFF;\n Rgb_Led_Set_Colors(red, green, blue); \n ATMO_CreateValueUnsignedInt(out, color);\n\treturn ATMO_Status_Success;\n "
},
"variables": {},
"embeddedPropertyConversions": {},
"codeUserChanged": {
"setup": false,
"setColorPreset": false,
"setBrightnessLow": false,
"setBrightnessOff": false,
"setBrightnessMedium": false,
"setBrightnessHigh": false,
"setRedOn": false,
"setGreenOn": false,
"setBlueOn": false,
"setWhiteOn": false,
"toggleRed": false,
"toggleGreen": false,
"toggleBlue": false,
"setOff": false,
"setColorHex": false
}
},
"meta": {
"editorX": 753.1666870117188,
"editorY": 41,
"lastTrigger": "colorSet"
},
"triggers": {
"triggered": [],
"brightnessSet": [],
"colorSet": []
},
"interruptAbilities": {
"trigger": false,
"setup": false,
"setColorPreset": false,
"setBrightnessLow": false,
"setBrightnessOff": false,
"setBrightnessMedium": false,
"setBrightnessHigh": false,
"setRedOn": false,
"setGreenOn": false,
"setBlueOn": false,
"setWhiteOn": false,
"toggleRed": false,
"toggleGreen": false,
"toggleBlue": false,
"setOff": false,
"setColorHex": false
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
},
{
"name": "setup",
"triggers": []
},
{
"name": "setColorPreset",
"triggers": []
},
{
"name": "setBrightnessLow",
"triggers": [
"brightnessSet"
]
},
{
"name": "setBrightnessOff",
"triggers": [
"brightnessSet"
]
},
{
"name": "setBrightnessMedium",
"triggers": [
"brightnessSet"
]
},
{
"name": "setBrightnessHigh",
"triggers": [
"brightnessSet"
]
},
{
"name": "setRedOn",
"triggers": []
},
{
"name": "setGreenOn",
"triggers": []
},
{
"name": "setBlueOn",
"triggers": []
},
{
"name": "setWhiteOn",
"triggers": []
},
{
"name": "toggleRed",
"triggers": []
},
{
"name": "toggleGreen",
"triggers": []
},
{
"name": "toggleBlue",
"triggers": []
},
{
"name": "setOff",
"triggers": []
},
{
"name": "setColorHex",
"triggers": [
"colorSet"
]
}
]
},
{
"name": "SigfoxModem",
"type": "EmbeddedSigfoxClick",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": " ATMO_SIGFOX_CLICK_Config_t config;\r\n config.spiInstance = ATMO_PROPERTY(SigfoxModem, spiDriverInstance);\r\n config.gpioInstance = ATMO_PROPERTY(SigfoxModem, gpioDriverInstance);\r\n config.csPin = ATMO_PROPERTY(SigfoxModem, csPin);\r\n config.rstPin = ATMO_PROPERTY(SigfoxModem, rstPin);\r\n config.ackPin = ATMO_PROPERTY(SigfoxModem, ackPin);\r\n config.txAtten = ATMO_PROPERTY(SigfoxModem, txAtten);\r\n config.netStandard = ATMO_PROPERTY(SigfoxModem, netStandard);\r\n config.usePublicKey = ATMO_PROPERTY(SigfoxModem, publicKey);\r\n ATMO_SIGFOX_CLICK_RegisterAbilityHandle(ATMO_SIGFOX_CLICK_EVENT_PayloadSent, ATMO_ABILITY(SigfoxModem, payloadSent));\r\n ATMO_SIGFOX_CLICK_RegisterAbilityHandle(ATMO_SIGFOX_CLICK_EVENT_ResponseReceived, ATMO_ABILITY(SigfoxModem, responseReceived));\r\n ATMO_SIGFOX_CLICK_RegisterAbilityHandle(ATMO_SIGFOX_CLICK_EVENT_Error, ATMO_ABILITY(SigfoxModem, txRxError));\r\n return ATMO_SIGFOX_CLICK_Init(&config) == ATMO_SIGFOX_CLICK_Status_Success ? ATMO_Status_Success : ATMO_Status_Fail;",
"sendPayload": " ATMO_Value_t payloadValue;\r\n ATMO_InitValue(&payloadValue);\r\n ATMO_CreateValueConverted(&payloadValue, ATMO_PROPERTY(SigfoxModem, upstreamDataType), in);\r\n ATMO_SIGFOX_CLICK_Status_t status = ATMO_SIGFOX_CLICK_SendPayload(payloadValue.data, payloadValue.size, false);\r\n ATMO_FreeValue(&payloadValue);\r\n return status == ATMO_SIGFOX_CLICK_Status_Success ? ATMO_Status_Success : ATMO_Status_Fail;",
"sendPayloadReqResponse": " ATMO_Value_t payloadValue;\r\n ATMO_InitValue(&payloadValue);\r\n ATMO_CreateValueConverted(&payloadValue, ATMO_PROPERTY(SigfoxModem, upstreamDataType), in);\r\n ATMO_SIGFOX_CLICK_Status_t status = ATMO_SIGFOX_CLICK_SendPayload(payloadValue.data, payloadValue.size, true);\r\n ATMO_FreeValue(&payloadValue);\r\n return status == ATMO_SIGFOX_CLICK_Status_Success ? ATMO_Status_Success : ATMO_Status_Fail;",
"getDeviceId": " sf_device_info_t info;\r\n ATMO_SIGFOX_CLICK_Status_t status = ATMO_SIGFOX_CLICK_GetDeviceInfo(&info);\r\n\r\n if(status != ATMO_SIGFOX_CLICK_Status_Success)\r\n {\r\n return ATMO_Status_Fail;\r\n }\r\n\r\n char devIdStr[9] = {0};\r\n\r\n sprintf(devIdStr, \"%02X%02X%02X%02X\", \r\n (info.devId >> 24) & 0xFF,\r\n (info.devId >> 16) & 0xFF,\r\n (info.devId >> 8) & 0xFF,\r\n (info.devId) & 0xFF);\r\n\r\n ATMO_CreateValueString(out, devIdStr);\r\n return ATMO_Status_Success;",
"getPac": " sf_device_info_t info;\r\n ATMO_SIGFOX_CLICK_Status_t status = ATMO_SIGFOX_CLICK_GetDeviceInfo(&info);\r\n\r\n if(status != ATMO_SIGFOX_CLICK_Status_Success)\r\n {\r\n return ATMO_Status_Fail;\r\n }\r\n\r\n char devPacStr[17] = {0};\r\n\r\n sprintf(devPacStr, \"%02X%02X%02X%02X%02X%02X%02X%02X\", \r\n info.devPac[0],\r\n info.devPac[1],\r\n info.devPac[2],\r\n info.devPac[3],\r\n info.devPac[4],\r\n info.devPac[5],\r\n info.devPac[6],\r\n info.devPac[7]);\r\n\r\n ATMO_CreateValueString(out, devPacStr);\r\n return ATMO_Status_Success;",
"payloadSent": "return ATMO_Status_Success;",
"responseReceived": " ATMO_CreateValueConverted(out, ATMO_PROPERTY(SigfoxModem, downstreamDataType), in);\r\n return ATMO_Status_Success;",
"txRxError": "return ATMO_Status_Success;"
},
"variables": {},
"embeddedPropertyConversions": {},
"codeUserChanged": {
"setup": false,
"sendPayload": false,
"sendPayloadReqResponse": false,
"getDeviceId": false,
"getPac": false,
"payloadSent": false,
"responseReceived": false,
"txRxError": false
},
"gpioDriverInstance": "ATMO_DRIVERINSTANCE_GPIO_GPIO1",
"spiDriverInstance": "ATMO_DRIVERINSTANCE_SPI_SPI1",
"csPin": "MB3_CS",
"ackPin": "MB3_AN",
"rstPin": "MB3_RST",
"netStandard": "sfNetStandardETSI",
"txAtten": 0,
"publicKey": false,
"upstreamDataType": "ATMO_DATATYPE_FLOAT",
"downstreamDataType": "ATMO_DATATYPE_FLOAT"
},
"meta": {
"editorX": 500.33349609375,
"editorY": 241,
"lastTrigger": "payloadSent"
},
"triggers": {
"triggered": [],
"deviceIdRetrieved": [],
"pacRetrieved": [],
"payloadSent": [
{
"mapping": {},
"targetOrder": [],
"targetElement": "ResetTheftAlert",
"targetAbility": "trigger"
},
{
"mapping": {},
"targetOrder": [],
"targetElement": "EmbeddedNxpRpkRgbLed",
"targetAbility": "setOff"
}
],
"responseReceived": [],
"txRxError": []
},
"interruptAbilities": {
"trigger": false,
"setup": false,
"sendPayload": false,
"sendPayloadReqResponse": false,
"getDeviceId": false,
"getPac": false,
"payloadSent": false,
"responseReceived": false,
"txRxError": false
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
},
{
"name": "setup",
"triggers": []
},
{
"name": "sendPayload",
"triggers": []
},
{
"name": "sendPayloadReqResponse",
"triggers": []
},
{
"name": "getDeviceId",
"triggers": [
"deviceIdRetrieved"
]
},
{
"name": "getPac",
"triggers": [
"pacRetrieved"
]
},
{
"name": "payloadSent",
"triggers": [
"payloadSent"
]
},
{
"name": "responseReceived",
"triggers": [
"responseReceived"
]
},
{
"name": "txRxError",
"triggers": [
"txRxError"
]
}
]
},
{
"name": "FuncFormatAlert",
"type": "EmbeddedFunction",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables"
],
"properties": {
"errorData": {},
"code": {
"trigger": " float talert = -100;\n\tATMO_CreateValueFloat(out, talert); //Theft Alert\n\treturn ATMO_Status_Success;"
},
"variables": {},
"embeddedPropertyConversions": {},
"codeUserChanged": {
"trigger": true
}
},
"meta": {
"editorX": 352.33349609375,
"editorY": 240,
"lastTrigger": "triggered"
},
"triggers": {
"triggered": [
{
"mapping": {},
"targetOrder": [],
"targetElement": "SigfoxModem",
"targetAbility": "sendPayload"
}
]
},
"interruptAbilities": {
"trigger": false
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
}
]
},
{
"name": "ENS210TemperatureHumidity1",
"type": "EmbeddedENS210",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "\tATMO_ENS210_Config_t config;\n\tconfig.address = ATMO_PROPERTY(ENS210TemperatureHumidity1, i2cAddress);\n\tconfig.i2cDriverInstance = ATMO_PROPERTY(ENS210TemperatureHumidity1, i2cInstance);\n\tconfig.tempCalibrationOffset = ATMO_PROPERTY(ENS210TemperatureHumidity1, tempCalibrationOffset);\n\n\treturn ( ATMO_ENS210_Init(&config) == ATMO_ENS210_Status_Success ) ? ATMO_Status_Success : ATMO_Status_Fail;\n",
"setEnabled": "ATMO_ENS210_SetEnabled(true);\nreturn ATMO_Status_Success;",
"setDisabled": "ATMO_ENS210_SetEnabled(false);\nreturn ATMO_Status_Success;",
"setEnabledDisabled": "bool enabled = false;\nATMO_GetBool(in, &enabled);\nATMO_ENS210_SetEnabled(enabled);\nreturn ATMO_Status_Success;",
"readTemperature": " float tempC;\n \n if(ATMO_ENS210_GetTemperatureFloat(&tempC) == ATMO_ENS210_Status_Success)\n {\n ATMO_CreateValueFloat(out, tempC);\n }\n else\n {\n ATMO_CreateValueVoid(out);\n }\n \n return ATMO_Status_Success;",
"readHumidity": " float humidityPct;\n\n if(ATMO_ENS210_GetHumidityFloat(&humidityPct) == ATMO_ENS210_Status_Success)\n {\n ATMO_CreateValueFloat(out, humidityPct);\n }\n else\n {\n ATMO_CreateValueVoid(out);\n }\n \n return ATMO_Status_Success;"
},
"variables": {},
"embeddedPropertyConversions": {},
...
This file has been truncated, please download it to see its full contents.
REST API to handle SigFox Callback
PHP<?php
/*
REST API for NXP Rapid IoT Kit SigFox beehive monitor
Sigfox Callback format
http://itrubec.cz/monitor/NXPmonitorData.php?key=xxxxxx&dev={device}&t1={customData#t1}&rssi={rssi}&seqn={seqNumber}&lat={lat}&lng={lng}&snr={snr}&avgsnr={avgSnr}
example GET (sending POST in reality)
SigFox message format
t1::float:32:little-endian
*/
$_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING);
$_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
echo("test<br>");
$servername = "xxx"; //server name
$username = "xxx"; //DB login
$password = "xxx";//DB psswd
$dbname = "xxx"; //DB name
// Create connection
$mysqli = new mysqli($servername, $username, $password, $dbname);
/* check connection */
if ($mysqli->connect_errno) {
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
/*
DB TABLES STRUCTURE
CREATE TABLE IF NOT EXISTS `monitor_devices` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user` int(11) NOT NULL,
`device` varchar(255) NOT NULL,
`devkey` varchar(255) NOT NULL,
`enabled` tinyint(1) NOT NULL,
`registered` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`lastactivity` timestamp NULL DEFAULT NULL,
`note` text,
PRIMARY KEY (`id`),
KEY `device` (`device`),
KEY `key` (`key`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='List of known devices' AUTO_INCREMENT=2 ;
CREATE TABLE IF NOT EXISTS `monitor_data` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`devid` int(11) NOT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`temp1` int(11) DEFAULT NULL,
`temp2` int(11) DEFAULT NULL,
`temp3` int(11) DEFAULT NULL,
`humidity1` int(11) DEFAULT NULL,
`pressure1` int(11) DEFAULT NULL,
`batteryvoltage` float DEFAULT NULL,
`rssi` float DEFAULT NULL,
`seqn` bigint(20) DEFAULT NULL,
`lat` float DEFAULT NULL,
`lng` float DEFAULT NULL,
`snr` float DEFAULT NULL,
`avgsnr` float DEFAULT NULL,
`TheftAlert` tinyint(1) DEFAULT '0',
PRIMARY KEY (`id`),
KEY `devid` (`devid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Data received from SigFox callBack' AUTO_INCREMENT=1 ;
*/
//http://itrubec.cz/monitor/newdata.php?key=xxxxxx&dev=xxxxxx&t1=76&rssi=-136.00&seqn=23&lat=49.0&lng=17.0&snr=11.84&avgsnr=23.84
/*
$key = $_POST["key"];
$dev = $_POST["dev"];
$t1 = $_POST["t1"];
$rssi = $_POST["rssi"];
$seqn = $_POST["seqn"];
$lat = $_POST["lat"];
$lng = $_POST["lng"];
$snr = $_POST["snr"];
$avgsnr = $_POST["avgsnr"];
*/
$key = $_GET["key"];
$dev = $_GET["dev"];
$t1 = $_GET["t1"];
$rssi = $_GET["rssi"];
$seqn = $_GET["seqn"];
$lat = $_GET["lat"];
$lng = $_GET["lng"];
$snr = $_GET["snr"];
$avgsnr = $_GET["avgsnr"];
//SELECT ID FROM `monitor_devices` WHERE devkey like "xxxxxx" AND device like "xxxxx"
$sql = "SELECT ID FROM `monitor_devices` WHERE devkey like \"".$key."\" AND device like \"".$dev."\"";
if ($result = $mysqli->query($sql)) {
printf("%d device found in catalogue.\n", $result->num_rows);
$row=mysqli_fetch_row($result);
$devid = $row[0];
$result->close();
$sql = "UPDATE `monitor_devices` SET `lastactivity`=now() WHERE `id`=".$devid;
//echo($sql);
echo("<br>");
if ($mysqli->query($sql) === TRUE) {
printf("Last activity of device updated.<br>\n");
}
}else{
die("Bad key or bad device!");
}
$sql = "SELECT ID FROM `monitor_devices`";
if ($t1 < -60) { //Theft Alert
$sql = "INSERT INTO `monitor_data`(`devid`, `timestamp`, `rssi`, `seqn`, `lat`, `lng`, `snr`, `avgsnr`, `TheftAlert`) VALUES ($devid, now(),$rssi,$seqn,$lat,$lng,$snr,$avgsnr,1)";
//SMS alert!
$to = "???????????@sms.cz.o2.com";
$subject = "Theft Alert";
$txt = "Motion detected at beehive #".$dev;
$headers = 'From: x@xx.cz' . "\r\n" .
'Reply-To: x@xx.cz' . "\r\n" .
'Cc: x@xx.cz' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
mail($to,$subject,$txt,$headers);
}
if (($t1 > -60) && ($t1 < 100)) { //Temperature
$sql = "INSERT INTO `monitor_data`(`devid`, `timestamp`, `temp1`, `rssi`, `seqn`, `lat`, `lng`, `snr`, `avgsnr`) VALUES ($devid, now(),$t1,$rssi,$seqn,$lat,$lng,$snr,$avgsnr)";
}
if (($t1 >= 100) && ($t1 < 201)) { //Humidity
$t1 = $t1 - 100;
$sql = "INSERT INTO `monitor_data`(`devid`, `timestamp`, `humidity1`, `rssi`, `seqn`, `lat`, `lng`, `snr`, `avgsnr`) VALUES ($devid, now(),$t1,$rssi,$seqn,$lat,$lng,$snr,$avgsnr)";
}
if (($t1 > 850) && ($t1 < 1100)) { //Atmospheric Pressure
$sql = "INSERT INTO `monitor_data`(`devid`, `timestamp`, `pressure1`, `rssi`, `seqn`, `lat`, `lng`, `snr`, `avgsnr`) VALUES ($devid, now(),$t1,$rssi,$seqn,$lat,$lng,$snr,$avgsnr)";
}
//$sql = "INSERT INTO `monitor_data`(`devid`, `timestamp`, `temp1`, `temp2`, `temp3`, `humidity1`, `pressure1`, `batteryvoltage`, `rssi`, `seqn`, `lat`, `lng`, `snr`, `avgsnr`) VALUES ($devid, now(),$t1,$t2,$t3,$v1,$p1,$n1,$rssi,$seqn,$lat,$lng,$snr,$avgsnr)";
if ($result = $mysqli->query($sql)) {
echo "OK";
} else {
echo "Error" . $sql;
}
$mysqli->close();
?>
Comments