From cd84f255776b9d0edf5d1275f8f8640f26f171a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Ha=C3=9Fel?= Date: Thu, 21 Nov 2024 13:33:13 +0100 Subject: [PATCH] Group.lastValueChange, Property.lastValueChange --- src/main/angular/src/app/api/Group/Group.ts | 4 +++- .../angular/src/app/api/Property/Property.ts | 6 +++--- .../device-list/device-list.component.html | 1 + .../knx-group-list/knx-group-list.component.html | 2 +- src/main/java/de/ph87/home/knx/group/Group.java | 13 +++++++++++-- .../java/de/ph87/home/knx/group/GroupDto.java | 9 ++++++--- .../java/de/ph87/home/property/Property.java | 16 +++++++++------- .../java/de/ph87/home/property/PropertyDto.java | 9 +++++---- src/main/java/de/ph87/home/property/State.java | 8 ++++++++ 9 files changed, 47 insertions(+), 21 deletions(-) diff --git a/src/main/angular/src/app/api/Group/Group.ts b/src/main/angular/src/app/api/Group/Group.ts index ceff76f..0b53108 100644 --- a/src/main/angular/src/app/api/Group/Group.ts +++ b/src/main/angular/src/app/api/Group/Group.ts @@ -1,4 +1,4 @@ -import {orNull, validateString} from '../common/validators'; +import {orNull, validateDateOrNull, validateString} from '../common/validators'; import {State} from '../State/State'; export class Group { @@ -9,6 +9,7 @@ export class Group { readonly description: string, readonly dpt: string, readonly state: State | null, + readonly lastValueChange: Date | null, ) { // - } @@ -20,6 +21,7 @@ export class Group { validateString(json.description), validateString(json.dpt), orNull(json.state, State.fromJson), + validateDateOrNull(json.lastValueChange), ); } diff --git a/src/main/angular/src/app/api/Property/Property.ts b/src/main/angular/src/app/api/Property/Property.ts index 03b9fec..e69fb14 100644 --- a/src/main/angular/src/app/api/Property/Property.ts +++ b/src/main/angular/src/app/api/Property/Property.ts @@ -1,13 +1,13 @@ import {State} from "../State/State"; -import {orNull, validateString} from "../common/validators"; +import {orNull, validateDateOrNull, validateString} from "../common/validators"; export class Property { constructor( readonly id: string, readonly type: string, - readonly lastState: State | null, readonly state: State | null, + readonly lastValueChange: Date | null, ) { // - } @@ -16,8 +16,8 @@ export class Property { return new Property( validateString(json.id), validateString(json.type), - orNull(json.lastState, State.fromJson), orNull(json.state, State.fromJson), + validateDateOrNull(json.lastValueChange), ); } diff --git a/src/main/angular/src/app/shared/device-list/device-list.component.html b/src/main/angular/src/app/shared/device-list/device-list.component.html index 005da35..a8f6aea 100644 --- a/src/main/angular/src/app/shared/device-list/device-list.component.html +++ b/src/main/angular/src/app/shared/device-list/device-list.component.html @@ -15,6 +15,7 @@
{{ device.stateProperty?.state?.timestamp | relative:now }} + {{ device.stateProperty?.lastValueChange | relative:now }}
diff --git a/src/main/angular/src/app/shared/knx-group-list/knx-group-list.component.html b/src/main/angular/src/app/shared/knx-group-list/knx-group-list.component.html index 6ad2b5e..aacb0db 100644 --- a/src/main/angular/src/app/shared/knx-group-list/knx-group-list.component.html +++ b/src/main/angular/src/app/shared/knx-group-list/knx-group-list.component.html @@ -23,7 +23,7 @@
- {{ group.state?.timestamp | relative:now }}: + {{ group.lastValueChange | relative:now }}:
diff --git a/src/main/java/de/ph87/home/knx/group/Group.java b/src/main/java/de/ph87/home/knx/group/Group.java index a5f0345..19d49f4 100644 --- a/src/main/java/de/ph87/home/knx/group/Group.java +++ b/src/main/java/de/ph87/home/knx/group/Group.java @@ -5,10 +5,10 @@ import de.ph87.home.property.State; import jakarta.annotation.Nullable; import lombok.Getter; import lombok.NonNull; -import lombok.Setter; import lombok.ToString; import tuwien.auto.calimero.GroupAddress; +import java.time.ZonedDateTime; import java.util.Objects; @Getter @@ -35,10 +35,12 @@ public class Group { @ToString.Exclude private long puid; - @Setter @Nullable private State state; + @Nullable + private ZonedDateTime lastValueChange = null; + public Group(@NonNull final String id, @NonNull final GroupAddress address, @NonNull final String name, @NonNull final String description, @NonNull final DPT dpt, final long puid) { this.id = id; this.address = address; @@ -48,6 +50,13 @@ public class Group { this.puid = puid; } + public void setState(@NonNull final State newState) { + if (newState.valueChanged(this.state)) { + lastValueChange = ZonedDateTime.now(); + } + this.state = newState; + } + @Override public boolean equals(final Object o) { if (this == o) { diff --git a/src/main/java/de/ph87/home/knx/group/GroupDto.java b/src/main/java/de/ph87/home/knx/group/GroupDto.java index 81db6f5..a3ad14a 100644 --- a/src/main/java/de/ph87/home/knx/group/GroupDto.java +++ b/src/main/java/de/ph87/home/knx/group/GroupDto.java @@ -5,9 +5,9 @@ import de.ph87.home.web.IWebSocketMessage; import jakarta.annotation.Nullable; import lombok.Getter; import lombok.NonNull; -import lombok.Setter; import lombok.ToString; +import java.time.ZonedDateTime; import java.util.List; @Getter @@ -36,9 +36,11 @@ public class GroupDto implements IWebSocketMessage { @ToString.Exclude private final long puid; - @Setter @Nullable - private State state; + private final State state; + + @Nullable + private final ZonedDateTime lastValueChange; public GroupDto(@NonNull final Group group) { this.id = group.getId(); @@ -48,6 +50,7 @@ public class GroupDto implements IWebSocketMessage { this.dpt = group.getDpt().toString(); this.puid = group.getPuid(); this.state = group.getState(); + this.lastValueChange = group.getLastValueChange(); } } diff --git a/src/main/java/de/ph87/home/property/Property.java b/src/main/java/de/ph87/home/property/Property.java index ca7914b..d8f92e8 100644 --- a/src/main/java/de/ph87/home/property/Property.java +++ b/src/main/java/de/ph87/home/property/Property.java @@ -6,6 +6,7 @@ import lombok.NonNull; import lombok.RequiredArgsConstructor; import lombok.ToString; +import java.time.ZonedDateTime; import java.util.function.BiConsumer; import java.util.function.Consumer; @@ -43,16 +44,17 @@ public class Property implements IProperty { @ToString.Exclude private final Consumer> onStateSet; - @Nullable - @ToString.Exclude - private State lastState = null; - @Nullable private State state = null; - public void update(@Nullable final State state) { - this.lastState = this.state; - this.state = state; + @Nullable + private ZonedDateTime lastValueChange = null; + + public void update(@NonNull final State newState) { + if (newState.valueChanged(this.state)) { + lastValueChange = ZonedDateTime.now(); + } + this.state = newState; this.onStateSet.accept(this); } diff --git a/src/main/java/de/ph87/home/property/PropertyDto.java b/src/main/java/de/ph87/home/property/PropertyDto.java index 0434c15..d6edba0 100644 --- a/src/main/java/de/ph87/home/property/PropertyDto.java +++ b/src/main/java/de/ph87/home/property/PropertyDto.java @@ -5,6 +5,8 @@ import lombok.Getter; import lombok.NonNull; import lombok.ToString; +import java.time.ZonedDateTime; + @Getter @ToString public class PropertyDto implements IProperty { @@ -22,17 +24,16 @@ public class PropertyDto implements IProperty { } @Nullable - @ToString.Exclude - private final State lastState; + private final State state; @Nullable - private final State state; + private final ZonedDateTime lastValueChange; public PropertyDto(@NonNull final Property property) { this.id = property.getId(); this.type = property.getType(); this.state = property.getState(); - this.lastState = property.getLastState(); + this.lastValueChange = property.getLastValueChange(); } } diff --git a/src/main/java/de/ph87/home/property/State.java b/src/main/java/de/ph87/home/property/State.java index c0780ed..b5bb5c2 100644 --- a/src/main/java/de/ph87/home/property/State.java +++ b/src/main/java/de/ph87/home/property/State.java @@ -7,6 +7,7 @@ import lombok.NonNull; import lombok.ToString; import java.time.ZonedDateTime; +import java.util.Objects; @Getter @ToString @@ -32,4 +33,11 @@ public class State { this.string = string; } + public boolean valueChanged(@Nullable final State oldState) { + if (oldState == null) { + return true; + } + return !Objects.equals(oldState.value, value); + } + }