iobroker.panasonic-comfort-cloud 3.0.3 → 3.1.0

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.
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2024 marc <marc@lammers.dev>
3
+ Copyright (c) 2025 marc <marc@lammers.dev>
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -2,15 +2,14 @@
2
2
 
3
3
  | :warning: WARNING |
4
4
  |:---------------------------|
5
- | New app version in adapter settings is 1.21.0 |
5
+ | New app version in adapter settings is 3.0.03 |
6
6
 
7
7
  ![Logo](admin/panasonic-comfort-cloud.png)
8
8
 
9
- [![NPM version](http://img.shields.io/npm/v/iobroker.panasonic-comfort-cloud.svg)](https://www.npmjs.com/package/iobroker.panasonic-comfort-cloud)
9
+ ![Number of Installations](http://iobroker.live/badges/panasonic-comfort-cloud-installed.svg) ![Number of Installations](http://iobroker.live/badges/panasonic-comfort-cloud-stable.svg) [![NPM version](http://img.shields.io/npm/v/iobroker.panasonic-comfort-cloud.svg)](https://www.npmjs.com/package/iobroker.panasonic-comfort-cloud)
10
10
  [![Downloads](https://img.shields.io/npm/dm/iobroker.panasonic-comfort-cloud.svg)](https://www.npmjs.com/package/iobroker.panasonic-comfort-cloud)
11
11
  [![Tests and release](https://github.com//marc2016/ioBroker.panasonic-comfort-cloud/actions/workflows/test-and-release.yml/badge.svg)](https://www.npmjs.com/package/iobroker.panasonic-comfort-cloud)
12
12
 
13
- [![Dependency Status](https://img.shields.io/david/marc2016/iobroker.panasonic-comfort-cloud.svg)](https://david-dm.org/marc2016/iobroker.panasonic-comfort-cloud)
14
13
  [![Known Vulnerabilities](https://snyk.io/test/github/marc2016/ioBroker.panasonic-comfort-cloud/badge.svg)](https://snyk.io/test/github/marc2016/ioBroker.panasonic-comfort-cloud)
15
14
 
16
15
  [![NPM](https://nodei.co/npm/iobroker.panasonic-comfort-cloud.png?downloads=true)](https://nodei.co/npm/iobroker.panasonic-comfort-cloud/)
@@ -24,6 +23,10 @@ With the method used, only one client can be logged on with the account at a tim
24
23
  It is recommended that a second account, for which the devices have been shared, is used.
25
24
 
26
25
  ## Changelog
26
+ ### 3.1.0 (2025-08-09)
27
+
28
+ * read app version from App Store.
29
+
27
30
  ### 3.0.3 (2024-11-08)
28
31
 
29
32
  * panasonic-comfort-cloud-client updated to new version. CFC generator for header added.
@@ -149,7 +152,7 @@ It is recommended that a second account, for which the devices have been shared,
149
152
 
150
153
  MIT License
151
154
 
152
- Copyright (c) 2024 marc <marc@lammers.dev>
155
+ Copyright (c) 2025 marc <marc@lammers.dev>
153
156
 
154
157
  Permission is hereby granted, free of charge, to any person obtaining a copy
155
158
  of this software and associated documentation files (the "Software"), to deal
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "appVersion": "Neue Version der App für API",
3
- "appVersionFromGithub": "App-Version für API, geladen aus dem GitHub-Repository",
4
- "useAppVersionFromGithub": "Verwenden Sie die von GitHub geladene App-Version",
5
3
  "panasonic-comfort-cloud adapter settings": "Adaptereinstellungen für Panasonic-Comfort-Cloud",
6
4
  "password": "Passwort",
7
5
  "refreshInterval": "Aktualisierungsintervall (Minuten)",
8
6
  "username": "Nutzername",
9
7
  "automaticRefreshEnabled": "Automatische Aktualisierung aktiv",
10
8
  "adapterCommands": "Befehle zur Steuerung des Adapters",
11
- "manualRefresh": "Gerätehandbuch aktualisieren"
9
+ "manualRefresh": "Gerätehandbuch aktualisieren",
10
+ "appVersionFromAppStore": "App -Version für API aus dem App Store geladen",
11
+ "useAppVersionFromAppStore": "Verwenden Sie die App -Version, die aus dem App Store geladen wurde"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "appVersion": "New version of the app for API",
3
- "appVersionFromGithub": "App version for API loaded from GitHub repository",
4
- "useAppVersionFromGithub": "Use the app version loaded from GitHub",
3
+ "appVersionFromAppStore": "App version for API loaded from App Store",
4
+ "useAppVersionFromAppStore": "Use the app version loaded from App Store",
5
5
  "panasonic-comfort-cloud adapter settings": "Adapter settings for panasonic-comfort-cloud",
6
6
  "password": "Password",
7
7
  "refreshInterval": "Refresh interval (minutes)",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "appVersion": "Nueva versión de la aplicación para API",
3
- "appVersionFromGithub": "Versión de la aplicación para API cargada desde el repositorio de GitHub",
4
- "useAppVersionFromGithub": "Utilice la versión de la aplicación cargada desde GitHub",
5
3
  "panasonic-comfort-cloud adapter settings": "Configuración del adaptador para panasonic-comfort-cloud",
6
4
  "password": "Contraseña",
7
5
  "refreshInterval": "Intervalo de actualización (minutos)",
8
6
  "username": "Nombre de usuario",
9
7
  "automaticRefreshEnabled": "Actualización automática habilitada",
10
8
  "adapterCommands": "Comandos para controlar el adaptador.",
11
- "manualRefresh": "Actualizar manual de dispositivos"
9
+ "manualRefresh": "Actualizar manual de dispositivos",
10
+ "appVersionFromAppStore": "Versión de la aplicación para API cargada desde App Store",
11
+ "useAppVersionFromAppStore": "Use la versión de la aplicación cargada desde App Store"
12
12
  }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "appVersion": "Nouvelle version de l'application pour API",
3
- "appVersionFromGithub": "Version de l'application pour l'API chargée à partir du référentiel GitHub",
4
- "useAppVersionFromGithub": "Utilisez la version de l'application chargée depuis GitHub",
5
3
  "panasonic-comfort-cloud adapter settings": "Paramètres de l'adaptateur pour Panasonic-Comfort-Cloud",
6
4
  "password": "Mot de passe",
7
5
  "refreshInterval": "Intervalle d'actualisation (minutes)",
8
6
  "username": "Nom d'utilisateur",
9
7
  "automaticRefreshEnabled": "Actualisation automatique activée",
10
8
  "adapterCommands": "Commandes pour contrôler l'adaptateur",
11
- "manualRefresh": "Actualiser le manuel des appareils"
9
+ "manualRefresh": "Actualiser le manuel des appareils",
10
+ "appVersionFromAppStore": "Version de l'application pour l'API chargée de l'App Store",
11
+ "useAppVersionFromAppStore": "Utilisez la version de l'application chargée à partir de l'App Store"
12
12
  }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "appVersion": "Nuova versione dell'app per API",
3
- "appVersionFromGithub": "Versione dell'app per API caricata dal repository GitHub",
4
- "useAppVersionFromGithub": "Utilizza la versione dell'app caricata da GitHub",
5
3
  "panasonic-comfort-cloud adapter settings": "Impostazioni dell'adattatore per panasonic-comfort-cloud",
6
4
  "password": "Parola d'ordine",
7
5
  "refreshInterval": "Intervallo di aggiornamento (minuti)",
8
6
  "username": "Nome utente",
9
7
  "automaticRefreshEnabled": "Aggiornamento automatico abilitato",
10
8
  "adapterCommands": "Comandi per controllare l'adattatore",
11
- "manualRefresh": "Aggiorna il manuale dei dispositivi"
9
+ "manualRefresh": "Aggiorna il manuale dei dispositivi",
10
+ "appVersionFromAppStore": "Versione app per API caricata dall'App Store",
11
+ "useAppVersionFromAppStore": "Utilizzare la versione dell'app caricata dall'App Store"
12
12
  }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "appVersion": "Nieuwe versie van de app voor API",
3
- "appVersionFromGithub": "App-versie voor API geladen vanuit GitHub-repository",
4
- "useAppVersionFromGithub": "Gebruik de app-versie die is geladen vanuit GitHub",
5
3
  "panasonic-comfort-cloud adapter settings": "Adapterinstellingen voor panasonic-comfort-cloud",
6
4
  "password": "Wachtwoord",
7
5
  "refreshInterval": "Vernieuwingsinterval (minuten)",
8
6
  "username": "Gebruikersnaam",
9
7
  "automaticRefreshEnabled": "Automatisch vernieuwen ingeschakeld",
10
8
  "adapterCommands": "Commando's om de adapter te besturen",
11
- "manualRefresh": "Handleiding apparaten vernieuwen"
9
+ "manualRefresh": "Handleiding apparaten vernieuwen",
10
+ "appVersionFromAppStore": "App -versie voor API geladen vanuit App Store",
11
+ "useAppVersionFromAppStore": "Gebruik de app -versie geladen in App Store"
12
12
  }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "appVersion": "Nowa wersja aplikacji dla API",
3
- "appVersionFromGithub": "Wersja aplikacji dla API załadowana z repozytorium GitHub",
4
- "useAppVersionFromGithub": "Użyj wersji aplikacji pobranej z GitHub",
5
3
  "panasonic-comfort-cloud adapter settings": "Ustawienia adaptera dla panasonic-comfort-cloud",
6
4
  "password": "Hasło",
7
5
  "refreshInterval": "Interwał odświeżania (minuty)",
8
6
  "username": "Nazwa użytkownika",
9
7
  "automaticRefreshEnabled": "Włączono automatyczne odświeżanie",
10
8
  "adapterCommands": "Polecenia sterujące adapterem",
11
- "manualRefresh": "Odśwież instrukcję obsługi urządzeń"
9
+ "manualRefresh": "Odśwież instrukcję obsługi urządzeń",
10
+ "appVersionFromAppStore": "Wersja aplikacji dla interfejsu API załadowana z App Store",
11
+ "useAppVersionFromAppStore": "Użyj wersji aplikacji załadowanej z App Store"
12
12
  }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "appVersion": "Nova versão do aplicativo para API",
3
- "appVersionFromGithub": "Versão do aplicativo para API carregada do repositório GitHub",
4
- "useAppVersionFromGithub": "Use a versão do aplicativo carregada do GitHub",
5
3
  "panasonic-comfort-cloud adapter settings": "Configurações do adaptador para panasonic-comfort-cloud",
6
4
  "password": "Senha",
7
5
  "refreshInterval": "Intervalo de atualização (minutos)",
8
6
  "username": "Nome de usuário",
9
7
  "automaticRefreshEnabled": "Atualização automática ativada",
10
8
  "adapterCommands": "Comandos para controlar o adaptador",
11
- "manualRefresh": "Atualizar manual de dispositivos"
9
+ "manualRefresh": "Atualizar manual de dispositivos",
10
+ "appVersionFromAppStore": "Versão do aplicativo para API carregada na App Store",
11
+ "useAppVersionFromAppStore": "Use a versão do aplicativo carregada na App Store"
12
12
  }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "appVersion": "Новая версия приложения для API",
3
- "appVersionFromGithub": "Версия приложения для API загружена из репозитория GitHub.",
4
- "useAppVersionFromGithub": "Используйте версию приложения, загруженную с GitHub.",
5
3
  "panasonic-comfort-cloud adapter settings": "Настройки адаптера для panasonic-comfort-cloud",
6
4
  "password": "Пароль",
7
5
  "refreshInterval": "Интервал обновления (минуты)",
8
6
  "username": "Имя пользователя",
9
7
  "automaticRefreshEnabled": "Автоматическое обновление включено",
10
8
  "adapterCommands": "Команды для управления адаптером",
11
- "manualRefresh": "Обновить руководство по устройствам"
9
+ "manualRefresh": "Обновить руководство по устройствам",
10
+ "appVersionFromAppStore": "Версия приложения для API загружена в App Store",
11
+ "useAppVersionFromAppStore": "Используйте версию приложения, загруженную в App Store"
12
12
  }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "appVersion": "Нова версія програми для API",
3
- "appVersionFromGithub": "Версія програми для API, завантажена зі сховища GitHub",
4
- "useAppVersionFromGithub": "Використовуйте версію програми, завантажену з GitHub",
5
3
  "panasonic-comfort-cloud adapter settings": "Налаштування адаптера для panasonic-comfort-cloud",
6
4
  "password": "Пароль",
7
5
  "refreshInterval": "Інтервал оновлення (хв.)",
8
6
  "username": "Ім'я користувача",
9
7
  "automaticRefreshEnabled": "Автоматичне оновлення ввімкнено",
10
8
  "adapterCommands": "Команди для керування адаптером",
11
- "manualRefresh": "Оновити посібник з пристроїв"
9
+ "manualRefresh": "Оновити посібник з пристроїв",
10
+ "appVersionFromAppStore": "Версія додатка для API, завантажена з App Store",
11
+ "useAppVersionFromAppStore": "Використовуйте версію додатка, завантажену з App Store"
12
12
  }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "appVersion": "API 应用程序的新版本",
3
- "appVersionFromGithub": "从 GitHub 存储库加载的 API 的应用程序版本",
4
- "useAppVersionFromGithub": "使用从 GitHub 加载的应用程序版本",
5
3
  "panasonic-comfort-cloud adapter settings": "panasonic-comfort-cloud 的适配器设置",
6
4
  "password": "密码",
7
5
  "refreshInterval": "刷新间隔(分钟)",
8
6
  "username": "用户名",
9
7
  "automaticRefreshEnabled": "自动刷新启用",
10
8
  "adapterCommands": "控制适配器的命令",
11
- "manualRefresh": "刷新设备手册"
9
+ "manualRefresh": "刷新设备手册",
10
+ "appVersionFromAppStore": "从App Store加载的API的应用程序版本",
11
+ "useAppVersionFromAppStore": "使用从应用商店加载的应用程序版本"
12
12
  }
@@ -5,45 +5,66 @@
5
5
  "username": {
6
6
  "type": "text",
7
7
  "label": "username",
8
+ "xs": 12,
8
9
  "sm": 12,
9
- "md": 3
10
+ "md": 6,
11
+ "lg": 4,
12
+ "xl": 4
10
13
  },
11
14
  "password": {
12
15
  "type": "password",
13
16
  "label": "password",
17
+ "xs": 12,
14
18
  "sm": 12,
15
- "md": 3
19
+ "md": 6,
20
+ "lg": 4,
21
+ "xl": 4
16
22
  },
17
23
  "pollinterval": {
18
24
  "type": "number",
19
25
  "label": "refreshInterval",
26
+ "xs": 12,
20
27
  "sm": 12,
21
- "md": 3
28
+ "md": 6,
29
+ "lg": 4,
30
+ "xl": 4
22
31
  },
23
32
  "automaticRefreshEnabled": {
24
33
  "type": "checkbox",
25
34
  "label": "automaticRefreshEnabled",
35
+ "xs": 12,
26
36
  "sm": 12,
27
- "md": 3
37
+ "md": 6,
38
+ "lg": 4,
39
+ "xl": 4
28
40
  },
29
41
  "appVersion": {
30
42
  "type": "text",
31
43
  "label": "appVersion",
44
+ "xs": 12,
32
45
  "sm": 12,
33
- "md": 4
46
+ "md": 6,
47
+ "lg": 4,
48
+ "xl": 4
34
49
  },
35
- "appVersionFromGithub": {
50
+ "appVersionFromAppStore": {
36
51
  "type": "text",
37
- "label": "appVersionFromGithub",
52
+ "label": "appVersionFromAppStore",
38
53
  "readOnly": true,
54
+ "xs": 12,
39
55
  "sm": 12,
40
- "md": 4
56
+ "md": 6,
57
+ "lg": 4,
58
+ "xl": 4
41
59
  },
42
- "useAppVersionFromGithub": {
60
+ "useAppVersionFromAppStore": {
43
61
  "type": "checkbox",
44
- "label": "useAppVersionFromGithub",
62
+ "label": "useAppVersionFromAppStore",
63
+ "xs": 12,
45
64
  "sm": 12,
46
- "md": 4
65
+ "md": 6,
66
+ "lg": 4,
67
+ "xl": 4
47
68
  }
48
69
  }
49
70
  }
package/build/main.js CHANGED
@@ -42,17 +42,17 @@ class PanasonicComfortCloud extends utils.Adapter {
42
42
  this.subscribeStates("*");
43
43
  this.setState("info.connection", false, true);
44
44
  const loadedAppVersion = await this.getCurrentAppVersion();
45
- this.log.info(`Loaded app version from GitHub: ${loadedAppVersion}`);
46
- if (loadedAppVersion && this.trimAll((_c = this.config) == null ? void 0 : _c.appVersionFromGithub) != this.trimAll(loadedAppVersion)) {
47
- this.updateConfig({ appVersionFromGithub: this.trimAll(loadedAppVersion), password: this.encrypt((_d = this.config) == null ? void 0 : _d.password) });
45
+ this.log.info(`Loaded app version from App store: ${loadedAppVersion}`);
46
+ if (loadedAppVersion && this.trimAll((_c = this.config) == null ? void 0 : _c.appVersionFromAppStore) != this.trimAll(loadedAppVersion)) {
47
+ this.updateConfig({ appVersionFromAppStore: this.trimAll(loadedAppVersion), password: this.encrypt((_d = this.config) == null ? void 0 : _d.password) });
48
48
  return;
49
49
  }
50
50
  if (!((_e = this.config) == null ? void 0 : _e.username) || !((_f = this.config) == null ? void 0 : _f.password)) {
51
51
  this.log.error("Can not start without username or password. Please open config.");
52
52
  } else {
53
- if (((_g = this.config) == null ? void 0 : _g.appVersionFromGithub) != "" && ((_h = this.config) == null ? void 0 : _h.useAppVersionFromGithub)) {
54
- this.log.debug(`Use AppVersion from Github ${(_i = this.config) == null ? void 0 : _i.appVersionFromGithub}.`);
55
- this.comfortCloudClient = new import_panasonic_comfort_cloud_client.ComfortCloudClient((_j = this.config) == null ? void 0 : _j.appVersionFromGithub);
53
+ if (((_g = this.config) == null ? void 0 : _g.appVersionFromAppStore) != "" && ((_h = this.config) == null ? void 0 : _h.useAppVersionFromAppStore)) {
54
+ this.log.debug(`Use AppVersion from App Store ${(_i = this.config) == null ? void 0 : _i.appVersionFromAppStore}.`);
55
+ this.comfortCloudClient = new import_panasonic_comfort_cloud_client.ComfortCloudClient((_j = this.config) == null ? void 0 : _j.appVersionFromAppStore);
56
56
  } else if (((_k = this.config) == null ? void 0 : _k.appVersion) != "") {
57
57
  this.log.debug(`Use configured AppVersion ${(_l = this.config) == null ? void 0 : _l.appVersion}.`);
58
58
  this.comfortCloudClient = new import_panasonic_comfort_cloud_client.ComfortCloudClient((_m = this.config) == null ? void 0 : _m.appVersion);
@@ -489,11 +489,11 @@ class PanasonicComfortCloud extends utils.Adapter {
489
489
  }
490
490
  }
491
491
  async getCurrentAppVersion() {
492
- const response = await import_axios.default.get("https://raw.githubusercontent.com/marc2016/ioBroker.panasonic-comfort-cloud/master/.currentAppVersion");
492
+ const response = await import_axios.default.get("https://itunes.apple.com/lookup?id=1348640525");
493
493
  if (response.status !== 200)
494
494
  return "";
495
- const text = await response.data;
496
- return text;
495
+ const version = await response.data.results[0].version;
496
+ return version;
497
497
  }
498
498
  async handleDeviceError(deviceName, error) {
499
499
  this.log.debug(`Try to handle device error for ${deviceName}.`);
package/build/main.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/main.ts"],
4
- "sourcesContent": ["/*\n * Created with @iobroker/create-adapter v1.16.0\n */\n\n// The adapter-core module gives you access to the core ioBroker functions\n// you need to create an adapter\nimport * as utils from '@iobroker/adapter-core'\n\nimport {\n Device,\n Group,\n ComfortCloudClient,\n Parameters,\n Power,\n AirSwingLR,\n AirSwingUD,\n FanAutoMode,\n EcoMode,\n OperationMode,\n FanSpeed,\n TokenExpiredError,\n ServiceError,\n NanoeMode\n} from 'panasonic-comfort-cloud-client'\n\nimport * as _ from 'lodash'\nimport axios from 'axios'\n\nconst REFRESH_INTERVAL_IN_MINUTES_DEFAULT = 5\n\nclass PanasonicComfortCloud extends utils.Adapter {\n\n private comfortCloudClient: ComfortCloudClient = new ComfortCloudClient()\n\n private refreshTimeout: NodeJS.Timeout | undefined\n private refreshIntervalInMinutes = REFRESH_INTERVAL_IN_MINUTES_DEFAULT\n\n private readonlyStateNames: string[] = [] \n\n public constructor(options: Partial<utils.AdapterOptions> = {}) {\n super({\n ...options,\n name: 'panasonic-comfort-cloud',\n })\n\n this.on('ready', this.onReady.bind(this))\n this.on('objectChange', this.onObjectChange.bind(this))\n this.on('stateChange', this.onStateChange.bind(this))\n // this.on('message', this.onMessage.bind(this));\n this.on('unload', this.onUnload.bind(this))\n }\n\n /**\n * Is called when databases are connected and adapter received configuration.\n */\n private async onReady(): Promise<void> {\n this.refreshIntervalInMinutes = this.config?.refreshInterval ?? REFRESH_INTERVAL_IN_MINUTES_DEFAULT\n this.subscribeStates('*')\n\n this.setState('info.connection', false, true);\n\n const loadedAppVersion = await this.getCurrentAppVersion()\n this.log.info(`Loaded app version from GitHub: ${loadedAppVersion}`)\n if(loadedAppVersion && this.trimAll(this.config?.appVersionFromGithub) != this.trimAll(loadedAppVersion)) {\n this.updateConfig({ appVersionFromGithub: this.trimAll(loadedAppVersion), password: this.encrypt(this.config?.password) }) \n return\n }\n\n if(!this.config?.username || !this.config?.password) {\n this.log.error('Can not start without username or password. Please open config.')\n } else {\n if(this.config?.appVersionFromGithub != '' && this.config?.useAppVersionFromGithub)\n {\n this.log.debug(`Use AppVersion from Github ${this.config?.appVersionFromGithub}.`)\n this.comfortCloudClient = new ComfortCloudClient(this.config?.appVersionFromGithub)\n }\n else if(this.config?.appVersion != '')\n {\n this.log.debug(`Use configured AppVersion ${this.config?.appVersion}.`)\n this.comfortCloudClient = new ComfortCloudClient(this.config?.appVersion)\n }\n else\n {\n this.log.debug(`Use default AppVersion.`)\n this.comfortCloudClient = new ComfortCloudClient()\n }\n\n try {\n this.log.debug(`Try to login with username ${this.config.username}.`)\n await this.comfortCloudClient.login(\n this.config.username,\n this.config.password\n )\n this.log.info('Login successful.')\n this.setState('info.connection', true, true)\n this.log.debug('Create devices.')\n const groups = await this.comfortCloudClient.getGroups()\n await this.createDevices(groups)\n\n this.log.debug(`Automativ refresh is set to ${this.config?.automaticRefreshEnabled}.`)\n if(this.config?.automaticRefreshEnabled) {\n this.setupRefreshTimeout()\n }\n \n } catch (error) {\n await this.handleClientError(error)\n }\n }\n }\n\n private async refreshDeviceStates(device: Device): Promise<void> {\n this.log.debug(`Refresh device ${device.name} (${device.guid}).`)\n this.log.debug(`${device.name}: guid => ${device.guid}.`)\n \n this.log.debug(`${device.name}: operate => ${device.operate}.`)\n await this.setStateChangedAsync(\n `${device.name}.operate`,\n device.operate,\n true\n )\n this.log.debug(`${device.name}: temperatureSet => ${device.temperatureSet}.`)\n await this.setStateChangedAsync(\n `${device.name}.temperatureSet`,\n device.temperatureSet,\n true\n )\n this.log.debug(`${device.name}: insideTemperature => ${device.insideTemperature}.`)\n await this.setStateChangedAsync(\n `${device.name}.insideTemperature`,\n device.insideTemperature,\n true\n )\n this.log.debug(`${device.name}: outTemperature => ${device.outTemperature}.`)\n await this.setStateChangedAsync(\n `${device.name}.outTemperature`,\n device.outTemperature,\n true\n )\n this.log.debug(`${device.name}: airSwingLR => ${device.airSwingLR}.`)\n await this.setStateChangedAsync(\n `${device.name}.airSwingLR`,\n device.airSwingLR,\n true\n )\n this.log.debug(`${device.name}: airSwingUD => ${device.airSwingUD}.`)\n await this.setStateChangedAsync(\n `${device.name}.airSwingUD`,\n device.airSwingUD,\n true\n )\n this.log.debug(`${device.name}: fanAutoMode => ${device.fanAutoMode}.`)\n await this.setStateChangedAsync(\n `${device.name}.fanAutoMode`,\n device.fanAutoMode,\n true\n )\n this.log.debug(`${device.name}: ecoMode => ${device.ecoMode}.`)\n await this.setStateChangedAsync(\n `${device.name}.ecoMode`,\n device.ecoMode,\n true\n )\n this.log.debug(`${device.name}: operationMode => ${device.operationMode}.`)\n await this.setStateChangedAsync(\n `${device.name}.operationMode`,\n device.operationMode,\n true\n )\n this.log.debug(`${device.name}: fanSpeed => ${device.fanSpeed}.`)\n await this.setStateChangedAsync(\n `${device.name}.fanSpeed`,\n device.fanSpeed,\n true\n )\n this.log.debug(`${device.name}: actualNanoe => ${device.actualNanoe}.`)\n await this.setStateChangedAsync(\n `${device.name}.actualNanoe`,\n device.actualNanoe,\n true\n )\n await this.setStateChangedAsync(\n `${device.name}.connected`,\n true,\n true\n )\n this.log.debug(`Refresh device ${device.name} finished.`)\n }\n\n private async refreshDevice(guid: string, deviceName: string): Promise<void> {\n try {\n const device = await this.comfortCloudClient.getDevice(guid, deviceName)\n if (!device) {\n return\n }\n if (!device.name) {\n device.name = deviceName\n }\n await this.refreshDeviceStates(device)\n } catch (error) {\n await this.handleDeviceError(deviceName, error)\n }\n }\n\n private async refreshDevices(): Promise<void> {\n try {\n this.log.debug('Refresh all devices.')\n const groups = await this.comfortCloudClient.getGroups()\n this.setState('info.connection', true, true);\n const devices = _.flatMap(groups, g => g.devices)\n const deviceInfos = _.map(devices, d => { return{guid: d.guid, name: d.name}})\n await Promise.all(deviceInfos.map(async (deviceInfo) => {\n try {\n const device = await this.comfortCloudClient.getDevice(deviceInfo.guid, deviceInfo.name)\n if(device != null) {\n device.name = deviceInfo.name\n device.guid = deviceInfo.guid\n await this.refreshDeviceStates(device)\n }\n } catch (error) {\n await this.handleDeviceError(deviceInfo.name, error)\n }\n }))\n } catch (error) {\n await this.handleClientError(error)\n }\n }\n\n private async createDevices(groups: Array<Group>): Promise<void> {\n const devicesFromService = _.flatMap(groups, g => g.devices)\n const deviceInfos = _.map(devicesFromService, d => { return {guid: d.guid, name: d.name}})\n await Promise.all(deviceInfos.map(async (deviceInfo) => {\n this.log.debug(`Device info from group ${deviceInfo.guid}, ${deviceInfo.name}.`)\n let device: Device | null = null\n try {\n device = await this.comfortCloudClient.getDevice(deviceInfo.guid, deviceInfo.name)\n } catch(error) {\n await this.handleDeviceError(deviceInfo.name, error)\n return\n }\n \n if(device != null) {\n this.createDevice(deviceInfo.name)\n this.createState(\n deviceInfo.name,\n '',\n 'guid',\n { role: 'info.address', write: false, def: deviceInfo.guid, type: 'string' },\n undefined\n )\n this.readonlyStateNames.push('guid')\n\n this.createState(\n deviceInfo.name,\n '',\n 'operate',\n {\n role: 'switch.power',\n states: { 0: Power[0], 1: Power[1] },\n write: true,\n def: device.operate,\n type: 'number',\n },\n undefined\n )\n this.createState(\n deviceInfo.name,\n '',\n 'temperatureSet',\n {\n role: 'level.temperature',\n write: true,\n def: device.temperatureSet,\n type: 'number',\n },\n undefined\n )\n this.createState(\n deviceInfo.name,\n '',\n 'insideTemperature',\n {\n role: 'level.temperature',\n write: false,\n def: device.insideTemperature,\n type: 'number',\n },\n undefined\n )\n this.readonlyStateNames.push('insideTemperature')\n\n this.createState(\n deviceInfo.name,\n '',\n 'outTemperature',\n {\n role: 'level.temperature',\n write: false,\n def: device.outTemperature,\n type: 'number',\n },\n undefined\n )\n this.readonlyStateNames.push('outTemperature')\n\n this.createState(\n deviceInfo.name,\n '',\n 'airSwingLR',\n {\n role: 'state',\n states: {\n 0: AirSwingLR[0],\n 1: AirSwingLR[1],\n 2: AirSwingLR[2],\n 3: AirSwingLR[3],\n 4: AirSwingLR[4],\n },\n write: true,\n def: device.airSwingLR,\n type: 'number',\n },\n undefined\n )\n this.createState(\n deviceInfo.name,\n '',\n 'airSwingUD',\n {\n role: 'state',\n states: {\n 0: AirSwingUD[0],\n 1: AirSwingUD[1],\n 2: AirSwingUD[2],\n 3: AirSwingUD[3],\n 4: AirSwingUD[4],\n },\n write: true,\n def: device.airSwingUD,\n type: 'number',\n },\n undefined\n )\n this.createState(\n deviceInfo.name,\n '',\n 'fanAutoMode',\n {\n role: 'state',\n states: {\n 0: FanAutoMode[0],\n 1: FanAutoMode[1],\n 2: FanAutoMode[2],\n 3: FanAutoMode[3],\n },\n write: true,\n def: device.fanAutoMode,\n type: 'number',\n },\n undefined\n )\n this.createState(\n deviceInfo.name,\n '',\n 'ecoMode',\n {\n role: 'state',\n states: { 0: EcoMode[0], 1: EcoMode[1], 2: EcoMode[2] },\n write: true,\n def: device.ecoMode,\n type: 'number',\n },\n undefined\n )\n this.createState(\n deviceInfo.name,\n '',\n 'operationMode',\n {\n role: 'state',\n states: {\n 0: OperationMode[0],\n 1: OperationMode[1],\n 2: OperationMode[2],\n 3: OperationMode[3],\n 4: OperationMode[4],\n },\n write: true,\n def: device.operationMode,\n type: 'number',\n },\n undefined\n )\n this.createState(\n deviceInfo.name,\n '',\n 'fanSpeed',\n {\n role: 'state',\n states: {\n 0: FanSpeed[0],\n 1: FanSpeed[1],\n 2: FanSpeed[2],\n 3: FanSpeed[3],\n 4: FanSpeed[4],\n 5: FanSpeed[5],\n },\n write: true,\n def: device.fanSpeed,\n type: 'number',\n },\n undefined\n )\n this.createState(\n deviceInfo.name,\n '',\n 'actualNanoe',\n {\n role: 'state',\n states: {\n 0: NanoeMode[0],\n 1: NanoeMode[1],\n 2: NanoeMode[2],\n 3: NanoeMode[3],\n 4: NanoeMode[4],\n },\n write: true,\n def: device.actualNanoe,\n type: 'number',\n },\n undefined\n )\n this.createState(\n deviceInfo.name,\n '',\n 'connected',\n { role: 'state', read: true, write: false, def: false, type: 'boolean' },\n undefined,\n )\n\n this.log.info(`Device ${deviceInfo.name} created.`)\n }\n }));\n this.log.debug('Device creation completed.')\n }\n\n private async updateDevice(\n deviceName: string,\n stateName: string,\n state: ioBroker.State\n ): Promise<void> {\n if(this.readonlyStateNames.includes(stateName)) {\n return\n }\n if (!state.ack) {\n const stateObj = await this.getObjectAsync(`${deviceName}.${stateName}`)\n const stateCommon = stateObj?.common as ioBroker.StateCommon\n if(stateCommon?.write == false) {\n return\n }\n\n const guidState = await this.getStateAsync(`${deviceName}.guid`)\n \n this.log.debug(\n `Update device guid=${guidState?.val} state=${stateName}`\n )\n const parameters: Parameters = {}\n parameters[stateName] = state.val\n if (!guidState?.val) {\n return\n }\n try {\n this.log.debug(`Set device parameter ${JSON.stringify(parameters)} for device ${guidState?.val}`)\n await this.comfortCloudClient.setParameters(\n guidState?.val as string,\n parameters\n )\n this.log.debug(`Refresh device ${deviceName}`)\n await this.refreshDevice(guidState?.val as string, deviceName)\n } catch (error) {\n await this.handleClientError(error)\n }\n }\n }\n\n /**\n * Is called when adapter shuts down - callback has to be called under any circumstances!\n */\n private onUnload(callback: () => void): void {\n try {\n if(this.refreshTimeout)\n clearTimeout(this.refreshTimeout)\n\n this.log.info('cleaned everything up...')\n callback()\n } catch (e) {\n callback()\n }\n }\n\n /**\n * Is called if a subscribed object changes\n */\n private onObjectChange(\n id: string,\n obj: ioBroker.Object | null | undefined\n ): void {\n if (obj) {\n // The object was changed\n this.log.info(`object ${id} changed: ${JSON.stringify(obj)}`)\n } else {\n // The object was deleted\n this.log.info(`object ${id} deleted`)\n }\n }\n\n /**\n * Is called if a subscribed state changes\n */\n private async onStateChange(\n id: string,\n state: ioBroker.State | null | undefined\n ): Promise<void> {\n if(!state || state.ack) {\n return\n }\n\n if(id.includes('.commands.')) {\n const elements = id.split('.')\n const stateName = elements[elements.length - 1]\n if(stateName == 'manualRefresh' && state.val) {\n try {\n await this.refreshDevices()\n await this.setStateAsync(id, state, true)\n } catch (error) {\n await this.handleClientError(error)\n }\n await this.setStateAsync(id, false, true)\n }\n }\n else if (!id.includes('.info.')) {\n const elements = id.split('.')\n const deviceName = elements[elements.length - 2]\n const stateName = elements[elements.length - 1]\n try {\n await this.updateDevice(deviceName, stateName, state) \n } catch (error) {\n await this.handleClientError(error)\n }\n \n // The state was changed\n this.log.info(\n `state ${id} changed: ${state.val} (ack = ${state.ack})`\n )\n }\n }\n\n private async getCurrentAppVersion() : Promise<string> {\n const response = await axios.get('https://raw.githubusercontent.com/marc2016/ioBroker.panasonic-comfort-cloud/master/.currentAppVersion')\n if(response.status !== 200)\n return ''\n const text = await response.data\n return text\n }\n\n private async handleDeviceError(deviceName: string, error: unknown): Promise<void> {\n this.log.debug(`Try to handle device error for ${deviceName}.`)\n\n await this.setStateChangedAsync(\n `${deviceName}.connected`,\n false,\n true\n )\n \n if (error instanceof ServiceError) {\n this.log.error(\n `Service error when connecting to device ${deviceName}: ${error.message}. Code=${error.code}. Stack: ${error.stack}`\n )\n } else if (error instanceof Error){\n this.log.error(`Unknown error when connecting to device ${deviceName}: ${error}. Stack: ${error.stack}`)\n }\n }\n\n private async handleClientError(error: unknown): Promise<void> {\n this.log.debug('Try to handle error.')\n \n if (error instanceof TokenExpiredError) {\n this.log.info(\n `Token of comfort cloud client expired. Trying to login again. Code=${error.code}. Stack: ${error.stack}`\n )\n this.setState('info.connection', false, true);\n await this.comfortCloudClient.login(\n this.config.username,\n this.config.password\n )\n this.setState('info.connection', true, true);\n this.log.info('Login successful.')\n } else if (error instanceof ServiceError) {\n this.setState('info.connection', false, true);\n this.log.error(\n `Service error: ${error.message}. Code=${error.code}. Stack: ${error.stack}`\n )\n } else if (error instanceof Error){\n this.log.error(`Unknown error: ${error}. Stack: ${error.stack}`)\n }\n }\n\n private setupRefreshTimeout(): void {\n this.log.debug('setupRefreshTimeout')\n const refreshIntervalInMilliseconds = this.refreshIntervalInMinutes * 60 * 1000\n this.log.debug(`refreshIntervalInMilliseconds=${refreshIntervalInMilliseconds}`)\n this.refreshTimeout = setTimeout(this.refreshTimeoutFunc.bind(this), refreshIntervalInMilliseconds);\n }\n\n private async refreshTimeoutFunc(): Promise<void> {\n this.log.debug(`refreshTimeoutFunc started.`)\n try {\n await this.refreshDevices()\n this.setupRefreshTimeout()\n } catch (error) {\n await this.handleClientError(error)\n }\n \n }\n\n private trimAll(text: string): string {\n const newText = text.trim().replace(/(\\r\\n|\\n|\\r)/gm, '');\n return newText\n }\n}\n\nif (module.parent) {\n // Export the constructor in compact mode\n module.exports = (options: Partial<utils.AdapterOptions> | undefined) =>\n new PanasonicComfortCloud(options)\n} else {\n // otherwise start the instance directly\n (() => new PanasonicComfortCloud())()\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/*\n * Created with @iobroker/create-adapter v1.16.0\n */\n\n// The adapter-core module gives you access to the core ioBroker functions\n// you need to create an adapter\nimport * as utils from '@iobroker/adapter-core'\n\nimport {\n Device,\n Group,\n ComfortCloudClient,\n Parameters,\n Power,\n AirSwingLR,\n AirSwingUD,\n FanAutoMode,\n EcoMode,\n OperationMode,\n FanSpeed,\n TokenExpiredError,\n ServiceError,\n NanoeMode\n} from 'panasonic-comfort-cloud-client'\n\nimport * as _ from 'lodash'\nimport axios from 'axios'\n\nconst REFRESH_INTERVAL_IN_MINUTES_DEFAULT = 5\n\nclass PanasonicComfortCloud extends utils.Adapter {\n\n private comfortCloudClient: ComfortCloudClient = new ComfortCloudClient()\n\n private refreshTimeout: NodeJS.Timeout | undefined\n private refreshIntervalInMinutes = REFRESH_INTERVAL_IN_MINUTES_DEFAULT\n\n private readonlyStateNames: string[] = [] \n\n public constructor(options: Partial<utils.AdapterOptions> = {}) {\n super({\n ...options,\n name: 'panasonic-comfort-cloud',\n })\n\n this.on('ready', this.onReady.bind(this))\n this.on('objectChange', this.onObjectChange.bind(this))\n this.on('stateChange', this.onStateChange.bind(this))\n // this.on('message', this.onMessage.bind(this));\n this.on('unload', this.onUnload.bind(this))\n }\n\n /**\n * Is called when databases are connected and adapter received configuration.\n */\n private async onReady(): Promise<void> {\n this.refreshIntervalInMinutes = this.config?.refreshInterval ?? REFRESH_INTERVAL_IN_MINUTES_DEFAULT\n this.subscribeStates('*')\n\n this.setState('info.connection', false, true);\n\n const loadedAppVersion = await this.getCurrentAppVersion()\n this.log.info(`Loaded app version from App store: ${loadedAppVersion}`)\n if(loadedAppVersion && this.trimAll(this.config?.appVersionFromAppStore) != this.trimAll(loadedAppVersion)) {\n this.updateConfig({ appVersionFromAppStore: this.trimAll(loadedAppVersion), password: this.encrypt(this.config?.password) }) \n return\n }\n\n if(!this.config?.username || !this.config?.password) {\n this.log.error('Can not start without username or password. Please open config.')\n } else {\n if(this.config?.appVersionFromAppStore != '' && this.config?.useAppVersionFromAppStore)\n {\n this.log.debug(`Use AppVersion from App Store ${this.config?.appVersionFromAppStore}.`)\n this.comfortCloudClient = new ComfortCloudClient(this.config?.appVersionFromAppStore)\n }\n else if(this.config?.appVersion != '')\n {\n this.log.debug(`Use configured AppVersion ${this.config?.appVersion}.`)\n this.comfortCloudClient = new ComfortCloudClient(this.config?.appVersion)\n }\n else\n {\n this.log.debug(`Use default AppVersion.`)\n this.comfortCloudClient = new ComfortCloudClient()\n }\n\n try {\n this.log.debug(`Try to login with username ${this.config.username}.`)\n await this.comfortCloudClient.login(\n this.config.username,\n this.config.password\n )\n this.log.info('Login successful.')\n this.setState('info.connection', true, true)\n this.log.debug('Create devices.')\n const groups = await this.comfortCloudClient.getGroups()\n await this.createDevices(groups)\n\n this.log.debug(`Automativ refresh is set to ${this.config?.automaticRefreshEnabled}.`)\n if(this.config?.automaticRefreshEnabled) {\n this.setupRefreshTimeout()\n }\n \n } catch (error) {\n await this.handleClientError(error)\n }\n }\n }\n\n private async refreshDeviceStates(device: Device): Promise<void> {\n this.log.debug(`Refresh device ${device.name} (${device.guid}).`)\n this.log.debug(`${device.name}: guid => ${device.guid}.`)\n \n this.log.debug(`${device.name}: operate => ${device.operate}.`)\n await this.setStateChangedAsync(\n `${device.name}.operate`,\n device.operate,\n true\n )\n this.log.debug(`${device.name}: temperatureSet => ${device.temperatureSet}.`)\n await this.setStateChangedAsync(\n `${device.name}.temperatureSet`,\n device.temperatureSet,\n true\n )\n this.log.debug(`${device.name}: insideTemperature => ${device.insideTemperature}.`)\n await this.setStateChangedAsync(\n `${device.name}.insideTemperature`,\n device.insideTemperature,\n true\n )\n this.log.debug(`${device.name}: outTemperature => ${device.outTemperature}.`)\n await this.setStateChangedAsync(\n `${device.name}.outTemperature`,\n device.outTemperature,\n true\n )\n this.log.debug(`${device.name}: airSwingLR => ${device.airSwingLR}.`)\n await this.setStateChangedAsync(\n `${device.name}.airSwingLR`,\n device.airSwingLR,\n true\n )\n this.log.debug(`${device.name}: airSwingUD => ${device.airSwingUD}.`)\n await this.setStateChangedAsync(\n `${device.name}.airSwingUD`,\n device.airSwingUD,\n true\n )\n this.log.debug(`${device.name}: fanAutoMode => ${device.fanAutoMode}.`)\n await this.setStateChangedAsync(\n `${device.name}.fanAutoMode`,\n device.fanAutoMode,\n true\n )\n this.log.debug(`${device.name}: ecoMode => ${device.ecoMode}.`)\n await this.setStateChangedAsync(\n `${device.name}.ecoMode`,\n device.ecoMode,\n true\n )\n this.log.debug(`${device.name}: operationMode => ${device.operationMode}.`)\n await this.setStateChangedAsync(\n `${device.name}.operationMode`,\n device.operationMode,\n true\n )\n this.log.debug(`${device.name}: fanSpeed => ${device.fanSpeed}.`)\n await this.setStateChangedAsync(\n `${device.name}.fanSpeed`,\n device.fanSpeed,\n true\n )\n this.log.debug(`${device.name}: actualNanoe => ${device.actualNanoe}.`)\n await this.setStateChangedAsync(\n `${device.name}.actualNanoe`,\n device.actualNanoe,\n true\n )\n await this.setStateChangedAsync(\n `${device.name}.connected`,\n true,\n true\n )\n this.log.debug(`Refresh device ${device.name} finished.`)\n }\n\n private async refreshDevice(guid: string, deviceName: string): Promise<void> {\n try {\n const device = await this.comfortCloudClient.getDevice(guid, deviceName)\n if (!device) {\n return\n }\n if (!device.name) {\n device.name = deviceName\n }\n await this.refreshDeviceStates(device)\n } catch (error) {\n await this.handleDeviceError(deviceName, error)\n }\n }\n\n private async refreshDevices(): Promise<void> {\n try {\n this.log.debug('Refresh all devices.')\n const groups = await this.comfortCloudClient.getGroups()\n this.setState('info.connection', true, true);\n const devices = _.flatMap(groups, g => g.devices)\n const deviceInfos = _.map(devices, d => { return{guid: d.guid, name: d.name}})\n await Promise.all(deviceInfos.map(async (deviceInfo) => {\n try {\n const device = await this.comfortCloudClient.getDevice(deviceInfo.guid, deviceInfo.name)\n if(device != null) {\n device.name = deviceInfo.name\n device.guid = deviceInfo.guid\n await this.refreshDeviceStates(device)\n }\n } catch (error) {\n await this.handleDeviceError(deviceInfo.name, error)\n }\n }))\n } catch (error) {\n await this.handleClientError(error)\n }\n }\n\n private async createDevices(groups: Array<Group>): Promise<void> {\n const devicesFromService = _.flatMap(groups, g => g.devices)\n const deviceInfos = _.map(devicesFromService, d => { return {guid: d.guid, name: d.name}})\n await Promise.all(deviceInfos.map(async (deviceInfo) => {\n this.log.debug(`Device info from group ${deviceInfo.guid}, ${deviceInfo.name}.`)\n let device: Device | null = null\n try {\n device = await this.comfortCloudClient.getDevice(deviceInfo.guid, deviceInfo.name)\n } catch(error) {\n await this.handleDeviceError(deviceInfo.name, error)\n return\n }\n \n if(device != null) {\n this.createDevice(deviceInfo.name)\n this.createState(\n deviceInfo.name,\n '',\n 'guid',\n { role: 'info.address', write: false, def: deviceInfo.guid, type: 'string' },\n undefined\n )\n this.readonlyStateNames.push('guid')\n\n this.createState(\n deviceInfo.name,\n '',\n 'operate',\n {\n role: 'switch.power',\n states: { 0: Power[0], 1: Power[1] },\n write: true,\n def: device.operate,\n type: 'number',\n },\n undefined\n )\n this.createState(\n deviceInfo.name,\n '',\n 'temperatureSet',\n {\n role: 'level.temperature',\n write: true,\n def: device.temperatureSet,\n type: 'number',\n },\n undefined\n )\n this.createState(\n deviceInfo.name,\n '',\n 'insideTemperature',\n {\n role: 'level.temperature',\n write: false,\n def: device.insideTemperature,\n type: 'number',\n },\n undefined\n )\n this.readonlyStateNames.push('insideTemperature')\n\n this.createState(\n deviceInfo.name,\n '',\n 'outTemperature',\n {\n role: 'level.temperature',\n write: false,\n def: device.outTemperature,\n type: 'number',\n },\n undefined\n )\n this.readonlyStateNames.push('outTemperature')\n\n this.createState(\n deviceInfo.name,\n '',\n 'airSwingLR',\n {\n role: 'state',\n states: {\n 0: AirSwingLR[0],\n 1: AirSwingLR[1],\n 2: AirSwingLR[2],\n 3: AirSwingLR[3],\n 4: AirSwingLR[4],\n },\n write: true,\n def: device.airSwingLR,\n type: 'number',\n },\n undefined\n )\n this.createState(\n deviceInfo.name,\n '',\n 'airSwingUD',\n {\n role: 'state',\n states: {\n 0: AirSwingUD[0],\n 1: AirSwingUD[1],\n 2: AirSwingUD[2],\n 3: AirSwingUD[3],\n 4: AirSwingUD[4],\n },\n write: true,\n def: device.airSwingUD,\n type: 'number',\n },\n undefined\n )\n this.createState(\n deviceInfo.name,\n '',\n 'fanAutoMode',\n {\n role: 'state',\n states: {\n 0: FanAutoMode[0],\n 1: FanAutoMode[1],\n 2: FanAutoMode[2],\n 3: FanAutoMode[3],\n },\n write: true,\n def: device.fanAutoMode,\n type: 'number',\n },\n undefined\n )\n this.createState(\n deviceInfo.name,\n '',\n 'ecoMode',\n {\n role: 'state',\n states: { 0: EcoMode[0], 1: EcoMode[1], 2: EcoMode[2] },\n write: true,\n def: device.ecoMode,\n type: 'number',\n },\n undefined\n )\n this.createState(\n deviceInfo.name,\n '',\n 'operationMode',\n {\n role: 'state',\n states: {\n 0: OperationMode[0],\n 1: OperationMode[1],\n 2: OperationMode[2],\n 3: OperationMode[3],\n 4: OperationMode[4],\n },\n write: true,\n def: device.operationMode,\n type: 'number',\n },\n undefined\n )\n this.createState(\n deviceInfo.name,\n '',\n 'fanSpeed',\n {\n role: 'state',\n states: {\n 0: FanSpeed[0],\n 1: FanSpeed[1],\n 2: FanSpeed[2],\n 3: FanSpeed[3],\n 4: FanSpeed[4],\n 5: FanSpeed[5],\n },\n write: true,\n def: device.fanSpeed,\n type: 'number',\n },\n undefined\n )\n this.createState(\n deviceInfo.name,\n '',\n 'actualNanoe',\n {\n role: 'state',\n states: {\n 0: NanoeMode[0],\n 1: NanoeMode[1],\n 2: NanoeMode[2],\n 3: NanoeMode[3],\n 4: NanoeMode[4],\n },\n write: true,\n def: device.actualNanoe,\n type: 'number',\n },\n undefined\n )\n this.createState(\n deviceInfo.name,\n '',\n 'connected',\n { role: 'state', read: true, write: false, def: false, type: 'boolean' },\n undefined,\n )\n\n this.log.info(`Device ${deviceInfo.name} created.`)\n }\n }));\n this.log.debug('Device creation completed.')\n }\n\n private async updateDevice(\n deviceName: string,\n stateName: string,\n state: ioBroker.State\n ): Promise<void> {\n if(this.readonlyStateNames.includes(stateName)) {\n return\n }\n if (!state.ack) {\n const stateObj = await this.getObjectAsync(`${deviceName}.${stateName}`)\n const stateCommon = stateObj?.common as ioBroker.StateCommon\n if(stateCommon?.write == false) {\n return\n }\n\n const guidState = await this.getStateAsync(`${deviceName}.guid`)\n \n this.log.debug(\n `Update device guid=${guidState?.val} state=${stateName}`\n )\n const parameters: Parameters = {}\n parameters[stateName] = state.val\n if (!guidState?.val) {\n return\n }\n try {\n this.log.debug(`Set device parameter ${JSON.stringify(parameters)} for device ${guidState?.val}`)\n await this.comfortCloudClient.setParameters(\n guidState?.val as string,\n parameters\n )\n this.log.debug(`Refresh device ${deviceName}`)\n await this.refreshDevice(guidState?.val as string, deviceName)\n } catch (error) {\n await this.handleClientError(error)\n }\n }\n }\n\n /**\n * Is called when adapter shuts down - callback has to be called under any circumstances!\n */\n private onUnload(callback: () => void): void {\n try {\n if(this.refreshTimeout)\n clearTimeout(this.refreshTimeout)\n\n this.log.info('cleaned everything up...')\n callback()\n } catch (e) {\n callback()\n }\n }\n\n /**\n * Is called if a subscribed object changes\n */\n private onObjectChange(\n id: string,\n obj: ioBroker.Object | null | undefined\n ): void {\n if (obj) {\n // The object was changed\n this.log.info(`object ${id} changed: ${JSON.stringify(obj)}`)\n } else {\n // The object was deleted\n this.log.info(`object ${id} deleted`)\n }\n }\n\n /**\n * Is called if a subscribed state changes\n */\n private async onStateChange(\n id: string,\n state: ioBroker.State | null | undefined\n ): Promise<void> {\n if(!state || state.ack) {\n return\n }\n\n if(id.includes('.commands.')) {\n const elements = id.split('.')\n const stateName = elements[elements.length - 1]\n if(stateName == 'manualRefresh' && state.val) {\n try {\n await this.refreshDevices()\n await this.setStateAsync(id, state, true)\n } catch (error) {\n await this.handleClientError(error)\n }\n await this.setStateAsync(id, false, true)\n }\n }\n else if (!id.includes('.info.')) {\n const elements = id.split('.')\n const deviceName = elements[elements.length - 2]\n const stateName = elements[elements.length - 1]\n try {\n await this.updateDevice(deviceName, stateName, state) \n } catch (error) {\n await this.handleClientError(error)\n }\n \n // The state was changed\n this.log.info(\n `state ${id} changed: ${state.val} (ack = ${state.ack})`\n )\n }\n }\n\n private async getCurrentAppVersion() : Promise<string> {\n const response = await axios.get('https://itunes.apple.com/lookup?id=1348640525')\n if(response.status !== 200)\n return ''\n const version = await response.data.results[0].version\n return version\n }\n\n private async handleDeviceError(deviceName: string, error: unknown): Promise<void> {\n this.log.debug(`Try to handle device error for ${deviceName}.`)\n\n await this.setStateChangedAsync(\n `${deviceName}.connected`,\n false,\n true\n )\n \n if (error instanceof ServiceError) {\n this.log.error(\n `Service error when connecting to device ${deviceName}: ${error.message}. Code=${error.code}. Stack: ${error.stack}`\n )\n } else if (error instanceof Error){\n this.log.error(`Unknown error when connecting to device ${deviceName}: ${error}. Stack: ${error.stack}`)\n }\n }\n\n private async handleClientError(error: unknown): Promise<void> {\n this.log.debug('Try to handle error.')\n \n if (error instanceof TokenExpiredError) {\n this.log.info(\n `Token of comfort cloud client expired. Trying to login again. Code=${error.code}. Stack: ${error.stack}`\n )\n this.setState('info.connection', false, true);\n await this.comfortCloudClient.login(\n this.config.username,\n this.config.password\n )\n this.setState('info.connection', true, true);\n this.log.info('Login successful.')\n } else if (error instanceof ServiceError) {\n this.setState('info.connection', false, true);\n this.log.error(\n `Service error: ${error.message}. Code=${error.code}. Stack: ${error.stack}`\n )\n } else if (error instanceof Error){\n this.log.error(`Unknown error: ${error}. Stack: ${error.stack}`)\n }\n }\n\n private setupRefreshTimeout(): void {\n this.log.debug('setupRefreshTimeout')\n const refreshIntervalInMilliseconds = this.refreshIntervalInMinutes * 60 * 1000\n this.log.debug(`refreshIntervalInMilliseconds=${refreshIntervalInMilliseconds}`)\n this.refreshTimeout = setTimeout(this.refreshTimeoutFunc.bind(this), refreshIntervalInMilliseconds);\n }\n\n private async refreshTimeoutFunc(): Promise<void> {\n this.log.debug(`refreshTimeoutFunc started.`)\n try {\n await this.refreshDevices()\n this.setupRefreshTimeout()\n } catch (error) {\n await this.handleClientError(error)\n }\n \n }\n\n private trimAll(text: string): string {\n const newText = text.trim().replace(/(\\r\\n|\\n|\\r)/gm, '');\n return newText\n }\n}\n\nif (module.parent) {\n // Export the constructor in compact mode\n module.exports = (options: Partial<utils.AdapterOptions> | undefined) =>\n new PanasonicComfortCloud(options)\n} else {\n // otherwise start the instance directly\n (() => new PanasonicComfortCloud())()\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["axios"]
7
7
  }
package/io-package.json CHANGED
@@ -1,8 +1,21 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "panasonic-comfort-cloud",
4
- "version": "3.0.3",
4
+ "version": "3.1.0",
5
5
  "news": {
6
+ "3.1.0": {
7
+ "en": "read app version from App Store.",
8
+ "de": "lesen Sie die App-Version von App Store.",
9
+ "ru": "прочитайте версию приложения из App Store.",
10
+ "pt": "leia a versão do aplicativo da App Store.",
11
+ "nl": "appversie lezen uit App Store.",
12
+ "fr": "lire la version de l'application de l'App Store.",
13
+ "it": "leggere la versione app da App Store.",
14
+ "es": "leer versión de App Store.",
15
+ "pl": "czytaj wersję aplikacji z App Store.",
16
+ "uk": "читати версію програми з App Store.",
17
+ "zh-cn": "从 App Store 读取应用程序版本."
18
+ },
6
19
  "3.0.3": {
7
20
  "en": "panasonic-comfort-cloud-client updated to new version. CFC generator for header added.",
8
21
  "de": "panasonic-comfort-cloud-client auf neue Version aktualisiert. CFC-Generator für Header hinzugefügt.",
@@ -80,19 +93,6 @@
80
93
  "pl": "Wykorzystywany ładunek z Github.",
81
94
  "uk": "Виправлено навантаження AppVersion від Github.",
82
95
  "zh-cn": "来自吉特布的固定载荷。."
83
- },
84
- "2.2.3": {
85
- "en": "Added support for admin 5 UI (jsonConfig).\nUpdated packages.\nFixed translation.",
86
- "de": "Unterstützung für admin 5 UI (jsonConfig.).\nAktualisierte Pakete.\nBehobene Übersetzung.",
87
- "ru": "Добавлена поддержка admin 5 UI (jsonConfig.).\nОбновленные пакеты.\nФиксированный перевод.",
88
- "pt": "Adicionado suporte para admin 5 UI (jsonConfig.).\nPacotes atualizados.\nTradução fixa.",
89
- "nl": "Aangepast voor administratie 5 UI (jsonConfig).\nVerouderde pakketten.\nVertaald.",
90
- "fr": "Ajout du support pour admin 5 UI (jsonConfig.).\nDes paquets mis à jour.\nTraduction fixe.",
91
- "it": "Aggiunto supporto per admin 5 UI (jsonConfig.).\nPacchetti aggiornati.\nTraduzione fissa.",
92
- "es": "Apoyo añadido para admin 5 UI (jsonConfig.).\nPaquetes actualizados.\nTraducción fija.",
93
- "pl": "Administrowane wsparcie dla admin 5 UI (jsonConfig).\nZmodernizowane pakiety.\nTłumaczenie.",
94
- "uk": "Додано підтримку admin 5 UI (jsonConfig.).\nОновлені пакети.\nФіксований переклад.",
95
- "zh-cn": "增援5 UI(json Config).\n最新一揽子计划。.\n固定翻译。."
96
96
  }
97
97
  },
98
98
  "titleLang": {
@@ -148,7 +148,7 @@
148
148
  },
149
149
  "dependencies": [
150
150
  {
151
- "js-controller": ">=3.3.22"
151
+ "js-controller": ">=5.0.19"
152
152
  }
153
153
  ],
154
154
  "globalDependencies": [
@@ -163,8 +163,8 @@
163
163
  "refreshInterval": 5,
164
164
  "automaticRefreshEnabled": true,
165
165
  "appVersion": "",
166
- "appVersionFromGithub": "",
167
- "useAppVersionFromGithub": false
166
+ "appVersionFromAppStore": "",
167
+ "useAppVersionFromAppStore": true
168
168
  },
169
169
  "protectedNative": [
170
170
  "username",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.panasonic-comfort-cloud",
3
- "version": "3.0.3",
3
+ "version": "3.1.0",
4
4
  "description": "Adapter for Panasonic Comfort Cloud",
5
5
  "author": {
6
6
  "name": "marc",
@@ -9,7 +9,8 @@
9
9
  "homepage": "https://github.com/marc2016/ioBroker.panasonic-comfort-cloud",
10
10
  "license": "MIT",
11
11
  "keywords": [
12
- "air condition"
12
+ "air condition",
13
+ "ioBroker"
13
14
  ],
14
15
  "repository": {
15
16
  "type": "git",
@@ -19,16 +20,17 @@
19
20
  "node": ">=18"
20
21
  },
21
22
  "dependencies": {
22
- "@iobroker/adapter-core": "^3.1.6",
23
+ "@iobroker/adapter-core": "^3.2.2",
23
24
  "@types/lodash": "^4.14.202",
24
25
  "lodash": "^4.17.21",
25
- "panasonic-comfort-cloud-client": "2.0.3",
26
+ "panasonic-comfort-cloud-client": "^2.0.3",
26
27
  "ts-enum-util": "^4.0.2"
27
28
  },
28
29
  "devDependencies": {
29
30
  "@alcalzone/release-script": "^3.7.0",
30
31
  "@alcalzone/release-script-plugin-iobroker": "^3.7.0",
31
32
  "@alcalzone/release-script-plugin-license": "^3.7.0",
33
+ "@alcalzone/release-script-plugin-manual-review": "^3.7.0",
32
34
  "@iobroker/adapter-dev": "^1.2.0",
33
35
  "@iobroker/testing": "^4.1.3",
34
36
  "@tsconfig/node14": "^14.1.0",
package/admin/words.js DELETED
@@ -1,18 +0,0 @@
1
- /*global systemDictionary:true */
2
- /*
3
- +===================== DO NOT MODIFY ======================+
4
- | This file was generated by translate-adapter, please use |
5
- | `translate-adapter adminLanguages2words` to update it. |
6
- +===================== DO NOT MODIFY ======================+
7
- */
8
- 'use strict';
9
-
10
- systemDictionary = {
11
- "appVersion": { "en": "New version of the app for API", "de": "Neue Version der App für API", "ru": "Новая версия приложения для API", "pt": "Nova versão do app para API", "nl": "Nieuwe versie van de app voor API", "fr": "Nouvelle version de l'application pour l'API", "it": "Nuova versione dell'app per API", "es": "Nueva versión de la app para API", "pl": "Nowa wersja aplikacji dla API", "uk": "Нова версія програми для API", "zh-cn": "API 应用程序的新版本"},
12
- "appVersionFromGithub": { "en": "App version for API loaded from GitHub repository", "de": "App-Version für API aus dem GitHub-Repository geladen", "ru": "Версия приложения для API, загруженного из репозитория GitHub", "pt": "Versão do aplicativo para API carregada do repositório GitHub", "nl": "App-versie voor API geladen vanuit GitHub-repository", "fr": "Version de l'application pour l'API chargée à partir du référentiel GitHub", "it": "Versione dell'app per l'API caricata dal repository GitHub", "es": "Versión de la aplicación para la API cargada desde el repositorio de GitHub", "pl": "Wersja aplikacji dla API ładowana z repozytorium GitHub", "uk": "Версія програми для API, завантажена зі сховища GitHub", "zh-cn": "从 GitHub 存储库加载的 API 的应用程序版本"},
13
- "useAppVersionFromGithub": { "en": "Use the app version loaded from GitHub", "de": "Verwenden Sie die von GitHub geladene App-Version", "ru": "Используйте версию приложения, загруженную с GitHub", "pt": "Use a versão do aplicativo carregada do GitHub", "nl": "Gebruik de app-versie die is geladen vanuit GitHub", "fr": "Utiliser la version de l'application chargée depuis GitHub", "it": "Usa la versione dell'app caricata da GitHub", "es": "Use la versión de la aplicación cargada desde GitHub", "pl": "Użyj wersji aplikacji załadowanej z GitHub", "uk": "Використовуйте версію програми, завантажену з GitHub", "zh-cn": "使用从 GitHub 加载的应用程序版本"},
14
- "panasonic-comfort-cloud adapter settings": { "en": "Adapter settings for panasonic-comfort-cloud", "de": "Adaptereinstellungen für panasonic-comfort-cloud", "ru": "Настройки адаптера для panasonic-comfort-cloud", "pt": "Configurações do adaptador para panasonic-comfort-cloud", "nl": "Adapterinstellingen voor panasonic-comfort-cloud", "fr": "Paramètres de l'adaptateur pour panasonic-comfort-cloud", "it": "Impostazioni dell'adattatore per panasonic-comfort-cloud", "es": "Configuración del adaptador para panasonic-comfort-cloud", "pl": "Ustawienia adaptera dla panasonic-comfort-cloud", "uk": "Налаштування адаптера для panasonic-comfort-cloud", "zh-cn": "panasonic-comfort-cloud 适配器设置"},
15
- "password": { "en": "Password", "de": "Passwort", "ru": "Пароль", "pt": "Senha", "nl": "Wachtwoord", "fr": "Mot de passe", "it": "Parola d'ordine", "es": "Contraseña", "pl": "Hasło", "uk": "Пароль", "zh-cn": "密码"},
16
- "refreshInterval": { "en": "Refresh interval (m)", "de": "Aktualisierungsintervall (m)", "ru": "Интервал обновления (м)", "pt": "Intervalo de atualização (m)", "nl": "Verversingsinterval (m)", "fr": "Intervalle de rafraîchissement (m)", "it": "Intervallo di aggiornamento (m)", "es": "Intervalo de actualización (m)", "pl": "Interwał odświeżania (m)", "uk": "Інтервал оновлення (м)", "zh-cn": "刷新间隔(米)"},
17
- "username": { "en": "Username", "de": "Nutzername", "ru": "Имя пользователя", "pt": "Nome de usuário", "nl": "Gebruikersnaam", "fr": "Nom d'utilisateur", "it": "Nome utente", "es": "Nombre de usuario", "pl": "Nazwa użytkownika", "uk": "Ім'я користувача", "zh-cn": "用户名"},
18
- };