hoffmation-base 0.1.41-13 → 0.1.41-16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -75,6 +75,10 @@ class RoomBase {
75
75
  if (this.sonnenUntergangCallback && this.settings.rolloOffset) {
76
76
  this.sonnenUntergangCallback.minuteOffset = this.settings.rolloOffset.sunset;
77
77
  this.sonnenUntergangCallback.sunTimeOffset = this.settings.rolloOffset;
78
+ if (this.settings.sonnenUntergangRolloAdditionalOffsetPerCloudiness > 0) {
79
+ this.sonnenUntergangCallback.cloudOffset =
80
+ server_1.WeatherService.getCurrentCloudiness() * this.settings.sonnenUntergangRolloAdditionalOffsetPerCloudiness;
81
+ }
78
82
  this.sonnenUntergangCallback.recalcNextToDo(now);
79
83
  }
80
84
  if (this.sonnenAufgangLichtCallback && this.settings.lampOffset) {
@@ -1,8 +1,7 @@
1
1
  import { RoomBase } from '../RoomBase';
2
2
  import { iRoomInitializationSettings } from './iRoomInitializationSettings';
3
3
  import { iRoomDefaultSettings } from './iRoomDefaultSettings';
4
- import { SunTimeOffsets } from '../../../server/services/time-callback-service';
5
- import { iTimePair } from '../../../server/config/iConfig';
4
+ import { iTimePair, SunTimeOffsets } from '../../../server';
6
5
  import { RoomDeviceAddingSettings } from './roomDeviceAddingSettings';
7
6
  export declare class RoomSettings implements iRoomDefaultSettings, iRoomInitializationSettings {
8
7
  shortName: string;
@@ -14,48 +13,50 @@ export declare class RoomSettings implements iRoomDefaultSettings, iRoomInitiali
14
13
  lampOffset: SunTimeOffsets;
15
14
  roomName?: string;
16
15
  rolloHeatReduction: boolean;
17
- private _lampenBeiBewegung;
18
- private _lichtSonnenAufgangAus;
19
- private _sonnenUntergangRollos;
20
- private _sonnenAufgangRollos;
21
- private _movementResetTimer;
22
- private _sonnenUntergangRolloDelay;
23
- private _sonnenUntergangRolloMaxTime;
24
- private _sonnenUntergangLampenDelay;
25
- private _sonnenAufgangRolloDelay;
26
- private _sonnenAufgangRolloMinTime;
27
- private _sonnenAufgangLampenDelay;
28
- private _lightIfNoWindows;
29
- private _roomIsAlwaysDark;
30
16
  constructor(initSettings: iRoomInitializationSettings);
31
- private recalcRolloOffset;
32
- private recalcLampOffset;
33
- get roomIsAlwaysDark(): boolean;
34
- set roomIsAlwaysDark(value: boolean);
35
- get sonnenAufgangLampenDelay(): number;
36
- set sonnenAufgangLampenDelay(value: number);
37
- get sonnenAufgangRolloDelay(): number;
38
- set sonnenAufgangRolloDelay(value: number);
39
- get sonnenUntergangLampenDelay(): number;
40
- set sonnenUntergangLampenDelay(value: number);
41
- get sonnenUntergangRolloDelay(): number;
42
- set sonnenUntergangRolloDelay(value: number);
43
- get movementResetTimer(): number;
44
- set movementResetTimer(value: number);
17
+ private _lichtSonnenAufgangAus;
45
18
  get lichtSonnenAufgangAus(): boolean;
19
+ set lichtSonnenAufgangAus(value: boolean);
20
+ private _sonnenAufgangRollos;
46
21
  get sonnenAufgangRollos(): boolean;
47
22
  set sonnenAufgangRollos(value: boolean);
48
- get sonnenUntergangRollos(): boolean;
49
- set sonnenUntergangRollos(value: boolean);
50
- set lichtSonnenAufgangAus(value: boolean);
51
- get lampenBeiBewegung(): boolean;
52
- set lampenBeiBewegung(value: boolean);
23
+ private _sonnenUntergangRolloMaxTime;
53
24
  get sonnenUntergangRolloMaxTime(): iTimePair;
54
25
  set sonnenUntergangRolloMaxTime(value: iTimePair);
26
+ private _sonnenAufgangRolloMinTime;
55
27
  get sonnenAufgangRolloMinTime(): iTimePair;
56
28
  set sonnenAufgangRolloMinTime(value: iTimePair);
29
+ private _lightIfNoWindows;
57
30
  get lightIfNoWindows(): boolean;
58
31
  set lightIfNoWindows(value: boolean);
32
+ private _lampenBeiBewegung;
33
+ get lampenBeiBewegung(): boolean;
34
+ set lampenBeiBewegung(value: boolean);
35
+ private _sonnenUntergangRollos;
36
+ get sonnenUntergangRollos(): boolean;
37
+ set sonnenUntergangRollos(value: boolean);
38
+ private _movementResetTimer;
39
+ get movementResetTimer(): number;
40
+ set movementResetTimer(value: number);
41
+ private _sonnenUntergangRolloDelay;
42
+ get sonnenUntergangRolloDelay(): number;
43
+ set sonnenUntergangRolloDelay(value: number);
44
+ private _sonnenUntergangLampenDelay;
45
+ get sonnenUntergangLampenDelay(): number;
46
+ set sonnenUntergangLampenDelay(value: number);
47
+ private _sonnenUntergangRolloAdditionalOffsetPerCloudiness;
48
+ get sonnenUntergangRolloAdditionalOffsetPerCloudiness(): number;
49
+ private _sonnenAufgangRolloDelay;
50
+ get sonnenAufgangRolloDelay(): number;
51
+ set sonnenAufgangRolloDelay(value: number);
52
+ private _sonnenAufgangLampenDelay;
53
+ get sonnenAufgangLampenDelay(): number;
54
+ set sonnenAufgangLampenDelay(value: number);
55
+ private _roomIsAlwaysDark;
56
+ get roomIsAlwaysDark(): boolean;
57
+ set roomIsAlwaysDark(value: boolean);
59
58
  get room(): RoomBase | undefined;
60
59
  toJSON(): Partial<RoomSettings>;
60
+ private recalcRolloOffset;
61
+ private recalcLampOffset;
61
62
  }
@@ -4,78 +4,78 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.RoomSettings = void 0;
7
- const time_callback_service_1 = require("../../../server/services/time-callback-service");
8
- const settings_service_1 = require("../../../server/services/settings-service");
9
- const api_service_1 = require("../../../server/services/api/api-service");
10
- const utils_1 = require("../../../server/services/utils/utils");
7
+ const server_1 = require("../../../server");
11
8
  const lodash_1 = __importDefault(require("lodash"));
12
9
  class RoomSettings {
13
10
  constructor(initSettings) {
14
- this.defaultSettings = settings_service_1.SettingsService.settings.roomDefault;
11
+ this.defaultSettings = server_1.SettingsService.settings.roomDefault;
15
12
  this.radioUrl = 'https://hermes.bcs-systems.de/hitradio-rtl_top40_64k_aac'; // Radio RTL
16
13
  this.etage = -1;
17
14
  this.rolloHeatReduction = this.defaultSettings.rolloHeatReduction;
18
- this._lampenBeiBewegung = this.defaultSettings.lampenBeiBewegung;
19
15
  this._lichtSonnenAufgangAus = this.defaultSettings.lichtSonnenAufgangAus;
20
- this._sonnenUntergangRollos = this.defaultSettings.sonnenUntergangRollos;
21
16
  this._sonnenAufgangRollos = this.defaultSettings.sonnenAufgangRollos;
17
+ this._sonnenUntergangRolloMaxTime = this.defaultSettings.sonnenUntergangRolloMaxTime;
18
+ this._sonnenAufgangRolloMinTime = this.defaultSettings.sonnenAufgangRolloMinTime;
19
+ this._lightIfNoWindows = this.defaultSettings.lightIfNoWindows;
20
+ this._lampenBeiBewegung = this.defaultSettings.lampenBeiBewegung;
21
+ this._sonnenUntergangRollos = this.defaultSettings.sonnenUntergangRollos;
22
22
  this._movementResetTimer = this.defaultSettings.movementResetTimer;
23
23
  this._sonnenUntergangRolloDelay = this.defaultSettings.sonnenUntergangRolloDelay;
24
- this._sonnenUntergangRolloMaxTime = this.defaultSettings.sonnenUntergangRolloMaxTime;
25
24
  this._sonnenUntergangLampenDelay = this.defaultSettings.sonnenUntergangLampenDelay;
25
+ this._sonnenUntergangRolloAdditionalOffsetPerCloudiness = this.defaultSettings.sonnenUntergangRolloAdditionalOffsetPerCloudiness;
26
26
  this._sonnenAufgangRolloDelay = this.defaultSettings.sonnenAufgangRolloDelay;
27
- this._sonnenAufgangRolloMinTime = this.defaultSettings.sonnenAufgangRolloMinTime;
28
27
  this._sonnenAufgangLampenDelay = this.defaultSettings.sonnenAufgangLampenDelay;
29
- this._lightIfNoWindows = this.defaultSettings.lightIfNoWindows;
30
28
  this._roomIsAlwaysDark = this.defaultSettings.roomIsAlwaysDark;
31
29
  this.shortName = initSettings.shortName;
32
30
  this.etage = initSettings.etage;
33
31
  this.deviceAddidngSettings = initSettings.deviceAddidngSettings;
34
- this.rolloOffset = new time_callback_service_1.SunTimeOffsets(this.sonnenAufgangRolloDelay, this.sonnenUntergangRolloDelay, this.sonnenAufgangRolloMinTime.hours, this.sonnenAufgangRolloMinTime.minutes, this.sonnenUntergangRolloMaxTime.hours, this.sonnenUntergangRolloMaxTime.minutes);
35
- this.lampOffset = new time_callback_service_1.SunTimeOffsets(this.sonnenAufgangLampenDelay, this.sonnenUntergangLampenDelay);
32
+ this.rolloOffset = new server_1.SunTimeOffsets(this.sonnenAufgangRolloDelay, this.sonnenUntergangRolloDelay, this.sonnenAufgangRolloMinTime.hours, this.sonnenAufgangRolloMinTime.minutes, this.sonnenUntergangRolloMaxTime.hours, this.sonnenUntergangRolloMaxTime.minutes);
33
+ this.lampOffset = new server_1.SunTimeOffsets(this.sonnenAufgangLampenDelay, this.sonnenUntergangLampenDelay);
36
34
  }
37
- recalcRolloOffset() {
38
- var _a;
39
- this.rolloOffset = new time_callback_service_1.SunTimeOffsets(this.sonnenAufgangRolloDelay, this.sonnenUntergangRolloDelay, this.sonnenAufgangRolloMinTime.hours, this.sonnenAufgangRolloMinTime.minutes, this.sonnenUntergangRolloMaxTime.hours, this.sonnenUntergangRolloMaxTime.minutes);
40
- (_a = this.room) === null || _a === void 0 ? void 0 : _a.recalcTimeCallbacks();
35
+ get lichtSonnenAufgangAus() {
36
+ return this._lichtSonnenAufgangAus;
41
37
  }
42
- recalcLampOffset() {
43
- var _a;
44
- this.lampOffset = new time_callback_service_1.SunTimeOffsets(this.sonnenAufgangLampenDelay, this.sonnenAufgangRolloDelay);
45
- (_a = this.room) === null || _a === void 0 ? void 0 : _a.recalcTimeCallbacks();
38
+ set lichtSonnenAufgangAus(value) {
39
+ this._lichtSonnenAufgangAus = value;
46
40
  }
47
- get roomIsAlwaysDark() {
48
- return this._roomIsAlwaysDark;
41
+ get sonnenAufgangRollos() {
42
+ return this._sonnenAufgangRollos;
49
43
  }
50
- set roomIsAlwaysDark(value) {
51
- this._roomIsAlwaysDark = value;
44
+ set sonnenAufgangRollos(value) {
45
+ this._sonnenAufgangRollos = value;
46
+ this.recalcRolloOffset();
52
47
  }
53
- get sonnenAufgangLampenDelay() {
54
- return this._sonnenAufgangLampenDelay;
48
+ get sonnenUntergangRolloMaxTime() {
49
+ return this._sonnenUntergangRolloMaxTime;
55
50
  }
56
- set sonnenAufgangLampenDelay(value) {
57
- this._sonnenAufgangLampenDelay = value;
58
- this.recalcLampOffset();
51
+ set sonnenUntergangRolloMaxTime(value) {
52
+ this._sonnenUntergangRolloMaxTime = value;
53
+ this.recalcRolloOffset();
59
54
  }
60
- get sonnenAufgangRolloDelay() {
61
- return this._sonnenAufgangRolloDelay;
55
+ get sonnenAufgangRolloMinTime() {
56
+ return this._sonnenAufgangRolloMinTime;
62
57
  }
63
- set sonnenAufgangRolloDelay(value) {
64
- this._sonnenAufgangRolloDelay = value;
58
+ set sonnenAufgangRolloMinTime(value) {
59
+ this._sonnenAufgangRolloMinTime = value;
65
60
  this.recalcRolloOffset();
66
61
  }
67
- get sonnenUntergangLampenDelay() {
68
- return this._sonnenUntergangLampenDelay;
62
+ get lightIfNoWindows() {
63
+ return this._lightIfNoWindows;
69
64
  }
70
- set sonnenUntergangLampenDelay(value) {
71
- this._sonnenUntergangLampenDelay = value;
72
- this.recalcLampOffset();
65
+ set lightIfNoWindows(value) {
66
+ this._lightIfNoWindows = value;
73
67
  }
74
- get sonnenUntergangRolloDelay() {
75
- return this._sonnenUntergangRolloDelay;
68
+ get lampenBeiBewegung() {
69
+ return this._lampenBeiBewegung;
76
70
  }
77
- set sonnenUntergangRolloDelay(value) {
78
- this._sonnenUntergangRolloDelay = value;
71
+ set lampenBeiBewegung(value) {
72
+ this._lampenBeiBewegung = value;
73
+ }
74
+ get sonnenUntergangRollos() {
75
+ return this._sonnenUntergangRollos;
76
+ }
77
+ set sonnenUntergangRollos(value) {
78
+ this._sonnenUntergangRollos = value;
79
79
  this.recalcRolloOffset();
80
80
  }
81
81
  get movementResetTimer() {
@@ -84,61 +84,68 @@ class RoomSettings {
84
84
  set movementResetTimer(value) {
85
85
  this._movementResetTimer = value;
86
86
  }
87
- get lichtSonnenAufgangAus() {
88
- return this._lichtSonnenAufgangAus;
89
- }
90
- get sonnenAufgangRollos() {
91
- return this._sonnenAufgangRollos;
92
- }
93
- set sonnenAufgangRollos(value) {
94
- this._sonnenAufgangRollos = value;
95
- this.recalcRolloOffset();
96
- }
97
- get sonnenUntergangRollos() {
98
- return this._sonnenUntergangRollos;
87
+ get sonnenUntergangRolloDelay() {
88
+ return this._sonnenUntergangRolloDelay;
99
89
  }
100
- set sonnenUntergangRollos(value) {
101
- this._sonnenUntergangRollos = value;
90
+ set sonnenUntergangRolloDelay(value) {
91
+ this._sonnenUntergangRolloDelay = value;
102
92
  this.recalcRolloOffset();
103
93
  }
104
- set lichtSonnenAufgangAus(value) {
105
- this._lichtSonnenAufgangAus = value;
94
+ get sonnenUntergangLampenDelay() {
95
+ return this._sonnenUntergangLampenDelay;
106
96
  }
107
- get lampenBeiBewegung() {
108
- return this._lampenBeiBewegung;
97
+ set sonnenUntergangLampenDelay(value) {
98
+ this._sonnenUntergangLampenDelay = value;
99
+ this.recalcLampOffset();
109
100
  }
110
- set lampenBeiBewegung(value) {
111
- this._lampenBeiBewegung = value;
101
+ get sonnenUntergangRolloAdditionalOffsetPerCloudiness() {
102
+ return this._sonnenUntergangRolloAdditionalOffsetPerCloudiness;
112
103
  }
113
- get sonnenUntergangRolloMaxTime() {
114
- return this._sonnenUntergangRolloMaxTime;
104
+ get sonnenAufgangRolloDelay() {
105
+ return this._sonnenAufgangRolloDelay;
115
106
  }
116
- set sonnenUntergangRolloMaxTime(value) {
117
- this._sonnenUntergangRolloMaxTime = value;
107
+ set sonnenAufgangRolloDelay(value) {
108
+ this._sonnenAufgangRolloDelay = value;
118
109
  this.recalcRolloOffset();
119
110
  }
120
- get sonnenAufgangRolloMinTime() {
121
- return this._sonnenAufgangRolloMinTime;
111
+ get sonnenAufgangLampenDelay() {
112
+ return this._sonnenAufgangLampenDelay;
122
113
  }
123
- set sonnenAufgangRolloMinTime(value) {
124
- this._sonnenAufgangRolloMinTime = value;
125
- this.recalcRolloOffset();
114
+ set sonnenAufgangLampenDelay(value) {
115
+ this._sonnenAufgangLampenDelay = value;
116
+ this.recalcLampOffset();
126
117
  }
127
- get lightIfNoWindows() {
128
- return this._lightIfNoWindows;
118
+ get roomIsAlwaysDark() {
119
+ return this._roomIsAlwaysDark;
129
120
  }
130
- set lightIfNoWindows(value) {
131
- this._lightIfNoWindows = value;
121
+ set roomIsAlwaysDark(value) {
122
+ this._roomIsAlwaysDark = value;
132
123
  }
133
124
  get room() {
134
125
  if (!this.roomName) {
135
126
  return undefined;
136
127
  }
137
- return api_service_1.API.getRoom(this.roomName);
128
+ return server_1.API.getRoom(this.roomName);
138
129
  }
139
130
  toJSON() {
140
- const result = utils_1.Utils.jsonFilter(this);
131
+ const result = server_1.Utils.jsonFilter(this);
141
132
  return lodash_1.default.omit(result, [`defaultSettings`, 'deviceAddidngSettings']);
142
133
  }
134
+ recalcRolloOffset() {
135
+ var _a;
136
+ this.rolloOffset = new server_1.SunTimeOffsets(this.sonnenAufgangRolloDelay, this.sonnenUntergangRolloDelay, this.sonnenAufgangRolloMinTime.hours, this.sonnenAufgangRolloMinTime.minutes, this.sonnenUntergangRolloMaxTime.hours, this.sonnenUntergangRolloMaxTime.minutes);
137
+ if (this.sonnenUntergangRolloAdditionalOffsetPerCloudiness > 0) {
138
+ server_1.WeatherService.addWeatherUpdateCb(`RolloWeatherUpdate${this.roomName}`, () => {
139
+ var _a;
140
+ (_a = this.room) === null || _a === void 0 ? void 0 : _a.recalcTimeCallbacks();
141
+ });
142
+ }
143
+ (_a = this.room) === null || _a === void 0 ? void 0 : _a.recalcTimeCallbacks();
144
+ }
145
+ recalcLampOffset() {
146
+ var _a;
147
+ this.lampOffset = new server_1.SunTimeOffsets(this.sonnenAufgangLampenDelay, this.sonnenAufgangRolloDelay);
148
+ (_a = this.room) === null || _a === void 0 ? void 0 : _a.recalcTimeCallbacks();
149
+ }
143
150
  }
144
151
  exports.RoomSettings = RoomSettings;
@@ -1,4 +1,4 @@
1
- import { iTimePair } from '../../../server/config/iConfig';
1
+ import { iTimePair } from '../../../server';
2
2
  export interface iRoomDefaultSettings {
3
3
  rolloHeatReduction: boolean;
4
4
  /**
@@ -12,6 +12,7 @@ export interface iRoomDefaultSettings {
12
12
  sonnenUntergangRolloDelay: number;
13
13
  sonnenUntergangRolloMaxTime: iTimePair;
14
14
  sonnenUntergangLampenDelay: number;
15
+ sonnenUntergangRolloAdditionalOffsetPerCloudiness: number;
15
16
  sonnenAufgangRollos: boolean;
16
17
  sonnenAufgangRolloDelay: number;
17
18
  sonnenAufgangRolloMinTime: iTimePair;
@@ -18,8 +18,9 @@ export declare class TimeCallback {
18
18
  hours?: number | undefined;
19
19
  minutes?: number | undefined;
20
20
  sunTimeOffset?: SunTimeOffsets | undefined;
21
+ cloudOffset?: number | undefined;
21
22
  lastDone: Date;
22
23
  nextToDo?: Date;
23
- constructor(name: string, type: TimeCallbackType, cFunction: () => void, minuteOffset: number, hours?: number | undefined, minutes?: number | undefined, sunTimeOffset?: SunTimeOffsets | undefined);
24
+ constructor(name: string, type: TimeCallbackType, cFunction: () => void, minuteOffset: number, hours?: number | undefined, minutes?: number | undefined, sunTimeOffset?: SunTimeOffsets | undefined, cloudOffset?: number | undefined);
24
25
  recalcNextToDo(now: Date): void;
25
26
  }
@@ -17,7 +17,9 @@ var TimeOfDay;
17
17
  TimeOfDay[TimeOfDay["Night"] = 4] = "Night";
18
18
  })(TimeOfDay = exports.TimeOfDay || (exports.TimeOfDay = {}));
19
19
  class TimeCallback {
20
- constructor(name, type, cFunction, minuteOffset, hours, minutes, sunTimeOffset) {
20
+ constructor(name, type, cFunction, minuteOffset, hours, minutes, sunTimeOffset,
21
+ // Additional Offset due to amount of clouds
22
+ cloudOffset) {
21
23
  this.name = name;
22
24
  this.type = type;
23
25
  this.cFunction = cFunction;
@@ -25,6 +27,7 @@ class TimeCallback {
25
27
  this.hours = hours;
26
28
  this.minutes = minutes;
27
29
  this.sunTimeOffset = sunTimeOffset;
30
+ this.cloudOffset = cloudOffset;
28
31
  this.lastDone = new Date(0);
29
32
  }
30
33
  recalcNextToDo(now) {
@@ -46,7 +49,10 @@ class TimeCallback {
46
49
  server_1.ServerLogService.writeLog(logLevel_1.LogLevel.Trace, `Nächste Zeitevent für "${this.name}" um ${this.nextToDo.toLocaleTimeString('de-DE')}`);
47
50
  break;
48
51
  case TimeCallbackType.Sunrise:
49
- let fixedSRDate = new Date(server_1.TimeCallbackService.nextSunRise.getTime() + this.minuteOffset * 60 * 1000);
52
+ if (this.cloudOffset === undefined) {
53
+ this.cloudOffset = 0;
54
+ }
55
+ let fixedSRDate = new Date(server_1.TimeCallbackService.nextSunRise.getTime() + (this.minuteOffset + this.cloudOffset) * 60 * 1000);
50
56
  if (this.sunTimeOffset) {
51
57
  const nextMinSR = this.sunTimeOffset.getNextMinimumSunrise(now);
52
58
  if (nextMinSR > fixedSRDate && fixedSRDate.getDate() === nextMinSR.getDate()) {
@@ -60,7 +66,13 @@ class TimeCallback {
60
66
  this.nextToDo = fixedSRDate;
61
67
  break;
62
68
  case TimeCallbackType.SunSet:
63
- let fixedSSDate = new Date(server_1.TimeCallbackService.nextSunSet.getTime() + this.minuteOffset * 60 * 1000);
69
+ if (this.cloudOffset === undefined) {
70
+ this.cloudOffset = 0;
71
+ }
72
+ else {
73
+ this.cloudOffset = this.cloudOffset * -1;
74
+ }
75
+ let fixedSSDate = new Date(server_1.TimeCallbackService.nextSunSet.getTime() + (this.minuteOffset + this.cloudOffset) * 60 * 1000);
64
76
  if (this.sunTimeOffset) {
65
77
  const nextMaxSS = this.sunTimeOffset.getNextMaximumSunset(now);
66
78
  if (nextMaxSS < fixedSSDate && fixedSSDate.getDate() === nextMaxSS.getDate()) {
@@ -29,7 +29,7 @@ class Devices {
29
29
  else if (cName.indexOf('00-Zigbee') === 0) {
30
30
  Devices.processZigbeeDevice(cDevConf);
31
31
  }
32
- else if (cName.indexOf('00-EnergyManager') === 0) {
32
+ else if (cName.indexOf('00-EnergyManager') === 0 && cDevConf.type !== 'folder') {
33
33
  services_1.ServerLogService.writeLog(models_1.LogLevel.Info, `Found Energy-Manager in Device json.`);
34
34
  Devices.createEnergyManager(cDevConf);
35
35
  }
@@ -2,8 +2,8 @@ import { WeatherHourly } from './weather-hourly';
2
2
  import { WeatherCurrent } from './weather-current';
3
3
  import { WeatherMinutes } from './weather-minutes';
4
4
  import { WeatherAlert } from './weather-alert';
5
- import { iWeatherSettings } from '../../config/iConfig';
6
- import { OwnSonosDevice } from '../Sonos/sonos-service';
5
+ import { iWeatherSettings } from '../../config';
6
+ import { OwnSonosDevice } from '../Sonos';
7
7
  import { WeatherDaily } from './weather-daily';
8
8
  export interface WeatherResponse {
9
9
  lat: number;
@@ -20,18 +20,21 @@ export declare class WeatherService {
20
20
  static active: boolean;
21
21
  static oneDay: number;
22
22
  static lastResponse: WeatherResponse;
23
+ private static _dataUpdateCbs;
23
24
  private static _refreshInterval;
24
25
  private static latitude;
25
26
  private static longitude;
26
27
  private static appID;
28
+ static addWeatherUpdateCb(name: string, cb: () => void): void;
27
29
  static initialize(config: iWeatherSettings): void;
28
30
  static stopInterval(): void;
29
31
  static playWeatherInfo(sonosDevice: OwnSonosDevice, volume?: number, short?: boolean, retries?: number): void;
30
- private static getRainNextMinutes;
31
- private static getActiveAlerts;
32
- private static getWeatherData;
33
32
  static processHourlyWeather(): void;
34
33
  static getCurrentTemp(): number;
35
34
  static isOutsideWarmer(currentTemperatur: number): boolean;
36
35
  static weatherRolloPosition(normalPos: number, desiredTemperatur: number, currentTemperatur: number): number;
36
+ static getCurrentCloudiness(): number;
37
+ private static getRainNextMinutes;
38
+ private static getActiveAlerts;
39
+ private static getWeatherData;
37
40
  }
@@ -1,13 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.WeatherService = void 0;
4
- const logLevel_1 = require("../../../models/logLevel");
4
+ const models_1 = require("../../../models");
5
5
  const HTTPSOptions_1 = require("../HTTPSOptions");
6
6
  const https_service_1 = require("../https-service");
7
- const utils_1 = require("../utils/utils");
8
- const sonos_service_1 = require("../Sonos/sonos-service");
9
- const log_service_1 = require("../log-service/log-service");
7
+ const utils_1 = require("../utils");
8
+ const Sonos_1 = require("../Sonos");
9
+ const log_service_1 = require("../log-service");
10
10
  class WeatherService {
11
+ static addWeatherUpdateCb(name, cb) {
12
+ this._dataUpdateCbs[name] = cb;
13
+ }
11
14
  static initialize(config) {
12
15
  this.active = true;
13
16
  this.longitude = config.longitude;
@@ -25,29 +28,29 @@ class WeatherService {
25
28
  const wData = WeatherService.lastResponse;
26
29
  if (wData === undefined) {
27
30
  if (retries > 0) {
28
- log_service_1.ServerLogService.writeLog(logLevel_1.LogLevel.Warn, `WeatherService.playWeatherInfo(): Der Wetterbericht ist noch nicht bereit --> warten`);
31
+ log_service_1.ServerLogService.writeLog(models_1.LogLevel.Warn, `WeatherService.playWeatherInfo(): Der Wetterbericht ist noch nicht bereit --> warten`);
29
32
  setTimeout(() => {
30
33
  WeatherService.playWeatherInfo(sonosDevice, volume, short, retries - 1);
31
34
  }, 1000);
32
35
  }
33
36
  else {
34
- log_service_1.ServerLogService.writeLog(logLevel_1.LogLevel.Error, `WeatherService.playWeatherInfo(): Der Wetterbericht ist vorhanden --> Abbruch`);
37
+ log_service_1.ServerLogService.writeLog(models_1.LogLevel.Error, `WeatherService.playWeatherInfo(): Der Wetterbericht ist vorhanden --> Abbruch`);
35
38
  }
36
39
  return;
37
40
  }
38
- sonos_service_1.SonosService.speakOnDevice(short ? `Kurze Wetterinfo:` : `HoffMation Wetter-Bericht:`, sonosDevice, volume, false);
39
- sonos_service_1.SonosService.speakOnDevice(`Wetterbeschreibung für heute: ${wData.daily[0].weather[0].description}`, sonosDevice, volume, false);
40
- sonos_service_1.SonosService.speakOnDevice(`Aktuell sind es ${Math.round(wData.current.temp)} Grad.`, sonosDevice, volume, false);
41
+ Sonos_1.SonosService.speakOnDevice(short ? `Kurze Wetterinfo:` : `HoffMation Wetter-Bericht:`, sonosDevice, volume, false);
42
+ Sonos_1.SonosService.speakOnDevice(`Wetterbeschreibung für heute: ${wData.daily[0].weather[0].description}`, sonosDevice, volume, false);
43
+ Sonos_1.SonosService.speakOnDevice(`Aktuell sind es ${Math.round(wData.current.temp)} Grad.`, sonosDevice, volume, false);
41
44
  if (!short) {
42
- sonos_service_1.SonosService.speakOnDevice(`Heute sollen es im Durchschnitt ${Math.round(wData.daily[0].temp.day)} Grad sein.`, sonosDevice, volume, false);
43
- sonos_service_1.SonosService.speakOnDevice(`Die Höchsttemperatur liegt heute bei ${Math.round(wData.daily[0].temp.max)} Grad.`, sonosDevice, volume, false);
44
- sonos_service_1.SonosService.speakOnDevice(`Die Tiefsttemperatur soll heute ${Math.round(wData.daily[0].temp.min)} Grad betragen.`, sonosDevice, volume, false);
45
+ Sonos_1.SonosService.speakOnDevice(`Heute sollen es im Durchschnitt ${Math.round(wData.daily[0].temp.day)} Grad sein.`, sonosDevice, volume, false);
46
+ Sonos_1.SonosService.speakOnDevice(`Die Höchsttemperatur liegt heute bei ${Math.round(wData.daily[0].temp.max)} Grad.`, sonosDevice, volume, false);
47
+ Sonos_1.SonosService.speakOnDevice(`Die Tiefsttemperatur soll heute ${Math.round(wData.daily[0].temp.min)} Grad betragen.`, sonosDevice, volume, false);
45
48
  if (wData.daily[0].rain !== undefined) {
46
- sonos_service_1.SonosService.speakOnDevice(`Es sollen heute etwa ${Math.round(wData.daily[0].rain)} Millimeter Regen fallen.`, sonosDevice, volume, false);
49
+ Sonos_1.SonosService.speakOnDevice(`Es sollen heute etwa ${Math.round(wData.daily[0].rain)} Millimeter Regen fallen.`, sonosDevice, volume, false);
47
50
  }
48
51
  }
49
52
  if (wData.daily[0].snow !== undefined && wData.daily[0].snow > 0) {
50
- sonos_service_1.SonosService.speakOnDevice(`Heute wird es Schneien! Es werden etwa ${Math.round(wData.daily[0].snow)} Millimeter Schnee erwartet.`, sonosDevice, volume, false);
53
+ Sonos_1.SonosService.speakOnDevice(`Heute wird es Schneien! Es werden etwa ${Math.round(wData.daily[0].snow)} Millimeter Schnee erwartet.`, sonosDevice, volume, false);
51
54
  }
52
55
  const { minutes, precipitation } = WeatherService.getRainNextMinutes();
53
56
  const ratio = minutes <= 0 ? 0 : (precipitation / minutes) * 60;
@@ -72,10 +75,10 @@ class WeatherService {
72
75
  message += `bleibt es trocken.`;
73
76
  break;
74
77
  }
75
- sonos_service_1.SonosService.speakOnDevice(message, sonosDevice, volume, false);
78
+ Sonos_1.SonosService.speakOnDevice(message, sonosDevice, volume, false);
76
79
  !short &&
77
80
  precipitation > 0 &&
78
- sonos_service_1.SonosService.speakOnDevice(`Es werden etwa ${precipitation} Millimeter Niederschlag in den nächsten ${minutes} Minuten fallen`, sonosDevice, volume, false);
81
+ Sonos_1.SonosService.speakOnDevice(`Es werden etwa ${precipitation} Millimeter Niederschlag in den nächsten ${minutes} Minuten fallen`, sonosDevice, volume, false);
79
82
  const alerts = WeatherService.getActiveAlerts();
80
83
  if (alerts.length > 0) {
81
84
  const alertMessage = [`Achtung, vorliegende Wetterwarnungen:`];
@@ -83,11 +86,55 @@ class WeatherService {
83
86
  alertMessage.push(`${element.event} von ${new Date(element.start * 1000).toLocaleString('de-DE')} bis ${new Date(element.end * 1000).toLocaleString('de-DE')}`);
84
87
  // } bis ${new Date(element.end * 1000).toLocaleString("de-DE")}; Beschreibung: ${element.description} Herausgeber: ${element.sender_name}`)
85
88
  });
86
- sonos_service_1.SonosService.speakOnDevice(alertMessage.join('\n'), sonosDevice, volume, false);
89
+ Sonos_1.SonosService.speakOnDevice(alertMessage.join('\n'), sonosDevice, volume, false);
87
90
  }
88
91
  else if (!short) {
89
- sonos_service_1.SonosService.speakOnDevice(`Für heute liegt keine Unwetterwarnungen vor`, sonosDevice, volume, false);
92
+ Sonos_1.SonosService.speakOnDevice(`Für heute liegt keine Unwetterwarnungen vor`, sonosDevice, volume, false);
93
+ }
94
+ }
95
+ static processHourlyWeather() {
96
+ log_service_1.ServerLogService.writeLog(models_1.LogLevel.Info, `Es sind gerade ${this.lastResponse.current.temp} Grad (gefühlt ${this.lastResponse.current.feels_like}).`);
97
+ if (this.lastResponse.alerts !== undefined && this.lastResponse.alerts.length > 0) {
98
+ const message = [`Es gibt folgende Wetterwarnungen:`];
99
+ this.lastResponse.alerts.forEach((element) => {
100
+ message.push(`${element.event} von ${new Date(element.start * 1000)} bis ${new Date(element.end * 1000)}; Beschreibung: ${element.description} Herausgeber: ${element.sender_name}`);
101
+ });
102
+ log_service_1.ServerLogService.writeLog(models_1.LogLevel.Info, message.join('\n'));
103
+ }
104
+ }
105
+ static getCurrentTemp() {
106
+ const wData = WeatherService.lastResponse;
107
+ if (wData === undefined || wData.current === undefined) {
108
+ log_service_1.ServerLogService.writeLog(models_1.LogLevel.Info, `WeatherService.isOutsideWarmer(): There are no data yet`);
109
+ return -99;
110
+ }
111
+ return wData.current.temp;
112
+ }
113
+ static isOutsideWarmer(currentTemperatur) {
114
+ const wData = WeatherService.lastResponse;
115
+ if (wData === undefined || wData.current === undefined) {
116
+ log_service_1.ServerLogService.writeLog(models_1.LogLevel.Info, `WeatherService.isOutsideWarmer(): There are no data yet`);
117
+ return false;
118
+ }
119
+ log_service_1.ServerLogService.writeLog(models_1.LogLevel.Info, `isOutsideWarmer(${currentTemperatur}) --> Aktuelle Temperatur: ${wData.current.temp}`);
120
+ return currentTemperatur < wData.current.temp;
121
+ }
122
+ static weatherRolloPosition(normalPos, desiredTemperatur, currentTemperatur) {
123
+ let result = normalPos;
124
+ if (currentTemperatur > desiredTemperatur && this.isOutsideWarmer(currentTemperatur) && normalPos > 30) {
125
+ // Draußen ist wärmer also runter
126
+ result = 30;
127
+ }
128
+ log_service_1.ServerLogService.writeLog(models_1.LogLevel.Info, `weatherRolloPosition(${normalPos}, ${desiredTemperatur}, ${currentTemperatur}) --> Target: ${result}`);
129
+ return result;
130
+ }
131
+ static getCurrentCloudiness() {
132
+ const wData = WeatherService.lastResponse;
133
+ if (wData === undefined || wData.current === undefined) {
134
+ log_service_1.ServerLogService.writeLog(models_1.LogLevel.Info, `WeatherService.getCurrentCloudiness(): There are no data yet`);
135
+ return 0;
90
136
  }
137
+ return wData.current.clouds;
91
138
  }
92
139
  static getRainNextMinutes() {
93
140
  const minutes = WeatherService.lastResponse.minutely;
@@ -123,51 +170,19 @@ class WeatherService {
123
170
  }
124
171
  static getWeatherData() {
125
172
  https_service_1.HTTPSService.request(new HTTPSOptions_1.HTTPSOptions('api.openweathermap.org', `/data/2.5/onecall?lat=${WeatherService.latitude}&lon=${WeatherService.longitude}&appid=${WeatherService.appID}&units=metric&lang=de`, {}, 'GET', 443), '', 5, (response) => {
126
- log_service_1.ServerLogService.writeLog(logLevel_1.LogLevel.Debug, `WeatherAPi Response erhalten`);
127
- log_service_1.ServerLogService.writeLog(logLevel_1.LogLevel.DeepTrace, `WeatherAPi Response: ${response}`);
173
+ log_service_1.ServerLogService.writeLog(models_1.LogLevel.Debug, `WeatherAPi Response erhalten`);
174
+ log_service_1.ServerLogService.writeLog(models_1.LogLevel.DeepTrace, `WeatherAPi Response: ${response}`);
128
175
  utils_1.Utils.guardedFunction(() => {
129
176
  WeatherService.lastResponse = JSON.parse(response);
130
177
  WeatherService.processHourlyWeather();
178
+ for (const dataUpdateCbsKey in this._dataUpdateCbs) {
179
+ this._dataUpdateCbs[dataUpdateCbsKey]();
180
+ }
131
181
  }, this);
132
182
  });
133
183
  }
134
- static processHourlyWeather() {
135
- log_service_1.ServerLogService.writeLog(logLevel_1.LogLevel.Info, `Es sind gerade ${this.lastResponse.current.temp} Grad (gefühlt ${this.lastResponse.current.feels_like}).`);
136
- if (this.lastResponse.alerts !== undefined && this.lastResponse.alerts.length > 0) {
137
- const message = [`Es gibt folgende Wetterwarnungen:`];
138
- this.lastResponse.alerts.forEach((element) => {
139
- message.push(`${element.event} von ${new Date(element.start * 1000)} bis ${new Date(element.end * 1000)}; Beschreibung: ${element.description} Herausgeber: ${element.sender_name}`);
140
- });
141
- log_service_1.ServerLogService.writeLog(logLevel_1.LogLevel.Info, message.join('\n'));
142
- }
143
- }
144
- static getCurrentTemp() {
145
- const wData = WeatherService.lastResponse;
146
- if (wData === undefined || wData.current === undefined) {
147
- log_service_1.ServerLogService.writeLog(logLevel_1.LogLevel.Info, `WeatherService.isOutsideWarmer(): There are no data yet`);
148
- return -99;
149
- }
150
- return wData.current.temp;
151
- }
152
- static isOutsideWarmer(currentTemperatur) {
153
- const wData = WeatherService.lastResponse;
154
- if (wData === undefined || wData.current === undefined) {
155
- log_service_1.ServerLogService.writeLog(logLevel_1.LogLevel.Info, `WeatherService.isOutsideWarmer(): There are no data yet`);
156
- return false;
157
- }
158
- log_service_1.ServerLogService.writeLog(logLevel_1.LogLevel.Info, `isOutsideWarmer(${currentTemperatur}) --> Aktuelle Temperatur: ${wData.current.temp}`);
159
- return currentTemperatur < wData.current.temp;
160
- }
161
- static weatherRolloPosition(normalPos, desiredTemperatur, currentTemperatur) {
162
- let result = normalPos;
163
- if (currentTemperatur > desiredTemperatur && this.isOutsideWarmer(currentTemperatur) && normalPos > 30) {
164
- // Draußen ist wärmer also runter
165
- result = 30;
166
- }
167
- log_service_1.ServerLogService.writeLog(logLevel_1.LogLevel.Info, `weatherRolloPosition(${normalPos}, ${desiredTemperatur}, ${currentTemperatur}) --> Target: ${result}`);
168
- return result;
169
- }
170
184
  }
171
185
  exports.WeatherService = WeatherService;
172
186
  WeatherService.active = false;
173
187
  WeatherService.oneDay = 1000 * 60 * 60 * 24;
188
+ WeatherService._dataUpdateCbs = {};