Heizungssteuerung Dynamisch MYSQL PHP

Das 3. Skribt Teil 1 welches für die eigentliche steuerung zuständig ist:
läuft jede Minute

<?

Datenbank

$dbHost = „localhost“; // MySQL Hostname
$dbUser = „root“; // MySQL user
$dbPassword = „euerpasswort“; // MySQL password
$datenbank = „steuerung_hans“;// MySQL Datenbank

Datenbanktabellen Variablen

$dbwochen_steuerung = „wochen_steuerung“;
$dbkonfig = „konfig“;
$dbraeume = „raeume“;
$dbsonst_steuerung = „sonst_steuerung“;
$dbszenarien = „szenarien“;
$dbtemperaturen = „temperaturen“;
$dbstatistik = „statistik“;
$dbschaltlog = „schaltlog“;
$dbpumpe_laufzeit = „pumpe_laufzeit“;
$dbstatistik_raum = „statistik_raum“;

$Stunde = date(„H“,time());
$Minute = date(„i“,time());
$Secunde = date(„s“,time());
$Wochentag = date(„w“,time());
$datum = date(„Y.m.d“,time());
$jetztstamp = strtotime(„2008-1-1 $Stunde:$Minute:$Secunde“);

Variablen holen

$TempDifferenz = GetValue(29409 /[Variablen\TempDifferenz]/);
$TempDifferenz = str_replace(",", „.“, $TempDifferenz);
$pumpe = 0;

Variablen holen Ende

Variablen

$Wohnzimmersoll = GetValue(38956 /[Temperaturen\Wohnzimmersoll]/);
$Arbeitszimmersoll = GetValue(35220 /[Temperaturen\Arbeitszimmersoll]/);
$Badsoll = GetValue(45408 /[Temperaturen\Badsoll]/);
$GaesteWCsoll = GetValue(20325 /[Temperaturen\GaesteWC]/);
$Schlafzimmersoll = GetValue(12961 /[Temperaturen\Schlafzimmersoll]/);

$Wohnzimmerist = GetValue(41453 /[Sensoren\Wohnzimmer\Temperatur]/);
$Arbeitszimmerist = GetValue(50375 /[Sensoren\Arbeitszimmer\Temperatur]/);
$Badist = GetValue(27703 /[Sensoren\Bad\Temperatur]/);
$GaesteWCist = GetValue(40417 /[Sensoren\Gäste WC\Temperatur]/);
$Schlafzimmerist = GetValue(40214 /[Sensoren\Schlafzimmer\Temperatur]/);

$Wohnzimmerstatus = GetValue(38391 /[Status\Wohnzimmerstatus]/);
$Arbeitszimmerstatus = GetValue(10092 /[Status\Arbeitszimmer]/);
$Badstatus = GetValue(12192 /[Status\Bad]/);
$Schlafzimmerstatus = GetValue(38913 /[Status\Schlafzimmer]/);
$GeasteWC = GetValue(17188 /[Status\GaesteWC]/);
$Pumpestatus = GetValue(52223 /[Status\pumpe]/);

$automatikstatus = GetValue(11911 /[Variablen\automatik]/);
$Szenario = GetValue(24455 /[Variablen\Szenario]/);

Ausrechnen

Bild Setzen

SetValue(34363 /[Status\Bild]/ ,round($Wohnzimmerist, 0));

####### Wohnzimmer

Aus

if ($Wohnzimmerist-$TempDifferenz&gt;$Wohnzimmersoll){
	if ($Wohnzimmerstatus==1){
 	SetValue(38391 /*[Status\Wohnzimmerstatus]*/,0);
	TMEX_F29_SetPin(29129 /*[Aktoren\DS2408]*/, 0, true);
	IPS_Sleep(200);
			$sqlUpdate="insert into $dbschaltlog (raum, tempist, tempsoll, szenario,automatik, Uhrzeit, tatum, status) values ('Wohnzimmer','".$Wohnzimmerist."','".$Wohnzimmersoll."','".$Szenario."','".$automatikstatus."','".$jetztstamp."','".$datum."','0')";
			$linkUpdate = mysql_connect($dbHost, $dbUser, $dbPassword);
			mysql_select_db($datenbank,$linkUpdate);
			$resultUpdate = mysql_query($sqlUpdate, $linkUpdate);
		}
 	}

