Heizungsthermostatscript V2.0

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

Moderator: Co-Administratoren

Bratmaxe
Beiträge: 1573
Registriert: 28.05.2015, 12:48
Wohnort: Willich
Hat sich bedankt: 4 Mal
Danksagung erhalten: 10 Mal

Re: Heizungsthermostatscript V2.0

Beitrag von Bratmaxe » 23.05.2017, 12:48

Hallo,

kann mir jemand erklären, welchen Vorteil dieser Skript zu den "normalen" Direktverknüpfungen von Heizkörperthermostat und Fensterkontakt bringt?
Anscheinend bin ich zu blöd das zu erkennen. Alle im Skript verwendeten Funktionen habe ich, soweit ich es erkenne auch, nur halt per Wochenprogramm und Direktverknüpfung realisiert (und dann noch ein zusätzlicher Programmeingriff, bei Abwesenheit und Schlafen gehen)

Hoffe mir kann hier jemand einen Denkanstoß verpassen ich komme einfach nicht dahiner..
Gruß Carsten

Xel66
Beiträge: 14085
Registriert: 08.05.2013, 23:33
System: Alternative CCU (auf Basis OCCU)
Wohnort: Nordwürttemberg
Hat sich bedankt: 580 Mal
Danksagung erhalten: 1492 Mal

Re: Heizungsthermostatscript V2.0

Beitrag von Xel66 » 23.05.2017, 15:47

Die Anfänge des Scripts bzw. dessen Vorgängers stammen noch aus einer Zeit, als die Möglichkeiten der Wandthermostate begrenzter waren. Dort gab es auch noch den cent-Betrieb. Nein, das ist kein billiger Betrieb, sondern die Sollwerte wurden durch die (C/Z)entrale sprich CCU vorgegeben. Mit dem Script gab es einen gefühlten Komfortgewinn. Mit der Einführung der lokalen Profile war es eher überflüssig und wurde aber immer noch weiter gepflegt und auf die neue/aktuelle Thermostatversion angepasst und erweitert. Insofern ergibt sich kein wirklicher Vorteil aus der Benutzung. Im Gegenteil, bei Änderungswünschen muss man sich immer ins Script bemühen und dort die Sollwerte an die Wünsche anpassen. Benutzt man die Profile der Thermostate, ist gleiches mit ein paar Mausklicks erledigt. Allerdings sind nach einiger Betriebszeit nur noch selten Änderungen notwendig.

Das Script bietet m.E. keinen wirklichen Vorteil oder Komfortgewinn, birgt aber mit aktuellen Firmwareversionen, die verstärkt auf die Einhaltung des Duty Cycle achten, bei unachtsamer Konfiguration der verwendeten Thermostate einen nicht zu verachtenden Fallstrick. Durch den häufigen Scriptlauf und die häufige Übermittlung der (größtenteils unveränderten) Sollwerte alle paar Minuten ist der Kommunikationsbedarf stark erhöht und kann daher den Duty Cycle, also die prozentuale Auslastung der genehmigten Sendezeit des Systems, nicht unerheblich in die Höhe treiben. dieses kann sich sehr negativ auf das gesamte System auswirken (Kommunikationsstörungen und fehlende Aktorschaltvorgänge).

Und wieviele unterschiedliche Heizzeiten hat man wirklich am Tage? Es wird vielleicht morgens beim Aufstehen mal geheizt, dann wieder abgesenkt und dann am Nachmittag bis zum Abend zur Ins-Bett-geh-Zeit. Macht vier bis sechs Zeitpunkte zur Umschaltung der Solltemperatur. Beim einen Anwender mehr, bei anderen weniger. Ob man für diese überschaubaren Vorgänge alle drei bis fünf Minuten ein Script laufen lassen muss, welches im selben Takt die Sollwerte in die Thermostate schreibt (oder die Thermostate sich die Werte bei der zyklischen Kommunikation holen)? Ich persönlich bezweifle eher die Notwendigkeit. Ob jemand das Script einsetzt, muss er für sich entscheiden... Ich finde keinen Vorteil in der Scriptversion.

