diff --git a/application.properties b/application.properties index 500bfd0..7e90d91 100644 --- a/application.properties +++ b/application.properties @@ -5,7 +5,7 @@ spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa spring.datasource.password=password #- -spring.jpa.hibernate.ddl-auto=create +#spring.jpa.hibernate.ddl-auto=create #- de.ph87.data.message.receive.mqtt.host=10.0.0.50 de.ph87.data.message.receive.mqtt.topic=# diff --git a/src/main/angular/numberTable.less b/src/main/angular/numberTable.less index eb220c2..6857d2c 100644 --- a/src/main/angular/numberTable.less +++ b/src/main/angular/numberTable.less @@ -1,7 +1,6 @@ @import "./colors.less"; .numberTable { - margin-bottom: 2em; .arrowLeft { float: left; diff --git a/src/main/angular/src/app/app.component.ts b/src/main/angular/src/app/app.component.ts index 42e6800..a53869e 100644 --- a/src/main/angular/src/app/app.component.ts +++ b/src/main/angular/src/app/app.component.ts @@ -1,6 +1,6 @@ import {Component} from '@angular/core'; import {RouterLink, RouterLinkActive, RouterOutlet} from '@angular/router'; -import {menubar, ROUTING} from './app.routes'; +import {menubar} from './app.routes'; import {NgForOf} from '@angular/common'; @Component({ @@ -11,7 +11,5 @@ import {NgForOf} from '@angular/common'; }) export class AppComponent { - protected readonly ROUTING = ROUTING; - protected readonly menubar = menubar; } diff --git a/src/main/angular/src/app/app.routes.ts b/src/main/angular/src/app/app.routes.ts index 320e7e7..6d1a114 100644 --- a/src/main/angular/src/app/app.routes.ts +++ b/src/main/angular/src/app/app.routes.ts @@ -1,7 +1,7 @@ import {Routes} from '@angular/router'; -import {ElectroComponent} from './electro/electro.component'; -import {GreenhouseComponent} from './greenhouse/greenhouse/greenhouse.component'; -import {CisternComponent} from './cistern/cistern.component'; +import {LiveComponent} from './live/live.component'; +import {GreenhouseComponent} from './live/greenhouse/greenhouse/greenhouse.component'; +import {HistoryComponent} from './history/history.component'; export class Path { @@ -20,8 +20,8 @@ export class Path { } export const ROUTING = { - ENERGY: new Path('Energy', 'Energie', true), - CISTERN: new Path('Cistern', 'Zisterne', true), + LIVE: new Path('Live', 'Live', true), + HISTORY: new Path('History', 'Historie', true), GREENHOUSE: new Path('Greenhouse', 'Gewächshaus', false), } @@ -30,8 +30,8 @@ export function menubar(): Path[] { } export const routes: Routes = [ - {path: ROUTING.ENERGY.path, component: ElectroComponent}, - {path: ROUTING.CISTERN.path, component: CisternComponent}, + {path: ROUTING.LIVE.path, component: LiveComponent}, + {path: ROUTING.HISTORY.path, component: HistoryComponent}, {path: ROUTING.GREENHOUSE.path, component: GreenhouseComponent}, - {path: '**', redirectTo: ROUTING.ENERGY.path}, + {path: '**', redirectTo: ROUTING.LIVE.path}, ]; diff --git a/src/main/angular/src/app/cistern/cistern.component.html b/src/main/angular/src/app/cistern/cistern.component.html deleted file mode 100644 index a318168..0000000 --- a/src/main/angular/src/app/cistern/cistern.component.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - -
Füllgrad{{ seriesService.cisternHeight.series?.lastValue?.percent(93.5)?.localeString }}%
Füllhöhe{{ seriesService.cisternHeight.series?.lastValue?.localeString }}{{ seriesService.cisternHeight.series?.lastValue?.unit?.unit }}
Volumen{{ seriesService.cisternVolume.series?.lastValue?.localeString }}{{ seriesService.cisternVolume.series?.lastValue?.unit?.unit }}
- diff --git a/src/main/angular/src/app/electro/electro.component.ts b/src/main/angular/src/app/electro/electro.component.ts deleted file mode 100644 index 3824bfe..0000000 --- a/src/main/angular/src/app/electro/electro.component.ts +++ /dev/null @@ -1,18 +0,0 @@ -import {Component} from '@angular/core'; -import {ElectroEnergyComponent} from "./energy/electro-energy.component"; -import {ElectroPowerComponent} from "./power/electro-power.component"; -import {WeatherDiagramComponent} from '../weather/weather-diagram/weather-diagram.component'; - -@Component({ - selector: 'app-electro', - imports: [ - ElectroEnergyComponent, - ElectroPowerComponent, - WeatherDiagramComponent - ], - templateUrl: './electro.component.html', - styleUrl: './electro.component.less' -}) -export class ElectroComponent { - -} diff --git a/src/main/angular/src/app/electro/energy/electro-energy.component.html b/src/main/angular/src/app/electro/energy/electro-energy.component.html deleted file mode 100644 index 6cfa3fd..0000000 --- a/src/main/angular/src/app/electro/energy/electro-energy.component.html +++ /dev/null @@ -1,49 +0,0 @@ -
- -
- Energie -
- -
- - {{ offset > 0 ? -offset : '' }}{{ alignment === Alignment.FIVE && offset > 0 ? 'x' : '' }} {{ alignment.display }}{{ offset > 1 ? alignment.plural : '' }} - -
- -
- - {{ alignment.offsetTitle(offset, locale) }} - -
- -
-
-
Bedarf
-
 
