Ich habe es auch nicht per MQTT zum laufen gebracht. Die Rollos wurden nicht verlässlich angesteuert. Habe jetzt auch HTTP genutzt, wer zu faul war was selber zu schreiben. Hier die funktionstüchtige Lösung von Chatgpt:
/**
* ESPSomfy RTS Steuerung per HTTP
*
* Homematic LEVEL:
* 0 = offen
* 100 = geschlossen
*
* ESPSomfy:
* 0 = geschlossen
* 100 = offen
*
* Umrechnung:
* Somfy = 100 - Homematic
*
*/
const request = require('request');
// =====================================================================
// Konfiguration
// =====================================================================
// IP-Adresse des ESPSomfy Controllers
const ESPSOMFY_IP = "192.168.XX.YY";
// Homematic-Datenpunkte
const SHADES = [
{
name: "Küche",
dp: "hm-rpc.1.CUX4000001.4.LEVEL",
shadeId: 1
},
{
name: "Wohnzimmer",
dp: "hm-rpc.1.CUX4000001.1.LEVEL",
shadeId: 2
},
{
name: "Wohnzimmer Klein",
dp: "hm-rpc.1.CUX4000001.2.LEVEL",
shadeId: 3
},
{
name: "Wohnzimmer Tür",
dp: "hm-rpc.1.CUX4000001.3.LEVEL",
shadeId: 4
}
];
// =====================================================================
// Funktionen
// =====================================================================
/**
* Homematic LEVEL (0-100)
* -> ESPSomfy LEVEL (100-0)
*/
function convertLevel(hmLevel) {
hmLevel = Number(hmLevel);
if (isNaN(hmLevel)) {
return null;
}
return Math.round(100 - hmLevel);
}
/**
* HTTP-Befehl an ESPSomfy senden
*/
function sendToSomfy(name, shadeId, hmLevel) {
const somfyLevel = convertLevel(hmLevel);
if (somfyLevel === null) {
log(name + ": Ungültiger LEVEL-Wert: " + hmLevel, "warn");
return;
}
const url =
"http://" +
ESPSOMFY_IP +
"/shadeCommand?shadeId=" +
shadeId +
"&target=" +
somfyLevel;
request(url, function (err, response) {
if (err) {
log(name + ": HTTP Fehler - " + err, "error");
return;
}
log(
name +
": Homematic=" + hmLevel +
"% → Somfy=" + somfyLevel +
"%",
"info"
);
});
}
// =====================================================================
// Events registrieren
// =====================================================================
SHADES.forEach(function (shade) {
on({ id: shade.dp, change: "ne" }, function (obj) {
const hmLevel = obj.state.val;
sendToSomfy(
shade.name,
shade.shadeId,
hmLevel
);
});
});
log("ESPSomfy RTS HTTP Steuerung gestartet", "info");