diff --git a/README.md b/README.md index 68b0195..c663eb4 100644 --- a/README.md +++ b/README.md @@ -62,8 +62,7 @@ This channel contains system data about the hardware and firmware as well as run Placeholder for the next version (at the beginning of the line): ### **WORK IN PROGRESS** --> - -### **WORK IN PROGRESS** +### 0.0.2 (2025-01-06) - (N-b-dy) initial release diff --git a/build/lib/OxxifyProtocol.js b/build/lib/OxxifyProtocol.js index ac05008..16111a9 100644 --- a/build/lib/OxxifyProtocol.js +++ b/build/lib/OxxifyProtocol.js @@ -659,8 +659,7 @@ class OxxifyProtocol { } return null; } - ParseNothing(byte) { - byte; + ParseNothing(_) { return null; } FillParameterDictionary() { diff --git a/build/lib/OxxifyProtocol.js.map b/build/lib/OxxifyProtocol.js.map index c627e13..9e30abd 100644 --- a/build/lib/OxxifyProtocol.js.map +++ b/build/lib/OxxifyProtocol.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../src/lib/OxxifyProtocol.ts"], - "sourcesContent": ["import { ParsedData, ParsingStatus, ReceivedData } from \"./ModelData\";\n\nenum FunctionType {\n Undefined = 0x00,\n Read = 0x01,\n // Write = 0x02, // not used\n WriteRead = 0x03,\n // Increment = 0x04, // not used\n // Decrement = 0x05, // not used\n Response = 0x06,\n}\n\nexport enum ParameterType {\n FanState = 1,\n FanSpeedMode = 2,\n BoostState = 6,\n TimerMode = 7,\n TimerCountdown = 11,\n StateHumiditySensor = 15,\n StateRelaisSensor = 20,\n StateAnalogVoltageSensor = 22,\n TargetHumidityValue = 25,\n RtcBatteryVoltage = 36,\n CurrentHumidityValue = 37,\n CurrentAnalogVoltageValue = 45,\n CurrentRelaisValue = 50,\n ManualFanSpeed = 68,\n FanSpeedFan1Rpm = 74,\n FanSpeedFan2Rpm = 75,\n FilterExchangeCountdown = 100,\n ResetFilterExchangeCountdown = 101,\n BoostModeFollowUpTime = 102, // [min]\n TriggerTimeSync = 256, // Not actually part of the protocol, used as trigger to sync the time\n RtcTime = 111,\n RtcDate = 112,\n TimeControlledMode = 114,\n TimeControlSchedule = 119,\n SearchFanId = 124,\n FanPassword = 125,\n OperatingTime = 126,\n ResetAlarms = 128,\n AlarmState = 131,\n CloudServerEnabled = 133,\n FirmwareVersionAndDate = 134,\n ResetFactoryDefaults = 135,\n FilterExchangeNecessary = 136,\n WifiOperatingMode = 148,\n WifiName = 149,\n WifiPassword = 150,\n WifiEncryptionMode = 153,\n WifiChannel = 154,\n WifiIpMode = 155,\n WifiIp = 156,\n WifiSubnetMask = 157,\n WifiGateway = 158,\n ExitWifiSetupAndSafe = 160,\n ExitWifiSetupAndDiscard = 162,\n CurrentWifiIp = 163,\n FanOperatingMode = 183,\n TargetAnalogVoltageValue = 184,\n FanType = 185,\n}\n\ntype ParseResult = (b: Buffer) => ioBroker.StateValue;\n\nexport class FanData {\n constructor(\n nSize: number,\n strIdentifer: string,\n bIsWritable: boolean,\n strRole: string,\n strType: ioBroker.CommonType,\n name: ioBroker.StringOrTranslated,\n parseFunction: ParseResult,\n strUnit?: string | undefined,\n minValue?: number | undefined,\n maxValue?: number | undefined,\n ) {\n this.nSize = nSize;\n this.strIdentifer = strIdentifer;\n this.bIsWritable = bIsWritable;\n this.strRole = strRole;\n this.strType = strType;\n this.strUnit = strUnit;\n this.name = name;\n this.parseFunction = parseFunction;\n this.minValue = minValue;\n this.maxValue = maxValue;\n }\n\n nSize: number;\n strIdentifer: string;\n bIsWritable: boolean;\n strRole: string;\n strType: ioBroker.CommonType;\n name: ioBroker.StringOrTranslated;\n\n parseFunction: ParseResult;\n\n strUnit: string | undefined;\n minValue?: number | undefined;\n maxValue?: number | undefined;\n}\n\nexport class OxxifyProtocol {\n public constructor() {\n // Packet start\n this.internalBuffer[0] = 0xfd;\n this.internalBuffer[1] = 0xfd;\n\n // Protocol type\n this.internalBuffer[2] = 0x02;\n\n // Fan Id size\n this.internalBuffer[3] = 0x10;\n\n this.nWriteIndex = 4;\n\n this.FillParameterDictionary();\n }\n\n public StartNewFrame(strFanId: string, strPassword: string): boolean {\n if (strFanId.length != 16) return false;\n\n if (strPassword.length <= 0) return false;\n\n // Reset the write index\n this.nWriteIndex = 4;\n\n // Fan id\n this.internalBuffer.write(strFanId, this.nWriteIndex);\n this.nWriteIndex += strFanId.length;\n\n // Size password\n this.internalBuffer[this.nWriteIndex] = strPassword.length;\n this.nWriteIndex++;\n\n // Password itself\n this.internalBuffer.write(strPassword, this.nWriteIndex);\n this.nWriteIndex += strPassword.length;\n\n this.eCurrentFunction = FunctionType.Undefined;\n this.bIsFirstFunction = true;\n\n return true;\n }\n\n public FinishFrame(): void {\n const checksum = this.CalculateChecksum(this.internalBuffer.subarray(2, this.nWriteIndex));\n\n this.internalBuffer[this.nWriteIndex] = checksum & 0xff;\n this.nWriteIndex++;\n\n this.internalBuffer[this.nWriteIndex] = checksum >> 8;\n this.nWriteIndex++;\n }\n\n //////////////////////////////////////////////////////////////////////////////////////////////\n\n public ReadFanState(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.FanState);\n }\n\n public WriteFanState(bEnabled: boolean): void {\n this.AddFunctionCode(FunctionType.WriteRead);\n const data = Buffer.alloc(1);\n\n if (bEnabled) data[0] = 1;\n else data[0] = 0;\n this.AddParameter(ParameterType.FanState, data);\n }\n\n public ReadFanSpeedMode(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.FanSpeedMode);\n }\n\n public WriteFanSpeedMode(nValue: number): void {\n this.AddFunctionCode(FunctionType.WriteRead);\n const data = Buffer.alloc(1);\n data[0] = nValue;\n console.log(\"Data in Buffer: \" + data[0]);\n this.AddParameter(ParameterType.FanSpeedMode, data);\n }\n\n public ReadBoostState(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.BoostState);\n }\n\n public ReadTimerModeValues(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.TimerMode);\n this.AddParameter(ParameterType.TimerCountdown);\n }\n\n public WriteTimerMode(nValue: number): void {\n this.AddFunctionCode(FunctionType.WriteRead);\n const data = Buffer.alloc(1);\n data[0] = nValue;\n this.AddParameter(ParameterType.TimerMode, data);\n }\n\n public ReadHumiditySensorState(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.StateHumiditySensor);\n }\n\n public WriteHumiditySensorState(bEnabled: boolean): void {\n this.AddFunctionCode(FunctionType.WriteRead);\n const data = Buffer.alloc(1);\n\n if (bEnabled) data[0] = 1;\n else data[0] = 0;\n this.AddParameter(ParameterType.StateHumiditySensor, data);\n }\n\n public ReadRelaisSensorState(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.StateRelaisSensor);\n }\n\n public WriteRelaisSensorState(bEnabled: boolean): void {\n this.AddFunctionCode(FunctionType.WriteRead);\n const data = Buffer.alloc(1);\n\n if (bEnabled) data[0] = 1;\n else data[0] = 0;\n this.AddParameter(ParameterType.StateRelaisSensor, data);\n }\n\n public ReadAnalogVoltageSensorState(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.StateAnalogVoltageSensor);\n }\n\n public WriteAnalogVoltageSensorState(bEnabled: boolean): void {\n this.AddFunctionCode(FunctionType.WriteRead);\n const data = Buffer.alloc(1);\n\n if (bEnabled) data[0] = 1;\n else data[0] = 0;\n this.AddParameter(ParameterType.StateAnalogVoltageSensor, data);\n }\n\n public ReadTargetHumidityValue(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.TargetHumidityValue);\n }\n\n public WriteTargetHumidityValue(nValue: number): void {\n this.AddFunctionCode(FunctionType.WriteRead);\n const data = Buffer.alloc(1);\n\n data[0] = nValue;\n this.AddParameter(ParameterType.TargetHumidityValue, data);\n }\n\n public ReadRtcBattery(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.RtcBatteryVoltage);\n }\n\n public ReadCurrentHumidity(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.CurrentHumidityValue);\n }\n\n public ReadCurrentAnalogVoltage(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.CurrentAnalogVoltageValue);\n }\n\n public ReadCurrentRelaisState(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.CurrentRelaisValue);\n }\n\n public ReadManualFanSpeed(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.ManualFanSpeed);\n }\n\n public WriteManualFanSpeed(nValue: number): void {\n this.AddFunctionCode(FunctionType.WriteRead);\n const data = Buffer.alloc(1);\n\n data[0] = nValue;\n this.AddParameter(ParameterType.ManualFanSpeed, data);\n }\n\n public ReadFan1Speed(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.FanSpeedFan1Rpm);\n }\n\n public ReadFan2Speed(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.FanSpeedFan2Rpm);\n }\n\n public ReadFilterExchangeCountdown(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.FilterExchangeCountdown);\n }\n\n public WriteResetFilterExchangeCountdown(): void {\n this.AddFunctionCode(FunctionType.WriteRead);\n const resetByte = Buffer.alloc(1);\n\n resetByte[0] = 0xff;\n this.AddParameter(ParameterType.ResetFilterExchangeCountdown, resetByte);\n }\n\n public ReadBoostModeFollowUpTime(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.BoostModeFollowUpTime);\n }\n\n public WriteBoostModeFollowUpTime(nValue: number): void {\n this.AddFunctionCode(FunctionType.WriteRead);\n const data = Buffer.alloc(1);\n\n data[0] = nValue;\n this.AddParameter(ParameterType.BoostModeFollowUpTime, data);\n }\n\n public ReadRtcDateTime(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.RtcTime);\n this.AddParameter(ParameterType.RtcDate);\n }\n\n public WriteRtcDateTime(dateTime: Date): boolean {\n // It does not immediately respond with the right data\n this.AddFunctionCode(FunctionType.WriteRead);\n\n const rtcTime = Buffer.alloc(3);\n rtcTime[0] = dateTime.getSeconds();\n rtcTime[1] = dateTime.getMinutes();\n rtcTime[2] = dateTime.getHours();\n\n const rtcDate = Buffer.alloc(4);\n rtcDate[0] = dateTime.getDate();\n rtcDate[1] = dateTime.getDay();\n rtcDate[2] = dateTime.getMonth() + 1;\n rtcDate[3] = dateTime.getFullYear() % 100;\n\n this.AddParameter(ParameterType.RtcTime, rtcTime);\n this.AddParameter(ParameterType.RtcDate, rtcDate);\n\n return true;\n }\n\n public ReadTimeControlledMode(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.TimeControlledMode);\n }\n\n public WriteTimeControlledMode(bEnabled: boolean): void {\n this.AddFunctionCode(FunctionType.WriteRead);\n const data = Buffer.alloc(1);\n\n if (bEnabled) data[0] = 1;\n else data[0] = 0;\n this.AddParameter(ParameterType.TimeControlledMode, data);\n }\n\n public ReadOperatingTime(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.OperatingTime);\n }\n\n public ReadAlarmState(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.AlarmState);\n }\n\n public WriteResetAlarmState(): void {\n this.AddFunctionCode(FunctionType.WriteRead);\n const resetAlarmByte = Buffer.alloc(1);\n\n resetAlarmByte[0] = 0xff;\n this.AddParameter(ParameterType.ResetAlarms, resetAlarmByte);\n }\n\n public ReadCloudServerEnabled(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.CloudServerEnabled);\n }\n\n public ReadFirmware(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.FirmwareVersionAndDate);\n }\n\n public ReadFilterExchangeNecessary(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.FilterExchangeNecessary);\n }\n\n public ReadWifiData(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.WifiOperatingMode);\n this.AddParameter(ParameterType.WifiName);\n this.AddParameter(ParameterType.WifiPassword);\n this.AddParameter(ParameterType.WifiEncryptionMode);\n this.AddParameter(ParameterType.WifiChannel);\n this.AddParameter(ParameterType.WifiIpMode);\n this.AddParameter(ParameterType.WifiIp);\n this.AddParameter(ParameterType.WifiSubnetMask);\n this.AddParameter(ParameterType.WifiGateway);\n this.AddParameter(ParameterType.CurrentWifiIp);\n }\n\n public ReadOperatingMode(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.FanOperatingMode);\n }\n\n public WriteOperatingMode(nValue: number): void {\n this.AddFunctionCode(FunctionType.WriteRead);\n const data = Buffer.alloc(1);\n\n data[0] = nValue;\n this.AddParameter(ParameterType.FanOperatingMode, data);\n }\n\n public ReadTargetAnalogVoltageValue(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.TargetAnalogVoltageValue);\n }\n\n public WriteTargetAnalogVoltageValue(nValue: number): void {\n this.AddFunctionCode(FunctionType.WriteRead);\n const data = Buffer.alloc(1);\n\n data[0] = nValue;\n this.AddParameter(ParameterType.TargetAnalogVoltageValue, data);\n }\n\n public ReadFanType(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.FanType);\n }\n\n //////////////////////////////////////////////////////////////////////////////////////////////\n\n public get ProtocolPacket(): Buffer {\n return Buffer.from(this.internalBuffer.subarray(0, this.nWriteIndex));\n }\n\n public ParseResponseData(dataBytes: Buffer): ParsedData {\n const status = this.CheckProtocol(dataBytes);\n const result = new ParsedData();\n\n if (dataBytes == undefined) {\n result.status = ParsingStatus.Undefined;\n return result;\n }\n\n if (status != ParsingStatus.Ok) {\n result.status = status;\n return result;\n }\n\n this.nReadIndex = 4;\n\n // Read the 16 digit fan id\n result.strFanId = dataBytes.subarray(this.nReadIndex, this.nReadIndex + 16).toString();\n\n // The fan id has a fied size\n this.nReadIndex += 16;\n\n // Increment by the size of the password\n this.nReadIndex += dataBytes.at(this.nReadIndex) ?? 0;\n\n // Go further to the function byte\n this.nReadIndex++;\n\n let bIsDataToRead = false;\n\n if (dataBytes.at(this.nReadIndex) == FunctionType.Response) {\n bIsDataToRead = true;\n }\n\n // Start after the function byte - this is not expected to be changed within one telegram\n this.nReadIndex++;\n\n if (bIsDataToRead) {\n while (this.nReadIndex < dataBytes.length - 2) {\n this.nReadIndex += this.ParseData(dataBytes.subarray(this.nReadIndex), result.receivedData);\n }\n\n return result;\n }\n\n result.status = ParsingStatus.Undefined;\n return result;\n }\n\n private ParseData(data: Buffer, receivedData: ReceivedData[]): number {\n let nIndex = 0;\n let nCurrentReadParameterSize = 1;\n\n switch (data.at(nIndex)) {\n case 0xfe:\n nIndex++;\n nCurrentReadParameterSize = data.at(nIndex) ?? 1;\n nIndex++;\n break;\n\n // Not supported low byte\n case 0xfd:\n nIndex++;\n // Index points here to the not supported low byte\n nIndex++;\n break;\n }\n\n const eParameter = data.at(nIndex) as ParameterType;\n nIndex++;\n\n if (this.parameterDictionary.has(eParameter)) {\n const fanData = this.parameterDictionary.get(eParameter);\n\n if (fanData != undefined) {\n const parsedData = new ReceivedData();\n parsedData.strIdentifer = fanData?.strIdentifer ?? \"UNDEFINED\";\n\n parsedData.value =\n fanData?.parseFunction(data.subarray(nIndex, nIndex + nCurrentReadParameterSize)) ?? null;\n\n receivedData.push(parsedData);\n }\n }\n\n const nReturnIndex = nIndex + nCurrentReadParameterSize;\n\n return nReturnIndex;\n }\n\n public get DataDictionary(): Map {\n return this.parameterDictionary;\n }\n\n //#region Protected data members\n\n internalBuffer: Buffer = Buffer.alloc(256);\n nWriteIndex: number = 0;\n nReadIndex: number = 0;\n\n bIsFirstFunction: boolean = false;\n eCurrentFunction: FunctionType = FunctionType.Undefined;\n\n // Dictionary with parameter low byte as key for the HighByte 0x00\n parameterDictionary: Map = new Map();\n\n //#endregion\n\n private CheckProtocol(dataBuffer: Buffer): ParsingStatus {\n if (dataBuffer.at(0) != 0xfd && dataBuffer.at(1) != 0xfd) {\n return ParsingStatus.WrongHeader;\n }\n\n if (dataBuffer.at(2) != 0x02) {\n return ParsingStatus.WrongVersion;\n }\n\n if (dataBuffer.at(3) != 0x10) {\n return ParsingStatus.WrongIdSize;\n }\n\n const nCalculatedChecksum = this.CalculateChecksum(dataBuffer.subarray(2, dataBuffer.length - 2));\n const nReceivedChecksum = dataBuffer[dataBuffer.length - 2] + (dataBuffer[dataBuffer.length - 1] << 8);\n\n if (nCalculatedChecksum != nReceivedChecksum) {\n return ParsingStatus.ChecksumError;\n }\n\n return ParsingStatus.Ok;\n }\n\n private AddFunctionCode(eNextFunction: FunctionType): void {\n if (this.bIsFirstFunction) {\n this.bIsFirstFunction = false;\n } else {\n if (eNextFunction == this.eCurrentFunction) {\n // Nothing to do if the function code is already the right one - only the parameter index needs to be added\n return;\n } else {\n this.internalBuffer[this.nWriteIndex] = 0xfc;\n this.nWriteIndex++;\n }\n }\n\n this.internalBuffer[this.nWriteIndex] = eNextFunction;\n this.nWriteIndex++;\n\n this.eCurrentFunction = eNextFunction;\n }\n\n /**\n * Adds an parameter for an read or an write request.\n * @param eParameter The predefined enum value for the parameter, which is also teh relevant low-byte of the adressed data.\n * @param bytes The bytes to write in a Write / WriteRead request. Null in case of an read request.\n * @returns True if successful, otherwise false.\n */\n private AddParameter(eParameter: ParameterType, bytes: Buffer | null = null): boolean {\n const parameterData = this.parameterDictionary.get(eParameter);\n\n // e.g. Variable parameter size\n if (parameterData == undefined) return false;\n\n if (parameterData.nSize != 1) {\n if (this.eCurrentFunction != FunctionType.Read) {\n // Special command to change the parameter sizce\n this.internalBuffer[this.nWriteIndex] = 0xfe;\n this.nWriteIndex++;\n\n // Add the new size\n this.internalBuffer[this.nWriteIndex] = parameterData.nSize;\n this.nWriteIndex++;\n }\n }\n\n this.internalBuffer[this.nWriteIndex] = eParameter as number;\n this.nWriteIndex++;\n\n if (this.eCurrentFunction == FunctionType.WriteRead) {\n if (bytes == null) return false;\n\n if (bytes.length == 1) this.internalBuffer.writeUint8(bytes.at(0) ?? 0, this.nWriteIndex);\n else this.internalBuffer.write(bytes.toString(), this.nWriteIndex);\n\n this.nWriteIndex += bytes.length;\n }\n\n return true;\n }\n\n private CalculateChecksum(bytes: Uint8Array): number {\n let checksum = 0;\n\n for (let i = 0; i < bytes.length; i++) {\n checksum += bytes[i];\n }\n\n return checksum & 0xffff;\n }\n\n private ParseFirmware(bytes: Buffer): ioBroker.StateValue {\n const nYear = (bytes.at(4) ?? 0) + ((bytes.at(5) ?? 0) << 8);\n return `v${bytes.at(0)}.${bytes.at(1)} - ${bytes.at(2)}.${bytes.at(3)}.${nYear}`;\n }\n\n private ParseBool(byte: Buffer): ioBroker.StateValue {\n switch (byte.at(0) ?? 255) {\n case 0:\n return false;\n case 1:\n return true;\n default:\n break;\n }\n\n return null;\n }\n\n private ParseByteNumber(byte: Buffer): ioBroker.StateValue {\n return byte.at(0) ?? null;\n }\n\n private ParseWordNumber(bytes: Buffer): ioBroker.StateValue {\n return (bytes.at(0) ?? 0) | ((bytes.at(1) ?? 0) << 8);\n }\n\n private ParseTimerMode(byte: Buffer): ioBroker.StateValue {\n switch (byte.at(0) ?? 255) {\n case 0:\n return \"0 - Off\";\n case 1:\n return \"1 - Night mode\";\n case 2:\n return \"2 - Party mode\";\n }\n return null;\n }\n\n private ParseFanSpeedMode(byte: Buffer): ioBroker.StateValue {\n switch (byte.at(0) ?? 255) {\n case 1:\n return \"1 - Ventilation level 1\";\n case 2:\n return \"2 - Ventilation level 2\";\n case 3:\n return \"3 - Ventilation level 3\";\n case 255:\n return \"255 - Manual ventilation level\";\n }\n return null;\n }\n\n private ParseTimeSmallToLarge(bytes: Buffer): ioBroker.StateValue {\n return `${bytes.at(2)?.toString().padStart(2, \"0\")}:${bytes.at(1)?.toString().padStart(2, \"0\")}:${bytes.at(0)?.toString().padStart(2, \"0\")}`;\n }\n\n private ParseRtcDate(bytes: Buffer): ioBroker.StateValue {\n return `${bytes.at(0)?.toString().padStart(2, \"0\")}.${bytes.at(2)?.toString().padStart(2, \"0\")}.${bytes.at(3)?.toString().padStart(2, \"0\")} (${bytes.at(1)} day of the week)`;\n }\n\n private ParseOperatingTime(bytes: Buffer): ioBroker.StateValue {\n return `${(bytes.at(2) ?? 0) | ((bytes.at(3) ?? 0) << 8)}:${bytes.at(1)?.toString().padStart(2, \"0\")}:${bytes.at(0)?.toString().padStart(2, \"0\")}`;\n }\n\n private ParseAlarmWarningState(byte: Buffer): ioBroker.StateValue {\n switch (byte.at(0) ?? 255) {\n case 0:\n return \"0 - Nothing\";\n case 1:\n return \"1 - Alarm (highest priority)\";\n case 2:\n return \"2 - Warning\";\n }\n return null;\n }\n\n private ParseWifiMode(byte: Buffer): ioBroker.StateValue {\n switch (byte.at(0) ?? 255) {\n case 1:\n return \"1 - Client\";\n case 2:\n return \"2 - Access Point\";\n }\n return null;\n }\n\n private ParseText(bytes: Buffer): ioBroker.StateValue {\n return bytes.toString();\n }\n\n private ParseWifiEncryptionMode(byte: Buffer): ioBroker.StateValue {\n switch (byte.at(0) ?? 255) {\n case 48:\n return \"48 - Open/not encrypted\";\n case 50:\n return \"50 - WPA PSK\";\n case 51:\n return \"51 - WPA2 PSK\";\n case 52:\n return \"52 - WPA/WPA2 PSK\";\n }\n return null;\n }\n\n private ParseWifiIpMode(byte: Buffer): ioBroker.StateValue {\n switch (byte.at(0) ?? 255) {\n case 0:\n return \"0 - Static IP\";\n case 1:\n return \"1 - DHCP\";\n }\n return null;\n }\n\n private ParseIpV4Value(bytes: Buffer): ioBroker.StateValue {\n return `${bytes.at(0)}.${bytes.at(1)}.${bytes.at(2)}.${bytes.at(3)}`;\n }\n\n private ParseOperatingMode(byte: Buffer): ioBroker.StateValue {\n switch (byte.at(0) ?? 255) {\n case 0:\n return \"0 - Ventilation\";\n case 1:\n return \"1 - Heat recovery\";\n case 2:\n return \"2 - Supply air\";\n }\n return null;\n }\n\n private ParseSystemType(bytes: Buffer): ioBroker.StateValue {\n switch (bytes.at(0) ?? 255) {\n case 0x0e:\n return \"14 - Oxxify.smart 50\";\n }\n return null;\n }\n\n private ParseNothing(byte: Buffer): ioBroker.StateValue {\n byte;\n return null;\n }\n\n private FillParameterDictionary(): void {\n this.parameterDictionary.set(\n ParameterType.FanState,\n new FanData(\n 1,\n \"fan.fanState\",\n true,\n \"switch\",\n \"boolean\",\n {\n en: \"Fan On/Off\",\n de: \"L\u00FCfter ein/aus\",\n ru: \"\u0412\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435/\u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0442\u043E\u0440\u0430\",\n pt: \"Ventilador ligado/desligado\",\n nl: \"Ventilator aan/uit\",\n fr: \"Ventilateur Marche/Arr\u00EAt\",\n it: \"Ventola accesa/spenta\",\n es: \"Ventilador On/Off\",\n pl: \"Wentylator w\u0142.\",\n uk: \"\u0423\u0432\u0456\u043C\u043A\u043D\u0435\u043D\u043D\u044F/\u0432\u0438\u043C\u043A\u043D\u0435\u043D\u043D\u044F \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0442\u043E\u0440\u0430\",\n \"zh-cn\": \"Fan On/Off\",\n },\n this.ParseBool,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.FanSpeedMode,\n new FanData(\n 1,\n \"fan.fanSpeedMode\",\n true,\n \"state\",\n \"string\",\n {\n en: \"Number of the ventilation level\",\n de: \"Nummer der L\u00FCftungsstufe\",\n ru: \"\u041D\u043E\u043C\u0435\u0440 \u0443\u0440\u043E\u0432\u043D\u044F \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0446\u0438\u0438\",\n pt: \"N\u00FAmero do n\u00EDvel de ventila\u00E7\u00E3o\",\n nl: \"Nummer van het ventilatieniveau\",\n fr: \"Num\u00E9ro du niveau de ventilation\",\n it: \"Numero del livello di ventilazione\",\n es: \"N\u00FAmero del nivel de ventilaci\u00F3n\",\n pl: \"Numer poziomu wentylacji\",\n uk: \"\u041D\u043E\u043C\u0435\u0440 \u0440\u0456\u0432\u043D\u044F \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0446\u0456\u0457\",\n \"zh-cn\": \"Number of the ventilation level\",\n },\n this.ParseFanSpeedMode,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.BoostState,\n new FanData(\n 1,\n \"fan.boostState\",\n false,\n \"switch\",\n \"boolean\",\n {\n en: \"Boost operating status on/off\",\n de: \"Boost-Betriebszustand ein/aus\",\n ru: \"\u0412\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435/\u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u0440\u0435\u0436\u0438\u043C\u0430 \u0440\u0430\u0431\u043E\u0442\u044B \u0431\u0443\u0441\u0442\u0430\",\n pt: \"Estado de funcionamento do Boost ligado/desligado\",\n nl: \"Bedrijfsstatus boost aan/uit\",\n fr: \"Activation/d\u00E9sactivation de l'\u00E9tat de fonctionnement de l'amplificateur\",\n it: \"Stato di funzionamento del boost on/off\",\n es: \"Estado de funcionamiento del Boost on/off\",\n pl: \"W\u0142\u0105czanie/wy\u0142\u0105czanie stanu pracy funkcji Boost\",\n uk: \"\u0423\u0432\u0456\u043C\u043A\u043D\u0435\u043D\u043D\u044F/\u0432\u0438\u043C\u043A\u043D\u0435\u043D\u043D\u044F \u0440\u043E\u0431\u043E\u0447\u043E\u0433\u043E \u0441\u0442\u0430\u043D\u0443 \u043F\u0456\u0434\u0441\u0438\u043B\u044E\u0432\u0430\u0447\u0430\",\n \"zh-cn\": \"Boost operating status on/off\",\n },\n this.ParseBool,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.TimerMode,\n new FanData(\n 1,\n \"fan.timerMode\",\n true,\n \"state\",\n \"mixed\",\n {\n en: \"Timer mode\",\n de: \"Timer-Modus\",\n ru: \"\u0420\u0435\u0436\u0438\u043C \u0442\u0430\u0439\u043C\u0435\u0440\u0430\",\n pt: \"Modo de temporizador\",\n nl: \"Timermodus\",\n fr: \"Mode minuterie\",\n it: \"Modalit\u00E0 timer\",\n es: \"Modo temporizador\",\n pl: \"Tryb timera\",\n uk: \"\u0420\u0435\u0436\u0438\u043C \u0442\u0430\u0439\u043C\u0435\u0440\u0430\",\n \"zh-cn\": \"Timer mode\",\n },\n this.ParseTimerMode,\n \"\",\n 0,\n 2,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.TimerCountdown,\n new FanData(\n 3,\n \"fan.timerCountDown\",\n false,\n \"value.time\",\n \"string\",\n {\n en: \"Current countdown of the timer operation\",\n de: \"Aktueller Countdown des Timerbetriebs\",\n ru: \"\u0422\u0435\u043A\u0443\u0449\u0438\u0439 \u043E\u0442\u0441\u0447\u0435\u0442 \u0432\u0440\u0435\u043C\u0435\u043D\u0438 \u0440\u0430\u0431\u043E\u0442\u044B \u0442\u0430\u0439\u043C\u0435\u0440\u0430\",\n pt: \"Contagem decrescente atual da opera\u00E7\u00E3o do temporizador\",\n nl: \"Huidig aftellen van de timer\",\n fr: \"Compte \u00E0 rebours actuel de l'op\u00E9ration de minuterie\",\n it: \"Conto alla rovescia corrente del funzionamento del timer\",\n es: \"Cuenta atr\u00E1s actual de la operaci\u00F3n del temporizador\",\n pl: \"Bie\u017C\u0105ce odliczanie operacji timera\",\n uk: \"\u041F\u043E\u0442\u043E\u0447\u043D\u0438\u0439 \u0432\u0456\u0434\u043B\u0456\u043A \u0440\u043E\u0431\u043E\u0442\u0438 \u0442\u0430\u0439\u043C\u0435\u0440\u0430\",\n \"zh-cn\": \"Current countdown of the timer operation\",\n },\n this.ParseTimeSmallToLarge,\n \"hh:mm:ss\",\n ),\n );\n this.parameterDictionary.set(\n ParameterType.StateHumiditySensor,\n new FanData(\n 1,\n \"sensors.stateHumiditySensor\",\n true,\n \"switch\",\n \"boolean\",\n {\n en: \"Status of the humidity sensor on/off\",\n de: \"Status des Feuchtigkeitssensors ein/aus\",\n ru: \"\u0421\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435 \u0434\u0430\u0442\u0447\u0438\u043A\u0430 \u0432\u043B\u0430\u0436\u043D\u043E\u0441\u0442\u0438 \u0432\u043A\u043B/\u0432\u044B\u043A\u043B\",\n pt: \"Estado do sensor de humidade ligado/desligado\",\n nl: \"Status van de vochtigheidssensor aan/uit\",\n fr: \"\u00C9tat du capteur d'humidit\u00E9 activ\u00E9/d\u00E9sactiv\u00E9\",\n it: \"Stato del sensore di umidit\u00E0 on/off\",\n es: \"Estado del sensor de humedad on/off\",\n pl: \"Stan w\u0142\u0105czenia/wy\u0142\u0105czenia czujnika wilgotno\u015Bci\",\n uk: \"\u0421\u0442\u0430\u043D \u0443\u0432\u0456\u043C\u043A\u043D\u0435\u043D\u043D\u044F/\u0432\u0438\u043C\u043A\u043D\u0435\u043D\u043D\u044F \u0434\u0430\u0442\u0447\u0438\u043A\u0430 \u0432\u043E\u043B\u043E\u0433\u043E\u0441\u0442\u0456\",\n \"zh-cn\": \"Status of the humidity sensor on/off\",\n },\n this.ParseBool,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.StateRelaisSensor,\n new FanData(\n 1,\n \"sensors.stateRelaisSensor\",\n true,\n \"switch\",\n \"boolean\",\n {\n en: \"Status of the relay sensor on/off\",\n de: \"Status des Relaissensors ein/aus\",\n ru: \"\u0421\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435 \u0434\u0430\u0442\u0447\u0438\u043A\u0430 \u0440\u0435\u043B\u0435 \u0432\u043A\u043B/\u0432\u044B\u043A\u043B\",\n pt: \"Estado do sensor de rel\u00E9 ligado/desligado\",\n nl: \"Status van de relaissensor aan/uit\",\n fr: \"\u00C9tat du capteur de relais activ\u00E9/d\u00E9sactiv\u00E9\",\n it: \"Stato del sensore a rel\u00E8 on/off\",\n es: \"Estado del rel\u00E9 sensor on/off\",\n pl: \"Stan w\u0142\u0105czonego/wy\u0142\u0105czonego czujnika przeka\u017Anika\",\n uk: \"\u0421\u0442\u0430\u043D \u0443\u0432\u0456\u043C\u043A\u043D\u0435\u043D\u043E\u0433\u043E/\u0432\u0438\u043C\u043A\u043D\u0435\u043D\u043E\u0433\u043E \u0440\u0435\u043B\u0435\u0439\u043D\u043E\u0433\u043E \u0434\u0430\u0442\u0447\u0438\u043A\u0430\",\n \"zh-cn\": \"Status of the relay sensor on/off\",\n },\n this.ParseBool,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.StateAnalogVoltageSensor,\n new FanData(\n 1,\n \"sensors.stateAnalogVoltageSensor\",\n true,\n \"switch\",\n \"boolean\",\n {\n en: \"Status of the analog voltage sensor on/off\",\n de: \"Status des analogen Spannungssensors ein/aus\",\n ru: \"\u0421\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435 \u0430\u043D\u0430\u043B\u043E\u0433\u043E\u0432\u043E\u0433\u043E \u0434\u0430\u0442\u0447\u0438\u043A\u0430 \u043D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u044F \u0432\u043A\u043B/\u0432\u044B\u043A\u043B\",\n pt: \"Estado do sensor de tens\u00E3o anal\u00F3gico ligado/desligado\",\n nl: \"Status van de analoge spanningssensor aan/uit\",\n fr: \"\u00C9tat du capteur de tension analogique activ\u00E9/d\u00E9sactiv\u00E9\",\n it: \"Stato del sensore di tensione analogico on/off\",\n es: \"Estado del sensor anal\u00F3gico de tensi\u00F3n on/off\",\n pl: \"Stan w\u0142\u0105czenia/wy\u0142\u0105czenia analogowego czujnika napi\u0119cia\",\n uk: \"\u0421\u0442\u0430\u043D \u0443\u0432\u0456\u043C\u043A\u043D\u0435\u043D\u043D\u044F/\u0432\u0438\u043C\u043A\u043D\u0435\u043D\u043D\u044F \u0430\u043D\u0430\u043B\u043E\u0433\u043E\u0432\u043E\u0433\u043E \u0434\u0430\u0442\u0447\u0438\u043A\u0430 \u043D\u0430\u043F\u0440\u0443\u0433\u0438\",\n \"zh-cn\": \"Status of the analog voltage sensor on/off\",\n },\n this.ParseBool,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.TargetHumidityValue,\n new FanData(\n 1,\n \"sensors.targetHumidityValue\",\n true,\n \"level.humidity\",\n \"number\",\n {\n en: \"Humidity setpoint\",\n de: \"Sollwert der Luftfeuchtigkeit\",\n ru: \"\u0423\u0441\u0442\u0430\u0432\u043A\u0430 \u0432\u043B\u0430\u0436\u043D\u043E\u0441\u0442\u0438\",\n pt: \"Ponto de regula\u00E7\u00E3o da humidade\",\n nl: \"Vochtigheid instelpunt\",\n fr: \"Consigne d'humidit\u00E9\",\n it: \"Setpoint di umidit\u00E0\",\n es: \"Consigna de humedad\",\n pl: \"Warto\u015B\u0107 zadana wilgotno\u015Bci\",\n uk: \"\u0423\u0441\u0442\u0430\u0432\u043A\u0430 \u0432\u043E\u043B\u043E\u0433\u043E\u0441\u0442\u0456\",\n \"zh-cn\": \"Humidity setpoint\",\n },\n this.ParseByteNumber,\n \"%\",\n 40,\n 80,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.RtcBatteryVoltage,\n new FanData(\n 2,\n \"system.rtcBatteryVoltage\",\n false,\n \"level.battery\",\n \"number\",\n {\n en: \"Current RTC battery voltage\",\n de: \"Aktuelle RTC-Batteriespannung\",\n ru: \"\u0422\u0435\u043A\u0443\u0449\u0435\u0435 \u043D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u0435 \u0431\u0430\u0442\u0430\u0440\u0435\u0438 RTC\",\n pt: \"Tens\u00E3o atual da bateria RTC\",\n nl: \"Huidige RTC-batterijspanning\",\n fr: \"Tension actuelle de la pile RTC\",\n it: \"Tensione attuale della batteria RTC\",\n es: \"Tensi\u00F3n actual de la bater\u00EDa del RTC\",\n pl: \"Bie\u017C\u0105ce napi\u0119cie akumulatora RTC\",\n uk: \"\u041F\u043E\u0442\u043E\u0447\u043D\u0430 \u043D\u0430\u043F\u0440\u0443\u0433\u0430 \u0431\u0430\u0442\u0430\u0440\u0435\u0457 RTC\",\n \"zh-cn\": \"Current RTC battery voltage\",\n },\n this.ParseWordNumber,\n \"mV\",\n 0,\n 5000,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.CurrentHumidityValue,\n new FanData(\n 1,\n \"sensors.currentHumidityValue\",\n false,\n \"value.humidity\",\n \"number\",\n {\n en: \"Current humidity value\",\n de: \"Aktueller Feuchtigkeitswert\",\n ru: \"\u0422\u0435\u043A\u0443\u0449\u0435\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u0432\u043B\u0430\u0436\u043D\u043E\u0441\u0442\u0438\",\n pt: \"Valor atual da humidade\",\n nl: \"Huidige vochtigheidswaarde\",\n fr: \"Valeur actuelle de l'humidit\u00E9\",\n it: \"Valore attuale dell'umidit\u00E0\",\n es: \"Valor actual de humedad\",\n pl: \"Bie\u017C\u0105ca warto\u015B\u0107 wilgotno\u015Bci\",\n uk: \"\u041F\u043E\u0442\u043E\u0447\u043D\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F \u0432\u043E\u043B\u043E\u0433\u043E\u0441\u0442\u0456\",\n \"zh-cn\": \"Current humidity value\",\n },\n this.ParseByteNumber,\n \"%\",\n 0,\n 100,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.CurrentAnalogVoltageValue,\n new FanData(\n 1,\n \"sensors.currentAnalogVoltageValue\",\n false,\n \"value.voltage\",\n \"number\",\n {\n en: \"Current analog voltage value\",\n de: \"Aktueller analoger Spannungswert\",\n ru: \"\u0422\u0435\u043A\u0443\u0449\u0435\u0435 \u0430\u043D\u0430\u043B\u043E\u0433\u043E\u0432\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u043D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u044F\",\n pt: \"Valor atual da tens\u00E3o anal\u00F3gica\",\n nl: \"Huidige analoge spanningswaarde\",\n fr: \"Valeur de la tension analogique actuelle\",\n it: \"Valore attuale della tensione analogica\",\n es: \"Valor de tensi\u00F3n anal\u00F3gica actual\",\n pl: \"Bie\u017C\u0105ca warto\u015B\u0107 napi\u0119cia analogowego\",\n uk: \"\u041F\u043E\u0442\u043E\u0447\u043D\u0435 \u0430\u043D\u0430\u043B\u043E\u0433\u043E\u0432\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F \u043D\u0430\u043F\u0440\u0443\u0433\u0438\",\n \"zh-cn\": \"Current analog voltage value\",\n },\n this.ParseByteNumber,\n \"%\",\n 0,\n 100,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.CurrentRelaisValue,\n new FanData(\n 1,\n \"sensors.currentRelaisValue\",\n false,\n \"sensor\",\n \"boolean\",\n {\n en: \"Current value of the relay sensor\",\n de: \"Aktueller Wert des Relaissensors\",\n ru: \"\u0422\u0435\u043A\u0443\u0449\u0435\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u0434\u0430\u0442\u0447\u0438\u043A\u0430 \u0440\u0435\u043B\u0435\",\n pt: \"Valor atual do sensor do rel\u00E9\",\n nl: \"Huidige waarde van de relaissensor\",\n fr: \"Valeur actuelle du capteur relais\",\n it: \"Valore attuale del sensore a rel\u00E8\",\n es: \"Valor actual del sensor del rel\u00E9\",\n pl: \"Bie\u017C\u0105ca warto\u015B\u0107 czujnika przeka\u017Anika\",\n uk: \"\u041F\u043E\u0442\u043E\u0447\u043D\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F \u0434\u0430\u0442\u0447\u0438\u043A\u0430 \u0440\u0435\u043B\u0435\",\n \"zh-cn\": \"Current value of the relay sensor\",\n },\n this.ParseBool,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.ManualFanSpeed,\n new FanData(\n 1,\n \"fan.manualFanSpeed\",\n true,\n \"state\",\n \"number\",\n {\n en: \"Ventilation level of the fan in operation of the manual setting\",\n de: \"L\u00FCftungsstufe des Gebl\u00E4ses im Betrieb der manuellen Einstellung\",\n ru: \"\u0423\u0440\u043E\u0432\u0435\u043D\u044C \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0446\u0438\u0438 \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0442\u043E\u0440\u0430 \u0432 \u0440\u0435\u0436\u0438\u043C\u0435 \u0440\u0443\u0447\u043D\u043E\u0439 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438\",\n pt: \"N\u00EDvel de ventila\u00E7\u00E3o do ventilador em funcionamento da regula\u00E7\u00E3o manual\",\n nl: \"Ventilatieniveau van de ventilator bij gebruik van de handmatige instelling\",\n fr: \"Niveau de ventilation du ventilateur en mode manuel\",\n it: \"Livello di ventilazione del ventilatore in funzione dell'impostazione manuale\",\n es: \"Nivel de ventilaci\u00F3n del ventilador en funcionamiento de ajuste manual\",\n pl: \"Poziom wentylacji wentylatora w trybie r\u0119cznym\",\n uk: \"\u0420\u0456\u0432\u0435\u043D\u044C \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0446\u0456\u0457 \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0442\u043E\u0440\u0430 \u0432 \u0440\u0435\u0436\u0438\u043C\u0456 \u0440\u0443\u0447\u043D\u043E\u0433\u043E \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F\",\n \"zh-cn\": \"Ventilation level of the fan in operation of the manual setting\",\n },\n this.ParseByteNumber,\n \"\",\n 0,\n 255,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.FanSpeedFan1Rpm,\n new FanData(\n 2,\n \"fan.fanSpeedFan1Rpm\",\n false,\n \"state\",\n \"number\",\n {\n en: \"Ventilation level of fan no. 1\",\n de: \"L\u00FCftungsstufe des Ventilators Nr. 1\",\n ru: \"\u0423\u0440\u043E\u0432\u0435\u043D\u044C \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0446\u0438\u0438 \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0442\u043E\u0440\u0430 \u2116 1\",\n pt: \"N\u00EDvel de ventila\u00E7\u00E3o do ventilador n.\u00BA 1\",\n nl: \"Ventilatieniveau van ventilator nr. 1\",\n fr: \"Niveau de ventilation du ventilateur n\u00B0 1\",\n it: \"Livello di ventilazione del ventilatore n. 1\",\n es: \"Nivel de ventilaci\u00F3n del ventilador n\u00BA 1\",\n pl: \"Poziom wentylacji wentylatora nr 1\",\n uk: \"\u0420\u0456\u0432\u0435\u043D\u044C \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0446\u0456\u0457 \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0442\u043E\u0440\u0430 \u2116 1\",\n \"zh-cn\": \"Ventilation level of fan no. 1\",\n },\n this.ParseWordNumber,\n \"rpm\",\n ),\n );\n this.parameterDictionary.set(\n ParameterType.FanSpeedFan2Rpm,\n new FanData(\n 2,\n \"fan.fanSpeedFan2Rpm\",\n false,\n \"state\",\n \"number\",\n {\n en: \"Ventilation level of fan no. 2\",\n de: \"L\u00FCftungsstufe des Ventilators Nr. 2\",\n ru: \"\u0423\u0440\u043E\u0432\u0435\u043D\u044C \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0446\u0438\u0438 \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0442\u043E\u0440\u0430 \u2116 2\",\n pt: \"N\u00EDvel de ventila\u00E7\u00E3o do ventilador n.\u00BA 2\",\n nl: \"Ventilatieniveau van ventilator nr. 2\",\n fr: \"Niveau de ventilation du ventilateur n\u00B0 2\",\n it: \"Livello di ventilazione del ventilatore n. 2\",\n es: \"Nivel de ventilaci\u00F3n del ventilador n\u00BA 2\",\n pl: \"Poziom wentylacji wentylatora nr 2\",\n uk: \"\u0420\u0456\u0432\u0435\u043D\u044C \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0446\u0456\u0457 \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0442\u043E\u0440\u0430 \u2116 2\",\n \"zh-cn\": \"Ventilation level of fan no. 2\",\n },\n this.ParseWordNumber,\n \"rpm\",\n ),\n );\n this.parameterDictionary.set(\n ParameterType.FilterExchangeCountdown,\n new FanData(\n 3,\n \"fan.filterExchangeCountdown\",\n false,\n \"state\",\n \"string\",\n {\n en: \"Countdown of the timer until filter change\",\n de: \"Countdown des Timers bis zum Filterwechsel\",\n ru: \"\u041E\u0442\u0441\u0447\u0435\u0442 \u0442\u0430\u0439\u043C\u0435\u0440\u0430 \u0434\u043E \u0437\u0430\u043C\u0435\u043D\u044B \u0444\u0438\u043B\u044C\u0442\u0440\u0430\",\n pt: \"Contagem decrescente do temporizador at\u00E9 \u00E0 mudan\u00E7a do filtro\",\n nl: \"Aftellen van de timer tot filtervervanging\",\n fr: \"Compte \u00E0 rebours jusqu'au remplacement du filtre\",\n it: \"Conto alla rovescia del timer fino alla sostituzione del filtro\",\n es: \"Cuenta atr\u00E1s del temporizador hasta el cambio de filtro\",\n pl: \"Odliczanie czasu do wymiany filtra\",\n uk: \"\u0412\u0456\u0434\u043B\u0456\u043A \u0442\u0430\u0439\u043C\u0435\u0440\u0430 \u0434\u043E \u0437\u0430\u043C\u0456\u043D\u0438 \u0444\u0456\u043B\u044C\u0442\u0440\u0430\",\n \"zh-cn\": \"Countdown of the timer until filter change\",\n },\n this.ParseTimeSmallToLarge,\n \"dd:hh:mm\",\n ),\n );\n this.parameterDictionary.set(\n ParameterType.ResetFilterExchangeCountdown,\n new FanData(\n 1,\n \"fan.resetFilterExchangeCountdown\",\n true,\n \"button\",\n \"boolean\",\n {\n en: \"Reset the timer countdown to the filter change\",\n de: \"Zur\u00FCcksetzen des Timer-Countdowns f\u00FCr den Filterwechsel\",\n ru: \"\u0421\u0431\u0440\u043E\u0441\u044C\u0442\u0435 \u0442\u0430\u0439\u043C\u0435\u0440, \u043E\u0442\u0441\u0447\u0438\u0442\u044B\u0432\u0430\u044E\u0449\u0438\u0439 \u0432\u0440\u0435\u043C\u044F \u0434\u043E \u0437\u0430\u043C\u0435\u043D\u044B \u0444\u0438\u043B\u044C\u0442\u0440\u0430\",\n pt: \"Reiniciar a contagem decrescente do temporizador para a mudan\u00E7a do filtro\",\n nl: \"De timer voor het aftellen van de filtervervanging resetten\",\n fr: \"R\u00E9initialiser le compte \u00E0 rebours de la minuterie pour le remplacement du filtre\",\n it: \"Azzerare il conto alla rovescia del timer per la sostituzione del filtro\",\n es: \"Reinicia la cuenta atr\u00E1s del temporizador para el cambio de filtro\",\n pl: \"Zresetuj licznik odliczaj\u0105cy czas do wymiany filtra\",\n uk: \"\u0421\u043A\u0438\u043D\u0443\u0442\u0438 \u0432\u0456\u0434\u043B\u0456\u043A \u0442\u0430\u0439\u043C\u0435\u0440\u0430 \u0434\u043E \u0437\u0430\u043C\u0456\u043D\u0438 \u0444\u0456\u043B\u044C\u0442\u0440\u0430\",\n \"zh-cn\": \"Reset the timer countdown to the filter change\",\n },\n this.ParseNothing,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.BoostModeFollowUpTime,\n new FanData(\n 1,\n \"fan.boostModeFollowUpTime\",\n true,\n \"state\",\n \"number\",\n {\n en: \"Setpoint of the run-on time for boost mode\",\n de: \"Sollwert der Nachlaufzeit f\u00FCr den Boostbetrieb\",\n ru: \"\u0423\u0441\u0442\u0430\u0432\u043A\u0430 \u0432\u0440\u0435\u043C\u0435\u043D\u0438 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F \u0434\u043B\u044F \u0440\u0435\u0436\u0438\u043C\u0430 \u0444\u043E\u0440\u0441\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F\",\n pt: \"Ponto de regula\u00E7\u00E3o do tempo de arranque para o modo de impulso\",\n nl: \"Instelpunt van de aanlooptijd voor boostmodus\",\n fr: \"Point de consigne de la dur\u00E9e de fonctionnement en mode boost\",\n it: \"Setpoint del tempo di funzionamento in modalit\u00E0 boost\",\n es: \"Consigna del tiempo de marcha en inercia para el modo boost\",\n pl: \"Warto\u015B\u0107 zadana czasu rozruchu dla trybu do\u0142adowania\",\n uk: \"\u0423\u0441\u0442\u0430\u0432\u043A\u0430 \u0447\u0430\u0441\u0443 \u0432\u0438\u0431\u0456\u0433\u0443 \u0434\u043B\u044F \u0440\u0435\u0436\u0438\u043C\u0443 \u043F\u0440\u0438\u0441\u043A\u043E\u0440\u0435\u043D\u043D\u044F\",\n \"zh-cn\": \"Setpoint of the run-on time for boost mode\",\n },\n this.ParseByteNumber,\n \"min\",\n 0,\n 60,\n ),\n );\n\n ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n this.parameterDictionary.set(\n ParameterType.TriggerTimeSync,\n new FanData(\n 0,\n \"system.triggerRtcTimeSync\",\n true,\n \"button\",\n \"boolean\",\n {\n en: \"Synchronize time\",\n de: \"Zeit synchronisieren\",\n ru: \"\u0421\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0430\u0446\u0438\u044F \u0432\u0440\u0435\u043C\u0435\u043D\u0438\",\n pt: \"Sincronizar a hora\",\n nl: \"Tijd synchroniseren\",\n fr: \"Synchroniser l'heure\",\n it: \"Sincronizzare l'ora\",\n es: \"Sincronizar la hora\",\n pl: \"Synchronizacja czasu\",\n uk: \"\u0421\u0438\u043D\u0445\u0440\u043E\u043D\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0447\u0430\u0441\",\n \"zh-cn\": \"Synchronize time\",\n },\n this.ParseNothing,\n ),\n );\n\n this.parameterDictionary.set(\n ParameterType.RtcTime,\n new FanData(\n 3,\n \"system.rtcTime\",\n false,\n \"value.time\",\n \"string\",\n {\n en: \"RTC time\",\n de: \"RTC-Zeit\",\n ru: \"\u0412\u0440\u0435\u043C\u044F \u0420\u0422\u041A\",\n pt: \"Tempo RTC\",\n nl: \"RTC-tijd\",\n fr: \"Temps RTC\",\n it: \"Tempo RTC\",\n es: \"Hora RTC\",\n pl: \"Czas RTC\",\n uk: \"\u0427\u0430\u0441 \u0437\u0430 \u043A\u0438\u0457\u0432\u0441\u044C\u043A\u0438\u043C \u0447\u0430\u0441\u043E\u043C\",\n \"zh-cn\": \"RTC time\",\n },\n this.ParseTimeSmallToLarge,\n \"hh:mm:ss\",\n ),\n );\n this.parameterDictionary.set(\n ParameterType.RtcDate,\n new FanData(\n 4,\n \"system.rtcCalendar\",\n false,\n \"value.date\",\n \"string\",\n {\n en: \"RTC calendar\",\n de: \"RTC-Kalender\",\n ru: \"\u041A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u044C \u0420\u0422\u041A\",\n pt: \"Calend\u00E1rio RTC\",\n nl: \"RTC-kalender\",\n fr: \"Calendrier RTC\",\n it: \"Calendario RTC\",\n es: \"Calendario RTC\",\n pl: \"Kalendarz RTC\",\n uk: \"\u041A\u0430\u043B\u0435\u043D\u0434\u0430\u0440 RTC\",\n \"zh-cn\": \"RTC calendar\",\n },\n this.ParseRtcDate,\n \"dd.mm.yy\",\n ),\n );\n this.parameterDictionary.set(\n ParameterType.TimeControlledMode,\n new FanData(\n 1,\n \"fan.timeControlledMode\",\n true,\n \"switch\",\n \"boolean\",\n {\n en: \"Time-controlled operation\",\n de: \"Zeitgesteuerter Betrieb\",\n ru: \"\u0420\u0430\u0431\u043E\u0442\u0430 \u0441 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u0435\u043C \u0432\u0440\u0435\u043C\u0435\u043D\u0438\",\n pt: \"Funcionamento com controlo de tempo\",\n nl: \"Tijdgestuurde werking\",\n fr: \"Fonctionnement \u00E0 temps contr\u00F4l\u00E9\",\n it: \"Funzionamento a tempo\",\n es: \"Funcionamiento temporizado\",\n pl: \"Dzia\u0142anie sterowane czasem\",\n uk: \"\u0420\u0435\u0433\u0443\u043B\u044C\u043E\u0432\u0430\u043D\u0430 \u0437\u0430 \u0447\u0430\u0441\u043E\u043C \u0440\u043E\u0431\u043E\u0442\u0430\",\n \"zh-cn\": \"Time-controlled operation\",\n },\n this.ParseBool,\n ),\n );\n\n // this.parameterDictionary.set(ParameterType.TimeControlSchedule, 6);\n // this.parameterDictionary.set(ParameterType.SearchFanId, 16);\n // this.parameterDictionary.set(ParameterType.FanPassword, -1);\n\n this.parameterDictionary.set(\n ParameterType.OperatingTime,\n new FanData(\n 4,\n \"system.operatingTime\",\n false,\n \"state\",\n \"string\",\n {\n en: \"Operating hours\",\n de: \"Betriebsstunden\",\n ru: \"\u0427\u0430\u0441\u044B \u0440\u0430\u0431\u043E\u0442\u044B\",\n pt: \"Horas de funcionamento\",\n nl: \"Bedrijfsuren\",\n fr: \"Heures de fonctionnement\",\n it: \"Orario di funzionamento\",\n es: \"Horas de funcionamiento\",\n pl: \"Godziny pracy\",\n uk: \"\u0413\u043E\u0434\u0438\u043D\u0438 \u0440\u043E\u0431\u043E\u0442\u0438\",\n \"zh-cn\": \"Operating hours\",\n },\n this.ParseOperatingTime,\n \"ddddd:hh:mm\",\n ),\n );\n this.parameterDictionary.set(\n ParameterType.ResetAlarms,\n new FanData(\n 1,\n \"system.resetAlarms\",\n true,\n \"button\",\n \"boolean\",\n {\n en: \"Reset alarms\",\n de: \"Alarme zur\u00FCcksetzen\",\n ru: \"\u0421\u0431\u0440\u043E\u0441 \u0441\u0438\u0433\u043D\u0430\u043B\u043E\u0432 \u0442\u0440\u0435\u0432\u043E\u0433\u0438\",\n pt: \"Repor alarmes\",\n nl: \"Reset alarmen\",\n fr: \"R\u00E9initialisation des alarmes\",\n it: \"Ripristino degli allarmi\",\n es: \"Restablecer alarmas\",\n pl: \"Resetowanie alarm\u00F3w\",\n uk: \"\u0421\u043A\u0438\u0434\u0430\u043D\u043D\u044F \u0442\u0440\u0438\u0432\u043E\u0433\",\n \"zh-cn\": \"Reset alarms\",\n },\n this.ParseNothing,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.AlarmState,\n new FanData(\n 1,\n \"system.alarmState\",\n false,\n \"switch\",\n \"string\",\n {\n en: \"Alarm/warning display\",\n de: \"Alarm-/Warnungsanzeige\",\n ru: \"\u0418\u043D\u0434\u0438\u043A\u0430\u0446\u0438\u044F \u0441\u0438\u0433\u043D\u0430\u043B\u043E\u0432 \u0442\u0440\u0435\u0432\u043E\u0433\u0438/\u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0439\",\n pt: \"Indica\u00E7\u00E3o de alarme/aviso\",\n nl: \"Weergave alarm/waarschuwing\",\n fr: \"Affichage des alarmes et avertissements\",\n it: \"Display di allarme/avviso\",\n es: \"Indicaci\u00F3n de alarma/aviso\",\n pl: \"Wy\u015Bwietlacz alarmu/ostrze\u017Cenia\",\n uk: \"\u0406\u043D\u0434\u0438\u043A\u0430\u0446\u0456\u044F \u0442\u0440\u0438\u0432\u043E\u0433\u0438/\u043F\u043E\u043F\u0435\u0440\u0435\u0434\u0436\u0435\u043D\u043D\u044F\",\n \"zh-cn\": \"Alarm/warning display\",\n },\n this.ParseAlarmWarningState,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.CloudServerEnabled,\n new FanData(\n 1,\n \"network.cloudServerEnabled\",\n false,\n \"switch\",\n \"boolean\",\n {\n en: \"Approval of operation via cloud server\",\n de: \"Freigabe des Betriebs \u00FCber Cloud-Server\",\n ru: \"\u0423\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u0435 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0439 \u0447\u0435\u0440\u0435\u0437 \u043E\u0431\u043B\u0430\u0447\u043D\u044B\u0439 \u0441\u0435\u0440\u0432\u0435\u0440\",\n pt: \"Aprova\u00E7\u00E3o da opera\u00E7\u00E3o atrav\u00E9s do servidor em nuvem\",\n nl: \"Goedkeuring van werking via cloudserver\",\n fr: \"Approbation de l'op\u00E9ration via un serveur en nuage\",\n it: \"Approvazione del funzionamento tramite server cloud\",\n es: \"Aprobaci\u00F3n del funcionamiento a trav\u00E9s del servidor en nube\",\n pl: \"Zatwierdzanie operacji za po\u015Brednictwem serwera w chmurze\",\n uk: \"\u0417\u0430\u0442\u0432\u0435\u0440\u0434\u0436\u0435\u043D\u043D\u044F \u0440\u043E\u0431\u043E\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 \u0445\u043C\u0430\u0440\u043D\u0438\u0439 \u0441\u0435\u0440\u0432\u0435\u0440\",\n \"zh-cn\": \"Approval of operation via cloud server\",\n },\n this.ParseBool,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.FirmwareVersionAndDate,\n new FanData(\n 6,\n \"system.firmwareVersionAndDate\",\n false,\n \"info.firmware\",\n \"string\",\n {\n en: \"Firmware version and date of the control unit\",\n de: \"Firmware-Version und Datum des Steuerger\u00E4ts\",\n ru: \"\u0412\u0435\u0440\u0441\u0438\u044F \u0438 \u0434\u0430\u0442\u0430 \u043F\u0440\u043E\u0448\u0438\u0432\u043A\u0438 \u0431\u043B\u043E\u043A\u0430 \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F\",\n pt: \"Vers\u00E3o e data do firmware da unidade de controlo\",\n nl: \"Firmwareversie en -datum van de besturingseenheid\",\n fr: \"Version et date du micrologiciel de l'unit\u00E9 de contr\u00F4le\",\n it: \"Versione e data del firmware della centralina\",\n es: \"Versi\u00F3n y fecha del firmware de la unidad de control\",\n pl: \"Wersja i data oprogramowania uk\u0142adowego jednostki steruj\u0105cej\",\n uk: \"\u0412\u0435\u0440\u0441\u0456\u044F \u043F\u0440\u043E\u0448\u0438\u0432\u043A\u0438 \u0442\u0430 \u0434\u0430\u0442\u0430 \u0432\u0438\u043F\u0443\u0441\u043A\u0443 \u0431\u043B\u043E\u043A\u0443 \u0443\u043F\u0440\u0430\u0432\u043B\u0456\u043D\u043D\u044F\",\n \"zh-cn\": \"Firmware version and date of the control unit\",\n },\n this.ParseFirmware,\n ),\n );\n\n // this.parameterDictionary.set(ParameterType.ResetFactoryDefaults, 1);\n\n ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n this.parameterDictionary.set(\n ParameterType.FilterExchangeNecessary,\n new FanData(\n 1,\n \"fan.filterExchangeNecessary\",\n false,\n \"state\",\n \"boolean\",\n {\n en: \"Filter change indicator\",\n de: \"Filterwechselanzeige\",\n ru: \"\u0418\u043D\u0434\u0438\u043A\u0430\u0442\u043E\u0440 \u0437\u0430\u043C\u0435\u043D\u044B \u0444\u0438\u043B\u044C\u0442\u0440\u0430\",\n pt: \"Indicador de mudan\u00E7a de filtro\",\n nl: \"Indicator voor filtervervanging\",\n fr: \"Indicateur de changement de filtre\",\n it: \"Indicatore di sostituzione del filtro\",\n es: \"Indicador de cambio de filtro\",\n pl: \"Wska\u017Anik wymiany filtra\",\n uk: \"\u0406\u043D\u0434\u0438\u043A\u0430\u0442\u043E\u0440 \u0437\u0430\u043C\u0456\u043D\u0438 \u0444\u0456\u043B\u044C\u0442\u0440\u0430\",\n \"zh-cn\": \"Filter change indicator\",\n },\n this.ParseBool,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.WifiOperatingMode,\n new FanData(\n 1,\n \"network.wifiOperatingMode\",\n false,\n \"state\",\n \"string\",\n {\n en: \"WLAN operation mode\",\n de: \"WLAN-Betriebsart\",\n ru: \"\u0420\u0435\u0436\u0438\u043C \u0440\u0430\u0431\u043E\u0442\u044B WLAN\",\n pt: \"Modo de funcionamento WLAN\",\n nl: \"WLAN-bedieningsmodus\",\n fr: \"Mode de fonctionnement WLAN\",\n it: \"Modalit\u00E0 di funzionamento WLAN\",\n es: \"Modo de funcionamiento WLAN\",\n pl: \"Tryb pracy WLAN\",\n uk: \"\u0420\u0435\u0436\u0438\u043C \u0440\u043E\u0431\u043E\u0442\u0438 WLAN\",\n \"zh-cn\": \"WLAN operation mode\",\n },\n this.ParseWifiMode,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.WifiName,\n new FanData(\n -1,\n \"network.wifiName\",\n false,\n \"state\",\n \"string\",\n {\n en: \"WLAN name in client mode\",\n de: \"WLAN-Name im Client-Modus\",\n ru: \"\u0418\u043C\u044F \u0431\u0435\u0441\u043F\u0440\u043E\u0432\u043E\u0434\u043D\u043E\u0439 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E\u0439 \u0441\u0435\u0442\u0438 \u0432 \u0440\u0435\u0436\u0438\u043C\u0435 \u043A\u043B\u0438\u0435\u043D\u0442\u0430\",\n pt: \"Nome da WLAN no modo de cliente\",\n nl: \"WLAN-naam in clientmodus\",\n fr: \"Nom du WLAN en mode client\",\n it: \"Nome della WLAN in modalit\u00E0 client\",\n es: \"Nombre de la WLAN en modo cliente\",\n pl: \"Nazwa sieci WLAN w trybie klienta\",\n uk: \"\u0406\u043C'\u044F \u0431\u0435\u0437\u0434\u0440\u043E\u0442\u043E\u0432\u043E\u0457 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E\u0457 \u043C\u0435\u0440\u0435\u0436\u0456 \u0432 \u0440\u0435\u0436\u0438\u043C\u0456 \u043A\u043B\u0456\u0454\u043D\u0442\u0430\",\n \"zh-cn\": \"WLAN name in client mode\",\n },\n this.ParseText,\n ),\n );\n // this.parameterDictionary.set(ParameterType.WifiPassword, -1);\n this.parameterDictionary.set(\n ParameterType.WifiEncryptionMode,\n new FanData(\n 1,\n \"network.wifiEncryptionMode\",\n false,\n \"state\",\n \"string\",\n {\n en: \"WLAN encryption technology\",\n de: \"WLAN-Verschl\u00FCsselungstechnologie\",\n ru: \"\u0422\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u044F \u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u044F WLAN\",\n pt: \"Tecnologia de encripta\u00E7\u00E3o WLAN\",\n nl: \"WLAN-coderingstechnologie\",\n fr: \"Technologie de cryptage WLAN\",\n it: \"Tecnologia di crittografia WLAN\",\n es: \"Tecnolog\u00EDa de cifrado WLAN\",\n pl: \"Technologia szyfrowania WLAN\",\n uk: \"\u0422\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0456\u044F \u0448\u0438\u0444\u0440\u0443\u0432\u0430\u043D\u043D\u044F WLAN\",\n \"zh-cn\": \"WLAN encryption technology\",\n },\n this.ParseWifiEncryptionMode,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.WifiChannel,\n new FanData(\n 1,\n \"network.wifiChannel\",\n false,\n \"state\",\n \"number\",\n {\n en: \"WLAN channel frequency\",\n de: \"WLAN-Kanalfrequenz\",\n ru: \"\u0427\u0430\u0441\u0442\u043E\u0442\u0430 \u043A\u0430\u043D\u0430\u043B\u0430 WLAN\",\n pt: \"Frequ\u00EAncia do canal WLAN\",\n nl: \"WLAN-kanaalfrequentie\",\n fr: \"Fr\u00E9quence du canal WLAN\",\n it: \"Frequenza del canale WLAN\",\n es: \"Frecuencia del canal WLAN\",\n pl: \"Cz\u0119stotliwo\u015B\u0107 kana\u0142u WLAN\",\n uk: \"\u0427\u0430\u0441\u0442\u043E\u0442\u0430 \u043A\u0430\u043D\u0430\u043B\u0443 WLAN\",\n \"zh-cn\": \"WLAN channel frequency\",\n },\n this.ParseByteNumber,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.WifiIpMode,\n new FanData(\n 1,\n \"network.wifiIpMode\",\n false,\n \"state\",\n \"string\",\n {\n en: \"WLAN module DHCP\",\n de: \"WLAN-Modul DHCP\",\n ru: \"\u041C\u043E\u0434\u0443\u043B\u044C WLAN DHCP\",\n pt: \"M\u00F3dulo WLAN DHCP\",\n nl: \"WLAN-module DHCP\",\n fr: \"Module WLAN DHCP\",\n it: \"Modulo WLAN DHCP\",\n es: \"M\u00F3dulo WLAN DHCP\",\n pl: \"Modu\u0142 WLAN DHCP\",\n uk: \"\u041C\u043E\u0434\u0443\u043B\u044C \u0431\u0435\u0437\u0434\u0440\u043E\u0442\u043E\u0432\u043E\u0457 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E\u0457 \u043C\u0435\u0440\u0435\u0436\u0456 DHCP\",\n \"zh-cn\": \"WLAN module DHCP\",\n },\n this.ParseWifiIpMode,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.WifiIp,\n new FanData(\n 4,\n \"network.wifiIpMode\",\n false,\n \"info.ip\",\n \"string\",\n {\n en: \"Assigned IP address of the WLAN module\",\n de: \"Zugewiesene IP-Adresse des WLAN-Moduls\",\n ru: \"\u041D\u0430\u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044B\u0439 IP-\u0430\u0434\u0440\u0435\u0441 \u043C\u043E\u0434\u0443\u043B\u044F WLAN\",\n pt: \"Endere\u00E7o IP atribu\u00EDdo ao m\u00F3dulo WLAN\",\n nl: \"Toegewezen IP-adres van de WLAN-module\",\n fr: \"Adresse IP attribu\u00E9e au module WLAN\",\n it: \"Indirizzo IP assegnato del modulo WLAN\",\n es: \"Direcci\u00F3n IP asignada del m\u00F3dulo WLAN\",\n pl: \"Przypisany adres IP modu\u0142u WLAN\",\n uk: \"\u041F\u0440\u0438\u0441\u0432\u043E\u0454\u043D\u0430 IP-\u0430\u0434\u0440\u0435\u0441\u0430 \u043C\u043E\u0434\u0443\u043B\u044F WLAN\",\n \"zh-cn\": \"Assigned IP address of the WLAN module\",\n },\n this.ParseIpV4Value,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.WifiSubnetMask,\n new FanData(\n 4,\n \"network.wifiSubnetMask\",\n false,\n \"info.ip\",\n \"string\",\n {\n en: \"Subnet mask of the WLAN module\",\n de: \"Subnetzmaske des WLAN-Moduls\",\n ru: \"\u041C\u0430\u0441\u043A\u0430 \u043F\u043E\u0434\u0441\u0435\u0442\u0438 \u043C\u043E\u0434\u0443\u043B\u044F WLAN\",\n pt: \"M\u00E1scara de sub-rede do m\u00F3dulo WLAN\",\n nl: \"Subnetmasker van de WLAN-module\",\n fr: \"Masque de sous-r\u00E9seau du module WLAN\",\n it: \"Maschera di sottorete del modulo WLAN\",\n es: \"M\u00E1scara de subred del m\u00F3dulo WLAN\",\n pl: \"Maska podsieci modu\u0142u WLAN\",\n uk: \"\u041C\u0430\u0441\u043A\u0430 \u043F\u0456\u0434\u043C\u0435\u0440\u0435\u0436\u0456 \u043C\u043E\u0434\u0443\u043B\u044F WLAN\",\n \"zh-cn\": \"Subnet mask of the WLAN module\",\n },\n this.ParseIpV4Value,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.WifiGateway,\n new FanData(\n 4,\n \"network.wifiGateway\",\n false,\n \"info.ip\",\n \"string\",\n {\n en: \"Main gateway of the WLAN module\",\n de: \"Haupt-Gateway des WLAN-Moduls\",\n ru: \"\u0413\u043B\u0430\u0432\u043D\u044B\u0439 \u0448\u043B\u044E\u0437 \u043C\u043E\u0434\u0443\u043B\u044F WLAN\",\n pt: \"Gateway principal do m\u00F3dulo WLAN\",\n nl: \"Hoofdgateway van de WLAN-module\",\n fr: \"Passerelle principale du module WLAN\",\n it: \"Gateway principale del modulo WLAN\",\n es: \"Pasarela principal del m\u00F3dulo WLAN\",\n pl: \"Brama g\u0142\u00F3wna modu\u0142u WLAN\",\n uk: \"\u0413\u043E\u043B\u043E\u0432\u043D\u0438\u0439 \u0448\u043B\u044E\u0437 \u043C\u043E\u0434\u0443\u043B\u044F WLAN\",\n \"zh-cn\": \"Main gateway of the WLAN module\",\n },\n this.ParseIpV4Value,\n ),\n );\n // this.parameterDictionary.set(ParameterType.ExitWifiSetupAndSafe, 1);\n // this.parameterDictionary.set(ParameterType.ExitWifiSetupAndDiscard, 1);\n this.parameterDictionary.set(\n ParameterType.CurrentWifiIp,\n new FanData(\n 4,\n \"network.currentWifiIp\",\n false,\n \"info.ip\",\n \"string\",\n {\n en: \"Current IP address of the WLAN module\",\n de: \"Aktuelle IP-Adresse des WLAN-Moduls\",\n ru: \"\u0422\u0435\u043A\u0443\u0449\u0438\u0439 IP-\u0430\u0434\u0440\u0435\u0441 \u043C\u043E\u0434\u0443\u043B\u044F WLAN\",\n pt: \"Endere\u00E7o IP atual do m\u00F3dulo WLAN\",\n nl: \"Huidig IP-adres van de WLAN-module\",\n fr: \"Adresse IP actuelle du module WLAN\",\n it: \"Indirizzo IP attuale del modulo WLAN\",\n es: \"Direcci\u00F3n IP actual del m\u00F3dulo WLAN\",\n pl: \"Aktualny adres IP modu\u0142u WLAN\",\n uk: \"\u041F\u043E\u0442\u043E\u0447\u043D\u0430 IP-\u0430\u0434\u0440\u0435\u0441\u0430 \u043C\u043E\u0434\u0443\u043B\u044F \u0431\u0435\u0437\u0434\u0440\u043E\u0442\u043E\u0432\u043E\u0457 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E\u0457 \u043C\u0435\u0440\u0435\u0436\u0456\",\n \"zh-cn\": \"Current IP address of the WLAN module\",\n },\n this.ParseIpV4Value,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.FanOperatingMode,\n new FanData(\n 1,\n \"fan.fanOperatingMode\",\n true,\n \"state\",\n \"mixed\",\n {\n en: \"Operating mode of the fan\",\n de: \"Betriebsart des Ventilators\",\n ru: \"\u0420\u0435\u0436\u0438\u043C \u0440\u0430\u0431\u043E\u0442\u044B \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0442\u043E\u0440\u0430\",\n pt: \"Modo de funcionamento do ventilador\",\n nl: \"Werkingsmodus van de ventilator\",\n fr: \"Mode de fonctionnement du ventilateur\",\n it: \"Modalit\u00E0 di funzionamento del ventilatore\",\n es: \"Modo de funcionamiento del ventilador\",\n pl: \"Tryb pracy wentylatora\",\n uk: \"\u0420\u0435\u0436\u0438\u043C \u0440\u043E\u0431\u043E\u0442\u0438 \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0442\u043E\u0440\u0430\",\n \"zh-cn\": \"Operating mode of the fan\",\n },\n this.ParseOperatingMode,\n \"\",\n 0,\n 2,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.TargetAnalogVoltageValue,\n new FanData(\n 1,\n \"sensors.targetAnalogVoltageValue\",\n true,\n \"state\",\n \"number\",\n {\n en: \"Setpoint of the sensor 0-10 V\",\n de: \"Sollwert des Sensors 0-10 V\",\n ru: \"\u0423\u0441\u0442\u0430\u0432\u043A\u0430 \u0434\u0430\u0442\u0447\u0438\u043A\u0430 0-10 \u0412\",\n pt: \"Ponto de regula\u00E7\u00E3o do sensor 0-10 V\",\n nl: \"Instelpunt van de sensor 0-10 V\",\n fr: \"Point de consigne du capteur 0-10 V\",\n it: \"Setpoint del sensore 0-10 V\",\n es: \"Consigna del sensor 0-10 V\",\n pl: \"Warto\u015B\u0107 zadana czujnika 0-10 V\",\n uk: \"\u0423\u0441\u0442\u0430\u0432\u043A\u0430 \u0434\u0430\u0442\u0447\u0438\u043A\u0430 0-10 \u0412\",\n \"zh-cn\": \"Setpoint of the sensor 0-10 V\",\n },\n this.ParseByteNumber,\n \"%\",\n 5,\n 100,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.FanType,\n new FanData(\n 2,\n \"system.fanType\",\n false,\n \"state\",\n \"string\",\n {\n en: \"System type\",\n de: \"Anlagentyp\",\n ru: \"\u0422\u0438\u043F \u0441\u0438\u0441\u0442\u0435\u043C\u044B\",\n pt: \"Tipo de sistema\",\n nl: \"Type systeem\",\n fr: \"Type de syst\u00E8me\",\n it: \"Tipo di sistema\",\n es: \"Tipo de sistema\",\n pl: \"Typ systemu\",\n uk: \"\u0422\u0438\u043F \u0441\u0438\u0441\u0442\u0435\u043C\u0438\",\n \"zh-cn\": \"System type\",\n },\n this.ParseSystemType,\n ),\n );\n }\n}\n"], - "mappings": "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", + "sourcesContent": ["import { ParsedData, ParsingStatus, ReceivedData } from \"./ModelData\";\n\nenum FunctionType {\n Undefined = 0x00,\n Read = 0x01,\n // Write = 0x02, // not used\n WriteRead = 0x03,\n // Increment = 0x04, // not used\n // Decrement = 0x05, // not used\n Response = 0x06,\n}\n\nexport enum ParameterType {\n FanState = 1,\n FanSpeedMode = 2,\n BoostState = 6,\n TimerMode = 7,\n TimerCountdown = 11,\n StateHumiditySensor = 15,\n StateRelaisSensor = 20,\n StateAnalogVoltageSensor = 22,\n TargetHumidityValue = 25,\n RtcBatteryVoltage = 36,\n CurrentHumidityValue = 37,\n CurrentAnalogVoltageValue = 45,\n CurrentRelaisValue = 50,\n ManualFanSpeed = 68,\n FanSpeedFan1Rpm = 74,\n FanSpeedFan2Rpm = 75,\n FilterExchangeCountdown = 100,\n ResetFilterExchangeCountdown = 101,\n BoostModeFollowUpTime = 102, // [min]\n TriggerTimeSync = 256, // Not actually part of the protocol, used as trigger to sync the time\n RtcTime = 111,\n RtcDate = 112,\n TimeControlledMode = 114,\n TimeControlSchedule = 119,\n SearchFanId = 124,\n FanPassword = 125,\n OperatingTime = 126,\n ResetAlarms = 128,\n AlarmState = 131,\n CloudServerEnabled = 133,\n FirmwareVersionAndDate = 134,\n ResetFactoryDefaults = 135,\n FilterExchangeNecessary = 136,\n WifiOperatingMode = 148,\n WifiName = 149,\n WifiPassword = 150,\n WifiEncryptionMode = 153,\n WifiChannel = 154,\n WifiIpMode = 155,\n WifiIp = 156,\n WifiSubnetMask = 157,\n WifiGateway = 158,\n ExitWifiSetupAndSafe = 160,\n ExitWifiSetupAndDiscard = 162,\n CurrentWifiIp = 163,\n FanOperatingMode = 183,\n TargetAnalogVoltageValue = 184,\n FanType = 185,\n}\n\ntype ParseResult = (b: Buffer) => ioBroker.StateValue;\n\nexport class FanData {\n constructor(\n nSize: number,\n strIdentifer: string,\n bIsWritable: boolean,\n strRole: string,\n strType: ioBroker.CommonType,\n name: ioBroker.StringOrTranslated,\n parseFunction: ParseResult,\n strUnit?: string | undefined,\n minValue?: number | undefined,\n maxValue?: number | undefined,\n ) {\n this.nSize = nSize;\n this.strIdentifer = strIdentifer;\n this.bIsWritable = bIsWritable;\n this.strRole = strRole;\n this.strType = strType;\n this.strUnit = strUnit;\n this.name = name;\n this.parseFunction = parseFunction;\n this.minValue = minValue;\n this.maxValue = maxValue;\n }\n\n nSize: number;\n strIdentifer: string;\n bIsWritable: boolean;\n strRole: string;\n strType: ioBroker.CommonType;\n name: ioBroker.StringOrTranslated;\n\n parseFunction: ParseResult;\n\n strUnit: string | undefined;\n minValue?: number | undefined;\n maxValue?: number | undefined;\n}\n\nexport class OxxifyProtocol {\n public constructor() {\n // Packet start\n this.internalBuffer[0] = 0xfd;\n this.internalBuffer[1] = 0xfd;\n\n // Protocol type\n this.internalBuffer[2] = 0x02;\n\n // Fan Id size\n this.internalBuffer[3] = 0x10;\n\n this.nWriteIndex = 4;\n\n this.FillParameterDictionary();\n }\n\n public StartNewFrame(strFanId: string, strPassword: string): boolean {\n if (strFanId.length != 16) return false;\n\n if (strPassword.length <= 0) return false;\n\n // Reset the write index\n this.nWriteIndex = 4;\n\n // Fan id\n this.internalBuffer.write(strFanId, this.nWriteIndex);\n this.nWriteIndex += strFanId.length;\n\n // Size password\n this.internalBuffer[this.nWriteIndex] = strPassword.length;\n this.nWriteIndex++;\n\n // Password itself\n this.internalBuffer.write(strPassword, this.nWriteIndex);\n this.nWriteIndex += strPassword.length;\n\n this.eCurrentFunction = FunctionType.Undefined;\n this.bIsFirstFunction = true;\n\n return true;\n }\n\n public FinishFrame(): void {\n const checksum = this.CalculateChecksum(this.internalBuffer.subarray(2, this.nWriteIndex));\n\n this.internalBuffer[this.nWriteIndex] = checksum & 0xff;\n this.nWriteIndex++;\n\n this.internalBuffer[this.nWriteIndex] = checksum >> 8;\n this.nWriteIndex++;\n }\n\n //////////////////////////////////////////////////////////////////////////////////////////////\n\n public ReadFanState(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.FanState);\n }\n\n public WriteFanState(bEnabled: boolean): void {\n this.AddFunctionCode(FunctionType.WriteRead);\n const data = Buffer.alloc(1);\n\n if (bEnabled) data[0] = 1;\n else data[0] = 0;\n this.AddParameter(ParameterType.FanState, data);\n }\n\n public ReadFanSpeedMode(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.FanSpeedMode);\n }\n\n public WriteFanSpeedMode(nValue: number): void {\n this.AddFunctionCode(FunctionType.WriteRead);\n const data = Buffer.alloc(1);\n data[0] = nValue;\n console.log(\"Data in Buffer: \" + data[0]);\n this.AddParameter(ParameterType.FanSpeedMode, data);\n }\n\n public ReadBoostState(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.BoostState);\n }\n\n public ReadTimerModeValues(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.TimerMode);\n this.AddParameter(ParameterType.TimerCountdown);\n }\n\n public WriteTimerMode(nValue: number): void {\n this.AddFunctionCode(FunctionType.WriteRead);\n const data = Buffer.alloc(1);\n data[0] = nValue;\n this.AddParameter(ParameterType.TimerMode, data);\n }\n\n public ReadHumiditySensorState(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.StateHumiditySensor);\n }\n\n public WriteHumiditySensorState(bEnabled: boolean): void {\n this.AddFunctionCode(FunctionType.WriteRead);\n const data = Buffer.alloc(1);\n\n if (bEnabled) data[0] = 1;\n else data[0] = 0;\n this.AddParameter(ParameterType.StateHumiditySensor, data);\n }\n\n public ReadRelaisSensorState(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.StateRelaisSensor);\n }\n\n public WriteRelaisSensorState(bEnabled: boolean): void {\n this.AddFunctionCode(FunctionType.WriteRead);\n const data = Buffer.alloc(1);\n\n if (bEnabled) data[0] = 1;\n else data[0] = 0;\n this.AddParameter(ParameterType.StateRelaisSensor, data);\n }\n\n public ReadAnalogVoltageSensorState(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.StateAnalogVoltageSensor);\n }\n\n public WriteAnalogVoltageSensorState(bEnabled: boolean): void {\n this.AddFunctionCode(FunctionType.WriteRead);\n const data = Buffer.alloc(1);\n\n if (bEnabled) data[0] = 1;\n else data[0] = 0;\n this.AddParameter(ParameterType.StateAnalogVoltageSensor, data);\n }\n\n public ReadTargetHumidityValue(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.TargetHumidityValue);\n }\n\n public WriteTargetHumidityValue(nValue: number): void {\n this.AddFunctionCode(FunctionType.WriteRead);\n const data = Buffer.alloc(1);\n\n data[0] = nValue;\n this.AddParameter(ParameterType.TargetHumidityValue, data);\n }\n\n public ReadRtcBattery(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.RtcBatteryVoltage);\n }\n\n public ReadCurrentHumidity(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.CurrentHumidityValue);\n }\n\n public ReadCurrentAnalogVoltage(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.CurrentAnalogVoltageValue);\n }\n\n public ReadCurrentRelaisState(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.CurrentRelaisValue);\n }\n\n public ReadManualFanSpeed(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.ManualFanSpeed);\n }\n\n public WriteManualFanSpeed(nValue: number): void {\n this.AddFunctionCode(FunctionType.WriteRead);\n const data = Buffer.alloc(1);\n\n data[0] = nValue;\n this.AddParameter(ParameterType.ManualFanSpeed, data);\n }\n\n public ReadFan1Speed(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.FanSpeedFan1Rpm);\n }\n\n public ReadFan2Speed(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.FanSpeedFan2Rpm);\n }\n\n public ReadFilterExchangeCountdown(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.FilterExchangeCountdown);\n }\n\n public WriteResetFilterExchangeCountdown(): void {\n this.AddFunctionCode(FunctionType.WriteRead);\n const resetByte = Buffer.alloc(1);\n\n resetByte[0] = 0xff;\n this.AddParameter(ParameterType.ResetFilterExchangeCountdown, resetByte);\n }\n\n public ReadBoostModeFollowUpTime(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.BoostModeFollowUpTime);\n }\n\n public WriteBoostModeFollowUpTime(nValue: number): void {\n this.AddFunctionCode(FunctionType.WriteRead);\n const data = Buffer.alloc(1);\n\n data[0] = nValue;\n this.AddParameter(ParameterType.BoostModeFollowUpTime, data);\n }\n\n public ReadRtcDateTime(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.RtcTime);\n this.AddParameter(ParameterType.RtcDate);\n }\n\n public WriteRtcDateTime(dateTime: Date): boolean {\n // It does not immediately respond with the right data\n this.AddFunctionCode(FunctionType.WriteRead);\n\n const rtcTime = Buffer.alloc(3);\n rtcTime[0] = dateTime.getSeconds();\n rtcTime[1] = dateTime.getMinutes();\n rtcTime[2] = dateTime.getHours();\n\n const rtcDate = Buffer.alloc(4);\n rtcDate[0] = dateTime.getDate();\n rtcDate[1] = dateTime.getDay();\n rtcDate[2] = dateTime.getMonth() + 1;\n rtcDate[3] = dateTime.getFullYear() % 100;\n\n this.AddParameter(ParameterType.RtcTime, rtcTime);\n this.AddParameter(ParameterType.RtcDate, rtcDate);\n\n return true;\n }\n\n public ReadTimeControlledMode(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.TimeControlledMode);\n }\n\n public WriteTimeControlledMode(bEnabled: boolean): void {\n this.AddFunctionCode(FunctionType.WriteRead);\n const data = Buffer.alloc(1);\n\n if (bEnabled) data[0] = 1;\n else data[0] = 0;\n this.AddParameter(ParameterType.TimeControlledMode, data);\n }\n\n public ReadOperatingTime(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.OperatingTime);\n }\n\n public ReadAlarmState(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.AlarmState);\n }\n\n public WriteResetAlarmState(): void {\n this.AddFunctionCode(FunctionType.WriteRead);\n const resetAlarmByte = Buffer.alloc(1);\n\n resetAlarmByte[0] = 0xff;\n this.AddParameter(ParameterType.ResetAlarms, resetAlarmByte);\n }\n\n public ReadCloudServerEnabled(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.CloudServerEnabled);\n }\n\n public ReadFirmware(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.FirmwareVersionAndDate);\n }\n\n public ReadFilterExchangeNecessary(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.FilterExchangeNecessary);\n }\n\n public ReadWifiData(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.WifiOperatingMode);\n this.AddParameter(ParameterType.WifiName);\n this.AddParameter(ParameterType.WifiPassword);\n this.AddParameter(ParameterType.WifiEncryptionMode);\n this.AddParameter(ParameterType.WifiChannel);\n this.AddParameter(ParameterType.WifiIpMode);\n this.AddParameter(ParameterType.WifiIp);\n this.AddParameter(ParameterType.WifiSubnetMask);\n this.AddParameter(ParameterType.WifiGateway);\n this.AddParameter(ParameterType.CurrentWifiIp);\n }\n\n public ReadOperatingMode(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.FanOperatingMode);\n }\n\n public WriteOperatingMode(nValue: number): void {\n this.AddFunctionCode(FunctionType.WriteRead);\n const data = Buffer.alloc(1);\n\n data[0] = nValue;\n this.AddParameter(ParameterType.FanOperatingMode, data);\n }\n\n public ReadTargetAnalogVoltageValue(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.TargetAnalogVoltageValue);\n }\n\n public WriteTargetAnalogVoltageValue(nValue: number): void {\n this.AddFunctionCode(FunctionType.WriteRead);\n const data = Buffer.alloc(1);\n\n data[0] = nValue;\n this.AddParameter(ParameterType.TargetAnalogVoltageValue, data);\n }\n\n public ReadFanType(): void {\n this.AddFunctionCode(FunctionType.Read);\n this.AddParameter(ParameterType.FanType);\n }\n\n //////////////////////////////////////////////////////////////////////////////////////////////\n\n public get ProtocolPacket(): Buffer {\n return Buffer.from(this.internalBuffer.subarray(0, this.nWriteIndex));\n }\n\n public ParseResponseData(dataBytes: Buffer): ParsedData {\n const status = this.CheckProtocol(dataBytes);\n const result = new ParsedData();\n\n if (dataBytes == undefined) {\n result.status = ParsingStatus.Undefined;\n return result;\n }\n\n if (status != ParsingStatus.Ok) {\n result.status = status;\n return result;\n }\n\n this.nReadIndex = 4;\n\n // Read the 16 digit fan id\n result.strFanId = dataBytes.subarray(this.nReadIndex, this.nReadIndex + 16).toString();\n\n // The fan id has a fied size\n this.nReadIndex += 16;\n\n // Increment by the size of the password\n this.nReadIndex += dataBytes.at(this.nReadIndex) ?? 0;\n\n // Go further to the function byte\n this.nReadIndex++;\n\n let bIsDataToRead = false;\n\n if (dataBytes.at(this.nReadIndex) == FunctionType.Response) {\n bIsDataToRead = true;\n }\n\n // Start after the function byte - this is not expected to be changed within one telegram\n this.nReadIndex++;\n\n if (bIsDataToRead) {\n while (this.nReadIndex < dataBytes.length - 2) {\n this.nReadIndex += this.ParseData(dataBytes.subarray(this.nReadIndex), result.receivedData);\n }\n\n return result;\n }\n\n result.status = ParsingStatus.Undefined;\n return result;\n }\n\n private ParseData(data: Buffer, receivedData: ReceivedData[]): number {\n let nIndex = 0;\n let nCurrentReadParameterSize = 1;\n\n switch (data.at(nIndex)) {\n case 0xfe:\n nIndex++;\n nCurrentReadParameterSize = data.at(nIndex) ?? 1;\n nIndex++;\n break;\n\n // Not supported low byte\n case 0xfd:\n nIndex++;\n // Index points here to the not supported low byte\n nIndex++;\n break;\n }\n\n const eParameter = data.at(nIndex) as ParameterType;\n nIndex++;\n\n if (this.parameterDictionary.has(eParameter)) {\n const fanData = this.parameterDictionary.get(eParameter);\n\n if (fanData != undefined) {\n const parsedData = new ReceivedData();\n parsedData.strIdentifer = fanData?.strIdentifer ?? \"UNDEFINED\";\n\n parsedData.value =\n fanData?.parseFunction(data.subarray(nIndex, nIndex + nCurrentReadParameterSize)) ?? null;\n\n receivedData.push(parsedData);\n }\n }\n\n const nReturnIndex = nIndex + nCurrentReadParameterSize;\n\n return nReturnIndex;\n }\n\n public get DataDictionary(): Map {\n return this.parameterDictionary;\n }\n\n //#region Protected data members\n\n internalBuffer: Buffer = Buffer.alloc(256);\n nWriteIndex: number = 0;\n nReadIndex: number = 0;\n\n bIsFirstFunction: boolean = false;\n eCurrentFunction: FunctionType = FunctionType.Undefined;\n\n // Dictionary with parameter low byte as key for the HighByte 0x00\n parameterDictionary: Map = new Map();\n\n //#endregion\n\n private CheckProtocol(dataBuffer: Buffer): ParsingStatus {\n if (dataBuffer.at(0) != 0xfd && dataBuffer.at(1) != 0xfd) {\n return ParsingStatus.WrongHeader;\n }\n\n if (dataBuffer.at(2) != 0x02) {\n return ParsingStatus.WrongVersion;\n }\n\n if (dataBuffer.at(3) != 0x10) {\n return ParsingStatus.WrongIdSize;\n }\n\n const nCalculatedChecksum = this.CalculateChecksum(dataBuffer.subarray(2, dataBuffer.length - 2));\n const nReceivedChecksum = dataBuffer[dataBuffer.length - 2] + (dataBuffer[dataBuffer.length - 1] << 8);\n\n if (nCalculatedChecksum != nReceivedChecksum) {\n return ParsingStatus.ChecksumError;\n }\n\n return ParsingStatus.Ok;\n }\n\n private AddFunctionCode(eNextFunction: FunctionType): void {\n if (this.bIsFirstFunction) {\n this.bIsFirstFunction = false;\n } else {\n if (eNextFunction == this.eCurrentFunction) {\n // Nothing to do if the function code is already the right one - only the parameter index needs to be added\n return;\n } else {\n this.internalBuffer[this.nWriteIndex] = 0xfc;\n this.nWriteIndex++;\n }\n }\n\n this.internalBuffer[this.nWriteIndex] = eNextFunction;\n this.nWriteIndex++;\n\n this.eCurrentFunction = eNextFunction;\n }\n\n /**\n * Adds an parameter for an read or an write request.\n * @param eParameter The predefined enum value for the parameter, which is also teh relevant low-byte of the adressed data.\n * @param bytes The bytes to write in a Write / WriteRead request. Null in case of an read request.\n * @returns True if successful, otherwise false.\n */\n private AddParameter(eParameter: ParameterType, bytes: Buffer | null = null): boolean {\n const parameterData = this.parameterDictionary.get(eParameter);\n\n // e.g. Variable parameter size\n if (parameterData == undefined) return false;\n\n if (parameterData.nSize != 1) {\n if (this.eCurrentFunction != FunctionType.Read) {\n // Special command to change the parameter sizce\n this.internalBuffer[this.nWriteIndex] = 0xfe;\n this.nWriteIndex++;\n\n // Add the new size\n this.internalBuffer[this.nWriteIndex] = parameterData.nSize;\n this.nWriteIndex++;\n }\n }\n\n this.internalBuffer[this.nWriteIndex] = eParameter as number;\n this.nWriteIndex++;\n\n if (this.eCurrentFunction == FunctionType.WriteRead) {\n if (bytes == null) return false;\n\n if (bytes.length == 1) this.internalBuffer.writeUint8(bytes.at(0) ?? 0, this.nWriteIndex);\n else this.internalBuffer.write(bytes.toString(), this.nWriteIndex);\n\n this.nWriteIndex += bytes.length;\n }\n\n return true;\n }\n\n private CalculateChecksum(bytes: Uint8Array): number {\n let checksum = 0;\n\n for (let i = 0; i < bytes.length; i++) {\n checksum += bytes[i];\n }\n\n return checksum & 0xffff;\n }\n\n private ParseFirmware(bytes: Buffer): ioBroker.StateValue {\n const nYear = (bytes.at(4) ?? 0) + ((bytes.at(5) ?? 0) << 8);\n return `v${bytes.at(0)}.${bytes.at(1)} - ${bytes.at(2)}.${bytes.at(3)}.${nYear}`;\n }\n\n private ParseBool(byte: Buffer): ioBroker.StateValue {\n switch (byte.at(0) ?? 255) {\n case 0:\n return false;\n case 1:\n return true;\n default:\n break;\n }\n\n return null;\n }\n\n private ParseByteNumber(byte: Buffer): ioBroker.StateValue {\n return byte.at(0) ?? null;\n }\n\n private ParseWordNumber(bytes: Buffer): ioBroker.StateValue {\n return (bytes.at(0) ?? 0) | ((bytes.at(1) ?? 0) << 8);\n }\n\n private ParseTimerMode(byte: Buffer): ioBroker.StateValue {\n switch (byte.at(0) ?? 255) {\n case 0:\n return \"0 - Off\";\n case 1:\n return \"1 - Night mode\";\n case 2:\n return \"2 - Party mode\";\n }\n return null;\n }\n\n private ParseFanSpeedMode(byte: Buffer): ioBroker.StateValue {\n switch (byte.at(0) ?? 255) {\n case 1:\n return \"1 - Ventilation level 1\";\n case 2:\n return \"2 - Ventilation level 2\";\n case 3:\n return \"3 - Ventilation level 3\";\n case 255:\n return \"255 - Manual ventilation level\";\n }\n return null;\n }\n\n private ParseTimeSmallToLarge(bytes: Buffer): ioBroker.StateValue {\n return `${bytes.at(2)?.toString().padStart(2, \"0\")}:${bytes.at(1)?.toString().padStart(2, \"0\")}:${bytes.at(0)?.toString().padStart(2, \"0\")}`;\n }\n\n private ParseRtcDate(bytes: Buffer): ioBroker.StateValue {\n return `${bytes.at(0)?.toString().padStart(2, \"0\")}.${bytes.at(2)?.toString().padStart(2, \"0\")}.${bytes.at(3)?.toString().padStart(2, \"0\")} (${bytes.at(1)} day of the week)`;\n }\n\n private ParseOperatingTime(bytes: Buffer): ioBroker.StateValue {\n return `${(bytes.at(2) ?? 0) | ((bytes.at(3) ?? 0) << 8)}:${bytes.at(1)?.toString().padStart(2, \"0\")}:${bytes.at(0)?.toString().padStart(2, \"0\")}`;\n }\n\n private ParseAlarmWarningState(byte: Buffer): ioBroker.StateValue {\n switch (byte.at(0) ?? 255) {\n case 0:\n return \"0 - Nothing\";\n case 1:\n return \"1 - Alarm (highest priority)\";\n case 2:\n return \"2 - Warning\";\n }\n return null;\n }\n\n private ParseWifiMode(byte: Buffer): ioBroker.StateValue {\n switch (byte.at(0) ?? 255) {\n case 1:\n return \"1 - Client\";\n case 2:\n return \"2 - Access Point\";\n }\n return null;\n }\n\n private ParseText(bytes: Buffer): ioBroker.StateValue {\n return bytes.toString();\n }\n\n private ParseWifiEncryptionMode(byte: Buffer): ioBroker.StateValue {\n switch (byte.at(0) ?? 255) {\n case 48:\n return \"48 - Open/not encrypted\";\n case 50:\n return \"50 - WPA PSK\";\n case 51:\n return \"51 - WPA2 PSK\";\n case 52:\n return \"52 - WPA/WPA2 PSK\";\n }\n return null;\n }\n\n private ParseWifiIpMode(byte: Buffer): ioBroker.StateValue {\n switch (byte.at(0) ?? 255) {\n case 0:\n return \"0 - Static IP\";\n case 1:\n return \"1 - DHCP\";\n }\n return null;\n }\n\n private ParseIpV4Value(bytes: Buffer): ioBroker.StateValue {\n return `${bytes.at(0)}.${bytes.at(1)}.${bytes.at(2)}.${bytes.at(3)}`;\n }\n\n private ParseOperatingMode(byte: Buffer): ioBroker.StateValue {\n switch (byte.at(0) ?? 255) {\n case 0:\n return \"0 - Ventilation\";\n case 1:\n return \"1 - Heat recovery\";\n case 2:\n return \"2 - Supply air\";\n }\n return null;\n }\n\n private ParseSystemType(bytes: Buffer): ioBroker.StateValue {\n switch (bytes.at(0) ?? 255) {\n case 0x0e:\n return \"14 - Oxxify.smart 50\";\n }\n return null;\n }\n\n private ParseNothing(_: Buffer): ioBroker.StateValue {\n return null;\n }\n\n private FillParameterDictionary(): void {\n this.parameterDictionary.set(\n ParameterType.FanState,\n new FanData(\n 1,\n \"fan.fanState\",\n true,\n \"switch\",\n \"boolean\",\n {\n en: \"Fan On/Off\",\n de: \"L\u00FCfter ein/aus\",\n ru: \"\u0412\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435/\u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0442\u043E\u0440\u0430\",\n pt: \"Ventilador ligado/desligado\",\n nl: \"Ventilator aan/uit\",\n fr: \"Ventilateur Marche/Arr\u00EAt\",\n it: \"Ventola accesa/spenta\",\n es: \"Ventilador On/Off\",\n pl: \"Wentylator w\u0142.\",\n uk: \"\u0423\u0432\u0456\u043C\u043A\u043D\u0435\u043D\u043D\u044F/\u0432\u0438\u043C\u043A\u043D\u0435\u043D\u043D\u044F \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0442\u043E\u0440\u0430\",\n \"zh-cn\": \"Fan On/Off\",\n },\n this.ParseBool,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.FanSpeedMode,\n new FanData(\n 1,\n \"fan.fanSpeedMode\",\n true,\n \"state\",\n \"string\",\n {\n en: \"Number of the ventilation level\",\n de: \"Nummer der L\u00FCftungsstufe\",\n ru: \"\u041D\u043E\u043C\u0435\u0440 \u0443\u0440\u043E\u0432\u043D\u044F \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0446\u0438\u0438\",\n pt: \"N\u00FAmero do n\u00EDvel de ventila\u00E7\u00E3o\",\n nl: \"Nummer van het ventilatieniveau\",\n fr: \"Num\u00E9ro du niveau de ventilation\",\n it: \"Numero del livello di ventilazione\",\n es: \"N\u00FAmero del nivel de ventilaci\u00F3n\",\n pl: \"Numer poziomu wentylacji\",\n uk: \"\u041D\u043E\u043C\u0435\u0440 \u0440\u0456\u0432\u043D\u044F \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0446\u0456\u0457\",\n \"zh-cn\": \"Number of the ventilation level\",\n },\n this.ParseFanSpeedMode,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.BoostState,\n new FanData(\n 1,\n \"fan.boostState\",\n false,\n \"switch\",\n \"boolean\",\n {\n en: \"Boost operating status on/off\",\n de: \"Boost-Betriebszustand ein/aus\",\n ru: \"\u0412\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435/\u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u0440\u0435\u0436\u0438\u043C\u0430 \u0440\u0430\u0431\u043E\u0442\u044B \u0431\u0443\u0441\u0442\u0430\",\n pt: \"Estado de funcionamento do Boost ligado/desligado\",\n nl: \"Bedrijfsstatus boost aan/uit\",\n fr: \"Activation/d\u00E9sactivation de l'\u00E9tat de fonctionnement de l'amplificateur\",\n it: \"Stato di funzionamento del boost on/off\",\n es: \"Estado de funcionamiento del Boost on/off\",\n pl: \"W\u0142\u0105czanie/wy\u0142\u0105czanie stanu pracy funkcji Boost\",\n uk: \"\u0423\u0432\u0456\u043C\u043A\u043D\u0435\u043D\u043D\u044F/\u0432\u0438\u043C\u043A\u043D\u0435\u043D\u043D\u044F \u0440\u043E\u0431\u043E\u0447\u043E\u0433\u043E \u0441\u0442\u0430\u043D\u0443 \u043F\u0456\u0434\u0441\u0438\u043B\u044E\u0432\u0430\u0447\u0430\",\n \"zh-cn\": \"Boost operating status on/off\",\n },\n this.ParseBool,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.TimerMode,\n new FanData(\n 1,\n \"fan.timerMode\",\n true,\n \"state\",\n \"mixed\",\n {\n en: \"Timer mode\",\n de: \"Timer-Modus\",\n ru: \"\u0420\u0435\u0436\u0438\u043C \u0442\u0430\u0439\u043C\u0435\u0440\u0430\",\n pt: \"Modo de temporizador\",\n nl: \"Timermodus\",\n fr: \"Mode minuterie\",\n it: \"Modalit\u00E0 timer\",\n es: \"Modo temporizador\",\n pl: \"Tryb timera\",\n uk: \"\u0420\u0435\u0436\u0438\u043C \u0442\u0430\u0439\u043C\u0435\u0440\u0430\",\n \"zh-cn\": \"Timer mode\",\n },\n this.ParseTimerMode,\n \"\",\n 0,\n 2,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.TimerCountdown,\n new FanData(\n 3,\n \"fan.timerCountDown\",\n false,\n \"value.time\",\n \"string\",\n {\n en: \"Current countdown of the timer operation\",\n de: \"Aktueller Countdown des Timerbetriebs\",\n ru: \"\u0422\u0435\u043A\u0443\u0449\u0438\u0439 \u043E\u0442\u0441\u0447\u0435\u0442 \u0432\u0440\u0435\u043C\u0435\u043D\u0438 \u0440\u0430\u0431\u043E\u0442\u044B \u0442\u0430\u0439\u043C\u0435\u0440\u0430\",\n pt: \"Contagem decrescente atual da opera\u00E7\u00E3o do temporizador\",\n nl: \"Huidig aftellen van de timer\",\n fr: \"Compte \u00E0 rebours actuel de l'op\u00E9ration de minuterie\",\n it: \"Conto alla rovescia corrente del funzionamento del timer\",\n es: \"Cuenta atr\u00E1s actual de la operaci\u00F3n del temporizador\",\n pl: \"Bie\u017C\u0105ce odliczanie operacji timera\",\n uk: \"\u041F\u043E\u0442\u043E\u0447\u043D\u0438\u0439 \u0432\u0456\u0434\u043B\u0456\u043A \u0440\u043E\u0431\u043E\u0442\u0438 \u0442\u0430\u0439\u043C\u0435\u0440\u0430\",\n \"zh-cn\": \"Current countdown of the timer operation\",\n },\n this.ParseTimeSmallToLarge,\n \"hh:mm:ss\",\n ),\n );\n this.parameterDictionary.set(\n ParameterType.StateHumiditySensor,\n new FanData(\n 1,\n \"sensors.stateHumiditySensor\",\n true,\n \"switch\",\n \"boolean\",\n {\n en: \"Status of the humidity sensor on/off\",\n de: \"Status des Feuchtigkeitssensors ein/aus\",\n ru: \"\u0421\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435 \u0434\u0430\u0442\u0447\u0438\u043A\u0430 \u0432\u043B\u0430\u0436\u043D\u043E\u0441\u0442\u0438 \u0432\u043A\u043B/\u0432\u044B\u043A\u043B\",\n pt: \"Estado do sensor de humidade ligado/desligado\",\n nl: \"Status van de vochtigheidssensor aan/uit\",\n fr: \"\u00C9tat du capteur d'humidit\u00E9 activ\u00E9/d\u00E9sactiv\u00E9\",\n it: \"Stato del sensore di umidit\u00E0 on/off\",\n es: \"Estado del sensor de humedad on/off\",\n pl: \"Stan w\u0142\u0105czenia/wy\u0142\u0105czenia czujnika wilgotno\u015Bci\",\n uk: \"\u0421\u0442\u0430\u043D \u0443\u0432\u0456\u043C\u043A\u043D\u0435\u043D\u043D\u044F/\u0432\u0438\u043C\u043A\u043D\u0435\u043D\u043D\u044F \u0434\u0430\u0442\u0447\u0438\u043A\u0430 \u0432\u043E\u043B\u043E\u0433\u043E\u0441\u0442\u0456\",\n \"zh-cn\": \"Status of the humidity sensor on/off\",\n },\n this.ParseBool,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.StateRelaisSensor,\n new FanData(\n 1,\n \"sensors.stateRelaisSensor\",\n true,\n \"switch\",\n \"boolean\",\n {\n en: \"Status of the relay sensor on/off\",\n de: \"Status des Relaissensors ein/aus\",\n ru: \"\u0421\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435 \u0434\u0430\u0442\u0447\u0438\u043A\u0430 \u0440\u0435\u043B\u0435 \u0432\u043A\u043B/\u0432\u044B\u043A\u043B\",\n pt: \"Estado do sensor de rel\u00E9 ligado/desligado\",\n nl: \"Status van de relaissensor aan/uit\",\n fr: \"\u00C9tat du capteur de relais activ\u00E9/d\u00E9sactiv\u00E9\",\n it: \"Stato del sensore a rel\u00E8 on/off\",\n es: \"Estado del rel\u00E9 sensor on/off\",\n pl: \"Stan w\u0142\u0105czonego/wy\u0142\u0105czonego czujnika przeka\u017Anika\",\n uk: \"\u0421\u0442\u0430\u043D \u0443\u0432\u0456\u043C\u043A\u043D\u0435\u043D\u043E\u0433\u043E/\u0432\u0438\u043C\u043A\u043D\u0435\u043D\u043E\u0433\u043E \u0440\u0435\u043B\u0435\u0439\u043D\u043E\u0433\u043E \u0434\u0430\u0442\u0447\u0438\u043A\u0430\",\n \"zh-cn\": \"Status of the relay sensor on/off\",\n },\n this.ParseBool,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.StateAnalogVoltageSensor,\n new FanData(\n 1,\n \"sensors.stateAnalogVoltageSensor\",\n true,\n \"switch\",\n \"boolean\",\n {\n en: \"Status of the analog voltage sensor on/off\",\n de: \"Status des analogen Spannungssensors ein/aus\",\n ru: \"\u0421\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435 \u0430\u043D\u0430\u043B\u043E\u0433\u043E\u0432\u043E\u0433\u043E \u0434\u0430\u0442\u0447\u0438\u043A\u0430 \u043D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u044F \u0432\u043A\u043B/\u0432\u044B\u043A\u043B\",\n pt: \"Estado do sensor de tens\u00E3o anal\u00F3gico ligado/desligado\",\n nl: \"Status van de analoge spanningssensor aan/uit\",\n fr: \"\u00C9tat du capteur de tension analogique activ\u00E9/d\u00E9sactiv\u00E9\",\n it: \"Stato del sensore di tensione analogico on/off\",\n es: \"Estado del sensor anal\u00F3gico de tensi\u00F3n on/off\",\n pl: \"Stan w\u0142\u0105czenia/wy\u0142\u0105czenia analogowego czujnika napi\u0119cia\",\n uk: \"\u0421\u0442\u0430\u043D \u0443\u0432\u0456\u043C\u043A\u043D\u0435\u043D\u043D\u044F/\u0432\u0438\u043C\u043A\u043D\u0435\u043D\u043D\u044F \u0430\u043D\u0430\u043B\u043E\u0433\u043E\u0432\u043E\u0433\u043E \u0434\u0430\u0442\u0447\u0438\u043A\u0430 \u043D\u0430\u043F\u0440\u0443\u0433\u0438\",\n \"zh-cn\": \"Status of the analog voltage sensor on/off\",\n },\n this.ParseBool,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.TargetHumidityValue,\n new FanData(\n 1,\n \"sensors.targetHumidityValue\",\n true,\n \"level.humidity\",\n \"number\",\n {\n en: \"Humidity setpoint\",\n de: \"Sollwert der Luftfeuchtigkeit\",\n ru: \"\u0423\u0441\u0442\u0430\u0432\u043A\u0430 \u0432\u043B\u0430\u0436\u043D\u043E\u0441\u0442\u0438\",\n pt: \"Ponto de regula\u00E7\u00E3o da humidade\",\n nl: \"Vochtigheid instelpunt\",\n fr: \"Consigne d'humidit\u00E9\",\n it: \"Setpoint di umidit\u00E0\",\n es: \"Consigna de humedad\",\n pl: \"Warto\u015B\u0107 zadana wilgotno\u015Bci\",\n uk: \"\u0423\u0441\u0442\u0430\u0432\u043A\u0430 \u0432\u043E\u043B\u043E\u0433\u043E\u0441\u0442\u0456\",\n \"zh-cn\": \"Humidity setpoint\",\n },\n this.ParseByteNumber,\n \"%\",\n 40,\n 80,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.RtcBatteryVoltage,\n new FanData(\n 2,\n \"system.rtcBatteryVoltage\",\n false,\n \"level.battery\",\n \"number\",\n {\n en: \"Current RTC battery voltage\",\n de: \"Aktuelle RTC-Batteriespannung\",\n ru: \"\u0422\u0435\u043A\u0443\u0449\u0435\u0435 \u043D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u0435 \u0431\u0430\u0442\u0430\u0440\u0435\u0438 RTC\",\n pt: \"Tens\u00E3o atual da bateria RTC\",\n nl: \"Huidige RTC-batterijspanning\",\n fr: \"Tension actuelle de la pile RTC\",\n it: \"Tensione attuale della batteria RTC\",\n es: \"Tensi\u00F3n actual de la bater\u00EDa del RTC\",\n pl: \"Bie\u017C\u0105ce napi\u0119cie akumulatora RTC\",\n uk: \"\u041F\u043E\u0442\u043E\u0447\u043D\u0430 \u043D\u0430\u043F\u0440\u0443\u0433\u0430 \u0431\u0430\u0442\u0430\u0440\u0435\u0457 RTC\",\n \"zh-cn\": \"Current RTC battery voltage\",\n },\n this.ParseWordNumber,\n \"mV\",\n 0,\n 5000,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.CurrentHumidityValue,\n new FanData(\n 1,\n \"sensors.currentHumidityValue\",\n false,\n \"value.humidity\",\n \"number\",\n {\n en: \"Current humidity value\",\n de: \"Aktueller Feuchtigkeitswert\",\n ru: \"\u0422\u0435\u043A\u0443\u0449\u0435\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u0432\u043B\u0430\u0436\u043D\u043E\u0441\u0442\u0438\",\n pt: \"Valor atual da humidade\",\n nl: \"Huidige vochtigheidswaarde\",\n fr: \"Valeur actuelle de l'humidit\u00E9\",\n it: \"Valore attuale dell'umidit\u00E0\",\n es: \"Valor actual de humedad\",\n pl: \"Bie\u017C\u0105ca warto\u015B\u0107 wilgotno\u015Bci\",\n uk: \"\u041F\u043E\u0442\u043E\u0447\u043D\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F \u0432\u043E\u043B\u043E\u0433\u043E\u0441\u0442\u0456\",\n \"zh-cn\": \"Current humidity value\",\n },\n this.ParseByteNumber,\n \"%\",\n 0,\n 100,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.CurrentAnalogVoltageValue,\n new FanData(\n 1,\n \"sensors.currentAnalogVoltageValue\",\n false,\n \"value.voltage\",\n \"number\",\n {\n en: \"Current analog voltage value\",\n de: \"Aktueller analoger Spannungswert\",\n ru: \"\u0422\u0435\u043A\u0443\u0449\u0435\u0435 \u0430\u043D\u0430\u043B\u043E\u0433\u043E\u0432\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u043D\u0430\u043F\u0440\u044F\u0436\u0435\u043D\u0438\u044F\",\n pt: \"Valor atual da tens\u00E3o anal\u00F3gica\",\n nl: \"Huidige analoge spanningswaarde\",\n fr: \"Valeur de la tension analogique actuelle\",\n it: \"Valore attuale della tensione analogica\",\n es: \"Valor de tensi\u00F3n anal\u00F3gica actual\",\n pl: \"Bie\u017C\u0105ca warto\u015B\u0107 napi\u0119cia analogowego\",\n uk: \"\u041F\u043E\u0442\u043E\u0447\u043D\u0435 \u0430\u043D\u0430\u043B\u043E\u0433\u043E\u0432\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F \u043D\u0430\u043F\u0440\u0443\u0433\u0438\",\n \"zh-cn\": \"Current analog voltage value\",\n },\n this.ParseByteNumber,\n \"%\",\n 0,\n 100,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.CurrentRelaisValue,\n new FanData(\n 1,\n \"sensors.currentRelaisValue\",\n false,\n \"sensor\",\n \"boolean\",\n {\n en: \"Current value of the relay sensor\",\n de: \"Aktueller Wert des Relaissensors\",\n ru: \"\u0422\u0435\u043A\u0443\u0449\u0435\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u0434\u0430\u0442\u0447\u0438\u043A\u0430 \u0440\u0435\u043B\u0435\",\n pt: \"Valor atual do sensor do rel\u00E9\",\n nl: \"Huidige waarde van de relaissensor\",\n fr: \"Valeur actuelle du capteur relais\",\n it: \"Valore attuale del sensore a rel\u00E8\",\n es: \"Valor actual del sensor del rel\u00E9\",\n pl: \"Bie\u017C\u0105ca warto\u015B\u0107 czujnika przeka\u017Anika\",\n uk: \"\u041F\u043E\u0442\u043E\u0447\u043D\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F \u0434\u0430\u0442\u0447\u0438\u043A\u0430 \u0440\u0435\u043B\u0435\",\n \"zh-cn\": \"Current value of the relay sensor\",\n },\n this.ParseBool,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.ManualFanSpeed,\n new FanData(\n 1,\n \"fan.manualFanSpeed\",\n true,\n \"state\",\n \"number\",\n {\n en: \"Ventilation level of the fan in operation of the manual setting\",\n de: \"L\u00FCftungsstufe des Gebl\u00E4ses im Betrieb der manuellen Einstellung\",\n ru: \"\u0423\u0440\u043E\u0432\u0435\u043D\u044C \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0446\u0438\u0438 \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0442\u043E\u0440\u0430 \u0432 \u0440\u0435\u0436\u0438\u043C\u0435 \u0440\u0443\u0447\u043D\u043E\u0439 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438\",\n pt: \"N\u00EDvel de ventila\u00E7\u00E3o do ventilador em funcionamento da regula\u00E7\u00E3o manual\",\n nl: \"Ventilatieniveau van de ventilator bij gebruik van de handmatige instelling\",\n fr: \"Niveau de ventilation du ventilateur en mode manuel\",\n it: \"Livello di ventilazione del ventilatore in funzione dell'impostazione manuale\",\n es: \"Nivel de ventilaci\u00F3n del ventilador en funcionamiento de ajuste manual\",\n pl: \"Poziom wentylacji wentylatora w trybie r\u0119cznym\",\n uk: \"\u0420\u0456\u0432\u0435\u043D\u044C \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0446\u0456\u0457 \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0442\u043E\u0440\u0430 \u0432 \u0440\u0435\u0436\u0438\u043C\u0456 \u0440\u0443\u0447\u043D\u043E\u0433\u043E \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F\",\n \"zh-cn\": \"Ventilation level of the fan in operation of the manual setting\",\n },\n this.ParseByteNumber,\n \"\",\n 0,\n 255,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.FanSpeedFan1Rpm,\n new FanData(\n 2,\n \"fan.fanSpeedFan1Rpm\",\n false,\n \"state\",\n \"number\",\n {\n en: \"Ventilation level of fan no. 1\",\n de: \"L\u00FCftungsstufe des Ventilators Nr. 1\",\n ru: \"\u0423\u0440\u043E\u0432\u0435\u043D\u044C \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0446\u0438\u0438 \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0442\u043E\u0440\u0430 \u2116 1\",\n pt: \"N\u00EDvel de ventila\u00E7\u00E3o do ventilador n.\u00BA 1\",\n nl: \"Ventilatieniveau van ventilator nr. 1\",\n fr: \"Niveau de ventilation du ventilateur n\u00B0 1\",\n it: \"Livello di ventilazione del ventilatore n. 1\",\n es: \"Nivel de ventilaci\u00F3n del ventilador n\u00BA 1\",\n pl: \"Poziom wentylacji wentylatora nr 1\",\n uk: \"\u0420\u0456\u0432\u0435\u043D\u044C \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0446\u0456\u0457 \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0442\u043E\u0440\u0430 \u2116 1\",\n \"zh-cn\": \"Ventilation level of fan no. 1\",\n },\n this.ParseWordNumber,\n \"rpm\",\n ),\n );\n this.parameterDictionary.set(\n ParameterType.FanSpeedFan2Rpm,\n new FanData(\n 2,\n \"fan.fanSpeedFan2Rpm\",\n false,\n \"state\",\n \"number\",\n {\n en: \"Ventilation level of fan no. 2\",\n de: \"L\u00FCftungsstufe des Ventilators Nr. 2\",\n ru: \"\u0423\u0440\u043E\u0432\u0435\u043D\u044C \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0446\u0438\u0438 \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0442\u043E\u0440\u0430 \u2116 2\",\n pt: \"N\u00EDvel de ventila\u00E7\u00E3o do ventilador n.\u00BA 2\",\n nl: \"Ventilatieniveau van ventilator nr. 2\",\n fr: \"Niveau de ventilation du ventilateur n\u00B0 2\",\n it: \"Livello di ventilazione del ventilatore n. 2\",\n es: \"Nivel de ventilaci\u00F3n del ventilador n\u00BA 2\",\n pl: \"Poziom wentylacji wentylatora nr 2\",\n uk: \"\u0420\u0456\u0432\u0435\u043D\u044C \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0446\u0456\u0457 \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0442\u043E\u0440\u0430 \u2116 2\",\n \"zh-cn\": \"Ventilation level of fan no. 2\",\n },\n this.ParseWordNumber,\n \"rpm\",\n ),\n );\n this.parameterDictionary.set(\n ParameterType.FilterExchangeCountdown,\n new FanData(\n 3,\n \"fan.filterExchangeCountdown\",\n false,\n \"state\",\n \"string\",\n {\n en: \"Countdown of the timer until filter change\",\n de: \"Countdown des Timers bis zum Filterwechsel\",\n ru: \"\u041E\u0442\u0441\u0447\u0435\u0442 \u0442\u0430\u0439\u043C\u0435\u0440\u0430 \u0434\u043E \u0437\u0430\u043C\u0435\u043D\u044B \u0444\u0438\u043B\u044C\u0442\u0440\u0430\",\n pt: \"Contagem decrescente do temporizador at\u00E9 \u00E0 mudan\u00E7a do filtro\",\n nl: \"Aftellen van de timer tot filtervervanging\",\n fr: \"Compte \u00E0 rebours jusqu'au remplacement du filtre\",\n it: \"Conto alla rovescia del timer fino alla sostituzione del filtro\",\n es: \"Cuenta atr\u00E1s del temporizador hasta el cambio de filtro\",\n pl: \"Odliczanie czasu do wymiany filtra\",\n uk: \"\u0412\u0456\u0434\u043B\u0456\u043A \u0442\u0430\u0439\u043C\u0435\u0440\u0430 \u0434\u043E \u0437\u0430\u043C\u0456\u043D\u0438 \u0444\u0456\u043B\u044C\u0442\u0440\u0430\",\n \"zh-cn\": \"Countdown of the timer until filter change\",\n },\n this.ParseTimeSmallToLarge,\n \"dd:hh:mm\",\n ),\n );\n this.parameterDictionary.set(\n ParameterType.ResetFilterExchangeCountdown,\n new FanData(\n 1,\n \"fan.resetFilterExchangeCountdown\",\n true,\n \"button\",\n \"boolean\",\n {\n en: \"Reset the timer countdown to the filter change\",\n de: \"Zur\u00FCcksetzen des Timer-Countdowns f\u00FCr den Filterwechsel\",\n ru: \"\u0421\u0431\u0440\u043E\u0441\u044C\u0442\u0435 \u0442\u0430\u0439\u043C\u0435\u0440, \u043E\u0442\u0441\u0447\u0438\u0442\u044B\u0432\u0430\u044E\u0449\u0438\u0439 \u0432\u0440\u0435\u043C\u044F \u0434\u043E \u0437\u0430\u043C\u0435\u043D\u044B \u0444\u0438\u043B\u044C\u0442\u0440\u0430\",\n pt: \"Reiniciar a contagem decrescente do temporizador para a mudan\u00E7a do filtro\",\n nl: \"De timer voor het aftellen van de filtervervanging resetten\",\n fr: \"R\u00E9initialiser le compte \u00E0 rebours de la minuterie pour le remplacement du filtre\",\n it: \"Azzerare il conto alla rovescia del timer per la sostituzione del filtro\",\n es: \"Reinicia la cuenta atr\u00E1s del temporizador para el cambio de filtro\",\n pl: \"Zresetuj licznik odliczaj\u0105cy czas do wymiany filtra\",\n uk: \"\u0421\u043A\u0438\u043D\u0443\u0442\u0438 \u0432\u0456\u0434\u043B\u0456\u043A \u0442\u0430\u0439\u043C\u0435\u0440\u0430 \u0434\u043E \u0437\u0430\u043C\u0456\u043D\u0438 \u0444\u0456\u043B\u044C\u0442\u0440\u0430\",\n \"zh-cn\": \"Reset the timer countdown to the filter change\",\n },\n this.ParseNothing,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.BoostModeFollowUpTime,\n new FanData(\n 1,\n \"fan.boostModeFollowUpTime\",\n true,\n \"state\",\n \"number\",\n {\n en: \"Setpoint of the run-on time for boost mode\",\n de: \"Sollwert der Nachlaufzeit f\u00FCr den Boostbetrieb\",\n ru: \"\u0423\u0441\u0442\u0430\u0432\u043A\u0430 \u0432\u0440\u0435\u043C\u0435\u043D\u0438 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F \u0434\u043B\u044F \u0440\u0435\u0436\u0438\u043C\u0430 \u0444\u043E\u0440\u0441\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F\",\n pt: \"Ponto de regula\u00E7\u00E3o do tempo de arranque para o modo de impulso\",\n nl: \"Instelpunt van de aanlooptijd voor boostmodus\",\n fr: \"Point de consigne de la dur\u00E9e de fonctionnement en mode boost\",\n it: \"Setpoint del tempo di funzionamento in modalit\u00E0 boost\",\n es: \"Consigna del tiempo de marcha en inercia para el modo boost\",\n pl: \"Warto\u015B\u0107 zadana czasu rozruchu dla trybu do\u0142adowania\",\n uk: \"\u0423\u0441\u0442\u0430\u0432\u043A\u0430 \u0447\u0430\u0441\u0443 \u0432\u0438\u0431\u0456\u0433\u0443 \u0434\u043B\u044F \u0440\u0435\u0436\u0438\u043C\u0443 \u043F\u0440\u0438\u0441\u043A\u043E\u0440\u0435\u043D\u043D\u044F\",\n \"zh-cn\": \"Setpoint of the run-on time for boost mode\",\n },\n this.ParseByteNumber,\n \"min\",\n 0,\n 60,\n ),\n );\n\n ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n this.parameterDictionary.set(\n ParameterType.TriggerTimeSync,\n new FanData(\n 0,\n \"system.triggerRtcTimeSync\",\n true,\n \"button\",\n \"boolean\",\n {\n en: \"Synchronize time\",\n de: \"Zeit synchronisieren\",\n ru: \"\u0421\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0430\u0446\u0438\u044F \u0432\u0440\u0435\u043C\u0435\u043D\u0438\",\n pt: \"Sincronizar a hora\",\n nl: \"Tijd synchroniseren\",\n fr: \"Synchroniser l'heure\",\n it: \"Sincronizzare l'ora\",\n es: \"Sincronizar la hora\",\n pl: \"Synchronizacja czasu\",\n uk: \"\u0421\u0438\u043D\u0445\u0440\u043E\u043D\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0447\u0430\u0441\",\n \"zh-cn\": \"Synchronize time\",\n },\n this.ParseNothing,\n ),\n );\n\n this.parameterDictionary.set(\n ParameterType.RtcTime,\n new FanData(\n 3,\n \"system.rtcTime\",\n false,\n \"value.time\",\n \"string\",\n {\n en: \"RTC time\",\n de: \"RTC-Zeit\",\n ru: \"\u0412\u0440\u0435\u043C\u044F \u0420\u0422\u041A\",\n pt: \"Tempo RTC\",\n nl: \"RTC-tijd\",\n fr: \"Temps RTC\",\n it: \"Tempo RTC\",\n es: \"Hora RTC\",\n pl: \"Czas RTC\",\n uk: \"\u0427\u0430\u0441 \u0437\u0430 \u043A\u0438\u0457\u0432\u0441\u044C\u043A\u0438\u043C \u0447\u0430\u0441\u043E\u043C\",\n \"zh-cn\": \"RTC time\",\n },\n this.ParseTimeSmallToLarge,\n \"hh:mm:ss\",\n ),\n );\n this.parameterDictionary.set(\n ParameterType.RtcDate,\n new FanData(\n 4,\n \"system.rtcCalendar\",\n false,\n \"value.date\",\n \"string\",\n {\n en: \"RTC calendar\",\n de: \"RTC-Kalender\",\n ru: \"\u041A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u044C \u0420\u0422\u041A\",\n pt: \"Calend\u00E1rio RTC\",\n nl: \"RTC-kalender\",\n fr: \"Calendrier RTC\",\n it: \"Calendario RTC\",\n es: \"Calendario RTC\",\n pl: \"Kalendarz RTC\",\n uk: \"\u041A\u0430\u043B\u0435\u043D\u0434\u0430\u0440 RTC\",\n \"zh-cn\": \"RTC calendar\",\n },\n this.ParseRtcDate,\n \"dd.mm.yy\",\n ),\n );\n this.parameterDictionary.set(\n ParameterType.TimeControlledMode,\n new FanData(\n 1,\n \"fan.timeControlledMode\",\n true,\n \"switch\",\n \"boolean\",\n {\n en: \"Time-controlled operation\",\n de: \"Zeitgesteuerter Betrieb\",\n ru: \"\u0420\u0430\u0431\u043E\u0442\u0430 \u0441 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u0435\u043C \u0432\u0440\u0435\u043C\u0435\u043D\u0438\",\n pt: \"Funcionamento com controlo de tempo\",\n nl: \"Tijdgestuurde werking\",\n fr: \"Fonctionnement \u00E0 temps contr\u00F4l\u00E9\",\n it: \"Funzionamento a tempo\",\n es: \"Funcionamiento temporizado\",\n pl: \"Dzia\u0142anie sterowane czasem\",\n uk: \"\u0420\u0435\u0433\u0443\u043B\u044C\u043E\u0432\u0430\u043D\u0430 \u0437\u0430 \u0447\u0430\u0441\u043E\u043C \u0440\u043E\u0431\u043E\u0442\u0430\",\n \"zh-cn\": \"Time-controlled operation\",\n },\n this.ParseBool,\n ),\n );\n\n // this.parameterDictionary.set(ParameterType.TimeControlSchedule, 6);\n // this.parameterDictionary.set(ParameterType.SearchFanId, 16);\n // this.parameterDictionary.set(ParameterType.FanPassword, -1);\n\n this.parameterDictionary.set(\n ParameterType.OperatingTime,\n new FanData(\n 4,\n \"system.operatingTime\",\n false,\n \"state\",\n \"string\",\n {\n en: \"Operating hours\",\n de: \"Betriebsstunden\",\n ru: \"\u0427\u0430\u0441\u044B \u0440\u0430\u0431\u043E\u0442\u044B\",\n pt: \"Horas de funcionamento\",\n nl: \"Bedrijfsuren\",\n fr: \"Heures de fonctionnement\",\n it: \"Orario di funzionamento\",\n es: \"Horas de funcionamiento\",\n pl: \"Godziny pracy\",\n uk: \"\u0413\u043E\u0434\u0438\u043D\u0438 \u0440\u043E\u0431\u043E\u0442\u0438\",\n \"zh-cn\": \"Operating hours\",\n },\n this.ParseOperatingTime,\n \"ddddd:hh:mm\",\n ),\n );\n this.parameterDictionary.set(\n ParameterType.ResetAlarms,\n new FanData(\n 1,\n \"system.resetAlarms\",\n true,\n \"button\",\n \"boolean\",\n {\n en: \"Reset alarms\",\n de: \"Alarme zur\u00FCcksetzen\",\n ru: \"\u0421\u0431\u0440\u043E\u0441 \u0441\u0438\u0433\u043D\u0430\u043B\u043E\u0432 \u0442\u0440\u0435\u0432\u043E\u0433\u0438\",\n pt: \"Repor alarmes\",\n nl: \"Reset alarmen\",\n fr: \"R\u00E9initialisation des alarmes\",\n it: \"Ripristino degli allarmi\",\n es: \"Restablecer alarmas\",\n pl: \"Resetowanie alarm\u00F3w\",\n uk: \"\u0421\u043A\u0438\u0434\u0430\u043D\u043D\u044F \u0442\u0440\u0438\u0432\u043E\u0433\",\n \"zh-cn\": \"Reset alarms\",\n },\n this.ParseNothing,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.AlarmState,\n new FanData(\n 1,\n \"system.alarmState\",\n false,\n \"switch\",\n \"string\",\n {\n en: \"Alarm/warning display\",\n de: \"Alarm-/Warnungsanzeige\",\n ru: \"\u0418\u043D\u0434\u0438\u043A\u0430\u0446\u0438\u044F \u0441\u0438\u0433\u043D\u0430\u043B\u043E\u0432 \u0442\u0440\u0435\u0432\u043E\u0433\u0438/\u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0439\",\n pt: \"Indica\u00E7\u00E3o de alarme/aviso\",\n nl: \"Weergave alarm/waarschuwing\",\n fr: \"Affichage des alarmes et avertissements\",\n it: \"Display di allarme/avviso\",\n es: \"Indicaci\u00F3n de alarma/aviso\",\n pl: \"Wy\u015Bwietlacz alarmu/ostrze\u017Cenia\",\n uk: \"\u0406\u043D\u0434\u0438\u043A\u0430\u0446\u0456\u044F \u0442\u0440\u0438\u0432\u043E\u0433\u0438/\u043F\u043E\u043F\u0435\u0440\u0435\u0434\u0436\u0435\u043D\u043D\u044F\",\n \"zh-cn\": \"Alarm/warning display\",\n },\n this.ParseAlarmWarningState,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.CloudServerEnabled,\n new FanData(\n 1,\n \"network.cloudServerEnabled\",\n false,\n \"switch\",\n \"boolean\",\n {\n en: \"Approval of operation via cloud server\",\n de: \"Freigabe des Betriebs \u00FCber Cloud-Server\",\n ru: \"\u0423\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u0435 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0439 \u0447\u0435\u0440\u0435\u0437 \u043E\u0431\u043B\u0430\u0447\u043D\u044B\u0439 \u0441\u0435\u0440\u0432\u0435\u0440\",\n pt: \"Aprova\u00E7\u00E3o da opera\u00E7\u00E3o atrav\u00E9s do servidor em nuvem\",\n nl: \"Goedkeuring van werking via cloudserver\",\n fr: \"Approbation de l'op\u00E9ration via un serveur en nuage\",\n it: \"Approvazione del funzionamento tramite server cloud\",\n es: \"Aprobaci\u00F3n del funcionamiento a trav\u00E9s del servidor en nube\",\n pl: \"Zatwierdzanie operacji za po\u015Brednictwem serwera w chmurze\",\n uk: \"\u0417\u0430\u0442\u0432\u0435\u0440\u0434\u0436\u0435\u043D\u043D\u044F \u0440\u043E\u0431\u043E\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 \u0445\u043C\u0430\u0440\u043D\u0438\u0439 \u0441\u0435\u0440\u0432\u0435\u0440\",\n \"zh-cn\": \"Approval of operation via cloud server\",\n },\n this.ParseBool,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.FirmwareVersionAndDate,\n new FanData(\n 6,\n \"system.firmwareVersionAndDate\",\n false,\n \"info.firmware\",\n \"string\",\n {\n en: \"Firmware version and date of the control unit\",\n de: \"Firmware-Version und Datum des Steuerger\u00E4ts\",\n ru: \"\u0412\u0435\u0440\u0441\u0438\u044F \u0438 \u0434\u0430\u0442\u0430 \u043F\u0440\u043E\u0448\u0438\u0432\u043A\u0438 \u0431\u043B\u043E\u043A\u0430 \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F\",\n pt: \"Vers\u00E3o e data do firmware da unidade de controlo\",\n nl: \"Firmwareversie en -datum van de besturingseenheid\",\n fr: \"Version et date du micrologiciel de l'unit\u00E9 de contr\u00F4le\",\n it: \"Versione e data del firmware della centralina\",\n es: \"Versi\u00F3n y fecha del firmware de la unidad de control\",\n pl: \"Wersja i data oprogramowania uk\u0142adowego jednostki steruj\u0105cej\",\n uk: \"\u0412\u0435\u0440\u0441\u0456\u044F \u043F\u0440\u043E\u0448\u0438\u0432\u043A\u0438 \u0442\u0430 \u0434\u0430\u0442\u0430 \u0432\u0438\u043F\u0443\u0441\u043A\u0443 \u0431\u043B\u043E\u043A\u0443 \u0443\u043F\u0440\u0430\u0432\u043B\u0456\u043D\u043D\u044F\",\n \"zh-cn\": \"Firmware version and date of the control unit\",\n },\n this.ParseFirmware,\n ),\n );\n\n // this.parameterDictionary.set(ParameterType.ResetFactoryDefaults, 1);\n\n ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n this.parameterDictionary.set(\n ParameterType.FilterExchangeNecessary,\n new FanData(\n 1,\n \"fan.filterExchangeNecessary\",\n false,\n \"state\",\n \"boolean\",\n {\n en: \"Filter change indicator\",\n de: \"Filterwechselanzeige\",\n ru: \"\u0418\u043D\u0434\u0438\u043A\u0430\u0442\u043E\u0440 \u0437\u0430\u043C\u0435\u043D\u044B \u0444\u0438\u043B\u044C\u0442\u0440\u0430\",\n pt: \"Indicador de mudan\u00E7a de filtro\",\n nl: \"Indicator voor filtervervanging\",\n fr: \"Indicateur de changement de filtre\",\n it: \"Indicatore di sostituzione del filtro\",\n es: \"Indicador de cambio de filtro\",\n pl: \"Wska\u017Anik wymiany filtra\",\n uk: \"\u0406\u043D\u0434\u0438\u043A\u0430\u0442\u043E\u0440 \u0437\u0430\u043C\u0456\u043D\u0438 \u0444\u0456\u043B\u044C\u0442\u0440\u0430\",\n \"zh-cn\": \"Filter change indicator\",\n },\n this.ParseBool,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.WifiOperatingMode,\n new FanData(\n 1,\n \"network.wifiOperatingMode\",\n false,\n \"state\",\n \"string\",\n {\n en: \"WLAN operation mode\",\n de: \"WLAN-Betriebsart\",\n ru: \"\u0420\u0435\u0436\u0438\u043C \u0440\u0430\u0431\u043E\u0442\u044B WLAN\",\n pt: \"Modo de funcionamento WLAN\",\n nl: \"WLAN-bedieningsmodus\",\n fr: \"Mode de fonctionnement WLAN\",\n it: \"Modalit\u00E0 di funzionamento WLAN\",\n es: \"Modo de funcionamiento WLAN\",\n pl: \"Tryb pracy WLAN\",\n uk: \"\u0420\u0435\u0436\u0438\u043C \u0440\u043E\u0431\u043E\u0442\u0438 WLAN\",\n \"zh-cn\": \"WLAN operation mode\",\n },\n this.ParseWifiMode,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.WifiName,\n new FanData(\n -1,\n \"network.wifiName\",\n false,\n \"state\",\n \"string\",\n {\n en: \"WLAN name in client mode\",\n de: \"WLAN-Name im Client-Modus\",\n ru: \"\u0418\u043C\u044F \u0431\u0435\u0441\u043F\u0440\u043E\u0432\u043E\u0434\u043D\u043E\u0439 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E\u0439 \u0441\u0435\u0442\u0438 \u0432 \u0440\u0435\u0436\u0438\u043C\u0435 \u043A\u043B\u0438\u0435\u043D\u0442\u0430\",\n pt: \"Nome da WLAN no modo de cliente\",\n nl: \"WLAN-naam in clientmodus\",\n fr: \"Nom du WLAN en mode client\",\n it: \"Nome della WLAN in modalit\u00E0 client\",\n es: \"Nombre de la WLAN en modo cliente\",\n pl: \"Nazwa sieci WLAN w trybie klienta\",\n uk: \"\u0406\u043C'\u044F \u0431\u0435\u0437\u0434\u0440\u043E\u0442\u043E\u0432\u043E\u0457 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E\u0457 \u043C\u0435\u0440\u0435\u0436\u0456 \u0432 \u0440\u0435\u0436\u0438\u043C\u0456 \u043A\u043B\u0456\u0454\u043D\u0442\u0430\",\n \"zh-cn\": \"WLAN name in client mode\",\n },\n this.ParseText,\n ),\n );\n // this.parameterDictionary.set(ParameterType.WifiPassword, -1);\n this.parameterDictionary.set(\n ParameterType.WifiEncryptionMode,\n new FanData(\n 1,\n \"network.wifiEncryptionMode\",\n false,\n \"state\",\n \"string\",\n {\n en: \"WLAN encryption technology\",\n de: \"WLAN-Verschl\u00FCsselungstechnologie\",\n ru: \"\u0422\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u044F \u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u044F WLAN\",\n pt: \"Tecnologia de encripta\u00E7\u00E3o WLAN\",\n nl: \"WLAN-coderingstechnologie\",\n fr: \"Technologie de cryptage WLAN\",\n it: \"Tecnologia di crittografia WLAN\",\n es: \"Tecnolog\u00EDa de cifrado WLAN\",\n pl: \"Technologia szyfrowania WLAN\",\n uk: \"\u0422\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0456\u044F \u0448\u0438\u0444\u0440\u0443\u0432\u0430\u043D\u043D\u044F WLAN\",\n \"zh-cn\": \"WLAN encryption technology\",\n },\n this.ParseWifiEncryptionMode,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.WifiChannel,\n new FanData(\n 1,\n \"network.wifiChannel\",\n false,\n \"state\",\n \"number\",\n {\n en: \"WLAN channel frequency\",\n de: \"WLAN-Kanalfrequenz\",\n ru: \"\u0427\u0430\u0441\u0442\u043E\u0442\u0430 \u043A\u0430\u043D\u0430\u043B\u0430 WLAN\",\n pt: \"Frequ\u00EAncia do canal WLAN\",\n nl: \"WLAN-kanaalfrequentie\",\n fr: \"Fr\u00E9quence du canal WLAN\",\n it: \"Frequenza del canale WLAN\",\n es: \"Frecuencia del canal WLAN\",\n pl: \"Cz\u0119stotliwo\u015B\u0107 kana\u0142u WLAN\",\n uk: \"\u0427\u0430\u0441\u0442\u043E\u0442\u0430 \u043A\u0430\u043D\u0430\u043B\u0443 WLAN\",\n \"zh-cn\": \"WLAN channel frequency\",\n },\n this.ParseByteNumber,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.WifiIpMode,\n new FanData(\n 1,\n \"network.wifiIpMode\",\n false,\n \"state\",\n \"string\",\n {\n en: \"WLAN module DHCP\",\n de: \"WLAN-Modul DHCP\",\n ru: \"\u041C\u043E\u0434\u0443\u043B\u044C WLAN DHCP\",\n pt: \"M\u00F3dulo WLAN DHCP\",\n nl: \"WLAN-module DHCP\",\n fr: \"Module WLAN DHCP\",\n it: \"Modulo WLAN DHCP\",\n es: \"M\u00F3dulo WLAN DHCP\",\n pl: \"Modu\u0142 WLAN DHCP\",\n uk: \"\u041C\u043E\u0434\u0443\u043B\u044C \u0431\u0435\u0437\u0434\u0440\u043E\u0442\u043E\u0432\u043E\u0457 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E\u0457 \u043C\u0435\u0440\u0435\u0436\u0456 DHCP\",\n \"zh-cn\": \"WLAN module DHCP\",\n },\n this.ParseWifiIpMode,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.WifiIp,\n new FanData(\n 4,\n \"network.wifiIpMode\",\n false,\n \"info.ip\",\n \"string\",\n {\n en: \"Assigned IP address of the WLAN module\",\n de: \"Zugewiesene IP-Adresse des WLAN-Moduls\",\n ru: \"\u041D\u0430\u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044B\u0439 IP-\u0430\u0434\u0440\u0435\u0441 \u043C\u043E\u0434\u0443\u043B\u044F WLAN\",\n pt: \"Endere\u00E7o IP atribu\u00EDdo ao m\u00F3dulo WLAN\",\n nl: \"Toegewezen IP-adres van de WLAN-module\",\n fr: \"Adresse IP attribu\u00E9e au module WLAN\",\n it: \"Indirizzo IP assegnato del modulo WLAN\",\n es: \"Direcci\u00F3n IP asignada del m\u00F3dulo WLAN\",\n pl: \"Przypisany adres IP modu\u0142u WLAN\",\n uk: \"\u041F\u0440\u0438\u0441\u0432\u043E\u0454\u043D\u0430 IP-\u0430\u0434\u0440\u0435\u0441\u0430 \u043C\u043E\u0434\u0443\u043B\u044F WLAN\",\n \"zh-cn\": \"Assigned IP address of the WLAN module\",\n },\n this.ParseIpV4Value,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.WifiSubnetMask,\n new FanData(\n 4,\n \"network.wifiSubnetMask\",\n false,\n \"info.ip\",\n \"string\",\n {\n en: \"Subnet mask of the WLAN module\",\n de: \"Subnetzmaske des WLAN-Moduls\",\n ru: \"\u041C\u0430\u0441\u043A\u0430 \u043F\u043E\u0434\u0441\u0435\u0442\u0438 \u043C\u043E\u0434\u0443\u043B\u044F WLAN\",\n pt: \"M\u00E1scara de sub-rede do m\u00F3dulo WLAN\",\n nl: \"Subnetmasker van de WLAN-module\",\n fr: \"Masque de sous-r\u00E9seau du module WLAN\",\n it: \"Maschera di sottorete del modulo WLAN\",\n es: \"M\u00E1scara de subred del m\u00F3dulo WLAN\",\n pl: \"Maska podsieci modu\u0142u WLAN\",\n uk: \"\u041C\u0430\u0441\u043A\u0430 \u043F\u0456\u0434\u043C\u0435\u0440\u0435\u0436\u0456 \u043C\u043E\u0434\u0443\u043B\u044F WLAN\",\n \"zh-cn\": \"Subnet mask of the WLAN module\",\n },\n this.ParseIpV4Value,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.WifiGateway,\n new FanData(\n 4,\n \"network.wifiGateway\",\n false,\n \"info.ip\",\n \"string\",\n {\n en: \"Main gateway of the WLAN module\",\n de: \"Haupt-Gateway des WLAN-Moduls\",\n ru: \"\u0413\u043B\u0430\u0432\u043D\u044B\u0439 \u0448\u043B\u044E\u0437 \u043C\u043E\u0434\u0443\u043B\u044F WLAN\",\n pt: \"Gateway principal do m\u00F3dulo WLAN\",\n nl: \"Hoofdgateway van de WLAN-module\",\n fr: \"Passerelle principale du module WLAN\",\n it: \"Gateway principale del modulo WLAN\",\n es: \"Pasarela principal del m\u00F3dulo WLAN\",\n pl: \"Brama g\u0142\u00F3wna modu\u0142u WLAN\",\n uk: \"\u0413\u043E\u043B\u043E\u0432\u043D\u0438\u0439 \u0448\u043B\u044E\u0437 \u043C\u043E\u0434\u0443\u043B\u044F WLAN\",\n \"zh-cn\": \"Main gateway of the WLAN module\",\n },\n this.ParseIpV4Value,\n ),\n );\n // this.parameterDictionary.set(ParameterType.ExitWifiSetupAndSafe, 1);\n // this.parameterDictionary.set(ParameterType.ExitWifiSetupAndDiscard, 1);\n this.parameterDictionary.set(\n ParameterType.CurrentWifiIp,\n new FanData(\n 4,\n \"network.currentWifiIp\",\n false,\n \"info.ip\",\n \"string\",\n {\n en: \"Current IP address of the WLAN module\",\n de: \"Aktuelle IP-Adresse des WLAN-Moduls\",\n ru: \"\u0422\u0435\u043A\u0443\u0449\u0438\u0439 IP-\u0430\u0434\u0440\u0435\u0441 \u043C\u043E\u0434\u0443\u043B\u044F WLAN\",\n pt: \"Endere\u00E7o IP atual do m\u00F3dulo WLAN\",\n nl: \"Huidig IP-adres van de WLAN-module\",\n fr: \"Adresse IP actuelle du module WLAN\",\n it: \"Indirizzo IP attuale del modulo WLAN\",\n es: \"Direcci\u00F3n IP actual del m\u00F3dulo WLAN\",\n pl: \"Aktualny adres IP modu\u0142u WLAN\",\n uk: \"\u041F\u043E\u0442\u043E\u0447\u043D\u0430 IP-\u0430\u0434\u0440\u0435\u0441\u0430 \u043C\u043E\u0434\u0443\u043B\u044F \u0431\u0435\u0437\u0434\u0440\u043E\u0442\u043E\u0432\u043E\u0457 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E\u0457 \u043C\u0435\u0440\u0435\u0436\u0456\",\n \"zh-cn\": \"Current IP address of the WLAN module\",\n },\n this.ParseIpV4Value,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.FanOperatingMode,\n new FanData(\n 1,\n \"fan.fanOperatingMode\",\n true,\n \"state\",\n \"mixed\",\n {\n en: \"Operating mode of the fan\",\n de: \"Betriebsart des Ventilators\",\n ru: \"\u0420\u0435\u0436\u0438\u043C \u0440\u0430\u0431\u043E\u0442\u044B \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0442\u043E\u0440\u0430\",\n pt: \"Modo de funcionamento do ventilador\",\n nl: \"Werkingsmodus van de ventilator\",\n fr: \"Mode de fonctionnement du ventilateur\",\n it: \"Modalit\u00E0 di funzionamento del ventilatore\",\n es: \"Modo de funcionamiento del ventilador\",\n pl: \"Tryb pracy wentylatora\",\n uk: \"\u0420\u0435\u0436\u0438\u043C \u0440\u043E\u0431\u043E\u0442\u0438 \u0432\u0435\u043D\u0442\u0438\u043B\u044F\u0442\u043E\u0440\u0430\",\n \"zh-cn\": \"Operating mode of the fan\",\n },\n this.ParseOperatingMode,\n \"\",\n 0,\n 2,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.TargetAnalogVoltageValue,\n new FanData(\n 1,\n \"sensors.targetAnalogVoltageValue\",\n true,\n \"state\",\n \"number\",\n {\n en: \"Setpoint of the sensor 0-10 V\",\n de: \"Sollwert des Sensors 0-10 V\",\n ru: \"\u0423\u0441\u0442\u0430\u0432\u043A\u0430 \u0434\u0430\u0442\u0447\u0438\u043A\u0430 0-10 \u0412\",\n pt: \"Ponto de regula\u00E7\u00E3o do sensor 0-10 V\",\n nl: \"Instelpunt van de sensor 0-10 V\",\n fr: \"Point de consigne du capteur 0-10 V\",\n it: \"Setpoint del sensore 0-10 V\",\n es: \"Consigna del sensor 0-10 V\",\n pl: \"Warto\u015B\u0107 zadana czujnika 0-10 V\",\n uk: \"\u0423\u0441\u0442\u0430\u0432\u043A\u0430 \u0434\u0430\u0442\u0447\u0438\u043A\u0430 0-10 \u0412\",\n \"zh-cn\": \"Setpoint of the sensor 0-10 V\",\n },\n this.ParseByteNumber,\n \"%\",\n 5,\n 100,\n ),\n );\n this.parameterDictionary.set(\n ParameterType.FanType,\n new FanData(\n 2,\n \"system.fanType\",\n false,\n \"state\",\n \"string\",\n {\n en: \"System type\",\n de: \"Anlagentyp\",\n ru: \"\u0422\u0438\u043F \u0441\u0438\u0441\u0442\u0435\u043C\u044B\",\n pt: \"Tipo de sistema\",\n nl: \"Type systeem\",\n fr: \"Type de syst\u00E8me\",\n it: \"Tipo di sistema\",\n es: \"Tipo de sistema\",\n pl: \"Typ systemu\",\n uk: \"\u0422\u0438\u043F \u0441\u0438\u0441\u0442\u0435\u043C\u0438\",\n \"zh-cn\": \"System type\",\n },\n this.ParseSystemType,\n ),\n );\n }\n}\n"], + "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAwD;AAExD,IAAK,eAAL,kBAAKA,kBAAL;AACI,EAAAA,4BAAA,eAAY,KAAZ;AACA,EAAAA,4BAAA,UAAO,KAAP;AAEA,EAAAA,4BAAA,eAAY,KAAZ;AAGA,EAAAA,4BAAA,cAAW,KAAX;AAPC,SAAAA;AAAA,GAAA;AAUE,IAAK,gBAAL,kBAAKC,mBAAL;AACH,EAAAA,8BAAA,cAAW,KAAX;AACA,EAAAA,8BAAA,kBAAe,KAAf;AACA,EAAAA,8BAAA,gBAAa,KAAb;AACA,EAAAA,8BAAA,eAAY,KAAZ;AACA,EAAAA,8BAAA,oBAAiB,MAAjB;AACA,EAAAA,8BAAA,yBAAsB,MAAtB;AACA,EAAAA,8BAAA,uBAAoB,MAApB;AACA,EAAAA,8BAAA,8BAA2B,MAA3B;AACA,EAAAA,8BAAA,yBAAsB,MAAtB;AACA,EAAAA,8BAAA,uBAAoB,MAApB;AACA,EAAAA,8BAAA,0BAAuB,MAAvB;AACA,EAAAA,8BAAA,+BAA4B,MAA5B;AACA,EAAAA,8BAAA,wBAAqB,MAArB;AACA,EAAAA,8BAAA,oBAAiB,MAAjB;AACA,EAAAA,8BAAA,qBAAkB,MAAlB;AACA,EAAAA,8BAAA,qBAAkB,MAAlB;AACA,EAAAA,8BAAA,6BAA0B,OAA1B;AACA,EAAAA,8BAAA,kCAA+B,OAA/B;AACA,EAAAA,8BAAA,2BAAwB,OAAxB;AACA,EAAAA,8BAAA,qBAAkB,OAAlB;AACA,EAAAA,8BAAA,aAAU,OAAV;AACA,EAAAA,8BAAA,aAAU,OAAV;AACA,EAAAA,8BAAA,wBAAqB,OAArB;AACA,EAAAA,8BAAA,yBAAsB,OAAtB;AACA,EAAAA,8BAAA,iBAAc,OAAd;AACA,EAAAA,8BAAA,iBAAc,OAAd;AACA,EAAAA,8BAAA,mBAAgB,OAAhB;AACA,EAAAA,8BAAA,iBAAc,OAAd;AACA,EAAAA,8BAAA,gBAAa,OAAb;AACA,EAAAA,8BAAA,wBAAqB,OAArB;AACA,EAAAA,8BAAA,4BAAyB,OAAzB;AACA,EAAAA,8BAAA,0BAAuB,OAAvB;AACA,EAAAA,8BAAA,6BAA0B,OAA1B;AACA,EAAAA,8BAAA,uBAAoB,OAApB;AACA,EAAAA,8BAAA,cAAW,OAAX;AACA,EAAAA,8BAAA,kBAAe,OAAf;AACA,EAAAA,8BAAA,wBAAqB,OAArB;AACA,EAAAA,8BAAA,iBAAc,OAAd;AACA,EAAAA,8BAAA,gBAAa,OAAb;AACA,EAAAA,8BAAA,YAAS,OAAT;AACA,EAAAA,8BAAA,oBAAiB,OAAjB;AACA,EAAAA,8BAAA,iBAAc,OAAd;AACA,EAAAA,8BAAA,0BAAuB,OAAvB;AACA,EAAAA,8BAAA,6BAA0B,OAA1B;AACA,EAAAA,8BAAA,mBAAgB,OAAhB;AACA,EAAAA,8BAAA,sBAAmB,OAAnB;AACA,EAAAA,8BAAA,8BAA2B,OAA3B;AACA,EAAAA,8BAAA,aAAU,OAAV;AAhDQ,SAAAA;AAAA,GAAA;AAqDL,MAAM,QAAQ;AAAA,EACjB,YACI,OACA,cACA,aACA,SACA,SACA,MACA,eACA,SACA,UACA,UACF;AACE,SAAK,QAAQ;AACb,SAAK,eAAe;AACpB,SAAK,cAAc;AACnB,SAAK,UAAU;AACf,SAAK,UAAU;AACf,SAAK,UAAU;AACf,SAAK,OAAO;AACZ,SAAK,gBAAgB;AACrB,SAAK,WAAW;AAChB,SAAK,WAAW;AAAA,EACpB;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AACJ;AAEO,MAAM,eAAe;AAAA,EACjB,cAAc;AAEjB,SAAK,eAAe,CAAC,IAAI;AACzB,SAAK,eAAe,CAAC,IAAI;AAGzB,SAAK,eAAe,CAAC,IAAI;AAGzB,SAAK,eAAe,CAAC,IAAI;AAEzB,SAAK,cAAc;AAEnB,SAAK,wBAAwB;AAAA,EACjC;AAAA,EAEO,cAAc,UAAkB,aAA8B;AACjE,QAAI,SAAS,UAAU;AAAI,aAAO;AAElC,QAAI,YAAY,UAAU;AAAG,aAAO;AAGpC,SAAK,cAAc;AAGnB,SAAK,eAAe,MAAM,UAAU,KAAK,WAAW;AACpD,SAAK,eAAe,SAAS;AAG7B,SAAK,eAAe,KAAK,WAAW,IAAI,YAAY;AACpD,SAAK;AAGL,SAAK,eAAe,MAAM,aAAa,KAAK,WAAW;AACvD,SAAK,eAAe,YAAY;AAEhC,SAAK,mBAAmB;AACxB,SAAK,mBAAmB;AAExB,WAAO;AAAA,EACX;AAAA,EAEO,cAAoB;AACvB,UAAM,WAAW,KAAK,kBAAkB,KAAK,eAAe,SAAS,GAAG,KAAK,WAAW,CAAC;AAEzF,SAAK,eAAe,KAAK,WAAW,IAAI,WAAW;AACnD,SAAK;AAEL,SAAK,eAAe,KAAK,WAAW,IAAI,YAAY;AACpD,SAAK;AAAA,EACT;AAAA;AAAA,EAIO,eAAqB;AACxB,SAAK,gBAAgB,YAAiB;AACtC,SAAK,aAAa,gBAAsB;AAAA,EAC5C;AAAA,EAEO,cAAc,UAAyB;AAC1C,SAAK,gBAAgB,iBAAsB;AAC3C,UAAM,OAAO,OAAO,MAAM,CAAC;AAE3B,QAAI;AAAU,WAAK,CAAC,IAAI;AAAA;AACnB,WAAK,CAAC,IAAI;AACf,SAAK,aAAa,kBAAwB,IAAI;AAAA,EAClD;AAAA,EAEO,mBAAyB;AAC5B,SAAK,gBAAgB,YAAiB;AACtC,SAAK,aAAa,oBAA0B;AAAA,EAChD;AAAA,EAEO,kBAAkB,QAAsB;AAC3C,SAAK,gBAAgB,iBAAsB;AAC3C,UAAM,OAAO,OAAO,MAAM,CAAC;AAC3B,SAAK,CAAC,IAAI;AACV,YAAQ,IAAI,qBAAqB,KAAK,CAAC,CAAC;AACxC,SAAK,aAAa,sBAA4B,IAAI;AAAA,EACtD;AAAA,EAEO,iBAAuB;AAC1B,SAAK,gBAAgB,YAAiB;AACtC,SAAK,aAAa,kBAAwB;AAAA,EAC9C;AAAA,EAEO,sBAA4B;AAC/B,SAAK,gBAAgB,YAAiB;AACtC,SAAK,aAAa,iBAAuB;AACzC,SAAK,aAAa,uBAA4B;AAAA,EAClD;AAAA,EAEO,eAAe,QAAsB;AACxC,SAAK,gBAAgB,iBAAsB;AAC3C,UAAM,OAAO,OAAO,MAAM,CAAC;AAC3B,SAAK,CAAC,IAAI;AACV,SAAK,aAAa,mBAAyB,IAAI;AAAA,EACnD;AAAA,EAEO,0BAAgC;AACnC,SAAK,gBAAgB,YAAiB;AACtC,SAAK,aAAa,4BAAiC;AAAA,EACvD;AAAA,EAEO,yBAAyB,UAAyB;AACrD,SAAK,gBAAgB,iBAAsB;AAC3C,UAAM,OAAO,OAAO,MAAM,CAAC;AAE3B,QAAI;AAAU,WAAK,CAAC,IAAI;AAAA;AACnB,WAAK,CAAC,IAAI;AACf,SAAK,aAAa,8BAAmC,IAAI;AAAA,EAC7D;AAAA,EAEO,wBAA8B;AACjC,SAAK,gBAAgB,YAAiB;AACtC,SAAK,aAAa,0BAA+B;AAAA,EACrD;AAAA,EAEO,uBAAuB,UAAyB;AACnD,SAAK,gBAAgB,iBAAsB;AAC3C,UAAM,OAAO,OAAO,MAAM,CAAC;AAE3B,QAAI;AAAU,WAAK,CAAC,IAAI;AAAA;AACnB,WAAK,CAAC,IAAI;AACf,SAAK,aAAa,4BAAiC,IAAI;AAAA,EAC3D;AAAA,EAEO,+BAAqC;AACxC,SAAK,gBAAgB,YAAiB;AACtC,SAAK,aAAa,iCAAsC;AAAA,EAC5D;AAAA,EAEO,8BAA8B,UAAyB;AAC1D,SAAK,gBAAgB,iBAAsB;AAC3C,UAAM,OAAO,OAAO,MAAM,CAAC;AAE3B,QAAI;AAAU,WAAK,CAAC,IAAI;AAAA;AACnB,WAAK,CAAC,IAAI;AACf,SAAK,aAAa,mCAAwC,IAAI;AAAA,EAClE;AAAA,EAEO,0BAAgC;AACnC,SAAK,gBAAgB,YAAiB;AACtC,SAAK,aAAa,4BAAiC;AAAA,EACvD;AAAA,EAEO,yBAAyB,QAAsB;AAClD,SAAK,gBAAgB,iBAAsB;AAC3C,UAAM,OAAO,OAAO,MAAM,CAAC;AAE3B,SAAK,CAAC,IAAI;AACV,SAAK,aAAa,8BAAmC,IAAI;AAAA,EAC7D;AAAA,EAEO,iBAAuB;AAC1B,SAAK,gBAAgB,YAAiB;AACtC,SAAK,aAAa,0BAA+B;AAAA,EACrD;AAAA,EAEO,sBAA4B;AAC/B,SAAK,gBAAgB,YAAiB;AACtC,SAAK,aAAa,6BAAkC;AAAA,EACxD;AAAA,EAEO,2BAAiC;AACpC,SAAK,gBAAgB,YAAiB;AACtC,SAAK,aAAa,kCAAuC;AAAA,EAC7D;AAAA,EAEO,yBAA+B;AAClC,SAAK,gBAAgB,YAAiB;AACtC,SAAK,aAAa,2BAAgC;AAAA,EACtD;AAAA,EAEO,qBAA2B;AAC9B,SAAK,gBAAgB,YAAiB;AACtC,SAAK,aAAa,uBAA4B;AAAA,EAClD;AAAA,EAEO,oBAAoB,QAAsB;AAC7C,SAAK,gBAAgB,iBAAsB;AAC3C,UAAM,OAAO,OAAO,MAAM,CAAC;AAE3B,SAAK,CAAC,IAAI;AACV,SAAK,aAAa,yBAA8B,IAAI;AAAA,EACxD;AAAA,EAEO,gBAAsB;AACzB,SAAK,gBAAgB,YAAiB;AACtC,SAAK,aAAa,wBAA6B;AAAA,EACnD;AAAA,EAEO,gBAAsB;AACzB,SAAK,gBAAgB,YAAiB;AACtC,SAAK,aAAa,wBAA6B;AAAA,EACnD;AAAA,EAEO,8BAAoC;AACvC,SAAK,gBAAgB,YAAiB;AACtC,SAAK,aAAa,iCAAqC;AAAA,EAC3D;AAAA,EAEO,oCAA0C;AAC7C,SAAK,gBAAgB,iBAAsB;AAC3C,UAAM,YAAY,OAAO,MAAM,CAAC;AAEhC,cAAU,CAAC,IAAI;AACf,SAAK,aAAa,wCAA4C,SAAS;AAAA,EAC3E;AAAA,EAEO,4BAAkC;AACrC,SAAK,gBAAgB,YAAiB;AACtC,SAAK,aAAa,+BAAmC;AAAA,EACzD;AAAA,EAEO,2BAA2B,QAAsB;AACpD,SAAK,gBAAgB,iBAAsB;AAC3C,UAAM,OAAO,OAAO,MAAM,CAAC;AAE3B,SAAK,CAAC,IAAI;AACV,SAAK,aAAa,iCAAqC,IAAI;AAAA,EAC/D;AAAA,EAEO,kBAAwB;AAC3B,SAAK,gBAAgB,YAAiB;AACtC,SAAK,aAAa,iBAAqB;AACvC,SAAK,aAAa,iBAAqB;AAAA,EAC3C;AAAA,EAEO,iBAAiB,UAAyB;AAE7C,SAAK,gBAAgB,iBAAsB;AAE3C,UAAM,UAAU,OAAO,MAAM,CAAC;AAC9B,YAAQ,CAAC,IAAI,SAAS,WAAW;AACjC,YAAQ,CAAC,IAAI,SAAS,WAAW;AACjC,YAAQ,CAAC,IAAI,SAAS,SAAS;AAE/B,UAAM,UAAU,OAAO,MAAM,CAAC;AAC9B,YAAQ,CAAC,IAAI,SAAS,QAAQ;AAC9B,YAAQ,CAAC,IAAI,SAAS,OAAO;AAC7B,YAAQ,CAAC,IAAI,SAAS,SAAS,IAAI;AACnC,YAAQ,CAAC,IAAI,SAAS,YAAY,IAAI;AAEtC,SAAK,aAAa,mBAAuB,OAAO;AAChD,SAAK,aAAa,mBAAuB,OAAO;AAEhD,WAAO;AAAA,EACX;AAAA,EAEO,yBAA+B;AAClC,SAAK,gBAAgB,YAAiB;AACtC,SAAK,aAAa,4BAAgC;AAAA,EACtD;AAAA,EAEO,wBAAwB,UAAyB;AACpD,SAAK,gBAAgB,iBAAsB;AAC3C,UAAM,OAAO,OAAO,MAAM,CAAC;AAE3B,QAAI;AAAU,WAAK,CAAC,IAAI;AAAA;AACnB,WAAK,CAAC,IAAI;AACf,SAAK,aAAa,8BAAkC,IAAI;AAAA,EAC5D;AAAA,EAEO,oBAA0B;AAC7B,SAAK,gBAAgB,YAAiB;AACtC,SAAK,aAAa,uBAA2B;AAAA,EACjD;AAAA,EAEO,iBAAuB;AAC1B,SAAK,gBAAgB,YAAiB;AACtC,SAAK,aAAa,oBAAwB;AAAA,EAC9C;AAAA,EAEO,uBAA6B;AAChC,SAAK,gBAAgB,iBAAsB;AAC3C,UAAM,iBAAiB,OAAO,MAAM,CAAC;AAErC,mBAAe,CAAC,IAAI;AACpB,SAAK,aAAa,uBAA2B,cAAc;AAAA,EAC/D;AAAA,EAEO,yBAA+B;AAClC,SAAK,gBAAgB,YAAiB;AACtC,SAAK,aAAa,4BAAgC;AAAA,EACtD;AAAA,EAEO,eAAqB;AACxB,SAAK,gBAAgB,YAAiB;AACtC,SAAK,aAAa,gCAAoC;AAAA,EAC1D;AAAA,EAEO,8BAAoC;AACvC,SAAK,gBAAgB,YAAiB;AACtC,SAAK,aAAa,iCAAqC;AAAA,EAC3D;AAAA,EAEO,eAAqB;AACxB,SAAK,gBAAgB,YAAiB;AACtC,SAAK,aAAa,2BAA+B;AACjD,SAAK,aAAa,kBAAsB;AACxC,SAAK,aAAa,sBAA0B;AAC5C,SAAK,aAAa,4BAAgC;AAClD,SAAK,aAAa,qBAAyB;AAC3C,SAAK,aAAa,oBAAwB;AAC1C,SAAK,aAAa,gBAAoB;AACtC,SAAK,aAAa,wBAA4B;AAC9C,SAAK,aAAa,qBAAyB;AAC3C,SAAK,aAAa,uBAA2B;AAAA,EACjD;AAAA,EAEO,oBAA0B;AAC7B,SAAK,gBAAgB,YAAiB;AACtC,SAAK,aAAa,0BAA8B;AAAA,EACpD;AAAA,EAEO,mBAAmB,QAAsB;AAC5C,SAAK,gBAAgB,iBAAsB;AAC3C,UAAM,OAAO,OAAO,MAAM,CAAC;AAE3B,SAAK,CAAC,IAAI;AACV,SAAK,aAAa,4BAAgC,IAAI;AAAA,EAC1D;AAAA,EAEO,+BAAqC;AACxC,SAAK,gBAAgB,YAAiB;AACtC,SAAK,aAAa,kCAAsC;AAAA,EAC5D;AAAA,EAEO,8BAA8B,QAAsB;AACvD,SAAK,gBAAgB,iBAAsB;AAC3C,UAAM,OAAO,OAAO,MAAM,CAAC;AAE3B,SAAK,CAAC,IAAI;AACV,SAAK,aAAa,oCAAwC,IAAI;AAAA,EAClE;AAAA,EAEO,cAAoB;AACvB,SAAK,gBAAgB,YAAiB;AACtC,SAAK,aAAa,iBAAqB;AAAA,EAC3C;AAAA;AAAA,EAIA,IAAW,iBAAyB;AAChC,WAAO,OAAO,KAAK,KAAK,eAAe,SAAS,GAAG,KAAK,WAAW,CAAC;AAAA,EACxE;AAAA,EAEO,kBAAkB,WAA+B;AArc5D;AAscQ,UAAM,SAAS,KAAK,cAAc,SAAS;AAC3C,UAAM,SAAS,IAAI,4BAAW;AAE9B,QAAI,aAAa,QAAW;AACxB,aAAO,SAAS,+BAAc;AAC9B,aAAO;AAAA,IACX;AAEA,QAAI,UAAU,+BAAc,IAAI;AAC5B,aAAO,SAAS;AAChB,aAAO;AAAA,IACX;AAEA,SAAK,aAAa;AAGlB,WAAO,WAAW,UAAU,SAAS,KAAK,YAAY,KAAK,aAAa,EAAE,EAAE,SAAS;AAGrF,SAAK,cAAc;AAGnB,SAAK,eAAc,eAAU,GAAG,KAAK,UAAU,MAA5B,YAAiC;AAGpD,SAAK;AAEL,QAAI,gBAAgB;AAEpB,QAAI,UAAU,GAAG,KAAK,UAAU,KAAK,kBAAuB;AACxD,sBAAgB;AAAA,IACpB;AAGA,SAAK;AAEL,QAAI,eAAe;AACf,aAAO,KAAK,aAAa,UAAU,SAAS,GAAG;AAC3C,aAAK,cAAc,KAAK,UAAU,UAAU,SAAS,KAAK,UAAU,GAAG,OAAO,YAAY;AAAA,MAC9F;AAEA,aAAO;AAAA,IACX;AAEA,WAAO,SAAS,+BAAc;AAC9B,WAAO;AAAA,EACX;AAAA,EAEQ,UAAU,MAAc,cAAsC;AAtf1E;AAufQ,QAAI,SAAS;AACb,QAAI,4BAA4B;AAEhC,YAAQ,KAAK,GAAG,MAAM,GAAG;AAAA,MACrB,KAAK;AACD;AACA,qCAA4B,UAAK,GAAG,MAAM,MAAd,YAAmB;AAC/C;AACA;AAAA,MAGJ,KAAK;AACD;AAEA;AACA;AAAA,IACR;AAEA,UAAM,aAAa,KAAK,GAAG,MAAM;AACjC;AAEA,QAAI,KAAK,oBAAoB,IAAI,UAAU,GAAG;AAC1C,YAAM,UAAU,KAAK,oBAAoB,IAAI,UAAU;AAEvD,UAAI,WAAW,QAAW;AACtB,cAAM,aAAa,IAAI,8BAAa;AACpC,mBAAW,gBAAe,wCAAS,iBAAT,YAAyB;AAEnD,mBAAW,SACP,wCAAS,cAAc,KAAK,SAAS,QAAQ,SAAS,yBAAyB,OAA/E,YAAqF;AAEzF,qBAAa,KAAK,UAAU;AAAA,MAChC;AAAA,IACJ;AAEA,UAAM,eAAe,SAAS;AAE9B,WAAO;AAAA,EACX;AAAA,EAEA,IAAW,iBAA8C;AACrD,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAIA,iBAAyB,OAAO,MAAM,GAAG;AAAA,EACzC,cAAsB;AAAA,EACtB,aAAqB;AAAA,EAErB,mBAA4B;AAAA,EAC5B,mBAAiC;AAAA;AAAA,EAGjC,sBAAmD,oBAAI,IAAqB;AAAA;AAAA,EAIpE,cAAc,YAAmC;AACrD,QAAI,WAAW,GAAG,CAAC,KAAK,OAAQ,WAAW,GAAG,CAAC,KAAK,KAAM;AACtD,aAAO,+BAAc;AAAA,IACzB;AAEA,QAAI,WAAW,GAAG,CAAC,KAAK,GAAM;AAC1B,aAAO,+BAAc;AAAA,IACzB;AAEA,QAAI,WAAW,GAAG,CAAC,KAAK,IAAM;AAC1B,aAAO,+BAAc;AAAA,IACzB;AAEA,UAAM,sBAAsB,KAAK,kBAAkB,WAAW,SAAS,GAAG,WAAW,SAAS,CAAC,CAAC;AAChG,UAAM,oBAAoB,WAAW,WAAW,SAAS,CAAC,KAAK,WAAW,WAAW,SAAS,CAAC,KAAK;AAEpG,QAAI,uBAAuB,mBAAmB;AAC1C,aAAO,+BAAc;AAAA,IACzB;AAEA,WAAO,+BAAc;AAAA,EACzB;AAAA,EAEQ,gBAAgB,eAAmC;AACvD,QAAI,KAAK,kBAAkB;AACvB,WAAK,mBAAmB;AAAA,IAC5B,OAAO;AACH,UAAI,iBAAiB,KAAK,kBAAkB;AAExC;AAAA,MACJ,OAAO;AACH,aAAK,eAAe,KAAK,WAAW,IAAI;AACxC,aAAK;AAAA,MACT;AAAA,IACJ;AAEA,SAAK,eAAe,KAAK,WAAW,IAAI;AACxC,SAAK;AAEL,SAAK,mBAAmB;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,aAAa,YAA2B,QAAuB,MAAe;AAjmB1F;AAkmBQ,UAAM,gBAAgB,KAAK,oBAAoB,IAAI,UAAU;AAG7D,QAAI,iBAAiB;AAAW,aAAO;AAEvC,QAAI,cAAc,SAAS,GAAG;AAC1B,UAAI,KAAK,oBAAoB,cAAmB;AAE5C,aAAK,eAAe,KAAK,WAAW,IAAI;AACxC,aAAK;AAGL,aAAK,eAAe,KAAK,WAAW,IAAI,cAAc;AACtD,aAAK;AAAA,MACT;AAAA,IACJ;AAEA,SAAK,eAAe,KAAK,WAAW,IAAI;AACxC,SAAK;AAEL,QAAI,KAAK,oBAAoB,mBAAwB;AACjD,UAAI,SAAS;AAAM,eAAO;AAE1B,UAAI,MAAM,UAAU;AAAG,aAAK,eAAe,YAAW,WAAM,GAAG,CAAC,MAAV,YAAe,GAAG,KAAK,WAAW;AAAA;AACnF,aAAK,eAAe,MAAM,MAAM,SAAS,GAAG,KAAK,WAAW;AAEjE,WAAK,eAAe,MAAM;AAAA,IAC9B;AAEA,WAAO;AAAA,EACX;AAAA,EAEQ,kBAAkB,OAA2B;AACjD,QAAI,WAAW;AAEf,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,kBAAY,MAAM,CAAC;AAAA,IACvB;AAEA,WAAO,WAAW;AAAA,EACtB;AAAA,EAEQ,cAAc,OAAoC;AA5oB9D;AA6oBQ,UAAM,UAAS,WAAM,GAAG,CAAC,MAAV,YAAe,QAAO,WAAM,GAAG,CAAC,MAAV,YAAe,MAAM;AAC1D,WAAO,IAAI,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK;AAAA,EAClF;AAAA,EAEQ,UAAU,MAAmC;AAjpBzD;AAkpBQ,aAAQ,UAAK,GAAG,CAAC,MAAT,YAAc,KAAK;AAAA,MACvB,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX;AACI;AAAA,IACR;AAEA,WAAO;AAAA,EACX;AAAA,EAEQ,gBAAgB,MAAmC;AA9pB/D;AA+pBQ,YAAO,UAAK,GAAG,CAAC,MAAT,YAAc;AAAA,EACzB;AAAA,EAEQ,gBAAgB,OAAoC;AAlqBhE;AAmqBQ,aAAQ,WAAM,GAAG,CAAC,MAAV,YAAe,OAAO,WAAM,GAAG,CAAC,MAAV,YAAe,MAAM;AAAA,EACvD;AAAA,EAEQ,eAAe,MAAmC;AAtqB9D;AAuqBQ,aAAQ,UAAK,GAAG,CAAC,MAAT,YAAc,KAAK;AAAA,MACvB,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,IACf;AACA,WAAO;AAAA,EACX;AAAA,EAEQ,kBAAkB,MAAmC;AAlrBjE;AAmrBQ,aAAQ,UAAK,GAAG,CAAC,MAAT,YAAc,KAAK;AAAA,MACvB,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,IACf;AACA,WAAO;AAAA,EACX;AAAA,EAEQ,sBAAsB,OAAoC;AAhsBtE;AAisBQ,WAAO,IAAG,WAAM,GAAG,CAAC,MAAV,mBAAa,WAAW,SAAS,GAAG,IAAI,KAAI,WAAM,GAAG,CAAC,MAAV,mBAAa,WAAW,SAAS,GAAG,IAAI,KAAI,WAAM,GAAG,CAAC,MAAV,mBAAa,WAAW,SAAS,GAAG,IAAI;AAAA,EAC9I;AAAA,EAEQ,aAAa,OAAoC;AApsB7D;AAqsBQ,WAAO,IAAG,WAAM,GAAG,CAAC,MAAV,mBAAa,WAAW,SAAS,GAAG,IAAI,KAAI,WAAM,GAAG,CAAC,MAAV,mBAAa,WAAW,SAAS,GAAG,IAAI,KAAI,WAAM,GAAG,CAAC,MAAV,mBAAa,WAAW,SAAS,GAAG,IAAI,KAAK,MAAM,GAAG,CAAC,CAAC;AAAA,EAC9J;AAAA,EAEQ,mBAAmB,OAAoC;AAxsBnE;AAysBQ,WAAO,KAAI,WAAM,GAAG,CAAC,MAAV,YAAe,OAAO,WAAM,GAAG,CAAC,MAAV,YAAe,MAAM,CAAE,KAAI,WAAM,GAAG,CAAC,MAAV,mBAAa,WAAW,SAAS,GAAG,IAAI,KAAI,WAAM,GAAG,CAAC,MAAV,mBAAa,WAAW,SAAS,GAAG,IAAI;AAAA,EACpJ;AAAA,EAEQ,uBAAuB,MAAmC;AA5sBtE;AA6sBQ,aAAQ,UAAK,GAAG,CAAC,MAAT,YAAc,KAAK;AAAA,MACvB,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,IACf;AACA,WAAO;AAAA,EACX;AAAA,EAEQ,cAAc,MAAmC;AAxtB7D;AAytBQ,aAAQ,UAAK,GAAG,CAAC,MAAT,YAAc,KAAK;AAAA,MACvB,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,IACf;AACA,WAAO;AAAA,EACX;AAAA,EAEQ,UAAU,OAAoC;AAClD,WAAO,MAAM,SAAS;AAAA,EAC1B;AAAA,EAEQ,wBAAwB,MAAmC;AAtuBvE;AAuuBQ,aAAQ,UAAK,GAAG,CAAC,MAAT,YAAc,KAAK;AAAA,MACvB,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,IACf;AACA,WAAO;AAAA,EACX;AAAA,EAEQ,gBAAgB,MAAmC;AApvB/D;AAqvBQ,aAAQ,UAAK,GAAG,CAAC,MAAT,YAAc,KAAK;AAAA,MACvB,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,IACf;AACA,WAAO;AAAA,EACX;AAAA,EAEQ,eAAe,OAAoC;AACvD,WAAO,GAAG,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC;AAAA,EACtE;AAAA,EAEQ,mBAAmB,MAAmC;AAlwBlE;AAmwBQ,aAAQ,UAAK,GAAG,CAAC,MAAT,YAAc,KAAK;AAAA,MACvB,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,IACf;AACA,WAAO;AAAA,EACX;AAAA,EAEQ,gBAAgB,OAAoC;AA9wBhE;AA+wBQ,aAAQ,WAAM,GAAG,CAAC,MAAV,YAAe,KAAK;AAAA,MACxB,KAAK;AACD,eAAO;AAAA,IACf;AACA,WAAO;AAAA,EACX;AAAA,EAEQ,aAAa,GAAgC;AACjD,WAAO;AAAA,EACX;AAAA,EAEQ,0BAAgC;AACpC,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,QACL;AAAA,MACJ;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,QACL;AAAA,MACJ;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,QACL;AAAA,MACJ;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,QACL;AAAA,MACJ;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACJ;AAGA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ;AAEA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,QACL;AAAA,MACJ;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,QACL;AAAA,MACJ;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ;AAMA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,QACL;AAAA,MACJ;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ;AAMA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ;AAEA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ;AAGA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACJ;AACA,SAAK,oBAAoB;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ;AAAA,EACJ;AACJ;", "names": ["FunctionType", "ParameterType"] } diff --git a/build/main.js b/build/main.js index 68c5494..6931a0d 100644 --- a/build/main.js +++ b/build/main.js @@ -158,6 +158,7 @@ class OxxifyFanControl extends utils.Adapter { this.udpServer.close(); callback(); } catch (e) { + this.log.error(e.toString()); callback(); } } diff --git a/build/main.js.map b/build/main.js.map index c246671..b3c645a 100644 --- a/build/main.js.map +++ b/build/main.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/main.ts"], - "sourcesContent": ["/*\n * Created with @iobroker/create-adapter v2.6.5\n */\n\n// The adapter-core module gives you access to the core ioBroker functions\n// you need to create an adapter\nimport * as utils from \"@iobroker/adapter-core\";\n\n// Load your modules here, e.g.:\n// import * as fs from \"fs\";\nimport * as DateTime from \"date-and-time\";\nimport * as udp from \"dgram\";\nimport * as NTP from \"ntp-time\";\nimport Queue from \"queue-fifo\";\nimport { DataToSend, ReceivedData } from \"./lib/ModelData\";\nimport * as Oxxify from \"./lib/OxxifyProtocol\";\n\ntype FanRemoteEndpoint = { strIpAddress: string; strPassword: string };\n\nclass OxxifyFanControl extends utils.Adapter {\n public constructor(options: Partial = {}) {\n super({\n ...options,\n name: \"oxxify-fan-control\",\n });\n this.on(\"ready\", this.onReady.bind(this));\n this.on(\"stateChange\", this.onStateChange.bind(this));\n this.on(\"unload\", this.onUnload.bind(this));\n\n this.udpServer = udp.createSocket(\"udp4\");\n }\n\n /**\n * Is called when databases are connected and adapter received configuration.\n */\n private async onReady(): Promise {\n // Initialize your adapter here\n\n // Reset the connection indicator during startup\n await this.setState(\"info.connection\", false, true);\n\n this.log.debug(`NTP-Server: ${this.config.ntpServer}`);\n this.log.debug(`Fan data polling invervall: ${this.config.pollingInterval} seconds`);\n\n this.ntpClient = new NTP.Client(this.config.ntpServer);\n\n if (typeof this.config.fans == \"undefined\" || this.config.fans.length == 0) {\n this.log.error(\"Please set at least one vent in the adapter configuration!\");\n return;\n }\n\n await this.extendObject(\"devices\", {\n type: \"channel\",\n common: {\n name: {\n en: \"Devices\",\n de: \"Ger\u00E4te\",\n ru: \"\u0423\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u0430\",\n pt: \"Dispositivos\",\n nl: \"Apparaten\",\n fr: \"Dispositifs\",\n it: \"Dispositivi\",\n es: \"Dispositivos\",\n pl: \"Urz\u0105dzenia\",\n uk: \"\u041F\u0440\u0438\u0441\u0442\u0440\u043E\u0457\",\n \"zh-cn\": \"Devices\",\n },\n role: undefined,\n },\n native: {},\n });\n\n const dataDictionary = this.protocolBuilder.DataDictionary;\n\n this.config.fans.forEach(async (element) => {\n this.log.debug('Fan configured: \"' + element.name + '\": ' + element.id + \" - \" + element.ipaddr);\n\n await this.extendObject(\"devices.\" + element.id, {\n type: \"channel\",\n common: {\n name: element.name,\n role: undefined,\n },\n });\n\n dataDictionary.forEach(async (value: Oxxify.FanData) => {\n await this.extendObject(\"devices.\" + element.id + \".\" + value.strIdentifer, {\n type: \"state\",\n common: {\n name: value.name,\n role: value.strRole,\n read: true,\n write: value.bIsWritable,\n type: value.strType,\n unit: value.strUnit,\n min: value.minValue,\n max: value.maxValue,\n },\n });\n });\n });\n\n // In order to get state updates, you need to subscribe to them. The following line adds a subscription for our variable we have created above.\n // You can also add a subscription for multiple states. The following line watches all states starting with \"lights.\"\n // this.subscribeStates(\"lights.*\");\n // Or, if you really must, you can also watch all states. Don\"t do this if you don\"t need to. Otherwise this will cause a lot of unnecessary load on the system:\n this.subscribeStates(\"devices.*.fan.*\");\n this.subscribeStates(\"devices.*.sensors.state*\");\n this.subscribeStates(\"devices.*.sensors.target*\");\n this.subscribeStates(\"devices.*.system.triggerRtcTimeSync\");\n this.subscribeStates(\"devices.*.system.resetAlarms\");\n\n // emits when any error occurs\n this.udpServer.on(\"error\", (error) => {\n this.log.error(\"Error: \" + error);\n this.udpServer.close();\n });\n\n // emits on new datagram msg\n this.udpServer.on(\"message\", async (msg, info) => {\n // Reset the connection indicator during startup\n await this.setState(\"info.connection\", true, true);\n\n this.log.silly(\n `Received ${msg.length} bytes from ${info.address}:${info.port} - Data: ${msg.toString(\"hex\")}`,\n );\n const data = this.protocolBuilder.ParseResponseData(msg);\n\n if (data.receivedData.length > 0) {\n data.receivedData.forEach(async (value: ReceivedData) => {\n await this.setState(\"devices.\" + data.strFanId + \".\" + value.strIdentifer, value.value, true);\n });\n }\n });\n\n this.udpServer.bind(4001);\n\n // emits when socket is ready and listening for datagram msgs\n this.udpServer.on(\"listening\", async () => {\n const address = this.udpServer.address();\n const port = address.port;\n const family = address.family;\n const ipaddr = address.address;\n this.log.debug(\"Server is listening at: \" + ipaddr + \":\" + port + \" (\" + family + \")\");\n\n this.ReadAllFanData(true);\n });\n\n //emits after the socket is closed using socket.close();\n this.udpServer.on(\"close\", () => {\n this.log.warn(\"Socket is closed\");\n });\n\n this.queneInterval = this.setInterval(() => {\n if (this.sendQuene.isEmpty() == false) {\n const sendData = this.sendQuene.dequeue();\n\n if (sendData != null) {\n this.log.silly(\n \"Sending \" + sendData.data.toString(\"hex\") + \" to \" + sendData.ipAddress + \":\" + 4000,\n );\n this.udpServer.send(sendData.data, 4000, sendData.ipAddress, (err) => {\n if (err != null) this.log.error(err.message);\n });\n }\n }\n }, 25);\n\n this.pollingInterval = this.setInterval(() => {\n this.ReadAllFanData(false);\n }, this.config.pollingInterval * 1000);\n }\n\n /**\n * Is called when adapter shuts down - callback has to be called under any circumstances!\n */\n private onUnload(callback: () => void): void {\n try {\n // Here you must clear all timeouts or intervals that may still be active\n // clearTimeout(timeout1);\n // clearTimeout(timeout2);\n // ...\n this.clearInterval(this.queneInterval);\n this.clearInterval(this.pollingInterval);\n\n this.udpServer.close();\n\n callback();\n } catch (e) {\n callback();\n }\n }\n\n /**\n * Is called if a subscribed state changes\n */\n private onStateChange(strStateIdentifier: string, state: ioBroker.State | null | undefined): void {\n if (state) {\n // The state was changed\n this.log.silly(`state ${strStateIdentifier} changed: ${state.val} (ack = ${state.ack})`);\n\n if (state.ack == false) {\n const strFanId = this.ParseFanId(strStateIdentifier);\n\n if (strFanId) {\n const fanData = this.GetFanDataFromConfig(strFanId);\n\n if (fanData) {\n switch (strStateIdentifier.split(\".\").pop()) {\n case \"boostModeFollowUpTime\":\n this.WriteBoostModeFollowUpTime(strFanId, fanData, state.val);\n break;\n\n case \"fanOperatingMode\":\n this.WriteOperatingMode(strFanId, fanData, state.val);\n break;\n\n case \"fanSpeedMode\":\n this.WriteFanSpeedMode(strFanId, fanData, state.val);\n break;\n\n case \"fanState\":\n this.WriteFanState(strFanId, fanData, state.val);\n break;\n\n case \"manualFanSpeed\":\n this.WriteManualFanSpeed(strFanId, fanData, state.val);\n break;\n\n case \"resetFilterExchangeCountdown\":\n this.ResetFilterExchangeCountdown(strFanId, fanData);\n break;\n\n case \"timeControlledMode\":\n this.WriteTimeControlledMode(strFanId, fanData, state.val);\n break;\n\n case \"timerMode\":\n this.WriteTimerMode(strFanId, fanData, state.val);\n break;\n\n case \"stateAnalogVoltageSensor\":\n this.WriteAnalogVoltageSensorState(strFanId, fanData, state.val);\n break;\n\n case \"stateHumiditySensor\":\n this.WriteHumiditySensorState(strFanId, fanData, state.val);\n break;\n\n case \"stateRelaisSensor\":\n this.WriteRelaisSensorState(strFanId, fanData, state.val);\n break;\n\n case \"targetAnalogVoltageValue\":\n this.WriteTargetAnalogVoltageValue(strFanId, fanData, state.val);\n break;\n\n case \"targetHumidityValue\":\n this.WriteTargetHumidityValue(strFanId, fanData, state.val);\n break;\n\n case \"resetAlarms\":\n this.ResetAlarms(strFanId, fanData);\n break;\n\n case \"triggerRtcTimeSync\":\n this.SyncRtcClock(strFanId, fanData);\n break;\n }\n }\n }\n }\n } else {\n // The state was deleted\n this.log.info(`state ${strStateIdentifier} deleted`);\n }\n }\n\n private ReadAllFanData(bIncludeConstData: boolean): void {\n this.config.fans.forEach((element) => {\n this.protocolBuilder.StartNewFrame(element.id, element.password);\n this.protocolBuilder.ReadFanState();\n this.protocolBuilder.ReadFanSpeedMode();\n this.protocolBuilder.ReadOperatingMode();\n this.protocolBuilder.ReadOperatingTime();\n this.protocolBuilder.ReadBoostState();\n this.protocolBuilder.ReadBoostModeFollowUpTime();\n this.protocolBuilder.ReadRtcBattery();\n this.protocolBuilder.ReadAnalogVoltageSensorState();\n this.protocolBuilder.ReadAlarmState();\n this.protocolBuilder.ReadCloudServerEnabled();\n this.protocolBuilder.ReadHumiditySensorState();\n this.protocolBuilder.ReadRelaisSensorState();\n this.protocolBuilder.ReadCurrentAnalogVoltage();\n this.protocolBuilder.ReadCurrentHumidity();\n this.protocolBuilder.ReadCurrentRelaisState();\n this.protocolBuilder.ReadManualFanSpeed();\n this.protocolBuilder.ReadFan1Speed();\n this.protocolBuilder.ReadFan2Speed();\n this.protocolBuilder.ReadFilterExchangeCountdown();\n this.protocolBuilder.ReadFilterExchangeNecessary();\n this.protocolBuilder.ReadWifiData();\n this.protocolBuilder.ReadTimerModeValues();\n this.protocolBuilder.ReadTargetAnalogVoltageValue();\n this.protocolBuilder.ReadTargetHumidityValue();\n this.protocolBuilder.ReadTimeControlledMode();\n this.protocolBuilder.ReadRtcDateTime();\n if (bIncludeConstData) {\n this.protocolBuilder.ReadFanType();\n this.protocolBuilder.ReadFirmware();\n }\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n this.sendQuene.enqueue(new DataToSend(packet, element.ipaddr));\n });\n }\n\n private ParseFanId(strId: string): string | undefined {\n const strFanIdRegex = \"[0-9A-Fa-f]{16}\";\n const match = strId.match(strFanIdRegex);\n\n if (match) {\n return match.toString();\n }\n\n return undefined;\n }\n\n private GetFanDataFromConfig(strFanId: string): FanRemoteEndpoint | undefined {\n const data = this.config.fans.find((f) => f.id == strFanId);\n\n if (data == undefined) return undefined;\n\n return { strIpAddress: data.ipaddr, strPassword: data.password };\n }\n\n private WriteBoostModeFollowUpTime(strFanId: string, fanData: FanRemoteEndpoint, value: ioBroker.StateValue): void {\n if (typeof value !== \"number\") {\n this.log.warn(\"The value is not from type number.\");\n return;\n }\n\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.WriteBoostModeFollowUpTime(Number(value));\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n this.sendQuene.enqueue(new DataToSend(packet, fanData.strIpAddress));\n }\n\n private WriteOperatingMode(strFanId: string, fanData: FanRemoteEndpoint, value: ioBroker.StateValue): void {\n const nValue = this.ParseInputNumber(value);\n\n if (isNaN(nValue)) return;\n\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.WriteOperatingMode(nValue);\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n this.sendQuene.enqueue(new DataToSend(packet, fanData.strIpAddress));\n }\n\n private WriteFanSpeedMode(strFanId: string, fanData: FanRemoteEndpoint, value: ioBroker.StateValue): void {\n const nValue = this.ParseInputNumber(value);\n\n if (isNaN(nValue)) return;\n\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.WriteFanSpeedMode(nValue);\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n this.sendQuene.enqueue(new DataToSend(packet, fanData.strIpAddress));\n }\n\n private WriteFanState(strFanId: string, fanData: FanRemoteEndpoint, value: ioBroker.StateValue): void {\n if (typeof value !== \"boolean\") {\n this.log.warn(`The value is not from type boolean.`);\n return;\n }\n\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.WriteFanState(Boolean(value));\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n this.sendQuene.enqueue(new DataToSend(packet, fanData.strIpAddress));\n }\n\n private WriteManualFanSpeed(strFanId: string, fanData: FanRemoteEndpoint, value: ioBroker.StateValue): void {\n if (typeof value !== \"number\") {\n this.log.warn(\"The value is not from type number.\");\n return;\n }\n\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.WriteManualFanSpeed(Number(value));\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n this.sendQuene.enqueue(new DataToSend(packet, fanData.strIpAddress));\n }\n\n private ResetFilterExchangeCountdown(strFanId: string, fanData: FanRemoteEndpoint): void {\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.WriteResetFilterExchangeCountdown();\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n this.sendQuene.enqueue(new DataToSend(packet, fanData.strIpAddress));\n }\n\n private WriteTimeControlledMode(strFanId: string, fanData: FanRemoteEndpoint, value: ioBroker.StateValue): void {\n if (typeof value !== \"boolean\") {\n this.log.warn(`The value is not from type boolean.`);\n return;\n }\n\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.WriteTimeControlledMode(Boolean(value));\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n this.sendQuene.enqueue(new DataToSend(packet, fanData.strIpAddress));\n }\n\n private WriteTimerMode(strFanId: string, fanData: FanRemoteEndpoint, value: ioBroker.StateValue): void {\n const nValue = this.ParseInputNumber(value);\n\n if (isNaN(nValue)) return;\n\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.WriteTimerMode(nValue);\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n this.sendQuene.enqueue(new DataToSend(packet, fanData.strIpAddress));\n }\n\n private WriteAnalogVoltageSensorState(\n strFanId: string,\n fanData: FanRemoteEndpoint,\n value: ioBroker.StateValue,\n ): void {\n if (typeof value !== \"boolean\") {\n this.log.warn(`The value is not from type boolean.`);\n return;\n }\n\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.WriteAnalogVoltageSensorState(Boolean(value));\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n this.sendQuene.enqueue(new DataToSend(packet, fanData.strIpAddress));\n }\n\n private WriteHumiditySensorState(strFanId: string, fanData: FanRemoteEndpoint, value: ioBroker.StateValue): void {\n if (typeof value !== \"boolean\") {\n this.log.warn(`The value is not from type boolean.`);\n return;\n }\n\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.WriteHumiditySensorState(Boolean(value));\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n this.sendQuene.enqueue(new DataToSend(packet, fanData.strIpAddress));\n }\n\n private WriteRelaisSensorState(strFanId: string, fanData: FanRemoteEndpoint, value: ioBroker.StateValue): void {\n if (typeof value !== \"boolean\") {\n this.log.warn(`The value is not from type boolean.`);\n return;\n }\n\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.WriteRelaisSensorState(Boolean(value));\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n this.sendQuene.enqueue(new DataToSend(packet, fanData.strIpAddress));\n }\n\n private WriteTargetAnalogVoltageValue(\n strFanId: string,\n fanData: FanRemoteEndpoint,\n value: ioBroker.StateValue,\n ): void {\n if (typeof value !== \"number\") {\n this.log.warn(`The value is not from type number.`);\n return;\n }\n\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.WriteTargetAnalogVoltageValue(Number(value));\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n this.sendQuene.enqueue(new DataToSend(packet, fanData.strIpAddress));\n }\n\n private WriteTargetHumidityValue(strFanId: string, fanData: FanRemoteEndpoint, value: ioBroker.StateValue): void {\n if (typeof value !== \"number\") {\n this.log.warn(`The value is not from type number.`);\n return;\n }\n\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.WriteTargetHumidityValue(Number(value));\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n this.sendQuene.enqueue(new DataToSend(packet, fanData.strIpAddress));\n }\n\n private ResetAlarms(strFanId: string, fanData: FanRemoteEndpoint): void {\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.WriteResetAlarmState();\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n this.sendQuene.enqueue(new DataToSend(packet, fanData.strIpAddress));\n }\n\n private SyncRtcClock(strFanId: string, fanData: FanRemoteEndpoint): void {\n this.ntpClient\n .syncTime()\n .then((value: NTP.NTPPacket) => {\n const dateTime = DateTime.parse(value.time.toISOString(), \"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]\", true);\n this.log.debug(\"Received local time via ntp: \" + dateTime.toLocaleString());\n\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.WriteRtcDateTime(dateTime);\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n\n // Immediately send the data, as any delay would make the time sync invalid\n this.udpServer.send(packet, 4000, fanData.strIpAddress, (err) => {\n if (err != null) {\n this.log.error(err.message);\n } else {\n // Retrigger a reading of the data, as a RTC write does not immediately return the right values\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.ReadRtcDateTime();\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n const timeout = this.setTimeout(() => {\n this.sendQuene.enqueue(new DataToSend(packet, fanData.strIpAddress));\n this.clearTimeout(timeout);\n }, 1000);\n }\n });\n })\n .catch((reason: any) => {\n this.log.error(reason);\n });\n }\n\n private ParseInputNumber(value: ioBroker.StateValue): number {\n if (typeof value !== \"number\" && typeof value !== \"string\") {\n this.log.warn(`The value is not from type number or string, but ${typeof value}`);\n return NaN;\n }\n\n let nValue = Number(value);\n\n if (typeof value === \"string\") {\n nValue = parseInt(value);\n\n // Give it a second try, if it was not parsable -> check for the first space as separating character\n if (isNaN(nValue)) nValue = parseInt(String(value).substring(0, String(value).indexOf(\" \")));\n\n if (isNaN(nValue)) {\n this.log.warn(`Unable to parse the number from the input value: ${value}`);\n }\n }\n\n return nValue;\n }\n\n //#region Protected data members\n\n udpServer: udp.Socket;\n protocolBuilder: Oxxify.OxxifyProtocol = new Oxxify.OxxifyProtocol();\n sendQuene: Queue = new Queue();\n queneInterval: ioBroker.Interval | undefined;\n pollingInterval: ioBroker.Interval | undefined;\n ntpClient: NTP.Client = new NTP.Client();\n\n //#endregion\n}\n\nif (require.main !== module) {\n // Export the constructor in compact mode\n module.exports = (options: Partial | undefined) => new OxxifyFanControl(options);\n} else {\n // otherwise start the instance directly\n (() => new OxxifyFanControl())();\n}\n"], - "mappings": "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", + "sourcesContent": ["/*\n * Created with @iobroker/create-adapter v2.6.5\n */\n\n// The adapter-core module gives you access to the core ioBroker functions\n// you need to create an adapter\nimport * as utils from \"@iobroker/adapter-core\";\n\n// Load your modules here, e.g.:\n// import * as fs from \"fs\";\nimport * as DateTime from \"date-and-time\";\nimport * as udp from \"dgram\";\nimport * as NTP from \"ntp-time\";\nimport Queue from \"queue-fifo\";\nimport { DataToSend, ReceivedData } from \"./lib/ModelData\";\nimport * as Oxxify from \"./lib/OxxifyProtocol\";\n\ntype FanRemoteEndpoint = { strIpAddress: string; strPassword: string };\n\nclass OxxifyFanControl extends utils.Adapter {\n public constructor(options: Partial = {}) {\n super({\n ...options,\n name: \"oxxify-fan-control\",\n });\n this.on(\"ready\", this.onReady.bind(this));\n this.on(\"stateChange\", this.onStateChange.bind(this));\n this.on(\"unload\", this.onUnload.bind(this));\n\n this.udpServer = udp.createSocket(\"udp4\");\n }\n\n /**\n * Is called when databases are connected and adapter received configuration.\n */\n private async onReady(): Promise {\n // Initialize your adapter here\n\n // Reset the connection indicator during startup\n await this.setState(\"info.connection\", false, true);\n\n this.log.debug(`NTP-Server: ${this.config.ntpServer}`);\n this.log.debug(`Fan data polling invervall: ${this.config.pollingInterval} seconds`);\n\n this.ntpClient = new NTP.Client(this.config.ntpServer);\n\n if (typeof this.config.fans == \"undefined\" || this.config.fans.length == 0) {\n this.log.error(\"Please set at least one vent in the adapter configuration!\");\n return;\n }\n\n await this.extendObject(\"devices\", {\n type: \"channel\",\n common: {\n name: {\n en: \"Devices\",\n de: \"Ger\u00E4te\",\n ru: \"\u0423\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u0430\",\n pt: \"Dispositivos\",\n nl: \"Apparaten\",\n fr: \"Dispositifs\",\n it: \"Dispositivi\",\n es: \"Dispositivos\",\n pl: \"Urz\u0105dzenia\",\n uk: \"\u041F\u0440\u0438\u0441\u0442\u0440\u043E\u0457\",\n \"zh-cn\": \"Devices\",\n },\n role: undefined,\n },\n native: {},\n });\n\n const dataDictionary = this.protocolBuilder.DataDictionary;\n\n this.config.fans.forEach(async (element) => {\n this.log.debug('Fan configured: \"' + element.name + '\": ' + element.id + \" - \" + element.ipaddr);\n\n await this.extendObject(\"devices.\" + element.id, {\n type: \"channel\",\n common: {\n name: element.name,\n role: undefined,\n },\n });\n\n dataDictionary.forEach(async (value: Oxxify.FanData) => {\n await this.extendObject(\"devices.\" + element.id + \".\" + value.strIdentifer, {\n type: \"state\",\n common: {\n name: value.name,\n role: value.strRole,\n read: true,\n write: value.bIsWritable,\n type: value.strType,\n unit: value.strUnit,\n min: value.minValue,\n max: value.maxValue,\n },\n });\n });\n });\n\n // In order to get state updates, you need to subscribe to them. The following line adds a subscription for our variable we have created above.\n // You can also add a subscription for multiple states. The following line watches all states starting with \"lights.\"\n // this.subscribeStates(\"lights.*\");\n // Or, if you really must, you can also watch all states. Don\"t do this if you don\"t need to. Otherwise this will cause a lot of unnecessary load on the system:\n this.subscribeStates(\"devices.*.fan.*\");\n this.subscribeStates(\"devices.*.sensors.state*\");\n this.subscribeStates(\"devices.*.sensors.target*\");\n this.subscribeStates(\"devices.*.system.triggerRtcTimeSync\");\n this.subscribeStates(\"devices.*.system.resetAlarms\");\n\n // emits when any error occurs\n this.udpServer.on(\"error\", (error) => {\n this.log.error(\"Error: \" + error);\n this.udpServer.close();\n });\n\n // emits on new datagram msg\n this.udpServer.on(\"message\", async (msg, info) => {\n // Reset the connection indicator during startup\n await this.setState(\"info.connection\", true, true);\n\n this.log.silly(\n `Received ${msg.length} bytes from ${info.address}:${info.port} - Data: ${msg.toString(\"hex\")}`,\n );\n const data = this.protocolBuilder.ParseResponseData(msg);\n\n if (data.receivedData.length > 0) {\n data.receivedData.forEach(async (value: ReceivedData) => {\n await this.setState(\"devices.\" + data.strFanId + \".\" + value.strIdentifer, value.value, true);\n });\n }\n });\n\n this.udpServer.bind(4001);\n\n // emits when socket is ready and listening for datagram msgs\n this.udpServer.on(\"listening\", async () => {\n const address = this.udpServer.address();\n const port = address.port;\n const family = address.family;\n const ipaddr = address.address;\n this.log.debug(\"Server is listening at: \" + ipaddr + \":\" + port + \" (\" + family + \")\");\n\n this.ReadAllFanData(true);\n });\n\n //emits after the socket is closed using socket.close();\n this.udpServer.on(\"close\", () => {\n this.log.warn(\"Socket is closed\");\n });\n\n this.queneInterval = this.setInterval(() => {\n if (this.sendQuene.isEmpty() == false) {\n const sendData = this.sendQuene.dequeue();\n\n if (sendData != null) {\n this.log.silly(\n \"Sending \" + sendData.data.toString(\"hex\") + \" to \" + sendData.ipAddress + \":\" + 4000,\n );\n this.udpServer.send(sendData.data, 4000, sendData.ipAddress, (err) => {\n if (err != null) this.log.error(err.message);\n });\n }\n }\n }, 25);\n\n this.pollingInterval = this.setInterval(() => {\n this.ReadAllFanData(false);\n }, this.config.pollingInterval * 1000);\n }\n\n /**\n * Is called when adapter shuts down - callback has to be called under any circumstances!\n */\n private onUnload(callback: () => void): void {\n try {\n // Here you must clear all timeouts or intervals that may still be active\n // clearTimeout(timeout1);\n // clearTimeout(timeout2);\n // ...\n this.clearInterval(this.queneInterval);\n this.clearInterval(this.pollingInterval);\n\n this.udpServer.close();\n\n callback();\n } catch (e: any) {\n this.log.error(e.toString());\n callback();\n }\n }\n\n /**\n * Is called if a subscribed state changes\n */\n private onStateChange(strStateIdentifier: string, state: ioBroker.State | null | undefined): void {\n if (state) {\n // The state was changed\n this.log.silly(`state ${strStateIdentifier} changed: ${state.val} (ack = ${state.ack})`);\n\n if (state.ack == false) {\n const strFanId = this.ParseFanId(strStateIdentifier);\n\n if (strFanId) {\n const fanData = this.GetFanDataFromConfig(strFanId);\n\n if (fanData) {\n switch (strStateIdentifier.split(\".\").pop()) {\n case \"boostModeFollowUpTime\":\n this.WriteBoostModeFollowUpTime(strFanId, fanData, state.val);\n break;\n\n case \"fanOperatingMode\":\n this.WriteOperatingMode(strFanId, fanData, state.val);\n break;\n\n case \"fanSpeedMode\":\n this.WriteFanSpeedMode(strFanId, fanData, state.val);\n break;\n\n case \"fanState\":\n this.WriteFanState(strFanId, fanData, state.val);\n break;\n\n case \"manualFanSpeed\":\n this.WriteManualFanSpeed(strFanId, fanData, state.val);\n break;\n\n case \"resetFilterExchangeCountdown\":\n this.ResetFilterExchangeCountdown(strFanId, fanData);\n break;\n\n case \"timeControlledMode\":\n this.WriteTimeControlledMode(strFanId, fanData, state.val);\n break;\n\n case \"timerMode\":\n this.WriteTimerMode(strFanId, fanData, state.val);\n break;\n\n case \"stateAnalogVoltageSensor\":\n this.WriteAnalogVoltageSensorState(strFanId, fanData, state.val);\n break;\n\n case \"stateHumiditySensor\":\n this.WriteHumiditySensorState(strFanId, fanData, state.val);\n break;\n\n case \"stateRelaisSensor\":\n this.WriteRelaisSensorState(strFanId, fanData, state.val);\n break;\n\n case \"targetAnalogVoltageValue\":\n this.WriteTargetAnalogVoltageValue(strFanId, fanData, state.val);\n break;\n\n case \"targetHumidityValue\":\n this.WriteTargetHumidityValue(strFanId, fanData, state.val);\n break;\n\n case \"resetAlarms\":\n this.ResetAlarms(strFanId, fanData);\n break;\n\n case \"triggerRtcTimeSync\":\n this.SyncRtcClock(strFanId, fanData);\n break;\n }\n }\n }\n }\n } else {\n // The state was deleted\n this.log.info(`state ${strStateIdentifier} deleted`);\n }\n }\n\n private ReadAllFanData(bIncludeConstData: boolean): void {\n this.config.fans.forEach((element) => {\n this.protocolBuilder.StartNewFrame(element.id, element.password);\n this.protocolBuilder.ReadFanState();\n this.protocolBuilder.ReadFanSpeedMode();\n this.protocolBuilder.ReadOperatingMode();\n this.protocolBuilder.ReadOperatingTime();\n this.protocolBuilder.ReadBoostState();\n this.protocolBuilder.ReadBoostModeFollowUpTime();\n this.protocolBuilder.ReadRtcBattery();\n this.protocolBuilder.ReadAnalogVoltageSensorState();\n this.protocolBuilder.ReadAlarmState();\n this.protocolBuilder.ReadCloudServerEnabled();\n this.protocolBuilder.ReadHumiditySensorState();\n this.protocolBuilder.ReadRelaisSensorState();\n this.protocolBuilder.ReadCurrentAnalogVoltage();\n this.protocolBuilder.ReadCurrentHumidity();\n this.protocolBuilder.ReadCurrentRelaisState();\n this.protocolBuilder.ReadManualFanSpeed();\n this.protocolBuilder.ReadFan1Speed();\n this.protocolBuilder.ReadFan2Speed();\n this.protocolBuilder.ReadFilterExchangeCountdown();\n this.protocolBuilder.ReadFilterExchangeNecessary();\n this.protocolBuilder.ReadWifiData();\n this.protocolBuilder.ReadTimerModeValues();\n this.protocolBuilder.ReadTargetAnalogVoltageValue();\n this.protocolBuilder.ReadTargetHumidityValue();\n this.protocolBuilder.ReadTimeControlledMode();\n this.protocolBuilder.ReadRtcDateTime();\n if (bIncludeConstData) {\n this.protocolBuilder.ReadFanType();\n this.protocolBuilder.ReadFirmware();\n }\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n this.sendQuene.enqueue(new DataToSend(packet, element.ipaddr));\n });\n }\n\n private ParseFanId(strId: string): string | undefined {\n const strFanIdRegex = \"[0-9A-Fa-f]{16}\";\n const match = strId.match(strFanIdRegex);\n\n if (match) {\n return match.toString();\n }\n\n return undefined;\n }\n\n private GetFanDataFromConfig(strFanId: string): FanRemoteEndpoint | undefined {\n const data = this.config.fans.find((f) => f.id == strFanId);\n\n if (data == undefined) return undefined;\n\n return { strIpAddress: data.ipaddr, strPassword: data.password };\n }\n\n private WriteBoostModeFollowUpTime(strFanId: string, fanData: FanRemoteEndpoint, value: ioBroker.StateValue): void {\n if (typeof value !== \"number\") {\n this.log.warn(\"The value is not from type number.\");\n return;\n }\n\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.WriteBoostModeFollowUpTime(Number(value));\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n this.sendQuene.enqueue(new DataToSend(packet, fanData.strIpAddress));\n }\n\n private WriteOperatingMode(strFanId: string, fanData: FanRemoteEndpoint, value: ioBroker.StateValue): void {\n const nValue = this.ParseInputNumber(value);\n\n if (isNaN(nValue)) return;\n\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.WriteOperatingMode(nValue);\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n this.sendQuene.enqueue(new DataToSend(packet, fanData.strIpAddress));\n }\n\n private WriteFanSpeedMode(strFanId: string, fanData: FanRemoteEndpoint, value: ioBroker.StateValue): void {\n const nValue = this.ParseInputNumber(value);\n\n if (isNaN(nValue)) return;\n\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.WriteFanSpeedMode(nValue);\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n this.sendQuene.enqueue(new DataToSend(packet, fanData.strIpAddress));\n }\n\n private WriteFanState(strFanId: string, fanData: FanRemoteEndpoint, value: ioBroker.StateValue): void {\n if (typeof value !== \"boolean\") {\n this.log.warn(`The value is not from type boolean.`);\n return;\n }\n\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.WriteFanState(Boolean(value));\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n this.sendQuene.enqueue(new DataToSend(packet, fanData.strIpAddress));\n }\n\n private WriteManualFanSpeed(strFanId: string, fanData: FanRemoteEndpoint, value: ioBroker.StateValue): void {\n if (typeof value !== \"number\") {\n this.log.warn(\"The value is not from type number.\");\n return;\n }\n\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.WriteManualFanSpeed(Number(value));\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n this.sendQuene.enqueue(new DataToSend(packet, fanData.strIpAddress));\n }\n\n private ResetFilterExchangeCountdown(strFanId: string, fanData: FanRemoteEndpoint): void {\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.WriteResetFilterExchangeCountdown();\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n this.sendQuene.enqueue(new DataToSend(packet, fanData.strIpAddress));\n }\n\n private WriteTimeControlledMode(strFanId: string, fanData: FanRemoteEndpoint, value: ioBroker.StateValue): void {\n if (typeof value !== \"boolean\") {\n this.log.warn(`The value is not from type boolean.`);\n return;\n }\n\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.WriteTimeControlledMode(Boolean(value));\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n this.sendQuene.enqueue(new DataToSend(packet, fanData.strIpAddress));\n }\n\n private WriteTimerMode(strFanId: string, fanData: FanRemoteEndpoint, value: ioBroker.StateValue): void {\n const nValue = this.ParseInputNumber(value);\n\n if (isNaN(nValue)) return;\n\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.WriteTimerMode(nValue);\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n this.sendQuene.enqueue(new DataToSend(packet, fanData.strIpAddress));\n }\n\n private WriteAnalogVoltageSensorState(\n strFanId: string,\n fanData: FanRemoteEndpoint,\n value: ioBroker.StateValue,\n ): void {\n if (typeof value !== \"boolean\") {\n this.log.warn(`The value is not from type boolean.`);\n return;\n }\n\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.WriteAnalogVoltageSensorState(Boolean(value));\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n this.sendQuene.enqueue(new DataToSend(packet, fanData.strIpAddress));\n }\n\n private WriteHumiditySensorState(strFanId: string, fanData: FanRemoteEndpoint, value: ioBroker.StateValue): void {\n if (typeof value !== \"boolean\") {\n this.log.warn(`The value is not from type boolean.`);\n return;\n }\n\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.WriteHumiditySensorState(Boolean(value));\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n this.sendQuene.enqueue(new DataToSend(packet, fanData.strIpAddress));\n }\n\n private WriteRelaisSensorState(strFanId: string, fanData: FanRemoteEndpoint, value: ioBroker.StateValue): void {\n if (typeof value !== \"boolean\") {\n this.log.warn(`The value is not from type boolean.`);\n return;\n }\n\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.WriteRelaisSensorState(Boolean(value));\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n this.sendQuene.enqueue(new DataToSend(packet, fanData.strIpAddress));\n }\n\n private WriteTargetAnalogVoltageValue(\n strFanId: string,\n fanData: FanRemoteEndpoint,\n value: ioBroker.StateValue,\n ): void {\n if (typeof value !== \"number\") {\n this.log.warn(`The value is not from type number.`);\n return;\n }\n\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.WriteTargetAnalogVoltageValue(Number(value));\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n this.sendQuene.enqueue(new DataToSend(packet, fanData.strIpAddress));\n }\n\n private WriteTargetHumidityValue(strFanId: string, fanData: FanRemoteEndpoint, value: ioBroker.StateValue): void {\n if (typeof value !== \"number\") {\n this.log.warn(`The value is not from type number.`);\n return;\n }\n\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.WriteTargetHumidityValue(Number(value));\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n this.sendQuene.enqueue(new DataToSend(packet, fanData.strIpAddress));\n }\n\n private ResetAlarms(strFanId: string, fanData: FanRemoteEndpoint): void {\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.WriteResetAlarmState();\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n this.sendQuene.enqueue(new DataToSend(packet, fanData.strIpAddress));\n }\n\n private SyncRtcClock(strFanId: string, fanData: FanRemoteEndpoint): void {\n this.ntpClient\n .syncTime()\n .then((value: NTP.NTPPacket) => {\n const dateTime = DateTime.parse(value.time.toISOString(), \"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]\", true);\n this.log.debug(\"Received local time via ntp: \" + dateTime.toLocaleString());\n\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.WriteRtcDateTime(dateTime);\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n\n // Immediately send the data, as any delay would make the time sync invalid\n this.udpServer.send(packet, 4000, fanData.strIpAddress, (err) => {\n if (err != null) {\n this.log.error(err.message);\n } else {\n // Retrigger a reading of the data, as a RTC write does not immediately return the right values\n this.protocolBuilder.StartNewFrame(strFanId, fanData.strPassword);\n this.protocolBuilder.ReadRtcDateTime();\n this.protocolBuilder.FinishFrame();\n\n const packet = this.protocolBuilder.ProtocolPacket;\n const timeout = this.setTimeout(() => {\n this.sendQuene.enqueue(new DataToSend(packet, fanData.strIpAddress));\n this.clearTimeout(timeout);\n }, 1000);\n }\n });\n })\n .catch((reason: any) => {\n this.log.error(reason);\n });\n }\n\n private ParseInputNumber(value: ioBroker.StateValue): number {\n if (typeof value !== \"number\" && typeof value !== \"string\") {\n this.log.warn(`The value is not from type number or string, but ${typeof value}`);\n return NaN;\n }\n\n let nValue = Number(value);\n\n if (typeof value === \"string\") {\n nValue = parseInt(value);\n\n // Give it a second try, if it was not parsable -> check for the first space as separating character\n if (isNaN(nValue)) nValue = parseInt(String(value).substring(0, String(value).indexOf(\" \")));\n\n if (isNaN(nValue)) {\n this.log.warn(`Unable to parse the number from the input value: ${value}`);\n }\n }\n\n return nValue;\n }\n\n //#region Protected data members\n\n udpServer: udp.Socket;\n protocolBuilder: Oxxify.OxxifyProtocol = new Oxxify.OxxifyProtocol();\n sendQuene: Queue = new Queue();\n queneInterval: ioBroker.Interval | undefined;\n pollingInterval: ioBroker.Interval | undefined;\n ntpClient: NTP.Client = new NTP.Client();\n\n //#endregion\n}\n\nif (require.main !== module) {\n // Export the constructor in compact mode\n module.exports = (options: Partial | undefined) => new OxxifyFanControl(options);\n} else {\n // otherwise start the instance directly\n (() => new OxxifyFanControl())();\n}\n"], + "mappings": "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", "names": ["packet", "Queue"] } diff --git a/io-package.json b/io-package.json index 00314be..7322359 100644 --- a/io-package.json +++ b/io-package.json @@ -1,116 +1,137 @@ { - "common": { - "name": "oxxify-fan-control", - "version": "0.0.1", - "news": { - "0.0.1": { - "en": "initial release", - "de": "Erstveröffentlichung", - "ru": "Начальная версия", - "pt": "lançamento inicial", - "nl": "Eerste uitgave", - "fr": "Première version", - "it": "Versione iniziale", - "es": "Versión inicial", - "pl": "Pierwsze wydanie", - "uk": "Початкова версія", - "zh-cn": "首次出版" - } - }, - "titleLang": { - "en": "Oxxify Fan Control", - "de": "Oxxify-Lüftersteuerung", - "ru": "Управление вентилятором Oxxify", - "pt": "Controle de ventilador Oxxify", - "nl": "Oxxify-ventilatorbediening", - "fr": "Contrôle du ventilateur Oxxify", - "it": "Controllo della ventola Oxxify", - "es": "Control del ventilador Oxxify", - "pl": "Sterowanie wentylatorem Oxxify", - "uk": "Контроль вентиляторів Oxxify", - "zh-cn": "Oxxify 风扇控制" - }, - "desc": { - "en": "Integrate your Oxxify Fans into your Smart Home.", - "de": "Integrieren Sie Ihre Oxxify-Lüfter in Ihr Smart Home.", - "ru": "Интегрируйте вентиляторы Oxxify в свой умный дом.", - "pt": "Integre seus fãs Oxxify em sua casa inteligente.", - "nl": "Integreer je Oxxify Fans in je Smart Home.", - "fr": "Intégrez vos ventilateurs Oxxify dans votre maison intelligente.", - "it": "Integra i tuoi fan Oxxify nella tua casa intelligente.", - "es": "Integra tus Fans Oxxify en tu Hogar Inteligente.", - "pl": "Zintegruj swoich fanów Oxxify ze swoim inteligentnym domem.", - "uk": "Інтегруйте вентилятори Oxxify у свій розумний дім.", - "zh-cn": "将您的 Oxxify 风扇集成到您的智能家居中。" - }, - "authors": ["N-b-dy "], - "keywords": ["oxxify"], - "licenseInformation": { - "type": "free", - "license": "GPL-3.0-or-later" - }, - "platform": "Javascript/Node.js", - "icon": "oxxify-fan-control.png", - "enabled": true, - "extIcon": "https://raw.githubusercontent.com/N-b-dy/ioBroker.oxxify-fan-control/main/admin/oxxify-fan-control.png", - "readme": "https://github.com/N-b-dy/ioBroker.oxxify-fan-control/blob/main/README.md", - "loglevel": "info", - "tier": 3, - "mode": "daemon", - "type": "climate-control", - "compact": true, - "connectionType": "local", - "dataSource": "poll", - "adminUI": { - "config": "json" - }, - "dependencies": [ - { - "js-controller": ">=6.0.11" - } - ], - "globalDependencies": [ - { - "admin": ">=7.1.3" - } - ] + "common": { + "name": "oxxify-fan-control", + "version": "0.0.2", + "news": { + "0.0.2": { + "en": "initial release", + "de": "erstausstrahlung", + "ru": "первоначальный выпуск", + "pt": "lançamento inicial", + "nl": "eerste release", + "fr": "libération initiale", + "it": "rilascio iniziale", + "es": "liberación inicial", + "pl": "początkowe zwolnienie", + "uk": "початковий реліз", + "zh-cn": "初步释放" + }, + "0.0.1": { + "en": "initial release", + "de": "Erstveröffentlichung", + "ru": "Начальная версия", + "pt": "lançamento inicial", + "nl": "Eerste uitgave", + "fr": "Première version", + "it": "Versione iniziale", + "es": "Versión inicial", + "pl": "Pierwsze wydanie", + "uk": "Початкова версія", + "zh-cn": "首次出版" + } }, - "native": { - "pollingInterval": 5, - "ntpServer": "0.de.pool.ntp.org", - "fans": [ - { - "name": "fan1", - "id": "1234567890123456", - "ipaddr": "192.168.1.1", - "password": "topsecret" - } - ] + "titleLang": { + "en": "Oxxify Fan Control", + "de": "Oxxify-Lüftersteuerung", + "ru": "Управление вентилятором Oxxify", + "pt": "Controle de ventilador Oxxify", + "nl": "Oxxify-ventilatorbediening", + "fr": "Contrôle du ventilateur Oxxify", + "it": "Controllo della ventola Oxxify", + "es": "Control del ventilador Oxxify", + "pl": "Sterowanie wentylatorem Oxxify", + "uk": "Контроль вентиляторів Oxxify", + "zh-cn": "Oxxify 风扇控制" }, - "protectedNative": ["fans.password"], - "encryptedNative": ["fans.password"], - "objects": [], - "instanceObjects": [ - { - "_id": "info", - "type": "channel", - "common": { - "name": "Information" - }, - "native": {} - }, - { - "_id": "info.connection", - "type": "state", - "common": { - "role": "indicator.connected", - "name": "Device or service connected", - "type": "boolean", - "read": true, - "write": false, - "def": false - }, - "native": {} - } + "desc": { + "en": "Integrate your Oxxify Fans into your Smart Home.", + "de": "Integrieren Sie Ihre Oxxify-Lüfter in Ihr Smart Home.", + "ru": "Интегрируйте вентиляторы Oxxify в свой умный дом.", + "pt": "Integre seus fãs Oxxify em sua casa inteligente.", + "nl": "Integreer je Oxxify Fans in je Smart Home.", + "fr": "Intégrez vos ventilateurs Oxxify dans votre maison intelligente.", + "it": "Integra i tuoi fan Oxxify nella tua casa intelligente.", + "es": "Integra tus Fans Oxxify en tu Hogar Inteligente.", + "pl": "Zintegruj swoich fanów Oxxify ze swoim inteligentnym domem.", + "uk": "Інтегруйте вентилятори Oxxify у свій розумний дім.", + "zh-cn": "将您的 Oxxify 风扇集成到您的智能家居中。" + }, + "authors": [ + "N-b-dy " + ], + "keywords": [ + "oxxify" + ], + "licenseInformation": { + "type": "free", + "license": "GPL-3.0-or-later" + }, + "platform": "Javascript/Node.js", + "icon": "oxxify-fan-control.png", + "enabled": true, + "extIcon": "https://raw.githubusercontent.com/N-b-dy/ioBroker.oxxify-fan-control/main/admin/oxxify-fan-control.png", + "readme": "https://github.com/N-b-dy/ioBroker.oxxify-fan-control/blob/main/README.md", + "loglevel": "info", + "tier": 3, + "mode": "daemon", + "type": "climate-control", + "compact": true, + "connectionType": "local", + "dataSource": "poll", + "adminUI": { + "config": "json" + }, + "dependencies": [ + { + "js-controller": ">=6.0.11" + } + ], + "globalDependencies": [ + { + "admin": ">=7.1.3" + } ] + }, + "native": { + "pollingInterval": 5, + "ntpServer": "0.de.pool.ntp.org", + "fans": [ + { + "name": "fan1", + "id": "1234567890123456", + "ipaddr": "192.168.1.1", + "password": "topsecret" + } + ] + }, + "protectedNative": [ + "fans.password" + ], + "encryptedNative": [ + "fans.password" + ], + "objects": [], + "instanceObjects": [ + { + "_id": "info", + "type": "channel", + "common": { + "name": "Information" + }, + "native": {} + }, + { + "_id": "info.connection", + "type": "state", + "common": { + "role": "indicator.connected", + "name": "Device or service connected", + "type": "boolean", + "read": true, + "write": false, + "def": false + }, + "native": {} + } + ] } diff --git a/package-lock.json b/package-lock.json index d54daa8..1871df6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "iobroker.oxxify-fan-control", - "version": "0.0.1", + "version": "0.0.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "iobroker.oxxify-fan-control", - "version": "0.0.1", + "version": "0.0.2", "license": "GPL-3.0-or-later", "dependencies": { "@iobroker/adapter-core": "^3.2.2", diff --git a/package.json b/package.json index 86b6f85..1dd784f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iobroker.oxxify-fan-control", - "version": "0.0.1", + "version": "0.0.2", "description": "Integrate your Oxxify Fans into your Smart Home.", "author": { "name": "N-b-dy",