Bei den aktuellen Thermostaten kann man abweichende Sollwerte jederzeit auch im Automatikbetrieb an die Thermostate übermitteln, wenn man es doch mal früher warm haben will oder an einem Tag heizen, weil gerade Feiertag ist aber das Wochenprofil sagt, dass gerade Absenkzeit ist. Isofern stehen einem auch bei Verwendung des vorgesehenen Automatikbetriebes alle Möglichkeiten offen.

Gruß Xel66
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch

LarsM
Beiträge: 202
Registriert: 08.05.2009, 22:36

Re: Heizungsthermostatscript V2.0

Beitrag von LarsM » 02.10.2017, 15:53

Ich nutze das Script seit den Anfängen bis heute. Hauptgrund ist, das ich das Heizungsprofil in Abhängigkeit von der Anwesenheit steuere. Je nachdem, wer im Haus anwesend ist bzw. es nicht ist, werden unterschiedliche Räume genutzt. Genau das macht für mich das Script hervorragend.

Gesendet von meinem Nexus 7 mit Tapatalk
Gruß
Lars

84 Kanäle in 39 Geräten und 29 CUxD-Kanäle in 14 CUxD-Geräten:
2x HM-Sec-SC, 8x HM-CC-VD, 8x HM-CC-TC, 3x HM-Sec-WDS, 5x HM-Sec-RHS, 1x CUX28, 1x CUX40, 1x HM-WDS10-TH-O, 8x CUX02, 2x CUX06, 1x HM-CCU-1, 2x HM-RC-Key3-B, 3x HM-Sec-SD, 2x CUX03, 1x HM-WDS100-C6-O, 1x HM-Sec-SD-Team, 1x HM-OU-LED16, 2x HM-Sec-MDIR, 1x HM-WDC7000

Xel66
Beiträge: 14085
Registriert: 08.05.2013, 23:33
System: Alternative CCU (auf Basis OCCU)
Wohnort: Nordwürttemberg
Hat sich bedankt: 580 Mal
Danksagung erhalten: 1492 Mal

Re: Heizungsthermostatscript V2.0

Beitrag von Xel66 » 02.10.2017, 17:02

LarsM hat geschrieben:Genau das macht für mich das Script hervorragend.
Schon mal auf Deinen Duty Cycle geschaut? Ich deaktiviere bei milden Außentemperaturen meine Heizung und gebe dann allen Thermostaten eine Absenktemperatur vor. Bei dieser Aktion bekomme ich regelmäßig eine Duty Cycle-Warnung auf mein Smartphone. Er ist durch diese einmalige Aktion zwar nicht im kritischen Bereich, aber ich habe einen Anstieg von durchschnittlich einstelligen Prozentzahlen auf >25% (ich habe mir für die Push-Warnung mehrere Schwellen bei Überschreitung hinterlegt). Allerdings ist in meinen Thermostaten Wake on Radio aktiviert, so dass vor dem Übermitteln ein Burst rausgeht. Wenn ich mir vorstelle, alle paar Minuten in den Thermostaten (auch unveränderte) Solltemperaturen zu setzen wie es das Script tut, dann geht der gesammte Duty Cycle nur für die Heizungssteuerung drauf. Mit alten Firmwarversionen mag das noch kein Problem sein (dort wurde der DC falsch berechnen und man stieß nicht so leicht an Grenzen), aber mit aktuellen Versionen kann man sein System schön auf den Bauch legen. Aber jeder wie er will.

Gruß Xel66
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch

LarsM
Beiträge: 202
Registriert: 08.05.2009, 22:36

Re: Heizungsthermostatscript V2.0

Beitrag von LarsM » 02.10.2017, 17:40

Jetzt gerade zum ersten Mal, da ich bei knapp 50 Geräten noch nie fühlbar Probleme hatte. Der Duty Cycle der CCU2 beträgt aktuell 5%. Der des LAN-Gateway 0%.

Nachtrag: Wenn ich mich nicht irre, sendet das Script auch nur, wenn sich die Temperatur ändern soll, sprich nicht jedesmal wenn es aufgerufen wird. Ich logge jetzt mal die beiden Geräte und schau mir den Verlauf mit den CUxD-Highcharts an. Aktuell schwankt der Wert zwischen 3 und 6%.

Gesendet von meinem Nexus 7 mit Tapatalk
Gruß
Lars

