From 145bd0ec978a7dd263f8f82562d98aca64bd7323 Mon Sep 17 00:00:00 2001 From: Flole998 Date: Sat, 11 Dec 2021 17:02:27 +0100 Subject: [PATCH] [Homematic] Fix "Channel not found for Datapoint"-Errors (#11493) Signed-off-by: Flole --- .../handler/HomematicThingHandler.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/bundles/org.openhab.binding.homematic/src/main/java/org/openhab/binding/homematic/internal/handler/HomematicThingHandler.java b/bundles/org.openhab.binding.homematic/src/main/java/org/openhab/binding/homematic/internal/handler/HomematicThingHandler.java index 204e29dc4..a8313e1b7 100644 --- a/bundles/org.openhab.binding.homematic/src/main/java/org/openhab/binding/homematic/internal/handler/HomematicThingHandler.java +++ b/bundles/org.openhab.binding.homematic/src/main/java/org/openhab/binding/homematic/internal/handler/HomematicThingHandler.java @@ -147,10 +147,52 @@ public class HomematicThingHandler extends BaseThingHandler { } updateConfiguration(config); + boolean channelsChanged = false; + // update thing channel list for reconfigurable channels (relies on the new value of the // CHANNEL_FUNCTION datapoint fetched during configuration update) List thingChannels = new ArrayList<>(getThing().getChannels()); + + if (thingChannels.isEmpty()) { + for (HmChannel channel : device.getChannels()) { + for (HmDatapoint dp : channel.getDatapoints()) { + if (HomematicTypeGeneratorImpl.isIgnoredDatapoint(dp) + || dp.getParamsetType() != HmParamsetType.VALUES) { + continue; + } + ChannelUID channelUID = UidUtils.generateChannelUID(dp, getThing().getUID()); + if (containsChannel(thingChannels, channelUID)) { + // Channel is already present + continue; + } + + ChannelTypeUID channelTypeUID = UidUtils.generateChannelTypeUID(dp); + ChannelType channelType = channelTypeProvider.getInternalChannelType(channelTypeUID); + if (channelType == null) { + channelType = HomematicTypeGeneratorImpl.createChannelType(dp, channelTypeUID); + channelTypeProvider.addChannelType(channelType); + } + + Channel thingChannel = ChannelBuilder.create(channelUID, MetadataUtils.getItemType(dp)) + .withLabel(MetadataUtils.getLabel(dp)) + .withDescription(MetadataUtils.getDatapointDescription(dp)).withType(channelType.getUID()) + .build(); + thingChannels.add(thingChannel); + + logger.debug( + "Updated value datapoints for channel {} of device '{}' (function {}), now has {} datapoints", + channel, channel.getDevice().getAddress(), channel.getCurrentFunction(), + channel.getDatapoints().size()); + } + } + channelsChanged = true; + } + if (updateDynamicChannelList(device, thingChannels)) { + channelsChanged = true; + } + + if (channelsChanged) { updateThing(editThing().withChannels(thingChannels).build()); }