Heizungsthermostatscript

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

Moderator: Co-Administratoren

kidbuster
Beiträge: 28
Registriert: 16.10.2012, 20:54

Re: Heizungsthermostatscript

Beitrag von kidbuster » 30.10.2013, 13:10

hi, hier mal mein code und ein Paar Screenshots.
Irgendwie funktioniert bei mir garnichts so wirklich, eigentlich passiert nichts.

hoffe das mir jemand helfen kann.

mfg

benny

Code: Alles auswählen

string raum = "Schlafzimmer"; 

! Version 1.7.2
! Script von Erik Groennerud - 8.2009- MM.2010
! Ergaenzung von Zauberlehrling
! Optimiert und ergaenzt von Petrus (Peter)

! Temperaturen 8-30 Grad, 0 = OFF, 100=ON
real grad_0 = 19;
real grad_1 = 20.5;
real grad_2 = 21.0;
real grad_3 = 21.5;
real grad_4 = 22.5;
real grad_5 = 23;
real grad_6 = 25;
real grad_7 = 27;
real grad_8 = 0;
real grad_9 = 100;

real grad_fenster = 6;         ! Temperatur bei offenem Fenster -1 = off
real grad_urlaub  = 16;        ! Temperatur im Urlaub -1 = off
real grad_gaeste  = 23.5;      ! Temperatur fuer Gaeste -1 = off
real grad_aa      = 19;        ! Temperatur ausser haus, wird als Absenkung benutzt, -1 = OFF (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 = "000000000000012210000000000000000011222233321110";
string zeitleiste_die = "000000000000012210000000000000000011111133321110";
string zeitleiste_mit = "000000000000012210000000000000000011111133321110";
string zeitleiste_don = "000000000000012211111111111111111111111133321110";
string zeitleiste_fre = "000000000000012110000000000000000011111133321110";
string zeitleiste_sam = "000000000000001222222221111111111112223333221110";
string zeitleiste_son = "000000000000001211111111111111111111223333221110";
};
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 = "000000000000012210000000000000000011222233321110";
string zeitleiste_die = "000000000000012210000000000000000011111133321110";
string zeitleiste_mit = "000000000000012210000000000000000011111133321110";
string zeitleiste_don = "000000000000012211111111111111111111111133321110";
string zeitleiste_fre = "000000000000012110000000000000000011111133321110";
string zeitleiste_sam = "000000000000001222222221111111111112223333221110";
string zeitleiste_son = "000000000000001211111111111111111111223333221110";
};

boolean debug = 0;             ! Debug Infos ins Syslog

