Zeitgesteuertes schalten

Leute ich werde heute noch blöd.

Ich hab meinen Roomba an einem Fibaro Zwischenstecker hängen. Dieser soll nur nachts über laden. Also habe ich folgendes Script erstellt

$Zeit = date ("His"); 
$Nachts = "2300"; 
$Tag = "0700"; 


If (( $Zeit > $Nachts) || ( $Zeit < $Tag))

{
ZW_SwitchMode(38634 /*[Devices\Steckdose Flur]*/, true); 
}
else
{  
ZW_SwitchMode(38634 /*[Devices\Steckdose Flur]*/, false); 
}  

?>

Egal ob ich das Script nun sekündlich oder stündlich ausführen lasse: Es bleibt immer nur ein Zustand. Sprich entweder er bleibt ein oder ausgeschaltet. Wo habe ich den Fehler?

Danke und viele Grüße

Flo

Das kann nicht funktionieren Du vergleichst völlig unterschiedliche Strings miteinander


$Zeit = date ("His");  
var_dump($Zeit);
$Nachts = "2300";
var_dump($Nachts);  
$Tag = "0700";
var_dump($Tag);

Wenn dann solltest Du Unix Timestamps miteinander vergleichen, da geht dann auch so was wie größer oder kleiner.


$currenttime = time();  
var_dump($currenttime);
 $day = strtotime("07:00");
 var_dump($day);
 $night = strtotime("23:00");
 var_dump($night);

Lösch das Script, öffne die Instanz des Zwischensteckers und klick oben auf Ereignisse.
Dort ein Ereignis hinzufügen täglich um 7 Uhr ausführen, Befehl zu schalten auf false eintragen. Und das gleiche noch mal für 23 Uhr auf true.
Michael

Danke Michael. Heute schon das zweite mal vorm verrückt werden gerettet :slight_smile: War zu einfach und läuft jetzt wie es soll :banghead:

@Fonzo:

Das Script läuft bei mir aber. Bewegungsmelder im Schlafzimmer schaltet das Licht am Kleiderschrank nur zwischen 20 Uhr abends und 9 Uhr morgens


<?
$Zeit = date ("Hi"); 
$Nachts = "2000"; 
$Tag = "0930"; 

if ((GetValueBoolean(25937 /*[Räume\Büro\Devices\Präsenzmelder\PRESENCEDETECTOR_TRANSCEIVER\Präsenz]*/) === true) && (( $Zeit > $Nachts) || ( $Zeit < $Tag)))
{
HM_WriteValueBoolean (30226 /*[Räume\Büro\Devices\Steckdose Kleiderschrank]*/, "STATE", true);
}
else
{
HM_WriteValueBoolean (30226 /*[Räume\Büro\Devices\Steckdose Kleiderschrank]*/, "STATE", false);
}

?>

Oder liegt das daran, dass hier noch die Variable vom Präsenzmelder abgefragt wird?

Nein das liegt daran das Du hier als String Stunden und Minuten vergleichst. Im Oberen Beispiel versuchst Du aber ein 4stelligen String mit einem 6stelligen String zu vergleichen weil Du auch die Sekunden mit rein nimmst, da kann keine Übereinstimmung rauskommen. Und bei größer kleiner würde ich immer Zahlen vergleichen mit einem String kann das ins Auge gehen. Die simpelste Lösung hat ja aber schon nall chan gesagt dann kannst Du das in dem Fall ganz vergessen.

Du meinst wegen dem „his“ ?

Das war ein letzter verzweifelter Versuch :wink:

Mit „Hi“ ging es auch nicht

Ja

Wie gesagt ich würde da Zahlen vergleichen, aber in dem Fall geht es ja auch ganz ohne Skript.

Hi Fonzo,

soweit korrekt. Ich versuche nur gerade zu verstehen, warum das so ist. Ich benötige das Script ja auch noch für ein paar andere Abläufe :slight_smile:

So will ich zum Beispiel auch, dass diverse Sonos im UG beim Einschalten des Präsenzmelders eine bestimmte Radiostation spielen aber nur zwischen 7:30 und 8:30 Uhr.

Ich würde grundsätzlich für sowas die DateTime Klasse nutzten, dafür ist diese auch da, dann geht da auch nichts schief.

„Hi“ sollte von der Formatierung her passen. Um die strings zu vermeiden sollte man dann noch intval ausführen um den String zum integer umzuwandeln, also intval(date(„Hi“)).

Aber wie schon korrekt erkannt, kann man das auch sehr schön mit Events lösen. Alternativ zu zwei zyklischen Events könnte man auch einen einzelnen Wochenplan benutzen. Aber ich denke hier funktionieren beide Ansätze gut und die genaue Realisierung ist eher Geschmackssache.