Skip to content

Commit

Permalink
[basicui] Fix setpoint/slider widgets when %unit% is used in state
Browse files Browse the repository at this point in the history
pattern

In OH3.4, getUnitForWidget(Widget w) now returns null when the state
pattern contains "%unit%". In that case, the unit must be searched in
the item state.

Fix #1605

Signed-off-by: Laurent Garnier <lg.hc@free.fr>
  • Loading branch information
lolodomo committed Dec 26, 2022
1 parent 52488f3 commit 3700ac8
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,17 @@

import java.math.BigDecimal;

import javax.measure.Unit;

import org.eclipse.emf.common.util.ECollections;
import org.eclipse.emf.common.util.EList;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.core.i18n.LocaleProvider;
import org.openhab.core.i18n.TranslationProvider;
import org.openhab.core.library.types.QuantityType;
import org.openhab.core.model.sitemap.sitemap.Setpoint;
import org.openhab.core.model.sitemap.sitemap.Widget;
import org.openhab.core.types.State;
import org.openhab.core.ui.items.ItemUIRegistry;
import org.openhab.ui.basic.render.RenderException;
import org.openhab.ui.basic.render.WidgetRenderer;
Expand Down Expand Up @@ -70,6 +74,17 @@ public EList<Widget> renderWidget(Widget w, StringBuilder sb, String sitemap) th
}

String unit = getUnitForWidget(w);
if (unit == null) {
// Search the unit in the item state
State state = itemUIRegistry.getState(w);
if (state instanceof QuantityType<?>) {
Unit<?> stateUnit = ((QuantityType<?>) state).getUnit();
unit = stateUnit.toString();
}
}
if (unit == null) {
unit = "";
}

String snippet = getSnippet("setpoint");

Expand All @@ -78,9 +93,7 @@ public EList<Widget> renderWidget(Widget w, StringBuilder sb, String sitemap) th
snippet = snippet.replace("%minValue%", minValue.toString());
snippet = snippet.replace("%maxValue%", maxValue.toString());
snippet = snippet.replace("%step%", step.toString());
if (unit != null) {
snippet = snippet.replace("%unit%", unit);
}
snippet = snippet.replace("%unit%", unit);

// Process the color tags
snippet = processColor(w, snippet);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,17 @@
*/
package org.openhab.ui.basic.internal.render;

import javax.measure.Unit;

import org.eclipse.emf.common.util.ECollections;
import org.eclipse.emf.common.util.EList;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.core.i18n.LocaleProvider;
import org.openhab.core.i18n.TranslationProvider;
import org.openhab.core.library.types.QuantityType;
import org.openhab.core.model.sitemap.sitemap.Slider;
import org.openhab.core.model.sitemap.sitemap.Widget;
import org.openhab.core.types.State;
import org.openhab.core.ui.items.ItemUIRegistry;
import org.openhab.ui.basic.render.RenderException;
import org.openhab.ui.basic.render.WidgetRenderer;
Expand Down Expand Up @@ -65,13 +69,25 @@ public EList<Widget> renderWidget(Widget w, StringBuilder sb, String sitemap) th
String frequency = s.getFrequency() == 0 ? "200" : Integer.toString(s.getFrequency());

String unit = getUnitForWidget(w);
if (unit == null) {
// Search the unit in the item state
// Do not use itemUIRegistry.getState(w) as it will return a DecimalType for a slider widget
// even if the item state is a QuantityType
String itemName = w.getItem();
State state = itemName != null ? itemUIRegistry.getItemState(itemName) : null;
if (state instanceof QuantityType<?>) {
Unit<?> stateUnit = ((QuantityType<?>) state).getUnit();
unit = stateUnit.toString();
}
}
if (unit == null) {
unit = "";
}

snippet = preprocessSnippet(snippet, w);
snippet = snippet.replace("%frequency%", frequency);
snippet = snippet.replace("%switch%", s.isSwitchEnabled() ? "1" : "0");
if (unit != null) {
snippet = snippet.replace("%unit%", unit);
}
snippet = snippet.replace("%unit%", unit);
snippet = snippet.replace("%minValue%", minValueOf(s));
snippet = snippet.replace("%maxValue%", maxValueOf(s));
snippet = snippet.replace("%step%", stepOf(s));
Expand Down
6 changes: 3 additions & 3 deletions bundles/org.openhab.ui.basic/web-src/smarthome.js
Original file line number Diff line number Diff line change
Expand Up @@ -929,9 +929,9 @@
var stateAndUnit = itemState.split(" ");
_t.value = stateAndUnit[0] * 1;
_t.unit = stateAndUnit[1];
} else {
_t.value = itemState * 1;
}
} else {
_t.value = itemState * 1;
}
_t.valueNode.innerHTML = value;
};

Expand Down

0 comments on commit 3700ac8

Please sign in to comment.