neuer FHEM-Befehl IF

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

Vorheriges Thema - Nächstes Thema

mele

Hallo zusammen,

die Möglichkeit, die perl-IFs in meiner Programmierung durch weniger das hier entwickelte FHEM-IF reizt mich sehr.

Ich habe den Einbau in die 99_myUtils.pm versucht, bekomme aber eine Fehlermeldung beim Speichern:

Meldung: syntax error at ./FHEM/99_myUtils.pm line 17, near "Rollo_Buero_Fenster:"


sub
Rollotest()
{
IF ([Rollo_Buero_Fenster:state] eq "runter") (set Rollo_Buero_Fenster 90);
}


Hat jemand eine Idee, was ich verbessern könnte?

VG und Dank,
Manuel
FHEM auf NUC/Proxmox (Rpi 2 / Rpi Zero W mit FHEM2FHEM, RFHEM)
Homematic/LaCrosse/PCA301/Shelly, Rollladen, Batterieaktor + Relais zur Schaltung Garagentor (Promatic 2), Xiaomi FlowerSens, Bewässerungssteuerung Garten und Gewächshaus, Weatherman und Landroid

Damian

Hallo Manuel,

IF ist ein FHEM-Befehl und du bist in deiner Funktion auf der Perl-Ebene. Da arbeitest du besser mit Perl-Befehlen. Du kannst natürlich jeden FHEM-Befehl in fhem("... einpacken und damit auch deinen IF-Konstrukt, ob das hier sinnvoll ist, was ich nicht.

Ich habe den IF-Befehl insbesondere dafür entwickelt, ihn auf der FHEM-Ebene einzusetzen, um nicht unnötig auf die Perl-Ebene zu müssen.

Gruß

Damian

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

der-Lolo

#107
Hallo Damian,
ich versuche es nochmal mit dem IF folgendes ist das Ziel:
ich habe eine LivingWhites Steckdose mit dem reading "reachable"

ZitatReadings:
     2014-02-08 09:41:16   alert           none
     2014-02-08 09:52:58   bri             0
     2014-02-08 09:41:16   effect          none
     2014-02-08 09:51:58   level           0 %
     2014-02-08 09:51:58   onoff           0
     2014-02-08 09:51:58   pct             0
     2014-02-08 09:58:58   reachable       true
     2014-02-08 09:51:58   state           off

ich versuche zuerst einfach auf das reading zu reagieren und das Device falls es reachable:true ist anzuschalten.

define reachHUE notify HUEDevice16 IF ([HUEDevice16:reachable]) eq "true" (set HUEDevice16 on)
attr reachHUE room develop

Die Steckdose wird aber leider nicht geschaltet - hast du eine Idee?

EDIT:
Ich habs -
define reachHUE notify HUEDevice16 IF ([HUEDevice16:reachable] eq "true") (set HUEDevice16 on)
funktioniert...

der-Lolo

Hallo Damian,
ich glaube mittlerweile ich habe etwas noch nicht so richtig verstanden...
ich habe folgendes notify aufgebaut:

define hzg_day notify XXXX IF (([XXXX:residentsHome:d] > 0 ) and ([timer_hzg:state:[(on|off)]] eq "on")) (set hzg_balkon desiredTemperature comfort) ELSE (set hzg_balkon desiredTemperature eco)


timer_hzg ist ein Dummy der einfach um 22:00 den state off annimmt und um 06:00 den State on.
Wenn der Timer off ist und jemand kommt heim also residents > 0 wird, passiert wie erwartet nichts.
Wenn aber der jemand da ist und dann schaltet der Timer ab passiert auch nichts.
Ich hatte eigentlich erwartet das beim wegbrechen der zweiten Bedingung ebenfalls in die ELSE Anweisung gewechselt wird...

Da ich mit dem Denon und dessen Lautstärke ja das gleiche Phänomen habe glaube ich mittlerweile das es mein Denkfehler ist.
Denon schaltet ja auch nur dann den Subwoofer wenn der State on neu gesendet wird und eben nicht wenn sich die Lautstärke unter den Pegel von 30 bewegt...

Vielleicht steh ich auch wieder nur auf der Leitung...

Damian

Zitat von: der-Lolo am 10 Februar 2014, 22:06:06
Hallo Damian,
ich glaube mittlerweile ich habe etwas noch nicht so richtig verstanden...
ich habe folgendes notify aufgebaut:

define hzg_day notify XXXX IF (([XXXX:residentsHome:d] > 0 ) and ([timer_hzg:state:[(on|off)]] eq "on")) (set hzg_balkon desiredTemperature comfort) ELSE (set hzg_balkon desiredTemperature eco)


timer_hzg ist ein Dummy der einfach um 22:00 den state off annimmt und um 06:00 den State on.
Wenn der Timer off ist und jemand kommt heim also residents > 0 wird, passiert wie erwartet nichts.
Wenn aber der jemand da ist und dann schaltet der Timer ab passiert auch nichts.
Ich hatte eigentlich erwartet das beim wegbrechen der zweiten Bedingung ebenfalls in die ELSE Anweisung gewechselt wird...

Da ich mit dem Denon und dessen Lautstärke ja das gleiche Phänomen habe glaube ich mittlerweile das es mein Denkfehler ist.
Denon schaltet ja auch nur dann den Subwoofer wenn der State on neu gesendet wird und eben nicht wenn sich die Lautstärke unter den Pegel von 30 bewegt...

Vielleicht steh ich auch wieder nur auf der Leitung...

Wenn du bei allen Ereignissen, die du abfragst sofort reagieren willst, so musst du auch auf alle Ereignisse deinen Notify triggern lassen, hier also:


define hzg_day notify XXXX|timer_hzg IF (([XXXX:residentsHome:d] > 0 ) and ([timer_hzg:state] eq "on")) (set hzg_balkon desiredTemperature comfort) ELSE (set hzg_balkon desiredTemperature eco)

Wenn dein Dummy timer_hzg nur den Status on/off hat, brauchst du auch keinen Filter [(on|off)] bei [timer_hzg:state] zu setzen (siehe meine Änderung).


Gruß

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

der-Lolo

#110
Ok, ich glaube das habe ich jetzt verstanden - aus deinen Beispielen im ersten Post hier geht das so leider nicht hervor. Oder ich hab's übersehen... Ein pipe vor das IF zu setzen ist mir nicht in den Sinn gekommen.

Ich bekam eine Meldung im log als timer_hzg den State off hatte

timer_hzg_off: No set implemented for hzg_day

Deswegen fügte ich das State:[(on|off)] ein...

Edit:
Im timer_hzg_off hatte ich bis gerade ein set hzg.* desiredTemperature auto stehen - jaja, man sollte nicht alles abkürzen... Ganz klar mein Fehler.

Damian

#111
Zitat von: der-Lolo am 10 Februar 2014, 22:43:26
Ok, ich glaube das habe ich jetzt verstanden - aus deinen Beispielen im ersten Post hier geht das so leider nicht hervor. Oder ich hab's übersehen... Ein pipe vor das IF zu setzen ist mir nicht in den Sinn gekommen.

Ja, in meinen Beispielen frage ich ja auch nur auf das gleiche Device bei "and" ab und nicht auf zwei verschiedene, wie bei dir.

Das Pipezeichen gehört zum Notify-Befehl und nicht zum IF-Befehl.

Gruß

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

der-Lolo

Okay, dann hab ich jetzt gerade richtig was gelernt...

Tausend Dank!

Damian

Update:

Ich habe im ersten Post 98_IF.pm aktualisiert.

Hintergrund:

Möchte man bei einer Bedingung mit Perl-if z. B. ein at mit mehreren FHEM-Befehlen formulieren, so muss man bereits das Semikolon vervierfachen, damit jeweils eins beim define at ankommt.

Bsp.:

{if (Bedingung) {fhem("define a_test at 10:00 set lampe1 on;;;;set lampe2 off;;;;set temp desired 20")}}


Mit der aktuellen Version von IF reichen immerhin zwei:

IF (Bedingung) (define a_test at 10:00 set lampe1 on;;set lampe2 off;;set temp desired 20)

Das Komma gilt natürlich weiterhin als Trennzeichen zwischen den FHEM-Befehlen und lässt sich mit ;; kombinieren, z. B.

IF (Bedingung) (define a_test at 10:00 set lampe1 on;;set lampe2 off;;set temp desired 20, set lampe_hinter_define on)


Gruß

Damian


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

noice

Hallo,
probiere unter mithilfe eines zweiten Forum Users den IF gefehl zu verwenden und komme aber auf keinen grünen Zweig.

folgender Code wird verwendet:


define wohnen_aus notify WZ_SamsungTV IF (([WZ_SamsungTV:state] eq "absent") and ($hour ~~ [20..3])) (define aus at +00:20:00 (set WZ_LED_Stripe off,set Balkon_Licht off,set WZ_Licht off,set WZ_Spielekonsolen off)) ELSE (define auser at 23:00:00 ((set WZ_LED_Stripe off,set Balkon_Licht off,set WZ_Licht off,set WZ_Spielekonsolen off)))


Ziel dieses Befehls:

ich habe eine Wohnzimmer Beleuchtung die zum Sonnenuntergang einschaltet. Da bei uns der Fernseher abends immer läuft (ja steinigt mich) soll die Beleuchtung 20 Minuten nachdem der Fernseher aus ist ausschalten. Sollte der Fernseher mal nicht laufen dann soll die Beleuchtung um 23:00 ausschalten.

Bei meinem momentanen Code schaltet allerdings das licht sofort aus. Also ist das irgendwo ein "Denk"-Fehler drin.

Evtl könnte sich das mal einer Anschauen. Danke
BananaPI, RaspberryPi+AddonBoard,HMLAN,  miniCUL 433,nanoCUL 433,nanoCUL868,FHEMduino 433, Jeelink clone diverse Homematic, FS20, MAX, TFA und IT Komponenten.
10" Tablet mit andFhem, Daitem D14000

Damian

#115
Zitat von: noice am 17 Februar 2014, 22:16:30
Hallo,
probiere unter mithilfe eines zweiten Forum Users den IF gefehl zu verwenden und komme aber auf keinen grünen Zweig.

folgender Code wird verwendet:


define wohnen_aus notify WZ_SamsungTV IF (([WZ_SamsungTV:state] eq "absent") and ($hour ~~ [20..3])) (define aus at +00:20:00 (set WZ_LED_Stripe off,set Balkon_Licht off,set WZ_Licht off,set WZ_Spielekonsolen off)) ELSE (define auser at 23:00:00 ((set WZ_LED_Stripe off,set Balkon_Licht off,set WZ_Licht off,set WZ_Spielekonsolen off)))



Kann so nicht funktionieren, durch die Klammern beim define werden die Kommas weiter gegeben an das at und das kann damit nichts anfangen.

Dann besser:


define wohnen_aus notify WZ_SamsungTV
IF (([WZ_SamsungTV:state] eq "absent") and ($hour ~~ [20..3]))
  (define aus at +00:20:00 set WZ_LED_Stripe off;;set Balkon_Licht off;;set WZ_Licht off;;set WZ_Spielekonsolen off)
ELSE
  (define auser at 23:00:00 set WZ_LED_Stripe off;;set Balkon_Licht off;;set WZ_Licht off;;set WZ_Spielekonsolen off)


oder


define wohnen_aus notify WZ_SamsungTV
IF (([WZ_SamsungTV:state] eq "absent") and ($hour ~~ [20..3]))
  ((define aus at +00:20:00 set WZ_LED_Stripe,Balkon_Licht,WZ_Licht,WZ_Spielekonsolen off))
ELSE
  ((define auser at 23:00:00 set WZ_LED_Stripe,Balkon_Licht.WZ_Licht,WZ_Spielekonsolen off))


defnieren.

Im zweiten Bespiel sollte jetzt der set-Befehl etwas mit den Kommas anfangen können:).

