From bb972283a38307645a08e7326600dd5d16744e3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Ha=C3=9Fel?= Date: Mon, 9 Sep 2024 13:10:53 +0200 Subject: [PATCH] ScheduleEntry.skip --- src/main/angular/angular.json | 3 +++ .../app/api/schedule/entry/ScheduleEntry.ts | 4 ++- .../list/schedule-list.component.html | 13 ++++++--- .../list/schedule-list.component.less | 15 +++++++++++ .../schedule/list/schedule-list.component.ts | 11 ++++++++ src/main/angular/src/assets/skip.svg | 7 +++++ .../angular/src/environments/environment.ts | 15 +---------- .../ph87/homeautomation/DemoDataService.java | 1 + .../schedule/ScheduleExecutor.java | 27 +++++++++++-------- .../schedule/entry/ScheduleEntry.java | 3 +++ .../entry/ScheduleEntryController.java | 5 ++++ .../schedule/entry/ScheduleEntryDto.java | 3 +++ .../schedule/entry/ScheduleEntryWriter.java | 4 +++ 13 files changed, 81 insertions(+), 30 deletions(-) create mode 100644 src/main/angular/src/assets/skip.svg diff --git a/src/main/angular/angular.json b/src/main/angular/angular.json index 3802de1..3371ea6 100644 --- a/src/main/angular/angular.json +++ b/src/main/angular/angular.json @@ -125,5 +125,8 @@ } } } + }, + "cli": { + "analytics": false } } diff --git a/src/main/angular/src/app/api/schedule/entry/ScheduleEntry.ts b/src/main/angular/src/app/api/schedule/entry/ScheduleEntry.ts index 6cc3154..64670eb 100644 --- a/src/main/angular/src/app/api/schedule/entry/ScheduleEntry.ts +++ b/src/main/angular/src/app/api/schedule/entry/ScheduleEntry.ts @@ -1,4 +1,4 @@ -import {validateBooleanNotNull, validateDateAllowNull, validateNumberNotNull, validateStringNotEmptyNotNull} from "../../validators"; +import {validateBooleanNotNull, validateDateAllowNull, validateNumberAllowNull, validateNumberNotNull, validateStringNotEmptyNotNull} from "../../validators"; import {Timestamp} from "../../Timestamp"; import {Property} from "../../property/Property"; import {Bulk} from "../../bulk/Bulk"; @@ -26,6 +26,7 @@ export class ScheduleEntry { readonly minute: number, readonly second: number, readonly fuzzySeconds: number, + readonly skip: number, readonly lastClearTimestamp: Timestamp | null, readonly nextClearTimestamp: Timestamp | null, readonly nextFuzzyTimestamp: Timestamp | null, @@ -55,6 +56,7 @@ export class ScheduleEntry { validateNumberNotNull(json['minute']), validateNumberNotNull(json['second']), validateNumberNotNull(json['fuzzySeconds']), + validateNumberAllowNull(json['skip']) || 0, Timestamp.fromDateOrNull(validateDateAllowNull(json['lastClearTimestamp'])), Timestamp.fromDateOrNull(validateDateAllowNull(json['nextClearTimestamp'])), Timestamp.fromDateOrNull(validateDateAllowNull(json['nextFuzzyTimestamp'])), diff --git a/src/main/angular/src/app/pages/schedule/list/schedule-list.component.html b/src/main/angular/src/app/pages/schedule/list/schedule-list.component.html index 0df5a4a..f91d950 100644 --- a/src/main/angular/src/app/pages/schedule/list/schedule-list.component.html +++ b/src/main/angular/src/app/pages/schedule/list/schedule-list.component.html @@ -6,13 +6,18 @@
-
+
+ +
{{ schedule.title }}
@@ -24,13 +29,13 @@
-
- Nächste Ausführung: -
{{ schedule.next?.nextFuzzyTimestamp.dayName }}: {{ schedule.next?.nextFuzzyTimestamp.timeString }} - - -
+
+ Nächste Ausführung: +
{{ schedule.next?.bulk?.name }}
diff --git a/src/main/angular/src/app/pages/schedule/list/schedule-list.component.less b/src/main/angular/src/app/pages/schedule/list/schedule-list.component.less index 0a6f523..8131b13 100644 --- a/src/main/angular/src/app/pages/schedule/list/schedule-list.component.less +++ b/src/main/angular/src/app/pages/schedule/list/schedule-list.component.less @@ -24,6 +24,17 @@ font-weight: bold; } + .skip { + padding: 0.45em; + float: left; + + img { + display: inline; + vertical-align: bottom; + height: 1.3em; + } + } + .delete { float: right; padding: 0.5em; @@ -110,6 +121,10 @@ background-color: #F0FFF0; } + .skipActive { + background-color: orange; + } + @media (min-width: 1000px) { float: left; width: 400px; diff --git a/src/main/angular/src/app/pages/schedule/list/schedule-list.component.ts b/src/main/angular/src/app/pages/schedule/list/schedule-list.component.ts index d25c716..e5a1fb4 100644 --- a/src/main/angular/src/app/pages/schedule/list/schedule-list.component.ts +++ b/src/main/angular/src/app/pages/schedule/list/schedule-list.component.ts @@ -4,6 +4,8 @@ import {Schedule} from "../../../api/schedule/Schedule"; import {faCheckCircle, faCircle, faTimesCircle} from '@fortawesome/free-regular-svg-icons'; import {NO_OP} from "../../../api/api.service"; import {Update} from "../../../api/Update"; +import {ScheduleEntryService} from "../../../api/schedule/entry/schedule-entry.service"; +import {ScheduleEntry} from "../../../api/schedule/entry/ScheduleEntry"; @Component({ selector: 'app-schedule-list', @@ -24,6 +26,7 @@ export class ScheduleListComponent implements OnInit { constructor( readonly scheduleService: ScheduleService, + readonly entryService: ScheduleEntryService, ) { // nothing } @@ -63,4 +66,12 @@ export class ScheduleListComponent implements OnInit { } } + skip(entry: ScheduleEntry) { + let skip = entry.skip + 1; + if (skip > 7) { + skip = 0; + } + this.entryService.set(entry, 'skip', skip); + } + } diff --git a/src/main/angular/src/assets/skip.svg b/src/main/angular/src/assets/skip.svg new file mode 100644 index 0000000..a2243b7 --- /dev/null +++ b/src/main/angular/src/assets/skip.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/main/angular/src/environments/environment.ts b/src/main/angular/src/environments/environment.ts index 5e41d22..6bfac54 100644 --- a/src/main/angular/src/environments/environment.ts +++ b/src/main/angular/src/environments/environment.ts @@ -1,22 +1,9 @@ -// This file can be replaced during build by using the `fileReplacements` array. -// `ng build` replaces `environment.ts` with `environment.prod.ts`. -// The list of file replacements can be found in `angular.json`. - import {getBaseUrl} from "./UrlHelper"; -const PROD: boolean = true; +const PROD: boolean = false; export const environment = { production: false, restBase: PROD ? 'http://10.0.0.50:8082' : getBaseUrl('http', 8080), websocketBase: PROD ? 'ws://10.0.0.50:8082' : getBaseUrl('ws', 8080), }; - -/* - * For easier debugging in development mode, you can import the following file - * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. - * - * This import should be commented out in production mode because it will have a negative impact - * on performance if an error is thrown. - */ -// import 'zone.js/plugins/zone-error'; // Included with Angular CLI. diff --git a/src/main/java/de/ph87/homeautomation/DemoDataService.java b/src/main/java/de/ph87/homeautomation/DemoDataService.java index cc6e724..1f8c2e0 100644 --- a/src/main/java/de/ph87/homeautomation/DemoDataService.java +++ b/src/main/java/de/ph87/homeautomation/DemoDataService.java @@ -91,6 +91,7 @@ public class DemoDataService { scheduleEntryController.setProperty(id, property == null ? null : property.getId()); scheduleEntryController.setValue(id, value); scheduleEntryController.setBulk(id, bulk == null ? null : bulk.getId()); + scheduleEntryController.setSkip(id, 1); } } diff --git a/src/main/java/de/ph87/homeautomation/schedule/ScheduleExecutor.java b/src/main/java/de/ph87/homeautomation/schedule/ScheduleExecutor.java index 6fa442e..c27d9e7 100644 --- a/src/main/java/de/ph87/homeautomation/schedule/ScheduleExecutor.java +++ b/src/main/java/de/ph87/homeautomation/schedule/ScheduleExecutor.java @@ -32,20 +32,25 @@ public class ScheduleExecutor { private void executeLastDue(final Schedule schedule) { final ZonedDateTime now = ZonedDateTime.now(); schedule.getEntries().stream() - .filter(entry -> entry.getNextFuzzyTimestamp() != null && !entry.getNextFuzzyTimestamp().isAfter(now)) - .max(Comparator.comparing(ScheduleEntry::getNextFuzzyTimestamp)) - .ifPresent(entry -> executeEntry(schedule, entry)); + .filter(entry -> entry.getNextFuzzyTimestamp() != null && !entry.getNextFuzzyTimestamp().isAfter(now)) + .max(Comparator.comparing(ScheduleEntry::getNextFuzzyTimestamp)) + .ifPresent(entry -> executeEntry(schedule, entry)); } private void executeEntry(final Schedule schedule, final ScheduleEntry entry) { - log.info("Executing Schedule \"{}\" Entry {}", schedule.getTitle(), entry); - if (entry.getProperty() != null) { - log.debug("Schedule setting property: {} = {}", entry.getProperty().getTitle(), entry.getValue()); - propertyWriter.writeToChannel(entry.getProperty(), entry.getValue()); - } - if (entry.getBulk() != null) { - log.debug("Schedule executing Bulk: {}", entry.getBulk()); - bulkExecutor.execute(entry.getBulk()); + if (entry.getSkip() <= 0) { + log.info("Executing Schedule \"{}\" Entry {}", schedule.getTitle(), entry); + if (entry.getProperty() != null) { + log.debug("Schedule setting property: {} = {}", entry.getProperty().getTitle(), entry.getValue()); + propertyWriter.writeToChannel(entry.getProperty(), entry.getValue()); + } + if (entry.getBulk() != null) { + log.debug("Schedule executing Bulk: {}", entry.getBulk()); + bulkExecutor.execute(entry.getBulk()); + } + } else { + log.info("Skipping Schedule \"{}\" Entry {}", schedule.getTitle(), entry); + entry.setSkip(entry.getSkip() - 1); } entry.setLastClearTimestamp(entry.getNextClearTimestamp()); entry.setLastFuzzyTimestamp(entry.getNextFuzzyTimestamp()); diff --git a/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntry.java b/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntry.java index 93000cd..d6efc1d 100644 --- a/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntry.java +++ b/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntry.java @@ -63,6 +63,9 @@ public class ScheduleEntry { private int fuzzySeconds = 0; + @Column(nullable = false) + private int skip = 0; + @ManyToOne private Property property; diff --git a/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntryController.java b/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntryController.java index bc22900..9ac5160 100644 --- a/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntryController.java +++ b/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntryController.java @@ -95,6 +95,11 @@ public class ScheduleEntryController { return scheduleEntryWriter.setFuzzySeconds(id, value); } + @PostMapping("set/{id}/skip") + public ScheduleEntryDto setSkip(@PathVariable final long id, @RequestBody final int value) { + return scheduleEntryWriter.setSkip(id, value); + } + @PostMapping("set/{id}/property") public ScheduleEntryDto setProperty(@PathVariable final long id, @RequestBody(required = false) final Long propertyId) { return scheduleEntryWriter.setProperty(id, propertyId); diff --git a/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntryDto.java b/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntryDto.java index 08e4961..119c01d 100644 --- a/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntryDto.java +++ b/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntryDto.java @@ -42,6 +42,8 @@ public class ScheduleEntryDto implements Serializable { public final int fuzzySeconds; + public final int skip; + public final ZonedDateTime nextClearTimestamp; public final ZonedDateTime lastClearTimestamp; @@ -73,6 +75,7 @@ public class ScheduleEntryDto implements Serializable { this.minute = entry.getMinute(); this.second = entry.getSecond(); this.fuzzySeconds = entry.getFuzzySeconds(); + this.skip = entry.getSkip(); this.nextClearTimestamp = entry.getNextClearTimestamp(); this.lastClearTimestamp = entry.getLastClearTimestamp(); this.nextFuzzyTimestamp = entry.getNextFuzzyTimestamp(); diff --git a/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntryWriter.java b/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntryWriter.java index ff18b27..46e516b 100644 --- a/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntryWriter.java +++ b/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntryWriter.java @@ -130,6 +130,10 @@ public class ScheduleEntryWriter { return modifyValue(id, ScheduleEntry::setFuzzySeconds, value); } + public ScheduleEntryDto setSkip(final long id, final int value) { + return modifyValue(id, ScheduleEntry::setSkip, value); + } + public ScheduleEntryDto setValue(final long id, final double value) { return modifyValue(id, ScheduleEntry::setValue, value); }