iobroker.panasonic-comfort-cloud 2.1.0 → 2.2.1

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/README.md CHANGED
@@ -1,6 +1,11 @@
1
- ![Logo](admin/panasonic-comfort-cloud.png)
2
1
  # ioBroker.panasonic-comfort-cloud
3
2
 
3
+ | :warning: WARNING |
4
+ |:---------------------------|
5
+ | New app version in adapter settings is 1.18.0 |
6
+
7
+ ![Logo](admin/panasonic-comfort-cloud.png)
8
+
4
9
  [![NPM version](http://img.shields.io/npm/v/iobroker.panasonic-comfort-cloud.svg)](https://www.npmjs.com/package/iobroker.panasonic-comfort-cloud)
5
10
  [![Downloads](https://img.shields.io/npm/dm/iobroker.panasonic-comfort-cloud.svg)](https://www.npmjs.com/package/iobroker.panasonic-comfort-cloud)
6
11
  [![Dependency Status](https://img.shields.io/david/marc2016/iobroker.panasonic-comfort-cloud.svg)](https://david-dm.org/marc2016/iobroker.panasonic-comfort-cloud)
@@ -18,31 +23,45 @@ To use the a adpter you need to enter your username and password in the configur
18
23
  With the method used, only one client can be logged on with the account at a time.
19
24
  It is recommended that a second account, for which the devices have been shared, is used.
20
25
 
21
-
22
26
  ## Changelog
27
+ ### 2.2.1 (2023-09-16)
28
+
29
+ * panasonic-comfort-cloud-client updated to new version. New headers added.
30
+
31
+ ### 2.2.0
32
+
33
+ * Added feature to automatically load the app version from GitHub.
23
34
 
24
35
  ### 2.1.0
36
+
25
37
  * Added app version to settings.
26
38
 
27
39
  ### 2.0.6
40
+
28
41
  * panasonic-comfort-cloud-client updated to new version. (appVersion changed again)
29
42
 
30
43
  ### 2.0.5
44
+
31
45
  * Translation for news added.
32
46
 
33
47
  ### 2.0.4
48
+
34
49
  * New version of dependencies installed.
35
50
 
36
51
  ### 2.0.3
52
+
37
53
  * panasonic-comfort-cloud-client updated to new version. (appVersion changed again)
38
54
 
39
55
  ### 2.0.2
56
+
40
57
  * panasonic-comfort-cloud-client updated to new version.
41
58
 
42
59
  ### 2.0.1
60
+
43
61
  * Changed the type of some states from string to number.
44
62
 
45
63
  ### 2.0.0
64
+
46
65
  * Added js-controller 3 dependency.
47
66
  * Added username and password to protectedNative and password to encryptedNative.
48
67
  * Added connection info.
@@ -50,36 +69,47 @@ It is recommended that a second account, for which the devices have been shared,
50
69
  * Fixes for async await pattern.
51
70
 
52
71
  ### 1.2.9
72
+
53
73
  * Error handling for get device added.
54
74
 
55
75
  ### 1.2.8
76
+
56
77
  * Fixed bug in Comfort Cloud client.
57
78
 
58
79
  ### 1.2.7
80
+
59
81
  * Comfort Cloud client updated.
60
82
 
61
83
  ### 1.2.6
84
+
62
85
  * Fixed bug that guid is null in device creation.
63
86
 
64
87
  ### 1.2.5
88
+
65
89
  * *Comfort Cloud client updated.
66
90
 
67
91
  ### 1.2.4
92
+
68
93
  * Fixed bug with undefined guid. Log messages added.
69
94
 
70
95
  ### 1.2.3
96
+
71
97
  * Set parameters only for writable states.
72
98
 
73
99
  ### 1.2.2
100
+
74
101
  * *Fixed error handling and added stack info.
75
102
 
76
103
  ### 1.2.1
104
+
77
105
  * Fixed bug in refesh device method.
78
106
 
79
107
  ### 1.2.0
108
+
80
109
  * States insideTemperature, outTemperature and Nanoe added.
81
110
 
82
111
  ## License
112
+
83
113
  MIT License
84
114
 
85
115
  Copyright (c) 2022 marc <marc@lammers.dev>
@@ -100,4 +130,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
100
130
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
101
131
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
102
132
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
103
- SOFTWARE.
133
+ SOFTWARE.
@@ -0,0 +1,9 @@
1
+ {
2
+ "appversion": "Neue Version der App für API",
3
+ "appVersionFromGithub": "App-Version für API aus dem GitHub-Repository geladen",
4
+ "useAppVersionFromGithub": "Verwenden Sie die von GitHub geladene App-Version",
5
+ "panasonic-comfort-cloud adapter settings": "Adaptereinstellungen für panasonic-comfort-cloud",
6
+ "password": "Passwort",
7
+ "refreshInterval": "Aktualisierungsintervall (m)",
8
+ "username": "Nutzername"
9
+ }
@@ -0,0 +1,9 @@
1
+ {
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",
5
+ "panasonic-comfort-cloud adapter settings": "Adapter settings for panasonic-comfort-cloud",
6
+ "password": "Password",
7
+ "refreshInterval": "Refresh interval (m)",
8
+ "username": "Username"
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "appversion": "Nueva versión de la app para API",
3
+ "appVersionFromGithub": "Versión de la aplicación para la API cargada desde el repositorio de GitHub",
4
+ "useAppVersionFromGithub": "Use la versión de la aplicación cargada desde GitHub",
5
+ "panasonic-comfort-cloud adapter settings": "Configuración del adaptador para panasonic-comfort-cloud",
6
+ "password": "Contraseña",
7
+ "refreshInterval": "Intervalo de actualización (m)",
8
+ "username": "Nombre de usuario"
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "appversion": "Nouvelle version de l'application pour l'API",
3
+ "appVersionFromGithub": "Version de l'application pour l'API chargée à partir du référentiel GitHub",
4
+ "useAppVersionFromGithub": "Utiliser la version de l'application chargée depuis GitHub",
5
+ "panasonic-comfort-cloud adapter settings": "Paramètres de l'adaptateur pour panasonic-comfort-cloud",
6
+ "password": "Mot de passe",
7
+ "refreshInterval": "Intervalle de rafraîchissement (m)",
8
+ "username": "Nom d'utilisateur"
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "appversion": "Nuova versione dell'app per API",
3
+ "appVersionFromGithub": "Versione dell'app per l'API caricata dal repository GitHub",
4
+ "useAppVersionFromGithub": "Usa la versione dell'app caricata da GitHub",
5
+ "panasonic-comfort-cloud adapter settings": "Impostazioni dell'adattatore per panasonic-comfort-cloud",
6
+ "password": "Parola d'ordine",
7
+ "refreshInterval": "Intervallo di aggiornamento (m)",
8
+ "username": "Nome utente"
9
+ }
@@ -0,0 +1,9 @@
1
+ {
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
+ "panasonic-comfort-cloud adapter settings": "Adapterinstellingen voor panasonic-comfort-cloud",
6
+ "password": "Wachtwoord",
7
+ "refreshInterval": "Verversingsinterval (m)",
8
+ "username": "Gebruikersnaam"
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "appversion": "Nowa wersja aplikacji dla API",
3
+ "appVersionFromGithub": "Wersja aplikacji dla API ładowana z repozytorium GitHub",
4
+ "useAppVersionFromGithub": "Użyj wersji aplikacji załadowanej z GitHub",
5
+ "panasonic-comfort-cloud adapter settings": "Ustawienia adaptera dla panasonic-comfort-cloud",
6
+ "password": "Hasło",
7
+ "refreshInterval": "Interwał odświeżania (m)",
8
+ "username": "Nazwa użytkownika"
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "appversion": "Nova versão do app 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
+ "panasonic-comfort-cloud adapter settings": "Configurações do adaptador para panasonic-comfort-cloud",
6
+ "password": "Senha",
7
+ "refreshInterval": "Intervalo de atualização (m)",
8
+ "username": "Nome de usuário"
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "appversion": "Новая версия приложения для API",
3
+ "appVersionFromGithub": "Версия приложения для API, загруженного из репозитория GitHub",
4
+ "useAppVersionFromGithub": "Используйте версию приложения, загруженную с GitHub",
5
+ "panasonic-comfort-cloud adapter settings": "Настройки адаптера для panasonic-comfort-cloud",
6
+ "password": "Пароль",
7
+ "refreshInterval": "Интервал обновления (м)",
8
+ "username": "Имя пользователя"
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "appversion": "Нова версія програми для API",
3
+ "appVersionFromGithub": "Версія програми для API, завантажена зі сховища GitHub",
4
+ "useAppVersionFromGithub": "Використовуйте версію програми, завантажену з GitHub",
5
+ "panasonic-comfort-cloud adapter settings": "Налаштування адаптера для panasonic-comfort-cloud",
6
+ "password": "Пароль",
7
+ "refreshInterval": "Інтервал оновлення (м)",
8
+ "username": "Ім'я користувача"
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "appversion": "API 应用程序的新版本",
3
+ "appVersionFromGithub": "从 GitHub 存储库加载的 API 的应用程序版本",
4
+ "useAppVersionFromGithub": "使用从 GitHub 加载的应用程序版本",
5
+ "panasonic-comfort-cloud adapter settings": "panasonic-comfort-cloud 适配器设置",
6
+ "password": "密码",
7
+ "refreshInterval": "刷新间隔(米)",
8
+ "username": "用户名"
9
+ }
@@ -2,30 +2,14 @@
2
2
  <head>
3
3
  <!-- Load ioBroker scripts and styles-->
4
4
  <link rel="stylesheet" type="text/css" href="../../css/adapter.css" />
5
- <link
6
- rel="stylesheet"
7
- type="text/css"
8
- href="../../lib/css/materialize.css"
9
- />
5
+ <link rel="stylesheet" type="text/css" href="../../lib/css/materialize.css" />
10
6
 
11
- <script
12
- type="text/javascript"
13
- src="../../lib/js/jquery-3.2.1.min.js"
14
- ></script>
15
- <script
16
- type="text/javascript"
17
- src="../../socket.io/socket.io.js"
18
- ></script>
7
+ <script type="text/javascript" src="../../lib/js/jquery-3.2.1.min.js"></script>
8
+ <script type="text/javascript" src="../../socket.io/socket.io.js"></script>
19
9
 
20
10
  <script type="text/javascript" src="../../js/translate.js"></script>
21
- <script
22
- type="text/javascript"
23
- src="../../lib/js/materialize.js"
24
- ></script>
25
- <script
26
- type="text/javascript"
27
- src="../../js/adapter-settings.js"
28
- ></script>
11
+ <script type="text/javascript" src="../../lib/js/materialize.js"></script>
12
+ <script type="text/javascript" src="../../js/adapter-settings.js"></script>
29
13
 
30
14
  <!-- Load our own files -->
31
15
  <link rel="stylesheet" type="text/css" href="style.css" />
@@ -35,29 +19,40 @@
35
19
  // This will be called by the admin adapter when the settings page loads
36
20
  function load(settings, onChange) {
37
21
  // example: select elements with id=key and class=value and insert value
38
- if (!settings) return
39
- $(".value").each(function () {
40
- var $key = $(this)
41
- var id = $key.attr("id")
42
- // do not call onChange direct, because onChange could expect some arguments
43
- $key.val(settings[id])
44
- .on("change", () => onChange())
45
- .on("keyup", () => onChange())
46
- })
47
- onChange(false)
22
+ if (!settings) return;
23
+ $('.value').each(function () {
24
+ var $key = $(this);
25
+ var id = $key.attr('id');
26
+ if ($key.attr('type') === 'checkbox') {
27
+ // do not call onChange direct, because onChange could expect some arguments
28
+ $key.prop('checked', settings[id]).on('change', () => onChange());
29
+ } else {
30
+ // do not call onChange direct, because onChange could expect some arguments
31
+ $key.val(settings[id])
32
+ .on('change', () => onChange())
33
+ .on('keyup', () => onChange());
34
+ }
35
+ });
36
+ onChange(false);
48
37
  // reinitialize all the Materialize labels on the page if you are dynamically adding inputs:
49
- if (M) M.updateTextFields()
38
+ if (M) M.updateTextFields();
50
39
  }
51
40
 
52
41
  // This will be called by the admin adapter when the user presses the save button
53
42
  function save(callback) {
54
43
  // example: select elements with class=value and build settings object
55
- var obj = {}
56
- $(".value").each(function () {
57
- var $this = $(this)
58
- obj[$this.attr("id")] = $this.val()
59
- })
60
- callback(obj)
44
+ var obj = {};
45
+ $('.value').each(function () {
46
+ var $this = $(this);
47
+ if ($this.attr('type') === 'checkbox') {
48
+ obj[$this.attr('id')] = $this.prop('checked');
49
+ } else if ($this.attr('type') === 'number') {
50
+ obj[$this.attr('id')] = parseFloat($this.val());
51
+ } else {
52
+ obj[$this.attr('id')] = $this.val();
53
+ }
54
+ });
55
+ callback(obj);
61
56
  }
62
57
  </script>
63
58
  </head>
@@ -94,23 +89,40 @@
94
89
  id="refreshInterval"
95
90
  class="value validate"
96
91
  />
97
- <label for="refreshInterval" class="translate">
98
- refreshInterval
99
- </label>
92
+ <label for="refreshInterval" class="translate">refreshInterval</label>
100
93
  </div>
101
94
  </div>
102
95
  <div class="row">
103
- <div class="col s6 input-field">
96
+ <div class="col s4 input-field">
104
97
  <input
105
- placeholder="1.16.0"
98
+ placeholder=""
106
99
  name="appVersion"
107
100
  type="text"
108
101
  id="appVersion"
109
102
  class="value validate"
110
103
  />
111
- <label for="appVersion" class="translate">
112
- appVersion
113
- </label>
104
+ <label for="appVersion" class="translate">appversion</label>
105
+ </div>
106
+ <div class="col s4 input-field">
107
+ <input
108
+ placeholder=""
109
+ name="appVersionFromGithub"
110
+ type="text"
111
+ id="appVersionFromGithub"
112
+ class="value validate"
113
+ disabled
114
+ />
115
+ <label for="appVersionFromGithub" class="translate">appVersionFromGithub</label>
116
+ </div>
117
+ <div class="col s4 input-field">
118
+ <input
119
+ placeholder=""
120
+ name="useAppVersionFromGithub"
121
+ type="checkbox"
122
+ id="useAppVersionFromGithub"
123
+ class="value"
124
+ />
125
+ <label for="useAppVersionFromGithub" class="translate">useAppVersionFromGithub</label>
114
126
  </div>
115
127
  </div>
116
128
  </div>
package/admin/words.js CHANGED
@@ -8,9 +8,11 @@
8
8
  'use strict';
9
9
 
10
10
  systemDictionary = {
11
- "appVersion": { "en": "Version of the app for API", "de": "Version der App für API", "ru": "Версия приложения для API", "pt": "Versão do app para API", "nl": "Versie van de app voor API", "fr": "Version de l'application pour l'API", "it": "Versione dell'app per API", "es": "Versión de la aplicación para API", "pl": "Wersja aplikacji dla API", "uk": "Версія програми для API", "zh-cn": "API 的应用程序版本"},
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 加载的应用程序版本"},
12
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 适配器设置"},
13
- "password": { "en": "Password", "de": "Passwort", "ru": "Пароль", "pt": "Senha", "nl": "Wachtwoord", "fr": "Mot de passe", "it": "Parola d'ordine", "es": "Clave", "pl": "Hasło", "uk": "Пароль", "zh-cn": "密码"},
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": "密码"},
14
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": "刷新间隔(米)"},
15
- "username": { "en": "Username", "de": "Nutzername", "ru": "Имя пользователя", "pt": "Nome do usuário", "nl": "Gebruikersnaam", "fr": "Nom d'utilisateur", "it": "Nome utente", "es": "Nombre de usuario", "pl": "Nazwa użytkownika", "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": "用户名"},
16
18
  };
package/build/main.js CHANGED
@@ -20,6 +20,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
20
20
  var utils = __toESM(require("@iobroker/adapter-core"));
21
21
  var import_panasonic_comfort_cloud_client = require("panasonic-comfort-cloud-client");
22
22
  var _ = __toESM(require("lodash"));
23
+ var import_axios = __toESM(require("axios"));
23
24
  const REFRESH_INTERVAL_IN_MINUTES_DEFAULT = 5;
24
25
  class PanasonicComfortCloud extends utils.Adapter {
25
26
  constructor(options = {}) {
@@ -36,17 +37,30 @@ class PanasonicComfortCloud extends utils.Adapter {
36
37
  this.on("unload", this.onUnload.bind(this));
37
38
  }
38
39
  async onReady() {
39
- var _a, _b, _c, _d, _e, _f;
40
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m;
40
41
  this.refreshIntervalInMinutes = (_b = (_a = this.config) == null ? void 0 : _a.refreshInterval) != null ? _b : REFRESH_INTERVAL_IN_MINUTES_DEFAULT;
41
42
  this.subscribeStates("*");
42
43
  this.setState("info.connection", false, true);
43
- if (!((_c = this.config) == null ? void 0 : _c.username) || !((_d = this.config) == null ? void 0 : _d.password)) {
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) });
48
+ return;
49
+ }
50
+ if (!((_e = this.config) == null ? void 0 : _e.username) || !((_f = this.config) == null ? void 0 : _f.password)) {
44
51
  this.log.error("Can not start without username or password. Please open config.");
45
52
  } else {
46
- if (((_e = this.config) == null ? void 0 : _e.appVersion) != "")
47
- this.comfortCloudClient = new import_panasonic_comfort_cloud_client.ComfortCloudClient((_f = this.config) == null ? void 0 : _f.appVersion);
48
- 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);
56
+ }
57
+ if (((_k = this.config) == null ? void 0 : _k.appVersion) != "") {
58
+ this.log.debug(`Use configured AppVersion from Github ${(_l = this.config) == null ? void 0 : _l.appVersionFromGithub}.`);
59
+ this.comfortCloudClient = new import_panasonic_comfort_cloud_client.ComfortCloudClient((_m = this.config) == null ? void 0 : _m.appVersion);
60
+ } else {
61
+ this.log.debug(`Use default AppVersion.`);
49
62
  this.comfortCloudClient = new import_panasonic_comfort_cloud_client.ComfortCloudClient();
63
+ }
50
64
  try {
51
65
  this.log.debug(`Try to login with username ${this.config.username}.`);
52
66
  await this.comfortCloudClient.login(
@@ -137,7 +151,7 @@ class PanasonicComfortCloud extends utils.Adapter {
137
151
  }
138
152
  async refreshDevice(guid, deviceName) {
139
153
  try {
140
- const device = await this.comfortCloudClient.getDevice(guid);
154
+ const device = await this.comfortCloudClient.getDevice(guid, deviceName);
141
155
  if (!device) {
142
156
  return;
143
157
  }
@@ -159,7 +173,7 @@ class PanasonicComfortCloud extends utils.Adapter {
159
173
  return { guid: d.guid, name: d.name };
160
174
  });
161
175
  await Promise.all(deviceInfos.map(async (deviceInfo) => {
162
- const device = await this.comfortCloudClient.getDevice(deviceInfo.guid);
176
+ const device = await this.comfortCloudClient.getDevice(deviceInfo.guid, deviceInfo.name);
163
177
  if (device != null) {
164
178
  device.name = deviceInfo.name;
165
179
  device.guid = deviceInfo.guid;
@@ -183,7 +197,7 @@ class PanasonicComfortCloud extends utils.Adapter {
183
197
  this.log.debug(`Device info from group ${deviceInfo.guid}, ${deviceInfo.name}.`);
184
198
  let device = null;
185
199
  try {
186
- device = await this.comfortCloudClient.getDevice(deviceInfo.guid);
200
+ device = await this.comfortCloudClient.getDevice(deviceInfo.guid, deviceInfo.name);
187
201
  } catch (error) {
188
202
  await this.handleClientError(error);
189
203
  }
@@ -449,6 +463,13 @@ class PanasonicComfortCloud extends utils.Adapter {
449
463
  this.log.info(`state ${id} deleted`);
450
464
  }
451
465
  }
466
+ async getCurrentAppVersion() {
467
+ const response = await import_axios.default.get("https://raw.githubusercontent.com/marc2016/ioBroker.panasonic-comfort-cloud/master/.currentAppVersion");
468
+ if (response.status !== 200)
469
+ return "";
470
+ const text = await response.data;
471
+ return text;
472
+ }
452
473
  async handleClientError(error) {
453
474
  this.log.debug("Try to handle error.");
454
475
  if (error instanceof import_panasonic_comfort_cloud_client.TokenExpiredError) {
@@ -486,6 +507,10 @@ class PanasonicComfortCloud extends utils.Adapter {
486
507
  await this.handleClientError(error);
487
508
  }
488
509
  }
510
+ trimAll(text) {
511
+ const newText = text.trim().replace(/(\r\n|\n|\r)/gm, "");
512
+ return newText;
513
+ }
489
514
  }
490
515
  if (module.parent) {
491
516
  module.exports = (options) => new PanasonicComfortCloud(options);
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'\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace ioBroker {\n interface AdapterConfig {\n // Define the shape of your options here (recommended)\n username: string;\n password: string;\n refreshInterval: number;\n appVersion: string;\n\n // Or use a catch-all approach\n [key: string]: any;\n }\n }\n}\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 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?.appVersion != '')\n this.comfortCloudClient = new ComfortCloudClient(this.config?.appVersion)\n else\n this.comfortCloudClient = new ComfortCloudClient()\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.setupRefreshTimeout()\n } catch (error) {\n await this.handleClientError(error)\n }\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 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)\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.handleClientError(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 const device = await this.comfortCloudClient.getDevice(deviceInfo.guid)\n if(device != null) {\n device.name = deviceInfo.name\n device.guid = deviceInfo.guid\n await this.refreshDeviceStates(device)\n }\n }));\n } catch (error) {\n await this.handleClientError(error)\n }\n }\n\n private async createDevices(groups: Array<Group>): Promise<void> {\n const devices = await this.getDevicesAsync()\n const names = _.map(devices, (value) => {\n return value.common.name\n })\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)\n } catch(error) {\n await this.handleClientError(error)\n }\n \n if(device != null) {\n if (_.includes(names, deviceInfo.name)) {\n return\n }\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\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) {\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 } else {\n // The state was deleted\n this.log.info(`state ${id} deleted`)\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}\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
- "names": []
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 if(this.config?.appVersion != '')\n {\n this.log.debug(`Use configured AppVersion from Github ${this.config?.appVersionFromGithub}.`)\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.setupRefreshTimeout()\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 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.handleClientError(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 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 }));\n } catch (error) {\n await this.handleClientError(error)\n }\n }\n\n private async createDevices(groups: Array<Group>): Promise<void> {\n const devices = await this.getDevicesAsync()\n const names = _.map(devices, (value) => {\n return value.common.name\n })\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.handleClientError(error)\n }\n \n if(device != null) {\n if (_.includes(names, deviceInfo.name)) {\n return\n }\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\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) {\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 } else {\n // The state was deleted\n this.log.info(`state ${id} deleted`)\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 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
+ "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": "2.1.0",
4
+ "version": "2.2.0",
5
5
  "news": {
6
+ "2.2.0": {
7
+ "en": "Added feature to automatically load the app version from GitHub.",
8
+ "de": "Funktion hinzugefügt, um die App-Version automatisch von GitHub zu laden.",
9
+ "ru": "Добавлена ​​функция автоматической загрузки версии приложения с GitHub.",
10
+ "pt": "Adicionado recurso para carregar automaticamente a versão do aplicativo do GitHub.",
11
+ "nl": "Functie toegevoegd om de app-versie automatisch te laden vanuit GitHub.",
12
+ "fr": "Ajout d'une fonctionnalité pour charger automatiquement la version de l'application à partir de GitHub.",
13
+ "it": "Aggiunta funzionalità per caricare automaticamente la versione dell'app da GitHub.",
14
+ "es": "Función agregada para cargar automáticamente la versión de la aplicación desde GitHub.",
15
+ "pl": "Dodano funkcję automatycznego ładowania wersji aplikacji z GitHub.",
16
+ "uk": "Додано функцію автоматичного завантаження версії програми з GitHub.",
17
+ "zh-cn": "添加了自动从 GitHub 加载应用程序版本的功能。"
18
+ },
6
19
  "2.1.0": {
7
20
  "en": "Added app version to settings.",
8
21
  "de": "App-Version zu den Einstellungen hinzugefügt.",
@@ -154,21 +167,27 @@
154
167
  "type": "climate-control",
155
168
  "compact": true,
156
169
  "materialize": true,
157
- "globalDependencies": [
170
+ "adminUI": {
171
+ "config": "materialize"
172
+ },
173
+ "dependencies": [
158
174
  {
159
- "admin": ">=4.0.9"
175
+ "js-controller": ">=3.3.22"
160
176
  }
161
177
  ],
162
- "dependencies": [
178
+ "globalDependencies": [
163
179
  {
164
- "js-controller": ">=3.0.0"
180
+ "admin": ">=5.0.0"
165
181
  }
166
182
  ]
167
183
  },
168
184
  "native": {
169
185
  "username": "",
170
186
  "password": "",
171
- "refreshInterval": 5
187
+ "refreshInterval": 5,
188
+ "appVersion": "",
189
+ "appVersionFromGithub": "",
190
+ "useAppVersionFromGithub": false
172
191
  },
173
192
  "protectedNative": [
174
193
  "username",
package/package.json CHANGED
@@ -1,71 +1,82 @@
1
1
  {
2
- "name": "iobroker.panasonic-comfort-cloud",
3
- "version": "2.1.0",
4
- "description": "Adapter for Panasonic Comfort Cloud",
5
- "author": {
6
- "name": "marc",
7
- "email": "marc@lammers.dev"
8
- },
9
- "homepage": "https://github.com/marc2016/ioBroker.panasonic-comfort-cloud",
10
- "license": "MIT",
11
- "keywords": [
12
- "air condition"
13
- ],
14
- "repository": {
15
- "type": "git",
16
- "url": "https://github.com/marc2016/ioBroker.panasonic-comfort-cloud"
17
- },
18
- "dependencies": {
19
- "@iobroker/adapter-core": "^2.5.1",
20
- "@types/lodash": "^4.14.149",
21
- "lodash": "^4.17.15",
22
- "panasonic-comfort-cloud-client": "^1.2.0",
23
- "ts-enum-util": "^4.0.1"
24
- },
25
- "devDependencies": {
26
- "@iobroker/adapter-dev": "^1.2.0",
27
- "@iobroker/testing": "^2.5.4",
28
- "@types/chai": "^4.2.4",
29
- "@types/chai-as-promised": "^7.1.2",
30
- "@types/gulp": "^4.0.6",
31
- "@types/mocha": "^5.2.7",
32
- "@types/node": "^10.17.3",
33
- "@types/proxyquire": "^1.3.28",
34
- "@types/sinon": "^7.5.0",
35
- "@types/sinon-chai": "^3.2.3",
36
- "@typescript-eslint/eslint-plugin": "^2.6.0",
37
- "@typescript-eslint/parser": "^2.6.0",
38
- "axios": "^0.21.1",
39
- "chai": "^4.2.0",
40
- "chai-as-promised": "^7.1.1",
41
- "eslint": "^6.6.0",
42
- "gulp": "^4.0.2",
43
- "mocha": "^6.2.2",
44
- "proxyquire": "^2.1.3",
45
- "rimraf": "^3.0.0",
46
- "sinon": "^7.5.0",
47
- "sinon-chai": "^3.3.0",
48
- "source-map-support": "^0.5.16",
49
- "ts-node": "^8.4.1",
50
- "typescript": "^4.5.4"
51
- },
52
- "main": "build/main.js",
53
- "scripts": {
54
- "translate": "translate-adapter",
55
- "prebuild": "rimraf ./build",
56
- "build:ts": "tsc -p tsconfig.build.json",
57
- "build": "build-adapter ts",
58
- "watch:ts": "tsc -p tsconfig.build.json --watch",
59
- "watch": "npm run watch:ts",
60
- "test:ts": "mocha --opts test/mocha.custom.opts",
61
- "test:package": "mocha test/package --exit",
62
- "test:unit": "mocha test/unit --exit",
63
- "test:integration": "mocha test/integration --timeout 120000 --exit",
64
- "test": "npm run test:ts && npm run test:package",
65
- "lint": "eslint --ext .ts src"
66
- },
67
- "bugs": {
68
- "url": "https://github.com/marc2016/ioBroker.panasonic-comfort-cloud/issues"
69
- },
70
- "readmeFilename": "README.md"
2
+ "name": "iobroker.panasonic-comfort-cloud",
3
+ "version": "2.2.1",
4
+ "description": "Adapter for Panasonic Comfort Cloud",
5
+ "author": {
6
+ "name": "marc",
7
+ "email": "marc@lammers.dev"
8
+ },
9
+ "homepage": "https://github.com/marc2016/ioBroker.panasonic-comfort-cloud",
10
+ "license": "MIT",
11
+ "keywords": [
12
+ "air condition"
13
+ ],
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "https://github.com/marc2016/ioBroker.panasonic-comfort-cloud"
17
+ },
18
+ "dependencies": {
19
+ "@iobroker/adapter-core": "^2.6.8",
20
+ "@types/lodash": "^4.14.192",
21
+ "lodash": "^4.17.21",
22
+ "panasonic-comfort-cloud-client": "1.2.5",
23
+ "ts-enum-util": "^4.0.2"
24
+ },
25
+ "devDependencies": {
26
+ "@alcalzone/release-script": "^3.6.0",
27
+ "@iobroker/adapter-dev": "^1.2.0",
28
+ "@iobroker/testing": "^4.1.0",
29
+ "@tsconfig/node14": "^1.0.3",
30
+ "@types/chai": "^4.3.4",
31
+ "@types/chai-as-promised": "^7.1.5",
32
+ "@types/gulp": "^4.0.10",
33
+ "@types/mocha": "^10.0.1",
34
+ "@types/node": "^18.15.11",
35
+ "@types/proxyquire": "^1.3.28",
36
+ "@types/sinon": "^10.0.13",
37
+ "@types/sinon-chai": "^3.2.9",
38
+ "@typescript-eslint/eslint-plugin": "^5.57.1",
39
+ "@typescript-eslint/parser": "^5.57.1",
40
+ "axios": "^1.3.5",
41
+ "chai": "^4.3.7",
42
+ "chai-as-promised": "^7.1.1",
43
+ "eslint": "^8.38.0",
44
+ "gulp": "^4.0.2",
45
+ "mocha": "^10.2.0",
46
+ "proxyquire": "^2.1.3",
47
+ "rimraf": "^4.4.1",
48
+ "sinon": "^15.0.3",
49
+ "sinon-chai": "^3.7.0",
50
+ "source-map-support": "^0.5.21",
51
+ "ts-node": "^10.9.1",
52
+ "typescript": "^5.0.4"
53
+ },
54
+ "main": "build/main.js",
55
+ "files": [
56
+ "admin{,/!(src)/**}/!(tsconfig|tsconfig.*|.eslintrc).json",
57
+ "admin{,/!(src)/**}/*.{html,css,png,svg,jpg,js}",
58
+ "build/",
59
+ "www/",
60
+ "io-package.json",
61
+ "LICENSE"
62
+ ],
63
+ "scripts": {
64
+ "translate": "translate-adapter",
65
+ "prebuild": "rimraf ./build",
66
+ "build:ts": "tsc -p tsconfig.build.json",
67
+ "build": "build-adapter ts",
68
+ "watch:ts": "tsc -p tsconfig.build.json --watch",
69
+ "watch": "npm run watch:ts",
70
+ "test": "npm run test:package && npm run test:unit",
71
+ "test:package": "mocha test/package --exit",
72
+ "test:unit": "mocha test/unit --exit",
73
+ "test:integration": "mocha test/integration --exit",
74
+ "test:rule": "mocha test/rule --exit",
75
+ "lint": "eslint --ext .ts src",
76
+ "release": "release-script"
77
+ },
78
+ "bugs": {
79
+ "url": "https://github.com/marc2016/ioBroker.panasonic-comfort-cloud/issues"
80
+ },
81
+ "readmeFilename": "README.md"
71
82
  }
package/admin/admin.d.ts DELETED
@@ -1 +0,0 @@
1
- declare let systemDictionary: Record<string, Record<string, string>>;
@@ -1,61 +0,0 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
- mod
23
- ));
24
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
25
- var tools_exports = {};
26
- __export(tools_exports, {
27
- isArray: () => isArray,
28
- isObject: () => isObject,
29
- translateText: () => translateText
30
- });
31
- module.exports = __toCommonJS(tools_exports);
32
- var import_axios = __toESM(require("axios"));
33
- function isObject(it) {
34
- return Object.prototype.toString.call(it) === "[object Object]";
35
- }
36
- function isArray(it) {
37
- if (Array.isArray != null)
38
- return Array.isArray(it);
39
- return Object.prototype.toString.call(it) === "[object Array]";
40
- }
41
- async function translateText(text, targetLang) {
42
- if (targetLang === "en")
43
- return text;
44
- try {
45
- const url = `http://translate.googleapis.com/translate_a/single?client=gtx&sl=en&tl=${targetLang}&dt=t&q=${encodeURIComponent(text)}&ie=UTF-8&oe=UTF-8`;
46
- const response = await (0, import_axios.default)({ url, timeout: 5e3 });
47
- if (isArray(response.data)) {
48
- return response.data[0][0][0];
49
- }
50
- throw new Error("Invalid response for translate request");
51
- } catch (e) {
52
- throw new Error(`Could not translate to "${targetLang}": ${e}`);
53
- }
54
- }
55
- // Annotate the CommonJS export names for ESM import in node:
56
- 0 && (module.exports = {
57
- isArray,
58
- isObject,
59
- translateText
60
- });
61
- //# sourceMappingURL=tools.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/lib/tools.ts"],
4
- "sourcesContent": ["import axios from 'axios';\n\n/**\n * Tests whether the given variable is a real object and not an Array\n * @param it The variable to test\n */\nexport function isObject(it: any): it is object {\n // This is necessary because:\n // typeof null === 'object'\n // typeof [] === 'object'\n // [] instanceof Object === true\n return Object.prototype.toString.call(it) === '[object Object]';\n}\n\n/**\n * Tests whether the given variable is really an Array\n * @param it The variable to test\n */\nexport function isArray(it: any): it is any[] {\n if (Array.isArray != null) return Array.isArray(it);\n return Object.prototype.toString.call(it) === '[object Array]';\n}\n\n/**\n * Translates text using the Google Translate API\n * @param text The text to translate\n * @param targetLang The target languate\n */\nexport async function translateText(text: string, targetLang: string): Promise<string> {\n if (targetLang === 'en') return text;\n try {\n const url = `http://translate.googleapis.com/translate_a/single?client=gtx&sl=en&tl=${targetLang}&dt=t&q=${encodeURIComponent(text)}&ie=UTF-8&oe=UTF-8`;\n const response = await axios({url, timeout: 5000});\n if (isArray(response.data)) {\n // we got a valid response\n return response.data[0][0][0];\n }\n throw new Error('Invalid response for translate request');\n } catch (e) {\n throw new Error(`Could not translate to \"${targetLang}\": ${e}`);\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAkB;AAMX,SAAS,SAAS,IAAuB;AAK5C,SAAO,OAAO,UAAU,SAAS,KAAK,EAAE,MAAM;AAClD;AAMO,SAAS,QAAQ,IAAsB;AAC1C,MAAI,MAAM,WAAW;AAAM,WAAO,MAAM,QAAQ,EAAE;AAClD,SAAO,OAAO,UAAU,SAAS,KAAK,EAAE,MAAM;AAClD;AAOA,eAAsB,cAAc,MAAc,YAAqC;AACnF,MAAI,eAAe;AAAM,WAAO;AAChC,MAAI;AACA,UAAM,MAAM,0EAA0E,qBAAqB,mBAAmB,IAAI;AAClI,UAAM,WAAW,UAAM,aAAAA,SAAM,EAAC,KAAK,SAAS,IAAI,CAAC;AACjD,QAAI,QAAQ,SAAS,IAAI,GAAG;AAExB,aAAO,SAAS,KAAK,GAAG,GAAG;AAAA,IAC/B;AACA,UAAM,IAAI,MAAM,wCAAwC;AAAA,EAC5D,SAAS,GAAP;AACE,UAAM,IAAI,MAAM,2BAA2B,gBAAgB,GAAG;AAAA,EAClE;AACJ;",
6
- "names": ["axios"]
7
- }