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.airgradient.internal.handler;
15 import static org.openhab.binding.airgradient.internal.AirGradientBindingConstants.*;
17 import java.util.ArrayList;
18 import java.util.List;
20 import org.eclipse.jdt.annotation.NonNullByDefault;
21 import org.openhab.core.thing.Channel;
22 import org.openhab.core.thing.ChannelUID;
23 import org.openhab.core.thing.Thing;
24 import org.openhab.core.thing.binding.builder.ChannelBuilder;
25 import org.openhab.core.thing.binding.builder.ThingBuilder;
26 import org.openhab.core.thing.type.ChannelTypeUID;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
31 * The {@link DynamicChannelHelper} is responsible for creating dynamic configuration channels.
33 * @author Jørgen Austvik - Initial contribution
36 public class DynamicChannelHelper {
38 private record ConfigurationChannel(String id, String typeId, String itemType) {
41 private static final List<ConfigurationChannel> CHANNELS = new ArrayList<ConfigurationChannel>() {
43 add(new ConfigurationChannel(CHANNEL_COUNTRY_CODE, CHANNEL_COUNTRY_CODE, "String"));
44 add(new ConfigurationChannel(CHANNEL_PM_STANDARD, CHANNEL_PM_STANDARD, "String"));
45 add(new ConfigurationChannel(CHANNEL_ABC_DAYS, CHANNEL_ABC_DAYS, "Number"));
46 add(new ConfigurationChannel(CHANNEL_TVOC_LEARNING_OFFSET, CHANNEL_TVOC_LEARNING_OFFSET, "Number"));
47 add(new ConfigurationChannel(CHANNEL_NOX_LEARNING_OFFSET, CHANNEL_NOX_LEARNING_OFFSET, "Number"));
48 add(new ConfigurationChannel(CHANNEL_MQTT_BROKER_URL, CHANNEL_MQTT_BROKER_URL, "String"));
49 add(new ConfigurationChannel(CHANNEL_TEMPERATURE_UNIT, CHANNEL_TEMPERATURE_UNIT, "String"));
50 add(new ConfigurationChannel(CHANNEL_CONFIGURATION_CONTROL, CHANNEL_CONFIGURATION_CONTROL, "String"));
51 add(new ConfigurationChannel(CHANNEL_POST_TO_CLOUD, CHANNEL_POST_TO_CLOUD, "Switch"));
52 add(new ConfigurationChannel(CHANNEL_LED_BAR_BRIGHTNESS, CHANNEL_LED_BAR_BRIGHTNESS,
53 "Number:Dimensionless"));
54 add(new ConfigurationChannel(CHANNEL_DISPLAY_BRIGHTNESS, CHANNEL_DISPLAY_BRIGHTNESS,
55 "Number:Dimensionless"));
56 add(new ConfigurationChannel(CHANNEL_MODEL, CHANNEL_MODEL, "String"));
57 add(new ConfigurationChannel(CHANNEL_LED_BAR_TEST, CHANNEL_LED_BAR_TEST, "String"));
61 private static final Logger logger = LoggerFactory.getLogger(DynamicChannelHelper.class);
63 public static ThingBuilder updateThingWithConfigurationChannels(Thing thing, ThingBuilder builder) {
64 for (ConfigurationChannel channel : CHANNELS) {
65 addLocalConfigurationChannel(thing, builder, channel);
71 private static void addLocalConfigurationChannel(Thing originalThing, ThingBuilder builder,
72 ConfigurationChannel toAdd) {
73 ChannelUID channelId = new ChannelUID(originalThing.getUID(), toAdd.id);
74 if (originalThing.getChannel(channelId) == null) {
75 logger.debug("Adding dynamic channel {} to {}", toAdd.id, originalThing.getUID());
76 ChannelTypeUID typeId = new ChannelTypeUID(BINDING_ID, toAdd.typeId);
77 Channel channel = ChannelBuilder.create(channelId, toAdd.itemType).withType(typeId).build();
78 builder.withChannel(channel);