Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Integration Vor Heitzungs Zeiten #10

Open
MiniAdnim opened this issue Aug 31, 2019 · 11 comments
Open

Integration Vor Heitzungs Zeiten #10

MiniAdnim opened this issue Aug 31, 2019 · 11 comments
Labels
enhancement New feature or request

Comments

@MiniAdnim
Copy link

Gut wäre es der Adapter würde auch die Vorraus Zeiten zum Hochheitzen messen und setzen.
wie im Skript aus dem Forum:

`var rooms= {
'EG-Esszimmer': {
stateIdHeizungStatus: "hm-rpc.1.MEQ0559168.4.VALVE_STATE", // Status des Heizungsaktors zur Erkennung wann geheizt wird und wann nicht
heizungStatusIstAktor: false, // Status-State ist Aktor (=true) oder Stellventil (=false)
stateIdIstTemperatur: "hm-rpc.1.MEQ0559168.4.ACTUAL_TEMPERATURE" // Ist-Temperatur
},
'EG-Wohnzimmer': {
stateIdHeizungStatus: "hm-rpc.1.MEQ1558304.4.VALVE_STATE", // Status des Heizungsaktors zur Erkennung wann geheizt wird und wann nicht
heizungStatusIstAktor: false, // Status-State ist Aktor (=true) oder Stellventil (=false)
stateIdIstTemperatur: "hm-rpc.1.MEQ1558304.4.ACTUAL_TEMPERATURE" // Ist-Temperatur
},
'OG-BAD': {
stateIdHeizungStatus: "hm-rpc.1.MEQ0558719.4.VALVE_STATE", // Status des Heizungsaktors zur Erkennung wann geheizt wird und wann nicht
heizungStatusIstAktor: false, // Status-State ist Aktor (=true) oder Stellventil (=false)
stateIdIstTemperatur: "hm-rpc.1.MEQ0558719.4.ACTUAL_TEMPERATURE" // Ist-Temperatur
},
'EG-Buero': {
stateIdHeizungStatus: "hm-rpc.1.MEQ0555014.4.VALVE_STATE", // Status des Heizungsaktors zur Erkennung wann geheizt wird und wann nicht
heizungStatusIstAktor: false, // Status-State ist Aktor (=true) oder Stellventil (=false)
stateIdIstTemperatur: "hm-rpc.1.MEQ0555014.4.ACTUAL_TEMPERATURE" // Ist-Temperatur
},
'OG-Rechts': {
stateIdHeizungStatus: "hm-rpc.1.MEQ0549536.4.VALVE_STATE", // Status des Heizungsaktors zur Erkennung wann geheizt wird und wann nicht
heizungStatusIstAktor: false, // Status-State ist Aktor (=true) oder Stellventil (=false)
stateIdIstTemperatur: "hm-rpc.1.MEQ0549536.4.ACTUAL_TEMPERATURE" // Ist-Temperatur

},
'Boiler': {
    stateIdHeizungStatus: "hm-rpc.1.OEQ2401095.1.STATE", // Status des Heizungsaktors zur Erkennung wann geheizt wird und wann nicht
    heizungStatusIstAktor: true, // Status-State ist Aktor (=true) oder Stellventil (=false)
    stateIdIstTemperatur: "hm-rpc.1.OEQ0800873.1.TEMPERATURE" // Ist-Temperatur

}
};
var stateBaseId = "javascript.0.Heizung.Aufheizzeit.";
var ventilOeffnungHeizen = 31; // Wenn State ein Ventil ist ab welchem Ventil-Öffnungsstand wird es als "Heizen" betrachtet. 80-90% empfohlen, alles darunter ist eher "warm halten"!
var erkennungAusVerzoegerung = 3; // Zeit in Sekunden wann der Aktor als "Aus" akzeptiert wird, kann auch pro Raum definier werden
var maxIncrease1K = 65; // Maximale 1K-Zeit die akzeptiert wird (alles darüber wird als ungültig verworfen)
var minIncrease1K = 3; // Minimale 1K-Zeit die akzeptiert wird (alles darunter wird als ungültig verworfen)
var debug = false; // Ausführliches Debug-Logging

initialize();

function initialize() {
for (var room in rooms) {
rooms[room].letztesEin = 0;
rooms[room].letztesEinTemp = 0;
rooms[room].letzteTemp = 0;
rooms[room].skriptTimeout = null;
rooms[room].aufheizzeiten = [];
rooms[room].status = getState(rooms[room].stateIdHeizungStatus).val;
if (!rooms[room].heizungStatusIstAktor) {
if (rooms[room].status > rooms[room].ventilOeffnungHeizen) rooms[room].status = true;
else rooms[room].status = false;
}

    if (! rooms[room].erkennungAusVerzoegerung) rooms[room].erkennungAusVerzoegerung = erkennungAusVerzoegerung;
    if (! rooms[room].maxIncrease1K) rooms[room].maxIncrease1K = maxIncrease1K;
    if (! rooms[room].minIncrease1K) rooms[room].minIncrease1K = minIncrease1K;
    if (! rooms[room].ventilOeffnungHeizen) rooms[room].ventilOeffnungHeizen = minIncrease1K;
    rooms[room].ausTimeout = null;

    if (rooms[room].status) {
        rooms[room].letztesEin = new Date().getTime();
        rooms[room].letztesEinTemp = getState(rooms[room].stateIdIstTemperatur).val;
        rooms[room].letzteTemp = rooms[room].letztesEinTemp;
        if (debug) {console.log('    ' + room + ': Aktor eingeschaltet, starte Aufheizmessung jetzt (' + rooms[room].letztesEinTemp + ')');}
    }

    initializeSubscribes(room);

    if (debug) {console.log('Raum ' + room + ' initialisiert, status=' + rooms[room].status);}
}

}

function initializeSubscribes(room) {
createState(stateBaseId + room, {'type': 'number', 'read': true, 'write': true, 'role': 'value', 'unit': 'm'}, function() {
createState(stateBaseId + room + '-Data', {'type': 'string', 'read': true, 'write': true, 'role': 'value', 'unit': '', def: ''}, function() {
var storedData = getState(stateBaseId + room + '-Data').val;
var error = false;
if (storedData) {
try {
rooms[room].aufheizzeiten = JSON.parse(storedData);
}
catch (e) {
console.log('Error reading old Data: ' + e);
error = true;
}
}
if (!storedData || error) {
rooms[room].aufheizzeiten = [];
var storedAvg = getState(stateBaseId + room).val;
if (storedAvg) {
rooms[room].aufheizzeiten.push(storedAvg);
}
setState(stateBaseId + room + '-Data', JSON.stringify(rooms[room].aufheizzeiten), true);
if (debug) {console.log(' Initialize Data ' + room + ': ' + JSON.stringify(rooms[room].aufheizzeiten));}
}
});
});

on({id: rooms[room].stateIdHeizungStatus, change: 'any'}, function(state) {
    if (debug) {console.log('Änderung Status Aktor FBH ' + room + ': ' + state.oldState.val + '--> ' + state.state.val + ' (ack=' + state.state.ack + ', from=' + state.state.from + ') status bisher=' + rooms[room].status);}
    if (!state.state.ack) return;
    if (rooms[room].ausTimeout) {
        clearTimeout(rooms[room].ausTimeout);
        rooms[room].ausTimeout = null;
    }
    var verzoegerung = state.state.val ? 0 : (rooms[room].erkennungAusVerzoegerung * 1000);
    var val = state.state.val;
    if (!rooms[room].heizungStatusIstAktor) {
        if (state.state.val > rooms[room].ventilOeffnungHeizen) val = true;
          else val = false;
    }

    rooms[room].ausTimeout = setTimeout(function() {
        aktualisiereAktorStatus(room, val);
    }, verzoegerung);
});

}

function aktualisiereAktorStatus(room, stateVal) {
rooms[room].ausTimeout = null;
if (rooms[room].status === stateVal) return;
rooms[room].status = stateVal;
if (stateVal && rooms[room].letztesEin === 0) {
rooms[room].letztesEin = new Date().getTime();
rooms[room].letztesEinTemp = getState(rooms[room].stateIdIstTemperatur).val;
rooms[room].letzteTemp = rooms[room].letztesEinTemp;
pruefeAufheizzeit(room, true);
}
else if (rooms[room].letztesEin !== 0) {
pruefeAufheizzeit(room, false);
rooms[room].letztesEin = 0;
rooms[room].letzteTemp = 0;
}
}

function pruefeAufheizzeit(room, restart) {
if (rooms[room].skriptTimeout) {
clearTimeout(rooms[room].skriptTimeout);
rooms[room].skriptTimeout = null;
}

var timeDiff = new Date().getTime();
if (! restart) timeDiff -= (rooms[room].erkennungAusVerzoegerung * 1000);
timeDiff = Math.round((timeDiff - rooms[room].letztesEin) / 1000 / 60);
if (debug) {console.log(room + " timeDiff=" + timeDiff);}
if (timeDiff > 10) {
    var invalid = false;
    var tempDiff = getState(rooms[room].stateIdIstTemperatur).val - rooms[room].letztesEinTemp;
    var increase1K = Math.round((1 / tempDiff) * timeDiff);
    var finalInfo = restart ? "" : "FINALE ";
    if (increase1K < rooms[room].minIncrease1K || increase1K > rooms[room].maxIncrease1K) {
        finalInfo = "INVALID ";
        invalid = true;
    }
    var tempDiffLetztes = getState(rooms[room].stateIdIstTemperatur).val - rooms[room].letzteTemp;
    if (tempDiffLetztes < 0) {
        finalInfo = "TEMP-KLEINER ";
        invalid = true;
    }
    var avg = -1;
    if (!invalid) {
        rooms[room].aufheizzeiten.push(increase1K);
        avg = 0;
        for (var i = 0; i < rooms[room].aufheizzeiten.length; i++) {
            avg += rooms[room].aufheizzeiten[i];
        }

        avg = Math.round(avg/rooms[room].aufheizzeiten.length);
        setState(stateBaseId + room, avg, true);
        if (rooms[room].aufheizzeiten.length > 10) {
            rooms[room].aufheizzeiten.shift();
        }
        setState(stateBaseId + room + '-Data', JSON.stringify(rooms[room].aufheizzeiten), true);
    }
    else if (tempDiffLetztes < 0) {
        rooms[room].letztesEin = new Date().getTime();
        rooms[room].letztesEinTemp = getState(rooms[room].stateIdIstTemperatur).val;
        rooms[room].letzteTemp = rooms[room].letztesEinTemp;
    }
    rooms[room].letzteTemp = getState(rooms[room].stateIdIstTemperatur).val;
    if (debug) {console.log(finalInfo + 'Aufheizzeit ' + room + ': timeDiff=' + timeDiff + ', tempDiff=' + tempDiff + ', 1K=' + increase1K + 'm / avg=' + avg + 'm');}
}

if (restart) {
    rooms[room].skriptTimeout = setTimeout(function() {
        rooms[room].skriptTimeout = null;
        pruefeAufheizzeit(room, true);
    }, 30*60*1000);
}`
@rg-engineering
Copy link
Owner

