foxthefox / ioBroker.fritzdect

Fritzbox DECT adapter for ioBroker
MIT License
40 stars 12 forks source link

window open active dect 300 #60

Closed Jaaannis closed 1 year ago

Jaaannis commented 4 years ago

Hi,

die manuelle Steuerung des "Fenster auf" Button (physisch am Thermostat) erzeugt in der Fritz. Box unmittelbar eine Aktion.

Kann diese Aktion nicht auch über den Adapter verfolgt und gesteuert werden ? Hintergrund der Anfrage ist natürlich die 15 min Regelung.

Vielen Dank für die bisherige Arbeit !

foxthefox commented 4 years ago

Das Thema wurde ausführlich im Forum behandelt und soweit es nicht eine neue FW seitens AVM gibt, lässt sich da nichts ändern. Die Fritzbox sendet halt nun mal alle 15min an das Thermostat und je nachdem wann man innerhalb der 15min was verändert, dauert es länger oder kürzer.

foxthefox commented 4 years ago

Das ist eine Eigenschaft des Fritz-Ökosystems und kann nicht durch den Adapter beeinflusst werden

GottZ commented 3 years ago

@foxthefox

(fritz dect 300 max 2 stunden, fritz dect 301 max 24 stunden)

falsch. sowohl boost modus als auch fenster offen modus können über openhab gesetzt werden: https://community.openhab.org/t/avm-fritz-binding-does-not-recognize-radiator-mode-window-open/70265/11

folglich sollte es auch möglich sein, dies in diesem binding zu tun.

foxthefox commented 3 years ago

Jetzt schon. Da hat sich seit dem letzten Update im April etwas getan. Den Datenpunkt habe ich auch schon im neuesten 1.1.0 angelegt, aber noch nicht getestet.

GottZ commented 3 years ago

ich kann auf jeden fall mit drei dect 301 gegentesten.

foxthefox commented 3 years ago

es sollte jetzt mit 1.1.1 laufen, dazu sind 2 bedienbar Datenpunkte vorhanden (boost, windowopen) später lege ich die mal noch auf den eigentlichen Datenpunkt. es ist auch eine Zeit in min anzugeben, wie lange dieser Zustand vorhalten soll. Das einzige was ich sehen konnte, der von mir übergebene Zeitwert wird richtig berechnet, aber von der fritzbox kommt etwas >1h Differenz zurück. ??? Evtl. ist hier die Zeitzone irgendwie mit drin und dann auch noch der restliche Teil der 15min Sendepause.

GottZ commented 3 years ago

naja die 15 minuten sind ja polling und nicht sendepause. die rwe / innogy smart home thermostate brauchen auch ewig.

ich spiel damit mal rum sobald ich wieder zuhause bin.

wenn ich die api richtig verstanden habe dann ist 0 = fenster geschlossen / boost aus

was würdest du von neinem read/write switch halten der einfach zwischen 0 und 3600 wechselt? (3600 evtl konfigurierbar in der instanz einstellung) in dem fall müssten user halt darüber in kenntnis gesetzt werden dass der kram nicht permanent ist.

und zur zeit differenz: das is doch eigentlich gar kein timestamp sondern nur eine zeit in sekunden bis zum ablauf.

foxthefox commented 3 years ago

laut AHA API ist ein endtimestamp zu übergeben, dieser soll in Sekunden nach 1970 sein, also fast unix standard (Faktor 1000, anstatt ms). Diese Endzeit errechne ich mit dem Minutenwert, der parallel dazu voreinzustellen ist. diese Zeit übergebe ich und bei erfolgreicher Übernahme durch die Fritzbox kommt die endtime als Antwort zurück. Dieser zurückgelieferte Wert ist halt erheblich anders als der den ich geschickt habe. Was genau dann mit thermostat passiert und wie lange der Befehl dann realisiert wird, das bleibt zu testen.

0/1 und false/true kann man auch noch verbessern

GottZ commented 3 years ago

hm. stimmt.

so z.b.: switchcmd=sethkrwindowopen&ain=182367192387&endtimestamp=1607862116

also im endeffekt (Date.now() / 1e3 | 0) + 3600 für ne stunde und 0 zum deaktivieren.

du hast btw einen boost switch aber keinen für windowopen. gucke mir 1.1.2 gerade im object browser an.

ich fliege mal über deine commits.

GottZ commented 3 years ago

fehlt da nicht ein Math.floor()?

