Lösung / Idee für Abbildung von Schicht-Heizkalender gesucht

„N’abend“ Zusammen,

die Berufsbegleitend-Studierender-Semesterferien haben mich wieder!

Und damit auch Zeit zum Basteln und optimieren:

Wie früher des öfteren beschrieben hat meine Freundin auf Intensivstation die wildesten Dienste. (Also einmal ALLES und Kreuz und quer ohne Muster).
Dazu habt Ihr mir schon geholfen einen Google-Kalender auszulesen um das Schichtkürzel zu finden und dem jew. Tag zuzuordnen.

Daraufhin habe ich Heizprogramme geschrieben, z.b. in der Woche je „Früh“; „Spät“, „Nacht“, „Frei“ etc. dazu nochmal das ganze für Samstag und nochmal für Sonntag.

Da ich jetzt nicht allzu elegant programmieren kann bzw. mir auch z.t. Wissen fehlt arbeiten diese relativ „popelig“. Für ejden Raum (die werden je nach Zeit unterschiedlich geheizt, z.t. auch überlappend) geht das jeweils gewählte Skript alle Schaltzeiten pro Raum durch und vergleicht diese mit der ist-Zeit. Wenn das passt werden die entsprechenden Temperaturen an der Homematic bzw. der entsprechende Modus am KM200 gesetzt.

Da der ganze Kram sozusagen Fließtext ist, ist eine Änderung gelinde gesagt ein Krampf. Und Übersichtlich ist ein WOrt welches man kaum damit in Zusammenhang bringen möchte.

Daher meine Frage, wie würdet Ihr das ganze optimal gestalten - Ich hoffe mal das Eure Erfahrung das was besseres zu Tage bringt als ich gebastelt habe.
Ich habe mir diverse Sachen im Forum angesehen, finde aber nichts was so richtig zu der Schicht / Google-Kalender / viele verschiedene Varianten Sache passt.

Damit Ihr ein Bild von dem Elend habt, unten anbei noch ein Script für Frühdienst in der Woche.

Besten Gruß,
Matthias

<?
#################### Früh Wochentag ######################################
$time=date('H:i');

$S_WZ=GetValue(28398 /*[Komponenten\Heizköperthermostate\Raumregler Wohnzimmer\Wunschtemperatur Wohnzimmer]*/  );
$S_SZ=GetValue(23219 /*[Komponenten\Heizköperthermostate\Thermostat Schlafzimmer\Wunschtemperatur Schlafzimmer]*/ );
$S_BO=Getvalue(39922 /*[Komponenten\Heizköperthermostate\Thermostat Bad oben\Wunschtemperatur Bad oben]*/);
$S_KU=Getvalue(18920 /*[Komponenten\Heizköperthermostate\Thermostat Küche\Wunschtemperatur Küche]*/);

##########################
#Wohnzimmer-Temp
$T_WZ_Low=GetValue(16771 /*[Funktionen Automatik\Temperaturvorwahl\Wohnzimmer Low]*/);
$T_WZ_Mid=GetValue(14810 /*[Funktionen Automatik\Temperaturvorwahl\Wohnzimmer Mid]*/);
$T_WZ_High=GetValue(14124 /*[Funktionen Automatik\Temperaturvorwahl\Wohnzimmer High]*/);
$Min_WZ=GetValue(15069 /*[Absenk. / Heizen\Wohnzimmer]*/ );

If ($Min_WZ >0) {
		HM_WriteValuefloat(51674 /*[Komponenten\Heizköperthermostate\Raumregler Wohnzimmer]*/ ,"SET_TEMPERATURE", $T_WZ_High);
		If ($Min_WZ >=5){$Min_WZ=$Min_WZ-5;
		SetValueFloat(15069 /*[Absenk. / Heizen\Wohnzimmer]*/ ,$Min_WZ);}
		else {$Min_WZ=0;
		SetValueFloat(15069 /*[Absenk. / Heizen\Wohnzimmer]*/ ,$Min_WZ);}}
	else{
If ($time >= '00:00' && $time <='14:15' && $S_WZ!=$T_WZ_Low) {
HM_WriteValuefloat(51674 /*[Komponenten\Heizköperthermostate\Raumregler Wohnzimmer]*/ ,"SET_TEMPERATURE", $T_WZ_Low);}
If ($time >= '14:16' && $time <='15:15' && $S_WZ!=$T_WZ_Mid) {
HM_WriteValuefloat(51674 /*[Komponenten\Heizköperthermostate\Raumregler Wohnzimmer]*/ ,"SET_TEMPERATURE", $T_WZ_Mid);}
If ($time >= '15:16' && $time <='22:00' && $S_WZ!=$T_WZ_High) {
HM_WriteValuefloat(51674 /*[Komponenten\Heizköperthermostate\Raumregler Wohnzimmer]*/ ,"SET_TEMPERATURE", $T_WZ_High);}
If ($time >= '22:01' && $time <='23:59' && $S_WZ!=$T_WZ_Low) {
HM_WriteValuefloat(51674 /*[Komponenten\Heizköperthermostate\Raumregler Wohnzimmer]*/ ,"SET_TEMPERATURE", $T_WZ_Low);}}

