diff --git a/README.md b/README.md index b6c8418..81ff2ae 100644 --- a/README.md +++ b/README.md @@ -28,8 +28,17 @@ The adapter supports an interface towards the heating systems from Bosch Group u The ioBroker ems-esp adapter can read and write data to both gateways to control all heating components. It can be used either for the original Bosch-Group gateways or the ems-esp or both in parallel. +All changed states from own scripts or the object browser does have to set acknowledged = false !!! -## All changed states from own scripts or the object browser does have to set acknowledged = false !!! + +## NEW EMS+ entities (switchTimes and holidayModes) are implemented for EMS-ESP gateway and if found states are created. + The ems-esp gateway firmware does not support switchTimes and holidayModes for EMS+ thermostats (RC310 / RC300 or similar) + Enabling this new function will issue raw telegrams toward the ems-esp gateway and then try to read the response + Testing is done for switchTimes A and B for hc1 to hc4, dhw (warm water) and circulation pump (cp) and holidayModes hm1-hm5 + When a positive response is found then the raw response is decoded and states are created identically to KM200 gateway API data + When the km200 gateway is enabled then this function is disabled to avoid double entries with same name + The states created consist of JSON structures, enum values or arrays and are writable - Be carefull with the right content + I recommend to test by using the Bosch/Buderus apps to identify the right content - especially for holidayModes. ## NEW Energy recordings and statistics need an active database instance. Recordings require a InfluxDB adapter version >= 4.0.2 which allows deleting of db-records @@ -57,6 +66,12 @@ English documentation: https://github.com/tp1de/ioBroker.ems-esp/blob/main/doc/e Placeholder for the next version (at the beginning of the line): ### **WORK IN PROGRESS** --> +### **WORK IN PROGRESS** +* Search for ems-esp states for EMS+ thermostats: switchTimes and holidayModes (RC310/RC300) +* Implement raw telegram search for EMS+ entities and create writable objects / states +* The search is only active when no km200 gateway is selected + + ### 2.8.0 (2024-02-04) * influxdb adapter version >= 4.0.2 required * store km200 recordings only within defined retention period for influxdb diff --git a/admin/index_m.html b/admin/index_m.html index 811426f..d140757 100644 --- a/admin/index_m.html +++ b/admin/index_m.html @@ -95,6 +95,13 @@ +
+
+ + +
+
+
@@ -413,11 +420,6 @@ ****************************************************************************
-
- - -
-
diff --git a/admin/words.js b/admin/words.js index 320aadb..f96a909 100644 --- a/admin/words.js +++ b/admin/words.js @@ -4,8 +4,8 @@ systemDictionary = { "ems-esp adapter settings": { - "en": "ems-esp adapter settings", - "de": "ems-esp-Adaptereinstellungen", + "en": "EMS-ESP adapter settings", + "de": "EMS-ESP Adaptereinstellungen", "ru": "настройки адаптера ems-esp", "pt": "configurações do adaptador ems-esp", "nl": "instellingen voor ems-esp-adapter", @@ -40,8 +40,8 @@ systemDictionary = { "zh-cn": "EMS-ESP" }, "ems expert settings": { - "en": "ems expert settings", - "de": "EMS-Experteneinstellungen", + "en": "EMS expert settings", + "de": "EMS Experteneinstellungen", "ru": "EMS экспертные настройки", "pt": "configurações especializadas ems", "nl": "ems-expertinstellingen", @@ -52,8 +52,8 @@ systemDictionary = { "zh-cn": "ems专家设置" }, "km200_structure": { - "en": "km200 structure", - "de": "km200 Struktur", + "en": "KM200 structure", + "de": "KM200 Struktur", "ru": "Строение км200", "pt": "estrutura km200", "nl": "km200-structuur", @@ -102,7 +102,7 @@ systemDictionary = { }, "ems_dallas_old_format": { "en": "use old dallas prefix for sensors", - "de": "alten dallas-Präfix für Sensoren verwenden", + "de": "Alten Dallas-Präfix für Sensoren verwenden", "ru": "использовать старый префикс Далласа для датчиков", "pt": "usar prefixo de dallas antigo para sensores", "nl": "gebruik oude dallas prefix voor sensoren", @@ -140,7 +140,7 @@ systemDictionary = { }, "ems_custom_elements": { "en": "read ems-esp custom elements", - "de": "ems-esp benutzerdefinierte Elemente lesen", + "de": "EMS-ESP benutzerdefinierte Elemente lesen", "ru": "читать ems-esp пользовательские элементы", "pt": "ler elementos personalizados emsp", "nl": "lees keizersnede elementen", @@ -188,8 +188,8 @@ systemDictionary = { "zh-cn": "使用 REST API V3" }, "ems_token": { - "en": "ems access token ", - "de": "ems-Zugriffstoken ", + "en": "ems-esp access token ", + "de": "EMS-ESP Zugriffstoken ", "ru": "токен доступа ems ", "pt": "token de acesso ems ", "nl": "ems-toegangstoken ", @@ -301,7 +301,7 @@ systemDictionary = { }, "control_file": { "en": "csv-file for km200 | empty: no km200 data *: read all km200 fields", - "de": "csv-Datei für km200 | leer: keine km200-Daten *: alle km200-Felder lesen", + "de": "CSV-Datei für km200 | leer: keine km200-Daten *: alle km200-Felder lesen", "ru": "csv-файл для км200 | пусто: нет данных км200 *: прочитать все поля км200", "pt": "arquivo csv para km200 | vazio: sem dados km200 *: ler todos os campos km200", "nl": "csv-bestand voor km200 | leeg: geen km200-gegevens *: lees alle km200-velden", @@ -446,7 +446,7 @@ systemDictionary = { }, "db_instance": { "en": "db instance", - "de": "db Instanz", + "de": "DB Instanz", "ru": "db экземпляр", "pt": "instância db", "nl": "db instituut", diff --git a/index_m.html b/index_m.html new file mode 100644 index 0000000..d140757 --- /dev/null +++ b/index_m.html @@ -0,0 +1,483 @@ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ +
+
+ +
+
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+ +
+
+ + +
+ +
+ +
+
+ + +
+
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ + + +
+ +
+
+ +
+
+ +
+
+ + +
+
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+
+ +
+
+ + +
+ +
+ + +
+ +
+ +
+
+ + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+ + +
+ +
+ + +
+ +
+ +
+
+ + +
+ +
+ + +
+ +
+ +
+
+ + +
+
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+ + + + + +
+ + +
+ +
+ +
+ + +
+ +
+ +
> +
+ add +
+ + + + + + + + + + + + + + + + +
roomset tempactual tempminimum deltahcweight
+
+
+
+ +
> +
+ add +
+ + + + + + + + + + + + + + + + + + +
hcweightonweightoffstateonoffsavesettemp
+
+
+
+ + +
+ + + +
+ +
+ **************************************************************************** +
+
+ ***** SETTINGS ON CUSTOM EMS-TELEGRAMS --- EXPERTS ONLY --- DANGER !!! +
+
+ **************************************************************************** +
+ +
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + add +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
statesrctypehexpollingbitbytesmultisignedstate_typestatesminmaxuomwritable
+
+
+
+
+ + + +
+ + + + + + \ No newline at end of file diff --git a/lib/custom.js b/lib/custom.js index 0eaba12..6e838c2 100644 --- a/lib/custom.js +++ b/lib/custom.js @@ -38,7 +38,8 @@ const init = async function (a, i) { let count = 0; for (let i = 0; i < own_states.length; i++) { if (own_states[i].polling) { - adapter.log.info("custom entity found:" + own_states[i].state); + state = own_states[i].state; + adapter.log.info("extended entity found:" + own_states[i].state); count += 1; } } @@ -48,12 +49,12 @@ const init = async function (a, i) { const obj = await adapter.getForeignObjectAsync(inst); obj.native.devices = own_states; await adapter.setForeignObjectAsync(inst, obj); - adapter.log.info("ems: custom entities configuration stored .... instance will restart"); + adapter.log.info("ems: extended entities configuration stored .... instance will restart"); } if (count > 0) { - adapter.log.info("custom entity poll for " + count + " states every 1 minute"); - i.poll = setInterval(function () { ems_poll(); }, 60000); // 1 Minutes + adapter.log.info("extended entity poll for " + count + " states every 5 minutes"); + i.poll = setInterval(function () { ems_poll(); }, 300000); // 5 Minutes } }; @@ -226,7 +227,9 @@ async function ems_put(url, value) { const options = {"url": url, "headers": headers, "data": data, "method": "POST" }; const r = (await axios(options)).data.message; return r; - } catch(e) {adapter.log.error("post: "+ url + " " +e);} + } catch(e) { + // adapter.log.error("post: "+ url + " " +e); + } } diff --git a/lib/ems.js b/lib/ems.js index 7a281be..da38046 100644 --- a/lib/ems.js +++ b/lib/ems.js @@ -406,7 +406,7 @@ async function ems_read(version) { try {data = await ems_get(url1); } catch(error) {data = "Invalid";} await sleep(ems_http_wait); - adapter.log.info(data); + //adapter.log.info(data); if (data != "Invalid") { let def = {}; @@ -424,7 +424,9 @@ async function ems_read(version) { try {if (def.name.substring(0,2) == "ww") type = "dhwCircuits.dhw1";} catch (e) {} } - write_sensor(type+".c_"+def.name,def.value,def); + + + write_sensor(type+"."+def.name,def.value,def); } } } diff --git a/package copy.json b/package copy.json deleted file mode 100644 index 9deeb7a..0000000 --- a/package copy.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "name": "iobroker.ems-esp", - "version": "2.2.0", - "description": "EMS-ESP and KM200 Interface", - "author": { - "name": "Thomas Petrick", - "email": "tp1degit@gmail.com" - }, - "homepage": "https://github.com/tp1de/ioBroker.ems-esp", - "license": "MIT", - "keywords": [ - "ems-esp", - "buderus", - "bosch", - "junkers", - "km200", - "heating" - ], - "repository": { - "type": "git", - "url": "https://github.com/tp1de/ioBroker.ems-esp" - }, - "bugs": { - "url": "https://github.com/tp1de/ioBroker.ems-esp/issues" - }, - "bundleDependencies": [], - "engines": { - "node": ">=16" - }, - "dependencies": { - "@iobroker/adapter-core": "^3.0.3", - "buffer": "^6.0.3", - "jshint": "^2.13.4", - "rijndael-js": "^2.0.0", - "simple-syslog-server": "^1.0.0", - "user": "0.0.0" - }, - "deprecated": false, - "devDependencies": { - "@alcalzone/release-script": "^3.6.0", - "@alcalzone/release-script-plugin-iobroker": "^3.6.0", - "@alcalzone/release-script-plugin-license": "^3.5.9", - "@alcalzone/release-script-plugin-manual-review": "^3.5.9", - "@iobroker/adapter-dev": "^1.2.0", - "@iobroker/testing": "^4.1.0", - "@types/chai": "^4.3.5", - "@types/chai-as-promised": "^7.1.5", - "@types/gulp": "^4.0.13", - "@types/mocha": "^10.0.1", - "@types/node": "^20.4.8", - "@types/proxyquire": "^1.3.28", - "@types/sinon": "^10.0.16", - "@types/sinon-chai": "^3.2.9", - "chai": "^4.3.7", - "chai-as-promised": "^7.1.1", - "eslint": "^8.46.0", - "eslint-config-prettier": "^8.10.0", - "eslint-plugin-prettier": "^5.0.0", - "gulp": "^4.0.2", - "mocha": "^10.2.0", - "prettier": "^3.0.1", - "proxyquire": "^2.1.3", - "sinon": "^15.2.0", - "sinon-chai": "^3.7.0", - "typescript": "~5.1.6" - }, - "directories": { - "lib": "lib", - "test": "test" - }, - "main": "main.js", - "scripts": { - "test:js": "mocha \"{!(node_modules|test)/**/*.test.js,*.test.js,test/**/test!(PackageFiles|Startup).js}\"", - "test:package": "mocha test/package --exit", - "test:unit": "mocha test/unit --exit", - "test:integration": "mocha test/integration --exit", - "test": "npm run test:js && npm run test:package", - "lint": "eslint", - "translate": "translate-adapter", - "release": "release-script" - }, - "readmeFilename": "README.md" -} diff --git a/template.yaml.old.yaml b/template.yaml.old.yaml deleted file mode 100644 index afcc50e..0000000 --- a/template.yaml.old.yaml +++ /dev/null @@ -1,107 +0,0 @@ -############################### -# for EMS-ESP v3.4.1 # -############################### -#CH working hours -sensor: - - name: "Boiler CH working hours" - unit_of_measurement: 'hr' - icon: 'mdi:clock-check-outline' - state: > - {% set mins = states('sensor.boiler_total_heat_operating_time') %} - {% set hours = ((mins | int / 60) | string).split('.')[0] %} - {{hours}} - -#Burner working hours - - name: 'Boiler burner working hours' - unit_of_measurement: 'hr' - icon: 'mdi:clock-check-outline' - state: > - {% set mins = states('sensor.boiler_heatworkmin') %} - {% set hours = ((mins | int / 60) | string).split('.')[0] %} - {{hours}} - -#Boiler Service Code - - name: 'Boiler service code text' - icon: 'mdi:information' - state: > - {% set sc = states('sensor.boiler_servicecodenumber') %} - {% if sc == '200' %} CH active - {% elif sc == '201' %} HW active - {% elif sc == '202' %} CH anti cycle - {% elif sc == '203' %} Standby - {% elif sc == '204' %} CH cooling - {% elif sc == '208' %} Service test - {% elif sc == '265' %} Low CH load - {% elif sc == '268' %} Component test - {% elif sc == '270' %} Power up - {% elif sc == '283' %} Burner start - {% elif sc == '284' %} Ignition - {% elif sc == '305' %} HW anti cycle - {% elif sc == '357' %} Air purge - {% elif sc == '358' %} Valve kick - {% else %} {{ sc }} - {% endif %} - -#Boiler Uptime Hours - - name: 'Boiler Total Uptime hours' - unit_of_measurement: 'hr' - icon: 'mdi:clock-check-outline' - state: > - {% set mins = states('sensor.boiler_ubauptime') %} - {% set hours = ((mins | int / 60) | string).split('.')[0] %} - {{hours}} - - -#EMS-ESP Working Hours - - name: 'System Uptime (hr)' - unit_of_measurement: 'hr' - icon: 'mdi:clock-check-outline' - state: > - {% set mins = states('sensor.system_uptime_sec') %} - {% set hours = ((mins | int / 3600) | string).split('.')[0] %} - {{hours}} - - -# For Kostal Plenticore - - - name: "Kostal DC Power (String 1+2) " - unit_of_measurement: "W" - device_class: energy - state: > - {% set pv1 = states('sensor.kostal_dc1_power') | int %} - {% set pv2 = states('sensor.kostal_dc2_power') | int %} - {{ (pv1 + pv2) }} - - - name: "Kostal PV Power" - unit_of_measurement: "W" - device_class: energy - state: > - {% set togrid = states('sensor.ksem_power_togrid') | int %} - {% set tobatt = states('sensor.kostal_pv_to_battery_power') | int %} - {% set tohome = states('sensor.kostal_home_power_from_pv') | int %} - {{ (togrid + tobatt + tohome) }} - - - name: "Kostal Energy PV to Grid Total (Template)" - unit_of_measurement: "kWh" - device_class: energy - state_class: total - state: > - {% set yield = states('sensor.kostal_energy_yield_total') | float %} - {% set batteryToHome = states('sensor.kostal_home_consumption_from_battery_total') | float %} - {% set pvToHome = states('sensor.kostal_home_consumption_from_pv_total') | float %} - {{ yield - pvToHome - batteryToHome }} - -# For Gas Power - - - name: "Gas Power " - unit_of_measurement: "kW" - device_class: power - state: > - {% set modulation = states('sensor.boiler_curburnpow') | int %} - {{ (modulation * 22 / 100) }} - -# For text empty state - - - name: "empty" - state: > - {{ "" }} \ No newline at end of file diff --git a/template1.yaml b/template1.yaml deleted file mode 100644 index afcc50e..0000000 --- a/template1.yaml +++ /dev/null @@ -1,107 +0,0 @@ -############################### -# for EMS-ESP v3.4.1 # -############################### -#CH working hours -sensor: - - name: "Boiler CH working hours" - unit_of_measurement: 'hr' - icon: 'mdi:clock-check-outline' - state: > - {% set mins = states('sensor.boiler_total_heat_operating_time') %} - {% set hours = ((mins | int / 60) | string).split('.')[0] %} - {{hours}} - -#Burner working hours - - name: 'Boiler burner working hours' - unit_of_measurement: 'hr' - icon: 'mdi:clock-check-outline' - state: > - {% set mins = states('sensor.boiler_heatworkmin') %} - {% set hours = ((mins | int / 60) | string).split('.')[0] %} - {{hours}} - -#Boiler Service Code - - name: 'Boiler service code text' - icon: 'mdi:information' - state: > - {% set sc = states('sensor.boiler_servicecodenumber') %} - {% if sc == '200' %} CH active - {% elif sc == '201' %} HW active - {% elif sc == '202' %} CH anti cycle - {% elif sc == '203' %} Standby - {% elif sc == '204' %} CH cooling - {% elif sc == '208' %} Service test - {% elif sc == '265' %} Low CH load - {% elif sc == '268' %} Component test - {% elif sc == '270' %} Power up - {% elif sc == '283' %} Burner start - {% elif sc == '284' %} Ignition - {% elif sc == '305' %} HW anti cycle - {% elif sc == '357' %} Air purge - {% elif sc == '358' %} Valve kick - {% else %} {{ sc }} - {% endif %} - -#Boiler Uptime Hours - - name: 'Boiler Total Uptime hours' - unit_of_measurement: 'hr' - icon: 'mdi:clock-check-outline' - state: > - {% set mins = states('sensor.boiler_ubauptime') %} - {% set hours = ((mins | int / 60) | string).split('.')[0] %} - {{hours}} - - -#EMS-ESP Working Hours - - name: 'System Uptime (hr)' - unit_of_measurement: 'hr' - icon: 'mdi:clock-check-outline' - state: > - {% set mins = states('sensor.system_uptime_sec') %} - {% set hours = ((mins | int / 3600) | string).split('.')[0] %} - {{hours}} - - -# For Kostal Plenticore - - - name: "Kostal DC Power (String 1+2) " - unit_of_measurement: "W" - device_class: energy - state: > - {% set pv1 = states('sensor.kostal_dc1_power') | int %} - {% set pv2 = states('sensor.kostal_dc2_power') | int %} - {{ (pv1 + pv2) }} - - - name: "Kostal PV Power" - unit_of_measurement: "W" - device_class: energy - state: > - {% set togrid = states('sensor.ksem_power_togrid') | int %} - {% set tobatt = states('sensor.kostal_pv_to_battery_power') | int %} - {% set tohome = states('sensor.kostal_home_power_from_pv') | int %} - {{ (togrid + tobatt + tohome) }} - - - name: "Kostal Energy PV to Grid Total (Template)" - unit_of_measurement: "kWh" - device_class: energy - state_class: total - state: > - {% set yield = states('sensor.kostal_energy_yield_total') | float %} - {% set batteryToHome = states('sensor.kostal_home_consumption_from_battery_total') | float %} - {% set pvToHome = states('sensor.kostal_home_consumption_from_pv_total') | float %} - {{ yield - pvToHome - batteryToHome }} - -# For Gas Power - - - name: "Gas Power " - unit_of_measurement: "kW" - device_class: power - state: > - {% set modulation = states('sensor.boiler_curburnpow') | int %} - {{ (modulation * 22 / 100) }} - -# For text empty state - - - name: "empty" - state: > - {{ "" }} \ No newline at end of file diff --git a/words.js b/words.js new file mode 100644 index 0000000..f96a909 --- /dev/null +++ b/words.js @@ -0,0 +1,729 @@ +/* eslint-disable no-mixed-spaces-and-tabs */ +/*global systemDictionary:true */ +"use strict"; + +systemDictionary = { + "ems-esp adapter settings": { + "en": "EMS-ESP adapter settings", + "de": "EMS-ESP Adaptereinstellungen", + "ru": "настройки адаптера ems-esp", + "pt": "configurações do adaptador ems-esp", + "nl": "instellingen voor ems-esp-adapter", + "fr": "paramètres de l'adaptateur ems-esp", + "it": "impostazioni dell'adattatore ems-esp", + "es": "configuración del adaptador ems-esp", + "pl": "ustawienia adaptera ems-esp", + "zh-cn": "ems-esp 适配器设置" + }, + "KM200 settings": { + "en": "KM200", + "de": "KM200", + "ru": "KM200", + "pt": "KM200", + "nl": "KM200", + "fr": "KM200", + "it": "KM200", + "es": "KM200", + "pl": "KM200", + "zh-cn": "KM200" + }, + "EMS-ESP settings": { + "en": "EMS-ESP", + "de": "EMS-ESP", + "ru": "EMS-ESP", + "pt": "EMS-ESP", + "nl": "EMS-ESP", + "fr": "EMS-ESP", + "it": "EMS-ESP", + "es": "EMS-ESP", + "pl": "EMS-ESP", + "zh-cn": "EMS-ESP" + }, + "ems expert settings": { + "en": "EMS expert settings", + "de": "EMS Experteneinstellungen", + "ru": "EMS экспертные настройки", + "pt": "configurações especializadas ems", + "nl": "ems-expertinstellingen", + "fr": "paramètres experts ems", + "it": "impostazioni esperte", + "es": "configuración experta ems", + "pl": "ustawienia eksperckie ems", + "zh-cn": "ems专家设置" + }, + "km200_structure": { + "en": "KM200 structure", + "de": "KM200 Struktur", + "ru": "Строение км200", + "pt": "estrutura km200", + "nl": "km200-structuur", + "fr": "km200 structure", + "it": "km200 struttura", + "es": "estructura km200", + "pl": "km200 struktura", + "zh-cn": "km200 结构" + }, + "emsesp_active": { + "en": "EMS-ESP gateway active", + "de": "EMS-ESP Gateway aktiv", + "ru": "EMS-ESP gateway активен", + "pt": "EMS-ESP gateway ativo", + "nl": "EMS-ESP gateway actief", + "fr": "EMS-ESP gateway actif", + "it": "EMS-ESP gateway attivo", + "es": "EMS-ESP gateway activo", + "pl": "EMS-ESP gateway aktywny", + "zh-cn": "EMS-ESP 活动" + }, + "ems_http_wait": { + "en": "msec delay", + "de": "Millisekunden Verzögerung", + "ru": "задержка в миллисекундах", + "pt": "atraso de mseg", + "nl": "msec vertraging", + "fr": "délai en millisecondes", + "it": "ritardo di msec", + "es": "retraso de milisegundos", + "pl": "Opóźnienie w milisekundach", + "zh-cn": "毫秒延迟" + }, + "ems_dallas": { + "en": "temperature sensors", + "de": "Temperatursensoren", + "ru": "датчики температуры", + "pt": "sensores de temperatura", + "nl": "Temperatuursensoren", + "fr": "capteurs de température", + "it": "sensori di temperatura", + "es": "sensores de temperatura", + "pl": "czujnik temperatury", + "uk": "датчики температури", + "zh-cn": "温度传感器" + }, + "ems_dallas_old_format": { + "en": "use old dallas prefix for sensors", + "de": "Alten Dallas-Präfix für Sensoren verwenden", + "ru": "использовать старый префикс Далласа для датчиков", + "pt": "usar prefixo de dallas antigo para sensores", + "nl": "gebruik oude dallas prefix voor sensoren", + "fr": "utiliser le vieux préfixe de dallas pour les capteurs", + "it": "utilizzare il vecchio prefisso dallas per i sensori", + "es": "utilizar el antiguo prefijo dallas para sensores", + "pl": "użycie prefiksu dallas dla czujników", + "uk": "використовувати старий префікс dallas для датчиків", + "zh-cn": "对传感器使用旧的dallas prefix" + }, + "ems_analog": { + "en": "analog", + "de": "Analog", + "ru": "analog", + "pt": "Analog", + "nl": "analog", + "fr": "analog", + "it": "analog", + "es": "analog", + "pl": "Analog", + "zh-cn": "" + }, + "ems_custom": { + "en": "enable search for additional EMS+ entities (switchTimes & holidayModes) - write access needed", + "de": "Suche nach zusätzlichen EMS+ Entitäten (switchTimes & holidayModes) - Schreibzugriff erforderlich", + "ru": "включите поиск дополнительных EMS+ организаций (switchTimes & holidayModes) - напишите нужный доступ", + "pt": "ativar a busca por entidades EMS+ adicionais (switchTimes & holidayModes) - escrever o acesso necessário", + "nl": "beschikbare zoektocht naar extra EMS + entiteiten (switchTimes & holidayModes) Schrijf toegang nodig", + "fr": "activer la recherche d'autres entités EMS+ (switchTimes & holidayModes) - écrire l'accès nécessaire", + "it": "abilitare la ricerca di ulteriori entità EMS+ (switchTimes & holidayModes) - accesso di scrittura necessario", + "es": "habilitar la búsqueda de nuevas entidades EMS+ (switchTimes & holidayModes) - escritura acceso necesario", + "pl": "umożliwia wyszukiwanie dodatkowych podmiotów EMS+ (switchTimes & holidayModes) – pisanie dostępu potrzebnego do informacji", + "uk": "увімкніть пошук додаткових сутностей EMS+ (switchTimes & holidayModes) - напишіть доступ до потрібного", + "zh-cn": "能够寻找更多的电子信息管理系统+实体(奇怪制度和节假节制)—— 写出需要的准入" + }, + "ems_custom_elements": { + "en": "read ems-esp custom elements", + "de": "EMS-ESP benutzerdefinierte Elemente lesen", + "ru": "читать ems-esp пользовательские элементы", + "pt": "ler elementos personalizados emsp", + "nl": "lees keizersnede elementen", + "fr": "lire les éléments personnalisés ems", + "it": "leggere ems-esp elementi personalizzati", + "es": "leer elementos personalizados emsp", + "pl": "czytanie elementów dostosownych", + "uk": "читати ems-esp користувальницьких елементів", + "zh-cn": "读写成的习俗要素" + }, + "ems_polling": { + "en": "polling in sec", + "de": "Polling in Sek", + "ru": "опрос в секундах", + "pt": "votação em seg", + "nl": "polling in sec", + "fr": "sondage en secondes", + "it": "sondaggio in secondi", + "es": "sondeo en segundos", + "pl": "odpytywanie w sek", + "zh-cn": "秒轮询" + }, + "emsesp_ip": { + "en": "IP address", + "de": "IP Adresse", + "ru": "айпи адрес", + "pt": "endereço de IP", + "nl": "IP adres", + "fr": "adresse IP", + "it": "indirizzo IP", + "es": "dirección IP", + "pl": "adres IP", + "zh-cn": "IP地址" + }, + "ems_apiv3": { + "en": "use REST API V3", + "de": "REST-API V3 verwenden", + "ru": "использовать REST API V3", + "pt": "usar REST API V3", + "nl": "gebruik REST API V3", + "fr": "utiliser l'API REST V3", + "it": "usa l'API REST V3", + "es": "utilizar REST API V3", + "pl": "użyj REST API V3", + "zh-cn": "使用 REST API V3" + }, + "ems_token": { + "en": "ems-esp access token ", + "de": "EMS-ESP Zugriffstoken ", + "ru": "токен доступа ems ", + "pt": "token de acesso ems ", + "nl": "ems-toegangstoken ", + "fr": "jeton d'accès ems ", + "it": "token di accesso ems ", + "es": "Token de acceso ems ", + "pl": "token dostępu ems ", + "zh-cn": "ems 访问令牌 " + }, + "ems_energy": { + "en": "calculate energy statistics", + "de": "Energiestatistik berechnen", + "ru": "вычислить энергетическую статистику", + "pt": "calcular estatísticas de energia", + "nl": "vertaling:", + "fr": "calculer les statistiques énergétiques", + "it": "calcolo delle statistiche energetiche", + "es": "calcular estadísticas de energía", + "pl": "dane statystyczne", + "uk": "розрахувати статистику енергії", + "zh-cn": "能源统计" + }, + "ems_nominalpower": { + "en": "nominal boiler power", + "de": "Nennheizleistung", + "ru": "номинальная мощность котла", + "pt": "potência nominal da caldeira", + "nl": "nominal boiler power", + "fr": "puissance nominale de chaudière", + "it": "potenza caldaia nominale", + "es": "potencia nominal de caldera", + "pl": "nominalna władza kotłów", + "uk": "номінальна котельна потужність", + "zh-cn": "名义动力" + }, + "ems_modulation": { + "en": "state for modulation", + "de": "State für die Modulation", + "ru": "состояние для модуляции", + "pt": "estado para modulação", + "nl": "staat voor bescheidenheid", + "fr": "état de modulation", + "it": "stato di modulazione", + "es": "estado para modulación", + "pl": "stan modulacji", + "uk": "стан модуляції", + "zh-cn": "投机状态" + }, + "ems_wwactive": { + "en": "state warm water active", + "de": "State warmes Wasser aktiv", + "ru": "состояние теплая вода активная", + "pt": "água quente do estado ativo", + "nl": "staat warm water", + "fr": "eau chaude", + "it": "stato acqua calda attiva", + "es": "agua caliente estatal activo", + "pl": "ciepłe wody", + "uk": "активний стан теплої води", + "zh-cn": "a. 国有变暖" + }, + "km200_active": { + "en": "KM200 gateway active", + "de": "KM200 Gateway aktiv", + "ru": "KM200 gateway активный", + "pt": "KM200 gateway ativo", + "nl": "KM200 gateway actief", + "fr": "KM200 gateway actif", + "it": "KM200 gateway attivo", + "es": "KM200 gateway activo", + "pl": "KM200 gateway aktywny", + "zh-cn": "KM200有源" + }, + "km200_ip": { + "en": "IP address", + "de": "IP Adresse", + "ru": "айпи адрес", + "pt": "endereço de IP", + "nl": "IP adres", + "fr": "adresse IP", + "it": "indirizzo IP", + "es": "dirección IP", + "pl": "adres IP", + "zh-cn": "IP地址" + }, + "km200_polling": { + "en": "polling in sec", + "de": "Polling in Sek", + "ru": "опрос в секундах", + "pt": "votação em seg", + "nl": "polling in sec", + "fr": "sondage en secondes", + "it": "sondaggio in secondi", + "es": "sondeo en segundos", + "pl": "odpytywanie w sek", + "zh-cn": "秒轮询" + }, + "km200_entry": { + "en": "new km200 entry-point", + "de": "neuer km200 Einstiegspunkt", + "ru": "new km200 entry-point", + "pt": "new km200 entry-point", + "nl": "new km200 entry-point", + "fr": "new km200 entry-point", + "it": "new km200 entry-point", + "es": "new km200 entry-point", + "pl": "new km200 entry-point", + "zh-cn": "new km200 entry-point" + }, + "control_file": { + "en": "csv-file for km200 | empty: no km200 data *: read all km200 fields", + "de": "CSV-Datei für km200 | leer: keine km200-Daten *: alle km200-Felder lesen", + "ru": "csv-файл для км200 | пусто: нет данных км200 *: прочитать все поля км200", + "pt": "arquivo csv para km200 | vazio: sem dados km200 *: ler todos os campos km200", + "nl": "csv-bestand voor km200 | leeg: geen km200-gegevens *: lees alle km200-velden", + "fr": "fichier csv pour km200 | vide : pas de données km200 * : lire tous les champs km200", + "it": "file csv per km200 | vuoto: nessun dato km200 *: leggi tutti i campi km200", + "es": "archivo csv para km200 | vacío: sin datos de km200 *: leer todos los campos de km200", + "pl": "plik csv dla km200 | puste: brak danych km200 *: odczytaj wszystkie pola km200", + "zh-cn": "km200 的 csv 文件 |空:没有 km200 数据 *:读取所有 km200 字段" + }, + "gateway_pw": { + "en": "gateway password", + "de": "Gateway-Passwort", + "ru": "пароль шлюза", + "pt": "senha de gateway", + "nl": "gateway wachtwoord", + "fr": "mot de passe passerelle", + "it": "password del gateway", + "es": "contraseña de puerta de enlace", + "pl": "hasło do bramy", + "zh-cn": "网关密码" + }, + "private_pw": { + "en": "private password", + "de": "privates Passwort", + "ru": "личный пароль", + "pt": "senha privada", + "nl": "privé wachtwoord", + "fr": "Mot de passe privé", + "it": "password privata", + "es": "contraseña privada", + "pl": "prywatne hasło", + "zh-cn": "私人密码" + }, + "recordings": { + "en": "energy recordings (km200 only)", + "de": "Energieaufzeichnungen (nur km200)", + "ru": "записи энергии (только 200 км)", + "pt": "registros de energia (apenas km200)", + "nl": "energieregistraties (alleen km200)", + "fr": "enregistrements énergétiques (km200 uniquement)", + "it": "rilevazioni energetiche (solo km200)", + "es": "registros de energía (solo km200)", + "pl": "zapisy energii (tylko km200)", + "zh-cn": "能量记录(仅限km200)" + }, + "recordings_format": { + "en": "plain states format without db", + "de": "State-Format ohne Datenbank", + "ru": "записи в формате простого состояния без db", + "pt": "gravações em formato de estados simples sem db", + "nl": "opnames zonder db", + "fr": "enregistrements format plain states sans db", + "it": "registrazioni in formato stati semplici senza db", + "es": "grabaciones formato de estados simples sin db", + "pl": "nagrania w formacie stanów czystych bez db", + "zh-cn": "录音无 db 的普通状态格式" + }, + "array of values": { + "en": "array of values", + "de": "Array von Werten", + "ru": "массив значений", + "pt": "matriz de valores", + "nl": "reeks waarden", + "fr": "tableau de valeurs", + "it": "matrice di valori", + "es": "matriz de valores", + "pl": "tablica wartości", + "zh-cn": "值数组" + }, + "array of values with ts": { + "en": "array of values with ts", + "de": "Array von Werten mit ts", + "ru": "массив значений с ts", + "pt": "array de valores com ts", + "nl": "reeks waarden met ts", + "fr": "tableau de valeurs avec ts", + "it": "matrice di valori con ts", + "es": "matriz de valores con ts", + "pl": "tablica wartości z ts", + "zh-cn": "带有 ts 的值数组" + }, + "array of values with date-format": { + "en": "array of values with date-format", + "de": "Array von Werten mit Datumsformat", + "ru": "массив значений в формате даты", + "pt": "array de valores com formato de data", + "nl": "reeks waarden met datumnotatie", + "fr": "tableau de valeurs au format date", + "it": "matrice di valori con formato data", + "es": "matriz de valores con formato de fecha", + "pl": "tablica wartości z formatem daty", + "zh-cn": "日期格式的值数组" + }, + "r_multi": { + "en": "multiplicator ", + "de": "Multiplikator", + "ru": "множитель", + "pt": "multiplicador", + "nl": "vermenigvuldiger", + "fr": "multiplicateur", + "it": "moltiplicatore", + "es": "multiplicador", + "pl": "mnożnik", + "zh-cn": "乘数" + }, + "r_month": { + "en": "sum of daily values for actual month", + "de": "Summe der Tageswerte für den aktuellen Monat", + "ru": "сумма дневных значений за фактический месяц", + "pt": "soma dos valores diários para o mês real", + "nl": "som van dagelijkse waarden voor de werkelijke maand", + "fr": "somme des valeurs quotidiennes pour le mois réel", + "it": "somma dei valori giornalieri per il mese effettivo", + "es": "suma de valores diarios para el mes real", + "pl": "suma wartości dziennych dla aktualnego miesiąca", + "zh-cn": "实际月份的日值总和" + }, + "r_c": { + "en": "samples interpolation", + "de": "Samples-Interpolation", + "ru": "выборки интерполяции", + "pt": "interpolação de amostras", + "nl": "steekproeven interpolatie:", + "fr": "interpolation d'échantillons", + "it": "interpolazione dei campioni", + "es": "interpolación de muestras", + "pl": "interpolacja próbek", + "zh-cn": "样本插值" + }, + "statistics" :{ + "en": "create statistics - boiler starts need active database", + "de": "Statistiken erstellen - Kesselstarts benötigen aktive Datenbank", + "ru": "Создать статистику - бойлеру нужна активная база данных", + "pt": "Criar estatísticas - caldeira começa a precisar de banco de dados ativo", + "nl": "Creëer statistieken. Boiler heeft actieve database nodig", + "fr": "Créer des statistiques - la chaudière commence besoin de base de données active", + "it": "Creare statistiche - caldaia inizia bisogno di database attivo", + "es": "Crear estadísticas - La caldera comienza a necesitar una base de datos activa", + "pl": "Statystyki kreacyjne – kotł zaczyna potrzebować aktywnej bazy danych", + "uk": "Створіть статистику - котел починає потрібні активні бази даних", + "zh-cn": "D. 创建统计——开端需要积极数据库" + }, + "db_instance": { + "en": "db instance", + "de": "DB Instanz", + "ru": "db экземпляр", + "pt": "instância db", + "nl": "db instituut", + "fr": "db instance", + "it": "caso db", + "es": "db instance", + "pl": "instancja db", + "uk": "db екземпляр", + "zh-cn": "d. 实例" + }, + "database": { + "en": "database", + "de": "Datenbank", + "ru": "база данных", + "pt": "base de dados", + "nl": "database", + "fr": "base de données", + "it": "Banca dati", + "es": "base de datos", + "pl": "Baza danych", + "zh-cn": "数据库" + }, + "eff_active": { + "en": "calculate boiler efficieny (gas and oil)", + "de": "Kesselwirkungsgrad berechnen (Gas und Öl)", + "ru": "рассчитать эффективность котла (газ и масло)", + "pt": "calcular a eficiência da caldeira (gás e óleo)", + "nl": "bereken de boiler efficiëny (gas en olie)", + "fr": "calculer l'efficacité des chaudières (gaz et huile)", + "it": "calcolare l'efficienza della caldaia (gas e olio)", + "es": "calcular la eficiencia de la caldera (gas y aceite)", + "pl": "obliczaj kotłów (gaz i olej)", + "uk": "розрахувати ефективність котла (газ і масло)", + "zh-cn": "(a) 计算碎片(气体和石油)" + }, + "eff20": { + "en": "< 20°C", + "de": "< 20°C", + "ru": "<20 ° С", + "pt": "<20 °C", + "nl": "< 20°C", + "fr": "< 20°C", + "it": "< 20°C", + "es": "<20 °C", + "pl": "<20°C", + "zh-cn": "< 20°C" + }, + "eff25": { + "en": "< 25°C", + "de": "< 25°C", + "ru": "<25 ° С", + "pt": "<25 °C", + "nl": "< 25°C", + "fr": "< 25°C", + "it": "< 25°C", + "es": "<25 °C", + "pl": "< 25°C", + "zh-cn": "< 25°C" + }, + "eff30": { + "en": "< 30°C", + "de": "< 30°C", + "ru": "<30 ° С", + "pt": "<30 °C", + "nl": "< 30°C", + "fr": "< 30°C", + "it": "< 30°C", + "es": "<30 °C", + "pl": "< 30°C", + "zh-cn": "< 30°C" + }, + "eff35": { + "en": "< 35°C", + "de": "< 35°C", + "ru": "<35 ° С", + "pt": "<35 °C", + "nl": "< 35°C", + "fr": "< 35°C", + "it": "< 35°C", + "es": "<35 °C", + "pl": "<35°C", + "zh-cn": "< 35°C" + }, + "eff40": { + "en": "< 40°C", + "de": "< 40°C", + "ru": "<40 ° С", + "pt": "<40 °C", + "nl": "< 40°C", + "fr": "< 40°C", + "it": "< 40°C", + "es": "<40 °C", + "pl": "<40°C", + "zh-cn": "< 40°C" + }, + "eff45": { + "en": "< 45°C", + "de": "< 45°C", + "ru": "<45 ° С", + "pt": "<45 °C", + "nl": "< 45°C", + "fr": "< 45°C", + "it": "< 45°C", + "es": "<45 °C", + "pl": "<45°C", + "zh-cn": "< 45°C" + }, + "eff50": { + "en": "< 50°C", + "de": "< 50°C", + "ru": "<50 ° С", + "pt": "<50 °C", + "nl": "< 50°C", + "fr": "< 50°C", + "it": "< 50°C", + "es": "<50 °C", + "pl": "< 50°C", + "zh-cn": "< 50°C" + }, + "eff55": { + "en": "< 55°C", + "de": "< 55°C", + "ru": "<55 ° С", + "pt": "<55 °C", + "nl": "< 55°C", + "fr": "< 55°C", + "it": "< 55°C", + "es": "<55 °C", + "pl": "<55°C", + "zh-cn": "< 55°C" + }, + "eff60": { + "en": "< 60°C", + "de": "< 60°C", + "ru": "<60 ° С", + "pt": "<60 °C", + "nl": "< 60°C", + "fr": "< 60°C", + "it": "< 60°C", + "es": "<60 °C", + "pl": "< 60°C", + "zh-cn": "< 60°C" + }, + "eff70": { + "en": "< 70°C", + "de": "< 70°C", + "ru": "<70 ° С", + "pt": "<70 °C", + "nl": "< 70°C", + "fr": "< 70°C", + "it": "< 70°C", + "es": "<70 °C", + "pl": "<70°C", + "zh-cn": "< 70°C" + }, + "modulation": { + "en": "state modulation", + "de": "State Modulation", + "ru": "государственная модуляция", + "pt": "Modulação de estado", + "nl": "staat modulatie", + "fr": "modulation d'état", + "it": "modulazione di stato", + "es": "modulación de estado", + "pl": "modulacja stanu", + "zh-cn": "状态调制" + }, + "supplytemp": { + "en": "state supplytemp", + "de": "State Vorlauftemp", + "ru": "состояние поставкиtemp", + "pt": "estado de abastecimentotemp", + "nl": "staat toevoertemp", + "fr": "état supplytemp", + "it": "statale temp", + "es": "estado suministrotemp", + "pl": "stan zasilania temp", + "zh-cn": "国家供应温度" + }, + "returntemp": { + "en": "state returntemp", + "de": "State Rücklauftemp", + "ru": "состояние returntemp", + "pt": "estado returntemp", + "nl": "staat retourtemp", + "fr": "état retour temp", + "it": "stato ritorno temp", + "es": "estado temperatura retorno", + "pl": "stan powrotu temp", + "zh-cn": "状态返回温度" + }, + "syslog": { + "en": "syslog server active?", + "de": "Syslog-Server aktiv?", + "ru": "сервер системного журнала активен?", + "pt": "servidor syslog ativo?", + "nl": "syslog-server actief?", + "fr": "serveur syslog actif ?", + "it": "server syslog attivo?", + "es": "servidor syslog activo?", + "pl": "serwer syslog jest aktywny?", + "zh-cn": "系统日志服务器活动?" + }, + "syslog_port": { + "en": "syslog port", + "de": "Syslog-Port", + "ru": "порт системного журнала", + "pt": "porta syslog", + "nl": "syslog-poort", + "fr": "port syslog", + "it": "porta syslog", + "es": "puerto syslog", + "pl": "port dziennika systemowego", + "zh-cn": "系统日志端口" + }, + "states_reorg": { + "en": "delete states on startup", + "de": "Löschen von States beim Start", + "ru": "удалить состояния на startup", + "pt": "excluir estados na inicialização", + "nl": "delete staten opstarten", + "fr": "supprimer les états de démarrage", + "it": "eliminare gli stati all'avvio", + "es": "eliminar estados en la startup", + "pl": "usunięte stany", + "uk": "видалити стани на стартапі", + "zh-cn": "删除开端国" + }, + "states_undefined": { + "en": "create states for undefined telegrams", + "de": "States für undefinierte Telegramme erstellen", + "ru": "создавать состояния для неопределенных телеграмм", + "pt": "criar estados para telegramas indefinidos", + "nl": "maak staten voor ongedefinieerde telegrammen", + "fr": "créer des états pour les télégrammes non définis", + "it": "creare stati per telegrammi non definiti", + "es": "crear estados para telegramas indefinidos", + "pl": "tworzyć stany dla niezdefiniowanych telegramów", + "zh-cn": "为未定义的电报创建状态" + }, + "heatdemand": { + "en": "Heatdemand calculation and control active", + "de": "Heizungsbedarf Berechnung und Kontrolle aktiv", + "ru": "Расчет тепла и контроль активных", + "pt": "Cálculo e controle de calor ativos", + "nl": "Heatdemand berekeningen en controle actief", + "fr": "Calcul et contrôle de la chaleur active", + "it": "Calcolo e controllo attivo", + "es": "Calculo y control de calor activo", + "pl": "Heatdemand oblicza i kontrola aktywna", + "uk": "Розрахунок тепла та контроль активності", + "zh-cn": "积极计算和控制" + }, + "room": { + "en": "state attributes: room", + "de": "State Attribute: Raum", + "ru": "государственные атрибуты: комната", + "pt": "atributos de estado: quarto", + "nl": "de staat roept:", + "fr": "attributs d'état: chambre", + "it": "attributi di stato: camera", + "es": "atributos estatales: sala", + "pl": "atrybuty państwowe: pomieszczenie", + "uk": "атрибути держави: номер", + "zh-cn": "国家属性:会议室" + }, + "function": { + "en": "state attributes: function", + "de": "State Attribute: Funktion", + "ru": "государственные атрибуты: функция", + "pt": "atributos de estado: função", + "nl": "staatsaanklachten:", + "fr": "attributs d'état: fonction", + "it": "attributi di stato: funzione", + "es": "atributos estatales: función", + "pl": "atrybuty państwowe: funkcja", + "uk": "атрибути стану: функція", + "zh-cn": "国情:职能" + } +}; \ No newline at end of file