-
{{ aggregations.energyConsumed?.formatted }}
-
-
-
Bezug
-
{{ aggregations.energyPurchasedPercent?.formatted }}
-
{{ aggregations.energyPurchased?.delta?.formatted }}
-
-
-
Produktion
-
{{ aggregations.energyProducedPercent?.formatted }}
-
{{ aggregations.energyProduced?.delta?.formatted }}
-
-
-
Eigenbedarf
-
{{ aggregations.energySelfPercent?.formatted }}
-
{{ aggregations.energySelf?.formatted }}
-
-
-
Einspeisung
-
{{ aggregations.energyDeliveredPercent?.formatted }}
-
{{ aggregations.energyDelivered?.delta?.formatted }}
-
-
- - - -
diff --git a/src/main/angular/src/app/electro/energy/electro-energy.component.less b/src/main/angular/src/app/electro/energy/electro-energy.component.less deleted file mode 100644 index bb8f9f0..0000000 --- a/src/main/angular/src/app/electro/energy/electro-energy.component.less +++ /dev/null @@ -1 +0,0 @@ -@import "../../../../colors.less"; diff --git a/src/main/angular/src/app/electro/power/electro-power.component.html b/src/main/angular/src/app/electro/power/electro-power.component.html deleted file mode 100644 index d3a0928..0000000 --- a/src/main/angular/src/app/electro/power/electro-power.component.html +++ /dev/null @@ -1,37 +0,0 @@ -
- -
- Leistung -
- -
-
-
Bedarf
-
 
-
{{ powerConsumption?.formatted }}
-
-
-
Bezug
-
{{ powerPurchasePercent?.formatted }}
-
{{ powerPurchase?.formatted }}
-
-
-
Produktion
-
{{ powerProducedPercent?.formatted }}
-
{{ powerProduction?.formatted }}
-
-
-
Eigenbedarf
-
{{ powerSelfPercent?.formatted }}
-
{{ powerSelf?.formatted }}
-
-
-
Einspeisung
-
{{ powerDeliveryPercent?.formatted }}
-
{{ powerDelivery?.formatted }}
-
-
- - - -
diff --git a/src/main/angular/src/app/history/history.component.html b/src/main/angular/src/app/history/history.component.html new file mode 100644 index 0000000..eb28787 --- /dev/null +++ b/src/main/angular/src/app/history/history.component.html @@ -0,0 +1,64 @@ + +
+
+
+ + {{ offset > 0 ? -offset : '' }}{{ alignment === Alignment.FIVE && offset > 0 ? 'x' : '' }} {{ alignment.display }}{{ offset > 1 ? alignment.plural : '' }} + +
+ +
+ + {{ alignment.offsetTitle(offset, locale) }} + +
+
+
+
+ + +
+ Energie +
+
+
+
+
+
Bedarf
+
 