@MiniAdnim Bitte noch den link auf den Beitrag im Forum posten, damit ich verstehe, was hier gemacht wurde... Danke.

@rg-engineering rg-engineering added the enhancement New feature or request label Sep 3, 2019
@MiniAdnim
Copy link
Author

MiniAdnim commented Sep 4, 2019

klar, hier sind die links
klick

klick

@MiniAdnim
Copy link
Author

Hi!
wollte mal gaanz Vorsichtig nachfragen ob ein Einbau in Planung steht?
Die Heiz-Saison steht ja vor der Tür und ich würde gerne vom Skript umstellen, habe versucht aber keinen Ansatz gefunden Vorheiz Zeiten via Externen Skript einfließen zu lassen.
Da ich die Funktion zum Verstellen der Perioden am Thermostat gerne nutzen würde sehe ich Probleme beim Manuellen Übersteuern der Temps aus einem externen Vorheitz-Zeit-Skript heraus.

Evtl hat auch wer nen Tipp wie man das schon jetzt Umsetzten könnte?

Danke.

Viele Grüße!

@rg-engineering
Copy link
Owner

Im Moment plane ich nicht, diese Funktion kurzfristig einzubauen.
Ich würde das ganze statisch angehen: Einfach die Temperatur eine entsprechende Zeit früher per Profil auf den neuen Sollwert setzen, d.h. anstatt 16:00Uhr auf 15:30Uhr. Dann kann der Raum in 30 Minuten hochheizen bis ich nach hause komme... Dynamische Anpassung der Schaltzeiten sieht leider das Konzept in dem Adapter nicht vor, das wäre ein ziemlich großer Umbau...