##########################
#Schlafzimmer-Temp
$T_SZ_Low=GetValue(43281 /*[Funktionen Automatik\Temperaturvorwahl\Schlafzimmer Low]*/);
$T_SZ_Mid=GetValue(39789 /*[Funktionen Automatik\Temperaturvorwahl\Schlafzimmer Mid]*/);
$T_SZ_High=GetValue(12957 /*[Funktionen Automatik\Temperaturvorwahl\Schlafzimmer High]*/);
$Min_SZ=GetValue(56815 /*[Absenk. / Heizen\Schlafzimmer]*/ );

If ($Min_SZ >0) {
		HM_WriteValuefloat(20904 /*[Komponenten\Heizköperthermostate\Thermostat Schlafzimmer]*/,"SET_TEMPERATURE", $T_SZ_High);
		If ($Min_SZ >=5){$Min_SZ=$Min_SZ-5;
		SetValue(56815 /*[Absenk. / Heizen\Schlafzimmer]*/ ,$Min_SZ);}
		else {$Min_SZ=0;
		SetValue(56815 /*[Absenk. / Heizen\Schlafzimmer]*/ ,$Min_SZ);}}
	else{
If ($time >= '00:00' && $time <='06:45' && $S_SZ!=$T_SZ_Mid) {
HM_WriteValuefloat(20904 /*[Komponenten\Heizköperthermostate\Thermostat Schlafzimmer]*/,"SET_TEMPERATURE", $T_SZ_Mid);}
If ($time >= '06:46' && $time <='07:20' && $S_SZ!=$T_SZ_High) {
HM_WriteValuefloat(20904 /*[Komponenten\Heizköperthermostate\Thermostat Schlafzimmer]*/,"SET_TEMPERATURE", $T_SZ_High);}
If ($time >= '07:21' && $time <='14:30' && $S_SZ!=$T_SZ_Low) {
HM_WriteValuefloat(20904 /*[Komponenten\Heizköperthermostate\Thermostat Schlafzimmer]*/,"SET_TEMPERATURE", $T_SZ_Low);}
If ($time >= '14:31' && $time <='15:30' && $S_SZ!=$T_SZ_High) {
HM_WriteValuefloat(20904 /*[Komponenten\Heizköperthermostate\Thermostat Schlafzimmer]*/,"SET_TEMPERATURE", $T_SZ_High);}
If ($time >= '15:31' && $time <='21:30' && $S_SZ!=$T_SZ_Low) {
HM_WriteValuefloat(20904 /*[Komponenten\Heizköperthermostate\Thermostat Schlafzimmer]*/,"SET_TEMPERATURE", $T_SZ_Low);}
If ($time >= '21:31' && $time <='22:30' && $S_SZ!=$T_SZ_High) {
HM_WriteValuefloat(20904 /*[Komponenten\Heizköperthermostate\Thermostat Schlafzimmer]*/,"SET_TEMPERATURE", $T_SZ_High);}
If ($time >= '22:31' && $time <='23:59' && $S_SZ!=$T_SZ_Mid) {
HM_WriteValuefloat(20904 /*[Komponenten\Heizköperthermostate\Thermostat Schlafzimmer]*/,"SET_TEMPERATURE", $T_SZ_Mid);}}
##########################
#Bad-Oben-Temp
$T_BO_Low=GetValue(33378 /*[Funktionen Automatik\Temperaturvorwahl\Bad oben Low]*/ );
$T_BO_Mid=GetValue(28136 /*[Funktionen Automatik\Temperaturvorwahl\Bad oben Mid]*/ );
$T_BO_High=GetValue(20372 /*[Funktionen Automatik\Temperaturvorwahl\Bad oben High]*/  );
$Min_BO=GetValue(26206 /*[Absenk. / Heizen\Bad oben]*/ );

