Toleranz bei abfallender Temperatur

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

Antworten
Spencer
Beiträge: 57
Registriert: 08.06.2014, 13:42
Hat sich bedankt: 15 Mal
Danksagung erhalten: 4 Mal

Toleranz bei abfallender Temperatur

Beitrag von Spencer » 28.01.2023, 14:50

Hallo zusammen,

ich benötige mal eure Hilfe bei einem Skript.

Bei einer Heizungssteuerung soll eine Toleranztemperatur (toleranz_Temp) hinzugefügt werden.
Die Toleranztemperatur soll dazu dienen, dass die Heizung um Temperatur x abkühlt.
Nachdem (soll_TempOffice + toleranz_Temp) unterschritten wurde, soll die Heizung angehen und aufheizen bis die Solltemperatur (soll_TempOffice), ohne Toleranz, erreicht wurde.

Code: Alles auswählen

! evtl. Variablen casten, wegen Ganzzahl ohne Nachkommastelle

var ist_TempOffice  = 19.4;
! var soll_TempOffice = dom.GetObject("BidCos-RF.MEXXXXXXXX:4.SET_TEMPERATURE").Value();
var soll_TempOffice = 20.0;
var toleranz_Temp   = -0.5;
var akt_VentOffice  =   25;
var HzOffice        =   -1;
var HZ_RHZ          =   -1;