!******************************************************
! 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 4)

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;

    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() # ":4.SET_TEMPERATURE");
                    soll_ist = regler.Value();
                }
            }
        }
    }
} else {
	
    ! Alle Geräte im "raum" abfragen und auswerten.
    var myAssembly = dom.GetObject(raum);
    string itemID;
    integer offen = 0;
		
    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() # ":4.SET_TEMPERATURE");
                    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
                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")) {
                    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; }
                        }
                    }
                }
            }
        }
    }
        
    ! 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);
            }
        }  
    }
} else {
    string stdout;
    string stderr;
    system.Exec("logger -t script -p user.debug Raumthermostat " # raum # " antwortet nicht!", &stdout, &stderr);
}
Dateianhänge
Bildschirmfoto 2013-10-30 um 13.07.21.png
Bildschirmfoto 2013-10-30 um 13.07.00.png
Bildschirmfoto 2013-10-30 um 13.05.02.png

kidbuster
Beiträge: 28
Registriert: 16.10.2012, 20:54

Re: Heizungsthermostatscript

Beitrag von kidbuster » 09.11.2013, 14:16

leider konnte mir keiner gelfen, darum hab ich mit viel versuchen iwann den fehler ausgemärzt, leider net reproduzierbar.

mfg

kidbuster

BPoHVoodoo
Beiträge: 19
Registriert: 10.11.2013, 14:00

Re: Heizungsthermostatscript

Beitrag von BPoHVoodoo » 10.11.2013, 14:07

Hallo,

ich habe mir mal das Script angepasst. Es sollten jetzt beide Thermostattypen gehen!
Vielleicht kann mir ja auch jemand helfen.
Ich habe probleme mit dom.getObject:
Mein Raum heißt "3_OG_Fernsehen". Das nimmt er aber auch nicht.
Hat irgendeiner eine Idee. Wenn der raum nur "Fersehen" heißt, dann klappts!

MfG
Mirco

Code: Alles auswählen

string raum = "3_OG_Fernsehen" ; 

! Version 1.7.3
! Script von Erik Groennerud - 8.2009- MM.2010
! Ergaenzung von Zauberlehrling
! Optimiert und ergaenzt von Petrus (Peter)
! 10.11.2013 BPoHVoodoo
! zusätzliche simultane Unterstützung der neuen Thermostate
! Varaible Heizperiode invertiert 0=aus 1=an (vorher 1=aus 0=an)

! Temperaturen 8-30 Grad, 0 = OFF, 100=ON
real grad_0 = 19;
real grad_1 = 20.5;
real grad_2 = 21.0;
real grad_3 = 21.5;
real grad_4 = 22.5;
real grad_5 = 23;
real grad_6 = 25;
real grad_7 = 27;
real grad_8 = 0;
real grad_9 = 100;

real grad_fenster = 6;         ! Temperatur bei offenem Fenster -1 = off
real grad_urlaub  = 16;        ! Temperatur im Urlaub -1 = off
real grad_gaeste  = 23.5;      ! Temperatur fuer Gaeste -1 = off
real grad_aa      = 19;        ! Temperatur ausser haus, wird als Absenkung benutzt, -1 = OFF (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 = "000000000000012210000000000000000011222233321110";
string zeitleiste_die = "000000000000012210000000000000000011111133321110";
string zeitleiste_mit = "000000000000012210000000000000000011111133321110";
string zeitleiste_don = "000000000000012211111111111111111111111133321110";
string zeitleiste_fre = "000000000000012110000000000000000011111133321110";
string zeitleiste_sam = "000000000000001222222221111111111112223333221110";
string zeitleiste_son = "000000000000001211111111111111111111223333221110";
};
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 = "000000000000012210000000000000000011222233321110";
string zeitleiste_die = "000000000000012210000000000000000011111133321110";
string zeitleiste_mit = "000000000000012210000000000000000011111133321110";
string zeitleiste_don = "000000000000012211111111111111111111111133321110";
string zeitleiste_fre = "000000000000012110000000000000000011111133321110";
string zeitleiste_sam = "000000000000001222222221111111111112223333221110";
string zeitleiste_son = "000000000000001211111111111111111111223333221110";
};

boolean debug = 1;             ! Debug Infos ins Syslog

