hoffmation-base 1.0.3 → 1.0.6

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.
@@ -41,7 +41,7 @@ class SonosService {
41
41
  if (m.from === undefined)
42
42
  return false;
43
43
  SonosService.speakTestMessageOnEachDevice();
44
- Telegram_1.TelegramService.sendMessage([m.from.id], 'Testnachricht gesprochen --> Führe weiteren Test durch');
44
+ Telegram_1.TelegramService.sendMessage([m.chat.id], 'Testnachricht gesprochen --> Führe weiteren Test durch');
45
45
  await SonosService.checkAll();
46
46
  return true;
47
47
  }, `Spiele eine kurze Nachricht auf allen Sonos Geräten um diese zu identifizieren`));
@@ -73,6 +73,7 @@ class SonosService {
73
73
  for (const deviceName in this.ownDevices) {
74
74
  currentDevice = this.ownDevices[deviceName];
75
75
  if ((currentDevice === null || currentDevice === void 0 ? void 0 : currentDevice.device) === undefined) {
76
+ // noinspection ExceptionCaughtLocallyJS
76
77
  throw `${currentDevice === null || currentDevice === void 0 ? void 0 : currentDevice.name} is missing`;
77
78
  }
78
79
  await currentDevice.device.GetState();
@@ -12,7 +12,7 @@ class TelegramCommands {
12
12
  if (m.from === undefined)
13
13
  return false;
14
14
  room_service_1.RoomService.clearAllAlarms();
15
- telegram_service_1.TelegramService.sendMessage([m.from.id], 'Alle ausgelösten Wasser-/Rauchmelder und Eindringlingsalarme wurden gestoppt.');
15
+ telegram_service_1.TelegramService.sendMessage([m.chat.id], 'Alle ausgelösten Wasser-/Rauchmelder und Eindringlingsalarme wurden gestoppt.');
16
16
  return true;
17
17
  }, 'Eine Möglichkeit bei Fehlalarm den Alarm abzuschalten'));
