Hauptmenü

Zu blöd für ELSIF

Begonnen von ChristianH, 22 Januar 2019, 13:53:25

Vorheriges Thema - Nächstes Thema

ChristianH

Hallo in die Runde,

ich versuche gerade mal meine Dashbutton Implementation zu verbessern - grundsätzlich ist die Idee:
Dash wird gedrückt - Prüfen auf der Status auf on ist

  • wenn on und zwischen 22:00 und 23:55, dann schalte Lichter aus und schalte eine Licht an
  • wenn on und nicht zwischen 22:00 und 23:55, dann schalte Lichter aus
  • wenn off, dann schalte auf on

Folgendes habe ich definiert:

DashButton_Ariel:b4-7c-9c-73-2f-f6:.short IF ( [Wohnzimmerbeleuchtung] eq "on" && [22:00-23:55])
(
set Wohnzimmerbeleuchtung off,
set IT_V3_Dose3 on-for-timer 1200
set $SELF inactive,
sleep 2,
set $SELF active
)
ELSIF
( [Wohnzimmerbeleuchtung] eq "on")
(
set Wohnzimmerbeleuchtung off,
set $SELF inactive,
sleep 2,
set $SELF active
)
ELSE
(
set Wohnzimmerbeleuchtung on,
set $SELF inactive,
sleep 2,
set $SELF active
)


Klappt aber nicht - es klappte gut, bis ich die weitere Abfrage der Uhrzeit eingefügt habe (und damit das ELSIF).

Danke

Christian

Beta-User

Hast du mal eine Fundstelle, wo das mit ELSIF so drinsteht ;) ?

Mir ist "elsif" (klein geschrieben) nur im Perl-Umfeld ein Begriff. Für IF würde ich mal darauf tippen, dass man sowas als ELSE IF schreiben kann - habe damit aber keine Erfahrung mehr, da ich seit einiger Zeit nur noch Perl-Syntax verwende; das finde ich auf die Dauer übersichtlicher.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

nils_

https://commandref.fhem.de/#IF

da gibt es kein ELSIF, dann musst du verschachteln....

IF( lampe = on)
(
    IF ( zeitspanne )
    (  schalte..... )
    ELSE
    ( schalte andere sachen.....)
)
ELSE
(
    schalte was auch immer....
)
viele Wege in FHEM es gibt!


CoolTux

Es gibt einen Unterschied zwischen Perl if und elsif und dem FHEM Modul IF
IF ist ein FHEM Modul genau wie DOIF.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Beta-User

