]> git.basschouten.com Git - openhab-addons.git/blob
22e62e8706c06d5fe972e48c943b7c2c782e557a
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2021 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.fronius.internal.handler;
14
15 import java.util.Map;
16
17 import org.apache.commons.lang.StringUtils;
18 import org.openhab.binding.fronius.internal.FroniusBaseDeviceConfiguration;
19 import org.openhab.binding.fronius.internal.FroniusBindingConstants;
20 import org.openhab.binding.fronius.internal.FroniusBridgeConfiguration;
21 import org.openhab.binding.fronius.internal.api.MeterRealtimeBodyDataDTO;
22 import org.openhab.binding.fronius.internal.api.MeterRealtimeResponseDTO;
23 import org.openhab.core.library.types.QuantityType;
24 import org.openhab.core.library.unit.Units;
25 import org.openhab.core.thing.Thing;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
28
29 /**
30  * The {@link FroniusMeterHandler} is responsible for updating the data, which are
31  * sent to one of the channels.
32  *
33  * @author Jimmy Tanagra - Initial contribution
34  */
35 public class FroniusMeterHandler extends FroniusBaseThingHandler {
36
37     private final Logger logger = LoggerFactory.getLogger(FroniusMeterHandler.class);
38     private MeterRealtimeBodyDataDTO meterRealtimeBodyData;
39     private FroniusBaseDeviceConfiguration config;
40
41     public FroniusMeterHandler(Thing thing) {
42         super(thing);
43     }
44
45     @Override
46     protected String getDescription() {
47         return "Fronius Smart Meter";
48     }
49
50     @Override
51     public void refresh(FroniusBridgeConfiguration bridgeConfiguration) {
52         updateData(bridgeConfiguration, config);
53         updateChannels();
54         updateProperties();
55     }
56
57     @Override
58     public void initialize() {
59         config = getConfigAs(FroniusBaseDeviceConfiguration.class);
60         super.initialize();
61     }
62
63     /**
64      * Update the channel from the last data retrieved
65      *
66      * @param channelId the id identifying the channel to be updated
67      * @return the last retrieved data
68      */
69     @Override
70     protected Object getValue(String channelId) {
71         if (meterRealtimeBodyData == null) {
72             return null;
73         }
74
75         String[] fields = StringUtils.split(channelId, "#");
76         String fieldName = fields[0];
77
78         switch (fieldName) {
79             case FroniusBindingConstants.MeterEnable:
80                 return meterRealtimeBodyData.getEnable();
81             case FroniusBindingConstants.MeterLocation:
82                 return meterRealtimeBodyData.getMeterLocationCurrent();
83             case FroniusBindingConstants.MeterCurrentAcPhase1:
84                 return new QuantityType(meterRealtimeBodyData.getCurrentACPhase1(), Units.AMPERE);
85             case FroniusBindingConstants.MeterCurrentAcPhase2:
86                 return new QuantityType(meterRealtimeBodyData.getCurrentACPhase2(), Units.AMPERE);
87             case FroniusBindingConstants.MeterCurrentAcPhase3:
88                 return new QuantityType(meterRealtimeBodyData.getCurrentACPhase3(), Units.AMPERE);
89             case FroniusBindingConstants.MeterVoltageAcPhase1:
90                 return new QuantityType(meterRealtimeBodyData.getVoltageACPhase1(), Units.VOLT);
91             case FroniusBindingConstants.MeterVoltageAcPhase2:
92                 return new QuantityType(meterRealtimeBodyData.getVoltageACPhase2(), Units.VOLT);
93             case FroniusBindingConstants.MeterVoltageAcPhase3:
94                 return new QuantityType(meterRealtimeBodyData.getVoltageACPhase3(), Units.VOLT);
95             case FroniusBindingConstants.MeterPowerPhase1:
96                 return new QuantityType(meterRealtimeBodyData.getPowerRealPPhase1(), Units.WATT);
97             case FroniusBindingConstants.MeterPowerPhase2:
98                 return new QuantityType(meterRealtimeBodyData.getPowerRealPPhase2(), Units.WATT);
99             case FroniusBindingConstants.MeterPowerPhase3:
100                 return new QuantityType(meterRealtimeBodyData.getPowerRealPPhase3(), Units.WATT);
101             case FroniusBindingConstants.MeterPowerFactorPhase1:
102                 return meterRealtimeBodyData.getPowerFactorPhase1();
103             case FroniusBindingConstants.MeterPowerFactorPhase2:
104                 return meterRealtimeBodyData.getPowerFactorPhase2();
105             case FroniusBindingConstants.MeterPowerFactorPhase3:
106                 return meterRealtimeBodyData.getPowerFactorPhase3();
107             case FroniusBindingConstants.MeterEnergyRealSumConsumed:
108                 return new QuantityType(meterRealtimeBodyData.getEnergyRealWACSumConsumed(), Units.WATT_HOUR);
109             case FroniusBindingConstants.MeterEnergyRealSumProduced:
110                 return new QuantityType(meterRealtimeBodyData.getEnergyRealWACSumProduced(), Units.WATT_HOUR);
111         }
112
113         return null;
114     }
115
116     private void updateProperties() {
117         if (meterRealtimeBodyData == null) {
118             return;
119         }
120
121         Map<String, String> properties = editProperties();
122
123         properties.put(FroniusBindingConstants.MeterModel, meterRealtimeBodyData.getDetails().getModel());
124         properties.put(FroniusBindingConstants.MeterSerial, meterRealtimeBodyData.getDetails().getSerial());
125
126         updateProperties(properties);
127     }
128
129     /**
130      * Get new data
131      */
132     private void updateData(FroniusBridgeConfiguration bridgeConfiguration, FroniusBaseDeviceConfiguration config) {
133         MeterRealtimeResponseDTO meterRealtimeResponse = getMeterRealtimeData(bridgeConfiguration.hostname,
134                 config.deviceId);
135         if (meterRealtimeResponse == null) {
136             meterRealtimeBodyData = null;
137         } else {
138             meterRealtimeBodyData = meterRealtimeResponse.getBody().getData();
139         }
140     }
141
142     /**
143      * Make the MeterRealtimeData request
144      *
145      * @param ip address of the device
146      * @param deviceId of the device
147      * @return {MeterRealtimeResponse} the object representation of the json response
148      */
149     private MeterRealtimeResponseDTO getMeterRealtimeData(String ip, int deviceId) {
150         String location = FroniusBindingConstants.METER_REALTIME_DATA_URL.replace("%IP%", StringUtils.trimToEmpty(ip));
151         location = location.replace("%DEVICEID%", Integer.toString(deviceId));
152         return collectDataFormUrl(MeterRealtimeResponseDTO.class, location);
153     }
154 }