https://github.com/foxthefox/ioBroker.fritzdect/blob/54e5771a2daa0c1a6aa16f94cde2d66fd1e9f82b/main.js#L214

https://github.com/foxthefox/ioBroker.fritzdect/blob/54e5771a2daa0c1a6aa16f94cde2d66fd1e9f82b/main.js#L272

das hier ist halt abhängig von der auf dem server eingerichteten zeitzone. vielleicht haste deine kiste auf UTC und siehst deshalb falsche daten. wer weiß.: https://github.com/foxthefox/ioBroker.fritzdect/blob/54e5771a2daa0c1a6aa16f94cde2d66fd1e9f82b/main.js#L228

dit is readonly für mich: https://github.com/foxthefox/ioBroker.fritzdect/blob/54e5771a2daa0c1a6aa16f94cde2d66fd1e9f82b/main.js#L247 habs manuell angepasst.

funktioniert einwandfrei bei mir!

GottZ commented 3 years ago

falls du noch ein beispiel für readme.md brauchst:

const actor = "fritzdect.0.Comet_099950537836.windowopenaktiv";
const provider = "deconz.0.Sensors.12.open";

// reflecting window open sensor state to fritz dect 300 / 301 on change:
on(provider, ({state: {val: open}}) => setState(actor, open));

// prevent thermostat from disabling window open mode as long as the window sensor is open.
on({id: actor, val: false}, async () => {
    const {val: open} = await getStateAsync(provider);
    if (open) setState(actor, open);
});

ok.. ich muss den unteren teil noch überarbeiten. das passt so nicht.

foxthefox commented 3 years ago

hab jetzt noch ein Math.floor eingebaut, schien bare schon so zu funktionieren, schadet aber nicht. windowactiv ist mittlerweile schon als Switch deklariert und sollte auch so aus dem repo gehen. Natürlich hat der raspi eine Zeitzone, aber genau das kann ja auch genau ein Problem erzeugen. Habe keine Ahnung welche Regeln für die Übermittlung von unixtime gelten. Deswegen bleibt es ja zu beobachten wie lang dann wirklich dies realisiert wird. Wenn da was doppelt drin ist, müsste ich evtl. die Zeitzone vor der Übermittlung ausrechnen.

GottZ commented 3 years ago

unixtime hat grundsätzlich keine zeitzone. das problem ist die konvertierung zu einem lesbaren zeitstempel.

ich guck mir das nachher mal genau an. muss jetzt umzugskartons ausladen helfen (sitze im auto btw xD)

meine neue regel (muss ich noch sauber machen / reduzieren)

const radiator = "fritzdect.0.Comet_099950537836";
const sensor = "deconz.0.Sensors.12.open";

// set default close delay to two hours
setState(`${radiator}.windowopenactivetime`, 120);

// reflecting window open sensor state to fritz dect 300 / 301 on change:
on(sensor, ({state: {val: isOpen}}) => setState(`${radiator}.windowopenactiv`, isOpen));

// prevent thermostat from disabling window open mode as long as the window sensor is open.
on(`${radiator}windowopenactiv`, async ({state: {val: openState}}) => {
    const {val: isOpen} = await getStateAsync(sensor);
    if (isOpen !== openState) setState(`${radiator}.windowopenactiv`, isOpen);
});

let resetTimer = null;

onStop(() => {
    if (resetTimer) clearTimeout(resetTimer);
});

// 20 minutes
const minDuration = 20 * 60 * 1000;

// extend window open duration if window open state would change in less than 20 minutes or got disabled already
on(`${radiator}.windowopenactiveendtime`, async ({state: {val: end}}) => {
    const {val: isOpen} = await getStateAsync(sensor);

    const reminder = new Date(end).getTime() - Date.now();

    if (resetTimer) clearTimeout(resetTimer);

    if (!isOpen) {
        if (reminder >= 0) {
            setState(`${radiator}.windowopenactiv`, false);
        }
        return;
    };

    resetTimer = setTimeout(() => {
        setState(`${radiator}.windowopenactiv`, true);
    }, Math.max(reminder - minDuration, 0));
});
foxthefox commented 3 years ago

also ich glaube es sieht gut aus mit dem windowopenactiv

foxthefox commented 3 years ago

Kann der Problemreport geschlossen werden?

GottZ commented 3 years ago

kA. hab mich ende dezember von meiner frau getrennt. kann nicht mehr testen da sie die hardware noch hat.