Datumsprobleme

Seit dem 5.12 schaltet er nicht mehr, finde aber den Fehler in Bezug auf „<=06.01.“ nicht.
Wo denke ich bei den Datumangaben falsch?

<?
/*


IP-SYMCON Event Scripting


File : Weihnachtsbeleuchtung_Schaltuhr.ips.php
Trigger : Läuft zwischen dem 1.Advent und 6.1 eines Jahres
Schaltzeiten: Vorgegebene Uhrzeit bis Sonnenaufgang
und Sonnenuntergang bis zur vorgegebenen Uhrzeit.
Interval :
*/
$einschaltzeit = „07:00“; //Uhrzeit wann Lichter Morgens angehen sollen immer mit führender 0 und :
$ausschaltzeit = „22:00“; //Uhrzeit wann Lichter Abends ausgehen sollen immer mit :

//Ab hier nichts mehr ändern
$sunrise = GetValueString(„Sonnenaufgang“);
$sunset = GetValueString(„Sonnenuntergang“);
$jahr = date(„Y“);
$Advent = date(‚d.m.Y‘, mktime(0, 0, 0, 11, 26+(7-date(‚w‘, mktime(0, 0, 0, 11, 26, $jahr))), $jahr));
If (((date(„d.m.Y“) >= $Advent) and (date(„d.m.“) <= „06.01.“))
and (((date(„H:i“) >= $einschaltzeit) and (date(„H:i“) < $sunrise))
or ((date(„H:i“) > $sunset) and (date(„H:i“) < $ausschaltzeit))))
{
SetValueBoolean(„Weihnachtsbeleuchtung_Schaltuhr_Flag“, true);
echo "Weihnachtsbeleuchtung an
";
TMEX_F29_SetPin(35787, 7, false);
} else {
SetValueBoolean(„Weihnachtsbeleuchtung_Schaltuhr_Flag“, false);
echo "Weihnachtsbeleuchtung aus
";
TMEX_F29_SetPin(35787, 7, true);
}
echo "sunrise = „.$sunrise.“
";
echo "sunset = „.$sunset.“
";
echo "1. Advent = „.$Advent.“
";
echo date ( 'd.m.Y - ');
echo date ( ‚H:i‘);

?>

Du kannst das Datum nicht als String vergleichen. Du musst es immer im PHP Zeitformat haben. PHP: strtotime - Manual

paresy

Du kannst ein Datum schon als String vergleichen, nur ist das Ergebnis anders als erwartet.

Beim Stringvergleich wird die lexikographische Ordnung angewendet, d.h. Zeichen für Zeichen von links verglichen.

Also ist 05.12. < 06.01.

Aber 06.12. > 06.01

Besser Paresys Tipp beherzigen und Zeitstempel statt Strings vergleichen.

Das Skript ist ein bisschen knifflig, weil es über den Jahreswechsel geht. Ab 01.01. wird etwas anderes schieflaufen, dann berechnet es nämlich $advent für das neue Jahr und somit ist das aktuelle Datum < $advent. Du solltest die beiden Datumsvergleiche mit „oder“ verknüpfen;).

Wodurch wird das Skript getriggert und wie häufig passiert das? Mir ist noch aufgefallen, dass du dann jedesmal deinen Aktor schaltest, ist aber möglicherweise egal. Eigentlich musst du ja nur morgens und abends jeweils einmal ein- bzw. ausschalten.

Viele Grüße
Andreas

Wie schon paresy gesagt hat.

$einschaltzeit
$ausschaltzeit

in Tipestamp umwandeln. z.B.


$h = 7;
$min = 0;
$einschaltzeit = mktime ($h,$min,0,date("m"),date("d"),date("y"));

Für aktuellen Tag (date)


$timestamp = time();

verwenden.

Für den Advent:


$advent = mktime(0, 0, 0, 11, 26+(7-date('w', mktime(0, 0, 0, 11, 26, $jahr))), $jahr);

nehmen.

Beispiel Sonnenauf und -untergang


      //Sonnenaufgang
      $sonnen_auf = GetValueString("Sonnenaufgang_Heute");
      $sonnen_auf = explode(":",$sonnen_auf);
      //Sonnenuntergang
      $sonnen_unt = GetValueString("Sonnenuntergang_Heute");
      $sonnen_unt = explode(":",$sonnen_unt);

      $sonnen_auf_timestamp = mktime ($sonnen_auf[0], $sonnen_auf[1], 0, date("m"), date("d"), date("Y"));
      $sonnen_unt_timestamp = mktime ($sonnen_unt[0], $sonnen_unt[1], 0, date("m"), date("d"), date("Y"));

So funktioniert das Skript und ist nicht zu kompliziert:


<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File : Weihnachtsbeleuchtung_Schaltuhr.ips.php
Trigger : Läuft zwischen dem 1.Advent und 6.1 eines Jahres
Schaltzeiten: Vorgegebene Uhrzeit bis Sonnenaufgang
und Sonnenuntergang bis zur vorgegebenen Uhrzeit.
Interval :
*/
$einschaltzeit = strtotime("07:00"); //Uhrzeit wann Lichter Morgens angehen sollen immer mit führender 0 und :
$ausschaltzeit = strtotime("22:00"); //Uhrzeit wann Lichter Abends ausgehen sollen immer mit :

//Ab hier nichts mehr ändern
$sunrise = strtotime(GetValueString("Sonnenaufgang"));
$sunset = strtotime(GetValueString("Sonnenuntergang"));
$jetzt = mktime();
$beleuchtung_ein = (($jetzt>=$einschaltzeit) and ($jetzt<$sunrise))
	or (($jetzt>=$sunset) and ($jetzt<$ausschaltzeit));
$Advent = mktime(0, 0, 0, 11, 26+7- date('w', mktime(0, 0, 0, 11, 26)));
If (($jetzt >= $Advent) or ($jetzt < mktime(0,0,0,1,7)))
{
   SetValueBoolean("Weihnachtsbeleuchtung_Schaltuhr_F lag", $beleuchtung_ein);
   echo "Weihnachtsbeleuchtung ". ($beleuchtug_ein ? "an":"aus")." 
";
   TMEX_F29_SetPin(35787, 7, !$beleuchtung_ein);
}
echo "sunrise = ".$sunrise." 
";
echo "sunset = ".$sunset." 
";
echo "1. Advent = ".date("d.m.Y",$Advent)." 
";
echo date ( 'd.m.Y - ');
echo date ( 'H:i');
?>

Danke für das fertige Script, ich hatte gestern Abend schon nach paresy Hinweis angefangen umzuschreiben.
Aber der Hinweis auf mktime fehlte mir erst noch, damit spart man einige Zeilen.
docM’s Version ist natürlich noch viel kürzer als mein Gestammel,
durch die Raffung bin ich erst auf die Kürzungsmöglichkeiten gekommen.
Danke!
Ich hoffe ich kann das bei meinen Versuchen als Lernstoff einfließen lassen.

Bernd