use of org.eclipse.smarthome.core.items.Item in project smarthome by eclipse.
the class ItemUIRegistryImpl method resolveDefault.
private Widget resolveDefault(Widget widget) {
if (!(widget instanceof Default)) {
return widget;
} else {
String itemName = widget.getItem();
if (itemName != null) {
Item item = itemRegistry.get(itemName);
if (item != null) {
Widget defaultWidget = getDefaultWidget(item.getClass(), item.getName());
if (defaultWidget != null) {
copyProperties(widget, defaultWidget);
defaultWidgets.put(defaultWidget, widget);
return defaultWidget;
}
}
}
return null;
}
}
use of org.eclipse.smarthome.core.items.Item in project smarthome by eclipse.
the class ItemUIRegistryImpl method getLabel.
@Override
public String getLabel(Widget w) {
String label = getLabelFromWidget(w);
String itemName = w.getItem();
if (StringUtils.isBlank(itemName)) {
return transform(label, null);
}
String labelMappedOption = null;
State state = null;
StateDescription stateDescription = null;
String formatPattern = getFormatPattern(label);
// (i.e. it contains at least a %)
try {
final Item item = getItem(itemName);
// There is a known issue in the implementation of the method getStateDescription() of class Item
// in the following case:
// - the item provider returns as expected a state description without pattern but with for
// example a min value because a min value is set in the item definition but no label with
// pattern is set.
// - the channel state description provider returns as expected a state description with a pattern
// In this case, the result is no display of value by UIs because no pattern is set in the
// returned StateDescription. What is expected is the display of a value using the pattern
// provided by the channel state description provider.
stateDescription = item.getStateDescription();
if (formatPattern == null && stateDescription != null && stateDescription.getPattern() != null) {
label = label + " [" + stateDescription.getPattern() + "]";
}
String updatedPattern = getFormatPattern(label);
if (updatedPattern != null) {
formatPattern = updatedPattern;
// a number is requested, PercentType must not be converted to DecimalType:
if (formatPattern.contains("%d") && !(item.getState() instanceof PercentType)) {
state = item.getStateAs(DecimalType.class);
} else {
state = item.getState();
}
}
} catch (ItemNotFoundException e) {
logger.error("Cannot retrieve item for widget {}", w.eClass().getInstanceTypeName());
}
if (formatPattern != null) {
if (formatPattern.isEmpty()) {
label = label.substring(0, label.indexOf("[")).trim();
} else {
if (state == null || state instanceof UnDefType) {
formatPattern = formatUndefined(formatPattern);
} else if (state instanceof Type) {
// if the channel contains options, we build a label with the mapped option value
if (stateDescription != null && stateDescription.getOptions() != null) {
for (StateOption option : stateDescription.getOptions()) {
if (option.getValue().equals(state.toString()) && option.getLabel() != null) {
State stateOption = new StringType(option.getLabel());
try {
String formatPatternOption = stateOption.format(formatPattern);
labelMappedOption = label.trim();
labelMappedOption = labelMappedOption.substring(0, labelMappedOption.indexOf("[") + 1) + formatPatternOption + "]";
} catch (IllegalArgumentException e) {
logger.debug("Mapping option value '{}' for item {} using format '{}' failed ({}); mapping is ignored", stateOption, itemName, formatPattern, e.getMessage());
labelMappedOption = null;
}
break;
}
}
}
if (state instanceof QuantityType) {
QuantityType<?> quantityState = (QuantityType<?>) state;
// sanity convert current state to the item state description unit in case it was updated in the
// meantime. The item state is still in the "original" unit while the state description will
// display the new unit:
Unit<?> patternUnit = UnitUtils.parseUnit(formatPattern);
if (patternUnit != null && !quantityState.getUnit().equals(patternUnit)) {
quantityState = quantityState.toUnit(patternUnit);
}
// The widget may define its own unit in the widget label. Convert to this unit:
quantityState = convertStateToWidgetUnit(quantityState, w);
state = quantityState;
}
// This also handles IllegalFormatConversionException, which is a subclass of IllegalArgument.
try {
formatPattern = fillFormatPattern(formatPattern, state);
} catch (IllegalArgumentException e) {
logger.warn("Exception while formatting value '{}' of item {} with format '{}': {}", state, itemName, formatPattern, e.getMessage());
formatPattern = new String("Err");
}
}
label = label.trim();
label = label.substring(0, label.indexOf("[") + 1) + formatPattern + "]";
}
}
return transform(label, labelMappedOption);
}
use of org.eclipse.smarthome.core.items.Item in project smarthome by eclipse.
the class DefaultChartProvider method createChart.
@Override
public BufferedImage createChart(String service, String theme, Date startTime, Date endTime, int height, int width, String items, String groups, Integer dpiValue, Boolean legend) throws ItemNotFoundException, IllegalArgumentException {
logger.debug("Rendering chart: service: '{}', theme: '{}', startTime: '{}', endTime: '{}', width: '{}', height: '{}', items: '{}', groups: '{}', dpi: '{}', legend: '{}'", service, theme, startTime, endTime, width, height, items, groups, dpiValue, legend);
QueryablePersistenceService persistenceService;
int seriesCounter = 0;
// get theme
ChartTheme chartTheme = getChartTheme(theme);
// get DPI
int dpi;
if (dpiValue != null && dpiValue > 0) {
dpi = dpiValue;
} else {
dpi = DPI_DEFAULT;
}
// Create Chart
Chart chart = new ChartBuilder().width(width).height(height).build();
// Define the time axis - the defaults are not very nice
long period = (endTime.getTime() - startTime.getTime()) / 1000;
String pattern = "HH:mm";
if (period <= 600) {
// 10 minutes
pattern = "mm:ss";
} else if (period <= 86400) {
// 1 day
pattern = "HH:mm";
} else if (period <= 604800) {
// 1 week
pattern = "EEE d";
} else {
pattern = "d MMM";
}
chart.getStyleManager().setDatePattern(pattern);
// axis
chart.getStyleManager().setAxisTickLabelsFont(chartTheme.getAxisTickLabelsFont(dpi));
chart.getStyleManager().setAxisTickLabelsColor(chartTheme.getAxisTickLabelsColor());
chart.getStyleManager().setXAxisMin(startTime.getTime());
chart.getStyleManager().setXAxisMax(endTime.getTime());
int yAxisSpacing = Math.max(height / 10, chartTheme.getAxisTickLabelsFont(dpi).getSize());
chart.getStyleManager().setYAxisTickMarkSpacingHint(yAxisSpacing);
// chart
chart.getStyleManager().setChartBackgroundColor(chartTheme.getChartBackgroundColor());
chart.getStyleManager().setChartFontColor(chartTheme.getChartFontColor());
chart.getStyleManager().setChartPadding(chartTheme.getChartPadding(dpi));
chart.getStyleManager().setPlotBackgroundColor(chartTheme.getPlotBackgroundColor());
float plotGridLinesDash = (float) chartTheme.getPlotGridLinesDash(dpi);
float[] plotGridLinesDashArray = { plotGridLinesDash, plotGridLinesDash };
chart.getStyleManager().setPlotGridLinesStroke(new BasicStroke((float) chartTheme.getPlotGridLinesWidth(dpi), 0, 2, 10, plotGridLinesDashArray, 0));
chart.getStyleManager().setPlotGridLinesColor(chartTheme.getPlotGridLinesColor());
// legend
chart.getStyleManager().setLegendBackgroundColor(chartTheme.getLegendBackgroundColor());
chart.getStyleManager().setLegendFont(chartTheme.getLegendFont(dpi));
chart.getStyleManager().setLegendSeriesLineLength(chartTheme.getLegendSeriesLineLength(dpi));
// If a persistence service is specified, find the provider
persistenceService = null;
if (service != null) {
persistenceService = getPersistenceServices().get(service);
} else {
// Otherwise, just get the first service, if one exists
Iterator<Entry<String, QueryablePersistenceService>> it = getPersistenceServices().entrySet().iterator();
if (it.hasNext()) {
persistenceService = it.next().getValue();
} else {
throw new IllegalArgumentException("No Persistence service found.");
}
}
// Did we find a service?
if (persistenceService == null) {
throw new IllegalArgumentException("Persistence service not found '" + service + "'.");
}
// Loop through all the items
if (items != null) {
String[] itemNames = items.split(",");
for (String itemName : itemNames) {
Item item = itemUIRegistry.getItem(itemName);
if (addItem(chart, persistenceService, startTime, endTime, item, seriesCounter, chartTheme, dpi)) {
seriesCounter++;
}
}
}
// Loop through all the groups and add each item from each group
if (groups != null) {
String[] groupNames = groups.split(",");
for (String groupName : groupNames) {
Item item = itemUIRegistry.getItem(groupName);
if (item instanceof GroupItem) {
GroupItem groupItem = (GroupItem) item;
for (Item member : groupItem.getMembers()) {
if (addItem(chart, persistenceService, startTime, endTime, member, seriesCounter, chartTheme, dpi)) {
seriesCounter++;
}
}
} else {
throw new ItemNotFoundException("Item '" + item.getName() + "' defined in groups is not a group.");
}
}
}
Boolean showLegend = null;
// If there are no series, render a blank chart
if (seriesCounter == 0) {
// always hide the legend
showLegend = false;
List<Date> xData = new ArrayList<Date>();
List<Number> yData = new ArrayList<Number>();
xData.add(startTime);
yData.add(0);
xData.add(endTime);
yData.add(0);
Series series = chart.addSeries("NONE", xData, yData);
series.setMarker(SeriesMarker.NONE);
series.setLineStyle(new BasicStroke(0f));
}
// if the legend is not already hidden, check if legend parameter is supplied, or calculate a sensible value
if (showLegend == null) {
if (legend == null) {
// more than one series, show the legend. otherwise hide it.
showLegend = seriesCounter > 1;
} else {
// take value from supplied legend parameter
showLegend = legend;
}
}
// This won't be perfect, but it's a good compromise
if (showLegend) {
if (legendPosition < 0) {
chart.getStyleManager().setLegendPosition(LegendPosition.InsideNW);
} else {
chart.getStyleManager().setLegendPosition(LegendPosition.InsideSW);
}
} else {
// hide the whole legend
chart.getStyleManager().setLegendVisible(false);
}
// Write the chart as a PNG image
BufferedImage lBufferedImage = new BufferedImage(chart.getWidth(), chart.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D lGraphics2D = lBufferedImage.createGraphics();
chart.paint(lGraphics2D);
return lBufferedImage;
}
use of org.eclipse.smarthome.core.items.Item in project smarthome by eclipse.
the class CommunicationManager method handleCallFromHandler.
void handleCallFromHandler(ChannelUID channelUID, @Nullable Thing thing, Consumer<Profile> action) {
itemChannelLinkRegistry.stream().filter(link -> {
// all links for the channel
return link.getLinkedUID().equals(channelUID);
}).forEach(link -> {
Item item = getItem(link.getItemName());
if (item != null) {
Profile profile = getProfile(link, item, thing);
action.accept(profile);
}
});
}
use of org.eclipse.smarthome.core.items.Item in project smarthome by eclipse.
the class CommunicationManager method calculateAcceptedTypes.
private synchronized void calculateAcceptedTypes() {
acceptedCommandTypeMap.clear();
acceptedStateTypeMap.clear();
for (ItemFactory itemFactory : itemFactories) {
for (String itemTypeName : itemFactory.getSupportedItemTypes()) {
Item item = itemFactory.createItem(itemTypeName, "tmp");
if (item != null) {
acceptedCommandTypeMap.put(itemTypeName, item.getAcceptedCommandTypes());
acceptedStateTypeMap.put(itemTypeName, item.getAcceptedDataTypes());
} else {
logger.error("Item factory {} suggested it can create items of type {} but returned null", itemFactory, itemTypeName);
}
}
}
}
Aggregations