]> git.basschouten.com Git - openhab-addons.git/commitdiff
Introduce a trigger channel to announce the availability of day-ahead prices (#16704)
authorJacob Laursen <jacob-github@vindvejr.dk>
Fri, 10 May 2024 15:09:27 +0000 (17:09 +0200)
committerGitHub <noreply@github.com>
Fri, 10 May 2024 15:09:27 +0000 (17:09 +0200)
Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>
bundles/org.openhab.binding.energidataservice/README.md
bundles/org.openhab.binding.energidataservice/src/main/java/org/openhab/binding/energidataservice/internal/EnergiDataServiceBindingConstants.java
bundles/org.openhab.binding.energidataservice/src/main/java/org/openhab/binding/energidataservice/internal/handler/EnergiDataServiceHandler.java
bundles/org.openhab.binding.energidataservice/src/main/resources/OH-INF/i18n/energidataservice.properties
bundles/org.openhab.binding.energidataservice/src/main/resources/OH-INF/thing/channel-groups.xml
bundles/org.openhab.binding.energidataservice/src/main/resources/OH-INF/thing/channel-types.xml
bundles/org.openhab.binding.energidataservice/src/main/resources/OH-INF/thing/thing-service.xml
bundles/org.openhab.binding.energidataservice/src/main/resources/OH-INF/update/instructions.xml

index 01cad5a0aa11a5515e35f67674b91474a44aae62..b7130ade9c58b86c6f22c0a7865daf65a1ad13b2 100644 (file)
@@ -170,6 +170,14 @@ A persistence configuration is required for this channel.
 Please note that the CO₂ emission channels only apply to Denmark.
 These channels will not be updated when the configured price area is not DK1 or DK2.
 
+#### Trigger Channels
+
+Advanced channel `event` can trigger the following events:
+
+| Event                | Description                    |
+|----------------------|--------------------------------|
+| DAY_AHEAD_AVAILABLE  | Day-ahead prices are available |
+
 ## Thing Actions
 
 Thing actions can be used to perform calculations as well as import prices directly into rules without relying on persistence.
@@ -561,3 +569,36 @@ console.log("Spot price two hours from now: " + price);
 :::
 
 ::::
+
+### Trigger Channel Example
+
+:::: tabs
+
+::: tab DSL
+
+```javascript
+rule "Day-ahead event"
+when
+    Channel 'energidataservice:service:energidataservice:electricity#event' triggered 'DAY_AHEAD_AVAILABLE'
+then
+    logInfo("Day-ahead", "Day-ahead prices for the next day are now available")
+end
+```
+
+:::
+
+::: tab JavaScript
+
+```javascript
+rules.when()
+    .channel('energidataservice:service:energidataservice:electricity#event').triggered('DAY_AHEAD_AVAILABLE')
+    .then(event =>
+    {
+        console.log('Day-ahead prices for the next day are now available');
+    })
+    .build("Day-ahead event");
+```
+
+:::
+
+::::
index 2b2ed0e318371a72ec92e393d76268a0c73883b3..82eeb8f58ced3a3e3ce0874d9859b36eb65b3c13 100644 (file)
@@ -56,6 +56,7 @@ public class EnergiDataServiceBindingConstants {
             + ChannelUID.CHANNEL_GROUP_SEPARATOR + "co2-emission-prognosis";
     public static final String CHANNEL_CO2_EMISSION_REALTIME = CHANNEL_GROUP_ELECTRICITY
             + ChannelUID.CHANNEL_GROUP_SEPARATOR + "co2-emission-realtime";
+    public static final String CHANNEL_EVENT = CHANNEL_GROUP_ELECTRICITY + ChannelUID.CHANNEL_GROUP_SEPARATOR + "event";
 
     public static final Set<String> ELECTRICITY_CHANNELS = Set.of(CHANNEL_SPOT_PRICE, CHANNEL_GRID_TARIFF,
             CHANNEL_SYSTEM_TARIFF, CHANNEL_TRANSMISSION_GRID_TARIFF, CHANNEL_ELECTRICITY_TAX,
@@ -67,6 +68,9 @@ public class EnergiDataServiceBindingConstants {
     public static final String PROPERTY_LAST_CALL = "lastCall";
     public static final String PROPERTY_NEXT_CALL = "nextCall";
 
+    // List of all events
+    public static final String EVENT_DAY_AHEAD_AVAILABLE = "DAY_AHEAD_AVAILABLE";
+
     // List of supported currencies
     public static final Currency CURRENCY_DKK = Currency.getInstance("DKK");
     public static final Currency CURRENCY_EUR = Currency.getInstance("EUR");
index 8964cd4cb88377a1e7e017a306397221e65dd189..785b655364651a5b72b9b8b3ee73f5049978cddc 100644 (file)
@@ -239,8 +239,9 @@ public class EnergiDataServiceHandler extends BaseThingHandler {
     private void refreshElectricityPrices() {
         RetryStrategy retryPolicy;
         try {
+            boolean spotPricesDownloaded = false;
             if (isLinked(CHANNEL_SPOT_PRICE)) {
-                downloadSpotPrices();
+                spotPricesDownloaded = downloadSpotPrices();
             }
 
             for (DatahubTariff datahubTariff : DatahubTariff.values()) {
@@ -259,6 +260,9 @@ public class EnergiDataServiceHandler extends BaseThingHandler {
 
                 if (numberOfFutureSpotPrices >= 13 || (numberOfFutureSpotPrices == 12
                         && now.isAfter(DAILY_REFRESH_TIME_CET.minusHours(1)) && now.isBefore(DAILY_REFRESH_TIME_CET))) {
+                    if (spotPricesDownloaded) {
+                        triggerChannel(CHANNEL_EVENT, EVENT_DAY_AHEAD_AVAILABLE);
+                    }
                     retryPolicy = RetryPolicyFactory.atFixedTime(DAILY_REFRESH_TIME_CET, NORD_POOL_TIMEZONE);
                 } else {
                     logger.warn("Spot prices are not available, retry scheduled (see details in Thing properties)");
@@ -287,10 +291,10 @@ public class EnergiDataServiceHandler extends BaseThingHandler {
         reschedulePriceRefreshJob(retryPolicy);
     }
 
-    private void downloadSpotPrices() throws InterruptedException, DataServiceException {
+    private boolean downloadSpotPrices() throws InterruptedException, DataServiceException {
         if (cacheManager.areSpotPricesFullyCached()) {
             logger.debug("Cached spot prices still valid, skipping download.");
-            return;
+            return false;
         }
         DateQueryParameter start;
         if (cacheManager.areHistoricSpotPricesCached()) {
@@ -307,6 +311,7 @@ public class EnergiDataServiceHandler extends BaseThingHandler {
         } finally {
             updateProperties(properties);
         }
+        return true;
     }
 
     private void downloadTariffs(DatahubTariff datahubTariff) throws InterruptedException, DataServiceException {
index 516b6752fe62bb890595d966b49cbd7f48fabab6..51bb80f6dff0523e5049f8ab86fa1a761ce9e271 100644 (file)
@@ -81,6 +81,8 @@ channel-type.energidataservice.co2-emission.label = CO₂ Emission
 channel-type.energidataservice.co2-emission.description = CO₂ emission in g/kWh.
 channel-type.energidataservice.datahub-price.label = Datahub Price
 channel-type.energidataservice.datahub-price.description = Datahub price.
+channel-type.energidataservice.event.label = Event
+channel-type.energidataservice.event.description = Event triggered
 channel-type.energidataservice.spot-price.label = Spot Price
 channel-type.energidataservice.spot-price.description = Spot price.
 
index add4ee51c210b10a293c13d792b643932ca3cb7a..8786dcd08eee9c9ef768537378abd97d2b618b8a 100644 (file)
@@ -40,6 +40,7 @@
                                <label>CO₂ Emission Realtime</label>
                                <description>Near up-to-date history for CO₂ emission from electricity consumed in Denmark in g/kWh.</description>
                        </channel>
+                       <channel id="event" typeId="event"/>
                </channels>
        </channel-group-type>
 
index 1509d177dbb4e985e65ddf211ffc2e448d31b6fa..92822b28bf9cafeaaea8b231ffe4fb8372fc309e 100644 (file)
                <state readOnly="true" pattern="%.1f %unit%"></state>
        </channel-type>
 
+       <channel-type id="event" advanced="true">
+               <kind>trigger</kind>
+               <label>Event</label>
+               <description>Event triggered</description>
+               <event>
+                       <options>
+                               <option value="DAY_AHEAD_AVAILABLE">Day-ahead prices are available</option>
+                       </options>
+               </event>
+       </channel-type>
+
 </thing:thing-descriptions>
index fca5f24f6a978cb4873fc78805232f6e3e2a62d5..fd893596bfd8797d3950f7dc3f1e434eae360683 100644 (file)
@@ -14,7 +14,7 @@
                </channel-groups>
 
                <properties>
-                       <property name="thingTypeVersion">5</property>
+                       <property name="thingTypeVersion">6</property>
                </properties>
 
                <config-description-ref uri="thing-type:energidataservice:service"/>
index 1366e1898b5fb3c4a4bbaf6b978aa3dfa5bd0ce2..80c730dd2a731209bf63fde638f68f7e1617ba9d 100644 (file)
                        </add-channel>
                </instruction-set>
 
+               <instruction-set targetVersion="6">
+                       <add-channel id="event" groupIds="electricity">
+                               <type>energidataservice:event</type>
+                       </add-channel>
+               </instruction-set>
+
        </thing-type>
 
 </update:update-descriptions>