[gelöst] ReadingsTimestamp formatieren?

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

Vorheriges Thema - Nächstes Thema

betateilchen

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

choetzu

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

choetzu

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

andies

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.
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

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

andies

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?
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

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.


Raspi3, EnOcean, Zwave, Homematic

andies

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.
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

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

andies

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

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

choetzu

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

andies

Hast du mal FHEM neu gestartet? Der findet die Routine nicht. Aber du hast sie in der richtigen myutils?
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

Wzut

und wenn sie dann mal gefunden werden sollte wird es auch nicht gehen da beim Aufruf kein Device übergeben wurde
{ choetzutime() } vs. { choetzutime($name) }
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

choetzu

Das wars, so cool, jetzt gehts! Herzlichen Dank.

Mit Wzut Ergänzung $name funktioniert nun bestens!!!
Danke
Raspi3, EnOcean, Zwave, Homematic