Skip to content

Commit

Permalink
[linky] One unique method to update daily and weekly data channels
Browse files Browse the repository at this point in the history
Also check data availability for the peak consumption of yesterday
Also log power peak data

Signed-off-by: Laurent Garnier <lg.hc@free.fr>
  • Loading branch information
lolodomo committed Jan 16, 2021
1 parent c426d6d commit 047f3d5
Showing 1 changed file with 40 additions and 39 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -94,9 +94,9 @@ public LinkyHandler(Thing thing, LocaleProvider localeProvider, Gson gson, HttpC
LocalDate today = LocalDate.now();
Consumption consumption = getConsumptionData(today.minusDays(15), today);
if (consumption != null) {
logData(consumption.aggregats.days, "Day", false, DateTimeFormatter.ISO_LOCAL_DATE, false);
logData(consumption.aggregats.weeks, "Week", true, DateTimeFormatter.ISO_LOCAL_DATE_TIME, false);
consumption = getConsumptionAfterChecks(consumption);
logData(consumption.aggregats.days, "Day", false, DateTimeFormatter.ISO_LOCAL_DATE, false, false);
logData(consumption.aggregats.weeks, "Week", true, DateTimeFormatter.ISO_LOCAL_DATE_TIME, false, false);
consumption = getConsumptionAfterChecks(consumption, false, true);
}
return consumption;
});
Expand All @@ -106,12 +106,9 @@ public LinkyHandler(Thing thing, LocaleProvider localeProvider, Gson gson, HttpC
LocalDate from = to.minusDays(2);
Consumption consumption = getPowerData(from, to);
if (consumption != null) {
try {
checkData(consumption);
} catch (LinkyException e) {
logger.debug("Power data: {}", e.getMessage());
return null;
}
logData(consumption.aggregats.days, "Day (peak)", true, DateTimeFormatter.ISO_LOCAL_DATE_TIME, false,
false);
consumption = getConsumptionAfterChecks(consumption, true, false);
}
return consumption;
});
Expand All @@ -120,8 +117,9 @@ public LinkyHandler(Thing thing, LocaleProvider localeProvider, Gson gson, HttpC
LocalDate today = LocalDate.now();
Consumption consumption = getConsumptionData(today.withDayOfMonth(1).minusMonths(1), today);
if (consumption != null) {
logData(consumption.aggregats.months, "Month", true, DateTimeFormatter.ISO_LOCAL_DATE_TIME, false);
consumption = getConsumptionAfterChecks(consumption);
logData(consumption.aggregats.months, "Month", true, DateTimeFormatter.ISO_LOCAL_DATE_TIME, false,
false);
consumption = getConsumptionAfterChecks(consumption, false, true);
}
return consumption;
});
Expand All @@ -130,8 +128,8 @@ public LinkyHandler(Thing thing, LocaleProvider localeProvider, Gson gson, HttpC
LocalDate today = LocalDate.now();
Consumption consumption = getConsumptionData(LocalDate.of(today.getYear() - 1, 1, 1), today);
if (consumption != null) {
logData(consumption.aggregats.years, "Year", true, DateTimeFormatter.ISO_LOCAL_DATE_TIME, false);
consumption = getConsumptionAfterChecks(consumption);
logData(consumption.aggregats.years, "Year", true, DateTimeFormatter.ISO_LOCAL_DATE_TIME, false, false);
consumption = getConsumptionAfterChecks(consumption, false, true);
}
return consumption;
});
Expand Down Expand Up @@ -191,8 +189,7 @@ public void initialize() {
private synchronized void updateData() {
boolean connectedBefore = isConnected();
updatePowerData();
updateDailyData();
updateWeeklyData();
updateDailyWeeklyData();
updateMonthlyData();
updateYearlyData();
if (!connectedBefore && isConnected()) {
Expand All @@ -202,35 +199,25 @@ private synchronized void updateData() {

private synchronized void updatePowerData() {
if (isLinked(PEAK_POWER) || isLinked(PEAK_TIMESTAMP)) {
cachedPowerData.getValue().ifPresent(values -> {
cachedPowerData.getValue().ifPresentOrElse(values -> {
Aggregate days = values.aggregats.days;
updateVAChannel(PEAK_POWER, days.datas.get(0));
updateState(PEAK_TIMESTAMP, new DateTimeType(days.periodes.get(0).dateDebut));
}, () -> {
updateKwhChannel(PEAK_POWER, Double.NaN);
updateState(PEAK_TIMESTAMP, UnDefType.UNDEF);
});
}
}

/**
* Request new dayly/weekly data and updates channels
*/
private synchronized void updateDailyData() {
if (isLinked(YESTERDAY)) {
private synchronized void updateDailyWeeklyData() {
if (isLinked(YESTERDAY) || isLinked(LAST_WEEK) || isLinked(THIS_WEEK)) {
cachedDailyData.getValue().ifPresentOrElse(values -> {
Aggregate days = values.aggregats.days;
updateKwhChannel(YESTERDAY, days.datas.get(days.datas.size() - 1));
}, () -> {
updateKwhChannel(YESTERDAY, Double.NaN);
});
}
}

/**
* Request new weekly data and updates channels
*/
private synchronized void updateWeeklyData() {
if (isLinked(LAST_WEEK) || isLinked(THIS_WEEK)) {
cachedDailyData.getValue().ifPresentOrElse(values -> {
Aggregate days = values.aggregats.days;
int idxLast = days.periodes.get(days.periodes.size() - 1).dateDebut.get(weekFields.dayOfWeek()) == 7 ? 2
: 1;
Aggregate weeks = values.aggregats.weeks;
Expand All @@ -243,6 +230,7 @@ private synchronized void updateWeeklyData() {
updateKwhChannel(THIS_WEEK, 0.0);
}
}, () -> {
updateKwhChannel(YESTERDAY, Double.NaN);
if (ZonedDateTime.now().get(weekFields.dayOfWeek()) == 1) {
updateKwhChannel(THIS_WEEK, 0.0);
updateKwhChannel(LAST_WEEK, Double.NaN);
Expand Down Expand Up @@ -432,11 +420,9 @@ public synchronized void handleCommand(ChannelUID channelUID, Command command) {
boolean connectedBefore = isConnected();
switch (channelUID.getId()) {
case YESTERDAY:
updateDailyData();
break;
case LAST_WEEK:
case THIS_WEEK:
updateWeeklyData();
updateDailyWeeklyData();
break;
case LAST_MONTH:
case THIS_MONTH:
Expand All @@ -461,14 +447,19 @@ public synchronized void handleCommand(ChannelUID channelUID, Command command) {
}
}

private @Nullable Consumption getConsumptionAfterChecks(Consumption consumption) {
private @Nullable Consumption getConsumptionAfterChecks(Consumption consumption, boolean checkFirst,
boolean checkLast) {
try {
checkData(consumption);
} catch (LinkyException e) {
logger.debug("Consumption data: {}", e.getMessage());
return null;
}
if (!isDataLastDayAvailable(consumption)) {
if (checkFirst && !isDataFirstDayAvailable(consumption)) {
logger.debug("Data including yesterday are not yet available");
return null;
}
if (checkLast && !isDataLastDayAvailable(consumption)) {
logger.debug("Data including yesterday are not yet available");
return null;
}
Expand Down Expand Up @@ -502,19 +493,29 @@ public void checkData(Consumption consumption) throws LinkyException {
}
}

private boolean isDataFirstDayAvailable(Consumption consumption) {
Aggregate days = consumption.aggregats.days;
logData(days, "First day", false, DateTimeFormatter.ISO_LOCAL_DATE, true, false);
return days.datas != null && days.datas.size() > 0 && !days.datas.get(0).isNaN();
}

private boolean isDataLastDayAvailable(Consumption consumption) {
Aggregate days = consumption.aggregats.days;
logData(days, "Last day", false, DateTimeFormatter.ISO_LOCAL_DATE, true);
logData(days, "Last day", false, DateTimeFormatter.ISO_LOCAL_DATE, false, true);
return days.datas != null && days.datas.size() > 0 && !days.datas.get(days.datas.size() - 1).isNaN();
}

private void logData(Aggregate aggregate, String title, boolean withDateFin, DateTimeFormatter dateTimeFormatter,
boolean onlyLast) {
boolean onlyFirst, boolean onlyLast) {
if (logger.isDebugEnabled()) {
int size = (aggregate.datas == null || aggregate.periodes == null) ? 0
: (aggregate.datas.size() <= aggregate.periodes.size() ? aggregate.datas.size()
: aggregate.periodes.size());
if (onlyLast) {
if (onlyFirst) {
if (size > 0) {
logData(aggregate, 0, title, withDateFin, dateTimeFormatter);
}
} else if (onlyLast) {
if (size > 0) {
logData(aggregate, size - 1, title, withDateFin, dateTimeFormatter);
}
Expand Down

0 comments on commit 047f3d5

Please sign in to comment.