@bastian1607
Copy link

Hi,
ich würde das hier auch gerne nutzen wollen. Ein Zeitpunkt angeben wo der Raum auf x Grad hochgeheizt ist. Wäre aus meiner Sicht sinnvoller als einen Zeitpunkt ab dem erst auf eine gewisse Temperatur hochgeheizt werden muss.
Daher "pushe" ich das hiermit nochmal.
Beste Grüße

@Pittini
Copy link

Pittini commented Oct 1, 2021

Wenn man das richtig machen will müßte Außentemperatur, Raumgröße, Dämmung etc. alles einbezogen werden und daraus ne "Vorhersage" wieviel Zeit es braucht um den Raum um x Grad zu heizen, das finde ich etwas zuviel des guten und bin deswegen dagegen. Wenn ich iwann ein Studium brauch um den Adapter zu konfigurieren is was falsch gelaufen imho.

@bastian1607
Copy link

bastian1607 commented Oct 1, 2021

Vielleicht habe ich den Request falsch verstanden.
Mir geht es darum, dass ich für 5Uhr 22 Grad im Wohnzimmer einschalte. Anstatt um 5Uhr die Temperatur auf 22 Grad am Thermostat einzustellen, sollte der Adapter erkennen, dass bei der INNENtemperatur im Wohnzimmer (Bspw. 17Grad, da Nachtabsenkung), er ca. 15min benötigt um auf 22 Grad zu kommen. Daher würde der Adapter um 4.45Uhr das Signal senden auf 22 Grad hochzuschalten.