An

if ($Wohnzimmerist+$TempDifferenz&lt;$Wohnzimmersoll){
	$pumpe=1;
	if ($Wohnzimmerstatus==0){
	SetValue(38391 /*[Status\Wohnzimmerstatus]*/,1);
	TMEX_F29_SetPin(29129 /*[Aktoren\DS2408]*/, 0, false);
	IPS_Sleep(200);
			$sqlUpdate="insert into $dbschaltlog (raum, tempist, tempsoll, szenario,automatik, Uhrzeit, tatum, status) values ('Wohnzimmer','".$Wohnzimmerist."','".$Wohnzimmersoll."','".$Szenario."','".$automatikstatus."','".$jetztstamp."','".$datum."','1')";
			$linkUpdate = mysql_connect($dbHost, $dbUser, $dbPassword);
			mysql_select_db($datenbank,$linkUpdate);
			$resultUpdate = mysql_query($sqlUpdate, $linkUpdate);
		}
	}
Arbeitszimmer

Aus

if ($Arbeitszimmerist-$TempDifferenz&gt;$Arbeitszimmersoll){
	if ($Arbeitszimmerstatus==1){
 	SetValue(10092 /*[Status\Arbeitszimmer]*/,0);
	TMEX_F29_SetPin(29129 /*[Aktoren\DS2408]*/, 1, true);
	IPS_Sleep(200);
			$sqlUpdate="insert into $dbschaltlog (raum, tempist, tempsoll, szenario,automatik, Uhrzeit, tatum, status) values ('Arbeitszimmer','".$Arbeitszimmerist."','".$Arbeitszimmersoll."','".$Szenario."','".$automatikstatus."','".$jetztstamp."','".$datum."','0')";
			$linkUpdate = mysql_connect($dbHost, $dbUser, $dbPassword);
			mysql_select_db($datenbank,$linkUpdate);
			$resultUpdate = mysql_query($sqlUpdate, $linkUpdate);
		}
 	}

An

if ($Arbeitszimmerist+$TempDifferenz&lt;$Arbeitszimmersoll){
	$pumpe=1;
	if ($Arbeitszimmerstatus==0){
	SetValue(10092 /*[Status\Arbeitszimmer]*/,1);
	TMEX_F29_SetPin(29129 /*[Aktoren\DS2408]*/, 1, false);
	IPS_Sleep(200);
			$sqlUpdate="insert into $dbschaltlog (raum, tempist, tempsoll, szenario,automatik, Uhrzeit, tatum, status) values ('Arbeitszimmer','".$Arbeitszimmerist."','".$Arbeitszimmersoll."','".$Szenario."','".$automatikstatus."','".$jetztstamp."','".$datum."','1')";
			$linkUpdate = mysql_connect($dbHost, $dbUser, $dbPassword);
			mysql_select_db($datenbank,$linkUpdate);
			$resultUpdate = mysql_query($sqlUpdate, $linkUpdate);
		}
	}
Bad

Aus

if ($Badist-$TempDifferenz&gt;$Badsoll){
	if ($Badstatus==1){
 	SetValue(12192 /*[Status\Bad]*/,0);
	TMEX_F29_SetPin(29129 /*[Aktoren\DS2408]*/, 2, true);
	IPS_Sleep(200);
			$sqlUpdate="insert into $dbschaltlog (raum, tempist, tempsoll, szenario,automatik, Uhrzeit, tatum, status) values ('Bad','".$Badist."','".$Badsoll."','".$Szenario."','".$automatikstatus."','".$jetztstamp."','".$datum."','0')";
			$linkUpdate = mysql_connect($dbHost, $dbUser, $dbPassword);
			mysql_select_db($datenbank,$linkUpdate);
			$resultUpdate = mysql_query($sqlUpdate, $linkUpdate);
		}
 	}

An

