Skip to content

Commit ff3ff93

Browse files
authored
[linky] One unique method to update daily and weekly data channels (openhab#9840)
Also check data availability for the peak consumption of yesterday Also log power peak data Signed-off-by: Laurent Garnier <[email protected]>
1 parent 3a2c996 commit ff3ff93

File tree

1 file changed

+44
-39
lines changed
  • bundles/org.openhab.binding.linky/src/main/java/org/openhab/binding/linky/internal/handler

1 file changed

+44
-39
lines changed

bundles/org.openhab.binding.linky/src/main/java/org/openhab/binding/linky/internal/handler/LinkyHandler.java

+44-39
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,12 @@ public class LinkyHandler extends BaseThingHandler {
8484
private @NonNullByDefault({}) String prmId;
8585
private @NonNullByDefault({}) String userId;
8686

87+
private enum Target {
88+
FIRST,
89+
LAST,
90+
ALL
91+
}
92+
8793
public LinkyHandler(Thing thing, LocaleProvider localeProvider, Gson gson, HttpClient httpClient) {
8894
super(thing);
8995
this.gson = gson;
@@ -94,9 +100,9 @@ public LinkyHandler(Thing thing, LocaleProvider localeProvider, Gson gson, HttpC
94100
LocalDate today = LocalDate.now();
95101
Consumption consumption = getConsumptionData(today.minusDays(15), today);
96102
if (consumption != null) {
97-
logData(consumption.aggregats.days, "Day", false, DateTimeFormatter.ISO_LOCAL_DATE, false);
98-
logData(consumption.aggregats.weeks, "Week", true, DateTimeFormatter.ISO_LOCAL_DATE_TIME, false);
99-
consumption = getConsumptionAfterChecks(consumption);
103+
logData(consumption.aggregats.days, "Day", false, DateTimeFormatter.ISO_LOCAL_DATE, Target.ALL);
104+
logData(consumption.aggregats.weeks, "Week", true, DateTimeFormatter.ISO_LOCAL_DATE_TIME, Target.ALL);
105+
consumption = getConsumptionAfterChecks(consumption, Target.LAST);
100106
}
101107
return consumption;
102108
});
@@ -106,12 +112,9 @@ public LinkyHandler(Thing thing, LocaleProvider localeProvider, Gson gson, HttpC
106112
LocalDate from = to.minusDays(2);
107113
Consumption consumption = getPowerData(from, to);
108114
if (consumption != null) {
109-
try {
110-
checkData(consumption);
111-
} catch (LinkyException e) {
112-
logger.debug("Power data: {}", e.getMessage());
113-
return null;
114-
}
115+
logData(consumption.aggregats.days, "Day (peak)", true, DateTimeFormatter.ISO_LOCAL_DATE_TIME,
116+
Target.ALL);
117+
consumption = getConsumptionAfterChecks(consumption, Target.FIRST);
115118
}
116119
return consumption;
117120
});
@@ -120,8 +123,8 @@ public LinkyHandler(Thing thing, LocaleProvider localeProvider, Gson gson, HttpC
120123
LocalDate today = LocalDate.now();
121124
Consumption consumption = getConsumptionData(today.withDayOfMonth(1).minusMonths(1), today);
122125
if (consumption != null) {
123-
logData(consumption.aggregats.months, "Month", true, DateTimeFormatter.ISO_LOCAL_DATE_TIME, false);
124-
consumption = getConsumptionAfterChecks(consumption);
126+
logData(consumption.aggregats.months, "Month", true, DateTimeFormatter.ISO_LOCAL_DATE_TIME, Target.ALL);
127+
consumption = getConsumptionAfterChecks(consumption, Target.LAST);
125128
}
126129
return consumption;
127130
});
@@ -130,8 +133,8 @@ public LinkyHandler(Thing thing, LocaleProvider localeProvider, Gson gson, HttpC
130133
LocalDate today = LocalDate.now();
131134
Consumption consumption = getConsumptionData(LocalDate.of(today.getYear() - 1, 1, 1), today);
132135
if (consumption != null) {
133-
logData(consumption.aggregats.years, "Year", true, DateTimeFormatter.ISO_LOCAL_DATE_TIME, false);
134-
consumption = getConsumptionAfterChecks(consumption);
136+
logData(consumption.aggregats.years, "Year", true, DateTimeFormatter.ISO_LOCAL_DATE_TIME, Target.ALL);
137+
consumption = getConsumptionAfterChecks(consumption, Target.LAST);
135138
}
136139
return consumption;
137140
});
@@ -191,8 +194,7 @@ public void initialize() {
191194
private synchronized void updateData() {
192195
boolean connectedBefore = isConnected();
193196
updatePowerData();
194-
updateDailyData();
195-
updateWeeklyData();
197+
updateDailyWeeklyData();
196198
updateMonthlyData();
197199
updateYearlyData();
198200
if (!connectedBefore && isConnected()) {
@@ -202,35 +204,25 @@ private synchronized void updateData() {
202204

203205
private synchronized void updatePowerData() {
204206
if (isLinked(PEAK_POWER) || isLinked(PEAK_TIMESTAMP)) {
205-
cachedPowerData.getValue().ifPresent(values -> {
207+
cachedPowerData.getValue().ifPresentOrElse(values -> {
206208
Aggregate days = values.aggregats.days;
207209
updateVAChannel(PEAK_POWER, days.datas.get(0));
208210
updateState(PEAK_TIMESTAMP, new DateTimeType(days.periodes.get(0).dateDebut));
211+
}, () -> {
212+
updateKwhChannel(PEAK_POWER, Double.NaN);
213+
updateState(PEAK_TIMESTAMP, UnDefType.UNDEF);
209214
});
210215
}
211216
}
212217

213218
/**
214219
* Request new dayly/weekly data and updates channels
215220
*/
216-
private synchronized void updateDailyData() {
217-
if (isLinked(YESTERDAY)) {
221+
private synchronized void updateDailyWeeklyData() {
222+
if (isLinked(YESTERDAY) || isLinked(LAST_WEEK) || isLinked(THIS_WEEK)) {
218223
cachedDailyData.getValue().ifPresentOrElse(values -> {
219224
Aggregate days = values.aggregats.days;
220225
updateKwhChannel(YESTERDAY, days.datas.get(days.datas.size() - 1));
221-
}, () -> {
222-
updateKwhChannel(YESTERDAY, Double.NaN);
223-
});
224-
}
225-
}
226-
227-
/**
228-
* Request new weekly data and updates channels
229-
*/
230-
private synchronized void updateWeeklyData() {
231-
if (isLinked(LAST_WEEK) || isLinked(THIS_WEEK)) {
232-
cachedDailyData.getValue().ifPresentOrElse(values -> {
233-
Aggregate days = values.aggregats.days;
234226
int idxLast = days.periodes.get(days.periodes.size() - 1).dateDebut.get(weekFields.dayOfWeek()) == 7 ? 2
235227
: 1;
236228
Aggregate weeks = values.aggregats.weeks;
@@ -243,6 +235,7 @@ private synchronized void updateWeeklyData() {
243235
updateKwhChannel(THIS_WEEK, 0.0);
244236
}
245237
}, () -> {
238+
updateKwhChannel(YESTERDAY, Double.NaN);
246239
if (ZonedDateTime.now().get(weekFields.dayOfWeek()) == 1) {
247240
updateKwhChannel(THIS_WEEK, 0.0);
248241
updateKwhChannel(LAST_WEEK, Double.NaN);
@@ -432,11 +425,9 @@ public synchronized void handleCommand(ChannelUID channelUID, Command command) {
432425
boolean connectedBefore = isConnected();
433426
switch (channelUID.getId()) {
434427
case YESTERDAY:
435-
updateDailyData();
436-
break;
437428
case LAST_WEEK:
438429
case THIS_WEEK:
439-
updateWeeklyData();
430+
updateDailyWeeklyData();
440431
break;
441432
case LAST_MONTH:
442433
case THIS_MONTH:
@@ -461,14 +452,18 @@ public synchronized void handleCommand(ChannelUID channelUID, Command command) {
461452
}
462453
}
463454

464-
private @Nullable Consumption getConsumptionAfterChecks(Consumption consumption) {
455+
private @Nullable Consumption getConsumptionAfterChecks(Consumption consumption, Target target) {
465456
try {
466457
checkData(consumption);
467458
} catch (LinkyException e) {
468459
logger.debug("Consumption data: {}", e.getMessage());
469460
return null;
470461
}
471-
if (!isDataLastDayAvailable(consumption)) {
462+
if (target == Target.FIRST && !isDataFirstDayAvailable(consumption)) {
463+
logger.debug("Data including yesterday are not yet available");
464+
return null;
465+
}
466+
if (target == Target.LAST && !isDataLastDayAvailable(consumption)) {
472467
logger.debug("Data including yesterday are not yet available");
473468
return null;
474469
}
@@ -502,19 +497,29 @@ public void checkData(Consumption consumption) throws LinkyException {
502497
}
503498
}
504499

500+
private boolean isDataFirstDayAvailable(Consumption consumption) {
501+
Aggregate days = consumption.aggregats.days;
502+
logData(days, "First day", false, DateTimeFormatter.ISO_LOCAL_DATE, Target.FIRST);
503+
return days.datas != null && days.datas.size() > 0 && !days.datas.get(0).isNaN();
504+
}
505+
505506
private boolean isDataLastDayAvailable(Consumption consumption) {
506507
Aggregate days = consumption.aggregats.days;
507-
logData(days, "Last day", false, DateTimeFormatter.ISO_LOCAL_DATE, true);
508+
logData(days, "Last day", false, DateTimeFormatter.ISO_LOCAL_DATE, Target.LAST);
508509
return days.datas != null && days.datas.size() > 0 && !days.datas.get(days.datas.size() - 1).isNaN();
509510
}
510511

511512
private void logData(Aggregate aggregate, String title, boolean withDateFin, DateTimeFormatter dateTimeFormatter,
512-
boolean onlyLast) {
513+
Target target) {
513514
if (logger.isDebugEnabled()) {
514515
int size = (aggregate.datas == null || aggregate.periodes == null) ? 0
515516
: (aggregate.datas.size() <= aggregate.periodes.size() ? aggregate.datas.size()
516517
: aggregate.periodes.size());
517-
if (onlyLast) {
518+
if (target == Target.FIRST) {
519+
if (size > 0) {
520+
logData(aggregate, 0, title, withDateFin, dateTimeFormatter);
521+
}
522+
} else if (target == Target.LAST) {
518523
if (size > 0) {
519524
logData(aggregate, size - 1, title, withDateFin, dateTimeFormatter);
520525
}

0 commit comments

Comments
 (0)