iobroker.acinfinity
Version:
Monitor and control AC Infinity devices
536 lines (513 loc) • 19.1 kB
JavaScript
/**
* PortCreator für AC Infinity Adapter
* Verantwortlich für das Erstellen von Port-Strukturen in ioBroker
*/
"use strict";
const {
MODE_OPTIONS,
SETTINGS_MODE_OPTIONS,
DYNAMIC_RESPONSE_OPTIONS,
DEVICE_LOAD_TYPE_OPTIONS
} = require('../constants');
class PortCreator {
/**
* Erstellt einen neuen PortCreator
* @param {object} stateManager - Referenz zum StateManager
*/
constructor(stateManager) {
this.stateManager = stateManager;
this.adapter = stateManager.adapter;
this.stateCreator = stateManager.stateCreator;
}
/**
* Erstellt einen Port-Kanal für ein Gerät
* @param {string} deviceId - Geräte-ID
* @param {number} portId - Port-ID
* @param {string} portName - Port-Name
* @returns {Promise<void>}
*/
async createPortChannel(deviceId, portId, portName) {
// Erstelle Port-Channel
await this.stateCreator.createChannel(`devices.${deviceId}.ports.${portId}`, portName || `Port ${portId}`, {
portId: portId
});
// Erstelle Port-Unterkanäle
await this.createPortInfoChannel(deviceId, portId);
await this.createPortModeChannel(deviceId, portId);
await this.createPortSettingsChannel(deviceId, portId);
}
/**
* Erstellt einen Port-Kanal für ein Gerät
* @param {string} deviceId - Geräte-ID
* @param {number} portId - Port-ID
* @returns {Promise<void>}
*/
async createPortInfoChannel(deviceId, portId) {
// Erstelle Port-Info-Kanal
await this.stateCreator.createChannel(`devices.${deviceId}.ports.${portId}.info`, "Information");
// Erstelle Port-Info-States
await this.stateCreator.createMultipleStates([
{
id: `devices.${deviceId}.ports.${portId}.info.name`,
name: "Name",
type: "string",
role: "text"
},
{
id: `devices.${deviceId}.ports.${portId}.info.online`,
name: "Online",
type: "boolean",
role: "indicator.connected"
},
{
id: `devices.${deviceId}.ports.${portId}.info.power`,
name: "Aktuelle Leistung",
type: "number",
role: "value.power"
},
{
id: `devices.${deviceId}.ports.${portId}.info.state`,
name: "Status",
type: "boolean",
role: "switch.power"
},
{
id: `devices.${deviceId}.ports.${portId}.info.remainingTime`,
name: "Verbleibende Zeit",
type: "number",
role: "value.interval",
unit: "s"
},
{
id: `devices.${deviceId}.ports.${portId}.info.nextStateChange`,
name: "Nächste Statusänderung",
type: "string",
role: "date.start"
}
]);
}
/**
* Erstellt einen Modus-Kanal für einen Port
* @param {string} deviceId - Geräte-ID
* @param {number} portId - Port-ID
* @returns {Promise<void>}
*/
async createPortModeChannel(deviceId, portId) {
// Erstelle Port-Mode-Kanal
await this.stateCreator.createChannel(`devices.${deviceId}.ports.${portId}.mode`, "Modus-Einstellungen");
// Erstelle Port-Mode-States
await this.stateCreator.createMultipleStates([
{
id: `devices.${deviceId}.ports.${portId}.mode.active`,
name: "Aktiver Modus",
type: "string",
role: "text",
write: true,
states: MODE_OPTIONS
},
{
id: `devices.${deviceId}.ports.${portId}.mode.onSpeed`,
name: "Ein-Geschwindigkeit",
type: "number",
role: "level",
write: true,
common: { min: 0, max: 10 }
},
{
id: `devices.${deviceId}.ports.${portId}.mode.offSpeed`,
name: "Aus-Geschwindigkeit",
type: "number",
role: "level",
write: true,
common: { min: 0, max: 10 }
}
]);
// Erstelle Unterkanäle für verschiedene Modi
await this.createTimerModeChannel(deviceId, portId);
await this.createCycleModeChannel(deviceId, portId);
await this.createScheduleModeChannel(deviceId, portId);
await this.createAutoModeChannel(deviceId, portId);
await this.createVpdModeChannel(deviceId, portId);
}
/**
* Erstellt einen Timer-Modus-Unterkanal
* @param {string} deviceId - Geräte-ID
* @param {number} portId - Port-ID
* @returns {Promise<void>}
*/
async createTimerModeChannel(deviceId, portId) {
await this.stateCreator.createChannel(`devices.${deviceId}.ports.${portId}.mode.timer`, "Timer-Modus");
await this.stateCreator.createMultipleStates([
{
id: `devices.${deviceId}.ports.${portId}.mode.timer.toOnMinutes`,
name: "Minuten bis Ein",
type: "number",
role: "value.interval",
unit: "min",
write: true,
common: { min: 0, max: 1440 }
},
{
id: `devices.${deviceId}.ports.${portId}.mode.timer.toOffMinutes`,
name: "Minuten bis Aus",
type: "number",
role: "value.interval",
unit: "min",
write: true,
common: { min: 0, max: 1440 }
}
]);
}
/**
* Erstellt einen Zyklus-Modus-Unterkanal
* @param {string} deviceId - Geräte-ID
* @param {number} portId - Port-ID
* @returns {Promise<void>}
*/
async createCycleModeChannel(deviceId, portId) {
await this.stateCreator.createChannel(`devices.${deviceId}.ports.${portId}.mode.cycle`, "Zyklus-Modus");
await this.stateCreator.createMultipleStates([
{
id: `devices.${deviceId}.ports.${portId}.mode.cycle.onMinutes`,
name: "Minuten Ein",
type: "number",
role: "value.interval",
unit: "min",
write: true,
common: { min: 0, max: 1440 }
},
{
id: `devices.${deviceId}.ports.${portId}.mode.cycle.offMinutes`,
name: "Minuten Aus",
type: "number",
role: "value.interval",
unit: "min",
write: true,
common: { min: 0, max: 1440 }
}
]);
}
/**
* Erstellt einen Zeitplan-Modus-Unterkanal
* @param {string} deviceId - Geräte-ID
* @param {number} portId - Port-ID
* @returns {Promise<void>}
*/
async createScheduleModeChannel(deviceId, portId) {
await this.stateCreator.createChannel(`devices.${deviceId}.ports.${portId}.mode.schedule`, "Zeitplan-Modus");
await this.stateCreator.createMultipleStates([
{
id: `devices.${deviceId}.ports.${portId}.mode.schedule.startEnabled`,
name: "Startzeit aktiviert",
type: "boolean",
role: "switch.enable",
write: true
},
{
id: `devices.${deviceId}.ports.${portId}.mode.schedule.startTime`,
name: "Startzeit",
type: "string",
role: "value.time",
write: true
},
{
id: `devices.${deviceId}.ports.${portId}.mode.schedule.endEnabled`,
name: "Endzeit aktiviert",
type: "boolean",
role: "switch.enable",
write: true
},
{
id: `devices.${deviceId}.ports.${portId}.mode.schedule.endTime`,
name: "Endzeit",
type: "string",
role: "value.time",
write: true
}
]);
}
/**
* Erstellt einen Auto-Modus-Unterkanal
* @param {string} deviceId - Geräte-ID
* @param {number} portId - Port-ID
* @returns {Promise<void>}
*/
async createAutoModeChannel(deviceId, portId) {
await this.stateCreator.createChannel(`devices.${deviceId}.ports.${portId}.mode.auto`, "Auto-Modus");
await this.stateCreator.createMultipleStates([
{
id: `devices.${deviceId}.ports.${portId}.mode.auto.settingsMode`,
name: "Einstellungsmodus",
type: "string",
role: "text",
write: true,
states: SETTINGS_MODE_OPTIONS
},
{
id: `devices.${deviceId}.ports.${portId}.mode.auto.tempHighEnabled`,
name: "Temperatur-Hochgrenze aktiviert",
type: "boolean",
role: "switch.enable",
write: true
},
{
id: `devices.${deviceId}.ports.${portId}.mode.auto.tempHighTrigger`,
name: "Temperatur-Hochgrenze",
type: "number",
role: "value.temperature",
unit: "°C",
write: true,
common: { min: 0, max: 90 }
},
{
id: `devices.${deviceId}.ports.${portId}.mode.auto.tempLowEnabled`,
name: "Temperatur-Tiefgrenze aktiviert",
type: "boolean",
role: "switch.enable",
write: true
},
{
id: `devices.${deviceId}.ports.${portId}.mode.auto.tempLowTrigger`,
name: "Temperatur-Tiefgrenze",
type: "number",
role: "value.temperature",
unit: "°C",
write: true,
common: { min: 0, max: 90 }
},
{
id: `devices.${deviceId}.ports.${portId}.mode.auto.humidityHighEnabled`,
name: "Feuchtigkeit-Hochgrenze aktiviert",
type: "boolean",
role: "switch.enable",
write: true
},
{
id: `devices.${deviceId}.ports.${portId}.mode.auto.humidityHighTrigger`,
name: "Feuchtigkeit-Hochgrenze",
type: "number",
role: "value.humidity",
unit: "%",
write: true,
common: { min: 0, max: 100 }
},
{
id: `devices.${deviceId}.ports.${portId}.mode.auto.humidityLowEnabled`,
name: "Feuchtigkeit-Tiefgrenze aktiviert",
type: "boolean",
role: "switch.enable",
write: true
},
{
id: `devices.${deviceId}.ports.${portId}.mode.auto.humidityLowTrigger`,
name: "Feuchtigkeit-Tiefgrenze",
type: "number",
role: "value.humidity",
unit: "%",
write: true,
common: { min: 0, max: 100 }
},
{
id: `devices.${deviceId}.ports.${portId}.mode.auto.targetTempEnabled`,
name: "Zieltemperatur aktiviert",
type: "boolean",
role: "switch.enable",
write: true
},
{
id: `devices.${deviceId}.ports.${portId}.mode.auto.targetTemp`,
name: "Zieltemperatur",
type: "number",
role: "value.temperature",
unit: "°C",
write: true,
common: { min: 0, max: 90 }
},
{
id: `devices.${deviceId}.ports.${portId}.mode.auto.targetHumidityEnabled`,
name: "Zielfeuchtigkeit aktiviert",
type: "boolean",
role: "switch.enable",
write: true
},
{
id: `devices.${deviceId}.ports.${portId}.mode.auto.targetHumidity`,
name: "Zielfeuchtigkeit",
type: "number",
role: "value.humidity",
unit: "%",
write: true,
common: { min: 0, max: 100 }
}
]);
}
/**
* Erstellt einen VPD-Modus-Unterkanal
* @param {string} deviceId - Geräte-ID
* @param {number} portId - Port-ID
* @returns {Promise<void>}
*/
async createVpdModeChannel(deviceId, portId) {
await this.stateCreator.createChannel(`devices.${deviceId}.ports.${portId}.mode.vpd`, "VPD-Modus");
await this.stateCreator.createMultipleStates([
{
id: `devices.${deviceId}.ports.${portId}.mode.vpd.settingsMode`,
name: "Einstellungsmodus",
type: "string",
role: "text",
write: true,
states: SETTINGS_MODE_OPTIONS
},
{
id: `devices.${deviceId}.ports.${portId}.mode.vpd.highEnabled`,
name: "VPD-Hochgrenze aktiviert",
type: "boolean",
role: "switch.enable",
write: true
},
{
id: `devices.${deviceId}.ports.${portId}.mode.vpd.highTrigger`,
name: "VPD-Hochgrenze",
type: "number",
role: "value",
unit: "kPa",
write: true,
common: { min: 0, max: 9.9 }
},
{
id: `devices.${deviceId}.ports.${portId}.mode.vpd.lowEnabled`,
name: "VPD-Tiefgrenze aktiviert",
type: "boolean",
role: "switch.enable",
write: true
},
{
id: `devices.${deviceId}.ports.${portId}.mode.vpd.lowTrigger`,
name: "VPD-Tiefgrenze",
type: "number",
role: "value",
unit: "kPa",
write: true,
common: { min: 0, max: 9.9 }
},
{
id: `devices.${deviceId}.ports.${portId}.mode.vpd.targetEnabled`,
name: "Ziel-VPD aktiviert",
type: "boolean",
role: "switch.enable",
write: true
},
{
id: `devices.${deviceId}.ports.${portId}.mode.vpd.target`,
name: "Ziel-VPD",
type: "number",
role: "value",
unit: "kPa",
write: true,
common: { min: 0, max: 9.9 }
}
]);
}
/**
* Erstellt einen Einstellungskanal für einen Port
* @param {string} deviceId - Geräte-ID
* @param {number} portId - Port-ID
* @returns {Promise<void>}
*/
async createPortSettingsChannel(deviceId, portId) {
await this.stateCreator.createChannel(`devices.${deviceId}.ports.${portId}.settings`, "Erweiterte Einstellungen");
await this.stateCreator.createMultipleStates([
{
id: `devices.${deviceId}.ports.${portId}.settings.deviceType`,
name: "Gerätetyp",
type: "number",
role: "value",
write: true,
states: Object.keys(DEVICE_LOAD_TYPE_OPTIONS).map(key => parseInt(key, 10)),
common: {
// Mapping der numerischen IDs zu Gerätetypnamen
states: DEVICE_LOAD_TYPE_OPTIONS
}
},
{
id: `devices.${deviceId}.ports.${portId}.settings.dynamicResponse`,
name: "Dynamische Reaktion",
type: "string",
role: "text",
write: true,
states: DYNAMIC_RESPONSE_OPTIONS
},
{
id: `devices.${deviceId}.ports.${portId}.settings.dynamicTransitionTemp`,
name: "Übergangstemperatur",
type: "number",
role: "value.temperature",
unit: "°",
write: true,
common: { min: 0, max: 20 }
},
{
id: `devices.${deviceId}.ports.${portId}.settings.dynamicTransitionHumidity`,
name: "Übergangsfeuchtigkeit",
type: "number",
role: "value.humidity",
unit: "%",
write: true,
common: { min: 0, max: 10 }
},
{
id: `devices.${deviceId}.ports.${portId}.settings.dynamicTransitionVPD`,
name: "Übergangs-VPD",
type: "number",
role: "value",
unit: "kPa",
write: true,
common: { min: 0, max: 1 }
},
{
id: `devices.${deviceId}.ports.${portId}.settings.dynamicBufferTemp`,
name: "Puffertemperatur",
type: "number",
role: "value.temperature",
unit: "°",
write: true,
common: { min: 0, max: 20 }
},
{
id: `devices.${deviceId}.ports.${portId}.settings.dynamicBufferHumidity`,
name: "Pufferfeuchtigkeit",
type: "number",
role: "value.humidity",
unit: "%",
write: true,
common: { min: 0, max: 10 }
},
{
id: `devices.${deviceId}.ports.${portId}.settings.dynamicBufferVPD`,
name: "Puffer-VPD",
type: "number",
role: "value",
unit: "kPa",
write: true,
common: { min: 0, max: 1 }
},
{
id: `devices.${deviceId}.ports.${portId}.settings.sunriseTimerEnabled`,
name: "Sonnenaufgang/Sonnenuntergang-Timer aktiviert",
type: "boolean",
role: "switch.enable",
write: true
},
{
id: `devices.${deviceId}.ports.${portId}.settings.sunriseTimerMinutes`,
name: "Sonnenaufgang/Sonnenuntergang-Timer Minuten",
type: "number",
role: "value.interval",
unit: "min",
write: true,
common: { min: 0, max: 360 }
}
]);
}
}
module.exports = PortCreator;