Gruß

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

Damian

Im zweiten Bespiel waren noch die Klammern falsch gesetzt - habe das zweite Beispiel gerade angepasst.

Gruß

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

noice

nachdem ich den code mal "kopiert" habe und in die cfg gepackt habe bekomm ich den fehler beim save:
Usage: define notify IF: unknown reading: WZ_SamsungTV:state Unknown command ((define, try help. Unknown command ELSE, try help. Unknown command ((define, try help.



BananaPI, RaspberryPi+AddonBoard,HMLAN,  miniCUL 433,nanoCUL 433,nanoCUL868,FHEMduino 433, Jeelink clone diverse Homematic, FS20, MAX, TFA und IT Komponenten.
10" Tablet mit andFhem, Daitem D14000

Damian

Zitat von: noice am 17 Februar 2014, 23:00:28
nachdem ich den code mal "kopiert" habe und in die cfg gepackt habe bekomm ich den fehler beim save:
Usage: define notify IF: unknown reading: WZ_SamsungTV:state Unknown command ((define, try help. Unknown command ELSE, try help. Unknown command ((define, try help.

Welches, der beiden Bespiele?

Bitte den Code immer in der DEF-Zeile eingeben und nicht in der cfg-Datei (hat was mit dem Verdoppeln von Semikolons in FHEM zu tun)


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

noice

#119

define wohnen_aus notify WZ_SamsungTV IF (([WZ_SamsungTV:state] eq "absent") and ($hour ~~ [20..3])) ((define aus at +00:00:30 set WZ_LED_Stripe,Balkon_Licht,WZ_Licht,WZ_Spielekonsolen off)) ELSE ((define aus at 23:00:00 set WZ_LED_Stripe,Balkon_Licht,WZ_Licht,WZ_Spielekonsolen off))



diesen code

im DEF scheint er es zu nehmen
hab nur noch 2 Sachen verbessert/geändert zwecks test

ausgabe vom log: 2014.02.17 23:23:53 3: define aus at 23:00:00 set WZ_LED_Stripe,Balkon_Licht,WZ_Licht,WZ_Spielekonsolen off : aus already defined, delete it first
2014.02.17 23:23:53 3: wohnen_aus return value: aus already defined, delete it first
BananaPI, RaspberryPi+AddonBoard,HMLAN,  miniCUL 433,nanoCUL 433,nanoCUL868,FHEMduino 433, Jeelink clone diverse Homematic, FS20, MAX, TFA und IT Komponenten.
10" Tablet mit andFhem, Daitem D14000