if ($Badist+$TempDifferenz&lt;$Badsoll){
	$pumpe=1;
	if ($Badstatus==0){
	SetValue(12192 /*[Status\Bad]*/,1);
	TMEX_F29_SetPin(29129 /*[Aktoren\DS2408]*/, 2, false);
	IPS_Sleep(200);
			$sqlUpdate="insert into $dbschaltlog (raum, tempist, tempsoll, szenario,automatik, Uhrzeit, tatum, status) values ('Bad','".$Badist."','".$Badsoll."','".$Szenario."','".$automatikstatus."','".$jetztstamp."','".$datum."','1')";
			$linkUpdate = mysql_connect($dbHost, $dbUser, $dbPassword);
			mysql_select_db($datenbank,$linkUpdate);
			$resultUpdate = mysql_query($sqlUpdate, $linkUpdate);
		}
	}
GästeWC

Aus

if ($GaesteWCist-$TempDifferenz&gt;$GaesteWCsoll){
	if ($GeasteWC==1){
 	SetValue(17188 /*[Status\GaesteWC]*/,0);
	TMEX_F29_SetPin(29129 /*[Aktoren\DS2408]*/, 3, true);
	IPS_Sleep(200);
			$sqlUpdate="insert into $dbschaltlog (raum, tempist, tempsoll, szenario,automatik, Uhrzeit, tatum, status) values ('GästeWC','".$GaesteWCist."','".$GaesteWCsoll."','".$Szenario."','".$automatikstatus."','".$jetztstamp."','".$datum."','0')";
			$linkUpdate = mysql_connect($dbHost, $dbUser, $dbPassword);
			mysql_select_db($datenbank,$linkUpdate);
			$resultUpdate = mysql_query($sqlUpdate, $linkUpdate);
		}
 	}

An

if ($GaesteWCist+$TempDifferenz&lt;$GaesteWCsoll){
	$pumpe=1;
	if ($GeasteWC==0){
	SetValue(17188 /*[Status\GaesteWC]*/,1);
	TMEX_F29_SetPin(29129 /*[Aktoren\DS2408]*/, 3, false);
	IPS_Sleep(200);
			$sqlUpdate="insert into $dbschaltlog (raum, tempist, tempsoll, szenario,automatik, Uhrzeit, tatum, status) values ('GästeWC','".$GaesteWCist."','".$GaesteWCsoll."','".$Szenario."','".$automatikstatus."','".$jetztstamp."','".$datum."','1')";
			$linkUpdate = mysql_connect($dbHost, $dbUser, $dbPassword);
			mysql_select_db($datenbank,$linkUpdate);
			$resultUpdate = mysql_query($sqlUpdate, $linkUpdate);
		}
	}
Schlafzimmer

Aus

if ($Schlafzimmerist-$TempDifferenz&gt;$Schlafzimmersoll){
	if ($Schlafzimmerstatus==1){
 	SetValue(38913 /*[Status\Schlafzimmer]*/,0);
	TMEX_F29_SetPin(29129 /*[Aktoren\DS2408]*/, 5, true);
	IPS_Sleep(200);
			$sqlUpdate="insert into $dbschaltlog (raum, tempist, tempsoll, szenario,automatik, Uhrzeit, tatum, status) values ('Schlafzimmer','".$Schlafzimmerist."','".$Schlafzimmersoll."','".$Szenario."','".$automatikstatus."','".$jetztstamp."','".$datum."','0')";
			$linkUpdate = mysql_connect($dbHost, $dbUser, $dbPassword);
			mysql_select_db($datenbank,$linkUpdate);
			$resultUpdate = mysql_query($sqlUpdate, $linkUpdate);
		}
 	}

An

if ($Schlafzimmerist+$TempDifferenz&lt;$Schlafzimmersoll){
	$pumpe=1;
	if ($Schlafzimmerstatus==0){
	SetValue(38913 /*[Status\Schlafzimmer]*/,1);
	TMEX_F29_SetPin(29129 /*[Aktoren\DS2408]*/, 5, false);
	IPS_Sleep(200);
			$sqlUpdate="insert into $dbschaltlog (raum, tempist, tempsoll, szenario,automatik, Uhrzeit, tatum, status) values ('Schlafzimmer','".$Schlafzimmerist."','".$Schlafzimmersoll."','".$Szenario."','".$automatikstatus."','".$jetztstamp."','".$datum."','1')";
			$linkUpdate = mysql_connect($dbHost, $dbUser, $dbPassword);
			mysql_select_db($datenbank,$linkUpdate);
			$resultUpdate = mysql_query($sqlUpdate, $linkUpdate);
		}
	}

