Aktorsteuerung zu bestimmter Uhrzeit

Hallo Freunde des PHP-Skriptens,

als absoluter PHP-Dummy benötige ich Eure Hilfe.

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 :wink:



$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
}


Hi,

das mit dem case und switch kannst Du weglassen.

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
}




Hallo ferengi,

braucht man denn bei den if-Abfragen keine Klammern, ist hier „and“ vor „or“ wie „punkt“ vor „strich“?.

Die Case/Switch habe ich derzeit nur zur besseren Übersicht des Wochentages, die kommt später wieder raus.

Hallo Werner,

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.

Gruß
HJH

Guten Abend Hans-Jörg,

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 :wink: 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.

Hallo Werner,

selbstverständlich kann man das auch per Skript erledigen:

$actual_time = date("H:i");
$day = date("w");
echo $actual_time."
";     // debug
echo $day."
";             // debug

if ($day >= 1 and $day <= 5)  // Werktag *************************
{
  echo "Werktag
";         // 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
}
else                          // Wochenende **********************
{
  echo "Wochenende
";      // debug
  if (($actual_time >= "08:00") and ($actual_time <= "22:00"))
   echo "Pumpe an";           // debug
  else
   echo "Pumpe aus";          // debug
}

Gruß
HJH

Hallo,

und das ganze noch etwas verfeinert, damit die Steuersequenz nicht mehrfach vorhanden ist:


$debug = TRUE;              // debug
$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");
  else
  Pumpe("aus");
}
else                          // Wochenende **********************
{
  if ($debug) echo "Wochenende
";      // debug
  if (($actual_time >= "08:00") and ($actual_time <= "22:00"))
   Pumpe("an");
  else
   Pumpe("aus");
}

function Pumpe ( $status ) {
    if ( $status = 'an' ) {
       if ($debug) echo "Pumpe an";          // debug
       // weitere Aufgaben
    } else { 
       if ($debug) echo "Pumpe aus";         // debug
       // weitere Aufgaben
    }
}

man kann das ganze dann auch noch ausfeilen, aber so ist es schon ok.

Hallo HJH,
Hallo Torro,

vielen Dank für Eure Mühe. Werde das ganze gleich einbauen und den Erfolg berichten.

Hallo Torro,
hallo HJH,

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 :slight_smile:

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 :wink:

Hallo,

wie angedroht stellt sich mir die nächste Frage.

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.

Und wieder was dazu gelernt.

Es ist so wie vermutet. IPS_SetScriptTimer manipuliert nicht den TimerWizard sondern den Timer eines x-beliebigen Skriptes.


if ($S4A_1_Kueche == True)
{
   IPS_SetScriptTimer("WW_Zirkulation_Timer",0);
   echo "Zirkulationspumpe AN";
   T4C(17712,4,61);
   SetValueBoolean("t4c_1_4", True);
}
else
{
   echo "Zirkulationspumpe Aus";
   IPS_SetScriptTimer("WW_Zirkulation_Timer",120);
   T4C(17712,4,0);
   SetValueBoolean("t4c_1_4", False);
}

IPS_LogMessage("HEIZUNG", "Zirkulationspumpe: ".$S4A_1_Kueche);


Da tun sich ja ungeahnte Möglichkeiten auf :slight_smile:

Jetzt klappt es so wie meine Frau und ich es mir gedacht haben (WAF == 100%).

Vielen Dank für die Unterstützung.

Jetzt fällt mir noch etwas ein.

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; 


Liege ich da richtig?

Hallo Werner,

nein, das geht auch anders besser. Nimm den $debug Parameter bitte wieder ueberall bei den Aufrufen raus. Dafuer ergaenzt Du die function wie folgt:


function Pumpe ( $status, $debug ) { 

   global $debug;

    if ( $status = 'an' ) {

das war es schon. Damit steht Dir die globale Variable debug auch immer in der Funktion zur Verfuegung.

Hallo wgreipl,

ja, das kann man so machen.

Hallo Uwe,

gewußt wie :wink: Man lernt nie aus. Aber, muss das global $debug nicht oben in das Skript damit es global wird?

Das mit der case-Abfrage werde ich dann gleich heute Abend testen.

Vielen Dank.

Hallo Werner,

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.