package refactor: electricity, consumption

This commit is contained in:
Patrick Haßel 2024-10-15 13:19:41 +02:00
parent b25b3377b8
commit 5ba7f3d4d6
22 changed files with 150 additions and 127 deletions

View File

@ -0,0 +1,16 @@
package de.ph87.data.common;
import lombok.NonNull;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class DateTimeHelpers {
@NonNull
public static ZonedDateTime ZDT(final long epochSeconds) {
return ZonedDateTime.ofInstant(Instant.ofEpochSecond(epochSeconds), ZoneId.systemDefault());
}
}

View File

@ -11,9 +11,9 @@ import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import static de.ph87.data.grid.GridReceiver.GRID_DELIVERY_SERIES_NAME; import static de.ph87.data.electricity.grid.GridReceiver.GRID_DELIVERY_SERIES_NAME;
import static de.ph87.data.grid.GridReceiver.GRID_PURCHASE_SERIES_NAME; import static de.ph87.data.electricity.grid.GridReceiver.GRID_PURCHASE_SERIES_NAME;
import static de.ph87.data.photovoltaic.PhotovoltaicMqttReceiver.PHOTOVOLTAIC_ENERGY_SERIES_NAME; import static de.ph87.data.electricity.photovoltaic.PhotovoltaicReceiver.PHOTOVOLTAIC_ENERGY_SERIES_NAME;
@Slf4j @Slf4j
@Service @Service

View File

@ -0,0 +1,28 @@
package de.ph87.data.electricity;
public class ElectricityHelpers {
public static double energyToKWh(final double energy, final String energyUnit) {
return switch (energyUnit) {
case "mWh" -> energy / 1000000;
case "Wh" -> energy / 1000;
case "kWh" -> energy;
case "MWh" -> energy * 1000;
case "GWh" -> energy * 1000000;
default -> throw new RuntimeException();
};
}
@SuppressWarnings("unused")
public static double powerToW(final double power, final String powerUnit) {
return switch (powerUnit) {
case "mW" -> power / 1000;
case "W" -> power;
case "kW" -> power * 1000;
case "MW" -> power * 1000000;
case "GW" -> power * 1000000000;
default -> throw new RuntimeException();
};
}
}

View File

@ -1,11 +1,11 @@
package de.ph87.data.grid; package de.ph87.data.electricity.grid;
import lombok.Getter; import lombok.Getter;
import lombok.ToString; import lombok.ToString;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import static de.ph87.data.series.period.consumption.ConsumptionController.ZDT; import static de.ph87.data.common.DateTimeHelpers.ZDT;
@Getter @Getter
@ToString @ToString

View File

@ -1,9 +1,9 @@
package de.ph87.data.grid; package de.ph87.data.electricity.grid;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import de.ph87.data.mqtt.MqttEvent; import de.ph87.data.mqtt.MqttEvent;
import de.ph87.data.series.measure.MeasureEvent; import de.ph87.data.series.consumption.ConsumptionEvent;
import lombok.NonNull; import lombok.NonNull;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -11,6 +11,8 @@ import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.event.EventListener; import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import static de.ph87.data.electricity.ElectricityHelpers.energyToKWh;
@Slf4j @Slf4j
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
@ -39,33 +41,10 @@ public class GridReceiver {
} }
final double purchaseKWh = energyToKWh(inbound.purchaseWh, "Wh"); final double purchaseKWh = energyToKWh(inbound.purchaseWh, "Wh");
applicationEventPublisher.publishEvent(new MeasureEvent(GRID_PURCHASE_SERIES_NAME, inbound.meter, inbound.date, purchaseKWh)); applicationEventPublisher.publishEvent(new ConsumptionEvent(GRID_PURCHASE_SERIES_NAME, inbound.meter, inbound.date, purchaseKWh));
final double deliveryKWh = energyToKWh(inbound.deliveryWh, "Wh"); final double deliveryKWh = energyToKWh(inbound.deliveryWh, "Wh");
applicationEventPublisher.publishEvent(new MeasureEvent(GRID_DELIVERY_SERIES_NAME, inbound.meter, inbound.date, deliveryKWh)); applicationEventPublisher.publishEvent(new ConsumptionEvent(GRID_DELIVERY_SERIES_NAME, inbound.meter, inbound.date, deliveryKWh));
}
public static double energyToKWh(final double energy, final String energyUnit) {
return switch (energyUnit) {
case "mWh" -> energy / 1000000;
case "Wh" -> energy / 1000;
case "kWh" -> energy;
case "MWh" -> energy * 1000;
case "GWh" -> energy * 1000000;
default -> throw new RuntimeException();
};
}
@SuppressWarnings("unused")
public static double powerToW(final double power, final String powerUnit) {
return switch (powerUnit) {
case "mW" -> power / 1000;
case "W" -> power;
case "kW" -> power * 1000;
case "MW" -> power * 1000000;
case "GW" -> power * 1000000000;
default -> throw new RuntimeException();
};
} }
} }