Zumindest die ersten beiden Fundstellen _schreiben das klein_ und beziehen sich auf ein Perl-Umfeld :P , auch wenn der Autor der zweiten Fundstelle da irgendwas unspezifisch auch mit Großschreibung hantiert (siehe zu blogs &Co: https://wiki.fhem.de/wiki/Dokumentationsstruktur).
Zitat von: Beta-User am 22 Januar 2019, 14:04:34
Mir ist "elsif" (klein geschrieben) nur im Perl-Umfeld ein Begriff. Für IF würde ich mal darauf tippen, dass man sowas als ELSE IF schreiben kann - habe damit aber keine Erfahrung mehr, da ich seit einiger Zeit nur noch Perl-Syntax verwende; das finde ich auf die Dauer übersichtlicher.
Du nutzt hier - wie von CoolTux angemerkt - aber die FHEM-Funktion IF, und bei der gibt es lt. commandref https://fhem.de/commandref.html#IF immer noch nur ELSE ;D
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

ChristianH

Tja, dann ist das wohl so ... mir ist nicht klar, wie ich nun also "on" und Zeitfenster mit einem IF/ELSE verknüpfe und stampfe ne Notify ein!

Danke für eure Mühen!

Christian

Beta-User

Na ja, entweder nutzt du die Quellen, die du für elsif gefunden hast und verwendest richtigen Perl-Code, oder du nutzt IF, dann hatte nils_ ja auch schon die Struktur aus der comamndref dargestellt...
Zitat von: nils_ am 22 Januar 2019, 14:24:02
IF( lampe = on)
(
    IF ( zeitspanne )
    (  schalte..... )
    ELSE
    ( schalte andere sachen.....)
)
ELSE
(
    schalte was auch immer....
)

Anmerkung: Ganz ohne eigene Transferleistung (also das Anpassen gegebener Grundstrukturen auf deine Bedürfnisse) wird das mit FHEM (und jeder anderen HA-Lösung) schwierig...
Nix für ungut, nur meine 2ct.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

flipse

Kann man im Notify nicht auch zwei IF Anweisungen ohne Else stehen lassen?

RGB_Esszimmer:dim.*|RGB_Esszimmer:rgb.*|RGB_Esszimmer.on|RGB_Esszimmer.off
setreading RGB_Esszimmer myLastAction $EVENT;

IF ([RGB_Esszimmer] eq "off")
         (
              set ZWave_SW_Voute_Esszimmer off
         )
ELSE
        (
             IF ("off" eq "off")
             (
                   set ZWave_SW_Esszimmer on,
                   sleep 10
              );

             IF ("$EVTPART0" eq "rgb")
              (
                    set ZWave_SW_RGBW rgb $EVTPART1
              )
             ELSE
             (
                   IF ("$EVTPART0" eq "dim")
                   (
                    set ZWave_SW_RGBW dim $EVTPART1
                    )
             )
         )


Das funktioniert leider nicht.

IF ("off" eq "off")
             (
                   set ZWave_SW_Esszimmer on,
                   sleep 10
              );


Bei diesem Block bekomme ich die Meldung, dass schließende /right Klammern fehlen


RGB_EZ_Chg_n return value: IF: no right bracket: ( IF ("off" eq "off") ( set ZWave_SW_Esszimmer on, sleep 10 )

Beta-User

Zitat von: flipse am 22 Januar 2019, 16:25:45
Kann man im Notify nicht auch zwei IF Anweisungen ohne Else stehen lassen?
Zwei Anmerkungen:
- An sich sehe ich keine großen Probleme dabei (ohne FHEM-IF noch näher zu kennen), mit Perl-if wäre das jedenfalls kein Thema.
- In dem IF-Beispiel aus der cref waren keine ";" drin. Das mit den ";" ist Perl-like ;) . Vielleicht versuchst du es erst mal ohne...

Generelle Empfehlungen bei Fehlermeldungen welcher Art auch immer: Erst mal das Umfeld ansehen und vor allem dann an der Fehlerstelle _genau_ mit den Beispielen vergleichen. Da findet sich in gefühlt 80% schon der Fehler.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

flipse

Zitat von: Beta-User am 22 Januar 2019, 16:33:34
Zwei Anmerkungen:
- An sich sehe ich keine großen Probleme dabei (ohne FHEM-IF noch näher zu kennen), mit Perl-if wäre das jedenfalls kein Thema.
- In dem IF-Beispiel aus der cref waren keine ";" drin. Das mit den ";" ist Perl-like ;) . Vielleicht versuchst du es erst mal ohne...

Generelle Empfehlungen bei Fehlermeldungen welcher Art auch immer: Erst mal das Umfeld ansehen und vor allem dann an der Fehlerstelle _genau_ mit den Beispielen vergleichen. Da findet sich in gefühlt 80% schon der Fehler.

oh man. habs mit nem Komma statt Semikolon versucht. geht... danke

Otto123

Zitat von: ChristianH am 22 Januar 2019, 16:00:24
Tja, dann ist das wohl so ... mir ist nicht klar, wie ich nun also "on" und Zeitfenster mit einem IF/ELSE verknüpfe und stampfe ne Notify ein!

Danke für eure Mühen!

Christian
Hallo Christian,

lös deine Aufgabe doch einfach mit DOIF! Da geht das mit dem Zeitfenster ganz easy.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

ChristianH

Hallo Otto,

das schaue ich mir später noch mal an .... habe bei der Cmandref nun erkannt, dass man schachteln kann, also IF .. IF ... das war mir nicht klar. Ich habe es nun also so angelegt und prüfe also mal zwischen 22:00-23:55 ;)

