Hauptmenü

If Bedingungen

Begonnen von orphus, 07 Dezember 2018, 22:21:14

Vorheriges Thema - Nächstes Thema

orphus

Hallo Zusammen,
Ich verzweifel gerade an meiner ersten If-Programmierung. Folgendes habe ich jetzt versucht.

define rollo_auf_neu *02:00:00 { if (!$we) {fhem("define rollo_auf at {sunrise_abs("06:00","10:00")} set eg_rolladen_auf on-for-timer 1")} else {fhem("define rollo_auf at {sunrise_abs("09:30","11:30")} set eg_rolladen_auf on-for-timer 1") }}

Es kommt folgender Fehler:
syntax error at (eval 432) line 1, near ""define rollo_auf at {sunrise_abs("06"
Illegal octal digit '9' at (eval 432) line 1, at end of line
syntax error at (eval 432) line 1, near ""define rollo_auf at {sunrise_abs("09"

Komisch ist, dass der den Befehl nimmt, wenn ich die "" bei den Zeitangaben in den sunrise Klammern weg nehme. Dann wird er aber doch spätestens, wenn er den FHEM befehl ausführen soll Probleme bekommen, denn wenn ich den Teil mit
define rollo_auf at {sunrise_abs("06:00","10:00")} set eg_rolladen_auf on-for-timer 1 ohne die Anführungszeichen eingebe, beschwert er sich, dass die Zeitangaben nicht passen.

Hab ich hier nen Denkfehler oder geht diese Verschachtelung von FHEM und Perl generell nicht?

Frank_Huber

Versuche mal verschiedene " zu nehmen.
Z. B. Im sunrise die '

Gesendet von meinem Doogee S60 mit Tapatalk


Wuppi68

nimm bitte deinen Code auch in den Code Tags die Raute in der 2. Knöchenleiste über dem Eingabefenster ;-)

ob Du " oder ' benutzt ist in Deinen Fall relativ egal

Zeichenketten in "Zeichenkette" werden durch Perl noch einmal auf Variablen durchsucht und ersetzt
Zeichenketten in 'Zeichenkette' werden so genommen wie sie sind ;-)

Beispiel:

$text = "Ich bin ein Beispiel"

print $text --> Ich bin ein Beispiel
print "$text - wirklich" --> Ich bin ein Beispiel - wirklich
print '$text' --> $text

Bei Deinen Fall ist ein ganz anderes Problem akut ...

Du benötigst die Hochkommas innerhalb einer Zeichenkette - das geht nur wenn Du diese "Escape'st" sprich besonders kennzeichnest als "Sonderzeichen" und nicht als normales Hochkomma ...

Ich würde es so machen: <Achtung Code Tag siehe Einleitung>

define rollo_auf_neu *02:00:00 { if (!$we) {fhem('define rollo_auf at {sunrise_abs(\'06:00\',\'10:00\')} set eg_rolladen_auf on-for-timer 1')} else {fhem('define rollo_auf at {sunrise_abs(\'09:30\',\'11:30\')} set eg_rolladen_auf on-for-timer 1') }}
FHEM unter Proxmox als VM

Wuppi68

noch ne Frage, wo wohnst Du wenn die Sonne maximal erst um 11:30 aufgeht?

am kürzesten Tag (21. Dezember) geht in Flensburg um 08:44 die Sonne auf ;-) und in Süden beim Haldenwanger Eck um 08:03
FHEM unter Proxmox als VM

Frank_Huber

Also wenn ich Hochkommas innerhalb Hochkommas brauche nehm ich verschiedene. Damit geht das dann auch ohne escapen. Kann später den Code raussuchen. Hab damals auch ewig gesucht.

Gesendet von meinem Telekom Puls mit Tapatalk


MadMax-FHEM

#5
Neben dem Escapen bzw. Ersetzen von Doppelhochkommas innerhalb des
fhem(" hier dann escapen oder Einzelhochkommas ")
noch 2 Dinge aufgefallen:

Fehlt da in der "Hauptdefinition" also von rollo_auf_neu nicht das "at"!?

Du willst doch jeden Morgen um 2Uhr die "echten" at erzeugen, oder!?

Und wenn es mal zyklisch läuft wirst du verm. Fehler bekommen, wenn du die anderen "at" zum "Mehrmalten Male" definierst, daher dort besser defmod...

EDIT2: Kommando zurück, hab grad gesehen es sind nur einmalige "at"...

EDIT: 3 Dinge ;) die Auswertung von {sunrise...} wird doch auch gleich direkt ohne Abstand hinter das "at" geschrieben, oder!? Gut hier bin ich mir jetzt unsicher, ob das Leerzeichen zwischen dem "at" und der Auswertung von sunrise nicht doch beibehalten wird... Kann grad nicht testen...