!******************************************************
! 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;

    ! Alle Geräte im "raum" abfragen und auswerten.
    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-TC") || (device.HssType() == "HM-CC-RT-DN")){
                if (soll_ist < 0) { ! ...und Temperaturwert noch nicht abgefragt worden ist...

                    ! ...dann aktuelle Solltemperatur auslesen.
                    if (device.HssType() == "HM-CC-TC") {
					   regler = dom.GetObject("BidCos-RF." # device.Address() # ":2.SETPOINT");
                    } else {
					   regler = dom.GetObject("BidCos-RF." # device.Address() # ":4.SET_TEMPERATURE");
					}
					soll_ist = regler.Value();
                }
            }
        }
    }
} else {
    	
    ! Alle Geräte im "raum" abfragen und auswerten.
    var myAssembly = dom.GetObject(raum);
    string itemID;
    integer offen = 0;
		
    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-TC") || (device.HssType() == "HM-CC-RT-DN")){
  
                if (soll_ist < 0) { ! ...und Temperaturwert noch nicht abgefragt worden ist...

                    ! ...dann aktuelle Solltemperatur auslesen.
                    if (device.HssType() == "HM-CC-TC") {
                            regler = dom.GetObject("BidCos-RF." # device.Address() # ":2.SETPOINT");
					} else {
					    regler = dom.GetObject("BidCos-RF." # device.Address() # ":4.SET_TEMPERATURE");
				    }
                    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
                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")) {
                    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; }
                        }
                    }
                }
            }
        }
    }
        
    ! 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);
            }
        }  
    }
} else {
    string stdout;
    string stderr;
    system.Exec("logger -t script -p user.debug Raumthermostat " # raum # " antwortet nicht!", &stdout, &stderr);
}
Zuletzt geändert von BPoHVoodoo am 10.11.2013, 18:26, insgesamt 1-mal geändert.

Benutzeravatar
anli
Beiträge: 4326
Registriert: 10.06.2009, 14:01
Wohnort: 20 Min. nördlich von Hannover und bei Bremen
Hat sich bedankt: 1 Mal
Danksagung erhalten: 23 Mal
Kontaktdaten:

Re: Heizungsthermostatscript

Beitrag von anli » 10.11.2013, 14:16

Probier mal "OG3_Fernsehen". Namen dürfen nicht mit Ziffern beginnen wenn sie per Skript verarbeitet werden sollen.
Herzliche Grüße, anli

Alle Angaben ohne Gewähr und Haftung meinerseits. Verwendung der von mir zur Verfügung gestellten Downloads auf eigene Gefahr. Ich bitte um Verständnis, dass ich aus zeitlichen Gründen keine unaufgeforderte Hilfestellung per PN/Mail geben kann. Bitte allgemeine Fragen ins Forum stellen, hier können viele fähige User viel schneller helfen.

Homematic-Manager v2: einfaches Tool zum Erstellen von Direktverknüpfungen und Bearbeiten von Gerätenamen, -parametern etc. für Homematic und HomematicIP (Alternative diesbzgl. zur WebUI)

Einsteiger-Hilfeerweiterter Skript-Parser

BPoHVoodoo
Beiträge: 19
Registriert: 10.11.2013, 14:00

Re: Heizungsthermostatscript

Beitrag von BPoHVoodoo » 10.11.2013, 14:31

Danke, klappt!
Ich habe mir das Script nochmal genauer angesehen.
Ich glaube das kracht, wenn mehr als ein Regler pro Raum vorhanden ist, oder?

MfG
BPoHVoodoo

HM-Anfaenger
Beiträge: 1
Registriert: 08.11.2014, 14:51

Re: Heizungsthermostatscript / Erledigt

Beitrag von HM-Anfaenger » 08.11.2014, 17:33

Hallo,

Ich muß mich erst mal vorstellen. Mein Name ist Timo, und ich bin Neuling. Allerdings hab ich mich schon gefühlte 3 Wochen durch alles durchelesen, aber ohne Erfolg.
Hier mein Vorhaben: (eigentlich einfach: 4 Räume mit den alten Thermostaten=HH-CC-TC mit den dazugehörigen Stellantrieben=HH-CC-VC / dazu kommen noch 3 Fensterkontakte in den dazugehörigen Räumen, sowie eine CCU1). Ich möchte diese eigentlich nur steuern können: Das Bedeutet: Zu bestimmter Zeit eine bestimmte Temperatur bzw. Absenktemperatur, wenn aber bei der Heiztemperatur ein Fenster geöffnet wird soll der Thermostat klar runter regeln, nach dem verschließen der Fenster wieder zurück auf den programmierten Wochenzyklus. Alles logisch bis jetzt.

Da bin ich auf das Skript gestossen, und dachte.....!!! DAS IST EIGENTLICH DAS WAS DU SUCHST!!!

Gesagt getan. Skript aufgebaut mit allen WENN und ODER bzw. DANN... Alle Systemvariablen erstellt etc.

Ergebniss: Ohne Erfolg.

Dann Virtueller Schalter eingebaut (zwecks Umkehr Theorie). Und siehe da es tut sich was. Leider nicht das was es soll.

Sobald ich die Heizperiode auf an stelle tut sich was. Der Thermostat geht sofort auf "ON". Soll heißen er heizt voll durch. Es wird nicht die Temp. der Zeitleiste eingetragen, sondern Stellbefehl 3, Stelldaten 250. Ventil auf 97%.

String Raum ist ebenfalls richtig. Alle Geräte dem Raum zugeordnet. Wie gesagt, es tut sich was, aber die Temperatur wird übergeben. (bzw. wenn sie übergeben wird, wird sie kurz darauf mit dem o.g. Stellbefehl überschrieben). Umgekehrt geht z.B. nichts. Heizperiode aus, und Stellbefehle 0/0.???

Ich hab alles probiert, aber komme zu keiner Lösung.

Fehler gefunden: Hab die Variable "Anwesenheit" vertauscht. Und siehe da es fluppt.

Besten Dank an die Macher.

Vielleicht kann jemand helfen, oder hatte das selbe Problem.

chka
Beiträge: 2483
Registriert: 13.02.2012, 20:23
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 302 Mal
Danksagung erhalten: 116 Mal

Re: Heizungsthermostatscript

Beitrag von chka » 30.11.2014, 20:34

Ich werde auch zur Zeit nicht schlau, laufen tut es aber bin ich weg geht der Steller in seinen Abwesenheitsmodus.

Eine halbe stunde später ich bin immer noch nicht da schwups ist er wieder in seinem normalen modus und heitzt schöne die Bude auf :evil:

Das ganze lief mit der CCU 1 wunderbar jetzt nach dem tausch auf die 2 taucht das Problem auf.

Immo zickt die CCU aber so richtig
RaspberryMatic - CuL 868mHz- CuxDemon - PioTek Tracker - Velux mit KLF200 und Somfy Anbindung- io.Broker auf Proxmox NUC6I3SYH i3-6100U RAM: 40Gig Crucial 8GB DDR4 CT2K8G4SFS824A + 32GB DDR4CT32G4SFD8266

Tomiliy
Beiträge: 156
Registriert: 03.12.2014, 19:28
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal

Re: Heizungsthermostatscript

Beitrag von Tomiliy » 03.12.2014, 19:33

Hallo, ich binhier neu und habe dieses Script für mich entdeckt.
Aber ich schnalle noch nicht, wie ich das aktivieren kann.
Läuft das einfach nur und wertet Anhand des Raumnamen die Funktion aus? Wenn ja, klappt es nicht. Oder muss ich das Programm noch mit irgendwas verbinden?

Danke.
BPoHVoodoo hat geschrieben:Hallo,

ich habe mir mal das Script angepasst. Es sollten jetzt beide Thermostattypen gehen!
Vielleicht kann mir ja auch jemand helfen.
Ich habe probleme mit dom.getObject:
Mein Raum heißt "3_OG_Fernsehen". Das nimmt er aber auch nicht.
Hat irgendeiner eine Idee. Wenn der raum nur "Fersehen" heißt, dann klappts!

MfG
Mirco

Code: Alles auswählen

string raum = "3_OG_Fernsehen" ; 

! Version 1.7.3
! Script von Erik Groennerud - 8.2009- MM.2010
! Ergaenzung von Zauberlehrling
! Optimiert und ergaenzt von Petrus (Peter)
! 10.11.2013 BPoHVoodoo
! zusätzliche simultane Unterstützung der neuen Thermostate
! Varaible Heizperiode invertiert 0=aus 1=an (vorher 1=aus 0=an)

! Temperaturen 8-30 Grad, 0 = OFF, 100=ON
real grad_0 = 19;
real grad_1 = 20.5;
real grad_2 = 21.0;
real grad_3 = 21.5;
real grad_4 = 22.5;
real grad_5 = 23;
real grad_6 = 25;
real grad_7 = 27;
real grad_8 = 0;
real grad_9 = 100;

real grad_fenster = 6;         ! Temperatur bei offenem Fenster -1 = off
real grad_urlaub  = 16;        ! Temperatur im Urlaub -1 = off
real grad_gaeste  = 23.5;      ! Temperatur fuer Gaeste -1 = off
real grad_aa      = 19;        ! Temperatur ausser haus, wird als Absenkung benutzt, -1 = OFF (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 = "000000000000012210000000000000000011222233321110";
string zeitleiste_die = "000000000000012210000000000000000011111133321110";
string zeitleiste_mit = "000000000000012210000000000000000011111133321110";
string zeitleiste_don = "000000000000012211111111111111111111111133321110";
string zeitleiste_fre = "000000000000012110000000000000000011111133321110";
string zeitleiste_sam = "000000000000001222222221111111111112223333221110";
string zeitleiste_son = "000000000000001211111111111111111111223333221110";
};
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 = "000000000000012210000000000000000011222233321110";
string zeitleiste_die = "000000000000012210000000000000000011111133321110";
string zeitleiste_mit = "000000000000012210000000000000000011111133321110";
string zeitleiste_don = "000000000000012211111111111111111111111133321110";
string zeitleiste_fre = "000000000000012110000000000000000011111133321110";
string zeitleiste_sam = "000000000000001222222221111111111112223333221110";
string zeitleiste_son = "000000000000001211111111111111111111223333221110";
};

