[gelöst] ReadingsTimestamp formatieren?

Begonnen von andies, 16 August 2017, 21:29:34

Vorheriges Thema - Nächstes Thema

andies

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.
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

DeeSPe

z.B. so:
{
  ReadingsTimestamp($name,"state","") =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;
  return "Datum: $3.$2.$1, Uhrzeit: $4";
}


Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

andies

Danke!


Gesendet von iPad mit Tapatalk Pro
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

Frank_Huber

Ich verstehe hier gerade nur Bahnhof. Kann einer vielleicht ein "vorher / nachher" Vergleich posten?

Gesendet von meinem S3_32 mit Tapatalk


DeeSPe

#4
Vorher:
2017-08-17 01:20:54

Nachher:
Datum: 17.08.2017, Uhrzeit: 01:20

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

andies

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.
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

choetzu

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
Raspi3, EnOcean, Zwave, Homematic

betateilchen

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...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

choetzu

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...
Raspi3, EnOcean, Zwave, Homematic

DeeSPe

ReadingsTimestamp($name,"state","") =~ /^20(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

betateilchen

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";
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

choetzu

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?
Raspi3, EnOcean, Zwave, Homematic

Wzut

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)
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

CQuadrat

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.
FHEM auf Mini-ITX-Server mit Intel Quad-Core J1900:
+ HM: HM-LAN, HM-USB, HM-MOD-UART mit div. HM-Komponenten
+ RFXtrx: Funkwetterstation Bresser mit ext. Thermometer, Regenmesser und Windmesser
+ TUL (KNX-Anbindung), MQTT, SONOS (div. Gimmicks), OneWire, Hue

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!