Anmerkung: zwischen Einzelhochkommas findet keine Variablenauswertung statt!

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Wzut

Auch wenn man das irgendwann mit der passenden Syntax zum Laufen bekommt, elegant ist IMHO etwas anderes :)
Ein at zyklisch aufrufen das ein anderes at erzeugt .... brrr
Eleganter wäre hier z.B. ein WeekdayTimer -> https://wiki.fhem.de/wiki/WeekdayTimer , ein Beispiel aus dem Wiki kann man fast 1:1 übernehmen:
define rollo_auf_neu WeekdayTimer eg_rolladen_auf !$we|{sunrise_abs("CIVIL",0,"06:00","10:00")}|1 $we|{sunrise_abs("CIVIL",0,"09:30","11:30")}|1 set $NAME on-for-timer $EVENT
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

orphus

Hallo besten Dank für die schnelle Hilfe! Ich konnte jetzt ein wenig experimentieren und glaube, dass es jetzt erstmal läuft. Das mit dem Weekday timer probiere ich aber auch nochmal aus...

Folgendes klappte nicht:
{sunrise_abs(\'REAL\',0,\'06:00\',\'10:00\')}
da dann der folgedende Fehler ausgegeben wurde:
ZitatCan't find string terminator "'" anywhere before EOF at (eval 328) line 1.

Ohne die Escapes scheint er zu tun, was er soll. Wichtig übrigens das Argument für den Offset, da er nur die zwei Zeitangaben scheinbar auch nicht akzeptiert. Sieht jetzt wie folgt aus (Ich wohne in NRW nicht in der Arktis, daher habe ich für das Wochenende doch nur 9:30 als Festwert gesetzt :D
*02:00:00 { if (!$we) {fhem("define rollo_auf at {sunrise_abs('REAL',0,'06:00','10:00')} set eg_rolladen_auf on-for-timer 1")} else {fhem("define rollo_auf at 09:30 set eg_rolladen_auf on-for-timer 1") }}


Damian

#8
Das sieht alles unnötig kompliziert aus, alternativ:

define di_rollo DOIF ([{sunrise_abs('REAL',0,'06:00','10:00')}|AT] or [09:30|WE]) (set eg_rolladen_auf on-for-timer 1)
attr di_rollo do always


Die Funktionsweise lässt sich hier nachlesen: https://fhem.de/commandref_DE.html#DOIF_Wochentagsteuerung
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

MadMax-FHEM

Zitat von: orphus am 09 Dezember 2018, 21:25:59
Hallo besten Dank für die schnelle Hilfe! Ich konnte jetzt ein wenig experimentieren und glaube, dass es jetzt erstmal läuft. Das mit dem Weekday timer probiere ich aber auch nochmal aus...

Folgendes klappte nicht:
{sunrise_abs(\'REAL\',0,\'06:00\',\'10:00\')}
da dann der folgedende Fehler ausgegeben wurde:
Ohne die Escapes scheint er zu tun, was er soll. Wichtig übrigens das Argument für den Offset, da er nur die zwei Zeitangaben scheinbar auch nicht akzeptiert. Sieht jetzt wie folgt aus (Ich wohne in NRW nicht in der Arktis, daher habe ich für das Wochenende doch nur 9:30 als Festwert gesetzt :D
*02:00:00 { if (!$we) {fhem("define rollo_auf at {sunrise_abs('REAL',0,'06:00','10:00')} set eg_rolladen_auf on-for-timer 1")} else {fhem("define rollo_auf at 09:30 set eg_rolladen_auf on-for-timer 1") }}

Von Einzelhochkomma escapen stand ja auch nie was da.

Einzelhochkomma funktionieren halt nur, wenn die Zeichenfolge dazwischen genau als solche genommen werden soll...

Auswertung von Variablen geschieht zwischen Einzelhochkommas halt nicht...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)