]> git.basschouten.com Git - openhab-addons.git/blob
3f8785ce611e49f903b44aee08398ad93965a5bb
[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.homewizard.internal;
14
15 import java.time.DateTimeException;
16 import java.time.ZoneId;
17 import java.time.ZonedDateTime;
18
19 import org.eclipse.jdt.annotation.NonNullByDefault;
20 import org.openhab.core.library.types.DateTimeType;
21 import org.openhab.core.library.types.QuantityType;
22 import org.openhab.core.library.unit.SIUnits;
23 import org.openhab.core.library.unit.Units;
24 import org.openhab.core.thing.ChannelUID;
25 import org.openhab.core.thing.Thing;
26 import org.openhab.core.types.Command;
27
28 /**
29  * The {@link HomeWizardP1MeterHandler} implements functionality to handle a HomeWizard P1 Meter.
30  *
31  * @author DaniĆ«l van Os - Initial contribution
32  */
33 @NonNullByDefault
34 public class HomeWizardP1MeterHandler extends HomeWizardDeviceHandler {
35
36     private String meterModel = "";
37     private int meterVersion = 0;
38
39     /**
40      * Constructor
41      *
42      * @param thing The thing to handle
43      */
44     public HomeWizardP1MeterHandler(Thing thing) {
45         super(thing);
46     }
47
48     /**
49      * Not listening to any commands.
50      */
51     @Override
52     public void handleCommand(ChannelUID channelUID, Command command) {
53     }
54
55     /**
56      * Device specific handling of the returned payload.
57      *
58      * @param payload The data parsed from the Json file
59      */
60     @Override
61     protected void handleDataPayload(DataPayload payload) {
62         if (!meterModel.equals(payload.getMeterModel())) {
63             meterModel = payload.getMeterModel();
64             updateProperty(HomeWizardBindingConstants.PROPERTY_METER_MODEL, meterModel);
65         }
66
67         if (meterVersion != payload.getSmrVersion()) {
68             meterVersion = payload.getSmrVersion();
69             updateProperty(HomeWizardBindingConstants.PROPERTY_METER_VERSION, String.format("%d", meterVersion));
70         }
71
72         updateState(HomeWizardBindingConstants.CHANNEL_ENERGY_IMPORT_T1,
73                 new QuantityType<>(payload.getTotalEnergyImportT1Kwh(), Units.KILOWATT_HOUR));
74         updateState(HomeWizardBindingConstants.CHANNEL_ENERGY_IMPORT_T2,
75                 new QuantityType<>(payload.getTotalEnergyImportT2Kwh(), Units.KILOWATT_HOUR));
76         updateState(HomeWizardBindingConstants.CHANNEL_ENERGY_EXPORT_T1,
77                 new QuantityType<>(payload.getTotalEnergyExportT1Kwh(), Units.KILOWATT_HOUR));
78         updateState(HomeWizardBindingConstants.CHANNEL_ENERGY_EXPORT_T2,
79                 new QuantityType<>(payload.getTotalEnergyExportT2Kwh(), Units.KILOWATT_HOUR));
80
81         updateState(HomeWizardBindingConstants.CHANNEL_ACTIVE_POWER,
82                 new QuantityType<>(payload.getActivePowerW(), Units.WATT));
83         updateState(HomeWizardBindingConstants.CHANNEL_ACTIVE_POWER_L1,
84                 new QuantityType<>(payload.getActivePowerL1W(), Units.WATT));
85         updateState(HomeWizardBindingConstants.CHANNEL_ACTIVE_POWER_L2,
86                 new QuantityType<>(payload.getActivePowerL2W(), Units.WATT));
87         updateState(HomeWizardBindingConstants.CHANNEL_ACTIVE_POWER_L3,
88                 new QuantityType<>(payload.getActivePowerL3W(), Units.WATT));
89
90         // If no data from the gas meter is present, the json value will be null, which means gson ignores it,
91         // leaving the value in the payload object at 0.
92         long dtv = payload.getGasTimestamp();
93         if (dtv > 0) {
94             updateState(HomeWizardBindingConstants.CHANNEL_TOTAL_GAS,
95                     new QuantityType<>(payload.getTotalGasM3(), SIUnits.CUBIC_METRE));
96
97             // 210119164000
98             int seconds = (int) (dtv % 100);
99
100             dtv /= 100;
101             int minutes = (int) (dtv % 100);
102
103             dtv /= 100;
104             int hours = (int) (dtv % 100);
105
106             dtv /= 100;
107             int day = (int) (dtv % 100);
108
109             dtv /= 100;
110             int month = (int) (dtv % 100);
111
112             dtv /= 100;
113             int year = (int) (dtv + 2000);
114
115             try {
116                 DateTimeType dtt = new DateTimeType(
117                         ZonedDateTime.of(year, month, day, hours, minutes, seconds, 0, ZoneId.systemDefault()));
118                 updateState(HomeWizardBindingConstants.CHANNEL_GAS_TIMESTAMP, dtt);
119                 updateState(HomeWizardBindingConstants.CHANNEL_TOTAL_GAS,
120                         new QuantityType<>(payload.getTotalGasM3(), SIUnits.CUBIC_METRE));
121             } catch (DateTimeException e) {
122                 logger.warn("Unable to parse Gas timestamp: {}", payload.getGasTimestamp());
123             }
124         }
125     }
126 }