Hallo zusammen,
dass es zu Konflikten/Überschneidungen bei der Steuerung von mehreren Homematic(-IP) Komponenten kommen kann und somit die Werte nicht korrekt gesetzt/übertragen werden, sollte ja kein Problem sein, welches nur bei mir vorkommt.
Bei manchen Konstellationen wurde ich durch einen Fehler im Log darauf aufmerksam.
hm-rpc.0 (26742) xmlrpc -> setValue ["MEQXXXXXXXX:1","LEVEL",1] FLOAT
error: hm-rpc.0 (26742) Cannot call setValue: XML-RPC fault: Failure
Jedoch musste ich feststellen, dass dies nicht immer der Fall ist. Manchmal wird einfach der Wert nicht korrekt übertragen und somit führen die Geräte die entsprechende Aktion nicht aus.
Ich beobachte dieses Problem bei mir schon längere Zeit und habe dies auch noch weiterhin nicht lösen können.
Auch habe ich mir hier im Forum in der letzten Zeit viele Beiträge dazu angeschaut, aber leider noch keine wirkliche Lösung/Workarounds gefunden, die umfänglich funktioniert. Daher habe ich mich entschlossen jetzt hierzu doch nochmal einen Beitrag zu eröffnen, mit der Hoffnung neuer Erkenntnisse und mögliche Lösungsansätze zu bekommen.
Meine Infrastruktur:
- RPi 4: piVCCU: 3.63.9.71
- Adapter: ioBroker.javascript v5.7.0
- Adapter: hm-rpc.0 v1.15.12 (HM)
- Adapter: hm-rpc.1 v1.15.121.15.12 (HM-IP)
- HM/IP Komponenten: HM-LC-Bl1-FM / HM-CC-RT-DN / HMIP-eTRV / M-LC-Dim1T-FM / HM-LC-Sw1-FM
Konkretes Beispiel, bei dem das Problem öfters auftaucht.
- Schließen mehrerer Jalousie-Aktoren (HM-LC-Bl1-FM)
- Öffnen mehrerer Jalousie-Aktoren (HM-LC-Bl1-FM) und setzen der Temperatur von Heizkörperthermostate (HM-CC-RT-DN / HMIP-eTRV)
- Ausschalten aller Lichter (HM-LC-Dim1T-FM / HM-LC-Sw1-FM) und setzen der Temperatur von Heizkörperthermostate (HM-CC-RT-DN / HMIP-eTRV)
Hierzu habe ich auch via JavaScript-Script ein paar Tests gemacht um das Verhalten zu verstehen.
Überraschend war für mich, dass mehrere Befehle auf das gleiche Gerät teilweise problemlos funktionieren.
Zusätzlich war interessant, dass teilweise Werte nicht gesetzt werden, dies aber ohne Fehlermeldung im Log.
setState
const LICHT1 = 'hm-rpc.0.MEQXXX1.1.LEVEL';
const LICHT2 = 'hm-rpc.0.MEQXXX2.1.LEVEL';
const LICHT3 = 'hm-rpc.0.MEQXXX3.1.STATE';
const HEIZUNG1 = 'hm-rpc.1.000XXXXXXXA4.1.';
// test1
setState(LICHT1, 30, false);
setState(LICHT1, 0, false);
// Ergebnis: Inkonsistenzes Verhalten: Licht1 geht an und wieder aus / Licht1 beleibt an / Licht1 bleibt aus
// test2
setState(LICHT1, 30, false);
setState(LICHT2, 30, false);
setState(LICHT3, true, false);
// Ergebnis: Licht1 und Licht2 und Licht3 gehen an
//test3
setState(HEIZUNG1 + 'WINDOW_STATE', 1, false); // 0:Closed 1:Open
setState(HEIZUNG1 + 'CONTROL_MODE', 1, false); // 0:Auto 1:Manu 2:Party 3:Boost
setState(HEIZUNG1 + 'SET_POINT_TEMPERATURE', 18, false);
// Ergebnis: Temperatur wird nicht korrekt gesetzt
// --> Trotz unzuverlässiger Werte-Setzung keinerlei Fehler im Log
//test4
setState(HEIZUNG1 + 'CONTROL_MODE', 1, false); // 0:Auto 1:Manu 2:Party 3:Boost
setState(HEIZUNG1 + 'SET_POINT_TEMPERATURE', 18, false);
// Ergebnis: Temperatur wird nicht korrekt gesetzt (egal in welcher Reihenfolge)
// Steht aber einer der 3 Werte bereits auf den zu setzenden Wert, werden somit "alle" korrekt gesetzt
// --> Trotz unzuverlässiger Werte-Setzung keinerlei Fehler im Log
// test5
setState(LICHT1, 30, false);
setState(LICHT2, 30, false);
setState(LICHT3, true, false);
setState(HEIZUNG1 + 'SET_POINT_TEMPERATURE', 14, false);
// Ergebnis: Licht1 und Licht2 und Licht3 gehen an, aber Temperatur wird nicht korrekt gesetzt
// --> Trotz unzuverlässiger Werte-Setzung keinerlei Fehler im Log
setStateDelayed
const LICHT1 = 'hm-rpc.0.MEQXXX1.1.LEVEL';
const LICHT2 = 'hm-rpc.0.MEQXXX2.1.LEVEL';
const LICHT3 = 'hm-rpc.0.MEQXXX3.1.STATE';
const HEIZUNG1 = 'hm-rpc.1.000XXXXXXXA4.1.';
// test1
setStateDelayed(LICHT1, 30, false, 5000);
setStateDelayed(LICHT1, 0, false, 10000);
// Ergebnis: Licht1 bleibt aus, da nur letzter Befehl durchgeführt wird
// test1
setStateDelayed(LICHT1, 30, false, 5000);
setStateDelayed(LICHT1, 0, false, 10000, false);
// Ergebnis: Licht1 geht an und wieder aus
// test3
setStateDelayed(LICHT1, 30, false, 5000);
setStateDelayed(LICHT2, 30, false, 5000);
setStateDelayed(LICHT3, true, false, 5000);
// Ergebnis: Licht1 und Licht2 und Licht3 gehen an
// test4
setStateDelayed(LICHT1, 30, false, 5000);
setStateDelayed(LICHT2, 30, false, 5000);
setStateDelayed(LICHT3, true, false, 5000);
setStateDelayed(LICHT1, 0, false, 10000);
setStateDelayed(LICHT2, 0, false, 10000);
setStateDelayed(LICHT3, false, false, 5000);
// Ergebnis: Licht1 und Licht2 und Licht3 bleiben aus, da nur letzter Befehl je ID durchgeführt wird
// test5
setStateDelayed(LICHT1, 30, false, 5000);
setStateDelayed(LICHT2, 30, false, 5000);
setStateDelayed(LICHT3, true, false, 5000);
setStateDelayed(LICHT1, 0, 10000, false);
setStateDelayed(LICHT2, 0, 10000, false);
setStateDelayed(LICHT3, false, 10000, false);
// Ergebnis: Licht1 und Licht2 und Licht3 gehen an und wieder aus
// test6
setStateDelayed(HEIZUNG1 + 'WINDOW_STATE', 0, false, 5000); // 0:Closed 1:Open
setStateDelayed(HEIZUNG1 + 'CONTROL_MODE', 1, false, 5000); // 0:Auto 1:Manu 2:Party 3:Boost
setStateDelayed(HEIZUNG1 + 'SET_POINT_TEMPERATURE', 18, false, 5000);
// Ergebnis: Es werden immer nur 2 Werte zuverlässig/korrekt gesetzt und ein Wert nicht
// Steht aber einer der 3 Werte bereits auf den zu setzenden Wert, werden somit "alle" korrekt gesetzt
// --> Trotz unzuverlässiger Werte-Setzung keinerlei Fehler im Log
// test7
setStateDelayed(HEIZUNG1 + 'WINDOW_STATE', 0, false, 5000); // 0:Closed 1:Open
setStateDelayed(HEIZUNG1 + 'CONTROL_MODE', 1, false, 5000, false); // 0:Auto 1:Manu 2:Party 3:Boost
setStateDelayed(HEIZUNG1 + 'SET_POINT_TEMPERATURE', 14, false, 5000, false);
// Ergebnis: Heizung1 Fensterstatus, Temperatur und Modus wird korrekt gesetzt
// test8
setStateDelayed(HEIZUNG1 + 'WINDOW_STATE', 1, false, 5000); // 0:Closed 1:Open
setStateDelayed(HEIZUNG1 + 'SET_POINT_TEMPERATURE', 14, false, 5000, false);
setStateDelayed(HEIZUNG1 + 'CONTROL_MODE', 1, false, 5000, false); // 0:Auto 1:Manu 2:Party 3:Boost
// Ergebnis: Heizung1 Fensterstatus und Modus wird korrekt gesetzt, aber Temperatur wird nicht immer korrekt gesetzt
// (teilweise auf ganz anderen Wert)
// --> Trotz unzuverlässiger Werte-Setzung keinerlei Fehler im Log
// test9
script1:
//setStateDelayed(LICHT1, 30, false, 5000);
//script2:
setStateDelayed(LICHT1, 0, false, 10000);
// Ergebnis: Licht1 bleibt aus, da nur letzter Befehl durchgeführt wird
// test10
//script1:
setStateDelayed(LICHT1, 30, false, 5000);
//script2:
setStateDelayed(LICHT1, 0, false, 10000, false);
// Ergebnis: Licht1 geht an und wieder aus
Mögliche Lösungsansätze (welche ich hier im Forum gefunden habe)
- Expliziter JS-Code für Verzögerungen der einzelnen Befehle um X Sekunden
schedule()
setTimeout()
async function sleep(milliseconds) { return new Promise(resolve => setTimeout(resolve, milliseconds));};
- Aufsteigende Verzögerung bei Iteration via setStateDelayed()
for (var i = 0; i < stateIds.length; i++) {
setStateDelayed(id, true, false, i * 300, false);
}
-
Befehl wiederholen, wenn der Aktor nach ein paar Sekunden nicht den Sollzustand hat
https://forum.iobroker.net/topic/53725/gelöst-gelegentlich-fehler-bei-homematic/7?_=1655732666750
-
Anpassung der HM-Gerät-Einstellungen direkt in der CCU
- Max. Sendeversuche
- Statusmeldungen Zufallsanteil
- Statusmeldungen Mindestverzögerung
Alle diese Lösungsansätze, funktionierten bei mir jedoch nicht wirklich zuverlässig und bringen teilweise weitere Nachteile mit sich u. a.
- Bei Ansatz 1 und 2 ist nicht sichergestellt, dass der Wert übermittel wurde ohne das darauf reagiert werden kann.
- Bei Ansatz 3 wird ggf. viel Datenverkehr verursacht, was die Situation evtl. noch verschlimmert
- Bei Ansatz 4 konnte ich keine Verbesserung zu diesem Problem feststellen
- Bei allen Ansätzen kann der Zeitraum zu klein sein und es weiterhin unkontrolliert zu Problemen kommen.
Wird der Wert zu groß gewählt, läuft das Script unnötig lange und führ die Befehle (unnötig) verzögert aus.
- All diese Ansätze verhindern keine Konflikte/Überschneidungen, wenn mehrere Scripte gleichzeitig auf HM-Geräte zugreifen und Werte setzen wollen.
Idee für einen möglichen Lösungsansatz
Script welches eine zentrale Queue und deren Verarbeitung für das Setzen von Werten zur Verfügung stellt. Durch diesen zentralen Punkt wäre neben einem zentralen Fehlerhandlings, eine globale Steuerung über mehrere Scripte möglich, um Konflikte/Überschneidungen zu minimieren/vermeiden.
Fragen an euch
- Gibt es ggf. sowas wie eine zentrale Queue schon und es mir nur noch nicht bekannt?
- Wie sehen eurer Erfahrungen zu diesem Thema aus?
- Wie geht ihr mit dem Problem um?
- Habt ihr Lösungsansätze, welche sich bei euch über einen längeren Zeitraum bewährt haben?
- Gibt es noch weitere Lösungsansätze, welche ich noch nicht auf dem Schirm habe?
Danke und Gruß
Esche