neuer FHEM-Befehl IF

Begonnen von Damian, 25 Dezember 2013, 23:50:06

Vorheriges Thema - Nächstes Thema

Michi240281

#255
Hallo Damian,

tüftle wieder an einer IF-Bedingung und habs bislang noch nicht hinbekommen. Irgendwo hakt wohl die Syntax.

Ich möchte in


define Garagentorueberwachung_2 watchdog Garagentor:offen 00:30:00 Garagentor:geschlossen {fhem("set Push msg 'Fhem-Warnung' 'Garage ist seit 30 Minuten geöffnet' '' 0 '' ");; fhem("setstate Garagentorueberwachung_2 defined")}


das IF

IF ([Abwesend:state] eq "ja")

mit einbauen.

Es kommen verschiedene Fehler wie

Unknown command fhem("set
Unrecognized character

etc.!

Habe mit verschiedensten "Klammervarianten" probiert und auch mal "fhem" weggelassen. Leider krieg ichs nicht hin. Kannst du helfen?

Besten Dank schonmal!

EDIT: Habs hinbekommen!  :)

Sieht jetzt so aus:

define Garagentorueberwachung_1 watchdog Garagentor:offen 00:00:10 Garagentor:geschlossen IF ([Abwesend:state] eq "ja") (set Push msg "Fhem-Warnung" "Garage ist seit 30 Minuten geöffnet" "" 0 "" ",setstate Garagentorueberwachung_1 defined)

Noch irgendwelche Anmerkungen?

EDIT 2: Man muss noch den Fall abfangen, dass Abwesend nein ist, denn der watchdog wird in jedem Fall getriggert, und wenn Abwesend nein ist, wird der watchdog nicht "zurückgesetzt". So siehts nun aus und funktioniert:

define Garagentorueberwachung_Push_Abwesend watchdog Garagentor:offen 00:00:10 Garagentor:geschlossen IF ([Abwesend:state] eq "ja") (set Push msg "Fhem-Warnung" "ACHTUNG: Garage ist geöffnet - Bitte schließen!!!" "" 0 "" ",setstate Garagentorueberwachung_Push_Abwesend defined) ELSE (setstate Garagentorueberwachung_Push_Abwesend defined)
FHEM auf QNAP per VM / HM LAN Adapter / diverse HM-Devices
QNAP TVS 463
VU+ Duo4kSE
Sony 75ZD9

yogiflop

Zitat von: Damian am 29 April 2014, 18:43:06
Wenn du bei FHEM-Befehlen einen Reading übergeben willst, dann brauchst du das bei IF nicht umständlich über Variablen zu machen wie bei if, das geht auch einfacher z. B. mit:

+*00:05:00 IF ([ohz.owo.weather:_httpResponse_c]  ne "200 OK") (set notify.push msg "FHEM" "Fehler OpenWeatherMap - Siehe Logfile - [ohz.owo.weather:_httpResponse_c]" "" 0 "" )


Gruß

Damian


Es funktioniert alles wunderbar ..... bis !!!...... ja leider bis in dem Read folgender Wert stand:

Zitat
500 Can't connect to api.openweathermap.org:80 (timeout)

Dadurch taucht dann wieder ein ' in der IF Variablen auf und alles ist dahin. ;-)

Auszug Logfile:

Bareword found where operator expected at (eval 322695) line 1, near "'{Log 2, "ohz.owo.waether Fehler Vorher: " .ReadingsVal("ohz.owo.weather","_httpResponse_c","") }; set notify.push msg "FHEM" "Fehler OpenWeatherMap - Siehe Logfile - 500 Can't"
(Missing operator before t?)
String found where operator expected at (eval 322695) line 1, near ")" ""
(Missing operator before " "?)
String found where operator expected at (eval 322695) line 1, near "" "" 0 ""
(Missing operator before " 0 "?)
String found where operator expected at (eval 322695) line 1, near "" 0 ""; set ohz.owo.weather stationById 2856500 ;{Log 2, ""
(Missing operator before "; set ohz.owo.weather stationById 2856500 ;{Log 2, "?)


gruß Marc
CubieTruck mit FHEM 5.7
433MHz, 868MHz HMLan
div. Baumarktsteckdosen, 3x HM
div. MiLight's

Damian

Hallo Marc,

ok, wie sieht z. Zt. deine komplette Abfrage aus? Dann kann ich dir zeigen, wie du dir mit perl-if behelfen kannst.

Ich werde im nächsten Update einbauen, dass diese Konstruktion auch mit Hochkomma funktioniert.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

yogiflop

Zitat von: Damian am 06 Mai 2014, 23:04:41
Hallo Marc,

ok, wie sieht z. Zt. deine komplette Abfrage aus? Dann kann ich dir zeigen, wie du dir mit perl-if behelfen kannst.

Ich werde im nächsten Update einbauen, dass diese Konstruktion auch mit Hochkomma funktioniert.

Gruß

Damian

habe das Reading erstmal kurz rausgenommen, und warte dann auf das Update ;-) dann brauche ich nicht immer alles umstellen.

Aber danke dir für deine Mühen ..

gruß Marc
CubieTruck mit FHEM 5.7
433MHz, 868MHz HMLan
div. Baumarktsteckdosen, 3x HM
div. MiLight's

Damian

Zitat
Ich werde im nächsten Update einbauen, dass diese Konstruktion auch mit Hochkomma funktioniert.

Ab morgen per Update verfügbar.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

yogiflop

Zitat von: Damian am 09 Mai 2014, 22:00:13
Ab morgen per Update verfügbar.

Gruß

Damian


Hallo Damian,

irgendwas passt da nun aber wieder nicht.


define ohz.owo.weather.err.at at +*00:05:00 IF ([ohz.owo.weather:_httpResponse_c]  ne "200 OK") ({Log 2, "ohz.owo.waether Fehler Vorher: " .ReadingsVal("ohz.owo.weather","_httpResponse_c","") }, set notify.push msg "FHEM" "Fehler OpenWeatherMap - Siehe Logfile - [ohz.owo.weather:_httpResponse_c]" "" 0 "", set ohz.owo.weather stationById 2856500 , {Log 2, "ohz.owo.waether Fehler Nachher: " .ReadingsVal("ohz.owo.weather","_httpResponse_c","") } )


Logfile sagt:

Zitat
2014.05.10 17:57:25 5: exec at command ohz.owo.weather.err.at
2014.05.10 17:57:25 3: ohz.owo.weather.err.at: syntax error at (eval 72162) line 1, near ") fhem"

2014.05.10 17:57:25 5: redefine at command ohz.owo.weather.err.at as +*00:05:00 IF ([ohz.owo.weather:_httpResponse_c]  ne "200 OK") ({Log 2, "ohz.owo.waether Fehler Vorher: " .ReadingsVal("ohz.owo.weather","_httpResponse_c","") }, set notify.push msg "FHEM" "Fehler OpenWeatherMap - Siehe Logfile -" "" 0 "", set ohz.owo.weather stationById 2856500 , {Log 2, "ohz.owo.waether Fehler Nachher: " .ReadingsVal("ohz.owo.weather","_httpResponse_c","") } )
CubieTruck mit FHEM 5.7
433MHz, 868MHz HMLan
div. Baumarktsteckdosen, 3x HM
div. MiLight's

Damian

Zitat von: yogiflop am 10 Mai 2014, 18:02:11


define ohz.owo.weather.err.at at +*00:05:00 IF ([ohz.owo.weather:_httpResponse_c]  ne "200 OK") ({Log 2, "ohz.owo.waether Fehler Vorher: " .ReadingsVal("ohz.owo.weather","_httpResponse_c","") }, set notify.push msg "FHEM" "Fehler OpenWeatherMap - Siehe Logfile - [ohz.owo.weather:_httpResponse_c]" "" 0 "", set ohz.owo.weather stationById 2856500 , {Log 2, "ohz.owo.waether Fehler Nachher: " .ReadingsVal("ohz.owo.weather","_httpResponse_c","") } )



Liegt am letzten Leerzeichen zwischen } ). Mit }) am Ende sollte es direkt klappen.

