]> git.basschouten.com Git - openhab-addons.git/blob
902d605b4a742f5264089f5752592ec38a05f582
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2024 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
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
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.mercedesme.internal;
14
15 import javax.measure.Unit;
16 import javax.measure.quantity.Length;
17
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;
30
31 /**
32  * {@link MercedesMeMetadataAdjuster} changes Metadata for channels not providing the system default unit
33  *
34  * @author Bernd Weymann - Initial contribution
35  */
36 @NonNullByDefault
37 public class MercedesMeMetadataAdjuster implements RegistryChangeListener<ItemChannelLink> {
38     private final MetadataRegistry metadataRegistry;
39     private final ItemChannelLinkRegistry channelLinkRegistry;
40     private final UnitProvider unitProvider;
41
42     public MercedesMeMetadataAdjuster(MetadataRegistry mdr, ItemChannelLinkRegistry iclr, UnitProvider up) {
43         metadataRegistry = mdr;
44         channelLinkRegistry = iclr;
45         unitProvider = up;
46         channelLinkRegistry.addRegistryChangeListener(this);
47     }
48
49     /**
50      * Adjust Units to binding defaults
51      */
52     @Override
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));
75                         }
76                     }
77                     break;
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));
83                     }
84                     break;
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)) {
92                             metadataRegistry
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));
96                         }
97                     }
98                     break;
99             }
100         }
101     }
102
103     @Override
104     public void removed(ItemChannelLink element) {
105     }
106
107     @Override
108     public void updated(ItemChannelLink oldElement, ItemChannelLink element) {
109     }
110 }