FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: ronny332 am 25 Mai 2015, 19:26:35

Titel: Timespec in einer Eventmap
Beitrag von: ronny332 am 25 Mai 2015, 19:26:35
Hallo zusammen,

als Ergänzung zu einem bestehenden Thema hatte ich schon einmal etwas geschrieben, das Thema an sich ist aber wohl so alt und speziell, dass meine Frage entweder untergeht oder kein Gehör finden kann.

Daher traue ich mich hier noch einmal das Ganze zu formulieren und damit auch eine Frage in den Raum zu werfen.

Gesucht ist eine Möglichkeit wie ich in einer Eventmap den Typ "Timespec" (letztlich ein String mit Doppelpunkten als Trennung) einbauen kann. Eine Eventmap ist wird wohl intern mit einem regulären Ausdruck geparst, Trenner sind wiederum Doppelpunkte. Da Timespecs diese aber auch nutzen, ist das Ergebis der Eventmap falsch.

Beispiel:


/on-for-timer 00:00:01:on1s/


Eigentlich wollte hier 1 Sekunde lang etwas eingeschlatet werden, durch die ":" funktioniert das aber nicht.

Maskiere ich das Ganze, crasht bei mir komplett FHEM mit einem Regexp Fehler:


/on-for-timer 00\:00\:01:on1s/


Die ":" zu verdoppeln hilft auch nicht:


/on-for-timer 00::00::01:on1s/


Eine weitere Idee war es über \Q und \E auf Perl Ebene zu lösen:


/on-for-timer \Q00:00:01\E:on1s/


Aber auch das funktioniert nicht.

Als letzte Idee kommt mir jetzt noch eine Subroutine in Perl zu schreiben und dieser z.B. einen Offset in Sekunden als Zahl zu übergeben, welche dann zurückgeliefert wird als String. Aber das erscheint mir doch etwas unübersichtlich zu sein.

Kann hier jemand etwas Licht in das ganze Gehölz bringen, welches mir den Blick auf die Lösung versperrt?
Titel: Antw:Timespec in einer Eventmap
Beitrag von: Puschel74 am 25 Mai 2015, 19:33:04
/on:Ein/off:Aus/on-for-timer 300:5 Minuten/on-for-timer 3600:60 Minuten/
klappt bei mir einwandfrei.
Titel: Antw:Timespec in einer Eventmap
Beitrag von: ronny332 am 25 Mai 2015, 19:38:27
Hallo,

danke, aber leider in dem Fall nicht :-(. Genauso mache ich es bei allen Geräten, die Sekunden akzeptieren. TRX_LIGHT braucht aber Timespec als Übergabe oder eben Perlcode, welchen ich in der gleichen Zeile ebenfalls nicht zum Laufen bekomme (die Auswertung intern als regulärer Ausdruck scheint hier vieles unnutzbar zu machen).


Wrong timespec 300: either HH:MM:SS or {perlcode}
Titel: Antw:Timespec in einer Eventmap
Beitrag von: flurin am 25 Mai 2015, 20:33:33
Versuchs mal so:

/{"on-for-timer 00:00:01"}:on1s/


oder

/on-for-timer {"00:00:01"}:on1s/


oder

/{sprintf("on-for-timer 00:00:%02d",1)}:on1s/


oder

/on-for-timer {sprintf("00:00:%02d",1)}:on1s/


Ich kann es nicht testen, nur theoretisch denkbar.

Gruss
flurin
Titel: Antw:Timespec in einer Eventmap
Beitrag von: ronny332 am 25 Mai 2015, 21:03:53
Wow, Danke für die vielen Ideen, leider funktioniert auch hier wieder keine. Es scheint wirklich so zu sein, dass FHEM den String direkt nach den ":" zerlegt, damit würde nur eine Maskierung funktionieren, aber ich finde keine passende.

Getrickst habe ich es jetzt mit einer eigenen Funktion (sicherlich verbesserungswürdig vom Stil, aber mit Perl verdiene ich nicht mein Geld ;)):


sub
ToTimeSpec($)
{
  my ($val) = @_;

  # numeric?
  if ($val =~ /^[^0-9]+$/ || $val < 0) {
    return ("input is not a numeric value", undef, undef, undef, undef);
  }

  $val += 0;

  my ($sec, $min, $hrs) = (0, 0, 0);

  $sec = $val % 60;
  $val = ($val - $sec) / 60;
  if ($val >= 0) {
    $min = $val % 60;
    $hrs = ($val - $min) / 60;
  }

  return sprintf("%02s", $hrs).":".sprintf("%02d", $min, "0").":".sprintf("%02s", $sec);
}


und einer EventMap mit


/on-for-timer {ToTimeSpec(1)}:on1s/


So funktioniert es erstmal, aber ich stehe ich nicht sonderlich auf Custom Code, wenn es bestimmt eine bessere Lösung gibt.

Grüße,
Ronny
Titel: Antw:Timespec in einer Eventmap
Beitrag von: flurin am 25 Mai 2015, 21:42:34
Noch ein Vorschlag:

"/" mit "," ersetzen:


,on-for-timer 00:00:01:on1s,


Edit: das geht vermutlich nicht, man müsste Doppelpunkt als Trennzeichen ersetzen können!
Titel: Antw:Timespec in einer Eventmap
Beitrag von: ronny332 am 25 Mai 2015, 22:06:30
Ja, in der Tat, geht leider auch nicht.