Skip to content

Commit dcd01da

Browse files
weymanncomputergeek1507
authored andcommitted
[tibber] Rework binding (channel groups, UoM, Thing actions and more) (openhab#18726)
* use common httpclient Signed-off-by: Bernd Weymann <bernd.weymann@gmail.com> Signed-off-by: Scott Hanson <scooter_seh@yahoo.com>
1 parent 91878ae commit dcd01da

40 files changed

Lines changed: 5555 additions & 1071 deletions

bundles/org.openhab.binding.tibber/README.md

Lines changed: 416 additions & 234 deletions
Large diffs are not rendered by default.

bundles/org.openhab.binding.tibber/src/main/java/org/openhab/binding/tibber/internal/TibberBindingConstants.java

Lines changed: 81 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@
2020
import org.openhab.core.thing.ThingTypeUID;
2121

2222
/**
23-
* The {@link TibberBindingConstants} class defines common constants, which are
24-
* used across the whole binding.
23+
* The {@link TibberBindingConstants} class defines common constants, which are used across the whole binding.
2524
*
2625
* @author Stian Kjoglum - Initial contribution
26+
* @author Bernd Weymann - Enhance used constants
2727
*/
2828
@NonNullByDefault
2929
public class TibberBindingConstants {
@@ -34,55 +34,89 @@ public class TibberBindingConstants {
3434
// Tibber base URL for queries and mutations
3535
public static final String BASE_URL = "https://api.tibber.com/v1-beta/gql";
3636

37-
// Tibber driver version
38-
public static final String TIBBER_DRIVER = "com.tibber/1.8.3";
39-
4037
// List of all Thing Type UIDs
4138
public static final ThingTypeUID TIBBER_THING_TYPE = new ThingTypeUID(BINDING_ID, "tibberapi");
4239

43-
// List of all Channel ids - Used for queries
44-
public static final String CURRENT_TOTAL = "current_total";
45-
public static final String CURRENT_STARTSAT = "current_startsAt";
46-
public static final String CURRENT_LEVEL = "current_level";
47-
48-
public static final String TODAY_PRICES = "today_prices";
49-
public static final String TOMORROW_PRICES = "tomorrow_prices";
50-
public static final String DAILY_FROM = "daily_from";
51-
public static final String DAILY_TO = "daily_to";
52-
public static final String DAILY_COST = "daily_cost";
53-
public static final String DAILY_CONSUMPTION = "daily_consumption";
54-
public static final String HOURLY_FROM = "hourly_from";
55-
public static final String HOURLY_TO = "hourly_to";
56-
public static final String HOURLY_COST = "hourly_cost";
57-
public static final String HOURLY_CONSUMPTION = "hourly_consumption";
58-
public static final String LIVE_TIMESTAMP = "live_timestamp";
59-
public static final String LIVE_POWER = "live_power";
60-
public static final String LIVE_LASTMETERCONSUMPTION = "live_lastMeterConsumption";
61-
public static final String LIVE_LASTMETERPRODUCTION = "live_lastMeterProduction";
62-
public static final String LIVE_ACCUMULATEDCONSUMPTION = "live_accumulatedConsumption";
63-
public static final String LIVE_ACCUMULATEDCONSUMPTION_THIS_HOUR = "live_accumulatedConsumptionThisHour";
64-
public static final String LIVE_ACCUMULATEDCOST = "live_accumulatedCost";
65-
public static final String LIVE_ACCUMULATEREWARD = "live_accumulatedReward";
66-
public static final String LIVE_CURRENCY = "live_currency";
67-
public static final String LIVE_MINPOWER = "live_minPower";
68-
public static final String LIVE_AVERAGEPOWER = "live_averagePower";
69-
public static final String LIVE_MAXPOWER = "live_maxPower";
70-
public static final String LIVE_VOLTAGE1 = "live_voltage1";
71-
public static final String LIVE_VOLTAGE2 = "live_voltage2";
72-
public static final String LIVE_VOLTAGE3 = "live_voltage3";
73-
public static final String LIVE_CURRENT1 = "live_current1";
74-
public static final String LIVE_CURRENT2 = "live_current2";
75-
public static final String LIVE_CURRENT3 = "live_current3";
76-
public static final String LIVE_POWERPRODUCTION = "live_powerProduction";
77-
public static final String LIVE_ACCUMULATEDPRODUCTION = "live_accumulatedProduction";
78-
public static final String LIVE_ACCUMULATEDPRODUCTION_THIS_HOUR = "live_accumulatedProductionThisHour";
79-
public static final String LIVE_MINPOWERPRODUCTION = "live_minPowerproduction";
80-
public static final String LIVE_MAXPOWERPRODUCTION = "live_maxPowerproduction";
81-
82-
// Lift of all config ids
83-
public static final String CONFIG_BRIDGE_TOKEN = "token";
84-
public static final String CONFIG_BRIDGE_REFRESH = "refresh";
40+
// Channel groups
41+
public static final String CHANNEL_GROUP_PRICE = "price";
42+
public static final String CHANNEL_GROUP_LIVE = "live";
43+
public static final String CHANNEL_GROUP_STATISTICS = "statistics";
44+
45+
// price channels
46+
public static final String CHANNEL_SPOT_PRICE = "spot-price";
47+
public static final String CHANNEL_PRICE_LEVELS = "level";
48+
public static final String CHANNEL_AVERAGE = "average";
49+
50+
// live channels
51+
public static final String CHANNEL_CONSUMPTION = "consumption";
52+
public static final String CHANNEL_MIN_COSNUMPTION = "minimum-consumption";
53+
public static final String CHANNEL_PEAK_CONSUMPTION = "peak-consumption";
54+
public static final String CHANNEL_PRODUCTION = "production";
55+
public static final String CHANNEL_MIN_PRODUCTION = "minimum-production";
56+
public static final String CHANNEL_PEAK_PRODUCTION = "peak-production";
57+
public static final String CHANNEL_VOLTAGE_1 = "voltage1";
58+
public static final String CHANNEL_VOLTAGE_2 = "voltage2";
59+
public static final String CHANNEL_VOLTAGE_3 = "voltage3";
60+
public static final String CHANNEL_CURRENT_1 = "current1";
61+
public static final String CHANNEL_CURRENT_2 = "current2";
62+
public static final String CHANNEL_CURRENT_3 = "current3";
63+
64+
// statistics channels
65+
public static final String CHANNEL_TOTAL_CONSUMPTION = "total-consumption";
66+
public static final String CHANNEL_DAILY_CONSUMPTION = "daily-consumption";
67+
public static final String CHANNEL_DAILY_COST = "daily-cost";
68+
public static final String CHANNEL_LAST_HOUR_CONSUMPTION = "last-hour-consumption";
69+
public static final String CHANNEL_TOTAL_PRODUCTION = "total-production";
70+
public static final String CHANNEL_DAILY_PRODUCTION = "daily-production";
71+
public static final String CHANNEL_LAST_HOUR_PRODUCTION = "last-hour-production";
72+
73+
public static final String CURRENCY_QUERY_RESOURCE_PATH = "/graphql/currency.graphql";
74+
public static final String PRICE_QUERY_RESOURCE_PATH = "/graphql/prices.graphql";
75+
public static final String REALTIME_QUERY_RESOURCE_PATH = "/graphql/realtime.graphql";
76+
public static final String WEBSOCKET_SUBSCRIPTION_RESOURCE_PATH = "/graphql/websocket.graphql";
77+
78+
public static final String SCHEDULE_CONTAINER = "{\"size\":%s, \"cost\":%s, \"schedule\":%s}";
79+
public static final String QUERY_CONTAINER = "{\"query\":\"%s\"}";
80+
public static final String WEBSOCKET_URL_QUERY = "{\"query\":\"{viewer {websocketSubscriptionUrl }}\"}";
81+
public static final String CONNECT_MESSAGE = "{\"type\":\"connection_init\", \"payload\":{\"token\":\"%s\"}}";
82+
public static final String DISCONNECT_MESSAGE = "{\"type\":\"connection_terminate\",\"payload\":null}";
83+
public static final String SUBSCRIPTION_MESSAGE = "{\"id\":\"1\",\"type\":\"subscribe\",\"payload\":{\"variables\":{},\"extensions\":{},\"operationName\":null,\"query\":\"subscription { liveMeasurement(homeId:\\\"%s\\\") { timestamp power lastMeterConsumption lastMeterProduction accumulatedConsumption accumulatedConsumptionLastHour accumulatedCost currency minPower averagePower maxPower voltagePhase1 voltagePhase2 voltagePhase3 currentL1 currentL2 currentL3 powerProduction accumulatedProduction accumulatedProductionLastHour minPowerProduction maxPowerProduction }}\"}}";
84+
85+
public static final String[] CURRENCY_QUERY_JSON_PATH = new String[] { "data", "viewer", "home",
86+
"currentSubscription", "priceInfo", "current" };
87+
public static final String[] PRICE_INFO_JSON_PATH = new String[] { "data", "viewer", "home", "currentSubscription",
88+
"priceInfo" };
89+
public static final String[] REALTIME_FEATURE_JSON_PATH = new String[] { "data", "viewer", "home", "features" };
90+
public static final String[] SOCKET_MESSAGE_JSON_PATH = new String[] { "payload", "data", "liveMeasurement" };
91+
92+
public static final String EMPTY_VALUE = "";
93+
public static final String NULL_VALUE = "null-value";
94+
95+
public static final String CRON_DAILY_AT = "30 0 %s ? * * *";
96+
97+
public static final String JSON_DATA = "data";
98+
public static final String JSON_VIEWER = "viewer";
99+
public static final String JSON_HOME = "home";
100+
public static final String JSON_SUBSRCIPTION = "currentSubscription";
101+
public static final String JSON_DAILY = "daily";
102+
public static final String JSON_HOURLY = "hourly";
103+
public static final String JSON_NODES = "nodes";
104+
105+
public static final String PRICE_LEVEL_VERY_CHEAP = "very_cheap";
106+
public static final String PRICE_LEVEL_CHEAP = "cheap";
107+
public static final String PRICE_LEVEL_NORMAL = "normal";
108+
public static final String PRICE_LEVEL_EXPENSIVE = "expensive";
109+
public static final String PRICE_LEVEL_VERY_EXPENSIVE = "very_expensive";
85110

86111
public static final Set<ThingTypeUID> SUPPORTED_THING_TYPES_UIDS = Stream.of(TIBBER_THING_TYPE)
87112
.collect(Collectors.toSet());
113+
114+
// parameter keys
115+
public static final String PARAM_EARLIEST_START = "earliestStart";
116+
public static final String PARAM_LATEST_END = "latestEnd";
117+
public static final String PARAM_ASCENDING = "ascending";
118+
public static final String PARAM_POWER = "power";
119+
public static final String PARAM_DURATION = "duration";
120+
public static final String PARAM_CURVE = "curve";
121+
public static final String PARAM_TIMESTAMP = "timestamp";
88122
}

bundles/org.openhab.binding.tibber/src/main/java/org/openhab/binding/tibber/internal/TibberHandlerFactory.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,39 @@
1717
import org.eclipse.jdt.annotation.NonNullByDefault;
1818
import org.eclipse.jdt.annotation.Nullable;
1919
import org.openhab.binding.tibber.internal.handler.TibberHandler;
20+
import org.openhab.core.i18n.TimeZoneProvider;
21+
import org.openhab.core.io.net.http.HttpClientFactory;
22+
import org.openhab.core.scheduler.CronScheduler;
2023
import org.openhab.core.thing.Thing;
2124
import org.openhab.core.thing.ThingTypeUID;
2225
import org.openhab.core.thing.binding.BaseThingHandlerFactory;
2326
import org.openhab.core.thing.binding.ThingHandler;
2427
import org.openhab.core.thing.binding.ThingHandlerFactory;
28+
import org.osgi.service.component.annotations.Activate;
2529
import org.osgi.service.component.annotations.Component;
30+
import org.osgi.service.component.annotations.Reference;
2631

2732
/**
2833
* The {@link TibberHandlerFactory} is responsible for creating things and thing
2934
* handlers.
3035
*
3136
* @author Stian Kjoglum - Initial contribution
37+
* @author Bernd Weymann - Use HttpClientFactory, CronScheduler and TimeZoneProvider
3238
*/
3339
@NonNullByDefault
3440
@Component(configurationPid = "binding.tibber", service = ThingHandlerFactory.class)
3541
public class TibberHandlerFactory extends BaseThingHandlerFactory {
42+
private final HttpClientFactory httpFactory;
43+
private final CronScheduler cron;
44+
private final TimeZoneProvider timeZoneProvider;
45+
46+
@Activate
47+
public TibberHandlerFactory(final @Reference HttpClientFactory httpFactory, final @Reference CronScheduler cron,
48+
final @Reference TimeZoneProvider timeZoneProvider) {
49+
this.httpFactory = httpFactory;
50+
this.cron = cron;
51+
this.timeZoneProvider = timeZoneProvider;
52+
}
3653

3754
@Override
3855
public boolean supportsThingType(ThingTypeUID thingTypeUID) {
@@ -43,7 +60,7 @@ public boolean supportsThingType(ThingTypeUID thingTypeUID) {
4360
protected @Nullable ThingHandler createHandler(Thing thing) {
4461
ThingTypeUID thingTypeUID = thing.getThingTypeUID();
4562
if (thingTypeUID.equals(TIBBER_THING_TYPE)) {
46-
return new TibberHandler(thing);
63+
return new TibberHandler(thing, httpFactory.getCommonHttpClient(), cron, bundleContext, timeZoneProvider);
4764
} else {
4865
return null;
4966
}

0 commit comments

Comments
 (0)