]> git.basschouten.com Git - openhab-addons.git/blob
6308a4bf16a95be092caa917206236ee1911bf78
[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
19 import org.eclipse.jdt.annotation.Nullable;
20 import org.openhab.binding.smaenergymeter.internal.configuration.EnergyMeterConfig;
21 import org.openhab.binding.smaenergymeter.internal.packet.PacketListener;
22 import org.openhab.binding.smaenergymeter.internal.packet.PacketListenerRegistry;
23 import org.openhab.binding.smaenergymeter.internal.packet.PayloadHandler;
24 import org.openhab.core.thing.ChannelUID;
25 import org.openhab.core.thing.Thing;
26 import org.openhab.core.thing.ThingStatus;
27 import org.openhab.core.thing.ThingStatusDetail;
28 import org.openhab.core.thing.binding.BaseThingHandler;
29 import org.openhab.core.types.Command;
30 import org.openhab.core.types.RefreshType;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
33
34 /**
35  * The {@link SMAEnergyMeterHandler} is responsible for handling commands, which are
36  * sent to one of the channels.
37  *
38  * @author Osman Basha - Initial contribution
39  */
40 public class SMAEnergyMeterHandler extends BaseThingHandler implements PayloadHandler {
41
42     private final Logger logger = LoggerFactory.getLogger(SMAEnergyMeterHandler.class);
43     private final PacketListenerRegistry listenerRegistry;
44     private @Nullable PacketListener listener;
45     private @Nullable String serialNumber;
46
47     public SMAEnergyMeterHandler(Thing thing, PacketListenerRegistry listenerRegistry) {
48         super(thing);
49         this.listenerRegistry = listenerRegistry;
50     }
51
52     @Override
53     public void handleCommand(ChannelUID channelUID, Command command) {
54         if (command == RefreshType.REFRESH) {
55             logger.debug("Refreshing {}", channelUID);
56             PacketListener listener = this.listener;
57             if (listener != null) {
58                 listener.request();
59             }
60         } else {
61             logger.warn("This binding is a read-only binding and cannot handle commands");
62         }
63     }
64
65     @Override
66     public void initialize() {
67         logger.debug("Initializing SMAEnergyMeter handler '{}'", getThing().getUID());
68
69         EnergyMeterConfig config = getConfigAs(EnergyMeterConfig.class);
70
71         try {
72             serialNumber = config.getSerialNumber();
73             if (serialNumber == null) {
74                 updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.CONFIGURATION_PENDING,
75                         "Meter serial number missing");
76                 return;
77             }
78             String mcastGroup = config.getMcastGroup();
79             if (mcastGroup == null) {
80                 updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.CONFIGURATION_PENDING, "mcast group is missing");
81                 return;
82             }
83             PacketListener listener = listenerRegistry.getListener(mcastGroup, config.getPort());
84             updateStatus(ThingStatus.UNKNOWN);
85             logger.debug("Activated handler for SMA Energy Meter with S/N '{}'", serialNumber);
86
87             listener.addPayloadHandler(this);
88
89             listener.open(config.getPollingPeriod());
90             this.listener = listener;
91             logger.debug("Polling job scheduled to run every {} sec. for '{}'", config.getPollingPeriod(),
92                     getThing().getUID());
93             // we do not set online status here, it will be set only when data is received
94         } catch (IOException e) {
95             updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.CONFIGURATION_ERROR, e.getMessage());
96         }
97     }
98
99     @Override
100     public void dispose() {
101         logger.debug("Disposing SMAEnergyMeter handler '{}'", getThing().getUID());
102         PacketListener listener = this.listener;
103         if (listener != null) {
104             listener.removePayloadHandler(this);
105             this.listener = null;
106         }
107     }
108
109     @Override
110     public void handle(EnergyMeter energyMeter) {
111         String serialNumber = this.serialNumber;
112         if (serialNumber == null || !serialNumber.equals(energyMeter.getSerialNumber())) {
113             return;
114         }
115         updateStatus(ThingStatus.ONLINE);
116
117         logger.debug("Update SMAEnergyMeter {} data '{}'", serialNumber, getThing().getUID());
118
119         updateState(CHANNEL_POWER_IN, energyMeter.getPowerIn());
120         updateState(CHANNEL_POWER_OUT, energyMeter.getPowerOut());
121         updateState(CHANNEL_ENERGY_IN, energyMeter.getEnergyIn());
122         updateState(CHANNEL_ENERGY_OUT, energyMeter.getEnergyOut());
123
124         updateState(CHANNEL_POWER_IN_L1, energyMeter.getPowerInL1());
125         updateState(CHANNEL_POWER_OUT_L1, energyMeter.getPowerOutL1());
126         updateState(CHANNEL_ENERGY_IN_L1, energyMeter.getEnergyInL1());
127         updateState(CHANNEL_ENERGY_OUT_L1, energyMeter.getEnergyOutL1());
128
129         updateState(CHANNEL_POWER_IN_L2, energyMeter.getPowerInL2());
130         updateState(CHANNEL_POWER_OUT_L2, energyMeter.getPowerOutL2());
131         updateState(CHANNEL_ENERGY_IN_L2, energyMeter.getEnergyInL2());
132         updateState(CHANNEL_ENERGY_OUT_L2, energyMeter.getEnergyOutL2());
133
134         updateState(CHANNEL_POWER_IN_L3, energyMeter.getPowerInL3());
135         updateState(CHANNEL_POWER_OUT_L3, energyMeter.getPowerOutL3());
136         updateState(CHANNEL_ENERGY_IN_L3, energyMeter.getEnergyInL3());
137         updateState(CHANNEL_ENERGY_OUT_L3, energyMeter.getEnergyOutL3());
138     }
139 }