Skribt 3 Teil 2 :slight_smile:

Pumpe

if ($pumpe==1){
if ($Pumpestatus==0){
TMEX_F29_SetPin(29129 /[Aktoren\DS2408]/, 7, false);
IPS_Sleep(200);
$sqlUpdate=„insert into $dbschaltlog (raum, tempist, tempsoll, szenario,automatik, Uhrzeit, tatum, status) values (‚Pumpe‘,’’,’’,’“.$Szenario."’,’".$automatikstatus."’,’".$jetztstamp."’,’".$datum."’,‚1‘)";
$linkUpdate = mysql_connect($dbHost, $dbUser, $dbPassword);
mysql_select_db($datenbank,$linkUpdate);
$resultUpdate = mysql_query($sqlUpdate, $linkUpdate);
SetValue(52223 /[Status\pumpe]/, 1);
}
} else {
if ($Pumpestatus==1){
TMEX_F29_SetPin(29129 /[Aktoren\DS2408]/, 7, true);
IPS_Sleep(200);
$sqlUpdate=„insert into $dbschaltlog (raum, tempist, tempsoll, szenario,automatik, Uhrzeit, tatum, status) values (‚Pumpe‘,’’,’’,’“.$Szenario."’,’".$automatikstatus."’,’".$jetztstamp."’,’".$datum."’,‚0‘)";
$linkUpdate = mysql_connect($dbHost, $dbUser, $dbPassword);
mysql_select_db($datenbank,$linkUpdate);
$resultUpdate = mysql_query($sqlUpdate, $linkUpdate);
SetValue(52223 /[Status\pumpe]/, 0);
}
}

#Pumpe Laufzeit
#$dbpumpe_laufzeit
if ($Pumpestatus==1){
$sqlUpdate=„UPDATE $dbpumpe_laufzeit set laufzeitmin = laufzeitmin+1 where id = 1 LIMIT 1“;
$linkUpdate = mysql_connect($dbHost, $dbUser, $dbPassword);
mysql_select_db($datenbank,$linkUpdate);
$resultUpdate = mysql_query($sqlUpdate, $linkUpdate);
}
$sql=„select * from $dbpumpe_laufzeit LIMIT 1“;
$link = mysql_connect($dbHost, $dbUser, $dbPassword);
mysql_select_db($datenbank,$link);
$result = mysql_query($sql, $link);
for($i=0;$i<mysql_num_rows($result);$i++)
{
$ergebnis[$i]=mysql_fetch_array($result);
}
for($i=0;$i<count($ergebnis);$i++)
{
$ergebnis[$i][laufzeitmin] = $ergebnis[$i][laufzeitmin] / 60;
$ergebnis[$i][laufzeitmin] = round($ergebnis[$i][laufzeitmin], 2);
SetValue(52309 /[Variablen\Pumpelaufzeit]/,$ergebnis[$i][laufzeitmin]);
$Stromverbrauch = 0.055;
$Stromverbrauchpumpe = $ergebnis[$i][laufzeitmin] * $Stromverbrauch;
$Stromverbrauchpumpe = round($Stromverbrauchpumpe, 3);
SetValue(50008 /[Variablen\Pumpestromverbrauch]/,$Stromverbrauchpumpe);
}

Statistik

			$sqlUpdate="insert into $dbstatistik_raum (wohnzimmer, bad, gaestewc, schlafzimmer, arbeitszimmer, pumpe, automatik, tatum, uhrzeit, szenario) values
			 ('.$Wohnzimmerstatus.','".$Badstatus."','".$GeasteWC."','".$Schlafzimmerstatus."','".$Arbeitszimmerstatus."','.$Pumpestatus.','.$automatikstatus.','".$datum."','".$jetztstamp."','$Szenario')";

			$linkUpdate = mysql_connect($dbHost, $dbUser, $dbPassword);
			mysql_select_db($datenbank,$linkUpdate);
			$resultUpdate = mysql_query($sqlUpdate, $linkUpdate);

?>

SQL Datenbank

– phpMyAdmin SQL Dump
– version 2.11.9.2
phpMyAdmin

– Host: localhost
– Erstellungszeit: 26. Dezember 2008 um 19:31
– Server Version: 5.0.67
– PHP-Version: 5.2.6


– Datenbank: steuerung_hans



– Tabellenstruktur für Tabelle konfig

CREATE TABLE IF NOT EXISTS konfig (
id int(11) NOT NULL auto_increment,
temp_schalten varchar(5) NOT NULL,
PRIMARY KEY (id)
) TYPE=MyISAM AUTO_INCREMENT=2 ;



– Tabellenstruktur für Tabelle pumpe_laufzeit

CREATE TABLE IF NOT EXISTS pumpe_laufzeit (
id int(11) NOT NULL auto_increment,
laufzeitmin varchar(11) NOT NULL,
PRIMARY KEY (id)
) TYPE=MyISAM AUTO_INCREMENT=2 ;



– Tabellenstruktur für Tabelle raeume

CREATE TABLE IF NOT EXISTS raeume (
id int(11) NOT NULL auto_increment,
raum_name varchar(25) NOT NULL,
PRIMARY KEY (id)
) TYPE=MyISAM AUTO_INCREMENT=23 ;



– Tabellenstruktur für Tabelle schaltlog

CREATE TABLE IF NOT EXISTS schaltlog (
id int(11) NOT NULL auto_increment,
raum varchar(60) NOT NULL,
tempist varchar(60) NOT NULL,
tempsoll varchar(11) NOT NULL,
szenario varchar(60) NOT NULL,
automatik int(11) NOT NULL,
Uhrzeit varchar(80) NOT NULL,
tatum date NOT NULL,
status int(11) NOT NULL,
PRIMARY KEY (id)
) TYPE=MyISAM AUTO_INCREMENT=334 ;



– Tabellenstruktur für Tabelle sonst_steuerung

CREATE TABLE IF NOT EXISTS sonst_steuerung (
id int(11) NOT NULL auto_increment,
startuhr varchar(25) NOT NULL default ‚0‘,
enduhr varchar(25) NOT NULL default ‚0‘,
id_szenarien int(11) NOT NULL,
PRIMARY KEY (id)
) TYPE=MyISAM AUTO_INCREMENT=36 ;



– Tabellenstruktur für Tabelle statistik

CREATE TABLE IF NOT EXISTS statistik (
id int(11) NOT NULL auto_increment,
raum_name varchar(20) NOT NULL,
raum_temp varchar(11) NOT NULL,
szenario varchar(11) NOT NULL,
uhrzeit varchar(255) NOT NULL,
tatum date NOT NULL,
PRIMARY KEY (id)
) TYPE=MyISAM AUTO_INCREMENT=6701 ;



– Tabellenstruktur für Tabelle statistik_raum

CREATE TABLE IF NOT EXISTS statistik_raum (
id int(11) NOT NULL auto_increment,
wohnzimmer int(2) NOT NULL,
bad int(2) NOT NULL,
gaestewc int(2) NOT NULL,
schlafzimmer int(2) NOT NULL,
arbeitszimmer int(2) NOT NULL,
pumpe int(2) NOT NULL,
automatik int(2) NOT NULL,
tatum date NOT NULL,
uhrzeit varchar(60) NOT NULL,
szenario varchar(30) NOT NULL,
PRIMARY KEY (id)
) TYPE=MyISAM AUTO_INCREMENT=7749 ;



– Tabellenstruktur für Tabelle szenarien

CREATE TABLE IF NOT EXISTS szenarien (
id int(11) NOT NULL auto_increment,
name varchar(30) NOT NULL,
aktiv varchar(2) NOT NULL default ‚0‘,
PRIMARY KEY (id)
) TYPE=MyISAM AUTO_INCREMENT=23 ;



– Tabellenstruktur für Tabelle temperaturen

CREATE TABLE IF NOT EXISTS temperaturen (
id int(11) NOT NULL auto_increment,
id_raum int(4) NOT NULL,
id_szenarien int(4) NOT NULL,
temp varchar(5) NOT NULL,
PRIMARY KEY (id)
) TYPE=MyISAM AUTO_INCREMENT=102 ;



– Tabellenstruktur für Tabelle wochen_steuerung

CREATE TABLE IF NOT EXISTS wochen_steuerung (
id int(11) NOT NULL auto_increment,
Wochentag int(2) NOT NULL,
startuhr varchar(50) NOT NULL default ‚0‘,
enduhr varchar(50) NOT NULL default ‚0‘,
id_szenarien int(5) NOT NULL,
PRIMARY KEY (id)
) TYPE=MyISAM AUTO_INCREMENT=65 ;

Weboberfläche und Datenbanksteuerung :slight_smile:

web.zip (263 KB)

Ganz fettes DANKE !! :):):slight_smile:

