diff --git a/org.openhab.binding.zigbee/src/main/java/org/openhab/binding/zigbee/ZigBeeBindingConstants.java b/org.openhab.binding.zigbee/src/main/java/org/openhab/binding/zigbee/ZigBeeBindingConstants.java index 490e940fb..5e04f6c3c 100644 --- a/org.openhab.binding.zigbee/src/main/java/org/openhab/binding/zigbee/ZigBeeBindingConstants.java +++ b/org.openhab.binding.zigbee/src/main/java/org/openhab/binding/zigbee/ZigBeeBindingConstants.java @@ -210,6 +210,19 @@ public class ZigBeeBindingConstants { public static final String CHANNEL_LABEL_WINDOWCOVERING_LIFT = "Window Covering Lift"; public static final ChannelTypeUID CHANNEL_WINDOWCOVERING_LIFT = new ChannelTypeUID("zigbee:windowcovering_lift"); + public static final String CHANNEL_NAME_INSTANTANEOUS_DEMAND = "meteringinstantdemand"; + public static final String CHANNEL_LABEL_INSTANTANEOUS_DEMAND = "Metering Instantaneous Demand"; + public static final ChannelTypeUID CHANNEL_INSTANTANEOUS_DEMAND = new ChannelTypeUID( + "zigbee:metering_instantdemand"); + + public static final String CHANNEL_NAME_SUMMATION_DELIVERED = "meteringsumdelivered"; + public static final String CHANNEL_LABEL_SUMMATION_DELIVERED = "Metering Summation Delivered"; + public static final ChannelTypeUID CHANNEL_SUMMATION_DELIVERED = new ChannelTypeUID("zigbee:metering_sumdelivered"); + + public static final String CHANNEL_NAME_SUMMATION_RECEIVED = "meteringsumreceived"; + public static final String CHANNEL_LABEL_SUMMATION_RECEIVED = "Metering Summation Received"; + public static final ChannelTypeUID CHANNEL_SUMMATION_RECEIVED = new ChannelTypeUID("zigbee:metering_sumreceived"); + public static final String CHANNEL_PROPERTY_ENDPOINT = "zigbee_endpoint"; public static final String CHANNEL_PROPERTY_PROFILEID = "zigbee_profileid"; public static final String CHANNEL_PROPERTY_INPUTCLUSTERS = "zigbee_inputclusters"; diff --git a/org.openhab.binding.zigbee/src/main/java/org/openhab/binding/zigbee/internal/converter/ZigBeeConverterMeteringInstantaneousDemand.java b/org.openhab.binding.zigbee/src/main/java/org/openhab/binding/zigbee/internal/converter/ZigBeeConverterMeteringInstantaneousDemand.java new file mode 100644 index 000000000..09b0c51ea --- /dev/null +++ b/org.openhab.binding.zigbee/src/main/java/org/openhab/binding/zigbee/internal/converter/ZigBeeConverterMeteringInstantaneousDemand.java @@ -0,0 +1,181 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.zigbee.internal.converter; + +import java.math.BigDecimal; +import java.util.Collections; +import java.util.Set; +import java.util.concurrent.ExecutionException; + +import org.openhab.binding.zigbee.ZigBeeBindingConstants; +import org.openhab.binding.zigbee.converter.ZigBeeBaseChannelConverter; +import org.openhab.binding.zigbee.handler.ZigBeeThingHandler; +import org.openhab.core.library.types.DecimalType; +import org.openhab.core.thing.Channel; +import org.openhab.core.thing.ThingUID; +import org.openhab.core.thing.binding.builder.ChannelBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.zsmartsystems.zigbee.CommandResult; +import com.zsmartsystems.zigbee.ZigBeeEndpoint; +import com.zsmartsystems.zigbee.zcl.ZclAttribute; +import com.zsmartsystems.zigbee.zcl.ZclAttributeListener; +import com.zsmartsystems.zigbee.zcl.clusters.ZclMeteringCluster; +import com.zsmartsystems.zigbee.zcl.protocol.ZclClusterType; + +/** + * ZigBee channel converter for instantaneous demand measurement + * + * @author Chris Jackson - Initial Contribution + * + */ +public class ZigBeeConverterMeteringInstantaneousDemand extends ZigBeeBaseChannelConverter + implements ZclAttributeListener { + private Logger logger = LoggerFactory.getLogger(ZigBeeConverterMeteringInstantaneousDemand.class); + + private ZclMeteringCluster clusterMetering; + + private ZclAttribute attribute; + + private Integer divisor; + private Integer multiplier; + + @Override + public Set getImplementedClientClusters() { + return Collections.singleton(ZclMeteringCluster.CLUSTER_ID); + } + + @Override + public Set getImplementedServerClusters() { + return Collections.emptySet(); + } + + @Override + public boolean initializeDevice() { + logger.debug("{}: Initialising electrical measurement cluster", endpoint.getIeeeAddress()); + + ZclMeteringCluster serverClusterMeasurement = (ZclMeteringCluster) endpoint + .getInputCluster(ZclMeteringCluster.CLUSTER_ID); + if (serverClusterMeasurement == null) { + logger.error("{}: Error opening metering cluster", endpoint.getIeeeAddress()); + return false; + } + + try { + CommandResult bindResponse = bind(serverClusterMeasurement).get(); + if (bindResponse.isSuccess()) { + ZclAttribute attribute = serverClusterMeasurement + .getAttribute(ZclMeteringCluster.ATTR_INSTANTANEOUSDEMAND); + // Configure reporting - no faster than once per second - no slower than 2 hours. + CommandResult reportingResponse = attribute.setReporting(3, REPORTING_PERIOD_DEFAULT_MAX, 1).get(); + handleReportingResponse(reportingResponse, POLLING_PERIOD_HIGH, REPORTING_PERIOD_DEFAULT_MAX); + } else { + pollingPeriod = POLLING_PERIOD_HIGH; + } + } catch (InterruptedException | ExecutionException e) { + logger.error("{}: Exception setting reporting ", endpoint.getIeeeAddress(), e); + return false; + } + + return true; + } + + @Override + public boolean initializeConverter(ZigBeeThingHandler thing) { + super.initializeConverter(thing); + clusterMetering = (ZclMeteringCluster) endpoint.getInputCluster(ZclMeteringCluster.CLUSTER_ID); + if (clusterMetering == null) { + logger.error("{}: Error opening metering cluster", endpoint.getIeeeAddress()); + return false; + } + + attribute = clusterMetering.getAttribute(ZclMeteringCluster.ATTR_INSTANTANEOUSDEMAND); + + determineDivisorAndMultiplier(clusterMetering); + + // Add a listener + clusterMetering.addAttributeListener(this); + return true; + } + + @Override + public void disposeConverter() { + + clusterMetering.removeAttributeListener(this); + } + + @Override + public void handleRefresh() { + attribute.readValue(0); + } + + @Override + public Channel getChannel(ThingUID thingUID, ZigBeeEndpoint endpoint) { + ZclMeteringCluster cluster = (ZclMeteringCluster) endpoint.getInputCluster(ZclMeteringCluster.CLUSTER_ID); + if (cluster == null) { + logger.trace("{}: Metering cluster not found", endpoint.getIeeeAddress()); + return null; + } + + try { + if (!cluster.discoverAttributes(false).get() + && !cluster.isAttributeSupported(ZclMeteringCluster.ATTR_INSTANTANEOUSDEMAND)) { + logger.trace("{}: Metering cluster instantaneous demand not supported", endpoint.getIeeeAddress()); + + return null; + } else { + ZclAttribute attribute = cluster.getAttribute(ZclMeteringCluster.ATTR_INSTANTANEOUSDEMAND); + if (attribute.readValue(Long.MAX_VALUE) == null) { + + logger.trace("{}: Metering cluster instantaneous demand returned null", endpoint.getIeeeAddress()); + return null; + } + } + } catch (InterruptedException | ExecutionException e) { + logger.warn("{}: Exception discovering attributes in metering cluster", endpoint.getIeeeAddress(), e); + return null; + } + + return ChannelBuilder + .create(createChannelUID(thingUID, endpoint, ZigBeeBindingConstants.CHANNEL_NAME_INSTANTANEOUS_DEMAND), + ZigBeeBindingConstants.ITEM_TYPE_NUMBER) + .withType(ZigBeeBindingConstants.CHANNEL_INSTANTANEOUS_DEMAND) + .withLabel(ZigBeeBindingConstants.CHANNEL_LABEL_INSTANTANEOUS_DEMAND) + .withProperties(createProperties(endpoint)).build(); + } + + @Override + public void attributeUpdated(ZclAttribute attribute, Object val) { + logger.debug("{}: ZigBee attribute reports {}", endpoint.getIeeeAddress(), attribute); + if (attribute.getCluster() == ZclClusterType.ELECTRICAL_MEASUREMENT + && attribute.getId() == ZclMeteringCluster.ATTR_INSTANTANEOUSDEMAND) { + Integer value = (Integer) val; + BigDecimal valueCalibrated = BigDecimal.valueOf(value * multiplier / divisor); + updateChannelState(new DecimalType(valueCalibrated)); + } + } + + private void determineDivisorAndMultiplier(ZclMeteringCluster serverClusterMeasurement) { + ZclAttribute divisorAttribute = clusterMetering.getAttribute(ZclMeteringCluster.ATTR_DIVISOR); + ZclAttribute multiplierAttribute = clusterMetering.getAttribute(ZclMeteringCluster.ATTR_MULTIPLIER); + + divisor = (Integer) divisorAttribute.readValue(Long.MAX_VALUE); + multiplier = (Integer) multiplierAttribute.readValue(Long.MAX_VALUE); + if (divisor == null || multiplier == null) { + divisor = 1; + multiplier = 1; + } + } + +} diff --git a/org.openhab.binding.zigbee/src/main/java/org/openhab/binding/zigbee/internal/converter/ZigBeeConverterMeteringSummationDelivered.java b/org.openhab.binding.zigbee/src/main/java/org/openhab/binding/zigbee/internal/converter/ZigBeeConverterMeteringSummationDelivered.java new file mode 100644 index 000000000..3d59adf6b --- /dev/null +++ b/org.openhab.binding.zigbee/src/main/java/org/openhab/binding/zigbee/internal/converter/ZigBeeConverterMeteringSummationDelivered.java @@ -0,0 +1,180 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.zigbee.internal.converter; + +import java.math.BigDecimal; +import java.util.Collections; +import java.util.Set; +import java.util.concurrent.ExecutionException; + +import org.openhab.binding.zigbee.ZigBeeBindingConstants; +import org.openhab.binding.zigbee.converter.ZigBeeBaseChannelConverter; +import org.openhab.binding.zigbee.handler.ZigBeeThingHandler; +import org.openhab.core.library.types.DecimalType; +import org.openhab.core.thing.Channel; +import org.openhab.core.thing.ThingUID; +import org.openhab.core.thing.binding.builder.ChannelBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.zsmartsystems.zigbee.CommandResult; +import com.zsmartsystems.zigbee.ZigBeeEndpoint; +import com.zsmartsystems.zigbee.zcl.ZclAttribute; +import com.zsmartsystems.zigbee.zcl.ZclAttributeListener; +import com.zsmartsystems.zigbee.zcl.clusters.ZclMeteringCluster; +import com.zsmartsystems.zigbee.zcl.protocol.ZclClusterType; + +/** + * ZigBee channel converter for summation delivered measurement + * + * @author Chris Jackson - Initial Contribution + * + */ +public class ZigBeeConverterMeteringSummationDelivered extends ZigBeeBaseChannelConverter + implements ZclAttributeListener { + private Logger logger = LoggerFactory.getLogger(ZigBeeConverterMeteringSummationDelivered.class); + + private ZclMeteringCluster clusterMetering; + + private ZclAttribute attribute; + + private Integer divisor; + private Integer multiplier; + + @Override + public Set getImplementedClientClusters() { + return Collections.singleton(ZclMeteringCluster.CLUSTER_ID); + } + + @Override + public Set getImplementedServerClusters() { + return Collections.emptySet(); + } + + @Override + public boolean initializeDevice() { + logger.debug("{}: Initialising electrical measurement cluster", endpoint.getIeeeAddress()); + + ZclMeteringCluster serverClusterMeasurement = (ZclMeteringCluster) endpoint + .getInputCluster(ZclMeteringCluster.CLUSTER_ID); + if (serverClusterMeasurement == null) { + logger.error("{}: Error opening metering cluster", endpoint.getIeeeAddress()); + return false; + } + + try { + CommandResult bindResponse = bind(serverClusterMeasurement).get(); + if (bindResponse.isSuccess()) { + ZclAttribute attribute = serverClusterMeasurement + .getAttribute(ZclMeteringCluster.ATTR_CURRENTSUMMATIONDELIVERED); + // Configure reporting - no faster than once per second - no slower than 2 hours. + CommandResult reportingResponse = attribute.setReporting(3, REPORTING_PERIOD_DEFAULT_MAX, 1).get(); + handleReportingResponse(reportingResponse, POLLING_PERIOD_HIGH, REPORTING_PERIOD_DEFAULT_MAX); + } else { + pollingPeriod = POLLING_PERIOD_HIGH; + } + } catch (InterruptedException | ExecutionException e) { + logger.error("{}: Exception setting reporting ", endpoint.getIeeeAddress(), e); + return false; + } + + return true; + } + + @Override + public boolean initializeConverter(ZigBeeThingHandler thing) { + super.initializeConverter(thing); + clusterMetering = (ZclMeteringCluster) endpoint.getInputCluster(ZclMeteringCluster.CLUSTER_ID); + if (clusterMetering == null) { + logger.error("{}: Error opening metering cluster", endpoint.getIeeeAddress()); + return false; + } + + attribute = clusterMetering.getAttribute(ZclMeteringCluster.ATTR_CURRENTSUMMATIONDELIVERED); + + determineDivisorAndMultiplier(clusterMetering); + + // Add a listener + clusterMetering.addAttributeListener(this); + return true; + } + + @Override + public void disposeConverter() { + clusterMetering.removeAttributeListener(this); + } + + @Override + public void handleRefresh() { + attribute.readValue(0); + } + + @Override + public Channel getChannel(ThingUID thingUID, ZigBeeEndpoint endpoint) { + ZclMeteringCluster cluster = (ZclMeteringCluster) endpoint.getInputCluster(ZclMeteringCluster.CLUSTER_ID); + if (cluster == null) { + logger.trace("{}: Metering cluster not found", endpoint.getIeeeAddress()); + return null; + } + + try { + if (!cluster.discoverAttributes(false).get() + && !cluster.isAttributeSupported(ZclMeteringCluster.ATTR_CURRENTSUMMATIONDELIVERED)) { + logger.trace("{}: Metering cluster summation delivered not supported", endpoint.getIeeeAddress()); + + return null; + } else { + ZclAttribute attribute = cluster.getAttribute(ZclMeteringCluster.ATTR_CURRENTSUMMATIONDELIVERED); + if (attribute.readValue(Long.MAX_VALUE) == null) { + + logger.trace("{}: Metering cluster summation delivered returned null", endpoint.getIeeeAddress()); + return null; + } + } + } catch (InterruptedException | ExecutionException e) { + logger.warn("{}: Exception discovering attributes in metering cluster", endpoint.getIeeeAddress(), e); + return null; + } + + return ChannelBuilder + .create(createChannelUID(thingUID, endpoint, ZigBeeBindingConstants.CHANNEL_NAME_SUMMATION_DELIVERED), + ZigBeeBindingConstants.ITEM_TYPE_NUMBER) + .withType(ZigBeeBindingConstants.CHANNEL_SUMMATION_DELIVERED) + .withLabel(ZigBeeBindingConstants.CHANNEL_LABEL_SUMMATION_DELIVERED) + .withProperties(createProperties(endpoint)).build(); + } + + @Override + public void attributeUpdated(ZclAttribute attribute, Object val) { + logger.debug("{}: ZigBee attribute reports {}", endpoint.getIeeeAddress(), attribute); + if (attribute.getCluster() == ZclClusterType.ELECTRICAL_MEASUREMENT + && attribute.getId() == ZclMeteringCluster.ATTR_CURRENTSUMMATIONDELIVERED) { + Integer value = (Integer) val; + BigDecimal valueCalibrated = BigDecimal.valueOf(value * multiplier / divisor); + updateChannelState(new DecimalType(valueCalibrated)); + } + } + + private void determineDivisorAndMultiplier(ZclMeteringCluster serverClusterMeasurement) { + ZclAttribute divisorAttribute = clusterMetering.getAttribute(ZclMeteringCluster.ATTR_DIVISOR); + ZclAttribute multiplierAttribute = clusterMetering.getAttribute(ZclMeteringCluster.ATTR_MULTIPLIER); + + divisor = (Integer) divisorAttribute.readValue(Long.MAX_VALUE); + multiplier = (Integer) multiplierAttribute.readValue(Long.MAX_VALUE); + if (divisor == null || multiplier == null) { + divisor = 1; + multiplier = 1; + } + } + +} diff --git a/org.openhab.binding.zigbee/src/main/java/org/openhab/binding/zigbee/internal/converter/ZigBeeConverterMeteringSummationReceived.java b/org.openhab.binding.zigbee/src/main/java/org/openhab/binding/zigbee/internal/converter/ZigBeeConverterMeteringSummationReceived.java new file mode 100644 index 000000000..17f9e0ef0 --- /dev/null +++ b/org.openhab.binding.zigbee/src/main/java/org/openhab/binding/zigbee/internal/converter/ZigBeeConverterMeteringSummationReceived.java @@ -0,0 +1,180 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.zigbee.internal.converter; + +import java.math.BigDecimal; +import java.util.Collections; +import java.util.Set; +import java.util.concurrent.ExecutionException; + +import org.openhab.binding.zigbee.ZigBeeBindingConstants; +import org.openhab.binding.zigbee.converter.ZigBeeBaseChannelConverter; +import org.openhab.binding.zigbee.handler.ZigBeeThingHandler; +import org.openhab.core.library.types.DecimalType; +import org.openhab.core.thing.Channel; +import org.openhab.core.thing.ThingUID; +import org.openhab.core.thing.binding.builder.ChannelBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.zsmartsystems.zigbee.CommandResult; +import com.zsmartsystems.zigbee.ZigBeeEndpoint; +import com.zsmartsystems.zigbee.zcl.ZclAttribute; +import com.zsmartsystems.zigbee.zcl.ZclAttributeListener; +import com.zsmartsystems.zigbee.zcl.clusters.ZclMeteringCluster; +import com.zsmartsystems.zigbee.zcl.protocol.ZclClusterType; + +/** + * ZigBee channel converter for summation received measurement + * + * @author Chris Jackson - Initial Contribution + * + */ +public class ZigBeeConverterMeteringSummationReceived extends ZigBeeBaseChannelConverter + implements ZclAttributeListener { + private Logger logger = LoggerFactory.getLogger(ZigBeeConverterMeteringSummationReceived.class); + + private ZclMeteringCluster clusterMetering; + + private ZclAttribute attribute; + + private Integer divisor; + private Integer multiplier; + + @Override + public Set getImplementedClientClusters() { + return Collections.singleton(ZclMeteringCluster.CLUSTER_ID); + } + + @Override + public Set getImplementedServerClusters() { + return Collections.emptySet(); + } + + @Override + public boolean initializeDevice() { + logger.debug("{}: Initialising electrical measurement cluster", endpoint.getIeeeAddress()); + + ZclMeteringCluster serverClusterMeasurement = (ZclMeteringCluster) endpoint + .getInputCluster(ZclMeteringCluster.CLUSTER_ID); + if (serverClusterMeasurement == null) { + logger.error("{}: Error opening metering cluster", endpoint.getIeeeAddress()); + return false; + } + + try { + CommandResult bindResponse = bind(serverClusterMeasurement).get(); + if (bindResponse.isSuccess()) { + ZclAttribute attribute = serverClusterMeasurement + .getAttribute(ZclMeteringCluster.ATTR_CURRENTSUMMATIONRECEIVED); + // Configure reporting - no faster than once per second - no slower than 2 hours. + CommandResult reportingResponse = attribute.setReporting(3, REPORTING_PERIOD_DEFAULT_MAX, 1).get(); + handleReportingResponse(reportingResponse, POLLING_PERIOD_HIGH, REPORTING_PERIOD_DEFAULT_MAX); + } else { + pollingPeriod = POLLING_PERIOD_HIGH; + } + } catch (InterruptedException | ExecutionException e) { + logger.error("{}: Exception setting reporting ", endpoint.getIeeeAddress(), e); + return false; + } + + return true; + } + + @Override + public boolean initializeConverter(ZigBeeThingHandler thing) { + super.initializeConverter(thing); + clusterMetering = (ZclMeteringCluster) endpoint.getInputCluster(ZclMeteringCluster.CLUSTER_ID); + if (clusterMetering == null) { + logger.error("{}: Error opening metering cluster", endpoint.getIeeeAddress()); + return false; + } + + attribute = clusterMetering.getAttribute(ZclMeteringCluster.ATTR_CURRENTSUMMATIONRECEIVED); + + determineDivisorAndMultiplier(clusterMetering); + + // Add a listener + clusterMetering.addAttributeListener(this); + return true; + } + + @Override + public void disposeConverter() { + clusterMetering.removeAttributeListener(this); + } + + @Override + public void handleRefresh() { + attribute.readValue(0); + } + + @Override + public Channel getChannel(ThingUID thingUID, ZigBeeEndpoint endpoint) { + ZclMeteringCluster cluster = (ZclMeteringCluster) endpoint.getInputCluster(ZclMeteringCluster.CLUSTER_ID); + if (cluster == null) { + logger.trace("{}: Metering cluster not found", endpoint.getIeeeAddress()); + return null; + } + + try { + if (!cluster.discoverAttributes(false).get() + && !cluster.isAttributeSupported(ZclMeteringCluster.ATTR_CURRENTSUMMATIONRECEIVED)) { + logger.trace("{}: Metering cluster summation received not supported", endpoint.getIeeeAddress()); + + return null; + } else { + ZclAttribute attribute = cluster.getAttribute(ZclMeteringCluster.ATTR_CURRENTSUMMATIONRECEIVED); + if (attribute.readValue(Long.MAX_VALUE) == null) { + + logger.trace("{}: Metering cluster summation received returned null", endpoint.getIeeeAddress()); + return null; + } + } + } catch (InterruptedException | ExecutionException e) { + logger.warn("{}: Exception discovering attributes in metering cluster", endpoint.getIeeeAddress(), e); + return null; + } + + return ChannelBuilder + .create(createChannelUID(thingUID, endpoint, ZigBeeBindingConstants.CHANNEL_NAME_SUMMATION_RECEIVED), + ZigBeeBindingConstants.ITEM_TYPE_NUMBER) + .withType(ZigBeeBindingConstants.CHANNEL_SUMMATION_RECEIVED) + .withLabel(ZigBeeBindingConstants.CHANNEL_LABEL_SUMMATION_RECEIVED) + .withProperties(createProperties(endpoint)).build(); + } + + @Override + public void attributeUpdated(ZclAttribute attribute, Object val) { + logger.debug("{}: ZigBee attribute reports {}", endpoint.getIeeeAddress(), attribute); + if (attribute.getCluster() == ZclClusterType.ELECTRICAL_MEASUREMENT + && attribute.getId() == ZclMeteringCluster.ATTR_CURRENTSUMMATIONRECEIVED) { + Integer value = (Integer) val; + BigDecimal valueCalibrated = BigDecimal.valueOf(value * multiplier / divisor); + updateChannelState(new DecimalType(valueCalibrated)); + } + } + + private void determineDivisorAndMultiplier(ZclMeteringCluster serverClusterMeasurement) { + ZclAttribute divisorAttribute = clusterMetering.getAttribute(ZclMeteringCluster.ATTR_DIVISOR); + ZclAttribute multiplierAttribute = clusterMetering.getAttribute(ZclMeteringCluster.ATTR_MULTIPLIER); + + divisor = (Integer) divisorAttribute.readValue(Long.MAX_VALUE); + multiplier = (Integer) multiplierAttribute.readValue(Long.MAX_VALUE); + if (divisor == null || multiplier == null) { + divisor = 1; + multiplier = 1; + } + } + +} diff --git a/org.openhab.binding.zigbee/src/main/java/org/openhab/binding/zigbee/internal/converter/ZigBeeDefaultChannelConverterProvider.java b/org.openhab.binding.zigbee/src/main/java/org/openhab/binding/zigbee/internal/converter/ZigBeeDefaultChannelConverterProvider.java index 090cfd1fb..a916917a1 100644 --- a/org.openhab.binding.zigbee/src/main/java/org/openhab/binding/zigbee/internal/converter/ZigBeeDefaultChannelConverterProvider.java +++ b/org.openhab.binding.zigbee/src/main/java/org/openhab/binding/zigbee/internal/converter/ZigBeeDefaultChannelConverterProvider.java @@ -15,13 +15,13 @@ import java.util.HashMap; import java.util.Map; -import org.openhab.core.thing.DefaultSystemChannelTypeProvider; -import org.openhab.core.thing.type.ChannelTypeUID; import org.openhab.binding.zigbee.ZigBeeBindingConstants; import org.openhab.binding.zigbee.converter.ZigBeeBaseChannelConverter; import org.openhab.binding.zigbee.converter.ZigBeeChannelConverterFactory; import org.openhab.binding.zigbee.converter.ZigBeeChannelConverterProvider; import org.openhab.binding.zigbee.internal.converter.warningdevice.ZigBeeConverterWarningDevice; +import org.openhab.core.thing.DefaultSystemChannelTypeProvider; +import org.openhab.core.thing.type.ChannelTypeUID; import org.osgi.service.component.annotations.Component; /** @@ -86,6 +86,12 @@ public ZigBeeDefaultChannelConverterProvider() { channelMap.put(ZigBeeBindingConstants.CHANNEL_THERMOSTAT_SYSTEMMODE, ZigBeeConverterThermostatSystemMode.class); channelMap.put(ZigBeeBindingConstants.CHANNEL_FANCONTROL, ZigBeeConverterFanControl.class); channelMap.put(ZigBeeBindingConstants.CHANNEL_WINDOWCOVERING_LIFT, ZigBeeConverterWindowCoveringLift.class); + channelMap.put(ZigBeeBindingConstants.CHANNEL_INSTANTANEOUS_DEMAND, + ZigBeeConverterMeteringInstantaneousDemand.class); + channelMap.put(ZigBeeBindingConstants.CHANNEL_SUMMATION_DELIVERED, + ZigBeeConverterMeteringSummationDelivered.class); + channelMap.put(ZigBeeBindingConstants.CHANNEL_SUMMATION_RECEIVED, + ZigBeeConverterMeteringSummationReceived.class); } @Override diff --git a/org.openhab.binding.zigbee/src/main/resources/OH-INF/thing/channels.xml b/org.openhab.binding.zigbee/src/main/resources/OH-INF/thing/channels.xml index 686bb199e..6a84ab744 100644 --- a/org.openhab.binding.zigbee/src/main/resources/OH-INF/thing/channels.xml +++ b/org.openhab.binding.zigbee/src/main/resources/OH-INF/thing/channels.xml @@ -231,6 +231,33 @@ + + + Number + + The instantaneous demand from the metering system + Number + veto + + + + + Number + + The total delivered from the metering system + Number + veto + + + + + Number + + The total delivered from the metering system + Number + veto + + Switch @@ -256,7 +283,7 @@ Sets the level of the light Light veto - +