If ($Min_BO >0) {
		HM_WriteValuefloat(37551 /*[Komponenten\Heizköperthermostate\Thermostat Bad oben]*/,"SET_TEMPERATURE", $T_BO_High);
		If ($Min_BO >=5){$Min_BO=$Min_BO-5;
		SetValuefloat(26206 /*[Absenk. / Heizen\Bad oben]*/ ,$Min_BO);}
		else {$Min_BO=0;
		SetValuefloat(26206 /*[Absenk. / Heizen\Bad oben]*/ ,$Min_BO);}}
	else{
If ($time >= '00:00' && $time <='02:00' && $S_BO!=$T_BO_Mid) {
HM_WriteValuefloat(37551 /*[Komponenten\Heizköperthermostate\Thermostat Bad oben]*/,"SET_TEMPERATURE", $T_BO_Mid);}
If ($time >= '02:01' && $time <='07:30' && $S_BO!=$T_BO_Mid) {
HM_WriteValuefloat(37551 /*[Komponenten\Heizköperthermostate\Thermostat Bad oben]*/,"SET_TEMPERATURE", $T_BO_Mid);}
If ($time >= '07:31' && $time <='22:15' && $S_BO!=$T_BO_Low) {
HM_WriteValuefloat(37551 /*[Komponenten\Heizköperthermostate\Thermostat Bad oben]*/,"SET_TEMPERATURE", $T_BO_Low);}
If ($time >= '22:16' && $time <='23:59' && $S_BO!=$T_BO_Mid) {
HM_WriteValuefloat(37551 /*[Komponenten\Heizköperthermostate\Thermostat Bad oben]*/,"SET_TEMPERATURE", $T_BO_Mid);}}
##########################
#Kueche-Temp
$T_KU_Low=GetValue(37162 /*[Funktionen Automatik\Temperaturvorwahl\Küche Low]*/ );
$T_KU_Mid=GetValue(59287 /*[Funktionen Automatik\Temperaturvorwahl\Küche Mid]*/ );
$T_KU_High=GetValue(45676 /*[Funktionen Automatik\Temperaturvorwahl\Küche High]*/ );
$Min_KU=GetValue(48079 /*[Absenk. / Heizen\Küche]*/  );

If ($Min_KU >0) {
		HM_WriteValuefloat(41052 /*[Komponenten\Heizköperthermostate\Thermostat Küche]*/ ,"SET_TEMPERATURE", $T_KU_High);
		If ($Min_KU >=5){$Min_KU=$Min_KU-5;
		SetValuefloat(48079 /*[Absenk. / Heizen\Küche]*/ ,$Min_KU);}
		else {$Min_KU=0;
		SetValuefloat(48079 /*[Absenk. / Heizen\Küche]*/ ,$Min_KU);}}
	else{
If (($time >= '00:00') AND ($time <='13:45') AND ($S_KU!=$T_KU_Low)) {
HM_WriteValuefloat(41052 /*[Komponenten\Heizköperthermostate\Thermostat Küche]*/ ,"SET_TEMPERATURE", $T_KU_Low);}
If (($time >= '13:46') AND ($time <='14:45') AND ($S_KU!=$T_KU_Mid)) {
HM_WriteValuefloat(41052 /*[Komponenten\Heizköperthermostate\Thermostat Küche]*/ ,"SET_TEMPERATURE", $T_KU_Mid);}
If (($time >= '14:46') AND ($time <='18:30') AND ($S_KU!=$T_KU_High)) {
HM_WriteValuefloat(41052 /*[Komponenten\Heizköperthermostate\Thermostat Küche]*/ ,"SET_TEMPERATURE", $T_KU_High);}
If (($time >= '18:31') AND ($time <='20:30') AND ($S_KU!=$T_KU_Mid)) {
HM_WriteValuefloat(41052 /*[Komponenten\Heizköperthermostate\Thermostat Küche]*/ ,"SET_TEMPERATURE", $T_KU_Mid);}
If (($time >= '20:31') AND ($time <='23:59') AND ($S_KU!=$T_KU_Low)) {
HM_WriteValuefloat(41052 /*[Komponenten\Heizköperthermostate\Thermostat Küche]*/ ,"SET_TEMPERATURE", $T_KU_Low);}}