boolean debug = 1;             ! Debug Infos ins Syslog

!******************************************************
! 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;

    ! Alle Geräte im "raum" abfragen und auswerten.
    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-TC") || (device.HssType() == "HM-CC-RT-DN")){
                if (soll_ist < 0) { ! ...und Temperaturwert noch nicht abgefragt worden ist...

                    ! ...dann aktuelle Solltemperatur auslesen.
                    if (device.HssType() == "HM-CC-TC") {
					   regler = dom.GetObject("BidCos-RF." # device.Address() # ":2.SETPOINT");
                    } else {
					   regler = dom.GetObject("BidCos-RF." # device.Address() # ":4.SET_TEMPERATURE");
					}
					soll_ist = regler.Value();
                }
            }
        }
    }
} else {
    	
    ! Alle Geräte im "raum" abfragen und auswerten.
    var myAssembly = dom.GetObject(raum);
    string itemID;
    integer offen = 0;
		
    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-TC") || (device.HssType() == "HM-CC-RT-DN")){
  
                if (soll_ist < 0) { ! ...und Temperaturwert noch nicht abgefragt worden ist...

                    ! ...dann aktuelle Solltemperatur auslesen.
                    if (device.HssType() == "HM-CC-TC") {
                            regler = dom.GetObject("BidCos-RF." # device.Address() # ":2.SETPOINT");
					} else {
					    regler = dom.GetObject("BidCos-RF." # device.Address() # ":4.SET_TEMPERATURE");
				    }
                    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
                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")) {
                    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; }
                        }
                    }
                }
            }
        }
    }
        
    ! 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);
            }
        }  
    }
} else {
    string stdout;
    string stderr;
    system.Exec("logger -t script -p user.debug Raumthermostat " # raum # " antwortet nicht!", &stdout, &stderr);
}
--------------------------------------------
4 Kanäle in 42 Geräten:
1x HM-LC-Dim1T-FM, 1x HM-RC-8, 12x HM-Sec-SCo, 3x HM-LC-Sw1-Pl-2, 1x HM-PBI-4-FM, 1x HM-OU-CFM-Pl, 3x HM-Sen-EP, 1x HM-CC-VG-1, 1x HM-Sec-MDIR-2, 12x HM-CC-RT-DN, 1x HM-LC-Bl1PBU-FM, 1x HM-Sen-RD-O, 2x HM-PB-2-WM55-2, 1x HM-TC-IT-WM-W-EU, 1x 10000
--------------------------------------------

Tomiliy
Beiträge: 156
Registriert: 03.12.2014, 19:28
Hat sich bedankt: 12 Mal
Danksagung erhalten: 1 Mal

Re: Heizungsthermostatscript

Beitrag von Tomiliy » 09.12.2014, 15:38

Hallo,

ich hab das Script mittlerweile lauffähig in Räumen wo nur ein Stellantrieb ist.
Ich habe im Raum "Wintergarten" 2 Stellantriebe. biedes mal das DN Modell.
Ich bekomme es nicht hin, das dass Script beide Stellantriebe bewuslet, es wird immer nur ein Stelllantrieb angesprochen. Danach ist das Script fertig...
Blöd..

Hat einer eine Idee?
2014-12-09_15h37_53.png
Wintergarten

Code: Alles auswählen

string raum = "Wintergarten" ; ! 

! Version 1.7.2
! Script von Erik Groennerud - 8.2009- MM.2010
! Ergaenzung von Zauberlehrling
! Optimiert und ergaenzt von Petrus (Peter)
! Folgende Systemvariable werden benötigt:
!  Heizperiode (boolean) 0 = Zentralheizung an, 1 = aus. Thermostate werden bei abgeschalteter Zentralheizung geöffnet
!  Gaeste (boolean) 1= Gäste im Haus, 0 keine Gäste
!  Urlaub (boolean) 1= Im Urlaub, 0 zu Hause
!  Anwesenheit (boolean) 1=zu Hause, 0 weg
!  Partytemperatur,(zahl) default -1, Ansonsten Temperatur, Wertebereich: -1 bis 100
!  Feiertag (boolean) 1=Feiertag, 0 kein Feiertag

! Temperaturen 8-30 Grad, 0 = OFF, 100=ON
real grad_0 = 19;
real grad_1 = 20.5;
real grad_2 = 21.0;
real grad_3 = 21.5;
real grad_4 = 22.5;
real grad_5 = 23;
real grad_6 = 25;
real grad_7 = 27;
real grad_8 = 0;
real grad_9 = 100;

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

string deltaStdMin = "00: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 = "000000000000012210000000000000000011111111111110";
string zeitleiste_die = "000000000000012210000000000000000011111111111110";
string zeitleiste_mit = "000000000000012210000000000000000011111111111110";
string zeitleiste_don = "000000000000012210000000000000000011111111111110";
string zeitleiste_fre = "000000000000012210000000000000000011111111111110";
string zeitleiste_sam = "220000000000001222222221111111111112222222111110";
string zeitleiste_son = "000000000000001222222221111111111112222211111110";
};
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 = "000000000000012210000000000000000011222233321110";
string zeitleiste_die = "000000000000012210000000000000000011111133321110";
string zeitleiste_mit = "000000000000012210000000000000000011111133321110";
string zeitleiste_don = "000000000000012211111111111111111111111133321110";
string zeitleiste_fre = "000000000000012110000000000000000011111133321110";
string zeitleiste_sam = "000000000000001222222221111111111112223333221110";
string zeitleiste_son = "000000000000001211111111111111111111223333221110";
};

