Wie kann ich Uhrzeiten vergleichen?

Hallo liebe Comunity,

erst mal vielen dank an alle ich konnte schon viel von euch lernen. :slight_smile:
jetzt hab ich ein problem aber kann keine lösung finden.

ich poste als erstes mal mein script, dann werden 90% wissen was ich falsch mache. :frowning:



$time = date("H:i");
$tueroeffner = getvalue(30649 /*[Unsortiertes und im hintergrund arbeitendes	reppenhauslicht\kanal 1 türöffner\STATE]*/ );
$nach6 = ("18:00");
$vor8 = ("08:00");



if      (($tueroeffner == true)
  	  and (($time >= $nach6)
	  or  ($time <= $vor8)))
	  
{
 setvalue(33471 /*[Unsortiertes und im hintergrund arbeitendes	reppenhauslicht\Treppenhauslicht\STATE]*/ , true);
}


und zwar möchte ich das ab 6 Uhr abends sobald ich den türöffner drücke auch das treppenhauslicht mit angeht.
ich hab nur leider keine ahnung wie ich zeiten vergleichen kann. :confused:

bitte habt nachsehen mit mir, bin jetzt den dritten tag am suchen nach einer lösung aber es will einfach nich…:frowning:

vielen dank schon mal

gruß, basti

Mit „Zeiten vergleichen“ im Suchfenster finde ich das: http://www.ip-symcon.de/forum/threads/4831-Wie-vergleicht-man-Zeiten?highlight=zeiten+vergleichen :cool:

Man kann das nicht nur scriptbasiert, sondern auch eventbasiert lösen. Soll heissen:

An die „State“ Variable deines Türöffners hängst Du zwei Events, eines gilt von 18.00 bis 7.59 und eines von 8:00 bis 17:59 und die rufen jeweils ein anders script auf.

Nicht so elegant, funktioniert aber…

Gruß
Martin

vielen dank schon mal für eure schnelle hilfe.
ich stand als anfänger seit tagen mit beiden beinen auf der leitung. ich denk ihr wisst was ich meine.
bei vielen scripten mit sonnenaufgansberechnung und so blick ich leider einfach nich durch.
aber das

$uhrzeit="20:15"; 
 $daten = explode(":", $uhrzeit); // trennen und in array 
 $zeit=$daten[0]*60+$daten[1]; //20:15 Uhr als Integer  

klingt gut

und zwei scripte zu verwenden klingt auch gut mal ganz gut
danke soweit

Hallo.

Mit der festen Uhrzeit alleine wirst Du wahrscheinlich nicht glücklich werden. Im Sommer ist es um 18:00 noch taghell und die Beleuchtung überflüssig. Suche doch mal nach dem Astroskript (Klick) und nimm als Schaltschwellen den Sonnenauf- bzw. untergang.

hei kronos,
auch dir vielen dank für deine hilfe. das skript schaut echt toll aus, allerdings hab ich dort null durchblick.
wenn ich mal mehr ahnung von php und ip symcon habe werd ich garantiert so etwas verwenden.
momentan möcht ich aber verstehen und lernen.
mein script sieht gerade so aus:

$tueroeffner = getvalue(30649 /*[Unsortiertes und im hintergrund arbeitendes	reppenhauslicht\kanal 1 türöffner\STATE]*/ );
$time = time();
$nach6 = mktime(15,0);
$vor8 = mktime(8,0);

if      (($tueroeffner == true) and (($time >= $nach6) or ($time <= $vor8)))
	  
{
 setvalue(33471 /*[Unsortiertes und im hintergrund arbeitendes	reppenhauslicht\Treppenhauslicht\STATE]*/ , true);
}

funktioniert aber immer noch nich:mad:

naja irgend wann werd ich´s schon rausfinden.

wenn du mitteilst, was nicht funktioniert, könnte man evtl. helfen

:wink:

vielleicht noch ein Tipp zur Fehlersuche: lass dir im Script die Werte der Variablen per echo oder print_r() ausgeben. So kannst du überprüfen, ob Deine Annahmen stimmen. Das hilft sehr , man erlebt hier durchaus die ein oder andere Überaschung

hei raketenschnecke,
der tipp mit echo is echt genial. jetzt seh ich entlich was da so drin steht.:slight_smile:

der fehler: also das problem ist, ich weis nicht wie ich eine Uhrzeit („18:00“) in eine Varieble ($nach6) bekomme um sie mit der aktuellen zeit ($time = date(„H:i“) oder $time = time() ) zu vergleichen.:confused:

jetzt kann ich dir grad nicht folgen :wink:

du hast doch oben im Script schon eine Zuweisung vorgenommen. In den Vars müssten doch jetzt die Unix-Timestamps drinstehen?!

oder erwartest du hier „nur“ die Uhrzeit (z.b. 2345)?