84 Kanäle in 39 Geräten und 29 CUxD-Kanäle in 14 CUxD-Geräten:
2x HM-Sec-SC, 8x HM-CC-VD, 8x HM-CC-TC, 3x HM-Sec-WDS, 5x HM-Sec-RHS, 1x CUX28, 1x CUX40, 1x HM-WDS10-TH-O, 8x CUX02, 2x CUX06, 1x HM-CCU-1, 2x HM-RC-Key3-B, 3x HM-Sec-SD, 2x CUX03, 1x HM-WDS100-C6-O, 1x HM-Sec-SD-Team, 1x HM-OU-LED16, 2x HM-Sec-MDIR, 1x HM-WDC7000

Dr_Sommerkoffer
Beiträge: 4
Registriert: 01.01.2010, 21:35
Wohnort: Germany, NRW

Heizungsthermostatscript auf RaspberryMatic

Beitrag von Dr_Sommerkoffer » 12.11.2017, 21:05

Hallo,

ich habe das Script seit Jahren in der Version 1.7.2 auf meiner CCU1 genutzt. Jetzt habe ich auf RaspberryMatic migriert und alles funktioniert einwandfrei, nur das Heizungsthermostatscript macht nicht mehr was es soll. Auch bei der Version 2.0 tritt der Fehler auf:

Nach Ablauf von "deltaStdMin" wird der Thermostat auf 0°C gestellt. Ich habe beim Testen ein paar Variablen ausgeben lassen und dabei fiel mir auf, dass die Variable "heizwert" gar nicht gesetzt wird. "soll_neu" wird folglich auf 0 gesetzt.

Raum:
Wohnzimmer
heizwert:

soll_neu:
0.000000
WTag:
7
Uhrzeit:
20:27

Auch die Debug- Ausgabe bringt mich nicht weiter:

Nov 12 20:27:46 homematic user.debug script: Raumthermostat Wohnzimmer neu gesetzt!
Nov 12 20:27:46 homematic user.debug script: alte_Solltemperatur: 22.000000 neue_Solltemperatur: 0.000000
Nov 12 20:27:47 homematic user.debug script: Letzte_Aenderung: 2017-11-12 20:24:12 Zeitdifferenz:_214sek.
Nov 12 20:27:47 homematic user.debug script: Offene_Luken: 0

Kennt jemand jemand solche Probleme mit RaspberryMatic?

Cash
Beiträge: 1184
Registriert: 09.01.2016, 17:42
Wohnort: Sauerland
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Heizungsthermostatscript V2.0

Beitrag von Cash » 12.11.2017, 21:28

wie ist denn der Inhalt von

zeitleiste_gestern
zeitleiste_heute

diese bestimmen ja die variable heizwert

Dr_Sommerkoffer
Beiträge: 4
Registriert: 01.01.2010, 21:35
Wohnort: Germany, NRW

Re: Heizungsthermostatscript V2.0

Beitrag von Dr_Sommerkoffer » 13.11.2017, 00:25

Den Inhalt von "zeitleiste_gestern" und "zeitleiste_heute" habe ich mir noch nicht angeschaut. Ich habe jetzt gerade wieder die CCU1 am laufen, um nicht zu erfrieren ;-) aber ich schau die Tage noch mal nach.

Was aber merkwürdig ist, wenn nach dem setzen von "heizwert" den Wert manuell setze und sofort wieder anzeigen lasse, wird der Part gar nicht ausgegeben.

...
heizwert = zeitleiste_heute.Substr(sTime, 1);

heizwert = 4;
WriteLine("heizwert:");
WriteLine(heizwert);


! Temperatur bestimmen, die gesetzt werden soll
...

Also wird der Abschnitt gar nicht abgearbeitet. Das wäre ja z.B. bei Abwesenheit der Fall, aber dann hätte ich doch einen definierten "soll_neu". Also habe ich auch die Systemvariablen mehrfach kontrolliert... und eigentlich können die ja nicht verkehrt sein. Auf der CCU1 läuft es ja.

Wenn ich nur die Auswertung der Zeitleiste aus dem Script isoliere und und nur diese ausführe, bekomme ich korrekte Werte geliefert.

steffen2001
Beiträge: 3
Registriert: 13.12.2017, 08:48

Re: Heizungsthermostatscript V2.0

Beitrag von steffen2001 » 13.12.2017, 09:10

