Heizungsthermostatscript V2.0

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

Semenchkare
Beiträge: 64
Registriert: 31.08.2014, 19:48
Danksagung erhalten: 1 Mal

Re: Heizungsthermostatscript V2.0

Beitrag von Semenchkare » 20.03.2016, 10:19

Hallo,
ich betreibe das script seit ca. 2 Jahren mit den alten Thermostaten. Nun kam ja mit der 2.17.15 die neue Software raus, mit der man jetzt auch die HM-IP Geräte bedienen kann.
Da ich ein weiteres Thermostat erwerben möchte (wenn's geht HM-IP+entspr. Fensterkontakt) folgende Frage:
Wie mein Vorschreiber müsste ich wissen ob ich das Script ohne Änderungen einsetzbar ist, damit auch die neuen Thermostate in gleicher Weise ansteuerbar sind.
Hat das schon jemand probiert?

Danke Seme
Viele Grüße

Seme

ccu3 Raspberrymatic 3.71.12.20231020,
Thermostate 8x HM-CC-RT-DN 105155 FW 1.4, Thermostat 1x HMIP-eTRV FW 1.6.3
Wandthermostat 1x HM-TC-IT-WM-W-EU FW 1.3
Tuer-Fensterkontakte 7x HM-Sec-SC-2 FW 1.2, Tuer-Fensterkontakt-optisch 1x HMIP-SWDO 1.10.7, Tuer-Fensterkontakt opt. HMIP-SWDO-I FW 1.14.0
Fenster-Drehgriffkontakt HMIP-SRH FW 1.0.1
Bewegungsmelder HM-Sec-MDIR-2 FW 1.6
Temperatur- Feuchtesensor aussen HM-WDS10-TH-O FW 1.3
Rauchmelder HM-Sec-SD FW 1.1, 2x HMIP-SWSD FW 1.0.11
Funk-Schaltaktor HM-LC-Sw1-FM FW 1.12, Funk-Schaltsteckdose HM-ES-PMSw1-Pl 2.5
Zusatzsoftware: CUXDaemon V. 2.11, E-Mail V. 1.7.6, XML API 1.22, hm_pdetect 1.16, Philips Hue 3.2.5

Mike2208
Beiträge: 8
Registriert: 28.03.2016, 15:15

Re: Heizungsthermostatscript V2.0

Beitrag von Mike2208 » 02.04.2016, 07:58

Hallo,
Ich teste das Skript seit einer Woche in 2 Räumen. Jeder Raum ist mit einem Wandthermostat, einem Heizungsthermostat und einem Fensterkontakt ausgestattet. Den Wandthermostat und das Heizungsthermostat habe ich direkt verknüpft. D.h. der Wandthermostat steuert das Heizungsthermostat.
Das Skript habe ich um eine Homeoffice-Schleife erweitert. Die dazugehörige Systemvariable heißt Homeoffice und ist Boolean. Sollte ich nun ungeplant von Zuhause aus arbeiten, sorge ich dafür das der oberste Stock 2 Zimmer für diesen Tag temperaturtechnisch angepasst werden.

Alles funktioniert prima. Bis auf eines. Die manuelle Veränderung. Sie wird einfach direkt nach dem nächsten Programmdurchlauf überschrieben. Obwohl im Skript die manuelle Einstellung 2h erhalten bleiben sollte. Was mache ich falsch?

Code: Alles auswählen

string raum = "TV-Zimmer" ; ! 

! Definition Thermostat - Abfrage/Setzen der Temperatur: BidCos-RF.<SERIENNUMMER>:<KANALNUMMER>.<DATENPUNKT>
!   HM-CC-TC           BidCos-RF.<SERIENNUMMER>:2.SETPOINT
!   HM-CC-RT-DN        BidCos-RF.<SERIENNUMMER>:4.SET_TEMPERATURE
!   HM-TC-IT-WM-W-EU   BidCos-RF.MEQ0745296:2.SET_TEMPERATURE
string sRegler = "BidCos-RF.MEQ0745296:2.SET_TEMPERATURE";  

! Definition Sensoren: BidCos-RF.<SERIENNUMMER>:<KANALNUMMER>.<DATENPUNKT>
!   HM-Sec-SC-2        BidCos-RF.<SERIENNUMMER>:1.STATE
! Hier koennen 0 bis n-Geraete rein - mit ";" trennen oder "" fuer kein Geraet (ohne Leerzeichen)
string sTuerenUndFenster = "BidCos-RF.MEQ0717272:1.STATE";   

! Temperaturen 6-30 Grad, 0 = OFF, 100=ON
real grad_0 = 17.0;
real grad_1 = 18.0;
real grad_2 = 19.0;
real grad_3 = 20.0;
real grad_4 = 20.5;
real grad_5 = 21.0;
real grad_6 = 21.5;
real grad_7 = 22.0;
real grad_8 = 22.5;
real grad_9 = 23.0;

real grad_fenster = 6;         ! Temperatur bei offenem Fenster -1 = off
real grad_urlaub  = 10;        ! Temperatur im Urlaub -1 = off
real grad_gaeste  = -1;        ! Temperatur fuer Gaeste -1 = off
real grad_homeoffice  = 21;    ! Temperatur fuer Homeoffice -1 = off
real grad_aa      = -1;        ! Temperatur ausser haus, wird als Absenkung benutzt, -1 = OFF (immer Anwesenheit)

string deltaStdMin = "02:00";  ! deltaStdMin mit "hh:mm" setzten (Std / Min immer zweistellig) Differenzzeit, die manuelle Temperatur erhalten bleibt bis ueberschrieben wird

integer woche = 0;             ! 0=7 Tage Woche, 1=Montag=Wochentags & Samstag=Wochenende, 2= Montag=Woche, 3=Montag=Wochentags & Samstag=Samstag & Sonntag=Sonntag

integer leiste = 1;            ! Welche Zeitleiste aktiv ist

if (leiste == 1){
! Zeitleiste 1
! Uhrzeit                0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 |
!                        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 |
string zeitleiste_mon = "000000000000000000000000000000000077777777555111";
string zeitleiste_die = "000000000000000000000000000000000077777777555111";
string zeitleiste_mit = "000000000000000000000000000000000077777777555111";
string zeitleiste_don = "000000000000000000000000000000000077777777555111";
string zeitleiste_fre = "000000000000000000000000000000000077777777555111";
string zeitleiste_sam = "000000000000000555555555555555555555777777555111";
string zeitleiste_son = "000000000000000555555555555555555555777777555111";
};

if (leiste == 2){
! Zeitleiste 2
! Uhrzeit                0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2|
!                        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3|
string zeitleiste_mon = "000000000000123441111111111111111133555555555555";
string zeitleiste_die = "000000000000123441111111111111111133555555555555";
string zeitleiste_mit = "000000000000123441111111111111111133555555555555";
string zeitleiste_don = "000000000000123441111111111111111133555555555555";
string zeitleiste_fre = "000000000000123441111111111111111133555555555555";
string zeitleiste_sam = "000000000000011335555555555555555555555555555555";
string zeitleiste_son = "000000000000011335555555555555555555555555555555";
};

boolean debug = 0;             ! Debug Infos ins Syslog - sollte immer auf 0 sein, nur bei Problemen auf 1

!******************************************************
! Ab hier Script CODE - Do not change behind this line
!******************************************************

! Umwandeln deltaStdMin in Sekunden
integer stunde = deltaStdMin.Substr(0, 2).ToInteger();
integer minute = deltaStdMin.Substr(3, 2).ToInteger();
integer setdelta = (stunde * 3600) + (minute * 60);

! SN aus sRegler bestimmen
string sReglerSN = sRegler.Substr(10, (sRegler.Find(":") - 10));

object regler;                ! Datenobjekt des Reglers fuer die Solltemperatur (Kanal 2)

real soll_neu;                ! Die neue Solltemperatur fuer den Raumthermostaten (Regler).
real soll_alt;                ! Die alte Solltemperatur der Zeitleiste, die zuletzt aktuell war.
real soll_ist = -1;           ! Die aktuelle Solltemperatur im Raumthermostat (Regler).

time sv_timestamp;            ! Zeitstempel der Systemvariablen, die zuletzt geaendert worden ist (Wert in Sekunden).
time rt_timestamp;            ! Zeitstempel, wann die Solltemperatur im RT zuletzt gesetzt wurde.
boolean prioritaet = false;   ! Ist prioritaet = true, dann wird die neue Solltemperatur auf jeden Fall in den Regler geschrieben.
 
!Wenn keine Heizperiode, dann Heizkoerper auf
if (dom.GetObject('Heizperiode').State()) {
    soll_neu = 100;
    prioritaet = true;
   
    ! Aktuelle Solltemperatur auslesen
    object regler = dom.GetObject(sRegler);
    soll_ist = regler.Value();

} else {

    integer offen = 0;
        
    regler = dom.GetObject(sRegler);
    soll_ist = regler.Value();
    if ( sTuerenUndFenster != "" ) {
        string value;
        foreach (value,sTuerenUndFenster.Split(";")) {
            object myChannel = dom.GetObject(value);
            if (myChannel.State() > 0) {
                offen = offen + 1.00;
            }
        }
    }  
    
    ! Wenn ein Verschluss im Raum offen ist, dann Fenstertemperatur einstellen   
    if (offen > 0) { ! Fenster offen, Ventile einstellen
        if (soll_ist <= grad_fenster) { ! Wenn soll_ist niedriger als grad_fenster (z.B. Ventile zu -> soll_ist = 0), dann nichts machen
            soll_neu = soll_ist;
        } else {
            soll_neu = grad_fenster;
            prioritaet = true;
        }
    } else {

        ! Timestamp "Partytemperatur" festhalten
        sv_timestamp = dom.GetObject('Partytemperatur').Timestamp();

        ! Partytemperatur testen und einstellen, -1 = deaktiviert
        integer partytemperatur = dom.GetObject('Partytemperatur').State();
        if (partytemperatur > -1) { !Wenn Partytemperatur, dann einstellen
            soll_neu = partytemperatur;
        } else {
           
            ! Pruefen ob Timestamp "Urlaub" juenger ist als "Partytemperatur" => Wenn ja, merken
            time settime = dom.GetObject('Urlaub').Timestamp();
            if (settime > sv_timestamp) {sv_timestamp = settime;}
        
            ! Urlaub testen und einstellen, -1 = deaktiviert
            if ((dom.GetObject('Urlaub').State()) && (grad_urlaub > -1)) { !Wenn im Urlaub und grad_urlaub nicht -1 (deaktiviert)
                  soll_neu = grad_urlaub;
            } else {

                ! Pruefen ob Timestamp "Gaeste" juenger ist als "Urlaub" => Wenn ja, merken
                settime = dom.GetObject('Gaeste').Timestamp();
                if (settime > sv_timestamp) {sv_timestamp = settime;}

                ! Gaeste testen und einstellen, -1 = deaktiviert
                if ((dom.GetObject('Gaeste').State()) && (grad_gaeste > -1)){ !Wenn Gaeste im Haus und grad_gaeste nicht -1 (deaktiviert)
                    soll_neu = grad_gaeste;
                } else {

                  ! Pruefen ob Timestamp "Homeoffice" juenger ist als "Urlaub" => Wenn ja, merken
                  settime = dom.GetObject('Homeoffice').Timestamp();
                  if (settime > sv_timestamp) {sv_timestamp = settime;}
  
                  ! Homeoffice testen und einstellen, -1 = deaktiviert
                  if ((dom.GetObject('Homeoffice').State()) && (grad_homeoffice > -1)){ !Wenn Homeoffice wahr ist und grad_homeoffice nicht -1 (deaktiviert)
                      soll_neu = grad_homeoffice;
                  } else {
                
                    ! Pruefen ob Timestamp "Anwesenheit" juenger ist als "Gaeste" => Wenn ja, merken
                    settime = dom.GetObject('Anwesenheit').Timestamp();
                    if (settime > sv_timestamp) {sv_timestamp = settime;}

                    ! Differenzen von ausser Haus Testen und beachten
                    if ((!dom.GetObject('Anwesenheit').State()) && (grad_aa > -1)) {
                        soll_neu = grad_aa;
                    } else {

                        string zeitleiste_heute;        ! Die Temperaturleiste fuer den aktuellen Tag.
                        string zeitleiste_gestern;      ! Die Temperaturleiste von gestern.
                        string heizwert;                ! Enthaelt den Wert, der in der Zeitleiste zum jetzigen Zeitpunkt gilt.

                        ! Hier nun die Auswertung der Zeitleisten
                        !Auswerten, welche Zeitleiste heute ist
                        integer tag = system.Date("%u");
                        if ((tag == 1) && (woche == 0)) {zeitleiste_heute = zeitleiste_mon;} else {
                        if ((tag == 2) && (woche == 0)) {zeitleiste_heute = zeitleiste_die;} else {
                        if ((tag == 3) && (woche == 0)) {zeitleiste_heute = zeitleiste_mit;} else {
                        if ((tag == 4) && (woche == 0)) {zeitleiste_heute = zeitleiste_don;} else {
                        if ((tag == 5) && (woche == 0)) {zeitleiste_heute = zeitleiste_fre;} else {
                        if ((tag == 6) && ((woche == 0) || (woche == 3))) {zeitleiste_heute = zeitleiste_sam;} else {
                        if ((tag == 7) && ((woche == 0) || (woche == 3))) {zeitleiste_heute = zeitleiste_son;} else {
                        if ((tag >= 1) && (tag <= 5) && ((woche == 1) || (woche == 3))) {zeitleiste_heute = zeitleiste_mon;} else {
                        if ((tag >= 6) && (tag <= 7) && (woche == 1)) {zeitleiste_heute = zeitleiste_sam;} else {
                        if (woche == 2) {zeitleiste_heute = zeitleiste_mon;} }}}}}}}}}
                  
                        ! An Feiertagen gilt die Temperatur von Samstag bzw. Sonntag
                        if (dom.GetObject('Feiertag').State() && ((woche == 0) || (woche == 3))) {zeitleiste_heute = zeitleiste_son;} else {
                        if (dom.GetObject('Feiertag').State() && (woche == 1)) {zeitleiste_heute = zeitleiste_sam;}}
                   
                        ! Position der Zeitleiste bestimmen
                        if (system.Date("%M").ToInteger() > 29) {integer add = 1;} else {integer add = 0;}
                        integer sTime = (system.Date("%H").ToInteger()*2)+add;
                        heizwert = zeitleiste_heute.Substr(sTime, 1);
             
                        ! Temperatur bestimmen, die gesetzt werden soll
                        if (heizwert == "0") {soll_neu = grad_0;} else {
                        if (heizwert == "1") {soll_neu = grad_1;} else {
                        if (heizwert == "2") {soll_neu = grad_2;} else {
                        if (heizwert == "3") {soll_neu = grad_3;} else {
                        if (heizwert == "4") {soll_neu = grad_4;} else {
                        if (heizwert == "5") {soll_neu = grad_5;} else {
                        if (heizwert == "6") {soll_neu = grad_6;} else {
                        if (heizwert == "7") {soll_neu = grad_7;} else {
                        if (heizwert == "8") {soll_neu = grad_8;} else {
                        if (heizwert == "9") {soll_neu = grad_9;} }}}}}}}}}

                        ! letzte Solltemeratur bestimmen, dabei muss der wert von 00:00 beachtet werden - der letzte Wert war gestern
                        if (sTime == 0) {
                            if ((tag == 1) && ((woche == 0) || (woche == 3))) {zeitleiste_gestern = zeitleiste_son;} else {
                            if ((tag == 2) && (woche == 0)) {zeitleiste_gestern = zeitleiste_mon;} else {
                            if ((tag == 3) && (woche == 0)) {zeitleiste_gestern = zeitleiste_die;} else {
                            if ((tag == 4) && (woche == 0)) {zeitleiste_gestern = zeitleiste_mit;} else {
                            if ((tag == 5) && (woche == 0)) {zeitleiste_gestern = zeitleiste_don;} else {
                            if ((tag == 6) && (woche == 0)) {zeitleiste_gestern = zeitleiste_fre;} else {
                            if ((tag == 7) && ((woche == 0) || (woche == 3))) {zeitleiste_gestern = zeitleiste_sam;} else {
                            if ((tag >= 2) && (tag <= 6) && ((woche == 1) || (woche == 3))) {zeitleiste_gestern  = zeitleiste_mon;} else {
                            if (((tag == 1) || (tag == 7)) && (woche == 1)) {zeitleiste_gestern = zeitleiste_sam;} else {
                            if (woche == 2) {zeitleiste_gestern = zeitleiste_mon;} }}}}}}}}}
                       
                            heizwert = zeitleiste_gestern.Substr(47, 1);
                        } else {
                            heizwert = zeitleiste_heute.Substr((sTime-1), 1);
                        }
     
                        ! Temperatur bestimmen, die in der letzten 30 Minutenn war
                        if (heizwert == "0") {soll_alt = grad_0;} else {
                        if (heizwert == "1") {soll_alt = grad_1;} else {
                        if (heizwert == "2") {soll_alt = grad_2;} else {
                        if (heizwert == "3") {soll_alt = grad_3;} else {
                        if (heizwert == "4") {soll_alt = grad_4;} else {
                        if (heizwert == "5") {soll_alt = grad_5;} else {
                        if (heizwert == "6") {soll_alt = grad_6;} else {
                        if (heizwert == "7") {soll_alt = grad_7;} else {
                        if (heizwert == "8") {soll_alt = grad_8;} else {
                        if (heizwert == "9") {soll_alt = grad_9;} }}}}}}}}}
                    } !Ende IF Anwesenheit
                } !Ende IF Gaeste
              } !Ende IF Homeoffice
            } !Ende IF Urlaub
        } !Ende IF Partytemperatur
    } !Ende IF Fenster offen
} !Ende IF Heizungsperiode

if (soll_ist >= 0) { ! Wenn RT geantwortet hat (Sollwert konnte ausgelesen werden)...

    ! Workaround fuer automatisches setzen der Zeitstempel im Thermostat
    ! Es wird nur noch eine Systemvariable "LastChg_LEQxxxxxxx" vom Typ Zeichenkette verwendet.
    var lastObj = dom.GetObject('LastChg_' # sReglerSN);
    time last_timestamp;
    real last_value = -1;
    if (lastObj != null) {
        string last_str = lastObj.Variable();
        if (last_str.Find(";") >= 0) {
            last_timestamp = last_str.StrValueByIndex(";", 0).ToTime();
            last_value = last_str.StrValueByIndex(";", 1).ToFloat();
        }

        if (soll_ist != last_value) {
            ! Temperatur wurde manuell verstellt, neu abspeichern
            last_str = system.Date("%Y-%m-%d %H:%M:%S") # ";" # soll_ist.ToString();
            lastObj.Variable(last_str);
            last_timestamp = last_str.StrValueByIndex(";", 0).ToTime();
            last_value = last_str.StrValueByIndex(";", 1).ToFloat();            
        }        
    }
    
    ! ...dann pruefen ob neue Solltemperatur in RT geschrieben werden muss.
    if (soll_ist <> soll_neu) { ! Wenn aktuelle Solltemperatur = neue Solltemp., dann nichts machen
           
        regler = dom.GetObject(sRegler);
        time now = system.Date("%Y-%m-%d %H:%M:%S").ToTime(); ! wie spaet ist es jetzt?
        if (lastObj != null) {
            rt_timestamp = last_timestamp;
        } else {
            rt_timestamp = regler.Timestamp();
        }
        integer diff = now.ToInteger() - rt_timestamp.ToInteger();

        if ((diff >= setdelta) || (prioritaet) || (soll_ist == grad_fenster) || (sv_timestamp >= rt_timestamp) || ((soll_ist == soll_alt) && (soll_alt <> soll_neu))) {
           
            ! Temperatur setzen                       
            regler.State(soll_neu);
            
            ! Abspeichern der neuen Soll-Temperatur zum Vergleich bei manueller Aenderung.
            ! Alten Zeitstempel und nicht den aktuellen verwenden, da sonst Probleme mit diff/setdelta
            if (lastObj != null) {
                lastObj.Variable('2010-01-01 00:00:00' # ';' # soll_neu.ToString());
            }

            integer regler_gesetzt = 1;
            if (debug) {
                string stdout;
                string stderr;
                system.Exec("logger -t script -p user.debug Raumthermostat " # raum # " neu gesetzt!\n", &stdout, &stderr);
                system.Exec("logger -t script -p user.debug alte_Solltemperatur: " # soll_ist # " neue_Solltemperatur: " # soll_neu # "\n", &stdout, &stderr);
                system.Exec("logger -t script -p user.debug Letzte_Aenderung: " # rt_timestamp # " Zeitdifferenz:_" # diff # "sek.", &stdout, &stderr);
                system.Exec("logger -t script -p user.debug Offene_Luken: " # offen , &stdout, &stderr);
            }
        } 
    }

} else {
    string stdout;
    string stderr;
    system.Exec("logger -t script -p user.debug Raumthermostat " # raum # " antwortet nicht!", &stdout, &stderr);
}

Semenchkare
Beiträge: 64
Registriert: 31.08.2014, 19:48
Danksagung erhalten: 1 Mal

Re: Heizungsthermostatscript V2.0-IPVarianten

Beitrag von Semenchkare » 03.04.2016, 14:21

Hallo zusammen.

Ich habe heute probiert, einen Fensterkontakt HmIP-SWDO in die CCU2 einzuklinken. Es hat wunderbar funktioniert.
Auch ins Heizungsthermostatscript habe ich ihn aufgenommen.

Code: Alles auswählen

! Definition Sensoren: BidCos-RF.<SERIENNUMMER>:<KANALNUMMER>.<DATENPUNKT>
!   HM-Sec-SC-2        BidCos-RF.<SERIENNUMMER>:1.STATE
!   HM IP SWDO         HmIP-RF.<SERIENNUMMER>:1.STATE
! Hier koennen 0 bis n-Geraete rein - mit ";" trennen oder "" fuer kein Geraet (ohne Leerzeichen)
string sTuerenUndFenster = "HmIP-RF.0000X9X99X9999:1.STATE";
Oh Wunder, auch hier steuert der Kontakt ab sofort den Thermostat. Insofern ist zunächst mal alles gut.
Aber:
Ich lasse mir die Systemzustände auch via CCU.IO (läuft auf einem Raspberry2) am Tablet anzeigen. Da waren die über RegaHSS aufrufbaren Werte plötzlich nicht mehr abrufbar.

Die Eingabe von

Code: Alles auswählen

ps aux|grep '/bin/ReGaHss'|grep -v grep|wc -l
brachte das Ergebnis "1".

Auch ein mehrfaches Rebooten der CCU brachte nix. ich Glaube, das ReGaHss schon gar nicht mehr gestartet wird.

Anscheinend kommt die CCU2 mit HMIP auch wieder an ihre Grenzen, insbesondere, wenn man noch 3 weitere "Progrämmchen" wie
CuxD, XML, und auch Email laufen hat. Der "Java"-Aufsatz, der für HMIP-Steuerung benötigt wird, ist vermutlich zu groß.

Denn ähnliche Threads habe ich hier bei der CCU (alt) auch schon gefunden, da ist ReGaHss nämlich immer unvermittelt abgestürzt.
Viele Grüße

Seme

ccu3 Raspberrymatic 3.71.12.20231020,
Thermostate 8x HM-CC-RT-DN 105155 FW 1.4, Thermostat 1x HMIP-eTRV FW 1.6.3
Wandthermostat 1x HM-TC-IT-WM-W-EU FW 1.3
Tuer-Fensterkontakte 7x HM-Sec-SC-2 FW 1.2, Tuer-Fensterkontakt-optisch 1x HMIP-SWDO 1.10.7, Tuer-Fensterkontakt opt. HMIP-SWDO-I FW 1.14.0
Fenster-Drehgriffkontakt HMIP-SRH FW 1.0.1
Bewegungsmelder HM-Sec-MDIR-2 FW 1.6
Temperatur- Feuchtesensor aussen HM-WDS10-TH-O FW 1.3
Rauchmelder HM-Sec-SD FW 1.1, 2x HMIP-SWSD FW 1.0.11
Funk-Schaltaktor HM-LC-Sw1-FM FW 1.12, Funk-Schaltsteckdose HM-ES-PMSw1-Pl 2.5
Zusatzsoftware: CUXDaemon V. 2.11, E-Mail V. 1.7.6, XML API 1.22, hm_pdetect 1.16, Philips Hue 3.2.5

MrAnderson
Beiträge: 2
Registriert: 08.10.2012, 21:17

Re: Heizungsthermostatscript V2.0

Beitrag von MrAnderson » 11.04.2016, 21:48

Hallo Zusammen,

ich habe seit 2013 in 9 Räumen das Script erfolgreich am laufen - jetzt musste ich durch einen Defekt das alte Thermostat gegen ein HM-CC-RT-DN tauschen - auf einmal greift das Script nicht mehr - auf Seite 5 habe ich Änderungsideen gefunden -aber damit schließe ich dann ja meine alten Thermostate etc. aus - hat jemand einen Entwurf für einen Mischbetrieb?

Danke und viele Grüße!

So habe ich die Änderungen eingefügt, klappt aber nicht:

string raum = "Mina" ; !


! Komfort_Config
! kconfig = 0 - Variable sRegler muß das Thermostat im Raum enthalten, sTuerenUndFenster koennen Verschluesse (Datenpunkt) definiert werden - Performance sehr gut, manuelles definieren der Geraete
! kconfig = 1 - Variablen sRegler und sTuerenUndFenster muessen nicht angegeben werden. Geraete werden ueber den Raum und Gewerk "Verschluss" automatisch gesucht - Performance schlecht, komfortables und intelligentes Script

integer kconfig = 1;
string sRegler = "JEQ0021930"; ! Definition des Thermostates
string sTuerenUndFenster = ""; ! hier können 0 bis n-Geräte rein - mit ";" trennen oder "" fuer kein Geraet (ohne Leerzeichen)

! Temperaturen 6-30 Grad, 0 = OFF, 100=ON
real grad_0 = 17.0;
real grad_1 = 18.0;
real grad_2 = 19.0;
real grad_3 = 20.5;
real grad_4 = 21.0;
real grad_5 = 21.5;
real grad_6 = 22.0;
real grad_7 = 22.5;
real grad_8 = 23.0;
real grad_9 = 24.0;

real grad_fenster = 6; ! Temperatur bei offenem Fenster -1 = off
real grad_urlaub = 16.5; ! Temperatur im Urlaub -1 = off
real grad_gaeste = 18.0; ! Temperatur fuer Gaeste -1 = off
real grad_aa = 17; ! Temperatur ausser haus, wird als Absenkung benutzt, -1 = OFF (immer Anwesenheit)

string deltaStdMin = "02:00"; ! deltaStdMin mit "hh:mm" setzten (Std / Min immer zweistellig) Differenzzeit, die manuelle Temperatur erhalten bleibt bis überschrieben wird

integer woche = 0; ! 0=7 Tage Woche, 1=Montag=Wochentags & Samstag=Wochenende, 2= Montag=Woche, 3=Montag=Wochentags & Samstag=Samstag & Sonntag=Sonntag

integer leiste = 1; ! Welche Zeitleiste aktiv ist

if (leiste == 1){
! Zeitleiste 1
! Uhrzeit 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2|
! 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3|
string zeitleiste_mon = "000000000000001122222222222222222222222111110000";
string zeitleiste_die = "000000000000001122222222222222222222222111110000";
string zeitleiste_mit = "000000000000001122222222222222222222222111110000";
string zeitleiste_don = "000000000000001122222222222222222222222111110000";
string zeitleiste_fre = "000000000000001122222222222222222222222111110000";
string zeitleiste_sam = "000000000000001122222222222222222222222111110000";
string zeitleiste_son = "000000000000001122222222222222222222222111110000";
};
if (leiste == 2){
! Zeitleiste 2
! Uhrzeit 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2|
! 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3|
string zeitleiste_mon = "000000000000134440000000000000000001344444422110";
string zeitleiste_die = "000000000000134440000000000000000001344444422110";
string zeitleiste_mit = "000000000000134440000000000000000001344444422110";
string zeitleiste_don = "000000000000134440000000000000000001344444422110";
string zeitleiste_fre = "000000000000134440000000000000000001344444422110";
string zeitleiste_sam = "000000000000001122444444444444444444433333222110";
string zeitleiste_son = "000000000000001122444444444444444444433333222110";
};

boolean debug = 0; ! Debug Infos ins Syslog - sollte immer auf 0 sein, nur bei Problemen auf 1

!******************************************************
! Ab hier Script CODE - Do not change behind this line
!******************************************************

! Umwandeln deltaStdMin in Sekunden
integer stunde = deltaStdMin.Substr(0, 2).ToInteger();
integer minute = deltaStdMin.Substr(3, 2).ToInteger();
integer setdelta = (stunde * 3600) + (minute * 60);

object regler; ! Datenobjekt des Reglers für die Solltemperatur (Kanal 2)

real soll_neu; ! Die neue Solltemperatur fuer den Raumthermostaten (Regler).
real soll_alt; ! Die alte Solltemperatur der Zeitleiste, die zuletzt aktuell war.
real soll_ist = -1; ! Die aktuelle Solltemperatur im Raumthermostat (Regler).

time sv_timestamp; ! Zeitstempel der Systemvariablen, die zuletzt geändert worden ist (Wert in Sekunden).
time rt_timestamp; ! Zeitstempel, wann die Solltemperatur im RT zuletzt gesetzt wurde.
boolean prioritaet = false; ! Ist prioritaet = true, dann wird die neue Solltemperatur auf jeden Fall in den Regler geschrieben.

!Wenn keine Heizperiode, dann Heizkörper auf
if (dom.GetObject('Heizperiode').State()) {
soll_neu = 100;
prioritaet = true;


! Komfort_Config Thermostatabfrage
if (kconfig) {
var myAssembly = dom.GetObject(raum);
string itemID;

! Solltemperatur im Raumthermostat ermitteln.
foreach(itemID, myAssembly.EnumUsedIDs()) {
var item = dom.GetObject(itemID);
if (item.IsTypeOf(OT_CHANNEL)) {
var device = dom.GetObject(item.Device());

! Wenn Raumthermostat gefunden wurde...
if (device.HssType() == "HM-CC-RT-DN") {
if (soll_ist < 0) { ! ...und Temperaturwert noch nicht abgefragt worden ist...


! ...dann aktuelle Solltemperatur auslesen.
regler = dom.GetObject("BidCos-RF." # device.Address() # ":2.SETPOINT");
soll_ist = regler.Value();
}
}
}
}
! Komfort_Config Thermostatabfrage - ENDE
} else {
! Komfort_Config - Manuell
! Aktuelle Solltemperatur auslesen
object regler = dom.GetObject("BidCos-RF." # sRegler # ":2.SETPOINT");
soll_ist = regler.Value();
! Komfort_Config - Manuell - ENDE
}

} else {

integer offen = 0;
if (kconfig) {
! Komfort_Config Verschluss ueberpruefen im Raum
! Alle Geräte im "raum" abfragen und auswerten.
var myAssembly = dom.GetObject(raum);
string itemID;

foreach(itemID, myAssembly.EnumUsedIDs()) {
var item = dom.GetObject(itemID);
if (item.IsTypeOf(OT_CHANNEL)) {
var device = dom.GetObject(item.Device());

! Wenn Raumthermostat gefunden wurde...
if (device.HssType() == "HM-CC-RT-DN") {
if (soll_ist < 0) { ! ...und Temperaturwert noch nicht abgefragt worden ist...


! ...dann aktuelle Solltemperatur auslesen.
regler = dom.GetObject("BidCos-RF." # device.Address() # ":2.SETPOINT");
soll_ist = regler.Value();
}

} else {

! Prüfen, ob Verschluss offen
! Testen, ob Fenster Dachluken, usw. offen sind. Diese müssen dem jeweiligen Raum und dem Gewerk "Verschluss" zugeordnet sein
! Alle Gewerke dem Raum zugeordneten Geräte untersuchen
! Andere als die aufgeführten Sensoren oder Aktoren, die als Verschluss dienen, einfach in nachfolgender IF-Anweisung ändern oder ergänzen.

! Türfensterkontakte Jalousienaktor / Dachluken Funk Jalousienaktor / Dachluken Wired Schließerkontakt-Sensor Hutschienenmontage Fenster-Drehgriffsensoren Funk-Rollladenaktor für Markenschalter
if ((device.HssType() == "HM-Sec-SC") || (device.HssType() == "HM-LC-Bl1-FM") || (device.HssType() == "HMW-LC-Bl1-DR") || (device.HssType() == "HMW-Sen-SC-12-DR") || (device.HssType() == "HM-Sec-RHS") || (device.HssType() == "HM-LC-Bl1PBU-FM")) {
var myChannel = dom.GetObject(item);
string id;
foreach(id, myChannel.ChnFunction()) {
var func = dom.GetObject(id);
if (func.Name() == "Verschluss") {
if (item.State() > 0) { offen = offen + 1.00; }
}
}
}
}
}
}
! Komfort_Config Verschluss ueberpruefen im Raum - ENDE
} else {
! Manuelle Konfig Verschluss

regler = dom.GetObject("BidCos-RF." # sRegler # ":2.SETPOINT");
soll_ist = regler.Value();
if ( sTuerenUndFenster != "" )
{
string value;
foreach (value,sTuerenUndFenster.Split(";"))
{
object myChannel = dom.GetObject(value);
if (myChannel.State() > 0)
{
offen = offen + 1.00;
}
}
}
! Manuelle Konfig Verschluss Ende
}
! Wenn ein Verschluss im Raum offen ist, dann Fenstertemperatur einstellen
if (offen > 0) { ! Fenster offen, Ventile einstellen
if (soll_ist <= grad_fenster) { ! Wenn soll_ist niedriger als grad_fenster (z.B. Ventile zu -> soll_ist = 0), dann nichts machen
soll_neu = soll_ist;
} else {
soll_neu = grad_fenster;
prioritaet = true;
}
} else {

! Timestamp "Partytemperatur" festhalten
sv_timestamp = dom.GetObject('Partytemperatur').Timestamp();

! Partytemperatur testen und einstellen, -1 = deaktiviert
integer partytemperatur = dom.GetObject('Partytemperatur').State();
if (partytemperatur > -1) { !Wenn Partytemperatur, dann einstellen
soll_neu = partytemperatur;
} else {

! Prüfen ob Timestamp "Urlaub" jünger ist als "Partytemperatur" => Wenn ja, merken
time settime = dom.GetObject('Urlaub').Timestamp();
if (settime > sv_timestamp) {sv_timestamp = settime;}

! Urlaub testen und einstellen, -1 = deaktiviert
if ((dom.GetObject('Urlaub').State()) && (grad_urlaub > -1)) { !Wenn im Urlaub und grad_urlaub nicht -1 (deaktiviert)
soll_neu = grad_urlaub;
} else {

! Prüfen ob Timestamp "Gaeste" jünger ist als "Urlaub" => Wenn ja, merken
settime = dom.GetObject('Gaeste').Timestamp();
if (settime > sv_timestamp) {sv_timestamp = settime;}

! Gaeste testen und einstellen, -1 = deaktiviert
if ((dom.GetObject('Gaeste').State()) && (grad_gaeste > -1)){ !Wenn Gaeste im Haus und grad_gaeste nicht -1 (deaktiviert)
soll_neu = grad_gaeste;
} else {

! Prüfen ob Timestamp "Anwesenheit" jünger ist als "Gaeste" => Wenn ja, merken
settime = dom.GetObject('Anwesenheit').Timestamp();
if (settime > sv_timestamp) {sv_timestamp = settime;}

! Differenzen von außer Haus Testen und beachten
if ((!dom.GetObject('Anwesenheit').State()) && (grad_aa > -1)) {
soll_neu = grad_aa;
} else {

string zeitleiste_heute; ! Die Temperaturleiste fuer den aktuellen Tag.
string zeitleiste_gestern; ! Die Temperaturleiste von gestern.
string heizwert; ! Enthaelt den Wert, der in der Zeitleiste zum jetzigen Zeitpunkt gilt.

! Hier nun die Auswertung der Zeitleisten
!Auswerten, welche Zeitleiste heute ist
integer tag = system.Date("%u");
if ((tag == 1) && (woche == 0)) {zeitleiste_heute = zeitleiste_mon;} else {
if ((tag == 2) && (woche == 0)) {zeitleiste_heute = zeitleiste_die;} else {
if ((tag == 3) && (woche == 0)) {zeitleiste_heute = zeitleiste_mit;} else {
if ((tag == 4) && (woche == 0)) {zeitleiste_heute = zeitleiste_don;} else {
if ((tag == 5) && (woche == 0)) {zeitleiste_heute = zeitleiste_fre;} else {
if ((tag == 6) && ((woche == 0) || (woche == 3))) {zeitleiste_heute = zeitleiste_sam;} else {
if ((tag == 7) && ((woche == 0) || (woche == 3))) {zeitleiste_heute = zeitleiste_son;} else {
if ((tag >= 1) && (tag <= 5) && ((woche == 1) || (woche == 3))) {zeitleiste_heute = zeitleiste_mon;} else {
if ((tag >= 6) && (tag <= 7) && (woche == 1)) {zeitleiste_heute = zeitleiste_sam;} else {
if (woche == 2) {zeitleiste_heute = zeitleiste_mon;} }}}}}}}}}

! An Feiertagen gilt die Temperatur von Samstag bzw. Sonntag
if (dom.GetObject('Feiertag').State() && ((woche == 0) || (woche == 3))) {zeitleiste_heute = zeitleiste_son;} else {
if (dom.GetObject('Feiertag').State() && (woche == 1)) {zeitleiste_heute = zeitleiste_sam;}}

! Position der Zeitleiste bestimmen
if (system.Date("%M").ToInteger() > 29) {integer add = 1;} else {integer add = 0;}
integer sTime = (system.Date("%H").ToInteger()*2)+add;
heizwert = zeitleiste_heute.Substr(sTime, 1);

! Temperatur bestimmen, die gesetzt werden soll
if (heizwert == "0") {soll_neu = grad_0;} else {
if (heizwert == "1") {soll_neu = grad_1;} else {
if (heizwert == "2") {soll_neu = grad_2;} else {
if (heizwert == "3") {soll_neu = grad_3;} else {
if (heizwert == "4") {soll_neu = grad_4;} else {
if (heizwert == "5") {soll_neu = grad_5;} else {
if (heizwert == "6") {soll_neu = grad_6;} else {
if (heizwert == "7") {soll_neu = grad_7;} else {
if (heizwert == "8") {soll_neu = grad_8;} else {
if (heizwert == "9") {soll_neu = grad_9;} }}}}}}}}}

! letzte Solltemeratur bestimmen, dabei muß der wert von 00:00 beachtet werden - der letzte Wert war gestern
if (sTime == 0) {
if ((tag == 1) && ((woche == 0) || (woche == 3))) {zeitleiste_gestern = zeitleiste_son;} else {
if ((tag == 2) && (woche == 0)) {zeitleiste_gestern = zeitleiste_mon;} else {
if ((tag == 3) && (woche == 0)) {zeitleiste_gestern = zeitleiste_die;} else {
if ((tag == 4) && (woche == 0)) {zeitleiste_gestern = zeitleiste_mit;} else {
if ((tag == 5) && (woche == 0)) {zeitleiste_gestern = zeitleiste_don;} else {
if ((tag == 6) && (woche == 0)) {zeitleiste_gestern = zeitleiste_fre;} else {
if ((tag == 7) && ((woche == 0) || (woche == 3))) {zeitleiste_gestern = zeitleiste_sam;} else {
if ((tag >= 2) && (tag <= 6) && ((woche == 1) || (woche == 3))) {zeitleiste_gestern = zeitleiste_mon;} else {
if (((tag == 1) || (tag == 7)) && (woche == 1)) {zeitleiste_gestern = zeitleiste_sam;} else {
if (woche == 2) {zeitleiste_gestern = zeitleiste_mon;} }}}}}}}}}

heizwert = zeitleiste_gestern.Substr(47, 1);
} else {
heizwert = zeitleiste_heute.Substr((sTime-1), 1);
}

! Temperatur bestimmen, die in der letzten 30 Minutenn war
if (heizwert == "0") {soll_alt = grad_0;} else {
if (heizwert == "1") {soll_alt = grad_1;} else {
if (heizwert == "2") {soll_alt = grad_2;} else {
if (heizwert == "3") {soll_alt = grad_3;} else {
if (heizwert == "4") {soll_alt = grad_4;} else {
if (heizwert == "5") {soll_alt = grad_5;} else {
if (heizwert == "6") {soll_alt = grad_6;} else {
if (heizwert == "7") {soll_alt = grad_7;} else {
if (heizwert == "8") {soll_alt = grad_8;} else {
if (heizwert == "9") {soll_alt = grad_9;} }}}}}}}}}
} !Ende IF Anwesenheit
} !Ende IF Gaeste
} !Ende IF Urlaub
} !Ende IF Partytemperatur
} !Ende IF Fenster offen
} !Ende IF Heizungsperiode

if (soll_ist >= 0) { ! Wenn RT geantwortet hat (Sollwert konnte ausgelesen werden)...

! ...dann prüfen ob neue Solltemperatur in RT geschrieben werden muss.
if (soll_ist <> soll_neu) { ! Wenn aktuelle Solltemperatur = neue Solltemp., dann nichts machen

time now = system.Date("%Y-%m-%d %H:%M:%S").ToTime(); ! wie spät ist es jetzt?
rt_timestamp = regler.Timestamp();
integer diff = now.ToInteger() - rt_timestamp.ToInteger();

if ((diff >= setdelta) || (prioritaet) || (soll_ist == grad_fenster) || (sv_timestamp >= rt_timestamp) || ((soll_ist == soll_alt) && (soll_alt <> soll_neu))) {

! Temperatur setzen
regler.State(soll_neu);
integer regler_gesetzt = 1;
if (debug) {
string stdout;
string stderr;
system.Exec("logger -t script -p user.debug Raumthermostat " # raum # " neu gesetzt!\n", &stdout, &stderr);
system.Exec("logger -t script -p user.debug alte_Solltemperatur: " # soll_ist # " neue_Solltemperatur: " # soll_neu # "\n", &stdout, &stderr);
system.Exec("logger -t script -p user.debug Letzte_Aenderung: " # rt_timestamp # " Zeitdifferenz:_" # diff # "sek.", &stdout, &stderr);
system.Exec("logger -t script -p user.debug Offene_Luken: " # offen , &stdout, &stderr);
}
}
}
} else {
string stdout;
string stderr;
system.Exec("logger -t script -p user.debug Raumthermostat " # raum # " antwortet nicht!", &stdout, &stderr);
}

Tharanis
Beiträge: 119
Registriert: 15.04.2015, 11:39
Hat sich bedankt: 2 Mal
Danksagung erhalten: 5 Mal

Re: Heizungsthermostatscript V2.0

Beitrag von Tharanis » 24.06.2016, 00:42

auch wenn es die wahrscheinlich wärmste Nacht seit langem ist, komme ich ausgerechnet jetzt mit einer kleinen Korrektur des Heizungsthermostatscripts.

Ich habe die geänderte Version von MartinS gepostet am Laufen (http://homematic-forum.de/forum/viewtop ... 60#p142493). 3 Räume mit HM-CC-TC, 2 Räume nur mit je einem HM-CC-RT-DN und einen Raum mit einem HM-TC-IT-WM-W-EU und drei HM-CC-RT-DN.
Das Script läuft bei den zuerst ausgestatteten Räumen seit nun mehr als 3 Jahren ohne Probleme. Nun hatte ich anlässlich eines Firmwareupdates auf 2.19.9 nur noch Kommunikationsprobleme und bin entnervt auf Firmware 2.17.16 zurück. Durch "Dutycycle als Sysvar" aus http://homematic-forum.de/forum/viewtop ... 31&t=31419 begann meine Fehlersuche, die erfolgreich beendet ist. Ob das unten stehende erste Codeschnipsel alleine für meine Probleme unter Firmware 2.19.9 verantwortlich ist und wie der Dutycycle unter 2.19.9 tatsächlich aussah müsste ich noch testen, aber Lust habe ich nicht^^.

Beim Testen fand ich heraus:
-wenn die Variable "Heizperiode" auf "Heizung aus" (1) gesetzt wird steigt der Dutycycle bei mir sprunghaft an. Von 0-1 auf 21-25% .
-Die Programme der alten Thermostate waren wohl unschuldig, da deaktivieren und aktivieren keine Veränderung des Dutycycle ergab.
-Deaktivieren der Scripte der neuen Thermostate HM-TC-IT-WM-W-EU und HM-CC-RT-DN liess den Dutycycle aber auf 0-1 absinken.

Mein Weg führte mich zu folgender Passage:

Code: Alles auswählen

!Wenn keine Heizperiode, dann Heizkoerper auf
if (dom.GetObject('Heizperiode').State()) {
    soll_neu = 100;
    prioritaet = true;
Hier versucht das Thermostat den soll_neu-Wert auf 100 zu setzen (wahrscheinlich Prozent), die neuen Thermostate können aber kein Prozent, sondern nur Grad. Dies bedeutet, das neue Thermostat wird auf 100Grad gesetzt, was nicht klappen kann.

Ändert man diesen Wert auf 30.5 (Punkt statt Komma), so ist der Dutycycle auch bei "Heizung aus" bei 0-1.

Geänderte Passage bei Einsatz von HM-TC-IT-WM-W-EU und HM-CC-RT-DN

Code: Alles auswählen

!Wenn keine Heizperiode, dann Heizkoerper auf
if (dom.GetObject('Heizperiode').State()) {
    soll_neu = 30.5;
    prioritaet = true;
Ich bin kein Loggingexperte, aber vielleicht kann jemand anderes dieses Verhalten bestätigen.
Bei mir jedenfalls ist "soll_neu" auf 30.5 bei den neuen Thermostaten gesetzt und bei den alten auf 100, bzw. die entsprechenden tmp-Variablen, da ich die Scripte auf tmp-Variablen geändert habe.

EDIT: verschiedene Satzkorrekturen, war beim ersten Post zu spät in der Nacht...
DWD-Unwetterwarnscript v1.32.b03 (RaspberryMatic) - Lüftungswarnung auf Temperatur-Basis

RaspberryMatic (3.65.11.20221005) - Längste Laufzeit bislang: 48 Tage (RaspberryMatic), 72 Tage (CCU2), >100 Tage (CCU1)

Semenchkare
Beiträge: 64
Registriert: 31.08.2014, 19:48
Danksagung erhalten: 1 Mal

Re: Heizungsthermostatscript V2.0

Beitrag von Semenchkare » 04.09.2016, 14:35

ich habe tagsüber auch einen Dutycycle, der sich am Limit bewegt. Ich vermute auch das Heizungsthermostatscript. Dieses habe ich heute einmal komplett ausgeschaltet, während andere Programme alle noch laufen. DC ist nicht einmal bei 10%.
Zuvor lag der DC - bei Anwesenheit von Personen im Haus, zumeist zw. 70% bzw. 80%...
Ich habe viele Tür- und Fensterkontakte, die die Skripte auslösen... Vermutlich ist das eine Ursache. Vielleicht ließe sich das Skript insgesamt noch optimieren??
IP-Komponente ist bei mir kein Thermostat, sondern nur ein HMIP SWDO Türkontakt...

Gruß

Seme
Viele Grüße

Seme

ccu3 Raspberrymatic 3.71.12.20231020,
Thermostate 8x HM-CC-RT-DN 105155 FW 1.4, Thermostat 1x HMIP-eTRV FW 1.6.3
Wandthermostat 1x HM-TC-IT-WM-W-EU FW 1.3
Tuer-Fensterkontakte 7x HM-Sec-SC-2 FW 1.2, Tuer-Fensterkontakt-optisch 1x HMIP-SWDO 1.10.7, Tuer-Fensterkontakt opt. HMIP-SWDO-I FW 1.14.0
Fenster-Drehgriffkontakt HMIP-SRH FW 1.0.1
Bewegungsmelder HM-Sec-MDIR-2 FW 1.6
Temperatur- Feuchtesensor aussen HM-WDS10-TH-O FW 1.3
Rauchmelder HM-Sec-SD FW 1.1, 2x HMIP-SWSD FW 1.0.11
Funk-Schaltaktor HM-LC-Sw1-FM FW 1.12, Funk-Schaltsteckdose HM-ES-PMSw1-Pl 2.5
Zusatzsoftware: CUXDaemon V. 2.11, E-Mail V. 1.7.6, XML API 1.22, hm_pdetect 1.16, Philips Hue 3.2.5

patrick131184
Beiträge: 5
Registriert: 22.12.2016, 14:13

Re: Heizungsthermostatscript V2.0

Beitrag von patrick131184 » 28.12.2016, 14:06

Hallo zusammen,
gibt es eine Möglichkeit die Thermostate HM-CC-RT-DN immer Nachts auf Manuel zu stellen, ohne eine Temperatur mitzugeben?
Wenn ich am Thermostat den den Knopf zum umstellen von Auto auf Manu betätige nimmt das Thermostat ja auch die letzte bekannte Manu Temperatur.

In der Scriptdoku habe ich leider nicht gefunden und über Programme muss ich eine Temperatur mitgeben.

BadenPower

Re: Heizungsthermostatscript V2.0

Beitrag von BadenPower » 28.12.2016, 16:42

patrick131184 hat geschrieben:In der Scriptdoku habe ich leider nicht gefunden und über Programme muss ich eine Temperatur mitgeben.
Das mußt Du per Skript auch.
.

Benutzeravatar
Blackeye
Beiträge: 547
Registriert: 15.08.2015, 16:33
Hat sich bedankt: 2 Mal

Re: Heizungsthermostatscript V2.0

Beitrag von Blackeye » 03.01.2017, 13:12

Hallo zusammen,

ich komme mit der Variable sregler nicht klar. Was muss hier rein. Ich habe 2 Ventile (HM-CC-RT-DN) und einen Raumthermostat (HM-TC-IT-WM-W-EU). Alles zusammen mit einem Türkontakt zusammen in einer Gruppe zusammengepackt. Funktioniert das Script so überhaupt? Im 1. Post steht was von einem Thermostat. Aber wenn ich mich bei dem Regler auf die Gruppe beziehe sollte es ja eigentlich keinen Unterschied machen, oder?

Gruß

Lars

Justus75
Beiträge: 6
Registriert: 11.10.2016, 16:15

Re: Heizungsthermostatscript V2.0

Beitrag von Justus75 » 04.01.2017, 13:46

Hallo zusammen,

ich nutze das Heizungsthermostatscript 2.0 in der abgespeckten Variante mit den tmp-Variablen von Tharanis und bin damit auch im Grunde sehr zufrieden. Vielen Dank für die Arbeit die darin steckt!
Ich habe es mir leicht angepasst (nach Vorschlag von tomtau), da ich keine feste "Urlaubstemperatur" möchte, die dann die ganze Zeit gilt und auch keine "Gästetemperatur" oder "Partytemperatur" (was ist das?) brauche. Ich wollte lediglich zwei unterschiedliche Wochenprogramme einsetzen. Deswegen sind die eben genannten Variablen mit dem Wert "-1" gesetzt und damit für das Programm nicht relevant. Verwendung finden die Systemvariablen "Heizperiode", "Feiertag", "Anwesenheit" und "Urlaub", die auch das Prorgamm auslösen, welches dann für jeden Raum das jeweilige Script ausführt. Die oben genannte Änderung vom tomtau habe ich hinzugefügt, da ich "Urlaub" für mich so definiert habe, dass ich daheim Urlaub mache und dann eben ein anderes Wochenprogramm laufen soll. Bei Urlaub außer Haus ist die Variable "Abwesenheit" entsprechend gesetzt. Damit wären beide Fälle abgedeckt. Nur ein Punkt ist mir generell noch nicht schlüssig. Der direkte manuelle Eingriff direkt am Thermostat.

Meine Frage:
Wie wird genau die manuelle Eingriff an einem Thermostat in die Raumtemperatur geregelt? Das habe ich in keiner Dokumentation oder hier im Thema richtig erklärt gefunden. Bin noch Einsteiger in die ganze Thematik und habe das vielleicht einfach übersehen? Muss ich für jedes Thermostat eine separate Systemvariable für "LastChange" anlegen, wie es hier irgendwo steht? Oder ist das einfacher zu regeln? Ich habe HM-CC-RT-DN und HM-TC-IT-WM-W-EU im Einsatz und irgendwo stand was, das sie sich das direkt merken.

Danke und Gruß
Justus

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“