]> git.basschouten.com Git - openhab-addons.git/blob
651dccea7d27b888803a737a2e193b9171cdd1e8
[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.smaenergymeter.internal.handler;
14
15 import static org.openhab.binding.smaenergymeter.internal.SMAEnergyMeterBindingConstants.*;
16
17 import java.io.IOException;
18 import java.util.concurrent.ScheduledFuture;
19 import java.util.concurrent.TimeUnit;
20
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;
31
32 /**
33  * The {@link SMAEnergyMeterHandler} is responsible for handling commands, which are
34  * sent to one of the channels.
35  *
36  * @author Osman Basha - Initial contribution
37  */
38 public class SMAEnergyMeterHandler extends BaseThingHandler {
39
40     private final Logger logger = LoggerFactory.getLogger(SMAEnergyMeterHandler.class);
41     private EnergyMeter energyMeter;
42     private ScheduledFuture<?> pollingJob;
43
44     public SMAEnergyMeterHandler(Thing thing) {
45         super(thing);
46     }
47
48     @Override
49     public void handleCommand(ChannelUID channelUID, Command command) {
50         if (command == RefreshType.REFRESH) {
51             logger.debug("Refreshing {}", channelUID);
52             updateData();
53         } else {
54             logger.warn("This binding is a read-only binding and cannot handle commands");
55         }
56     }
57
58     @Override
59     public void initialize() {
60         logger.debug("Initializing SMAEnergyMeter handler '{}'", getThing().getUID());
61
62         EnergyMeterConfig config = getConfigAs(EnergyMeterConfig.class);
63
64         int port = (config.getPort() == null) ? EnergyMeter.DEFAULT_MCAST_PORT : config.getPort();
65         energyMeter = new EnergyMeter(config.getMcastGroup(), port);
66         try {
67             energyMeter.update();
68
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());
74             return;
75         }
76
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());
80
81         updateStatus(ThingStatus.ONLINE);
82     }
83
84     @Override
85     public void dispose() {
86         logger.debug("Disposing SMAEnergyMeter handler '{}'", getThing().getUID());
87
88         if (pollingJob != null) {
89             pollingJob.cancel(true);
90             pollingJob = null;
91         }
92         energyMeter = null;
93     }
94
95     private synchronized void updateData() {
96         logger.debug("Update SMAEnergyMeter data '{}'", getThing().getUID());
97
98         try {
99             energyMeter.update();
100
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());
105
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());
110
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());
115
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());
120
121             if (getThing().getStatus().equals(ThingStatus.OFFLINE)) {
122                 updateStatus(ThingStatus.ONLINE);
123             }
124         } catch (IOException e) {
125             updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.COMMUNICATION_ERROR, e.getMessage());
126         }
127     }
128 }