Browse Source

Merge pull request #15333 from dashevchenko/efentoOpt

Performance and reliability improvements for Efento message processing
pull/15399/head
Viacheslav Klimov 6 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) { 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(); boolean batteryStatus = protoMeasurements.getBatteryStatus();
int measurementPeriodBase = protoMeasurements.getMeasurementPeriodBase(); int measurementPeriodBase = protoMeasurements.getMeasurementPeriodBase();
int measurementPeriodFactor = protoMeasurements.getMeasurementPeriodFactor(); int measurementPeriodFactor = protoMeasurements.getMeasurementPeriodFactor();
@ -258,6 +258,9 @@ public class CoapEfentoTransportResource extends AbstractCoapTransportResource {
} }
Map<Long, JsonObject> valuesMap = new TreeMap<>(); 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++) { for (int channel = 0; channel < channelsList.size(); channel++) {
ProtoChannel protoChannel = channelsList.get(channel); ProtoChannel protoChannel = channelsList.get(channel);
List<Integer> sampleOffsetsList = protoChannel.getSampleOffsetsList(); List<Integer> sampleOffsetsList = protoChannel.getSampleOffsetsList();
@ -271,6 +274,10 @@ public class CoapEfentoTransportResource extends AbstractCoapTransportResource {
long measurementPeriodMillis = TimeUnit.SECONDS.toMillis(measurementPeriod); long measurementPeriodMillis = TimeUnit.SECONDS.toMillis(measurementPeriod);
long startTimestampMillis = TimeUnit.SECONDS.toMillis(protoChannel.getTimestamp()); 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++) { for (int i = 0; i < sampleOffsetsList.size(); i++) {
int sampleOffset = sampleOffsetsList.get(i); int sampleOffset = sampleOffsetsList.get(i);
if (isSensorError(sampleOffset)) { if (isSensorError(sampleOffset)) {
@ -290,22 +297,16 @@ public class CoapEfentoTransportResource extends AbstractCoapTransportResource {
} }
long sampleOffsetMillis = TimeUnit.SECONDS.toMillis(sampleOffset); long sampleOffsetMillis = TimeUnit.SECONDS.toMillis(sampleOffset);
long measurementTimestamp = startTimestampMillis + Math.abs(sampleOffsetMillis); long measurementTimestamp = startTimestampMillis + Math.abs(sampleOffsetMillis);
values = valuesMap.computeIfAbsent(measurementTimestamp - 1000, k -> values = valuesMap.computeIfAbsent(measurementTimestamp - 1000, k -> new JsonObject());
CoapEfentoUtils.setDefaultMeasurements(serialNumber, batteryStatus, measurementPeriod, nextTransmissionAtMillis, signal, k));
addBinarySample(protoChannel, currentIsOk, values, channel + 1, sessionId); addBinarySample(protoChannel, currentIsOk, values, channel + 1, sessionId);
} else { } else {
long timestampMillis = startTimestampMillis + i * measurementPeriodMillis; long timestampMillis = startTimestampMillis + i * measurementPeriodMillis;
values = valuesMap.computeIfAbsent(timestampMillis, k -> CoapEfentoUtils.setDefaultMeasurements( values = valuesMap.computeIfAbsent(timestampMillis, k -> new JsonObject());
serialNumber, batteryStatus, measurementPeriod, nextTransmissionAtMillis, signal, k));
addContinuesSample(protoChannel, sampleOffset, values, channel + 1, sessionId); 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() return valuesMap.entrySet().stream()
.map(entry -> new EfentoTelemetry(entry.getKey(), entry.getValue())) .map(entry -> new EfentoTelemetry(entry.getKey(), entry.getValue()))
.collect(Collectors.toList()); .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(); JsonObject values = new JsonObject();
values.addProperty("sw_version", protoDeviceInfo.getSwVersion()); values.addProperty("sw_version", protoDeviceInfo.getSwVersion());
@ -476,41 +477,86 @@ public class CoapEfentoTransportResource extends AbstractCoapTransportResource {
//modem info //modem info
DeviceInfoProtos.ProtoModem modem = protoDeviceInfo.getModem(); DeviceInfoProtos.ProtoModem modem = protoDeviceInfo.getModem();
values.addProperty("modem_types", modem.getType().toString()); DeviceInfoProtos.ModemType modemType = modem.getType();
values.addProperty("sc_EARNFCN_offset", modem.getParameters(0)); values.addProperty("modem_types", modemType.toString());
values.addProperty("sc_EARFCN", modem.getParameters(1)); values.addProperty("sim_card_identification", modem.getSimCardIdentification());
values.addProperty("sc_PCI", modem.getParameters(2)); values.addProperty("firmware_version", modem.getFirmwareVersion().toString());
values.addProperty("sc_Cell_id", modem.getParameters(3)); values.addProperty("modem_identification", modem.getModemIdentification());
values.addProperty("sc_RSRP", modem.getParameters(4)); if (modem.getModemStatisticsCount() >= 4) {
values.addProperty("sc_RSRQ", modem.getParameters(5)); values.addProperty("modem_transmissions_count", modem.getModemStatistics(0));
values.addProperty("sc_RSSI", modem.getParameters(6)); values.addProperty("modem_time_since_last_devinfo", modem.getModemStatistics(1));
values.addProperty("sc_SINR", modem.getParameters(7)); values.addProperty("modem_total_psm_time", modem.getModemStatistics(2));
values.addProperty("sc_Band", modem.getParameters(8)); values.addProperty("modem_total_active_time", modem.getModemStatistics(3));
values.addProperty("sc_TAC", modem.getParameters(9)); }
values.addProperty("sc_ECL", modem.getParameters(10)); switch (modemType) {
values.addProperty("sc_TX_PWR", modem.getParameters(11)); case MODEM_TYPE_BC660:
values.addProperty("op_mode", modem.getParameters(12)); values.addProperty("sc_EARFCN", modem.getParameters(0));
values.addProperty("nc_EARFCN", modem.getParameters(13)); values.addProperty("sc_EARNFCN_offset", modem.getParameters(1));
values.addProperty("nc_EARNFCN_offset", modem.getParameters(14)); values.addProperty("sc_PCI", modem.getParameters(2));
values.addProperty("nc_PCI", modem.getParameters(15)); values.addProperty("sc_Cell_id", modem.getParameters(3));
values.addProperty("nc_RSRP", modem.getParameters(16)); values.addProperty("sc_RSRP", modem.getParameters(4));
values.addProperty("RLC_UL_BLER", modem.getParameters(17)); values.addProperty("sc_RSRQ", modem.getParameters(5));
values.addProperty("RLC_DL_BLER", modem.getParameters(18)); values.addProperty("sc_RSSI", modem.getParameters(6));
values.addProperty("MAC_UL_BLER", modem.getParameters(19)); values.addProperty("sc_SINR", modem.getParameters(7));
values.addProperty("MAC_DL_BLER", modem.getParameters(20)); values.addProperty("sc_Band", modem.getParameters(8));
values.addProperty("MAC_UL_TOTAL_BYTES", modem.getParameters(21)); values.addProperty("sc_TAC", modem.getParameters(9));
values.addProperty("MAC_DL_TOTAL_BYTES", modem.getParameters(22)); values.addProperty("sc_ECL", modem.getParameters(10));
values.addProperty("MAC_UL_total_HARQ_Tx", modem.getParameters(23)); values.addProperty("sc_TX_PWR", modem.getParameters(11));
values.addProperty("MAC_DL_total_HARQ_Tx", modem.getParameters(24)); values.addProperty("op_mode", modem.getParameters(12));
values.addProperty("MAC_UL_HARQ_re_Tx", modem.getParameters(25)); values.addProperty("nc_EARFCN", modem.getParameters(13));
values.addProperty("MAC_DL_HARQ_re_Tx", modem.getParameters(26)); values.addProperty("nc_PCI", modem.getParameters(14));
values.addProperty("RLC_UL_tput", modem.getParameters(27)); values.addProperty("nc_RSRP", modem.getParameters(15));
values.addProperty("RLC_DL_tput", modem.getParameters(28)); values.addProperty("nc_RSRQ", modem.getParameters(16));
values.addProperty("MAC_UL_tput", modem.getParameters(29)); values.addProperty("sleep_duration", modem.getParameters(17));
values.addProperty("MAC_DL_tput", modem.getParameters(30)); values.addProperty("rx_time", modem.getParameters(18));
values.addProperty("sleep_duration", modem.getParameters(31)); values.addProperty("tx_time", modem.getParameters(19));
values.addProperty("rx_time", modem.getParameters(32)); values.addProperty("PLMN_state", modem.getParameters(20));
values.addProperty("tx_time", modem.getParameters(33)); 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 //Runtime info
DeviceInfoProtos.ProtoRuntime runtimeInfo = protoDeviceInfo.getRuntimeInfo(); 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_non_confirmable_messages_attempts", runtimeInfo.getMessageCounters(1));
values.addProperty("counter_of_succeeded_messages", runtimeInfo.getMessageCounters(2)); values.addProperty("counter_of_succeeded_messages", runtimeInfo.getMessageCounters(2));
values.addProperty("min_battery_mcu_temp", runtimeInfo.getMinBatteryMcuTemperature()); 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("min_mcu_temp", runtimeInfo.getMinMcuTemperature());
values.addProperty("runtime_errors", runtimeInfo.getRuntimeErrorsCount()); values.addProperty("runtime_errors", runtimeInfo.getRuntimeErrorsCount());
values.addProperty("up_time", runtimeInfo.getUpTime()); values.addProperty("up_time", runtimeInfo.getUpTime());
@ -529,8 +575,8 @@ public class CoapEfentoTransportResource extends AbstractCoapTransportResource {
return new EfentoTelemetry(System.currentTimeMillis(), values); return new EfentoTelemetry(System.currentTimeMillis(), values);
} }
private JsonElement getEfentoConfiguration(byte[] bytes) throws InvalidProtocolBufferException { JsonElement getEfentoConfiguration(byte[] bytes) throws InvalidProtocolBufferException {
return parseString(ProtoConverter.dynamicMsgToJson(bytes, ConfigProtos.getDescriptor().getMessageTypes().get(2))); return parseString(ProtoConverter.dynamicMsgToJson(bytes, ConfigProtos.getDescriptor().getMessageTypes().get(0)));
} }
private static String getDate(long seconds) { 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))); 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(); JsonObject values = new JsonObject();
values.addProperty("serial", serialNumber); values.addProperty("serial", serialNumber);
values.addProperty("battery", batteryStatus ? "ok" : "low"); values.addProperty("battery", batteryStatus ? "ok" : "low");
values.addProperty("measured_at", convertTimestampToUtcString(startTimestampMillis));
values.addProperty("next_transmission_at", convertTimestampToUtcString(nextTransmissionAtMillis)); values.addProperty("next_transmission_at", convertTimestampToUtcString(nextTransmissionAtMillis));
values.addProperty("signal", signal); values.addProperty("signal", signal);
values.addProperty("measurement_interval", measurementPeriod);
return values; return values;
} }

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

@ -15,338 +15,471 @@
*/ */
syntax = "proto3"; syntax = "proto3";
import "efento/proto_measurement_types.proto";
import "efento/proto_rule.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_package = "org.thingsboard.server.gen.transport.coap";
option java_outer_classname = "ConfigProtos"; option java_outer_classname = "ConfigProtos";
/* Message containing optional channels control parameters */ message ProtoConfig {
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;
/* Default behavior - faster advertising when measurement period is < 15s. */ /* RESERVED FIELDS ---------------------------------------------------------------------------------------------------------- */
BLE_ADVERTISING_PERIOD_MODE_DEFAULT = 1;
/* User-configured normal interval is used. */ reserved 1,48;
BLE_ADVERTISING_PERIOD_MODE_NORMAL = 2;
/* User-configured fast interval is used. */ /* DEVICE STATUS FIELDS ----------------------------------------------------------------------------------------------------- */
BLE_ADVERTISING_PERIOD_MODE_FAST = 3;
}
/* Message containing BLE advertising period configuration */ /* Serial number of the device. *
message ProtoBleAdvertisingPeriod { * Length: 6 bytes. *
* This field is only sent by the device. *
* Status: In use [06.00 - LATEST] */
bytes serial_number = 25;
/* BLE advertising mode: */ /* Configuration payload split information: *
/* - 1: Default, BLE advertising interval is set to 1022.5ms or some lower value, based on continuous measurement period. */ * - Values < 0 - Payload split, expect another part of the payload in the next message. *
/* - 2: Normal, uses user-configured value from 'normal' field. */ * The absolute value indicates an index of the current message *
/* - 3: Fast, uses user-configured value from 'fast' field (must be lower than or equal to 'normal' field). */ * - Values = 0 - Payload not split *
BleAdvertisingPeriodMode mode = 1; * - 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. */ /* Identifier of the current configuration. *
/* Range: [32:16384] */ * The value of this field changes with every configuration change. *
uint32 normal = 2; * 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. */ /* NvM status: *
/* Range: [32:16384] */ * - 1 - Defaults restored on CRC error: default sensor configuration restored due to the non-volatile memory configuration *
uint32 fast = 3; * 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 */ /* REQUEST FIELDS ----------------------------------------------------------------------------------------------------------- */
/* 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 */ /* Specifies whether the device should accept the configuration without functional testing (e.g., network connection). *
message ProtoConfig { * 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 */ /* Specifies, if the modem firmware update is available. *
/* repeated Threshold thresholds = 1; */ * String up to 48 characters: *
* - DFOTA URL - For use by BC66/BC660 modem. *
/* 'Measurement_period_base' and 'measurement_period_factor' define how often the measurements are taken. */ * This field is only sent by the user/server. *
/* Sensors of 'Continuous' type take measurement each Measurement_period_base * measurement_period_factor. */ * Status: In use [07.00.00 - LATEST] / Previously as modem_update_request [06.08.00 - 06.xx.xx] */
/* Sensors of 'Binary' type take measurement each Measurement_period_base. */ string update_modem_request = 45;
/* 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. */ /* Device will erase all measurements from memory. *
/* For backward compatibility with versions 5.x in case of continues sensors, if the measurement_period_factor is */ * This field is only sent by the user/server. *
/* not sent (equal to 0), then the default value '1' shall be used for period calculation. */ * Status: In use [07.00.00 - LATEST] / Previously as memory_reset_request [06.00 - 06.xx.xx] */
/* measurement period base in seconds */ bool reset_memory_request = 30;
/* Range [1:65535] - minimum value can vary depends on installed sensors */
/* 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; uint32 measurement_period_base = 2;
/* Measurement period factor */ /* Measurement period factor. *
/* Range [1:65535] - minimum value can vary depends on installed sensors */ * 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; uint32 measurement_period_factor = 26;
/* Transmission interval in seconds. Range: [60:604800] */ /* BLUETOOTH CONFIGURATION -------------------------------------------------------------------------------------------------- */
uint32 transmission_interval = 3;
/* BLE turnoff time in seconds. Once receiving this setting, BLE will be switched off after the set number of seconds. */ /* Bluetooth turn-off time: *
/* If BLE is already switched off, it will switch on for the set number of seconds and switch off afterwards. */ * - [60:604800] - Time in seconds after which Bluetooth is turned off *
/* Range [60:604800] and 0xFFFFFFFF */ * - 0xFFFFFFFF - Bluetooth is always on *
/* 0xFFFFFFFF - 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; uint32 ble_turnoff_time = 4;
/* ACK interval in seconds */ /* Bluetooth Tx power level. *
/* Range [180:2592000] and 0xFFFFFFFF */ * Value is the index of the absolute value of the Tx power, which depends on the BLE module. *
/* 0xFFFFFFFF - always request ACK */ * Range: [1:4] *
uint32 ack_interval = 5; * Group: Bluetooth Tx Power *
* Status: In use [06.02 - LATEST] */
/* Specifies, if the additional device info is requested. If true, sensor will send a message to endpoint '/i' with the */ uint32 ble_tx_power_level = 36;
/* 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;
/* PLMN selection */ /* Encryption key. *
/* Range: [100:999999] */ * Max length: 16 bytes. *
/* 0xFFFFFFFF or 1000000 - automatic selection */ * A one-element array containing only one 0x7F (DEL) byte disables encryption. *
uint32 plmn_selection = 17; * 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. */ /* Bluetooth advertising period. *
/* Range: [60:604800] (1 minute : 7 days) */ * Group: Bluetooth Advertising Period *
/* This field is only sent by server */ * Status: In use [06.13.00/06.21.00 - LATEST] */
uint32 disable_modem_request = 18; ProtoBleAdvertisingPeriod ble_advertising_period = 59;
/* If set, the device will send its configuration to the endpoint '/c' as a confirmable message */ /* Advertisement manufacturer specific data format. *
/* This field is only sent by server */ * Group: Advertisement Manufacturer Data Format *
bool request_configuration = 19; * Status: In use [07.00.00 - LATEST] */
AdvertisementManufacturerDataFormat advertisement_manufacturer_data_format = 60;
/* Device's error codes. */ /* EDGE LOGIC CONFIGURATION ------------------------------------------------------------------------------------------------- */
/* This field is only sent by device */
repeated uint32 errors = 20;
/* Identifier of current configuration - Every change of the configuration results in change of the value of this field */ /* Edge logic rules set on the device. *
/* This field is only sent by device */ * Up to 16 rules supported (previously 12 rules [06.00 - 07.01.xx]). *
uint32 hash = 21; * 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) */ /* Calendars set on the device. *
bool accept_without_testing = 22; * Up to 6 calendars supported. *
* Group: Calendar No. # *
* Status: In use [06.08.00 - LATEST] */
repeated ProtoCalendar calendars = 47;
/* Cloud token configuration: */ /* SERVER COMMUNICATION 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;
/* Cloud token that should be sent with each measurement frame */ /* Transmission interval in seconds. *
string cloud_token = 24; * Range: [60:604800] *
* Group: Server Intervals *
* Status: In use [06.00 - LATEST] */
uint32 transmission_interval = 3;
/* Serial number of the device */ /* ACK interval: *
/* This field is only sent by device */ * - [180:2592000] - Time in seconds after which the device will request an ACK *
bytes serial_number = 25; * - 0xFFFFFFFF - Always request ACK *
* Group: Server Intervals *
* Status: In use [06.00 - LATEST] */
uint32 ack_interval = 5;
/* Type of channel */ /* Server transfer limit: *
/* This field is only sent by device */ * - [1:65534] - Number of transfers *
repeated MeasurementType channel_types = 27; * - 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 */ /* Server transfer limit timer: *
repeated ProtoRule rules = 28; * - [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 */ /* Server supervision period: *
/* Range: [180:604800] */ * - [180:604800] - Time in seconds after which the device resets itself if there is no communication with the server *
/* 0xFFFFFFFF - Functionality disabled */ * - 0xFFFFFFFF - Server supervision disabled *
* Group: Server Supervision *
* Status: In use [06.00 - LATEST] */
uint32 supervision_period = 29; uint32 supervision_period = 29;
/* If true, sensor's measurement memory will be erased */ /* DATA SERVER CONFIGURATION ------------------------------------------------------------------------------------------------ */
bool memory_reset_request = 30;
/* Bytes 0-4 - Band selection mask. Mask = 1 << position */ /* Data server address. *
/* Band | 1 | 2 | 3 | 4 | 5 | 8 | 12 | 13 | 17 | 18 | 19 | 20 | 25 | 26 | 28 | 66 | 71 | 85 | */ * String up to 31 characters: *
/* Position: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | */ * - IPv4 address (examples: "18.184.24.239") [06.00 - 06.06.xx] *
/* example: To enable band 3, 8 and 20 set to (1 << 2) + (1 << 5) + (1 << 11) = 2084 */ * - IPv4/URL address (examples: "18.184.24.239", "efento.test.io") [06.07.00 - LATEST] *
uint32 modem_bands_mask = 31; * 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; 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; 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; 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; 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 */ /* UPDATE SERVER CONFIGURATION ---------------------------------------------------------------------------------------------- */
/* Range: [1:4] */
uint32 ble_tx_power_level = 36;
/* Deprecated field */ /* Update server address. *
/* If true, the sensor's runtime errors will be cleared */ * String up to 31 characters: *
bool request_runtime_errors_clear = 37; * - 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 */ /* Update server port for UDP transfer. *
uint32 error_timestamp = 38; * 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 */ /* Update server port for CoAP transfer. *
uint32 hash_timestamp = 39; * Range: [1:65535] *
* Group: Update Server *
* Status: In use [06.00 - LATEST] */
uint32 update_server_port_coap = 15;
/* Cloud token CoAP option ID: */ /* CLOUD CONFIGURATION ------------------------------------------------------------------------------------------------------ */
/* - [1:64999] - CoAP option ID containing cloud token */
/* - 65000 - cloud token sent in the payload */
uint32 cloud_token_coap_option = 40;
/* ECDSA payload signature CoAP option ID: */ /* Cloud token configuration: *
/* - [1:64999] - CoAP option ID containing ECDSA payload signature */ * - 1 - Cloud token set to the value of the 'cloud_token' field *
/* - 65000 - no payload signature in CoAP option */ * - 2 - Cloud token set to the modem identification (IMEI for cellular modems) *
uint32 payload_signature_coap_option = 41; * - 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 */ /* Cloud token that should be sent with each measurement frame. *
/* Note: when setting less than four octets the remaining will be filled with zeros. */ * String up to 36 characters. *
repeated uint32 dns_server_ip = 42; * Group: Cloud Token *
* Status: In use [06.00 - LATEST] */
string cloud_token = 24;
/* DNS TTL configuration: */ /* Cloud token CoAP option ID: *
/* - [1:864000] - custom TTL in seconds (additionally, the DNS request when communication has failed) */ * - [1:64999] - CoAP option ID with cloud token *
/* - 864001 - accept TTL from the DNS server (additionally, the DNS request when communication has failed) */ * - 65000 - Cloud token sent in the payload *
/* - 864002 - DNS request is only after communication failed */ * Group: Cloud Token *
uint32 dns_ttl_config = 43; * Status: In use [06.07.00 - LATEST] */
uint32 cloud_token_coap_option = 40;
/* Configuration payload split information. Information about dividing the payload into parts */ /* ECDSA payload signature CoAP option ID: *
/* values < 0 - payload has been split, expect another part of the payload in the next message. */ * - [1:64999] - CoAP option ID with payload signature *
/* The absolute value indicates an index of the current message. */ * - 65000 - Payload signature is not sent *
/* value = 0 - payload has not been splitted */ * Group: Cloud Token *
/* values > 0 - last part of the split payload, the value indicates the total number of the messages sent */ * Status: In use [06.07.00 - LATEST] */
sint32 payload_split_info = 44; uint32 payload_signature_coap_option = 41;
/* Modem update request (string - max length 48) */ /* Modem identification CoAP option ID: *
/* This field is only sent by server */ * - [1:64999] - CoAP option ID with modem identification *
/* For BC66 module, this field is a DFOTA URL */ * - 65000 - Modem identification is not sent *
string modem_update_request = 45; * Group: Cloud Token *
* Status: In use [07.00.00 - LATEST] */
uint32 modem_identification_coap_option = 52;
/* Cellular configuration parameters. */ /* NETWORK CONFIGURATION ---------------------------------------------------------------------------------------------------- */
/* 1st item - Number of used cellular parameters */
/* 2nd - 12th items - Cellular parameters */
repeated uint32 cellular_config_params = 46;
/* Calendar configuration. Up to 6 calendars are supported */ /* DNS server IP address. *
repeated ProtoCalendar calendars = 47; * 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 */ /* DNS TTL configuration: *
reserved 48; * - [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) *
/* Set/get calibration parameters for single channel. */ * - 864002 - DNS query only after communication failure *
ProtoCalibrationParameters calibration_parameters_request = 49; * Group: DNS *
* Status: In use [06.07.00 - LATEST] */
/* LED behaviour configuration: */ uint32 dns_ttl_config = 43;
/* 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;
/* Network troubleshooting configuration, if bluetooth is turned off and communication with the server is faulty, */ /* Network troubleshooting:
/* bluetooth will be automatically turned on until the connection is stabilized */ * - 1 - Network troubleshooting disabled *
/* - 1: network troubleshooting disabled */ * - 2 - Network troubleshooting enabled *
/* - 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; uint32 network_troubleshooting = 51;
/* Reserved by gateway client */ /* Network key. *
reserved 52, 53; * Max length: 16 bytes. *
* A one-element array containing only one 0x7F (DEL) byte disables network key. *
/* Encryption key configuration. Sensor sends in this field two last bytes of SHA256 hash calculated from its current */ * Device sends two last bytes of SHA256 hash of current key in this field. *
/* encryption_key configuration. When encryption key is disabled one byte 0x7F (DEL) is sent. */ * When the network key is disabled, the device sends a 0x7F (DEL) byte. *
/* Max length: 16 bytes. */ * Group: Local Network *
/* 0x7F - encryption key disabled. */ * Status: In use [07.00.00 - LATEST] */
bytes encryption_key = 54; bytes network_key = 53;
/* User name as string. Max length 31 */ /* MODEM CONFIGURATION ------------------------------------------------------------------------------------------------------ */
/* 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) */ /* APN (Access Point Name). *
string apn_user_name = 55; * 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 */ /* APN username. *
/* String with special character 0x7F (DEL) only indicates that automatic password is turn on */ * String up to 31 characters. *
/* Password can only be set to custom value if apn_user_name has been configured (is not automatic) */ * 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; string apn_password = 56;
/* Reserved by versions above 06.20.00 */ /* PLMN selection: *
reserved 57; * - [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 */ /* Modem bands mask. *
/* This field is only sent by server */ * 4-byte bit mask, where each bit represents a specific band: *
repeated ProtoOutputControlState output_control_state_request = 58; * 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. */ /* Modem configuration parameters. *
ProtoBleAdvertisingPeriod ble_advertising_period = 59; * 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_package = "org.thingsboard.server.gen.transport.coap";
option java_outer_classname = "DeviceInfoProtos"; 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 enum ModemType
{ {
/* Invalid value */ /* Invalid value. */
MODEM_TYPE_UNSPECIFIED = 0; MODEM_TYPE_UNSPECIFIED = 0;
/* Quectel BC66 modem */ /* Quectel BC66 modem. */
MODEM_TYPE_BC66 = 1; MODEM_TYPE_BC66 = 1;
/* Quectel BC66-NA modem */ /* Quectel BC66-NA modem. */
MODEM_TYPE_BC66NA = 2; 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) */ /* Unable to read firmware version from device. */
uint32 up_time = 1; MODEM_FIRMWARE_VERSION_READING_ERROR = 1;
/* Message counters (since reset). There are 3 counters: */ /* Unknown firmware version. */
/* message_counters[0] - Counter of confirmable messages attempts */ MODEM_FIRMWARE_VERSION_UNKNOWN = 2;
/* message_counters[1] - Counter of non-confirmable messages attempts */
/* message_counters[2] - Counter of succeeded messages */
repeated uint32 message_counters = 2;
/* MCU temperature in Celsius */ /* BC660KGLAAR01A05_01.002.01.002. */
sint32 mcu_temperature = 3; MODEM_FIRMWARE_VERSION_BC660_V1 = 3;
/* Minimum battery voltage in mV */ /* BC660KGLAAR01A05_01.200.01.200. */
uint32 min_battery_voltage = 4; MODEM_FIRMWARE_VERSION_BC660_V2 = 4;
/* MCU temperature in Celsius, while the minimum battery voltage was reached */ /* BC660KGLAAR01A05_01.202.01.202. */
sint32 min_battery_mcu_temperature = 5; MODEM_FIRMWARE_VERSION_BC660_V3 = 5;
/* Battery reset timestamp (Unix timestamp) */ /* BC660KGLAAR01A05_01.203.01.203. */
uint32 battery_reset_timestamp = 6; MODEM_FIRMWARE_VERSION_BC660_V4 = 6;
/* Max MCU temperature in Celsius */ /* BC660KGLAAR01A05_01.204.01.204. */
sint32 max_mcu_temperature = 7; MODEM_FIRMWARE_VERSION_BC660_V5 = 7;
/* Min MCU temperature in Celsius */ /* BC660KGLAAR01A05_01.205.01.205. */
sint32 min_mcu_temperature = 8; MODEM_FIRMWARE_VERSION_BC660_V6 = 8;
/* Table of runtime errors. Max length: 20 */ /* BC660KGLAAR01A05_01.301.01.301. */
repeated uint32 runtime_errors = 9; MODEM_FIRMWARE_VERSION_BC660_V7 = 9;
/* BC660KGLAAR01A05_01.303.01.303. */
MODEM_FIRMWARE_VERSION_BC660_V8 = 10;
} }
message ProtoModem message ProtoModem
{ {
/* Modem type. *
* Status: In use [06.00 - LATEST] */
ModemType type = 1; ModemType type = 1;
/* Parameters for BC66 modem: */ /* Modem runtime parameters. *
/* parameters[0] - sc_EARFCN - Range: [0:262143]. Unknown value: -1 */ * For BC66 modem (34 parameters): *
/* parameters[1] - sc_EARNFCN_offset - Range: [0:4] mapped to [-2, -1, -0.5, 0, 1]. Unknown value: -1 */ * - 1st item - sc_EARFCN. Range: [0:262143]. Unknown value: -1 *
/* parameters[2] - sc_PCI - Range: [0:502]. Unknown value: -1 */ * - 2nd item - sc_EARNFCN_offset. Range: [0:4] mapped to [-2, -1, -0.5, 0, 1]. Unknown value: -1 *
/* parameters[3] - sc_Cell id - Range: [1:268435456]. Unknown value: 0 */ * - 3rd item - sc_PCI. Range: [0:502]. Unknown value: -1 *
/* parameters[4] - sc_RSRP - [dBm] - Range: [-140:-44]. Unknown value: 0 */ * - 4th item - sc_Cell_Id. Range: [1:268435456]. Unknown value: 0 *
/* parameters[5] - sc_RSRQ - [dB] - Range: [-20:-3]. Unknown value: 0 */ * - 5th item - sc_RSRP [dBm]. Range: [-140:-44]. Unknown value: 0 *
/* parameters[6] - sc_RSSI - [dBm] - Range: [-110:-3] Unknown value: 0 */ * - 6th item - sc_RSRQ [dB]. Range: [-20:-3]. Unknown value: 0 *
/* parameters[7] - sc_SINR - [dB] - Range: [-10:30]. Unknown value: 31 */ * - 7th item - sc_RSSI [dBm]. Range: [-110:-3] Unknown value: 0 *
/* parameters[8] - sc_Band - Range: [see module supported bands]. The current serving cell band. Unknown value: -1 */ * - 8th item - sc_SINR [dB]. Range: [-10:30]. Unknown value: 31 *
/* parameters[9] - sc_TAC - Range: [0:65536]. Unknown value: -1 */ * - 9th item - sc_Band. Range: [see module supported bands]. The current serving cell band. Unknown value: -1 *
/* parameters[10] - sc_ECL - Range: [0:2]. Unknown value: -1 */ * - 10th item - sc_TAC. Range: [0:65536]. Unknown value: -1 *
/* parameters[11] - sc_TX_PWR - [0.1cBm] - Range [-440:230]. Unknown value: -1000 */ * - 11th item - sc_ECL. Range: [0:2]. Unknown value: -1 *
/* parameters[12] - OP_MODE - Range: [0:3]. Unknown value: -1 */ * - 12th item - sc_TX_PWR [0.1dBm]. Range [-440:230]. Unknown value: -1000 *
/* parameters[13] - nc_EARFCN - Range: [0:262143]. Unknown value: -1 */ * - 13th item - OP_MODE. Range: [0:3]. Unknown value: -1 *
/* parameters[14] - nc_EARNFCN_offset - Range: [0:4] mapped to [-2, -1, -0.5, 0, 1]. Unknown value: -1 */ * - 14th item - nc_EARFCN. Range: [0:262143]. Unknown value: -1 *
/* parameters[15] - nc_PCI - Range: [0:502]. Unknown value: -1 */ * - 15th item - nc_EARNFCN_offset. Range: [0:4] mapped to [-2, -1, -0.5, 0, 1]. Unknown value: -1 *
/* parameters[16] - nc_RSRP - [dBm] - Range: [-140:-44]. Unknown value: 0 */ * - 16th item - nc_PCI. Range: [0:502]. Unknown value: -1 *
/* parameters[17] - RLC_UL_BLER - Range: [0:100]. Unknown value: -1 */ * - 17th item - nc_RSRP [dBm]. Range: [-140:-44]. Unknown value: 0 *
/* parameters[18] - RLC_DL_BLER - Range: [0:100]. Unknown value: -1 */ * - 18th item - RLC_UL_BLER. Range: [0:100]. Unknown value: -1 *
/* parameters[19] - MAC_UL_BLER - Range: [0:100]. Unknown value: -1 */ * - 19th item - RLC_DL_BLER. Range: [0:100]. Unknown value: -1 *
/* parameters[20] - MAC_DL_BLER - Range: [0:100]. Unknown value: -1 */ * - 20th item - MAC_UL_BLER. Range: [0:100]. Unknown value: -1 *
/* parameters[21] - MAC_UL_TOTAL_BYTES - Range: [0:2147483647]. Unknown value: -1 */ * - 21th item - MAC_DL_BLER. Range: [0:100]. Unknown value: -1 *
/* parameters[22] - MAC_DL_TOTAL_BYTES - Range: [0:2147483647]. Unknown value: -1 */ * - 22th item - MAC_UL_TOTAL_BYTES. Range: [0:2147483647]. Unknown value: -1 *
/* parameters[23] - MAC_UL_total_HARQ_Tx - Range: [0:2147483647]. Unknown value: -1 */ * - 23th item - MAC_DL_TOTAL_BYTES. Range: [0:2147483647]. Unknown value: -1 *
/* parameters[24] - MAC_DL_total_HARQ_Tx - Range: [0:2147483647]. Unknown value: -1 */ * - 24th item - MAC_UL_total_HARQ_Tx. Range: [0:2147483647]. Unknown value: -1 *
/* parameters[25] - MAC_UL_HARQ_re_Tx - Range: [0:2147483647]. Unknown value: -1 */ * - 25th item - MAC_DL_total_HARQ_Tx. Range: [0:2147483647]. Unknown value: -1 *
/* parameters[26] - MAC_DL_HARQ_re_Tx - Range: [0:2147483647]. Unknown value: -1 */ * - 26th item - MAC_UL_HARQ_re_Tx. Range: [0:2147483647]. Unknown value: -1 *
/* parameters[27] - RLC_UL_tput - Range: [0:2147483647]. Unknown value: -1 */ * - 27th item - MAC_DL_HARQ_re_Tx. Range: [0:2147483647]. Unknown value: -1 *
/* parameters[28] - RLC_DL_tput - Range: [0:2147483647]. Unknown value: -1 */ * - 28th item - RLC_UL_tput. Range: [0:2147483647]. Unknown value: -1 *
/* parameters[29] - MAC_UL_tput - Range: [0:2147483647]. Unknown value: -1 */ * - 29th item - RLC_DL_tput. Range: [0:2147483647]. Unknown value: -1 *
/* parameters[30] - MAC_DL_tput - Range: [0:2147483647]. Unknown value: -1 */ * - 30th item - MAC_UL_tput. Range: [0:2147483647]. Unknown value: -1 *
/* parameters[31] - sleep_duration - [0.1s] - Range: [0:2147483647]. Unknown value: -1 */ * - 31th item - MAC_DL_tput. Range: [0:2147483647]. Unknown value: -1 *
/* parameters[32] - Rx_time - [0.1s] - Range: [0:2147483647]. Unknown value: -1 */ * - 32th item - sleep_duration [0.1s]. Range: [0:2147483647]. Unknown value: -1 *
/* parameters[33] - Tx_time - [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; repeated sint32 parameters = 2;
/* ICCID of inserted/soldered sim card. String up to 22 characters long. */ /* Integrated Circuit Card Identifier (ICCID) of the inserted/soldered SIM card. *
/* 0x7F if sim card is not detected, empty (not sent) if device does not have modem. */ * String up to 22 characters: *
/* This field is only sent by device */ * 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; 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) */ /* RESERVED FIELDS ---------------------------------------------------------------------------------------------------------- */
uint32 timestamp = 1;
/* Update status, possible values: */ reserved 2,4,5,6,7,8,9,10,11,12;
/* - 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;
}
message ProtoDeviceInfo /* DEVICE STATUS FIELDS ----------------------------------------------------------------------------------------------------- */
{
/* Serial number of device */ /* Serial number of the device. *
bytes serial_num = 1; * 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 */ /* DEVICE INFORMATION FIELDS ------------------------------------------------------------------------------------------------ */
reserved 2;
/* 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; uint32 sw_version = 3;
/* Deprecated fields */ /* Software commit ID and LTS version. *
reserved 4,5,6,7,8,9,10,11,12; * 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; 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; ProtoModem modem = 14;
/* String up to 7 bytes long. Software commit id e.g. "e0e8556" */ /* SERVER COMMUNICATION FIELDS ---------------------------------------------------------------------------------------------- */
/* 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;
/* 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; string cloud_token = 16;
/* Memory statistics: */ /* Enclosure tamper alert: *
/* memory_statistics[0] - Status of Nv storage: */ * - 0 - Inactive *
/* - 0 - Nv storage hasn't errors */ * - 1 - Active (enclosure opened) *
/* - 1 - Nv storage has some corrupted packet. Memory is read-only */ * - 2 - Inactive, was active (enclosure closed) *
/* - 2 - Nv storage is corrupted. Memory is unavailable */ * The transition from 'Inactive, was active' to 'Inactive' occurs after the alert has been successfully sent to the server *
/* memory_statistics[1] - Timestamp of the end of collecting statistics. */ * or the user has reset the alert via Bluetooth. *
/* Value in seconds since UNIX EPOCH 01-01-1970. Undefined value: 4294967295 */ * This field is only sent during server communication. *
/* memory_statistics[2] - Capacity of memory in bytes */ * Status: In use [07.00.01 - LATEST] */
/* memory_statistics[3] - Used space in bytes */ uint32 enclosure_tamper_alert = 19;
/* 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;
} }

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"; option java_outer_classname = "MeasurementTypeProtos";
enum MeasurementType { enum MeasurementType {
/* [] - No sensor on the channel */
/* [] - No sensor on the channel. */
MEASUREMENT_TYPE_NO_SENSOR = 0; 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; 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; 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; 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; MEASUREMENT_TYPE_DIFFERENTIAL_PRESSURE = 4;
/* Sign indicates state: (+) ALARM, (-) OK. Type: Binary */ /* Sign indicates state: (+) Alarm, (-) OK. Type: Binary. */
MEASUREMENT_TYPE_OK_ALARM = 5; MEASUREMENT_TYPE_OK_ALARM = 5;
/* [IAQ] - IAQ index. Resolution 1IAQ. Range [0:500]. To get IAQ index the value should be divided by 3. */ /* [IAQ] - IAQ index. Air quality. Resolution: 1IAQ. Range: [0:500]. Type: Continuous. *
/* Sensor return also calibration status as metadata (is the remainder when the absolute value is divided by 3): */ * To obtain the IAQ index, the measurement value should be divided by 3. *
/* - 0: Calibration required (sensor returns not accurate values) */ * Measurement also includes calibration status as metadata (is the remainder of the absolute value divided by 3): *
/* - 1: Calibration on-going (sensor returns not accurate values) */ * - 0 - Calibration required (sensor returns not accurate values) *
/* - 2: Calibration done (best accuracy of IAQ sensor) */ * - 1 - Calibration on-going (sensor returns not accurate values) *
/* Type: Continuous */ * - 2 - Calibration done (best accuracy of IAQ sensor) */
MEASUREMENT_TYPE_IAQ = 6; 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; 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; 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; 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; 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; 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; 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; 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; 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; MEASUREMENT_TYPE_AMBIENT_LIGHT = 15;
/* [µg/m^3] - Micro gram per cubic meter. Resolution 1µg/m^3. Range [0:1000]. */ /* [µg/m^3] - Microgram per cubic meter. Particles with an aerodynamic diameter of less than 1 micrometers. *
/* Particles with an aerodynamic diameter less than 1 micrometer. Type: Continuous */ * Resolution: 1µg/m^3. Range: [0:1000]. Type: Continuous. */
MEASUREMENT_TYPE_PM_1_0 = 16; MEASUREMENT_TYPE_PM_1_0 = 16;
/* [µg/m^3] - Micro gram per cubic meter. Resolution 1µg/m^3. Range [0:1000]. */ /* [µg/m^3] - Microgram per cubic meter. Particles with an aerodynamic diameter of less than 2.5 micrometers. *
/* Particles with an aerodynamic diameter less than 2.5 micrometers. Type: Continuous */ * Resolution: 1µg/m^3. Range: [0:1000]. Type: Continuous. */
MEASUREMENT_TYPE_PM_2_5 = 17; MEASUREMENT_TYPE_PM_2_5 = 17;
/* [µg/m^3] - Micro gram per cubic meter. Resolution 1µg/m^3. Range [0:1000]. */ /* [µg/m^3] - Microgram per cubic meter. Particles with an aerodynamic diameter of less than 10 micrometers. *
/* Particles with an aerodynamic diameter less than 10 micrometers. Type: Continuous */ * Resolution: 1µg/m^3. Range: [0:1000]. Type: Continuous. */
MEASUREMENT_TYPE_PM_10_0 = 18; 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; 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; 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; 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; 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; 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; 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; 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; 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; 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. */ /* [sIAQ] - Static IAQ index. Air quality. Resolution: 1sIAQ. Range: [0:10000]. Type: Continuous. *
/* Sensor return also calibration status as metadata (is the remainder when the absolute value is divided by 3): */ * To obtain the static IAQ index, the measurement value should be divided by 3. *
/* - 0: Calibration required (sensor returns not accurate values) */ * Measurement also includes calibration status as metadata (is the remainder of the absolute value divided by 3): *
/* - 1: Calibration on-going (sensor returns not accurate values) */ * - 0 - Calibration required (sensor returns not accurate values) *
/* - 2: Calibration done (best accuracy of IAQ sensor) */ * - 1 - Calibration on-going (sensor returns not accurate values) *
/* Type: Continuous */ * - 2 - Calibration done (best accuracy of IAQ sensor) */
MEASUREMENT_TYPE_STATIC_IAQ = 28; MEASUREMENT_TYPE_STATIC_IAQ = 28;
/* [ppm] - Parts per million. Resolution 1ppm. Range [0:1000000]. CO2 equivalent. */ /* [ppm] - Parts per million. CO2 equivalent. Resolution: 1ppm. Range: [0:1000000]. Type: Continuous. *
/* To get CO2 equivalent the value should be divided by 3. */ * To obtain the CO2 equivalent, the measurement value should be divided by 3. *
/* Sensor return also calibration status as metadata (is the remainder when the absolute value is 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) */ * - 0 - Calibration required (sensor returns not accurate values) *
/* - 1: Calibration on-going (sensor returns not accurate values) */ * - 1 - Calibration on-going (sensor returns not accurate values) *
/* - 2: Calibration done (best accuracy of IAQ sensor) */ * - 2 - Calibration done (best accuracy of IAQ sensor) */
/* Type: Continuous */
MEASUREMENT_TYPE_CO2_EQUIVALENT = 29; MEASUREMENT_TYPE_CO2_EQUIVALENT = 29;
/* [ppm] - Parts per million. Resolution 1ppm. Range [0:100000]. Breath VOC estimate. */ /* [ppm] - Parts per million. Breath VOC estimate. Resolution: 1ppm. Range: [0:100000]. Type: Continuous. *
/* To get breath VOC estimate the value should be divided by 3. */ * To obtain the breath VOC estimate, the measurement value should be divided by 3. *
/* Sensor return also calibration status as metadata (is the remainder when the absolute value is 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) */ * - 0 - Calibration required (sensor returns not accurate values) *
/* - 1: Calibration on-going (sensor returns not accurate values) */ * - 1 - Calibration on-going (sensor returns not accurate values) *
/* - 2: Calibration done (best accuracy of IAQ sensor) */ * - 2 - Calibration done (best accuracy of IAQ sensor) */
/* Type: Continuous */
MEASUREMENT_TYPE_BREATH_VOC = 30; MEASUREMENT_TYPE_BREATH_VOC = 30;
/* Special measurement type reserved for cellular gateway. */ /* Reserved for the Shared Modem functionality. Type: Continuous. */
/* Type: Continuous */ MEASUREMENT_TYPE_SHARED_MODEM = 31;
MEASUREMENT_TYPE_CELLULAR_GATEWAY = 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; 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; 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; 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; 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; 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; 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; 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; 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; 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; MEASUREMENT_TYPE_CURRENT_PRECISE = 41;
/* Sign indicates state: (+) ON, (-) OFF. Type: Binary */ /* Sign indicates state: (+) ON, (-) OFF. Type: Binary. */
MEASUREMENT_TYPE_OUTPUT_CONTROL = 42; 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. * limitations under the License.
*/ */
syntax = "proto3"; syntax = "proto3";
import "efento/proto_measurement_types.proto"; import "efento/proto_measurement_types.proto";
option java_package = "org.thingsboard.server.gen.transport.coap"; option java_package = "org.thingsboard.server.gen.transport.coap";
@ -21,106 +22,166 @@ option java_outer_classname = "MeasurementsProtos";
message ProtoChannel { message ProtoChannel {
/* Type of channel */ /* Reserved fields. */
reserved 6,7,8;
/* Type of measurement. *
* Status: In use [06.00 - LATEST] */
MeasurementType type = 1; 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; int32 timestamp = 2;
/* Only used for 'Continuous' sensor types. Value used as the starting point for calculating the values of all */ /* Start point of measurement values. *
/* measurements in the package. */ * This is used as the base value for calculating the values of all channel measurements in the message. *
/* Format defined by 'MeasurementType' field */ * Used for 'Continuous' sensor types only. *
* Format is defined by 'MeasurementType' field. *
* Status: In use [06.00 - LATEST] */
sint32 start_point = 4; sint32 start_point = 4;
/* 'Continuous' sensor types */ /* Measurement value offsets. *
/* Value of the offset from the 'start_point' for each measurement in the package. The oldest sample first ([0]). */ * For 'Continuous' sensor types: *
/* 'sample_offsets' format defined by 'MeasurementType' field. */ * These are the values of the offsets from the 'start_point' for each channel measurement in the message. *
/* If the 'sample_offset' has a value from the range [8355840: 8388607], it should be interpreted as a sensor error code. */ * Format is defined by 'MeasurementType' field. The first sample is the oldest. *
/* In that case value of the 'start_point' field should not be added to this 'sample_offset'. See ES6-264 for error codes. */ * If the sample offset has a value in the range [8355840:8388607], it should be interpreted as a sensor error code. *
/* Example: MeasurementType = 1 (temperature), start_point = 100, sample_offsets[0] = 15, sample_offsets[1] = 20, */ * In this case, the value of the 'start_point' field should not be added to this sample offset. *
/* sample_offset[2] = 8388605 */ * Example: type = 1 (temperature) *
/* 1st sample in the package temperature value = 11.5 °C, 2nd sample in the package temperature value = 12 °C */ * start_point = 100 *
/* 3rd sample in the package has no temperature value. It has information about failure of MCP9808 (temperature) sensor. */ * sample_offsets[0] = 15, sample_offsets[1] = 20, sample_offsets[2] = 8388557 *
/* Calculating timestamps of the measurements: timestamp = 1606391700, measurement_period_base = 60, */ * timestamp = 1606391700 *
/* measurement_period_factor = 1. Timestamp of the 1st sample = 1606391700, timestamp of the 2nd sample = 1606391760, */ * measurement_period_base = 60 *
/* timestamp of the 3rd sample 1606391820 */ * measurement_period_factor = 1 *
* 1st measurement is the temperature value = 11.5°C, measured at 1606391700 *
/* 'Binary' sensor types: */ * 2nd measurement is the temperature value = 12°C, measured at 1606391760 *
/* Absolute value of the 'sample_offsets' field indicates the offset in seconds from 'timestamp' field. */ * 3rd measurement is the error code (failure of the SHT4x temperature sensor), measured at 1606391820 *
/* Sign (- or +) indicates the state of measurements depending on the sensor type. */ * For 'Binary' sensor types: *
/* Value of this field equals to '1' or '-1' indicates the state at the 'timestamp'. Other values */ * The absolute value of the sample offset minus 1 is the offset in seconds from the 'timestamp' field. *
/* indicate the state of the relay at the time (in seconds) equal to 'timestamp' + absolute value -1. */ * Sign (- or +) indicates the state of the measurement depending on the sensor type. *
/* Values of this field are incremented starting from 1 (1->0: state at the time */ * The first and the last samples define the time range of the measurements. *
/* of 'timestamp', 2->1: state at the time equal to 'timestamp' + 1 s, 3->2 : */ * Only state changes within the time range are included in the 'sample_offsets' field. *
/* state at the time equal to 'timestamp' + 2 s, etc.). The first and the last sample define the time range of the */ * Example: type = 5 (OK/Alarm) *
/* measurements. Only state changes in the time range are included in the 'sample_offsets' field */ * sample_offsets[0] = 1, sample_offsets[1] = -9, sample_offsets[2] = 13 *
/* Examples: if 'timestamp' value is 1553518060 and 'sample_offsets' equals '1', it means that at 1553518060 the state */ * timestamp = 1606391700 *
/* was high, if 'timestamp' value is 1553518060 and 'sample_offsets' equals '-9', it means at 1553518068 the state was low */ * 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]; 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 { message ProtoMeasurements {
/* Serial number of the device */ /* RESERVED FIELDS ---------------------------------------------------------------------------------------------------------- */
bytes serial_num = 1;
reserved 10,11,12,13,14,15;
/* Battery status: true - battery ok, false - battery low */
bool battery_status = 2; /* DEVICE STATUS FIELDS ----------------------------------------------------------------------------------------------------- */
/* 'Measurement_period_base' and 'measurement_period_factor' define how often the measurements are taken. */ /* Serial number of the device. *
/* Sensors of 'Continuous' type take measurement each Measurement_period_base * measurement_period_factor. */ * Length: 6 bytes. *
/* Sensors of 'Binary' type take measurement each Measurement_period_base. */ * Status: In use [07.00.00 - LATEST] / Previously as serial_num [06.00 - 06.xx.xx] */
/* For backward compatibility with versions 5.x in case of binary/mixed sensors, if the 'measurement_period_factor' is */ bytes serial_number = 1;
/* 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 */ /* Identifier of the current configuration. *
/* not sent (equal to 0), then the default value '1' shall be used for period calculation. */ * The value of this field changes with every configuration change. *
/* measurement period base in seconds */ * 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; uint32 measurement_period_base = 3;
/* Measurement period factor */ /* Measurement period factor. *
* Status: In use [06.00 - LATEST] */
uint32 measurement_period_factor = 8; uint32 measurement_period_factor = 8;
/* Measurements grouped by channel. *
* Status: In use [06.00 - LATEST] */
repeated ProtoChannel channels = 4; repeated ProtoChannel channels = 4;
/* Timestamp of the next scheduled transmission. If the device will not send data until this time, */ /* SERVER COMMUNICATION FIELDS ---------------------------------------------------------------------------------------------- */
/* it should be considered as 'lost' */
/* 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; uint32 next_transmission_at = 5;
/* Reason of transmission - unsigned integer where each bit indicates different possible communication reason. */ /* Reason for transmission. *
/* Can be more than one: */ * Bitmask, where each bit represents a specific reason for initiating communication (multiple reasons can be active *
/* - bit 0: first message after sensor reset */ * simultaneously): *
/* - bit 1: user button triggered */ * - Bit 0 - First message after sensor reset *
/* - bit 2: user BLE triggered */ * - Bit 1 - User-triggered (button press) *
/* - bit 3-7: number of retries -> incremented after each unsuccessful transmission. Max value 31. */ * - Bit 2 - User-triggered (Bluetooth) *
/* Set to 0 after a successful transmission. */ * - Bit 3:7 - Number of retries - incremented after each failed transmission and reset upon success. Range: [0:31] *
/* - bit 8...19: rule 1...12 was met */ * - Bit 8:19 - Rule-based triggers (12 bits): *
/* - bit 20: triggered after the end of the limit */ * - [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; uint32 transfer_reason = 6;
/* Signal strength level mapped from RSSI: */ /* Signal strength (RSSI - Received Signal Strength Level): *
/* - 0: RSSI < -110 dBm */ * - 0 - RSSI < -110dBm *
/* - 1: -110 dBm <= RSSI < -109 dBm */ * - 1 - -110dBm <= RSSI < -109dBm *
/* - 2...61: -109 <= RSSI < -108 dBm ... -50 dBm <= RSSI < -49 dBm */ * - 2:61 - -109dBm <= RSSI < -108dBm ... -50dBm <= RSSI < -49dBm *
/* - 62: -49 dBm <= RSSI < -48 dBm */ * - 62 - -49dBm <= RSSI < -48dBm *
/* - 63: RSSI >= -48 dBm */ * - 63 - RSSI >= -48dBm *
/* - 99: Not known or not detectable */ * - 99 - Unknown or undetectable *
* This field is only sent during server communication. *
* Status: Deprecated [06.00 - 06.xx.xx] */
uint32 signal = 7; uint32 signal = 7;
/* Hash of the current configuration. Hash value changes each time a device receives a new configuration */ /* Cloud token. *
uint32 hash = 9; * Can be empty, set to any user-defined value, or hold device IMEI. *
* String up to 36 characters. *
/* Optional string up to 36 bytes long. Can be set to any user define value or hold device's IMEI */ * This field is only sent during server communication. *
* Status: In use [06.00 - LATEST] */
string cloud_token = 16; 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_package = "org.thingsboard.server.gen.transport.coap";
option java_outer_classname = "ProtoRuleProtos"; option java_outer_classname = "ProtoRuleProtos";
/* Encoding A: used to set absolute values in the Rules (e.g. upper and lower threshold values) */ /* 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]. */ * - TEMPERATURE - [°C] Celsius degree. Resolution: 0.1°C. Range: [-273.2:4000.0] *
/* - HUMIDITY - [% RH] - Relative humidity. Resolution 1%. Range [0:100]. */ * - HUMIDITY - [% RH] Percentage (Relative humidity). Resolution: 1%. Range: [0:100] *
/* - ATMOSPHERIC_PRESSURE - [hPa] - Hectopascal (1hPa = 100Pa). Resolution 0.1hPa. Range: [1.0:2000.0]. */ * - ATMOSPHERIC_PRESSURE - [hPa] Hectopascal. Resolution: 0.1hPa. Range: [1.0:2000.0] *
/* - DIFERENTIAL_PRESSURE - [Pa] - Pascal. Resolution 1Pa. Range [-10000:10000] */ * - DIFERENTIAL_PRESSURE - [Pa] Pascal. Resolution: 1Pa. Range: [-10000:10000] *
/* - OK/ALARM - Not applicable */ * - OK_ALARM - Not applicable *
/* - IAQ - [IAQ] - IAQ index. Resolution 1IAQ. Range [0:500]. */ * - IAQ - [IAQ] IAQ index. Resolution: 1IAQ. Range: [0:500] *
/* - FLOODING - Not applicable */ * - FLOODING - Not applicable *
/* - PULSE_CNT - [NB] Number of pulses. Resolution 1 pulse. Range [0:8000000]. */ * - 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]. Average power consumption in period */ * - 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]. Average water flow in period. */ * - WATER_METER - [l/min] Liter per minute. Resolution: 1l/min. Range: [0:8000000]. Period average water *
/* - SOIL_MOISTURE - [kPa] - Kilopascal (1kPa = 1000Pa); Resolution 1kPa. Range [-1000:0]. Soil moisture (tension). */ * - SOIL_MOISTURE - [kPa] Kilopascal. Resolution: 1kPa. Range: [-1000:0] *
/* - CO_GAS - [ppm] - Parts per million. Resolution 1ppm. Range [0:1000000]. Carbon monoxide concentration. */ * - CO_GAS - [ppm] Parts per million. Resolution: 1ppm. Range: [0:1000000] *
/* - NO2_GAS - [ppm] - Parts per million. Resolution 1ppm. Range [0:1000000]. Nitrogen dioxide concentration. */ * - 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]. Hydrogen sulfide concentration. */ * - 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]. Illuminance. */ * - AMBIENT_LIGHT - [lx] Lux. Resolution: 0.1lx. Range: [0.0:100000.0] *
/* - PM_1_0 - [µg/m^3] - Micro gram per cubic meter. Resolution 1µg/m^3 Range [0:1000]. */ * - PM_1_0 - [µg/m^3] Microgram 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_2_5 - [µg/m^3] Microgram 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]. */ * - PM_10_0 - [µg/m^3] Microgram 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. */ * - NOISE_LEVEL - [dB] Decibel. Resolution: 0.1 dB. Range: [0.0:200.0] *
/* - NH3_GAS - [ppm] - Parts per million. Resolution 1ppm. Range [0:1000000]. Ammonia concentration. */ * - NH3_GAS - [ppm] Parts per million. Resolution: 1ppm. Range: [0:1000000] *
/* - CH4_GAS - [ppm] - Parts per million. Resolution 1ppm. Range [0:1000000]. Methane concentration. */ * - CH4_GAS - [ppm] Parts per million. Resolution: 1ppm. Range: [0:1000000] *
/* - HIGH_PRESSURE - [kPa] - Kilopascal (1kPa = 1000Pa, 100kPa = 1bar). Resolution 1kPa. Range [0:200000]. Pressure. */ * - HIGH_PRESSURE - [kPa] Kilopascal (100kPa = 1bar). Resolution: 1kPa. Range: [0:200000] *
/* - DISTANCE_MM - [mm] - Millimeter. Resolution 1mm. Range [0:100000]. Distance. */ * - DISTANCE_MM - [mm] Millimeter. Resolution: 1mm. Range: [0:100000] *
/* - WATER_METER_ACC_MINOR - [l] - Liter. Resolution 1l. Range [0:1000000]. Accumulative water meter (minor). */ * - WATER_METER_ACC_MINOR - [l] Liter. Resolution: 1l. Range: [0:99] *
/* - WATER_METER_ACC_MAJOR - [hl] - Hectoliter. Resolution 1hl. Range [0:1000000]. Accumulative water meter (major). */ * - WATER_METER_ACC_MAJOR - [hl] Hectoliter. Resolution: 1hl. Range: [0:999999] *
/* - CO2_GAS - [ppm] - Parts per million. Resolution 1ppm. Range [0:1000000]. Carbon dioxide concentration. */ * - CO2_GAS - [ppm] Parts per million. Resolution: 1ppm. Range: [0:1000000] *
/* - HUMIDITY ACCURATE - [% RH] - Relative humidity. Resolution 0.1%. Range [0.0:100.0]. */ * - 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]. */ * - 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. */ * - CO2_EQUIVALENT - [ppm] Parts per million. Resolution: 1ppm. Range: [0:1000000] *
/* - BREATH_VOC - [ppm] - Parts per million. Resolution 1ppm. Range [0:100000]. Breath VOC estimate. */ * - BREATH_VOC - [ppm] Parts per million. Resolution: 1ppm. Range: [0:100000] *
/* - PERCENTAGE - [%] - Percentage. Resolution 0.01%. Range [0.00:100.00]. */ * - CELLULAR_GATEWAY - Not applicable *
/* - VOLTAGE - [mV] - Milivolt. Resolution 0.1mV. Range [0.0:100000.0]. */ * - PERCENTAGE - [%] Percentage. Resolution: 0.01%. Range: [0.00:100.00] *
/* - CURRENT - [mA] - Miliampere. Resolution 0.01mA. Range [0.00:10000.00]. */ * - VOLTAGE - [mV] Millivolt. Resolution: 0.1mV. Range: [0.0:100000.0] *
/* - PULSE_CNT_ACC_MINOR - [NB] - Number of pulses. Resolution 1 pulse. Range [0:1000000]. Accumulative pulse counter (minor). */ * - CURRENT - [mA] Milliampere. Resolution: 0.01mA. Range: [0.00:10000.00] *
/* - PULSE_CNT_ACC_MAJOR - [kNB] - Number of kilopulses. Resolution 1 kilopulse. Range [0:1000000]. */ * - PULSE_CNT_ACC_MINOR - [NB] Number of pulses. Resolution: 1 pulse. Range: [0:999] *
/* Accumulative pulse counter (major). */ * - 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:1000000]. Accumulative electricity meter (minor). */ * - ELEC_METER_ACC_MINOR - [Wh] Watt-hour. Resolution: 1Wh. Range: [0:999] *
/* - ELEC_METER_ACC_MAJOR - [kWh] - Kilowatt-hour. Resolution 1kWh. Range [0:1000000]. Accumulative electricity meter (major). */ * - 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_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] *
/* - 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] *
/* Accumulative pulse counter wide range (major). */ * - OUTPUT_CONTROL - Not applicable *
/* - CURRENT_PRECISE - [mA] - Miliampere. Resolution 0.001mA. Range [-4 000.000:4 000.000]. */ * - RESISTANCE - [Ω] Ohm. Resolution: 1Ω. Range: [0:1000000] */
/* - OUTPUT_CONTROL - Not applicable */
/* Encoding R: used to set relative values in rules (e.g., differential threshold and hysteresis): *
/* 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] *
/* - TEMPERATURE - [°C] - Celsius degree. Resolution 0.1°C. Range [0.1:4273.2]. */ * - HUMIDITY - [% RH] Percentage (Relative humidity). Resolution: 1%. Range: [1:100] *
/* - HUMIDITY - [% RH] - Relative humidity. Resolution 1%. Range [1:100]. */ * - ATMOSPHERIC_PRESSURE - [hPa] Hectopascal. Resolution: 0.1hPa. Range: [0.1:1999.0] *
/* - ATMOSPHERIC_PRESSURE - [hPa] - Hectopascal (1hPa = 100Pa). Resolution 0.1hPa. Range: [0.1:1999.0]. */ * - DIFERENTIAL_PRESSURE - [Pa] Pascal. Resolution: 1Pa. Range: [1:20000] *
/* - DIFERENTIAL_PRESSURE - [Pa] - Pascal. Resolution 1Pa. Range [1:20000] */ * - OK_ALARM - Not applicable *
/* - OK/ALARM - Not applicable */ * - IAQ - [IAQ] IAQ index. Resolution: 1IAQ. Range: [1:500] *
/* - VOC - [IAQ] - Iaq index. Resolution 1IAQ. Range [1:500]. */ * - FLOODING - Not applicable *
/* - FLOODING - Not applicable */ * - PULSE_CNT - [NB] Number of pulses. Resolution: 1 pulse. Range: [1:8000000]. Period number of pulses *
/* - PULSE_CNT - [NB] Number of pulses. Resolution 1 pulse. Range [1:8000000]. */ * - ELECTRICITY_METER - [W] Watt. Resolution: 1W. Range: [1:8000000]. Period average power consumption *
/* - 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]. Period average water *
/* - WATER_METER [l/min] - Liter per minute. Resolution 1l/min. Range [1:8000000]. Average water flow in period. */ * - SOIL_MOISTURE - [kPa] Kilopascal. Resolution: 1kPa. Range: [1:1000] *
/* - 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] *
/* - 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] *
/* - 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] *
/* - 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] *
/* - AMBIENT_LIGHT -[lx] - Lux. Resolution 0.1lx. Range [0.1:100000.0]. Illuminance. */ * - PM_1_0 - [µg/m^3] Microgram per cubic meter. Resolution: 1µg/m^3. Range: [1:1000] *
/* - 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] Microgram 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] Microgram 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] Decibel. Resolution: 0.1 dB. Range: [0.1:200.0] *
/* - 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] *
/* - NH3_GAS - [ppm] - Parts per million. Resolution 1ppm. Range [1:1000000]. Ammonia concentration. */ * - CH4_GAS - [ppm] Parts per million. Resolution: 1ppm. Range: [1:1000000] *
/* - CH4_GAS - [ppm] - Parts per million. Resolution 1ppm. Range [1:1000000]. Methane concentration. */ * - HIGH_PRESSURE - [kPa] Kilopascal (100kPa = 1bar). Resolution: 1kPa. Range: [1:200000] *
/* - HIGH_PRESSURE - [kPa] - Kilopascal (1kPa = 1000Pa, 100kPa = 1bar). Resolution 1kPa. Range [1:200000]. Pressure. */ * - DISTANCE_MM - [mm] Millimeter. Resolution: 1mm. Range: [1:100000] *
/* - DISTANCE_MM - [mm] - Millimeter. Resolution 1mm. Range [1:100000]. Distance. */ * - WATER_METER_ACC_MINOR - [l] Liter. Resolution: 1l. Range: [1:99] *
/* - 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:999999] *
/* - 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] *
/* - CO2_GAS - [ppm] - Parts per million. Resolution 1ppm. Range [1:1000000]. Carbon dioxide concentration. */ * - HUMIDITY_ACCURATE - [% RH] Percentage (Relative humidity). Resolution: 0.1%. Range: [0.1:100.0] *
/* - HUMIDITY ACCURATE - [% RH] - Relative humidity. Resolution 0.1%. Range [0.1:100.0]. */ * - STATIC_IAQ - [sIAQ] Static IAQ index. Resolution: 1sIAQ. Range: [1:10000] *
/* - STATIC_IAQ - [sIAQ] - Static IAQ index. Resolution 1sIAQ. Range [1:10000]. */ * - CO2_EQUIVALENT - [ppm] Parts per million. Resolution: 1ppm. Range: [1:1000000] *
/* - 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 - [ppm] - Parts per million. Resolution 1ppm. Range [1:100000]. Breath VOC estimate. */ * - CELLULAR_GATEWAY - Not applicable *
/* - PERCENTAGE - [%] - Percentage. Resolution 0.01%. Range [0.01:100.00]. */ * - PERCENTAGE - [%] Percentage. Resolution: 0.01%. Range: [0.01:100.00] *
/* - VOLTAGE - [mV] - Milivolt. Resolution 0.1mV. Range [0.1:100000.0]. */ * - VOLTAGE - [mV] Millivolt. Resolution: 0.1mV. Range: [0.1:100000.0] *
/* - CURRENT - [mA] - Miliampere. Resolution 0.01mA. Range [0.01:10000.00]. */ * - CURRENT - [mA] Milliampere. 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_MINOR - [NB] Number of pulses. Resolution: 1 pulse. Range: [1:999] *
/* - PULSE_CNT_ACC_MAJOR - [kNB] - Number of kilopulses. Resolution 1 kilopulse. Range [1:1000000]. */ * - PULSE_CNT_ACC_MAJOR - [kNB] Number of kilopulses. Resolution: 1 kilopulse. Range: [1:999999] *
/* Accumulative pulse counter (major). */ * - ELEC_METER_ACC_MINOR - [Wh] Watt-hour. Resolution: 1Wh. Range: [1:999] *
/* - 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:999999] *
/* - 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] *
/* - 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] *
/* Accumulative pulse counter wide range (minor). */ * - CURRENT_PRECISE - [mA] Milliampere. Resolution: 0.001mA. Range: [0.001:8000.000] *
/* - PULSE_CNT_ACC_WIDE_MAJOR - [MNB] - Number of megapulses. Resolution 1 megapulse. Range [1:999999]. */ * - OUTPUT_CONTROL - Not applicable *
/* Accumulative pulse counter wide range (major). */ * - RESISTANCE - [Ω] Ohm. Resolution: 1Ω. Range: [1:1000000] */
/* - 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. */
/* Condition to be checked by the device. If the condition is true, an action is triggered */
enum Condition { enum Condition {
/* Invalid value */ /* Invalid value. */
CONDITION_UNSPECIFIED = 0; CONDITION_UNSPECIFIED = 0;
/* Threshold function for given rule_id is disabled */ /* The rule is disabled. */
CONDITION_DISABLED = 1; CONDITION_DISABLED = 1;
/* Upper threshold. Continuous sensors only. If the measurement (or average from a few measurements) is over the threshold, */ /* Upper threshold. 'Continuous' sensors only. *
/* an action is triggered. */ * 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[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[1] - Hysteresis value in "Encoding R" format. Must match channel type. Set to "0" to disable. *
/* parameter[2] - Triggering mode: */ * parameter[2] - Triggering mode: *
/* - 1 - moving average (a1=(n1+n2+n3)/3, a2=(n2+n3+n4)/3, etc.) */ * - 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.) */ * - 2 - Window average (a1=(n1+n2+n3)/3, a2=(n4+n5+n6)/3, etc.) *
/* - 3 - consecutive samples (number of consecutive samples above threshold) */ * - 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 */ * 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 */ * 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]. */ * sample above threshold will trigger action in consecutive mode. Range: [1:10]. *
/* parameter[4] - Type of measurement (as described in MeasurementType). */ * parameter[4] - Type of measurement (as described in MeasurementType). */
CONDITION_HIGH_THRESHOLD = 2; CONDITION_HIGH_THRESHOLD = 2;
/* Lower threshold. Continuous sensors only. If the measurement (or average from a few measurements) is below the threshold, */ /* Lower threshold. 'Continuous' sensors only. *
/* an action is triggered. */ * 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[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[1] - Hysteresis value in "Encoding R" format. Must match channel type. Set to "0" to disable. *
/* parameter[2] - Triggering mode: */ * parameter[2] - Triggering mode: *
/* - 1 - moving average (a1=(n1+n2+n3)/3, a2=(n2+n3+n4)/3, etc.) */ * - 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.) */ * - 2 - Window average (a1=(n1+n2+n3)/3, a2=(n4+n5+n6)/3, etc.) *
/* - 3 - consecutive samples (number of consecutive samples above threshold) */ * - 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 */ * 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 */ * 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]. */ * sample below threshold will trigger action in consecutive mode. Range: [1:10]. *
/* parameter[4] - Type of measurement (as described in MeasurementType). */ * parameter[4] - Type of measurement (as described in MeasurementType). */
CONDITION_LOW_THRESHOLD = 3; CONDITION_LOW_THRESHOLD = 3;
/* Differential threshold. Continuous sensors only. If the absolute value of the difference between the last value sent to */ /* Differential threshold. 'Continuous' sensors only. *
/* the server and the measurement value (or average from a few measurements) is greater or equal to the value of */ * If the absolute value of the difference between the last value sent to the server and the measurement value *
/* the threshold set, an action is triggered. */ * (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[0] - Threshold value in "Encoding R" format. Must match channel type. *
/* parameter[1] - Triggering mode: */ * parameter[1] - Triggering mode: *
/* - 1 - moving average (a1=(n1+n2+n3)/3, a2=(n2+n3+n4)/3, etc.) */ * - 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.) */ * - 2 - Window average (a1=(n1+n2+n3)/3, a2=(n4+n5+n6)/3, etc.) *
/* - 3 - consecutive samples (number of consecutive samples above threshold) */ * - 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 */ * 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 */ * 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]. */ * sample exceeding threshold will trigger action in consecutive mode. Range: [1:10]. *
/* parameter[3] - Type of measurement (as described in MeasurementType). */ * parameter[3] - Type of measurement (as described in MeasurementType). */
CONDITION_DIFF_THRESHOLD = 4; 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; CONDITION_BINARY_CHANGE_STATE = 5;
/* Logic operator. Used for combining multiple rules into more complex conditions. If the logic condition specified by */ /* Logic operator. Used for combining multiple rules into more complex conditions. *
/* parameters (logic operator and selected rules) is met, an action is triggered. */ * 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[0] - Logic operator (as described in LogicOperator). *
/* parameter[1] - Rule selector (bit mask). Specifies which rules should be taken into account while determining */ * parameter[1] - Rule selector (bitmask). Specifies which rules should be taken into account while determining *
/* rules outcome. */ * rules outcome. *
/* parameter[2] - Rule negation (bit mask). Specifies which of chosen in parameter[1] rules should be negated */ * parameter[2] - Rule negation (bitmask). Specifies which of chosen in parameter[1] rules should be negated *
/* before determining rules outcome. */ * before determining rules outcome. *
/* parameter[3] - Rule action delay [s]. Specifies time delay between the rule activation and rule action being triggered. */ * parameter[3] - Rule action delay [s]. Specifies time delay between the rule activation and rule action being triggered. *
/* Range: [0:864000]. */ * Range: [0:864000]. *
/* parameter[4] - Rule return delay [s]. Specifies time delay between the rule deactivation and rule action being triggered. */ * 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. */ * Range: [0:864001]. Max parameter value disables action triggering on rule deactivation. */
CONDITION_LOGIC_OPERATOR = 6; CONDITION_LOGIC_OPERATOR = 6;
/* On measurement. Continous sensors only. The basic function is to trigger communication after measurement if at least 60s */ /* On measurement. 'Continous' sensors only.
/* have passed since the last one. Transmission may occur every x measurement. Optionally dependency on the other rule can */ * The basic function is to trigger communication after measurement if at least 60s have passed since the last one. *
/* be configured, then, when all conditions are met, transmission is triggered. */ * Transmission may occur every n-th measurement. Optionally dependency on the other rule can be configured, then, when all *
/* parameter[0] - Send every n measurement. This parameter specifies every which measurement transmission will be triggered */ * conditions are met, transmission is triggered. *
/* if all other conditions are met. Range: [1:500]. If parameter[0] equals 1, transmission will occur after */ * parameter[0] - Send every n-th measurement. This parameter specifies every which measurement transmission will be *
/* every measurement. */ * triggered if all other conditions are met. Range: [1:500]. If parameter[0] equals 1, transmission will *
/* parameter[1] - Optional. Rule selector (bit mask). Specifies which rule should be taken into account while determining */ * occur after every measurement. *
/* the measurement rule outcome. */ * parameter[1] - Optional. Rule selector (bitmask). Specifies which rule should be taken into account while determining *
/* parameter[2] - Optional. Rule negation (bit mask). Specifies which of chosen in parameter[1] rule should be negated */ * the measurement rule outcome. *
/* before 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; 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. */ /* Logic operators to be used for determining the outcome of rules with logic operator condition. */
enum LogicOperator { enum LogicOperator {
/* Invalid use */ /* Invalid value. */
LOGIC_OPERATOR_UNSPECIFIED = 0; LOGIC_OPERATOR_UNSPECIFIED = 0;
/* Logic AND */ /* Logic AND. */
LOGIC_OPERATOR_AND = 1; LOGIC_OPERATOR_AND = 1;
/* Logic OR */ /* Logic OR. */
LOGIC_OPERATOR_OR = 2; LOGIC_OPERATOR_OR = 2;
} }
/* Action to be triggered. Currently the only possible action is to trigger the transmission. */ /* Action to be triggered. */
/* Other actions will be available in next SW releases. */
enum Action { enum Action {
/* Invalid value */ /* Invalid value. */
ACTION_UNSPECIFIED = 0; ACTION_UNSPECIFIED = 0;
/* To trigger the transmission */ /* To trigger the transmission. */
ACTION_TRIGGER_TRANSMISSION = 1; 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; ACTION_NO_ACTION = 2;
/* To trigger the transmission with ACK */ /* To trigger the transmission with ACK. */
ACTION_TRIGGER_TRANSMISSION_WITH_ACK = 3; ACTION_TRIGGER_TRANSMISSION_WITH_ACK = 3;
/* To change BLE advertising period mode to fast (with lower user-configured advertising interval). */ /* 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. */ * Once the rule is deactived avertising period mode returns to previously configured value. */
ACTION_FAST_ADVERTISING_MODE = 4; ACTION_FAST_ADVERTISING_MODE = 4;
} }
/* Type of a rule calendars. */ /* Type of a rule calendars. */
enum CalendarType { enum CalendarType {
/* Invalid value */ /* Invalid value. */
CALENDAR_TYPE_UNSPECIFIED = 0; CALENDAR_TYPE_UNSPECIFIED = 0;
/* Type for inactive calendars */ /* Calendar is inactive. */
CALENDAR_TYPE_DISABLED = 1; CALENDAR_TYPE_DISABLED = 1;
/* Week type. Enables selcted rules on specified days of the week in specified time periods. */ /* 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 */ * parameter[0] - Week day mask. Bitmask of days when selected rules are enabled: *
/* - Bit 0 - Sunday */ * - Bit 0 - Sunday *
/* - Bit 1 - Monday */ * - Bit 1 - Monday *
/* ... */ * ... *
/* - Bit 6 - Saturday */ * - Bit 6 - Saturday *
/* parameter[1] - 'From time' - point in time from which selected rules will be enabled (in minutes from midnight). */ * 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[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' */ * parameter[3] - Timezone - desired timezone for date comparison. Encoded as number (N) of 15 minutes offsets, *
/* and from 'From time' to 23:59. */ * for example: if N = 4, then offset = 4 * 15min = 1h. I.e. timezone is UTC+1. *
/* parameter[3] - Timezone - desired timezone for date comparison. Encoded as number (N) of 15 minutes offsets */ * Note: If 'From time' is bigger than 'To time' there are two periods when rules are enabled - from 00:00 to 'To time' *
/* - example - if N = 4, then offset = 4 * 15min = 1h. I.e. timezone is UTC+1. */ * and from 'From time' to 23:59. */
CALENDAR_TYPE_WEEK = 2; CALENDAR_TYPE_WEEK = 2;
} }
/* Rules calendars. Used for enabling/disabling rules based on date/time. */ /* 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 { message ProtoCalendar {
/* Bit mask of selected rules. Mask on bits [0:11] */ /* Selected rules. *
/* - Bit 0 - Rule ID 0 */ * Bitmask - up to 16 rules supported (previously 12 rules [06.00 - 07.01.xx]): *
/* - Bit 1 - Rule ID 1 */ * - Bit 0 - Rule 1 *
/* ... */ * - Bit 1 - Rule 2 *
/* - Bit 11 - Rule ID 11 */ * ... *
* - Bit 15 - Rule 16 *
* Status: In use [06.08.00 - LATEST] */
uint32 rule_mask = 1; 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; 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; CalendarType type = 3;
} }
/* Rules used to define edge logic on the device. Rules are defined by conditions and actions: */ /* Rules are 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. */ * If 'condition' is true, trigger 'action'. One rule can be assigned to any number of channels. *
/* One rule can be assigned to any number of channels. For instance rule "If temperature is over 10 C, trigger the transmission"*/ * For instance rule "If temperature is over 10 C, trigger the transmission" can be assigned to channels 1 and 2. *
/* 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. */ * No matter to how many channels a rule is assigned, it's still counted as one rule. */
message ProtoRule { 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*/ /* Channels to which the rule is assigned. *
/* 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" */ * 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; 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 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; repeated sint32 parameters = 3;
/* Action to be triggered. */ /* Action to be triggered. *
* Status: In use [06.00 - LATEST] */
Action action = 4; 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; package org.thingsboard.server.transport.coap.efento;
import com.google.protobuf.ByteString; import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource; 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.MeasurementTypeProtos.MeasurementType;
import org.thingsboard.server.gen.transport.coap.MeasurementsProtos; import org.thingsboard.server.gen.transport.coap.MeasurementsProtos;
import org.thingsboard.server.gen.transport.coap.MeasurementsProtos.ProtoMeasurements; 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.CoapTransportContext;
import org.thingsboard.server.transport.coap.efento.utils.CoapEfentoUtils; import org.thingsboard.server.transport.coap.efento.utils.CoapEfentoUtils;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.text.SimpleDateFormat;
import java.time.Instant; import java.time.Instant;
import java.util.Arrays; import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
@ -85,7 +94,7 @@ class CoapEfentoTransportResourceTest {
void checkContinuousSensorWithSomeMeasurements() { void checkContinuousSensorWithSomeMeasurements() {
long tsInSec = Instant.now().getEpochSecond(); long tsInSec = Instant.now().getEpochSecond();
ProtoMeasurements measurements = ProtoMeasurements.newBuilder() ProtoMeasurements measurements = ProtoMeasurements.newBuilder()
.setSerialNum(integerToByteString(1234)) .setSerialNumber(integerToByteString(1234))
.setCloudToken("test_token") .setCloudToken("test_token")
.setMeasurementPeriodBase(180) .setMeasurementPeriodBase(180)
.setMeasurementPeriodFactor(5) .setMeasurementPeriodFactor(5)
@ -93,7 +102,7 @@ class CoapEfentoTransportResourceTest {
.setSignal(0) .setSignal(0)
.setNextTransmissionAt(1000) .setNextTransmissionAt(1000)
.setTransferReason(0) .setTransferReason(0)
.setHash(0) .setConfigurationHash(0)
.addAllChannels(List.of(MeasurementsProtos.ProtoChannel.newBuilder() .addAllChannels(List.of(MeasurementsProtos.ProtoChannel.newBuilder()
.setType(MeasurementType.MEASUREMENT_TYPE_TEMPERATURE) .setType(MeasurementType.MEASUREMENT_TYPE_TEMPERATURE)
.setTimestamp(Math.toIntExact(tsInSec)) .setTimestamp(Math.toIntExact(tsInSec))
@ -114,7 +123,7 @@ class CoapEfentoTransportResourceTest {
assertThat(efentoMeasurements.get(1).getTs()).isEqualTo((tsInSec + 180 * 5) * 1000); 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("temperature_1").getAsDouble()).isEqualTo(22.4);
assertThat(efentoMeasurements.get(1).getValues().getAsJsonObject().get("humidity_2").getAsDouble()).isEqualTo(30); assertThat(efentoMeasurements.get(1).getValues().getAsJsonObject().get("humidity_2").getAsDouble()).isEqualTo(30);
checkDefaultMeasurements(measurements, efentoMeasurements, 180 * 5, false); checkDefaultMeasurements(measurements, efentoMeasurements, 180 * 5);
} }
@ParameterizedTest @ParameterizedTest
@ -122,7 +131,7 @@ class CoapEfentoTransportResourceTest {
void checkContinuousSensor(MeasurementType measurementType, List<Integer> sampleOffsets, String property, double expectedValue) { void checkContinuousSensor(MeasurementType measurementType, List<Integer> sampleOffsets, String property, double expectedValue) {
long tsInSec = Instant.now().getEpochSecond(); long tsInSec = Instant.now().getEpochSecond();
ProtoMeasurements measurements = ProtoMeasurements.newBuilder() ProtoMeasurements measurements = ProtoMeasurements.newBuilder()
.setSerialNum(integerToByteString(1234)) .setSerialNumber(integerToByteString(1234))
.setCloudToken("test_token") .setCloudToken("test_token")
.setMeasurementPeriodBase(180) .setMeasurementPeriodBase(180)
.setMeasurementPeriodFactor(0) .setMeasurementPeriodFactor(0)
@ -130,7 +139,7 @@ class CoapEfentoTransportResourceTest {
.setSignal(0) .setSignal(0)
.setNextTransmissionAt(1000) .setNextTransmissionAt(1000)
.setTransferReason(0) .setTransferReason(0)
.setHash(0) .setConfigurationHash(0)
.addAllChannels(List.of(MeasurementsProtos.ProtoChannel.newBuilder() .addAllChannels(List.of(MeasurementsProtos.ProtoChannel.newBuilder()
.setType(measurementType) .setType(measurementType)
.setTimestamp(Math.toIntExact(tsInSec)) .setTimestamp(Math.toIntExact(tsInSec))
@ -142,7 +151,7 @@ class CoapEfentoTransportResourceTest {
assertThat(efentoMeasurements).hasSize(1); assertThat(efentoMeasurements).hasSize(1);
assertThat(efentoMeasurements.get(0).getTs()).isEqualTo(tsInSec * 1000); assertThat(efentoMeasurements.get(0).getTs()).isEqualTo(tsInSec * 1000);
assertThat(efentoMeasurements.get(0).getValues().getAsJsonObject().get(property).getAsDouble()).isEqualTo(expectedValue); 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() { private static Stream<Arguments> checkContinuousSensor() {
@ -176,7 +185,7 @@ class CoapEfentoTransportResourceTest {
String totalPropertyName, double expectedTotalValue) { String totalPropertyName, double expectedTotalValue) {
long tsInSec = Instant.now().getEpochSecond(); long tsInSec = Instant.now().getEpochSecond();
ProtoMeasurements measurements = ProtoMeasurements.newBuilder() ProtoMeasurements measurements = ProtoMeasurements.newBuilder()
.setSerialNum(integerToByteString(1234)) .setSerialNumber(integerToByteString(1234))
.setCloudToken("test_token") .setCloudToken("test_token")
.setMeasurementPeriodBase(180) .setMeasurementPeriodBase(180)
.setMeasurementPeriodFactor(0) .setMeasurementPeriodFactor(0)
@ -184,7 +193,7 @@ class CoapEfentoTransportResourceTest {
.setSignal(0) .setSignal(0)
.setNextTransmissionAt(1000) .setNextTransmissionAt(1000)
.setTransferReason(0) .setTransferReason(0)
.setHash(0) .setConfigurationHash(0)
.addAllChannels(Arrays.asList(MeasurementsProtos.ProtoChannel.newBuilder() .addAllChannels(Arrays.asList(MeasurementsProtos.ProtoChannel.newBuilder()
.setType(majorType) .setType(majorType)
.setTimestamp(Math.toIntExact(tsInSec)) .setTimestamp(Math.toIntExact(tsInSec))
@ -200,7 +209,7 @@ class CoapEfentoTransportResourceTest {
assertThat(efentoMeasurements).hasSize(1); assertThat(efentoMeasurements).hasSize(1);
assertThat(efentoMeasurements.get(0).getTs()).isEqualTo(tsInSec * 1000); assertThat(efentoMeasurements.get(0).getTs()).isEqualTo(tsInSec * 1000);
assertThat(efentoMeasurements.get(0).getValues().getAsJsonObject().get(totalPropertyName + "_2").getAsDouble()).isEqualTo(expectedTotalValue); 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() { private static Stream<Arguments> checkPulseCounterSensors() {
@ -220,7 +229,7 @@ class CoapEfentoTransportResourceTest {
void checkBinarySensor() { void checkBinarySensor() {
long tsInSec = Instant.now().getEpochSecond(); long tsInSec = Instant.now().getEpochSecond();
ProtoMeasurements measurements = ProtoMeasurements.newBuilder() ProtoMeasurements measurements = ProtoMeasurements.newBuilder()
.setSerialNum(integerToByteString(1234)) .setSerialNumber(integerToByteString(1234))
.setCloudToken("test_token") .setCloudToken("test_token")
.setMeasurementPeriodBase(180) .setMeasurementPeriodBase(180)
.setMeasurementPeriodFactor(0) .setMeasurementPeriodFactor(0)
@ -228,7 +237,7 @@ class CoapEfentoTransportResourceTest {
.setSignal(0) .setSignal(0)
.setNextTransmissionAt(1000) .setNextTransmissionAt(1000)
.setTransferReason(0) .setTransferReason(0)
.setHash(0) .setConfigurationHash(0)
.addChannels(MeasurementsProtos.ProtoChannel.newBuilder() .addChannels(MeasurementsProtos.ProtoChannel.newBuilder()
.setType(MEASUREMENT_TYPE_OK_ALARM) .setType(MEASUREMENT_TYPE_OK_ALARM)
.setTimestamp(Math.toIntExact(tsInSec)) .setTimestamp(Math.toIntExact(tsInSec))
@ -239,7 +248,7 @@ class CoapEfentoTransportResourceTest {
assertThat(efentoMeasurements).hasSize(1); assertThat(efentoMeasurements).hasSize(1);
assertThat(efentoMeasurements.get(0).getTs()).isEqualTo(tsInSec * 1000); assertThat(efentoMeasurements.get(0).getTs()).isEqualTo(tsInSec * 1000);
assertThat(efentoMeasurements.get(0).getValues().getAsJsonObject().get("ok_alarm_1").getAsString()).isEqualTo("ALARM"); 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 @ParameterizedTest
@ -247,7 +256,7 @@ class CoapEfentoTransportResourceTest {
void checkBinarySensorWhenValueIsVarying(MeasurementType measurementType, String property, String expectedValueWhenOffsetNotOk, String expectedValueWhenOffsetOk) { void checkBinarySensorWhenValueIsVarying(MeasurementType measurementType, String property, String expectedValueWhenOffsetNotOk, String expectedValueWhenOffsetOk) {
long tsInSec = Instant.now().getEpochSecond(); long tsInSec = Instant.now().getEpochSecond();
ProtoMeasurements measurements = ProtoMeasurements.newBuilder() ProtoMeasurements measurements = ProtoMeasurements.newBuilder()
.setSerialNum(integerToByteString(1234)) .setSerialNumber(integerToByteString(1234))
.setCloudToken("test_token") .setCloudToken("test_token")
.setMeasurementPeriodBase(180) .setMeasurementPeriodBase(180)
.setMeasurementPeriodFactor(1) .setMeasurementPeriodFactor(1)
@ -255,7 +264,7 @@ class CoapEfentoTransportResourceTest {
.setSignal(0) .setSignal(0)
.setNextTransmissionAt(1000) .setNextTransmissionAt(1000)
.setTransferReason(0) .setTransferReason(0)
.setHash(0) .setConfigurationHash(0)
.addChannels(MeasurementsProtos.ProtoChannel.newBuilder() .addChannels(MeasurementsProtos.ProtoChannel.newBuilder()
.setType(measurementType) .setType(measurementType)
.setTimestamp(Math.toIntExact(tsInSec)) .setTimestamp(Math.toIntExact(tsInSec))
@ -268,7 +277,7 @@ class CoapEfentoTransportResourceTest {
assertThat(efentoMeasurements.get(0).getValues().getAsJsonObject().get(property).getAsString()).isEqualTo(expectedValueWhenOffsetNotOk); assertThat(efentoMeasurements.get(0).getValues().getAsJsonObject().get(property).getAsString()).isEqualTo(expectedValueWhenOffsetNotOk);
assertThat(efentoMeasurements.get(1).getTs()).isEqualTo((tsInSec + 9) * 1000); assertThat(efentoMeasurements.get(1).getTs()).isEqualTo((tsInSec + 9) * 1000);
assertThat(efentoMeasurements.get(1).getValues().getAsJsonObject().get(property).getAsString()).isEqualTo(expectedValueWhenOffsetOk); 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() { private static Stream<Arguments> checkBinarySensorWhenValueIsVarying() {
@ -282,7 +291,7 @@ class CoapEfentoTransportResourceTest {
@Test @Test
void checkExceptionWhenChannelsListIsEmpty() { void checkExceptionWhenChannelsListIsEmpty() {
ProtoMeasurements measurements = ProtoMeasurements.newBuilder() ProtoMeasurements measurements = ProtoMeasurements.newBuilder()
.setSerialNum(integerToByteString(1234)) .setSerialNumber(integerToByteString(1234))
.setCloudToken("test_token") .setCloudToken("test_token")
.setMeasurementPeriodBase(180) .setMeasurementPeriodBase(180)
.setMeasurementPeriodFactor(1) .setMeasurementPeriodFactor(1)
@ -290,7 +299,7 @@ class CoapEfentoTransportResourceTest {
.setSignal(0) .setSignal(0)
.setNextTransmissionAt(1000) .setNextTransmissionAt(1000)
.setTransferReason(0) .setTransferReason(0)
.setHash(0) .setConfigurationHash(0)
.build(); .build();
UUID sessionId = UUID.randomUUID(); UUID sessionId = UUID.randomUUID();
@ -299,29 +308,587 @@ class CoapEfentoTransportResourceTest {
.hasMessage("[" + sessionId + "]: Failed to get Efento measurements, reason: channels list is empty!"); .hasMessage("[" + sessionId + "]: Failed to get Efento measurements, reason: channels list is empty!");
} }
// -------------------------------------------------------------------------
// ProtoDeviceInfo parsing tests
// -------------------------------------------------------------------------
@Test @Test
void checkExceptionWhenValuesMapIsEmpty() { void getEfentoDeviceInfo_parsesSwVersion() {
long tsInSec = Instant.now().getEpochSecond(); DeviceInfoProtos.ProtoDeviceInfo deviceInfo = minimalDeviceInfo()
ProtoMeasurements measurements = ProtoMeasurements.newBuilder() .setSwVersion(1546) // ver 06.10 => 0x060A => 1546
.setSerialNum(integerToByteString(1234)) .build();
.setCloudToken("test_token")
.setMeasurementPeriodBase(180) CoapEfentoTransportResource.EfentoTelemetry result = coapEfentoTransportResource.getEfentoDeviceInfo(deviceInfo);
.setMeasurementPeriodFactor(1)
.setBatteryStatus(true) assertThat(result.getValues().getAsJsonObject().get("sw_version").getAsInt()).isEqualTo(1546);
.setSignal(0) }
.setNextTransmissionAt(1000)
.setTransferReason(0) @Test
.setHash(0) void getEfentoDeviceInfo_parsesAllMemoryStatistics() {
.addChannels(MeasurementsProtos.ProtoChannel.newBuilder() // proto uint32 maps to Java int; the "undefined" sentinel is 0xFFFFFFFF = -1 in signed int
.setType(MEASUREMENT_TYPE_TEMPERATURE) int undefinedTs = -1;
.setTimestamp(Math.toIntExact(tsInSec)) 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())
.build(); .build();
UUID sessionId = UUID.randomUUID();
assertThatThrownBy(() -> coapEfentoTransportResource.getEfentoMeasurements(measurements, sessionId)) CoapEfentoTransportResource.EfentoTelemetry result = coapEfentoTransportResource.getEfentoDeviceInfo(deviceInfo);
.isInstanceOf(IllegalStateException.class) var json = result.getValues().getAsJsonObject();
.hasMessage("[" + sessionId + "]: Failed to collect Efento measurements, reason, values map is empty!");
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) { public static ByteString integerToByteString(Integer intValue) {
@ -340,20 +907,17 @@ class CoapEfentoTransportResourceTest {
private void checkDefaultMeasurements(ProtoMeasurements incomingMeasurements, private void checkDefaultMeasurements(ProtoMeasurements incomingMeasurements,
List<CoapEfentoTransportResource.EfentoTelemetry> actualEfentoMeasurements, List<CoapEfentoTransportResource.EfentoTelemetry> actualEfentoMeasurements,
long expectedMeasurementInterval, long expectedMeasurementInterval) {
boolean isBinarySensor) { CoapEfentoTransportResource.EfentoTelemetry efentoTelemetry = actualEfentoMeasurements.stream()
for (int i = 0; i < actualEfentoMeasurements.size(); i++) { .sorted(Comparator.comparing(CoapEfentoTransportResource.EfentoTelemetry::getTs))
CoapEfentoTransportResource.EfentoTelemetry actualEfentoMeasurement = actualEfentoMeasurements.get(i); .toList().get(0);
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"); assertThat(efentoTelemetry.getValues().getAsJsonObject().get("serial").getAsString()).isEqualTo(CoapEfentoUtils.convertByteArrayToString(incomingMeasurements.getSerialNumber().toByteArray()));
MeasurementsProtos.ProtoChannel protoChannel = incomingMeasurements.getChannelsList().get(0); assertThat(efentoTelemetry.getValues().getAsJsonObject().get("battery").getAsString()).isEqualTo(incomingMeasurements.getBatteryStatus() ? "ok" : "low");
long measuredAt = isBinarySensor ? assertThat(efentoTelemetry.getValues().getAsJsonObject().get("next_transmission_at").getAsString()).isEqualTo(convertTimestampToUtcString(TimeUnit.SECONDS.toMillis(incomingMeasurements.getNextTransmissionAt())));
TimeUnit.SECONDS.toMillis(protoChannel.getTimestamp()) + Math.abs(TimeUnit.SECONDS.toMillis(protoChannel.getSampleOffsetsList().get(i))) - 1000 : assertThat(efentoTelemetry.getValues().getAsJsonObject().get("signal").getAsLong()).isEqualTo(incomingMeasurements.getSignal());
TimeUnit.SECONDS.toMillis(protoChannel.getTimestamp() + i * expectedMeasurementInterval); for (int i = 1; i < incomingMeasurements.getChannelsCount() + 1; i++) {
assertThat(actualEfentoMeasurement.getValues().getAsJsonObject().get("measured_at").getAsString()).isEqualTo(convertTimestampToUtcString(measuredAt)); assertThat(efentoTelemetry.getValues().getAsJsonObject().get("measurement_interval_" + i).getAsDouble()).isEqualTo(expectedMeasurementInterval);
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);
} }
} }

Loading…
Cancel
Save