iobroker.acinfinity
Version:
Monitor and control AC Infinity devices
243 lines (214 loc) • 12.4 kB
JavaScript
/**
* PortSettingsHandler für AC Infinity Adapter
* Verarbeitet Änderungen an den erweiterten Port-Einstellungen
*/
;
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': {
// value is the numeric load type ID (ioBroker sends the key of the states map)
const loadTypeId = parseInt(value);
if (!isNaN(loadTypeId) && DEVICE_LOAD_TYPE_OPTIONS[loadTypeId] !== undefined) {
this.adapter.log.debug(
`Sende Gerätetyp an API: deviceId=${deviceId}, portId=${portId}, loadTypeId=${loadTypeId} (${DEVICE_LOAD_TYPE_OPTIONS[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-Wert: ${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;