18
18
  telegram_service_1.TelegramService.addMessageCallback(new telegramMessageCalback_1.TelegramMessageCallback('AwayModeStart', /\/away_mode_start/, async (m) => {
@@ -33,62 +33,62 @@ class TelegramCommands {
33
33
  if (m.from === undefined)
34
34
  return false;
35
35
  room_service_1.RoomService.endAlarmModes();
36
- telegram_service_1.TelegramService.sendMessage([m.from.id], 'Der Abwesenheitsmodus ist deaktiviert.');
36
+ telegram_service_1.TelegramService.sendMessage([m.chat.id], 'Der Abwesenheitsmodus ist deaktiviert.');
37
37
  return true;
38
38
  }, 'Alarmanlage nach Abwesenheit/Nacht entschärfen'));
39
39
  telegram_service_1.TelegramService.addMessageCallback(new telegramMessageCalback_1.TelegramMessageCallback('LastMovements', /\/check_movement/, async (m) => {
40
40
  if (m.from === undefined)
41
41
  return false;
42
- telegram_service_1.TelegramService.sendMessage([m.from.id], `Im Folgenden sind die letzten Bewegungen\n${room_service_1.RoomService.getLastMovements()}`);
42
+ telegram_service_1.TelegramService.sendMessage([m.chat.id], `Im Folgenden sind die letzten Bewegungen\n${room_service_1.RoomService.getLastMovements()}`);
43
43
  return true;
44
44
  }, 'Gibt die letzten Bewegungen inkl. ihrer Uhrzeit aus.'));
45
45
  telegram_service_1.TelegramService.addMessageCallback(new telegramMessageCalback_1.TelegramMessageCallback('TelegramTest', /\/test/, async (m) => {
46
46
  if (m.from === undefined)
47
47
  return false;
48
- telegram_service_1.TelegramService.sendMessage([m.from.id], 'Hallo, ich bin der HoffMation Bot.');
48
+ telegram_service_1.TelegramService.sendMessage([m.chat.id], 'Hallo, ich bin der HoffMation Bot.');
49
49
  return true;
50
50
  }, 'Eine Möglichkeit die Verknüpfung mit dem HoffMation Bot zu testen'));
51
51
  telegram_service_1.TelegramService.addMessageCallback(new telegramMessageCalback_1.TelegramMessageCallback('RolloObenCheck', /\/check_rollo/, async (m) => {
52
52
  if (m.from === undefined)
53
53
  return false;
54
- telegram_service_1.TelegramService.sendMessage([m.from.id], ShutterService_1.ShutterService.getRolladenPosition());
54
+ telegram_service_1.TelegramService.sendMessage([m.chat.id], ShutterService_1.ShutterService.getRolladenPosition());
55
55
  return true;
56
56
  }, 'Gibt die Positionen der Rollos aus, warnt über offene Rollos und nennt die nächsten Fahrten'));
57
57
  telegram_service_1.TelegramService.addMessageCallback(new telegramMessageCalback_1.TelegramMessageCallback('FensterCheck', /\/check_fenster/, async (m) => {
58
58
  if (m.from === undefined)
59
59
  return false;
60
- telegram_service_1.TelegramService.sendMessage([m.from.id], devices_1.Griffe.getGriffPosition());
60
+ telegram_service_1.TelegramService.sendMessage([m.chat.id], devices_1.Griffe.getGriffPosition());
61
61
  return true;
62
62
  }, 'Gibt die Positionen der Fenstergriffe aus und warnt somit über offene Fenster'));
63
63
  telegram_service_1.TelegramService.addMessageCallback(new telegramMessageCalback_1.TelegramMessageCallback('BatteryCheck', /\/check_battery/, async (m) => {
64
64
  if (m.from === undefined)
65
65
  return Promise.resolve(false);
66
- telegram_service_1.TelegramService.sendMessage([m.from.id], devices_1.Devices.getBatteryInfo());
66
+ telegram_service_1.TelegramService.sendMessage([m.chat.id], devices_1.Devices.getBatteryInfo());
67
67
  return Promise.resolve(true);
68
68
  }, 'Returns a list of all battery driven devices in ascending order.'));
69
69
  telegram_service_1.TelegramService.addMessageCallback(new telegramMessageCalback_1.TelegramMessageCallback('HeizungCheck', /\/check_temperatur/, async (m) => {
70
70
  if (m.from === undefined)
71
71
  return false;
72
- telegram_service_1.TelegramService.sendMessage([m.from.id], devices_1.Heizgruppen.getInfo());
72
+ telegram_service_1.TelegramService.sendMessage([m.chat.id], devices_1.Heizgruppen.getInfo());
73
73
  return true;
74
74
  }, 'Gibt die Namen und aktuellen Werte sämtlicher Heizgruppen aus (aktuelle Temperatur, Soll Temperatur, Ventilstellung).'));
75
75
  telegram_service_1.TelegramService.addMessageCallback(new telegramMessageCalback_1.TelegramMessageCallback('HeizungError', /\/temperatur_error/, async (m) => {
76
76
  if (m.from === undefined)
77
77
  return false;
78
- telegram_service_1.TelegramService.sendMessage([m.from.id], devices_1.Heizgruppen.getProblems());
78
+ telegram_service_1.TelegramService.sendMessage([m.chat.id], devices_1.Heizgruppen.getProblems());
79
79
  return true;
80
80
  }, 'Zeigt Differenzen zwischen Heizungen und den jeweiligen Heizgruppen auf'));
81
81
  telegram_service_1.TelegramService.addMessageCallback(new telegramMessageCalback_1.TelegramMessageCallback('HeizungCheckOne', /\/check_1_temperatur.*/, async (m) => {
82
82
  if (m.from === undefined)
83
83
  return false;
84
- telegram_service_1.TelegramService.sendMessage([m.from.id], await devices_1.Heizgruppen.getSpecificInfo(m.text));
84
+ telegram_service_1.TelegramService.sendMessage([m.chat.id], await devices_1.Heizgruppen.getSpecificInfo(m.text));
85
85
  return true;
86
86
  }, `Gibt den Verlauf der in \\"\\" übergebenen Heizgruppe aus.`, /\/check_1_temperatur/));
87
87
  telegram_service_1.TelegramService.addMessageCallback(new telegramMessageCalback_1.TelegramMessageCallback('AllRolloDown', /\/all_rollo_down/, async (m) => {
88
88
  if (m.from === undefined)
89
89
  return false;
90
90
  room_service_1.RoomService.setAllRolloOfFloor(-1, 0);
91
- telegram_service_1.TelegramService.sendMessage([m.from.id], `Es werden alle Rollos heruntergefahren`);
91
+ telegram_service_1.TelegramService.sendMessage([m.chat.id], `Es werden alle Rollos heruntergefahren`);
92
92
  return true;
93
93
  }, `Fährt alle rollos runter`));
94
94
  telegram_service_1.TelegramService.addMessageCallback(new telegramMessageCalback_1.TelegramMessageCallback('VibrationSensitivity', /\/set_vibration_sensitivity/, async (m) => {
@@ -100,7 +100,7 @@ class TelegramCommands {
100
100
  d.setSensitivity(2);
101
101
  }
102
102
  }
103
- telegram_service_1.TelegramService.sendMessage([m.from.id], 'Abgeschlossen');
103
+ telegram_service_1.TelegramService.sendMessage([m.chat.id], 'Abgeschlossen');
104
104
  return true;
105
105
  }, `Setzt alle Vibrationsensoren auf High`));
