neuer FHEM-Befehl IF

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

Vorheriges Thema - Nächstes Thema

Damian

Zitat von: rudolfkoenig am 24 Oktober 2014, 17:36:10
Bitte dran denken: if ist nicht gleich IF, das PDF beschreibt if, und hier geht es um IF.
Das ist glaube ich so ein Fall, wovor ich in Beitrag #7 gewarnt habe.
Unter dem Strich sind aber scheinbar mehr Anweder gluecklich mit IF als ungluecklich.

In der Commandref (deutsch) von IF sind jetzt ein paar Gegenüberstellungen von IF und if, um die Unterschiede aufzuzeigen.

Gruß

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

netbus

Hallo Damian,
Ich versuche dein IF mit sunset zu verwenden. Leider funktioniert das nicht.
Mein Code sieht so aus.
define not.test notify test:on IF ([{sunset("REAL",0,"15:00","18:00")}]) (set lamp on) ELSE (set lamp off)
Log:
2014.11.21 10:00:01 3: not.cam return value: IF: unknown Device: {sunset("REAL",0,"15

Damian

Zitat von: netbus am 21 November 2014, 10:07:14
Hallo Damian,
Ich versuche dein IF mit sunset zu verwenden. Leider funktioniert das nicht.
Mein Code sieht so aus.
define not.test notify test:on IF ([{sunset("REAL",0,"15:00","18:00")}]) (set lamp on) ELSE (set lamp off)
Log:
2014.11.21 10:00:01 3: not.cam return value: IF: unknown Device: {sunset("REAL",0,"15
Das kann auch nicht funktionieren.

Ich weiß nicht, was du vorhast. sunset liefert eine Zeichenkette im Format "HH:MM". Was willst du da abfragen? IF wird dir auf jeden Fall keinen Timer setzen.

Gruß

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

netbus

ich will einen befehl unterschiedlich schalten je nach dem ob es schon dunkel ist oder nicht.

Damian

#349
Zitat von: netbus am 21 November 2014, 10:53:35
ich will einen befehl unterschiedlich schalten je nach dem ob es schon dunkel ist oder nicht.
ja, dann müsstest du die Zeit mit der aktuellen vergleichen. Besser wäre mit Hilfe von sunset einen Timer zu setzen. Das kannst du mit DOIF oder at machen.

Gruß

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

igami

Zitat von: netbus am 21 November 2014, 10:53:35
ich will einen befehl unterschiedlich schalten je nach dem ob es schon dunkel ist oder nicht.
Dann brauchst du ein Intervall in dem es dunkel ist, und nicht nur einen Zeitpunkt. Stichwort 'isday'
Es gibt aktuell noch ein anderes Thema in dem soetwas mit DOIF angefasst wird http://forum.fhem.de/index.php/topic,29323.msg221687.html
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

netbus

Zitat von: Damian am 21 November 2014, 11:09:57
ja, dann müsstest du die Zeit mit der aktuellen vergleichen.
Wieso soll ich das mit der aktuellen Zeit vergleichen? In Sunset steckt doch drinnen ob es sonnenuntergang ist oder nicht.?!
Daher mein Code: Wenn ein Ereigniss eintritt dann schau ob es "sunset" ist und wenn ja dann mache das und das.
Zitat von: Damian am 21 November 2014, 11:09:57
Besser wäre mit Hilfe von sunset einen Timer zu setzen.
Was soll der Timer machen? Ich will es ja anhand eines Ereignisses behandeln

Damian

Zitat von: netbus am 21 November 2014, 11:59:36
Wieso soll ich das mit der aktuellen Zeit vergleichen? In Sunset steckt doch drinnen ob es sonnenuntergang ist oder nicht.?!
Daher mein Code: Wenn ein Ereigniss eintritt dann schau ob es "sunset" ist und wenn ja dann mache das und das.Was soll der Timer machen? Ich will es ja anhand eines Ereignisses behandeln
z. B.

define not.test notify test:on IF (sunset("REAL",0,"15:00","18:00") gt $hms) (set lamp on) ELSE (set lamp off)


Gruß

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

netbus

jetzt weiß ich was du mit zeit vergleichen meinst  :D
Funkt. Danke

MarkusN

Moin!

Ich versuche folgenden Notify auf IF umzustellen:

harmony_wz {
    if (Value("harmony_wz") ne "PowerOff") {
        fhem("set licht_livingcolors on;set licht_livingcolors on") if ( Value("licht_livingcolors") ne "on");
        fhem("set licht_kette_weihnachtsbaum on;set licht_kette_weihnachtsbaum on") if ( Value("licht_kette_weihnachtsbaum") ne "on");
    } else {
        fhem("set licht_livingcolors off;set licht_livingcolors off") if ( Value("licht_kette_weihnachtsbaum") ne "off" && Value("ambient_light_should_be_on") ne "on");
        fhem("set licht_kette_weihnachtsbaum off;set licht_kette_weihnachtsbaum off") if ( Value("licht_kette_weihnachtsbaum") ne "off" && Value("ambient_light_should_be_on") ne "on");
    }
}


Ich habe für jede Contition also zwei Aktionen die ich getrennt voneinander abarbeiten will. Irgendwie bekomme ich das jedoch mit IF nicht hin, hier ist das was ich konstruiert habe:

harmony_wz 
IF ([harmony_wz] ne "PowerOff") (
  IF ([licht_kette_weihnachtsbaum] ne "on")(set licht_kette_weihnachtsbaum on,set licht_kette_weihnachtsbaum on);
  IF ([licht_livingcolors] ne "on")(set licht_livingcolors on,set licht_livingcolors on)
) ELSE (
  IF ([licht_kette_weihnachtsbaum] ne "off" and [ambient_light_should_be_on] ne "on")(set licht_kette_weihnachtsbaum off,set licht_kette_weihnachtsbaum off);
  IF ([licht_livingcolors] ne "off" and [ambient_light_should_be_on] ne "on")(set licht_livingcolors off,set licht_livingcolors off)
)


Wenn ich das so anwende bekomme ich bei Events von harmony_wz folgende Syntax-Fehler im Log:

2014.12.20 18:18:56 3: harmony_weihnachtsbaum return value: IF: no left bracket: IF ([licht_kette_weihnachtsbaum] ne "off" and [ambient_light_should_be_on] eq "on")(set licht_kette_weihnachtsbaum off,set licht_kette_weihnachtsbaum off)

Habe ich einen Denkfehler, und kann es nicht so nutzen wie ich vorhabe?

Grüße,

Markus

Damian

Zitat von: MarkusN am 20 Dezember 2014, 18:31:54
Moin!

Ich versuche folgenden Notify auf IF umzustellen:

harmony_wz {
    if (Value("harmony_wz") ne "PowerOff") {
        fhem("set licht_livingcolors on;set licht_livingcolors on") if ( Value("licht_livingcolors") ne "on");
        fhem("set licht_kette_weihnachtsbaum on;set licht_kette_weihnachtsbaum on") if ( Value("licht_kette_weihnachtsbaum") ne "on");
    } else {
        fhem("set licht_livingcolors off;set licht_livingcolors off") if ( Value("licht_kette_weihnachtsbaum") ne "off" && Value("ambient_light_should_be_on") ne "on");
        fhem("set licht_kette_weihnachtsbaum off;set licht_kette_weihnachtsbaum off") if ( Value("licht_kette_weihnachtsbaum") ne "off" && Value("ambient_light_should_be_on") ne "on");
    }
}


Ich habe für jede Contition also zwei Aktionen die ich getrennt voneinander abarbeiten will. Irgendwie bekomme ich das jedoch mit IF nicht hin, hier ist das was ich konstruiert habe:

harmony_wz 
IF ([harmony_wz] ne "PowerOff") (
  IF ([licht_kette_weihnachtsbaum] ne "on")(set licht_kette_weihnachtsbaum on,set licht_kette_weihnachtsbaum on);
  IF ([licht_livingcolors] ne "on")(set licht_livingcolors on,set licht_livingcolors on)
) ELSE (
  IF ([licht_kette_weihnachtsbaum] ne "off" and [ambient_light_should_be_on] ne "on")(set licht_kette_weihnachtsbaum off,set licht_kette_weihnachtsbaum off);
  IF ([licht_livingcolors] ne "off" and [ambient_light_should_be_on] ne "on")(set licht_livingcolors off,set licht_livingcolors off)
)


Wenn ich das so anwende bekomme ich bei Events von harmony_wz folgende Syntax-Fehler im Log:

2014.12.20 18:18:56 3: harmony_weihnachtsbaum return value: IF: no left bracket: IF ([licht_kette_weihnachtsbaum] ne "off" and [ambient_light_should_be_on] eq "on")(set licht_kette_weihnachtsbaum off,set licht_kette_weihnachtsbaum off)

Habe ich einen Denkfehler, und kann es nicht so nutzen wie ich vorhabe?

Grüße,

Markus
Das Trennzeichen bei IF ist Komma insb. auch hier:

IF ([harmony_wz] ne "PowerOff") (
  IF ([licht_kette_weihnachtsbaum] ne "on")(set licht_kette_weihnachtsbaum on,set licht_kette_weihnachtsbaum on);<--
  IF ([licht_livingcolors] ne "on")(set licht_livingcolors on,set licht_livingcolors on)
) ...

Gruß

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

MarkusN

Wahnsinn, kaum macht man es richtig funktioniert es auch. Danke Damian!

Grüße,

Markus

Per

#357
Zitat von: Damian am 26 März 2014, 20:46:46Was  !$defs{Lampe_Terasse_at} bedeutet, kannst du dir jetzt bestimmt schon denken. ;)
Geht bei mir nur als
!$defs{"Lampe_Terasse_at"}

Meine eigentliche Frage:
mit ":d" kann ich auf Zahlen filtern.
Zitat von: Damian am 19 März 2014, 18:50:56IF (([mpl_Herd_m:power:d] > 2) and ([mpl_Herd_m:power:d] < 25)) (set mpl_Herd_switch off)
Mit ":w" eigentlich nach Buchstaben. Auch bei IF?

Weiterhin ist mir aufgefallen, dass der nicht ausgeführte Zweig (also z.B. ELSE trotz TRUE) dennoch geparset wird. Damit bekomme icnh Fehlermeldungen, die ich mit dem IF eigentlich abfangen will.
Beispiel: in $EVENT sind Zahlen und/oder Text. Ich frage, ob nur Text ([xxx:state:d] eq "") und bekomme im ELSE-Zweig den Fehler bzgl. "Bareword", weil sich eben Text in $EVENT befindet. Mein aktueller Fix: Value("xxx"), denn Value wird erst zur Laufzeit ausgewertet und damit eben gar nicht.

Damian

#358
Zitat von: Per am 14 September 2015, 00:52:02
Geht bei mir nur als
!$defs{"Lampe_Terasse_at"}

Meine eigentliche Frage:
mit ":d" kann ich auf Zahlen filtern.Mit ":w" eigentlich nach Buchstaben. Auch bei IF?

Weiterhin ist mir aufgefallen, dass der nicht ausgeführte Zweig (also z.B. ELSE trotz TRUE) dennoch geparset wird. Damit bekomme icnh Fehlermeldungen, die ich mit dem IF eigentlich abfangen will.
Beispiel: in $EVENT sind Zahlen und/oder Text. Ich frage, ob nur Text ([xxx:state:d] eq "") und bekomme im ELSE-Zweig den Fehler bzgl. "Bareword", weil sich eben Text in $EVENT befindet. Mein aktueller Fix: Value("xxx"), denn Value wird erst zur Laufzeit ausgewertet und damit eben gar nicht.

:d entspricht dem regulären Ausdruck: (-?\d+(\.\d+)?).

Man kann auch eigene reguläre Ausdrücke angeben nach der Syntax:

[<Device>:<Reading>:[<regulärer Ausdruck>]]

[<Device>:<Reading>:d] entspricht also:

[<Device>:<Reading>:[(-?\d+(\.\d+)?)]]

Bei IF wird immer die komplette Syntax geprüft bzw. in Perl-if übersetzt.

Gruß

Damian





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

Per

Zitat von: Damian am 14 September 2015, 18:03:08Man kann
Ich aber nicht :(. Perl ist nicht so meins, deshalb mag ich das IF ja so.