From 0de056632c44fe450ce3ce045d8da4c176ea0b57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20K=C3=B6tting?= Date: Wed, 29 Jan 2025 16:07:05 +0100 Subject: [PATCH 1/2] Fix missing grid readings after evcc breaking change in 0.133.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #18148 Signed-off-by: Daniel Kötting --- .../binding/evcc/internal/EvccHandler.java | 4 +- .../binding/evcc/internal/api/dto/Grid.java | 56 +++++++++++++++++++ .../binding/evcc/internal/api/dto/Result.java | 30 ++++------ 3 files changed, 68 insertions(+), 22 deletions(-) create mode 100755 bundles/org.openhab.binding.evcc/src/main/java/org/openhab/binding/evcc/internal/api/dto/Grid.java diff --git a/bundles/org.openhab.binding.evcc/src/main/java/org/openhab/binding/evcc/internal/EvccHandler.java b/bundles/org.openhab.binding.evcc/src/main/java/org/openhab/binding/evcc/internal/EvccHandler.java index f7ca71973662e..6d8368b23eb0c 100644 --- a/bundles/org.openhab.binding.evcc/src/main/java/org/openhab/binding/evcc/internal/EvccHandler.java +++ b/bundles/org.openhab.binding.evcc/src/main/java/org/openhab/binding/evcc/internal/EvccHandler.java @@ -420,7 +420,7 @@ private void refresh() { updateStatus(ThingStatus.ONLINE); Battery[] batteries = result.getBattery(); batteryConfigured = ((batteries != null) && (batteries.length > 0)); - gridConfigured = (result.getGridPower() != null); + gridConfigured = result.getGridConfigured(); PV[] pvs = result.getPV(); pvConfigured = ((pvs != null) && (pvs.length > 0)); createChannelsGeneral(); @@ -712,7 +712,7 @@ private void updateChannelsGeneral() { } boolean gridConfigured = this.gridConfigured; if (gridConfigured) { - float gridPower = ((result.getGridPower() == null) ? 0.0f : result.getGridPower()); + float gridPower = ((result.getGrid().getPower() == null) ? 0.0f : result.getGrid().getPower()); channel = new ChannelUID(uid, CHANNEL_GROUP_ID_GENERAL, CHANNEL_GRID_POWER); updateState(channel, new QuantityType<>(gridPower, Units.WATT)); } diff --git a/bundles/org.openhab.binding.evcc/src/main/java/org/openhab/binding/evcc/internal/api/dto/Grid.java b/bundles/org.openhab.binding.evcc/src/main/java/org/openhab/binding/evcc/internal/api/dto/Grid.java new file mode 100755 index 0000000000000..d170c4f35883f --- /dev/null +++ b/bundles/org.openhab.binding.evcc/src/main/java/org/openhab/binding/evcc/internal/api/dto/Grid.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2010-2025 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.evcc.internal.api.dto; + +import com.google.gson.annotations.SerializedName; + +/** + * This class represents the grid response (/api/state). + * This DTO was written for evcc version 0.133.0 + * + * @author Daniel Kötting - Initial contribution + */ +public class Grid { + // Data types from https://github.com/evcc-io/evcc/blob/master/api/api.go + // and from https://docs.evcc.io/docs/reference/configuration/messaging/#msg + + @SerializedName("currents") + private float[] currents; + + @SerializedName("energy") + private float energy; + + @SerializedName("power") + private Float power; + + /** + * @return grid's currents + */ + public float[] getCurrents() { + return currents; + } + + /** + * @return grid's energy + */ + public float getEnergy() { + return energy; + } + + /** + * @return grid's power or {@code null} if not available + */ + public Float getPower() { + return power; + } +} diff --git a/bundles/org.openhab.binding.evcc/src/main/java/org/openhab/binding/evcc/internal/api/dto/Result.java b/bundles/org.openhab.binding.evcc/src/main/java/org/openhab/binding/evcc/internal/api/dto/Result.java index 991b868afef5d..7e657159c2c48 100644 --- a/bundles/org.openhab.binding.evcc/src/main/java/org/openhab/binding/evcc/internal/api/dto/Result.java +++ b/bundles/org.openhab.binding.evcc/src/main/java/org/openhab/binding/evcc/internal/api/dto/Result.java @@ -49,14 +49,11 @@ public class Result { @SerializedName("batteryMode") private String batteryMode; - @SerializedName("gridCurrents") - private float[] gridCurrents; + @SerializedName("grid") + private Grid grid; - @SerializedName("gridEnergy") - private float gridEnergy; - - @SerializedName("gridPower") - private Float gridPower; + @SerializedName("gridConfigured") + private boolean gridConfigured; @SerializedName("homePower") private float homePower; @@ -165,24 +162,17 @@ public String getBatteryMode() { } /** - * @return grid's currents - */ - public float[] getGridCurrents() { - return gridCurrents; - } - - /** - * @return grid's energy + * @return all grid related values */ - public float getGridEnergy() { - return gridEnergy; + public Grid getGrid() { + return grid; } /** - * @return grid's power or {@code null} if not available + * @return is grid configured */ - public Float getGridPower() { - return gridPower; + public boolean getGridConfigured() { + return gridConfigured; } /** From b842681733eca8b52393d1ba006f3e58e1ec0730 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20K=C3=B6tting?= Date: Wed, 29 Jan 2025 19:23:49 +0100 Subject: [PATCH 2/2] Reimplemented gridPower to keep the binding backwards compatible MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #18148 Signed-off-by: Daniel Kötting --- .../openhab/binding/evcc/internal/EvccHandler.java | 14 +++++++------- .../binding/evcc/internal/api/dto/Result.java | 10 ++++++++++ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/bundles/org.openhab.binding.evcc/src/main/java/org/openhab/binding/evcc/internal/EvccHandler.java b/bundles/org.openhab.binding.evcc/src/main/java/org/openhab/binding/evcc/internal/EvccHandler.java index 6d8368b23eb0c..e7600b04d3a0d 100644 --- a/bundles/org.openhab.binding.evcc/src/main/java/org/openhab/binding/evcc/internal/EvccHandler.java +++ b/bundles/org.openhab.binding.evcc/src/main/java/org/openhab/binding/evcc/internal/EvccHandler.java @@ -29,12 +29,7 @@ import org.eclipse.jdt.annotation.Nullable; import org.openhab.binding.evcc.internal.api.EvccAPI; import org.openhab.binding.evcc.internal.api.EvccApiException; -import org.openhab.binding.evcc.internal.api.dto.Battery; -import org.openhab.binding.evcc.internal.api.dto.Loadpoint; -import org.openhab.binding.evcc.internal.api.dto.PV; -import org.openhab.binding.evcc.internal.api.dto.Plan; -import org.openhab.binding.evcc.internal.api.dto.Result; -import org.openhab.binding.evcc.internal.api.dto.Vehicle; +import org.openhab.binding.evcc.internal.api.dto.*; import org.openhab.core.i18n.TimeZoneProvider; import org.openhab.core.library.CoreItemFactory; import org.openhab.core.library.types.DateTimeType; @@ -712,7 +707,12 @@ private void updateChannelsGeneral() { } boolean gridConfigured = this.gridConfigured; if (gridConfigured) { - float gridPower = ((result.getGrid().getPower() == null) ? 0.0f : result.getGrid().getPower()); + // handling gridPower prior to changes in evcc version 0.133.0 + float gridPower = ((result.getGridPower() == null) ? 0.0f : result.getGridPower()); + Grid grid = result.getGrid(); + if (grid != null) { + gridPower = ((grid.getPower() == null) ? 0.0f : grid.getPower()); + } channel = new ChannelUID(uid, CHANNEL_GROUP_ID_GENERAL, CHANNEL_GRID_POWER); updateState(channel, new QuantityType<>(gridPower, Units.WATT)); } diff --git a/bundles/org.openhab.binding.evcc/src/main/java/org/openhab/binding/evcc/internal/api/dto/Result.java b/bundles/org.openhab.binding.evcc/src/main/java/org/openhab/binding/evcc/internal/api/dto/Result.java index 7e657159c2c48..6f55489daf207 100644 --- a/bundles/org.openhab.binding.evcc/src/main/java/org/openhab/binding/evcc/internal/api/dto/Result.java +++ b/bundles/org.openhab.binding.evcc/src/main/java/org/openhab/binding/evcc/internal/api/dto/Result.java @@ -49,6 +49,9 @@ public class Result { @SerializedName("batteryMode") private String batteryMode; + @SerializedName("gridPower") + private Float gridPower; + @SerializedName("grid") private Grid grid; @@ -161,6 +164,13 @@ public String getBatteryMode() { return batteryMode; } + /** + * @return gridPower (before evcc version 0.133.0) + */ + public Float getGridPower() { + return gridPower; + } + /** * @return all grid related values */