Das hat mit Außentemperatur, Dämmung, Raumgröße etc. nichts zu tun, sondern nur etwas mit der Zeit raumabhängig um von x Grad auf y Grad zu kommen.

EDIT:
Wie auch im Link aus dem Forum geschrieben, könnte man hier mit einer 10 Tages-Glättung arbeiten. Also wie lange hat die Heizung gebraucht in den letzten Tagen um zu einer bestimmten Uhrzeit hochzufahren raumabhängig.

@Pittini
Copy link

Pittini commented Oct 1, 2021

Und woher soll der Adapter wissen dass er ca. 15min. braucht? Und glaubst Du wirklich dass die Zeit bei 10° Aussentemp, die gleiche sein wird wie bei -20° Außentemp? Lass Dir versichert sein, dem ist nicht so, wo wir wieder bei Dämmung etc sind.

@bastian1607
Copy link

Du denkst viel zu kompliziert. Es hat absolut nichts mit der Außentemperatur zu tun, sondern etwas mit der Innentemperatur der Räume, zur Vereinfachung sogar ausschließlich die Zeit.

Um es einfach zu halten wäre es denkbar, dass der Adapter berechnet, dass er innerhalb der letzten 10 Tage im Schnitt X min gebraucht hat um auf den Wert von 22 Grad zu bekommen. Wäre X=15min, dann würde er die Adapter 15min eher ansteuern. Damit wäre sogar die Innentemperatur außen vor.
Für eine exaktere Berechnung der Zeit wäre es vielleicht abhängig von der Innentemperatur, würde aber vielleicht wiederum fast schon zu einer eigenen Datenbank führen, da er dann vorhalten müsste, dass er für einen gewissen Raum X Minuten braucht um von einem Ist-Wert auf einen Soll-Wert zu kommen.

@rg-engineering
Copy link
Owner

ich hatte vor einiger Zeit versucht, ein Konzept dazu zu erstellen. Ich bin letztendlich zur gleichen Erkenntniss gelangt, wie @Pittini . Eine feste Zeit pro Raum lässt der Adapter ja bereits zu. Wenn ich es um 6:00 morgens warm haben will und ich weiß, dass der Raum ca. 15 Minuten benötigt, stelle ich den Profilpunkt auf 5:45Uhr.
Die Zeit dynamisch anzupassen ist deutlich schwieriger, wir reden dann von s.g. Raumkonstanten die viele Abhängigkeiten haben. Aber was bringt mir das letztendlich? Doch nur, ob 3 Minuten früher oder später mit dem Heizen begonnen werden soll. (also im oberen Fall ob 5:42Uhr oder 5:48Uhr geheizt wird). Dafür sehe ich kein vernünftiges Aufwand-Nutzen-Verhältnis...

@bastian1607
Copy link

Diese Vorheizzeit ist ja das was auch Pittini meint und ist natürlich in Abhängigkeit von der Außentemperatur bzw. Dämmung. Eine 10 Tages Glättung zur Berechnung der Vorheizzeit wäre meiner Meinung nach ausreichend um normale Schwankungen z.B. durch Jahreszeiten abzufangen. Da kann man ja auch je nach Raum, Wetter und Dämmung von einigen Minuten Differenz ausgehen.

Den Aufwand kann ich absolut nicht einschätzen, ich hätte lediglich den Nutzen, den ich für mich selbst sehe.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

4 participants