Werde das die Tage mal installieren.

Schöne Feiertage wünsche ich dir.

Gruß Michael

Hi noch ein Screenshot damit jeder weiß welche Variable ich für was verwende

Hallo ckerndl,
genau diese Art von Beiträgen sind sehr gut für das Forum. Ich finde
es gut, wenn jemand einfach mal postet, was er so mit IPS macht.
Und zwar bottom up. BTW, wenn Du in PHP Schleifen zur Programmierung
nutzt, werden Deine Programme übersichtlicher, aber das weisst Du
sicher selbst. Welche Aktoren benutzt Du zur Steuerung Deiner
Heizkörper? Die Regelungsphilosophie der Heizkörper
über eine Temperaturdifferenz ist ja sehr direkt, deshalb vermute ich,
Du hast Konvektionsheizkörper. Welche Erfahrung hast Du mit dieser
Regelung gemacht? Sind die Raumtemperaturen tendentiell zu hoch
oder eher zu niedrig; d.h. musstest Du den Integerwert der Temperatur-
differenz nach ein paar Testtagen ändern?
Gruss

Hi mit Schleifen arbeite ich ja eben genau :slight_smile: ich nutze in der Software von mir ja eine Temperaturdifferenz von 0.3 ° die reicht vollkommen. Ich habe eine Fußbodenheizung als Temp. Fühler verwende ich 1-Wire DS1820 für die Ventillsteuerung einen DS2408. Ich mußt nur nur die Druchflußmenge der Heizungspumpe erhöhen somit heize ich ca. 2 Grad in der Stunde nach oben und dies ist meiner Zeitsteuerung für die Szenarien einfach bedacht (bzw ich muss es bedenken).