#####################   Warmwasser
If (($time >= '00:00') AND ($time <='04:20')) {
SetValueBoolean(57740 /*[Funktionen Automatik\Heizmodusregelung / Temperaturkontrolle\Heizmodus]*/ ,false);
SetValueBoolean(39461 /*[Funktionen Automatik\Heizmodusregelung / Temperaturkontrolle\Warmwasserbereitstellung]*/ ,false);}
If (($time >= '04:20') AND ($time <='04:45')) {
SetValueBoolean(57740 /*[Funktionen Automatik\Heizmodusregelung / Temperaturkontrolle\Heizmodus]*/ ,false);
SetValueBoolean(39461 /*[Funktionen Automatik\Heizmodusregelung / Temperaturkontrolle\Warmwasserbereitstellung]*/ ,true);}
If (($time >= '04:46') AND ($time <='06:40')) {
SetValueBoolean(57740 /*[Funktionen Automatik\Heizmodusregelung / Temperaturkontrolle\Heizmodus]*/ ,false);
SetValueBoolean(39461 /*[Funktionen Automatik\Heizmodusregelung / Temperaturkontrolle\Warmwasserbereitstellung]*/ ,false);}
If (($time >= '06:41') AND ($time <='07:15')) {
SetValueBoolean(57740 /*[Funktionen Automatik\Heizmodusregelung / Temperaturkontrolle\Heizmodus]*/ ,true);
SetValueBoolean(39461 /*[Funktionen Automatik\Heizmodusregelung / Temperaturkontrolle\Warmwasserbereitstellung]*/ ,true);}
If (($time >= '07:16') AND ($time <='15:00')) {
SetValueBoolean(57740 /*[Funktionen Automatik\Heizmodusregelung / Temperaturkontrolle\Heizmodus]*/ ,false);
SetValueBoolean(39461 /*[Funktionen Automatik\Heizmodusregelung / Temperaturkontrolle\Warmwasserbereitstellung]*/ ,false);}
If (($time >= '15:01') AND ($time <='16:30')) {
SetValueBoolean(57740 /*[Funktionen Automatik\Heizmodusregelung / Temperaturkontrolle\Heizmodus]*/ ,true);
SetValueBoolean(39461 /*[Funktionen Automatik\Heizmodusregelung / Temperaturkontrolle\Warmwasserbereitstellung]*/ ,false);}
If (($time >= '16:31') AND ($time <='20:00')) {
SetValueBoolean(57740 /*[Funktionen Automatik\Heizmodusregelung / Temperaturkontrolle\Heizmodus]*/ ,true);
SetValueBoolean(39461 /*[Funktionen Automatik\Heizmodusregelung / Temperaturkontrolle\Warmwasserbereitstellung]*/ ,true);}
If (($time >= '20:01') AND ($time <='22:00')) {
SetValueBoolean(57740 /*[Funktionen Automatik\Heizmodusregelung / Temperaturkontrolle\Heizmodus]*/ ,true);
SetValueBoolean(39461 /*[Funktionen Automatik\Heizmodusregelung / Temperaturkontrolle\Warmwasserbereitstellung]*/ ,false);}
If (($time >= '22:01') AND ($time <='23:59')) {
SetValueBoolean(57740 /*[Funktionen Automatik\Heizmodusregelung / Temperaturkontrolle\Heizmodus]*/ ,false);
SetValueBoolean(39461 /*[Funktionen Automatik\Heizmodusregelung / Temperaturkontrolle\Warmwasserbereitstellung]*/ ,false);}
?>

Hat niemand eine Idee?
Kann man so etwas mit einer FOR-Schleife machen?
Ich kenne FOR-Schleifen, allerdings müssten ja die Heiztemperaturen (1=Low, 2=Mid, 3=High) und die Zeit bis oder ab (was wäre besser?) wann diese gelten definiert sein.
ich denke hier ginge ein String - aber wie kann ich das mittels Webfront in die Variable Schreiben?

Wenn mir jemand ein wenig Starthilfe gibt - was für euch ja sicher keine große Sache ist würde ich mich gerne selbst weiter bemühen!
Ich möchte ja nicht, dass mir jemand den Kram kpl. vorkaut - aber ich komme einfach nicht weiter.
Gruß,
Matthias

Wenn das viele Räume und unterschiedliche Zeiten sind könnte es sich eventuell lohnen das ganze mit einer Klasse und objektorientierter Programmierung zu lösen.
Objektorientierte Programmierung in PHP - PHP-Kurs.com - PHP programmieren lernen

Dann must Du nur noch die Eigenschaften zuweisen und die Methoden sind ja überall die gleichen, dann wird das insgesamt übersichtlicher.

Hallo Fonzo,

danke für den Link.
Habe gleich mal mein erstes „objektorientierte“ Skript geschrieben…
Es geht sicherlich noch viel eleganter…
Habe nur das WZ und SZ draufgenommen. Der Rest ist fleißarbeit…
Hoffe es funktioniert, konnte es nicht testen.