boolean debug = 1;             ! Debug Infos ins Syslog

!******************************************************
! 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 4)

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;

    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() # ":4.SET_TEMPERATURE");
                    soll_ist = regler.Value();
                }
            }
        }
    }
} else {
   
    ! Alle Geräte im "raum" abfragen und auswerten.
    var myAssembly = dom.GetObject(raum);
    string itemID;
    integer offen = 0;
      
    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() # ":4.SET_TEMPERATURE");
                    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
                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")) {
                    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; }
                        }
                    }
                }
            }
        }
    }
        
    ! 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_heute').State() && ((woche == 0) || (woche == 3))) {zeitleiste_heute = zeitleiste_son;} else {
                        if (dom.GetObject('Feiertag_heute').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);
            }
        }  
    }
} else {
    string stdout;
    string stderr;
    system.Exec("logger -t script -p user.debug Raumthermostat " # raum # " antwortet nicht!", &stdout, &stderr);
}
--------------------------------------------
4 Kanäle in 42 Geräten:
1x HM-LC-Dim1T-FM, 1x HM-RC-8, 12x HM-Sec-SCo, 3x HM-LC-Sw1-Pl-2, 1x HM-PBI-4-FM, 1x HM-OU-CFM-Pl, 3x HM-Sen-EP, 1x HM-CC-VG-1, 1x HM-Sec-MDIR-2, 12x HM-CC-RT-DN, 1x HM-LC-Bl1PBU-FM, 1x HM-Sen-RD-O, 2x HM-PB-2-WM55-2, 1x HM-TC-IT-WM-W-EU, 1x 10000
--------------------------------------------

Benutzeravatar
spitzlbergerj
Beiträge: 42
Registriert: 23.11.2014, 10:02
Kontaktdaten:

Re: Heizungsthermostatscript

Beitrag von spitzlbergerj » 10.12.2014, 08:20

Hallo Tomiliy,

ich habe auf Basis des Heizungsthermostatscripts eine eigene Version des Skripts programmiert. Dieses fragt im Raum nach Wandthermostaten und Heizkörperthermostaten. Wird eines an der Wand gefunden, dann wird nur dieses dieses gestellt (Direktverknüpfungen notwendig). Werden welche an Heizkörpern gefunden, dann werden diese alle einzeln gestellt.

Ich habe allerdings eine andere Struktur der Systemvariablen. Deshalb lege ich diese Beschreibung hier auch bei. Die Systemvariablen werden über einen Google-Kalender mehrmals am Tag befüllt. Auch dieses Skript und das zugehörige Google WebApp Skript liegt auch bei. Siehe hierzu auch unbedingt diesen Thread http://homematic-forum.de/forum/viewtop ... 31&t=11386. Die Feiertage werden über das Skript in diesem Thread http://homematic-forum.de/forum/viewtop ... =31&t=4058 befüllt

Beim Heizungsskript ist noch wichtig zu wissen:
- unsere Kids sind schon ausgezogen, kommen aber immer mal wieder heim ;-)
- in diesen Fällen soll das jeweilige Zimmer dann rechtzeitig mollig warm beheizt werden
- Dazu werden die Systemvariable über den Kalender für z.B. das Gondelzimmer gesetzt: SysVar-GZ-heute, SysVar-GZ-vorm, SysVar-GZ-nachm, ... je nachdem, wann die Kids ankommen
- Am nächsten Morgen muss aber auch noch geheizt werden, da die Damen in der Wärme duschen wollen ;-)

