Probleme mit at und sunrise

Begonnen von Elektrolurch, 13 August 2013, 18:36:09

Vorheriges Thema - Nächstes Thema

Elektrolurch

Hallo,

ich verzweifle an folgendem Stück Code:
define RolladenAutomat_morgens at *{sunrise_abs("REAL",0, {{($we ||(Value("Pennen") eq "ja"))?"09:00":"07:00"}},"09:30")}  { \
  if (Value("RolladenAutomatik") eq  "ein")  { \
      SetzeRolladen ("Alle","offen");; \

... Grins: An Feiertag oder wenn Pennen = ja ist, dann erst um 9:00 Uhr die Rollos hochfahren...

Führt beim Abspeichern immer zu folgender Fehlermeldung:
ERROR:
Wrong timespec {sunrise_abs("REAL",0,: either HH:MM:SS or {perlcode}
Dabei ist das ja perl-Code in {...}
{{($we ||(Value("Pennen") eq "ja"))?"09:00":"07:00"}}
Den einzeln in die fhem-Zeile eingegeben führt zur Ausgabe von:
07:00

Wo liegt da der Fehler????
So was funktioniert z.B.:
SetzeRolladen ("Alle",NachtsKalt()?"geschlossen":"gesperrt");;
Da wirtd die sub mit "gesperrt" aufgerufen.
Danke für Hilfe.

Elektrolurch

configDB und Windows befreite Zone!

betateilchen

irgendwie sind da für mein spontanes Empfinden zu viele geschweifte Klammern im Einsatz.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Zrrronggg!

Genau, fangen wir mal damit an, hier einen Klammereben zu entfernen

{{($we ||(Value("Pennen") eq "ja"))?"09:00":"07:00"}}
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

Elektrolurch

Hallo,

auch mit nur einem { } um den Ausdruck hatte ich es zunächst probiert. Geht auch nicht.
Außerdem wird der Ausdruck alleine in die fhem-Zeile eingegeben ja korrekt ausgewertet. Warum also dann nicht auch im Aufruf der sunrise - Funktion? Wenn die Klammerpaare ja stimmen, und das tun sie ja, ist das perl egal, wieviel Klammern da sind. Also, noch Vorschläge?
Ich habe auch noch das Leerzeichen zwischen dem "," und der "{" herausgemacht, ev. erkennt ja der Parser nicht, dass das ein Perl-Ausdruck sein soll, zumindest sagt er das ja so. Deshalb hatte ich es auch mit {{{..}} ausprobiert. (Escapen?)
Elektrolurch
configDB und Windows befreite Zone!

rudolfkoenig

Die Zeit-Spezifikation fuer at (egal ob mit oder ohne {}) darf keine Leerzeichen (oder Tabs) enthalten.

Erschwerend kommt dazu, dass diese Zeitspezifikation nur bei der Definition bzw. nach Ausfuehren des Kommandos ausgewertet wird, um den naechsten Zeitpunkt zu berechnen, also in diesem Fall jeweils am Tag davor. Damit wird $we vmtl. nicht das gewuenschte beinhalten.

Elektrolurch

Hallo Meister König,

soweit hatte ich mich auch gerade durchgetastet und siehe da, wenn kein Leerzeichen mehr in dem Ausdruck ist, dann wird er auch akzeptiert. Das hat aber nichts mit perl zu tun, sondern mit....? Und wo ist das dokumentiert? Hat mich jetzt einige Stunden und Zweifel an mir selber gekostet.
Ok. Dann müsste ich mit dem $we irgendwie tricksen.
Gibt's dazu ev. schon eine Lösung? Zu welchem Zeitpunkt wird das at denn neu berechnet? Kann man da nicht irgendwie Einfluß drauf nehmen?

Elektrolurch
configDB und Windows befreite Zone!

Zrrronggg!

Ok. Rudolf hat's  besser beantwortet. (gelöscht)
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

Elektrolurch

Hallo,
danke für den Hilfsversuch. Der Code funktioniert so:
define RolladenAutomat_morgens at *{sunrise_abs("REAL",0,{(Value("Pennen")eq"ja")||$we?"09:00":"07:00"},"09:30")}  { \
  if (Value("RolladenAutomatik") eq  "ein")  { \
      SetzeRolladen ("Alle","offen");; \
     } \
}
# end RolladenAutomat_morgens


Wie der Meister König schon schrieb, da dürfen in dem perl-Teil keinerleit Leerzeichen sein. Daran lags und nicht an Klammern oder so.
Der Code macht folgendes:
Die früheste Zeit, wenn das at ausgeführt werden soll, ist an normalen Tagen 7 Uhr und an $we (Feiertage und Weochenende) oder wenn ich den Schalter "Pennen" setze, um 9 Uhr (impl. if mit Syntax <Bedingung?Wert1:Wert2
Aber, und dass wusste ich nicht, gibt's da ein  Problem: Das at wird immer nach dem Ausführen neu berechnet und das ist dann ein Tag vorher und $we ist noch nicht gesetz. Freitags für Samstag berechnet, erst am Samstag ist aber $we = 1.

Also, muss ich noch einmal in mich gehen....

Elektrolurch
 
configDB und Windows befreite Zone!

justme1968

definier dein at auf die frühest mögliche zeit. wenn kein wochenende ist fahr den rolladen sofort hoch. wenn wochenende ist per einmalig definiertem at xy minuten später. bei pennen analog.

gruss
   andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig

> Und wo ist das dokumentiert?

Ab heute in den commandref.html Eintrag. Danke fuer den Hinweis.


> Dann müsste ich mit dem $we irgendwie tricksen. Gibt's dazu ev. schon eine Lösung?

Ich verwende jeweils ein at, wo ich im Code-Teil nach $we frage:

define rollup_wd *07:00:00 { system("setroll on&") if(!$we) }
define rollup_we *08:30:00 { system("setroll on&") if($we) }

Das habe ich vor 5 (6?) Jahren geschrieben, heute wuerde ich statt system("setroll on&") eher fhem("trigger rollup") und ein "define rollup notify rollup {...}" verwenden, da es einfacher in FHEM pflegbar. Aber beides kann man einfacher testen, als ein at mit direkten Code dahinter.


> Zu welchem Zeitpunkt wird das at denn neu berechnet?

Wie geschrieben, beim define bzw. beim ausfuehren des Code-Teils, um den naechsten Zeitpunkt zu bestimmen.


> Kann man da nicht irgendwie Einfluß drauf nehmen?

Nein. Bzw. indem man einen weiteres at Modul baut :)

Dietmar63

ich hatte eine ähnliches Problem mit RandomTimer.
Auch hier wurden Konstrukte mit $we oder auch sunset nicht korrekt ausgewertet.

Deshalb habe ich die Neuberechnung der Startzeit des Folgetages nicht sofort nach Ausführung, sondern kurz nach Mitternacht eingebaut. Dann fallen die Sonderlocken weg - könnte man im at nachrüsten, dann muss man nichts Neues bauen.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Elektrolurch

Hallo,

$we -> ja, habe drüber nachgedacht.
Meister König hat ja zwei at vorgeschlagen, geht natürlich.
Andere Möglichkeit ist, und die habe ich schon für einen anderen Fall programmiert, man hat ein at in der Nacht, z.B. "Nachtschaltung", mit dem man sowieso einiges berechnet und die Stati der FS20 Aktoren und in fhem zurücksetzt (z.B. alles Licht ausschaltet, falls fhem da eins nicht mit bekommen hat).
In dem at kann man dann die tagesaktuellen at's definieren.
So z.B. in dem Ablaufcode des at "Nachtschaltung:
my $com = 'define RollSteuerung_at at {$we?"09:00":"07:00"}';; \
fhem ($com);;
..
Trick dabei ist, für den Text von $com nur die einfachen Anführungszeichen zu verwenden, zwischen denen wird ja bekanntlich nichst ausgewertet und man kann die doppelten Anführungszeichen getrost verwenden.

Also, Lösung gefunden.

Elektrolurch

configDB und Windows befreite Zone!