FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: JensS am 13 April 2020, 17:45:04

Titel: [gelöst]Berechnung von "heute" bzw. "morgen"
Beitrag von: JensS am 13 April 2020, 17:45:04
Ich bekomme es nicht hin, eine absolute Zeit in Sekunden (z.B. 1586799000) als heute oder morgen darzustellen.
Es ist bestimmt ganz leicht - daher im Anfängerforum. Bitte gebt mir einen Tipp.

Gruß Jens
Titel: Antw:Berechnung von "heute" bzw. "morgen"
Beitrag von: Christoph Morrison am 13 April 2020, 18:00:02
Zum Verständnis: Möchtest du wissen, ob ein Zeitstempel heute oder morgen ist?
Kann dein Zeitstempel auch zu anderen Tagen passen, oder nur heute oder morgen?
Titel: Antw:Berechnung von "heute" bzw. "morgen"
Beitrag von: Otto123 am 13 April 2020, 18:03:02
Hallo Jens,

mir ist nicht klar was Du machen willst, aber ein Ansatz:
0 ist heute, 1 ist morgen.

{my $zeit=1586799000;;int(($zeit + 86400 - time)/86400)}

Ich frage damit die Zeit aus einem Kalender ab. Ergebnis sind die Tage bis zum Termin.

Gruß Otto
Titel: Antw:Berechnung von "heute" bzw. "morgen"
Beitrag von: JensS am 13 April 2020, 18:43:28
Danke für den Ansatz!
Ich versuche gerade, ein UserReading zu erstellen, um die nächste geplante Schaltaktion in einer ReadingsGroup anzuzeigen.
Hier die sub:sub KalenderReading($) {
my ($Geraet) = @_;
my $Kalenderdaten = fhem('get Kalender_fhem events format:custom="$t1 $t2" filter:field(summary)=~"'.$Geraet.'",mode=~"upcoming|start" limit:count=1');
my @array = split(/ /,$Kalenderdaten);
my $aktuell = time();
if ($array[0] eq '') {return "nicht geplant"}
elsif ($array[0] < $aktuell) {
my $zeit=$array[1];;int(($zeit + 86400 - time)/86400);
my $Bezug;
if ($zeit = 0){$Bezug = "heute"}elsif($zeit = 1){$Bezug = "morgen"}else{$Bezug = POSIX::strftime("%d:%m",localtime($array[1]))};
my $Ausgabe = POSIX::strftime("%H:%M",localtime($array[1]));
return "$Bezug $Ausgabe aus"}
elsif ($array[0] > $aktuell) {
my $zeit=$array[0];;int(($zeit + 86400 - time)/86400);
my $Bezug;
if ($zeit = 0){$Bezug = "heute"}elsif($zeit = 1){$Bezug = "morgen"}else{$Bezug = POSIX::strftime("%d:%m",localtime($array[0]))};
my $Ausgabe = POSIX::strftime("%H:%M",localtime($array[0]));
return "$Bezug $Ausgabe an"}
else {return "Fehler"}
}

Die heutigen Termine werden allerdings mit "morgen" dargestellt. Hab bestimmt was falsch kopiert.
Titel: Antw:Berechnung von "heute" bzw. "morgen"
Beitrag von: Otto123 am 13 April 2020, 18:47:02
Das geht so nicht, der Code war zur Anzeige in FHEMWEB.

Mein userReadings für die Tage bis zum Event
nextWasteDays {my $zeit=fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1);
             if (!defined $zeit) {$zeit=0}
my $day = int(($zeit + 86399 - time)/86400);
             $day?eval{$day>1?$day:"morgen"}:"heute"}


Hiermit erzeugst Du ja jetzt nichts sinnvolles:
my $zeit=$array[1];;int(($zeit + 86400 - time)/86400);

Du kannst so machen: my $zeit=int(($array[1] + 86400 - time)/86400);
bzw. weiter unten so:
my $zeit=int(($array[0] + 86400 - time)/86400);
Ich versteh noch nicht wo bei Dir heute oder morgen raus fällt  :-[

Ich hatte bei mir anstatt 86400, 86399 dazugezählt. Ich bin der Meinung und habe getestet, dass bei der get Abfrage quasi die nächste sekunde begonnen hat. Aber das musst Du mal probieren.
Titel: Antw:Berechnung von "heute" bzw. "morgen"
Beitrag von: JensS am 13 April 2020, 21:46:15
Danke nochmals für die Hilfe! Die Berechnung mit "int" hat's gebracht. So läuft es jetzt.
sub KalenderReading($) {
my ($Geraet) = @_;
my $Kalenderdaten = fhem('get Kalender_fhem events format:custom="$t1 $t2" filter:field(summary)=~"'.$Geraet.'",mode=~"upcoming|start" limit:from=0,count=1');
my @array = split(/ /,$Kalenderdaten);
my $aktuell = time();
if ($array[0] eq '') {return "nicht geplant"}
elsif ($array[0] < $aktuell) {
my $tage=int(($array[1])/86400)-int(time()/86400);
my $Bezug;
if ($tage==1){$Bezug = "morgen"}elsif($tage>1){$Bezug = POSIX::strftime("%d.%m.",localtime($array[1]))}elsif($tage==0){$Bezug = "heute"};
my $Ausgabe = POSIX::strftime("%H:%M",localtime($array[1]));
return "$Bezug $Ausgabe aus"}
elsif ($array[0] > $aktuell) {
my $tage=int(($array[0])/86400)-int(time()/86400);
my $Bezug;
if ($tage==1){$Bezug = "morgen"}elsif($tage>1){$Bezug = POSIX::strftime("%d.%m.",localtime($array[0]))}elsif($tage==0){$Bezug = "heute"};
my $Ausgabe = POSIX::strftime("%H:%M",localtime($array[0]));
return "$Bezug $Ausgabe an"}
else {return "Fehler"}
}

Gruß Jens