2 * Copyright (c) 2010-2024 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.mercedesme.internal;
15 import javax.measure.Unit;
16 import javax.measure.quantity.Length;
18 import org.eclipse.jdt.annotation.NonNullByDefault;
19 import org.openhab.core.common.registry.RegistryChangeListener;
20 import org.openhab.core.i18n.UnitProvider;
21 import org.openhab.core.items.Metadata;
22 import org.openhab.core.items.MetadataKey;
23 import org.openhab.core.items.MetadataRegistry;
24 import org.openhab.core.library.unit.ImperialUnits;
25 import org.openhab.core.library.unit.SIUnits;
26 import org.openhab.core.library.unit.Units;
27 import org.openhab.core.thing.ChannelUID;
28 import org.openhab.core.thing.link.ItemChannelLink;
29 import org.openhab.core.thing.link.ItemChannelLinkRegistry;
32 * {@link MercedesMeMetadataAdjuster} changes Metadata for channels not providing the system default unit
34 * @author Bernd Weymann - Initial contribution
37 public class MercedesMeMetadataAdjuster implements RegistryChangeListener<ItemChannelLink> {
38 private final MetadataRegistry metadataRegistry;
39 private final ItemChannelLinkRegistry channelLinkRegistry;
40 private final UnitProvider unitProvider;
42 public MercedesMeMetadataAdjuster(MetadataRegistry mdr, ItemChannelLinkRegistry iclr, UnitProvider up) {
43 metadataRegistry = mdr;
44 channelLinkRegistry = iclr;
46 channelLinkRegistry.addRegistryChangeListener(this);
50 * Adjust Units to binding defaults
53 public void added(ItemChannelLink element) {
54 ChannelUID cuid = element.getLinkedUID();
55 String itemName = element.getItemName();
56 if (Constants.BINDING_ID.equals(cuid.getBindingId())) {
57 MetadataKey key = new MetadataKey("unit", itemName);
58 switch (cuid.getId()) {
59 case Constants.GROUP_RANGE + ChannelUID.CHANNEL_GROUP_SEPARATOR + "mileage":
60 case Constants.GROUP_RANGE + ChannelUID.CHANNEL_GROUP_SEPARATOR + "range-electric":
61 case Constants.GROUP_RANGE + ChannelUID.CHANNEL_GROUP_SEPARATOR + "radius-electric":
62 case Constants.GROUP_RANGE + ChannelUID.CHANNEL_GROUP_SEPARATOR + "range-fuel":
63 case Constants.GROUP_RANGE + ChannelUID.CHANNEL_GROUP_SEPARATOR + "radius-fuel":
64 case Constants.GROUP_RANGE + ChannelUID.CHANNEL_GROUP_SEPARATOR + "range-hybrid":
65 case Constants.GROUP_RANGE + ChannelUID.CHANNEL_GROUP_SEPARATOR + "radius-hybrid":
66 case Constants.GROUP_RANGE + ChannelUID.CHANNEL_GROUP_SEPARATOR + "home-distance":
67 case Constants.GROUP_TRIP + ChannelUID.CHANNEL_GROUP_SEPARATOR + "distance":
68 case Constants.GROUP_TRIP + ChannelUID.CHANNEL_GROUP_SEPARATOR + "distance-reset":
69 if (metadataRegistry.get(key) == null) {
70 Unit<Length> lengthUnit = unitProvider.getUnit(Length.class);
71 if (ImperialUnits.FOOT.equals(lengthUnit)) {
72 metadataRegistry.add(new Metadata(key, ImperialUnits.MILE.getSymbol(), null));
73 } else if (SIUnits.METRE.equals(lengthUnit)) {
74 metadataRegistry.add(new Metadata(key, Constants.KILOMETRE_UNIT.toString(), null));
78 case Constants.GROUP_RANGE + ChannelUID.CHANNEL_GROUP_SEPARATOR + "soc":
79 case Constants.GROUP_CHARGE + ChannelUID.CHANNEL_GROUP_SEPARATOR + "max-soc":
80 case Constants.GROUP_RANGE + ChannelUID.CHANNEL_GROUP_SEPARATOR + "fuel-level":
81 if (metadataRegistry.get(key) == null) {
82 metadataRegistry.add(new Metadata(key, Units.PERCENT.getSymbol(), null));
85 case Constants.GROUP_TIRES + ChannelUID.CHANNEL_GROUP_SEPARATOR + "pressure-front-left":
86 case Constants.GROUP_TIRES + ChannelUID.CHANNEL_GROUP_SEPARATOR + "pressure-front-right":
87 case Constants.GROUP_TIRES + ChannelUID.CHANNEL_GROUP_SEPARATOR + "pressure-rear-left":
88 case Constants.GROUP_TIRES + ChannelUID.CHANNEL_GROUP_SEPARATOR + "pressure-rear-right":
89 if (metadataRegistry.get(key) == null) {
90 Unit<Length> lengthUnit = unitProvider.getUnit(Length.class);
91 if (ImperialUnits.FOOT.equals(lengthUnit)) {
93 .add(new Metadata(key, ImperialUnits.POUND_FORCE_SQUARE_INCH.getSymbol(), null));
94 } else if (SIUnits.METRE.equals(lengthUnit)) {
95 metadataRegistry.add(new Metadata(key, Units.BAR.getSymbol(), null));
104 public void removed(ItemChannelLink element) {
108 public void updated(ItemChannelLink oldElement, ItemChannelLink element) {