Browse Source

Merge pull request #15333 from dashevchenko/efentoOpt

Performance and reliability improvements for Efento message processing
pull/15399/head
Viacheslav Klimov 2 months ago
committed by GitHub
parent
commit
ea04ef1ca9
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 142
      common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/efento/CoapEfentoTransportResource.java
  2. 4
      common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/efento/utils/CoapEfentoUtils.java
  3. 673
      common/transport/coap/src/main/proto/efento/proto_config.proto
  4. 125
      common/transport/coap/src/main/proto/efento/proto_config_types.proto
  5. 409
      common/transport/coap/src/main/proto/efento/proto_device_info.proto
  6. 185
      common/transport/coap/src/main/proto/efento/proto_measurement_types.proto
  7. 217
      common/transport/coap/src/main/proto/efento/proto_measurements.proto
  8. 407
      common/transport/coap/src/main/proto/efento/proto_rule.proto
  9. 664
      common/transport/coap/src/test/java/org/thingsboard/server/transport/coap/efento/CoapEfentoTransportResourceTest.java

142
common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/efento/CoapEfentoTransportResource.java

@ -245,7 +245,7 @@ public class CoapEfentoTransportResource extends AbstractCoapTransportResource {
}
List<EfentoTelemetry> getEfentoMeasurements(MeasurementsProtos.ProtoMeasurements protoMeasurements, UUID sessionId) {
String serialNumber = CoapEfentoUtils.convertByteArrayToString(protoMeasurements.getSerialNum().toByteArray());
String serialNumber = CoapEfentoUtils.convertByteArrayToString(protoMeasurements.getSerialNumber().toByteArray());
boolean batteryStatus = protoMeasurements.getBatteryStatus();
int measurementPeriodBase = protoMeasurements.getMeasurementPeriodBase();
int measurementPeriodFactor = protoMeasurements.getMeasurementPeriodFactor();
@ -258,6 +258,9 @@ public class CoapEfentoTransportResource extends AbstractCoapTransportResource {
}
Map<Long, JsonObject> valuesMap = new TreeMap<>();
// general measurements per message
valuesMap.put(TimeUnit.SECONDS.toMillis(channelsList.get(0).getTimestamp()), CoapEfentoUtils.setDefaultMeasurements(serialNumber, batteryStatus, nextTransmissionAtMillis, signal));
for (int channel = 0; channel < channelsList.size(); channel++) {
ProtoChannel protoChannel = channelsList.get(channel);
List<Integer> sampleOffsetsList = protoChannel.getSampleOffsetsList();
@ -271,6 +274,10 @@ public class CoapEfentoTransportResource extends AbstractCoapTransportResource {
long measurementPeriodMillis = TimeUnit.SECONDS.toMillis(measurementPeriod);
long startTimestampMillis = TimeUnit.SECONDS.toMillis(protoChannel.getTimestamp());
// measurements per channel
JsonObject tsValues = valuesMap.computeIfAbsent(startTimestampMillis, k -> new JsonObject());
tsValues.addProperty("measurement_interval_" + (channel + 1), measurementPeriod);
for (int i = 0; i < sampleOffsetsList.size(); i++) {
int sampleOffset = sampleOffsetsList.get(i);
if (isSensorError(sampleOffset)) {
@ -290,22 +297,16 @@ public class CoapEfentoTransportResource extends AbstractCoapTransportResource {
}
long sampleOffsetMillis = TimeUnit.SECONDS.toMillis(sampleOffset);
long measurementTimestamp = startTimestampMillis + Math.abs(sampleOffsetMillis);
values = valuesMap.computeIfAbsent(measurementTimestamp - 1000, k ->
CoapEfentoUtils.setDefaultMeasurements(serialNumber, batteryStatus, measurementPeriod, nextTransmissionAtMillis, signal, k));
values = valuesMap.computeIfAbsent(measurementTimestamp - 1000, k -> new JsonObject());
addBinarySample(protoChannel, currentIsOk, values, channel + 1, sessionId);
} else {
long timestampMillis = startTimestampMillis + i * measurementPeriodMillis;
values = valuesMap.computeIfAbsent(timestampMillis, k -> CoapEfentoUtils.setDefaultMeasurements(
serialNumber, batteryStatus, measurementPeriod, nextTransmissionAtMillis, signal, k));
values = valuesMap.computeIfAbsent(timestampMillis, k -> new JsonObject());
addContinuesSample(protoChannel, sampleOffset, values, channel + 1, sessionId);
}
}
}
if (CollectionUtils.isEmpty(valuesMap)) {
throw new IllegalStateException("[" + sessionId + "]: Failed to collect Efento measurements, reason, values map is empty!");
}
return valuesMap.entrySet().stream()
.map(entry -> new EfentoTelemetry(entry.getKey(), entry.getValue()))
.collect(Collectors.toList());
@ -446,7 +447,7 @@ public class CoapEfentoTransportResource extends AbstractCoapTransportResource {
}
}
private EfentoTelemetry getEfentoDeviceInfo(DeviceInfoProtos.ProtoDeviceInfo protoDeviceInfo) {
EfentoTelemetry getEfentoDeviceInfo(DeviceInfoProtos.ProtoDeviceInfo protoDeviceInfo) {
JsonObject values = new JsonObject();
values.addProperty("sw_version", protoDeviceInfo.getSwVersion());
@ -476,41 +477,86 @@ public class CoapEfentoTransportResource extends AbstractCoapTransportResource {
//modem info
DeviceInfoProtos.ProtoModem modem = protoDeviceInfo.getModem();
values.addProperty("modem_types", modem.getType().toString());
values.addProperty("sc_EARNFCN_offset", modem.getParameters(0));
values.addProperty("sc_EARFCN", modem.getParameters(1));
values.addProperty("sc_PCI", modem.getParameters(2));
values.addProperty("sc_Cell_id", modem.getParameters(3));
values.addProperty("sc_RSRP", modem.getParameters(4));
values.addProperty("sc_RSRQ", modem.getParameters(5));
values.addProperty("sc_RSSI", modem.getParameters(6));
values.addProperty("sc_SINR", modem.getParameters(7));
values.addProperty("sc_Band", modem.getParameters(8));
values.addProperty("sc_TAC", modem.getParameters(9));
values.addProperty("sc_ECL", modem.getParameters(10));
values.addProperty("sc_TX_PWR", modem.getParameters(11));
values.addProperty("op_mode", modem.getParameters(12));
values.addProperty("nc_EARFCN", modem.getParameters(13));
values.addProperty("nc_EARNFCN_offset", modem.getParameters(14));
values.addProperty("nc_PCI", modem.getParameters(15));
values.addProperty("nc_RSRP", modem.getParameters(16));
values.addProperty("RLC_UL_BLER", modem.getParameters(17));
values.addProperty("RLC_DL_BLER", modem.getParameters(18));
values.addProperty("MAC_UL_BLER", modem.getParameters(19));
values.addProperty("MAC_DL_BLER", modem.getParameters(20));
values.addProperty("MAC_UL_TOTAL_BYTES", modem.getParameters(21));
values.addProperty("MAC_DL_TOTAL_BYTES", modem.getParameters(22));
values.addProperty("MAC_UL_total_HARQ_Tx", modem.getParameters(23));
values.addProperty("MAC_DL_total_HARQ_Tx", modem.getParameters(24));
values.addProperty("MAC_UL_HARQ_re_Tx", modem.getParameters(25));
values.addProperty("MAC_DL_HARQ_re_Tx", modem.getParameters(26));
values.addProperty("RLC_UL_tput", modem.getParameters(27));
values.addProperty("RLC_DL_tput", modem.getParameters(28));
values.addProperty("MAC_UL_tput", modem.getParameters(29));
values.addProperty("MAC_DL_tput", modem.getParameters(30));
values.addProperty("sleep_duration", modem.getParameters(31));
values.addProperty("rx_time", modem.getParameters(32));
values.addProperty("tx_time", modem.getParameters(33));
DeviceInfoProtos.ModemType modemType = modem.getType();
values.addProperty("modem_types", modemType.toString());
values.addProperty("sim_card_identification", modem.getSimCardIdentification());
values.addProperty("firmware_version", modem.getFirmwareVersion().toString());
values.addProperty("modem_identification", modem.getModemIdentification());
if (modem.getModemStatisticsCount() >= 4) {
values.addProperty("modem_transmissions_count", modem.getModemStatistics(0));
values.addProperty("modem_time_since_last_devinfo", modem.getModemStatistics(1));
values.addProperty("modem_total_psm_time", modem.getModemStatistics(2));
values.addProperty("modem_total_active_time", modem.getModemStatistics(3));
}
switch (modemType) {
case MODEM_TYPE_BC660:
values.addProperty("sc_EARFCN", modem.getParameters(0));
values.addProperty("sc_EARNFCN_offset", modem.getParameters(1));
values.addProperty("sc_PCI", modem.getParameters(2));
values.addProperty("sc_Cell_id", modem.getParameters(3));
values.addProperty("sc_RSRP", modem.getParameters(4));
values.addProperty("sc_RSRQ", modem.getParameters(5));
values.addProperty("sc_RSSI", modem.getParameters(6));
values.addProperty("sc_SINR", modem.getParameters(7));
values.addProperty("sc_Band", modem.getParameters(8));
values.addProperty("sc_TAC", modem.getParameters(9));
values.addProperty("sc_ECL", modem.getParameters(10));
values.addProperty("sc_TX_PWR", modem.getParameters(11));
values.addProperty("op_mode", modem.getParameters(12));
values.addProperty("nc_EARFCN", modem.getParameters(13));
values.addProperty("nc_PCI", modem.getParameters(14));
values.addProperty("nc_RSRP", modem.getParameters(15));
values.addProperty("nc_RSRQ", modem.getParameters(16));
values.addProperty("sleep_duration", modem.getParameters(17));
values.addProperty("rx_time", modem.getParameters(18));
values.addProperty("tx_time", modem.getParameters(19));
values.addProperty("PLMN_state", modem.getParameters(20));
values.addProperty("select_PLMN", modem.getParameters(21));
break;
case MODEM_TYPE_SHARED_MODEM:
values.addProperty("RSRP", modem.getParameters(0));
values.addProperty("RSRQ", modem.getParameters(1));
values.addProperty("RSSI", modem.getParameters(2));
values.addProperty("SINR", modem.getParameters(3));
break;
default:
// MODEM_TYPE_UNSPECIFIED, MODEM_TYPE_BC66, MODEM_TYPE_BC66NA
values.addProperty("sc_EARNFCN_offset", modem.getParameters(0));
values.addProperty("sc_EARFCN", modem.getParameters(1));
values.addProperty("sc_PCI", modem.getParameters(2));
values.addProperty("sc_Cell_id", modem.getParameters(3));
values.addProperty("sc_RSRP", modem.getParameters(4));
values.addProperty("sc_RSRQ", modem.getParameters(5));
values.addProperty("sc_RSSI", modem.getParameters(6));
values.addProperty("sc_SINR", modem.getParameters(7));
values.addProperty("sc_Band", modem.getParameters(8));
values.addProperty("sc_TAC", modem.getParameters(9));
values.addProperty("sc_ECL", modem.getParameters(10));
values.addProperty("sc_TX_PWR", modem.getParameters(11));
values.addProperty("op_mode", modem.getParameters(12));
values.addProperty("nc_EARFCN", modem.getParameters(13));
values.addProperty("nc_EARNFCN_offset", modem.getParameters(14));
values.addProperty("nc_PCI", modem.getParameters(15));
values.addProperty("nc_RSRP", modem.getParameters(16));
values.addProperty("RLC_UL_BLER", modem.getParameters(17));
values.addProperty("RLC_DL_BLER", modem.getParameters(18));
values.addProperty("MAC_UL_BLER", modem.getParameters(19));
values.addProperty("MAC_DL_BLER", modem.getParameters(20));
values.addProperty("MAC_UL_TOTAL_BYTES", modem.getParameters(21));
values.addProperty("MAC_DL_TOTAL_BYTES", modem.getParameters(22));
values.addProperty("MAC_UL_total_HARQ_Tx", modem.getParameters(23));
values.addProperty("MAC_DL_total_HARQ_Tx", modem.getParameters(24));
values.addProperty("MAC_UL_HARQ_re_Tx", modem.getParameters(25));
values.addProperty("MAC_DL_HARQ_re_Tx", modem.getParameters(26));
values.addProperty("RLC_UL_tput", modem.getParameters(27));
values.addProperty("RLC_DL_tput", modem.getParameters(28));
values.addProperty("MAC_UL_tput", modem.getParameters(29));
values.addProperty("MAC_DL_tput", modem.getParameters(30));
values.addProperty("sleep_duration", modem.getParameters(31));
values.addProperty("rx_time", modem.getParameters(32));
values.addProperty("tx_time", modem.getParameters(33));
break;
}
//Runtime info
DeviceInfoProtos.ProtoRuntime runtimeInfo = protoDeviceInfo.getRuntimeInfo();
@ -521,7 +567,7 @@ public class CoapEfentoTransportResource extends AbstractCoapTransportResource {
values.addProperty("counter_of_non_confirmable_messages_attempts", runtimeInfo.getMessageCounters(1));
values.addProperty("counter_of_succeeded_messages", runtimeInfo.getMessageCounters(2));
values.addProperty("min_battery_mcu_temp", runtimeInfo.getMinBatteryMcuTemperature());
values.addProperty("min_battery_voltage", runtimeInfo.getMinBatteryVoltage());
values.addProperty("min_battery_voltage", runtimeInfo.getBatteryVoltage());
values.addProperty("min_mcu_temp", runtimeInfo.getMinMcuTemperature());
values.addProperty("runtime_errors", runtimeInfo.getRuntimeErrorsCount());
values.addProperty("up_time", runtimeInfo.getUpTime());
@ -529,8 +575,8 @@ public class CoapEfentoTransportResource extends AbstractCoapTransportResource {
return new EfentoTelemetry(System.currentTimeMillis(), values);
}
private JsonElement getEfentoConfiguration(byte[] bytes) throws InvalidProtocolBufferException {
return parseString(ProtoConverter.dynamicMsgToJson(bytes, ConfigProtos.getDescriptor().getMessageTypes().get(2)));
JsonElement getEfentoConfiguration(byte[] bytes) throws InvalidProtocolBufferException {
return parseString(ProtoConverter.dynamicMsgToJson(bytes, ConfigProtos.getDescriptor().getMessageTypes().get(0)));
}
private static String getDate(long seconds) {

4
common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/efento/utils/CoapEfentoUtils.java

@ -59,14 +59,12 @@ public class CoapEfentoUtils {
return String.format("%s UTC", simpleDateFormat.format(new Date(timestampInMillis)));
}
public static JsonObject setDefaultMeasurements(String serialNumber, boolean batteryStatus, long measurementPeriod, long nextTransmissionAtMillis, long signal, long startTimestampMillis) {
public static JsonObject setDefaultMeasurements(String serialNumber, boolean batteryStatus, long nextTransmissionAtMillis, long signal) {
JsonObject values = new JsonObject();
values.addProperty("serial", serialNumber);
values.addProperty("battery", batteryStatus ? "ok" : "low");
values.addProperty("measured_at", convertTimestampToUtcString(startTimestampMillis));
values.addProperty("next_transmission_at", convertTimestampToUtcString(nextTransmissionAtMillis));
values.addProperty("signal", signal);
values.addProperty("measurement_interval", measurementPeriod);
return values;
}

673
common/transport/coap/src/main/proto/efento/proto_config.proto

@ -15,338 +15,471 @@
*/
syntax = "proto3";
import "efento/proto_measurement_types.proto";
import "efento/proto_rule.proto";
import "efento/proto_config_types.proto";
import "efento/proto_measurement_types.proto";
option java_package = "org.thingsboard.server.gen.transport.coap";
option java_outer_classname = "ConfigProtos";
/* Message containing optional channels control parameters */
message ProtoOutputControlState {
/* Channel index */
uint32 channel_index = 1;
/* Channel state ON/OFF. Range (1 - OFF; 2 - ON) */
uint32 channel_state = 2;
}
/* Message containing request data for accessing calibration parameters */
message ProtoCalibrationParameters {
/* Request details. Bitmask: */
/* - calibration_request[0:2] - requested channel number. */
uint32 calibration_request = 1;
/* Assignment of a channel. */
uint32 channel_assignment = 2;
/* Table of calibration parameters. Max size = 8. */
repeated int32 parameters = 3;
}
enum BleAdvertisingPeriodMode {
/* Invalid value */
BLE_ADVERTISING_PERIOD_MODE_UNSPECIFIED = 0;
message ProtoConfig {
/* Default behavior - faster advertising when measurement period is < 15s. */
BLE_ADVERTISING_PERIOD_MODE_DEFAULT = 1;
/* RESERVED FIELDS ---------------------------------------------------------------------------------------------------------- */
/* User-configured normal interval is used. */
BLE_ADVERTISING_PERIOD_MODE_NORMAL = 2;
reserved 1,48;
/* User-configured fast interval is used. */
BLE_ADVERTISING_PERIOD_MODE_FAST = 3;
}
/* DEVICE STATUS FIELDS ----------------------------------------------------------------------------------------------------- */
/* Message containing BLE advertising period configuration */
message ProtoBleAdvertisingPeriod {
/* Serial number of the device. *
* Length: 6 bytes. *
* This field is only sent by the device. *
* Status: In use [06.00 - LATEST] */
bytes serial_number = 25;
/* BLE advertising mode: */
/* - 1: Default, BLE advertising interval is set to 1022.5ms or some lower value, based on continuous measurement period. */
/* - 2: Normal, uses user-configured value from 'normal' field. */
/* - 3: Fast, uses user-configured value from 'fast' field (must be lower than or equal to 'normal' field). */
BleAdvertisingPeriodMode mode = 1;
/* Configuration payload split information: *
* - Values < 0 - Payload split, expect another part of the payload in the next message. *
* The absolute value indicates an index of the current message *
* - Values = 0 - Payload not split *
* - Values > 0 - Last part of the split payload, the value indicates the total number of the messages sent *
* This field is only sent by the device. *
* Status: In use [06.08.00 - LATEST] */
sint32 payload_split_info = 44;
/* BLE advertising interval when in normal mode, configured in 0.625ms steps. */
/* Range: [32:16384] */
uint32 normal = 2;
/* Identifier of the current configuration. *
* The value of this field changes with every configuration change. *
* This field is only sent by the device. *
* Status: In use [07.00.00 - LATEST] / Previously as hash [06.00 - 06.xx.xx] */
uint32 configuration_hash = 21;
/* Timestamp when the new configuration was set. *
* This field is only sent by the device. *
* Status: In use [07.00.00 - LATEST] / Previously as hash_timestamp [06.02 - 06.xx.xx] */
uint32 configuration_hash_timestamp = 39;
/* Configuration errors. *
* Up to 20 error codes supported. *
* This field is only sent by the device. *
* Status: In use [07.00.00 - LATEST] / Previously as errors [06.00 - 06.xx.xx] */
repeated uint32 configuration_errors = 20;
/* Timestamp when a new configuration error was reported. *
* This field is only sent by the device. *
* Status: In use [07.00.00 - LATEST] / Previously as timestamp [06.02 - 06.xx.xx] */
uint32 configuration_error_timestamp = 38;
/* Measurement channel types. *
* This field is only sent by the device. *
* Status: In use [06.00 - LATEST] */
repeated MeasurementType channel_types = 27;
/* BLE advertising interval when in fast mode, configured in 0.625ms steps. */
/* Range: [32:16384] */
uint32 fast = 3;
}
/* NvM status: *
* - 1 - Defaults restored on CRC error: default sensor configuration restored due to the non-volatile memory configuration *
* data integrity failure *
* - 2 - NvM initialization error: changes in the sensor configuration won't be stored in the non-volatile memory, a power *
* reset of the sensor is required *
* When empty field is sent by the sensor NvM status is OK. *
* NvM status can be cleared by sending to the sensor value 0x7F. *
* Status: In use [07.00.00 - LATEST] */
uint32 nvm_status = 62;
/* SERVER STATUS FIELDS ----------------------------------------------------------------------------------------------------- */
/* Current time in seconds since 1st of January 1970 (epoch time). *
* This field is only sent by the server. *
* Status: In use [06.00 - LATEST] */
uint32 current_time = 8;
/* Main message sent in the payload. Each field in this message is independent of the others - only parameters that should be */
/* changed need to be sent in the payload. */
/* If the value of a selected parameter shall not be changed, do not include it in the payload */
message ProtoConfig {
/* REQUEST FIELDS ----------------------------------------------------------------------------------------------------------- */
/* Specifies whether the device should accept the configuration without functional testing (e.g., network connection). *
* This field is only sent by the user/server. *
* Status: In use [07.00.00 - LATEST] / Previously as accept_without_testing [06.00 - 06.xx.xx] */
bool accept_without_testing_request = 22;
/* Specifies whether to send the configuration from the sensor to the configuration endpoint. *
* This field is only sent by the user/server. *
* Status: In use [07.00.00 - LATEST] / Previously as request_configuration [06.00 - 06.xx.xx] */
bool configuration_request = 19;
/* Specifies whether to send the device information from the sensor to the device information endpoint. *
* This field is only sent by the user/server. *
* Status: In use [07.00.00 - LATEST] / Previously as request_device_info [06.00 - 06.xx.xx] */
bool device_info_request = 6;
/* Specifies whether to send the extended configuration from the sensor to the extended configuration endpoint. *
* This field is only sent by the user/server. *
* Status: In use [07.00.00 - LATEST] */
bool extended_configuration_request = 63;
/* Specifies, if software update is available. *
* This field is only sent by the user/server. *
* Status: In use [07.00.00 - LATEST] / Previously as request_fw_update [06.00 - 06.xx.xx] */
bool update_software_request = 7;
/* Device will clear all runtime errors. *
* This field is only sent by the user/server. *
* Status: In use [07.00.00 - LATEST] / Previously as request_runtime_errors_clear [06.02 - 06.xx.xx] */
bool clear_runtime_errors_request = 37;
/* Device will power off its cellular modem for requested number of seconds. *
* Range: [60:604800] (1 minute : 7 days) *
* This field is only sent by the user/server. *
* Status: In use [06.00 - LATEST] */
uint32 disable_modem_request = 18;
/* DEPRECATED - Used for backward compatibility with fw versions 5.x */
/* repeated Threshold thresholds = 1; */
/* 'Measurement_period_base' and 'measurement_period_factor' define how often the measurements are taken. */
/* Sensors of 'Continuous' type take measurement each Measurement_period_base * measurement_period_factor. */
/* Sensors of 'Binary' type take measurement each Measurement_period_base. */
/* For backward compatibility with versions 5.x in case of binary/mixed sensors, if the 'measurement_period_factor' is */
/* not sent (equal to 0), then the default value '14' shall be used for period calculation. */
/* For backward compatibility with versions 5.x in case of continues sensors, if the measurement_period_factor is */
/* not sent (equal to 0), then the default value '1' shall be used for period calculation. */
/* measurement period base in seconds */
/* Range [1:65535] - minimum value can vary depends on installed sensors */
/* Specifies, if the modem firmware update is available. *
* String up to 48 characters: *
* - DFOTA URL - For use by BC66/BC660 modem. *
* This field is only sent by the user/server. *
* Status: In use [07.00.00 - LATEST] / Previously as modem_update_request [06.08.00 - 06.xx.xx] */
string update_modem_request = 45;
/* Device will erase all measurements from memory. *
* This field is only sent by the user/server. *
* Status: In use [07.00.00 - LATEST] / Previously as memory_reset_request [06.00 - 06.xx.xx] */
bool reset_memory_request = 30;
/* Device will restart the collection of memory statistics. *
* This field is only sent by the user/server. *
* Status: In use [07.00.00 - LATEST] */
bool restart_memory_stats_request = 64;
/* Specifies whether to send measurements from the sensor starting at the specified timestamp. *
* Tiemstamp in seconds since 1st of January 1970 (epoch time). *
* All previous measurements will be marked as sent. *
* This field is only sent by the user/server. *
* Status: In use [07.00.00 - LATEST] */
uint32 data_transfer_start_timestamp_request = 65;
/* Device will set new calibration parameters or will send the current set of parameters to the configuration endpoint. *
* Status: Deprecated [06.10.00 - 06.xx.xx] */
ProtoCalibrationParametersRequest calibration_parameters_request = 49;
/* Device will set the new output state of the output control channel pins. *
* Up to 3 channels supported in the one request. *
* This field is only sent by the user/server. *
* Status: In use [07.00.00 - LATEST] / Previously as output_control_state_request [06.13.00/06.21.00 - 06.xx.xx] */
repeated ProtoOutputControlState set_output_control_state_request = 58;
/* MEASUREMENTS CONFIGURATION ----------------------------------------------------------------------------------------------- */
/* Measurement period defines how often the measurements are to be taken. *
* Sensors of 'Continuous' type take measurement each 'measurement_period_base' * 'measurement_period_factor'. *
* Sensors of 'Binary' type take measurement each 'measurement_period_base'. *
* For backward compatibility with versions 5.xx in case of 'Binary/Mixed' sensors, if the 'measurement_period_factor' is *
* not sent (equal to 0), then the default value '14' shall be used for the period calculation. *
* For backward compatibility with versions 5.xx in case of 'Continuous' sensors, if the 'measurement_period_factor' is *
* not sent (equal to 0), then the default value '1' shall be used for the period calculation. */
/* Measurement period base in seconds. *
* Range: [1:65535] (minimum value may vary depending on sensors installed) *
* Group: Measurement Period *
* Status: In use [06.00 - LATEST] */
uint32 measurement_period_base = 2;
/* Measurement period factor */
/* Range [1:65535] - minimum value can vary depends on installed sensors */
/* Measurement period factor. *
* Range: [1:65535] (minimum value may vary depending on sensors installed) *
* Group: Measurement Period *
* Status: In use [06.00 - LATEST] */
uint32 measurement_period_factor = 26;
/* Transmission interval in seconds. Range: [60:604800] */
uint32 transmission_interval = 3;
/* BLUETOOTH CONFIGURATION -------------------------------------------------------------------------------------------------- */
/* BLE turnoff time in seconds. Once receiving this setting, BLE will be switched off after the set number of seconds. */
/* If BLE is already switched off, it will switch on for the set number of seconds and switch off afterwards. */
/* Range [60:604800] and 0xFFFFFFFF */
/* 0xFFFFFFFF - always on */
/* Bluetooth turn-off time: *
* - [60:604800] - Time in seconds after which Bluetooth is turned off *
* - 0xFFFFFFFF - Bluetooth is always on *
* When this setting is received, Bluetooth is turned off after the set number of seconds. *
* If Bluetooth is already off, it will turn on for the set number of seconds and then turn off. *
* Group: Bluetooth Turn-Off *
* Status: In use [06.00 - LATEST] */
uint32 ble_turnoff_time = 4;
/* ACK interval in seconds */
/* Range [180:2592000] and 0xFFFFFFFF */
/* 0xFFFFFFFF - always request ACK */
uint32 ack_interval = 5;
/* Specifies, if the additional device info is requested. If true, sensor will send a message to endpoint '/i' with the */
/* device info. This field is only sent by server */
bool request_device_info = 6;
/* Specifies, if software update is available. This field is only sent by server */
bool request_fw_update = 7;
/* Current time in seconds sine 1st of January 1970 (epoch time). */
uint32 current_time = 8;
/* NB-IoT transfer limit */
/* Range: [1:65535] */
/* 65535 - disable transfer limit function */
uint32 transfer_limit = 9;
/* NB-IoT transfer limit timer in seconds */
/* Range: [1:65535] */
/* 65535 - disable transfer limit function */
uint32 transfer_limit_timer = 10;
/* For firmware >= 6.07.00: */
/* IP or URL address of the data (measurements) server */
/* The IP or URL of the data server, provided as string with a maximum length of 31 characters */
/* For example, use "18.184.24.239" for an IP address or "efento.test.io" for a URL */
/* For firmware < 6.07.00: */
/* IP address of the data (measurements) server */
/* For example, use "18.184.24.239" */
string data_server_ip = 11;
/* Data (measurements) server port */
/* Range: [1:65535] */
uint32 data_server_port = 12;
/* For firmware >= 6.07.00: */
/* IP or URL address of the update server */
/* The IP or URL of the update server, provided as string with a maximum length of 31 characters */
/* For example, use "18.184.24.239" for an IP address or "efento.test.io" for a URL */
/* For firmware < 6.07.00: */
/* IP address of the update server */
/* For example, use "18.184.24.239" */
string update_server_ip = 13;
/* Update server port for UDP transmission */
/* Range: [1:65535] */
uint32 update_server_port_udp = 14;
/* Update server port for CoAP transmission */
/* Range: [1:65535] */
uint32 update_server_port_coap = 15;
/* APN as string. Max length 49 */
/* String with special character 0x7F (DEL) only indicates that automatic apn is turn on */
string apn = 16;
/* Bluetooth Tx power level. *
* Value is the index of the absolute value of the Tx power, which depends on the BLE module. *
* Range: [1:4] *
* Group: Bluetooth Tx Power *
* Status: In use [06.02 - LATEST] */
uint32 ble_tx_power_level = 36;
/* PLMN selection */
/* Range: [100:999999] */
/* 0xFFFFFFFF or 1000000 - automatic selection */
uint32 plmn_selection = 17;
/* Encryption key. *
* Max length: 16 bytes. *
* A one-element array containing only one 0x7F (DEL) byte disables encryption. *
* Device sends two last bytes of SHA256 hash of current key in this field. *
* When the encryption key is disabled, the device sends a 0x7F (DEL) byte. *
* Group: Encryption *
* Status: In use [06.11.00 - LATEST] */
bytes encryption_key = 54;
/* Device will power off its cellular modem for requested number of seconds. */
/* Range: [60:604800] (1 minute : 7 days) */
/* This field is only sent by server */
uint32 disable_modem_request = 18;
/* Bluetooth advertising period. *
* Group: Bluetooth Advertising Period *
* Status: In use [06.13.00/06.21.00 - LATEST] */
ProtoBleAdvertisingPeriod ble_advertising_period = 59;
/* If set, the device will send its configuration to the endpoint '/c' as a confirmable message */
/* This field is only sent by server */
bool request_configuration = 19;
/* Advertisement manufacturer specific data format. *
* Group: Advertisement Manufacturer Data Format *
* Status: In use [07.00.00 - LATEST] */
AdvertisementManufacturerDataFormat advertisement_manufacturer_data_format = 60;
/* Device's error codes. */
/* This field is only sent by device */
repeated uint32 errors = 20;
/* EDGE LOGIC CONFIGURATION ------------------------------------------------------------------------------------------------- */
/* Identifier of current configuration - Every change of the configuration results in change of the value of this field */
/* This field is only sent by device */
uint32 hash = 21;
/* Edge logic rules set on the device. *
* Up to 16 rules supported (previously 12 rules [06.00 - 07.01.xx]). *
* Group: Edge Logic Rule No. # *
* Status: In use [06.00 - LATEST] */
repeated ProtoRule rules = 28;
/* If true, the device will accept the configuration without functional testing (eg. network connection) */
bool accept_without_testing = 22;
/* Calendars set on the device. *
* Up to 6 calendars supported. *
* Group: Calendar No. # *
* Status: In use [06.08.00 - LATEST] */
repeated ProtoCalendar calendars = 47;
/* Cloud token configuration: */
/* - 1: cloud token set to the value of cloud_token field */
/* - 2: cloud token set to IMEI of the cellular module */
/* - 255: do not send cloud_token field */
uint32 cloud_token_config = 23;
/* SERVER COMMUNICATION CONFIGURATION --------------------------------------------------------------------------------------- */
/* Cloud token that should be sent with each measurement frame */
string cloud_token = 24;
/* Transmission interval in seconds. *
* Range: [60:604800] *
* Group: Server Intervals *
* Status: In use [06.00 - LATEST] */
uint32 transmission_interval = 3;
/* Serial number of the device */
/* This field is only sent by device */
bytes serial_number = 25;
/* ACK interval: *
* - [180:2592000] - Time in seconds after which the device will request an ACK *
* - 0xFFFFFFFF - Always request ACK *
* Group: Server Intervals *
* Status: In use [06.00 - LATEST] */
uint32 ack_interval = 5;
/* Type of channel */
/* This field is only sent by device */
repeated MeasurementType channel_types = 27;
/* Server transfer limit: *
* - [1:65534] - Number of transfers *
* - 65535 - Transfer limit disabled *
* Group: Server Transfer Limit *
* Status: In use [06.00 - LATEST] */
uint32 transfer_limit = 9;
/* Edge logic rules set on the device. Up to 12 rules are supported */
repeated ProtoRule rules = 28;
/* Server transfer limit timer: *
* - [1:65534] - Time in seconds after which the transfer is renewed *
* - 65535 - Transfer limit disabled *
* Group: Server Transfer Limit *
* Status: In use [06.00 - LATEST] */
uint32 transfer_limit_timer = 10;
/* Supervision period */
/* Range: [180:604800] */
/* 0xFFFFFFFF - Functionality disabled */
/* Server supervision period: *
* - [180:604800] - Time in seconds after which the device resets itself if there is no communication with the server *
* - 0xFFFFFFFF - Server supervision disabled *
* Group: Server Supervision *
* Status: In use [06.00 - LATEST] */
uint32 supervision_period = 29;
/* If true, sensor's measurement memory will be erased */
bool memory_reset_request = 30;
/* DATA SERVER CONFIGURATION ------------------------------------------------------------------------------------------------ */
/* Bytes 0-4 - Band selection mask. Mask = 1 << position */
/* Band | 1 | 2 | 3 | 4 | 5 | 8 | 12 | 13 | 17 | 18 | 19 | 20 | 25 | 26 | 28 | 66 | 71 | 85 | */
/* Position: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | */
/* example: To enable band 3, 8 and 20 set to (1 << 2) + (1 << 5) + (1 << 11) = 2084 */
uint32 modem_bands_mask = 31;
/* Data server address. *
* String up to 31 characters: *
* - IPv4 address (examples: "18.184.24.239") [06.00 - 06.06.xx] *
* - IPv4/URL address (examples: "18.184.24.239", "efento.test.io") [06.07.00 - LATEST] *
* Group: Data Server *
* Status: In use [06.00 - LATEST] */
string data_server_ip = 11;
/* Data server port. *
* Range: [1:65535] *
* Group: Data Server *
* Status: In use [06.00 - LATEST] */
uint32 data_server_port = 12;
/* Data endpoint (string - max length 16) */
/* Data endpoint. *
* String up to 11 characters. *
* Group: Data Server *
* Status: In use [06.02 - LATEST] */
string data_endpoint = 32;
/* Configuration endpoint (string - max length 16) */
/* Configuration endpoint. *
* String up to 11 characters. *
* Group: Data Server *
* Status: In use [06.02 - LATEST] */
string configuration_endpoint = 33;
/* Device info endpoint (string - max length 16) */
/* Extended configuration endpoint. *
* String up to 11 characters. *
* Group: Data Server *
* Status: In use [07.00.00 - LATEST] */
string extended_configuration_endpoint = 61;
/* Device information endpoint. *
* String up to 11 characters. *
* Group: Device Information Endpoint *
* Status: In use [06.02 - LATEST] */
string device_info_endpoint = 34;
/* Time endpoint (string - max length 16) */
/* Time endpoint. *
* String up to 11 characters. *
* Group: Time Endpoint *
* Status: In use [06.02 - LATEST] */
string time_endpoint = 35;
/* Bluetooth TX power level. Value is the index of the absolute value of TX power, that depends on the BLE module */
/* Range: [1:4] */
uint32 ble_tx_power_level = 36;
/* UPDATE SERVER CONFIGURATION ---------------------------------------------------------------------------------------------- */
/* Deprecated field */
/* If true, the sensor's runtime errors will be cleared */
bool request_runtime_errors_clear = 37;
/* Update server address. *
* String up to 31 characters: *
* - IPv4 address (examples: "18.184.24.239") [06.00 - 06.06.xx] *
* - IPv4/URL address (examples: "18.184.24.239", "efento.test.io") [06.07.00 - LATEST] *
* Group: Update Server *
* Status: In use [06.00 - LATEST] */
string update_server_ip = 13;
/* Timestamp when a new error code was reported */
uint32 error_timestamp = 38;
/* Update server port for UDP transfer. *
* Range: [1:65535] *
* Group: Update Server *
* Status: In use [06.00 - LATEST] */
uint32 update_server_port_udp = 14;
/* Timestamp when the new configuration was set */
uint32 hash_timestamp = 39;
/* Update server port for CoAP transfer. *
* Range: [1:65535] *
* Group: Update Server *
* Status: In use [06.00 - LATEST] */
uint32 update_server_port_coap = 15;
/* Cloud token CoAP option ID: */
/* - [1:64999] - CoAP option ID containing cloud token */
/* - 65000 - cloud token sent in the payload */
uint32 cloud_token_coap_option = 40;
/* CLOUD CONFIGURATION ------------------------------------------------------------------------------------------------------ */
/* ECDSA payload signature CoAP option ID: */
/* - [1:64999] - CoAP option ID containing ECDSA payload signature */
/* - 65000 - no payload signature in CoAP option */
uint32 payload_signature_coap_option = 41;
/* Cloud token configuration: *
* - 1 - Cloud token set to the value of the 'cloud_token' field *
* - 2 - Cloud token set to the modem identification (IMEI for cellular modems) *
* - 255 - Do not send 'cloud_token' field *
* Group: Cloud Token *
* Status: In use [06.00 - LATEST] */
uint32 cloud_token_config = 23;
/* DNS server IP address grouped in the array as four octets. Set 255.255.255.255 to use a network DNS server */
/* Note: when setting less than four octets the remaining will be filled with zeros. */
repeated uint32 dns_server_ip = 42;
/* Cloud token that should be sent with each measurement frame. *
* String up to 36 characters. *
* Group: Cloud Token *
* Status: In use [06.00 - LATEST] */
string cloud_token = 24;
/* DNS TTL configuration: */
/* - [1:864000] - custom TTL in seconds (additionally, the DNS request when communication has failed) */
/* - 864001 - accept TTL from the DNS server (additionally, the DNS request when communication has failed) */
/* - 864002 - DNS request is only after communication failed */
uint32 dns_ttl_config = 43;
/* Cloud token CoAP option ID: *
* - [1:64999] - CoAP option ID with cloud token *
* - 65000 - Cloud token sent in the payload *
* Group: Cloud Token *
* Status: In use [06.07.00 - LATEST] */
uint32 cloud_token_coap_option = 40;
/* Configuration payload split information. Information about dividing the payload into parts */
/* values < 0 - payload has been split, expect another part of the payload in the next message. */
/* The absolute value indicates an index of the current message. */
/* value = 0 - payload has not been splitted */
/* values > 0 - last part of the split payload, the value indicates the total number of the messages sent */
sint32 payload_split_info = 44;
/* ECDSA payload signature CoAP option ID: *
* - [1:64999] - CoAP option ID with payload signature *
* - 65000 - Payload signature is not sent *
* Group: Cloud Token *
* Status: In use [06.07.00 - LATEST] */
uint32 payload_signature_coap_option = 41;
/* Modem update request (string - max length 48) */
/* This field is only sent by server */
/* For BC66 module, this field is a DFOTA URL */
string modem_update_request = 45;
/* Modem identification CoAP option ID: *
* - [1:64999] - CoAP option ID with modem identification *
* - 65000 - Modem identification is not sent *
* Group: Cloud Token *
* Status: In use [07.00.00 - LATEST] */
uint32 modem_identification_coap_option = 52;
/* Cellular configuration parameters. */
/* 1st item - Number of used cellular parameters */
/* 2nd - 12th items - Cellular parameters */
repeated uint32 cellular_config_params = 46;
/* NETWORK CONFIGURATION ---------------------------------------------------------------------------------------------------- */
/* Calendar configuration. Up to 6 calendars are supported */
repeated ProtoCalendar calendars = 47;
/* DNS server IP address. *
* Grouped in the array as four octets. Set 255.255.255.255 to use a cellular network DNS server. *
* Note: when setting less than four octets the remaining will be filled with zeros. *
* Group: Data Server *
* Status: In use [06.07.00 - LATEST] */
repeated uint32 dns_server_ip = 42;
/* DEPRECATED - Used for backward compatibility */
reserved 48;
/* Set/get calibration parameters for single channel. */
ProtoCalibrationParameters calibration_parameters_request = 49;
/* LED behaviour configuration: */
/* Period of LEDs flashing (5-600 seconds in 5 seconds resolution): */
/* - led_config[0] - green LED */
/* - led_config[1] - red LED */
/* Time from entering the normal state, after which the LED indication is turned off */
/* (0-240 minutes in 1 minute resolution, or 255 for always turned on): */
/* - led_config[2] - flashing red led on communication problem */
/* - led_config[3] - flashing red led on a sensor problem */
/* - led_config[4] - flashing red led on a low power */
/* - led_config[5] - flashing green led on measurement */
/* - led_config[6] - flashing green led on transmission */
/* - led_config[7] - flashing green led to indicate sensor's proper operation */
/* - led_config[8] - Blink duration (20-1000ms in 5 ms resolution) */
repeated uint32 led_config = 50;
/* DNS TTL configuration: *
* - [1:864000] - Custom TTL in seconds (if communication fails, DNS is also queried) *
* - 864001 - Accept TTL from the DNS server (if communication fails, DNS is also queried) *
* - 864002 - DNS query only after communication failure *
* Group: DNS *
* Status: In use [06.07.00 - LATEST] */
uint32 dns_ttl_config = 43;
/* Network troubleshooting configuration, if bluetooth is turned off and communication with the server is faulty, */
/* bluetooth will be automatically turned on until the connection is stabilized */
/* - 1: network troubleshooting disabled */
/* - 2: network troubleshooting enabled */
/* Network troubleshooting:
* - 1 - Network troubleshooting disabled *
* - 2 - Network troubleshooting enabled *
* If Bluetooth is turned off and communication with the server is faulty, Bluetooth will be automatically turned on until *
* the connection is stabilized. *
* Group: Network *
* Status: In use [06.10.00 - LATEST] */
uint32 network_troubleshooting = 51;
/* Reserved by gateway client */
reserved 52, 53;
/* Encryption key configuration. Sensor sends in this field two last bytes of SHA256 hash calculated from its current */
/* encryption_key configuration. When encryption key is disabled one byte 0x7F (DEL) is sent. */
/* Max length: 16 bytes. */
/* 0x7F - encryption key disabled. */
bytes encryption_key = 54;
/* User name as string. Max length 31 */
/* String with special character 0x7F (DEL) only indicates that automatic user name is turn on */
/* User name can only be set to custom value if apn has been configured (is not automatic) */
string apn_user_name = 55;
/* Network key. *
* Max length: 16 bytes. *
* A one-element array containing only one 0x7F (DEL) byte disables network key. *
* Device sends two last bytes of SHA256 hash of current key in this field. *
* When the network key is disabled, the device sends a 0x7F (DEL) byte. *
* Group: Local Network *
* Status: In use [07.00.00 - LATEST] */
bytes network_key = 53;
/* MODEM CONFIGURATION ------------------------------------------------------------------------------------------------------ */
/* APN (Access Point Name). *
* String up to 49 characters. *
* A string containing only the special character 0x7F (DEL) indicates that automatic APN is enabled. *
* Group: Data Server *
* Status: In use [06.00 - LATEST] */
string apn = 16;
/* Password as string. Max length 31 */
/* String with special character 0x7F (DEL) only indicates that automatic password is turn on */
/* Password can only be set to custom value if apn_user_name has been configured (is not automatic) */
/* APN username. *
* String up to 31 characters. *
* A string containing only the special character 0x7F (DEL) indicates that the username is not being used. *
* The username can only be set to a custom value if APN has been configured. *
* Group: Data Server *
* Status: In use [07.00.00 - LATEST] / Previously as apn_user_name [06.11.00 - 06.xx.xx] */
string apn_username = 55;
/* APN password. *
* String up to 31 characters. *
* A string containing only the special character 0x7F (DEL) indicates that the password is not being used. *
* The password can only be set to a custom value if APN username has been configured. *
* Group: Data Server *
* Status: In use [06.11.00 - LATEST] */
string apn_password = 56;
/* Reserved by versions above 06.20.00 */
reserved 57;
/* PLMN selection: *
* - [100:999999] - Selected operator code *
* - 1000000 - Automatic selection *
* - 0xFFFFFFFF - Automatic selection (legacy) *
* Group: Data Server *
* Status: In use [06.00 - LATEST] */
uint32 plmn_selection = 17;
/* Control output state on channel pin. Maximal number of requests equals 3 */
/* This field is only sent by server */
repeated ProtoOutputControlState output_control_state_request = 58;
/* Modem bands mask. *
* 4-byte bit mask, where each bit represents a specific band: *
* Band: | 1 | 2 | 3 | 4 | 5 | 8 | 12 | 13 | 17 | 18 | 19 | 20 | 25 | 26 | 28 | 66 | 71 | 85 | 70 | *
* Bit: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | *
* Example: To enable band 3, 8 and 20 set to 2084 = (1 << 2) + (1 << 5) + (1 << 11) *
* Group: Data Server *
* Status: In use [06.00 - LATEST] */
uint32 modem_bands_mask = 31;
/* BLE advertising period configuration. */
ProtoBleAdvertisingPeriod ble_advertising_period = 59;
}
/* Modem configuration parameters. *
* 1st item - The number of cellular parameters that are used (depending on the modem in use). *
* 2nd - 16th item - Cellular parameters. *
* Group: Cellular Configuration *
* Status: In use [06.08.00 - LATEST] */
repeated uint32 cellular_config_params = 46;
/* Network search schema. *
* Group: Network Search *
* Status: In use [06.20.00 - LATEST] */
ProtoNetworkSearch network_search = 57;
/* USER INTERFACE CONFIGURATION --------------------------------------------------------------------------------------------- */
/* LEDs behavior. *
* Period of LED blinking in 5-second unit (value is multiplied by 5). Range: [1:120]: *
* - 1st item - Period of GREEN LED blinking *
* - 2nd item - Period of RED LED blinking *
* Time elapsing from the entry into the normal state, after which the LED indicator is switched off, in minutes. *
* Range: [0:240; 255]. Value of 255 means always on: *
* - 3rd item - Blinking RED LED on communication problem *
* - 4th item - Blinking RED LED on a sensor problem *
* - 5th item - Blinking RED LED on a low power *
* - 6th item - Blinking GREEN LED on measurement *
* - 7th item - Blinking GREEN LED on transmission *
* - 8th item - Blinking GREEN LED to indicate sensor's proper operation *
* 9th item - Duration of LED blinking in 5-millisecond unit. Range: [4:200] *
* Group: LED *
* Status: In use [06.10.00 - LATEST] */
repeated uint32 led_config = 50;
}

125
common/transport/coap/src/main/proto/efento/proto_config_types.proto

@ -0,0 +1,125 @@
/**
* Copyright © 2016-2026 The Thingsboard Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
syntax = "proto3";
option java_package = "org.thingsboard.server.gen.transport.coap";
option java_outer_classname = "ConfigTypesProtos";
message ProtoCalibrationParametersRequest {
/* Request details. *
* Bitmask: *
* - Bit 0:2 - Requested channel number, range: [1:6] *
* Status: Deprecated [06.10.00 - 06.xx.xx] */
uint32 calibration_request = 1;
/* Channel assignment - the sensor code. *
* Status: Deprecated [06.10.00 - 06.xx.xx] */
uint32 channel_assignment = 2;
/* Channel calibration parameters. *
* Up to 8 parameters supported. *
* If this field is empty, the sensor will send the current set of parameters. *
* Status: Deprecated [06.10.00 - 06.xx.xx] */
repeated int32 parameters = 3;
}
message ProtoOutputControlState {
/* Channel index. *
* Range: [0:5] *
* Status: In use [06.13.00/06.21.00 - LATEST] */
uint32 channel_index = 1;
/* Channel output state: *
* - 1 - OFF *
* - 2 - ON *
* Status: In use [06.13.00/06.21.00 - LATEST] */
uint32 channel_state = 2;
}
enum BleAdvertisingPeriodMode {
/* Invalid value. */
BLE_ADVERTISING_PERIOD_MODE_UNSPECIFIED = 0;
/* Default mode. *
* Bluetooth advertising interval is set to 1022.5ms or a lower value, based on the continuous measurement period. */
BLE_ADVERTISING_PERIOD_MODE_DEFAULT = 1;
/* Normal mode. *
* Uses the value configured by the user from the 'normal' field. */
BLE_ADVERTISING_PERIOD_MODE_NORMAL = 2;
/* Fast mode. *
* Uses the value configured by the user from the 'fast' field. */
BLE_ADVERTISING_PERIOD_MODE_FAST = 3;
}
message ProtoBleAdvertisingPeriod {
/* Bluetooth advertising mode. *
* Status: In use [06.13.00/06.21.00 - LATEST] */
BleAdvertisingPeriodMode mode = 1;
/* Bluetooth advertising interval in normal mode, configured in steps of 0.625 ms. *
* Range: [32:16384] *
* Status: In use [06.13.00/06.21.00 - LATEST] */
uint32 normal = 2;
/* Bluetooth advertising interval in fast mode, configured in steps of 0.625 ms. *
* Range: [32:16384] *
* Status: In use [06.13.00/06.21.00 - LATEST] */
uint32 fast = 3;
}
enum AdvertisementManufacturerDataFormat {
/* Invalid value. */
ADVERTISEMENT_MANUFACTURER_DATA_FORMAT_UNSPECIFIED = 0;
/* Advertisement manufacturer specific data format 3. */
ADVERTISEMENT_MANUFACTURER_DATA_FORMAT_V3 = 1;
/* Advertisement manufacturer specific data format 5. */
ADVERTISEMENT_MANUFACTURER_DATA_FORMAT_V5 = 2;
}
message ProtoNetworkSearch {
/* Timing schema, if successful registration since the last reset. *
* Length: 6 items. *
* 1st - 6th item - Time in minutes. Range: [1:255]. *
* Status: In use [06.20.00 - LATEST] */
repeated uint32 time_schema_last_registration_ok = 1;
/* Timing schema, if no successful registration since the last reset. *
* Length: 6 items. *
* 1st - 6th item - Time in minutes. Range: [1:255]. *
* Status: In use [06.20.00 - LATEST] */
repeated uint32 time_schema_last_registration_not_ok = 2;
/* Disable base period in minutes. *
* Disable time = 'disable_period_base' * counter (from 1 to 'counter_max'). *
* Range: [1:255] *
* Status: In use [06.20.00 - LATEST] */
uint32 disable_period_base = 3;
/* Disable counter maximum. *
* Range: [1:255] *
* Status: In use [06.20.00 - LATEST] */
uint32 counter_max = 4;
}

409
common/transport/coap/src/main/proto/efento/proto_device_info.proto

@ -18,185 +18,330 @@ syntax = "proto3";
option java_package = "org.thingsboard.server.gen.transport.coap";
option java_outer_classname = "DeviceInfoProtos";
message ProtoRuntime
{
/* Up-time in seconds (since reset). *
* Status: In use [06.00 - LATEST] */
uint32 up_time = 1;
/* Message counters (since reset). *
* 1st item - Confirmable message attempts counter. *
* 2nd item - Non-confirmable message attempts counter. *
* 3rd item - Successful message counter. *
* Status: In use [06.00 - LATEST] */
repeated uint32 message_counters = 2;
/* MCU temperature in Celsius. *
* Status: In use [06.00 - LATEST] */
sint32 mcu_temperature = 3;
/* Battery voltage in mV. *
* - [0:65534] - Battery voltage in millivolts *
* - 65535 - No measurement *
* Status: In use [07.00.00 - LATEST] / Previously as min_battery_voltage [06.00 - 06.xx.xx] */
uint32 battery_voltage = 4;
/* MCU temperature in Celsius when minimum battery voltage was reached. *
* Status: Deprecated [06.00 - 06.xx.xx] */
sint32 min_battery_mcu_temperature = 5;
/* Battery reset timestamp in seconds since 1st of January 1970 (epoch time). *
* Status: Deprecated [06.00 - 06.xx.xx] */
uint32 battery_reset_timestamp = 6;
/* Maximum MCU temperature in Celsius. *
* Status: In use [06.00 - LATEST] */
sint32 max_mcu_temperature = 7;
/* Minimum MCU temperature in Celsius *
* Status: In use [06.00 - LATEST] */
sint32 min_mcu_temperature = 8;
/* Device's runtime errors. *
* Up to 20 error items supported. *
* Status: In use [06.02 - LATEST] */
repeated uint32 runtime_errors = 9;
/* Number of sensor resets (since power-up). *
* Status: In use [06.21.00 - LATEST] */
uint32 reset_counter = 10;
}
message ProtoUpdateInfo
{
/* Timestamp of the last update check in seconds since 1st of January 1970 (epoch time). *
* Status: In use [06.00 - LATEST] */
uint32 timestamp = 1;
/* Status of the last update check: *
* - 1 - No update check *
* - 2 - No error *
* - 3 - UDP socekt error *
* - 4 - Invalid hash *
* - 5 - Missing packet *
* - 6 - Invalid data *
* - 7 - Sending timeout *
* - 8 - No software to update *
* - 9 - Sending unexpected error *
* - 10 - Unexpected error *
* Status: In use [06.00 - LATEST] */
uint32 status = 2;
}
enum ModemType
{
/* Invalid value */
/* Invalid value. */
MODEM_TYPE_UNSPECIFIED = 0;
/* Quectel BC66 modem */
/* Quectel BC66 modem. */
MODEM_TYPE_BC66 = 1;
/* Quectel BC66-NA modem */
/* Quectel BC66-NA modem. */
MODEM_TYPE_BC66NA = 2;
/* Uses a shared modem from another sensor. */
MODEM_TYPE_SHARED_MODEM = 3;
/* Quectel BC660 modem. */
MODEM_TYPE_BC660 = 4;
}
message ProtoRuntime
enum ModemFirmwareVersion
{
/* Invalid value. */
MODEM_FIRMWARE_VERSION_UNSPECIFIED = 0;
/* Up-time in seconds (since reset) */
uint32 up_time = 1;
/* Unable to read firmware version from device. */
MODEM_FIRMWARE_VERSION_READING_ERROR = 1;
/* Message counters (since reset). There are 3 counters: */
/* message_counters[0] - Counter of confirmable messages attempts */
/* message_counters[1] - Counter of non-confirmable messages attempts */
/* message_counters[2] - Counter of succeeded messages */
repeated uint32 message_counters = 2;
/* Unknown firmware version. */
MODEM_FIRMWARE_VERSION_UNKNOWN = 2;
/* MCU temperature in Celsius */
sint32 mcu_temperature = 3;
/* BC660KGLAAR01A05_01.002.01.002. */
MODEM_FIRMWARE_VERSION_BC660_V1 = 3;
/* Minimum battery voltage in mV */
uint32 min_battery_voltage = 4;
/* BC660KGLAAR01A05_01.200.01.200. */
MODEM_FIRMWARE_VERSION_BC660_V2 = 4;
/* MCU temperature in Celsius, while the minimum battery voltage was reached */
sint32 min_battery_mcu_temperature = 5;
/* BC660KGLAAR01A05_01.202.01.202. */
MODEM_FIRMWARE_VERSION_BC660_V3 = 5;
/* Battery reset timestamp (Unix timestamp) */
uint32 battery_reset_timestamp = 6;
/* BC660KGLAAR01A05_01.203.01.203. */
MODEM_FIRMWARE_VERSION_BC660_V4 = 6;
/* Max MCU temperature in Celsius */
sint32 max_mcu_temperature = 7;
/* BC660KGLAAR01A05_01.204.01.204. */
MODEM_FIRMWARE_VERSION_BC660_V5 = 7;
/* Min MCU temperature in Celsius */
sint32 min_mcu_temperature = 8;
/* BC660KGLAAR01A05_01.205.01.205. */
MODEM_FIRMWARE_VERSION_BC660_V6 = 8;
/* Table of runtime errors. Max length: 20 */
repeated uint32 runtime_errors = 9;
/* BC660KGLAAR01A05_01.301.01.301. */
MODEM_FIRMWARE_VERSION_BC660_V7 = 9;
/* BC660KGLAAR01A05_01.303.01.303. */
MODEM_FIRMWARE_VERSION_BC660_V8 = 10;
}
message ProtoModem
{
/* Modem type. *
* Status: In use [06.00 - LATEST] */
ModemType type = 1;
/* Parameters for BC66 modem: */
/* parameters[0] - sc_EARFCN - Range: [0:262143]. Unknown value: -1 */
/* parameters[1] - sc_EARNFCN_offset - Range: [0:4] mapped to [-2, -1, -0.5, 0, 1]. Unknown value: -1 */
/* parameters[2] - sc_PCI - Range: [0:502]. Unknown value: -1 */
/* parameters[3] - sc_Cell id - Range: [1:268435456]. Unknown value: 0 */
/* parameters[4] - sc_RSRP - [dBm] - Range: [-140:-44]. Unknown value: 0 */
/* parameters[5] - sc_RSRQ - [dB] - Range: [-20:-3]. Unknown value: 0 */
/* parameters[6] - sc_RSSI - [dBm] - Range: [-110:-3] Unknown value: 0 */
/* parameters[7] - sc_SINR - [dB] - Range: [-10:30]. Unknown value: 31 */
/* parameters[8] - sc_Band - Range: [see module supported bands]. The current serving cell band. Unknown value: -1 */
/* parameters[9] - sc_TAC - Range: [0:65536]. Unknown value: -1 */
/* parameters[10] - sc_ECL - Range: [0:2]. Unknown value: -1 */
/* parameters[11] - sc_TX_PWR - [0.1cBm] - Range [-440:230]. Unknown value: -1000 */
/* parameters[12] - OP_MODE - Range: [0:3]. Unknown value: -1 */
/* parameters[13] - nc_EARFCN - Range: [0:262143]. Unknown value: -1 */
/* parameters[14] - nc_EARNFCN_offset - Range: [0:4] mapped to [-2, -1, -0.5, 0, 1]. Unknown value: -1 */
/* parameters[15] - nc_PCI - Range: [0:502]. Unknown value: -1 */
/* parameters[16] - nc_RSRP - [dBm] - Range: [-140:-44]. Unknown value: 0 */
/* parameters[17] - RLC_UL_BLER - Range: [0:100]. Unknown value: -1 */
/* parameters[18] - RLC_DL_BLER - Range: [0:100]. Unknown value: -1 */
/* parameters[19] - MAC_UL_BLER - Range: [0:100]. Unknown value: -1 */
/* parameters[20] - MAC_DL_BLER - Range: [0:100]. Unknown value: -1 */
/* parameters[21] - MAC_UL_TOTAL_BYTES - Range: [0:2147483647]. Unknown value: -1 */
/* parameters[22] - MAC_DL_TOTAL_BYTES - Range: [0:2147483647]. Unknown value: -1 */
/* parameters[23] - MAC_UL_total_HARQ_Tx - Range: [0:2147483647]. Unknown value: -1 */
/* parameters[24] - MAC_DL_total_HARQ_Tx - Range: [0:2147483647]. Unknown value: -1 */
/* parameters[25] - MAC_UL_HARQ_re_Tx - Range: [0:2147483647]. Unknown value: -1 */
/* parameters[26] - MAC_DL_HARQ_re_Tx - Range: [0:2147483647]. Unknown value: -1 */
/* parameters[27] - RLC_UL_tput - Range: [0:2147483647]. Unknown value: -1 */
/* parameters[28] - RLC_DL_tput - Range: [0:2147483647]. Unknown value: -1 */
/* parameters[29] - MAC_UL_tput - Range: [0:2147483647]. Unknown value: -1 */
/* parameters[30] - MAC_DL_tput - Range: [0:2147483647]. Unknown value: -1 */
/* parameters[31] - sleep_duration - [0.1s] - Range: [0:2147483647]. Unknown value: -1 */
/* parameters[32] - Rx_time - [0.1s] - Range: [0:2147483647]. Unknown value: -1 */
/* parameters[33] - Tx_time - [0.1s] - Range: [0:2147483647]. Unknown value: -1 */
/* Modem runtime parameters. *
* For BC66 modem (34 parameters): *
* - 1st item - sc_EARFCN. Range: [0:262143]. Unknown value: -1 *
* - 2nd item - sc_EARNFCN_offset. Range: [0:4] mapped to [-2, -1, -0.5, 0, 1]. Unknown value: -1 *
* - 3rd item - sc_PCI. Range: [0:502]. Unknown value: -1 *
* - 4th item - sc_Cell_Id. Range: [1:268435456]. Unknown value: 0 *
* - 5th item - sc_RSRP [dBm]. Range: [-140:-44]. Unknown value: 0 *
* - 6th item - sc_RSRQ [dB]. Range: [-20:-3]. Unknown value: 0 *
* - 7th item - sc_RSSI [dBm]. Range: [-110:-3] Unknown value: 0 *
* - 8th item - sc_SINR [dB]. Range: [-10:30]. Unknown value: 31 *
* - 9th item - sc_Band. Range: [see module supported bands]. The current serving cell band. Unknown value: -1 *
* - 10th item - sc_TAC. Range: [0:65536]. Unknown value: -1 *
* - 11th item - sc_ECL. Range: [0:2]. Unknown value: -1 *
* - 12th item - sc_TX_PWR [0.1dBm]. Range [-440:230]. Unknown value: -1000 *
* - 13th item - OP_MODE. Range: [0:3]. Unknown value: -1 *
* - 14th item - nc_EARFCN. Range: [0:262143]. Unknown value: -1 *
* - 15th item - nc_EARNFCN_offset. Range: [0:4] mapped to [-2, -1, -0.5, 0, 1]. Unknown value: -1 *
* - 16th item - nc_PCI. Range: [0:502]. Unknown value: -1 *
* - 17th item - nc_RSRP [dBm]. Range: [-140:-44]. Unknown value: 0 *
* - 18th item - RLC_UL_BLER. Range: [0:100]. Unknown value: -1 *
* - 19th item - RLC_DL_BLER. Range: [0:100]. Unknown value: -1 *
* - 20th item - MAC_UL_BLER. Range: [0:100]. Unknown value: -1 *
* - 21th item - MAC_DL_BLER. Range: [0:100]. Unknown value: -1 *
* - 22th item - MAC_UL_TOTAL_BYTES. Range: [0:2147483647]. Unknown value: -1 *
* - 23th item - MAC_DL_TOTAL_BYTES. Range: [0:2147483647]. Unknown value: -1 *
* - 24th item - MAC_UL_total_HARQ_Tx. Range: [0:2147483647]. Unknown value: -1 *
* - 25th item - MAC_DL_total_HARQ_Tx. Range: [0:2147483647]. Unknown value: -1 *
* - 26th item - MAC_UL_HARQ_re_Tx. Range: [0:2147483647]. Unknown value: -1 *
* - 27th item - MAC_DL_HARQ_re_Tx. Range: [0:2147483647]. Unknown value: -1 *
* - 28th item - RLC_UL_tput. Range: [0:2147483647]. Unknown value: -1 *
* - 29th item - RLC_DL_tput. Range: [0:2147483647]. Unknown value: -1 *
* - 30th item - MAC_UL_tput. Range: [0:2147483647]. Unknown value: -1 *
* - 31th item - MAC_DL_tput. Range: [0:2147483647]. Unknown value: -1 *
* - 32th item - sleep_duration [0.1s]. Range: [0:2147483647]. Unknown value: -1 *
* - 33th item - Rx_time [0.1s]. Range: [0:2147483647]. Unknown value: -1 *
* - 34th item - Tx_time [0.1s]. Range: [0:2147483647]. Unknown value: -1 *
* For BC660 modem (22 parameters): *
* - 1st item - sc_EARFCN. Range: [0:262143]. Unknown value: -1 *
* - 2nd item - sc_EARNFCN_offset. Range: [0:21] mapped to *
* [Invalid, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, -0.5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]. *
* Unknown value: -1 *
* - 3rd item - sc_PCI. Range: [0:503]. Unknown value: -1 *
* - 4th item - sc_Cell_Id. Range: [1:268435456]. Unknown value: 0 *
* - 5th item - sc_RSRP [dBm]. Range: [-140:-44]. Unknown value: 0 *
* - 6th item - sc_RSRQ [dB]. Range: [-20:-3]. Unknown value: 0 *
* - 7th item - sc_RSSI [dBm]. Range: [-110:-3] Unknown value: 0 *
* - 8th item - sc_SINR [dB]. Range: [-10:30]. Unknown value: 31 *
* - 9th item - sc_Band. Range: [see module supported bands]. The current serving cell band. Unknown value: -1 *
* - 10th item - sc_TAC. Range: [0:65536]. Unknown value: -1 *
* - 11th item - sc_ECL. Range: [0:2]. Unknown value: -1 *
* - 12th item - sc_TX_PWR [dBm]. Range [-45:23]. Unknown value: 128 *
* - 13th item - OP_MODE. Range: [0:3] mapped to [In-band same PCI, In-band different PCI, Guard band, Stand alone]. *
* Unknown value: -1 *
* - 14th item - nc_EARFCN. Range: [0:262143]. Unknown value: -1 *
* - 15th item - nc_PCI. Range: [0:503]. Unknown value: -1 *
* - 16th item - nc_RSRP [dBm]. Range: [-140:-44]. Unknown value: 0 *
* - 17th item - nc_RSRQ [dBm]. Range: [-140:-44]. Unknown value: 0 *
* - 18th item - sleep_duration [0.1s]. Range: [0:2147483647]. Unknown value: -1 *
* - 19th item - Rx_time [0.1s]. Range: [0:2147483647]. Unknown value: -1 *
* - 20th item - Tx_time [0.1s]. Range: [0:2147483647]. Unknown value: -1 *
* - 21st item - PLMN_state. Range: [0:3] mapped to [No PLMN, Searching, Selected, Unknown]. Unknown value: 3 *
* - 22nd item - select_PLMN. Range: [100:999999]. Unknown value: -1 *
* For shared modem client (4 parameters): *
* - 1st item - RSRP [dBm]. Range: [-140:-44]. Unknown value: 0 *
* - 2nd item - RSRQ [dB]. Range: [-20:-3]. Unknown value: 0 *
* - 3rd item - RSSI [dBm]. Range: [-110:-3] Unknown value: 0 *
* - 4th item - SINR [dB]. Range: [-10:30]. Unknown value: 31 *
* Status: In use [06.00 - LATEST] */
repeated sint32 parameters = 2;
/* ICCID of inserted/soldered sim card. String up to 22 characters long. */
/* 0x7F if sim card is not detected, empty (not sent) if device does not have modem. */
/* This field is only sent by device */
/* Integrated Circuit Card Identifier (ICCID) of the inserted/soldered SIM card. *
* String up to 22 characters: *
* A string containing only the special character 0x7F (DEL) indicates that the SIM card is not detected. *
* Status: In use [06.07.04/06.09.09/06.10.10/06.11.09/06.12.06/06.13.00/06.21.00 - LATEST] */
string sim_card_identification = 3;
/* Modem firmware version. *
* Status: In use [06.20.05/06.21.00 - LATEST] */
ModemFirmwareVersion firmware_version = 4;
/* Modem identification: *
* - IMEI (International Mobile Equipment Identity) of the modem *
* - Serial number of the most recently used modem-sharing sensor *
* String up to 15 characters. *
* Status: In use [07.00.00 - LATEST] */
string modem_identification = 5;
/* Modem statistics. *
* 1st item - Number of transmissions since the last device information message. Undefined value: 0. *
* 2nd item - Time in seconds since the last device information message. Undefined value: 0. *
* 3rd item - Total time in the power saving mode, in seconds. Undefined value: 0. *
* 4th item - Total time in the active state in seconds. Undefined value: 0. *
* Status: In use [07.00.00 - LATEST] */
repeated uint32 modem_statistics = 6;
}
message ProtoUpdateInfo
message ProtoDeviceInfo
{
/* Timestamp of update (Unix timestamp) */
uint32 timestamp = 1;
/* RESERVED FIELDS ---------------------------------------------------------------------------------------------------------- */
/* Update status, possible values: */
/* - 1 - No update yet */
/* - 2 - No error */
/* - 3 - UDP socekt error */
/* - 4 - Hash error */
/* - 5 - Missing packet error */
/* - 6 - Invalid data error */
/* - 7 - Sending timeout error */
/* - 8 - No SW to update error */
/* - 9 - Sending unexpected error */
/* - 10 - Unexpected error */
uint32 status = 2;
}
reserved 2,4,5,6,7,8,9,10,11,12;
message ProtoDeviceInfo
{
/* DEVICE STATUS FIELDS ----------------------------------------------------------------------------------------------------- */
/* Serial number of device */
bytes serial_num = 1;
/* Serial number of the device. *
* Length: 6 bytes. *
* Status: In use [07.00.00 - LATEST] / Previously as serial_num [06.00 - 06.xx.xx] */
bytes serial_number = 1;
/* Deprecated field */
reserved 2;
/* DEVICE INFORMATION FIELDS ------------------------------------------------------------------------------------------------ */
/* Software version e.g ver 06.10 -> 0x060A -> 1546 */
/* Software version (excluding LTS). *
* Example: 1546 -> 0x060A -> SW version 06.10 *
* Status: In use [06.00 - LATEST] */
uint32 sw_version = 3;
/* Deprecated fields */
reserved 4,5,6,7,8,9,10,11,12;
/* Software commit ID and LTS version. *
* String of 7 characters: *
* - Commit ID (examples: "fa02cd0" means the beginning of the commit ID "fa02cd0") [06.00 - 06.06.xx] *
* - LTS version and commit ID (examples: "0bdd23f" means LTS version 11 and the beginning of the commit ID "dd23f") *
[06.07.00 - LATEST] *
* Status: In use [06.00 - LATEST] */
string commit_id = 15;
/* Structure with battery and temperature information */
/* Device runtime information. *
* Status: In use [06.00 - LATEST] */
ProtoRuntime runtime_info = 13;
/* Structure with modem specific runtime information */
/* Memory statistics: *
* 1st item - Status of the non-volatile storage: *
* - 0 - Non-volatile storage works properly *
* - 1 - Non-volatile storage has some corrupt packets. Memory is read-only *
* - 2 - Non-volatile storage is corrupted. Memory is unavailable *
* 2nd item - Timestamp of the end of collecting statistics in seconds since 1st of January 1970 (epoch time). *
Undefined value: 4294967295. *
* 3rd item - Capacity of the memory in bytes. *
* 4th item - Used space in bytes. *
* 5th item - Size of invalid (outdated) packets in bytes. *
* 6th item - Size of corrupt packets in bytes. *
* 7th item - Number of valid packets. *
* 8th item - Number of invalid (outdated) packets. *
* 9th item - Number of corrupt packets. *
* 10th item - Number of all samples for channel 1 (valid packets). *
* 11th item - Number of all samples for channel 2 (valid packets). *
* 12th item - Number of all samples for channel 3 (valid packets). *
* 13th item - Number of all samples for channel 4 (valid packets). *
* 14th item - Number of all samples for channel 5 (valid packets). *
* 15th item - Number of all samples for channel 6 (valid packets). *
* 16th item - Timestamp of the first binary measurement in seconds since 1st of January 1970 (epoch time). *
* Undefined value: 4294967295. *
* 17th item - Timestamp of the last binary measurement in seconds since 1st of January 1970 (epoch time). *
* Undefined value: 4294967295. *
* 18th item - Timestamp of the last binary measurement marked as sent, in seconds since 1st of January 1970 (epoch time). *
* Undefined value: 4294967295. *
* 19th item - Timestamp of the first continuous measurement in seconds since 1st of January 1970 (epoch time). *
* Undefined value: 4294967295. *
* 20th item - Timestamp of the last continuous measurement in seconds since 1st of January 1970 (epoch time). *
* Undefined value: 4294967295. *
* 21th item - Timestamp of the last continuous measurement marked as sent, in seconds since 1st of January 1970 (epoch time).*
* Undefined value: 4294967295. *
* 22th item - NvM write counter. *
* Status: In use [06.02 - LATEST] */
repeated uint32 memory_statistics = 17;
/* Last update check information. *
* Status: In use [06.08.00 - LATEST] */
ProtoUpdateInfo last_update_info = 18;
/* Modem information. *
* Only used if the sensor has a modem. *
* Status: In use [06.00 - LATEST] */
ProtoModem modem = 14;
/* String up to 7 bytes long. Software commit id e.g. "e0e8556" */
/* From version 06.07 the first two characters indicate the LTS version. */
/* For example: the value "0bdd23f" means LTS version 11 and the beginning of the commit ID "dd23f" */
string commit_id = 15;
/* SERVER COMMUNICATION FIELDS ---------------------------------------------------------------------------------------------- */
/* Optional string up to 36 bytes long. Can be set to any user define value or hold device's IMEI */
/* Cloud token. *
* Can be empty, set to any user-defined value, or hold device IMEI. *
* String up to 36 characters. *
* This field is only sent during server communication. *
* Status: In use [06.00 - LATEST] */
string cloud_token = 16;
/* Memory statistics: */
/* memory_statistics[0] - Status of Nv storage: */
/* - 0 - Nv storage hasn't errors */
/* - 1 - Nv storage has some corrupted packet. Memory is read-only */
/* - 2 - Nv storage is corrupted. Memory is unavailable */
/* memory_statistics[1] - Timestamp of the end of collecting statistics. */
/* Value in seconds since UNIX EPOCH 01-01-1970. Undefined value: 4294967295 */
/* memory_statistics[2] - Capacity of memory in bytes */
/* memory_statistics[3] - Used space in bytes */
/* memory_statistics[4] - Size of invalid (outdated) packets in bytes */
/* memory_statistics[5] - Size of corrupted packets in bytes */
/* memory_statistics[6] - Number of valid packets */
/* memory_statistics[7] - Number of invalid (outdated) packets */
/* memory_statistics[8] - Number of corrupted packets */
/* memory_statistics[9] - Number of all samples for channel 1 (valid packets) */
/* memory_statistics[10] - Number of all samples for channel 2 (valid packets) */
/* memory_statistics[11] - Number of all samples for channel 3 (valid packets) */
/* memory_statistics[12] - Number of all samples for channel 4 (valid packets) */
/* memory_statistics[13] - Number of all samples for channel 5 (valid packets) */
/* memory_statistics[14] - Number of all samples for channel 6 (valid packets) */
/* memory_statistics[15] - Timestamp of the first binary measurement. */
/* Value in seconds since UNIX EPOCH 01-01-1970. Undefined value: 4294967295 */
/* memory_statistics[16] - Timestamp of the last binary measurement. */
/* Value in seconds since UNIX EPOCH 01-01-1970. Undefined value: 4294967295 */
/* memory_statistics[17] - Timestamp of the last binary measurement, that marked as sent. */
/* Value in seconds since UNIX EPOCH 01-01-1970. Undefined value: 4294967295 */
/* memory_statistics[18] - Timestamp of the first continuous measurement. */
/* Value in seconds since UNIX EPOCH 01-01-1970. Undefined value: 4294967295 */
/* memory_statistics[19] - Timestamp of the last continuous measurement. */
/* Value in seconds since UNIX EPOCH 01-01-1970. Undefined value: 4294967295 */
/* memory_statistics[20] - Timestamp of the last continuous measurement, that marked as sent. */
/* Value in seconds since UNIX EPOCH 01-01-1970. Undefined value: 4294967295 */
/* memory_statistics[21] - NVM write counter */
repeated uint32 memory_statistics = 17;
/* Information about last sensor SW update */
ProtoUpdateInfo last_update_info = 18;
/* Enclosure tamper alert: *
* - 0 - Inactive *
* - 1 - Active (enclosure opened) *
* - 2 - Inactive, was active (enclosure closed) *
* The transition from 'Inactive, was active' to 'Inactive' occurs after the alert has been successfully sent to the server *
* or the user has reset the alert via Bluetooth. *
* This field is only sent during server communication. *
* Status: In use [07.00.01 - LATEST] */
uint32 enclosure_tamper_alert = 19;
}

185
common/transport/coap/src/main/proto/efento/proto_measurement_types.proto

@ -19,160 +19,201 @@ option java_package = "org.thingsboard.server.gen.transport.coap";
option java_outer_classname = "MeasurementTypeProtos";
enum MeasurementType {
/* [] - No sensor on the channel */
/* [] - No sensor on the channel. */
MEASUREMENT_TYPE_NO_SENSOR = 0;
/* [°C] - Celsius degree. Resolution 0.1°C. Range [-273.2:4000.0]. Type: Continuous */
/* [°C] - Celsius degree. Temperature. Resolution: 0.1°C. Range: [-273.2:4000.0]. Type: Continuous. */
MEASUREMENT_TYPE_TEMPERATURE = 1;
/* [% RH] - Relative humidity. Resolution 1%. Range [0:100]. Type: Continuous */
/* [% RH] - Percentage. Relative humidity. Resolution: 1%. Range: [0:100]. Type: Continuous. */
MEASUREMENT_TYPE_HUMIDITY = 2;
/* [hPa] - Hectopascal (1hPa = 100Pa). Resolution 0.1hPa. Range: [1.0:2000.0]. Atmospheric pressure. Type: Continuous */
/* [hPa] - Hectopascal. Atmospheric pressure. Resolution: 0.1hPa. Range: [1.0:2000.0]. Type: Continuous. */
MEASUREMENT_TYPE_ATMOSPHERIC_PRESSURE = 3;
/* [Pa] - Pascal. Resolution 1Pa. Range [-10000:10000]. Differential pressure. Type: Continuous */
/* [Pa] - Pascal. Differential pressure. Resolution: 1Pa. Range: [-10000:10000]. Type: Continuous. */
MEASUREMENT_TYPE_DIFFERENTIAL_PRESSURE = 4;
/* Sign indicates state: (+) ALARM, (-) OK. Type: Binary */
/* Sign indicates state: (+) Alarm, (-) OK. Type: Binary. */
MEASUREMENT_TYPE_OK_ALARM = 5;
/* [IAQ] - IAQ index. Resolution 1IAQ. Range [0:500]. To get IAQ index the value should be divided by 3. */
/* Sensor return also calibration status as metadata (is the remainder when the absolute value is divided by 3): */
/* - 0: Calibration required (sensor returns not accurate values) */
/* - 1: Calibration on-going (sensor returns not accurate values) */
/* - 2: Calibration done (best accuracy of IAQ sensor) */
/* Type: Continuous */
/* [IAQ] - IAQ index. Air quality. Resolution: 1IAQ. Range: [0:500]. Type: Continuous. *
* To obtain the IAQ index, the measurement value should be divided by 3. *
* Measurement also includes calibration status as metadata (is the remainder of the absolute value divided by 3): *
* - 0 - Calibration required (sensor returns not accurate values) *
* - 1 - Calibration on-going (sensor returns not accurate values) *
* - 2 - Calibration done (best accuracy of IAQ sensor) */
MEASUREMENT_TYPE_IAQ = 6;
/* Sign indicates water presence: (+) water not detected, (-) water detected. Type: Binary */
/* Sign indicates state: (+) Water detected, (-) Water not detected. Type: Binary. */
MEASUREMENT_TYPE_FLOODING = 7;
/* [NB] Number of pulses. Resolution 1 pulse. Range [0:8000000]. Type: Continuous */
/* [NB] - Number of pulses. Number of pulses in a single period. Resolution: 1 pulse. Range: [0:8000000]. Type: Continuous. */
MEASUREMENT_TYPE_PULSE_CNT = 8;
/* [Wh] - Watthour; Resolution 1Wh. Range [0:8000000]. Number of Watthours in a single period. Type: Continuous */
/* [Wh] - Watt-hour. Number of watt-hours in a single period. Resolution: 1Wh. Range: [0:8000000]. Type: Continuous. */
MEASUREMENT_TYPE_ELECTRICITY_METER = 9;
/* [l] - Liter. Resolution 1l. Range [0:8000000]. Number of litres in a single period. Type: Continuous */
/* [l] - Liter. Number of litres in a single period. Resolution: 1l. Range: [0:8000000]. Type: Continuous. */
MEASUREMENT_TYPE_WATER_METER = 10;
/* [kPa] - Kilopascal (1kPa = 1000Pa); Resolution 1kPa. Range [-1000:0]. Soil moisture (tension). Type: Continuous */
/* [kPa] - Kilopascal. Soil moisture (tension). Resolution: 1kPa. Range: [-1000:0]. Type: Continuous. */
MEASUREMENT_TYPE_SOIL_MOISTURE = 11;
/* [ppm] - Parts per million. Resolution 1ppm. Range [0:1000000]. Carbon monoxide concentration. Type: Continuous */
/* [ppm] - Parts per million. Carbon monoxide concentration. Resolution: 1ppm. Range: [0:1000000]. Type: Continuous. */
MEASUREMENT_TYPE_CO_GAS = 12;
/* [ppm] - Parts per million. Resolution 1.0ppm. Range [0:1000000]. Nitrogen dioxide concentration. Type: Continuous */
/* [ppm] - Parts per million. Nitrogen dioxide concentration. Resolution: 1ppm. Range: [0:1000000]. Type: Continuous. */
MEASUREMENT_TYPE_NO2_GAS = 13;
/* [ppm] - Parts per million. Resolution 0.01ppm. Range [0.00:80000.00]. Hydrogen sulfide concentration. Type: Continuous */
/* [ppm] - Parts per million. Hydrogen sulfide concentration. Resolution: 0.01ppm. Range: [0.00:80000.00]. Type: Continuous. */
MEASUREMENT_TYPE_H2S_GAS = 14;
/* [lx] - Lux. Resolution 0.1lx. Range [0.0:100000.0]. Illuminance. Type: Continuous */
/* [lx] - Lux. Illuminance. Resolution: 0.1lx. Range: [0.0:100000.0]. Type: Continuous. */
MEASUREMENT_TYPE_AMBIENT_LIGHT = 15;
/* [µg/m^3] - Micro gram per cubic meter. Resolution 1µg/m^3. Range [0:1000]. */
/* Particles with an aerodynamic diameter less than 1 micrometer. Type: Continuous */
/* [µg/m^3] - Microgram per cubic meter. Particles with an aerodynamic diameter of less than 1 micrometers. *
* Resolution: 1µg/m^3. Range: [0:1000]. Type: Continuous. */
MEASUREMENT_TYPE_PM_1_0 = 16;
/* [µg/m^3] - Micro gram per cubic meter. Resolution 1µg/m^3. Range [0:1000]. */
/* Particles with an aerodynamic diameter less than 2.5 micrometers. Type: Continuous */
/* [µg/m^3] - Microgram per cubic meter. Particles with an aerodynamic diameter of less than 2.5 micrometers. *
* Resolution: 1µg/m^3. Range: [0:1000]. Type: Continuous. */
MEASUREMENT_TYPE_PM_2_5 = 17;
/* [µg/m^3] - Micro gram per cubic meter. Resolution 1µg/m^3. Range [0:1000]. */
/* Particles with an aerodynamic diameter less than 10 micrometers. Type: Continuous */
/* [µg/m^3] - Microgram per cubic meter. Particles with an aerodynamic diameter of less than 10 micrometers. *
* Resolution: 1µg/m^3. Range: [0:1000]. Type: Continuous. */
MEASUREMENT_TYPE_PM_10_0 = 18;
/* [dB] - Decibels. Resolution 0.1 dB. Range: [0.0:200.0]. Noise level. Type: Continuous */
/* [dB] - Decibel. Noise level. Resolution: 0.1 dB. Range: [0.0:200.0]. Type: Continuous. */
MEASUREMENT_TYPE_NOISE_LEVEL = 19;
/* [ppm] - Parts per million. Resolution 1ppm. Range [0:1000000]. Ammonia concentration. Type: Continuous */
/* [ppm] - Parts per million. Ammonia concentration. Resolution: 1ppm. Range: [0:1000000]. Type: Continuous. */
MEASUREMENT_TYPE_NH3_GAS = 20;
/* [ppm] - Parts per million. Resolution 1ppm. Range [0:1000000]. Methane concentration. Type: Continuous */
/* [ppm] - Parts per million. Methane concentration. Resolution: 1ppm. Range: [0:1000000]. Type: Continuous. */
MEASUREMENT_TYPE_CH4_GAS = 21;
/* [kPa] - Kilopascal (1kPa = 1000Pa, 100kPa = 1bar). Resolution 1kPa. Range [0:200000]. Pressure. Type: Continuous */
/* [kPa] - Kilopascal (100kPa = 1bar). Pressure. Resolution: 1kPa. Range: [0:200000]. Type: Continuous. */
MEASUREMENT_TYPE_HIGH_PRESSURE = 22;
/* [mm] - Millimeter. Resolution 1mm. Range [0:100000]. Distance. Type: Continuous */
/* [mm] - Millimeter. Distance. Resolution: 1mm. Range: [0:100000]. Type: Continuous. */
MEASUREMENT_TYPE_DISTANCE_MM = 23;
/* [l] - Liter. Resolution 1l. Range [0:1000000]. Accumulative water meter (minor). Type: Continuous */
/* [l] - Liter. Water meter (minor). Resolution: 1l. Range: [0:99]. Type: Continuous. *
* To obtain the liters, the measurement value should be divided by 6. *
* Measurement also includes a major channel index related with the minor channel as metadata *
* (is the remainder of the absolute value divided by 6). */
MEASUREMENT_TYPE_WATER_METER_ACC_MINOR = 24;
/* [hl] - Hectoliter. Resolution 1hl. Range [0:1000000]. Accumulative water meter (major). Type: Continuous */
/* [hl] - Hectoliter. Water meter (major). Resolution: 1hl. Range: [0:999999]. Type: Continuous. *
* To obtain the hectoliters, the measurement value should be divided by 4. *
* Measurement also includes a measurement status as metadata (is the remainder of the absolute value divided by 4): *
* - 0 - Counter works properly *
* - 1 - Error occurred (the counted value may be underestimated) *
* - 2 - Sensor reset occurred (the counted value may be underestimated) *
* - 3 - Sensor reset and error occurred (the counted value may be underestimated) */
MEASUREMENT_TYPE_WATER_METER_ACC_MAJOR = 25;
/* [ppm] - Parts per million. Resolution 1ppm. Range [0:1000000]. Carbon dioxide concentration. Type: Continuous */
/* [ppm] - Parts per million. Carbon dioxide concentration. Resolution: 1ppm. Range: [0:1000000]. Type: Continuous. *
* To obtain the carbon dioxide concentration, the measurement value should be divided by 3. *
* Measurement also includes calibration status as metadata (is the remainder of the absolute value divided by 3): *
* - 0 - Auto calibration has not yet been performed *
* - 1 - The last auto calibration was successful *
* - 2 - Last auto calibration failed */
MEASUREMENT_TYPE_CO2_GAS = 26;
/* [% RH] - Relative humidity. Resolution 0.1%. Range [0.0:100.0]. Type: Continuous */
/* [% RH] - Percentage. Relative humidity (accurate). Resolution: 0.1%. Range: [0.0:100.0]. Type: Continuous. */
MEASUREMENT_TYPE_HUMIDITY_ACCURATE = 27;
/* [sIAQ] - Static IAQ index. Resolution 1IAQ. Range [0:10000]. To get static IAQ index the value should be divided by 3. */
/* Sensor return also calibration status as metadata (is the remainder when the absolute value is divided by 3): */
/* - 0: Calibration required (sensor returns not accurate values) */
/* - 1: Calibration on-going (sensor returns not accurate values) */
/* - 2: Calibration done (best accuracy of IAQ sensor) */
/* Type: Continuous */
/* [sIAQ] - Static IAQ index. Air quality. Resolution: 1sIAQ. Range: [0:10000]. Type: Continuous. *
* To obtain the static IAQ index, the measurement value should be divided by 3. *
* Measurement also includes calibration status as metadata (is the remainder of the absolute value divided by 3): *
* - 0 - Calibration required (sensor returns not accurate values) *
* - 1 - Calibration on-going (sensor returns not accurate values) *
* - 2 - Calibration done (best accuracy of IAQ sensor) */
MEASUREMENT_TYPE_STATIC_IAQ = 28;
/* [ppm] - Parts per million. Resolution 1ppm. Range [0:1000000]. CO2 equivalent. */
/* To get CO2 equivalent the value should be divided by 3. */
/* Sensor return also calibration status as metadata (is the remainder when the absolute value is divided by 3): */
/* - 0: Calibration required (sensor returns not accurate values) */
/* - 1: Calibration on-going (sensor returns not accurate values) */
/* - 2: Calibration done (best accuracy of IAQ sensor) */
/* Type: Continuous */
/* [ppm] - Parts per million. CO2 equivalent. Resolution: 1ppm. Range: [0:1000000]. Type: Continuous. *
* To obtain the CO2 equivalent, the measurement value should be divided by 3. *
* Measurement also includes calibration status as metadata (is the remainder of the absolute value divided by 3): *
* - 0 - Calibration required (sensor returns not accurate values) *
* - 1 - Calibration on-going (sensor returns not accurate values) *
* - 2 - Calibration done (best accuracy of IAQ sensor) */
MEASUREMENT_TYPE_CO2_EQUIVALENT = 29;
/* [ppm] - Parts per million. Resolution 1ppm. Range [0:100000]. Breath VOC estimate. */
/* To get breath VOC estimate the value should be divided by 3. */
/* Sensor return also calibration status as metadata (is the remainder when the absolute value is divided by 3): */
/* - 0: Calibration required (sensor returns not accurate values) */
/* - 1: Calibration on-going (sensor returns not accurate values) */
/* - 2: Calibration done (best accuracy of IAQ sensor) */
/* Type: Continuous */
/* [ppm] - Parts per million. Breath VOC estimate. Resolution: 1ppm. Range: [0:100000]. Type: Continuous. *
* To obtain the breath VOC estimate, the measurement value should be divided by 3. *
* Measurement also includes calibration status as metadata (is the remainder of the absolute value divided by 3): *
* - 0 - Calibration required (sensor returns not accurate values) *
* - 1 - Calibration on-going (sensor returns not accurate values) *
* - 2 - Calibration done (best accuracy of IAQ sensor) */
MEASUREMENT_TYPE_BREATH_VOC = 30;
/* Special measurement type reserved for cellular gateway. */
/* Type: Continuous */
MEASUREMENT_TYPE_CELLULAR_GATEWAY = 31;
/* Reserved for the Shared Modem functionality. Type: Continuous. */
MEASUREMENT_TYPE_SHARED_MODEM = 31;
/* [%] - Percentage. Resolution 0.01%. Range [0.00:100.00]. Type: Continuous */
/* [%] - Percentage. Generic type. Resolution: 0.01%. Range: [0.00:100.00]. Type: Continuous. */
MEASUREMENT_TYPE_PERCENTAGE = 32;
/* [mV] - Milivolt. Resolution 0.1mV. Range [0.0:100000.0]. Type: Continuous */
/* [mV] - Millivolt. Voltage. Resolution: 0.1mV. Range: [0.0:100000.0]. Type: Continuous. */
MEASUREMENT_TYPE_VOLTAGE = 33;
/* [mA] - Milliampere. Resolution 0.01mA. Range [0.0:10000.00]. Type: Continuous */
/* [mA] - Milliampere. Current. Resolution: 0.01mA. Range: [0.00:10000.00]. Type: Continuous. */
MEASUREMENT_TYPE_CURRENT = 34;
/* [NB] Number of pulses. Resolution 1 pulse. Range [0:1000000]. Type: Continuous */
/* [NB] - Number of pulses. Pulse counter (minor). Resolution: 1 pulse. Range: [0:999]. Type: Continuous. *
* To obtain the number of pulses, the measurement value should be divided by 6. *
* Measurement also includes a major channel index related with the minor channel as metadata *
* (is the remainder of the absolute value divided by 6). */
MEASUREMENT_TYPE_PULSE_CNT_ACC_MINOR = 35;
/* [kNB] Number of kilopulses. Resolution 1 kilopulse. Range [0:1000000]. Type: Continuous */
/* [kNB] - Number of kilopulses. Pulse counter (major). Resolution: 1 kilopulse. Range: [0:999999]. Type: Continuous. *
* To obtain the number of kilopulses, the measurement value should be divided by 4. *
* Measurement also includes a measurement status as metadata (is the remainder of the absolute value divided by 4): *
* - 0 - Counter works properly *
* - 1 - Error occurred (the counted value may be underestimated) *
* - 2 - Sensor reset occurred (the counted value may be underestimated) *
* - 3 - Sensor reset and error occurred (the counted value may be underestimated) */
MEASUREMENT_TYPE_PULSE_CNT_ACC_MAJOR = 36;
/* [Wh] - Watt-hour; Resolution 1Wh. Range [0:1000000]. Number of watt-hours in a single period. Type: Continuous */
/* [Wh] - Watt-hour. Electricity meter (minor). Resolution: 1Wh. Range: [0:999]. Type: Continuous. *
* To obtain the watt-hours, the measurement value should be divided by 6. *
* Measurement also includes a major channel index related with the minor channel as metadata *
* (is the remainder of the absolute value divided by 6). */
MEASUREMENT_TYPE_ELEC_METER_ACC_MINOR = 37;
/* [kWh] - Kilowatt-hour; Resolution 1kWh. Range [0:1000000]. Number of kilowatt-hours in a single period. Type: Continuous */
/* [kWh] - Kilowatt-hour. Electricity meter (major). Resolution: 1kWh. Range: [0:999999]. Type: Continuous. *
* To obtain the kilowatt-hours, the measurement value should be divided by 4. *
* Measurement also includes a measurement status as metadata (is the remainder of the absolute value divided by 4): *
* - 0 - Counter works properly *
* - 1 - Error occurred (the counted value may be underestimated) *
* - 2 - Sensor reset occurred (the counted value may be underestimated) *
* - 3 - Sensor reset and error occurred (the counted value may be underestimated) */
MEASUREMENT_TYPE_ELEC_METER_ACC_MAJOR = 38;
/* [NB] Number of pulses (wide range). Resolution 1 pulse. Range [0:999999]. Type: Continuous */
/* [NB] - Number of pulses. Wide-range pulse counter (minor). Resolution: 1 pulse. Range: [0:999999]. Type: Continuous. *
* To obtain the number of pulses, the measurement value should be divided by 6. *
* Measurement also includes a major channel index related with the minor channel as metadata *
* (is the remainder of the absolute value divided by 6). */
MEASUREMENT_TYPE_PULSE_CNT_ACC_WIDE_MINOR = 39;
/* [MNB] Number of megapulses (wide range). Resolution 1 megapulse. Range [0:999999]. Type: Continuous */
/* [MNB] - Number of megapulses. Wide-range pulse counter (major). Resolution: 1 megapulse. Range: [0:999999]. *
* Type: Continuous. *
* To obtain the number of megapulses, the measurement value should be divided by 4. *
* Measurement also includes a measurement status as metadata (is the remainder of the absolute value divided by 4): *
* - 0 - Counter works properly *
* - 1 - Error occurred (the counted value may be underestimated) *
* - 2 - Sensor reset occurred (the counted value may be underestimated) *
* - 3 - Sensor reset and error occurred (the counted value may be underestimated) */
MEASUREMENT_TYPE_PULSE_CNT_ACC_WIDE_MAJOR = 40;
/* [mA] - Milliampere. Resolution 0.001mA. Range [-4 000.000:4 000.000]. Type: Continuous */
/* [mA] - Milliampere. Current (precise). Resolution: 0.001mA. Range: [-4000.000:4000.000]. Type: Continuous. */
MEASUREMENT_TYPE_CURRENT_PRECISE = 41;
/* Sign indicates state: (+) ON, (-) OFF. Type: Binary */
/* Sign indicates state: (+) ON, (-) OFF. Type: Binary. */
MEASUREMENT_TYPE_OUTPUT_CONTROL = 42;
}
/* [Ω] - Ohm. Resolution: 1Ω. Range: [0:1000000]. Type: Continuous. */
MEASUREMENT_TYPE_RESISTANCE = 43;
}

217
common/transport/coap/src/main/proto/efento/proto_measurements.proto

@ -14,6 +14,7 @@
* limitations under the License.
*/
syntax = "proto3";
import "efento/proto_measurement_types.proto";
option java_package = "org.thingsboard.server.gen.transport.coap";
@ -21,106 +22,166 @@ option java_outer_classname = "MeasurementsProtos";
message ProtoChannel {
/* Type of channel */
/* Reserved fields. */
reserved 6,7,8;
/* Type of measurement. *
* Status: In use [06.00 - LATEST] */
MeasurementType type = 1;
/* Timestamp of the first sample (the oldest one) in seconds since UNIX EPOCH 01-01-1970 */
/* Timestamp of the first (oldest) sample in seconds since 1st of January 1970 (epoch time). *
* Status: In use [06.00 - LATEST] */
int32 timestamp = 2;
/* Only used for 'Continuous' sensor types. Value used as the starting point for calculating the values of all */
/* measurements in the package. */
/* Format defined by 'MeasurementType' field */
/* Start point of measurement values. *
* This is used as the base value for calculating the values of all channel measurements in the message. *
* Used for 'Continuous' sensor types only. *
* Format is defined by 'MeasurementType' field. *
* Status: In use [06.00 - LATEST] */
sint32 start_point = 4;
/* 'Continuous' sensor types */
/* Value of the offset from the 'start_point' for each measurement in the package. The oldest sample first ([0]). */
/* 'sample_offsets' format defined by 'MeasurementType' field. */
/* If the 'sample_offset' has a value from the range [8355840: 8388607], it should be interpreted as a sensor error code. */
/* In that case value of the 'start_point' field should not be added to this 'sample_offset'. See ES6-264 for error codes. */
/* Example: MeasurementType = 1 (temperature), start_point = 100, sample_offsets[0] = 15, sample_offsets[1] = 20, */
/* sample_offset[2] = 8388605 */
/* 1st sample in the package temperature value = 11.5 °C, 2nd sample in the package temperature value = 12 °C */
/* 3rd sample in the package has no temperature value. It has information about failure of MCP9808 (temperature) sensor. */
/* Calculating timestamps of the measurements: timestamp = 1606391700, measurement_period_base = 60, */
/* measurement_period_factor = 1. Timestamp of the 1st sample = 1606391700, timestamp of the 2nd sample = 1606391760, */
/* timestamp of the 3rd sample 1606391820 */
/* 'Binary' sensor types: */
/* Absolute value of the 'sample_offsets' field indicates the offset in seconds from 'timestamp' field. */
/* Sign (- or +) indicates the state of measurements depending on the sensor type. */
/* Value of this field equals to '1' or '-1' indicates the state at the 'timestamp'. Other values */
/* indicate the state of the relay at the time (in seconds) equal to 'timestamp' + absolute value -1. */
/* Values of this field are incremented starting from 1 (1->0: state at the time */
/* of 'timestamp', 2->1: state at the time equal to 'timestamp' + 1 s, 3->2 : */
/* state at the time equal to 'timestamp' + 2 s, etc.). The first and the last sample define the time range of the */
/* measurements. Only state changes in the time range are included in the 'sample_offsets' field */
/* Examples: if 'timestamp' value is 1553518060 and 'sample_offsets' equals '1', it means that at 1553518060 the state */
/* was high, if 'timestamp' value is 1553518060 and 'sample_offsets' equals '-9', it means at 1553518068 the state was low */
/* Measurement value offsets. *
* For 'Continuous' sensor types: *
* These are the values of the offsets from the 'start_point' for each channel measurement in the message. *
* Format is defined by 'MeasurementType' field. The first sample is the oldest. *
* If the sample offset has a value in the range [8355840:8388607], it should be interpreted as a sensor error code. *
* In this case, the value of the 'start_point' field should not be added to this sample offset. *
* Example: type = 1 (temperature) *
* start_point = 100 *
* sample_offsets[0] = 15, sample_offsets[1] = 20, sample_offsets[2] = 8388557 *
* timestamp = 1606391700 *
* measurement_period_base = 60 *
* measurement_period_factor = 1 *
* 1st measurement is the temperature value = 11.5°C, measured at 1606391700 *
* 2nd measurement is the temperature value = 12°C, measured at 1606391760 *
* 3rd measurement is the error code (failure of the SHT4x temperature sensor), measured at 1606391820 *
* For 'Binary' sensor types: *
* The absolute value of the sample offset minus 1 is the offset in seconds from the 'timestamp' field. *
* Sign (- or +) indicates the state of the measurement depending on the sensor type. *
* The first and the last samples define the time range of the measurements. *
* Only state changes within the time range are included in the 'sample_offsets' field. *
* Example: type = 5 (OK/Alarm) *
* sample_offsets[0] = 1, sample_offsets[1] = -9, sample_offsets[2] = 13 *
* timestamp = 1606391700 *
* 1st measurement is the state at 1606391700, which is Alarm (+) *
* 2nd measurement is the state at 1606391708, which is OK (-) *
* 3rd measurement is the state at 1606391712, which is Alarm (+) *
* Status: In use [06.00 - LATEST] */
repeated sint32 sample_offsets = 5 [packed=true];
/* Deprecated - configuration is sent to endpoint 'c' */
/* int32 lo_threshold = 6; */
reserved 6;
/* Deprecated - configuration is sent to endpoint 'c' */
/* int32 hi_threshold = 7; */
reserved 7;
/* Deprecated - configurations sent to endpoint 'c' */
/* int32 diff_threshold = 8; */
reserved 8;
}
message ProtoMeasurements {
/* Serial number of the device */
bytes serial_num = 1;
/* Battery status: true - battery ok, false - battery low */
bool battery_status = 2;
/* 'Measurement_period_base' and 'measurement_period_factor' define how often the measurements are taken. */
/* Sensors of 'Continuous' type take measurement each Measurement_period_base * measurement_period_factor. */
/* Sensors of 'Binary' type take measurement each Measurement_period_base. */
/* For backward compatibility with versions 5.x in case of binary/mixed sensors, if the 'measurement_period_factor' is */
/* not sent (equal to 0), then the default value '14' shall be used for period calculation. */
/* For backward compatibility with versions 5.x in case of continues sensors, if the measurement_period_factor is */
/* not sent (equal to 0), then the default value '1' shall be used for period calculation. */
/* measurement period base in seconds */
/* RESERVED FIELDS ---------------------------------------------------------------------------------------------------------- */
reserved 10,11,12,13,14,15;
/* DEVICE STATUS FIELDS ----------------------------------------------------------------------------------------------------- */
/* Serial number of the device. *
* Length: 6 bytes. *
* Status: In use [07.00.00 - LATEST] / Previously as serial_num [06.00 - 06.xx.xx] */
bytes serial_number = 1;
/* Identifier of the current configuration. *
* The value of this field changes with every configuration change. *
* Status: In use [07.00.00 - LATEST] / Previously as hash [06.00 - 06.xx.xx] */
uint32 configuration_hash = 9;
/* Identifier of the current extended configuration. *
* The value of this field changes with every extended configuration change. *
* Status: In use [07.00.00 - LATEST] */
uint32 extended_configuration_hash = 17;
/* Battery level and status: *
* - [1:65525] - Battery voltage measurement and a battery status *
* - [65526:65531] - No battery voltage measurement and a battery status *
* To obtain the battery voltage, the battery_level value should be divided by 6 and the remainder of the division discarded. *
* The result is in hundredths of a volt or 10921 (no battery voltage measurement). *
* Battery level also includes a battery status as metadata (the remainder of the value divided by 6): *
* - 0 - Device is powered by a battery *
* - 1 - Device is powered by a rechargeable battery *
* - 2 - Device is powered by an external source and a battery is charging *
* - 3 - Reserved for the future use *
* - 4 - Reserved for the future use *
* - 5 - Reserved for the future use *
* Example: battery_level = 2474 *
* Battery voltage = 2474/6 = 412 = 4.12[V] *
* Battery status = 2474 % 6 = 2 *
* Status: In use [07.00.00 - LATEST] */
uint32 battery_level = 18;
/* MEASUREMENT FIELDS ------------------------------------------------------------------------------------------------------- */
/* Measurement period defines how often the measurements are to be taken. *
* Sensors of 'Continuous' type take measurement each 'measurement_period_base' * 'measurement_period_factor'. *
* Sensors of 'Binary' type take measurement each 'measurement_period_base'. *
* For backward compatibility with versions 5.xx in case of 'Binary/Mixed' sensors, if the 'measurement_period_factor' is *
* not sent (equal to 0), then the default value '14' shall be used for the period calculation. *
* For backward compatibility with versions 5.xx in case of 'Continuous' sensors, if the 'measurement_period_factor' is *
* not sent (equal to 0), then the default value '1' shall be used for the period calculation. */
/* Measurement period base in seconds. *
* Status: In use [06.00 - LATEST] */
uint32 measurement_period_base = 3;
/* Measurement period factor */
/* Measurement period factor. *
* Status: In use [06.00 - LATEST] */
uint32 measurement_period_factor = 8;
/* Measurements grouped by channel. *
* Status: In use [06.00 - LATEST] */
repeated ProtoChannel channels = 4;
/* Timestamp of the next scheduled transmission. If the device will not send data until this time, */
/* it should be considered as 'lost' */
/* SERVER COMMUNICATION FIELDS ---------------------------------------------------------------------------------------------- */
/* Battery status: *
* - True - Battery OK *
* - False - Battery discharged *
* Status: In use [06.00 - LATEST] */
bool battery_status = 2;
/* Timestamp of the next scheduled transmission. *
* If the device has not sent any data by this time, it should be considered 'lost'. *
* This field is only sent during server communication. *
* Status: In use [06.00 - LATEST] */
uint32 next_transmission_at = 5;
/* Reason of transmission - unsigned integer where each bit indicates different possible communication reason. */
/* Can be more than one: */
/* - bit 0: first message after sensor reset */
/* - bit 1: user button triggered */
/* - bit 2: user BLE triggered */
/* - bit 3-7: number of retries -> incremented after each unsuccessful transmission. Max value 31. */
/* Set to 0 after a successful transmission. */
/* - bit 8...19: rule 1...12 was met */
/* - bit 20: triggered after the end of the limit */
/* Reason for transmission. *
* Bitmask, where each bit represents a specific reason for initiating communication (multiple reasons can be active *
* simultaneously): *
* - Bit 0 - First message after sensor reset *
* - Bit 1 - User-triggered (button press) *
* - Bit 2 - User-triggered (Bluetooth) *
* - Bit 3:7 - Number of retries - incremented after each failed transmission and reset upon success. Range: [0:31] *
* - Bit 8:19 - Rule-based triggers (12 bits): *
* - [06.00 - 07.01.xx]: Bitmask indicating which of the rules 1-12 were met *
* - [07.02.00 - LATEST]: The transfer bit 'i' (where i = 0 to 11) is set if either rule 'i' (0-11) is set *
* or if rule 'i + 12' (12-15) is set. This aggregation applies only to bits 0-3 (rules 0-3 and 12-15). *
* The mask aggregates 16 rules (0-15) onto 12 bits. *
* - Bit 20 - Triggered at the end of the defined limit *
* - Bit 21 - Triggered after a PIN tamper alert *
* - Bit 22 - Triggered after an enclosure tamper alert *
* - Bit 23 - Triggered before shutdown *
* This field is only sent during server communication. *
* Status: In use [06.00 - LATEST] */
uint32 transfer_reason = 6;
/* Signal strength level mapped from RSSI: */
/* - 0: RSSI < -110 dBm */
/* - 1: -110 dBm <= RSSI < -109 dBm */
/* - 2...61: -109 <= RSSI < -108 dBm ... -50 dBm <= RSSI < -49 dBm */
/* - 62: -49 dBm <= RSSI < -48 dBm */
/* - 63: RSSI >= -48 dBm */
/* - 99: Not known or not detectable */
/* Signal strength (RSSI - Received Signal Strength Level): *
* - 0 - RSSI < -110dBm *
* - 1 - -110dBm <= RSSI < -109dBm *
* - 2:61 - -109dBm <= RSSI < -108dBm ... -50dBm <= RSSI < -49dBm *
* - 62 - -49dBm <= RSSI < -48dBm *
* - 63 - RSSI >= -48dBm *
* - 99 - Unknown or undetectable *
* This field is only sent during server communication. *
* Status: Deprecated [06.00 - 06.xx.xx] */
uint32 signal = 7;
/* Hash of the current configuration. Hash value changes each time a device receives a new configuration */
uint32 hash = 9;
/* Optional string up to 36 bytes long. Can be set to any user define value or hold device's IMEI */
/* Cloud token. *
* Can be empty, set to any user-defined value, or hold device IMEI. *
* String up to 36 characters. *
* This field is only sent during server communication. *
* Status: In use [06.00 - LATEST] */
string cloud_token = 16;
}

407
common/transport/coap/src/main/proto/efento/proto_rule.proto

@ -18,270 +18,287 @@ syntax = "proto3";
option java_package = "org.thingsboard.server.gen.transport.coap";
option java_outer_classname = "ProtoRuleProtos";
/* Encoding A: used to set absolute values in the Rules (e.g. upper and lower threshold values) */
/* - TEMPERATURE - [°C] - Celsius degree. Resolution 0.1°C. Range [-273.2:4000.0]. */
/* - HUMIDITY - [% RH] - Relative humidity. Resolution 1%. Range [0:100]. */
/* - ATMOSPHERIC_PRESSURE - [hPa] - Hectopascal (1hPa = 100Pa). Resolution 0.1hPa. Range: [1.0:2000.0]. */
/* - DIFERENTIAL_PRESSURE - [Pa] - Pascal. Resolution 1Pa. Range [-10000:10000] */
/* - OK/ALARM - Not applicable */
/* - IAQ - [IAQ] - IAQ index. Resolution 1IAQ. Range [0:500]. */
/* - FLOODING - Not applicable */
/* - PULSE_CNT - [NB] Number of pulses. Resolution 1 pulse. Range [0:8000000]. */
/* - ELECTRICITY_METER - [W] - Watt; Resolution 1W. Range [0:8000000]. Average power consumption in period */
/* - WATER_METER [l/min] - Liter per minute. Resolution 1l/min. Range [0:8000000]. Average water flow in period. */
/* - SOIL_MOISTURE - [kPa] - Kilopascal (1kPa = 1000Pa); Resolution 1kPa. Range [-1000:0]. Soil moisture (tension). */
/* - CO_GAS - [ppm] - Parts per million. Resolution 1ppm. Range [0:1000000]. Carbon monoxide concentration. */
/* - NO2_GAS - [ppm] - Parts per million. Resolution 1ppm. Range [0:1000000]. Nitrogen dioxide concentration. */
/* - H2S_GAS - [ppm] - Parts per million. Resolution 0.01ppm. Range [0.00:80000.00]. Hydrogen sulfide concentration. */
/* - AMBIENT_LIGHT -[lx] - Lux. Resolution 0.1lx. Range [0.0:100000.0]. Illuminance. */
/* - PM_1_0 - [µg/m^3] - Micro gram per cubic meter. Resolution 1µg/m^3 Range [0:1000]. */
/* - PM_2_5 - [µg/m^3] - Micro gram per cubic meter. Resolution 1µg/m^3 Range [0:1000]. */
/* - PM_10_0 - [µg/m^3] - Micro gram per cubic meter. Resolution 1µg/m^3 Range [0:1000]. */
/* - NOISE_LEVEL - [dB] - Decibels. Resolution 0.1 dB. Range: [0.0:200.0]. Noise level. */
/* - NH3_GAS - [ppm] - Parts per million. Resolution 1ppm. Range [0:1000000]. Ammonia concentration. */
/* - CH4_GAS - [ppm] - Parts per million. Resolution 1ppm. Range [0:1000000]. Methane concentration. */
/* - HIGH_PRESSURE - [kPa] - Kilopascal (1kPa = 1000Pa, 100kPa = 1bar). Resolution 1kPa. Range [0:200000]. Pressure. */
/* - DISTANCE_MM - [mm] - Millimeter. Resolution 1mm. Range [0:100000]. Distance. */
/* - WATER_METER_ACC_MINOR - [l] - Liter. Resolution 1l. Range [0:1000000]. Accumulative water meter (minor). */
/* - WATER_METER_ACC_MAJOR - [hl] - Hectoliter. Resolution 1hl. Range [0:1000000]. Accumulative water meter (major). */
/* - CO2_GAS - [ppm] - Parts per million. Resolution 1ppm. Range [0:1000000]. Carbon dioxide concentration. */
/* - HUMIDITY ACCURATE - [% RH] - Relative humidity. Resolution 0.1%. Range [0.0:100.0]. */
/* - STATIC_IAQ - [sIAQ] - Static IAQ index. Resolution 1sIAQ. Range [0:10000]. */
/* - CO2_EQUIVALENT - [ppm] - Parts per million. Resolution 1ppm. Range [0:1000000]. Carbon dioxide equivalent. */
/* - BREATH_VOC - [ppm] - Parts per million. Resolution 1ppm. Range [0:100000]. Breath VOC estimate. */
/* - PERCENTAGE - [%] - Percentage. Resolution 0.01%. Range [0.00:100.00]. */
/* - VOLTAGE - [mV] - Milivolt. Resolution 0.1mV. Range [0.0:100000.0]. */
/* - CURRENT - [mA] - Miliampere. Resolution 0.01mA. Range [0.00:10000.00]. */
/* - PULSE_CNT_ACC_MINOR - [NB] - Number of pulses. Resolution 1 pulse. Range [0:1000000]. Accumulative pulse counter (minor). */
/* - PULSE_CNT_ACC_MAJOR - [kNB] - Number of kilopulses. Resolution 1 kilopulse. Range [0:1000000]. */
/* Accumulative pulse counter (major). */
/* - ELEC_METER_ACC_MINOR - [Wh] - Watt-hour. Resolution 1Wh. Range [0:1000000]. Accumulative electricity meter (minor). */
/* - ELEC_METER_ACC_MAJOR - [kWh] - Kilowatt-hour. Resolution 1kWh. Range [0:1000000]. Accumulative electricity meter (major). */
/* - PULSE_CNT_ACC_WIDE_MINOR - [NB] - Number of pulses. Resolution 1 pulse. Range [0:999999]. */
/* Accumulative pulse counter wide range (minor). */
/* - PULSE_CNT_ACC_WIDE_MAJOR - [MNB] - Number of megapulses. Resolution 1 megapulse. Range [0:999999]. */
/* Accumulative pulse counter wide range (major). */
/* - CURRENT_PRECISE - [mA] - Miliampere. Resolution 0.001mA. Range [-4 000.000:4 000.000]. */
/* - OUTPUT_CONTROL - Not applicable */
/* Encoding R: used to set relative values in the Rules (e.g. differential threshold and hysteresis) */
/* - TEMPERATURE - [°C] - Celsius degree. Resolution 0.1°C. Range [0.1:4273.2]. */
/* - HUMIDITY - [% RH] - Relative humidity. Resolution 1%. Range [1:100]. */
/* - ATMOSPHERIC_PRESSURE - [hPa] - Hectopascal (1hPa = 100Pa). Resolution 0.1hPa. Range: [0.1:1999.0]. */
/* - DIFERENTIAL_PRESSURE - [Pa] - Pascal. Resolution 1Pa. Range [1:20000] */
/* - OK/ALARM - Not applicable */
/* - VOC - [IAQ] - Iaq index. Resolution 1IAQ. Range [1:500]. */
/* - FLOODING - Not applicable */
/* - PULSE_CNT - [NB] Number of pulses. Resolution 1 pulse. Range [1:8000000]. */
/* - ELECTRICITY_METER - [W] - Watt; Resolution 1W. Range [1:8000000]. Average power consumption in period */
/* - WATER_METER [l/min] - Liter per minute. Resolution 1l/min. Range [1:8000000]. Average water flow in period. */
/* - SOIL_MOISTURE - [kPa] - Kilopascal (1kPa = 1000Pa); Resolution 1kPa. Range [1:1000]. Soil moisture (tension). */
/* - CO_GAS - [ppm] - Parts per million. Resolution 1ppm. Range [1:1000000]. Carbon monoxide concentration. */
/* - NO2_GAS - [ppm] - Parts per million. Resolution 1ppm. Range [1:1000000]. Nitrogen dioxide concentration. */
/* - H2S_GAS - [ppm] - Parts per million. Resolution 0.01ppm. Range [0.01:80000.00]. Hydrogen sulfide concentration. */
/* - AMBIENT_LIGHT -[lx] - Lux. Resolution 0.1lx. Range [0.1:100000.0]. Illuminance. */
/* - PM_1_0 - [µg/m^3] - Micro gram per cubic meter. Resolution 1µg/m^3 Range [1:1000]. */
/* - PM_2_5 - [µg/m^3] - Micro gram per cubic meter. Resolution 1µg/m^3 Range [1:1000]. */
/* - PM_10_0 - [µg/m^3] - Micro gram per cubic meter. Resolution 1µg/m^3 Range [1:1000]. */
/* - NOISE_LEVEL - [dB] - Decibels. Resolution 0.1 dB. Range: [0.1:200.0]. Noise level. */
/* - NH3_GAS - [ppm] - Parts per million. Resolution 1ppm. Range [1:1000000]. Ammonia concentration. */
/* - CH4_GAS - [ppm] - Parts per million. Resolution 1ppm. Range [1:1000000]. Methane concentration. */
/* - HIGH_PRESSURE - [kPa] - Kilopascal (1kPa = 1000Pa, 100kPa = 1bar). Resolution 1kPa. Range [1:200000]. Pressure. */
/* - DISTANCE_MM - [mm] - Millimeter. Resolution 1mm. Range [1:100000]. Distance. */
/* - WATER_METER_ACC_MINOR - [l] - Liter. Resolution 1l. Range [1:1000000]. Accumulative water meter (minor). */
/* - WATER_METER_ACC_MAJOR - [hl] - Hectoliter. Resolution 1hl. Range [1:1000000]. Accumulative water meter (major). */
/* - CO2_GAS - [ppm] - Parts per million. Resolution 1ppm. Range [1:1000000]. Carbon dioxide concentration. */
/* - HUMIDITY ACCURATE - [% RH] - Relative humidity. Resolution 0.1%. Range [0.1:100.0]. */
/* - STATIC_IAQ - [sIAQ] - Static IAQ index. Resolution 1sIAQ. Range [1:10000]. */
/* - CO2_EQUIVALENT - [ppm] - Parts per million. Resolution 1ppm. Range [1:1000000]. Carbon dioxide equivalent. */
/* - BREATH_VOC - [ppm] - Parts per million. Resolution 1ppm. Range [1:100000]. Breath VOC estimate. */
/* - PERCENTAGE - [%] - Percentage. Resolution 0.01%. Range [0.01:100.00]. */
/* - VOLTAGE - [mV] - Milivolt. Resolution 0.1mV. Range [0.1:100000.0]. */
/* - CURRENT - [mA] - Miliampere. Resolution 0.01mA. Range [0.01:10000.00]. */
/* - PULSE_CNT_ACC_MINOR - [NB] - Number of pulses. Resolution 1 pulse. Range [1:1000000]. Accumulative pulse counter (minor). */
/* - PULSE_CNT_ACC_MAJOR - [kNB] - Number of kilopulses. Resolution 1 kilopulse. Range [1:1000000]. */
/* Accumulative pulse counter (major). */
/* - ELEC_METER_ACC_MINOR - [Wh] - Watt-hour. Resolution 1Wh. Range [1:1000000]. Accumulative electricity meter (minor). */
/* - ELEC_METER_ACC_MAJOR - [kWh] - Kilowatt-hour. Resolution 1kWh. Range [1:1000000]. Accumulative electricity meter (major). */
/* - PULSE_CNT_ACC_WIDE_MINOR - [NB] - Number of pulses. Resolution 1 pulse. Range [1:999999]. */
/* Accumulative pulse counter wide range (minor). */
/* - PULSE_CNT_ACC_WIDE_MAJOR - [MNB] - Number of megapulses. Resolution 1 megapulse. Range [1:999999]. */
/* Accumulative pulse counter wide range (major). */
/* - CURRENT_PRECISE - [mA] - Miliampere. Resolution 0.001mA. Range [0.001:8 000.000]. */
/* - OUTPUT_CONTROL - Not applicable */
/* Condition to be checked by the device. If the condition is true, an action is triggered */
/* Encoding A: used to set absolute values in rules (e.g., upper and lower thresholds): *
* - TEMPERATURE - [°C] Celsius degree. Resolution: 0.1°C. Range: [-273.2:4000.0] *
* - HUMIDITY - [% RH] Percentage (Relative humidity). Resolution: 1%. Range: [0:100] *
* - ATMOSPHERIC_PRESSURE - [hPa] Hectopascal. Resolution: 0.1hPa. Range: [1.0:2000.0] *
* - DIFERENTIAL_PRESSURE - [Pa] Pascal. Resolution: 1Pa. Range: [-10000:10000] *
* - OK_ALARM - Not applicable *
* - IAQ - [IAQ] IAQ index. Resolution: 1IAQ. Range: [0:500] *
* - FLOODING - Not applicable *
* - PULSE_CNT - [NB] Number of pulses. Resolution: 1 pulse. Range: [0:8000000]. Period number of pulses *
* - ELECTRICITY_METER - [W] Watt. Resolution: 1W. Range: [0:8000000]. Period average power consumption *
* - WATER_METER - [l/min] Liter per minute. Resolution: 1l/min. Range: [0:8000000]. Period average water *
* - SOIL_MOISTURE - [kPa] Kilopascal. Resolution: 1kPa. Range: [-1000:0] *
* - CO_GAS - [ppm] Parts per million. Resolution: 1ppm. Range: [0:1000000] *
* - NO2_GAS - [ppm] Parts per million. Resolution: 1ppm. Range: [0:1000000] *
* - H2S_GAS - [ppm] Parts per million. Resolution: 0.01ppm. Range: [0.00:80000.00] *
* - AMBIENT_LIGHT - [lx] Lux. Resolution: 0.1lx. Range: [0.0:100000.0] *
* - PM_1_0 - [µg/m^3] Microgram per cubic meter. Resolution: 1µg/m^3. Range: [0:1000] *
* - PM_2_5 - [µg/m^3] Microgram per cubic meter. Resolution: 1µg/m^3. Range: [0:1000] *
* - PM_10_0 - [µg/m^3] Microgram per cubic meter. Resolution: 1µg/m^3. Range: [0:1000] *
* - NOISE_LEVEL - [dB] Decibel. Resolution: 0.1 dB. Range: [0.0:200.0] *
* - NH3_GAS - [ppm] Parts per million. Resolution: 1ppm. Range: [0:1000000] *
* - CH4_GAS - [ppm] Parts per million. Resolution: 1ppm. Range: [0:1000000] *
* - HIGH_PRESSURE - [kPa] Kilopascal (100kPa = 1bar). Resolution: 1kPa. Range: [0:200000] *
* - DISTANCE_MM - [mm] Millimeter. Resolution: 1mm. Range: [0:100000] *
* - WATER_METER_ACC_MINOR - [l] Liter. Resolution: 1l. Range: [0:99] *
* - WATER_METER_ACC_MAJOR - [hl] Hectoliter. Resolution: 1hl. Range: [0:999999] *
* - CO2_GAS - [ppm] Parts per million. Resolution: 1ppm. Range: [0:1000000] *
* - HUMIDITY_ACCURATE - [% RH] Percentage (Relative humidity). Resolution: 0.1%. Range: [0.0:100.0] *
* - STATIC_IAQ - [sIAQ] Static IAQ index. Resolution: 1sIAQ. Range: [0:10000] *
* - CO2_EQUIVALENT - [ppm] Parts per million. Resolution: 1ppm. Range: [0:1000000] *
* - BREATH_VOC - [ppm] Parts per million. Resolution: 1ppm. Range: [0:100000] *
* - CELLULAR_GATEWAY - Not applicable *
* - PERCENTAGE - [%] Percentage. Resolution: 0.01%. Range: [0.00:100.00] *
* - VOLTAGE - [mV] Millivolt. Resolution: 0.1mV. Range: [0.0:100000.0] *
* - CURRENT - [mA] Milliampere. Resolution: 0.01mA. Range: [0.00:10000.00] *
* - PULSE_CNT_ACC_MINOR - [NB] Number of pulses. Resolution: 1 pulse. Range: [0:999] *
* - PULSE_CNT_ACC_MAJOR - [kNB] Number of kilopulses. Resolution: 1 kilopulse. Range: [0:999999] *
* - ELEC_METER_ACC_MINOR - [Wh] Watt-hour. Resolution: 1Wh. Range: [0:999] *
* - ELEC_METER_ACC_MAJOR - [kWh] Kilowatt-hour. Resolution: 1kWh. Range: [0:999999] *
* - PULSE_CNT_ACC_WIDE_MINOR - [NB] Number of pulses. Resolution: 1 pulse. Range: [0:999999] *
* - PULSE_CNT_ACC_WIDE_MAJOR - [MNB] Number of megapulses. Resolution: 1 megapulse. Range: [0:999999] *
* - CURRENT_PRECISE - [mA] Milliampere. Resolution: 0.001mA. Range: [-4000.000:4000.000] *
* - OUTPUT_CONTROL - Not applicable *
* - RESISTANCE - [Ω] Ohm. Resolution: 1Ω. Range: [0:1000000] */
/* Encoding R: used to set relative values in rules (e.g., differential threshold and hysteresis): *
* - TEMPERATURE - [°C] Celsius degree. Resolution: 0.1°C. Range: [0.1:4273.2] *
* - HUMIDITY - [% RH] Percentage (Relative humidity). Resolution: 1%. Range: [1:100] *
* - ATMOSPHERIC_PRESSURE - [hPa] Hectopascal. Resolution: 0.1hPa. Range: [0.1:1999.0] *
* - DIFERENTIAL_PRESSURE - [Pa] Pascal. Resolution: 1Pa. Range: [1:20000] *
* - OK_ALARM - Not applicable *
* - IAQ - [IAQ] IAQ index. Resolution: 1IAQ. Range: [1:500] *
* - FLOODING - Not applicable *
* - PULSE_CNT - [NB] Number of pulses. Resolution: 1 pulse. Range: [1:8000000]. Period number of pulses *
* - ELECTRICITY_METER - [W] Watt. Resolution: 1W. Range: [1:8000000]. Period average power consumption *
* - WATER_METER - [l/min] Liter per minute. Resolution: 1l/min. Range: [1:8000000]. Period average water *
* - SOIL_MOISTURE - [kPa] Kilopascal. Resolution: 1kPa. Range: [1:1000] *
* - CO_GAS - [ppm] Parts per million. Resolution: 1ppm. Range: [1:1000000] *
* - NO2_GAS - [ppm] Parts per million. Resolution: 1ppm. Range: [1:1000000] *
* - H2S_GAS - [ppm] Parts per million. Resolution: 0.01ppm. Range: [0.01:80000.00] *
* - AMBIENT_LIGHT - [lx] Lux. Resolution: 0.1lx. Range: [0.1:100000.0] *
* - PM_1_0 - [µg/m^3] Microgram per cubic meter. Resolution: 1µg/m^3. Range: [1:1000] *
* - PM_2_5 - [µg/m^3] Microgram per cubic meter. Resolution: 1µg/m^3. Range: [1:1000] *
* - PM_10_0 - [µg/m^3] Microgram per cubic meter. Resolution: 1µg/m^3. Range: [1:1000] *
* - NOISE_LEVEL - [dB] Decibel. Resolution: 0.1 dB. Range: [0.1:200.0] *
* - NH3_GAS - [ppm] Parts per million. Resolution: 1ppm. Range: [1:1000000] *
* - CH4_GAS - [ppm] Parts per million. Resolution: 1ppm. Range: [1:1000000] *
* - HIGH_PRESSURE - [kPa] Kilopascal (100kPa = 1bar). Resolution: 1kPa. Range: [1:200000] *
* - DISTANCE_MM - [mm] Millimeter. Resolution: 1mm. Range: [1:100000] *
* - WATER_METER_ACC_MINOR - [l] Liter. Resolution: 1l. Range: [1:99] *
* - WATER_METER_ACC_MAJOR - [hl] Hectoliter. Resolution: 1hl. Range: [1:999999] *
* - CO2_GAS - [ppm] Parts per million. Resolution: 1ppm. Range: [1:1000000] *
* - HUMIDITY_ACCURATE - [% RH] Percentage (Relative humidity). Resolution: 0.1%. Range: [0.1:100.0] *
* - STATIC_IAQ - [sIAQ] Static IAQ index. Resolution: 1sIAQ. Range: [1:10000] *
* - CO2_EQUIVALENT - [ppm] Parts per million. Resolution: 1ppm. Range: [1:1000000] *
* - BREATH_VOC - [ppm] Parts per million. Resolution: 1ppm. Range: [1:100000] *
* - CELLULAR_GATEWAY - Not applicable *
* - PERCENTAGE - [%] Percentage. Resolution: 0.01%. Range: [0.01:100.00] *
* - VOLTAGE - [mV] Millivolt. Resolution: 0.1mV. Range: [0.1:100000.0] *
* - CURRENT - [mA] Milliampere. Resolution: 0.01mA. Range: [0.01:10000.00] *
* - PULSE_CNT_ACC_MINOR - [NB] Number of pulses. Resolution: 1 pulse. Range: [1:999] *
* - PULSE_CNT_ACC_MAJOR - [kNB] Number of kilopulses. Resolution: 1 kilopulse. Range: [1:999999] *
* - ELEC_METER_ACC_MINOR - [Wh] Watt-hour. Resolution: 1Wh. Range: [1:999] *
* - ELEC_METER_ACC_MAJOR - [kWh] Kilowatt-hour. Resolution: 1kWh. Range: [1:999999] *
* - PULSE_CNT_ACC_WIDE_MINOR - [NB] Number of pulses. Resolution: 1 pulse. Range: [1:999999] *
* - PULSE_CNT_ACC_WIDE_MAJOR - [MNB] Number of megapulses. Resolution: 1 megapulse. Range: [1:999999] *
* - CURRENT_PRECISE - [mA] Milliampere. Resolution: 0.001mA. Range: [0.001:8000.000] *
* - OUTPUT_CONTROL - Not applicable *
* - RESISTANCE - [Ω] Ohm. Resolution: 1Ω. Range: [1:1000000] */
/* Condition to be checked by the device. If the condition is true, an action is triggered. */
enum Condition {
/* Invalid value */
/* Invalid value. */
CONDITION_UNSPECIFIED = 0;
/* Threshold function for given rule_id is disabled */
/* The rule is disabled. */
CONDITION_DISABLED = 1;
/* Upper threshold. Continuous sensors only. If the measurement (or average from a few measurements) is over the threshold, */
/* an action is triggered. */
/* parameter[0] - Threshold value in "Encoding A" format. Must match channel type */
/* parameter[1] - Hysteresis value in "Encoding R" format. Must much channel type. Set to "0" to disable */
/* parameter[2] - Triggering mode: */
/* - 1 - moving average (a1=(n1+n2+n3)/3, a2=(n2+n3+n4)/3, etc.) */
/* - 2 - window average (a1=(n1+n2+n3)/3, a2=(n4+n5+n6)/3, etc.) */
/* - 3 - consecutive samples (number of consecutive samples above threshold) */
/* parameter[3] - Number of measurements for trigger determination. E.g parameter[3] equals 3, average value from three */
/* samples will be calculated and compared to the threshold value in average mode or the third consecutive */
/* sample above threshold will trigger action in consecutive mode. Range: [1:10]. */
/* parameter[4] - Type of measurement (as described in MeasurementType). */
/* Upper threshold. 'Continuous' sensors only. *
* If the measurement (or average from a few measurements) is over the threshold, an action is triggered. *
* parameter[0] - Threshold value in "Encoding A" format. Must match channel type. *
* parameter[1] - Hysteresis value in "Encoding R" format. Must match channel type. Set to "0" to disable. *
* parameter[2] - Triggering mode: *
* - 1 - Moving average (a1=(n1+n2+n3)/3, a2=(n2+n3+n4)/3, etc.) *
* - 2 - Window average (a1=(n1+n2+n3)/3, a2=(n4+n5+n6)/3, etc.) *
* - 3 - Consecutive samples (number of consecutive samples above threshold) *
* parameter[3] - Number of measurements for trigger determination. E.g., parameter[3] equals 3, average value from three *
* samples will be calculated and compared to the threshold value in average mode or the third consecutive *
* sample above threshold will trigger action in consecutive mode. Range: [1:10]. *
* parameter[4] - Type of measurement (as described in MeasurementType). */
CONDITION_HIGH_THRESHOLD = 2;
/* Lower threshold. Continuous sensors only. If the measurement (or average from a few measurements) is below the threshold, */
/* an action is triggered. */
/* parameter[0] - Threshold value in "Encoding A" format. Must match channel type */
/* parameter[1] - Hysteresis value in "Encoding R" format. Must much channel type. Set to "0" to disable */
/* parameter[2] - Triggering mode: */
/* - 1 - moving average (a1=(n1+n2+n3)/3, a2=(n2+n3+n4)/3, etc.) */
/* - 2 - window average (a1=(n1+n2+n3)/3, a2=(n4+n5+n6)/3, etc.) */
/* - 3 - consecutive samples (number of consecutive samples above threshold) */
/* parameter[3] - Number of measurements for trigger determination. E.g parameter[3] equals 3, average value from three */
/* samples will be calculated and compared to the threshold value in average mode or the third consecutive */
/* sample below threshold will trigger action in consecutive mode. Range: [1:10]. */
/* parameter[4] - Type of measurement (as described in MeasurementType). */
/* Lower threshold. 'Continuous' sensors only. *
* If the measurement (or average from a few measurements) is below the threshold, an action is triggered. *
* parameter[0] - Threshold value in "Encoding A" format. Must match channel type. *
* parameter[1] - Hysteresis value in "Encoding R" format. Must match channel type. Set to "0" to disable. *
* parameter[2] - Triggering mode: *
* - 1 - Moving average (a1=(n1+n2+n3)/3, a2=(n2+n3+n4)/3, etc.) *
* - 2 - Window average (a1=(n1+n2+n3)/3, a2=(n4+n5+n6)/3, etc.) *
* - 3 - Consecutive samples (number of consecutive samples above threshold) *
* parameter[3] - Number of measurements for trigger determination. E.g., parameter[3] equals 3, average value from three *
* samples will be calculated and compared to the threshold value in average mode or the third consecutive *
* sample below threshold will trigger action in consecutive mode. Range: [1:10]. *
* parameter[4] - Type of measurement (as described in MeasurementType). */
CONDITION_LOW_THRESHOLD = 3;
/* Differential threshold. Continuous sensors only. If the absolute value of the difference between the last value sent to */
/* the server and the measurement value (or average from a few measurements) is greater or equal to the value of */
/* the threshold set, an action is triggered. */
/* parameter[0] - Threshold value in "Encoding R" format. Must match channel type */
/* parameter[1] - Triggering mode: */
/* - 1 - moving average (a1=(n1+n2+n3)/3, a2=(n2+n3+n4)/3, etc.) */
/* - 2 - window average (a1=(n1+n2+n3)/3, a2=(n4+n5+n6)/3, etc.) */
/* - 3 - consecutive samples (number of consecutive samples above threshold) */
/* parameter[2] - Number of measurements for trigger determination. E.g parameter[3] equals 3, average value from three */
/* samples will be calculated and compared to the threshold value in average mode or the third consecutive */
/* sample exceeding threshold will trigger action in consecutive mode. Range: [1:10]. */
/* parameter[3] - Type of measurement (as described in MeasurementType). */
/* Differential threshold. 'Continuous' sensors only. *
* If the absolute value of the difference between the last value sent to the server and the measurement value *
* (or average from a few measurements) is greater or equal to the value of the threshold set, an action is triggered. *
* parameter[0] - Threshold value in "Encoding R" format. Must match channel type. *
* parameter[1] - Triggering mode: *
* - 1 - Moving average (a1=(n1+n2+n3)/3, a2=(n2+n3+n4)/3, etc.) *
* - 2 - Window average (a1=(n1+n2+n3)/3, a2=(n4+n5+n6)/3, etc.) *
* - 3 - Consecutive samples (number of consecutive samples above threshold) *
* parameter[2] - Number of measurements for trigger determination. E.g., parameter[3] equals 3, average value from three *
* samples will be calculated and compared to the threshold value in average mode or the third consecutive *
* sample exceeding threshold will trigger action in consecutive mode. Range: [1:10]. *
* parameter[3] - Type of measurement (as described in MeasurementType). */
CONDITION_DIFF_THRESHOLD = 4;
/* Change of binary sensor's state. Binary sensors only. Each change of the binary's sensor state will trigger an action. */
/* Change of binary sensor's state. 'Binary' sensors only. *
* Each change of the binary sensor's state will trigger an action. */
CONDITION_BINARY_CHANGE_STATE = 5;
/* Logic operator. Used for combining multiple rules into more complex conditions. If the logic condition specified by */
/* parameters (logic operator and selected rules) is met, an action is triggered. */
/* parameter[0] - Logic operator (as described in LogicOperation). */
/* parameter[1] - Rule selector (bit mask). Specifies which rules should be taken into account while determining */
/* rules outcome. */
/* parameter[2] - Rule negation (bit mask). Specifies which of chosen in parameter[1] rules should be negated */
/* before determining rules outcome. */
/* parameter[3] - Rule action delay [s]. Specifies time delay between the rule activation and rule action being triggered. */
/* Range: [0:864000]. */
/* parameter[4] - Rule return delay [s]. Specifies time delay between the rule deactivation and rule action being triggered. */
/* Range: [0:864001]. Max parameter value disables action triggering on rule deactivation. */
/* Logic operator. Used for combining multiple rules into more complex conditions. *
* If the logic condition specified by parameters (logic operator and selected rules) is met, an action is triggered. *
* parameter[0] - Logic operator (as described in LogicOperator). *
* parameter[1] - Rule selector (bitmask). Specifies which rules should be taken into account while determining *
* rules outcome. *
* parameter[2] - Rule negation (bitmask). Specifies which of chosen in parameter[1] rules should be negated *
* before determining rules outcome. *
* parameter[3] - Rule action delay [s]. Specifies time delay between the rule activation and rule action being triggered. *
* Range: [0:864000]. *
* parameter[4] - Rule return delay [s]. Specifies time delay between the rule deactivation and rule action being triggered. *
* Range: [0:864001]. Max parameter value disables action triggering on rule deactivation. */
CONDITION_LOGIC_OPERATOR = 6;
/* On measurement. Continous sensors only. The basic function is to trigger communication after measurement if at least 60s */
/* have passed since the last one. Transmission may occur every x measurement. Optionally dependency on the other rule can */
/* be configured, then, when all conditions are met, transmission is triggered. */
/* parameter[0] - Send every n measurement. This parameter specifies every which measurement transmission will be triggered */
/* if all other conditions are met. Range: [1:500]. If parameter[0] equals 1, transmission will occur after */
/* every measurement. */
/* parameter[1] - Optional. Rule selector (bit mask). Specifies which rule should be taken into account while determining */
/* the measurement rule outcome. */
/* parameter[2] - Optional. Rule negation (bit mask). Specifies which of chosen in parameter[1] rule should be negated */
/* before determining the measurement rule outcome. */
/* On measurement. 'Continous' sensors only.
* The basic function is to trigger communication after measurement if at least 60s have passed since the last one. *
* Transmission may occur every n-th measurement. Optionally dependency on the other rule can be configured, then, when all *
* conditions are met, transmission is triggered. *
* parameter[0] - Send every n-th measurement. This parameter specifies every which measurement transmission will be *
* triggered if all other conditions are met. Range: [1:500]. If parameter[0] equals 1, transmission will *
* occur after every measurement. *
* parameter[1] - Optional. Rule selector (bitmask). Specifies which rule should be taken into account while determining *
* the measurement rule outcome. *
* parameter[2] - Optional. Rule negation (bitmask). Specifies which of the rules selected in parameter[1] should be negated *
* before determining the measurement rule outcome. */
CONDITION_ON_MEASUREMENT = 7;
/* On sensor error. 'Continous' sensors only. *
* If the sensor returns an error code, an action will be triggered. *
* The rule becomes inactive when a correct measurement appears. */
CONDITION_ON_SENSOR_ERROR = 8;
}
/* Logic operators to be used for determining the outcome of rules with logic operator condition. */
enum LogicOperator {
/* Invalid use */
/* Invalid value. */
LOGIC_OPERATOR_UNSPECIFIED = 0;
/* Logic AND */
/* Logic AND. */
LOGIC_OPERATOR_AND = 1;
/* Logic OR */
/* Logic OR. */
LOGIC_OPERATOR_OR = 2;
}
/* Action to be triggered. Currently the only possible action is to trigger the transmission. */
/* Other actions will be available in next SW releases. */
/* Action to be triggered. */
enum Action {
/* Invalid value */
/* Invalid value. */
ACTION_UNSPECIFIED = 0;
/* To trigger the transmission */
/* To trigger the transmission. */
ACTION_TRIGGER_TRANSMISSION = 1;
/* To take no action. Possible for logic operator components */
/* To take no action. Possible for logic operator components. */
ACTION_NO_ACTION = 2;
/* To trigger the transmission with ACK */
/* To trigger the transmission with ACK. */
ACTION_TRIGGER_TRANSMISSION_WITH_ACK = 3;
/* To change BLE advertising period mode to fast (with lower user-configured advertising interval). */
/* Once the rule is deactived avertising period mode returns to previously configured value. */
/* To change BLE advertising period mode to fast (with lower user-configured advertising interval). *
* Once the rule is deactived avertising period mode returns to previously configured value. */
ACTION_FAST_ADVERTISING_MODE = 4;
}
/* Type of a rule calendars. */
enum CalendarType {
/* Invalid value */
/* Invalid value. */
CALENDAR_TYPE_UNSPECIFIED = 0;
/* Type for inactive calendars */
/* Calendar is inactive. */
CALENDAR_TYPE_DISABLED = 1;
/* Week type. Enables selcted rules on specified days of the week in specified time periods. */
/* parameter[0] - Week day mask. Bitmask of days when selected rules are enabled */
/* - Bit 0 - Sunday */
/* - Bit 1 - Monday */
/* ... */
/* - Bit 6 - Saturday */
/* parameter[1] - 'From time' - point in time from which selected rules will be enabled (in minutes from midnight). */
/* parameter[2] - 'To time' - point in time from which selected rules will be disabled (in minutes from midnight). */
/* Note: if 'From time' is bigger than 'To time' there are two periods when rules are enabled - from 00:00 to 'To time' */
/* and from 'From time' to 23:59. */
/* parameter[3] - Timezone - desired timezone for date comparison. Encoded as number (N) of 15 minutes offsets */
/* - example - if N = 4, then offset = 4 * 15min = 1h. I.e. timezone is UTC+1. */
/* Week calendar. Enables selcted rules on specified days of the week in specified time periods. *
* parameter[0] - Week day mask. Bitmask of days when selected rules are enabled: *
* - Bit 0 - Sunday *
* - Bit 1 - Monday *
* ... *
* - Bit 6 - Saturday *
* parameter[1] - 'From time' - point in time from which selected rules will be enabled (in minutes from midnight). *
* parameter[2] - 'To time' - point in time from which selected rules will be disabled (in minutes from midnight). *
* parameter[3] - Timezone - desired timezone for date comparison. Encoded as number (N) of 15 minutes offsets, *
* for example: if N = 4, then offset = 4 * 15min = 1h. I.e. timezone is UTC+1. *
* Note: If 'From time' is bigger than 'To time' there are two periods when rules are enabled - from 00:00 to 'To time' *
* and from 'From time' to 23:59. */
CALENDAR_TYPE_WEEK = 2;
}
/* Rules calendars. Used for enabling/disabling rules based on date/time. */
/* It is possible to configure up to 6 calendars. Each of them can affect any number of rules. */
message ProtoCalendar {
/* Bit mask of selected rules. Mask on bits [0:11] */
/* - Bit 0 - Rule ID 0 */
/* - Bit 1 - Rule ID 1 */
/* ... */
/* - Bit 11 - Rule ID 11 */
/* Selected rules. *
* Bitmask - up to 16 rules supported (previously 12 rules [06.00 - 07.01.xx]): *
* - Bit 0 - Rule 1 *
* - Bit 1 - Rule 2 *
* ... *
* - Bit 15 - Rule 16 *
* Status: In use [06.08.00 - LATEST] */
uint32 rule_mask = 1;
/* Calendars's parameters. Described in Type. */
/* Calendar parameters (as described in CalendarType). *
* Status: In use [06.08.00 - LATEST] */
repeated sint32 parameters = 2;
/* Calendar's type. Described in Type. */
/* Calendar type (as described in CalendarType). *
* Status: In use [06.08.00 - LATEST] */
CalendarType type = 3;
}
/* Rules used to define edge logic on the device. Rules are defined by conditions and actions: */
/* If Condition is true, trigger Action. It is possible to configure up to 12 rules and assign them to different channels. */
/* One rule can be assigned to any number of channels. For instance rule "If temperature is over 10 C, trigger the transmission"*/
/* can be assigned to channels 1 and 2. No matter to how many channels a rule is assigned, it's still counted as one rule. */
/* Rules are used to define edge logic on the device. Rules are defined by conditions and actions. *
* If 'condition' is true, trigger 'action'. One rule can be assigned to any number of channels. *
* For instance rule "If temperature is over 10 C, trigger the transmission" can be assigned to channels 1 and 2. *
* No matter to how many channels a rule is assigned, it's still counted as one rule. */
message ProtoRule {
/* Channels to which the rule is assigned. One rule can be assigned to multiple channels as long as those are of the same type*/
/* Bit mask on bits [0:5]. E.g. To assign the rule for channel 1: "000001", to assign rule to channels 2 and 4: "001010" */
/* Channels to which the rule is assigned. *
* One rule can be assigned to multiple channels as long as those are of the same type. *
* Bitmask: *
* - Bit 0 - Channel 1 *
* - Bit 1 - Channel 2 *
* ... *
* - Bit 5 - Channel 6 *
* Status: In use [06.00 - LATEST] */
uint32 channel_mask = 1;
/* Rule's condition (as described in Condition). */
/* Rule condition (as described in Condition). *
* Status: In use [06.00 - LATEST] */
Condition condition = 2;
/* Condition's parameters (as described in Condition). For binary sensors there are no parameters */
/* Condition parameters (as described in Condition). *
* For 'Binary' sensors there are no parameters. *
* Status: In use [06.00 - LATEST] */
repeated sint32 parameters = 3;
/* Action to be triggered. */
/* Action to be triggered. *
* Status: In use [06.00 - LATEST] */
Action action = 4;
}

664
common/transport/coap/src/test/java/org/thingsboard/server/transport/coap/efento/CoapEfentoTransportResourceTest.java

@ -16,23 +16,32 @@
package org.thingsboard.server.transport.coap.efento;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import org.thingsboard.server.gen.transport.coap.ConfigProtos;
import org.thingsboard.server.gen.transport.coap.ConfigTypesProtos;
import org.thingsboard.server.gen.transport.coap.DeviceInfoProtos;
import org.thingsboard.server.gen.transport.coap.MeasurementTypeProtos.MeasurementType;
import org.thingsboard.server.gen.transport.coap.MeasurementsProtos;
import org.thingsboard.server.gen.transport.coap.MeasurementsProtos.ProtoMeasurements;
import org.thingsboard.server.gen.transport.coap.ProtoRuleProtos;
import org.thingsboard.server.transport.coap.CoapTransportContext;
import org.thingsboard.server.transport.coap.efento.utils.CoapEfentoUtils;
import java.nio.ByteBuffer;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static org.assertj.core.api.Assertions.assertThat;
@ -85,7 +94,7 @@ class CoapEfentoTransportResourceTest {
void checkContinuousSensorWithSomeMeasurements() {
long tsInSec = Instant.now().getEpochSecond();
ProtoMeasurements measurements = ProtoMeasurements.newBuilder()
.setSerialNum(integerToByteString(1234))
.setSerialNumber(integerToByteString(1234))
.setCloudToken("test_token")
.setMeasurementPeriodBase(180)
.setMeasurementPeriodFactor(5)
@ -93,7 +102,7 @@ class CoapEfentoTransportResourceTest {
.setSignal(0)
.setNextTransmissionAt(1000)
.setTransferReason(0)
.setHash(0)
.setConfigurationHash(0)
.addAllChannels(List.of(MeasurementsProtos.ProtoChannel.newBuilder()
.setType(MeasurementType.MEASUREMENT_TYPE_TEMPERATURE)
.setTimestamp(Math.toIntExact(tsInSec))
@ -114,7 +123,7 @@ class CoapEfentoTransportResourceTest {
assertThat(efentoMeasurements.get(1).getTs()).isEqualTo((tsInSec + 180 * 5) * 1000);
assertThat(efentoMeasurements.get(1).getValues().getAsJsonObject().get("temperature_1").getAsDouble()).isEqualTo(22.4);
assertThat(efentoMeasurements.get(1).getValues().getAsJsonObject().get("humidity_2").getAsDouble()).isEqualTo(30);
checkDefaultMeasurements(measurements, efentoMeasurements, 180 * 5, false);
checkDefaultMeasurements(measurements, efentoMeasurements, 180 * 5);
}
@ParameterizedTest
@ -122,7 +131,7 @@ class CoapEfentoTransportResourceTest {
void checkContinuousSensor(MeasurementType measurementType, List<Integer> sampleOffsets, String property, double expectedValue) {
long tsInSec = Instant.now().getEpochSecond();
ProtoMeasurements measurements = ProtoMeasurements.newBuilder()
.setSerialNum(integerToByteString(1234))
.setSerialNumber(integerToByteString(1234))
.setCloudToken("test_token")
.setMeasurementPeriodBase(180)
.setMeasurementPeriodFactor(0)
@ -130,7 +139,7 @@ class CoapEfentoTransportResourceTest {
.setSignal(0)
.setNextTransmissionAt(1000)
.setTransferReason(0)
.setHash(0)
.setConfigurationHash(0)
.addAllChannels(List.of(MeasurementsProtos.ProtoChannel.newBuilder()
.setType(measurementType)
.setTimestamp(Math.toIntExact(tsInSec))
@ -142,7 +151,7 @@ class CoapEfentoTransportResourceTest {
assertThat(efentoMeasurements).hasSize(1);
assertThat(efentoMeasurements.get(0).getTs()).isEqualTo(tsInSec * 1000);
assertThat(efentoMeasurements.get(0).getValues().getAsJsonObject().get(property).getAsDouble()).isEqualTo(expectedValue);
checkDefaultMeasurements(measurements, efentoMeasurements, 180, false);
checkDefaultMeasurements(measurements, efentoMeasurements, 180);
}
private static Stream<Arguments> checkContinuousSensor() {
@ -176,7 +185,7 @@ class CoapEfentoTransportResourceTest {
String totalPropertyName, double expectedTotalValue) {
long tsInSec = Instant.now().getEpochSecond();
ProtoMeasurements measurements = ProtoMeasurements.newBuilder()
.setSerialNum(integerToByteString(1234))
.setSerialNumber(integerToByteString(1234))
.setCloudToken("test_token")
.setMeasurementPeriodBase(180)
.setMeasurementPeriodFactor(0)
@ -184,7 +193,7 @@ class CoapEfentoTransportResourceTest {
.setSignal(0)
.setNextTransmissionAt(1000)
.setTransferReason(0)
.setHash(0)
.setConfigurationHash(0)
.addAllChannels(Arrays.asList(MeasurementsProtos.ProtoChannel.newBuilder()
.setType(majorType)
.setTimestamp(Math.toIntExact(tsInSec))
@ -200,7 +209,7 @@ class CoapEfentoTransportResourceTest {
assertThat(efentoMeasurements).hasSize(1);
assertThat(efentoMeasurements.get(0).getTs()).isEqualTo(tsInSec * 1000);
assertThat(efentoMeasurements.get(0).getValues().getAsJsonObject().get(totalPropertyName + "_2").getAsDouble()).isEqualTo(expectedTotalValue);
checkDefaultMeasurements(measurements, efentoMeasurements, 180, false);
checkDefaultMeasurements(measurements, efentoMeasurements, 180);
}
private static Stream<Arguments> checkPulseCounterSensors() {
@ -220,7 +229,7 @@ class CoapEfentoTransportResourceTest {
void checkBinarySensor() {
long tsInSec = Instant.now().getEpochSecond();
ProtoMeasurements measurements = ProtoMeasurements.newBuilder()
.setSerialNum(integerToByteString(1234))
.setSerialNumber(integerToByteString(1234))
.setCloudToken("test_token")
.setMeasurementPeriodBase(180)
.setMeasurementPeriodFactor(0)
@ -228,7 +237,7 @@ class CoapEfentoTransportResourceTest {
.setSignal(0)
.setNextTransmissionAt(1000)
.setTransferReason(0)
.setHash(0)
.setConfigurationHash(0)
.addChannels(MeasurementsProtos.ProtoChannel.newBuilder()
.setType(MEASUREMENT_TYPE_OK_ALARM)
.setTimestamp(Math.toIntExact(tsInSec))
@ -239,7 +248,7 @@ class CoapEfentoTransportResourceTest {
assertThat(efentoMeasurements).hasSize(1);
assertThat(efentoMeasurements.get(0).getTs()).isEqualTo(tsInSec * 1000);
assertThat(efentoMeasurements.get(0).getValues().getAsJsonObject().get("ok_alarm_1").getAsString()).isEqualTo("ALARM");
checkDefaultMeasurements(measurements, efentoMeasurements, 180 * 14, true);
checkDefaultMeasurements(measurements, efentoMeasurements, 180 * 14);
}
@ParameterizedTest
@ -247,7 +256,7 @@ class CoapEfentoTransportResourceTest {
void checkBinarySensorWhenValueIsVarying(MeasurementType measurementType, String property, String expectedValueWhenOffsetNotOk, String expectedValueWhenOffsetOk) {
long tsInSec = Instant.now().getEpochSecond();
ProtoMeasurements measurements = ProtoMeasurements.newBuilder()
.setSerialNum(integerToByteString(1234))
.setSerialNumber(integerToByteString(1234))
.setCloudToken("test_token")
.setMeasurementPeriodBase(180)
.setMeasurementPeriodFactor(1)
@ -255,7 +264,7 @@ class CoapEfentoTransportResourceTest {
.setSignal(0)
.setNextTransmissionAt(1000)
.setTransferReason(0)
.setHash(0)
.setConfigurationHash(0)
.addChannels(MeasurementsProtos.ProtoChannel.newBuilder()
.setType(measurementType)
.setTimestamp(Math.toIntExact(tsInSec))
@ -268,7 +277,7 @@ class CoapEfentoTransportResourceTest {
assertThat(efentoMeasurements.get(0).getValues().getAsJsonObject().get(property).getAsString()).isEqualTo(expectedValueWhenOffsetNotOk);
assertThat(efentoMeasurements.get(1).getTs()).isEqualTo((tsInSec + 9) * 1000);
assertThat(efentoMeasurements.get(1).getValues().getAsJsonObject().get(property).getAsString()).isEqualTo(expectedValueWhenOffsetOk);
checkDefaultMeasurements(measurements, efentoMeasurements, 180, true);
checkDefaultMeasurements(measurements, efentoMeasurements, 180);
}
private static Stream<Arguments> checkBinarySensorWhenValueIsVarying() {
@ -282,7 +291,7 @@ class CoapEfentoTransportResourceTest {
@Test
void checkExceptionWhenChannelsListIsEmpty() {
ProtoMeasurements measurements = ProtoMeasurements.newBuilder()
.setSerialNum(integerToByteString(1234))
.setSerialNumber(integerToByteString(1234))
.setCloudToken("test_token")
.setMeasurementPeriodBase(180)
.setMeasurementPeriodFactor(1)
@ -290,7 +299,7 @@ class CoapEfentoTransportResourceTest {
.setSignal(0)
.setNextTransmissionAt(1000)
.setTransferReason(0)
.setHash(0)
.setConfigurationHash(0)
.build();
UUID sessionId = UUID.randomUUID();
@ -299,29 +308,587 @@ class CoapEfentoTransportResourceTest {
.hasMessage("[" + sessionId + "]: Failed to get Efento measurements, reason: channels list is empty!");
}
// -------------------------------------------------------------------------
// ProtoDeviceInfo parsing tests
// -------------------------------------------------------------------------
@Test
void checkExceptionWhenValuesMapIsEmpty() {
long tsInSec = Instant.now().getEpochSecond();
ProtoMeasurements measurements = ProtoMeasurements.newBuilder()
.setSerialNum(integerToByteString(1234))
.setCloudToken("test_token")
.setMeasurementPeriodBase(180)
.setMeasurementPeriodFactor(1)
.setBatteryStatus(true)
.setSignal(0)
.setNextTransmissionAt(1000)
.setTransferReason(0)
.setHash(0)
.addChannels(MeasurementsProtos.ProtoChannel.newBuilder()
.setType(MEASUREMENT_TYPE_TEMPERATURE)
.setTimestamp(Math.toIntExact(tsInSec))
void getEfentoDeviceInfo_parsesSwVersion() {
DeviceInfoProtos.ProtoDeviceInfo deviceInfo = minimalDeviceInfo()
.setSwVersion(1546) // ver 06.10 => 0x060A => 1546
.build();
CoapEfentoTransportResource.EfentoTelemetry result = coapEfentoTransportResource.getEfentoDeviceInfo(deviceInfo);
assertThat(result.getValues().getAsJsonObject().get("sw_version").getAsInt()).isEqualTo(1546);
}
@Test
void getEfentoDeviceInfo_parsesAllMemoryStatistics() {
// proto uint32 maps to Java int; the "undefined" sentinel is 0xFFFFFFFF = -1 in signed int
int undefinedTs = -1;
int knownTs = 1_700_000_000; // arbitrary known Unix timestamp fitting in uint32
// clearMemoryStatistics() is needed because minimalDeviceInfo() pre-populates 22 zeros;
// addAllMemoryStatistics() appends in proto, so without clear the test values land at indices 22-43
DeviceInfoProtos.ProtoDeviceInfo.Builder builder = minimalDeviceInfo().clearMemoryStatistics();
builder.addAllMemoryStatistics(List.of(
0, // [0] nv_storage_status: 0 = no errors
knownTs, // [1] timestamp_of_the_end_of_collecting_statistics
1048576, // [2] capacity_of_memory_in_bytes
512000, // [3] used_space_in_bytes
1024, // [4] size_of_invalid_packets_in_bytes
256, // [5] size_of_corrupted_packets_in_bytes
100, // [6] number_of_valid_packets
10, // [7] number_of_invalid_packets
2, // [8] number_of_corrupted_packets
500, // [9] number_of_all_samples_for_channel_1
400, // [10] number_of_all_samples_for_channel_2
300, // [11] number_of_all_samples_for_channel_3
200, // [12] number_of_all_samples_for_channel_4
100, // [13] number_of_all_samples_for_channel_5
50, // [14] number_of_all_samples_for_channel_6
undefinedTs, // [15] timestamp_of_the_first_binary_measurement (undefined)
undefinedTs, // [16] timestamp_of_the_last_binary_measurement (undefined)
undefinedTs, // [17] timestamp_of_the_first_binary_measurement_sent (undefined)
knownTs, // [18] timestamp_of_the_first_continuous_measurement
knownTs, // [19] timestamp_of_the_last_continuous_measurement
knownTs, // [20] timestamp_of_the_last_continuous_measurement_sent
42 // [21] nvm_write_counter
));
CoapEfentoTransportResource.EfentoTelemetry result = coapEfentoTransportResource.getEfentoDeviceInfo(builder.build());
var json = result.getValues().getAsJsonObject();
assertThat(json.get("nv_storage_status").getAsLong()).isEqualTo(0);
assertThat(json.get("timestamp_of_the_end_of_collecting_statistics").getAsString()).isEqualTo(formatDate(knownTs));
assertThat(json.get("capacity_of_memory_in_bytes").getAsLong()).isEqualTo(1048576L);
assertThat(json.get("used_space_in_bytes").getAsLong()).isEqualTo(512000L);
assertThat(json.get("size_of_invalid_packets_in_bytes").getAsLong()).isEqualTo(1024L);
assertThat(json.get("size_of_corrupted_packets_in_bytes").getAsLong()).isEqualTo(256L);
assertThat(json.get("number_of_valid_packets").getAsLong()).isEqualTo(100L);
assertThat(json.get("number_of_invalid_packets").getAsLong()).isEqualTo(10L);
assertThat(json.get("number_of_corrupted_packets").getAsLong()).isEqualTo(2L);
assertThat(json.get("number_of_all_samples_for_channel_1").getAsLong()).isEqualTo(500L);
assertThat(json.get("number_of_all_samples_for_channel_2").getAsLong()).isEqualTo(400L);
assertThat(json.get("number_of_all_samples_for_channel_3").getAsLong()).isEqualTo(300L);
assertThat(json.get("number_of_all_samples_for_channel_4").getAsLong()).isEqualTo(200L);
assertThat(json.get("number_of_all_samples_for_channel_5").getAsLong()).isEqualTo(100L);
assertThat(json.get("number_of_all_samples_for_channel_6").getAsLong()).isEqualTo(50L);
assertThat(json.get("timestamp_of_the_first_binary_measurement").getAsString()).isEqualTo("Undefined");
assertThat(json.get("timestamp_of_the_last_binary_measurement").getAsString()).isEqualTo("Undefined");
assertThat(json.get("timestamp_of_the_first_binary_measurement_sent").getAsString()).isEqualTo("Undefined");
assertThat(json.get("timestamp_of_the_first_continuous_measurement").getAsString()).isEqualTo(formatDate(knownTs));
assertThat(json.get("timestamp_of_the_last_continuous_measurement").getAsString()).isEqualTo(formatDate(knownTs));
assertThat(json.get("timestamp_of_the_last_continuous_measurement_sent").getAsString()).isEqualTo(formatDate(knownTs));
assertThat(json.get("nvm_write_counter").getAsLong()).isEqualTo(42L);
}
@Test
void getEfentoDeviceInfo_parsesModemInfo() {
// 34 modem parameters (indices 0-33) as defined in proto_device_info.proto
List<Integer> params = List.of(
0, // [0] sc_EARNFCN_offset
1000, // [1] sc_EARFCN
42, // [2] sc_PCI
123456, // [3] sc_Cell_id
-90, // [4] sc_RSRP
-10, // [5] sc_RSRQ
-80, // [6] sc_RSSI
15, // [7] sc_SINR
3, // [8] sc_Band
1234, // [9] sc_TAC
1, // [10] sc_ECL
-30, // [11] sc_TX_PWR
2, // [12] op_mode
999, // [13] nc_EARFCN
1, // [14] nc_EARNFCN_offset
100, // [15] nc_PCI
-95, // [16] nc_RSRP
5, // [17] RLC_UL_BLER
3, // [18] RLC_DL_BLER
4, // [19] MAC_UL_BLER
2, // [20] MAC_DL_BLER
50000,// [21] MAC_UL_TOTAL_BYTES
60000,// [22] MAC_DL_TOTAL_BYTES
200, // [23] MAC_UL_total_HARQ_Tx
150, // [24] MAC_DL_total_HARQ_Tx
10, // [25] MAC_UL_HARQ_re_Tx
8, // [26] MAC_DL_HARQ_re_Tx
1000, // [27] RLC_UL_tput
1200, // [28] RLC_DL_tput
900, // [29] MAC_UL_tput
1100, // [30] MAC_DL_tput
5000, // [31] sleep_duration
300, // [32] rx_time
100 // [33] tx_time
);
DeviceInfoProtos.ProtoDeviceInfo deviceInfo = minimalDeviceInfo()
.setModem(DeviceInfoProtos.ProtoModem.newBuilder()
.setType(DeviceInfoProtos.ModemType.MODEM_TYPE_BC66)
.addAllParameters(params)
.build())
.build();
UUID sessionId = UUID.randomUUID();
assertThatThrownBy(() -> coapEfentoTransportResource.getEfentoMeasurements(measurements, sessionId))
.isInstanceOf(IllegalStateException.class)
.hasMessage("[" + sessionId + "]: Failed to collect Efento measurements, reason, values map is empty!");
CoapEfentoTransportResource.EfentoTelemetry result = coapEfentoTransportResource.getEfentoDeviceInfo(deviceInfo);
var json = result.getValues().getAsJsonObject();
assertThat(json.get("modem_types").getAsString()).isEqualTo("MODEM_TYPE_BC66");
assertThat(json.get("sc_EARNFCN_offset").getAsInt()).isEqualTo(0);
assertThat(json.get("sc_EARFCN").getAsInt()).isEqualTo(1000);
assertThat(json.get("sc_PCI").getAsInt()).isEqualTo(42);
assertThat(json.get("sc_Cell_id").getAsInt()).isEqualTo(123456);
assertThat(json.get("sc_RSRP").getAsInt()).isEqualTo(-90);
assertThat(json.get("sc_RSRQ").getAsInt()).isEqualTo(-10);
assertThat(json.get("sc_RSSI").getAsInt()).isEqualTo(-80);
assertThat(json.get("sc_SINR").getAsInt()).isEqualTo(15);
assertThat(json.get("sc_Band").getAsInt()).isEqualTo(3);
assertThat(json.get("sc_TAC").getAsInt()).isEqualTo(1234);
assertThat(json.get("sc_ECL").getAsInt()).isEqualTo(1);
assertThat(json.get("sc_TX_PWR").getAsInt()).isEqualTo(-30);
assertThat(json.get("op_mode").getAsInt()).isEqualTo(2);
assertThat(json.get("nc_EARFCN").getAsInt()).isEqualTo(999);
assertThat(json.get("nc_EARNFCN_offset").getAsInt()).isEqualTo(1);
assertThat(json.get("nc_PCI").getAsInt()).isEqualTo(100);
assertThat(json.get("nc_RSRP").getAsInt()).isEqualTo(-95);
assertThat(json.get("RLC_UL_BLER").getAsInt()).isEqualTo(5);
assertThat(json.get("RLC_DL_BLER").getAsInt()).isEqualTo(3);
assertThat(json.get("MAC_UL_BLER").getAsInt()).isEqualTo(4);
assertThat(json.get("MAC_DL_BLER").getAsInt()).isEqualTo(2);
assertThat(json.get("MAC_UL_TOTAL_BYTES").getAsInt()).isEqualTo(50000);
assertThat(json.get("MAC_DL_TOTAL_BYTES").getAsInt()).isEqualTo(60000);
assertThat(json.get("MAC_UL_total_HARQ_Tx").getAsInt()).isEqualTo(200);
assertThat(json.get("MAC_DL_total_HARQ_Tx").getAsInt()).isEqualTo(150);
assertThat(json.get("MAC_UL_HARQ_re_Tx").getAsInt()).isEqualTo(10);
assertThat(json.get("MAC_DL_HARQ_re_Tx").getAsInt()).isEqualTo(8);
assertThat(json.get("RLC_UL_tput").getAsInt()).isEqualTo(1000);
assertThat(json.get("RLC_DL_tput").getAsInt()).isEqualTo(1200);
assertThat(json.get("MAC_UL_tput").getAsInt()).isEqualTo(900);
assertThat(json.get("MAC_DL_tput").getAsInt()).isEqualTo(1100);
assertThat(json.get("sleep_duration").getAsInt()).isEqualTo(5000);
assertThat(json.get("rx_time").getAsInt()).isEqualTo(300);
assertThat(json.get("tx_time").getAsInt()).isEqualTo(100);
}
@Test
void getEfentoDeviceInfo_parsesModemInfoBC660() {
// 22 modem parameters for MODEM_TYPE_BC660 as defined in proto_device_info.proto
List<Integer> params = List.of(
1000, // [0] sc_EARFCN
5, // [1] sc_EARNFCN_offset
42, // [2] sc_PCI
123456, // [3] sc_Cell_id
-90, // [4] sc_RSRP
-10, // [5] sc_RSRQ
-80, // [6] sc_RSSI
15, // [7] sc_SINR
3, // [8] sc_Band
1234, // [9] sc_TAC
1, // [10] sc_ECL
-30, // [11] sc_TX_PWR
2, // [12] op_mode
999, // [13] nc_EARFCN
100, // [14] nc_PCI
-95, // [15] nc_RSRP
-12, // [16] nc_RSRQ
5000, // [17] sleep_duration
300, // [18] rx_time
100, // [19] tx_time
1, // [20] PLMN_state
26201 // [21] select_PLMN
);
DeviceInfoProtos.ProtoDeviceInfo deviceInfo = minimalDeviceInfo()
.setModem(DeviceInfoProtos.ProtoModem.newBuilder()
.setType(DeviceInfoProtos.ModemType.MODEM_TYPE_BC660)
.addAllParameters(params)
.setSimCardIdentification("89001012012341234120")
.setFirmwareVersion(DeviceInfoProtos.ModemFirmwareVersion.MODEM_FIRMWARE_VERSION_BC660_V2)
.setModemIdentification("123456789012345")
.addAllModemStatistics(List.of(10, 3600, 7200, 600))
.build())
.build();
CoapEfentoTransportResource.EfentoTelemetry result = coapEfentoTransportResource.getEfentoDeviceInfo(deviceInfo);
var json = result.getValues().getAsJsonObject();
assertThat(json.get("modem_types").getAsString()).isEqualTo("MODEM_TYPE_BC660");
assertThat(json.get("sim_card_identification").getAsString()).isEqualTo("89001012012341234120");
assertThat(json.get("firmware_version").getAsString()).isEqualTo("MODEM_FIRMWARE_VERSION_BC660_V2");
assertThat(json.get("modem_identification").getAsString()).isEqualTo("123456789012345");
assertThat(json.get("modem_transmissions_count").getAsInt()).isEqualTo(10);
assertThat(json.get("modem_time_since_last_devinfo").getAsInt()).isEqualTo(3600);
assertThat(json.get("modem_total_psm_time").getAsInt()).isEqualTo(7200);
assertThat(json.get("modem_total_active_time").getAsInt()).isEqualTo(600);
assertThat(json.get("sc_EARFCN").getAsInt()).isEqualTo(1000);
assertThat(json.get("sc_EARNFCN_offset").getAsInt()).isEqualTo(5);
assertThat(json.get("sc_PCI").getAsInt()).isEqualTo(42);
assertThat(json.get("sc_Cell_id").getAsInt()).isEqualTo(123456);
assertThat(json.get("sc_RSRP").getAsInt()).isEqualTo(-90);
assertThat(json.get("sc_RSRQ").getAsInt()).isEqualTo(-10);
assertThat(json.get("sc_RSSI").getAsInt()).isEqualTo(-80);
assertThat(json.get("sc_SINR").getAsInt()).isEqualTo(15);
assertThat(json.get("sc_Band").getAsInt()).isEqualTo(3);
assertThat(json.get("sc_TAC").getAsInt()).isEqualTo(1234);
assertThat(json.get("sc_ECL").getAsInt()).isEqualTo(1);
assertThat(json.get("sc_TX_PWR").getAsInt()).isEqualTo(-30);
assertThat(json.get("op_mode").getAsInt()).isEqualTo(2);
assertThat(json.get("nc_EARFCN").getAsInt()).isEqualTo(999);
assertThat(json.get("nc_PCI").getAsInt()).isEqualTo(100);
assertThat(json.get("nc_RSRP").getAsInt()).isEqualTo(-95);
assertThat(json.get("nc_RSRQ").getAsInt()).isEqualTo(-12);
assertThat(json.get("sleep_duration").getAsInt()).isEqualTo(5000);
assertThat(json.get("rx_time").getAsInt()).isEqualTo(300);
assertThat(json.get("tx_time").getAsInt()).isEqualTo(100);
assertThat(json.get("PLMN_state").getAsInt()).isEqualTo(1);
assertThat(json.get("select_PLMN").getAsInt()).isEqualTo(26201);
// BC66-specific fields must not be present
assertThat(json.has("nc_EARNFCN_offset")).isFalse();
assertThat(json.has("RLC_UL_BLER")).isFalse();
}
@Test
void getEfentoDeviceInfo_parsesModemInfoSharedModem() {
// 4 modem parameters for MODEM_TYPE_SHARED_MODEM as defined in proto_device_info.proto
List<Integer> params = List.of(
-90, // [0] RSRP
-10, // [1] RSRQ
-80, // [2] RSSI
15 // [3] SINR
);
DeviceInfoProtos.ProtoDeviceInfo deviceInfo = minimalDeviceInfo()
.setModem(DeviceInfoProtos.ProtoModem.newBuilder()
.setType(DeviceInfoProtos.ModemType.MODEM_TYPE_SHARED_MODEM)
.addAllParameters(params)
.setModemIdentification("SN-ABCDEF")
.build())
.build();
CoapEfentoTransportResource.EfentoTelemetry result = coapEfentoTransportResource.getEfentoDeviceInfo(deviceInfo);
var json = result.getValues().getAsJsonObject();
assertThat(json.get("modem_types").getAsString()).isEqualTo("MODEM_TYPE_SHARED_MODEM");
assertThat(json.get("modem_identification").getAsString()).isEqualTo("SN-ABCDEF");
assertThat(json.get("RSRP").getAsInt()).isEqualTo(-90);
assertThat(json.get("RSRQ").getAsInt()).isEqualTo(-10);
assertThat(json.get("RSSI").getAsInt()).isEqualTo(-80);
assertThat(json.get("SINR").getAsInt()).isEqualTo(15);
// BC66/BC660-specific fields must not be present
assertThat(json.has("sc_EARFCN")).isFalse();
assertThat(json.has("sc_EARNFCN_offset")).isFalse();
}
@Test
void getEfentoDeviceInfo_parsesNewModemFields() {
// New ProtoModem fields: sim_card_identification, firmware_version, modem_identification, modem_statistics
DeviceInfoProtos.ProtoDeviceInfo deviceInfo = minimalDeviceInfo()
.setModem(DeviceInfoProtos.ProtoModem.newBuilder()
.setType(DeviceInfoProtos.ModemType.MODEM_TYPE_BC66)
.addAllParameters(java.util.Collections.nCopies(34, 0))
.setSimCardIdentification("89012345678901234567")
.setFirmwareVersion(DeviceInfoProtos.ModemFirmwareVersion.MODEM_FIRMWARE_VERSION_READING_ERROR)
.setModemIdentification("352519100417272")
.addAllModemStatistics(List.of(5, 1800, 3600, 120))
.build())
.build();
CoapEfentoTransportResource.EfentoTelemetry result = coapEfentoTransportResource.getEfentoDeviceInfo(deviceInfo);
var json = result.getValues().getAsJsonObject();
assertThat(json.get("sim_card_identification").getAsString()).isEqualTo("89012345678901234567");
assertThat(json.get("firmware_version").getAsString()).isEqualTo("MODEM_FIRMWARE_VERSION_READING_ERROR");
assertThat(json.get("modem_identification").getAsString()).isEqualTo("352519100417272");
assertThat(json.get("modem_transmissions_count").getAsInt()).isEqualTo(5);
assertThat(json.get("modem_time_since_last_devinfo").getAsInt()).isEqualTo(1800);
assertThat(json.get("modem_total_psm_time").getAsInt()).isEqualTo(3600);
assertThat(json.get("modem_total_active_time").getAsInt()).isEqualTo(120);
}
@Test
void getEfentoDeviceInfo_parsesRuntimeInfo() {
long batteryResetTs = 1_700_000_000L;
DeviceInfoProtos.ProtoDeviceInfo deviceInfo = minimalDeviceInfo()
.setRuntimeInfo(DeviceInfoProtos.ProtoRuntime.newBuilder()
.setUpTime(3600)
.addAllMessageCounters(List.of(10, 5, 9))
.setMcuTemperature(25)
.setBatteryVoltage(3200)
.setMinBatteryMcuTemperature(20)
.setBatteryResetTimestamp((int) batteryResetTs)
.setMaxMcuTemperature(40)
.setMinMcuTemperature(10)
.addAllRuntimeErrors(List.of(0, 1))
.build())
.build();
CoapEfentoTransportResource.EfentoTelemetry result = coapEfentoTransportResource.getEfentoDeviceInfo(deviceInfo);
var json = result.getValues().getAsJsonObject();
assertThat(json.get("up_time").getAsLong()).isEqualTo(3600);
assertThat(json.get("mcu_temp").getAsInt()).isEqualTo(25);
assertThat(json.get("min_battery_voltage").getAsLong()).isEqualTo(3200);
assertThat(json.get("min_battery_mcu_temp").getAsInt()).isEqualTo(20);
assertThat(json.get("battery_reset_timestamp").getAsString()).isEqualTo(formatDate(batteryResetTs));
assertThat(json.get("max_mcu_temp").getAsInt()).isEqualTo(40);
assertThat(json.get("min_mcu_temp").getAsInt()).isEqualTo(10);
assertThat(json.get("counter_of_confirmable_messages_attempts").getAsInt()).isEqualTo(10);
assertThat(json.get("counter_of_non_confirmable_messages_attempts").getAsInt()).isEqualTo(5);
assertThat(json.get("counter_of_succeeded_messages").getAsInt()).isEqualTo(9);
assertThat(json.get("runtime_errors").getAsInt()).isEqualTo(2); // count of errors, not values
}
@Test
void getEfentoDeviceInfo_undefinedTimestampRenderedAsUndefinedString() {
// -1 as signed int == 0xFFFFFFFF == uint32 max (4294967295), the "Undefined" sentinel
DeviceInfoProtos.ProtoDeviceInfo deviceInfo = minimalDeviceInfo().clearMemoryStatistics()
.addAllMemoryStatistics(List.of(
0, -1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
-1, -1, -1,
-1, -1, -1,
0))
.build();
CoapEfentoTransportResource.EfentoTelemetry result = coapEfentoTransportResource.getEfentoDeviceInfo(deviceInfo);
var json = result.getValues().getAsJsonObject();
assertThat(json.get("timestamp_of_the_end_of_collecting_statistics").getAsString()).isEqualTo("Undefined");
assertThat(json.get("timestamp_of_the_first_binary_measurement").getAsString()).isEqualTo("Undefined");
assertThat(json.get("timestamp_of_the_last_binary_measurement").getAsString()).isEqualTo("Undefined");
assertThat(json.get("timestamp_of_the_first_binary_measurement_sent").getAsString()).isEqualTo("Undefined");
assertThat(json.get("timestamp_of_the_first_continuous_measurement").getAsString()).isEqualTo("Undefined");
assertThat(json.get("timestamp_of_the_last_continuous_measurement").getAsString()).isEqualTo("Undefined");
assertThat(json.get("timestamp_of_the_last_continuous_measurement_sent").getAsString()).isEqualTo("Undefined");
}
@Test
void getEfentoDeviceInfo_tsIsCurrentTimeMillis() {
long before = System.currentTimeMillis();
CoapEfentoTransportResource.EfentoTelemetry result =
coapEfentoTransportResource.getEfentoDeviceInfo(minimalDeviceInfo().build());
long after = System.currentTimeMillis();
assertThat(result.getTs()).isBetween(before, after);
}
// -------------------------------------------------------------------------
// ProtoConfig / getEfentoConfiguration parsing tests
// -------------------------------------------------------------------------
@Test
void getEfentoConfiguration_parsesServerCommunicationFields() throws InvalidProtocolBufferException {
byte[] bytes = ConfigProtos.ProtoConfig.newBuilder()
.setDataServerIp("18.184.24.239")
.setDataServerPort(5683)
.setUpdateServerIp("efento.update.io")
.setUpdateServerPortCoap(5684)
.setUpdateServerPortUdp(5685)
.setTransmissionInterval(300)
.setAckInterval(600)
.setSupervisionPeriod(3600)
.build()
.toByteArray();
var json = coapEfentoTransportResource.getEfentoConfiguration(bytes).getAsJsonObject();
assertThat(json.get("dataServerIp").getAsString()).isEqualTo("18.184.24.239");
assertThat(json.get("dataServerPort").getAsLong()).isEqualTo(5683);
assertThat(json.get("updateServerIp").getAsString()).isEqualTo("efento.update.io");
assertThat(json.get("updateServerPortCoap").getAsLong()).isEqualTo(5684);
assertThat(json.get("updateServerPortUdp").getAsLong()).isEqualTo(5685);
assertThat(json.get("transmissionInterval").getAsLong()).isEqualTo(300);
assertThat(json.get("ackInterval").getAsLong()).isEqualTo(600);
assertThat(json.get("supervisionPeriod").getAsLong()).isEqualTo(3600);
}
@Test
void getEfentoConfiguration_parsesMeasurementPeriod() throws InvalidProtocolBufferException {
byte[] bytes = ConfigProtos.ProtoConfig.newBuilder()
.setMeasurementPeriodBase(60)
.setMeasurementPeriodFactor(5)
.build()
.toByteArray();
var json = coapEfentoTransportResource.getEfentoConfiguration(bytes).getAsJsonObject();
assertThat(json.get("measurementPeriodBase").getAsLong()).isEqualTo(60);
assertThat(json.get("measurementPeriodFactor").getAsLong()).isEqualTo(5);
}
@Test
void getEfentoConfiguration_parsesBooleanRequestFields() throws InvalidProtocolBufferException {
byte[] bytes = ConfigProtos.ProtoConfig.newBuilder()
.setDeviceInfoRequest(true)
.setUpdateSoftwareRequest(true)
.setConfigurationRequest(true)
.setAcceptWithoutTestingRequest(true)
.setResetMemoryRequest(true)
.build()
.toByteArray();
var json = coapEfentoTransportResource.getEfentoConfiguration(bytes).getAsJsonObject();
assertThat(json.get("deviceInfoRequest").getAsBoolean()).isTrue();
assertThat(json.get("updateSoftwareRequest").getAsBoolean()).isTrue();
assertThat(json.get("configurationRequest").getAsBoolean()).isTrue();
assertThat(json.get("acceptWithoutTestingRequest").getAsBoolean()).isTrue();
assertThat(json.get("resetMemoryRequest").getAsBoolean()).isTrue();
}
@Test
void getEfentoConfiguration_parsesModemAndNetworkFields() throws InvalidProtocolBufferException {
byte[] bytes = ConfigProtos.ProtoConfig.newBuilder()
.setApn("internet.example.com")
.setApnUsername("user")
.setApnPassword("pass")
.setPlmnSelection(26001)
.setModemBandsMask(2084) // bands 3, 8, 20
.setNetworkTroubleshooting(2)
.build()
.toByteArray();
var json = coapEfentoTransportResource.getEfentoConfiguration(bytes).getAsJsonObject();
assertThat(json.get("apn").getAsString()).isEqualTo("internet.example.com");
assertThat(json.get("apnUsername").getAsString()).isEqualTo("user");
assertThat(json.get("apnPassword").getAsString()).isEqualTo("pass");
assertThat(json.get("plmnSelection").getAsLong()).isEqualTo(26001);
assertThat(json.get("modemBandsMask").getAsLong()).isEqualTo(2084);
assertThat(json.get("networkTroubleshooting").getAsLong()).isEqualTo(2);
}
@Test
void getEfentoConfiguration_parsesCloudTokenFields() throws InvalidProtocolBufferException {
byte[] bytes = ConfigProtos.ProtoConfig.newBuilder()
.setCloudToken("my-device-token")
.setCloudTokenConfig(1)
.setCloudTokenCoapOption(65000)
.build()
.toByteArray();
var json = coapEfentoTransportResource.getEfentoConfiguration(bytes).getAsJsonObject();
assertThat(json.get("cloudToken").getAsString()).isEqualTo("my-device-token");
assertThat(json.get("cloudTokenConfig").getAsLong()).isEqualTo(1);
assertThat(json.get("cloudTokenCoapOption").getAsLong()).isEqualTo(65000);
}
@Test
void getEfentoConfiguration_parsesEndpointFields() throws InvalidProtocolBufferException {
byte[] bytes = ConfigProtos.ProtoConfig.newBuilder()
.setDataEndpoint("/m")
.setConfigurationEndpoint("/c")
.setDeviceInfoEndpoint("/i")
.setTimeEndpoint("/t")
.build()
.toByteArray();
var json = coapEfentoTransportResource.getEfentoConfiguration(bytes).getAsJsonObject();
assertThat(json.get("dataEndpoint").getAsString()).isEqualTo("/m");
assertThat(json.get("configurationEndpoint").getAsString()).isEqualTo("/c");
assertThat(json.get("deviceInfoEndpoint").getAsString()).isEqualTo("/i");
assertThat(json.get("timeEndpoint").getAsString()).isEqualTo("/t");
}
@Test
void getEfentoConfiguration_parsesBleAdvertisingPeriod() throws InvalidProtocolBufferException {
byte[] bytes = ConfigProtos.ProtoConfig.newBuilder()
.setBleAdvertisingPeriod(ConfigTypesProtos.ProtoBleAdvertisingPeriod.newBuilder()
.setMode(ConfigTypesProtos.BleAdvertisingPeriodMode.BLE_ADVERTISING_PERIOD_MODE_NORMAL)
.setNormal(1600)
.setFast(320)
.build())
.build()
.toByteArray();
var json = coapEfentoTransportResource.getEfentoConfiguration(bytes).getAsJsonObject();
var ble = json.get("bleAdvertisingPeriod").getAsJsonObject();
assertThat(ble.get("mode").getAsString()).isEqualTo("BLE_ADVERTISING_PERIOD_MODE_NORMAL");
assertThat(ble.get("normal").getAsLong()).isEqualTo(1600);
assertThat(ble.get("fast").getAsLong()).isEqualTo(320);
}
@Test
void getEfentoConfiguration_parsesRepeatedChannelTypes() throws InvalidProtocolBufferException {
byte[] bytes = ConfigProtos.ProtoConfig.newBuilder()
.addChannelTypes(MeasurementType.MEASUREMENT_TYPE_TEMPERATURE)
.addChannelTypes(MeasurementType.MEASUREMENT_TYPE_HUMIDITY)
.addChannelTypes(MeasurementType.MEASUREMENT_TYPE_ATMOSPHERIC_PRESSURE)
.build()
.toByteArray();
var json = coapEfentoTransportResource.getEfentoConfiguration(bytes).getAsJsonObject();
var channelTypes = json.get("channelTypes").getAsJsonArray();
assertThat(channelTypes).hasSize(3);
assertThat(channelTypes.get(0).getAsString()).isEqualTo("MEASUREMENT_TYPE_TEMPERATURE");
assertThat(channelTypes.get(1).getAsString()).isEqualTo("MEASUREMENT_TYPE_HUMIDITY");
assertThat(channelTypes.get(2).getAsString()).isEqualTo("MEASUREMENT_TYPE_ATMOSPHERIC_PRESSURE");
}
@Test
void getEfentoConfiguration_parsesEdgeLogicRules() throws InvalidProtocolBufferException {
// ProtoRule uses channel_mask (bit mask), condition, parameters, action
byte[] bytes = ConfigProtos.ProtoConfig.newBuilder()
.addRules(ProtoRuleProtos.ProtoRule.newBuilder()
.setChannelMask(1) // channel 1 → bit mask 0b000001
.setCondition(ProtoRuleProtos.Condition.CONDITION_HIGH_THRESHOLD)
.addParameters(500) // threshold value
.setAction(ProtoRuleProtos.Action.ACTION_TRIGGER_TRANSMISSION)
.build())
.build()
.toByteArray();
var json = coapEfentoTransportResource.getEfentoConfiguration(bytes).getAsJsonObject();
var rules = json.get("rules").getAsJsonArray();
assertThat(rules).hasSize(1);
var rule = rules.get(0).getAsJsonObject();
assertThat(rule.get("channelMask").getAsInt()).isEqualTo(1);
assertThat(rule.get("condition").getAsString()).isEqualTo("CONDITION_HIGH_THRESHOLD");
assertThat(rule.get("parameters").getAsJsonArray().get(0).getAsInt()).isEqualTo(500);
assertThat(rule.get("action").getAsString()).isEqualTo("ACTION_TRIGGER_TRANSMISSION");
}
@Test
void getEfentoConfiguration_emptyConfigProducesJsonWithDefaultValues() throws InvalidProtocolBufferException {
byte[] bytes = ConfigProtos.ProtoConfig.newBuilder().build().toByteArray();
var json = coapEfentoTransportResource.getEfentoConfiguration(bytes).getAsJsonObject();
// JsonFormat with includingDefaultValueFields prints all fields — verify a representative subset
assertThat(json.get("measurementPeriodBase").getAsLong()).isEqualTo(0);
assertThat(json.get("transmissionInterval").getAsLong()).isEqualTo(0);
assertThat(json.get("dataServerIp").getAsString()).isEmpty();
assertThat(json.get("deviceInfoRequest").getAsBoolean()).isFalse();
assertThat(json.get("cloudToken").getAsString()).isEmpty();
}
/**
* Builds a ProtoDeviceInfo with the minimum set of repeated fields required by getEfentoDeviceInfo:
* 22 memory_statistics, 34 modem parameters and 3 message_counters all set to 0.
*/
private static DeviceInfoProtos.ProtoDeviceInfo.Builder minimalDeviceInfo() {
List<Integer> zeroMemStats = java.util.Collections.nCopies(22, 0);
List<Integer> zeroModemParams = java.util.Collections.nCopies(34, 0);
return DeviceInfoProtos.ProtoDeviceInfo.newBuilder()
.setSerialNumber(integerToByteString(1234))
.setCloudToken("test_token")
.setSwVersion(0)
.addAllMemoryStatistics(zeroMemStats)
.setModem(DeviceInfoProtos.ProtoModem.newBuilder()
.setType(DeviceInfoProtos.ModemType.MODEM_TYPE_UNSPECIFIED)
.addAllParameters(zeroModemParams)
.build())
.setRuntimeInfo(DeviceInfoProtos.ProtoRuntime.newBuilder()
.setUpTime(0)
.addAllMessageCounters(List.of(0, 0, 0))
.build());
}
private static String formatDate(long seconds) {
SimpleDateFormat sdf = new SimpleDateFormat("dd MMM yyyy HH:mm:ss Z");
return sdf.format(new Date(TimeUnit.SECONDS.toMillis(seconds)));
}
public static ByteString integerToByteString(Integer intValue) {
@ -340,20 +907,17 @@ class CoapEfentoTransportResourceTest {
private void checkDefaultMeasurements(ProtoMeasurements incomingMeasurements,
List<CoapEfentoTransportResource.EfentoTelemetry> actualEfentoMeasurements,
long expectedMeasurementInterval,
boolean isBinarySensor) {
for (int i = 0; i < actualEfentoMeasurements.size(); i++) {
CoapEfentoTransportResource.EfentoTelemetry actualEfentoMeasurement = actualEfentoMeasurements.get(i);
assertThat(actualEfentoMeasurement.getValues().getAsJsonObject().get("serial").getAsString()).isEqualTo(CoapEfentoUtils.convertByteArrayToString(incomingMeasurements.getSerialNum().toByteArray()));
assertThat(actualEfentoMeasurement.getValues().getAsJsonObject().get("battery").getAsString()).isEqualTo(incomingMeasurements.getBatteryStatus() ? "ok" : "low");
MeasurementsProtos.ProtoChannel protoChannel = incomingMeasurements.getChannelsList().get(0);
long measuredAt = isBinarySensor ?
TimeUnit.SECONDS.toMillis(protoChannel.getTimestamp()) + Math.abs(TimeUnit.SECONDS.toMillis(protoChannel.getSampleOffsetsList().get(i))) - 1000 :
TimeUnit.SECONDS.toMillis(protoChannel.getTimestamp() + i * expectedMeasurementInterval);
assertThat(actualEfentoMeasurement.getValues().getAsJsonObject().get("measured_at").getAsString()).isEqualTo(convertTimestampToUtcString(measuredAt));
assertThat(actualEfentoMeasurement.getValues().getAsJsonObject().get("next_transmission_at").getAsString()).isEqualTo(convertTimestampToUtcString(TimeUnit.SECONDS.toMillis(incomingMeasurements.getNextTransmissionAt())));
assertThat(actualEfentoMeasurement.getValues().getAsJsonObject().get("signal").getAsLong()).isEqualTo(incomingMeasurements.getSignal());
assertThat(actualEfentoMeasurement.getValues().getAsJsonObject().get("measurement_interval").getAsDouble()).isEqualTo(expectedMeasurementInterval);
long expectedMeasurementInterval) {
CoapEfentoTransportResource.EfentoTelemetry efentoTelemetry = actualEfentoMeasurements.stream()
.sorted(Comparator.comparing(CoapEfentoTransportResource.EfentoTelemetry::getTs))
.toList().get(0);
assertThat(efentoTelemetry.getValues().getAsJsonObject().get("serial").getAsString()).isEqualTo(CoapEfentoUtils.convertByteArrayToString(incomingMeasurements.getSerialNumber().toByteArray()));
assertThat(efentoTelemetry.getValues().getAsJsonObject().get("battery").getAsString()).isEqualTo(incomingMeasurements.getBatteryStatus() ? "ok" : "low");
assertThat(efentoTelemetry.getValues().getAsJsonObject().get("next_transmission_at").getAsString()).isEqualTo(convertTimestampToUtcString(TimeUnit.SECONDS.toMillis(incomingMeasurements.getNextTransmissionAt())));
assertThat(efentoTelemetry.getValues().getAsJsonObject().get("signal").getAsLong()).isEqualTo(incomingMeasurements.getSignal());
for (int i = 1; i < incomingMeasurements.getChannelsCount() + 1; i++) {
assertThat(efentoTelemetry.getValues().getAsJsonObject().get("measurement_interval_" + i).getAsDouble()).isEqualTo(expectedMeasurementInterval);
}
}

Loading…
Cancel
Save