iobroker.zendure-solarflow 1.7.3 → 1.7.4
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
|
@@ -46,6 +46,10 @@ If you find the adapter useful for you and want to support my work, feel free to
|
|
|
46
46
|
[](https://www.paypal.com/paypalme/PeterFrommert)
|
|
47
47
|
|
|
48
48
|
## Changelog
|
|
49
|
+
### 1.7.4 (2024-07-31)
|
|
50
|
+
|
|
51
|
+
- Set max value and step for setInputLimit
|
|
52
|
+
|
|
49
53
|
### 1.7.3 (2024-07-30)
|
|
50
54
|
|
|
51
55
|
- Fix AC input value for Hyper to max. 1200W
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/helpers/createControlStates.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\r\n\r\nimport { ZendureSolarflow } from \"../main\";\r\n\r\nexport const createControlStates = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n type: string\r\n): Promise<void> => {\r\n // Create control folder\r\n await adapter?.extendObject(`${productKey}.${deviceKey}.control`, {\r\n type: \"channel\",\r\n common: {\r\n name: {\r\n de: \"Steuerung f\u00FCr Ger\u00E4t \" + deviceKey,\r\n en: \"Control for device \" + deviceKey,\r\n },\r\n },\r\n native: {},\r\n });\r\n\r\n // State zum Setzen des Charge Limit\r\n await adapter?.extendObject(\r\n `${productKey}.${deviceKey}.control.chargeLimit`,\r\n {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Setzen des Lade-Limits\",\r\n en: \"Control of the charge limit\",\r\n },\r\n type: \"number\",\r\n desc: \"chargeLimit\",\r\n role: \"value.battery\",\r\n read: true,\r\n write: true,\r\n min: 40,\r\n max: 100,\r\n unit: \"%\",\r\n },\r\n native: {},\r\n }\r\n );\r\n\r\n adapter?.subscribeStates(`${productKey}.${deviceKey}.control.chargeLimit`);\r\n\r\n // State zum Setzen des Discharge Limit\r\n await adapter?.extendObject(\r\n `${productKey}.${deviceKey}.control.dischargeLimit`,\r\n {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Setzen des Entlade-Limits\",\r\n en: \"Control of the discharge limit\",\r\n },\r\n type: \"number\",\r\n desc: \"dischargeLimit\",\r\n role: \"value.battery\",\r\n read: true,\r\n write: true,\r\n min: 0,\r\n max: 90,\r\n unit: \"%\",\r\n },\r\n native: {},\r\n }\r\n );\r\n\r\n adapter?.subscribeStates(`${productKey}.${deviceKey}.control.dischargeLimit`);\r\n\r\n // State zum Setzen des Buzzers\r\n await adapter?.extendObject(\r\n `${productKey}.${deviceKey}.control.buzzerSwitch`,\r\n {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Sounds am HUB aktivieren\",\r\n en: \"Enable buzzer on HUB\",\r\n },\r\n type: \"boolean\",\r\n desc: \"buzzerSwitch\",\r\n role: \"switch\",\r\n read: true,\r\n write: true,\r\n },\r\n native: {},\r\n }\r\n );\r\n\r\n if (type == \"solarflow\" || type == \"hyper\") {\r\n // State zum Setzen des Output Limit\r\n await adapter?.extendObject(\r\n `${productKey}.${deviceKey}.control.setOutputLimit`,\r\n {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Einzustellende Ausgangsleistung\",\r\n en: \"Control of the output limit\",\r\n },\r\n type: \"number\",\r\n desc: \"setOutputLimit\",\r\n role: \"value.power\",\r\n read: true,\r\n write: true,\r\n min: 0,\r\n unit: \"W\",\r\n },\r\n native: {},\r\n }\r\n );\r\n\r\n // Subcribe to control states\r\n adapter?.subscribeStates(\r\n `${productKey}.${deviceKey}.control.setOutputLimit`\r\n );\r\n\r\n adapter?.subscribeStates(`${productKey}.${deviceKey}.control.buzzerSwitch`);\r\n\r\n // State zum Setzen des Bypass Modus\r\n await adapter?.extendObject(`${productKey}.${deviceKey}.control.passMode`, {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Einstellung des Bypass Modus\",\r\n en: \"Setting of bypass mode\",\r\n },\r\n type: \"number\",\r\n desc: \"passMode\",\r\n role: \"switch\",\r\n read: true,\r\n write: true,\r\n states: {\r\n 0: \"Automatic\",\r\n 1: \"Always off\",\r\n 2: \"Always on\",\r\n },\r\n },\r\n native: {},\r\n });\r\n\r\n adapter?.subscribeStates(`${productKey}.${deviceKey}.control.passMode`);\r\n\r\n // State zum Setzen des Auto-Modus vom Bypass\r\n await adapter?.extendObject(\r\n `${productKey}.${deviceKey}.control.autoRecover`,\r\n {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Am n\u00E4chsten Tag Bypass auf Automatik\",\r\n en: \"Automatic recovery of bypass\",\r\n },\r\n type: \"boolean\",\r\n desc: \"autoRecover\",\r\n role: \"switch\",\r\n read: true,\r\n write: true,\r\n },\r\n native: {},\r\n }\r\n );\r\n\r\n adapter?.subscribeStates(`${productKey}.${deviceKey}.control.autoRecover`);\r\n\r\n if (adapter.config.useLowVoltageBlock) {\r\n // State zum Setzen des Output Limit\r\n await adapter?.extendObject(\r\n `${productKey}.${deviceKey}.control.lowVoltageBlock`,\r\n {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Niedrige Batteriespannung erkannt\",\r\n en: \"Low Voltage on battery detected\",\r\n },\r\n type: \"boolean\",\r\n desc: \"lowVoltageBlock\",\r\n role: \"indicator.lowbat\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n }\r\n );\r\n\r\n adapter?.subscribeStates(\r\n `${productKey}.${deviceKey}.control.lowVoltageBlock`\r\n );\r\n }\r\n }\r\n\r\n // States for Hyper 2000 and ACE 1500\r\n if (type == \"hyper\" || type == \"ace\") {\r\n // State zum Setzen des Input Limit (AC)\r\n await adapter?.extendObject(\r\n `${productKey}.${deviceKey}.control.setInputLimit`,\r\n {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Einzustellende Eingangsleistung\",\r\n en: \"Control of the input limit\",\r\n },\r\n type: \"number\",\r\n desc: \"setInputLimit\",\r\n role: \"value.power\",\r\n read: true,\r\n write: true,\r\n min: 0,\r\n unit: \"W\",\r\n },\r\n native: {},\r\n }\r\n );\r\n\r\n adapter?.subscribeStates(\r\n `${productKey}.${deviceKey}.control.setInputLimit`\r\n );\r\n\r\n // State zum Setzen des AC Schalters\r\n await adapter?.extendObject(`${productKey}.${deviceKey}.control.acSwitch`, {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"AC Schalter\",\r\n en: \"AC switch\",\r\n },\r\n type: \"boolean\",\r\n desc: \"acSwitch\",\r\n role: \"switch\",\r\n read: true,\r\n write: true,\r\n },\r\n native: {},\r\n });\r\n\r\n adapter?.subscribeStates(`${productKey}.${deviceKey}.control.acSwitch`);\r\n }\r\n\r\n // States only for ACE 1500\r\n if (type == \"ace\") {\r\n // State zum Setzen des DC Schalters\r\n await adapter?.extendObject(`${productKey}.${deviceKey}.control.dcSwitch`, {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"DC Schalter\",\r\n en: \"DC switch\",\r\n },\r\n type: \"boolean\",\r\n desc: \"dcSwitch\",\r\n role: \"switch\",\r\n read: true,\r\n write: true,\r\n },\r\n native: {},\r\n });\r\n\r\n adapter?.subscribeStates(`${productKey}.${deviceKey}.control.dcSwitch`);\r\n }\r\n};\r\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIO,MAAM,sBAAsB,OACjC,SACA,YACA,WACA,SACkB;AAElB,SAAM,mCAAS,aAAa,GAAG,UAAU,IAAI,SAAS,YAAY;AAAA,IAChE,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,MAAM;AAAA,QACJ,IAAI,+BAAyB;AAAA,QAC7B,IAAI,wBAAwB;AAAA,MAC9B;AAAA,IACF;AAAA,IACA,QAAQ,CAAC;AAAA,EACX;AAGA,SAAM,mCAAS;AAAA,IACb,GAAG,UAAU,IAAI,SAAS;AAAA,IAC1B;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,MAAM;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,QACN;AAAA,QACA,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,KAAK;AAAA,QACL,KAAK;AAAA,QACL,MAAM;AAAA,MACR;AAAA,MACA,QAAQ,CAAC;AAAA,IACX;AAAA;AAGF,qCAAS,gBAAgB,GAAG,UAAU,IAAI,SAAS;AAGnD,SAAM,mCAAS;AAAA,IACb,GAAG,UAAU,IAAI,SAAS;AAAA,IAC1B;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,MAAM;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,QACN;AAAA,QACA,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,KAAK;AAAA,QACL,KAAK;AAAA,QACL,MAAM;AAAA,MACR;AAAA,MACA,QAAQ,CAAC;AAAA,IACX;AAAA;AAGF,qCAAS,gBAAgB,GAAG,UAAU,IAAI,SAAS;AAGnD,SAAM,mCAAS;AAAA,IACb,GAAG,UAAU,IAAI,SAAS;AAAA,IAC1B;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,MAAM;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,QACN;AAAA,QACA,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA,QAAQ,CAAC;AAAA,IACX;AAAA;AAGF,MAAI,QAAQ,eAAe,QAAQ,SAAS;AAE1C,WAAM,mCAAS;AAAA,MACb,GAAG,UAAU,IAAI,SAAS;AAAA,MAC1B;AAAA,QACE,MAAM;AAAA,QACN,QAAQ;AAAA,UACN,MAAM;AAAA,YACJ,IAAI;AAAA,YACJ,IAAI;AAAA,UACN;AAAA,UACA,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,OAAO;AAAA,UACP,KAAK;AAAA,UACL,MAAM;AAAA,QACR;AAAA,QACA,QAAQ,CAAC;AAAA,MACX;AAAA;AAIF,uCAAS;AAAA,MACP,GAAG,UAAU,IAAI,SAAS;AAAA;AAG5B,uCAAS,gBAAgB,GAAG,UAAU,IAAI,SAAS;AAGnD,WAAM,mCAAS,aAAa,GAAG,UAAU,IAAI,SAAS,qBAAqB;AAAA,MACzE,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,MAAM;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,QACN;AAAA,QACA,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,QAAQ;AAAA,UACN,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,QACL;AAAA,MACF;AAAA,MACA,QAAQ,CAAC;AAAA,IACX;AAEA,uCAAS,gBAAgB,GAAG,UAAU,IAAI,SAAS;AAGnD,WAAM,mCAAS;AAAA,MACb,GAAG,UAAU,IAAI,SAAS;AAAA,MAC1B;AAAA,QACE,MAAM;AAAA,QACN,QAAQ;AAAA,UACN,MAAM;AAAA,YACJ,IAAI;AAAA,YACJ,IAAI;AAAA,UACN;AAAA,UACA,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,QACA,QAAQ,CAAC;AAAA,MACX;AAAA;AAGF,uCAAS,gBAAgB,GAAG,UAAU,IAAI,SAAS;AAEnD,QAAI,QAAQ,OAAO,oBAAoB;AAErC,aAAM,mCAAS;AAAA,QACb,GAAG,UAAU,IAAI,SAAS;AAAA,QAC1B;AAAA,UACE,MAAM;AAAA,UACN,QAAQ;AAAA,YACN,MAAM;AAAA,cACJ,IAAI;AAAA,cACJ,IAAI;AAAA,YACN;AAAA,YACA,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM;AAAA,YACN,OAAO;AAAA,UACT;AAAA,UACA,QAAQ,CAAC;AAAA,QACX;AAAA;AAGF,yCAAS;AAAA,QACP,GAAG,UAAU,IAAI,SAAS;AAAA;AAAA,IAE9B;AAAA,EACF;AAGA,MAAI,QAAQ,WAAW,QAAQ,OAAO;AAEpC,WAAM,mCAAS;AAAA,MACb,GAAG,UAAU,IAAI,SAAS;AAAA,MAC1B;AAAA,QACE,MAAM;AAAA,QACN,QAAQ;AAAA,UACN,MAAM;AAAA,YACJ,IAAI;AAAA,YACJ,IAAI;AAAA,UACN;AAAA,UACA,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,OAAO;AAAA,UACP,KAAK;AAAA,UACL,MAAM;AAAA,QACR;AAAA,QACA,QAAQ,CAAC;AAAA,MACX;AAAA;AAGF,uCAAS;AAAA,MACP,GAAG,UAAU,IAAI,SAAS;AAAA;AAI5B,WAAM,mCAAS,aAAa,GAAG,UAAU,IAAI,SAAS,qBAAqB;AAAA,MACzE,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,MAAM;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,QACN;AAAA,QACA,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA,QAAQ,CAAC;AAAA,IACX;AAEA,uCAAS,gBAAgB,GAAG,UAAU,IAAI,SAAS;AAAA,EACrD;AAGA,MAAI,QAAQ,OAAO;AAEjB,WAAM,mCAAS,aAAa,GAAG,UAAU,IAAI,SAAS,qBAAqB;AAAA,MACzE,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,MAAM;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,QACN;AAAA,QACA,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA,QAAQ,CAAC;AAAA,IACX;AAEA,uCAAS,gBAAgB,GAAG,UAAU,IAAI,SAAS;AAAA,EACrD;AACF;",
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\r\n\r\nimport { ZendureSolarflow } from \"../main\";\r\n\r\nexport const createControlStates = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n type: string\r\n): Promise<void> => {\r\n // Create control folder\r\n await adapter?.extendObject(`${productKey}.${deviceKey}.control`, {\r\n type: \"channel\",\r\n common: {\r\n name: {\r\n de: \"Steuerung f\u00FCr Ger\u00E4t \" + deviceKey,\r\n en: \"Control for device \" + deviceKey,\r\n },\r\n },\r\n native: {},\r\n });\r\n\r\n // State zum Setzen des Charge Limit\r\n await adapter?.extendObject(\r\n `${productKey}.${deviceKey}.control.chargeLimit`,\r\n {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Setzen des Lade-Limits\",\r\n en: \"Control of the charge limit\",\r\n },\r\n type: \"number\",\r\n desc: \"chargeLimit\",\r\n role: \"value.battery\",\r\n read: true,\r\n write: true,\r\n min: 40,\r\n max: 100,\r\n unit: \"%\",\r\n },\r\n native: {},\r\n }\r\n );\r\n\r\n adapter?.subscribeStates(`${productKey}.${deviceKey}.control.chargeLimit`);\r\n\r\n // State zum Setzen des Discharge Limit\r\n await adapter?.extendObject(\r\n `${productKey}.${deviceKey}.control.dischargeLimit`,\r\n {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Setzen des Entlade-Limits\",\r\n en: \"Control of the discharge limit\",\r\n },\r\n type: \"number\",\r\n desc: \"dischargeLimit\",\r\n role: \"value.battery\",\r\n read: true,\r\n write: true,\r\n min: 0,\r\n max: 90,\r\n unit: \"%\",\r\n },\r\n native: {},\r\n }\r\n );\r\n\r\n adapter?.subscribeStates(`${productKey}.${deviceKey}.control.dischargeLimit`);\r\n\r\n // State zum Setzen des Buzzers\r\n await adapter?.extendObject(\r\n `${productKey}.${deviceKey}.control.buzzerSwitch`,\r\n {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Sounds am HUB aktivieren\",\r\n en: \"Enable buzzer on HUB\",\r\n },\r\n type: \"boolean\",\r\n desc: \"buzzerSwitch\",\r\n role: \"switch\",\r\n read: true,\r\n write: true,\r\n },\r\n native: {},\r\n }\r\n );\r\n\r\n if (type == \"solarflow\" || type == \"hyper\") {\r\n // State zum Setzen des Output Limit\r\n await adapter?.extendObject(\r\n `${productKey}.${deviceKey}.control.setOutputLimit`,\r\n {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Einzustellende Ausgangsleistung\",\r\n en: \"Control of the output limit\",\r\n },\r\n type: \"number\",\r\n desc: \"setOutputLimit\",\r\n role: \"value.power\",\r\n read: true,\r\n write: true,\r\n min: 0,\r\n unit: \"W\",\r\n },\r\n native: {},\r\n }\r\n );\r\n\r\n // Subcribe to control states\r\n adapter?.subscribeStates(\r\n `${productKey}.${deviceKey}.control.setOutputLimit`\r\n );\r\n\r\n adapter?.subscribeStates(`${productKey}.${deviceKey}.control.buzzerSwitch`);\r\n\r\n // State zum Setzen des Bypass Modus\r\n await adapter?.extendObject(`${productKey}.${deviceKey}.control.passMode`, {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Einstellung des Bypass Modus\",\r\n en: \"Setting of bypass mode\",\r\n },\r\n type: \"number\",\r\n desc: \"passMode\",\r\n role: \"switch\",\r\n read: true,\r\n write: true,\r\n states: {\r\n 0: \"Automatic\",\r\n 1: \"Always off\",\r\n 2: \"Always on\",\r\n },\r\n },\r\n native: {},\r\n });\r\n\r\n adapter?.subscribeStates(`${productKey}.${deviceKey}.control.passMode`);\r\n\r\n // State zum Setzen des Auto-Modus vom Bypass\r\n await adapter?.extendObject(\r\n `${productKey}.${deviceKey}.control.autoRecover`,\r\n {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Am n\u00E4chsten Tag Bypass auf Automatik\",\r\n en: \"Automatic recovery of bypass\",\r\n },\r\n type: \"boolean\",\r\n desc: \"autoRecover\",\r\n role: \"switch\",\r\n read: true,\r\n write: true,\r\n },\r\n native: {},\r\n }\r\n );\r\n\r\n adapter?.subscribeStates(`${productKey}.${deviceKey}.control.autoRecover`);\r\n\r\n if (adapter.config.useLowVoltageBlock) {\r\n // State zum Setzen des Output Limit\r\n await adapter?.extendObject(\r\n `${productKey}.${deviceKey}.control.lowVoltageBlock`,\r\n {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Niedrige Batteriespannung erkannt\",\r\n en: \"Low Voltage on battery detected\",\r\n },\r\n type: \"boolean\",\r\n desc: \"lowVoltageBlock\",\r\n role: \"indicator.lowbat\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n }\r\n );\r\n\r\n adapter?.subscribeStates(\r\n `${productKey}.${deviceKey}.control.lowVoltageBlock`\r\n );\r\n }\r\n }\r\n\r\n // States for Hyper 2000 and ACE 1500\r\n if (type == \"hyper\" || type == \"ace\") {\r\n // State zum Setzen des Input Limit (AC)\r\n await adapter?.extendObject(\r\n `${productKey}.${deviceKey}.control.setInputLimit`,\r\n {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Einzustellende Eingangsleistung\",\r\n en: \"Control of the input limit\",\r\n },\r\n type: \"number\",\r\n desc: \"setInputLimit\",\r\n role: \"value.power\",\r\n read: true,\r\n write: true,\r\n min: 0,\r\n max: type == \"ace\" ? 900 : 1200,\r\n step: 100,\r\n unit: \"W\",\r\n },\r\n native: {},\r\n }\r\n );\r\n\r\n adapter?.subscribeStates(\r\n `${productKey}.${deviceKey}.control.setInputLimit`\r\n );\r\n\r\n // State zum Setzen des AC Schalters\r\n await adapter?.extendObject(`${productKey}.${deviceKey}.control.acSwitch`, {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"AC Schalter\",\r\n en: \"AC switch\",\r\n },\r\n type: \"boolean\",\r\n desc: \"acSwitch\",\r\n role: \"switch\",\r\n read: true,\r\n write: true,\r\n },\r\n native: {},\r\n });\r\n\r\n adapter?.subscribeStates(`${productKey}.${deviceKey}.control.acSwitch`);\r\n }\r\n\r\n // States only for ACE 1500\r\n if (type == \"ace\") {\r\n // State zum Setzen des DC Schalters\r\n await adapter?.extendObject(`${productKey}.${deviceKey}.control.dcSwitch`, {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"DC Schalter\",\r\n en: \"DC switch\",\r\n },\r\n type: \"boolean\",\r\n desc: \"dcSwitch\",\r\n role: \"switch\",\r\n read: true,\r\n write: true,\r\n },\r\n native: {},\r\n });\r\n\r\n adapter?.subscribeStates(`${productKey}.${deviceKey}.control.dcSwitch`);\r\n }\r\n};\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -163,7 +163,7 @@ const addOrUpdatePackData = async (productKey, deviceKey, packData, isSolarFlow)
|
|
|
163
163
|
}
|
|
164
164
|
};
|
|
165
165
|
const onMessage = async (topic, message) => {
|
|
166
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C, _D, _E, _F, _G, _H, _I, _J, _K, _L, _M, _N, _O, _P, _Q, _R, _S, _T, _U, _V, _W, _X, _Y, _Z, __, _$, _aa, _ba, _ca, _da, _ea, _fa, _ga, _ha, _ia, _ja, _ka, _la, _ma, _na, _oa, _pa, _qa, _ra, _sa, _ta, _ua, _va, _wa, _xa, _ya, _za, _Aa, _Ba, _Ca, _Da, _Ea;
|
|
166
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C, _D, _E, _F, _G, _H, _I, _J, _K, _L, _M, _N, _O, _P, _Q, _R, _S, _T, _U, _V, _W, _X, _Y, _Z, __, _$, _aa, _ba, _ca, _da, _ea, _fa, _ga, _ha, _ia, _ja, _ka, _la, _ma, _na, _oa, _pa, _qa, _ra, _sa, _ta, _ua, _va, _wa, _xa, _ya, _za, _Aa, _Ba, _Ca, _Da, _Ea, _Fa, _Ga;
|
|
167
167
|
if (adapter) {
|
|
168
168
|
const topicSplitted = topic.split("/");
|
|
169
169
|
const productKey = topicSplitted[1];
|
|
@@ -432,15 +432,17 @@ const onMessage = async (topic, message) => {
|
|
|
432
432
|
"inputLimit",
|
|
433
433
|
obj.properties.inputLimit
|
|
434
434
|
);
|
|
435
|
-
(0
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
435
|
+
if (((_aa = productName == null ? void 0 : productName.val) == null ? void 0 : _aa.toString().toLowerCase().includes("ace")) || ((_ba = productName == null ? void 0 : productName.val) == null ? void 0 : _ba.toString().toLowerCase().includes("hyper"))) {
|
|
436
|
+
(0, import_adapterService.updateSolarFlowControlState)(
|
|
437
|
+
adapter,
|
|
438
|
+
productKey,
|
|
439
|
+
deviceKey,
|
|
440
|
+
"setInputLimit",
|
|
441
|
+
obj.properties.inputLimit
|
|
442
|
+
);
|
|
443
|
+
}
|
|
442
444
|
}
|
|
443
|
-
if (((
|
|
445
|
+
if (((_ca = obj.properties) == null ? void 0 : _ca.gridInputPower) != null && ((_da = obj.properties) == null ? void 0 : _da.gridInputPower) != void 0) {
|
|
444
446
|
(0, import_adapterService.updateSolarFlowState)(
|
|
445
447
|
adapter,
|
|
446
448
|
productKey,
|
|
@@ -449,7 +451,7 @@ const onMessage = async (topic, message) => {
|
|
|
449
451
|
obj.properties.gridInputPower
|
|
450
452
|
);
|
|
451
453
|
}
|
|
452
|
-
if (((
|
|
454
|
+
if (((_ea = obj.properties) == null ? void 0 : _ea.acOutputPower) != null && ((_fa = obj.properties) == null ? void 0 : _fa.acOutputPower) != void 0) {
|
|
453
455
|
(0, import_adapterService.updateSolarFlowState)(
|
|
454
456
|
adapter,
|
|
455
457
|
productKey,
|
|
@@ -458,7 +460,7 @@ const onMessage = async (topic, message) => {
|
|
|
458
460
|
obj.properties.acOutputPower
|
|
459
461
|
);
|
|
460
462
|
}
|
|
461
|
-
if (((
|
|
463
|
+
if (((_ga = obj.properties) == null ? void 0 : _ga.gridPower) != null && ((_ha = obj.properties) == null ? void 0 : _ha.gridPower) != void 0) {
|
|
462
464
|
(0, import_adapterService.updateSolarFlowState)(
|
|
463
465
|
adapter,
|
|
464
466
|
productKey,
|
|
@@ -467,8 +469,8 @@ const onMessage = async (topic, message) => {
|
|
|
467
469
|
obj.properties.gridPower
|
|
468
470
|
);
|
|
469
471
|
}
|
|
470
|
-
if (((
|
|
471
|
-
const value = ((
|
|
472
|
+
if (((_ia = obj.properties) == null ? void 0 : _ia.acSwitch) != null && ((_ja = obj.properties) == null ? void 0 : _ja.acSwitch) != void 0) {
|
|
473
|
+
const value = ((_ka = obj.properties) == null ? void 0 : _ka.acSwitch) == 0 ? false : true;
|
|
472
474
|
(0, import_adapterService.updateSolarFlowState)(adapter, productKey, deviceKey, "acSwitch", value);
|
|
473
475
|
(0, import_adapterService.updateSolarFlowControlState)(
|
|
474
476
|
adapter,
|
|
@@ -478,8 +480,8 @@ const onMessage = async (topic, message) => {
|
|
|
478
480
|
value
|
|
479
481
|
);
|
|
480
482
|
}
|
|
481
|
-
if (((
|
|
482
|
-
const value = ((
|
|
483
|
+
if (((_la = obj.properties) == null ? void 0 : _la.dcSwitch) != null && ((_ma = obj.properties) == null ? void 0 : _ma.dcSwitch) != void 0) {
|
|
484
|
+
const value = ((_na = obj.properties) == null ? void 0 : _na.dcSwitch) == 0 ? false : true;
|
|
483
485
|
(0, import_adapterService.updateSolarFlowState)(adapter, productKey, deviceKey, "dcSwitch", value);
|
|
484
486
|
(0, import_adapterService.updateSolarFlowControlState)(
|
|
485
487
|
adapter,
|
|
@@ -489,7 +491,7 @@ const onMessage = async (topic, message) => {
|
|
|
489
491
|
value
|
|
490
492
|
);
|
|
491
493
|
}
|
|
492
|
-
if (((
|
|
494
|
+
if (((_oa = obj.properties) == null ? void 0 : _oa.dcOutputPower) != null && ((_pa = obj.properties) == null ? void 0 : _pa.dcOutputPower) != void 0) {
|
|
493
495
|
(0, import_adapterService.updateSolarFlowState)(
|
|
494
496
|
adapter,
|
|
495
497
|
productKey,
|
|
@@ -498,11 +500,11 @@ const onMessage = async (topic, message) => {
|
|
|
498
500
|
obj.properties.dcOutputPower
|
|
499
501
|
);
|
|
500
502
|
}
|
|
501
|
-
if (((
|
|
502
|
-
const value = ((
|
|
503
|
+
if (((_qa = obj.properties) == null ? void 0 : _qa.pvBrand) != null && ((_ra = obj.properties) == null ? void 0 : _ra.pvBrand) != void 0) {
|
|
504
|
+
const value = ((_sa = obj.properties) == null ? void 0 : _sa.pvBrand) == 0 ? "Others" : ((_ta = obj.properties) == null ? void 0 : _ta.pvBrand) == 1 ? "Hoymiles" : ((_ua = obj.properties) == null ? void 0 : _ua.pvBrand) == 2 ? "Enphase" : ((_va = obj.properties) == null ? void 0 : _va.pvBrand) == 3 ? "APSystems" : ((_wa = obj.properties) == null ? void 0 : _wa.pvBrand) == 4 ? "Anker" : ((_xa = obj.properties) == null ? void 0 : _xa.pvBrand) == 5 ? "Deye" : ((_ya = obj.properties) == null ? void 0 : _ya.pvBrand) == 6 ? "Bosswerk" : "Unknown";
|
|
503
505
|
(0, import_adapterService.updateSolarFlowState)(adapter, productKey, deviceKey, "pvBrand", value);
|
|
504
506
|
}
|
|
505
|
-
if (((
|
|
507
|
+
if (((_za = obj.properties) == null ? void 0 : _za.inverseMaxPower) != null && ((_Aa = obj.properties) == null ? void 0 : _Aa.inverseMaxPower) != void 0) {
|
|
506
508
|
(0, import_adapterService.updateSolarFlowState)(
|
|
507
509
|
adapter,
|
|
508
510
|
productKey,
|
|
@@ -511,7 +513,7 @@ const onMessage = async (topic, message) => {
|
|
|
511
513
|
obj.properties.inverseMaxPower
|
|
512
514
|
);
|
|
513
515
|
}
|
|
514
|
-
if (((
|
|
516
|
+
if (((_Ba = obj.properties) == null ? void 0 : _Ba.wifiState) != null && ((_Ca = obj.properties) == null ? void 0 : _Ca.wifiState) != void 0) {
|
|
515
517
|
(0, import_adapterService.updateSolarFlowState)(
|
|
516
518
|
adapter,
|
|
517
519
|
productKey,
|
|
@@ -520,7 +522,7 @@ const onMessage = async (topic, message) => {
|
|
|
520
522
|
obj.properties.wifiState == 1 ? "Connected" : "Disconnected"
|
|
521
523
|
);
|
|
522
524
|
}
|
|
523
|
-
if (((
|
|
525
|
+
if (((_Da = obj.properties) == null ? void 0 : _Da.packNum) != null && ((_Ea = obj.properties) == null ? void 0 : _Ea.packNum) != void 0) {
|
|
524
526
|
(0, import_adapterService.updateSolarFlowState)(
|
|
525
527
|
adapter,
|
|
526
528
|
productKey,
|
|
@@ -529,7 +531,7 @@ const onMessage = async (topic, message) => {
|
|
|
529
531
|
obj.properties.packNum
|
|
530
532
|
);
|
|
531
533
|
}
|
|
532
|
-
if (((
|
|
534
|
+
if (((_Fa = obj.properties) == null ? void 0 : _Fa.hubState) != null && ((_Ga = obj.properties) == null ? void 0 : _Ga.hubState) != void 0) {
|
|
533
535
|
(0, import_adapterService.updateSolarFlowState)(
|
|
534
536
|
adapter,
|
|
535
537
|
productKey,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/services/mqttService.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\r\nimport * as mqtt from \"mqtt\";\r\nimport { ZendureSolarflow } from \"../main\";\r\nimport { ISolarFlowDeviceDetails } from \"../models/ISolarFlowDeviceDetails\";\r\nimport {\r\n checkVoltage,\r\n updateSolarFlowControlState,\r\n updateSolarFlowState,\r\n} from \"./adapterService\";\r\nimport { IPackData } from \"../models/IPackData\";\r\nimport { setEnergyWhMax, setSocToZero } from \"./calculationService\";\r\nimport { IMqttData, knownMqttProps } from \"../models/ISolarFlowMqttProperties\";\r\nimport {\r\n startCalculationJob,\r\n startCheckStatesAndConnectionJob,\r\n startRefreshAccessTokenTimerJob,\r\n startResetValuesJob,\r\n} from \"./jobSchedule\";\r\n\r\nlet adapter: ZendureSolarflow | undefined = undefined;\r\n\r\nexport const addOrUpdatePackData = async (\r\n productKey: string,\r\n deviceKey: string,\r\n packData: IPackData[],\r\n isSolarFlow: boolean\r\n): Promise<void> => {\r\n if (adapter && productKey && deviceKey) {\r\n await packData.forEach(async (x) => {\r\n // Process data only with a serial id!\r\n if (x.sn && adapter) {\r\n // create a state for the serial id\r\n const key = (\r\n productKey +\r\n \".\" +\r\n deviceKey +\r\n \".packData.\" +\r\n x.sn\r\n ).replace(adapter.FORBIDDEN_CHARS, \"\");\r\n\r\n await adapter?.extendObject(key + \".sn\", {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Seriennummer\",\r\n en: \"Serial id\",\r\n },\r\n type: \"string\",\r\n desc: \"Serial ID\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setStateAsync(key + \".sn\", x.sn, true);\r\n\r\n if (x.socLevel) {\r\n // State f\u00FCr socLevel\r\n await adapter?.extendObject(key + \".socLevel\", {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"SOC der Batterie\",\r\n en: \"soc of battery\",\r\n },\r\n type: \"number\",\r\n desc: \"SOC Level\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setStateAsync(key + \".socLevel\", x.socLevel, true);\r\n }\r\n\r\n if (x.maxTemp) {\r\n // State f\u00FCr maxTemp\r\n await adapter?.extendObject(key + \".maxTemp\", {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Max. Temperatur der Batterie\",\r\n en: \"max temp. of battery\",\r\n },\r\n type: \"number\",\r\n desc: \"Max. Temp\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n // Convert Kelvin to Celsius\r\n await adapter?.setStateAsync(\r\n key + \".maxTemp\",\r\n x.maxTemp / 10 - 273.15,\r\n true\r\n );\r\n }\r\n\r\n if (x.minVol) {\r\n await adapter?.extendObject(key + \".minVol\", {\r\n type: \"state\",\r\n common: {\r\n name: \"minVol\",\r\n type: \"number\",\r\n desc: \"minVol\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setStateAsync(key + \".minVol\", x.minVol / 100, true);\r\n }\r\n\r\n if (x.maxVol) {\r\n await adapter?.extendObject(key + \".maxVol\", {\r\n type: \"state\",\r\n common: {\r\n name: \"maxVol\",\r\n type: \"number\",\r\n desc: \"maxVol\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setState(key + \".maxVol\", x.maxVol / 100, true);\r\n }\r\n\r\n if (x.totalVol) {\r\n await adapter?.extendObject(key + \".totalVol\", {\r\n type: \"state\",\r\n common: {\r\n name: \"totalVol\",\r\n type: \"number\",\r\n desc: \"totalVol\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n const totalVol = x.totalVol / 100;\r\n\r\n await adapter?.setState(key + \".totalVol\", totalVol, true);\r\n\r\n // Send Voltage to checkVoltage Method (only if is Solarflow device)\r\n if (isSolarFlow) {\r\n checkVoltage(adapter, productKey, deviceKey, totalVol);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n};\r\n\r\nconst onMessage = async (topic: string, message: Buffer): Promise<void> => {\r\n if (adapter) {\r\n const topicSplitted = topic.split(\"/\");\r\n const productKey = topicSplitted[1];\r\n const deviceKey = topicSplitted[2];\r\n\r\n let obj: IMqttData = {};\r\n try {\r\n obj = JSON.parse(message.toString());\r\n } catch (e) {\r\n const txt = message.toString();\r\n adapter.log.error(`[JSON PARSE ERROR] ${txt}`);\r\n }\r\n\r\n let isSolarFlow = false;\r\n const productName = await adapter.getStateAsync(\r\n `${productKey}.${deviceKey}.productName`\r\n );\r\n\r\n // Check if device is an solarflow or hyper device. Don't use LowVoltageBlock on an ACE device?\r\n if (\r\n productName?.val?.toString().toLowerCase().includes(\"solarflow\") ||\r\n productName?.val?.toString().toLowerCase().includes(\"hyper\")\r\n ) {\r\n isSolarFlow = true;\r\n }\r\n\r\n // set lastUpdate for deviceKey\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"lastUpdate\",\r\n new Date().getTime()\r\n );\r\n\r\n if (\r\n obj.properties?.electricLevel != null &&\r\n obj.properties?.electricLevel != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"electricLevel\",\r\n obj.properties.electricLevel\r\n );\r\n\r\n if (\r\n adapter?.config.useCalculation &&\r\n obj.properties.electricLevel == 100 &&\r\n isSolarFlow\r\n ) {\r\n setEnergyWhMax(adapter, productKey, deviceKey);\r\n }\r\n\r\n // if minSoc is reached, set the calculated soc to 0\r\n const minSoc = await adapter?.getStateAsync(\r\n `${productKey}.${deviceKey}.minSoc`\r\n );\r\n if (\r\n adapter?.config.useCalculation &&\r\n minSoc &&\r\n minSoc.val &&\r\n obj.properties.electricLevel <= Number(minSoc.val) &&\r\n isSolarFlow\r\n ) {\r\n setSocToZero(adapter, productKey, deviceKey);\r\n }\r\n }\r\n\r\n if (\r\n obj.properties?.packState != null &&\r\n obj.properties?.packState != undefined\r\n ) {\r\n const value =\r\n obj.properties?.packState == 0\r\n ? \"Idle\"\r\n : obj.properties?.packState == 1\r\n ? \"Charging\"\r\n : obj.properties?.packState == 2\r\n ? \"Discharging\"\r\n : \"Unknown\";\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"packState\", value);\r\n }\r\n\r\n if (\r\n obj.properties?.passMode != null &&\r\n obj.properties?.passMode != undefined\r\n ) {\r\n const value =\r\n obj.properties?.passMode == 0\r\n ? \"Automatic\"\r\n : obj.properties?.passMode == 1\r\n ? \"Always off\"\r\n : obj.properties?.passMode == 2\r\n ? \"Always on\"\r\n : \"Unknown\";\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"passMode\", value);\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"passMode\",\r\n obj.properties?.passMode\r\n );\r\n }\r\n\r\n if (obj.properties?.pass != null && obj.properties?.pass != undefined) {\r\n const value = obj.properties?.pass == 0 ? false : true;\r\n\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"pass\", value);\r\n }\r\n\r\n if (\r\n obj.properties?.autoRecover != null &&\r\n obj.properties?.autoRecover != undefined\r\n ) {\r\n const value = obj.properties?.autoRecover == 0 ? false : true;\r\n\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"autoRecover\",\r\n value\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"autoRecover\",\r\n value\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.outputHomePower != null &&\r\n obj.properties?.outputHomePower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"outputHomePower\",\r\n obj.properties.outputHomePower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.energyPower != null &&\r\n obj.properties?.energyPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"energyPower\",\r\n obj.properties.energyPower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.outputLimit != null &&\r\n obj.properties?.outputLimit != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"outputLimit\",\r\n obj.properties.outputLimit\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"setOutputLimit\",\r\n obj.properties.outputLimit\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.buzzerSwitch != null &&\r\n obj.properties?.buzzerSwitch != undefined\r\n ) {\r\n const value = obj.properties?.buzzerSwitch == 0 ? false : true;\r\n\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"buzzerSwitch\",\r\n value\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"buzzerSwitch\",\r\n value\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.outputPackPower != null &&\r\n obj.properties?.outputPackPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"outputPackPower\",\r\n obj.properties.outputPackPower\r\n );\r\n\r\n // if outPutPackPower set packInputPower to 0\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"packInputPower\", 0);\r\n }\r\n\r\n if (\r\n obj.properties?.packInputPower != null &&\r\n obj.properties?.packInputPower != undefined\r\n ) {\r\n let standbyUsage = 0;\r\n\r\n // Aktuelle Solar-Power abfragen, wenn 0 Standby-Verbrauch dazu rechnen\r\n const solarInputPower = await adapter?.getStateAsync(\r\n `${productKey}.${deviceKey}.solarInputPower`\r\n );\r\n\r\n if (solarInputPower && Number(solarInputPower.val) < 10) {\r\n standbyUsage = 10 - Number(solarInputPower.val);\r\n }\r\n\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"packInputPower\",\r\n obj.properties.packInputPower + standbyUsage\r\n );\r\n\r\n // if packInputPower set outputPackPower to 0\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"outputPackPower\",\r\n 0\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.solarInputPower != null &&\r\n obj.properties?.solarInputPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"solarInputPower\",\r\n obj.properties.solarInputPower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.pvPower1 != null &&\r\n obj.properties?.pvPower1 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower2\", // Reversed to adjust like offical app\r\n obj.properties.pvPower1\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.pvPower2 != null &&\r\n obj.properties?.pvPower2 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower1\", // Reversed to adjust like offical app\r\n obj.properties.pvPower2\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.solarPower1 != null &&\r\n obj.properties?.solarPower1 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower1\",\r\n obj.properties.solarPower1\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.solarPower2 != null &&\r\n obj.properties?.solarPower2 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower2\",\r\n obj.properties.solarPower2\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.remainOutTime != null &&\r\n obj.properties?.remainOutTime != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"remainOutTime\",\r\n obj.properties.remainOutTime\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.remainInputTime != null &&\r\n obj.properties?.remainInputTime != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"remainInputTime\",\r\n obj.properties.remainInputTime\r\n );\r\n }\r\n\r\n if (obj.properties?.socSet != null && obj.properties?.socSet != undefined) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"socSet\",\r\n Number(obj.properties.socSet) / 10\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"chargeLimit\",\r\n Number(obj.properties.socSet) / 10\r\n );\r\n }\r\n\r\n if (obj.properties?.minSoc != null && obj.properties?.minSoc != undefined) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"minSoc\",\r\n Number(obj.properties.minSoc) / 10\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"dischargeLimit\",\r\n Number(obj.properties.minSoc) / 10\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.inputLimit != null &&\r\n obj.properties?.inputLimit != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"inputLimit\",\r\n obj.properties.inputLimit\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"setInputLimit\",\r\n obj.properties.inputLimit\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.gridInputPower != null &&\r\n obj.properties?.gridInputPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"gridInputPower\",\r\n obj.properties.gridInputPower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.acOutputPower != null &&\r\n obj.properties?.acOutputPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"acOutputPower\",\r\n obj.properties.acOutputPower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.gridPower != null &&\r\n obj.properties?.gridPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"gridPower\",\r\n obj.properties.gridPower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.acSwitch != null &&\r\n obj.properties?.acSwitch != undefined\r\n ) {\r\n const value = obj.properties?.acSwitch == 0 ? false : true;\r\n\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"acSwitch\", value);\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"acSwitch\",\r\n value\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.dcSwitch != null &&\r\n obj.properties?.dcSwitch != undefined\r\n ) {\r\n const value = obj.properties?.dcSwitch == 0 ? false : true;\r\n\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"dcSwitch\", value);\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"dcSwitch\",\r\n value\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.dcOutputPower != null &&\r\n obj.properties?.dcOutputPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"dcOutputPower\",\r\n obj.properties.dcOutputPower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.pvBrand != null &&\r\n obj.properties?.pvBrand != undefined\r\n ) {\r\n const value =\r\n obj.properties?.pvBrand == 0\r\n ? \"Others\"\r\n : obj.properties?.pvBrand == 1\r\n ? \"Hoymiles\"\r\n : obj.properties?.pvBrand == 2\r\n ? \"Enphase\"\r\n : obj.properties?.pvBrand == 3\r\n ? \"APSystems\"\r\n : obj.properties?.pvBrand == 4\r\n ? \"Anker\"\r\n : obj.properties?.pvBrand == 5\r\n ? \"Deye\"\r\n : obj.properties?.pvBrand == 6\r\n ? \"Bosswerk\"\r\n : \"Unknown\";\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"pvBrand\", value);\r\n }\r\n\r\n if (\r\n obj.properties?.inverseMaxPower != null &&\r\n obj.properties?.inverseMaxPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"inverseMaxPower\",\r\n obj.properties.inverseMaxPower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.wifiState != null &&\r\n obj.properties?.wifiState != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"wifiState\",\r\n obj.properties.wifiState == 1 ? \"Connected\" : \"Disconnected\"\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.packNum != null &&\r\n obj.properties?.packNum != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"packNum\",\r\n obj.properties.packNum\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.hubState != null &&\r\n obj.properties?.hubState != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"hubState\",\r\n obj.properties.hubState == 0\r\n ? \"Stop output and standby\"\r\n : \"Stop output and shut down\"\r\n );\r\n }\r\n\r\n if (obj.packData) {\r\n addOrUpdatePackData(productKey, deviceKey, obj.packData, isSolarFlow);\r\n }\r\n\r\n if (obj.properties) {\r\n Object.entries(obj.properties).forEach(([key, value]) => {\r\n if (knownMqttProps.includes(key)) {\r\n //console.log(`${key} with value ${value} is a known Mqtt Prop!`);\r\n } else {\r\n console.log(\r\n `${productName?.val}: ${key} with value ${value} is a UNKNOWN Mqtt Prop!`\r\n );\r\n }\r\n });\r\n }\r\n }\r\n};\r\n\r\nexport const setChargeLimit = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n socSet: number\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n if (socSet > 40 && socSet <= 100) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const socSetLimit = { properties: { socSet: socSet * 10 } };\r\n adapter.log.debug(\r\n `[setChargeLimit] Setting ChargeLimit for device key ${deviceKey} to ${socSet}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(socSetLimit));\r\n } else {\r\n adapter.log.debug(\r\n `[setChargeLimit] Charge limit is not in range 40<>100!`\r\n );\r\n }\r\n }\r\n};\r\n\r\nexport const setDischargeLimit = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n minSoc: number\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n if (minSoc > 0 && minSoc < 90) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const socSetLimit = { properties: { minSoc: minSoc * 10 } };\r\n adapter.log.debug(\r\n `[setDischargeLimit] Setting Discharge Limit for device key ${deviceKey} to ${minSoc}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(socSetLimit));\r\n } else {\r\n adapter.log.debug(\r\n `[setDischargeLimit] Discharge limit is not in range 0<>90!`\r\n );\r\n }\r\n }\r\n};\r\n\r\nexport const setOutputLimit = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n limit: number\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n if (adapter.config.useLowVoltageBlock) {\r\n const lowVoltageBlockState = await adapter.getStateAsync(\r\n productKey + \".\" + deviceKey + \".control.lowVoltageBlock\"\r\n );\r\n if (\r\n lowVoltageBlockState &&\r\n lowVoltageBlockState.val &&\r\n lowVoltageBlockState.val == true\r\n ) {\r\n limit = 0;\r\n }\r\n }\r\n\r\n // Das Limit kann unter 100 nur in 30er Schritten gesetzt werden, dH. 30/60/90/100, wir rechnen das also um\r\n const currentLimit = (\r\n await adapter.getStateAsync(productKey + \".\" + deviceKey + \".outputLimit\")\r\n )?.val;\r\n\r\n if (currentLimit != null && currentLimit != undefined) {\r\n if (currentLimit != limit) {\r\n if (\r\n limit < 100 &&\r\n limit != 90 &&\r\n limit != 60 &&\r\n limit != 30 &&\r\n limit != 0\r\n ) {\r\n if (limit < 100 && limit > 90) {\r\n limit = 90;\r\n } else if (limit < 90 && limit > 60) {\r\n limit = 60;\r\n } else if (limit < 60 && limit > 30) {\r\n limit = 30;\r\n } else if (limit < 30) {\r\n limit = 30;\r\n }\r\n }\r\n\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const outputlimit = { properties: { outputLimit: limit } };\r\n adapter.mqttClient?.publish(topic, JSON.stringify(outputlimit));\r\n }\r\n }\r\n }\r\n};\r\n\r\nexport const setInputLimit = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n limit: number\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n let maxLimit = 900;\r\n const currentLimit = (\r\n await adapter.getStateAsync(productKey + \".\" + deviceKey + \".inputLimit\")\r\n )?.val;\r\n\r\n const productName = (\r\n await adapter.getStateAsync(productKey + \".\" + deviceKey + \".productName\")\r\n )?.val\r\n ?.toString()\r\n .toLowerCase();\r\n\r\n if (productName == \"hyper 2000\") {\r\n maxLimit = 1200;\r\n }\r\n\r\n // Das Limit kann nur in 100er Schritten gesetzt werden\r\n limit = Math.ceil(limit / 100) * 100;\r\n if (limit < 0) {\r\n limit = 0;\r\n } else if (limit > maxLimit) {\r\n limit = maxLimit;\r\n }\r\n\r\n if (currentLimit != null && currentLimit != undefined) {\r\n if (currentLimit != limit) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const inputLimitContent = { properties: { inputLimit: limit } };\r\n adapter.mqttClient?.publish(topic, JSON.stringify(inputLimitContent));\r\n }\r\n }\r\n }\r\n};\r\n\r\nexport const setBuzzerSwitch = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n buzzerOn: boolean\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const socSetLimit = { properties: { buzzerSwitch: buzzerOn ? 1 : 0 } };\r\n adapter.log.debug(\r\n `[setBuzzer] Setting Buzzer for device key ${deviceKey} to ${buzzerOn}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(socSetLimit));\r\n }\r\n};\r\n\r\nexport const triggerFullTelemetryUpdate = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/read`;\r\n\r\n const getAllContent = { properties: [\"getAll\"] };\r\n adapter.log.debug(\r\n `[triggerFullTelemetryUpdate] Triggering full telemetry update for device key ${deviceKey}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(getAllContent));\r\n }\r\n};\r\n\r\nexport const setPassMode = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n passMode: number\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const setPassModeContent = { properties: { passMode: passMode } };\r\n adapter.log.debug(\r\n `[setPassMode] Set passMode for device ${deviceKey} to ${passMode}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(setPassModeContent));\r\n }\r\n};\r\n\r\nexport const setAutoRecover = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n autoRecover: boolean\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const setAutoRecoverContent = {\r\n properties: { autoRecover: autoRecover ? 1 : 0 },\r\n };\r\n adapter.log.debug(\r\n `[setPassMode] Set autoRecover for device ${deviceKey} to ${autoRecover}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(setAutoRecoverContent));\r\n }\r\n};\r\n\r\nexport const setDcSwitch = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n dcSwitch: boolean\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const setDcSwitchContent = {\r\n properties: { dcSwitch: dcSwitch ? 1 : 0 },\r\n };\r\n adapter.log.debug(\r\n `[setPassMode] Set DC Switch for device ${deviceKey} to ${dcSwitch}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(setDcSwitchContent));\r\n }\r\n};\r\n\r\nexport const setAcSwitch = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n acSwitch: boolean\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const setAcSwitchContent = {\r\n properties: { acSwitch: acSwitch ? 1 : 0 },\r\n };\r\n adapter.log.debug(\r\n `[setPassMode] Set AC Switch for device ${deviceKey} to ${acSwitch}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(setAcSwitchContent));\r\n }\r\n};\r\n\r\nconst onConnected = (): void => {\r\n adapter?.log.info(\"[onConnected] Connected with MQTT!\");\r\n};\r\n\r\nconst onError = (error: any): void => {\r\n adapter?.log.error(\"Connection to MQTT failed! Error: \" + error);\r\n};\r\n\r\nconst onSubscribeReportTopic: any = (error: Error | null) => {\r\n if (error) {\r\n adapter?.log.error(\"Subscription to MQTT failed! Error: \" + error);\r\n } else {\r\n adapter?.log.debug(\"Subscription of Report Topic successful!\");\r\n }\r\n};\r\n\r\nconst onSubscribeIotTopic: any = (\r\n error: Error | null,\r\n productKey: string,\r\n deviceKey: string\r\n) => {\r\n if (error) {\r\n adapter?.log.error(\"Subscription to MQTT failed! Error: \" + error);\r\n } else if (adapter) {\r\n adapter?.log.debug(\"Subscription of IOT Topic successful!\");\r\n triggerFullTelemetryUpdate(adapter, productKey, deviceKey);\r\n }\r\n};\r\n\r\nexport const connectMqttClient = (_adapter: ZendureSolarflow): void => {\r\n adapter = _adapter;\r\n\r\n const options: mqtt.IClientOptions = {\r\n clientId: adapter.accessToken,\r\n username: \"zenApp\",\r\n password:\r\n adapter.config.server && adapter.config.server == \"eu\"\r\n ? \"H6s$j9CtNa0N\"\r\n : \"oK#PCgy6OZxd\",\r\n clean: true,\r\n protocolVersion: 5,\r\n };\r\n\r\n if (mqtt && adapter && adapter.paths && adapter.deviceList) {\r\n adapter.log.debug(\r\n `[connectMqttClient] Connecting to MQTT broker ${\r\n adapter.paths.mqttUrl + \":\" + adapter.paths.mqttPort\r\n }...`\r\n );\r\n adapter.mqttClient = mqtt.connect(\r\n \"mqtt://\" + adapter.paths.mqttUrl + \":\" + adapter.paths.mqttPort,\r\n options\r\n ); // create a client\r\n\r\n if (adapter && adapter.mqttClient) {\r\n adapter.mqttClient.on(\"connect\", onConnected);\r\n adapter.mqttClient.on(\"error\", onError);\r\n\r\n // Subscribe to Topic (appkey von Zendure)\r\n adapter.deviceList.forEach(\r\n (device: ISolarFlowDeviceDetails, index: number) => {\r\n if (adapter) {\r\n const reportTopic = `/${device.productKey}/${device.deviceKey}/properties/report`;\r\n const iotTopic = `iot/${device.productKey}/${device.deviceKey}/#`;\r\n\r\n setTimeout(() => {\r\n if (adapter) {\r\n adapter.log.debug(\r\n `[connectMqttClient] Subscribing to MQTT Topic: ${reportTopic}`\r\n );\r\n adapter.mqttClient?.subscribe(\r\n reportTopic,\r\n onSubscribeReportTopic\r\n );\r\n }\r\n }, 1000 * index);\r\n\r\n setTimeout(() => {\r\n adapter?.log.debug(\r\n `[connectMqttClient] Subscribing to MQTT Topic: ${iotTopic}`\r\n );\r\n adapter?.mqttClient?.subscribe(iotTopic, (error) => {\r\n onSubscribeIotTopic(error, device.productKey, device.deviceKey);\r\n });\r\n }, 1500 * index);\r\n\r\n // Check if has subdevice e.g. ACE and connect to this also?\r\n if (device.packList && device.packList.length > 0) {\r\n device.packList.forEach(async (subDevice) => {\r\n if (subDevice.productName.toLocaleLowerCase() == \"ace 1500\") {\r\n const reportTopic = `/${subDevice.productKey}/${subDevice.deviceKey}/properties/report`;\r\n const iotTopic = `iot/${subDevice.productKey}/${subDevice.deviceKey}/#`;\r\n\r\n setTimeout(() => {\r\n if (adapter) {\r\n adapter.log.debug(\r\n `[connectMqttClient] Subscribing to MQTT Topic: ${reportTopic}`\r\n );\r\n adapter.mqttClient?.subscribe(\r\n reportTopic,\r\n onSubscribeReportTopic\r\n );\r\n }\r\n }, 1000 * index);\r\n\r\n setTimeout(() => {\r\n adapter?.log.debug(\r\n `[connectMqttClient] Subscribing to MQTT Topic: ${iotTopic}`\r\n );\r\n adapter?.mqttClient?.subscribe(iotTopic, (error) => {\r\n onSubscribeIotTopic(\r\n error,\r\n subDevice.productKey,\r\n subDevice.deviceKey\r\n );\r\n });\r\n }, 1500 * index);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n );\r\n\r\n adapter.mqttClient.on(\"message\", onMessage);\r\n\r\n // Job starten die states in der Nacht zu resetten\r\n startResetValuesJob(adapter);\r\n\r\n // Job starten die States zu checken\r\n startCheckStatesAndConnectionJob(adapter);\r\n\r\n // Den Access Token aktualiseren\r\n startRefreshAccessTokenTimerJob(adapter);\r\n\r\n // Calculation Job starten sofern aktiviert\r\n if (adapter.config.useCalculation) {\r\n startCalculationJob(adapter);\r\n }\r\n }\r\n }\r\n};\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\r\nimport * as mqtt from \"mqtt\";\r\nimport { ZendureSolarflow } from \"../main\";\r\nimport { ISolarFlowDeviceDetails } from \"../models/ISolarFlowDeviceDetails\";\r\nimport {\r\n checkVoltage,\r\n updateSolarFlowControlState,\r\n updateSolarFlowState,\r\n} from \"./adapterService\";\r\nimport { IPackData } from \"../models/IPackData\";\r\nimport { setEnergyWhMax, setSocToZero } from \"./calculationService\";\r\nimport { IMqttData, knownMqttProps } from \"../models/ISolarFlowMqttProperties\";\r\nimport {\r\n startCalculationJob,\r\n startCheckStatesAndConnectionJob,\r\n startRefreshAccessTokenTimerJob,\r\n startResetValuesJob,\r\n} from \"./jobSchedule\";\r\n\r\nlet adapter: ZendureSolarflow | undefined = undefined;\r\n\r\nexport const addOrUpdatePackData = async (\r\n productKey: string,\r\n deviceKey: string,\r\n packData: IPackData[],\r\n isSolarFlow: boolean\r\n): Promise<void> => {\r\n if (adapter && productKey && deviceKey) {\r\n await packData.forEach(async (x) => {\r\n // Process data only with a serial id!\r\n if (x.sn && adapter) {\r\n // create a state for the serial id\r\n const key = (\r\n productKey +\r\n \".\" +\r\n deviceKey +\r\n \".packData.\" +\r\n x.sn\r\n ).replace(adapter.FORBIDDEN_CHARS, \"\");\r\n\r\n await adapter?.extendObject(key + \".sn\", {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Seriennummer\",\r\n en: \"Serial id\",\r\n },\r\n type: \"string\",\r\n desc: \"Serial ID\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setStateAsync(key + \".sn\", x.sn, true);\r\n\r\n if (x.socLevel) {\r\n // State f\u00FCr socLevel\r\n await adapter?.extendObject(key + \".socLevel\", {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"SOC der Batterie\",\r\n en: \"soc of battery\",\r\n },\r\n type: \"number\",\r\n desc: \"SOC Level\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setStateAsync(key + \".socLevel\", x.socLevel, true);\r\n }\r\n\r\n if (x.maxTemp) {\r\n // State f\u00FCr maxTemp\r\n await adapter?.extendObject(key + \".maxTemp\", {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Max. Temperatur der Batterie\",\r\n en: \"max temp. of battery\",\r\n },\r\n type: \"number\",\r\n desc: \"Max. Temp\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n // Convert Kelvin to Celsius\r\n await adapter?.setStateAsync(\r\n key + \".maxTemp\",\r\n x.maxTemp / 10 - 273.15,\r\n true\r\n );\r\n }\r\n\r\n if (x.minVol) {\r\n await adapter?.extendObject(key + \".minVol\", {\r\n type: \"state\",\r\n common: {\r\n name: \"minVol\",\r\n type: \"number\",\r\n desc: \"minVol\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setStateAsync(key + \".minVol\", x.minVol / 100, true);\r\n }\r\n\r\n if (x.maxVol) {\r\n await adapter?.extendObject(key + \".maxVol\", {\r\n type: \"state\",\r\n common: {\r\n name: \"maxVol\",\r\n type: \"number\",\r\n desc: \"maxVol\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setState(key + \".maxVol\", x.maxVol / 100, true);\r\n }\r\n\r\n if (x.totalVol) {\r\n await adapter?.extendObject(key + \".totalVol\", {\r\n type: \"state\",\r\n common: {\r\n name: \"totalVol\",\r\n type: \"number\",\r\n desc: \"totalVol\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n const totalVol = x.totalVol / 100;\r\n\r\n await adapter?.setState(key + \".totalVol\", totalVol, true);\r\n\r\n // Send Voltage to checkVoltage Method (only if is Solarflow device)\r\n if (isSolarFlow) {\r\n checkVoltage(adapter, productKey, deviceKey, totalVol);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n};\r\n\r\nconst onMessage = async (topic: string, message: Buffer): Promise<void> => {\r\n if (adapter) {\r\n const topicSplitted = topic.split(\"/\");\r\n const productKey = topicSplitted[1];\r\n const deviceKey = topicSplitted[2];\r\n\r\n let obj: IMqttData = {};\r\n try {\r\n obj = JSON.parse(message.toString());\r\n } catch (e) {\r\n const txt = message.toString();\r\n adapter.log.error(`[JSON PARSE ERROR] ${txt}`);\r\n }\r\n\r\n let isSolarFlow = false;\r\n const productName = await adapter.getStateAsync(\r\n `${productKey}.${deviceKey}.productName`\r\n );\r\n\r\n // Check if device is an solarflow or hyper device. Don't use LowVoltageBlock on an ACE device?\r\n if (\r\n productName?.val?.toString().toLowerCase().includes(\"solarflow\") ||\r\n productName?.val?.toString().toLowerCase().includes(\"hyper\")\r\n ) {\r\n isSolarFlow = true;\r\n }\r\n\r\n // set lastUpdate for deviceKey\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"lastUpdate\",\r\n new Date().getTime()\r\n );\r\n\r\n if (\r\n obj.properties?.electricLevel != null &&\r\n obj.properties?.electricLevel != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"electricLevel\",\r\n obj.properties.electricLevel\r\n );\r\n\r\n if (\r\n adapter?.config.useCalculation &&\r\n obj.properties.electricLevel == 100 &&\r\n isSolarFlow\r\n ) {\r\n setEnergyWhMax(adapter, productKey, deviceKey);\r\n }\r\n\r\n // if minSoc is reached, set the calculated soc to 0\r\n const minSoc = await adapter?.getStateAsync(\r\n `${productKey}.${deviceKey}.minSoc`\r\n );\r\n if (\r\n adapter?.config.useCalculation &&\r\n minSoc &&\r\n minSoc.val &&\r\n obj.properties.electricLevel <= Number(minSoc.val) &&\r\n isSolarFlow\r\n ) {\r\n setSocToZero(adapter, productKey, deviceKey);\r\n }\r\n }\r\n\r\n if (\r\n obj.properties?.packState != null &&\r\n obj.properties?.packState != undefined\r\n ) {\r\n const value =\r\n obj.properties?.packState == 0\r\n ? \"Idle\"\r\n : obj.properties?.packState == 1\r\n ? \"Charging\"\r\n : obj.properties?.packState == 2\r\n ? \"Discharging\"\r\n : \"Unknown\";\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"packState\", value);\r\n }\r\n\r\n if (\r\n obj.properties?.passMode != null &&\r\n obj.properties?.passMode != undefined\r\n ) {\r\n const value =\r\n obj.properties?.passMode == 0\r\n ? \"Automatic\"\r\n : obj.properties?.passMode == 1\r\n ? \"Always off\"\r\n : obj.properties?.passMode == 2\r\n ? \"Always on\"\r\n : \"Unknown\";\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"passMode\", value);\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"passMode\",\r\n obj.properties?.passMode\r\n );\r\n }\r\n\r\n if (obj.properties?.pass != null && obj.properties?.pass != undefined) {\r\n const value = obj.properties?.pass == 0 ? false : true;\r\n\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"pass\", value);\r\n }\r\n\r\n if (\r\n obj.properties?.autoRecover != null &&\r\n obj.properties?.autoRecover != undefined\r\n ) {\r\n const value = obj.properties?.autoRecover == 0 ? false : true;\r\n\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"autoRecover\",\r\n value\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"autoRecover\",\r\n value\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.outputHomePower != null &&\r\n obj.properties?.outputHomePower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"outputHomePower\",\r\n obj.properties.outputHomePower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.energyPower != null &&\r\n obj.properties?.energyPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"energyPower\",\r\n obj.properties.energyPower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.outputLimit != null &&\r\n obj.properties?.outputLimit != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"outputLimit\",\r\n obj.properties.outputLimit\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"setOutputLimit\",\r\n obj.properties.outputLimit\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.buzzerSwitch != null &&\r\n obj.properties?.buzzerSwitch != undefined\r\n ) {\r\n const value = obj.properties?.buzzerSwitch == 0 ? false : true;\r\n\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"buzzerSwitch\",\r\n value\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"buzzerSwitch\",\r\n value\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.outputPackPower != null &&\r\n obj.properties?.outputPackPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"outputPackPower\",\r\n obj.properties.outputPackPower\r\n );\r\n\r\n // if outPutPackPower set packInputPower to 0\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"packInputPower\", 0);\r\n }\r\n\r\n if (\r\n obj.properties?.packInputPower != null &&\r\n obj.properties?.packInputPower != undefined\r\n ) {\r\n let standbyUsage = 0;\r\n\r\n // Aktuelle Solar-Power abfragen, wenn 0 Standby-Verbrauch dazu rechnen\r\n const solarInputPower = await adapter?.getStateAsync(\r\n `${productKey}.${deviceKey}.solarInputPower`\r\n );\r\n\r\n if (solarInputPower && Number(solarInputPower.val) < 10) {\r\n standbyUsage = 10 - Number(solarInputPower.val);\r\n }\r\n\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"packInputPower\",\r\n obj.properties.packInputPower + standbyUsage\r\n );\r\n\r\n // if packInputPower set outputPackPower to 0\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"outputPackPower\",\r\n 0\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.solarInputPower != null &&\r\n obj.properties?.solarInputPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"solarInputPower\",\r\n obj.properties.solarInputPower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.pvPower1 != null &&\r\n obj.properties?.pvPower1 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower2\", // Reversed to adjust like offical app\r\n obj.properties.pvPower1\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.pvPower2 != null &&\r\n obj.properties?.pvPower2 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower1\", // Reversed to adjust like offical app\r\n obj.properties.pvPower2\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.solarPower1 != null &&\r\n obj.properties?.solarPower1 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower1\",\r\n obj.properties.solarPower1\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.solarPower2 != null &&\r\n obj.properties?.solarPower2 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower2\",\r\n obj.properties.solarPower2\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.remainOutTime != null &&\r\n obj.properties?.remainOutTime != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"remainOutTime\",\r\n obj.properties.remainOutTime\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.remainInputTime != null &&\r\n obj.properties?.remainInputTime != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"remainInputTime\",\r\n obj.properties.remainInputTime\r\n );\r\n }\r\n\r\n if (obj.properties?.socSet != null && obj.properties?.socSet != undefined) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"socSet\",\r\n Number(obj.properties.socSet) / 10\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"chargeLimit\",\r\n Number(obj.properties.socSet) / 10\r\n );\r\n }\r\n\r\n if (obj.properties?.minSoc != null && obj.properties?.minSoc != undefined) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"minSoc\",\r\n Number(obj.properties.minSoc) / 10\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"dischargeLimit\",\r\n Number(obj.properties.minSoc) / 10\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.inputLimit != null &&\r\n obj.properties?.inputLimit != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"inputLimit\",\r\n obj.properties.inputLimit\r\n );\r\n\r\n if (\r\n productName?.val?.toString().toLowerCase().includes(\"ace\") ||\r\n productName?.val?.toString().toLowerCase().includes(\"hyper\")\r\n ) {\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"setInputLimit\",\r\n obj.properties.inputLimit\r\n );\r\n }\r\n }\r\n\r\n if (\r\n obj.properties?.gridInputPower != null &&\r\n obj.properties?.gridInputPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"gridInputPower\",\r\n obj.properties.gridInputPower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.acOutputPower != null &&\r\n obj.properties?.acOutputPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"acOutputPower\",\r\n obj.properties.acOutputPower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.gridPower != null &&\r\n obj.properties?.gridPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"gridPower\",\r\n obj.properties.gridPower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.acSwitch != null &&\r\n obj.properties?.acSwitch != undefined\r\n ) {\r\n const value = obj.properties?.acSwitch == 0 ? false : true;\r\n\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"acSwitch\", value);\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"acSwitch\",\r\n value\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.dcSwitch != null &&\r\n obj.properties?.dcSwitch != undefined\r\n ) {\r\n const value = obj.properties?.dcSwitch == 0 ? false : true;\r\n\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"dcSwitch\", value);\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"dcSwitch\",\r\n value\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.dcOutputPower != null &&\r\n obj.properties?.dcOutputPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"dcOutputPower\",\r\n obj.properties.dcOutputPower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.pvBrand != null &&\r\n obj.properties?.pvBrand != undefined\r\n ) {\r\n const value =\r\n obj.properties?.pvBrand == 0\r\n ? \"Others\"\r\n : obj.properties?.pvBrand == 1\r\n ? \"Hoymiles\"\r\n : obj.properties?.pvBrand == 2\r\n ? \"Enphase\"\r\n : obj.properties?.pvBrand == 3\r\n ? \"APSystems\"\r\n : obj.properties?.pvBrand == 4\r\n ? \"Anker\"\r\n : obj.properties?.pvBrand == 5\r\n ? \"Deye\"\r\n : obj.properties?.pvBrand == 6\r\n ? \"Bosswerk\"\r\n : \"Unknown\";\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"pvBrand\", value);\r\n }\r\n\r\n if (\r\n obj.properties?.inverseMaxPower != null &&\r\n obj.properties?.inverseMaxPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"inverseMaxPower\",\r\n obj.properties.inverseMaxPower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.wifiState != null &&\r\n obj.properties?.wifiState != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"wifiState\",\r\n obj.properties.wifiState == 1 ? \"Connected\" : \"Disconnected\"\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.packNum != null &&\r\n obj.properties?.packNum != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"packNum\",\r\n obj.properties.packNum\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.hubState != null &&\r\n obj.properties?.hubState != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"hubState\",\r\n obj.properties.hubState == 0\r\n ? \"Stop output and standby\"\r\n : \"Stop output and shut down\"\r\n );\r\n }\r\n\r\n if (obj.packData) {\r\n addOrUpdatePackData(productKey, deviceKey, obj.packData, isSolarFlow);\r\n }\r\n\r\n if (obj.properties) {\r\n Object.entries(obj.properties).forEach(([key, value]) => {\r\n if (knownMqttProps.includes(key)) {\r\n //console.log(`${key} with value ${value} is a known Mqtt Prop!`);\r\n } else {\r\n console.log(\r\n `${productName?.val}: ${key} with value ${value} is a UNKNOWN Mqtt Prop!`\r\n );\r\n }\r\n });\r\n }\r\n }\r\n};\r\n\r\nexport const setChargeLimit = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n socSet: number\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n if (socSet > 40 && socSet <= 100) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const socSetLimit = { properties: { socSet: socSet * 10 } };\r\n adapter.log.debug(\r\n `[setChargeLimit] Setting ChargeLimit for device key ${deviceKey} to ${socSet}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(socSetLimit));\r\n } else {\r\n adapter.log.debug(\r\n `[setChargeLimit] Charge limit is not in range 40<>100!`\r\n );\r\n }\r\n }\r\n};\r\n\r\nexport const setDischargeLimit = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n minSoc: number\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n if (minSoc > 0 && minSoc < 90) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const socSetLimit = { properties: { minSoc: minSoc * 10 } };\r\n adapter.log.debug(\r\n `[setDischargeLimit] Setting Discharge Limit for device key ${deviceKey} to ${minSoc}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(socSetLimit));\r\n } else {\r\n adapter.log.debug(\r\n `[setDischargeLimit] Discharge limit is not in range 0<>90!`\r\n );\r\n }\r\n }\r\n};\r\n\r\nexport const setOutputLimit = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n limit: number\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n if (adapter.config.useLowVoltageBlock) {\r\n const lowVoltageBlockState = await adapter.getStateAsync(\r\n productKey + \".\" + deviceKey + \".control.lowVoltageBlock\"\r\n );\r\n if (\r\n lowVoltageBlockState &&\r\n lowVoltageBlockState.val &&\r\n lowVoltageBlockState.val == true\r\n ) {\r\n limit = 0;\r\n }\r\n }\r\n\r\n // Das Limit kann unter 100 nur in 30er Schritten gesetzt werden, dH. 30/60/90/100, wir rechnen das also um\r\n const currentLimit = (\r\n await adapter.getStateAsync(productKey + \".\" + deviceKey + \".outputLimit\")\r\n )?.val;\r\n\r\n if (currentLimit != null && currentLimit != undefined) {\r\n if (currentLimit != limit) {\r\n if (\r\n limit < 100 &&\r\n limit != 90 &&\r\n limit != 60 &&\r\n limit != 30 &&\r\n limit != 0\r\n ) {\r\n if (limit < 100 && limit > 90) {\r\n limit = 90;\r\n } else if (limit < 90 && limit > 60) {\r\n limit = 60;\r\n } else if (limit < 60 && limit > 30) {\r\n limit = 30;\r\n } else if (limit < 30) {\r\n limit = 30;\r\n }\r\n }\r\n\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const outputlimit = { properties: { outputLimit: limit } };\r\n adapter.mqttClient?.publish(topic, JSON.stringify(outputlimit));\r\n }\r\n }\r\n }\r\n};\r\n\r\nexport const setInputLimit = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n limit: number\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n let maxLimit = 900;\r\n const currentLimit = (\r\n await adapter.getStateAsync(productKey + \".\" + deviceKey + \".inputLimit\")\r\n )?.val;\r\n\r\n const productName = (\r\n await adapter.getStateAsync(productKey + \".\" + deviceKey + \".productName\")\r\n )?.val\r\n ?.toString()\r\n .toLowerCase();\r\n\r\n if (productName == \"hyper 2000\") {\r\n maxLimit = 1200;\r\n }\r\n\r\n // Das Limit kann nur in 100er Schritten gesetzt werden\r\n limit = Math.ceil(limit / 100) * 100;\r\n if (limit < 0) {\r\n limit = 0;\r\n } else if (limit > maxLimit) {\r\n limit = maxLimit;\r\n }\r\n\r\n if (currentLimit != null && currentLimit != undefined) {\r\n if (currentLimit != limit) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const inputLimitContent = { properties: { inputLimit: limit } };\r\n adapter.mqttClient?.publish(topic, JSON.stringify(inputLimitContent));\r\n }\r\n }\r\n }\r\n};\r\n\r\nexport const setBuzzerSwitch = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n buzzerOn: boolean\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const socSetLimit = { properties: { buzzerSwitch: buzzerOn ? 1 : 0 } };\r\n adapter.log.debug(\r\n `[setBuzzer] Setting Buzzer for device key ${deviceKey} to ${buzzerOn}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(socSetLimit));\r\n }\r\n};\r\n\r\nexport const triggerFullTelemetryUpdate = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/read`;\r\n\r\n const getAllContent = { properties: [\"getAll\"] };\r\n adapter.log.debug(\r\n `[triggerFullTelemetryUpdate] Triggering full telemetry update for device key ${deviceKey}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(getAllContent));\r\n }\r\n};\r\n\r\nexport const setPassMode = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n passMode: number\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const setPassModeContent = { properties: { passMode: passMode } };\r\n adapter.log.debug(\r\n `[setPassMode] Set passMode for device ${deviceKey} to ${passMode}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(setPassModeContent));\r\n }\r\n};\r\n\r\nexport const setAutoRecover = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n autoRecover: boolean\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const setAutoRecoverContent = {\r\n properties: { autoRecover: autoRecover ? 1 : 0 },\r\n };\r\n adapter.log.debug(\r\n `[setPassMode] Set autoRecover for device ${deviceKey} to ${autoRecover}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(setAutoRecoverContent));\r\n }\r\n};\r\n\r\nexport const setDcSwitch = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n dcSwitch: boolean\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const setDcSwitchContent = {\r\n properties: { dcSwitch: dcSwitch ? 1 : 0 },\r\n };\r\n adapter.log.debug(\r\n `[setPassMode] Set DC Switch for device ${deviceKey} to ${dcSwitch}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(setDcSwitchContent));\r\n }\r\n};\r\n\r\nexport const setAcSwitch = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n acSwitch: boolean\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const setAcSwitchContent = {\r\n properties: { acSwitch: acSwitch ? 1 : 0 },\r\n };\r\n adapter.log.debug(\r\n `[setPassMode] Set AC Switch for device ${deviceKey} to ${acSwitch}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(setAcSwitchContent));\r\n }\r\n};\r\n\r\nconst onConnected = (): void => {\r\n adapter?.log.info(\"[onConnected] Connected with MQTT!\");\r\n};\r\n\r\nconst onError = (error: any): void => {\r\n adapter?.log.error(\"Connection to MQTT failed! Error: \" + error);\r\n};\r\n\r\nconst onSubscribeReportTopic: any = (error: Error | null) => {\r\n if (error) {\r\n adapter?.log.error(\"Subscription to MQTT failed! Error: \" + error);\r\n } else {\r\n adapter?.log.debug(\"Subscription of Report Topic successful!\");\r\n }\r\n};\r\n\r\nconst onSubscribeIotTopic: any = (\r\n error: Error | null,\r\n productKey: string,\r\n deviceKey: string\r\n) => {\r\n if (error) {\r\n adapter?.log.error(\"Subscription to MQTT failed! Error: \" + error);\r\n } else if (adapter) {\r\n adapter?.log.debug(\"Subscription of IOT Topic successful!\");\r\n triggerFullTelemetryUpdate(adapter, productKey, deviceKey);\r\n }\r\n};\r\n\r\nexport const connectMqttClient = (_adapter: ZendureSolarflow): void => {\r\n adapter = _adapter;\r\n\r\n const options: mqtt.IClientOptions = {\r\n clientId: adapter.accessToken,\r\n username: \"zenApp\",\r\n password:\r\n adapter.config.server && adapter.config.server == \"eu\"\r\n ? \"H6s$j9CtNa0N\"\r\n : \"oK#PCgy6OZxd\",\r\n clean: true,\r\n protocolVersion: 5,\r\n };\r\n\r\n if (mqtt && adapter && adapter.paths && adapter.deviceList) {\r\n adapter.log.debug(\r\n `[connectMqttClient] Connecting to MQTT broker ${\r\n adapter.paths.mqttUrl + \":\" + adapter.paths.mqttPort\r\n }...`\r\n );\r\n adapter.mqttClient = mqtt.connect(\r\n \"mqtt://\" + adapter.paths.mqttUrl + \":\" + adapter.paths.mqttPort,\r\n options\r\n ); // create a client\r\n\r\n if (adapter && adapter.mqttClient) {\r\n adapter.mqttClient.on(\"connect\", onConnected);\r\n adapter.mqttClient.on(\"error\", onError);\r\n\r\n // Subscribe to Topic (appkey von Zendure)\r\n adapter.deviceList.forEach(\r\n (device: ISolarFlowDeviceDetails, index: number) => {\r\n if (adapter) {\r\n const reportTopic = `/${device.productKey}/${device.deviceKey}/properties/report`;\r\n const iotTopic = `iot/${device.productKey}/${device.deviceKey}/#`;\r\n\r\n setTimeout(() => {\r\n if (adapter) {\r\n adapter.log.debug(\r\n `[connectMqttClient] Subscribing to MQTT Topic: ${reportTopic}`\r\n );\r\n adapter.mqttClient?.subscribe(\r\n reportTopic,\r\n onSubscribeReportTopic\r\n );\r\n }\r\n }, 1000 * index);\r\n\r\n setTimeout(() => {\r\n adapter?.log.debug(\r\n `[connectMqttClient] Subscribing to MQTT Topic: ${iotTopic}`\r\n );\r\n adapter?.mqttClient?.subscribe(iotTopic, (error) => {\r\n onSubscribeIotTopic(error, device.productKey, device.deviceKey);\r\n });\r\n }, 1500 * index);\r\n\r\n // Check if has subdevice e.g. ACE and connect to this also?\r\n if (device.packList && device.packList.length > 0) {\r\n device.packList.forEach(async (subDevice) => {\r\n if (subDevice.productName.toLocaleLowerCase() == \"ace 1500\") {\r\n const reportTopic = `/${subDevice.productKey}/${subDevice.deviceKey}/properties/report`;\r\n const iotTopic = `iot/${subDevice.productKey}/${subDevice.deviceKey}/#`;\r\n\r\n setTimeout(() => {\r\n if (adapter) {\r\n adapter.log.debug(\r\n `[connectMqttClient] Subscribing to MQTT Topic: ${reportTopic}`\r\n );\r\n adapter.mqttClient?.subscribe(\r\n reportTopic,\r\n onSubscribeReportTopic\r\n );\r\n }\r\n }, 1000 * index);\r\n\r\n setTimeout(() => {\r\n adapter?.log.debug(\r\n `[connectMqttClient] Subscribing to MQTT Topic: ${iotTopic}`\r\n );\r\n adapter?.mqttClient?.subscribe(iotTopic, (error) => {\r\n onSubscribeIotTopic(\r\n error,\r\n subDevice.productKey,\r\n subDevice.deviceKey\r\n );\r\n });\r\n }, 1500 * index);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n );\r\n\r\n adapter.mqttClient.on(\"message\", onMessage);\r\n\r\n // Job starten die states in der Nacht zu resetten\r\n startResetValuesJob(adapter);\r\n\r\n // Job starten die States zu checken\r\n startCheckStatesAndConnectionJob(adapter);\r\n\r\n // Den Access Token aktualiseren\r\n startRefreshAccessTokenTimerJob(adapter);\r\n\r\n // Calculation Job starten sofern aktiviert\r\n if (adapter.config.useCalculation) {\r\n startCalculationJob(adapter);\r\n }\r\n }\r\n }\r\n};\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["adapter", "reportTopic", "iotTopic"]
|
|
7
7
|
}
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "zendure-solarflow",
|
|
4
|
-
"version": "1.7.
|
|
4
|
+
"version": "1.7.4",
|
|
5
5
|
"news": {
|
|
6
|
+
"1.7.4": {
|
|
7
|
+
"en": "Set max value and step for setInputLimit",
|
|
8
|
+
"de": "Maximaler Wert und Schritt für setInputLimit einstellen",
|
|
9
|
+
"ru": "Установить максимальное значение и шаг для setInputLimit",
|
|
10
|
+
"pt": "Definir valor máximo e passo para setInputLimit",
|
|
11
|
+
"nl": "Maximale waarde en stap instellen voor setInputLimit",
|
|
12
|
+
"fr": "Définir la valeur maximale et l'étape pour setInputLimit",
|
|
13
|
+
"it": "Impostare il valore massimo e il passo per setInputLimit",
|
|
14
|
+
"es": "Establecer el valor máximo y el paso para setInputLimit",
|
|
15
|
+
"pl": "Ustaw wartość maksymalną i krok dla settInputLimit",
|
|
16
|
+
"uk": "Встановити максимальне значення і крок для setInputLimit",
|
|
17
|
+
"zh-cn": "设置设置的最大值和步骤"
|
|
18
|
+
},
|
|
6
19
|
"1.7.3": {
|
|
7
20
|
"en": "Fix AC input value for Hyper to max. 1200W\nFix dcSwitch and acSwitch value",
|
|
8
21
|
"de": "Fix AC-Eingabewert für Hyper zu max. 1\nFix dcSwitch und acSwitch Wert",
|
|
@@ -80,19 +93,6 @@
|
|
|
80
93
|
"pl": "Podmienił powtarzające się odświeżanie tokena dostępu.",
|
|
81
94
|
"uk": "Запечена рецидивна обробка токени доступу.",
|
|
82
95
|
"zh-cn": "不断刷新访问标志."
|
|
83
|
-
},
|
|
84
|
-
"1.6.5": {
|
|
85
|
-
"en": "Fix reconnect issue. Adapter will now restart if connection semms to be broken.",
|
|
86
|
-
"de": "Reconnect Problem behoben. Adapter wird jetzt neu starten, wenn Verbindungssemms gebrochen werden.",
|
|
87
|
-
"ru": "Переключение. Адаптер теперь перезапустится, если соединение будет сломано.",
|
|
88
|
-
"pt": "Corrigir problema de reconectar. O adaptador reiniciará agora se os semms de conexão forem quebrados.",
|
|
89
|
-
"nl": "Maak opnieuw verbinding probleem. Adapter zal nu herstarten als verbinding sems worden verbroken.",
|
|
90
|
-
"fr": "Correction du problème de reconnect. L'adaptateur redémarre maintenant si la connexion semms doit être cassée.",
|
|
91
|
-
"it": "Risolvi il problema della riconnette. L'adattatore riavvia ora se la connessione semms per essere rotto.",
|
|
92
|
-
"es": "Arregla el problema de reconexión. El adaptador se reiniciará ahora si semms de conexión para ser roto.",
|
|
93
|
-
"pl": "Napraw ponownie połączenie. Adapter ponownie uruchomi się, jeśli semms połączenia zostanie przerwany.",
|
|
94
|
-
"uk": "Виправлення проблеми відключення. Перехідник тепер перезавантажить, якщо з'єднання зламається.",
|
|
95
|
-
"zh-cn": "修复重联问题. 如果连接 semms 要中断, 适配器现在将重新启动 ."
|
|
96
96
|
}
|
|
97
97
|
},
|
|
98
98
|
"titleLang": {
|