! Office
if ((ist_TempOffice >= (soll_TempOffice + toleranz_Temp)) && (akt_VentOffice <= 25))
{HzOffice=0;
WriteLine("F1: Ist       : " # ist_TempOffice.ToString(1));
WriteLine("F1: Soll      : " # soll_TempOffice.ToString(1));
WriteLine("F1: Toleranz  : " # toleranz_Temp.ToString(1));
WriteLine("F1: Ventil    : " # akt_VentOffice);
WriteLine("F1: HzOffice  :  " # HzOffice);
}

if ((ist_TempOffice < (soll_TempOffice + toleranz_Temp)) && (akt_VentOffice >= 25))
{HzOffice=10;
WriteLine("F2: Ist       : " # ist_TempOffice.ToString(1));
WriteLine("F2: Soll      : " # soll_TempOffice.ToString(1));
WriteLine("F2: Toleranz  : " # toleranz_Temp.ToString(1));
WriteLine("F2: Ventil    : " # akt_VentOffice);
WriteLine("F2: HzOffice  : " # HzOffice);
}

if ((ist_TempOffice < (soll_TempOffice + toleranz_Temp)) || (akt_VentOffice>95))
{HzOffice=10;
WriteLine("F3: Ist       : " # ist_TempOffice.ToString(1));
WriteLine("F3: Soll      : " # soll_TempOffice.ToString(1));
WriteLine("F3: Toleranz  : " # toleranz_Temp.ToString(1));
WriteLine("F3: Ventil    : " # akt_VentOffice);
WriteLine("F3: HzOffice  : " # HzOffice);
}

! aktuelle Temperatur zwischen soll Temperatur + toleranzTemp oder soll Temperatur und Raumheizung eingeschaltet -> Heizung ausschalten
if ((((ist_TempOffice >= (soll_TempOffice + toleranz_Temp)) || (ist_TempOffice < soll_TempOffice)) && HZ_RHZ=="AN"))
{HzOffice=0;
WriteLine("F4: Ist       : " # ist_TempOffice.ToString(1));
WriteLine("F4: Soll      : " # soll_TempOffice.ToString(1));
WriteLine("F4: Toleranz  : " # toleranz_Temp.ToString(1));
WriteLine("F4: Ventil    : " # akt_VentOffice);
WriteLine("F4: HzOffice  :  " # HzOffice);
}

! aktuelle Temperatur zwischen soll Temperatur + toleranzTemp und soll Temperatur und Raumheizung ausgeschaltet -> Heizung einschalten
if ((((ist_TempOffice > (soll_TempOffice + toleranz_Temp)) || (ist_TempOffice < soll_TempOffice)) && HZ_RHZ=="AUS"))
{HzOffice=10;
WriteLine("F5: Ist       : " # ist_TempOffice.ToString(1));
WriteLine("F5: Soll      : " # soll_TempOffice.ToString(1));
WriteLine("F5: Toleranz  : " # toleranz_Temp.ToString(1));
WriteLine("F5: Ventil    : " # akt_VentOffice);
WriteLine("F5: HzOffice  : " # HzOffice);
} 

if ((HzOffice)>0)
{
HZ_RHZ="AN";
}
else
{
HZ_RHZ="AUS";
}

WriteLine("-------------------");
WriteLine("Heizung  " # HZ_RHZ);
ChatGPT lieferte mir folgendes, da ich Ihn gebeten habe fallende und steigende Temperatur zu berücksichtigen:

Code: Alles auswählen

var ist_TempOffice  = 20.0;
var soll_TempOffice = 20.6;
var toleranz_Temp   = -0.5;
var akt_VentOffice  =   25;
var HzOffice        =   -1;
var HZ_RHZ          =   -1;
var ist_TempOffice_last = ist_TempOffice;
var temp_trend = 0;

while (true)
{
    if (ist_TempOffice > ist_TempOffice_last) {
        temp_trend = 1;
    } elseif (ist_TempOffice < ist_TempOffice_last) {
        temp_trend = -1;
    } else {
        temp_trend = 0;
    }
    ist_TempOffice_last = ist_TempOffice;

    if (temp_trend == -1 && ist_TempOffice < (soll_TempOffice + toleranz_Temp)) {
        HzOffice = 10;
    } elseif (temp_trend == 1 && ist_TempOffice >= soll_TempOffice) {
        HzOffice = 0;
    }
}

if ((HzOffice)>0)
{
HZ_RHZ="AN";
}
else
{
HZ_RHZ="AUS";
}


WriteLine("F1: Ist       : " # ist_TempOffice.ToString(1));
WriteLine("F1: Soll      : " # soll_TempOffice.ToString(1));
WriteLine("F1: Toleranz  : " # toleranz_Temp.ToString(1));
WriteLine("F1: Ventil    : " # akt_VentOffice);
WriteLine("F1: last      : " # ist_TempOffice_last.ToString(1));
WriteLine("F1: trend     :  " # temp_trend);
WriteLine("F1: HzOffice  :  " # HzOffice);
WriteLine("-------------------");
WriteLine("Heizung  " # HZ_RHZ);
Aber das funktioniert auch (noch) nicht.

Um weitere Hilfe wäre ich sehr dankbar.

Viele Grüße
Raspberrymatic(VM)@proxmox, CUxD, ioBroker, InfluxDB, Grafana, Tasmota

MichaelN
Beiträge: 9679
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 700 Mal
Danksagung erhalten: 1626 Mal

Re: Toleranz bei abfallender Temperatur

Beitrag von MichaelN » 28.01.2023, 15:06

ChatGTP schreibt zwar toll aussehenden code, aber keinen validen. Du kannst ihn zigmal um Nachbesserung bitten, aber in der Zeit hat man schon eigenen geschrieben.
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

MartinMatic
Beiträge: 99
Registriert: 19.10.2020, 18:34
System: CCU
Hat sich bedankt: 11 Mal
Danksagung erhalten: 29 Mal

Re: Toleranz bei abfallender Temperatur

Beitrag von MartinMatic » 28.01.2023, 15:25

Hallo Spencer,

wenn ich es richtig verstanden habe, willst Du im Prinzip einen Zweipunkt-Regler bauen mit einer Hysterese von toleranz_Temp.
Die Hysterese soll unsymmetrisch nach unten liegen.
Wobei vom Vorzeichen zu beachten ist, dass Du den Wert von toleranz_Temp negativ angibst (toleranz_Temp = -0.5;).
Du hast zwei Bedingungen:

Erstens:
Nachdem (soll_TempOffice + toleranz_Temp) unterschritten wurde, soll die Heizung angehen :

Code: Alles auswählen

if (ist_TempOffice < (soll_TempOffice + toleranz_Temp))
{ HzOffice=1;
 ...
}
(Wobei ich mal angenommen habe, dass HzOffice=1 die Heizung einschaltet und HzOffice=0 die Heizung ausschaltet.)

Zweitens:
aufheizen bis die Solltemperatur (soll_TempOffice), ohne Toleranz, erreicht wurde.
heisst:
Wenn die Solltemperatur (soll_TempOffice) erreicht wurde, soll die Heizung ausgehen:

Code: Alles auswählen

if (ist_TempOffice >= soll_TempOffice)
{HzOffice=0;
...
}
Soweit als Grundgerüst.
Bleibt die Frage, was Du mit der Einbindung von akt_VentOffice in deine Bedingungen erreichen möchtest?
Da müsstest Du ggf. Deine Problemstellung bzw. Deine Gedanken nochmal genauer erklären.

Grüße

Martin

Antworten

Zurück zu „HomeMatic Zentrale (CCU / CCU2 / CCU3 / Charly)“