Guten Abend, kurze Anfängerfrage: Gibt es einen Befehl, mit dem man ein ReadingsTimestamp formatieren kann? Ich dachte an
{return strftime('%k:%M %A (%d.%b)', ReadingsTimestamp($name, "state", ""))}
das ergibt aber die Fehlermeldung
Error evaluating Klingel stateFormat: Usage: POSIX::strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1) at (eval 204225) line 1.
Für einen Link, mit welchem Befehl das geht, wäre ich dankbar. Oder muss man das "mit der Hand stricken"? Die SuFu hat unter "ReadingsTimestamp formatieren" auch nichts ergeben.
z.B. so:
{
ReadingsTimestamp($name,"state","") =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;
return "Datum: $3.$2.$1, Uhrzeit: $4";
}
Gruß
Dan
Danke!
Gesendet von iPad mit Tapatalk Pro
Ich verstehe hier gerade nur Bahnhof. Kann einer vielleicht ein "vorher / nachher" Vergleich posten?
Gesendet von meinem S3_32 mit Tapatalk
Vorher:
2017-08-17 01:20:54
Nachher:
Datum: 17.08.2017, Uhrzeit: 01:20
Gruß
Dan
Ich kann jetzt präziser sagen, was ich eigentlich wollte. Ich möchte statt eines Tages nur den Wochentag und die Uhrzeit ohne Sekunden anzeigen. Ich mache das jetzt so:
sub WeekdayAndTimeFromTimestamp($){
my ($TimeStamp) = $_[0];
my @days = qw/Son Mon Die Mit Don Fre Sam/;
$TimeStamp =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;
my $wday = $days[(localtime(timelocal(0,0,0,$3,$2-1,$1-1900)))[6]];
return "$wday $4";
}
und diese Funktion wird einfach auf den ReadingsTimestamp angewandt. Sieht dann so wie im Anhang aus.
Zitat von: DeeSPe am 17 August 2017, 07:52:27
{
ReadingsTimestamp($name,"state","") =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;
return "Datum: $3.$2.$1, Uhrzeit: $4";
}
Vorher:
2017-08-17 01:20:54
Nachher:
Datum: 17.08.2017, Uhrzeit: 01:20
Gruß
Dan
Hallo, das ist super, hilft weiter. Wie mache ich aber aus 2017 ein 17?
lg c
Zitat von: choetzu am 29 Mai 2018, 20:59:26
Hallo, das ist super, hilft weiter. Wie mache ich aber aus 2017 ein 17?
2000 abziehen...
Achso, jetzt bin ich schlauer ;) danke für die Super Hilfe.. müsste also wie folgt gehen
{
ReadingsTimestamp($name,"state","") =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;
return "Datum: $3.$2.$1[b](minus 2000 abziehen gemäss Betateilchen)[/b], Uhrzeit: $4";
}
:)
Ernsthaft. Ich weiss dass $1 fürs Jahr steht und aus (\d+) genommen wird. Ich möchte aber nur die 2 letzten Zahlen.aber das wars schon...
ReadingsTimestamp($name,"state","") =~ /^20(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;
Gruß
Dan
Zitat von: choetzu am 29 Mai 2018, 21:26:35
return "Datum: $3.$2.$1[b](minus 2000 abziehen gemäss Betateilchen)[/b], Uhrzeit: $4";
das war doch schon fast richtig. Einfach noch die richtige perl Syntax und alles wird gut.
return "Datum: $3.$2.".$1-2000.", Uhrzeit: $4";
Beides klappt hervorragend! Und ich dachte -2000 wär ein Witz :) danke, ich versteh es auch jetzt.
Gibt es eigentlich eine Möglichkeit den Timestamp generell standartmässig im FEHM zu ändern? Oder ginge dann nix mehr?
Hm, hm ... aber mit beiden Lösung kommst du in knapp 82 Jahren doch wieder hier her weil dann wieder die Ausgabe nicht passt ... (duck und weg)
Nun, man könnte den Regex abändern in:
^(\d\d)(\d\d)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$
Dann ist das Jahr in $1$2 und $2 entspricht den letzten beiden Ziffern.
Dann ist das auch Y2K1C tauglich ;)
Nachtrag: Allerdings verschiebt es das Problem nur um weitere 7900 Jahre.
Zitat von: Wzut am 30 Mai 2018, 07:21:53
aber mit beiden Lösung kommst du in knapp 82 Jahren doch wieder hier her weil dann wieder die Ausgabe nicht passt ...
Zitat von: CQuadrat am 30 Mai 2018, 08:00:38
Nachtrag: Allerdings verschiebt es das Problem nur um weitere 7900 Jahre.
ok, ok...
return "Datum: $3.$2.".substr($1,length($1)-2,2).", Uhrzeit: $4";
übrigens ist substr() ressourcenschonender als das ganze regex-Gedöns.
Zitat von: choetzu am 29 Mai 2018, 22:42:23
Und ich dachte -2000 wär ein Witz
Mathematik, Grundschule: 2017-2000 = 17. Was ist daran witzig?
Zitat von: choetzu am 29 Mai 2018, 22:42:23
Gibt es eigentlich eine Möglichkeit den Timestamp generell standartmässig im FEHM zu ändern?
nein.
Zitat von: betateilchen am 30 Mai 2018, 10:12:52
Was ist daran witzig?
nix, ich habe nur vor lauter Recherche im Forum und den vielen Bäumen in Form von \d+ nicht an diese einfache mathematische Variante bei $1 gedacht. Aber fürs nächste Mal weiss ich: der Mann macht keine Witze... ;)
Danke für Eure Hilfe... Das hat mir sehr geholfen..
Zitat von: andies am 17 August 2017, 11:44:03
sub WeekdayAndTimeFromTimestamp($){
my ($TimeStamp) = $_[0];
my @days = qw/Son Mon Die Mit Don Fre Sam/;
$TimeStamp =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;
my $wday = $days[(localtime(timelocal(0,0,0,$3,$2-1,$1-1900)))[6]];
return "$wday $4";
}
hallo nochmals,
ich möchte nun zusätzlich zu meinem StateFormat unten die Wochentage wie oben mit integrieren.
{
ReadingsTimestamp($name,"state","") =~ /^(\d\d)(\d\d)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;
return "$4.$3.$2,$5";
}
wenn ich aber folgendes mache, geht das nicht.. sorry, aber hier hören meine Kenntnisse auf...
{
my ($TimeStamp) = $_[0];
my @days = qw/So Mo Di Mi Do Fr Sa/;
$TimeStamp =~ /^(\d\d)(\d\d)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;
my $wday = $days[(localtime(timelocal(0,0,0,$3,$2-1,$1-1900)))[6]];
return "$wday $4.$3.$2,$5";
}
gibts da keinen einfacheren Weg die Wochentage aufzuschlüsseln? $wday gibt ja nur die Nummer aus.
danke..
Ich bin mir da jetzt nicht so sicher, ist ja ewig her und ich kann gerade nicht wirklich. Aber bei den regulären Ausdrücken ist das so, dass man mit den Klammern am Ende zugreift. Also wenn Du schreibst
$TimeStamp =~ /^(\d\d)(\d\d)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;
dann ist die erste Variable $1 in der ersten Klammer enthalten und das ist (\d\d). Da der typische Timestamp nun mal so aussieht
2018-04-12 usw
wird die erste Variable in den nächsten 82 Jahren immer 20 sein. Bei mir war das anders. Ich hatte ja geschrieben
$TimeStamp =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;
und damit ist $1 bei mir 2018. Das ist nur noch sieben Monate so. Da liegt dann am Ende der Fehler begraben, weil $2 usw (die Zahlen in der zweiten, dritten etc Klammer) bei Dir Folgefehler sind.
hallo andie
herzlichen dank, aber offensichtlich hast du mich vermutlich missverstanden. Deine Erklärung ist mir klar und eigentlch auch für mich ziemlich logisch. :)
Mir geht es lediglich darum, dass ich nun zusätzlich den Wochentag in Form von DI, MI, DO etc ergänzen möchte. So wie du das ursprünglich gemacht hast...
Klar genug? ;)
Lg c
Ja, das müsste gehen. Zuerst extrahierst Du die Nummer des Wochentages
my $wday = $days[(localtime(timelocal(0,0,0,$3,$2-1,$1-1900)))[6]];
indem du aus den Klammern Jahr ($1), Monat ($2) usw herausliest und an die sechste Stelle der Funktion timelocal schickst. Und der Nummer (Zahl von 0 bis 6) ordnest du vorher den Wochentagstext via
my @days = qw/SO MO DI MI DO FR SA/;
zu. Days machst dann aus der Zahl den Wochentag.
Oder zeig doch mal die Fehlermeldung?
hallo, danke, wir kommen der Sache schon näher ;)
Ich verstehe deinen Satz "indem du aus den Klammern Jahr ($1), Monat ($2) usw herausliest und an die sechste Stelle der Funktion timelocal schickst." nicht ganz.
ich habe es wie folgt probiert:
{
my @days = qw/SO MO DI MI DO FR SA/;
my $wday = $days[(localtime(timelocal(0,0,0,$3,$2-1,$1-1900)))[6]];
ReadingsTimestamp($name,"state","") =~ /^(\d\d)(\d\d)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;
return "$wday $4.$3.$2,$5";
}
als Fehlermeldung kommt:
[Thu May 31 16:12:49 2018] fhem.pl: Use of uninitialized value $2 in subtraction (-) at (eval 436439) line 3.
[Thu May 31 16:12:49 2018] fhem.pl: Argument "\n my @days = qw/SO MO DI MI DO FR SA/;\n my $wday = $..." isn't numeric in subtraction (-) at (eval 436439) line 3.
2018.05.31 16:12:49 1: Error evaluating Arlo_Restart_Dummy stateFormat: Month '-1' out of range 0..11 at (eval 436439) line 3.
erst mal kurz, muss gleich los: Du hast einen langen Ausdruck, regex. In dem Ausdruck sind bestimmte Teile eingeklammert. Der Teil des Ausdruckes, der im ersten Klammerpaar zwischen ( und ) steht, steht nachher in der Variable $1. Der teil des Ausdrucks, der im zweiten Klammerpaar zwischen ( und ) steht, steht nachher in der Variable $2 usw usf.
danke andies
sorry, offensichtlich drücke ich mich missverständlich aus.. was du beschreibst ist für mich soweit klar. wo ich jedoch Probleme habe ist mit dem entziffern von
$days[(localtime(timelocal(0,0,0,$3,$2-1,$1-1900)))[6]];
was bedeuten die 0 und was die [6]?
Noch unterwegs http://perldoc.perl.org/functions/localtime.html
Super, das hat geholfen... wer folgendes Format im StateFormat haben will, muss unten stehenden Code eingeben.
DO, 31.5., 23:33
{
my @days = qw/SO MO DI MI DO FR SA/;
ReadingsTimestamp($name,"state","") =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;
my $wday = $days[(localtime(timelocal(0,0,0,$3,$2-1,$1-1900)))[6]];
return "$wday, $3.$2., $4";
}
Herzlichen dank
Hey, ich habe das in mein erstes SUB in MyUtils packen wollen. Hat irgendwie nicht geklappt.
MyUtils99 Eintrag:
sub choetzutime($) {
my ($device) = @_;
my @days = qw/SO MO DI MI DO FR SA/;
my @month = qw/Jan Feb Mar Apr May Jun Jul Aug Sep Okt Nov Dec/;
ReadingsTimestamp($device,"state","") =~ /^20(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;
my $wday = $days[(localtime(timelocal(0,0,0,$3,$2-1,$1-1900)))[6]];
my $month = $month[(localtime(timelocal(0,0,0,$3,$2-1,$1-1900)))[6]];
return "$wday, $3. $month $1, $4";
}
Im StateFormat hab ich dann:
{ choetzutime() }
gemacht. Was zu folgender Fehlermeldung führte
Error evaluating TEST2 stateFormat: Undefined subroutine &main::choetzutime called at (eval 6587) line 1.
Hast du mal FHEM neu gestartet? Der findet die Routine nicht. Aber du hast sie in der richtigen myutils?
und wenn sie dann mal gefunden werden sollte wird es auch nicht gehen da beim Aufruf kein Device übergeben wurde
{ choetzutime() } vs. { choetzutime($name) }
Das wars, so cool, jetzt gehts! Herzlichen Dank.
Mit Wzut Ergänzung $name funktioniert nun bestens!!!
Danke