Hab wohl den Kasten Bier auch auf die leitung gestellt wo ich drauf steh.:smiley:

also in meinem ersten script oben, kann ich da denn $nach6 = („18:00“) mit $time = („H:i“) so vergleichen oder is des schon total falsch?

wenn du in diesem Falle nur vergleichen (und nicht rechnen) willst, solltest du Integer-Werte nehmen:

$nach6 = 1800;          // Timestamp "ab..."
$time = date("Hi", time());   // Uhrzeit jetzt

Dennoch ist ein UNIX-Timestamp immer vorzuziehen

@basti

Im Prinzip war Dein Code im 1. Post auch bereits in Ordnung, viele Wege führen nach Rom - auch „String“ Vergleiche von Uhrzeiten


	$time        = date('H:i');
	$tueroeffner = true;
	$nach6       = '18:00';
	$vor8        = '08:00';
	if ($tueroeffner == true and ($time >= $nach6 or  $time <= $vor8)) {
	   echo 'Action ...';
	}

Wodurch wird denn der Code ausgeführt?

Log Meldungen helfen in so einem Fall auch immer mal …

so :slight_smile: harter kampf aber es sieht schon recht gut aus.
hab sehr viel dazugelernt heute. :o

nur der homematic aktor lässt sich noch nicht an steuern.
aber jetzt brauch ich erst mal ne portion schlaf.

vielen dank an euch alle, es ist schön zu merken das es hier so viele hilfsbereite leute giebt.

@Brownson: das script startet sobald eine variablenänderung am türöffner vorliegt
Log Meldungen weis ich leider nicht wo ich bruchbare finde

die fehlermeldung für Line 12 sagt, dass dein HM-Steuerbefehl noch nicht richtig ist.
versuchs mal damit:

HM_WriteValueBoolean(44311, "STATE", true);

vielen dank jetzt funktioniert es:)

so hier noch einmal mein fertiges script

<?

// Treppenhauslicht geht Abends mit an wenn der Türöffner betätigt wird

$time = date("H:i");//Aktuelle Uhrzeit
$tueroeffner = getvalue(30649);
$nach6 = date("18:00");//ab 18:00 Uhr
$vor8 = date("08:00");//bis 8:00 Uhr


if      (($tueroeffner == true) and (($time >= $nach6) or ($time <= $vor8)))
	  
{
 HM_WriteValueBoolean(44311 , "STATE", true);
 sleep (120);//Zeit in sekunden wie lange das Treppenhauslicht an bleiben soll
 HM_WriteValueBoolean(44311 , "STATE", false);
}


?>

und noch ein dankeschön an alle mitwirkenden;)

prima, schön, dass es funktioniert :wink:

aber hierzu noch eine Anmerkung:

sleep (120);//Zeit in sekunden wie lange das Treppenhauslicht an bleiben soll

das solltest du auf keinen Fall machen. Das führt dazu, dass dieses Script als PHP-Task mindestens 120 Sekunden offen bleibt und erst nach Abarbeitung des Scripts geschlossen wird. Die Anzahl der max. möglichen PHP-Tasks ist aber begrenzt (IPS-Standard = 10). Sind alle 10 möglichen Tasks belegt, wandert der nächste IPS-Scriptaufruf (oder andere PHP-Aktivität) in die Warteschleife - bis wieder ein Task frei wird.
Die Folge ist: Dein System arbeitet die Befehle sehr stark verzögert ab.

Daher sollte man darauf achten, dass die Ressourcen (=PHP-Tasks) möglichst kurzfristig wieder freigegeben werden.
In diesem Fall würde ich dir ein Timer-Event empfehlen, welches nach Ablauf das Script erneut ansteuert.

Achtug bau möglichst keine so langen Sleep Befehle in die Skripte.
Das was Du erreichen willst kannst Du wie folgt eleganter hin bekommen

HM_WriteValueFloat(44311, "ON_TIME",  1200); 
HM_WriteValueBoolean(44311 , "STATE", true); 

Damit steuert der HM Aktor die Einschaltzeit und Dein Skript läuft nur so lange wie nötig.

Edit:

Da war rakete schneller und die Lösung mit dem Timer ist zwar universeller aber bei HM Funkaktoren nicht unbedingt nötig.

oh ja gute tipps danke.

hab den aktor im homematic konfigurator gesagt das er ein treppenhauslicht ist und 2 min an sein soll.
das macht er dann wenn ich direkt den taster drücke. giebt es da auch einen befehl von der ips aus das er des gleiche macht. oder geht des dann nur über „ON_TIME“? giebt es irgend wo eine liste was für befehle ich denn alles so bei homematic ausführen kann?

Genau das macht ON_TIME vor dem Schaltbefehl.
Damit sagst Du dem Aktor wie lange er an bleiben soll.
Geht aber nicht mit den Wired Aktoren soviel ich weiß.