diff --git a/bundles/org.openhab.persistence.rrd4j/src/main/java/org/openhab/persistence/rrd4j/internal/RRD4jItem.java b/bundles/org.openhab.persistence.rrd4j/src/main/java/org/openhab/persistence/rrd4j/internal/RRD4jItem.java index 459b842e4..38d8cbd94 100644 --- a/bundles/org.openhab.persistence.rrd4j/src/main/java/org/openhab/persistence/rrd4j/internal/RRD4jItem.java +++ b/bundles/org.openhab.persistence.rrd4j/src/main/java/org/openhab/persistence/rrd4j/internal/RRD4jItem.java @@ -12,8 +12,10 @@ */ package org.openhab.persistence.rrd4j.internal; -import java.text.DateFormat; import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.FormatStyle; +import java.util.Locale; import org.openhab.core.persistence.HistoricItem; import org.openhab.core.types.State; @@ -53,6 +55,8 @@ public class RRD4jItem implements HistoricItem { @Override public String toString() { - return DateFormat.getDateTimeInstance().format(timestamp) + ": " + name + " -> " + state.toString(); + return timestamp + .format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).withLocale(Locale.getDefault())) + ": " + + name + " -> " + state.toString(); } } diff --git a/bundles/org.openhab.persistence.rrd4j/src/main/java/org/openhab/persistence/rrd4j/internal/RRD4jPersistenceService.java b/bundles/org.openhab.persistence.rrd4j/src/main/java/org/openhab/persistence/rrd4j/internal/RRD4jPersistenceService.java index f846da2cd..e11125b03 100644 --- a/bundles/org.openhab.persistence.rrd4j/src/main/java/org/openhab/persistence/rrd4j/internal/RRD4jPersistenceService.java +++ b/bundles/org.openhab.persistence.rrd4j/src/main/java/org/openhab/persistence/rrd4j/internal/RRD4jPersistenceService.java @@ -152,8 +152,7 @@ public class RRD4jPersistenceService implements QueryablePersistenceService { sample.setTime(now - 1); sample.setValue(DATASOURCE_STATE, lastValue); sample.update(); - logger.debug("Stored '{}' with state '{}' in rrd4j database (again)", name, - mapToState(lastValue, item)); + logger.debug("Stored '{}' as value '{}' in rrd4j database (again)", name, lastValue); } } } catch (IOException e) { @@ -195,7 +194,7 @@ public class RRD4jPersistenceService implements QueryablePersistenceService { } sample.setValue(DATASOURCE_STATE, value); sample.update(); - logger.debug("Stored '{}' with state '{}' in rrd4j database", name, value); + logger.debug("Stored '{}' as value '{}' in rrd4j database", name, value); } } catch (IllegalArgumentException e) { String message = e.getMessage(); @@ -238,8 +237,14 @@ public class RRD4jPersistenceService implements QueryablePersistenceService { } Item item = null; + Unit unit = null; try { item = itemRegistry.getItem(itemName); + if (item instanceof NumberItem) { + // we already retrieve the unit here once as it is a very costly operation, + // see https://github.com/openhab/openhab-addons/issues/8928 + unit = ((NumberItem) item).getUnit(); + } } catch (ItemNotFoundException e) { logger.debug("Could not find item '{}' in registry", itemName); } @@ -262,7 +267,7 @@ public class RRD4jPersistenceService implements QueryablePersistenceService { // we are asked only for the most recent value! double lastValue = db.getLastDatasourceValue(DATASOURCE_STATE); if (!Double.isNaN(lastValue)) { - HistoricItem rrd4jItem = new RRD4jItem(itemName, mapToState(lastValue, item), + HistoricItem rrd4jItem = new RRD4jItem(itemName, mapToState(lastValue, item, unit), ZonedDateTime.ofInstant(Instant.ofEpochMilli(db.getLastArchiveUpdateTime() * 1000), ZoneId.systemDefault())); return List.of(rrd4jItem); @@ -288,7 +293,7 @@ public class RRD4jPersistenceService implements QueryablePersistenceService { long step = result.getRowCount() > 1 ? result.getStep() : 0; for (double value : result.getValues(DATASOURCE_STATE)) { if (!Double.isNaN(value) && (((ts >= start) && (ts <= end)) || (start == end))) { - RRD4jItem rrd4jItem = new RRD4jItem(itemName, mapToState(value, item), + RRD4jItem rrd4jItem = new RRD4jItem(itemName, mapToState(value, item, unit), ZonedDateTime.ofInstant(Instant.ofEpochMilli(ts * 1000), ZoneId.systemDefault())); items.add(rrd4jItem); } @@ -393,7 +398,8 @@ public class RRD4jPersistenceService implements QueryablePersistenceService { } } - private State mapToState(double value, @Nullable Item item) { + @SuppressWarnings({ "unchecked", "rawtypes" }) + private State mapToState(double value, @Nullable Item item, @Nullable Unit unit) { if (item instanceof SwitchItem && !(item instanceof DimmerItem)) { return value == 0.0d ? OnOffType.OFF : OnOffType.ON; } else if (item instanceof ContactItem) { @@ -401,9 +407,13 @@ public class RRD4jPersistenceService implements QueryablePersistenceService { } else if (item instanceof DimmerItem || item instanceof RollershutterItem) { // make sure Items that need PercentTypes instead of DecimalTypes do receive the right information return new PercentType((int) Math.round(value * 100)); + } else if (item instanceof NumberItem) { + if (unit != null) { + return new QuantityType(value, unit); + } else { + return new DecimalType(value); + } } - // return a DecimalType as a fallback and for QuantityType values to prevent performance issues - // see: https://github.com/openhab/openhab-addons/issues/8928 return new DecimalType(value); }