diff --git a/build.gradle b/build.gradle
index 5f07163e..2239c383 100644
--- a/build.gradle
+++ b/build.gradle
@@ -3,6 +3,30 @@ plugins {
id 'application'
}
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2025 Ziver Koc
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
// ------------------------------------
// Hal common configuration
// ------------------------------------
@@ -62,7 +86,7 @@ distributions {
from 'hal.conf.example'
from 'logging.properties'
- from "${buildDir}/resources"
+ from sourceSets.main.output.resourcesDir
}
}
}
@@ -76,11 +100,12 @@ task copyRecources(type: Copy) {
from "${subProject.projectDir}/resources"
}
- into("${buildDir}/resources")
+ into(sourceSets.main.output.resourcesDir)
}
-processResources.finalizedBy(copyRecources)
+jar.dependsOn(copyRecources)
+copyRecources.mustRunAfter(processResources)
application {
mainClass = 'se.hal.HalServer'
-}
\ No newline at end of file
+}
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 622ab64a..a5952066 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/hal-core/resources/web/event_config.tmpl b/hal-core/resources/web/event_config.tmpl
index e01b5a1a..3f5ab5b4 100644
--- a/hal-core/resources/web/event_config.tmpl
+++ b/hal-core/resources/web/event_config.tmpl
@@ -1,3 +1,27 @@
+
+
@@ -23,7 +47,7 @@
{{#localEvents}}
| {{.getId()}} |
- {{.getName()}} |
+ {{.getName()}} |
{{.getType()}} |
{{.getDeviceConfig()}} |
diff --git a/hal-core/resources/web/js/vue/components/App.js b/hal-core/resources/web/js/vue/App.js
similarity index 100%
rename from hal-core/resources/web/js/vue/components/App.js
rename to hal-core/resources/web/js/vue/App.js
diff --git a/hal-core/resources/web/js/vue/components/EventTableRowComponent.js b/hal-core/resources/web/js/vue/components/EventTableRowComponent.js
index 0d7afc24..743da530 100644
--- a/hal-core/resources/web/js/vue/components/EventTableRowComponent.js
+++ b/hal-core/resources/web/js/vue/components/EventTableRowComponent.js
@@ -17,7 +17,7 @@ export default {
},
template: `
|
- | {{ event.name }} |
+ {{ event.name }} |
{{ event.configType }} |
{{ event.data?.valueStr }} |
{{ timestamp }} |
diff --git a/hal-core/resources/web/js/vue/vue-router.esm-browser.js b/hal-core/resources/web/js/vue/lib/vue-router.esm-browser.js
similarity index 100%
rename from hal-core/resources/web/js/vue/vue-router.esm-browser.js
rename to hal-core/resources/web/js/vue/lib/vue-router.esm-browser.js
diff --git a/hal-core/resources/web/js/vue/vue-router.esm-browser.prod.js b/hal-core/resources/web/js/vue/lib/vue-router.esm-browser.prod.js
similarity index 100%
rename from hal-core/resources/web/js/vue/vue-router.esm-browser.prod.js
rename to hal-core/resources/web/js/vue/lib/vue-router.esm-browser.prod.js
diff --git a/hal-core/resources/web/js/vue/vue.esm-browser.js b/hal-core/resources/web/js/vue/lib/vue.esm-browser.js
similarity index 100%
rename from hal-core/resources/web/js/vue/vue.esm-browser.js
rename to hal-core/resources/web/js/vue/lib/vue.esm-browser.js
diff --git a/hal-core/resources/web/js/vue/vue.esm-browser.prod.js b/hal-core/resources/web/js/vue/lib/vue.esm-browser.prod.js
similarity index 100%
rename from hal-core/resources/web/js/vue/vue.esm-browser.prod.js
rename to hal-core/resources/web/js/vue/lib/vue.esm-browser.prod.js
diff --git a/hal-core/resources/web/main_index.tmpl b/hal-core/resources/web/main_index.tmpl
index 34b6eb2b..f2678740 100644
--- a/hal-core/resources/web/main_index.tmpl
+++ b/hal-core/resources/web/main_index.tmpl
@@ -1,3 +1,27 @@
+
+
@@ -53,14 +77,14 @@
diff --git a/hal-core/resources/web/sensor_config.tmpl b/hal-core/resources/web/sensor_config.tmpl
index 9af51b40..53891511 100644
--- a/hal-core/resources/web/sensor_config.tmpl
+++ b/hal-core/resources/web/sensor_config.tmpl
@@ -1,3 +1,27 @@
+
+
@@ -23,7 +47,7 @@
{{#localSensors}}
| {{.getId()}} |
- {{.getName()}} |
+ {{.getName()}} |
{{.getType()}} |
{{.isSynced()}} |
{{.getDeviceConfig()}} |
diff --git a/hal-core/src/se/hal/intf/HalAbstractControllerManager.java b/hal-core/src/se/hal/intf/HalAbstractControllerManager.java
index 34076a54..1a0201ed 100644
--- a/hal-core/src/se/hal/intf/HalAbstractControllerManager.java
+++ b/hal-core/src/se/hal/intf/HalAbstractControllerManager.java
@@ -1,3 +1,27 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2025 Ziver Koc
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
package se.hal.intf;
import zutil.ClassUtil;
@@ -43,7 +67,7 @@ public abstract class HalAbstractControllerManager> it = pluginManager.getClassIterator(HalAutostartController.class); it.hasNext(); ) {
Class controller = it.next();
diff --git a/hal-core/src/se/hal/page/JavascriptModules.java b/hal-core/src/se/hal/page/JavascriptModules.java
index cd69c9ca..86b8153b 100644
--- a/hal-core/src/se/hal/page/JavascriptModules.java
+++ b/hal-core/src/se/hal/page/JavascriptModules.java
@@ -1,3 +1,27 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2025 Ziver Koc
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
package se.hal.page;
import se.hal.intf.HalJavascriptModule;
@@ -7,7 +31,7 @@ public class JavascriptModules implements HalJavascriptModule {
@Override
public HalJsModule[] getJavascriptModules() {
- HalWebPage.getRootNav().createSubNav("Events").createSubNav("event_overview", "Overview");
+ HalWebPage.getRootNav().createSubNav("Events").createSubNav("events", "Overview");
return new HalJsModule[] {
new HalJsModule("AlertStore", "./js/vue/stores/AlertStore.js"),
@@ -19,7 +43,7 @@ public class JavascriptModules implements HalJavascriptModule {
new HalJsModule("EventActionComponent", "./js/vue/components/EventActionComponent.js"),
new HalJsModulePage("EventDetailPageComponent", "./js/vue/components/EventDetailPageComponent.js", "/event/:id"),
- new HalJsModulePage("EventOverviewPageComponent", "./js/vue/components/EventOverviewPageComponent.js", "/event_overview"),
+ new HalJsModulePage("EventOverviewPageComponent", "./js/vue/components/EventOverviewPageComponent.js", "/events"),
new HalJsModule("EventTableComponent", "./js/vue/components/EventTableComponent.js"),
new HalJsModule("EventTableRowComponent", "./js/vue/components/EventTableRowComponent.js"),
};
diff --git a/hal.conf.example b/hal.conf.example
index 977961ba..3982e717 100644
--- a/hal.conf.example
+++ b/hal.conf.example
@@ -36,6 +36,10 @@ hal_core.http_port=8080
## Tibber Plugin
#hal_tibber.token=
+## EcoSense plugin
+#hal_vendor_ecosense.username=
+#hal_vendor_ecosense.password=
+
## Zigbee plugin
#hal_zigbee.com_port=COM4
#hal_zigbee.dongle=CC2531|CONBEE|XBEE
diff --git a/plugins/hal-vendor-ecosense/src/se/hal/plugin/vendor/ecosense/EcoSenseCloudAPIClient.java b/plugins/hal-vendor-ecosense/src/se/hal/plugin/vendor/ecosense/EcoSenseCloudAPIClient.java
index 7c9f85ea..c0aaa34b 100644
--- a/plugins/hal-vendor-ecosense/src/se/hal/plugin/vendor/ecosense/EcoSenseCloudAPIClient.java
+++ b/plugins/hal-vendor-ecosense/src/se/hal/plugin/vendor/ecosense/EcoSenseCloudAPIClient.java
@@ -40,8 +40,11 @@ import zutil.parser.json.JSONWriter;
import java.io.IOException;
import java.net.MalformedURLException;
-import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -59,8 +62,6 @@ public class EcoSenseCloudAPIClient {
private static final String USER_POOL_REGION = "us-west-2";
private static final String API_URL = "https://api.cloud.ecosense.io/api";
- private static SimpleDateFormat DATE_PARSER = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); //2025-10-22T14:09:29.691533
-
private String username;
private String password;
/** The authenticated Amazon Cognito ID token. */
@@ -92,7 +93,9 @@ public class EcoSenseCloudAPIClient {
cognitoClient.close();
}
- public EcoSenseDevice getDevices() {
+ public List getDevices() {
+ List devices = new ArrayList<>();
+
try {
if (ObjectUtil.isEmpty(idToken)) {
authenticate();
@@ -147,13 +150,13 @@ public class EcoSenseCloudAPIClient {
ecoSenseDevice.wifiName = deviceNode.getString("wifi_name");
try {
- ecoSenseDevice.lastRadonUpdateTime = DATE_PARSER.parse(deviceNode.getString("last_radon_update_time")).getTime();
- ecoSenseDevice.lastUpdateTime = DATE_PARSER.parse(deviceNode.getString("last_update_time")).getTime();
+ ecoSenseDevice.lastRadonUpdateTime = LocalDateTime.parse(deviceNode.getString("last_radon_update_time")).toInstant(ZoneOffset.UTC).toEpochMilli();
+ ecoSenseDevice.lastUpdateTime = LocalDateTime.parse(deviceNode.getString("last_update_time")).toInstant(ZoneOffset.UTC).toEpochMilli();
} catch (Exception e) {
logger.log(Level.WARNING, "Was unable to parse timestamp from EcoSense API.", e);
}
- return ecoSenseDevice;
+ devices.add(ecoSenseDevice);
}
} catch (MalformedURLException e) {
throw new RuntimeException(e);
@@ -162,7 +165,7 @@ public class EcoSenseCloudAPIClient {
throw new RuntimeException(e);
}
- return null;
+ return devices;
}
public class EcoSenseDevice {
diff --git a/plugins/hal-vendor-ecosense/src/se/hal/plugin/vendor/ecosense/EcoSenseController.java b/plugins/hal-vendor-ecosense/src/se/hal/plugin/vendor/ecosense/EcoSenseController.java
index f1337a06..365c10b0 100644
--- a/plugins/hal-vendor-ecosense/src/se/hal/plugin/vendor/ecosense/EcoSenseController.java
+++ b/plugins/hal-vendor-ecosense/src/se/hal/plugin/vendor/ecosense/EcoSenseController.java
@@ -27,7 +27,7 @@ package se.hal.plugin.vendor.ecosense;
import se.hal.HalContext;
import se.hal.HalServer;
import se.hal.intf.*;
-import se.hal.plugin.vendor.ecosense.device.EccoCubeRadonSensor;
+import se.hal.plugin.vendor.ecosense.device.EccoCubeRadonSensorConfig;
import se.hal.struct.devicedata.RadonSensorData;
import zutil.ObjectUtil;
import zutil.log.LogUtil;
@@ -77,19 +77,21 @@ public class EcoSenseController implements HalSensorController, Runnable, HalDae
public void run() {
try {
if (!ObjectUtil.isEmpty(ecoSenseClient)) {
- EcoSenseCloudAPIClient.EcoSenseDevice apiResponse = ecoSenseClient.getDevices();
- if (apiResponse == null) {
- logger.warning("Received empty response from EcoSense API.");
+ List apiResponse = ecoSenseClient.getDevices();
+ if (apiResponse.isEmpty()) {
+ logger.info("Received no devices from EcoSense API.");
return;
}
- EccoCubeRadonSensor radonSensor = new EccoCubeRadonSensor();
- radonSensor.setSerialNumber(apiResponse.serialNumber);
+ for (EcoSenseCloudAPIClient.EcoSenseDevice device : apiResponse) {
+ EccoCubeRadonSensorConfig radonSensor = new EccoCubeRadonSensorConfig();
+ radonSensor.setSerialNumber(device.serialNumber);
- RadonSensorData radonSensorData = new RadonSensorData(apiResponse.radonLevel, apiResponse.lastRadonUpdateTime);
+ RadonSensorData radonSensorData = new RadonSensorData(device.radonLevel, device.lastRadonUpdateTime);
- if (deviceReportListener != null) {
- deviceReportListener.reportReceived(radonSensor, radonSensorData);
+ if (deviceReportListener != null) {
+ deviceReportListener.reportReceived(radonSensor, radonSensorData);
+ }
}
}
} catch (Exception e) {
diff --git a/plugins/hal-vendor-ecosense/src/se/hal/plugin/vendor/ecosense/device/EccoCubeRadonSensor.java b/plugins/hal-vendor-ecosense/src/se/hal/plugin/vendor/ecosense/device/EccoCubeRadonSensorConfig.java
similarity index 76%
rename from plugins/hal-vendor-ecosense/src/se/hal/plugin/vendor/ecosense/device/EccoCubeRadonSensor.java
rename to plugins/hal-vendor-ecosense/src/se/hal/plugin/vendor/ecosense/device/EccoCubeRadonSensorConfig.java
index 4c0d302a..f35b5e76 100644
--- a/plugins/hal-vendor-ecosense/src/se/hal/plugin/vendor/ecosense/device/EccoCubeRadonSensor.java
+++ b/plugins/hal-vendor-ecosense/src/se/hal/plugin/vendor/ecosense/device/EccoCubeRadonSensorConfig.java
@@ -29,12 +29,16 @@ import se.hal.intf.HalSensorController;
import se.hal.intf.HalSensorData;
import se.hal.plugin.vendor.ecosense.EcoSenseController;
import se.hal.struct.devicedata.RadonSensorData;
+import zutil.ui.conf.Configurator;
+
+import java.util.Objects;
/**
* A sensor that calculate current radon level
*/
-public class EccoCubeRadonSensor implements HalSensorConfig {
+public class EccoCubeRadonSensorConfig implements HalSensorConfig {
+ @Configurator.Configurable(value = "Device serial number")
private String serialNumber;
@@ -63,7 +67,20 @@ public class EccoCubeRadonSensor implements HalSensorConfig {
}
@Override
- public boolean equals(Object obj) {
- return false;
+ public final boolean equals(Object o) {
+ if (!(o instanceof EccoCubeRadonSensorConfig)) return false;
+
+ EccoCubeRadonSensorConfig that = (EccoCubeRadonSensorConfig) o;
+ return Objects.equals(serialNumber, that.serialNumber);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(serialNumber);
+ }
+
+ @Override
+ public String toString() {
+ return "Serial number: " + serialNumber;
}
}
diff --git a/plugins/hal-vendor-ecosense/src/se/hal/plugin/vendor/ecosense/plugin.json b/plugins/hal-vendor-ecosense/src/se/hal/plugin/vendor/ecosense/plugin.json
index 71801055..d8f8d87f 100644
--- a/plugins/hal-vendor-ecosense/src/se/hal/plugin/vendor/ecosense/plugin.json
+++ b/plugins/hal-vendor-ecosense/src/se/hal/plugin/vendor/ecosense/plugin.json
@@ -5,6 +5,6 @@
"interfaces": [
{"se.hal.intf.HalAutostartController": "se.hal.plugin.vendor.ecosense.EcoSenseController"},
- {"se.hal.intf.HalSensorConfig": "se.hal.plugin.vendor.ecosense.device.EccoCubeRadonSensor"}
+ {"se.hal.intf.HalSensorConfig": "se.hal.plugin.vendor.ecosense.device.EccoCubeRadonSensorConfig"}
]
}
\ No newline at end of file
diff --git a/plugins/hal-vendor-tibber/build.gradle b/plugins/hal-vendor-tibber/build.gradle
index 81fb360f..6c541ab2 100644
--- a/plugins/hal-vendor-tibber/build.gradle
+++ b/plugins/hal-vendor-tibber/build.gradle
@@ -1,3 +1,27 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2025 Ziver Koc
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
dependencies {
implementation project(':hal-core')
}
diff --git a/plugins/hal-vendor-tibber/src/se/hal/plugin/vendor/tibber/TibberAPIClient.java b/plugins/hal-vendor-tibber/src/se/hal/plugin/vendor/tibber/TibberAPIClient.java
index 3b6c11b0..dd84aa4e 100644
--- a/plugins/hal-vendor-tibber/src/se/hal/plugin/vendor/tibber/TibberAPIClient.java
+++ b/plugins/hal-vendor-tibber/src/se/hal/plugin/vendor/tibber/TibberAPIClient.java
@@ -35,6 +35,8 @@ import zutil.parser.json.JSONParser;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
import java.util.logging.Logger;
/**
@@ -44,7 +46,6 @@ public class TibberAPIClient {
private static final Logger logger = LogUtil.getLogger();
private static final String TIBBER_API_ENDPOINT = "https://api.tibber.com/v1-beta/gql";
- private static SimpleDateFormat DATE_PARSER = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); // 2024-12-28T23:00:00.000+01:00
private String tibberToken;
@@ -80,16 +81,16 @@ public class TibberAPIClient {
"consumptionUnit " + // Should be Kwh
"}" +
"}" +
- "currentSubscription {" +
- "priceInfo {" +
- "current {" +
- "total " +
- "energy " +
- "tax " +
- "startsAt " +
- "}" +
- "}" +
- "}" +
+// "currentSubscription {" +
+// "priceInfo {" +
+// "current {" +
+// "total " +
+// "energy " +
+// "tax " +
+// "startsAt " +
+// "}" +
+// "}" +
+// "}" +
"}" +
"}" +
"}\"" +
@@ -100,12 +101,7 @@ public class TibberAPIClient {
// unitPrice=0.1507875, cost=0.3131856375, from=2024-12-28T21:00:00.000+01:00, consumption=2.077, to=2024-12-28T22:00:00.000+01:00, unitPriceVAT=0.0301575, consumptionUnit=kWh
TibberConsumption consumption = new TibberConsumption();
-
- try {
- consumption.timestamp = DATE_PARSER.parse(data.getString("from")).getTime();
- } catch (ParseException e) {
- logger.warning("Was unable to parse timestamp from Tibber API.");
- }
+ consumption.timestamp = LocalDateTime.parse(data.getString("from")).toInstant(ZoneOffset.UTC).toEpochMilli();
if (data.get("cost") != null) {
consumption.cost = data.getDouble("cost");
diff --git a/plugins/hal-vendor-tibber/src/se/hal/plugin/vendor/tibber/TibberController.java b/plugins/hal-vendor-tibber/src/se/hal/plugin/vendor/tibber/TibberController.java
index 061a8ed6..e6a72d7a 100644
--- a/plugins/hal-vendor-tibber/src/se/hal/plugin/vendor/tibber/TibberController.java
+++ b/plugins/hal-vendor-tibber/src/se/hal/plugin/vendor/tibber/TibberController.java
@@ -27,9 +27,9 @@ package se.hal.plugin.vendor.tibber;
import se.hal.HalContext;
import se.hal.HalServer;
import se.hal.intf.*;
-import se.hal.plugin.vendor.tibber.device.TibberElectricityCostSensor;
-import se.hal.plugin.vendor.tibber.device.TibberElectricityPriceSensor;
-import se.hal.plugin.vendor.tibber.device.TibberPowerConsumptionSensor;
+import se.hal.plugin.vendor.tibber.device.TibberElectricityCostSensorConfig;
+import se.hal.plugin.vendor.tibber.device.TibberElectricityPriceSensorConfig;
+import se.hal.plugin.vendor.tibber.device.TibberPowerConsumptionSensorConfig;
import se.hal.struct.devicedata.PriceSensorData;
import se.hal.util.ListenerUtil;
import zutil.log.LogUtil;
@@ -92,13 +92,13 @@ public class TibberController implements HalSensorController, Runnable, HalDaemo
}
if (consumption.cost > 0) {
- ListenerUtil.callReportReceived(deviceListeners, new TibberElectricityCostSensor(), new PriceSensorData(consumption.cost, consumption.timestamp));
+ ListenerUtil.callReportReceived(deviceListeners, new TibberElectricityCostSensorConfig(), new PriceSensorData(consumption.cost, consumption.timestamp));
}
if (consumption.unitPriceVAT > 0) {
- ListenerUtil.callReportReceived(deviceListeners, new TibberElectricityPriceSensor(), new PriceSensorData(consumption.unitPriceVAT, consumption.timestamp));
+ ListenerUtil.callReportReceived(deviceListeners, new TibberElectricityPriceSensorConfig(), new PriceSensorData(consumption.unitPriceVAT, consumption.timestamp));
}
if (consumption.consumption > 0) {
- ListenerUtil.callReportReceived(deviceListeners, new TibberPowerConsumptionSensor(), new PriceSensorData(consumption.consumption, consumption.timestamp));
+ ListenerUtil.callReportReceived(deviceListeners, new TibberPowerConsumptionSensorConfig(), new PriceSensorData(consumption.consumption, consumption.timestamp));
}
} catch (Exception e) {
diff --git a/plugins/hal-vendor-tibber/src/se/hal/plugin/vendor/tibber/device/TibberElectricityCostSensor.java b/plugins/hal-vendor-tibber/src/se/hal/plugin/vendor/tibber/device/TibberElectricityCostSensorConfig.java
similarity index 93%
rename from plugins/hal-vendor-tibber/src/se/hal/plugin/vendor/tibber/device/TibberElectricityCostSensor.java
rename to plugins/hal-vendor-tibber/src/se/hal/plugin/vendor/tibber/device/TibberElectricityCostSensorConfig.java
index 49cc6dd2..36285960 100644
--- a/plugins/hal-vendor-tibber/src/se/hal/plugin/vendor/tibber/device/TibberElectricityCostSensor.java
+++ b/plugins/hal-vendor-tibber/src/se/hal/plugin/vendor/tibber/device/TibberElectricityCostSensorConfig.java
@@ -33,7 +33,7 @@ import se.hal.struct.devicedata.CostSensorData;
/**
* A sensor that calculate current electricity bil
*/
-public class TibberElectricityCostSensor implements HalSensorConfig {
+public class TibberElectricityCostSensorConfig implements HalSensorConfig {
@@ -59,6 +59,6 @@ public class TibberElectricityCostSensor implements HalSensorConfig {
@Override
public boolean equals(Object obj) {
- return obj instanceof TibberElectricityCostSensor;
+ return obj instanceof TibberElectricityCostSensorConfig;
}
}
diff --git a/plugins/hal-vendor-tibber/src/se/hal/plugin/vendor/tibber/device/TibberElectricityPriceSensor.java b/plugins/hal-vendor-tibber/src/se/hal/plugin/vendor/tibber/device/TibberElectricityPriceSensorConfig.java
similarity index 93%
rename from plugins/hal-vendor-tibber/src/se/hal/plugin/vendor/tibber/device/TibberElectricityPriceSensor.java
rename to plugins/hal-vendor-tibber/src/se/hal/plugin/vendor/tibber/device/TibberElectricityPriceSensorConfig.java
index b7879fa5..0cb08beb 100644
--- a/plugins/hal-vendor-tibber/src/se/hal/plugin/vendor/tibber/device/TibberElectricityPriceSensor.java
+++ b/plugins/hal-vendor-tibber/src/se/hal/plugin/vendor/tibber/device/TibberElectricityPriceSensorConfig.java
@@ -33,7 +33,7 @@ import se.hal.struct.devicedata.PriceSensorData;
/**
* A sensor that shows the price of electricity at a specific time
*/
-public class TibberElectricityPriceSensor implements HalSensorConfig {
+public class TibberElectricityPriceSensorConfig implements HalSensorConfig {
@@ -59,6 +59,6 @@ public class TibberElectricityPriceSensor implements HalSensorConfig {
@Override
public boolean equals(Object obj) {
- return obj instanceof TibberElectricityPriceSensor;
+ return obj instanceof TibberElectricityPriceSensorConfig;
}
}
diff --git a/plugins/hal-vendor-tibber/src/se/hal/plugin/vendor/tibber/device/TibberPowerConsumptionSensor.java b/plugins/hal-vendor-tibber/src/se/hal/plugin/vendor/tibber/device/TibberPowerConsumptionSensorConfig.java
similarity index 93%
rename from plugins/hal-vendor-tibber/src/se/hal/plugin/vendor/tibber/device/TibberPowerConsumptionSensor.java
rename to plugins/hal-vendor-tibber/src/se/hal/plugin/vendor/tibber/device/TibberPowerConsumptionSensorConfig.java
index 7df1ecf1..fad3cd15 100644
--- a/plugins/hal-vendor-tibber/src/se/hal/plugin/vendor/tibber/device/TibberPowerConsumptionSensor.java
+++ b/plugins/hal-vendor-tibber/src/se/hal/plugin/vendor/tibber/device/TibberPowerConsumptionSensorConfig.java
@@ -31,7 +31,7 @@ import se.hal.struct.devicedata.PowerConsumptionSensorData;
import se.hal.plugin.vendor.tibber.TibberController;
-public class TibberPowerConsumptionSensor implements HalSensorConfig {
+public class TibberPowerConsumptionSensorConfig implements HalSensorConfig {
@Override
@@ -56,6 +56,6 @@ public class TibberPowerConsumptionSensor implements HalSensorConfig {
@Override
public boolean equals(Object obj) {
- return obj instanceof TibberPowerConsumptionSensor;
+ return obj instanceof TibberPowerConsumptionSensorConfig;
}
}
diff --git a/plugins/hal-vendor-tibber/src/se/hal/plugin/vendor/tibber/plugin.json b/plugins/hal-vendor-tibber/src/se/hal/plugin/vendor/tibber/plugin.json
index a1dfac72..e9392f9b 100644
--- a/plugins/hal-vendor-tibber/src/se/hal/plugin/vendor/tibber/plugin.json
+++ b/plugins/hal-vendor-tibber/src/se/hal/plugin/vendor/tibber/plugin.json
@@ -5,8 +5,8 @@
"interfaces": [
{"se.hal.intf.HalAutostartController": "se.hal.plugin.vendor.tibber.TibberController"},
- {"se.hal.intf.HalSensorConfig": "se.hal.plugin.vendor.tibber.device.TibberElectricityCostSensor"},
- {"se.hal.intf.HalSensorConfig": "se.hal.plugin.vendor.tibber.device.TibberElectricityPriceSensor"},
- {"se.hal.intf.HalSensorConfig": "se.hal.plugin.vendor.tibber.device.TibberPowerConsumptionSensor"}
+ {"se.hal.intf.HalSensorConfig": "se.hal.plugin.vendor.tibber.device.TibberElectricityCostSensorConfig"},
+ {"se.hal.intf.HalSensorConfig": "se.hal.plugin.vendor.tibber.device.TibberElectricityPriceSensorConfig"},
+ {"se.hal.intf.HalSensorConfig": "se.hal.plugin.vendor.tibber.device.TibberPowerConsumptionSensorConfig"}
]
}
\ No newline at end of file