diff --git a/src/main/java/ru/iris/noolite4j/receiver/RX2164.java b/src/main/java/ru/iris/noolite4j/receiver/RX2164.java index 7c91cfc..e41ed33 100644 --- a/src/main/java/ru/iris/noolite4j/receiver/RX2164.java +++ b/src/main/java/ru/iris/noolite4j/receiver/RX2164.java @@ -225,7 +225,16 @@ else if (dataFormat == DataFormat.FOUR_BYTE.ordinal()) { break; case BIND: notification.setType(CommandType.BIND); - addTempHumiData(notification, buf); + + /** + * Если привязывается датчик, то он передает дополнительно свой тип + */ + if(notification.getDataFormat() == DataFormat.ONE_BYTE) + { + // Тип сенсора + notification.addData("sensortype", SensorType.values()[(buf.get(4) & 0xff)]); + } + watcher.onNotification(notification); break; case UNBIND: @@ -254,7 +263,42 @@ else if (dataFormat == DataFormat.FOUR_BYTE.ordinal()) { break; case TEMP_HUMI: notification.setType(CommandType.TEMP_HUMI); - notification = addTempHumiData(notification, buf); + + /** + * Информация о температуре, типе датчика и состоянии батареи + * размазана по 2 байтам + */ + + int intTemp = ((buf.get(5) & 0x0f) << 8) + (buf.get(4) & 0xff); + + if (intTemp >= 0x800) + { + intTemp = intTemp - 0x1000; + } + + // Приводим к градусам Цельсия + double temp = (double)intTemp / 10; + + // Состояни батареи + notification.addData("battery", BatteryState.values()[(buf.get(5) >> 7) & 1]); + + // Температура + notification.addData("temp", temp); + + // Тип сенсора + notification.addData("sensortype", SensorType.values()[((buf.get(5) >> 4) & 7)]); + + /** + * В третьем байте данных хранится влажность + */ + notification.addData("humi", buf.get(6) & 0xff); + + /** + * В четвертом байте данных хранятся данные о состоянии аналогового датчика + * По умолчанию - unsigned byte (255) + */ + notification.addData("analog", buf.get(7) & 0xff); + watcher.onNotification(notification); break; @@ -279,44 +323,4 @@ else if (dataFormat == DataFormat.FOUR_BYTE.ordinal()) { } }).start(); } - - private Notification addTempHumiData(Notification notification, ByteBuffer buf) { - - /** - * Информация о температуре, типе датчика и состоянии батареи - * размазана по 2 байтам - */ - - int intTemp = ((buf.get(5) & 0x0f) << 8) + (buf.get(4) & 0xff); - - if (intTemp >= 0x800) - { - intTemp = intTemp - 0x1000; - } - - // Приводим к градусам Цельсия - double temp = (double)intTemp / 10; - - // Состояни батареи - notification.addData("battery", BatteryState.values()[(buf.get(5) >> 7) & 1]); - - // Температура - notification.addData("temp", temp); - - // Тип сенсора - notification.addData("sensortype", SensorType.values()[((buf.get(5) >> 4) & 7)]); - - /** - * В третьем байте данных хранится влажность - */ - notification.addData("humi", buf.get(6) & 0xff); - - /** - * В четвертом байте данных хранятся данные о состоянии аналогового датчика - * По умолчанию - unsigned byte (255) - */ - notification.addData("analog", buf.get(7) & 0xff); - - return notification; - } }