Hauptmenü

Frage zu "$hour"

Begonnen von sun1907, 23 Januar 2013, 06:53:47

Vorheriges Thema - Nächstes Thema

sun1907

Ich habe im Wiki diesen Code ("Heizung mit Bewegungsmelder steuern") gefunden und diesen einfach für eine Beleuchtung im Wohnzimmer umgebaut, statt zur Steuerung der Heizung.
Hier dazu der Code:
define WZ_Lampe notify Bewegungsmelder:on.* { if($hour < 23 || $hour >= 6) { fhem ("delete reset_Lampe_WZ ;; set Standlampe on ;; define reset_Lampe_WZ at +00:30:00 set Standlampe off ;;;; set Bewegungsmelder off") } }


Was ich aber nun nicht verstehe: im Wiki-Code ist beschrieben:
Zitatif($hour < 1 || $hour >= 7) {\
Beschreibung:
ZitatIn der zweiten Zeile wird geprüft, ob es nicht zwischen 1 Uhr nachts und 7 Uhr morgens ist, da Auslösungen in dieser Zeit vermutlich nur zufällig oder einmalige Ereignisse sind

eigentlich sollte ja laut Beschreibung und demnach (Original)Code in der Zeit zwischen 1 Uhr und 7 Uhr, bzw. in meinem Code zwischen 23 Uhr und 6 Uhr KEINE! Reaktion, also keine Schaltung stattfinden, oder ?.
Nur leider tut es das.
Wie lautet denn die richtige Bezeichnung, wenn ich als Beispiel wie in meinem Code ein "Offline" des Bewegungsmelders zwischen 23 Uhr und 6 Uhr erreichen will, damit er in dieser Zeit auch bei Bewegung nichts tut ?..

Rein praktisch würde ich das ja laut dem Originalcode (hour < 1 || $hour >= 7) so lesen:
Wenn kleiner 1 Uhr oder größer 7 Uhr, dann tue nichts.
Muss es nicht eher lauten:
Wenn größer 1 Uhr und kleiner 7 Uhr, also eher: hour > 1 && $hour <= 7


Danke für jede Antwort.


jhohn

{ if($hour < 23 || $hour >= 6) -> wenn $hour kleiner 23 oder größer-gleich 6 -> wenn Uhrzeit 00:00 - 22:59 oder 06:00 - 23:59 ->  ganzer Tag
FHEM auf Synology Diskstation DS413j (DSM4.3), HM LAN Adapter
Steuerung für Nachtspeicheröfen:
Ladung:   HM-WDS10-TH-O, HM-LC-Sw4-DR, Weather-Modul
Gebläse: HM-CC-TC, HM-LC-SW1-FM, HM-Sec-RHS
FHEM auf FritzBox 7390 für Telefon Funktionen

Zrrronggg!

Das Originalbeispiel kommt von mir und funktioniert ausdrücklich NUR für Zeiten nach 0 Uhr.

if($hour < 1 || $hour >= 7) löst nämlich aus, wenn die Uhrzeit (Stunde) entweder kleiner ist als 1 (also von 0-0:59 Uhr Nachts) oder grösser ist als 6, also von 8-23:59 Uhr


Daher gibt's im Originalcode KEINE Auslösung zwischen 2 und 6, weil da keine der beiden Bedingungen zutrifft. Um 5 Uhr z.b. ist die Stundenzahl 5 grösser als 1,(und somit trifft die erste Bedingung nicht zu) und ausserdem kleiner als 7 (und somit trifft die zweite Bedingung auch nicht zu), also passiert nichts.

Man kann in dem Code aber die erste Zahl nicht auf 23 Uhr setzen, weil einfach jede Uhrzeit (Stunde) entweder kleiner ist als 23 Uhr (alls Uhrzeiten ausser 22:59 -25:59 Uhr)
oder grösser Sieben (das deckt dann auch 22:59 -25:59 Uhr ab).


Mit anderen Worten: Der Code im Wiki ist korrekt, kann aber nicht so wie du es gemacht hast für Zeiten vor 0 Uhr verändert werden.

Was du machen willst muss man anders lösen. Wenn du damit leben kannst, das die Heizung auch nach 23 Uhr bis 23:59 noch angeht, kannst du das Konstrukt vereinfachen;
if($hour >= 6)
macht die Heizung bei Bewegung ab 6:00 Uhr an.

Ich wollte ja explizit erreichen, das die Heizung auch nach 0 Uhr noch angeht, weil ich nun mal kaum vor 2 Uhr ins Bett gehe.

FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

sun1907

LIeber @Zrrronggg

SORRY!!. Ich wollte dich oder deinen Code nicht schlecht stellen.
Ganz im Gegenteil. Sorry, wenn es so rüberkam. Vielmehr DANKE für deine ausführliche Antwort und Beschreibung. Damit hast du mir auch die Sache super erklärt.

Genauso dir @jhohn. Aich dir DANKE für die Antwort.

Zrrronggg!

ZitatSORRY!!. Ich wollte dich oder deinen Code nicht schlecht stellen.
Ganz im Gegenteil. Sorry, wenn es so rüberkam.

Wieso, nee, kam's gar nicht. So habe ich das nicht aufgefasst. Wollte nur helfen und erläutern, wann der Code geht und wann nicht.
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

Zrrronggg!

Hinweis in Wikitext eingebaut.
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

sun1907

Eine Frage an die Programmierprofis.

Ich baue täglich mehr und mehr Features in meine FHEM-Konfiguration.
Nur beiße ich mir die Zähne an dieser Frage aus:

Wenn ich eine Bedingung in einem bestimmten Zeitraum schalten möchte, gibt es entweder die Möglichkeit zu sagen:
(Fall 1):

define Beispiel1 notify Beispiel2 {\
 if ((Value("Beispiel3") eq "on") && (Value("Beispiel4") eq "on")) {\
  fhem ("set Beispiel5 on") if($hour >= 8 && $hour <= 10);;\
 }\
}

 
 oder ich sage
(Fall2):

  define Beispiel1 notify Beispiel2 {\
  my $hm = sprintf("%%02d:%%02d", $hour, $min);;\
  if ( $hm gt "08:00" && $hm lt "11:00" &&\
  $value{Beispiel3} eq "on" &&\
  $value{Beispiel4} eq "on") {\
  fhem ("set Beispiel5 on");;\
 }\
}


Meine Frage ist nun folgende. Muss ich das "my $hm = sprintf("%%02d:%%02d", $hour, $min)" jedes Mal neu definieren, oder reicht es einmal
und ich könnte es dann auch kürzer nutzen ?.
Mein Ziel ist es, dass ich mit "if($hour >= 8 && $hour <= 10)" immer nur von Stunde bis Stunde darstellen kann. Ich möchte aber nicht nur volle Stunden nutzen, sonder auch Minuten, also als Beispiel:
"if($hour >= 08:30 && $hour <= 10:15)"
Oder kennt/weiß jemand zu meinem Wunsch eine schnelle, bessere Methode ?

Vielen Dank im Voraus...

broadway

Ich habe mir zu dem Zweck eine Funktion in der 99_utils.pm erstellt. Vielleicht hilft's dir:

# Ermittelt, ob Zeit1 vor oder nach Zeit2 liegt.
# Zeit1 liegt vor Zeit2: earlier
# Zeit1 liegt nach Zeit2: later
# beide gleich: same

 sub GetRelativeTime($$) {
 my ($h1,$m1,$s1) = split(":", shift);
 my ($h2,$m2,$s2) = split(":", shift);
 $s1 = 0 if(!$s1);
 $s2 = 0 if(!$s2);

if(($h2 > $h1)||(($h2 == $h1)&&($m2 > $m1))){return "earlier";}
elsif(($h1 > $h2)||(($h1 == $h2)&&($m1 > $m2))){return "later";}
elsif(($h2 == $h1)&&($m2 == $m1)){return "same";}
}


Man kann die Zeiten so "12:02" angeben oder mit Sekunden "12:02:13". Ich vergleiche aber nur auf Minuten, ist aber schnell hinzu programmiert.

Anwendungsbeispiel:

my $rel=GetRelativeTime("13:40","14:24");
if("$rel" eq "earlier"){fhem "set dummy on";}
Linksys NSLU2 debian + CUL | FHT80B, FS20, Elro