View File

@ -1,7 +1,7 @@
package de.ph87.data.photovoltaic; package de.ph87.data.electricity.photovoltaic;
import de.ph87.data.mqtt.MqttEvent; import de.ph87.data.mqtt.MqttEvent;
import de.ph87.data.series.measure.MeasureEvent; import de.ph87.data.series.consumption.ConsumptionEvent;
import lombok.NonNull; import lombok.NonNull;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -13,12 +13,13 @@ import java.time.ZonedDateTime;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import static de.ph87.data.series.period.consumption.ConsumptionController.ZDT; import static de.ph87.data.common.DateTimeHelpers.ZDT;
import static de.ph87.data.electricity.ElectricityHelpers.energyToKWh;
@Slf4j @Slf4j
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
public class PhotovoltaicMqttReceiver { public class PhotovoltaicReceiver {
public static final String PHOTOVOLTAIC_ENERGY_SERIES_NAME = "photovoltaic.energyKWh"; public static final String PHOTOVOLTAIC_ENERGY_SERIES_NAME = "photovoltaic.energyKWh";
@ -42,30 +43,7 @@ public class PhotovoltaicMqttReceiver {
final double energy = Double.parseDouble(matcher.group("energy")); final double energy = Double.parseDouble(matcher.group("energy"));
final String energyUnit = matcher.group("energyUnit"); final String energyUnit = matcher.group("energyUnit");
final double energyKWh = energyToKWh(energy, energyUnit); final double energyKWh = energyToKWh(energy, energyUnit);
applicationEventPublisher.publishEvent(new MeasureEvent(PHOTOVOLTAIC_ENERGY_SERIES_NAME, serial, date, energyKWh)); applicationEventPublisher.publishEvent(new ConsumptionEvent(PHOTOVOLTAIC_ENERGY_SERIES_NAME, serial, date, energyKWh));
}
public static double energyToKWh(final double energy, final String energyUnit) {
return switch (energyUnit) {
case "mWh" -> energy / 1000000;
case "Wh" -> energy / 1000;
case "kWh" -> energy;
case "MWh" -> energy * 1000;
case "GWh" -> energy * 1000000;
default -> throw new RuntimeException();
};
}
@SuppressWarnings("unused")
public static double powerToW(final double power, final String powerUnit) {
return switch (powerUnit) {
case "mW" -> power / 1000;
case "W" -> power;
case "kW" -> power * 1000;
case "MW" -> power * 1000000;
case "GW" -> power * 1000000000;
default -> throw new RuntimeException();
};
} }
} }

View File

@ -1,6 +1,6 @@
package de.ph87.data.series; package de.ph87.data.series;
import de.ph87.data.series.period.Period; import de.ph87.data.series.consumption.period.Period;
import jakarta.annotation.Nullable; import jakarta.annotation.Nullable;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.*; import lombok.*;

View File

