UNPKG

iobroker.acinfinity

Version:
212 lines (183 loc) 12 kB
/** * PortSettingsHandler für AC Infinity Adapter * Verarbeitet Änderungen an den erweiterten Port-Einstellungen */ "use strict"; const { ADVANCED_SETTINGS_KEY, DEVICE_LOAD_TYPE_OPTIONS, DYNAMIC_RESPONSE_OPTIONS } = require('../constants'); class PortSettingsHandler { /** * Erstellt einen neuen PortSettingsHandler * @param {object} stateManager - Referenz zum StateManager */ constructor(stateManager) { this.stateManager = stateManager; this.adapter = stateManager.adapter; this.client = null; // API-Client-Referenz wird später gesetzt } /** * Setzt den API-Client für diesen Handler * @param {object} client - AC Infinity API-Client */ setClient(client) { this.client = client; this.adapter.log.debug("API-Client erfolgreich an PortSettingsHandler übergeben"); } /** * Verarbeitet Änderungen an erweiterten Port-Einstellungen * @param {string} deviceId - Geräte-ID * @param {number} portId - Port-ID * @param {Array} path - Pfadkomponenten * @param {any} value - Neuer Wert */ async handlePortAdvancedSettingsChange(deviceId, portId, path, value) { if (path.length < 1) { this.adapter.log.warn(`Ungültiger Pfad für erweiterte Port-Einstellungen: ${path.join('.')}`); return; } const setting = path[0]; const statePath = `devices.${deviceId}.ports.${portId}.settings.${setting}`; // UI sofort aktualisieren, um Flackern zu vermeiden await this.stateManager.updateUIState(statePath, value); try { // Prüfen, ob der Client gesetzt ist if (!this.client) { throw new Error("API-Client nicht gesetzt. Kann Port-Einstellungen nicht aktualisieren."); } // Hole den Port-Namen für den Aktualisierungsaufruf let portName = await this.adapter.getStateAsync(`devices.${deviceId}.ports.${portId}.info.name`); portName = portName && portName.val ? portName.val : `Port ${portId}`; // Aktuelle Temperatureinheit abrufen const tempUnitState = await this.adapter.getStateAsync(`devices.${deviceId}.settings.temperatureUnit`); const isUnitC = tempUnitState && tempUnitState.val === "C"; this.adapter.log.debug(`Verarbeite Port-Einstellungsänderung: deviceId=${deviceId}, portId=${portId}, setting=${setting}, value=${value}`); try { switch (setting) { case 'deviceType': // Finde die Last-Typ-ID für den angegebenen Gerätetyp-Namen let loadTypeId = null; for (const [id, name] of Object.entries(DEVICE_LOAD_TYPE_OPTIONS)) { if (name === value) { loadTypeId = parseInt(id); break; } } if (loadTypeId !== null) { this.adapter.log.debug(`Sende Gerätetyp an API: deviceId=${deviceId}, portId=${portId}, type=${value}, loadTypeId=${loadTypeId}`); await this.client.updateAdvancedSettings(deviceId, portId, portName, [ [ADVANCED_SETTINGS_KEY.DEVICE_LOAD_TYPE, loadTypeId] ]); this.adapter.log.debug(`API-Antwort für Gerätetyp erfolgreich`); } else { this.adapter.log.warn(`Ungültiger Gerätetyp: ${value}`); } break; case 'dynamicResponse': const responseTypeIndex = DYNAMIC_RESPONSE_OPTIONS.indexOf(value); if (responseTypeIndex >= 0) { this.adapter.log.debug(`Sende dynamischen Antworttyp an API: deviceId=${deviceId}, portId=${portId}, type=${value}, index=${responseTypeIndex}`); await this.client.updateAdvancedSettings(deviceId, portId, portName, [ [ADVANCED_SETTINGS_KEY.DYNAMIC_RESPONSE_TYPE, responseTypeIndex] ]); this.adapter.log.debug(`API-Antwort für dynamischen Antworttyp erfolgreich`); } else { this.adapter.log.warn(`Ungültiger dynamischer Antworttyp: ${value}`); } break; case 'dynamicTransitionTemp': const transitionTempValue = parseInt(value); this.adapter.log.debug(`Sende dynamische Übergangstemperatur an API: deviceId=${deviceId}, portId=${portId}, temp=${transitionTempValue}, isUnitC=${isUnitC}`); if (isUnitC) { await this.client.updateAdvancedSettings(deviceId, portId, portName, [ [ADVANCED_SETTINGS_KEY.DYNAMIC_TRANSITION_TEMP, transitionTempValue], [ADVANCED_SETTINGS_KEY.DYNAMIC_TRANSITION_TEMP_F, transitionTempValue * 2] ]); } else { await this.client.updateAdvancedSettings(deviceId, portId, portName, [ [ADVANCED_SETTINGS_KEY.DYNAMIC_TRANSITION_TEMP, Math.floor(transitionTempValue / 2)], [ADVANCED_SETTINGS_KEY.DYNAMIC_TRANSITION_TEMP_F, transitionTempValue] ]); } this.adapter.log.debug(`API-Antwort für dynamische Übergangstemperatur erfolgreich`); break; case 'dynamicBufferTemp': const bufferTempValue = parseInt(value); this.adapter.log.debug(`Sende dynamische Puffertemperatur an API: deviceId=${deviceId}, portId=${portId}, temp=${bufferTempValue}, isUnitC=${isUnitC}`); if (isUnitC) { await this.client.updateAdvancedSettings(deviceId, portId, portName, [ [ADVANCED_SETTINGS_KEY.DYNAMIC_BUFFER_TEMP, bufferTempValue], [ADVANCED_SETTINGS_KEY.DYNAMIC_BUFFER_TEMP_F, bufferTempValue * 2] ]); } else { await this.client.updateAdvancedSettings(deviceId, portId, portName, [ [ADVANCED_SETTINGS_KEY.DYNAMIC_BUFFER_TEMP, Math.floor(bufferTempValue / 2)], [ADVANCED_SETTINGS_KEY.DYNAMIC_BUFFER_TEMP_F, bufferTempValue] ]); } this.adapter.log.debug(`API-Antwort für dynamische Puffertemperatur erfolgreich`); break; // Weitere Fälle für andere Einstellungen... case 'dynamicTransitionHumidity': this.adapter.log.debug(`Sende dynamische Übergangsfeuchtigkeit an API: deviceId=${deviceId}, portId=${portId}, humidity=${parseInt(value)}`); await this.client.updateAdvancedSettings(deviceId, portId, portName, [ [ADVANCED_SETTINGS_KEY.DYNAMIC_TRANSITION_HUMIDITY, parseInt(value)] ]); this.adapter.log.debug(`API-Antwort für dynamische Übergangsfeuchtigkeit erfolgreich`); break; case 'dynamicBufferHumidity': this.adapter.log.debug(`Sende dynamische Pufferfeuchtigkeit an API: deviceId=${deviceId}, portId=${portId}, humidity=${parseInt(value)}`); await this.client.updateAdvancedSettings(deviceId, portId, portName, [ [ADVANCED_SETTINGS_KEY.DYNAMIC_BUFFER_HUMIDITY, parseInt(value)] ]); this.adapter.log.debug(`API-Antwort für dynamische Pufferfeuchtigkeit erfolgreich`); break; case 'dynamicTransitionVPD': const transitionVpdValue = Math.round(parseFloat(value) * 10); this.adapter.log.debug(`Sende dynamisches Übergangs-VPD an API: deviceId=${deviceId}, portId=${portId}, vpd=${value}, scaledValue=${transitionVpdValue}`); await this.client.updateAdvancedSettings(deviceId, portId, portName, [ [ADVANCED_SETTINGS_KEY.DYNAMIC_TRANSITION_VPD, transitionVpdValue] ]); this.adapter.log.debug(`API-Antwort für dynamisches Übergangs-VPD erfolgreich`); break; case 'dynamicBufferVPD': const bufferVpdValue = Math.round(parseFloat(value) * 10); this.adapter.log.debug(`Sende dynamisches Puffer-VPD an API: deviceId=${deviceId}, portId=${portId}, vpd=${value}, scaledValue=${bufferVpdValue}`); await this.client.updateAdvancedSettings(deviceId, portId, portName, [ [ADVANCED_SETTINGS_KEY.DYNAMIC_BUFFER_VPD, bufferVpdValue] ]); this.adapter.log.debug(`API-Antwort für dynamisches Puffer-VPD erfolgreich`); break; case 'sunriseTimerEnabled': this.adapter.log.debug(`Sende Sonnenaufgang/Sonnenuntergang-Timer-Aktivierung an API: deviceId=${deviceId}, portId=${portId}, enabled=${value}`); await this.client.updateAdvancedSettings(deviceId, portId, portName, [ [ADVANCED_SETTINGS_KEY.SUNRISE_TIMER_ENABLED, value ? 1 : 0] ]); this.adapter.log.debug(`API-Antwort für Sonnenaufgang/Sonnenuntergang-Timer-Aktivierung erfolgreich`); break; case 'sunriseTimerMinutes': this.adapter.log.debug(`Sende Sonnenaufgang/Sonnenuntergang-Timer-Minuten an API: deviceId=${deviceId}, portId=${portId}, minutes=${parseInt(value)}`); await this.client.updateAdvancedSettings(deviceId, portId, portName, [ [ADVANCED_SETTINGS_KEY.SUNRISE_TIMER_DURATION, parseInt(value)] ]); this.adapter.log.debug(`API-Antwort für Sonnenaufgang/Sonnenuntergang-Timer-Minuten erfolgreich`); break; default: this.adapter.log.warn(`Unbekannte erweiterte Port-Einstellung: ${setting}`); } } catch (error) { this.adapter.log.error(`API-Fehler beim Aktualisieren der Port-Einstellung ${setting}: ${error.message}`); if (error.response) { this.adapter.log.error(`API-Antwort: ${JSON.stringify(error.response.data || {})}`); } } // Aktualisierung der Daten auslösen, um die Zustände zu aktualisieren await this.stateManager.refreshWithThrottle(); } catch (error) { this.adapter.log.error(`Fehler beim Aktualisieren erweiterter Port-Einstellungen: ${error.message}`); } } } module.exports = PortSettingsHandler;