Für das Google Calendar Skript brauchst du CUxD. Mein Google-App-Skript liefert im Gegensatz zum Ursprungsskript immer ein "GE" voraus, damit die CCU2 keinen Fehler bei einer leeren Antwort wirft.

Fragen? Gerne per PN

Grüße
Sepp
Dateianhänge
Google-Calendar_V1.0_Forum.txt
Lesen des Google-Kalenders
(10.61 KiB) 253-mal heruntergeladen
GOOGLE-SCRIPT-Calendarabfrage-V2.txt
Das Google Web-App-Skript
(4.65 KiB) 263-mal heruntergeladen
Systemvariable.txt
meine Systemvariablen
(3.52 KiB) 306-mal heruntergeladen
Raumheizung_V1.0_GZ.txt
Heizungsskript für das Gondelzimmer
(26.91 KiB) 332-mal heruntergeladen
Grüße
Sepp

Fang nie an aufzuhören!
Hör nie auf anzufangen!
--------------------------------------------
CCU3, CCU2 in abgesetzter Garage
3x HM-RC-P1, 2x HM-LC-Sw4-PCB, 1x HM-RC-19, 1x HM-PB-4Dis-WM-2, 3x HM-ES-PMSw1-Pl-DN-R1, 1x HM-LC-Sw1-Pl-DN-R1, 3x HM-Sec-SCo, 15x HM-CC-RT-DN, 1x HM-PBI-4-FM, 9x HM-LC-Sw1-FM, 1x HM-LC-Sw1-PCB, 1x HM-LC-Sw2-FM, 6x HM-SwI-3-FM, 3x HM-PB-2-WM55-2, 1x HM-Sec-SC-2, 7x HM-TC-IT-WM-W-EU, 2x HM-PB-6-WM55, 1x HmIP-RCV-50, 4x HM-Sen-MDIR-O, 73 Systemvariable, 69 Programme
CUxD, Cloudmatic, RedMatic, HM-pdetect
Anbindung MagicMirror über diverse Module
--------------------------------------------

Antworten

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