Zeit aus reading auslesen und in Sekunden umrechnen

Begonnen von Tunka, 19 Februar 2017, 12:01:59

Vorheriges Thema - Nächstes Thema

Tunka

Hallo,

bin blutiger Anfänger und versuche jetzt schon seit Tagen folgende Funktion ans laufen zu bringen.
Irgendwie komm ich nicht weiter und brauche Hilfe:

fhem.cfg
define dimupM dummy
attr dimupM room Lichtsteuerung
attr dimupM userReadings dimsec ({my $time2sec = time2sec(ReadingsVal("dimupM","dimupM",0))})


Myutils

sub
time2sec($)
{
my ($time2sec) = @_;
@a = (split /:/,$time2sec);
$time2sec = $a[0] *3600 + $a[1] *60;
return $time2sec
}


setreading dimupM dimupM 00:10 ändert den Wert dimupM, bei dimsec kommt eine Fehlermeldung:
"Error evaluating dimupM userReading dimsec: syntax error at (eval 277) line 1, at EOF"
Erwarteter Wert: 600
Staus blutiger Anfänger

KernSani

Auf die Schnelle (ohne deinCiding genauer anzusehen): FHEM hat eine Funktion time_str2num, die genau das machen sollte. Und am Besten packst du Coding hier im Forum in code tags (# Button im Editor) um das Ganze lesbarer zu machen.
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

Tunka

Danke für den Hinweis mit den Code Tags :-)
Leider hilft mir hier time_str2num wohl nicht weiter, da mein Format HH:MM hat (oder verstehe ich da was falsch?).

Die Frage ist, habe ich einen Formatierungsfehler oder habeich das ganze falsch verstanden.
Besser DOIF oder notify?



Staus blutiger Anfänger

dev0

Die Variable @a ist nicht deklariert und die Klammern rundum split sind falsch getzt. Ein Blick ins Log hätte das auch verraten...


sub
time2sec($)
{
  my ($time2sec) = @_;
  my @a = split(/:/,$time2sec);
  $time2sec = $a[0] *3600 + $a[1] *60;
  return $time2sec
}

Tunka

Hallo,
danke, bin für jeden Tip dankbar. Ich suche jetzt schon seit Tagen und versuche zu verstehen wie ich die Funktion umsetzen kann.
Ein Beispiel würde mir hier weiterhelfen das Ganze zu verstehen.

Habs jetzt die MyUtils angepasst:
sub
time2sec($)
{
my ($time2sec) = @_;
@a = split (/:/,$time2sec);
$time2sec = $a[0] *3600 + $a[1] *60;
return $time2sec
}


Ich hoffe das passt jetzt.

Was mir noch nicht klar ist, wie der Rückgabewert in das Reading dimsec kommt

dimsec ({time2sec(ReadingsVal("dimupM","dimupM",0))})

Übernimmt er hier den Rückgabewert direkt.

Danke im voraus
Staus blutiger Anfänger

betateilchen

Für solche Umrechnungen gibt es doch fertige Funktionen in perl? Warum wollen immer alle das Rad neu erfinden?


-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

KernSani

Zitat von: Tunka am 19 Februar 2017, 14:56:59

dimsec ({time2sec(ReadingsVal("dimupM","dimupM",0))})

Übernimmt er hier den Rückgabewert direkt.

ja, sollte direkt übernommen werden, die runden Klammern (außen) sind aber unnötig (oder verursachen sogar Probleme - kann ich jetzt nicht sagen).

RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

Habbi