Ok und welche Ventile hängen da dran? So wie ich das Programm
lese, öffnest Du immer komplett bzw. schließt Du komplett; oder
gibt es auch eine Zwischenstellung?

Für jeden Raum ein Ventil. DIe Ventile haben nur eine auf und eine zu Stellung.

Moin, moin ckerndl,

bzgl „Ich mußt nur nur die Druchflußmenge der Heizungspumpe erhöhen“ hätte ich gerne gewußt, ob du einen Algorithmus für die dafür entwickelt hast, da ich in den Beispielskripten die Stuerung nur mit 0 und 1 abgebildet sehe. Sofern du ein Script haben solltest, der einen PID-Regler o.ä. abbildet und mit deiner FB gut funzt, wäre ich an deinen Erkenntnissen sehr interessiert, da ich ebenfalls eine FB fahre und ich derzeit hinsichtlich der Durchflussmenge nur auf die integrierte druckabhängige, kennliniengstützte Steuerung der Pumpe setze.

Hi,

also ich denke das es kein Problem ist das Skribt umzuschreiben. Es kommt nur drauf an wie du die Pumpe ansteuern kannst. Mann kann in den Skribten die temp unterschiede ausrechnen lassen und den größen wert unten in der Pumpenberechnung einen wert setzen lassen