/** * Copyright (c) 2010-2016 by the respective copyright holders. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package org.openhab.binding.davis.datatypes; import java.util.Collection; import java.util.EnumSet; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.openhab.binding.davis.internal.DavisCommand; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Represents all valid datafields which could be processed by this binding * * @author Trathnigg Thomas * @since 1.6.0 */ public enum DavisValueType { RX_COUNT_TOTAL { { key = "rx_count_total"; data_type = DataTypeSplitString.class; command = DavisCommandType.RXCHECK; data_offset = 0; data_size = 0; } }, RX_COUNT_MISSED { { key = "rx_count_missed"; data_type = DataTypeSplitString.class; command = DavisCommandType.RXCHECK; data_offset = 1; data_size = 0; } }, RX_COUNT_RESYNC { { key = "rx_count_resync"; data_type = DataTypeSplitString.class; command = DavisCommandType.RXCHECK; data_offset = 2; data_size = 0; } }, RX_COUNT_CONSECUTIVE { { key = "rx_count_consecutive"; data_type = DataTypeSplitString.class; command = DavisCommandType.RXCHECK; data_offset = 3; data_size = 0; } }, RX_COUNT_CRC { { key = "rx_count_crc"; data_type = DataTypeSplitString.class; command = DavisCommandType.RXCHECK; data_offset = 4; data_size = 0; } }, FIRMWARE_VERSION { { key = "firmware_version"; data_type = DataTypeString.class; command = DavisCommandType.NVER; data_offset = 0; data_size = 0; } }, FIRMWARE_DATE { { key = "firmware_date"; data_type = DataTypeString.class; command = DavisCommandType.VER; data_offset = 0; data_size = 0; } }, TIME { { key = "time"; data_type = DataTypeTime.class; command = DavisCommandType.GETTIME; data_offset = 0; data_size = 0; } }, RECEIVERS { { key = "receivers"; data_type = DataTypeNumber.class; command = DavisCommandType.RECEIVERS; data_offset = 0; data_size = 1; } }, STATION_TYPE { { key = "station_type"; data_type = DataTypeStationType.class; command = DavisCommandType.WRD; data_offset = 0; data_size = 1; } }, BAR_TREND { { key = "bar_trend"; data_type = DataTypeBarometricTrend.class; command = DavisCommandType.LOOP; data_offset = 3; data_size = 1; } }, BAROMETER { { key = "barometer"; data_type = DataTypeBarometer.class; command = DavisCommandType.LOOP; data_offset = 7; data_size = 2; } }, INSIDE_TEMP { { key = "inside_temp"; data_type = DataTypeTemperature.class; command = DavisCommandType.LOOP; data_offset = 9; data_size = 2; } }, INSIDE_HUMIDITY { { key = "inside_humidity"; data_type = DataTypeNumber.class; command = DavisCommandType.LOOP; data_offset = 11; data_size = 1; } }, OUTSIDE_TEMP { { key = "outside_temp"; data_type = DataTypeTemperature.class; command = DavisCommandType.LOOP; data_offset = 12; data_size = 2; } }, WIND_SPEED { { key = "wind_speed"; data_type = DataTypeWind.class; command = DavisCommandType.LOOP; data_offset = 14; data_size = 1; } }, WIND_SPEED_10MIN_AVG { { key = "wind_speed_10min_avg"; data_type = DataTypeWind.class; command = DavisCommandType.LOOP; data_offset = 15; data_size = 1; } }, WIND_DIRECTION { { key = "wind_direction"; data_type = DataTypeNumber.class; command = DavisCommandType.LOOP; data_offset = 16; data_size = 2; } }, EXTRA_TEMPERATURE_1 { { key = "extra_temperature_1"; data_type = DataTypeTemperatureExtra.class; command = DavisCommandType.LOOP; data_offset = 18; data_size = 1; } }, EXTRA_TEMPERATURE_2 { { key = "extra_temperature_2"; data_type = DataTypeTemperatureExtra.class; command = DavisCommandType.LOOP; data_offset = 19; data_size = 1; } }, EXTRA_TEMPERATURE_3 { { key = "extra_temperature_3"; data_type = DataTypeTemperatureExtra.class; command = DavisCommandType.LOOP; data_offset = 20; data_size = 1; } }, EXTRA_TEMPERATURE_4 { { key = "extra_temperature_4"; data_type = DataTypeTemperatureExtra.class; command = DavisCommandType.LOOP; data_offset = 21; data_size = 1; } }, EXTRA_TEMPERATURE_5 { { key = "extra_temperature_5"; data_type = DataTypeTemperatureExtra.class; command = DavisCommandType.LOOP; data_offset = 22; data_size = 1; } }, EXTRA_TEMPERATURE_6 { { key = "extra_temperature_6"; data_type = DataTypeTemperatureExtra.class; command = DavisCommandType.LOOP; data_offset = 23; data_size = 1; } }, EXTRA_TEMPERATURE_7 { { key = "extra_temperature_7"; data_type = DataTypeTemperatureExtra.class; command = DavisCommandType.LOOP; data_offset = 24; data_size = 1; } }, SOIL_TEMPERATURE_1 { { key = "soil_temperature_1"; data_type = DataTypeTemperatureExtra.class; command = DavisCommandType.LOOP; data_offset = 25; data_size = 1; } }, SOIL_TEMPERATURE_2 { { key = "soil_temperature_2"; data_type = DataTypeTemperatureExtra.class; command = DavisCommandType.LOOP; data_offset = 26; data_size = 1; } }, SOIL_TEMPERATURE_3 { { key = "soil_temperature_3"; data_type = DataTypeTemperatureExtra.class; command = DavisCommandType.LOOP; data_offset = 27; data_size = 1; } }, SOIL_TEMPERATURE_4 { { key = "soil_temperature_4"; data_type = DataTypeTemperatureExtra.class; command = DavisCommandType.LOOP; data_offset = 28; data_size = 1; } }, LEAF_TEMPERATURE_1 { { key = "leaf_temperature_1"; data_type = DataTypeTemperatureExtra.class; command = DavisCommandType.LOOP; data_offset = 29; data_size = 1; } }, LEAF_TEMPERATURE_2 { { key = "leaf_temperature_2"; data_type = DataTypeTemperatureExtra.class; command = DavisCommandType.LOOP; data_offset = 30; data_size = 1; } }, LEAF_TEMPERATURE_3 { { key = "leaf_temperature_3"; data_type = DataTypeTemperatureExtra.class; command = DavisCommandType.LOOP; data_offset = 31; data_size = 1; } }, LEAF_TEMPERATURE_4 { { key = "leaf_temperature_4"; data_type = DataTypeTemperatureExtra.class; command = DavisCommandType.LOOP; data_offset = 32; data_size = 1; } }, OUTSIDE_HUMIDITY { { key = "outside_humidity"; data_type = DataTypeNumber.class; command = DavisCommandType.LOOP; data_offset = 33; data_size = 1; } }, EXTRA_HUMIDITY_1 { { key = "extra_humidity_1"; data_type = DataTypeNumber.class; command = DavisCommandType.LOOP; data_offset = 34; data_size = 1; } }, EXTRA_HUMIDITY_2 { { key = "extra_humidity_2"; data_type = DataTypeNumber.class; command = DavisCommandType.LOOP; data_offset = 35; data_size = 1; } }, EXTRA_HUMIDITY_3 { { key = "extra_humidity_3"; data_type = DataTypeNumber.class; command = DavisCommandType.LOOP; data_offset = 36; data_size = 1; } }, EXTRA_HUMIDITY_4 { { key = "extra_humidity_4"; data_type = DataTypeNumber.class; command = DavisCommandType.LOOP; data_offset = 37; data_size = 1; } }, EXTRA_HUMIDITY_5 { { key = "extra_humidity_5"; data_type = DataTypeNumber.class; command = DavisCommandType.LOOP; data_offset = 38; data_size = 1; } }, EXTRA_HUMIDITY_6 { { key = "extra_humidity_6"; data_type = DataTypeNumber.class; command = DavisCommandType.LOOP; data_offset = 39; data_size = 1; } }, EXTRA_HUMIDITY_7 { { key = "extra_humidity_7"; data_type = DataTypeNumber.class; command = DavisCommandType.LOOP; data_offset = 40; data_size = 1; } }, RAIN_RATE { { key = "rain_rate"; data_type = DataTypeRain.class; command = DavisCommandType.LOOP; data_offset = 41; data_size = 2; } }, UV { { key = "uv"; data_type = DataTypeNumber.class; command = DavisCommandType.LOOP; data_offset = 43; data_size = 1; } }, SOLAR_RADIATION { { key = "solar_radiation"; data_type = DataTypeNumber.class; command = DavisCommandType.LOOP; data_offset = 44; data_size = 2; } }, STORM_RAIN { { key = "storm_rain"; data_type = DataTypeRain.class; command = DavisCommandType.LOOP; data_offset = 46; data_size = 2; } }, DAY_RAIN { { key = "day_rain"; data_type = DataTypeRain.class; command = DavisCommandType.LOOP; data_offset = 50; data_size = 2; } }, MONTH_RAIN { { key = "month_rain"; data_type = DataTypeRain.class; command = DavisCommandType.LOOP; data_offset = 52; data_size = 2; } }, YEAR_RAIN { { key = "year_rain"; data_type = DataTypeRain.class; command = DavisCommandType.LOOP; data_offset = 54; data_size = 2; } }, SOIL_MOISTURE_1 { { key = "soil_moisture_1"; data_type = DataTypeNumber.class; command = DavisCommandType.LOOP; data_offset = 62; data_size = 1; } }, SOIL_MOISTURE_2 { { key = "soil_moisture_2"; data_type = DataTypeNumber.class; command = DavisCommandType.LOOP; data_offset = 63; data_size = 1; } }, SOIL_MOISTURE_3 { { key = "soil_moisture_3"; data_type = DataTypeNumber.class; command = DavisCommandType.LOOP; data_offset = 64; data_size = 1; } }, SOIL_MOISTURE_4 { { key = "soil_moisture_4"; data_type = DataTypeNumber.class; command = DavisCommandType.LOOP; data_offset = 65; data_size = 1; } }, LEAF_WETNES_1 { { key = "leaf_wetnes_1"; data_type = DataTypeNumber.class; command = DavisCommandType.LOOP; data_offset = 66; data_size = 1; } }, LEAF_WETNES_2 { { key = "leaf_wetnes_2"; data_type = DataTypeNumber.class; command = DavisCommandType.LOOP; data_offset = 67; data_size = 1; } }, LEAF_WETNES_3 { { key = "leaf_wetnes_3"; data_type = DataTypeNumber.class; command = DavisCommandType.LOOP; data_offset = 68; data_size = 1; } }, LEAF_WETNES_4 { { key = "leaf_wetnes_4"; data_type = DataTypeNumber.class; command = DavisCommandType.LOOP; data_offset = 69; data_size = 1; } }, TRANSMITTER_BATTERY_STATUS { { key = "transmitter_battery_status"; data_type = DataTypeNumber.class; command = DavisCommandType.LOOP; data_offset = 86; data_size = 1; } }, CONSOLE_BATTERY_VOLTAGE { { key = "console_battery_voltage"; data_type = DataTypeVoltage.class; command = DavisCommandType.LOOP; data_offset = 87; data_size = 2; } }, WIND_SPEED_10MIN_AVG_HIRES { { key = "wind_speed_10min_avg_hires"; data_type = DataTypeWindHiRes.class; command = DavisCommandType.LOOP2; data_offset = 18; data_size = 2; } }, WIND_SPEED_2MIN_AVG_HIRES { { key = "wind_speed_2min_avg_hires"; data_type = DataTypeWindHiRes.class; command = DavisCommandType.LOOP2; data_offset = 20; data_size = 2; } }, WIND_SPEED_10MIN_GUST_HIRES { { key = "wind_speed_10min_gust_hires"; data_type = DataTypeWindHiRes.class; command = DavisCommandType.LOOP2; data_offset = 22; data_size = 2; } }, WIND_DIRECTION_10MIN_GUST { { key = "wind_direction_10min_gust"; data_type = DataTypeNumber.class; command = DavisCommandType.LOOP2; data_offset = 24; data_size = 2; } }, DEW_POINT { { key = "dew_point"; data_type = DataTypeTemperatureF.class; command = DavisCommandType.LOOP2; data_offset = 30; data_size = 2; } }, HEAT_INDEX { { key = "heat_index"; data_type = DataTypeTemperatureF.class; command = DavisCommandType.LOOP2; data_offset = 35; data_size = 2; } }, WIND_CHILL { { key = "wind_chill"; data_type = DataTypeTemperatureF.class; command = DavisCommandType.LOOP2; data_offset = 37; data_size = 2; } }, THSW_INDEX { { key = "thsw_index"; data_type = DataTypeTemperatureF.class; command = DavisCommandType.LOOP2; data_offset = 39; data_size = 2; } }, LAST_15MIN_RAIN { { key = "last_15min_rain"; data_type = DataTypeRain.class; command = DavisCommandType.LOOP2; data_offset = 52; data_size = 2; } }, LAST_HOUR_RAIN { { key = "last_hour_rain"; data_type = DataTypeRain.class; command = DavisCommandType.LOOP2; data_offset = 54; data_size = 2; } }, LAST_24H_RAIN { { key = "last_24h_rain"; data_type = DataTypeRain.class; command = DavisCommandType.LOOP2; data_offset = 58; data_size = 2; } }; Logger logger = LoggerFactory.getLogger(DavisValueType.class); String key; Class<? extends DavisDataType> data_type; DavisCommandType command; int data_offset; int data_size; /** * @return command key */ public String getKey() { return key; } public DavisCommandType getCommand() { return command; } /** * @return data type for this command key */ public DavisDataType getDataType() { try { return data_type.newInstance(); } catch (Exception e) { logger.error("Creating new DataType went wrong", e); } return null; } public int getDataOffset() { return data_offset; } public int getDataSize() { return data_size; } /** * Get all commands which receive informations to update items. * * @return all DavisCommand's identified by keys */ public static Collection<DavisCommand> getReadCommandsByKeys(List<String> keys) { Map<String, DavisCommand> commands = new HashMap<String, DavisCommand>(); for (DavisValueType entry : values()) { if (!keys.contains(entry.key)) { continue; } if (entry.command == null) { continue; } DavisCommandType getCmd = entry.command; DavisCommand command = commands.get(getCmd); if (command == null) { command = new DavisCommand(entry.key, getCmd); commands.put(command.getRequestCmd(), command); } else { command.addKey(entry.key); } } return commands.values(); } /** * Get all commands which receive informations to update items. * * @return all DavisValueTypes receiving data from a specific command */ public static Set<DavisValueType> getValueTypesByCommandType(DavisCommandType commandType) { EnumSet<DavisValueType> valueTypes = EnumSet.noneOf(DavisValueType.class); for (DavisValueType entry : values()) { if (commandType.getCommand().equals(entry.command.getCommand())) { valueTypes.add(entry); } } return valueTypes; } /** * Get a specific command. * * @param key * command key * @return DavisValueType identified by key */ public static DavisValueType getValueTypeByKey(String key) { for (DavisValueType entry : values()) { if (entry.key.equals(key)) { return entry; } } return null; } }