Ich werde es bis morgen fixen, dann klappt es auch mit Leerzeichen.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

cwagner

Moin, Damian,

mit diesem IF in einem Notify erhalte ich verwirrende Fehlermeldungen (Schreibweise im WEB-INterface):
ZitatTerrassentuer.(open|closed) {
IF ($EVENT eq "open") (set CC_Wohnzimmer desired-temp 12,delstruct Rolllaeden ROLL_Terrasse) ELSE (addstruct Rolllaeden ROLL_Terrasse)
}

Im fhem.log:
014.05.21 06:53:49 3: N_Terrasse return value: syntax error at (eval 12040) line 2, near ") ("
syntax error at (eval 12040) line 2, near "ROLL_Terrasse) "


Telnet scheint mir aussagekräftiger, verwirrt mich aber, weil ich glaube, mich exakt an die (danke für die ausführliche!) Commandref in Deutsch gehalten zu haben:

ZitatNumber found where operator expected at (eval 12040) line 2, near "temp 12"
        (Do you need to predeclare temp?)
Bareword found where operator expected at (eval 12040) line 2, near ") ELSE"
        (Missing operator before ELSE?)

In der klassischen Schreibweise für if fumktioniert dies mit jeweils dem Aufruf von {fhem("set---")}
An Deinem IF bin ich aber interessiert, weil die Einbindung von Readings so wunderbar leicht geht und ich natürlich vor dem setzen des niedrigen desired-temp ich dies in einen Dummy retten will, und im ELSE auch wieder setzen will. Die Zeile würde dann also heißen sollen:
IF ($EVENT eq "open") (set D_Wohnzimmer [CC_Wohnzimmer:desired-temp:d],set CC_Wohnzimmer desired-temp 12,delstruct Rolllaeden ROLL_Terrasse) ELSE (addstruct Rolllaeden ROLL_Terrasse),set D_Wohnzimmer [D_Wohnzimmer]