106
106
  telegram_service_1.TelegramService.addMessageCallback(new telegramMessageCalback_1.TelegramMessageCallback('AllButtonAssignments', /\/get_all_button_assignments/, async (m) => {
@@ -113,7 +113,7 @@ class TelegramCommands {
113
113
  response.push(d.getButtonAssignment());
114
114
  }
115
115
  }
116
- telegram_service_1.TelegramService.sendMessage([m.from.id], response.join('\n'));
116
+ telegram_service_1.TelegramService.sendMessage([m.chat.id], response.join('\n'));
117
117
  return true;
118
118
  }, `Retrieves the button assignments for all buttons in home`));
119
119
  if (devices_1.Devices.energymanager !== undefined) {
@@ -128,7 +128,7 @@ class TelegramCommands {
128
128
  response.push(`Drawing Wattage: ${(_d = devices_1.Devices.energymanager) === null || _d === void 0 ? void 0 : _d.drawingWattage}W`);
129
129
  response.push(`Self Consuming Wattage: ${(_e = devices_1.Devices.energymanager) === null || _e === void 0 ? void 0 : _e.selfConsumingWattage}W`);
130
130
  response.push(`Injecting Wattage: ${(_f = devices_1.Devices.energymanager) === null || _f === void 0 ? void 0 : _f.injectingWattage}W`);
131
- telegram_service_1.TelegramService.sendMessage([m.from.id], response.join('\n'));
131
+ telegram_service_1.TelegramService.sendMessage([m.chat.id], response.join('\n'));
132
132
  return true;
133
133
  }, `Retrieves the current energy manager values`));
134
134
  }
@@ -46,7 +46,6 @@ class TelegramService {
46
46
  log_service_1.ServerLogService.writeLog(models_1.LogLevel.Trace, `Telegram Polling Error stack: ${e.stack}`);
47
47
  });
48
48
  TelegramService.addMessageCallback(new telegramMessageCalback_1.TelegramMessageCallback('helpCommand', /\/help/, async (m) => {
49
- var _a;
50
49
  if (m.from === undefined)
51
50
  return true;
52
51
  const message = [];
@@ -55,7 +54,7 @@ class TelegramService {
55
54
  const telegramCb = TelegramService.callbacks[cName];
56
55
  message.push(`${telegramCb.identifier.toString().replace(/\//g, '').replace(/\\/g, '')} - ${telegramCb.helpMessage}`);
57
56
  }
58
- TelegramService.sendMessage([(_a = m.from) === null || _a === void 0 ? void 0 : _a.id], message.join('\n'));
57
+ TelegramService.sendMessage([m.chat.id], message.join('\n'));
59
58
  return true;
60
59
  }, `Gibt eine Liste mit sämtlichen Kommandos aus`));
