Hallo zusammen,
ich möchte diesem Forum gerne etwas zurück geben, nachdem ich bereits so oft hier Hilfe und Unterstützung bekommen habe.
Ich habe mich schon lange gefragt, wie eine gut und korrekte Lüftungsempfehlung aussehen kann. dabei bin ich über diese Seite gestolpert:
https://www.sarahandrobin.com/ingo/luftfeuchtigkeit.php
hier wird das Thema wirklich sehr umfassend behandelt und ein Rechner zu verfügung gestellt. Ich bin sehr dankbar, dass ich dieses nutzen durfte und hier auch teilen darf. Ich haben diesen für homey angepasst.
Zunächst braucht ihr dieses Homey Script:
const searchname = "Luft Bad";
async function findDeviceByName(searchname) {
try {
// Abrufen aller Geräte
const devices = await Homey.devices.getDevices();
// Filtern der Geräte basierend auf dem Namen
const matchedDevices = Object.values(devices)
.filter(device => device.name.toLowerCase().includes(searchname.toLowerCase()))
.map(device => ({ id: device.id, name: device.name }));
// Überprüfen, ob Geräte gefunden wurden
if (matchedDevices.length > 0) {
console.log('Gefundene Geräte:', matchedDevices);
} else {
console.log('Keine Geräte gefunden, die den Namen enthalten:', searchname);
}
return matchedDevices;
} catch (error) {
console.error('Fehler beim Abrufen der Geräte:', error);
}
}
// Skript ausführen
findDeviceByName(searchname);
Bei “Luft Bad” gebt ihr bitte den Namen eure Gerätes ein, dass die Luftfeuchtigkeit und Temperatur im Raum misst.
Dieses Script Startet ihr in Homey und erhaltet die ID eures Gerätes.
Das selbe mach ihr für euren Sensor draußen. Auch hier die ID notieren.
Dann erstellt ihr eine neue Text Variable z.B. mit dem Namen “2. Lüften Bad”
Dann nehmt ihr dieses Script:
// IDs der Sensoren
const innenSensorId = 'hier ID eingeben'; // Innen-Sensor-ID
const aussenSensorId = 'hier ID eingeben'; // Außen-Sensor-ID
// Funktion, um den Wert eines Sensors zu holen
async function getCapabilityValue(deviceId, capability) {
try {
let device = await Homey.devices.getDevice({ id: deviceId });
return device.capabilitiesObj[capability].value;
} catch (error) {
console.error(`Fehler beim Abrufen des Werts für Gerät ${deviceId} und Fähigkeit ${capability}:`, error);
return null;
}
}
// Berechnung der absoluten Feuchtigkeit
function absoluteFeuchte(r, t) {
let a, b;
if (t >= 0) {
a = 7.5;
b = 237.3;
} else {
a = 7.6;
b = 240.7;
}
return (Math.pow(10, 5) * 18.016 / 8314.3 * r / 100.0 * 6.1078 * Math.pow(10, (a * t) / (b + t))) / (t + 273.15);
}
// Berechnung der umgerechneten Innenfeuchte
function umgerechneteInnenFeuchte(aussenTemp, aussenFeuchte, innenTemp) {
let a1, b1, a2, b2;
if (aussenTemp >= 0) {
a1 = 7.5;
b1 = 237.3;
} else {
a1 = 7.6;
b1 = 240.7;
}
if (innenTemp >= 0) {
a2 = 7.5;
b2 = 237.3;
} else {
a2 = 7.6;
b2 = 240.7;
}
return aussenFeuchte * Math.pow(10, (a1 * aussenTemp) / (b1 + aussenTemp)) / Math.pow(10, (a2 * innenTemp) / (b2 + innenTemp)) * (innenTemp + 273.15) / (aussenTemp + 273.15);
}
async function main() {
// Innenwerte (Temperatur und Feuchtigkeit)
const innenTemp = await getCapabilityValue(innenSensorId, 'measure_temperature');
const innenFeuchte = await getCapabilityValue(innenSensorId, 'measure_humidity');
// Außenwerte (Temperatur und Feuchtigkeit)
const aussenTemp = await getCapabilityValue(aussenSensorId, 'measure_temperature');
const aussenFeuchte = await getCapabilityValue(aussenSensorId, 'measure_humidity');
// Überprüfen, ob Werte erfolgreich abgerufen wurden
if (innenTemp === null || innenFeuchte === null || aussenTemp === null || aussenFeuchte === null) {
console.error('Nicht alle Sensorwerte konnten abgerufen werden.');
return;
}
// Ausgabe der Werte in der Konsole
console.log(`Innen-Temperatur: ${innenTemp}`);
console.log(`Innen-Feuchtigkeit: ${innenFeuchte}`);
console.log(`Außen-Temperatur: ${aussenTemp}`);
console.log(`Außen-Feuchtigkeit: ${aussenFeuchte}`);
// Berechnungen
const innenAbsFeuchte = round(absoluteFeuchte(innenFeuchte, innenTemp), 1);
const aussenAbsFeuchte = round(absoluteFeuchte(aussenFeuchte, aussenTemp), 1);
console.log(`Absolute Feuchtigkeit Innen: ${innenAbsFeuchte} g/m³`);
console.log(`Absolute Feuchtigkeit Außen: ${aussenAbsFeuchte} g/m³`);
const innenFeuchteI = round(umgerechneteInnenFeuchte(aussenTemp, aussenFeuchte, innenTemp), 0);
// Näherung
const deltaTemp = innenTemp - aussenTemp;
const innenFeuchteN = round(aussenFeuchte - 3.0 * deltaTemp, 0);
console.log(`Auf die Innentemperatur umgerechnete Außenluftfeuchtigkeit: ${innenFeuchteI} %`);
console.log(`Näherungsformel: Außenfeuchte - 3*Δt = ${aussenFeuchte} - 3 * ${deltaTemp} = ${innenFeuchteN} %`);
const neueInnenRelFeuchte = round(0.25 * innenFeuchte + 0.75 * innenFeuchteI, 0);
let lueftungsergebnis = '';
// Ergebnisse interpretieren
if (Math.abs(innenAbsFeuchte - aussenAbsFeuchte) <= 0.5) {
lueftungsergebnis = 'Etwa gleiche Feuchtigkeiten innen und außen';
} else if (innenAbsFeuchte > aussenAbsFeuchte && innenTemp > aussenTemp) {
lueftungsergebnis = 'Lüften!!';
} else if (innenAbsFeuchte > aussenAbsFeuchte && innenTemp <= aussenTemp) { // Korrigiert
lueftungsergebnis = 'Lüften möglich, aber es wird dadurch wärmer!!';
} else if (neueInnenRelFeuchte <= 55) {
lueftungsergebnis = 'Kurzes Lüften möglich, aber es wird dadurch etwas feuchter (ist aber bis 50-60 % OK)';
} else if (neueInnenRelFeuchte <= 65) {
lueftungsergebnis = 'Sehr kurzes Lüften möglich, aber es wird dadurch viel feuchter (ist aber bis 60 % noch akzeptabel)';
} else {
lueftungsergebnis = 'NICHT lüften!';
}
console.log(lueftungsergebnis);
// Lüftungsergebnis als Variable in Homey speichern
const variableName = "2. Lüften Bad";
try {
let variables = await Homey.logic.getVariables();
let variable = Object.values(variables).find(v => v.name === variableName);
if (variable) {
// Variable existiert, Wert aktualisieren
await Homey.logic.updateVariable({ id: variable.id, variable: { value: lueftungsergebnis } });
console.log(`Variable '${variableName}' aktualisiert: ${lueftungsergebnis}`);
} else {
// Variable existiert nicht, neue Variable erstellen
await Homey.logic.createVariable({ name: variableName, type: 'string', value: lueftungsergebnis });
console.log(`Variable '${variableName}' erstellt und gesetzt: ${lueftungsergebnis}`);
}
} catch (error) {
console.error(`Fehler beim Speichern der Variable '${variableName}':`, error);
}
}
// Hilfsfunktion zum Runden auf eine bestimmte Anzahl von Dezimalstellen
function round(value, decimals) {
return Number(Math.round(value + 'e' + decimals) + 'e-' + decimals);
}
// Skript ausführen
main();
tragt nun bitte ganz oben bei “hier ID eingeben” die ID der beiden Geräte ein.
Dann bitte bei Zeile 108 den Namen der Variable eingeben.
nun könnt ihr das Script das erste ma testen.
Dann einen Flow erstellen.
Ich habe das so gelöst:
Dann könnt ihr mit der Variable in euren Flows weiter arbeiten.
Bei Fragen meldet euch gerne. Ich hoffe es kann jemandem weiterhelfen!