Und das geht nur mit Deinem IF so wunderbar elegant, wenn ich denn die Syntax richtig hinbekäme... :(

Herzliche Grüße

Christian
PI 2B+/5 Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

Damian

Hallo Christian,

die Lösung ist ganz einfach:

Terrassentuer.(open|closed) IF ($EVENT eq "open") (set CC_Wohnzimmer desired-temp 12,delstruct Rolllaeden ROLL_Terrasse) ELSE (addstruct Rolllaeden ROLL_Terrasse)


Du hast deine IF-Abfrage in geschweifte Klammern gesetzt. Das darfst du nur bei Perl-Befehlen machen. IF ist aber ein FHEM-Befehl, also ohne geschweifte Klammern arbeiten, genauso wie bei allen anderen FHEM-Befehlen.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

cwagner

ups, meinte ich auch vergeblich probiert zu haben. Da habe ich dann wohl noch einen weiteren Fehler drinne gehabt. Werde ich heute Abend gleich mal ausprobieren.
Wird angesichts der Hitze ja wohl das einzige IF sein, das heute Arbeit bekommt (Abendkühle zur Tür reinlassen). Die Thresholds werden wohl alle auf OFF stehen :-)


Grüße

Christian
PI 2B+/5 Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

cwagner

Hallo Damian,

leider klappt es doch nicht. Mit der Zeile
Terrassentuer:(open|closed) IF ($EVENT eq "open") (set CC_Wohnzimmer desired-temp 12,delstruct Rolllaeden ROLL_Terrasse) ELSE (addstruct Rolllaeden ROLL_Terrasse)

auch in der Variante mit einem Punkt anstelle des Doppelpunktes erhalte ich mit dem Trigger open oder closed die Fehlermeldungen.

2014.05.21 21:47:02 3: N_Terrasse return value: Bareword "closed" not allowed while "strict subs" in use at (eval 1111) line 1.

2014.05.21 21:53:44 3: N_Terrasse return value: Bareword "closed" not allowed while "strict subs" in use at (eval 1228) line 1.

2014.05.21 22:00:19 3: N_Terrasse return value: Not enough arguments for open at (eval 1310) line 1, near "open eq"

2014.05.21 22:01:10 3: N_Terrasse return value: Bareword "closed" not allowed while "strict subs" in use at (eval 1345) line 1.



Herzliche Grüße
Christian
PI 2B+/5 Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

Damian

Zitat von: cwagner am 21 Mai 2014, 22:07:46
Hallo Damian,

leider klappt es doch nicht. Mit der Zeile
Terrassentuer:(open|closed) IF ($EVENT eq "open") (set CC_Wohnzimmer desired-temp 12,delstruct Rolllaeden ROLL_Terrasse) ELSE (addstruct Rolllaeden ROLL_Terrasse)

auch in der Variante mit einem Punkt anstelle des Doppelpunktes erhalte ich mit dem Trigger open oder closed die Fehlermeldungen.

2014.05.21 21:47:02 3: N_Terrasse return value: Bareword "closed" not allowed while "strict subs" in use at (eval 1111) line 1.

2014.05.21 21:53:44 3: N_Terrasse return value: Bareword "closed" not allowed while "strict subs" in use at (eval 1228) line 1.

2014.05.21 22:00:19 3: N_Terrasse return value: Not enough arguments for open at (eval 1310) line 1, near "open eq"

2014.05.21 22:01:10 3: N_Terrasse return value: Bareword "closed" not allowed while "strict subs" in use at (eval 1345) line 1.



Herzliche Grüße
Christian

Das liegt wahrscheinlich an dem $EVENT

probiere mal:

Terrassentuer:(open|closed) IF ([Terrassentuer] eq "open") (set CC_Wohnzimmer desired-temp 12,delstruct Rolllaeden ROLL_Terrasse) ELSE (addstruct Rolllaeden ROLL_Terrasse)

Gruß

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

cwagner

#267
Guten Morgen, Damian,

vielen Dank für Deine Geduld - in der Tat, das hat entscheidende Änderung aber auch eine neue Fehlersituation gebracht. Mit der Zeile Terrassentuer.(open|closed) IF ([Terrassentuer] eq "open") (set CC_Wohnzimmer desired-temp 12,delstruct Rolllaeden ROLL_Terrasse, {Log 3, "Schleife open"}) ELSE (addstruct Rolllaeden ROLL_Terrasse,{Log 3, "Schleife closed"})

erhalte ich keine Fehlermeldung mehr, aber das Prüfergebnis ist verwirrend:

Event                                      Ergebnis im Log
open                                       ausgeführt wird der Elsezweig
closed                                     ausgeführt wird der Elsezweig

Prüfe ich im IF-Zweig auf closed, wird in beiden Fällen der IF-Zweig ausgeführt, wenn ich das teste mit

trigger Terrassentuer open
trigger Terrassentuer closed

Edit: Das habe ich aber dann auch selbst begriffen: Da Dein Konstrukt ja direkt das state-Reading im Device abfragt, kann ich natürlich über den Trigger lediglich das Notify auslösen aber keine unterschiedliche Events übergeben.

Herzliche Grüße

Christian
PI 2B+/5 Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

Damian

Zitat von: cwagner am 22 Mai 2014, 07:14:30
Guten Morgen, Damian,

vielen Dank für Deine Geduld - in der Tat, das hat entscheidende Änderung aber auch eine neue Fehlersituation gebracht. Mit der Zeile Terrassentuer.(open|closed) IF ([Terrassentuer] eq "open") (set CC_Wohnzimmer desired-temp 12,delstruct Rolllaeden ROLL_Terrasse, {Log 3, "Schleife open"}) ELSE (addstruct Rolllaeden ROLL_Terrasse,{Log 3, "Schleife closed"})

erhalte ich keine Fehlermeldung mehr, aber das Prüfergebnis ist verwirrend:

Event                                      Ergebnis im Log
open                                       ausgeführt wird der Elsezweig
closed                                     ausgeführt wird der Elsezweig

Prüfe ich im IF-Zweig auf closed, wird in beiden Fällen der IF-Zweig ausgeführt, wenn ich das teste mit

trigger Terrassentuer open
trigger Terrassentuer closed

Edit: Das habe ich aber dann auch selbst begriffen: Da Dein Konstrukt ja direkt das state-Reading im Device abfragt, kann ich natürlich über den Trigger lediglich das Notify auslösen aber keine unterschiedliche Events übergeben.

Herzliche Grüße

Christian

Auch dieses Problem wird einfach geartet sein. Offenbar steht im Status (ist nicht gleich Event) zum Zeitpunkt der Ausführung nicht das, was du erwartest, z. B. durch Umbenennung mit devStateIcon oder Ähnliches. Aber auch das kannst du schnell einkreisen z. B. durch:

Terrassentuer.(open|closed) IF (1) ({Log 3, Value("Terrassentuer")})

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#269
Zitat von: cwagner am 22 Mai 2014, 07:14:30

Edit: Das habe ich aber dann auch selbst begriffen: Da Dein Konstrukt ja direkt das state-Reading im Device abfragt, kann ich natürlich über den Trigger lediglich das Notify auslösen aber keine unterschiedliche Events übergeben.

Auch das sollte gehen. $EVENT ist keine Variable, auch wenn es den Eindruck erweckt (der Name ist meiner Meinung nach etwas unglücklich gewählt), stattdessen ist es nur einfacher Platzhalter, der an beliebiger Stelle ohne Syntaxcheck durch den tatsächlichen Event im notify-Modul ersetzt wird. Will man $EVENT in einer Bedingung abfragen und das ist unabhängig, ob bei perl-if oder bei IF, dann sollte man es in Anführungszeichen setzen, damit der Perl-Interpreter damit etwas anfangen kann. In diesem Falle sollte:

Terrassentuer:(open|closed) IF ("$EVENT" eq "open") (set CC_Wohnzimmer desired-temp 12,delstruct Rolllaeden ROLL_Terrasse) ELSE (addstruct Rolllaeden ROLL_Terrasse)

funktionieren.

Das ist allerdings keine besonders gute Lösung und funktioniert nur solange kein Anführungszeichen im $EVENT selbst vorkommt.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF