ZUNO_REPORTS_HANDLER()
This macro is used to setup up a handler for incoming reports from other sensors. Syntax has changed starting from 2.1.5 release ZUNO_REPORTS_HANDLER(reportType, reportHandler) reportType type of the report to handle: Battery, SensorMultilevel, SensorBinary, Notification, SwitchMultilevel, SwitchBinary, Meter, Basic. reportHandler pointer to a user defined function that parses the incoming report of the defined type. void reportHandler(void) There are few helpful marco to parse the reported data inside the report handler:- Generic
- REPORT_NODE_ID() returns the sender Node Id
- Basic
- REPORT_BASIC_VALUE() returns the value
- Switch Multilevel
- REPORT_SWITCH_MULTILEVEL_VALUE() returns the value
- Switch Binary
- REPORT_SWITCH_BINARY_VALUE() returns the value
- Notification (Alarm)
- REPORT_NOTIFICATION_TYPE() returns notification type
- REPORT_NOTIFICATION_EVENT() returns notification event
- REPORT_NOTIFICATION_EVENT_PARAM(i) returns notification parameters
- REPORT_NOTIFICATION_STATUS() returns notification status
- Sensor Binary
- REPORT_SENSOR_BINARY_TYPE() returns sensor type
- REPORT_SENSOR_BINARY_VALUE() returns the value
- Sensor Multilevel
- REPORT_SENSOR_MULTILEVEL_TYPE() returns sensor type
- REPORT_SENSOR_MULTILEVEL_SCALE() returns sensor scale
- REPORT_SENSOR_MULTILEVEL_UNITS() returns sensor units
- REPORT_SENSOR_MULTILEVEL_PRECISION() returns sensor precision (number of digits after .)
- REPORT_SENSOR_MULTILEVEL_SIZE() returns sensor value size (1, 2 or 4 bytes)
- REPORT_SENSOR_MULTILEVEL_VALUE_1B() returns the BYTE value for size = 1 bytes
- REPORT_SENSOR_MULTILEVEL_VALUE_2B() returns the WORD value for size = 2 bytes
- REPORT_SENSOR_MULTILEVEL_VALUE_4B() returns the DWORD value for size = 4 bytes
- Meter
- REPORT_METER_TYPE() returns sensor type
- REPORT_METER_RATE() returns sensor type
- REPORT_METER_SCALE() returns sensor scale
- REPORT_METER_UNITS() returns sensor units
- REPORT_METER_PRECISION() returns sensor precision (number of digits after .)
- REPORT_METER_SIZE() returns sensor value size (1, 2 or 4 bytes)
- REPORT_METER_VALUE_1B() returns the BYTE value for size = 1 bytes
- REPORT_METER_VALUE_2B() returns the WORD value for size = 2 bytes
- REPORT_METER_VALUE_4B() returns the DWORD value for size = 4 bytes
- Battery
- REPORT_BATTERY_VALUE() returns battery level
ZUNO_REPORTS_HANDLER(reportType, reportHandler);
void reportHandler() {
... REPORT_XXX_VALUE_1B() ...
}
It is suggested to return as fast as possible from the reports handler and do the main work in the loop().
ZUNO_REPORTS_HANDLER(Battery, BatteryReport);
ZUNO_REPORTS_HANDLER(SensorMultilevel, SensorMultilevelReport);
ZUNO_REPORTS_HANDLER(SensorBinary, SensorBinaryReport);
ZUNO_REPORTS_HANDLER(Notification, NotificationReport);
ZUNO_REPORTS_HANDLER(SwitchMultilevel, SwitchMultilevelReport);
ZUNO_REPORTS_HANDLER(SwitchBinary, SwitchBinaryReport);
ZUNO_REPORTS_HANDLER(Meter, MeterReport);
ZUNO_REPORTS_HANDLER(Basic, BasicReport);
#define SERIAL Serial0
ZUNO_ENABLE(LOGGING_DBG LOGGING_EVENTS);
void logReportTitle(char * text) {
SERIAL.print(millis());
SERIAL.print(" ");
SERIAL.print(text);
SERIAL.print(" NODE:");
SERIAL.print(REPORT_NODE_ID());
SERIAL.print(" VALUE:");
}
void BatteryReport() {
logReportTitle("BATTERY");
SERIAL.println(REPORT_BATTERY_VALUE(), HEX);
}
void SensorMultilevelReport() {
logReportTitle("SENSOR MULTILEVEL");
switch(REPORT_SENSOR_MULTILEVEL_SIZE()) {
case 1:
SERIAL.fixPrint(int(REPORT_SENSOR_MULTILEVEL_VALUE_1B()), REPORT_SENSOR_MULTILEVEL_PRECISION());
break;
case 2:
SERIAL.fixPrint(int(REPORT_SENSOR_MULTILEVEL_VALUE_2B()), REPORT_SENSOR_MULTILEVEL_PRECISION());
break;
case 4:
SERIAL.fixPrint(long(REPORT_SENSOR_MULTILEVEL_VALUE_4B()), REPORT_SENSOR_MULTILEVEL_PRECISION());
break;
}
SERIAL.print(" TYPE:");
SERIAL.print(REPORT_SENSOR_MULTILEVEL_TYPE(), HEX);
SERIAL.print(" SCALE:");
SERIAL.println(REPORT_SENSOR_MULTILEVEL_SCALE(), HEX);
}
void SensorBinaryReport() {
logReportTitle("SENSOR BINARY");
SERIAL.print(REPORT_SENSOR_BINARY_VALUE(), HEX);
SERIAL.print(" TYPE:");
SERIAL.println(REPORT_SENSOR_BINARY_TYPE());
}
void SwitchBinaryReport() {
logReportTitle("SWITCH BINARY");
SERIAL.println(REPORT_SWITCH_BINARY_VALUE(), HEX);
}
void SwitchMultilevelReport() {
logReportTitle("SWITCH MULTILEVEL");
SERIAL.println(REPORT_SWITCH_MULTILEVEL_VALUE(), HEX);
}
void NotificationReport() {
logReportTitle("NOTIFICATION ");
SERIAL.print(REPORT_NOTIFICATION_STATUS(), HEX);
SERIAL.print(" TYPE:");
SERIAL.print(REPORT_NOTIFICATION_TYPE(), HEX);
SERIAL.print(" EVENT:");
SERIAL.print(REPORT_NOTIFICATION_EVENT(), HEX);
SERIAL.print(" PARAM:");
SERIAL.println(REPORT_NOTIFICATION_EVENT_PARAM(0), HEX);
}
void MeterReport() {
logReportTitle("METER");
switch(REPORT_METER_SIZE()){
case 1:
SERIAL.fixPrint(int(REPORT_METER_VALUE_1B()), REPORT_METER_PRECISION());
break;
case 2:
SERIAL.fixPrint(int(REPORT_METER_VALUE_2B()), REPORT_METER_PRECISION());
break;
case 4:
SERIAL.fixPrint(long(REPORT_METER_VALUE_4B()), REPORT_METER_PRECISION());
break;
}
SERIAL.print(" TYPE:");
SERIAL.print(REPORT_METER_TYPE(), HEX);
SERIAL.print(" SCALE:");
SERIAL.println(REPORT_METER_SCALE(), HEX);
}
void BasicReport() {
logReportTitle("BASIC");
SERIAL.println(REPORT_BASIC_VALUE(), HEX);
}
void setup() {
SERIAL.begin(115200);
SERIAL.print("START");
}
void loop() {
delay(1000);
}
ZUNO_REPORTS_HANDLER()
This macro is used to setup up a handler for incoming reports from other sensors. ZUNO_REPORTS_HANDLER(reportType, reportHandler) reportType type of the report to handle: Battery, SensorMultilevel, SensorBinary, Notification, SwitchMultilevel, SwitchBinary, Meter, Basic. reportHandler pointer to a user defined function that parses the incoming report of the defined type. void reportHandler(ReportAuxData_t *report_data) There are few helpful marco to parse the reported data inside the report handler:- Generic
- REPORT_NODE_ID(report_data) returns the sender Node Id
- REPORT_CHANNEL(report_data) returns the sender channel
- Basic
- REPORT_BASIC_VALUE(report_data) returns the value
- Switch Multilevel
- REPORT_SWITCH_MULTILEVEL_VALUE(report_data) returns the value
- Switch Binary
- REPORT_SWITCH_BINARY_VALUE(report_data) returns the value
- Notification (Alarm)
- REPORT_NOTIFICATION_TYPE(report_data) returns notification type
- REPORT_NOTIFICATION_EVENT(report_data) returns notification event
- REPORT_NOTIFICATION_EVENT_PARAM(report_data, i) returns notification parameters
- REPORT_NOTIFICATION_STATUS(report_data) returns notification status
- Sensor Binary
- REPORT_SENSOR_BINARY_TYPE(report_data) returns sensor type
- REPORT_SENSOR_BINARY_VALUE(report_data) returns the value
- Sensor Multilevel
- REPORT_SENSOR_MULTILEVEL_TYPE(report_data) returns sensor type
- REPORT_SENSOR_MULTILEVEL_SCALE(report_data) returns sensor scale
- REPORT_SENSOR_MULTILEVEL_UNITS(report_data) returns sensor units
- REPORT_SENSOR_MULTILEVEL_PRECISION(report_data) returns sensor precision (number of digits after .)
- REPORT_SENSOR_MULTILEVEL_SIZE(report_data) returns sensor value size (1, 2 or 4 bytes)
- REPORT_SENSOR_MULTILEVEL_VALUE_1B(report_data) returns the BYTE value for size = 1 bytes
- REPORT_SENSOR_MULTILEVEL_VALUE_2B(report_data) returns the WORD value for size = 2 bytes
- REPORT_SENSOR_MULTILEVEL_VALUE_4B(report_data) returns the DWORD value for size = 4 bytes
- Meter
- REPORT_METER_TYPE(report_data) returns sensor type
- REPORT_METER_RATE(report_data) returns sensor type
- REPORT_METER_SCALE(report_data) returns sensor scale
- REPORT_METER_UNITS(report_data) returns sensor units
- REPORT_METER_PRECISION(report_data) returns sensor precision (number of digits after .)
- REPORT_METER_SIZE(report_data) returns sensor value size (1, 2 or 4 bytes)
- REPORT_METER_VALUE_1B(report_data) returns the BYTE value for size = 1 bytes
- REPORT_METER_VALUE_2B(report_data) returns the WORD value for size = 2 bytes
- REPORT_METER_VALUE_4B(report_data) returns the DWORD value for size = 4 bytes
- Battery
- REPORT_BATTERY_VALUE(report_data) returns battery level
ZUNO_REPORTS_HANDLER(reportType, reportHandler);
void reportHandler(ReportAuxData_t *report_data) {
... REPORT_XXX_VALUE_1B(report_data) ...
}
It is suggested to return as fast as possible from the reports handler and do the main work in the loop().
#include "Arduino.h"
#define MY_SERIAL Serial0
ZUNO_REPORTS_HANDLER(Battery, BatteryReport);
ZUNO_REPORTS_HANDLER(SensorMultilevel, SensorMultilevelReport);
ZUNO_REPORTS_HANDLER(SensorBinary, SensorBinaryReport);
ZUNO_REPORTS_HANDLER(Notification, NotificationReport);
ZUNO_REPORTS_HANDLER(SwitchMultilevel, SwitchMultilevelReport);
ZUNO_REPORTS_HANDLER(SwitchBinary, SwitchBinaryReport);
ZUNO_REPORTS_HANDLER(Meter, MeterReport);
ZUNO_REPORTS_HANDLER(Basic, BasicReport);
void logReportTitle(const char * text, ReportAuxData_t *report_data) {
MY_SERIAL.print(millis());
MY_SERIAL.print(" ");
MY_SERIAL.print(text);
MY_SERIAL.print(" NODE:");
MY_SERIAL.print(REPORT_NODE_ID(report_data));
MY_SERIAL.print(" VALUE:");
}
void BatteryReport(ReportAuxData_t *report_data) {
logReportTitle("BATTERY", report_data);
MY_SERIAL.println(REPORT_BATTERY_VALUE(report_data), HEX);
}
void SensorMultilevelReport(ReportAuxData_t *report_data) {
logReportTitle("SENSOR MULTILEVEL", report_data);
switch(REPORT_SENSOR_MULTILEVEL_SIZE(report_data)) {
case 1:
MY_SERIAL.fixPrint(int(REPORT_SENSOR_MULTILEVEL_VALUE_1B(report_data)), REPORT_SENSOR_MULTILEVEL_PRECISION(report_data));
break;
case 2:
MY_SERIAL.fixPrint(int(REPORT_SENSOR_MULTILEVEL_VALUE_2B(report_data)), REPORT_SENSOR_MULTILEVEL_PRECISION(report_data));
break;
case 4:
MY_SERIAL.fixPrint(long(REPORT_SENSOR_MULTILEVEL_VALUE_4B(report_data)), REPORT_SENSOR_MULTILEVEL_PRECISION(report_data));
break;
}
MY_SERIAL.print(" TYPE:");
MY_SERIAL.print(REPORT_SENSOR_MULTILEVEL_TYPE(report_data), HEX);
MY_SERIAL.print(" SCALE:");
MY_SERIAL.println(REPORT_SENSOR_MULTILEVEL_SCALE(report_data), HEX);
}
void SensorBinaryReport(ReportAuxData_t *report_data) {
logReportTitle("SENSOR BINARY", report_data);
MY_SERIAL.print(REPORT_SENSOR_BINARY_VALUE(report_data), HEX);
MY_SERIAL.print(" TYPE:");
MY_SERIAL.println(REPORT_SENSOR_BINARY_TYPE(report_data));
}
void SwitchBinaryReport(ReportAuxData_t *report_data) {
logReportTitle("SWITCH BINARY", report_data);
MY_SERIAL.println(REPORT_SWITCH_BINARY_VALUE(report_data), HEX);
}
void SwitchMultilevelReport(ReportAuxData_t *report_data) {
logReportTitle("SWITCH MULTILEVEL", report_data);
MY_SERIAL.println(REPORT_SWITCH_MULTILEVEL_VALUE(report_data), HEX);
}
void NotificationReport(ReportAuxData_t *report_data) {
logReportTitle("NOTIFICATION ", report_data);
MY_SERIAL.print(REPORT_NOTIFICATION_STATUS(report_data), HEX);
MY_SERIAL.print(" TYPE:");
MY_SERIAL.print(REPORT_NOTIFICATION_TYPE(report_data), HEX);
MY_SERIAL.print(" EVENT:");
MY_SERIAL.print(REPORT_NOTIFICATION_EVENT(report_data), HEX);
MY_SERIAL.print(" PARAM:");
MY_SERIAL.println(REPORT_NOTIFICATION_EVENT_PARAM(report_data, 0), HEX);
}
void MeterReport(ReportAuxData_t *report_data) {
logReportTitle("METER", report_data);
switch(REPORT_METER_SIZE(report_data)){
case 1:
MY_SERIAL.fixPrint(int(REPORT_METER_VALUE_1B(report_data)), REPORT_METER_PRECISION(report_data));
break;
case 2:
MY_SERIAL.fixPrint(int(REPORT_METER_VALUE_2B(report_data)), REPORT_METER_PRECISION(report_data));
break;
case 4:
MY_SERIAL.fixPrint(long(REPORT_METER_VALUE_4B(report_data)), REPORT_METER_PRECISION(report_data));
break;
}
MY_SERIAL.print(" TYPE:");
MY_SERIAL.print(REPORT_METER_TYPE(report_data), HEX);
MY_SERIAL.print(" SCALE:");
MY_SERIAL.println(REPORT_METER_SCALE(report_data), HEX);
}
void BasicReport(ReportAuxData_t *report_data) {
logReportTitle("BASIC", report_data);
MY_SERIAL.println(REPORT_BASIC_VALUE(report_data), HEX);
}
/* the setup function runs once, when you press reset or power the board */
void setup() {
MY_SERIAL.begin(115200);
MY_SERIAL.print("START");
}
/* the loop function runs over and over again forever */
void loop() {
delay(1000);
}