FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: andies am 16 August 2017, 21:29:34

Titel: [gelöst] ReadingsTimestamp formatieren?
Beitrag von: andies am 16 August 2017, 21:29:34
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.
Titel: Antw:ReadingsTimestamp formatieren?
Beitrag von: DeeSPe am 17 August 2017, 01:01:24
z.B. so:
{
  ReadingsTimestamp($name,"state","") =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;
  return "Datum: $3.$2.$1, Uhrzeit: $4";
}


Gruß
Dan
Titel: Antw:ReadingsTimestamp formatieren?
Beitrag von: andies am 17 August 2017, 04:08:18
Danke!


Gesendet von iPad mit Tapatalk Pro
Titel: Antw:ReadingsTimestamp formatieren?
Beitrag von: Frank_Huber am 17 August 2017, 07:10:12
Ich verstehe hier gerade nur Bahnhof. Kann einer vielleicht ein "vorher / nachher" Vergleich posten?

Gesendet von meinem S3_32 mit Tapatalk

Titel: Antw:ReadingsTimestamp formatieren?
Beitrag von: DeeSPe am 17 August 2017, 07:52:27
Vorher:
2017-08-17 01:20:54

Nachher:
Datum: 17.08.2017, Uhrzeit: 01:20

Gruß
Dan
Titel: Antw:ReadingsTimestamp formatieren?
Beitrag von: andies am 17 August 2017, 11:44:03
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.
Titel: Antw:ReadingsTimestamp formatieren?
Beitrag von: choetzu am 29 Mai 2018, 20:59:26
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
Titel: Antw:ReadingsTimestamp formatieren?
Beitrag von: betateilchen am 29 Mai 2018, 21:15:00
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...
Titel: Antw:ReadingsTimestamp formatieren?
Beitrag von: choetzu am 29 Mai 2018, 21:26:35
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...
Titel: Antw:ReadingsTimestamp formatieren?
Beitrag von: DeeSPe am 29 Mai 2018, 21:37:24
ReadingsTimestamp($name,"state","") =~ /^20(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;

Gruß
Dan
Titel: Antw:ReadingsTimestamp formatieren?
Beitrag von: betateilchen am 29 Mai 2018, 22:26:38
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";
Titel: Antw:ReadingsTimestamp formatieren?
Beitrag von: choetzu am 29 Mai 2018, 22:42:23
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?
Titel: Antw:ReadingsTimestamp formatieren?
Beitrag von: Wzut am 30 Mai 2018, 07:21:53
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)
Titel: Antw:ReadingsTimestamp formatieren?
Beitrag von: CQuadrat am 30 Mai 2018, 08:00:38
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.
Titel: Antw:ReadingsTimestamp formatieren?
Beitrag von: betateilchen am 30 Mai 2018, 10:09:45
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.
Titel: Antw:ReadingsTimestamp formatieren?
Beitrag von: betateilchen am 30 Mai 2018, 10:12:52
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.
Titel: Antw:ReadingsTimestamp formatieren?
Beitrag von: choetzu am 30 Mai 2018, 10:21:47
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..
Titel: Antw:ReadingsTimestamp formatieren?
Beitrag von: choetzu am 31 Mai 2018, 15:26:23
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..
Titel: Antw:ReadingsTimestamp formatieren?
Beitrag von: andies am 31 Mai 2018, 15:46:50
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.
Titel: Antw:ReadingsTimestamp formatieren?
Beitrag von: choetzu am 31 Mai 2018, 15:56:16
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
Titel: Antw:ReadingsTimestamp formatieren?
Beitrag von: andies am 31 Mai 2018, 16:00:49
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?
Titel: Antw:ReadingsTimestamp formatieren?
Beitrag von: choetzu am 31 Mai 2018, 16:42:19
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.


Titel: Antw:ReadingsTimestamp formatieren?
Beitrag von: andies am 31 Mai 2018, 17:26:37
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.
Titel: Antw:ReadingsTimestamp formatieren?
Beitrag von: choetzu am 31 Mai 2018, 20:24:44
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]?
Titel: Antw:ReadingsTimestamp formatieren?
Beitrag von: andies am 31 Mai 2018, 21:24:11
Noch unterwegs http://perldoc.perl.org/functions/localtime.html
Titel: Antw:ReadingsTimestamp formatieren?
Beitrag von: choetzu am 31 Mai 2018, 23:34:47
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
Titel: Antw:[gelöst] ReadingsTimestamp formatieren?
Beitrag von: choetzu am 02 Juni 2018, 15:07:49
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.
Titel: Antw:[gelöst] ReadingsTimestamp formatieren?
Beitrag von: andies am 02 Juni 2018, 15:26:01
Hast du mal FHEM neu gestartet? Der findet die Routine nicht. Aber du hast sie in der richtigen myutils?
Titel: Antw:[gelöst] ReadingsTimestamp formatieren?
Beitrag von: Wzut am 02 Juni 2018, 17:20:01
und wenn sie dann mal gefunden werden sollte wird es auch nicht gehen da beim Aufruf kein Device übergeben wurde
{ choetzutime() } vs. { choetzutime($name) }
Titel: Antw:[gelöst] ReadingsTimestamp formatieren?
Beitrag von: choetzu am 02 Juni 2018, 23:55:53
Das wars, so cool, jetzt gehts! Herzlichen Dank.

Mit Wzut Ergänzung $name funktioniert nun bestens!!!
Danke