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

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

Vorheriges Thema - Nächstes Thema

Otto123

#75
Zitat von: TomLee am 02 Februar 2020, 19:00:43
Ich möchte dich bitten das mal nachzuvollziehen.
Nimm statt Google_Abfallkalender einen Dummy Google_Abfallkalender und verpasse diesem ein Reading nextWaste mit dem Wert Bioabfall_4.

cmd_1 des DOIF sollte beim ersten Mal ein Reading L_Bioabfall erstellen mit einer 1 als Wert jedes weitere cmd_1 erhöht das Reading um eins, jedes cmd_2 zieht eins ab, cmd_3 löscht das Reading L_Bioabfall.
Hab ich gemacht - er tut es wie Du sagst. System ist Jessie ... und auch unter einem zweiten System mit buster.
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

Dann hab ich keine Ahnung mehr was ich machen soll, zu doof die Raw Definition oder DEF zu übertragen bin ich nicht.

Otto123

Versuch es doch wie ich  mal  mit einem Dummy und nicht mit dem Calendar Modul...
Und beobachte den Eventmonitor während Du testest.
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

Unglaublich, wollte schon schreiben was soll das bringen im Test-System (Buster) klappts doch auch im Calendar-Device.

Bei einem Dummy klappen die Befehle (cmd_1-3) :o, aber das erstellte Reading heißt jetzt nicht L_Bioabfall sondern L_0 ::)

Es muss hiermit was nicht stimmen:

my $val1 = (ReadingsVal("$val","nextWaste","0"));
$val1 =~ s/_.*//;
$val1 = "L_"."$val1";


Darf/Kann man das wirklich so machen ?

Otto123

klingt vielleicht komisch aber nimm doch mal andere Variablen Namen. Nenn sie willi und willi1 :)
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

In du_Testy steht in nextwaste Bioabfall_4, aus der Kommandozeile ergibt {  my $val = "du_Testy";; my $val1 = (ReadingsVal("$val","nextWaste","0"));;$val1 =~ s/_.*//;;return $val1} 0

Ich will nicht mehr  ;D

TomLee

Habs.

in dem userreadings im Calendar-Device war (wieder) ein Leerzeichen zwischen Bioabfall und _4.
Das hatte ich schon korrigiert, hab aber scheinbar (meine Erklärung jetzt) später irgendwann wieder ein vorheriges Backup eingespielt, sonst wäre die korrekte Calendar-Device-Definition letzte Woche nicht auf dem Test-System gelandet  8)

Hier ist das Leerzeichen rot hervorgehoben  ;D:
ZitatnextWaste {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 $regex = qr/Abfuhrtermin.|in.|Buxtehude.|.am.\d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
my $nwd = "$result"."_"."$var2";
return $nwd}

carlos

Zitat von: Damian am 02 Februar 2020, 20:58:10
Ich habe mir jetzt mal calendar genauer angeschaut. Es ist mit wenigen Zeilen möglich, ohne zusätzliche Abfall-Module, die Tage zur Leerung in Readings zu packen und zu visualisieren, mein Code:

defmod myabfall DOIF subs {\
  sub days \
  {\
    my ($event)=@_;;\
    set_Reading($event,fhem('get cal events timeFormat:"%j" filter:field(summary)=~"'.$event.'" limit:count=1,from=0 format:custom="$T1"')-::strftime ('%j', localtime()))\
  }\
}\
init {[00:05];;fhem("set cal reload");;days("Altpapier");;days("Restmüll");;days("Bio");;days("Gelber");;days("Grünschnitt");;\
}
attr myabfall uiTable {\
  $TC{0..4}="align='center'";;\
  $SHOWNOSTATE=1;;\
}\
IMPORT ./contrib/DOIF/my_uiTable.tpl\
bin("yellow",[$SELF:Gelber])|bin("blue",[$SELF:Altpapier])|bin("grey",[$SELF:Restmüll])|bin("green",[$SELF:Bio])|bin("greengreen",[$SELF:Grünschnitt])


Um Mitternacht wird der Kalender aktualisiert und die entsprechenden Readings mit der Anzahl der Tage für die verschiedenen Abfallsorten erstellt. Zusätzlich habe ich sie noch über uiTable visualisiert. Die Funktion "bin" stellt die Eimer mit dem Counter dar.

Ergebnis im Anhang:

Das gefällt mir gut.
Würde das auch mit dem neuen SSCal module funktionieren?
Und wo gibt's die bin Funktion?
my_uitable.tpl gibt es zur Zeit nicht in .\contrib\DOIF  sonder nur  uiTable.tpl und da ist keine bin Funktion drin.

Gruß

Carlos
FHEM svn auf Intel NUC mit proxmox,1 UDOO, 3 Raspberry Pi, signalduino, nanoCUL, div. Homematic Komponenten, toom Baumarkt Funksteckdosen, einige sonoffs, hue, shelly

Damian

#83
Ich werde bald eine allgemeinere Funktion für die Counter-Darstellung ins DOIF einbauen, solange kannst du diese Datei mit der bin-Funktion nehmen.

Edit: Es funktioniert mit jedem Kalender, du musst nur die entsprechende Anzahl der Tage in ein Reading bekommen, damit du es über die bin-Funktion darstellen kannst. In meinem Beispiel ermittelt die days-Funktion die Anzahl der Tage bis zum Ereignis aus dem Calendar-Modul im Beispiel namens cal.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

cotecmania

Zitat von: TomLee am 02 Februar 2020, 21:41:08
Mich interessiert nur der nächste Termin und den gibts mit folgendem userreadings im Calendar-Device das aus diesem Thread entstanden ist.

nextWaste {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 $regex = qr/Abfuhrtermin.|in.|Buxtehude.|am.\d{1,2}\.\d{1,2}\.\d{4}/p;
my $result = $var1 =~ s/$regex//rg;
my $nwd = "$result"."_"."$var2";
return $nwd}



Danke für die Anregung. Mit 6 Userreadings das komplette ABFALL-Modul ersetzt für meine Zwecke :
nextBlaueTonneDays {return int((fhem('get '.$name.' events filter:field(summary)=~"Blaue Tonne" format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400)},
nextGelberSackDays {return int((fhem('get '.$name.' events filter:field(summary)=~"Gelber Sack" format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400)},
nextRestmuellDays {return int((fhem('get '.$name.' events filter:field(summary)=~"Restmüll" format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400)},
nextRestmuellWeekDay  { my @days = qw/So Mo Di Mi Do Fr Sa/;
                        my $date = fhem('get '.$name.' events filter:field(summary)=~"Restmüll" format:custom="$T1" limit:from=0,count=1');
                        my @date = split /\./,$date;
                        return $days[(localtime(timelocal(0,0,0,$date[0],$date[1]-1,$date[2]-1900)))[6]];
  },
nextGelberSackWeekDay { my @days = qw/So Mo Di Mi Do Fr Sa/;
                        my $date = fhem('get '.$name.' events filter:field(summary)=~"Gelber Sack" format:custom="$T1" limit:from=0,count=1');
                        my @date = split /\./,$date;
                        return $days[(localtime(timelocal(0,0,0,$date[0],$date[1]-1,$date[2]-1900)))[6]];
  },
nextBlaueTonneWeekDay { my @days = qw/So Mo Di Mi Do Fr Sa/;
                       my $date = fhem('get '.$name.' events filter:field(summary)=~"Blaue Tonne" format:custom="$T1" limit:from=0,count=1');
                       my @date = split /\./,$date;
                       return $days[(localtime(timelocal(0,0,0,$date[0],$date[1]-1,$date[2]-1900)))[6]];
  }
FHEM auf RaspberryPI B (buster)
2xCUL868 für MAX/Slow_RF, HM-LAN, JeeLink
MAX!/HM-Thermostate, FS20/HM-Rolladenschalter, FS20-EM, LevelJet-Ölstandsmessung, PCA301, IT, KM271, IPCAM, FireTAB10 FTUI

Otto123

Beachte mal noch Beitrag #43, sonst bekommst Du Fehlermeldungen beim Start von FHEM.
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

Damian

#86
siehe auch https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Anzahl_der_Tage_bis_zur_Abfall-Entsorgung

jetzt ohne zusätzliche externe Funktionen bzw. Module. Es reicht die Definition eines Kalenders (im Beispiel 'cal') mit Hilfe des Moduls calendar.

Die Bestimmung der Tage erfolgt zeitverzögert (60 Sekunden) über einen Timer, damit beim Start der Kalender Zeit bekommt seine Einträge zu aktualisieren.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

TomLee

#87
Hey Otto,

ich hab einen lichten Moment, bisher hab ich den Code aus #34 genutzt (der war nicht wirklich korrekt mein ich),  bestimmt konnt ich auch nicht immer folgen, mir gehts jetzt auch nicht mehr um die Tonne (ist aber das gleiche), mit {int((fhem('get cal_example events format:custom="$t1" limit:from=0,count=1',1) + 86399 - time) / 86400)} bekommt man wenn es Heute noch einen Termin gäbe die 1 zurück.

Wenn man immer von 00:00 bis 00:00 Uhr rechnet (wie am Anfang des Threads der Ansatz war) eine 0 (ohne int), für die Kommandozeile:

{my $t = fhem('get cal_example events timeFormat:"%F 00:00:00" format:custom="$T1" limit:from=0,count=1');;$t=(time_str2num($t) - time_str2num(strftime('%F 00:00:00',localtime(time))))/86400;;return $t;;}

Verstehst du mich, übersehe ich was, meinst du/siehst du die Möglichkeit es ginge weniger umständlich umzusetzen wenn ich richtig liege ?


edit:

Ich mags jetzt universeller ohne zusätzlich einen Startzeitpunkt anzugeben.

Otto123

Also mein userReadings zeigt die Zahl 4
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"},

Dein Code zeigt auch die Zahl 4

Aber ich  finde die Format hin und her Rechnerei umständlich. Am Ende bekommst Du das Gleiche. Was ist schlimm an dem int()?

Gruß Otto
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

#89
Wir reden aneinander vorbei, ich muss überlegen was ich sage, dein Code gibt morgen aus (meiner 0, wie gewünscht) obwohl jetzt noch ein Termin um 22:00 Uhr ist. Ich meld mich später oder morgen/die Tage.