Ich steuere meine Warmwasserzirkulationspumpe seit heute mit 1-Wire (Timed4Channel-Modul).
Um nicht duzente Timer zu erstellen die wiederrum ein Skript für das Ein- bzw. Ausschalten des Moduls starten dachte ich mir, bastele ein Skript das minütlich getriggert wird und frage darin den Wochentag und die Uhrzeit ab.
Vor lauter if | and und Klammern habe ich die Übersicht verloren und hoffe nun auf Ansätze aus dem Forum.
Wer kann mir helfen.
Soll: Werktags von 05:30 - 07:00 Uhr und 15:00 - 22:00 Uhr soll die Pumpe laufen. Des Weiteren soll die Pumpe Samstags bis Sonntags von 08:00 - 22:00 Uhr laufen.
Ist: Das mit den Uhrzeiten habe ich in der If-Schleife schon hinbekommen, aber wie bekomme ich den Tag noch unter.
Hier mal mein Skript, noch nicht berauschend, aber zumindest kommt warmes Wasser aus der Leitung
$actual_time = date("H:i");
$day = date("w");
echo $actual_time."
\r"; //debug
echo $day."
\r"; // debug
// nummerischer Wochentag in Text
switch ($day) {
case 0 : $day = 'Sonntag';
break;
case 1 : $day = 'Montag';
break;
case 2 : $day = 'Dienstag';
break;
case 3 : $day = 'Mittwoch';
break;
case 4 : $day = 'Donnerstag';
break;
case 5 : $day = 'Freitag';
break;
case 6 : $day = 'Samstag';
break;
}
echo $day."
"; //debug
if ((($actual_time >= "05:30") and ($actual_time <= "07:00")) or
(($actual_time >= "15:00") and ($actual_time <= "22:00"))) {
echo "Pumpe an"; //debug
}
else {
echo "Pumpe aus"; //debug
}
Mache einfach die Abfrage so (Beispiel Wochentag):
if(
$day >= 1 and $day <= 5 and
$actual_time >= "05:30" and $actual_time <= "07:00" or
$day >= 1 and $day <= 5 and
$actual_time >= "15:00" and $actual_time <= "22:00")
{
// hier wird Pumpe angeschaltet
}
soetwas erledigt man normalerweise über den Terminplaner (Taste F6). Dort legst Du 4 Einträge an, zwei (Start/Stop) für Werktage und zwei weitere für das Wochenende. Die Start- und Stoppzeiten könne minutengenau festgelegt werden.
Du benötigst darüber hinaus jeweils ein Skript zum Starten und Stoppen der Pumpe.
den TimerWizard wollte ich eigentlich vermeiden, der übersichthalber sollte das in einem Skript erledigt werden, vielleicht sogar über eine externe Steuerdatei, für erste auch hardcoded.
Aber wenn Dir schon nichts dazu einfällt dann gehts wohl nicht anders.
braucht man denn bei den if-Abfragen keine Klammern, ist hier „and“ vor „or“ wie „punkt“ vor „strich“?.
Genau, aufeinanderfolgende and Anweisungen geltem als zusammengehörig und können durch ein or in weitere wenn=>dann Gruppen fortgeführt werden.
Aber HJH hat recht, in diesem speziellen Fall ist der Timer Wizard die beste Wahl. Wenn das Script mehrere Zeiten und Termine beinhalten sollte währe dann ein array sinnvoll.
Euer Skript hat bis auf einen Kleinstfehler wunderbar geklappt.
Für die „function Pumpe“ hat nur die Übergabe des 2. Parameters „$debug“ gefehlt was natürlich auf der grünen Wiese immer passieren kann. Aber so kann ich auch noch ein wenig lernen
Mein Dank wird Euch immer verfolgen. Macht schon mal einen Strich auf Eurer IchBekommeAufDemUsertreffen2009EinFreibierVonWerner-Liste.
Hier noch das ergänzte Skript.
$debug = false; // debug
include "T4C_Functions.ips.php";
$actual_time = date("H:i");
$day = date("w");
if ($debug) echo $actual_time."
"; // debug
if ($debug) echo $day."
"; // debug
if ($day >= 1 and $day <= 5) // Werktag *************************
{
if ($debug) echo "Werktag
"; // debug
if ((($actual_time >= "05:30") and ($actual_time <= "07:00")) or
(($actual_time >= "15:00") and ($actual_time <= "22:00")))
Pumpe("an", $debug);
else
Pumpe("aus", $debug);
}
else // Wochenende **********************
{
if ($debug) echo "Wochenende
"; // debug
if (($actual_time >= "08:00") and ($actual_time <= "22:00"))
Pumpe("an", $debug);
else
Pumpe("aus", $debug);
}
function Pumpe ( $status, $debug ) {
if ( $status = 'an' ) {
if ($debug) echo "Pumpe an"; // debug
T4C(17712,4,61);
SetValueBoolean("t4c_1_4", True);
IPS_LogMessage("HEIZUNG", "Zirkulationspumpe: AN");
// weitere Aufgaben
} else {
if ($debug) echo "Pumpe aus"; // debug
T4C(17712,4,0);
SetValueBoolean("t4c_1_4", False);
IPS_LogMessage("HEIZUNG", "Zirkulationspumpe: AUS");
// weitere Aufgaben
}
}
Jetzt kommt die 2. Herausforderung. Jetzt muss noch die Abfrage eines manuellen Schalters rein der in der „Pumpe Aus“ Zeit das Skript übersteuert.
Da spiele ich mich aber erst einmal selbst und falls es nicht klappt schreie ich um Hilfe
Ich steuere parallel zu diesem Skript die Pumpe mit einem Taster in der Küche (WAF). Jetzt dachte ich mir wenn mein Weibchen den Schalter drückt um außerhalb des Skriptes warmes Wasser zu bekommen setze ich mit
IPS_SetScriptTimer("Warmwasser SteuerTimer",0);
den TimerWizard auf NULL.
Was ich aber bis jetzt aus den Beispielskripten und der Doku gelesen habe setzt IPS_SetScriptTimer nicht den TimerWizard sondern den Timer eines beliebigen Skriptes aus den EventSkripts.
Liege ich damit richtig?
Falls ja, könnte ich ja im Skript des Tasters in der Küche doch gleich einen SkriptTimer auf das oben genannte Skript setzen und somit den TimerWizard löschen.
Bitte korregiert mich falls ich hier flasch liege.
Mit der if-Abfrage habe ich ja nur 2 Selektionen, derzeit eine für Wochentags und „else“ für Wochenende.
Mit meinem minimalistischen PHP-Kenntnissen könnte man doch via case-Abfrage für jeden Tag einen eigenen Zeitplan hinterlegen.
switch ($day) {
case 0 : Uhrzeitgesteuerte if-Abfrage für Sonntag;
break;
case 1 : Uhrzeitgesteuerte if-Abfrage für Montag;
break;
case 2 : Uhrzeitgesteuerte if-Abfrage für Dienstag;
break;
case 3 : Uhrzeitgesteuerte if-Abfrage für Mittwoch;
break;
case 4 : Donnerstag;
break;
case 5 : Freitag;
break;
case 6 : Samstag;
break;
nein, muss es nicht. In einer Function sind Variablen immer nur der Function bekannt. Und damit die Function auch Variablen kennt, die man ausserhalb dieser benutzt, werden sie entweder uebergeben, oder wie in diesem Fall besser, als Variable vereinbart, die global vorhanden ist.