DashButton_Ariel:b4-7c-9c-73-2f-f6:.short IF ( [Wohnzimmerbeleuchtung] eq "on" )
(
    IF ([22:00-23:55])
    (
        set $SELF inactive,
        set Wohnzimmerbeleuchtung off,
        set IT_V3_Dose3 on-for-timer 1200,
        sleep 2,
        set $SELF active
    )   
    ELSE
    (
        set $SELF inactive,
        set Wohnzimmerbeleuchtung off,
        sleep 2,
        set $SELF active
    )
ELSE
    (
    set $SELF inactive,
    set Wohnzimmerbeleuchtung on,
    sleep 2,
    set $SELF active
    )
)


Morgen bin ich klüger ... wen das läuft, dann schmeiss ich es raus und setze mich an DOIF

Christian


ChristianH

Ja . .... ach ja, läuft noch immer nicht ....

2019.01.23 15:14:56 4: DashButton_Ariel_notify exec IF ( [Wohnzimmerbeleuchtung] eq "on" )
(
    IF ([?22:00-23:55])
    (
        set $SELF inactive,
        set Wohnzimmerbeleuchtung off,
        set IT_V3_Dose3 on-for-timer 1200,
        sleep 2,
        set $SELF active
    )   
    ELSE
    (
        set $SELF inactive,
        set Wohnzimmerbeleuchtung off,
        sleep 2,
        set $SELF active
    )
ELSE
    (
    set $SELF inactive,
    set Wohnzimmerbeleuchtung on,
    sleep 2,
    set $SELF active
    )
)
2019.01.23 15:14:56 1: PERL WARNING: Bareword found where operator expected at (eval 65158) line 1, near ")fhem"
2019.01.23 15:14:56 1: ERROR evaluating my $EVTPART0='b4-7c-9c-73-2f-f6:';my $TYPE='dash_dhcp';my $NAME='DashButton_Ariel';my $SELF='DashButton_Ariel_notify';my $EVENT='b4-7c-9c-73-2f-f6: short';my $EVTPART1='short';{if( InternalIf('Wohnzimmerbeleuchtung','STATE','') eq "on" ){fhem('    IF ([?22:00-23:55])     (         set DashButton_Ariel_notify inactive,        set Wohnzimmerbeleuchtung off,        set IT_V3_Dose3 on-for-timer 1200,        sleep 2,        set DashButton_Ariel_notify active    )       ELSE    (         set DashButton_Ariel_notify inactive,        set Wohnzimmerbeleuchtung off,        sleep 2,        set DashButton_Ariel_notify active    )')fhem('ELSE     (     set DashButton_Ariel_notify inactive');fhem('    set Wohnzimmerbeleuchtung on');fhem('    sleep 2;    set DashButton_Ariel_notify active    )')}}: syntax error at (eval 65158) line 1, near ")fhem"

2019.01.23 15:14:56 3: DashButton_Ariel_notify return value: syntax error at (eval 65158) line 1, near ")fhem"

Otto123

Hi,

sowas kann das IF nicht!
IF ([?22:00-23:55])
Das ist DOIF Syntax!

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

nils_

ZitatZeitabhängig schalten: In der Zeit zwischen 20:00 und 22:00 Uhr soll das Licht ausgehen, wenn es an war und ich den Raum verlasse:

define n_lamp_off notify sensor IF ($hms gt "20:00" and $hms lt "22:00" and [sensor] eq "absent") (set lamp:FILTER=STATE!=off off)

das ist syntax im IF

das andere ist - so wie otto geschrieben hat -  DOIF syntax --> anderes modul.
evtl. guckst du dir das mal an :)
https://commandref.fhem.de/commandref_DE.html#DOIF
viele Wege in FHEM es gibt!

ChristianH

Ok - warum die syntaktisch alle unterschiedlich sind, ist sicher ein feature ;)

Das "?" ist es nicht:

2019.01.23 15:51:49 5: Triggering DashButton_Ariel_notify
2019.01.23 15:51:49 4: DashButton_Ariel_notify exec IF ( [Wohnzimmerbeleuchtung] eq "on" )
(
    IF ([22:00-23:55])
    (
        set $SELF inactive,
        set Wohnzimmerbeleuchtung off,
        set IT_V3_Dose3 on-for-timer 1200,
        sleep 2,
        set $SELF active
    )   
    ELSE
    (
        set $SELF inactive,
        set Wohnzimmerbeleuchtung off,
        sleep 2,
        set $SELF active
    )
ELSE
    (
    set $SELF inactive,
    set Wohnzimmerbeleuchtung on,
    sleep 2,
    set $SELF active
    )
)
2019.01.23 15:51:49 1: PERL WARNING: Bareword found where operator expected at (eval 70915) line 1, near ")fhem"
2019.01.23 15:51:49 1: ERROR evaluating my $EVTPART1='short';my $EVENT='b4-7c-9c-73-2f-f6: short';my $SELF='DashButton_Ariel_notify';my $NAME='DashButton_Ariel';my $EVTPART0='b4-7c-9c-73-2f-f6:';my $TYPE='dash_dhcp';{if( InternalIf('Wohnzimmerbeleuchtung','STATE','') eq "on" ){fhem('    IF ([22:00-23:55])     (         set DashButton_Ariel_notify inactive,        set Wohnzimmerbeleuchtung off,        set IT_V3_Dose3 on-for-timer 1200,        sleep 2,        set DashButton_Ariel_notify active    )       ELSE    (         set DashButton_Ariel_notify inactive,        set Wohnzimmerbeleuchtung off,        sleep 2,        set DashButton_Ariel_notify active    )')fhem('ELSE     (     set DashButton_Ariel_notify inactive');fhem('    set Wohnzimmerbeleuchtung on');fhem('    sleep 2;    set DashButton_Ariel_notify active    )')}}: syntax error at (eval 70915) line 1, near ")fhem"

2019.01.23 15:51:49 3: DashButton_Ariel_notify return value: syntax error at (eval 70915) line 1, near ")fhem"


Was mich wundert, im Debug Output taucht auf einmal vor jedem einzelnen Befehl "fhem(' .." auf.

nils_

ZitatIF ([22:00-23:55])

das geht nicht im zusammenspiel mit IF. egal ob mit ? oder ohne. es geht nicht......
habe auch schon das beispiel aus der commandref gepostet wie man beim IF eine zeitliche abfrage macht.

ansonsten nimm DOIF, da kannste dann mit ? und triggern und nicht triggern und so Sachen rumspielen.

aber achtung: wieder eine etwas andere syntax !!!

Zitat von: ChristianH am 23 Januar 2019, 15:57:41
Was mich wundert, im Debug Output taucht auf einmal vor jedem einzelnen Befehl "fhem(' .." auf.
das macht das IF. und um es vorweg zu nehmen, beim DOIF wird dir sowas noch viel mehr begegnen.
Aber im Grunde muss es dich nicht jucken, wenn du dich an die korrekte (!!!!)  _modulspezifische_ Syntax hältst.
viele Wege in FHEM es gibt!

Otto123

#19
Zitat von: ChristianH am 23 Januar 2019, 15:57:41
Ok - warum die syntaktisch alle unterschiedlich sind, ist sicher ein feature ;)
Weil die Welt bunt ist :)

Was denkst Du warum es IF gibt und warum es DOIF gibt?  ;D

Auf alle Fälle IF kennt keinen Zeitbereich als wahr oder unwahr! Er rechnet eventuell - keine Ahnung.
Du könntest mit IF die Stunde und minute separat abfragen - aber ....  :-X
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Damian

IF ist ein FHEM-Befehl, es kann nicht mehr als ein Perl-if - es vereinfacht lediglich nur die Syntax (intern wird die Angabe in Perl-if übersetzt)

DOIF ist ein FHEM-Modul, es arbeitet eigenständig und kann wesentlich mehr als der IF-Befehl, weil es nicht auf die Perl-if-Syntax angewiesen ist.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF