mktime Tagesübergreifend

Hallo Rolf,

vielen Dank für die Antwort.
Das werde ich heute Abend mal testen und das Ergebnis berichten.

vG
Arne

Hallo Arne,

muss mich selbst korrigieren: war beim Weglassen der Argumente für mktime über das Ziel hinausgeschossen und hatte nur die Stunde vorgegeben. Minuten und Sekunden hatte ich weggelassen. Siehe mktime


$begin = mktime(22,0,0); 
$ende = mktime(5,0,0);

Gruß Rolf

Hi Rolf,

ja das macht auch Sinn so, aber funktionieren tut es dennoch nicht (bei mir).

Ich hab mir das 2te Script von agotthold mal geschnappt, und es an meine Umgebung angepasst. Es scheint in dieser Form zu funktionieren.

Löst zwar mein Problem, hilft mir aber nicht Verständnis für das „nicht funktionieren“ der ersten Ansätze zu gewinnen. Nun, manchmal muss man es einfach so hinnehmen wie es ist. Als PHP-Noob habe ich eh keine Wahl mir sonderlich den Kopf darüber zu zerbrechen. Da kann ich froh sein, dass ich Dank Euch hier überhaupt etwas zum laufen bekomme ;)!

Also, danke nochmal für die Unterstützung!!!

Bis dann
Arne

Hallo Arne,

… nicht so schnell aufgeben, etwas Logging hilft in so einem Fall immer weiter. Lass Dir einfach mal alle beteiligten Variablen ausgeben und schaue dann, wieso der entsprechende Pfad nicht ausgeführt wird.

Es hilft auch immer wieder mal, Dein Vorhaben in Text hier zu beschreiben, damit man weiß, was Du überhaupt erreichen willst.

Sehe jetzt auf die Schnelle auch keinen Fehler…


$Anwesend = GetValueBoolean(15336);
$jetzt = time();
$begin = mktime(22,0,0);
$ende = mktime(05,0,0);

// Logging
if ($Anwesend)
	echo "Anwesend".PHP_EOL;
else
	echo "Abwesend".PHP_EOL;

echo "Zeiten (Date Format):jetzt=$jetzt, begin=$begin, ende=$ende".PHP_EOL;
echo "Zeiten (String Format): jetzt=".date('Y-m-d H:i', $jetzt).', begin='.date('Y-m-d H:i', $begin).', ende='.date('Y-m-d H:i', $ende).PHP_EOL;

if (($Anwesend == true) && ($begin <= $jetzt || $jetzt <=$ende)) //Wenn Cheffe im Haus ist UND die aktuelle Uhrzeit zwischen 22:00 und 05:00 Uhr ist, dann schalte AUS....sonst bla bla
    {
        //SetValueBoolean(59859, false);
    }

    else

    {
        //SetValueBoolean(59859, true);
    }


Edit:

„$Anwesend =“ hinzugefügt

Moin…

… was soll das GetValueBoolean(15336)?! Ist das die Variable „Anwesend“ ?! Dann sollte das $Anwesend = GetValue… heissen.

Gruß,
Peter

Hi Leute,

@Brownson
Das ist eine gute Idee. Ich hatte mir zwar die Zeiten mal wiedergeben lassen, aber das in dieser Form zu machen, da wäre ich nie drauf gekommen. Werde das mal entsprechend probieren.

@Peter
Richtig kombiniert/geraten. Die Variable selbst heisst tatsächlich „Anwesend“. Diesen Unterschied habe ich bis dato noch gar nicht erkannt. Gut das Du darauf aufmerksam machst.
Kurz für mich zum Verständnis:
Wenn die Variable XYZ heisst, dann lese ich sie aus über z.B. $Daten = GetValueBoolean(12345).
Alternativ ginge dann -> $XYZ = GetValue(12345)

Habe ich das so richtig verstanden?

@all
Ich geb Brownson recht, etwas mehr Hintergrundinformationen zu meiner Umgebung wäre schon wichtig. Im Grunde habe ich das AKM868 das meine Anwesenheit feststellt.
Szenario:
Wenn ich ausser Haus bin, dann möchste ich bei DWD-Wetterwarnungen eine Email bekommen. Dies möchte ich auch wenn ich zu Hause bin, allerdings nicht im Zeitraum von 22:00 bis 05:00 Uhr.

$Anwesend ist eine Variable die Anwesend heisst und den Status vom Tracker (AKM) angibt.

Gut, ich werde diese beiden Verbesserungen/Ratschläge mal einsetzten und berichte Euch.

Gruß Arne

PS: das Script welches ich von ahgotthold genommen habe funktioniert. Dennoch möchte ich den ersten Ansatz auch zum Laufen bringen :wink:

Hallo Arne,

hier nochmal etwas zum spielen. Sollte genau dieses tun was Du willst.

<?
$anwesend = false; // Anwesenheit prüfen
$time = "00:15";
//$time = date("H:i");
if($anwesend) // wenn $anwesend true ist
{
    if($time > "23:00" || $time < "05:00") // wenn diese Zeitspanne aktiv ist
    {
        echo "Keine Mails"; // will ich keine Mails
    }
    else
    {
       echo "Mail Aktiv"; // ich bekomme Mails
    }
}
else
{
    echo "Mail Aktiv"; // wenn ich nicht zuHause bin($anwesend false), will ich immer Mails bekommen
}

?>

Hallo Rainer,

danke für das Script. Werde auch dieses demnächst ausprobieren. Zur Zeit komme ich nur nicht dazu.
Sobald ich aber alles getestet habe werde ich hier berichten was am Ende funktioniert, bzw. mir am ehesten zusagt :slight_smile:

Danke und Grüße
Arne

Hallo Leute,

ich bin jetzt zu einem ersten Test gekommen. Ich habe mich an Brownsons Ratschlag gehalten und das Script mal loggen lassen was denn überhaupt an Ergebnissen dabei heraus kommt.
Und siehe da, der Fehler liegt in der „Endzeit“!
Mit:

$begin = mktime(22,0,0);
$ende = mktime(5,0,0);

bezieht sich das Script auf das selbe Datum. Also z.B. 04.06.2013 22:00 Uhr und 04.06.2013 5:00 Uhr! Daher schaltete er zwar Abends aus, aber morgens nicht wieder an, weil er nicht den Folgetag als Endzeit nimmt.
Ich habe die aktuelle Zeit manuell mal gefaked, um den Zustand nach 0:00 Uhr zu simulieren. Auch da wird das Datum auf den 04.06.2013 5:00 uhr gesetzt (siehe Logs)

Manipulierte Uhrzeit:

Anwesend
Zeiten (Date Format):jetzt=1370395050, begin=1370376000, ende=1370314800
Zeiten (String Format): jetzt=2013-06-05 03:17, begin=2013-06-04 22:00, ende=2013-06-04 05:00
Alarm wird ausgeschaltet

Ohne Änderungen (Ausgangsscript)

Anwesend
Zeiten (Date Format):jetzt=1370371595, begin=1370376000, ende=1370314800
Zeiten (String Format): jetzt=2013-06-04 20:46, begin=2013-06-04 22:00, ende=2013-06-04 05:00
Alarm wird eingeschaltet

Durch diese Zeile (gibt sicher schönere Lösungen):

$ende = strtotime("tomorrow + 5 hours" );

erreiche ich dieses Ergebnis:

Anwesend
Zeiten (Date Format):jetzt=1370371742, begin=1370376000, ende=1370401200
Zeiten (String Format): jetzt=2013-06-04 20:49, begin=2013-06-04 22:00, ende=2013-06-05 05:00
Alarm wird eingeschaltet

Wichtig ist, dass in der Bedingung des Zeitraumes wieder ein && und nicht ein || eingesetzt wird.
Damit sollte die Geschichte nun laufen!

Das ganze Script sieht also nun so aus:


<?php
$Anwesend = GetValue(15336);
$jetzt = time();
$begin = mktime(22,0,0);
$ende = strtotime("tomorrow + 5 hours" );


if (($Anwesend == true) && ($begin <= $jetzt && $jetzt <=$ende)) 

    {
		SetValueBoolean(59859, false);
    }

    else

    {
 		SetValueBoolean(59859, true);
    }
?>

@RWN
Dein Probierscript werde ich aber auch noch mal testen. Hab jetzt Blut geleckt und will noch Alternativen probieren.

Nochmal Danke an Alle!!!
MfG
Arne

Willkommen im Club :slight_smile:

Damit wir keine Angst vor Vampiren haben müssen: über die Unterschiede der Php-Befehle mktime() und date() im Klaren sein :wink: .

Gruß Rolf

@Rolf :smiley: :wink:

Ich muss eh gestehen, ich habe einen eklatantischen Fehler gemacht. IPS aktiviert immer noch brav um 0:00 Uhr die Emailmeldungen.

Ist ja auch logisch, da strtotime das aktuelle Datum auf den morgigen Tag setzt. Vor 0:00 Uhr ist das ja gewollt, nach 0:00 Uhr natürlich nicht.

Das hat mich allerdings auf den Gedanken gebracht mal über das Pollen des Sciptes nachzudenken. Das Script wird per Ereignis alle 5 Minuten gepollt. Um Punkt 0:00:00 Uhr steht das Datum noch auf 04.06.13. Erst um 0:00:01 Uhr springt es auf 05.06.13. Aber was geschieht beim Pollen um 0:05 Uhr? Dann wäre die Bedingung <= 5:00 doch wieder richtig.

Werde mir wohl weiter den Kopf darüber zerbrechen müssen. Wobei ich sagen muss, ich finde es sehr interessant!
Bevor ich hier aber weiter spamme, melde ich mich erst wenn ich funktionierende Ansätze gefunden habe. Denkanstöße habt ihr mir ja genug gegeben :wink:

MfG
Arne

Hi Leute,

nach 48 Stunden Testphase scheint das Script nun zu laufen. Zumindest tut es brav das was es soll. Hier noch das aktuelle Script.

MfG Arne

<?php

//Variablen
$Anwesend = GetValue(15336); //Variable vom AKM Tracker
$stunde = date("H:i");
$begin = GetValueString(55126 ); //String Variable die ich im Webfront per OSK ändern kann
$ende = GetValueString(37246 ); //String Variable die ich im Webfront per OSK ändern kann

//prüfen ob aktuelle Uhrzeit im Zeitraum liegt

if($stunde>$begin or $stunde<$ende)

{
 	//prüfen wie der Status der Anwesenheit ist
  	if ($Anwesend == true)

  		{
  		      SetValueBoolean(59859, false);     
 		 }
		else
		  {
     	       SetValueBoolean(59859, true);
		  }

}
  //wenn die aktuelle Uhrzeit nicht im Ruhezeitraum liegt, dann werden die Meldungen generell aktiviert!

else
{
  SetValueBoolean(59859, true);
}


?>

Has’de ja mittlerweile, aber mit neuen Ansätzen bzw. Variationen (Variablen… OSK) die voher (deine ursprüngliche Frage) nicht zur Diskussion standen…
aber manchmal entwickelt sich aus einer Frage erst eine ganz neue Idee.
Doch sollte man diese extrahieren sonst kann der Nächste keine Schlüsse draus ziehen… ich glaube immer noch nicht an Gedankenleser :smiley:
Was ich meine…
Mit dem von dir geposteten Script kann aufgrund von Abhängigkeiten (unerläuterte Variablen) niemand etwas anfangen, zumal zwischendurch „Antworten unbeantwortet“ blieben.

Hallo nancilla,

zunächst einmal Danke für Deine „Anregung/gut gemeinte Kritik“, ich finde es sehr gut, dass Du als Moderator Deiner Tätigkeit hier entsprechend nachkommst. Ich werde zukünftig versuchen mehr Acht auf die Nachvollziehbarkeit zu geben.

In einigen Punkten kann ich Dir jedoch nicht folgen.

…aber manchmal entwickelt sich aus einer Frage erst eine ganz neue Idee

Jain. In meinen Augen ist das innerhalb dieser Diskussion keine neue Idee. Die Idee, die hinter der Funktion steht, ist immer die Gleiche. Wenn ich zwischen X und Y Zeit zu Hause bin, dann mach Z aus, ansonsten mach Z an. Diese Logik habe ich in meinem ersten Ansatz versucht umzusetzen. Dies hat aber, mir bis dahin aus nicht nachvollziehbaren Gründen, nicht funktioniert. Daher habe ich mich mit meinem Post an die Community gewendet, um evtl. Fehler in der Schreibweise oder der Logik festzustellen. Im Nachinein habe ich meinen Post sogar noch editiert, um deutlicher zum Ausdruck zu bringen, dass ich keine Musterlösung möchte, sondern es darum geht, meinem Verständnis auf die Sprünge helfen.

aber mit neuen Ansätzen bzw. Variationen (Variablen… OSK) die voher (deine ursprüngliche Frage) nicht zur Diskussion standen…

Ja sicher mit neuen Ansätzen, denn wenn Plan A nicht funktioniert muss schließlich Plan B her oder? Das OSK war nur eine Erweiterung des letzten Endes laufenden Scriptes. Ich habe mittlerweile schon hunderte von Thread-Diskussionen verfolgt, in denen das ursprüngliche Script mit dem finalen Scipt kaum noch Ähnlichkeit aufwies. Zumindest für einen PHP-Anfänger. Aber auch dies war stehts nachvollziehbar. Man muss halt nur länger drüber grübeln.
Die Grundfunktion des Scriptes, die der Ursprung dieser Diskussion war, ist von Anfang bis Ende die gleiche geblieben. Es haben sich nur die Schreib- und Befehlsweisen geändert. Die Erweiterung OSK ist nur ein kleiner Feinschliff, der mit dem Ansatz entstanden ist. Da gebe ich Dir jedoch defenitiv Recht, ich hätte zumindest diese Erweiterung erwähnen sollen. Wobei es unzählige Thread-Beispiele gibt, in denen es um weitaus komplexere Scripte geht, in denen der Postverlauf thematisch genau so aussieht wie hier. Das wurde jedoch nicht als störend empfunden. Evtl. ja weil sich hauptsächlich „alte Hasen“ ausgetauscht haben, und nicht so ein blutiger Anfänger, der seinen zusammenhanglosen Kleinkram gepostet hat.

Mit dem von dir geposteten Script kann aufgrund von Abhängigkeiten (unerläuterte Variablen) niemand etwas anfangen,…

Welche unerläuterten Variablen meinst Du genau?
Die hier: SetValueBoolean(59859, false);
Hm, ok. Ein Sack Reis, eine Boolsche Variable, eine Glühbirne. Ist das nicht prinzipiell egal um den Rest nachvollziehen zu können? Interessant ist doch eigentlich nur, dass eine Variable auf true oder false gestellt werden soll. Alle anderen betroffenden Dinge habe ich eigentlich, nachdem man mich darauf aufmerksam gemacht hat, erläutert.

…zumal zwischendurch „Antworten unbeantwortet“ blieben.

Sorry, beim besten Willen. Ich kenne Fragen die unbeantwortet bleiben. Aber Antworten? Oder meinst Du Beiträge der Community? Also ich möchte meinen, dass ich auf jeden Post von Anderen, bei denen es Sinn macht, reagiert habe. Bitte korrigiert mich dahingehend!

Das ist keineswegs böse oder vorlaut von mir gemeint. Ich schätze diese Community hier sehr, denn sie ist sehr hilfsbereit und es sind sehr viele schlaue Köpfe an Bord. Aber in diesen Punkten kann ich Dir wirklich nicht folgen.
Ich sehe es schon ein, dass mein erster Ansatz und das finale Script nicht ein und dasselbe sind, aber wenn man die wenigen Post´s dazwischen mitverfolgt, dann sollte man doch Alles nachvollziehen können.
Ich habe hier noch nicht einen Thread gesehen, wo ich direkt auf der letzten Seite ein Script finde und es gleich verstehe. Dazu muss man leider meist am Anfang beginnen, um den Werdegang hinter der Logik und Funktion zu verstehen.

Wenn ich jetzt jedes Deiner Worte (und das ist das Problem am Schreiben, da Ausdruck, Gefühle, Betonung nur verbal möglich sind) ernsthaft interpretieren würde, dann dürfte ich vor Scharm nie mehr hier einen Post schreiben. Demnach habe ich nämlich so ziemlich alles falsch gemacht was man falsch machen kann. Als Posting-Noob gebe ich Dir den Ratschlag, regel das per PN oder beschreib die Probleme etwas deutlicher, bestenfalls sogar mit Beispielen wie man es richtig macht, dann hat derjenige auch die Möglichkeit Deine Kritik richtig nachzuvollziehen.

Mag sein das ich gerade wie „Schwein ins Uhrwerk“ schaue und mich total zum Deppen mache. Das ist dann eben so. Sei einfach so nett, sofern Du die Zeit und Lust hast, und erläuter mir genau was Du von mir eigentlich erwartet hättest. Am besten per PN, denn das ist wohl eher OffTopic.

vG
Arne

Mich hat gestern gewundert, warum am Ewigkeitssonntag meine Weihnachtsbeleuchtung startet.

Da hat meine Funktion von 2013, die seit Jahren gut funktioniert, leider ein Problem damit, dass der 4. Advent und Heiligabend in diesem Jahr auf dem gleich Tag sein werden :open_mouth: .