[gelöst] Wie die Tage jetzt ohne Komma ?

Begonnen von TomLee, 24 August 2019, 15:31:52

Vorheriges Thema - Nächstes Thema

Otto123

#90
Ja ich habe es verstanden :) Meine Termine sind ja immer ganze Tage. ich denke nochmal drüber nach.

Meine Methode berechnet eigentlich nur die Zeit zum Termin in Sekunden und bildet dann Tage daraus. 00:00 spielt keine Rolle. Das ist natürlich nicht korrekt.

Deine Methode berechnet wirklich die Tage auf 00:00 Uhr bezogen. Ich habe verstanden...
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

#91
Zitatich denke nochmal drüber nach.

Zur Hilfe/Unterstützung, macht genau das was ich will (ich weiß da war der Hinweis es mit einem notify umzusetzen falls du mitgelesen hast):

defmod cal_example Calendar ical file ./beispiel.ics 86400
attr cal_example defaultFormat "$T1 $S"
attr cal_example hideOlderThan 0
attr cal_example room Kalender
attr cal_example userReadings t_001_summary:lastUpdate:.* {pc_ce2r($NAME,'0')},\
t_002_summary:lastUpdate:.* {pc_ce2r($NAME,'1')},\
t_003_summary:lastUpdate:.* {pc_ce2r($NAME,'2')},\
t_004_summary:lastUpdate:.* {pc_ce2r($NAME,'3')},\
t_005_summary:lastUpdate:.* {pc_ce2r($NAME,'4')},\
t_001_btime:lastUpdate:.* {pc_cb2r($NAME,'1','1')},\
t_002_btime:lastUpdate:.* {pc_cb2r($NAME,'2','3')},\
t_003_btime:lastUpdate:.* {pc_cb2r($NAME,'3','5')},\
t_004_btime:lastUpdate:.* {pc_cb2r($NAME,'4','7')},\
t_005_btime:lastUpdate:.* {pc_cb2r($NAME,'5','9')},\
t_001_bdate:lastUpdate:.* {pc_cd2r($NAME,'1','0')},\
t_002_bdate:lastUpdate:.* {pc_cd2r($NAME,'2','2')},\
t_003_bdate:lastUpdate:.* {pc_cd2r($NAME,'3','4')},\
t_004_bdate:lastUpdate:.* {pc_cd2r($NAME,'4','6')},\
t_005_bdate:lastUpdate:.* {pc_cd2r($NAME,'5','8')},\
t_001_daysleft:lastUpdate:.* {pc_cnd2r($NAME,'0')},\
t_002_daysleft:lastUpdate:.* {pc_cnd2r($NAME,'1')},\
t_003_daysleft:lastUpdate:.* {pc_cnd2r($NAME,'2')},\
t_004_daysleft:lastUpdate:.* {pc_cnd2r($NAME,'3')},\
t_005_daysleft:lastUpdate:.* {pc_cnd2r($NAME,'4')},\
test {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"},

setstate cal_example triggered
setstate cal_example 2021-04-09 22:32:44 lastUpdate 2021-04-09 22:32:42
setstate cal_example 2021-04-09 22:32:44 nextUpdate 2021-04-10 04:32:42
setstate cal_example 2021-04-09 22:32:44 nextWakeup 2021-04-09 23:00:00
setstate cal_example 2021-04-09 22:32:44 state triggered
setstate cal_example 2021-04-09 22:32:44 t_001_bdate 09.04.2021
setstate cal_example 2021-04-09 22:32:44 t_001_btime 22:00
setstate cal_example 2021-04-09 22:32:44 t_001_daysleft 0
setstate cal_example 2021-04-09 22:32:44 t_001_summary Löffel
setstate cal_example 2021-04-09 22:32:44 t_002_bdate 10.04.2021
setstate cal_example 2021-04-09 22:32:44 t_002_btime 14:00
setstate cal_example 2021-04-09 22:32:44 t_002_daysleft 1
setstate cal_example 2021-04-09 22:32:44 t_002_summary Badeschaum
setstate cal_example 2021-04-09 22:32:44 t_003_bdate 11.04.2021
setstate cal_example 2021-04-09 22:32:44 t_003_btime 12:00
setstate cal_example 2021-04-09 22:32:44 t_003_daysleft 2
setstate cal_example 2021-04-09 22:32:44 t_003_summary Sonntag
setstate cal_example 2021-04-09 22:32:44 t_004_bdate 15.04.2021
setstate cal_example 2021-04-09 22:32:44 t_004_btime 15:00
setstate cal_example 2021-04-09 22:32:44 t_004_daysleft 6
setstate cal_example 2021-04-09 22:32:44 t_004_summary Kadur
setstate cal_example 2021-04-09 22:32:44 test heute


##############################################
# $Id: Abfall_myUtils.pm 7900 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;

use strict;
use warnings;

sub Calendar_Utils_Initialize {
  my $hash = shift//return;
  return;
}

# Enter you functions below _this_ line.

sub au_nwd {
my $NAME = shift;
my $var1 = int((fhem('get '.$NAME.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
return $var1;
}

sub au_nwf {
my $NAME = shift;
my $var1 = fhem('get '.$NAME.' events format:custom="$S" limit:from=0,count=1',1);
my $var2 = int((fhem('get '.$NAME.' events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400);
my @tonne = split (/ /,$var1);
my $nwd = "$tonne[1]"."_"."$var2";
return $nwd;
}

sub au_nw {
my $NAME = shift;
my $var1 = fhem('get '.$NAME.' events format:custom="$S" limit:from=0,count=1',1);
my @tonne = split (/ /,$var1);
return $tonne[1];
}

sub au_nwda {
my $NAME = shift;
my $var1 = fhem('get '.$NAME.' events format:custom="$T1" limit:from=0,count=1',1);
my @dat = split (/ /,$var1);
return $dat[0];
}

sub au_fh {
my $NAME = shift;
my $var1 = ReadingsVal($NAME,"nextWaste","0") =~ "Restabfall/Wertstoffe|Bioabfall"?"1":"0";
return $var1;
}

sub pc_ce2r {
    my $NAME = shift;
    my $index = shift;
    my $t = fhem('get '.$NAME.' events format:custom="$S" limit:from=0,count=5',1);
    my @a= split("\n",$t);
    my $ii = sprintf("t_%03.0f", $index + 1);
    if (!defined $a[$index]) {
       fhem("deletereading $NAME ".$ii."_summary");
       return;
    }
    return $a[$index];
}

sub pc_cb2r {
    my $NAME = shift;
    my $ii = shift;
my $aindex = shift;
$ii = sprintf("t_%03.0f", $ii);
    my $t = fhem('get '.$NAME.' events format:custom="$T1" limit:from=0,count=5',1);
$t =~ s/\n/ /g;
    my @a = split (/ /,$t);
    if (!defined $a[$aindex]) {
       fhem("deletereading $NAME ".$ii."_btime");
       return;
    }
    return $a[$aindex];
}

sub pc_cd2r {
    my $NAME = shift;
    my $ii = shift;
my $aindex = shift;
$ii = sprintf("t_%03.0f", $ii);
    my $t = fhem('get '.$NAME.' events format:custom="$T1" limit:from=0,count=5',1);
$t =~ s/\n/ /g;
    my @a = split (/ /,$t);
    if (!defined $a[$aindex]) {
       fhem("deletereading $NAME ".$ii."_bdate");
       return;
    }
    return $a[$aindex];
}

sub pc_cnd2r {
    my $NAME = shift;
my $index = shift;
my $t = fhem('get '.$NAME.' events timeFormat:"%F 00:00:00" format:custom="$T1" limit:from=0,count=5',1);
    my @a = split (/\n/,$t);
    my $ii = sprintf("t_%03.0f", $index + 1);
    if (!defined $a[$index]) {
       fhem("deletereading $NAME ".$ii."_daysleft");
       return;
    }
return (time_str2num($a[$index]) - time_str2num(strftime('%F 00:00:00',localtime(time))))/86400;
}
1;


Es geht nur um pc_cnd2r ganz unten in der myUtils.

Otto123

Ich hatte noch eine Idee
{my $t = fhem('get AbfallKalender events format:custom="$t1" limit:from=0,count=1');;$t=int($t/86400) - int(time/86400);;return $t}
aber das funktioniert nur bei UTC.
Deine Variante bezieht Zeitzone und Sommerzeit ein: korrekt und ich denke geht nicht kürzer. Warum auch, ist doch nachvollziehbar. ;)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

#93
Zitateinen lichten Moment

aber nur was das rechnen anging (von 00:00 bis 00:00 Uhr), was die wirklich verbleibenden Tage angeht muss man wieder einen Tag abziehen  8):

Zitatsub pc_cnd2r {
    my $NAME = shift;
   my $index = shift;
   my $t = fhem('get '.$NAME.' events timeFormat:"%F 00:00:00" format:custom="$T1" limit:from=0,count=5',1);
    my @a = split (/\n/,$t);
    my $ii = sprintf("t_%03.0f", $index + 1);
    if (!defined $a[$index]) {
       fhem("deletereading $NAME ".$ii."_daysleft");
       return;
    }
   return (time_str2num($a[$index]) - time_str2num(strftime('%F 00:00:00',localtime(time))-86400))/86400;
}

edit: stimmt nicht, ich hab immer noch irgendwas nicht verstanden

Otto123

jetzt kann ich Dir nicht folgen, Du willst die Tage bis zu den nächsten 5 Terminen ermitteln?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Das macht ja schon die myUtils die ich gezeigt habe.

Mein Verständnisproblem liegt (meine Vermutung und werd ich mich mit beschäftigen) am Aktualisierungsintervall (hier 86400), das, so wie ich meine bisher verstanden zu haben (aber ich gebe zu noch nicht wirklich nachvollzogen/verstanden zu haben) dann auch kurz nach/um 00:00 Uhr zu erfolgen hat und nicht 86400 Sekunden nach der Definition ?

Vermute onCreateEvent könnte Abhilfe schaffen, habs aber noch nicht ausprobiert/auch noch nicht verstanden  8) ? => wie gesagt werd mich mit befassen.


Otto123

Das Aktualisierungsintervalll hat nichts mit dem Kalender zu tun - wenn er sich nicht ändert. Im Falle Abfall lese ich nur einmal.
Wenn allerdings nichts passiert (im Kalender) dann gibt es auch keine Events und es wird nichts neu berechnet. Das aber mit der Aktualisierung zu umschiffen finde ich "dünn"  :D
Wenn man täglich was aktualisieren muss, muss man es triggern und dabei den Zeitpunkt richtig wählen.
Wenn man früh um 4 neu berechnet muss es für den Tag stimmen.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

ZitatIm Falle Abfall lese ich nur einmal.

Und wie machst du das nur einmal lesen ?

In der Doku steht:
ZitatDer optionale Parameter interval bestimmt die Zeit in Sekunden zwischen den Updates. Default-Wert ist 3600 (1 Stunde).
Eine Intervallangabe von 0 ist nicht erlaubt. Diese wird automatisch durch den Standardwert 3600 ersetzt und im Log protokolliert.

=> versteh ich so: wenn ich den Parameter weglasse alle Stunde gelesen wird. Nur einmal im Jahr kann ich mir nach meinem bisherigen Verständnis mit einem Wert größer als  Jahr (31536000) vorstellen, weil dann wird nur einmal gelesen bei der Definition, macht bei der Tonne aber ja auch keinen Sinn, den erstellst ja nach etwa einem Jahr neu ?

ZitatWenn man täglich was aktualisieren muss, muss man es triggern und dabei den Zeitpunkt richtig wählen.
Wenn man früh um 4 neu berechnet muss es für den Tag stimmen.

trigger für nextWakeup ist doch immer der Startzeitpunkt des nächsten Termin, mein ich bis jetzt so verstanden zu haben, dann gibts doch auch Events für die Berechnung (von bspw. userReadings). Für normale Termine doch ausreichend oder nicht, da gibts doch keinen Bedarf den richtigen Zeitpunkt für einen trigger zu wählen.
Und beim Abfall musss man sich dazu doch auch keine Gedanken machen wenn der Startzeitpunkt um 00:00 gesetzt ist (oder sagen wir zw. 00:00-04:00).

Und was meine Aussage mit dem abziehen eines Tages  betrifft kann ich das dooferweise heute nicht wieder nachvollziehen, Fakt ist am FTUI-Tablet (das hat ab und an WLAN-Probleme, darum Wert evt. nicht aktualisiert) wurden gestern 3 verbleibende Tage angezeigt bis zum Mittwoch, statt zwei, was mich gewundert hatte.
Dann bin ich wsl. gleich in die myUtils um einen Tag abzuziehen, statt zuvor mal im Calendardevice zu schauen was dort steht.

Otto123

sorry - ich habe gelogen. Aber: Ich habe Tagestermine und erzeuge einen halben Tag vorher einen Alarm Event:
attr AbfallKalender onCreateEvent { $e->{alarm}= $e->{start}-43200 }
mit dem Attribute kann man ein update doch komplett verhindern? Wollte ich mal einbauen/testen - wirklich ;)
update none|onUrlChanged
Wird dieses Attribut auf none gesetzt ist, wird der Kalender überhaupt nicht aktualisiert.
Wird dieses Attribut auf onUrlChanged gesetzt ist, wird der Kalender nur dann aktualisiert, wenn sich die URL seit dem letzten Aufruf verändert hat, insbesondere nach der Auswertung von wildcards im define.


Intervall steht bei mir derzeit auf 86400

Ansonsten bin ich immer noch der Meinung: Deine Berechnung stimmt und geht nicht kürzer - habe noch eine andere Methode ausprobiert wird aber viel länger (Zeitzone "berechnen")
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Popcorn-Zeit vorbei, meine es jetzt endlich verstanden zu haben.

Im Rhein-Pfalz-Kreis gibts die Möglichkeit sich die ical-File zu konfigurieren

Mein Fehler war das ich von 0 Uhr bis 0 Uhr ausgewählt hatte, das bedeutet Startzeitpunk war auch Endzeitpunkt  ::)

Wenn ich von 0 Uhr bis 13 Uhr einstelle hab ich das Verhalten was ich möchte, mit der Berechnung die ich vorgeschlagen habe.

Bis 13 Uhr (Endzeitpunkt) bekomme ich Heute (Bioabfall) noch eine 0 zurück (das FTUI-Icon dreht sich bei 0) nach 13 Uhr (nextWakeup) die 7 für Restabfall nächste Woche Mittwoch.

Ich konnts bis jetzt noch nicht testen (weil noch keine 13 Uhr)  :P und ich noch nicht weiß wie man dieses Zeitformat 20211123T230000Z nennt und selbst berechnen kann, im Konfigurator sind nur volle Stunden auswählbar.

Otto123

#100
Zitat von: TomLee am 14 April 2021, 12:46:30
ich noch nicht weiß wie man dieses Zeitformat 20211123T230000Z nennt
Das ist doch ISO8601 ? Edit: nein nur fast oder so ähnlich  ::) oder doch? Variante
Kann auch beim at verwendet werden https://fhem.de/commandref_DE.html#at
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

#101
Nehmen wir die Angaben in der ics vom 21.04.2021

DTSTART:20210420T220000Z
DTEND:20210421T110000Z


Wenn das (YYYY-MM-DDTHH:MM:SS) sein soll, dann komm ich nicht mit, es ist ein Startzeitpunkt von 0 Uhr und Endzeitpunkt von 13 Uhr koniguriert und wird mir auch so in Calendar angezeigt:

21.04.2021 00:00 21.04.2021 13:00 Abfuhrtermin Restabfall/Wertstoffe am 21.04.2021


edit: es wird mir doch weiterhin Bioabfall angezeigt  :-X
Doch es klappt, weiß der Teufel was schon wieder schiefging ich hatte extra FHEMWEB zweimal aktualisiert.

Otto123

#102
Z steht für UTC :) mit unserer Sommerzeit zwei Stunden zurück

Wird ja aber in Deiner Formel (die ich mal probiert hatte) durch localtime berücksichtigt!
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Otto123

#103
Ich habe mal noch folgende (schräge?) Idee probiert:
das userReadings erweitert:
TomLee:trigger:.trigger {my $t = fhem('get '.$name.' events timeFormat:"%F 00:00:00" format:custom="$T1" limit:from=0,count=1');
return (time_str2num($t) - time_str2num(strftime('%F 00:00:00',localtime(time))))/86400}


Wenn man jetzt ein
setreading AbfallKalender trigger trigger absetzt, wird genau zu diesem Zeitpunkt das Reading neu berechnet. Der Kalender selbst muss dazu nicht reload oder update machen. 

Edit:
Man kann ein paar Dinge einfach weglassen :)
{return (time_str2num(fhem('get '.$name.' events timeFormat:"%F" format:custom="$T1" limit:from=0,count=1',1)) - time_str2num(strftime '%F',localtime))/86400}
Gerade bemerkt: update none bewirkt nicht, dass nicht im eingestellten Intervall getriggert wird. Eventuell wird der Kalender nicht gelesen?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Ich probiers heute Abend, die Tage an, jetzt kann ich nicht mehr.