Viele Grüße
Wickie


<?


$time=date('H:i');

# Festlegung. welche Attribute (Eigenschaften, Variablen) und Methoden (Fähigkeiten, Funktionen) diese Klasse besitzt.
# Im davon erzeugten Objekt werden die Eigenschaften mit Werten belegt.
#


// uebergeordnete Klasse
class uebergeordneteKlasse {}

// die Klasse "Klasse" definieren
class Klasse extends uebergeordneteKlasse // Klasse gehört zur übergeordneten Klasse
{

    // eine Eigenschaft/Attribut festlegen
    var $ID_S;    // Variablen-ID der Solltemperatur
    var $ID_T_Low;    // Variablen-ID der T_Low
    var $ID_T_Mid;
    var $ID_T_High;
    var $ID_Min;     //[Absenk. / Heizen
    var $ID_Regler;
    var $Low;
    var $Mid;
    var $High;
    var $time_Low;
    var $time_Mid;
    var $time_High;


    // eine Methode festlegen (nennt sich Funktion,
    // ist aber in einer Klasse und
    // wird somit als Methode bezeichnet)
    function Methode()
    {
      $S = Getvalue($this->ID_S);
      $T_Low = Getvalue($this->ID_T_Low);
      $T_Mid = Getvalue($this->ID_T_Mid);
      $T_High = Getvalue($this->ID_T_High);
      $Min = Getvalue($this->ID_Min);

		If ($Min >0)
			{
	    	HM_WriteValuefloat($this->ID_Regler ,"SET_TEMPERATURE", $T_High);
        	If ($Min >=5){$Min=$Min-5;
        		SetValueFloat($this->ID_Min ,$Min);}
        	else {$Min=0;
        		SetValueFloat($this->ID_Min ,$Min);}
			}
		else
			{
			If ($this->time_Low == 1 && $S!=$T_Low)
				{
				HM_WriteValuefloat($this->ID_Regler ,"SET_TEMPERATURE", $T_Low);
				}
			elseif ($this->time_Mid == 1 && $S!=$T_Mid)
				{
				HM_WriteValuefloat($this->ID_Regler ,"SET_TEMPERATURE", $T_Mid);
				}
			elseif ($this->time_High == 1 && $S!=$T_High)
				{
				HM_WriteValuefloat($this->ID_Regler ,"SET_TEMPERATURE", $T_High);
				}
			}

    }
}


// bisher passiert noch gar nichts,
// jetzt wird aus der Klasse ein Objekt erzeugt
$Klasse_WZ = new Klasse;
// eine Eigenschaft (Attribut) wird definiert
$Klasse_WZ->ID_S = 28398;
$Klasse_WZ->ID_T_Low = 16771;
$Klasse_WZ->ID_T_Mid = 14810;
$Klasse_WZ->ID_T_High = 14124;
$Klasse_WZ->ID_Min = 15069;
$Klasse_WZ->ID_Regler = 51674;
$Klasse_WZ ->time_Low = 0;
$Klasse_WZ ->time_Mid = 0;
$Klasse_WZ ->time_High = 0;
If ($time >= '00:00' && $time <='14:15' || $time >= '22:01' && $time <='23:59')	 {
	 	$Klasse_WZ ->time_Low = 1;
		 }
elseif($time >= '14:16' && $time <='15:15') {
      $Klasse_WZ ->time_Mid = 1;
		 }
else{
      $Klasse_WZ ->time_High = 1;
	}
// Ende Wohnzimmer

// Beginn Schlafzimmer
// jetzt wird aus der Klasse ein Objekt erzeugt
$Klasse_SZ = new Klasse;
// eine Eigenschaft (Attribut) wird definiert
$Klasse_SZ->ID_S = 23219;

$Klasse_SZ->ID_T_Low = 43281;
$Klasse_SZ->ID_T_Mid = 39789;
$Klasse_SZ->ID_T_High = 12957;
$Klasse_SZ->ID_Min = 56815;
$Klasse_SZ->ID_Regler = 20904;
$Klasse_SZ ->time_Low = 0;
$Klasse_SZ ->time_Mid = 0;
$Klasse_SZ ->time_High = 0;
If ($time >= '07:21' && $time <='14:30' || $time >=  '15:31' && $time <='21:30' )	 {
	 	$Klasse_SZ ->time_Low = 1;
		 }