Hallo ich bin absoluter Neuling im Bereich Homematic. Ich hoffe ihr könnt mir meine fragen beantworten. Ich möchte meine 5 FHT80B über dieses Script steuern. Die FHT80B über CCU2 steuern geht schon nur möchte ich es optimieren und automatisieren. Ich habe schon sehr viel in den Zwei Beiträgen gelesen und habe auch schon gefunden wie ich meine FHT80B in das script eingebaut bekomme.
! Wenn Raumthermostat gefunden wurde...
if (device.HssType() == "HM-CC-TC") {
if (soll_ist < 0) { ! ...und Temperaturwert noch nicht abgefragt worden ist...


! ... erst Bezeichner des Datenpunktes ermitteln, ...
var interface = dom.GetObject(device.Interface());
var interfaceName = interface.Name();
regler = dom.GetObject(interfaceName # "." # device.Address() # ":2.SETPOINT");

! ...dann aktuelle Solltemperatur auslesen.
soll_ist = regler.Value();

Das wäre ja so richtig oder? oder muss ich die Zeilen noch anpassen das es über CuXd auslesen muss?
Jetzt habe ich noch ein Verständnis Problem. Im Script steht ja die Zeitleiste mit der Uhrzeit und den Werten. Sind sie Werte halbstündlich dort einzutragen oder warum besteht eine Stunde aus zwei Zahlen?
Danke für eure Hilfe.

Bitte entschuldigt diese wahrscheinlich sehr einfachen Fragen.

Gruss
Steffen

Christmas
Beiträge: 44
Registriert: 12.10.2012, 17:35

Re: Heizungsthermostatscript V2.0

Beitrag von Christmas » 20.01.2018, 17:29

Hallo Zusammen...

Jahre lang war ich doch ziemlich glücklich mit dem Orginalscript.
Aufgrund diverser Umbaumaßnahmen war ich nun gezwungen mir einen neuen Heizungsregler inkl Thermostat zu besorgen.

Allerdings funktioniert nun mein Script nicht mehr. Habe versucht den Thread hier nachzuvollziehen, aber dennoch ist es mir nicht gelungen, es ans laufen zu bringen.

Der Regler ist ein HM-CC-RT-DN, ein seperates Thermostat gibt es nicht mehr.
Folgende Meldung erhalte ich wenn ich das Logging aktiviere:

homematic-ccu2 local0.err ReGaHss: Error: IseESP::ScriptRuntimeError: string raum = "test" ; ! ! Version 2.0 ! Script von Erik Groennerud - 8.2009- MM.2013 ! Ergaenzung von Zauberlehrling ! Optimiert und ergaenzt von Petrus (Peter) ! Performance Ideen von Go

Bin ziemlich ratlos. Wo ist der Fehler in meinem Script?
Habe sowohl integer kconfig = 0 und = 1 probiert.

Nachfolgend das Script welches ich nutzen wollte in dem ich versucht habe alle Änderungen zusammenzufassen.

Code: Alles auswählen

string raum = "test" ; ! 

! Version 2.0
! Script von Erik Groennerud - 8.2009- MM.2013
! Ergaenzung von Zauberlehrling
! Optimiert und ergaenzt von Petrus (Peter)
! Performance Ideen von Goersch 

! 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 = 0;
string sRegler = "OEQ085XXXX";                             ! Definition des Thermostates
string sTuerenUndFenster = "BidCos-RF.GEQ01XXX92:1.LEVEL"; ! 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 = 19.0;
real grad_2 = 20.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  = 22;        ! Temperatur fuer Gaeste -1 = off
real grad_aa      = 18;        ! 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 = "000000000000134442222222222222222222333333322110";
string zeitleiste_die = "000000000000134442222222222222222222333333322110";
string zeitleiste_mit = "000000000000134442222222222222222222333333322110";
string zeitleiste_don = "000000000000134442222222222222222222333333322110";
string zeitleiste_fre = "000000000000134442222222222222222222333333322110";
string zeitleiste_sam = "000000000000001122444444444444444444433333322110";
string zeitleiste_son = "000000000000001122444444444444444444433333222110";
};
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." # sRegler # ":4.SET_TEMPERATURE");
		                    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-TC") {
                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);
}

Antworten

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