@ -1,8 +1,8 @@
package de.ph87.data.series; package de.ph87.data.series;
import de.ph87.data.series.measure.MeasureEvent; import de.ph87.data.series.consumption.ConsumptionEvent;
import de.ph87.data.series.measure.MeasureEventTooOld; import de.ph87.data.series.consumption.ConsumptionEventTooOld;
import de.ph87.data.series.period.PeriodService; import de.ph87.data.series.consumption.period.PeriodService;
import lombok.NonNull; import lombok.NonNull;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -22,9 +22,9 @@ public class SeriesService {
private final PeriodService periodService; private final PeriodService periodService;
@EventListener(MeasureEvent.class) @EventListener(ConsumptionEvent.class)
public void onMeasureEvent(@NonNull final MeasureEvent event) { public void onConsumptionEvent(@NonNull final ConsumptionEvent event) {
log.debug("Handling MeasureEvent: {}", event); log.debug("Handling ConsumptionEvent: {}", event);
final Optional<Series> seriesOptional = seriesRepository.findByNameOrAliasesContains(event.getName(), event.getName()); final Optional<Series> seriesOptional = seriesRepository.findByNameOrAliasesContains(event.getName(), event.getName());
if (seriesOptional.isEmpty()) { if (seriesOptional.isEmpty()) {
log.warn("No series found with name or alias: \"{}\"", event.getName()); log.warn("No series found with name or alias: \"{}\"", event.getName());
@ -34,8 +34,8 @@ public class SeriesService {
final Series series = seriesOptional.get(); final Series series = seriesOptional.get();
log.debug("Series found: {}", series); log.debug("Series found: {}", series);
try { try {
periodService.onMeasureEvent(series, event); periodService.onConsumptionEvent(series, event);
} catch (MeasureEventTooOld e) { } catch (ConsumptionEventTooOld e) {
log.warn(e.toString()); log.warn(e.toString());
} }
} }

View File

@ -1,14 +1,14 @@
package de.ph87.data.series.period.consumption; package de.ph87.data.series.consumption;
import de.ph87.data.series.period.Period; import de.ph87.data.series.consumption.period.Period;
import de.ph87.data.series.period.consumption.unit.Unit; import de.ph87.data.series.consumption.unit.Unit;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.*; import lombok.*;
import java.io.Serializable; import java.io.Serializable;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import static de.ph87.data.series.period.consumption.slice.SliceService.DL; import static de.ph87.data.series.consumption.slice.SliceService.DL;
@Entity @Entity
@Getter @Getter

View File

@ -1,8 +1,9 @@
package de.ph87.data.series.period.consumption; package de.ph87.data.series.consumption;
import de.ph87.data.series.period.consumption.slice.Slice; import de.ph87.data.common.DateTimeHelpers;
import de.ph87.data.series.period.consumption.slice.SliceService; import de.ph87.data.series.consumption.slice.Slice;
import de.ph87.data.series.period.consumption.unit.Unit; import de.ph87.data.series.consumption.slice.SliceService;
import de.ph87.data.series.consumption.unit.Unit;
import lombok.NonNull; import lombok.NonNull;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -10,8 +11,6 @@ import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.server.ResponseStatusException; import org.springframework.web.server.ResponseStatusException;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -53,7 +52,7 @@ public class ConsumptionController {
@NonNull @NonNull
@GetMapping("{seriesId}/{unitName}/between/{beginEpochSeconds}/{endEpochSeconds}") @GetMapping("{seriesId}/{unitName}/between/{beginEpochSeconds}/{endEpochSeconds}")
public List<List<Number>> between(@PathVariable final long seriesId, @PathVariable final String unitName, @PathVariable final long beginEpochSeconds, @PathVariable final long endEpochSeconds) { public List<List<Number>> between(@PathVariable final long seriesId, @PathVariable final String unitName, @PathVariable final long beginEpochSeconds, @PathVariable final long endEpochSeconds) {
return between(seriesId, Unit.valueOf(unitName), ZDT(beginEpochSeconds), ZDT(endEpochSeconds)); return between(seriesId, Unit.valueOf(unitName), DateTimeHelpers.ZDT(beginEpochSeconds), DateTimeHelpers.ZDT(endEpochSeconds));
} }
@NonNull @NonNull
@ -78,9 +77,4 @@ public class ConsumptionController {
return numbers; return numbers;
} }
@NonNull
public static ZonedDateTime ZDT(final long epochSeconds) {
return ZonedDateTime.ofInstant(Instant.ofEpochSecond(epochSeconds), ZoneId.systemDefault());
}
} }

View File

@ -0,0 +1,26 @@
package de.ph87.data.series.consumption;
import lombok.Getter;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.ToString;
import java.time.ZonedDateTime;
@Getter
@ToString
@RequiredArgsConstructor
public class ConsumptionEvent {
@NonNull
private final String name;
@NonNull
private final String periodName;
@NonNull
private final ZonedDateTime date;
private final double value;
}

View File

@ -0,0 +1,12 @@
package de.ph87.data.series.consumption;
import de.ph87.data.series.consumption.period.Period;
import lombok.NonNull;
public class ConsumptionEventTooOld extends Exception {
public ConsumptionEventTooOld(@NonNull final Period period, @NonNull final ConsumptionEvent event) {
super("Date of received Event older than last stored one: event=%s, period=%s".formatted(event, period));
}
}

View File

@ -1,8 +1,7 @@
package de.ph87.data.series.period.consumption; package de.ph87.data.series.consumption;
import de.ph87.data.series.Series; import de.ph87.data.series.consumption.period.Period;
import de.ph87.data.series.period.Period; import de.ph87.data.series.consumption.unit.Unit;
import de.ph87.data.series.period.consumption.unit.Unit;
import lombok.NonNull; import lombok.NonNull;
import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.CrudRepository;
@ -20,6 +19,4 @@ public interface ConsumptionRepository extends CrudRepository<Consumption, Consu
List<Consumption> findAllByIdPeriodAndIdUnitAndIdAlignedGreaterThanEqualAndIdAlignedLessThanEqualOrderByIdAlignedAsc(@NonNull Period period, @NonNull Unit unit, @NonNull ZonedDateTime begin, @NonNull ZonedDateTime end); List<Consumption> findAllByIdPeriodAndIdUnitAndIdAlignedGreaterThanEqualAndIdAlignedLessThanEqualOrderByIdAlignedAsc(@NonNull Period period, @NonNull Unit unit, @NonNull ZonedDateTime begin, @NonNull ZonedDateTime end);
void deleteAllByIdPeriodSeries(Series oil);
} }

