iobroker.sonoff 3.2.1 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +95 -149
  3. package/admin/i18n/de.json +89 -0
  4. package/admin/i18n/en.json +89 -0
  5. package/admin/i18n/es.json +89 -0
  6. package/admin/i18n/fr.json +89 -0
  7. package/admin/i18n/it.json +89 -0
  8. package/admin/i18n/nl.json +89 -0
  9. package/admin/i18n/pl.json +89 -0
  10. package/admin/i18n/pt.json +89 -0
  11. package/admin/i18n/ru.json +89 -0
  12. package/admin/i18n/uk.json +89 -0
  13. package/admin/i18n/zh-cn.json +89 -0
  14. package/admin/jsonConfig.json +394 -125
  15. package/build/lib/bridge.js +512 -0
  16. package/build/lib/bridge.js.map +1 -0
  17. package/build/lib/checkStates.js +68 -0
  18. package/build/lib/checkStates.js.map +1 -0
  19. package/build/lib/datapoints.js +430 -0
  20. package/build/lib/datapoints.js.map +1 -0
  21. package/build/lib/mqttBase.js +1280 -0
  22. package/build/lib/mqttBase.js.map +1 -0
  23. package/build/lib/server.js +485 -0
  24. package/build/lib/server.js.map +1 -0
  25. package/build/main.js +103 -0
  26. package/build/main.js.map +1 -0
  27. package/io-package.json +64 -43
  28. package/package.json +23 -19
  29. package/admin/i18n/de/translations.json +0 -54
  30. package/admin/i18n/en/translations.json +0 -54
  31. package/admin/i18n/es/translations.json +0 -54
  32. package/admin/i18n/fr/translations.json +0 -54
  33. package/admin/i18n/it/translations.json +0 -54
  34. package/admin/i18n/nl/translations.json +0 -54
  35. package/admin/i18n/pl/translations.json +0 -54
  36. package/admin/i18n/pt/translations.json +0 -54
  37. package/admin/i18n/ru/translations.json +0 -54
  38. package/admin/i18n/uk/translations.json +0 -54
  39. package/admin/i18n/zh-cn/translations.json +0 -54
  40. package/admin/index.html +0 -177
  41. package/admin/index_m.html +0 -218
  42. package/admin/words.js +0 -63
  43. package/lib/datapoints.js +0 -216
  44. package/lib/server.js +0 -1810
  45. package/main.js +0 -99
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.findShortenedStates = findShortenedStates;
7
+ const datapoints_1 = __importDefault(require("./datapoints"));
8
+ /** Keys of the data points which contain "_", grouped by their last part */
9
+ function getKeysByLastPart() {
10
+ const keys = {};
11
+ for (const key of Object.keys(datapoints_1.default)) {
12
+ const pos = key.lastIndexOf('_');
13
+ if (pos > 0) {
14
+ const lastPart = key.substring(pos + 1);
15
+ keys[lastPart] ||= [];
16
+ keys[lastPart].push(key);
17
+ }
18
+ }
19
+ return keys;
20
+ }
21
+ /**
22
+ * The versions 3.3.x created the states inside a group with a shortened name (issue #489):
23
+ * only the last part of the key of the data point was used, so "SML_Total_in" was created
24
+ * as "SML_in". Such states are not updated anymore after the correction.
25
+ *
26
+ * They are only reported and never deleted, because they can still contain the history of the user.
27
+ */
28
+ async function findShortenedStates(adapter) {
29
+ const keysByLastPart = getKeysByLastPart();
30
+ const objects = await adapter.getForeignObjectsAsync(`${adapter.namespace}.*`, 'state');
31
+ const found = [];
32
+ for (const [id, obj] of Object.entries(objects)) {
33
+ const dot = id.lastIndexOf('.');
34
+ const name = id.substring(dot + 1);
35
+ const underscore = name.lastIndexOf('_');
36
+ if (underscore < 1) {
37
+ continue;
38
+ }
39
+ const path = name.substring(0, underscore);
40
+ const lastPart = name.substring(underscore + 1);
41
+ // "SML_Volt" is simply the data point "Volt" in the group "SML"
42
+ if (datapoints_1.default[lastPart]) {
43
+ continue;
44
+ }
45
+ for (const key of keysByLastPart[lastPart] || []) {
46
+ // "SML_Total_in" already contains the complete key of the data point
47
+ if (name.endsWith(`_${key}`)) {
48
+ continue;
49
+ }
50
+ // "VEML6075_UvIndex" in the group "VEML6075" is correct, the path is removed there
51
+ if (key.startsWith(`${path}_`)) {
52
+ continue;
53
+ }
54
+ const definition = datapoints_1.default[key];
55
+ const common = obj.common;
56
+ const expected = `${id.substring(0, dot)}.${path}_${key}`;
57
+ // Either the state with the correct name exists already, or the state was created
58
+ // from exactly this data point - otherwise it is a state of the device itself
59
+ if (objects[expected] ||
60
+ (common.type === definition.type && common.role === definition.role && common.unit === definition.unit)) {
61
+ found.push({ id, expected });
62
+ break;
63
+ }
64
+ }
65
+ }
66
+ return found;
67
+ }
68
+ //# sourceMappingURL=checkStates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkStates.js","sourceRoot":"","sources":["../../src/lib/checkStates.ts"],"names":[],"mappings":";;;;;AA8BA,kDAgDC;AA9ED,8DAAiC;AASjC,4EAA4E;AAC5E,SAAS,iBAAiB;IACtB,MAAM,IAAI,GAAqC,EAAE,CAAC;IAClD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,oBAAK,CAAC,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;YACV,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACxC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,mBAAmB,CAAC,OAAyB;IAC/D,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,sBAAsB,CAAC,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,OAAO,CAAC,CAAC;IACxF,MAAM,KAAK,GAAqB,EAAE,CAAC;IAEnC,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACjB,SAAS;QACb,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAEhD,gEAAgE;QAChE,IAAI,oBAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClB,SAAS;QACb,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/C,qEAAqE;YACrE,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC;gBAC3B,SAAS;YACb,CAAC;YACD,mFAAmF;YACnF,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC;gBAC7B,SAAS;YACb,CAAC;YAED,MAAM,UAAU,GAAG,oBAAK,CAAC,GAAG,CAAC,CAAC;YAC9B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;YAC1B,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;YAE1D,kFAAkF;YAClF,8EAA8E;YAC9E,IACI,OAAO,CAAC,QAAQ,CAAC;gBACjB,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,CAAC,EACzG,CAAC;gBACC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAC7B,MAAM;YACV,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC","sourcesContent":["import types from './datapoints';\n\nexport interface ShortenedState {\n /** ID of the state with the shortened name */\n id: string;\n /** ID this state has with the corrected name */\n expected: string;\n}\n\n/** Keys of the data points which contain \"_\", grouped by their last part */\nfunction getKeysByLastPart(): { [lastPart: string]: string[] } {\n const keys: { [lastPart: string]: string[] } = {};\n for (const key of Object.keys(types)) {\n const pos = key.lastIndexOf('_');\n if (pos > 0) {\n const lastPart = key.substring(pos + 1);\n keys[lastPart] ||= [];\n keys[lastPart].push(key);\n }\n }\n return keys;\n}\n\n/**\n * The versions 3.3.x created the states inside a group with a shortened name (issue #489):\n * only the last part of the key of the data point was used, so \"SML_Total_in\" was created\n * as \"SML_in\". Such states are not updated anymore after the correction.\n *\n * They are only reported and never deleted, because they can still contain the history of the user.\n */\nexport async function findShortenedStates(adapter: ioBroker.Adapter): Promise<ShortenedState[]> {\n const keysByLastPart = getKeysByLastPart();\n const objects = await adapter.getForeignObjectsAsync(`${adapter.namespace}.*`, 'state');\n const found: ShortenedState[] = [];\n\n for (const [id, obj] of Object.entries(objects)) {\n const dot = id.lastIndexOf('.');\n const name = id.substring(dot + 1);\n const underscore = name.lastIndexOf('_');\n if (underscore < 1) {\n continue;\n }\n\n const path = name.substring(0, underscore);\n const lastPart = name.substring(underscore + 1);\n\n // \"SML_Volt\" is simply the data point \"Volt\" in the group \"SML\"\n if (types[lastPart]) {\n continue;\n }\n\n for (const key of keysByLastPart[lastPart] || []) {\n // \"SML_Total_in\" already contains the complete key of the data point\n if (name.endsWith(`_${key}`)) {\n continue;\n }\n // \"VEML6075_UvIndex\" in the group \"VEML6075\" is correct, the path is removed there\n if (key.startsWith(`${path}_`)) {\n continue;\n }\n\n const definition = types[key];\n const common = obj.common;\n const expected = `${id.substring(0, dot)}.${path}_${key}`;\n\n // Either the state with the correct name exists already, or the state was created\n // from exactly this data point - otherwise it is a state of the device itself\n if (\n objects[expected] ||\n (common.type === definition.type && common.role === definition.role && common.unit === definition.unit)\n ) {\n found.push({ id, expected });\n break;\n }\n }\n }\n\n return found;\n}\n"]}
@@ -0,0 +1,430 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const datapoints = {
4
+ 'Approx. Altitude': { type: 'number', role: 'value.altitude', read: true, write: false, unit: 'm' },
5
+ 'PM2.5': { type: 'number', role: 'value', read: true, write: false, unit: 'ug/m3' },
6
+ A0: { type: 'number', role: 'value', read: true, write: false },
7
+ A1: { type: 'number', role: 'value', read: true, write: false },
8
+ A2: { type: 'number', role: 'value', read: true, write: false },
9
+ A3: { type: 'number', role: 'value', read: true, write: false },
10
+ Ap: { type: 'number', role: 'value', read: true, write: false },
11
+ APMac: { type: 'number', role: 'state', read: true, write: false },
12
+ Action: { type: 'string', role: 'value', read: true, write: true },
13
+ AirQuality: { type: 'number', role: 'value', read: true, write: false, unit: '%' },
14
+ ANALOG: { type: 'object', role: 'state', read: true, write: false },
15
+ Analog0: { type: 'number', role: 'value', read: true, write: false },
16
+ Analog1: { type: 'number', role: 'value', read: true, write: false },
17
+ Analog2: { type: 'number', role: 'value', read: true, write: false },
18
+ Analog3: { type: 'number', role: 'value', read: true, write: false },
19
+ ApparentPower: { type: 'number', role: 'value.power.consumption', read: true, write: false, unit: 'VA' },
20
+ Arm: { type: 'number', role: 'value', read: true, write: true },
21
+ BSSId: { type: 'string', role: 'state', read: true, write: false },
22
+ BatteryPercentage: { type: 'number', role: 'value', read: true, write: false, unit: '%' },
23
+ BatteryVoltage: { type: 'number', role: 'value.voltage', read: true, write: false, unit: 'V' },
24
+ Bits: { type: 'number', role: 'value', read: true, write: false },
25
+ BuildDateTime: { type: 'string', role: 'state', read: true, write: false },
26
+ Blue: { type: 'number', role: 'level.color.blue', read: true, write: true, min: 0, max: 100 },
27
+ Boiler: { type: 'number', role: 'value.temperature', read: true, write: false, unit: '°C' },
28
+ Burner: { type: 'number', role: 'value', read: true, write: false },
29
+ Button1: { type: 'boolean', role: 'button', read: true, write: false },
30
+ Button2: { type: 'boolean', role: 'button', read: true, write: false },
31
+ Button3: { type: 'boolean', role: 'button', read: true, write: false },
32
+ Button4: { type: 'boolean', role: 'button', read: true, write: false },
33
+ Button5: { type: 'boolean', role: 'button', read: true, write: false },
34
+ Button6: { type: 'boolean', role: 'button', read: true, write: false },
35
+ Button7: { type: 'boolean', role: 'button', read: true, write: false },
36
+ Button8: { type: 'boolean', role: 'button', read: true, write: false },
37
+ C1: { type: 'number', role: 'value', read: true, write: false },
38
+ C2: { type: 'number', role: 'value', read: true, write: false },
39
+ C3: { type: 'number', role: 'value', read: true, write: false },
40
+ C4: { type: 'number', role: 'value', read: true, write: false },
41
+ CT: { type: 'number', role: 'level.color.temp', read: true, write: true, min: 153, max: 500 },
42
+ CW: { type: 'number', role: 'level.color.coldwhite', read: true, write: true },
43
+ CW_POWER: { type: 'boolean', role: 'switch.light', read: true, write: true, storeMap: true },
44
+ CarbonDioxide: { type: 'number', role: 'value.CO2', read: true, write: false, unit: 'ppm' },
45
+ Channel: { type: 'number', role: 'level', read: true, write: true },
46
+ Collector: { type: 'number', role: 'value.temperature', read: true, write: false, unit: '°C' },
47
+ Color: { type: 'string', role: 'level.color.rgb', read: true, write: true },
48
+ Counter1: { type: 'number', role: 'value', read: true, write: false },
49
+ Counter2: { type: 'number', role: 'value', read: true, write: false },
50
+ Counter3: { type: 'number', role: 'value', read: true, write: false },
51
+ Counter4: { type: 'number', role: 'value', read: true, write: false },
52
+ Core: { type: 'string', role: 'state', read: true, write: false },
53
+ CpuFrequency: { type: 'number', role: 'value', read: true, write: false, unit: 'MHz' },
54
+ Current: { type: 'number', role: 'value.current', read: true, write: false, unit: 'A' },
55
+ CurrentNeutral: { type: 'number', role: 'value.current', read: true, write: false, unit: 'A' },
56
+ Data: { type: 'string', role: 'state', read: true, write: true },
57
+ Days: { type: 'string', role: 'state', read: true, write: true },
58
+ DewPoint: { type: 'number', role: 'value.temperature', read: true, write: false, unit: '°C' },
59
+ DNSServer1: { type: 'string', role: 'state', read: true, write: false },
60
+ DNSServer2: { type: 'string', role: 'state', read: true, write: false },
61
+ Dimmer: { type: 'number', role: 'level.dimmer', read: true, write: true, min: 0, max: 100 },
62
+ Distance: { type: 'number', role: 'value', read: true, write: false, unit: 'cm' },
63
+ Downtime: { type: 'string', role: 'state', read: true, write: false },
64
+ Druck: { type: 'number', role: 'value.pressure', read: true, write: false, unit: 'hPa' },
65
+ ExportActive: { type: 'number', role: 'value.power.produced', read: true, write: false, unit: 'kWh' },
66
+ Factor: { type: 'number', role: 'value', read: true, write: false },
67
+ Fade: { type: 'boolean', role: 'switch', read: true, write: true },
68
+ Faktor: { type: 'number', role: 'value', read: true, write: false },
69
+ Feuchtigkeit: { type: 'number', role: 'value.humidity', read: true, write: false, unit: '%' },
70
+ Frequenz: { type: 'number', role: 'value.frequency', read: true, write: false, unit: 'Hz' },
71
+ Frequency: { type: 'number', role: 'value.frequency', read: true, write: false, unit: 'Hz' },
72
+ Gateway: { type: 'string', role: 'state', read: true, write: false },
73
+ Green: { type: 'number', role: 'level.color.green', read: true, write: true, min: 0, max: 100 },
74
+ HTTP_API: { type: 'number', role: 'state', read: true, write: false },
75
+ Hardware: { type: 'string', role: 'state', read: true, write: false },
76
+ HSBColor: { type: 'string', role: 'value.hsb', read: true, write: true },
77
+ Hostname: { type: 'string', role: 'state', read: true, write: false },
78
+ Hue: { type: 'number', role: 'level.color.hue', read: true, write: true, min: 0, max: 360 },
79
+ Humidity: { type: 'number', role: 'value.humidity', read: true, write: false, unit: '%' },
80
+ IPAddress: { type: 'string', role: 'state', read: true, write: false },
81
+ IPaddress: { type: 'string', role: 'state', read: true, write: false },
82
+ IP6Global: { type: 'string', role: 'state', read: true, write: false },
83
+ IP6Local: { type: 'string', role: 'state', read: true, write: false },
84
+ IRSend: { type: 'string', role: 'state', read: true, write: true },
85
+ Illuminance: { type: 'number', role: 'value.illuminance', read: true, write: false, unit: 'lx' },
86
+ IrReceived: { type: 'object', role: 'state', read: true, write: false },
87
+ LED_Mode: { type: 'number', role: 'value', read: true, write: true },
88
+ // OpenBeken LED datapoints - https://github.com/openshwprojects/OpenBK7231T_App/blob/main/docs/mqttTopics.md
89
+ led_enableAll: { type: 'boolean', role: 'switch.light', read: true, write: true },
90
+ led_dimmer: { type: 'number', role: 'level.dimmer', read: true, write: true, min: 0, max: 100, unit: '%' },
91
+ led_temperature: {
92
+ type: 'number',
93
+ role: 'level.color.temperature',
94
+ read: true,
95
+ write: true,
96
+ min: 154,
97
+ max: 500,
98
+ },
99
+ led_basecolor_rgb: { type: 'string', role: 'level.color.rgb', read: true, write: true },
100
+ led_finalcolor_rgbcw: { type: 'string', role: 'level.color.rgbcw', read: true, write: false },
101
+ led_basecolor_rgbcw: { type: 'string', role: 'level.color.rgbcw', read: true, write: true },
102
+ led_hue: { type: 'number', role: 'level.color.hue', read: true, write: true, min: 0, max: 360 },
103
+ led_saturation: {
104
+ type: 'number',
105
+ role: 'level.color.saturation',
106
+ read: true,
107
+ write: true,
108
+ min: 0,
109
+ max: 100,
110
+ unit: '%',
111
+ },
112
+ Latitude: { type: 'number', role: 'value.gps.latitude', read: true, write: false, unit: '°' },
113
+ Laufzeit: { type: 'number', role: 'value.duration', read: true, write: false, unit: 'hours' }, /// ?
114
+ LedBar: { type: 'number', role: 'value', read: true, write: true },
115
+ LedTable: { type: 'string', role: 'state', read: true, write: false },
116
+ Leistung: { type: 'number', role: 'value.power.consumption', read: true, write: false, unit: 'W' },
117
+ Light: { type: 'number', role: 'value', read: true, write: false, unit: 'lx' },
118
+ Longitude: { type: 'number', role: 'value.gps.longitude', read: true, write: false, unit: '°' },
119
+ Mac: { type: 'string', role: 'info.mac', read: true, write: false },
120
+ Mode: { type: 'string', role: 'state', read: true, write: true },
121
+ Module: { type: 'string', role: 'state', read: true, write: false },
122
+ Noise: { type: 'number', role: 'value', read: true, write: false, unit: 'dB' },
123
+ Output: { type: 'number', role: 'value', read: true, write: true },
124
+ Outsidetemp: { type: 'number', role: 'value.temperature', read: true, write: false, unit: '°C' },
125
+ PM10: { type: 'number', role: 'value', read: true, write: false, unit: 'ug/m3' },
126
+ PWM1: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 1023 },
127
+ PWM2: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 1023 },
128
+ PWM3: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 1023 },
129
+ PWM4: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 1023 },
130
+ PWM5: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 1023 },
131
+ PWM6: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 1023 },
132
+ PWM7: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 1023 },
133
+ PWM8: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 1023 },
134
+ PWM9: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 1023 },
135
+ PWM10: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 1023 },
136
+ PWM11: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 1023 },
137
+ PWM12: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 1023 },
138
+ PWM13: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 1023 },
139
+ PWM14: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 1023 },
140
+ PWM15: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 1023 },
141
+ PWM16: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 1023 },
142
+ PulseTime1: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 64900 },
143
+ PulseTime2: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 64900 },
144
+ PulseTime3: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 64900 },
145
+ PulseTime4: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 64900 },
146
+ PulseTime5: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 64900 },
147
+ PulseTime6: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 64900 },
148
+ PulseTime7: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 64900 },
149
+ PulseTime8: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 64900 },
150
+ PulseTime9: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 64900 },
151
+ PulseTime10: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 64900 },
152
+ PulseTime11: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 64900 },
153
+ PulseTime12: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 64900 },
154
+ PulseTime13: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 64900 },
155
+ PulseTime14: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 64900 },
156
+ PulseTime15: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 64900 },
157
+ PulseTime16: { type: 'number', role: 'value', read: true, write: true, min: 0, max: 64900 },
158
+ POWER10: { type: 'boolean', role: 'switch', read: true, write: true, storeMap: true },
159
+ POWER11: { type: 'boolean', role: 'switch', read: true, write: true, storeMap: true },
160
+ POWER12: { type: 'boolean', role: 'switch', read: true, write: true, storeMap: true },
161
+ POWER13: { type: 'boolean', role: 'switch', read: true, write: true, storeMap: true },
162
+ POWER14: { type: 'boolean', role: 'switch', read: true, write: true, storeMap: true },
163
+ POWER15: { type: 'boolean', role: 'switch', read: true, write: true, storeMap: true },
164
+ POWER16: { type: 'boolean', role: 'switch', read: true, write: true, storeMap: true },
165
+ POWER17: { type: 'boolean', role: 'switch', read: true, write: true, storeMap: true },
166
+ POWER18: { type: 'boolean', role: 'switch', read: true, write: true, storeMap: true },
167
+ POWER19: { type: 'boolean', role: 'switch', read: true, write: true, storeMap: true },
168
+ POWER1: { type: 'boolean', role: 'switch', read: true, write: true, storeMap: true },
169
+ POWER20: { type: 'boolean', role: 'switch', read: true, write: true, storeMap: true },
170
+ POWER21: { type: 'boolean', role: 'switch', read: true, write: true, storeMap: true },
171
+ POWER22: { type: 'boolean', role: 'switch', read: true, write: true, storeMap: true },
172
+ POWER23: { type: 'boolean', role: 'switch', read: true, write: true, storeMap: true },
173
+ POWER24: { type: 'boolean', role: 'switch', read: true, write: true, storeMap: true },
174
+ POWER25: { type: 'boolean', role: 'switch', read: true, write: true, storeMap: true },
175
+ POWER26: { type: 'boolean', role: 'switch', read: true, write: true, storeMap: true },
176
+ POWER27: { type: 'boolean', role: 'switch', read: true, write: true, storeMap: true },
177
+ POWER28: { type: 'boolean', role: 'switch', read: true, write: true, storeMap: true },
178
+ POWER29: { type: 'boolean', role: 'switch', read: true, write: true, storeMap: true },
179
+ POWER2: { type: 'boolean', role: 'switch', read: true, write: true, storeMap: true },
180
+ POWER3: { type: 'boolean', role: 'switch', read: true, write: true, storeMap: true },
181
+ POWER4: { type: 'boolean', role: 'switch', read: true, write: true, storeMap: true },
182
+ POWER5: { type: 'boolean', role: 'switch', read: true, write: true, storeMap: true },
183
+ POWER6: { type: 'boolean', role: 'switch', read: true, write: true, storeMap: true },
184
+ POWER7: { type: 'boolean', role: 'switch', read: true, write: true, storeMap: true },
185
+ POWER8: { type: 'boolean', role: 'switch', read: true, write: true, storeMap: true },
186
+ POWER9: { type: 'boolean', role: 'switch', read: true, write: true, storeMap: true },
187
+ POWER: { type: 'boolean', role: 'switch', read: true, write: true, storeMap: true },
188
+ Power: { type: 'number', role: 'value.power', read: true, write: false, unit: 'W' },
189
+ Power_curr: { type: 'number', role: 'value.power.consumption', read: true, write: false, unit: 'W' },
190
+ // Zigbee device controls - special handling for ZbSend commands
191
+ ZbPower: { type: 'boolean', role: 'switch', read: true, write: true, zbDevice: true },
192
+ PowerDelta: { type: 'number', role: 'value', read: true, write: false, unit: 'W' },
193
+ PowerHigh: { type: 'number', role: 'value', read: true, write: false, unit: 'W' },
194
+ PowerLow: { type: 'number', role: 'value', read: true, write: false, unit: 'W' },
195
+ Pressure: { type: 'number', role: 'value.pressure', read: true, write: false, unit: 'hPa' },
196
+ PressureScaledValue: { type: 'number', role: 'value.pressure', read: true, write: false, unit: 'Pa' },
197
+ Protocol: { type: 'string', role: 'state', read: true, write: true },
198
+ Punkt: { type: 'number', role: 'value', read: true, write: false, unit: '?' }, /// ?
199
+ RGB_POWER: { type: 'boolean', role: 'switch.light', read: true, write: true, storeMap: true },
200
+ RSSI: { type: 'number', role: 'value.rssi', read: true, write: false },
201
+ ReactivePower: { type: 'number', role: 'value.power.consumption', read: true, write: false, unit: 'var' },
202
+ Period: { type: 'number', role: 'value', read: true, write: false },
203
+ Red: { type: 'number', role: 'level.color.red', read: true, write: true, min: 0, max: 100 },
204
+ Repeat: { type: 'number', role: 'value', read: true, write: true },
205
+ RestartReason: { type: 'string', role: 'state', read: true, write: false },
206
+ Returns: { type: 'number', role: 'value.temperature', read: true, write: false, unit: '°C' },
207
+ Roomtemp: { type: 'number', role: 'value.temperature', read: true, write: false, unit: '°C' },
208
+ SHUTTER1: { type: 'number', role: 'state', read: true, write: false },
209
+ SHUTTER2: { type: 'number', role: 'state', read: true, write: false },
210
+ SHUTTER3: { type: 'number', role: 'state', read: true, write: false },
211
+ SHUTTER4: { type: 'number', role: 'state', read: true, write: false },
212
+ SHUTTER5: { type: 'number', role: 'state', read: true, write: false },
213
+ SHUTTER6: { type: 'number', role: 'state', read: true, write: false },
214
+ SHUTTER7: { type: 'number', role: 'state', read: true, write: false },
215
+ SHUTTER8: { type: 'number', role: 'state', read: true, write: false },
216
+ SHUTTER9: { type: 'number', role: 'state', read: true, write: false },
217
+ SHUTTER10: { type: 'number', role: 'state', read: true, write: false },
218
+ SHUTTER11: { type: 'number', role: 'state', read: true, write: false },
219
+ SHUTTER12: { type: 'number', role: 'state', read: true, write: false },
220
+ SHUTTER13: { type: 'number', role: 'state', read: true, write: false },
221
+ SHUTTER14: { type: 'number', role: 'state', read: true, write: false },
222
+ SHUTTER15: { type: 'number', role: 'state', read: true, write: false },
223
+ SHUTTER16: { type: 'number', role: 'state', read: true, write: false },
224
+ SSId: { type: 'string', role: 'state', read: true, write: false },
225
+ Saturation: { type: 'number', role: 'level.color.saturation', read: true, write: true, min: 0, max: 255 },
226
+ SDK: { type: 'string', role: 'state', read: true, write: false },
227
+ Subnetmask: { type: 'string', role: 'state', read: true, write: false },
228
+ Scheme: {
229
+ type: 'number',
230
+ role: 'value',
231
+ read: true,
232
+ write: true,
233
+ min: 0,
234
+ max: 4,
235
+ states: { 0: 'Single color', 1: 'Wakeup', 2: 'Cycle UP', 3: 'Cycle DOWN', 4: 'Random cycle' },
236
+ },
237
+ SeaPressure: { type: 'number', role: 'value.pressure', read: true, write: false, unit: 'hPa' },
238
+ SleepMode: { type: 'string', role: 'state', read: true, write: false },
239
+ Solarpump: { type: 'number', role: 'value', read: true, write: false },
240
+ Solarstorage: { type: 'number', role: 'value.temperature', read: true, write: false, unit: '°C' },
241
+ Spannung: { type: 'number', role: 'value.voltage', read: true, write: false, unit: 'V' },
242
+ Speed: { type: 'number', role: 'value', read: true, write: true },
243
+ Status: { type: 'number', role: 'value', read: true, write: false },
244
+ Strom: { type: 'number', role: 'value.current', read: true, write: false, unit: 'A' },
245
+ Switch1: { type: 'boolean', role: 'switch', read: true, write: true },
246
+ Switch2: { type: 'boolean', role: 'switch', read: true, write: true },
247
+ Switch3: { type: 'boolean', role: 'switch', read: true, write: true },
248
+ Switch4: { type: 'boolean', role: 'switch', read: true, write: true },
249
+ Switch5: { type: 'boolean', role: 'switch', read: true, write: true },
250
+ Switch6: { type: 'boolean', role: 'switch', read: true, write: true },
251
+ Switch7: { type: 'boolean', role: 'switch', read: true, write: true },
252
+ Switch8: { type: 'boolean', role: 'switch', read: true, write: true },
253
+ Switch9: { type: 'boolean', role: 'switch', read: true, write: true },
254
+ Switch10: { type: 'boolean', role: 'switch', read: true, write: true },
255
+ Switch11: { type: 'boolean', role: 'switch', read: true, write: true },
256
+ Switch12: { type: 'boolean', role: 'switch', read: true, write: true },
257
+ Switch13: { type: 'boolean', role: 'switch', read: true, write: true },
258
+ Switch14: { type: 'boolean', role: 'switch', read: true, write: true },
259
+ Switch15: { type: 'boolean', role: 'switch', read: true, write: true },
260
+ Switch16: { type: 'boolean', role: 'switch', read: true, write: true },
261
+ Switch17: { type: 'boolean', role: 'switch', read: true, write: true },
262
+ Switch18: { type: 'boolean', role: 'switch', read: true, write: true },
263
+ Switch19: { type: 'boolean', role: 'switch', read: true, write: true },
264
+ Switch20: { type: 'boolean', role: 'switch', read: true, write: true },
265
+ Switch21: { type: 'boolean', role: 'switch', read: true, write: true },
266
+ Switch22: { type: 'boolean', role: 'switch', read: true, write: true },
267
+ Switch23: { type: 'boolean', role: 'switch', read: true, write: true },
268
+ Switch24: { type: 'boolean', role: 'switch', read: true, write: true },
269
+ Switch25: { type: 'boolean', role: 'switch', read: true, write: true },
270
+ Switch26: { type: 'boolean', role: 'switch', read: true, write: true },
271
+ Switch27: { type: 'boolean', role: 'switch', read: true, write: true },
272
+ Switch28: { type: 'boolean', role: 'switch', read: true, write: true },
273
+ TVOC: { type: 'number', role: 'value.tvoc', read: true, write: false, unit: 'ppb' },
274
+ Temperatur: { type: 'number', role: 'value.temperature', read: true, write: false, unit: '°C' },
275
+ Temperature: { type: 'number', role: 'value.temperature', read: true, write: false, unit: '°C' },
276
+ Time: { type: 'string', role: 'state', read: true, write: true },
277
+ Timer10: { type: 'object', role: 'state', read: true, write: true },
278
+ Timer11: { type: 'object', role: 'state', read: true, write: true },
279
+ Timer12: { type: 'object', role: 'state', read: true, write: true },
280
+ Timer13: { type: 'object', role: 'state', read: true, write: true },
281
+ Timer14: { type: 'object', role: 'state', read: true, write: true },
282
+ Timer15: { type: 'object', role: 'state', read: true, write: true },
283
+ Timer16: { type: 'object', role: 'state', read: true, write: true },
284
+ Timer1: { type: 'object', role: 'state', read: true, write: true },
285
+ Timer2: { type: 'object', role: 'state', read: true, write: true },
286
+ Timer3: { type: 'object', role: 'state', read: true, write: true },
287
+ Timer4: { type: 'object', role: 'state', read: true, write: true },
288
+ Timer5: { type: 'object', role: 'state', read: true, write: true },
289
+ Timer6: { type: 'object', role: 'state', read: true, write: true },
290
+ Timer7: { type: 'object', role: 'state', read: true, write: true },
291
+ Timer8: { type: 'object', role: 'state', read: true, write: true },
292
+ Timer9: { type: 'object', role: 'state', read: true, write: true },
293
+ Today: { type: 'number', role: 'value.power.consumption', read: true, write: false, unit: 'kWh' },
294
+ TodaySumExport: { type: 'number', role: 'value.power.produced', read: true, write: false, unit: 'kWh' },
295
+ TodaySumImport: { type: 'number', role: 'value.power.consumption', read: true, write: false, unit: 'kWh' },
296
+ Total: { type: 'number', role: 'value.power.consumption', read: true, write: false, unit: 'kWh' },
297
+ Total_in: { type: 'number', role: 'value.power.consumption', read: true, write: false, unit: 'kWh' },
298
+ Total_out: { type: 'number', role: 'value.power.produced', read: true, write: false, unit: 'kWh' },
299
+ TotalStartTime: { type: 'string', role: 'date', read: true, write: false },
300
+ Uptime: { type: 'mixed', role: 'state', read: true, write: false },
301
+ UvIndex: { type: 'number', role: 'value.uv', read: true, write: false },
302
+ UvIndexText: { type: 'string', role: 'state', read: true, write: false },
303
+ UvLevel: { type: 'number', role: 'value', read: true, write: false },
304
+ UvPower: { type: 'number', role: 'value', read: true, write: false, unit: 'W/m²' },
305
+ UvaIntensity: { type: 'number', role: 'value', read: true, write: false },
306
+ UvbIntensity: { type: 'number', role: 'value', read: true, write: false },
307
+ VCC: { type: 'number', role: 'value.voltage', read: true, write: false, unit: 'V' },
308
+ Vcc: { type: 'number', role: 'value.voltage', read: true, write: false, unit: 'V' },
309
+ Version: { type: 'string', role: 'state', read: true, write: false },
310
+ Voltage: { type: 'number', role: 'value.voltage', read: true, write: false, unit: 'V' },
311
+ WW: { type: 'number', role: 'level.color.white', read: true, write: true },
312
+ WW_POWER: { type: 'boolean', role: 'switch.light', read: true, write: true, storeMap: true },
313
+ Wakeup: { type: 'string', role: 'state', read: true, write: true },
314
+ Webserver: { type: 'number', role: 'state', read: true, write: false },
315
+ WifiConfig: { type: 'number', role: 'state', read: true, write: false },
316
+ WifiPower: { type: 'number', role: 'value', read: true, write: false, unit: 'dBm' },
317
+ Warmwater: { type: 'number', role: 'value.temperature', read: true, write: false, unit: '°C' },
318
+ Window: { type: 'number', role: 'value', read: true, write: true },
319
+ Yesterday: { type: 'number', role: 'value.power.consumption', read: true, write: false, unit: 'kWh' },
320
+ eCO2: { type: 'number', role: 'value.eco2', read: true, write: false, unit: 'ppm' },
321
+ gestern: { type: 'number', role: 'value.power.consumption', read: true, write: false, unit: 'kWh' },
322
+ heute: { type: 'number', role: 'value.power.consumption', read: true, write: false, unit: 'kWh' },
323
+ modeLedExor: {
324
+ type: 'boolean',
325
+ role: 'switch',
326
+ read: true,
327
+ write: true,
328
+ def: false,
329
+ desc: 'exor for white LEDs and color leds => if the white LEDs are switched on, color LEDs are switched off and vice versa',
330
+ },
331
+ modeReadColors: {
332
+ type: 'boolean',
333
+ role: 'switch',
334
+ read: true,
335
+ write: true,
336
+ def: true,
337
+ desc: 'allow for color read from MQTT',
338
+ },
339
+ VEML6075_UvIndex: { type: 'number', role: 'value.uv', read: true, write: false },
340
+ VEML6075_UvaIntensity: { type: 'number', role: 'value', read: true, write: false },
341
+ VEML6075_UvbIntensity: { type: 'number', role: 'value', read: true, write: false },
342
+ VEML6075_UvIndexText: { type: 'string', role: 'state', read: true, write: false },
343
+ VEML6075_UvLevel: { type: 'number', role: 'value', read: true, write: false },
344
+ VEML6075_UvPower: { type: 'number', role: 'value', read: true, write: false, unit: 'W/m²' },
345
+ // IRHVAC specific datapoints to avoid conflicts with general Tasmota fields
346
+ IrReceived_IRHVAC_Power: { type: 'string', role: 'state', read: true, write: false },
347
+ IrReceived_IRHVAC_Light: { type: 'string', role: 'state', read: true, write: false },
348
+ IrReceived_IRHVAC_Mode: { type: 'string', role: 'state', read: true, write: false },
349
+ IrReceived_IRHVAC_Vendor: { type: 'string', role: 'state', read: true, write: false },
350
+ IrReceived_IRHVAC_Model: { type: 'number', role: 'value', read: true, write: false },
351
+ IrReceived_IRHVAC_Temp: { type: 'number', role: 'value.temperature', read: true, write: false, unit: '°C' },
352
+ IrReceived_IRHVAC_FanSpeed: { type: 'string', role: 'state', read: true, write: false },
353
+ IrReceived_IRHVAC_SwingV: { type: 'string', role: 'state', read: true, write: false },
354
+ IrReceived_IRHVAC_SwingH: { type: 'string', role: 'state', read: true, write: false },
355
+ IrReceived_IRHVAC_Quiet: { type: 'string', role: 'state', read: true, write: false },
356
+ IrReceived_IRHVAC_Turbo: { type: 'string', role: 'state', read: true, write: false },
357
+ IrReceived_IRHVAC_Econo: { type: 'string', role: 'state', read: true, write: false },
358
+ IrReceived_IRHVAC_Filter: { type: 'string', role: 'state', read: true, write: false },
359
+ IrReceived_IRHVAC_Clean: { type: 'string', role: 'state', read: true, write: false },
360
+ IrReceived_IRHVAC_Beep: { type: 'string', role: 'state', read: true, write: false },
361
+ IrReceived_IRHVAC_Sleep: { type: 'number', role: 'value', read: true, write: false },
362
+ IrReceived_IRHVAC_Celsius: { type: 'string', role: 'state', read: true, write: false },
363
+ // Shutter control datapoints (Position, Direction, Target, Tilt for shutters 1-16)
364
+ Shutter1_Position: { type: 'number', role: 'level.blind', read: true, write: true, min: 0, max: 100, unit: '%' },
365
+ Shutter1_Direction: { type: 'number', role: 'value', read: true, write: false },
366
+ Shutter1_Target: { type: 'number', role: 'value', read: true, write: false, min: 0, max: 100, unit: '%' },
367
+ Shutter1_Tilt: { type: 'number', role: 'level.tilt', read: true, write: true, min: 0, max: 100, unit: '%' },
368
+ Shutter2_Position: { type: 'number', role: 'level.blind', read: true, write: true, min: 0, max: 100, unit: '%' },
369
+ Shutter2_Direction: { type: 'number', role: 'value', read: true, write: false },
370
+ Shutter2_Target: { type: 'number', role: 'value', read: true, write: false, min: 0, max: 100, unit: '%' },
371
+ Shutter2_Tilt: { type: 'number', role: 'level.tilt', read: true, write: true, min: 0, max: 100, unit: '%' },
372
+ Shutter3_Position: { type: 'number', role: 'level.blind', read: true, write: true, min: 0, max: 100, unit: '%' },
373
+ Shutter3_Direction: { type: 'number', role: 'value', read: true, write: false },
374
+ Shutter3_Target: { type: 'number', role: 'value', read: true, write: false, min: 0, max: 100, unit: '%' },
375
+ Shutter3_Tilt: { type: 'number', role: 'level.tilt', read: true, write: true, min: 0, max: 100, unit: '%' },
376
+ Shutter4_Position: { type: 'number', role: 'level.blind', read: true, write: true, min: 0, max: 100, unit: '%' },
377
+ Shutter4_Direction: { type: 'number', role: 'value', read: true, write: false },
378
+ Shutter4_Target: { type: 'number', role: 'value', read: true, write: false, min: 0, max: 100, unit: '%' },
379
+ Shutter4_Tilt: { type: 'number', role: 'level.tilt', read: true, write: true, min: 0, max: 100, unit: '%' },
380
+ Shutter5_Position: { type: 'number', role: 'level.blind', read: true, write: true, min: 0, max: 100, unit: '%' },
381
+ Shutter5_Direction: { type: 'number', role: 'value', read: true, write: false },
382
+ Shutter5_Target: { type: 'number', role: 'value', read: true, write: false, min: 0, max: 100, unit: '%' },
383
+ Shutter5_Tilt: { type: 'number', role: 'level.tilt', read: true, write: true, min: 0, max: 100, unit: '%' },
384
+ Shutter6_Position: { type: 'number', role: 'level.blind', read: true, write: true, min: 0, max: 100, unit: '%' },
385
+ Shutter6_Direction: { type: 'number', role: 'value', read: true, write: false },
386
+ Shutter6_Target: { type: 'number', role: 'value', read: true, write: false, min: 0, max: 100, unit: '%' },
387
+ Shutter6_Tilt: { type: 'number', role: 'level.tilt', read: true, write: true, min: 0, max: 100, unit: '%' },
388
+ Shutter7_Position: { type: 'number', role: 'level.blind', read: true, write: true, min: 0, max: 100, unit: '%' },
389
+ Shutter7_Direction: { type: 'number', role: 'value', read: true, write: false },
390
+ Shutter7_Target: { type: 'number', role: 'value', read: true, write: false, min: 0, max: 100, unit: '%' },
391
+ Shutter7_Tilt: { type: 'number', role: 'level.tilt', read: true, write: true, min: 0, max: 100, unit: '%' },
392
+ Shutter8_Position: { type: 'number', role: 'level.blind', read: true, write: true, min: 0, max: 100, unit: '%' },
393
+ Shutter8_Direction: { type: 'number', role: 'value', read: true, write: false },
394
+ Shutter8_Target: { type: 'number', role: 'value', read: true, write: false, min: 0, max: 100, unit: '%' },
395
+ Shutter8_Tilt: { type: 'number', role: 'level.tilt', read: true, write: true, min: 0, max: 100, unit: '%' },
396
+ Shutter9_Position: { type: 'number', role: 'level.blind', read: true, write: true, min: 0, max: 100, unit: '%' },
397
+ Shutter9_Direction: { type: 'number', role: 'value', read: true, write: false },
398
+ Shutter9_Target: { type: 'number', role: 'value', read: true, write: false, min: 0, max: 100, unit: '%' },
399
+ Shutter9_Tilt: { type: 'number', role: 'level.tilt', read: true, write: true, min: 0, max: 100, unit: '%' },
400
+ Shutter10_Position: { type: 'number', role: 'level.blind', read: true, write: true, min: 0, max: 100, unit: '%' },
401
+ Shutter10_Direction: { type: 'number', role: 'value', read: true, write: false },
402
+ Shutter10_Target: { type: 'number', role: 'value', read: true, write: false, min: 0, max: 100, unit: '%' },
403
+ Shutter10_Tilt: { type: 'number', role: 'level.tilt', read: true, write: true, min: 0, max: 100, unit: '%' },
404
+ Shutter11_Position: { type: 'number', role: 'level.blind', read: true, write: true, min: 0, max: 100, unit: '%' },
405
+ Shutter11_Direction: { type: 'number', role: 'value', read: true, write: false },
406
+ Shutter11_Target: { type: 'number', role: 'value', read: true, write: false, min: 0, max: 100, unit: '%' },
407
+ Shutter11_Tilt: { type: 'number', role: 'level.tilt', read: true, write: true, min: 0, max: 100, unit: '%' },
408
+ Shutter12_Position: { type: 'number', role: 'level.blind', read: true, write: true, min: 0, max: 100, unit: '%' },
409
+ Shutter12_Direction: { type: 'number', role: 'value', read: true, write: false },
410
+ Shutter12_Target: { type: 'number', role: 'value', read: true, write: false, min: 0, max: 100, unit: '%' },
411
+ Shutter12_Tilt: { type: 'number', role: 'level.tilt', read: true, write: true, min: 0, max: 100, unit: '%' },
412
+ Shutter13_Position: { type: 'number', role: 'level.blind', read: true, write: true, min: 0, max: 100, unit: '%' },
413
+ Shutter13_Direction: { type: 'number', role: 'value', read: true, write: false },
414
+ Shutter13_Target: { type: 'number', role: 'value', read: true, write: false, min: 0, max: 100, unit: '%' },
415
+ Shutter13_Tilt: { type: 'number', role: 'level.tilt', read: true, write: true, min: 0, max: 100, unit: '%' },
416
+ Shutter14_Position: { type: 'number', role: 'level.blind', read: true, write: true, min: 0, max: 100, unit: '%' },
417
+ Shutter14_Direction: { type: 'number', role: 'value', read: true, write: false },
418
+ Shutter14_Target: { type: 'number', role: 'value', read: true, write: false, min: 0, max: 100, unit: '%' },
419
+ Shutter14_Tilt: { type: 'number', role: 'level.tilt', read: true, write: true, min: 0, max: 100, unit: '%' },
420
+ Shutter15_Position: { type: 'number', role: 'level.blind', read: true, write: true, min: 0, max: 100, unit: '%' },
421
+ Shutter15_Direction: { type: 'number', role: 'value', read: true, write: false },
422
+ Shutter15_Target: { type: 'number', role: 'value', read: true, write: false, min: 0, max: 100, unit: '%' },
423
+ Shutter15_Tilt: { type: 'number', role: 'level.tilt', read: true, write: true, min: 0, max: 100, unit: '%' },
424
+ Shutter16_Position: { type: 'number', role: 'level.blind', read: true, write: true, min: 0, max: 100, unit: '%' },
425
+ Shutter16_Direction: { type: 'number', role: 'value', read: true, write: false },
426
+ Shutter16_Target: { type: 'number', role: 'value', read: true, write: false, min: 0, max: 100, unit: '%' },
427
+ Shutter16_Tilt: { type: 'number', role: 'level.tilt', read: true, write: true, min: 0, max: 100, unit: '%' },
428
+ };
429
+ exports.default = datapoints;
430
+ //# sourceMappingURL=datapoints.js.map