+
{{ aggregations.energyConsumed?.formatted }}
+
+
+
Bezug
+
{{ aggregations.energyPurchasedPercent?.formatted }}
+
{{ aggregations.energyPurchased?.delta?.formatted }}
+
+
+
Produktion
+
{{ aggregations.energyProducedPercent?.formatted }}
+
{{ aggregations.energyProduced?.delta?.formatted }}
+
+
+
Eigenbedarf
+
{{ aggregations.energySelfPercent?.formatted }}
+
{{ aggregations.energySelf?.formatted }}
+
+
+
Einspeisung
+
{{ aggregations.energyDeliveredPercent?.formatted }}
+
{{ aggregations.energyDelivered?.delta?.formatted }}
+
+
+
+ +
+
+ + +
+ Zisterne +
+
+ +
+
diff --git a/src/main/angular/src/app/history/history.component.less b/src/main/angular/src/app/history/history.component.less new file mode 100644 index 0000000..62d9c35 --- /dev/null +++ b/src/main/angular/src/app/history/history.component.less @@ -0,0 +1 @@ +@import "../../../colors.less"; diff --git a/src/main/angular/src/app/electro/energy/electro-energy.component.ts b/src/main/angular/src/app/history/history.component.ts similarity index 71% rename from src/main/angular/src/app/electro/energy/electro-energy.component.ts rename to src/main/angular/src/app/history/history.component.ts index 17713ac..26f5767 100644 --- a/src/main/angular/src/app/electro/energy/electro-energy.component.ts +++ b/src/main/angular/src/app/history/history.component.ts @@ -1,19 +1,23 @@ import {Component, Inject, LOCALE_ID, OnDestroy, OnInit} from '@angular/core'; -import {PercentBarComponent} from '../../shared/percent-bar/percent-bar.component'; -import {AggregationWrapperDto} from '../../series/AggregationWrapperDto'; -import {Alignment} from '../../series/Alignment'; +import {PercentBarComponent} from '../shared/percent-bar/percent-bar.component'; +import {AggregationWrapperDto} from '../series/AggregationWrapperDto'; +import {Alignment} from '../series/Alignment'; import {Subscription} from 'rxjs'; -import {SeriesService} from '../../series/series.service'; +import {SeriesService} from '../series/series.service'; +import {NgIf} from "@angular/common"; +import {TileComponent} from '../shared/tile/tile.component'; @Component({ - selector: 'app-electro-energy', + selector: 'app-history', imports: [ - PercentBarComponent + PercentBarComponent, + NgIf, + TileComponent ], - templateUrl: './electro-energy.component.html', - styleUrl: './electro-energy.component.less' + templateUrl: './history.component.html', + styleUrl: './history.component.less' }) -export class ElectroEnergyComponent implements OnInit, OnDestroy { +export class HistoryComponent implements OnInit, OnDestroy { protected readonly Alignment = Alignment; diff --git a/src/main/angular/src/app/live/cistern/cistern.component.html b/src/main/angular/src/app/live/cistern/cistern.component.html new file mode 100644 index 0000000..a5e4b7f --- /dev/null +++ b/src/main/angular/src/app/live/cistern/cistern.component.html @@ -0,0 +1,31 @@ + + +
+ Zisterne +
+ +
+ + + + + + + + + + + + + + + + + +
Füllgrad{{ seriesService.cisternHeight.series?.lastValue?.percent(93.5)?.localeString }}%
Füllhöhe{{ seriesService.cisternHeight.series?.lastValue?.localeString }}{{ seriesService.cisternHeight.series?.lastValue?.unit?.unit }}
Volumen{{ seriesService.cisternVolume.series?.lastValue?.localeString }}{{ seriesService.cisternVolume.series?.lastValue?.unit?.unit }}
+ + + +
+ +
diff --git a/src/main/angular/src/app/cistern/cistern.component.less b/src/main/angular/src/app/live/cistern/cistern.component.less similarity index 100% rename from src/main/angular/src/app/cistern/cistern.component.less rename to src/main/angular/src/app/live/cistern/cistern.component.less diff --git a/src/main/angular/src/app/cistern/cistern.component.ts b/src/main/angular/src/app/live/cistern/cistern.component.ts similarity index 64% rename from src/main/angular/src/app/cistern/cistern.component.ts rename to src/main/angular/src/app/live/cistern/cistern.component.ts index d80c51d..f2deac4 100644 --- a/src/main/angular/src/app/cistern/cistern.component.ts +++ b/src/main/angular/src/app/live/cistern/cistern.component.ts @@ -1,14 +1,16 @@ import {Component, OnDestroy, OnInit} from '@angular/core'; -import {SeriesService} from '../series/series.service'; +import {SeriesService} from '../../series/series.service'; import {Subscription} from 'rxjs'; import {NgIf} from '@angular/common'; -import {Series} from '../series/Series'; -import {ApiService} from '../core/api.service'; +import {Series} from '../../series/Series'; +import {TileComponent} from '../../shared/tile/tile.component'; +import {Alignment} from '../../series/Alignment'; @Component({ selector: 'app-cistern', imports: [ - NgIf + NgIf, + TileComponent ], templateUrl: './cistern.component.html', styleUrl: './cistern.component.less' @@ -31,7 +33,7 @@ export class CisternComponent implements OnInit, OnDestroy { } graph(series: Series) { - return ApiService.url('http', ['Series', 'Graph', series.id, '400', '100', 'FIVE', '0', '288']); + return this.seriesService.graph(series, 600, 200, Alignment.FIVE, 0, Alignment.FIVE, 24 * 12); } } diff --git a/src/main/angular/src/app/greenhouse/greenhouse/greenhouse.component.html b/src/main/angular/src/app/live/greenhouse/greenhouse/greenhouse.component.html similarity index 100% rename from src/main/angular/src/app/greenhouse/greenhouse/greenhouse.component.html rename to src/main/angular/src/app/live/greenhouse/greenhouse/greenhouse.component.html diff --git a/src/main/angular/src/app/greenhouse/greenhouse/greenhouse.component.less b/src/main/angular/src/app/live/greenhouse/greenhouse/greenhouse.component.less similarity index 100% rename from src/main/angular/src/app/greenhouse/greenhouse/greenhouse.component.less rename to src/main/angular/src/app/live/greenhouse/greenhouse/greenhouse.component.less diff --git a/src/main/angular/src/app/greenhouse/greenhouse/greenhouse.component.ts b/src/main/angular/src/app/live/greenhouse/greenhouse/greenhouse.component.ts similarity index 90% rename from src/main/angular/src/app/greenhouse/greenhouse/greenhouse.component.ts rename to src/main/angular/src/app/live/greenhouse/greenhouse/greenhouse.component.ts index 4d534fc..b5698b0 100644 --- a/src/main/angular/src/app/greenhouse/greenhouse/greenhouse.component.ts +++ b/src/main/angular/src/app/live/greenhouse/greenhouse/greenhouse.component.ts @@ -1,5 +1,5 @@ import {Component, OnDestroy, OnInit} from '@angular/core'; -import {SeriesService} from '../../series/series.service'; +import {SeriesService} from '../../../series/series.service'; import {Subscription} from 'rxjs'; @Component({ diff --git a/src/main/angular/src/app/electro/electro.component.html b/src/main/angular/src/app/live/live.component.html similarity index 67% rename from src/main/angular/src/app/electro/electro.component.html rename to src/main/angular/src/app/live/live.component.html index 40e62f1..144fb3c 100644 --- a/src/main/angular/src/app/electro/electro.component.html +++ b/src/main/angular/src/app/live/live.component.html @@ -2,4 +2,4 @@ - + diff --git a/src/main/angular/src/app/electro/electro.component.less b/src/main/angular/src/app/live/live.component.less similarity index 100% rename from src/main/angular/src/app/electro/electro.component.less rename to src/main/angular/src/app/live/live.component.less diff --git a/src/main/angular/src/app/live/live.component.ts b/src/main/angular/src/app/live/live.component.ts new file mode 100644 index 0000000..5833b2c --- /dev/null +++ b/src/main/angular/src/app/live/live.component.ts @@ -0,0 +1,18 @@ +import {Component} from '@angular/core'; +import {ElectroPowerComponent} from "./power/electro-power.component"; +import {WeatherDiagramComponent} from './weather/weather-diagram/weather-diagram.component'; +import {CisternComponent} from './cistern/cistern.component'; + +@Component({ + selector: 'app-live', + imports: [ + ElectroPowerComponent, + WeatherDiagramComponent, + CisternComponent + ], + templateUrl: './live.component.html', + styleUrl: './live.component.less' +}) +export class LiveComponent { + +} diff --git a/src/main/angular/src/app/live/power/electro-power.component.html b/src/main/angular/src/app/live/power/electro-power.component.html new file mode 100644 index 0000000..c6a8e95 --- /dev/null +++ b/src/main/angular/src/app/live/power/electro-power.component.html @@ -0,0 +1,41 @@ + + +
+ Leistung +
+ +
+
+
+
+
Bedarf
+
 
+
{{ powerConsumption?.formatted }}
+
+
+
Bezug
+
{{ powerPurchasePercent?.formatted }}
+
{{ powerPurchase?.formatted }}
+
+
+
Produktion
+
{{ powerProducedPercent?.formatted }}
+
{{ powerProduction?.formatted }}
+
+
+
Eigenbedarf
+
{{ powerSelfPercent?.formatted }}
+
{{ powerSelf?.formatted }}
+
+
+
Einspeisung
+
{{ powerDeliveryPercent?.formatted }}
+
{{ powerDelivery?.formatted }}
+
+
+
+
+ + + +
diff --git a/src/main/angular/src/app/electro/power/electro-power.component.less b/src/main/angular/src/app/live/power/electro-power.component.less similarity index 100% rename from src/main/angular/src/app/electro/power/electro-power.component.less rename to src/main/angular/src/app/live/power/electro-power.component.less diff --git a/src/main/angular/src/app/electro/power/electro-power.component.ts b/src/main/angular/src/app/live/power/electro-power.component.ts similarity index 92% rename from src/main/angular/src/app/electro/power/electro-power.component.ts rename to src/main/angular/src/app/live/power/electro-power.component.ts index 4849690..cf9141b 100644 --- a/src/main/angular/src/app/electro/power/electro-power.component.ts +++ b/src/main/angular/src/app/live/power/electro-power.component.ts @@ -1,13 +1,15 @@ import {Component, OnDestroy, OnInit} from '@angular/core'; import {PercentBarComponent} from "../../shared/percent-bar/percent-bar.component"; -import {Value} from '../../value/Value'; +import {Value} from '../../series/value/Value'; import {SeriesService} from '../../series/series.service'; import {Subscription} from 'rxjs'; +import {TileComponent} from '../../shared/tile/tile.component'; @Component({ selector: 'app-electro-power', imports: [ - PercentBarComponent + PercentBarComponent, + TileComponent ], templateUrl: './electro-power.component.html', styleUrl: './electro-power.component.less' diff --git a/src/main/angular/src/app/weather/weather-diagram/WeatherDay.ts b/src/main/angular/src/app/live/weather/weather-diagram/WeatherDay.ts similarity index 83% rename from src/main/angular/src/app/weather/weather-diagram/WeatherDay.ts rename to src/main/angular/src/app/live/weather/weather-diagram/WeatherDay.ts index 1f61e23..d196678 100644 --- a/src/main/angular/src/app/weather/weather-diagram/WeatherDay.ts +++ b/src/main/angular/src/app/live/weather/weather-diagram/WeatherDay.ts @@ -1,5 +1,5 @@ -import {Value} from "../../value/Value"; -import {validateDate, validateList} from "../../core/validators"; +import {Value} from "../../../series/value/Value"; +import {validateDate, validateList} from "../../../core/validators"; import {WeatherHour} from "./WeatherHour"; export class WeatherDay { diff --git a/src/main/angular/src/app/weather/weather-diagram/WeatherHour.ts b/src/main/angular/src/app/live/weather/weather-diagram/WeatherHour.ts similarity index 84% rename from src/main/angular/src/app/weather/weather-diagram/WeatherHour.ts rename to src/main/angular/src/app/live/weather/weather-diagram/WeatherHour.ts index 488f897..5fde39a 100644 --- a/src/main/angular/src/app/weather/weather-diagram/WeatherHour.ts +++ b/src/main/angular/src/app/live/weather/weather-diagram/WeatherHour.ts @@ -1,5 +1,5 @@ -import {Value} from '../../value/Value'; -import {validateDate} from '../../core/validators'; +import {Value} from '../../../series/value/Value'; +import {validateDate} from '../../../core/validators'; export class WeatherHour { diff --git a/src/main/angular/src/app/live/weather/weather-diagram/weather-diagram.component.html b/src/main/angular/src/app/live/weather/weather-diagram/weather-diagram.component.html new file mode 100644 index 0000000..30ec962 --- /dev/null +++ b/src/main/angular/src/app/live/weather/weather-diagram/weather-diagram.component.html @@ -0,0 +1,26 @@ + + +
+
+
+
+ {{ dateFormat(hour.date | date:'E') }} +
+
+
+
+
+
+
+
+ ≥30°C + ≥20°C + ≥10°C + >0°C + ≤0°C +   + Niederschlag 100% = {{ PRECIPITATION_MAX_MM }}mm +
+
+ +
diff --git a/src/main/angular/src/app/weather/weather-diagram/weather-diagram.component.less b/src/main/angular/src/app/live/weather/weather-diagram/weather-diagram.component.less similarity index 100% rename from src/main/angular/src/app/weather/weather-diagram/weather-diagram.component.less rename to src/main/angular/src/app/live/weather/weather-diagram/weather-diagram.component.less diff --git a/src/main/angular/src/app/weather/weather-diagram/weather-diagram.component.ts b/src/main/angular/src/app/live/weather/weather-diagram/weather-diagram.component.ts similarity index 96% rename from src/main/angular/src/app/weather/weather-diagram/weather-diagram.component.ts rename to src/main/angular/src/app/live/weather/weather-diagram/weather-diagram.component.ts index e0dc786..56fc256 100644 --- a/src/main/angular/src/app/weather/weather-diagram/weather-diagram.component.ts +++ b/src/main/angular/src/app/live/weather/weather-diagram/weather-diagram.component.ts @@ -3,6 +3,7 @@ import {DatePipe, NgClass, NgForOf, NgIf} from '@angular/common'; import {WeatherHour} from './WeatherHour'; import {WeatherService} from './weather.service'; import {WeatherDay} from './WeatherDay'; +import {TileComponent} from '../../../shared/tile/tile.component'; const PAST_HOURS_COUNT = 0; @@ -14,7 +15,8 @@ const DAY_COUNT = 7; NgForOf, NgIf, DatePipe, - NgClass + NgClass, + TileComponent ], templateUrl: './weather-diagram.component.html', styleUrl: './weather-diagram.component.less' diff --git a/src/main/angular/src/app/weather/weather-diagram/weather.service.ts b/src/main/angular/src/app/live/weather/weather-diagram/weather.service.ts similarity index 81% rename from src/main/angular/src/app/weather/weather-diagram/weather.service.ts rename to src/main/angular/src/app/live/weather/weather-diagram/weather.service.ts index 1fca8b7..c8a0833 100644 --- a/src/main/angular/src/app/weather/weather-diagram/weather.service.ts +++ b/src/main/angular/src/app/live/weather/weather-diagram/weather.service.ts @@ -1,6 +1,6 @@ import {Inject, Injectable, LOCALE_ID} from '@angular/core'; -import {ApiService} from '../../core/api.service'; -import {Next} from '../../core/types'; +import {ApiService} from '../../../core/api.service'; +import {Next} from '../../../core/types'; import {WeatherDay} from './WeatherDay'; @Injectable({ diff --git a/src/main/angular/src/app/series/AggregationWrapperDto.ts b/src/main/angular/src/app/series/AggregationWrapperDto.ts index d51b119..acf5ab3 100644 --- a/src/main/angular/src/app/series/AggregationWrapperDto.ts +++ b/src/main/angular/src/app/series/AggregationWrapperDto.ts @@ -4,7 +4,7 @@ import {MeterAggregate} from './meter/MeterAggregate'; import {Aggregate} from './Aggregate'; import {VaryingAggregate} from './varying/VaryingAggregate'; -import {Value} from '../value/Value'; +import {Value} from './value/Value'; export class AggregationWrapperDto { diff --git a/src/main/angular/src/app/series/Alignment.ts b/src/main/angular/src/app/series/Alignment.ts index a9a330d..ae4e4ef 100644 --- a/src/main/angular/src/app/series/Alignment.ts +++ b/src/main/angular/src/app/series/Alignment.ts @@ -4,23 +4,25 @@ export class Alignment { private static readonly values: Alignment[] = []; - static readonly FIVE = new Alignment('FIVE', '5 Minuten', '', Alignment.offsetTitleFive); + static readonly FIVE = new Alignment('FIVE', '5 Minuten', '', Alignment.offsetTitleFive, null, 0); - static readonly HOUR = new Alignment('HOUR', 'Stunde', 'n', Alignment.offsetTitleHour); + static readonly HOUR = new Alignment('HOUR', 'Stunde', 'n', Alignment.offsetTitleHour, Alignment.FIVE, 12); - static readonly DAY = new Alignment('DAY', 'Tag', 'e', Alignment.offsetTitleDay); + static readonly DAY = new Alignment('DAY', 'Tag', 'e', Alignment.offsetTitleDay, Alignment.FIVE, 24 * 12); - static readonly WEEK = new Alignment('WEEK', 'Woche', 'n', Alignment.offsetTitleWeek); + static readonly WEEK = new Alignment('WEEK', 'Woche', 'n', Alignment.offsetTitleWeek, Alignment.HOUR, 7 * 24); - static readonly MONTH = new Alignment('MONTH', 'Monat', 'e', Alignment.offsetTitleMonth); + static readonly MONTH = new Alignment('MONTH', 'Monat', 'e', Alignment.offsetTitleMonth, Alignment.HOUR, 30 * 24); - static readonly YEAR = new Alignment('YEAR', 'Jahr', 'e', Alignment.offsetTitleYear); + static readonly YEAR = new Alignment('YEAR', 'Jahr', 'e', Alignment.offsetTitleYear, Alignment.DAY, 365); constructor( readonly name: string, readonly display: string, readonly plural: string, - readonly offsetTitle: (offset: number, locale: string) => string + readonly offsetTitle: (offset: number, locale: string) => string, + readonly inner: Alignment | null, + readonly innerCount: number, ) { Alignment.values.push(this); } @@ -139,4 +141,8 @@ export class Alignment { return `${formatDate(date, "yyyy", locale)}`; } + toString(): string { + return this.name; + } + } diff --git a/src/main/angular/src/app/series/Series.ts b/src/main/angular/src/app/series/Series.ts index 0ca700e..e8ecc2d 100644 --- a/src/main/angular/src/app/series/Series.ts +++ b/src/main/angular/src/app/series/Series.ts @@ -1,6 +1,6 @@ -import {Unit} from '../value/Unit'; +import {Unit} from './value/Unit'; import {validateNumber, validateString} from '../core/validators'; -import {Value} from '../value/Value'; +import {Value} from './value/Value'; export class Series { diff --git a/src/main/angular/src/app/series/meter/MeterAggregate.ts b/src/main/angular/src/app/series/meter/MeterAggregate.ts index 1c3d096..e0cb36c 100644 --- a/src/main/angular/src/app/series/meter/MeterAggregate.ts +++ b/src/main/angular/src/app/series/meter/MeterAggregate.ts @@ -1,6 +1,6 @@ import {Series} from '../Series'; import {Aggregate} from '../Aggregate'; -import {Value} from '../../value/Value'; +import {Value} from '../value/Value'; export class MeterAggregate extends Aggregate { diff --git a/src/main/angular/src/app/series/series.service.ts b/src/main/angular/src/app/series/series.service.ts index 5d02e55..290f92c 100644 --- a/src/main/angular/src/app/series/series.service.ts +++ b/src/main/angular/src/app/series/series.service.ts @@ -58,4 +58,11 @@ export class SeriesService extends AbstractRepositoryService { this.api.getSingle(['Series', 'agg', 'all', alignment.name, 'offset', offset], j => AggregationWrapperDto.fromJson(j, this.locale), next); } + graph(series: Series, width: number, height: number, alignment: Alignment, offset: number, innerAlignment: Alignment | null, count: number): any { + if (innerAlignment === null) { + return null; + } + return ApiService.url('http', ['Series', 'Graph', series.id, width, height, alignment, offset, count, innerAlignment]); + } + } diff --git a/src/main/angular/src/app/value/Unit.ts b/src/main/angular/src/app/series/value/Unit.ts similarity index 96% rename from src/main/angular/src/app/value/Unit.ts rename to src/main/angular/src/app/series/value/Unit.ts index c64b016..b5b58f0 100644 --- a/src/main/angular/src/app/value/Unit.ts +++ b/src/main/angular/src/app/series/value/Unit.ts @@ -1,4 +1,4 @@ -import {validateString} from '../core/validators'; +import {validateString} from '../../core/validators'; export class Unit { diff --git a/src/main/angular/src/app/value/Value.ts b/src/main/angular/src/app/series/value/Value.ts similarity index 97% rename from src/main/angular/src/app/value/Value.ts rename to src/main/angular/src/app/series/value/Value.ts index 7b54892..3d154c3 100644 --- a/src/main/angular/src/app/value/Value.ts +++ b/src/main/angular/src/app/series/value/Value.ts @@ -1,5 +1,5 @@ import {Unit} from "./Unit"; -import {validateNumber} from "../core/validators"; +import {validateNumber} from "../../core/validators"; export class Value { @@ -13,7 +13,8 @@ export class Value { readonly value: number, readonly unit: Unit, readonly decimals: number, - readonly locale: string) { + readonly locale: string, + ) { this.localeString = this.value.toLocaleString(this.locale, {maximumFractionDigits: this.decimals, minimumFractionDigits: this.decimals}); this.valueInteger = this.localeString.split(/[,.]/)[0]; this.valueFraction = this.localeString.split(/[,.]/)[1]; diff --git a/src/main/angular/src/app/shared/percent-bar/percent-bar.component.ts b/src/main/angular/src/app/shared/percent-bar/percent-bar.component.ts index 63a11cb..05b24e1 100644 --- a/src/main/angular/src/app/shared/percent-bar/percent-bar.component.ts +++ b/src/main/angular/src/app/shared/percent-bar/percent-bar.component.ts @@ -1,5 +1,5 @@ import {Component, Input} from '@angular/core'; -import {Value} from '../../value/Value'; +import {Value} from '../../series/value/Value'; import {NgIf} from '@angular/common'; @Component({ diff --git a/src/main/angular/src/app/shared/tile/tile.component.html b/src/main/angular/src/app/shared/tile/tile.component.html new file mode 100644 index 0000000..718278c --- /dev/null +++ b/src/main/angular/src/app/shared/tile/tile.component.html @@ -0,0 +1,10 @@ +
+
+
+ +
+
+ +
+
+
diff --git a/src/main/angular/src/app/shared/tile/tile.component.less b/src/main/angular/src/app/shared/tile/tile.component.less new file mode 100644 index 0000000..01235fc --- /dev/null +++ b/src/main/angular/src/app/shared/tile/tile.component.less @@ -0,0 +1,16 @@ +.tile { + float: left; + margin-bottom: 1em; +} + +.tilePadding { + padding: 0.5em; +} + +.tileHead { + font-size: 70%; + font-style: italic; + text-align: center; + text-decoration: underline; + margin-bottom: 0.1em; +} diff --git a/src/main/angular/src/app/shared/tile/tile.component.ts b/src/main/angular/src/app/shared/tile/tile.component.ts new file mode 100644 index 0000000..e7d8672 --- /dev/null +++ b/src/main/angular/src/app/shared/tile/tile.component.ts @@ -0,0 +1,14 @@ +import {Component, Input} from '@angular/core'; + +@Component({ + selector: 'app-tile', + imports: [], + templateUrl: './tile.component.html', + styleUrl: './tile.component.less' +}) +export class TileComponent { + + @Input() + padding: boolean = true; + +} diff --git a/src/main/angular/src/app/weather/weather-diagram/weather-diagram.component.html b/src/main/angular/src/app/weather/weather-diagram/weather-diagram.component.html deleted file mode 100644 index 832ab27..0000000 --- a/src/main/angular/src/app/weather/weather-diagram/weather-diagram.component.html +++ /dev/null @@ -1,25 +0,0 @@ -
-
- Wetter -
-
-
-
- {{ dateFormat(hour.date | date:'E') }} -
-
-
-
-
-
-
-
- ≥30°C - ≥20°C - ≥10°C - >0°C - ≤0°C -   - Niederschlag 100% = {{ PRECIPITATION_MAX_MM }}mm -
-
diff --git a/src/main/angular/src/index.html b/src/main/angular/src/index.html index 60c9eac..f7edde5 100644 --- a/src/main/angular/src/index.html +++ b/src/main/angular/src/index.html @@ -4,7 +4,7 @@ Data - + diff --git a/src/main/angular/src/styles.less b/src/main/angular/src/styles.less index 74633b3..8c0fc8c 100644 --- a/src/main/angular/src/styles.less +++ b/src/main/angular/src/styles.less @@ -56,3 +56,22 @@ table.vertical { } } + +@tile-width: 400px; +@font-base: 6vw; + +.generate-tiles(@i, @max) when (@i =< @max) { + @media (min-width: @tile-width * @i) { + body { + font-size: calc(@font-base / @i); + } + + .tile { + width: calc(100% / @i); + } + } + + .generate-tiles(@i + 1, @max); +} + +.generate-tiles(1, 10); diff --git a/src/main/java/de/ph87/data/series/Series.java b/src/main/java/de/ph87/data/series/Series.java index 275022e..b364344 100644 --- a/src/main/java/de/ph87/data/series/Series.java +++ b/src/main/java/de/ph87/data/series/Series.java @@ -1,10 +1,11 @@ package de.ph87.data.series; -import de.ph87.data.value.*; +import de.ph87.data.value.Unit; +import jakarta.annotation.Nullable; import jakarta.persistence.*; import lombok.*; -import java.time.*; +import java.time.ZonedDateTime; @Entity @Getter @@ -39,8 +40,13 @@ public class Series { @Enumerated(EnumType.STRING) private SeriesType type; - @Column(nullable = false) - private boolean graphZero = false; + @Column + @Nullable + public final Double yMin = null; + + @Column + @Nullable + public final Double yMax = null; @Column(nullable = false) private boolean autoscale = false; diff --git a/src/main/java/de/ph87/data/series/SeriesDto.java b/src/main/java/de/ph87/data/series/SeriesDto.java index 1fcbe5e..6235d55 100644 --- a/src/main/java/de/ph87/data/series/SeriesDto.java +++ b/src/main/java/de/ph87/data/series/SeriesDto.java @@ -1,11 +1,14 @@ package de.ph87.data.series; -import de.ph87.data.value.*; -import de.ph87.data.web.*; -import lombok.*; +import de.ph87.data.value.Unit; +import de.ph87.data.web.IWebSocketMessage; +import jakarta.annotation.Nullable; +import lombok.Getter; +import lombok.NonNull; +import lombok.ToString; -import java.time.*; -import java.util.*; +import java.time.ZonedDateTime; +import java.util.List; @Getter @ToString @@ -25,7 +28,11 @@ public class SeriesDto implements IWebSocketMessage { public final SeriesType type; - public final boolean graphZero; + @Nullable + public final Double yMin; + + @Nullable + public final Double yMax; public final boolean autoscale; @@ -49,7 +56,8 @@ public class SeriesDto implements IWebSocketMessage { this.unit = series.getUnit(); this.decimals = series.getDecimals(); this.type = series.getType(); - this.graphZero = series.isGraphZero(); + this.yMin = series.getYMin(); + this.yMax = series.getYMax(); this.autoscale = series.isAutoscale(); this.min = series.getMin(); this.max = series.getMax(); diff --git a/src/main/java/de/ph87/data/series/graph/Graph.java b/src/main/java/de/ph87/data/series/graph/Graph.java index d7a09d2..5e9b32e 100644 --- a/src/main/java/de/ph87/data/series/graph/Graph.java +++ b/src/main/java/de/ph87/data/series/graph/Graph.java @@ -74,8 +74,8 @@ public class Graph { // find bounds double vSum = 0; - double vMin = series.isGraphZero() ? 0.0 : Double.MAX_VALUE; - double vMax = series.isGraphZero() ? 0.0 : Double.MIN_VALUE; + double vMin = series.getYMin() == null || Double.isNaN(series.getYMin()) ? Double.MIN_VALUE : series.getYMin(); + double vMax = series.getYMax() == null || Double.isNaN(series.getYMax()) ? Double.MAX_VALUE : series.getYMax(); for (final GraphPoint point : points) { vMin = Math.min(vMin, point.getValue()); vMax = max(vMax, point.getValue()); @@ -89,7 +89,7 @@ public class Graph { vSum *= autoscale.factor; // find max label width - int __maxLabelWidth = 80; + int __maxLabelWidth = 0; final FontMetrics fontMetrics = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB).getGraphics().getFontMetrics(); for (final GraphPoint point : points) { __maxLabelWidth = max(__maxLabelWidth, fontMetrics.stringWidth(autoscale.format(point.getValue() * autoscale.factor))); @@ -117,33 +117,27 @@ public class Graph { public BufferedImage draw() { final BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); final Graphics2D g = (Graphics2D) image.getGraphics(); - final int fontH3_4 = (int) Math.round(g.getFontMetrics().getHeight() * 0.75); -// g.setColor(Color.gray); -// final String string = "%s [%s]".formatted(series.getTitle(), autoscale.unit); -// g.drawString(string, border, border + fontH3_4); - - yLabel(g, valueMax, DASHED, Color.red.darker().darker()); -// yLabel(g, valueAvg, DASHED, new Color(0, 127, 0)); - yLabel(g, 0, NORMAL, Color.BLACK); - yLabel(g, valueMin, DASHED, new Color(64, 128, 255).darker().darker()); + yLabel(g, valueMax, Color.red); + yLabel(g, valueAvg, new Color(0, 255, 0)); + yLabel(g, valueMin, new Color(64, 128, 255)); g.translate(border, height - border); g.scale(1, -1); + // y-axis g.setStroke(NORMAL); - g.setColor(Color.BLACK); - g.drawLine(widthInner, 0, widthInner, heightInner); // y-axis + g.setColor(Color.GRAY); + g.drawLine(widthInner, 0, widthInner, heightInner); + g.setColor(Color.WHITE); if (series.type == SeriesType.METER) { - g.setColor(Color.PINK); final int space = (int) (minuteScale * begin.alignment.maxDuration.toMinutes()); final int width = (int) (space * 0.95); for (final Point point : points) { g.fillRect(point.x + (space - width), 0, width, point.y); } } else { - g.setColor(Color.RED); Point last = null; for (final Point current : points) { if (last != null) { @@ -155,14 +149,14 @@ public class Graph { return image; } - private void yLabel(@NonNull final Graphics2D g, final double value, @Nullable final Stroke stroke, @Nullable final Color color) { + private void yLabel(@NonNull final Graphics2D g, final double value, @Nullable final Color color) { final String string = autoscale.format(value); final int offset = maxLabelWidth - g.getFontMetrics().stringWidth(string); final int y = height - ((int) Math.round((value - valueMin) * valueScale) + border); g.setColor(color); g.drawString(string, widthInner + 2 * border + offset, y + (int) Math.round(g.getFontMetrics().getHeight() * 0.25)); - if (stroke != null && color != null) { - g.setStroke(stroke); + if (color != null) { + g.setStroke(Graph.DASHED); g.draw(new Line2D.Double(border, y, width - maxLabelWidth - border * 1.5, y)); } } diff --git a/src/main/java/de/ph87/data/series/graph/GraphController.java b/src/main/java/de/ph87/data/series/graph/GraphController.java index 06fa930..555d0e3 100644 --- a/src/main/java/de/ph87/data/series/graph/GraphController.java +++ b/src/main/java/de/ph87/data/series/graph/GraphController.java @@ -1,15 +1,19 @@ package de.ph87.data.series.graph; -import de.ph87.data.series.*; -import jakarta.servlet.http.*; -import lombok.*; -import lombok.extern.slf4j.*; -import org.springframework.web.bind.annotation.*; +import de.ph87.data.series.Aligned; +import de.ph87.data.series.Alignment; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; -import javax.imageio.*; -import java.awt.image.*; -import java.io.*; -import java.time.*; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.time.ZonedDateTime; @Slf4j @RestController @@ -19,12 +23,13 @@ public class GraphController { private final GraphService graphService; - @GetMapping(path = "{seriesId}/{width}/{height}/{alignmentName}/{offset}/{duration}", produces = "image/png") - public void graph(@PathVariable final long seriesId, final HttpServletResponse response, @PathVariable final int width, @PathVariable final int height, @PathVariable final String alignmentName, @PathVariable final long offset, @PathVariable final long duration) throws IOException { - final Alignment alignment = Alignment.valueOf(alignmentName); - final Aligned end = alignment.align(ZonedDateTime.now()).minus(offset); - final Aligned begin = end.minus(duration - 1); - final Graph graph = graphService.getGraph(seriesId, begin, end, width, height, 10); + @GetMapping(path = "{seriesId}/{width}/{height}/{outerAlignmentName}/{offset}/{duration}/{innerAlignmentName}", produces = "image/png") + public void graph(@PathVariable final long seriesId, final HttpServletResponse response, @PathVariable final int width, @PathVariable final int height, @PathVariable final String outerAlignmentName, @PathVariable final long offset, @PathVariable final long duration, @PathVariable final String innerAlignmentName) throws IOException { + final Alignment outerAlignment = Alignment.valueOf(outerAlignmentName); + final Alignment innerAlignment = Alignment.valueOf(innerAlignmentName); + final Aligned end = outerAlignment.align(ZonedDateTime.now()).plus(1).minus(offset); + final Aligned begin = end.minus(duration); + final Graph graph = graphService.getGraph(seriesId, innerAlignment, begin, end, width, height, 10); final BufferedImage image = graph.draw(); response.setContentType("image/png"); ImageIO.write(image, "PNG", response.getOutputStream()); diff --git a/src/main/java/de/ph87/data/series/graph/GraphService.java b/src/main/java/de/ph87/data/series/graph/GraphService.java index fe1b727..948969b 100644 --- a/src/main/java/de/ph87/data/series/graph/GraphService.java +++ b/src/main/java/de/ph87/data/series/graph/GraphService.java @@ -1,13 +1,17 @@ package de.ph87.data.series.graph; -import de.ph87.data.series.*; -import de.ph87.data.series.meter.*; -import de.ph87.data.series.varying.*; -import lombok.*; -import lombok.extern.slf4j.*; -import org.springframework.stereotype.*; +import de.ph87.data.series.Aligned; +import de.ph87.data.series.Alignment; +import de.ph87.data.series.SeriesDto; +import de.ph87.data.series.SeriesService; +import de.ph87.data.series.meter.MeterService; +import de.ph87.data.series.varying.VaryingService; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; -import java.util.*; +import java.util.List; @Slf4j @Service @@ -21,11 +25,11 @@ public class GraphService { private final MeterService meterService; @NonNull - public Graph getGraph(final long seriesId, @NonNull final Aligned begin, @NonNull final Aligned end, final int width, final int height, final int border) { + public Graph getGraph(final long seriesId, @NonNull final Alignment innerAlignment, @NonNull final Aligned begin, @NonNull final Aligned end, final int width, final int height, final int border) { final SeriesDto series = seriesService.getDtoById(seriesId); final List entries = switch (series.getType()) { - case METER -> meterService.getPoints(series, begin, end); - case VARYING -> varyingService.getPoints(series, begin, end); + case METER -> meterService.getPoints(series, innerAlignment, begin, end); + case VARYING -> varyingService.getPoints(series, innerAlignment, begin, end); }; return new Graph(series, entries, begin, end, width, height, border); } diff --git a/src/main/java/de/ph87/data/series/meter/MeterService.java b/src/main/java/de/ph87/data/series/meter/MeterService.java index 3f2b7c1..06081b9 100644 --- a/src/main/java/de/ph87/data/series/meter/MeterService.java +++ b/src/main/java/de/ph87/data/series/meter/MeterService.java @@ -80,8 +80,8 @@ public class MeterService { } @NonNull - public List getPoints(@NonNull final SeriesDto series, @NonNull final Aligned begin, @NonNull final Aligned end) { - final List graphPoints = findRepository(begin.alignment).findAllByIdMeterSeriesIdAndIdDateGreaterThanEqualAndIdDateLessThanEqualOrderByIdDate(series.id, begin.date, end.date); + public List getPoints(@NonNull final SeriesDto series, @NonNull final Alignment innerAlignment, @NonNull final Aligned begin, @NonNull final Aligned end) { + final List graphPoints = findRepository(innerAlignment).findAllByIdMeterSeriesIdAndIdDateGreaterThanEqualAndIdDateLessThanEqualOrderByIdDate(series.id, begin.date, end.date); final List points = graphPoints.stream().map(meterValue -> new GraphPoint(meterValue.getId().getDate(), meterValue.getMax() - meterValue.getMin())).collect(Collectors.toCollection(LinkedList::new)); for (int i = 0; i < points.size() - 1; i++) { if (points.get(i).date.compareTo(points.get(i + 1).date) == 0) { diff --git a/src/main/java/de/ph87/data/series/varying/VaryingService.java b/src/main/java/de/ph87/data/series/varying/VaryingService.java index 4573776..41f149c 100644 --- a/src/main/java/de/ph87/data/series/varying/VaryingService.java +++ b/src/main/java/de/ph87/data/series/varying/VaryingService.java @@ -1,20 +1,27 @@ package de.ph87.data.series.varying; import de.ph87.data.series.*; -import de.ph87.data.series.graph.*; -import de.ph87.data.series.varying.day.*; -import de.ph87.data.series.varying.five.*; -import de.ph87.data.series.varying.hour.*; -import de.ph87.data.series.varying.month.*; -import de.ph87.data.series.varying.week.*; -import de.ph87.data.series.varying.year.*; -import lombok.*; -import lombok.extern.slf4j.*; +import de.ph87.data.series.graph.GraphPoint; +import de.ph87.data.series.varying.day.VaryingDay; +import de.ph87.data.series.varying.day.VaryingDayRepository; +import de.ph87.data.series.varying.five.VaryingFive; +import de.ph87.data.series.varying.five.VaryingFiveRepository; +import de.ph87.data.series.varying.hour.VaryingHour; +import de.ph87.data.series.varying.hour.VaryingHourRepository; +import de.ph87.data.series.varying.month.VaryingMonth; +import de.ph87.data.series.varying.month.VaryingMonthRepository; +import de.ph87.data.series.varying.week.VaryingWeek; +import de.ph87.data.series.varying.week.VaryingWeekRepository; +import de.ph87.data.series.varying.year.VaryingYear; +import de.ph87.data.series.varying.year.VaryingYearRepository; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.context.event.EventListener; -import org.springframework.stereotype.*; -import org.springframework.transaction.annotation.*; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; -import java.util.*; +import java.util.List; @Slf4j @Service @@ -65,8 +72,8 @@ public class VaryingService { } @NonNull - public List getPoints(@NonNull final SeriesDto series, @NonNull final Aligned begin, @NonNull final Aligned end) { - return findRepository(begin.alignment) + public List getPoints(@NonNull final SeriesDto series, @NonNull final Alignment innerAlignment, @NonNull final Aligned begin, @NonNull final Aligned end) { + return findRepository(innerAlignment) .findAllByIdSeriesIdAndIdDateGreaterThanEqualAndIdDateLessThanEqual(series.id, begin.date, end.date) .stream() .map(v -> new GraphPoint(v.getId().getDate(), v.getAvg())) diff --git a/src/main/java/de/ph87/data/weather/WeatherService.java b/src/main/java/de/ph87/data/weather/WeatherService.java index b283bcc..aba6c22 100644 --- a/src/main/java/de/ph87/data/weather/WeatherService.java +++ b/src/main/java/de/ph87/data/weather/WeatherService.java @@ -1,19 +1,26 @@ package de.ph87.data.weather; -import com.fasterxml.jackson.databind.*; -import lombok.*; -import lombok.extern.slf4j.*; -import org.springframework.boot.context.event.*; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.event.ApplicationStartedEvent; import org.springframework.context.event.EventListener; -import org.springframework.scheduling.annotation.*; -import org.springframework.stereotype.*; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; -import java.io.*; -import java.net.*; -import java.nio.charset.*; -import java.time.*; -import java.time.format.*; -import java.util.*; +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URI; +import java.nio.charset.StandardCharsets; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; @Slf4j @Service @@ -53,8 +60,8 @@ public class WeatherService { } days = newDays; log.info("Weather update complete"); - } catch (IOException e) { - log.error(e.toString()); + } catch (Exception e) { + log.error("Failed fetching Weather data!", e); } }