elseif($time >= '00:00' && $time <='06:45'|| $time >=  '22:31' && $time <='23:59') {
      $Klasse_SZ ->time_Mid = 1;
		 }
else{
      $Klasse_SZ ->time_High = 1;
	}


// und nun wird das erste mal die Methode (Funktion) ausgeführt
$Klasse_WZ->Methode();
$Klasse_SZ->Methode();

?>


Puh - also das sieht ansich gut aus, aber ich Steige nicht so ganz durch:

In meinen Augen bin ich mir nicht sicher inwieweit ich das umsetzen Soll…
Ich habe die übergeordnete Klasse, da wären die Objekte die Objekte darunter dann ja die Räume oder?

Darunter wiederum (also die "untergeordnete Klasse) kämen ja dann die „Schaltzeiten“ oder?
Jetzt bin ich mir nicht so sicher ob die Umsetzung unten (die ja auch nicht für mich direkt ist) nicht besser so wäre:

<?


$time=date('H:i');

// uebergeordnete Klasse
class uebergeordneteKlasse {

var $Wohnzimmer;
var $Küche;
var $Schlafzimmer;
var $Bad_oben;}

// die Klasse "Klasse" definieren
class Klasse extends uebergeordneteKlasse // Klasse gehört zur übergeordneten Klasse
{

    // eine Eigenschaft/Attribut festlegen
    var $ID_S;    // Variablen-ID der Solltemperatur
    var $ID_T_Low;    // Variablen-ID der T_Low
    var $ID_T_Mid;
    var $ID_T_High;
    var $ID_Min;     //[Absenk. / Heizen
    var $ID_Regler;
    var $Low;
    var $Mid;
    var $High;
    var $time_Low;
    var $time_Mid;
    var $time_High;


    function Methode()
    {
      $S = Getvalue($this->ID_S);
      $T_Low = Getvalue($this->ID_T_Low);
      $T_Mid = Getvalue($this->ID_T_Mid);
      $T_High = Getvalue($this->ID_T_High);
      $Min = Getvalue($this->ID_Min);

Wäre das dann so Sinnvoll (ich weiß, muss ich ansich selbst entscheiden, aber ich habe keine Ahnung und damit auch keine Meinung…)?

Und Was ich nicht ganz verstehe:

      $S = Getvalue($this->ID_S);

Muss ich das dann nicht so schreiben wie üblich, also GetValueFloat(etc.)?
Ich weiß halt nicht genau wie ich das schreiben / strukturieren soll und ob die Syntax so hinkommt.

Ich hoffe mal auf etwas Input - habe mir auch Tutorials angesehen, leider sind davon alle nur auf Websitenprogrammierung zugeschnitten…
Danke & Gurß,

Matthias

Hallo Matthias,

setze einfach mal dein Skript als inaktiv und verwende meine vorgeschlagene Variante. Für das Wohn- und Schlafzimmer müsste es unverändert funktionieren.
Ich kann es leider nicht testen, da ich deine Variablen und Schaltaktoren nicht habe.

Zu deinen Fragen:
Die übergeordnete Klasse kannst du komplett entfernen. Habe sie nur von einem Tutorial übernommen. In deinem Fall hat sie keine Funktion. Im angehängten Skript habe ich sie entfernt.

 var $ID_Variable;  

braucht man glaube ich auch nicht.

$this->ID_S

bedeutet, dass der Variablen $this der Wert von

$Klasse_SZ->ID_S = 23219;

zugeordnet wird (hier …SZ).

Anbei dein „überarbeitetes“ Skript:


<?


$time=date('H:i');

# Festlegung. welche Attribute (Eigenschaften, Variablen) und Methoden (Fähigkeiten, Funktionen) diese Klasse besitzt.
# Im davon erzeugten Objekt werden die Eigenschaften mit Werten belegt.
#

// die Klasse "Klasse" definieren
class Klasse 
{
    // eine Methode festlegen (nennt sich Funktion,
    // ist aber in einer Klasse und
    // wird somit als Methode bezeichnet)
    function Methode()
    {
      $S = Getvalue($this->ID_S);
      $T_Low = Getvalue($this->ID_T_Low);
      $T_Mid = Getvalue($this->ID_T_Mid);
      $T_High = Getvalue($this->ID_T_High);
      $Min = Getvalue($this->ID_Min);

		If ($Min >0)
			{
	    	HM_WriteValuefloat($this->ID_Regler ,"SET_TEMPERATURE", $T_High);
        	If ($Min >=5){$Min=$Min-5;
        		SetValueFloat($this->ID_Min ,$Min);}
        	else {$Min=0;
        		SetValueFloat($this->ID_Min ,$Min);}
			}
		else
			{
			If ($this->time_Low == 1 && $S!=$T_Low)
				{
				HM_WriteValuefloat($this->ID_Regler ,"SET_TEMPERATURE", $T_Low);
				}
			elseif ($this->time_Mid == 1 && $S!=$T_Mid)
				{
				HM_WriteValuefloat($this->ID_Regler ,"SET_TEMPERATURE", $T_Mid);
				}
			elseif ($this->time_High == 1 && $S!=$T_High)
				{
				HM_WriteValuefloat($this->ID_Regler ,"SET_TEMPERATURE", $T_High);
				}
			}

    }
}


// bisher passiert noch gar nichts,
// jetzt wird aus der Klasse ein Objekt erzeugt
$Klasse_WZ = new Klasse;
// eine Eigenschaft (Attribut) wird definiert
$Klasse_WZ->ID_S = 28398 /*[Objekt #28398 existiert nicht]*/;
$Klasse_WZ->ID_T_Low = 16771 /*[Objekt #16771 existiert nicht]*/;
$Klasse_WZ->ID_T_Mid = 14810 /*[Objekt #14810 existiert nicht]*/;
$Klasse_WZ->ID_T_High = 14124 /*[Objekt #14124 existiert nicht]*/;
$Klasse_WZ->ID_Min = 15069 /*[Objekt #15069 existiert nicht]*/;
$Klasse_WZ->ID_Regler = 51674 /*[Objekt #51674 existiert nicht]*/;
$Klasse_WZ ->time_Low = 0;
$Klasse_WZ ->time_Mid = 0;
$Klasse_WZ ->time_High = 0;
If ($time >= '00:00' && $time <='14:15' || $time >= '22:01' && $time <='23:59')	 {
	 	$Klasse_WZ ->time_Low = 1;
		 }
elseif($time >= '14:16' && $time <='15:15') {
      $Klasse_WZ ->time_Mid = 1;
		 }
else{
      $Klasse_WZ ->time_High = 1;
	}
// Ende Wohnzimmer

// Beginn Schlafzimmer
// jetzt wird aus der Klasse ein Objekt erzeugt
$Klasse_SZ = new Klasse;
// eine Eigenschaft (Attribut) wird definiert
$Klasse_SZ->ID_S = 23219 /*[Objekt #23219 existiert nicht]*/;

$Klasse_SZ->ID_T_Low = 43281 /*[Objekt #43281 existiert nicht]*/;
$Klasse_SZ->ID_T_Mid = 39789 /*[Objekt #39789 existiert nicht]*/;
$Klasse_SZ->ID_T_High = 12957 /*[Objekt #12957 existiert nicht]*/;
$Klasse_SZ->ID_Min = 56815 /*[Objekt #56815 existiert nicht]*/;
$Klasse_SZ->ID_Regler = 20904 /*[Objekt #20904 existiert nicht]*/;
$Klasse_SZ ->time_Low = 0;
$Klasse_SZ ->time_Mid = 0;
$Klasse_SZ ->time_High = 0;
If ($time >= '07:21' && $time <='14:30' || $time >=  '15:31' && $time <='21:30' )	 {
	 	$Klasse_SZ ->time_Low = 1;
		 }
elseif($time >= '00:00' && $time <='06:45'|| $time >=  '22:31' && $time <='23:59') {
      $Klasse_SZ ->time_Mid = 1;
		 }
else{
      $Klasse_SZ ->time_High = 1;
	}


// und nun wird das erste mal die Methode (Funktion) ausgeführt
$Klasse_WZ->Methode();
$Klasse_SZ->Methode();

?>


Anbei ein Skript zur Veranschaulichung:


<?

// 1.Schritt: Klasse definieren
class Klasse
{
    // eine Methode festlegen (nennt sich Funktion,
    // ist aber in einer Klasse und
    // wird somit als Methode bezeichnet)
    
    // diese Methode wird bei allen Räumen durchlaufen
    function Methode()
    {
		$T_Ist = GetValue($this->ID_T_Ist);
      $T_Soll = Getvalue($this->ID_T_Soll);

		If ($T_Ist < $T_Soll)
			{
			   SetValueBoolean($this->ID_Heizung_Schalten ,true); // Heizung einschalten
			}
		else
		   {
		      SetValueBoolean($this->ID_Heizung_Schalten ,false); // Heizung ausschalten
			}
    }
}

// bisher passiert noch gar nichts,
// jetzt wird aus der Klasse ein Objekt erzeugt
$Klasse_Raum01 = new Klasse;
// eine Eigenschaft (Attribut) wird definiert
$Klasse_Raum01->ID_T_Ist = 15040 /*[Geräte\Sonstiges\Test\Objektorientiert\Test_Heizung\Raum_01\T_Ist_Raum01]*/;
$Klasse_Raum01->ID_T_Soll = 57796 /*[Geräte\Sonstiges\Test\Objektorientiert\Test_Heizung\Raum_01\T_Soll_Raum01]*/;
$Klasse_Raum01->ID_Heizung_Schalten = 33476 /*[Geräte\Sonstiges\Test\Objektorientiert\Test_Heizung\Raum_01\Heizung_Ein_Raum01]*/;

$Klasse_Raum02 = new Klasse;
// eine Eigenschaft (Attribut) wird definiert
$Klasse_Raum02->ID_T_Ist = 10039 /*[Geräte\Sonstiges\Test\Objektorientiert\Test_Heizung\Raum_02\T_Ist_Raum02]*/;
$Klasse_Raum02->ID_T_Soll = 13732 /*[Geräte\Sonstiges\Test\Objektorientiert\Test_Heizung\Raum_02\T_Soll_Raum02]*/;
$Klasse_Raum02->ID_Heizung_Schalten = 53587 /*[Geräte\Sonstiges\Test\Objektorientiert\Test_Heizung\Raum_02\Heizung_Ein_Raum02]*/;

// und nun wird das erste mal die Methode (Funktion) ausgeführt
$Klasse_Raum01->Methode();
$Klasse_Raum02->Methode();

?>


Bei Fragen helfe ich dir gerne weiter, so weit ich kann.

Viele Grüße
Wickie

Seeeehr cool, Danke!
Werde ich nach den Karnevalstagen (jaja - ist halt das Rheinland hier…) mal sofort ansehen!
Gruß,
Matthias

Hey Wickie,

nach viel zu langer Zeit nehme ich mich gerade der Sache nochmal an, Ich habe im Studium heute mit VBS rumgefrickelt (kein Kommentar :slight_smile: ) und da fiel mir ein, da war doch was…

Was ich hier noch nicht so ganz verstehe bzw. was im Großen und Ganzen recht ähnlich ist wie vorher (bitte korrigiere mich falls ich das falsch verstanden habe!!!), die Zeiten stehen ja nach wie vor im Code und sind so erst einmal nicht sinnvoll zu ändern.
Also genau genommen kann meine Freundin hier nichts machen ohne Hilfe (also ohne das ich es mache).

Irgendwie habe ich mich da am Anfang auch mies ausgedrückt, ich denke nämlich das sinnvollste wäre ein Array aus dem die Zeiten hervorgehen (also irgendwie durchsucht das Script das Array und findet den Tag und die Zeit raus und setzt die Räume entsprechend).

Z.b.:


#Array Früh_Woche
################
#Küche
00:00 L
14:30 M
15:00 H
18:00 M
20:00 L

#Wohnzimmer
00:00 L
14:30 M
15:00 H
21:00 M
22:30 L

Oder hat jemand eine bessere Idee?
Bestenfalls natürlich vom Webinterface änderbar…

Schönes Wochenende Miteinander!
Gruß,
Matthias

Güatzi Mitanoand - wie man in der Eifel sagt. Nicht. :slight_smile:

Es liegen also wieder Semesterferien vor und ich habe bisher alle möglichen Kleinigkeiten die nicht funktioniert haben behoben und allgemein meinen Code etwas optimiert, aber das Thema hier steht nach wie vor offen.

Was haltet ihr davon wenn man mittels Web interface die Zeiten irgendwie wählt oder eingibt und dazu Low, Mid, High, Boost?
(so wie im Beispiel oben.)
Ideen haben ich zuhauf, aber mir fehlt etwas das Handwerkszeug um das umzusetzen.

Es wäre ja in zwei Teile zu splitten, das array erstellen (pro Schicht im interface mit den jeweiligen Räumen und einer Zeit dazu)
Dann als zweites die Daten aus dem array raus lesen und sinnvoll interpretieren.
If then else usw kann ich natürlich, oder schleifen - evtl könnte man die Räume auch durch nummerieren und dann mit einer for Schleife und der jeweiligen zeit das array durchgehen. Aber dazu müsste ich erst mal eins aus dem web interface hinbekommen. Dann könnte meine Frau nämlich auch was dran ändern.

Gruß,
Matthias