@jamalau tatsächlich ist es so einfach:
JavaScript anlegen, den Code einfügen und starten.
Nur wenn du mehrere Homematic IP Instanzen hast, müsstest du noch die Variable WATCHING_INSTANCE anpassen.
Viele Grüße
@jamalau tatsächlich ist es so einfach:
JavaScript anlegen, den Code einfügen und starten.
Nur wenn du mehrere Homematic IP Instanzen hast, müsstest du noch die Variable WATCHING_INSTANCE anpassen.
Viele Grüße
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();
});
@arteck Danke dir für deine Rückmeldung.
Nein, habe ich noch nicht. Was genau meinst du damit? Hast du vielleicht ein Beispiel oder ein Link zu einer Doku?
Viele Grüße
Guten Morgen,
folgender Fall: Ich möchte meinen Fernseher per Google Home umschalten. Jedoch würde ich ungern für jeden Sender eine Zeile im IoT-Adapter vergeben.
Das ideale Szenario sieht so aus:
Ok Google aktiviere Fernseher auf $var
$var könnte ein Sender, wie ARD oder ZDF sein.
Den Datenpunkt kann ich dann per Skript auslesen und über eine Switch-Anweisung entsprechend behandeln.
Jedoch schaffe ich es nicht, Google eine Variable mitzugeben. Über IFTTT ging das früher mal.
Hat jemand eine Idee, wie man das im IoT-Adpater umsetzen könnte?
Vielleicht hat alternativ jemand eine Dokumentation zum JSON-Code, der im IoT-Adapter unter Google-Geräte eingetragen werden kann? Also was kann in der Zelle "in GH konvertieren" bzw. "in ioB konvertieren" eingetragen werden? Welche Parameter gibt es und was bewirken diese?
Danke euch!