View File

@ -1,8 +1,7 @@
package de.ph87.data.series.period.consumption; package de.ph87.data.series.consumption;
import de.ph87.data.series.measure.MeasureEvent; import de.ph87.data.series.consumption.period.Period;
import de.ph87.data.series.period.Period; import de.ph87.data.series.consumption.unit.Unit;
import de.ph87.data.series.period.consumption.unit.Unit;
import lombok.NonNull; import lombok.NonNull;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -20,7 +19,7 @@ public class ConsumptionService {
private final ConsumptionRepository consumptionRepository; private final ConsumptionRepository consumptionRepository;
public void onMeasureEvent(@NonNull final Period period, @NonNull final MeasureEvent event) { public void onConsumptionEvent(@NonNull final Period period, @NonNull final ConsumptionEvent event) {
for (final Unit unit : Unit.values()) { for (final Unit unit : Unit.values()) {
final ZonedDateTime aligned = unit.align(event.getDate()); final ZonedDateTime aligned = unit.align(event.getDate());
final Optional<Consumption> existingOptional = consumptionRepository.findByIdPeriodAndIdUnitAndIdAligned(period, unit, aligned); final Optional<Consumption> existingOptional = consumptionRepository.findByIdPeriodAndIdUnitAndIdAligned(period, unit, aligned);

View File

@ -1,7 +1,7 @@
package de.ph87.data.series.period; package de.ph87.data.series.consumption.period;
import de.ph87.data.series.Series; import de.ph87.data.series.Series;
import de.ph87.data.series.measure.MeasureEvent; import de.ph87.data.series.consumption.ConsumptionEvent;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.*; import lombok.*;
@ -47,7 +47,7 @@ public class Period {
@Column(nullable = false) @Column(nullable = false)
private double lastValue; private double lastValue;
public Period(@NonNull final Series series, @NonNull final MeasureEvent event) { public Period(@NonNull final Series series, @NonNull final ConsumptionEvent event) {
this.series = series; this.series = series;
this.name = event.getPeriodName(); this.name = event.getPeriodName();
this.firstDate = event.getDate(); this.firstDate = event.getDate();

View File

@ -1,6 +1,5 @@
package de.ph87.data.series.period; package de.ph87.data.series.consumption.period;
import de.ph87.data.series.Series;
import lombok.NonNull; import lombok.NonNull;
import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.CrudRepository;
@ -11,6 +10,4 @@ public interface PeriodRepository extends CrudRepository<Period, Long> {
List<Period> findAllBySeriesIdAndLastDateGreaterThanAndFirstDateLessThan(long seriesId, @NonNull ZonedDateTime wantedEnd, @NonNull ZonedDateTime wantedBegin); List<Period> findAllBySeriesIdAndLastDateGreaterThanAndFirstDateLessThan(long seriesId, @NonNull ZonedDateTime wantedEnd, @NonNull ZonedDateTime wantedBegin);
void deleteAllBySeries(Series oil);
} }

View File

@ -1,10 +1,10 @@
package de.ph87.data.series.period; package de.ph87.data.series.consumption.period;
import de.ph87.data.series.Series; import de.ph87.data.series.Series;
import de.ph87.data.series.SeriesMode; import de.ph87.data.series.SeriesMode;
import de.ph87.data.series.measure.MeasureEvent; import de.ph87.data.series.consumption.ConsumptionEvent;
import de.ph87.data.series.measure.MeasureEventTooOld; import de.ph87.data.series.consumption.ConsumptionEventTooOld;
import de.ph87.data.series.period.consumption.ConsumptionService; import de.ph87.data.series.consumption.ConsumptionService;
import lombok.NonNull; import lombok.NonNull;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -21,19 +21,19 @@ public class PeriodService {
private final ConsumptionService consumptionService; private final ConsumptionService consumptionService;
public void onMeasureEvent(@NonNull final Series series, @NonNull final MeasureEvent event) throws MeasureEventTooOld { public void onConsumptionEvent(@NonNull final Series series, @NonNull final ConsumptionEvent event) throws ConsumptionEventTooOld {
final Period period = getOrCreatePeriod(series, event); final Period period = getOrCreatePeriod(series, event);
period.setLastDate(event.getDate()); period.setLastDate(event.getDate());
period.setLastValue(event.getValue()); period.setLastValue(event.getValue());
consumptionService.onMeasureEvent(period, event); consumptionService.onConsumptionEvent(period, event);
} }
@NonNull @NonNull
private Period getOrCreatePeriod(@NonNull final Series series, @NonNull final MeasureEvent event) throws MeasureEventTooOld { private Period getOrCreatePeriod(@NonNull final Series series, @NonNull final ConsumptionEvent event) throws ConsumptionEventTooOld {
if (series.getPeriod() != null) { if (series.getPeriod() != null) {
log.debug("Last Period exists: {}", series.getPeriod()); log.debug("Last Period exists: {}", series.getPeriod());
if (isEventTooOld(series.getPeriod(), event)) { if (isEventTooOld(series.getPeriod(), event)) {
throw new MeasureEventTooOld(series.getPeriod(), event); throw new ConsumptionEventTooOld(series.getPeriod(), event);
} }
if (isPeriodValid(series.getPeriod(), event)) { if (isPeriodValid(series.getPeriod(), event)) {
log.debug("Last Period still VALID."); log.debug("Last Period still VALID.");
@ -49,11 +49,11 @@ public class PeriodService {
return newPeriod; return newPeriod;
} }
private static boolean isEventTooOld(@NonNull final Period period, @NonNull final MeasureEvent event) { private static boolean isEventTooOld(@NonNull final Period period, @NonNull final ConsumptionEvent event) {
return !period.getLastDate().isBefore(event.getDate()); return !period.getLastDate().isBefore(event.getDate());
} }
private boolean isPeriodValid(@NonNull final Period period, @NonNull final MeasureEvent event) { private boolean isPeriodValid(@NonNull final Period period, @NonNull final ConsumptionEvent event) {
if (!period.getName().equals(event.getPeriodName())) { if (!period.getName().equals(event.getPeriodName())) {
log.debug("Period name changed: old={}, new={}", period.getName(), event.getPeriodName()); log.debug("Period name changed: old={}, new={}", period.getName(), event.getPeriodName());
return false; return false;

View File

@ -1,7 +1,7 @@
package de.ph87.data.series.period.consumption.slice; package de.ph87.data.series.consumption.slice;
import de.ph87.data.series.period.consumption.Consumption; import de.ph87.data.series.consumption.Consumption;
import de.ph87.data.series.period.consumption.unit.Unit; import de.ph87.data.series.consumption.unit.Unit;
import lombok.Getter; import lombok.Getter;
import lombok.NonNull; import lombok.NonNull;
import lombok.Setter; import lombok.Setter;

View File

@ -1,10 +1,10 @@
package de.ph87.data.series.period.consumption.slice; package de.ph87.data.series.consumption.slice;
import de.ph87.data.series.period.Period; import de.ph87.data.series.consumption.Consumption;
import de.ph87.data.series.period.PeriodRepository; import de.ph87.data.series.consumption.ConsumptionRepository;
import de.ph87.data.series.period.consumption.Consumption; import de.ph87.data.series.consumption.period.Period;
import de.ph87.data.series.period.consumption.ConsumptionRepository; import de.ph87.data.series.consumption.period.PeriodRepository;
import de.ph87.data.series.period.consumption.unit.Unit; import de.ph87.data.series.consumption.unit.Unit;
import jakarta.annotation.Nullable; import jakarta.annotation.Nullable;
import lombok.NonNull; import lombok.NonNull;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;

View File

@ -1,4 +1,4 @@
package de.ph87.data.series.period.consumption.unit; package de.ph87.data.series.consumption.unit;
import lombok.NonNull; import lombok.NonNull;

View File

@ -1,4 +1,4 @@
package de.ph87.data.series.period.consumption.unit; package de.ph87.data.series.consumption.unit;
import jakarta.persistence.AttributeConverter; import jakarta.persistence.AttributeConverter;
import jakarta.persistence.Converter; import jakarta.persistence.Converter;

View File

@ -15,9 +15,6 @@ public class MeasureEvent {
@NonNull @NonNull
private final String name; private final String name;
@NonNull
private final String periodName;
@NonNull @NonNull
private final ZonedDateTime date; private final ZonedDateTime date;