2 * Copyright (c) 2010-2022 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.smaenergymeter.internal.handler;
15 import static org.openhab.binding.smaenergymeter.internal.SMAEnergyMeterBindingConstants.*;
17 import java.io.IOException;
18 import java.util.concurrent.ScheduledFuture;
19 import java.util.concurrent.TimeUnit;
21 import org.openhab.binding.smaenergymeter.internal.configuration.EnergyMeterConfig;
22 import org.openhab.core.thing.ChannelUID;
23 import org.openhab.core.thing.Thing;
24 import org.openhab.core.thing.ThingStatus;
25 import org.openhab.core.thing.ThingStatusDetail;
26 import org.openhab.core.thing.binding.BaseThingHandler;
27 import org.openhab.core.types.Command;
28 import org.openhab.core.types.RefreshType;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
33 * The {@link SMAEnergyMeterHandler} is responsible for handling commands, which are
34 * sent to one of the channels.
36 * @author Osman Basha - Initial contribution
38 public class SMAEnergyMeterHandler extends BaseThingHandler {
40 private final Logger logger = LoggerFactory.getLogger(SMAEnergyMeterHandler.class);
41 private EnergyMeter energyMeter;
42 private ScheduledFuture<?> pollingJob;
44 public SMAEnergyMeterHandler(Thing thing) {
49 public void handleCommand(ChannelUID channelUID, Command command) {
50 if (command == RefreshType.REFRESH) {
51 logger.debug("Refreshing {}", channelUID);
54 logger.warn("This binding is a read-only binding and cannot handle commands");
59 public void initialize() {
60 logger.debug("Initializing SMAEnergyMeter handler '{}'", getThing().getUID());
62 EnergyMeterConfig config = getConfigAs(EnergyMeterConfig.class);
64 int port = (config.getPort() == null) ? EnergyMeter.DEFAULT_MCAST_PORT : config.getPort();
65 energyMeter = new EnergyMeter(config.getMcastGroup(), port);
69 updateProperty(Thing.PROPERTY_VENDOR, "SMA");
70 updateProperty(Thing.PROPERTY_SERIAL_NUMBER, energyMeter.getSerialNumber());
71 logger.debug("Found a SMA Energy Meter with S/N '{}'", energyMeter.getSerialNumber());
72 } catch (IOException e) {
73 updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.CONFIGURATION_ERROR, e.getMessage());
77 int pollingPeriod = (config.getPollingPeriod() == null) ? 30 : config.getPollingPeriod();
78 pollingJob = scheduler.scheduleWithFixedDelay(this::updateData, 0, pollingPeriod, TimeUnit.SECONDS);
79 logger.debug("Polling job scheduled to run every {} sec. for '{}'", pollingPeriod, getThing().getUID());
81 updateStatus(ThingStatus.ONLINE);
85 public void dispose() {
86 logger.debug("Disposing SMAEnergyMeter handler '{}'", getThing().getUID());
88 if (pollingJob != null) {
89 pollingJob.cancel(true);
95 private synchronized void updateData() {
96 logger.debug("Update SMAEnergyMeter data '{}'", getThing().getUID());
101 updateState(CHANNEL_POWER_IN, energyMeter.getPowerIn());
102 updateState(CHANNEL_POWER_OUT, energyMeter.getPowerOut());
103 updateState(CHANNEL_ENERGY_IN, energyMeter.getEnergyIn());
104 updateState(CHANNEL_ENERGY_OUT, energyMeter.getEnergyOut());
106 updateState(CHANNEL_POWER_IN_L1, energyMeter.getPowerInL1());
107 updateState(CHANNEL_POWER_OUT_L1, energyMeter.getPowerOutL1());
108 updateState(CHANNEL_ENERGY_IN_L1, energyMeter.getEnergyInL1());
109 updateState(CHANNEL_ENERGY_OUT_L1, energyMeter.getEnergyOutL1());
111 updateState(CHANNEL_POWER_IN_L2, energyMeter.getPowerInL2());
112 updateState(CHANNEL_POWER_OUT_L2, energyMeter.getPowerOutL2());
113 updateState(CHANNEL_ENERGY_IN_L2, energyMeter.getEnergyInL2());
114 updateState(CHANNEL_ENERGY_OUT_L2, energyMeter.getEnergyOutL2());
116 updateState(CHANNEL_POWER_IN_L3, energyMeter.getPowerInL3());
117 updateState(CHANNEL_POWER_OUT_L3, energyMeter.getPowerOutL3());
118 updateState(CHANNEL_ENERGY_IN_L3, energyMeter.getEnergyInL3());
119 updateState(CHANNEL_ENERGY_OUT_L3, energyMeter.getEnergyOutL3());
121 if (getThing().getStatus().equals(ThingStatus.OFFLINE)) {
122 updateStatus(ThingStatus.ONLINE);
124 } catch (IOException e) {
125 updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.COMMUNICATION_ERROR, e.getMessage());