61
60
  TelegramService.inform(`(Re-)Initialisierung abgeschlossen`);
@@ -97,7 +96,7 @@ class TelegramService {
97
96
  }
98
97
  static checkAuthorized(msg) {
99
98
  var _a;
100
- if (msg.from !== undefined && this.allowedIDs.includes((_a = msg.from) === null || _a === void 0 ? void 0 : _a.id)) {
99
+ if ((msg.from !== undefined && this.allowedIDs.includes((_a = msg.from) === null || _a === void 0 ? void 0 : _a.id)) || this.allowedIDs.includes(msg.chat.id)) {
101
100
  log_service_1.ServerLogService.writeLog(models_1.LogLevel.Debug, `Authorisierte Telegram Message erhalten: ${JSON.stringify(msg)}`);
102
101
  return true;
103
102
  }
@@ -17,7 +17,7 @@ export declare abstract class AcDevice implements iExcessEnergyConsumer {
17
17
  * @param {number} timeout
18
18
  */
19
19
  deactivateAutomaticTurnOn(timeout?: number): void;
20
- abstract setDesiredMode(mode: AcMode): void;
20
+ abstract setDesiredMode(mode: AcMode, writeToDevice: boolean): void;
21
21
  abstract turnOn(): void;
22
22
  turnOnForExcessEnergy(): void;
23
23
  abstract turnOff(): void;
@@ -31,14 +31,14 @@ class DaikinService {
31
31
  if (m.from === undefined)
32
32
  return false;
33
33
  DaikinService.setAll(true);
34
- Telegram_1.TelegramService.sendMessage([m.from.id], 'Command executed');
34
+ Telegram_1.TelegramService.sendMessage([m.chat.id], 'Command executed');
35
35
  return true;
36
36
  }, `Turns all Ac's on without changing any settings`));
37
37
  Telegram_1.TelegramService.addMessageCallback(new Telegram_1.TelegramMessageCallback('AcOff', /\/ac_off/, async (m) => {
38
38
  if (m.from === undefined)
39
39
  return false;
40
40
  DaikinService.setAll(false, true);
41
- Telegram_1.TelegramService.sendMessage([m.from.id], 'Command executed');
41
+ Telegram_1.TelegramService.sendMessage([m.chat.id], 'Command executed');
42
42
  return true;
43
43
  }, `Turns all Ac's off without changing any settings`));
44
44
  return new Promise((res, _rej) => {
@@ -61,6 +61,9 @@ class DaikinService {
61
61
  });
62
62
  }
63
63
  static setAll(on, force = false) {
64
+ if (!this.isInitialized) {
65
+ return;
66
+ }
64
67
  for (const deviceName in this._ownDevices) {
65
68
  const dev = this._ownDevices[deviceName];
66
69
  if (on) {
@@ -11,9 +11,11 @@ export declare class OwnDaikinDevice extends AcDevice {
11
11
  get device(): DaikinAC | undefined;
12
12
  set device(device: DaikinAC | undefined);
13
13
  get on(): boolean;
14
- setDesiredMode(mode: AcMode): void;
14
+ setDesiredMode(mode: AcMode, writeToDevice?: boolean): void;
15
15
  turnOn(): void;
16
16
  turnOff(): void;
17
17
  private setDesiredInfo;
18
+ private handleDeviceUnreach;
19
+ private handleParamNg;
18
20
  private logInfo;
19
21
  }
@@ -42,7 +42,7 @@ class OwnDaikinDevice extends ac_device_1.AcDevice {
42
42
  var _a, _b, _c;
43
43
  return (_c = (_b = (_a = this._device) === null || _a === void 0 ? void 0 : _a.currentACControlInfo) === null || _b === void 0 ? void 0 : _b.power) !== null && _c !== void 0 ? _c : false;
44
44
  }
45
- setDesiredMode(mode) {
45
+ setDesiredMode(mode, writeToDevice = true) {
46
46
  let newMode = -1;
47
47
  switch (mode) {
48
48
  case ac_mode_1.AcMode.Heating:
@@ -59,7 +59,9 @@ class OwnDaikinDevice extends ac_device_1.AcDevice {
59
59
  return;
60
60
  }
61
61
  this.desiredMode = newMode;
62
- this.setDesiredInfo();
62
+ if (writeToDevice) {
63
+ this.setDesiredInfo();
64
+ }
63
65
  }
64
66
  turnOn() {
65
67
  this.desiredState = daikin_controller_1.Power.ON;
@@ -85,15 +87,13 @@ class OwnDaikinDevice extends ac_device_1.AcDevice {
85
87
  if (err !== null) {
86
88
  log_service_1.ServerLogService.writeLog(models_1.LogLevel.Warn, `Setting Ac Info for ${this.name} failed: ${err} `);
87
89
  if (err.message.includes('EHOSTUNREACH') && !retry) {
88
- this.log(models_1.LogLevel.Warn, `Detected EHOSTUNREACH, will try reconecting`);
89
- daikin_service_1.DaikinService.reconnect(this.name, this.ip).then((device) => {
90
- this.device = device;
91
- utils_1.Utils.guardedTimeout(() => {
92
- this.setDesiredInfo(true);
93
- }, 5000, this);
94
- });
90
+ this.handleDeviceUnreach();
91
+ return;
92
+ }
93
+ else if (err.message.includes('ret=PARAM NG') && !retry) {
94
+ this.handleParamNg();
95
+ return;
95
96
  }
96
- return;
97
97
  }
98
98
  else if (res) {
99
99
  this.log(models_1.LogLevel.Info, `Changing Ac ${this.name} Settings was successful`);
@@ -104,6 +104,25 @@ class OwnDaikinDevice extends ac_device_1.AcDevice {
104
104
  }
105
105
  });
106
106
  }
107
+ handleDeviceUnreach() {
108
+ this.log(models_1.LogLevel.Warn, `Detected EHOSTUNREACH, will try reconecting`);
109
+ daikin_service_1.DaikinService.reconnect(this.name, this.ip).then((device) => {
110
+ this.device = device;
111
+ utils_1.Utils.guardedTimeout(() => {
112
+ this.setDesiredInfo(true);
113
+ }, 5000, this);
114
+ });
115
+ }
116
+ handleParamNg() {
117
+ var _a;
118
+ this.log(models_1.LogLevel.Warn, `Detected Param Ng, will try reloading Control Info`);
119
+ (_a = this._device) === null || _a === void 0 ? void 0 : _a.getACControlInfo((err) => {
120
+ if (err === null) {
121
+ this.log(models_1.LogLevel.Warn, `Device Info loaded successfull will try setting Control Info again`);
122
+ this.setDesiredInfo(true);
123
+ }
124
+ });
125
+ }
107
126
  logInfo(info) {
108
127
  this.log(models_1.LogLevel.Debug, `Device Info ${JSON.stringify(info)}`);
109
128
  }
@@ -1,7 +1,14 @@
1
1
  import { IBaseDevice } from '../../devices';
2
2
  import { RoomBase } from '../../../models';
3
3
  import { LogObject } from '../log-service';
4
+ import { OwnDaikinDevice } from '../ac';
4
5
  export declare class API {
6
+ /**
7
+ * Gets the instance of an Daikin Device identified by name
8
+ * @param {string} name
9
+ * @returns {OwnDaikinDevice | undefined}
10
+ */
11
+ static getAc(name: string): OwnDaikinDevice | undefined;
5
12
  static getDevices(): {
6
13
  [id: string]: IBaseDevice;
7
14
  };
@@ -9,4 +16,22 @@ export declare class API {
9
16
  static getRooms(): Map<string, RoomBase>;
10
17
  static getRoom(id: string): RoomBase | undefined;
11
18
  static getLog(): LogObject[];
19
+ /**
20
+ * Turns on/off one AC identified by it's name
21
+ * @param name The name of the device, if wrong false will be returned
22
+ * @param {boolean} desiredState
23
+ */
24
+ static setAc(name: string, desiredState: boolean): boolean;
25
+ /**
26
+ * Turns on/off all AC´s in the home
27
+ * @param {boolean} desiredState
28
+ */
29
+ static setAllAc(desiredState: boolean): void;
30
+ /**
31
+ * Changes the status of a given Lamp
32
+ * @param {string} deviceId The device Id of the lamp
33
+ * @param {boolean} state The desired new state
34
+ * @returns {Error | null} In case it failed the Error containing the reason
35
+ */
36
+ static setLight(deviceId: string, state: boolean): Error | null;
12
37
  }
@@ -5,7 +5,16 @@ const devices_1 = require("../../devices");
5
5
  const models_1 = require("../../../models");
6
6
  const room_service_1 = require("../room-service");
7
7
  const log_service_1 = require("../log-service");
8
+ const ac_1 = require("../ac");
8
9
  class API {
10
+ /**
11
+ * Gets the instance of an Daikin Device identified by name
12
+ * @param {string} name
13
+ * @returns {OwnDaikinDevice | undefined}
14
+ */
15
+ static getAc(name) {
16
+ return ac_1.OwnDaikinDevices.ownDevices[name];
17
+ }
9
18
  static getDevices() {
10
19
  // console.log(inspect(Devices.alLDevices, false, 3));
11
20
  return devices_1.Devices.alLDevices;
@@ -27,5 +36,48 @@ class API {
27
36
  static getLog() {
28
37
  return log_service_1.ServerLogService.getLog();
29
38
  }
39
+ /**
40
+ * Turns on/off one AC identified by it's name
41
+ * @param name The name of the device, if wrong false will be returned
42
+ * @param {boolean} desiredState
43
+ */
44
+ static setAc(name, desiredState) {
45
+ const d = this.getAc(name);
46
+ if (!d) {
47
+ log_service_1.ServerLogService.writeLog(models_1.LogLevel.Warn, `Daikin Device for name ${name} not found`);
48
+ return false;
49
+ }
50
+ if (desiredState) {
51
+ d.turnOn();
52
+ }
53
+ else {
54
+ d.deactivateAutomaticTurnOn(60 * 60 * 1000);
55
+ }
56
+ return true;
57
+ }
58
+ /**
59
+ * Turns on/off all AC´s in the home
60
+ * @param {boolean} desiredState
61
+ */
62
+ static setAllAc(desiredState) {
63
+ ac_1.DaikinService.setAll(desiredState, true);
64
+ }
65
+ /**
66
+ * Changes the status of a given Lamp
67
+ * @param {string} deviceId The device Id of the lamp
68
+ * @param {boolean} state The desired new state
69
+ * @returns {Error | null} In case it failed the Error containing the reason
70
+ */
71
+ static setLight(deviceId, state) {
72
+ const d = this.getDevice(deviceId);
73
+ if (d === undefined) {
74
+ return new Error(`Device with ID ${deviceId} not found`);
75
+ }
76
+ if (typeof d.setLight !== 'function') {
77
+ return new Error(`Device with ID ${deviceId} is no Lamp`);
78
+ }
79
+ d.setLight(state, 60 * 60 * 1000, true);
80
+ return null;
81
+ }
30
82
  }
31
83
  exports.API = API;
@@ -76,7 +76,7 @@ class Utils {
76
76
  }
77
77
  static jsonFilter(object) {
78
78
  return lodash_1.default.omit(object, Object.keys(object).filter((key) => {
79
- if (key.includes('Timeout') || key.includes('Interval')) {
79
+ if (key.includes('Timeout') || key.includes('Interval') || key.includes('timeouts')) {
80
80
  // Exclude timeout Variables.
81
81
  return true;
82
82
  }