Das von @jamalau beschriebene Problem tritt bei mir auch auf. Allerdings kann ich es nicht auf eine bestimmte Zeit eingrenzen. Es passiert meistens einmal am Tag - aber zu unterschiedlichsten Zeiten. Manchmal läuft der Adapter auch ohne Probleme zwei / drei Tage durch.
Ich hatte schon überlegt, ein Issue auf Github zu erstellen, aber im Debug Log finde ich einfach keinen Eintrag dazu. Die Log-Einträge verstummen einfach mit Eintreten des Problems.
Mein Workaround ist ein Skript, welches auf das letzte Update prüft und den Adapter neu startet, falls das Update zu lange her ist. Vielleicht hilft es jemanden:
/* ------------- CONFIG ------------- */
const TIME_TREASHOLD = 10 * 60 * 1000; // 10 minutes in ms - wie lange muss das letzte Lebenszeichen her sein
const ATTEMPTS_TIME = 60 * 60 * 1000; // 60 minutes in ms - wie lange muss der letzte neustart her sein, damit es nicht als neuer Versuch gewertet wird
const ATTEMPTS_TREASHOLD = 3; // Anzahl maximaler Neustartversuche
const WATCHING_INSTANCE = 'hmip.0'; // Instanz die überwacht werden soll
/* ------------- SKRIPT ------------- */
class HomematicWatcher {
constructor() {
this.states = [];
this.latestUpdate = new Date('1990-01-01');
this.lastRestart = new Date('1990-01-01');
this.attempts = 0;
}
collectStates() {
$(`${WATCHING_INSTANCE}.*`).each((id) => {
if(existsState(id)) {
this.states.push(id);
}
});
}
determineLastestUpdate() {
for (let i = 0; i < this.states.length; i++) {
const lastUpdate = getState(this.states[i]).ts;
if (lastUpdate !== undefined) {
const lastUpdate_ts = new Date(lastUpdate);
if (lastUpdate_ts > this.latestUpdate) {
this.latestUpdate = lastUpdate_ts;
}
}
}
}
checkForRestart() {
if (new Date().getTime() - this.latestUpdate.getTime() > TIME_TREASHOLD) {
// Instanz neu starten
this.restartInstance();
}
}
getInstanceState() {
var obj_instance = getObject(`system.adapter.${WATCHING_INSTANCE}`);
return obj_instance.common.enabled;
}
setInstanceState(val) {
var obj_instance = getObject(`system.adapter.${WATCHING_INSTANCE}`);
obj_instance.common.enabled = val;
setObject(`system.adapter.${WATCHING_INSTANCE}`, obj_instance);
console.warn(`HmIP Instanz ${WATCHING_INSTANCE} wurde ${val ? 'gestartet' : 'gestoppt'}`);
}
restartInstance() {
// Nur neu starten, wenn Instanz bereits läuft
if(this.getInstanceState() != false) {
// Anzahl der Neustartversuche zählen, wenn letzter Neustart weniger als ATTEMPTS_TIME her ist
if (new Date().getTime() - this.lastRestart.getTime() < ATTEMPTS_TIME) {
this.attempts++;
} else {
this.attempts = 0;
}
try {
// Nur neu starten, wenn Anzahl der erlaubten Versuche noch nicht überschritten wurde
if (this.attempts <= ATTEMPTS_TREASHOLD) {
// Instanz stoppen
this.lastRestart = new Date();
this.setInstanceState(false);
// Instanz starten
setTimeout(() => {
this.lastRestart = new Date();
this.setInstanceState(true);
}, 3000);
} else {
console.error(`Instanz ${WATCHING_INSTANCE} wurde bereits ${this.attempts} mal neugestartet. Abbruch.`);
}
}
catch (e) {
console.error(`Fehler beim Neustart der Instanz ${WATCHING_INSTANCE}: ${e}`)
}
}
}
}
// Ausführen bei Skriptstart
const watcher = new HomematicWatcher()
watcher.collectStates();
watcher.determineLastestUpdate();
watcher.checkForRestart();
// Schedule alle zwei Minuten
schedule('*/2 * * * *', () => {
watcher.determineLastestUpdate();
watcher.checkForRestart();
});