vielleicht stehe ich auf dem Schlauch, aber ich kriege es nicht hin mein eigens erzeugtes Gerät mit der App “Device Capabilities” aus HomeyScript zu beschreiben. Hat da jemand ein best practice?
Natürlich mache ich das ganze mit ChatGPT. Es geht um die Berechnung des COP-Wertes einer Klimaanlage.
// Change "my_device_name" into device name you want to find the ID of
const deviceName = "my_device_name";
// End of user input
const devices = await Homey.devices.getDevices();
for (const device of Object.values(devices)) {
if (device.name === deviceName) {
// Return some properties. Just remove what you don't need
log(`\nName:\t\t ${device.name} \nZone:\t\t ${device.zoneName} \nID:\t\t ${device.id} \nDriver:\t\t ${device.driverId} \nCapabilities:\t ${device.capabilities} \nBattery:\t ${device.energyObj.batteries} \nNote\t\t ${device.note}`);
// To show ALL device data, uncomment the next lime:
//log(device);
}
};
return(true);
Also das hat alles nicht geklappt, ich mache jetzt folgendes:
Ich schreibe die Werte in Logik-Variablen und lasse anschließend einen Advanced Flow laufen mit dem Trigger, wenn sich die Logik-Variable COP_actual verändert, dass er anschließend das Custom-Gerät “COP” von der Device Capabilities-App mit den Werten der Variablen aktualisiert. Das funktioniert ohne Probleme. Ein normaler Flow startet das Homey-Script alle 30 Sekunden.
Hier nochmal das Skript:
'use strict';
// Lüfterstufen-Mapping
const AIRFLOW_MAP_M3_MIN = {
'highest': 13.9,
'high': 11.2,
'low': 9.1,
'lowest': 7.4
};
const CP_AIR = 1005;
const AIR_DENSITY = 1.2;
const DEFAULT_AIRFLOW_M3S = AIRFLOW_MAP_M3_MIN["high"] / 60;
const INDOOR_ID = '094474a6-7a35-404a-8f35-4f1f280b0cbc';
const SHELLY_ID = 'cad4c083-e05f-4567-8fbd-35273844b677';
// Hilfsfunktion: Heiz-Luftstrom (String) → m³/s
function mapAirflowToM3s(airflowString) {
if (!airflowString) return null;
const key = airflowString.toLowerCase();
if (key === 'auto') return null;
const m3_min = AIRFLOW_MAP_M3_MIN[key];
return (m3_min != null) ? (m3_min / 60) : null;
}
// Hilfsfunktionen: Logikvariablen lesen & schreiben (deine Methode)
async function ReadLogicVar(name){
let Logic = await Homey.logic.getVariables();
let idArr = Object.entries(Logic);
let filtered = idArr.filter(([key,value]) => value.name==name);
let [[,{id:varID}]] = filtered;
var varArr = await Homey.logic.getVariable({id:varID});
return varArr.value;
}
async function WriteLogicVar(name,value){
let Logic = await Homey.logic.getVariables();
let idArr = Object.entries(Logic);
let filtered = idArr.filter(([key,value]) => value.name==name);
let [[,{id:varID}]] = filtered;
var varArr = await Homey.logic.getVariable({id:varID});
await Homey.logic.updateVariable({id:varID, variable:{value:value}});
return true;
}
async function run() {
// 1. Zuerst "onoff" prüfen
let isOn = false;
try {
isOn = await Homey.devices.getCapabilityValue({
deviceId: INDOOR_ID,
capabilityId: 'onoff'
});
} catch (err) {
console.error('‼ Fehler beim Lesen der onoff-Capability:', err.message);
return;
}
if (!isOn) {
console.log("Klimaanlage ist aus (onoff: false) – keine Berechnung, keine Variablen-Änderung.");
return;
}
// Messwerte holen
let airflowString, tempIn, tempOut, powerInput;
try {
airflowString = await Homey.devices.getCapabilityValue({
deviceId: INDOOR_ID,
capabilityId: 'fan_speed'
});
tempIn = await Homey.devices.getCapabilityValue({
deviceId: INDOOR_ID,
capabilityId: 'measure_temperature'
});
tempOut = await Homey.devices.getCapabilityValue({
deviceId: INDOOR_ID,
capabilityId: 'measure_temperature.outdoor'
});
powerInput = await Homey.devices.getCapabilityValue({
deviceId: SHELLY_ID,
capabilityId: 'measure_power'
});
} catch (err) {
console.error('‼ Gerätefehler:', err.message);
return;
}
// Luftstrom bestimmen
let airflow_m3s = mapAirflowToM3s(airflowString);
if (airflow_m3s == null) airflow_m3s = DEFAULT_AIRFLOW_M3S;
const deltaT = tempIn - tempOut;
const qThermal = airflow_m3s * AIR_DENSITY * CP_AIR * deltaT;
const instantCOP = (powerInput > 0) ? (qThermal / powerInput) : 0;
// Aktuelle Werte in Logik schreiben
await WriteLogicVar("COP_actual", Number(instantCOP.toFixed(2)));
await WriteLogicVar("COP_thermal", Number(qThermal.toFixed(1)));
// Summe und Zähler auslesen
let sum = Number(await ReadLogicVar("COP_sum")) || 0;
let count = Number(await ReadLogicVar("COP_count")) || 0;
// Neue Werte berechnen
sum += Number(instantCOP);
count += 1;
let avg = sum / count;
// Neue Werte schreiben
await WriteLogicVar("COP_sum", sum);
await WriteLogicVar("COP_count", count);
await WriteLogicVar("COP_average", Number(avg.toFixed(2)));
// Logging
console.log(`→ COP_actual: ${instantCOP.toFixed(2)}`);
console.log(`→ COP_thermal: ${qThermal.toFixed(1)} W`);
console.log(`→ COP_sum: ${sum}, COP_count: ${count}`);
console.log(`→ COP_average: ${avg.toFixed(2)}`);
}
run().catch(err => console.error('‼ Ungefangener Fehler:', err.message));