FHEM Forum

FHEM => Automatisierung => Thema gestartet von: Damian am 25 Dezember 2013, 23:50:06

Titel: neuer FHEM-Befehl IF
Beitrag von: Damian am 25 Dezember 2013, 23:50:06
Liebe FHEMer,

ich habe mich immer schon daran gestört, dass FHEM keinen if-Befehl hat. Stattdessen werden umständliche Klimmzüge mit Funktionsaufrufen getätigt, die den Code unnötig verkomplizieren.

Ich habe einen FHEM-IF programmiert, der sich im Prinzip, wie Perl-if verhält, allerdings das häufig benötigte Auslesen der Readings unterstützt.

Edit:

IF ist nun ein Bestandteil von FHEM und kommt per FHEM-Update ins Haus.

Doku zu IF: http://fhem.de/commandref_DE.html#IF

Gruß

Damian
Titel: Antw:FHEM if
Beitrag von: det. am 26 Dezember 2013, 00:15:02
Hallo Damian,
Das klingt nach einem sehr willkommenen Baustein in der FHEM Welt, zu dem mir spontan jede Menge Einsatzplätze in meiner FHEM.cfg einfallen.
Titel: Antw:FHEM if
Beitrag von: der-Lolo am 26 Dezember 2013, 08:07:46
Hallo Damian,
Ja das klingt sehr gut - würden bestimmt viele gerne nutzen...
Aber hatte André nicht kürzlich so etwas umgesetzt?
Titel: Antw:FHEM if
Beitrag von: Blockmove am 26 Dezember 2013, 08:18:42
Sehr gute Idee  :)

Als Einsteiger hat mich das fehlende IF schon sehr gestört.
Der Umweg über Funktionen ist natürlich gangbar, aber ein IF...THEN...ELSE ist einfach "freundlicher"

Gruß
Dieter
Titel: Antw:FHEM if
Beitrag von: fh168 am 26 Dezember 2013, 12:11:56
ich bin auch dafür, IF / ELSE hat mir auch schon einige Nerven gekostet.
Titel: Antw:FHEM if
Beitrag von: arnoL am 26 Dezember 2013, 22:59:40
und wo kann man das nu downloaden?

Gruß
Arno
Titel: Antw:FHEM if
Beitrag von: Damian am 26 Dezember 2013, 23:18:38
Zitat von: arnoL am 26 Dezember 2013, 22:59:40
und wo kann man das nu downloaden?
noch nirgends  ;)

Ich bin noch dabei den else-Fall einzubauen.

Da offenbar ein reges Interesse besteht, werde ich den Patch hier zum Testen posten.

Da es sich um einen "echten" FHEM-Befehl handelt, lässt sich dafür kein neues Modul schreiben, stattdessen muss fhem.pl angepasst werden.

Gruß

Damian
Titel: Antw:FHEM if
Beitrag von: rudolfkoenig am 27 Dezember 2013, 00:22:50
Zitatstattdessen muss fhem.pl angepasst werden.

Falsch, siehe jsonlist, xmllist, update, backup, usw.

P.S.: ich weiss nicht genau, ob ich mich ueber dieses Modul freuen oder aergern soll.
- freuen: es vereinfacht manches fuer Anfaenger, und es ermoeglich per Frontend einfache Programme zusammenzuclicken.
- aergern: es verwirrt Anfaenger (perl if oder FHEM if, und damit noch abstrusere "Anfaenger-Erfindungen" als bisher), und faengt an eine zweite Programmiersprache zu definieren (die Forderung nach Schleife usw kommt bestimmt noch), was sicher nie an die Flexibilitaet/Maechtigkeit von perl rankommt, von Doku ganz zu schweigen. Der Benutzer lernt etwas, was er sonst nicht verwenden kann.

Wie gesagt, ich bin unentschlossen, und beobachte das erstmal.
Titel: Antw:FHEM if
Beitrag von: Blockmove am 27 Dezember 2013, 08:26:30
@Rudolf:

Die "Gefahr" einer 2. Programiersprache besteht natürlich.
Allerdings sind teils einfache logische Verknüpfungen mit Perl für einen Anfänger nicht gerade leicht.
Wenn man das Forum liest, dann stösst man täglich darauf.
Vielleicht wäre es nicht die schlechteste Idee wirklich eine fhem Programmiersprache einzuführen.
Vom Aufbau ähnlich vielleicht wie SCL oder ST aus der SPS-Welt...

Gruß
Dieter
Titel: Antw:FHEM if
Beitrag von: Damian am 27 Dezember 2013, 09:06:43
Zitat von: rudolfkoenig am 27 Dezember 2013, 00:22:50
Falsch, siehe jsonlist, xmllist, update, backup, usw.

um so besser, dann kann man den Code auslagern.

Zitat
P.S.: ich weiss nicht genau, ob ich mich ueber dieses Modul freuen oder aergern soll.
- freuen: es vereinfacht manches fuer Anfaenger, und es ermoeglich per Frontend einfache Programme zusammenzuclicken.
- aergern: es verwirrt Anfaenger (perl if oder FHEM if, und damit noch abstrusere "Anfaenger-Erfindungen" als bisher), und faengt an eine zweite Programmiersprache zu definieren (die Forderung nach Schleife usw kommt bestimmt noch), was sicher nie an die Flexibilitaet/Maechtigkeit von perl rankommt, von Doku ganz zu schweigen. Der Benutzer lernt etwas, was er sonst nicht verwenden kann.

Wie gesagt, ich bin unentschlossen, und beobachte das erstmal.

Man könnte es auch anders nennen, um es von perl if zu unterscheiden. if - else ist jedoch den meisten eingängig, da es in den meisten Programmiersprachen vorkommt und es ist keineswegs eine Erfindung von Perl. Deine Bedenken sind dennoch berechtigt.

Ich bin noch nicht fertig, aber wenn du die ca. 70 Zeilen Code siehst (du wirst wahrscheinlich mit deinen Perlkenntnissen mit 30 auskommen  :) ) , dann wirst du sehen, dass es nichts anderes als ein Aufruf von perl-if selbst ist, mit kompletter Mächtigkeit von Perl (inklusive Rekursion) - nur etwas FHEM-freundlicher.

Und ob es die Welt braucht oder nicht - will ich nicht entscheiden, deswegen habe ich diesen Thread angefangen, um die allgemeine Meinung einzufangen und da bin ich mit meiner Meinung offenbar nicht alleine.

Gruß

Damian




Titel: Antw:FHEM if
Beitrag von: Invers am 27 Dezember 2013, 09:29:13
Mich begeistert die Möglichkeit. Ich würde es lieber heute nutzen, als erst morgen. Ich kann natürlich in keiner Weise beurteilen, ob es klug oder unklug ist, eine Art zweite Programmiermöglichkeit einzuführen, aber im Interesse der weiteren Verbreitung von FHEM denke ich, dass solche Konstrukte die Handhabbarkeit und somit die Akzeptanz bei Anfängern deutlich erhöhen könnten.
Natürlich kann man sich in jede Programmiersprache einarbeiten, wenn man einigermassen begabt ist. Aber dafür braucht man Zeit und Engagement. Nicht jeder will das investieren, um einige Steckdosen in Abhängigkeit irgendwelcher Bedingungen zu schalten. Ich habe mit drei Steckdosen angefangen und das fiel mir mit meinen Visual-Basic-Kenntnissen nicht leicht.
Und ich denke es stimmt: Über kurz oder lang werden sicher Rufe nach Schleifen und anderen VB-Befehlen folgen. Perl werde ich wohl nicht so bald so gut verstehen, wie vb und vba, welches die breite Masse mit Programmierkenntnissen eher beherrscht.
Aber, wie gesagt, ist das nur meine derzeitige, persönliche Ansicht. Für mich gesehen ist das eine Tolle Idee, die ich sehr gerne nutzen würde.
Titel: Antw:FHEM if
Beitrag von: hexenmeister am 27 Dezember 2013, 10:52:46
Die Möglichkeit, eine Bedingungen in Form "wenn dies ... mache das ..." zu formulieren, ist sehr verlockend. Sie entspricht wohl viel eher der 'natürlichen Denkweise'. Allerdings verstehe ich auch die Bedenken dagegen.
Ein Vergleich mit einer Programmiersprache wie VB ist nicht wirklich zutreffend. Dort wird die Anweisung gelesen und auch gleich ausgeführt. In FHEM muss diese quasi für die Zukunft 'gemerkt' werden, denn es ist ja nicht bekannt, wann und ob die angegebene Bedingung erfüllt sein wird. Also muss immer wieder überprüft werden, ob dies gerade jetzt der Fall ist. Das kann entweder alle X Minuten (Sekunden?) stattfinden, oder als Reaktion auf bestimmte Ereignisse. Da die Bedingung scheinbar sehr frei formulierbar ist, müssen wohl alle möglichen Ereignisse überprüft werden. Und hier stellt sich mir die Frage: wie sieht es dann mit der Performance aus? Denn (im Unterschied z.B. zu notify) muss die if-Bedingung sehr oft umsonst ausgeführt werden. Vor allem für die Anfänger sehe ich hier die Gefahr, durch eine unglücklich formulierte Anweisung den ganzen Server 'lahm' zu legen (wahrscheinlich ohne sich dann der Ursache überhaupt bewusst zu sein). Bei einer schmalbrüstiger Hardware (FritzBox) ist das ein wichtiger Punkt.

Wenn ich mit dieser Überlegung falsch liege und hier gar kein Performanceproblem besteht, würde ich mich auf diese Möglichkeit sehr freuen.

Grüße,

Alexander
Titel: Antw:FHEM if
Beitrag von: Rince am 27 Dezember 2013, 11:11:17
Ich würde mich darüber freuen.

Gerade das Rudolf, was du mit "zusammenklicken" bezeichnest, empfinde ich als Schlüsselfähigkeit.
In (ferner) Zukunft vielleicht sogar grafisch.

Ich vergleiche es jetzt einfach mit dem ISO/OSI 7 Schichtenmodell.

Wenn für das Wunschziel Layer 7 (grafisches Programmieren) eine Layer vor der Perl-Layer praktisch oder gar nötig ist, warum nicht?

Letztlich ist eine Programmiersprache,  und ich denke mit dieser Aussage trage ich Eulen nach Athen, ja lediglich ein Werkzeug zum Lösen von Aufgaben, oder?
Wenn also anders (durch eine Erweiterung) ein Problem besser gelöst werden kann, warum nicht?


Gerade gelesen: Performance
Verstehe die Bedenken, würde darauf vertrauen, dass dies die Zukunft zeigen wird.
Vielleicht gibt es ja mal nen FHEM internen Taskmanager zur Performance Messung ;)
Titel: Antw:FHEM if
Beitrag von: Damian am 27 Dezember 2013, 11:35:44
Um Performance würde ich mir hier keine Sorgen machen. Es wird genauso oft aufgerufen oder nicht aufgerufen, als wenn man die gleiche Sache mit perl-if programmiert.

Der Unterschied ist das Parsen des fhem Befehls und da sind nur wenige Durchläufe nötig, daher dürfte sich die Verzögerung in wenigen Millisekunden halten (je nach System mehr oder weniger).

Gruß

Damian
Titel: Antw:FHEM if
Beitrag von: Invers am 27 Dezember 2013, 11:48:04
Hier mal zur Auslastung der Fritzbox ein Bild.
Ich glaube, da besteht kein Anlass zur Sorge.
Titel: Antw:FHEM if
Beitrag von: Damian am 27 Dezember 2013, 22:57:57
ein kurzer Zwischenstand zu Performance:

10.000-mal parsen von:

if ((Device1:reading1>10)||(Device2:reading2>=20)) (set lampe on) else (set lampe off)

dauert ca. 4 Sekunden auf einem Atom-Prozessor (dual core).

Eine Fritzbox ist da vielleicht Faktor 10 langsamer.

Also wie erwartet unkritisch. Diese Verzögerung wird keiner bemerken.

Gruß

Damian
Titel: Antw:FHEM if
Beitrag von: hexenmeister am 28 Dezember 2013, 00:45:51
Die Bedenken sind dafür da, um sie zu widerlegen ;)

Ich finde ja die Sache gut, denn diese Art von Steuerung ist intuitiv.
Zitatif ((Device1:reading1>10)||(Device2:reading2>=20)) (set lampe on) else (set lampe off)
Das versteht jeder.


Die Auslastung der Maschine sagt nichts aus, die Parse-Dauer schon eher. Das Problem ist, dass FHEM single threaded implementiert ist. D.h. normale Aufrufe blokieren den ganzen Server für die ganze Dauer der Ausführung. Bei einfachen Readings-Abfragen wird das wohl nie ein Problem sein, wenn ein Benutzer jedoch auf die Idee kommt, irgenwielche HTTP-Aufrufe zu starten, kann das ganz anders aussehen. Es wäre schön, hier irgendeine Art Parallelverarbeitung zu implementieren, dann wäre die Dauer unkritisch.
Titel: Antw:FHEM if
Beitrag von: Blockmove am 28 Dezember 2013, 09:07:21
Zitat von: hexenmeister am 28 Dezember 2013, 00:45:51
Es wäre schön, hier irgendeine Art Parallelverarbeitung zu implementieren, dann wäre die Dauer unkritisch.

Parallelverarbeitung sorgt für weitere Probleme.
Wenn, dann könnte man vielleicht die Visualisierung und die eigentliche Signalverarbeitung trennen.
Bei PLC-Systemen wird dies so gehandhabt.

Gruß
Dieter
Titel: Antw:FHEM if
Beitrag von: hexenmeister am 28 Dezember 2013, 23:14:21
ZitatParallelverarbeitung sorgt für weitere Probleme.
Ganz sicher. Parallelverarbeitung ist anspruhsvoll für den Entwickler und stellt kleinere Systeme (z.B. FritzBox) vor einige Herausforderungen.

ZitatWenn, dann könnte man vielleicht die Visualisierung und die eigentliche Signalverarbeitung trennen.
Das wäre ein Anfang. Grundsätzlich wäre natürlich auch angebracht, alle Module voneinander zu isolieren. Nicht nur bezüglich der Laufzeit, sonder auch der Datenhaushalt. Das würde schon sehr für mehr Stabilität un bessere Reaktionszeiten sorgen. Aber mir ist durchaus klar, dass das ein größeres Vorhaben wäre ;)

Gruß,

Alexander
Titel: Antw:FHEM if
Beitrag von: Damian am 29 Dezember 2013, 00:55:05
Ich habe, um die Bedenken der Verwirrung zwischen perl-if und fhem-if zu entschärfen, den fhem-if Befehl in Großbuchstaben definiert.

Die Syntax lautet:

IF (condition) (FHEM-commands) ELSE (FHEM-commands) oder

IF (condition) {Perl-commands} ELSE {Perl-commands}

Der ELSE-Fall ist natürlich optional. Klammern dürfen nicht weggelassen werden.

Folgende Beispiele habe ich mit anderen Devicenamen bereits erfolgreich getestet:


IF (lamp:state eq "on") (set lamp off) ELSE (set lamp on)
 
IF (Tempsens:temperature > 10) (define set_heating at +00:10 set heating on)

IF (outdoor:humidity > 10) (sleep 10;;set switch on)

define lamp_off at 22:00 IF ($we) (set lamp off)

IF (outdoor:temperature > 10 and outdoor:temperature < 20) (set switch on) ELSE (set switch off)

IF (lamp:state eq "on) (IF (outdoor:humidity < 70) (set lamp off) ELSE (set lamp on)) ELSE (set switch on)
 
define mail notify door:open IF (alarm:state eq "on"){system("wmail @:%")}


Der Code befindet sich im separaten Modul namens 98_IF.pm. Das Modul braucht nur in den FHEM Ordner kopiert zu werden (System natürlich vorher anhalten und neustarten).

Ich bin noch dabei abschießende Tests zu machen und die Doku zu verfassen.

Wenn alles gut geht, werde ich in den nächsten Tagen das Modul hier zum Ausprobieren posten.

Gruß

Damian
Titel: Antw:FHEM if
Beitrag von: hexenmeister am 29 Dezember 2013, 02:18:37
Cool  :D
Bin gespannt!
Titel: Antw:FHEM if
Beitrag von: Damian am 29 Dezember 2013, 17:38:15
Und hier das Modul zum Ausprobieren.

Ob es korrekt geladen wurde, lässt sich feststellen, indem man in der Kommandozeile einfach IF aufruft. Es sollte dann die Usage-Syntax kommen.

Gruß

Damian

Edit: Bitte das aktuelle Modul aus dem ersten Post laden
Titel: Antw:FHEM if
Beitrag von: ph1959de am 29 Dezember 2013, 17:51:37
Hallo Damian,

Vorschlag: das IF.pm bitte im ersten Beitrag des Threads posten und da aktuell halten... sonst geht nachher wieder das Rätselraten los, wo/welche die aktuelle Version ist. Bei Updates dann nur einen neuen Beitrag im Thread mit dem Verweis auf Post#1.

Danke, Peter
Titel: Antw:FHEM if
Beitrag von: Damian am 29 Dezember 2013, 17:56:49
Zitat von: ph1959de am 29 Dezember 2013, 17:51:37
Hallo Damian,

Vorschlag: das IF.pm bitte im ersten Beitrag des Threads posten und da aktuell halten... sonst geht nachher wieder das Rätselraten los, wo/welche die aktuelle Version ist. Bei Updates dann nur einen neuen Beitrag im Thread mit dem Verweis auf Post#1.

Danke, Peter

Kann ich gerne machen, aber erst mal abwarten, welche Resonanz sich ergibt und ob sich eine Weiterentwicklung überhaupt lohnt.

Gruß

Damian
Titel: Antw:FHEM if
Beitrag von: The-Holgi am 29 Dezember 2013, 20:53:14
Hallo, besten Dank dafür. Denke gerade für Anfänger wie mich ist das eine tolle Sache.
Werde ich auf jeden fall testen.

Gruß Holgi
Titel: Antw:FHEM if
Beitrag von: hexenmeister am 29 Dezember 2013, 22:27:44
Je-e-e-etzt sehe ich, dass ich die ganze Zeit etwas falsch verstanden habe.  :o
Ich ging davon aus, dass die 'IF's als eigenständige 'Einheiten' definiert werden und bleiben dann 'in Bereitschaft', bis die Bedingung erfüllt ist. Danach führen sie die angegebenen Befehle aus (also eine Art 'notify').
Daher ist die ganze Diskussion hier über die Performance belanglos. Das 'Parsen' fällt natürlich nicht wirklich ins Gewicht.

Als Hilfe bei der Formulierung und beim Lesen der Definitionen ist IF-Befehl ganz nett.
Habe bei mir kurz getestet, funktioniert gut.

Grüße,

Alexander
Titel: Antw:FHEM if
Beitrag von: Damian am 29 Dezember 2013, 22:45:05
So etwas könnte man auch programmieren, aber da ist notify eigentlich mächtig genug und lässt sich mit IF gut kombinieren, z. B.

define meldung notify tempsensor IF (tempsensor:temperature < 0 and Meldung:state eq "off")(set Meldung on)

Gruß

Damian
Titel: Antw:FHEM if
Beitrag von: hexenmeister am 30 Dezember 2013, 03:09:07
ZitatSo etwas könnte man auch programmieren, aber da ist notify eigentlich mächtig genug und lässt sich mit IF gut kombinieren

Klar kann man  ;D Die Mächtigkeit von notify ist natürlich ausreichend, genau so, wie die Mächtigkeit der in Perl geschriebenen if-Anweisungen ;) Es ging doch darum, die Benutzung intuitiver zu gestalten. Und da kann notify für Anfänger machmal etwas cryptisch erscheinen.

Grüße,

Alexander
Titel: Antw:FHEM if
Beitrag von: Damian am 30 Dezember 2013, 08:39:59
Noch mal kurz zum Verständnis (insb. für Anfänger).

Es handelt sich hier nicht um ein Modul, welches eigenständig arbeitet.

Soll ein Modul eigenständig arbeiten, muss es mit define <name> definierbar sein und das ist bei IF, wie aus den unteren Beispielen erkennbar, nicht der Fall.

Meine Beispiele, die im IF ... anfangen sind nur zur Verdeutlichung der Syntax und machen natürlich nur Sinn in Kombination mit anderen Modulen, die Ausführung von FHEM-Befehlen erlauben, wie z. B. notify, at usw.

Gruß

Damian
Titel: Antw:FHEM if
Beitrag von: Damian am 30 Dezember 2013, 09:04:01
Zitat von: hexenmeister am 30 Dezember 2013, 03:09:07
Es ging doch darum, die Benutzung intuitiver zu gestalten.

Tut es auch:


define meldung notify tempsensor IF (tempsensor:temperature < 0 and Meldung:state eq "off")(set Meldung on)



statt:

define Meldung notify tempsensor {if (ReadingsVal("tempsensor","temperature",0)<0 and ReadingsVal("Meldung","state",0) eq "off") {fhem("set Meldung on")}}
 

Mit einem else-Fall und einer Verschachtelung mehrere if´s  (was nicht selten vorkommt) könnte ich das auch auf die Spitze treiben.  ;)

Gruß

Damian
Titel: Antw:FHEM if
Beitrag von: hexenmeister am 30 Dezember 2013, 10:19:38
ZitatTut es auch:
Sicher, habe ich etwas anderes behauptet? ;)

ZitatMit einem else-Fall und einer Verschachtelung mehrere if´s  (was nicht selten vorkommt) könnte ich das auch auf die Spitze treiben.
Ganz ehrlich, bei komplexen und ineinadergelegten Bedingungen würde ich eine Subroutine im myUtil vorziehen.

Bei notify is es mit einfachen Ereignisssen noch einfach die Übersicht zu behalten. Wenn man mehrere Bedingungen kombinieren will, wäre eine Erleichterung analog Deinem IF schon hilfreich.
Titel: Antw:FHEM if
Beitrag von: Damian am 30 Dezember 2013, 10:28:53
Zitat von: hexenmeister am 30 Dezember 2013, 10:19:38
Bei notify is es mit einfachen Ereignisssen noch einfach die Übersicht zu behalten. Wenn man mehrere Bedingungen kombinieren will, wäre eine Erleichterung analog Deinem IF schon hilfreich.

Ob sich der Aufwand lohnt für die zwei Wörter:?

define Meldung notify tempsensor IF (...

statt

define Meldung <Modulname> (...


Gruß

Damian
Titel: Antw:FHEM if
Beitrag von: hexenmeister am 30 Dezember 2013, 11:00:43
Ansichtssache.
In Deinem Fall wird auf alle Ereignisse reagiert und in der Bedingung entschieden, in meinem wird die Entscheidung gleich vorne vorgenommen. Etwas in er Art 'wenn (helligkeit > X und temperatur > 26 und Zeit zwischen 10:00 und 14:00) dann fahre Rolladen auf 60%'.

Mit IF:
Zitatdefine X notify (lichtsensor|tempsensor) IF(lichtsensor:helligkeit>X and tempsensor:temperatur>26 and ...) (set Rolladen 60%)

Andere Art:
Zitatdefine X when (lichtsensor:helligkeit>X and tempsensor:temperatur>26 and ...) set Rolladen 60%

Ich finde meine Variante sprechender, jedoch nur ein kleines bischen. Daher ist es eigentlich wurscht ;)

Titel: Antw:FHEM if
Beitrag von: Damian am 30 Dezember 2013, 11:04:06
Zitat von: hexenmeister am 30 Dezember 2013, 11:00:43
Ich finde meine Variante sprechender, jedoch nur ein kleines bischen. Daher ist es eigentlich wurscht ;)

Sehe ich auch so, jedoch kannst du IF noch an unzähligen anderen Stellen verwenden.

Gruß

Damian
Titel: Antw:FHEM if
Beitrag von: Damian am 30 Dezember 2013, 12:32:45
Wenn man einmal anfängt, dann kann man es nicht lassen. :)

Plane bereits reguläre Ausdrücke einzubauen und Readingwerte zu nutzen. Dann wäre z B. Folgendes denkbar:

IF (outdoor:temp:[\d\.]* < 10)(set TH_Thermostat desired (indoor:temp:[\d\.]* + 1))

würde bedeuten:

Übernehme nur Zahlen aus dem Reading der Außentemperatur, vergleiche und erhöhe ggf. die Wunschtemperatur im Zimmer abhängig von der aktuellen um 1 Grad.

Spätestens jetzt hätte ein konventionelles perl-if, was den Schreibaufwand angeht, ziemlich verloren.

Gruß

Damian

Titel: Antw:FHEM if
Beitrag von: fiedel am 04 Januar 2014, 09:57:39
Mal als kleine Auflockerung zwischendurch: So könnte das dann in der Zukunft mal aussehen (http://www.startnext.de/pipesbox).

Ich hab mir das durchgelesen und werde den Verdacht nicht los, dass da FHEM "drunter" stecken könnte. Ansonsten ist das ne irre Leistung von den beiden.

Die Entwicklung von erfolgreichen technischen Systemen ist ja fast immer so verlaufen: Begonnen hat es mit einer recht komplizierten, unhandlichen Basis. Dann kam eine "massenkompatible" Benutzerschnittstelle dazu, die dann den Durchbruch brachte. Ist das System ausgereift, hat man am Ende die "Idiotensichere" Oberfläche für die Massen, aber darunter weiterhin den Kern, der Spezis und Entwicklern alle Freiheiten bietet. Bestes Beispiel: Wind- äh... Linux.  ;D

Gruß

Frank
Titel: Antw:FHEM if
Beitrag von: Damian am 04 Januar 2014, 10:44:19
Ja, so sehe ich die Sache auch.

Der eindeutige Vorteil von FHEM ist sicherlich das offene System mit einer starken Bindung zu seiner Programmiersprache, in der es programmiert wurde. Dieser Flexibilität ist sicherlich der Erfolg von FHEM zu verdanken. Gleichzeitig nimmt die Anzahl der Installationen täglich zu, also wird auch der Anspruch an ein einfach zu bedienendes, massentaugliches System immer stärker werden.

Ein einfaches Beispiel, dass die Massentauglichkeit noch lange nicht gegeben ist, lässt sich täglich im Forum nachlesen, wie z. B. gestern hier:

http://forum.fhem.de/index.php/topic,18288.0.html

Gruß

Damian
Titel: Antw:FHEM if
Beitrag von: Invers am 04 Januar 2014, 10:56:00
Für mich ein komisches Gefühl, als schlechtes Beispiel angeführt zu werden. Aber ansonsten stimmt es. Massentauglich kann man hier sicher nicht behaupten.
Ich verfüge über Programmierkenntnisse in Assembler (lange her) Turbopascal, Basic, VB und VBA. Dennoch ist das hier für mich schon eine gewaltige Umstellung.
Nun stelle man sich vor, wie ein völlig Unbeleckter an die Sache herangeht. Da geben doch die meisten Leute auf, wenn sie das sehen.
Für eine wirkliche Massentauglichket benötigt man wahrscheinlich eine Oberfläche, wo man sich alles zusammenklicken kann.
Titel: Antw:FHEM if
Beitrag von: Damian am 04 Januar 2014, 11:15:15
Zitat von: Invers am 04 Januar 2014, 10:56:00
Für mich ein komisches Gefühl, als schlechtes Beispiel angeführt zu werden.

Nichts für ungut.

Es ist kein schlechtes, sondern ein gutes, weil ein typisches Beispiel.

Gruß

Damian
Titel: Antw:FHEM if
Beitrag von: Invers am 04 Januar 2014, 11:19:10
Nehme ich nicht persönlich, da du ja auch Recht hast, wie meine Ausführungen bestätigt haben dürften.
Titel: Antw:FHEM IF
Beitrag von: Damian am 16 Januar 2014, 19:52:45
Kurz vorab zur Info.

Ich bin in der abschließenden Testphase einer neuen Version des IF-Befehls. Wenn alle Tests positiv verlaufen, werde ich die neue Version im ersten Post anhängen.

Diese Version ist erheblich mächtiger als die erste.

Syntax: IF (<condition>) (<commands>) ELSE (<commands>)

Und nun die Features:

-echte Klammerhierarchie: beliebige Schachtelungstiefe der IF-Anweisung in Kombination mit beliebigen FHEM-Befehlen auf jeder Klammerebene

-Erkennung von fehlenden Klammern

-beliebige Filtermöglichkeiten im Reading durch Unterstützung von regulären Ausdrücken. Für einfache Filterung nach Standards, wie z. B. Zahlen
sind einfache Formatangaben möglich. Z. Zt. d für Dezimalzahlen, zukünftig können auch andere vereinfachte Filtermöglichkeiten eingepflegt werden,

-Unmittelbare Nutzung von Readings im IF- bzw. ELSE-Fall

-Auswertung der Readings in Kombination mit beliebigen Berechnungen vor der Ausführung insb. bei FHEM-Befehlen

-FHEM-Befehle können weiterhin mit perl-Befehlen in geschweiften Klammern kombiniert werden.


Durch den Einsatz von regulären Ausdrücken, in denen alle möglichen Zeichen vorkommen können, war es erforderlich
für das eindeutige Parsen der Readings, diese besonders zu klammern.

Syntax für Readingangaben:

[<Device>:<Reading>:<Format>|[<regexp>]]

<Format> und <regexp> sind optional.

Hier ein Beispiel der Anforderung einige Posts zuvor:

define LuefterEin at +*00:20:00 {my $actuator = (ReadingsVal("FHT_4955","actuator",0) =~ /(-?\d+(\.\d+)?)/) ? $1 : 0);;
if ((ReadingsVal("FHT_4955","temperature",0) + 0.1 < ReadingsVal("FHT_4955","desired-temp",0)) and ($1 > 15)) { fhem ("set Luefter on")}}


sieht mit der zweiten Version von IF so aus:

define LuefterEin at +*00:20:00 IF ([FHT_4955:temperature]+0.1 <[FHT_4955:desired-temp] and ([FHT_4955:actuator:d] > 15))(set Luefter on)

Oder ein anders Beispiel, bei dem Readings zum Setzen der Temperatur im IF-Fall genutzt werden, um mal die Vereinfachung und die neuen Möglichkeiten
der zweiten Version des IF-Befehls eindrucksvoll zu demonstrieren.

Aufgabe:

Übernehme nur Zahlen aus dem Reading der Außentemperatur und nur den Zustand "on" oder "off" aus dem Status des dummys,
vergleiche und erhöhe  ggf. einmalig die Wunschtemperatur im Zimmer abhängig von der aktuellen um 1 Grad.

IF ([outdoor:temp:d] < 10 and [dummy:state:[(on|off)]] eq "on") (set TH_Thermostat desired {[indoor:temp:d] + 1};;set dummy off)

würde in perl ungefähr so aussehen (wenn ich mich nicht vertippt habe ;)):

{my $outdoor=(ReadingsVal("outdoor","temperature",0) =~ /(-?\d+(\.\d+)?)/) ? $1 : 0;; my $indoor=(ReadingsVal("indoor","temperature",0) =~ /(-?\d+(\.\d+)?)/) ? $1 : 0;;
  my $dummy=(ReadingsVal("dummy","state",0) =~ /(on|off)/) ? $1 : 0;; if ($outdoor < 10 and $dummy eq "on") {fhem "set TH_Thermostat desired ".eval($indoor+1);;fhem "set dummy off"}} 


Vielleicht hilft es dem Einen oder Anderen zukünftig einen einfacheren Einstieg in FHEM zu finden und damit FHEM einen kleinen Schritt näher in Richtung Massentauglichkeit zu bringen :)

Gruß

Damian

Titel: Antw:FHEM IF
Beitrag von: Rince am 16 Januar 2014, 20:57:52
Auf jeden Fall liest es sich sehr eindrucksvoll :)

Ich hätte dafür sofort Verwendung ;)
Titel: Antw:FHEM IF
Beitrag von: Franz Tenbrock am 16 Januar 2014, 21:49:55
Hallo
hab vor 30 Jahren mal im Studium ein paar Fortran( war es glaube ich ) Stunden gehört
mehr nicht.
Trotz allem kann ich nun schon so einige steuern messen und auch loggen und anzeigen.
irgendwie konnte ich mit notify bisher nichts anfangen, mit dem if denke ich ist das für mich irgenwie verständlicher.
Hab heute Abend zum ersten mal hier gelesen und doch so einiges shcon verstanden.
Wichtig wäre ein Wiki mit Beispielen.
Fast alles aus dem Anfängerpdf habe ich verstanden weil es einfach gut erklärt war und vor allem weil genügend Beispiele da waren die man dann anpassen konnte.
Ich denke viele haben doch in ihrem Heim identische Abläufe.
In der Übergangszeit würde ich gerne die warme Luft aus meinem Kaltwintergarten über Lüftungsrohre in meine Haus pusten. Dafür zb wäre der if Befehl zB super.
Mittel sDashboard kann man selbst als Anfänger und ohne Programmierkenntnisse doch schon heute eine leicht bedienbare Oberfläche anpassen.
Werde das Modul sicher in Kürze ausprobieren.
Das was an FHEm einfach Spass macht ist die Offenheit und das was hier entwickelt wird,
echt irre...
und die Hilfe ist in der Regel auch super
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 20 Januar 2014, 17:24:01
Meine Tests sind abgeschlossen. Im ersten Post habe ich die neue Version mit Dokumentation angehängt.

Wichtiger Hinweis!

Ich habe mich gegen das Semikolon als Trennzeichen zwischen den Befehlen entschieden. Das Problem ist, dass FHEM bisher keine Klammernhierarchie kennt.
Das führt dazu, dass für jede Ebene das Semikolon verdoppelt werden muss. In Folge bedeutet das, dass wenn man ein notify- oder at-Kommando mit IF
kombinieren will, bereits vier Semikolons angeben werden müssten, damit eins beim If-Befehl ankommt. Wenn man eine Ebene weiter geht z. B. notify mit at und IF kombinieren wollte, müsste man schon acht! Semikolons für ein Trennzeichen angeben - so etwas wollte ich keinem Anwender zumuten und habe mich für ein Komma als Trennzeichen entschieden - siehe Beispiele im ersten Post.

Probleme, Anmerkungen oder Erfahrungen mit IF bitte hier posten.

Gruß

Damian



Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Zrrronggg! am 20 Januar 2014, 22:11:28
Nur um mal eine abweichende Meinung abzugeben:  ich verstehe nicht, warum wir das brauchen.
if, else, elsif in Perl funktionieren und sind im FHEM Umfeld gut einsetzbar. Die dazu nötigen Klammer(ebenen) sind meiner Aufassung nach verstehbar (ich hatte vor FHEM keine Ahnung von perl), und nicht besonders aufwendig ( besonders wenn man nicht einige hier in letzter Zeit in Mode gekommen Konstrukte verwendet, die anscheinend wahllos noch überall Semikolons und zusätzliche Klammereben einführt).

Will keineswegs deine Arbeit schlecht machen oder so, ich verstehe nur nicht wozu wir das brauchen.

Ansonsten sehe ich Potential für zusätzliche Verwirrung gerade bei Anfängern. Leute, die meinen, man müsse grundsätzlich sowas schreiben:

define test at 13:00  { fhem("set xy on");;}

werden sich garantiert in den verscheidenen IF/if verhaspeln, die bunt mischen und sich wundern, was da alles raus kommt. Siehe "wann darf ich sleep verwenden und wann nicht"


Nur meine Meinung natürlich.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 20 Januar 2014, 22:31:16
Zitat von: Zrrronggg! am 20 Januar 2014, 22:11:28

Ansonsten sehe ich Potential für zusätzliche Verwirrung gerade bei Anfängern. Leute, die meinen, man müsse grundsätzlich sowas schreiben:

define test at 13:00  { fhem("set xy on");;}


Und warum tun die das? Ganz einfach, weil sie als Anfänger nicht zwischen Perl und FHEM unterscheiden können und weil sie mindestens in jedem zweiten Beispiel einen bunten Mix aus FHEM und Perl-Befehlen zu sehen bekommen, weil sie zur Lösung ihrer Probleme mit nur FHEM-Befehlen nicht weiter kommen - nur meine Meinung.

Gruß

Damian

Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Zrrronggg! am 20 Januar 2014, 23:26:46
a) besser Erklären
b) Hilfskonstrukte bauen


b) hat aus meiner Sicht den Nachteil, das man am Ende a) trotzdem machen muss, nur vielleicht etwas später.



Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 21 Januar 2014, 09:07:02
Zitat von: Zrrronggg! am 20 Januar 2014, 23:26:46
a) besser Erklären
b) Hilfskonstrukte bauen


b) hat aus meiner Sicht den Nachteil, das man am Ende a) trotzdem machen muss, nur vielleicht etwas später.

Sicher, allerdings behebt das nicht die Ursache des Problems, wenn das System für einfache Standardfälle nicht intuitiv genug ist.

Ich will es nochmal am einfachen Beispiel festmachen.

Da will jemand eine Zahl übernehmen und in Abhangigkeit der Größe einen Schalter schalten. Eigentlich eine triviale Sache und sollte mit Hilfe eines Automatisationssystem mit den Grundfunktionen einfach und intuitiv realisierbar sein.

Mögliche Lösung heute:

define LuefterEin at +*00:20:00 {my $actuator = (ReadingsVal("FHT_4955","actuator",0) =~ /(-?\d+(\.\d+)?)/) ? $1 : 0);;if ($1 > 15) { fhem ("set Luefter on")}}

Man kann es versuchen zu erklären, wobei man schon für reguläre Ausdrücke eine Vorlesung halten könnte.

Oder das System bietet die Möglichkeit es einfach und intuitiv zu realisieren, dann erspart man sich jegliche Erklärung.

define LuefterEin at +*00:20:00 IF ([FHT_4955:actuator:d] > 15)(set Luefter on)

Die einzige Erklärung wäre vielleicht, dass das d beim actuator zum Filtern von Zahlen ist, alles andere dürfte intuitiv klar sein.

Und ich möchte noch mal festhalten: Ich habe es nicht deswegen zum Download angeboten, weil ich es wollte, sondern weil es die User wollten - warum wohl?

Gruß

Damian 
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Franz Tenbrock am 21 Januar 2014, 10:52:48
Als Anfänger ohne vorherige Programmierkenntnisse muss ich sagen das die 2. Zeile definitiv deutlich einfacher zu verstehen ist.
Generell ist es wichtig für mich gewesen Beispiele die man nachbauen kann zu haben.
Das Einsteiger PDf war hier Gold wert.
Lieber ein Beipiel mehr als eins zu wenig.

Das mit dem D in der Zeile wurde ja zum Glück auch angesprochen, darüber wäre ich gestolpert.
FHEM ist so mächtig das es halt am Anfang schwer ist den Überblick zu bekommen. Nicht jedem liegt es auch die commandref zu lesen und auch zu verstehen.
Viele sind es nciht gewohnt in ihrem Alltag täglich English zu lesen, und darüber hinaus es dann auch noch zu verstehen.

Für Anfänger zumindest reichen für sehr viele Aufgaben sicher auch einzelne if Schleifen.

Ich werde es in Kürze zumindest sicher ausprobieren udn freue mich schon.

Hatte noch keien Zeit im Wiki zu forschen ob da schon was steht. Das Wiki war für mcih schon sehr häufig sehr hilfreich.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: kermi am 21 Januar 2014, 12:21:19
Ich habe schon seit über 2 Jahren ein gut funktionierendes FHEM - System auf meiner FB.
Trotz dieser langen Zeit habe ich auch heute noch immer Probleme bei diversen Codezeilen und ohne entsprechende Beispiele bin ich aufgeschmissen. Da hilft mir auch kein commandref lesen, teilweise verstehe ich auch da den Zusammenhang nicht.
Ich bin einfacher Anwender und möchte dieses bei FHEM auch bleiben. Natürlich muss man sich mit FHEM auseinandersetzen, sich in die Materie einarbeiten aber deswegen gleich ein Perl-Studium hinlegen??

Ich finde den FHEM-Befehl IF einfach nur genial, es wird mir in Zukunft viele grauen Haare und noch mehr Zeit sparen.

Gruß
Stephan
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Zrrronggg! am 21 Januar 2014, 12:38:09
Eure Einwände sind mir klar und ich hatte die Probleme auch.

Nur: FHEM wird nie wirklich einfach sein und erfordert intensive Beschäftigung mit der Materie.
Wieviel Zeit man da reinstecken will oder je nach "Vorbildung" muss ist sicher recht unterschiedlich.

Ich habe meinen Standpunkt vorgetragen, ihr euren. Mehr ist's nicht.

Aber wo wir gerade dabei sind, was fragt
  ([FHT_4955:actuator:d] > 15)
denn konkret ab?
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Joachim am 21 Januar 2014, 12:56:58
Moin Zrrronggg!,

ZitatNur: FHEM wird nie wirklich einfach sein und erfordert intensive Beschäftigung mit der Materie.
hier hast Du 100% recht, aber muss man sich deshalb das Leben noch schwerer machen, als es ohnehin schon ist?
Wenn ich mir diese beiden Zeilen ansehe:
Zitatdefine LuefterEin at +*00:20:00 {my $actuator = (ReadingsVal("FHT_4955","actuator",0) =~ /(-?\d+(\.\d+)?)/) ? $1 : 0);;if ($1 > 15) { fhem ("set Luefter on")}}
Zitatdefine LuefterEin at +*00:20:00 IF ([FHT_4955:actuator:d] > 15)(set Luefter on)
dann spriche das eigentlich Bände.
Und wer es nicht mag, kann auch weiterhin die alte Möglichkeit verwenden.
Das wird wahscheinlich in eine ähnliche Glaubensfrage herauslaufen, wie das direkte Bearbeiten der fhem.cfg.

Gruß Joachim
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: rudolfkoenig am 21 Januar 2014, 13:24:08
Die perl Version ist unnoetigerweise kompliziert, und kann auch als
define LuefterEin at +*00:20:00 {fhem ("set Luefter on") if(int(ReadingsVal("FHT_4955","actuator",0)) > 15) }

geschrieben werden.

Vermutlich wird dieses IF  fuer viele Anfaenger/Nicht-Programmierer eine Erleichterung sein und fuer die Fortgeschrittenen gleichzeitig Verwirrung stiften. Da die Betroffenen keine Doku lesen, weiss ich nicht, wie man diese Verwirrung mindern soll.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Zrrronggg! am 21 Januar 2014, 14:04:57
Zitat
Zitatdefine LuefterEin at +*00:20:00 {my $actuator = (ReadingsVal("FHT_4955","actuator",0) =~ /(-?\d+(\.\d+)?)/) ? $1 : 0);;if ($1 > 15) { fhem ("set Luefter on")}}

define LuefterEin at +*00:20:00 IF ([FHT_4955:actuator:d] > 15)(set Luefter on)
dann spriche das eigentlich Bände.

Ja, aber das ist 1. eine extremes Beispiel und ausserdem scheint mir das erste Beispiel auch noch deutlich einfacher schreibbar zu sein. Im Moment verstehe ich noch nicht, was das genau machen soll.


EDIT: Ich sehe gerade Rudolf hat schon gepostet.


Das ist genau das Problem. Viele machen die Sachen hier komplizierter als nötig. Die Kreativität mit der manche hier einfachste Sachen möglichst komplex formulieren erstaunt mich immer wieder. Am Anfang habe ich sogar gedacht ich übersehe irgendwas oder habe einfach zu wenig Ahnung. Ein schönes Beispiel ist der Wikiartikel zum Thema "Stellen des Datums bei FHTs".

Da wird nämlich folgendes Vorgeschlagen:

define fht_setdate notify fht_setdate { \
if ( $year gt 2010 ) {\
  my @@fhts=devspec2array("TYPE=FHT");; \
  foreach(@@fhts) { \
   my $cmd="set ".$_." date time";;\
   fhem $cmd;;\
   Log 4, "sent cmd ".$cmd;;\
  } \
} else {\
   Log 1, "error setting date for fhts: year <= 2010 - date invalid?!"\
}\
}
define t_fht_setdate at *02:00:00 trigger fht_setdate


wärend ich mir als Anfänger immer mit

define fht_dateupdate at *04:00:01 set TYPE=FHT date
define fht_timeupdate at *05:00:01 set TYPE=FHT time


geholfen habe und mich monatelang gefragt habe, wo ich damit zu kurz gedacht habe (mal vom Test auf Jahr > 2010 abgesehen, den ich im Zeitalter von ntp auch nicht sooo nützlich fand).

Daraus dann abzuleiten, dass man Befehle einfacher machen muss ist ... äh ... nicht unbedingt zwingend.

Auch Damians neue Sachen werden von den Ornamentkünstlern sehr schnell kreativ verkompliziert werden   ;)
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 21 Januar 2014, 17:21:43
Zitat von: rudolfkoenig am 21 Januar 2014, 13:24:08
Vermutlich wird dieses IF  fuer viele Anfaenger/Nicht-Programmierer eine Erleichterung sein und fuer die Fortgeschrittenen gleichzeitig Verwirrung stiften. Da die Betroffenen keine Doku lesen, weiss ich nicht, wie man diese Verwirrung mindern soll.

Sehe ich noch nicht mal so kritisch, denn die Anfänger kann man immer auf die Commandref des Befehls verweisen und die kann man mit vielen praktischen Beispielen bestücken (das habe ich übrigens im THRESHOLD-Modul gemacht und die Leute kommen gut klar damit). Die Fortgeschrittenen mit Perl-Kenntnissen sollten doch relativ schnell erkennen, was dahinter steckt und den Unterschied zwischen einem Perl-Befehl und einem Nicht-Perl-Befehl erkennen können.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 21 Januar 2014, 17:39:40
Zitat von: Zrrronggg! am 21 Januar 2014, 14:04:57
Das ist genau das Problem. Viele machen die Sachen hier komplizierter als nötig.

OK. Dann ein anderes Beispiel: Ich möchte hinter einem at-Befehl im Reading nach on oder off filtern, weil da noch andere Sachen stehen und bei on einen Schalter schalten. Könntest du mir dafür eine kurze Lösung geben, bevor ich dir meine gebe?

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: rudolfkoenig am 21 Januar 2014, 18:09:04
define at *10:00 { fhem "set N2 on" if(ReadingsVal("N1","R1","D1") =~ m/on/) }


@Damian: ich will nicht dein IF schlechtreden, es ist einfacher fuer Anfaenger, und ist fuer bestimmte Fragestellungen kuerzer als ein Perl Ausdruck. Das ist kein Kunststueck, ich kann auch Aufgaben finden, die mit IF nicht oder nur haesslich zu realisieren sind.

Die Frage ist: macht man es den Anfaengern am Anfang leichter, und dafuer spaeter schwerer, oder gleich am Anfang schwer. :) Dein IF ist keine vollstaendige/etablierte/dokumentierte Sprache, und Anfaenger lernen damit was, was sie spaeter nicht verwenden koennen.
Man wird versuchen dich zu ueberzeugen, die "wenigen" fehlenden Elemente, die eine Sprache ausmachen, auch zu implementieren.

Ich bin nicht gegen IF (offensichtlich gibt es Bedarf dafuer), will aber, dass es deutlich dokumentiert wird.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 21 Januar 2014, 19:03:06
Zitat von: rudolfkoenig am 21 Januar 2014, 18:09:04
define at *10:00 { fhem "set N2 on" if(ReadingsVal("N1","R1","D1") =~ m/on/) }

OK das ist schon ziemlich kurz - ist ja vom Perl-Experten ;) (nebenbei: das m hättest du auch noch weglassen können)

Dass meine Lösung kürzer und intuitiver für Nicht-Perl-Experten wäre, brauche ich natürlich jetzt nicht zu nennen. Die z. Zt. vollständige deutsche Doku steht ja im ersten Post.

Es wäre interessant die Grenzen von IF auszuloten. Der Programmierer ist oft selbst irgendwann betriebsblind und sieht einfache Dinge nicht.
Ich habe den Parser versucht ziemlich vollständig zu implementieren. Übrigens in dem Zusammenhang: Eine Implementierung von Klammerebenen würde auch dem FHEM-Parser gut tun und das könnte man sogar abwärtskompatibel machen, denn die Geschichte mit dem Maskieren von Semikolons, ist aus meiner Sicht keine schöne Lösung und führt immer wieder zur Verwirrung.

Es wird z. Zt. hier viel über grundsätzliche Sachen diskutiert, was im Grunde auch gut ist, denn so schaut man etwas über den Tellerrand und kann auch frischen Wind in ein System bringen. Wir sollten aber erst mal abwarten, welche Erfahrungen es mit IF gibt, denn bisher gibt es noch kein Erfahrungsfeedback.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: DrBytebreaker am 22 Januar 2014, 16:40:21
Bitte, Damian, mach weiter mit den FHEM IF.
Der Erfolg von Systemen hängt von der Einfachheit ab. Und FHEM hat Erfolg verdient. Wer nicht den Anspruch hat, schwierigste Zusammenhänge programmieren zu wollen, sondern nur ein funktionierendes System auf die Beine zu stellen, ist dankbar für alle Vereinfachungen. Warum haben Windows, MAC OS, Apps, Tabletts Erfolg? Genial einfach zu verwenden ohne Kommandozeileneditor für schnelle gute Ergebnisse....Wer mehr will, muss dann eben tiefer graben. Aber nicht gleich von Anfang an.
Vor der ganz großen Lösung mit einer eigenen Sprache bevorzuge ich einfache, leicht erstellbare Grundfunktionen. Weitergehendes kann man immer irgendwie durch Sonderzeichenkolonnen, Klammerkonstruktionen und ausgelagerte Skripte erreichen. Die FHEM-IF-Geschichte ist jedenfalls definitiv Grundfunktion für mich und dürfte Erfolgspotenzial haben.
:)

Das ist jetzt mal meine ganz ehrliche Meinung. Mit Respekt vor allen, die das Projekt bisher so aktiv und leidenschaftlich vorangebracht haben.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 22 Januar 2014, 20:59:40
Zitat von: DrBytebreaker am 22 Januar 2014, 16:40:21
Der Erfolg von Systemen hängt von der Einfachheit ab.

Wo wir wieder bei Grundsatzdiskussion wären.
Ich will mal versuchen zu erklären, warum die Mischung verschiedener Sprachen problematisch ist.

Wenn man eine höhere Programmiersprache (z. B. Perl) erlernen will, dann schaut man sich im Internet diverse Dokumentationen an und findet relativ schnell eine Lösung, weil es ein gesetzter Standard ist und wenn man schon mal eine höhere Programmiersprache gelernt hat, dann fällt es einem relativ leicht sich die Konstrukte der anderen Sprache schnell anzueignen - so ging es mir zumindest, als ich vor einem Jahr noch nicht mal wusste wie man das Wort "Perl" überhaupt schreibt.

Befindet man sich in einem anderen System, hier: FHEM, dann gelten dort ebenfalls gesetzte Regeln und Konstrukte und auch dafür gibt es Dokumentation, die man nachlesen kann, hier: Die Commandref

Und nun kommt die Mischung aus Beidem. Ich will es mal an dem vorherigen, relativ einfachen Beispiel von Rudi erklären:

define at *10:00 { fhem "set N2 on" if(ReadingsVal("N1","R1","D1") =~ m/on/) }

Es fängt ja mit der Definition eines Moduls (hier at). Das heißt, ich befinde mich in der FHEM-Welt. Das erwarte ich auch, da ich so etwas in der Kommandozeile eingeben kann. Nun geht es weiter mit der geschweiften Klammer. Da fragen man sich schon: Ist das die Sache des FHEM-Parsers oder ist das vielleicht bereits ein Block in Perl, denn dort werden Blöcke auch in geschweifte Klammern gesetzt. Wenn man nun herausgefunden hat, dass der FHEM-Parser dafür zuständig ist, dann kommt der nächster Bezeichner "fhem". Jetzt muss ich bereits wissen, dass FHEM die Kontrolle inzwischen an Perl übergeben hat. Wenn man das herausgefunden hat, kommt die nächste Frage: Ist das eine Funktion? Aber Funktionen besitzen üblicherweise Klammern und hier kommt bereits das Anführungszeichen. Nun muss man wissen, dass man in Perl bei Funktionen Klammern auch weglassen kann, der Inhalt scheint nun wieder FHEM-Welt zu sein, die mit dem nächsten Anführungszeichen wieder endet. Dann kommt ein if, da es kein Modul namens if in FHEM gibt, kann es sich jetzt wieder nur um Perl-Welt handeln. Dann kommt offenbar ein Funktionsaufruf mit Parametern. Den findet man nicht direkt unter den Modul-Namen von FHEM und auch nicht in der Perldokumentation, sondern in irgendwelchen Beispielen, die hier hundertfach kursieren. Nun weiß ich, dass ReadingsVal eine Funktion in Perl ist, die mir den Inhalt des Readings liefert und ich stoße zugleich auf einen Konstrukt, den ich noch in keiner anderen Programmiersprache gesehen habe =~. OK, es handelt sich hier offenbar um Perl-Welt und da finde ich in der entsprechenden Perl-Dokumentation, dass man damit nach Zeichenketten suchen kann.

Nun kann jeder mal nachzählen, wie oft die zwei Welten hier gewechselt haben und das macht die Sache so undurchschaubar, denn es entsteht immer die Frage: Wo kann ich hierzu eine Erklärung oder Lösung finden?

Ich habe die Vermischung beider Welten immer vermieden. Entweder konnte ich es mit Grundfunktionen ohne Perl realisieren, oder ich habe mir ein FHEM-Modul gebaut, welches mein Problem löst, jedoch nur Funktionsaufrufe in Perl nutzt, aber niemals FHEM-Befehle. Ich bin also immer in einer Welt geblieben. Nun kann aber nicht jeder gleich sich sein FHEM-Modul selbst bauen und tüftelt an abenteuerlichen Konstruktionen, die eine undurchsichtige Mischung zweier Welten darstellt, weil zu Grundfunktionalität von FHEM nach Ansicht vieler hier, offenbar Perl zählt - und das sehe ich anders. Ich muss ja auch nicht Java kennen, wenn ich ein Handy bediene, ich muss nicht Assembler kennen, wenn ich Java programmiere, ich muss nicht die Architektur eines bestimmten Prozessortyps kennen, wenn ich Assembler programmiere usw.

In diesem Sinne ...

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Invers am 22 Januar 2014, 22:02:31
Das erinnert mich etwas an eine frühere Diskussion, die ein Forum mit mir führte. Da ging es darum, ob denn eine Kamera im Handy genau so gut sein kann, wie eine Kamera. Ich war damals der Meinung - ja.
alle meinten nein. Nun ratet mal, wer Recht hatte?
Lasst doch den Dingen einfach ihren Lauf. Die Zeit wird entscheiden, wer richtig lag.
Jemand macht sich Mühe und bringt etwas Neues. Soll man ihn da bremsen?
Eine Fehlentwicklung ist das IF sicher nicht. Ob es ein Bombenerfolg wird oder ein Strohfeuer, ist Spekulation.
Wenn jemand sein Heim automatisiert, ist es ja erst einmal nur für ihn selbst gedacht. Und er kommt dann damit auch zurecht, selbst dann, wenn es in thailändisch programmiert ist. Leichter und schwerer ist auch von Gehirn zu Gehirn unterschiedlich zu betrachten. Ich bin offen für jede Entwicklung. Was ich dann später toll finden werde, weiss ich heute auch noch nicht. Aber wer einen Weg noch nie gegangen ist, kann auch die Eindrücke nicht beschreiben. Also versuchen wirs doch einfach, um so mehr Zeit bleibt für die Entwicklungen, statt sie hier in Diskussionen zu stecken. Viele Erfindungen wurden schon falsch eingeschätzt. Warten wirs ab.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 23 Januar 2014, 15:18:59
Zitat von: Invers am 22 Januar 2014, 22:02:31
Aber wer einen Weg noch nie gegangen ist, kann auch die Eindrücke nicht beschreiben.

Nach diesem Motto.

Wer Interesse an dem Befehl hat, der sollte ihn aus dem ersten Post laden, FHEM herunterfahren, die Datei 98_IF.pm in FHEM-Verzeichnis kopieren, FHEM wieder hochfahren und dann für seine Problemstellung ausgiebig testen. Anschließend Rückmeldung (positiv, wie auch negativ) hier posten. So kann man möglichst schnell herausfinden, ob die Sache alltagstauglich ist oder nicht. Und dann kann Rudi entscheiden, ob er den Befehl aufnimmt oder nicht.

Ich, für meinen Teil, habe ihn in diversen Szenarien bereits getestet und habe zunächst meine Entwicklung abgeschlossen.

Und noch eins zum Verständnis:

Dieser Befehl ist in erster Linie dazu gedacht, ihn auf der FHEM-Ebene zu nutzen, also in Kombination mit anderen FHEM-Befehlen, um nicht unnötig auf die Perlebene zu müssen (siehe Beispiele im ersten Post).

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: kermi am 23 Januar 2014, 19:57:35
Hallo Damian,

Frei nach deinem Beispiel :
define activity notify move IF ([move:state[(on|off)] eq "on" and $we) (set lamp off)

habe ich mal testweise bei mir folgendes eingegeben:
Zitatdefine flur_Bewegungsmelder notify dimmer_flur_detekt_Sw_01 IF ([dimmer_flur_detekt_Sw_01:state[(closed|open)] eq "closed") (set dimmer_flur_kanal1 100 0 5) ELSE (set dimmer_flur_kanal1 0 0 5)

bekomme folgende Fehlermeldung:
Zitatflur_Bewegungsmelder return value: IF: no right bracket: [dimmer_flur_detekt_Sw_01:state[(closed|open)] eq "closed"

unterm Strich, es fehlt eine rechte Klammer, nur wo?

Gruß
Stephan
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 23 Januar 2014, 20:00:22
define flur_Bewegungsmelder notify dimmer_flur_detekt_Sw_01 IF ([dimmer_flur_detekt_Sw_01:state:[(closed|open)]] eq "closed") (set dimmer_flur_kanal1 100 0 5) ELSE (set dimmer_flur_kanal1 0 0 5)

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 23 Januar 2014, 20:04:01
wenn allerdings der Zustand nur closed oder open ist, brauchst du auch nicht zu filtern es reicht dann auch:

define flur_Bewegungsmelder notify dimmer_flur_detekt_Sw_01 IF ([dimmer_flur_detekt_Sw_01:state] eq "closed") (set dimmer_flur_kanal1 100 0 5) ELSE (set dimmer_flur_kanal1 0 0 5)

Gruß
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: kermi am 23 Januar 2014, 20:12:32
alles klar, funktioniert bestens.
Danke.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 23 Januar 2014, 20:17:01
Zitat von: kermi am 23 Januar 2014, 20:12:32
alles klar, funktioniert bestens.
Danke.

Übrigens, da war noch ein Tippfehler in der Doku - es fehlte ein Doppelpunkt als Trennzeichen, es muss heißen:


define activity notify move IF ([move:state:[(on|off)]] eq "on" and $we) (set lamp off)

habe es gerade korrigiert.

Aber wie gesagt, wenn die Zustände eindeutig sind, braucht man auch nicht zu filtern.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: stgeran am 23 Januar 2014, 21:37:14
Ich bekomme es nicht gebacken:
define Wandtaster_T3 notify CUL_HM_HM_PBI_4_FM_2436B1_Btn_03 IF (Value("toggle1") eq "on")(set schalter1 on,set toggle1 off) ELSE (set schalter1 off,set toggle1 on)
Wo ist mein Fehler, das Licht geht an und gleich wieder aus. Das sagt der Event Monitor:
2014-01-23 21:35:29 IT schalter1 on
2014-01-23 21:35:29 dummy toggle1 off
2014-01-23 21:35:30 IT schalter1 off
2014-01-23 21:35:30 dummy toggle1 on
2014-01-23 21:35:30 CUL_HM CUL_HM_HM_PBI_4_FM_2436B1_Btn_03 Short (to broadcast)
2014-01-23 21:35:30 CUL_HM CUL_HM_HM_PBI_4_FM_2436B1_Btn_03 trigger: Short_81
2014-01-23 21:35:30 CUL_HM Wandtaster_Kamin battery: ok
2014-01-23 21:35:30 CUL_HM Wandtaster_Kamin CUL_HM_HM_PBI_4_FM_2436B1_Btn_03 Short (to broadcast)
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 23 Januar 2014, 21:39:05

define Wandtaster_T3 notify CUL_HM_HM_PBI_4_FM_2436B1_Btn_03 IF ([toggle1:state] eq "on")(set schalter1 on,set toggle1 off) ELSE (set schalter1 off,set toggle1 on)

Gruß

Damian

Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 23 Januar 2014, 22:16:06
Dein Notify reagiert auf alle Events von  CUL_HM_HM_PBI_4_FM_2436B1_Btn_03, da du beim notify nicht genau angegeben hast, auf welche Events er reagieren soll und dein Tastendruck erzeugt offenbar zwei Events, dann wird natürlich auch das FHEM-Kommando, hier also IF, zweimal aufgerufen.

Du musst also beim notify eine passende Filteroption angeben, damit das IF-Kommando bei einem Tastendruck auch nur einmal aufgerufen wird.

z. B. auf Short filtern:

define Wandtaster_T3 notify CUL_HM_HM_PBI_4_FM_2436B1_Btn_03:Short.* IF ([toggle1:state] eq "on")(set schalter1 on,set toggle1 off) ELSE (set schalter1 off,set toggle1 on)

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: stgeran am 23 Januar 2014, 22:35:58
GEHT!!!
Dann hat es auch auf ...short und ...long reagiert und deshalb zweimal ausgeführt.
Danke!
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 23 Januar 2014, 22:38:51
Zitat von: stgeran am 23 Januar 2014, 22:35:58
GEHT!!!
Dann hat es auch auf ...short und ...long reagiert und deshalb zweimal ausgeführt.
Danke!
eher auf:

2014-01-23 21:35:30 CUL_HM CUL_HM_HM_PBI_4_FM_2436B1_Btn_03 trigger: Short_81

was offenbar bei short mitgesendet wird (siehe dein Eventlog).

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: der-Lolo am 26 Januar 2014, 10:48:01
Guten Morgen Damian,
ich würde gerne mein derzeitiges schalten der Subwoofer Steckdose verändern...
aktuell habe ich folgendes definiert

define subwoofer_an notify DenonAVR:on { if ($hour ~~ [8..21]) { fhem 'set HUEDevice7 on' }\
else { fhem 'set HUEDevice7 off' }}
attr subwoofer_an room develop


DenonAVR liefert mir aber auch ein Reading "volume_level_pct"
Ich würde nun gerne etwas nutzen wie
define subwoofer_an notify DenonAVR:volume_level_pct >30 { if ($hour ~~ [8..21]) { fhem 'set HUEDevice7 on' }

Ich grüble schon länger ob dein IF dabei behilflich ist oder aber doch das Threshold Modul.
Richtig toll wäre noch wenn die abfrage auf $hour negativ ausfällt - es also nacht ist ein eigenes Icon setzen zu können.

Wäre toll wenn du mir kurz weiterhilfst...
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 26 Januar 2014, 11:33:44
Soll dein Subwoofer nur beim Einschalten deines Receiver angehen?
Soll der Subwoofer beim Ausschalten des Receivers ausgehen?
wenn ja, dann vielleicht so etwas:

define subwoofer_an notify DenonAVR:(on|off)  IF (([DenonAVR:state] eq "on") and ($hour ~~ [8..21]) and ([DenonAVR:volume_level_pct]>30)) (set HUEDevice7 on) ELSE (set HUEDevice7 off)


Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: der-Lolo am 26 Januar 2014, 12:52:50
ZitatSoll dein Subwoofer nur beim Einschalten deines Receiver angehen?
Soll der Subwoofer beim Ausschalten des Receivers ausgehen?

ja, so soll es sein.

Das habe ich sofort mal ausprobiert, es funktioniert leider noch nicht...

Vielleicht liegt es an dem geliefertem Zahlenwert vom DenonAVR er arbeitet in 0.5% schritten...
29.5
30
30.5
habe aber auch werte größer 30.5 also 31 probiert.

Muss ich vielleicht noch mit .*arbeiten um evtl. vorhandene Leerzeichen zu erschlagen?


EDIT:
ich bin ein bisschen weiter, ein READING state gibt es nicht, STATE steht nur in den Internals.
Deswegen habe ich umgebaut auf

DenonAVR:(on|off)  IF (([DenonAVR:power] eq "on") and ($hour ~~ [8..21]) and ([DenonAVR:volume_level_pct]>30)) (set HUEDevice7 on) ELSE (set HUEDevice7 off)


Ergebnis: Es funktioniert falschrum - wenn ich den Denon ausschalte wird HUEDevice7 an geschaltet,
wenn ich ihn anschalte wird HUEDevice7 aus geschaltet...
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 26 Januar 2014, 16:08:25
Zitat von: der-Lolo am 26 Januar 2014, 12:52:50
Ergebnis: Es funktioniert falschrum - wenn ich den Denon ausschalte wird HUEDevice7 an geschaltet,
wenn ich ihn anschalte wird HUEDevice7 aus geschaltet...

Dann mach mal list DenonAVR und poste das Ergebnis, sonst muss ich vieles raten.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: der-Lolo am 26 Januar 2014, 16:41:18
ein list DenonAVR liefert:


Internals:
   CFGFN      /opt/fhem/FHEM/sys.cfg
   DEF        192.168.178.60
   DeviceName 192.168.178.60:23
   FD         14
   NAME       DenonAVR
   NR         197
   PARTIAL   
   STATE      off
   TYPE       DENON_AVR
   CHANGETIME:
   Helper:
     Dblog:
       Input:
         Mydblog:
           TIME       1390743584.98804
           VALUE      TV
       Mute:
         Mydblog:
           TIME       1390743584.98804
           VALUE      off
       Power:
         Mydblog:
           TIME       1390750791.64597
           VALUE      off
       State:
         Mydblog:
           TIME       1390743906.94147
           VALUE      off
       Volume_level:
         Mydblog:
           TIME       1390743891.86793
           VALUE      -36
       Volume_level_pct:
         Mydblog:
           TIME       1390743891.86793
           VALUE      44
   Readings:
     2014-01-26 14:39:44   input           TV
     2014-01-26 14:39:44   mute            off
     2014-01-26 16:39:51   power           off
     2014-01-26 14:44:51   volume_level    -36
     2014-01-26 14:44:51   volume_level_pct 44
Attributes:
   devStateIcon on:power-green:off off:power-black:on
   group      Geräte
   room       Media
   webCmd     :
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 26 Januar 2014, 17:25:32
Ist denn power on, wenn ein Event für´s Einschalten kommt?

Wie sehen die Events im EventMonitor aus, wenn du den Receiver einschaltest?

Wenn power nicht mit dem Status übereinstimmt, dann kannst du noch probieren:


define subwoofer_an notify DenonAVR:(on|off)  IF ((Value("DenonAVR") eq "on") and ($hour ~~ [8..21]) and ([DenonAVR:volume_level_pct]>30)) (set HUEDevice7 on) ELSE (set HUEDevice7 off)


Wenn das auch nicht hilft, dann die IF-Abfrage erstmal ohne $hour- und dann ohne volume_level_pct-Bedingung probieren.

Gruß

Damian

Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: der-Lolo am 26 Januar 2014, 18:22:24
Vielleicht ist das problem das on mehrfach kommt...

der Event Monitor:
Zitat
2014-01-26 17:57:43 HUEDevice HUEDevice7 bri: 254
2014-01-26 17:57:43 HUEDevice HUEDevice7 onoff: 1
2014-01-26 17:57:43 HUEDevice HUEDevice7 level: 100 %
2014-01-26 17:57:43 HUEDevice HUEDevice7 pct: 100
2014-01-26 17:57:43 HUEDevice HUEDevice7 on
2014-01-26 17:57:43 HUEDevice HUEDevice7 RGB: 000000
2014-01-26 17:57:43 DENON_AVR DenonAVR on
2014-01-26 17:57:43 HUEDevice HUEDevice8 RGB: 000000
2014-01-26 17:57:43 DENON_AVR DenonAVR power: on
2014-01-26 17:57:44 HUEDevice HUEDevice15 RGB: 000000
2014-01-26 17:57:44 HUEDevice HUEDevice16 RGB: 000000
2014-01-26 17:57:44 HUEDevice HUEDevice6 RGB: ff700a
2014-01-26 17:57:44 HUEDevice HUEDevice11 RGB: f2881e
2014-01-26 17:57:44 HUEDevice HUEDevice3 RGB: f38721
2014-01-26 17:57:45 HUEDevice HUEDevice12 RGB: ffc148
2014-01-26 17:57:45 HUEDevice HUEDevice2 RGB: f38721
2014-01-26 17:57:45 HUEDevice HUEDevice14 RGB: c42e2d
2014-01-26 17:57:46 HUEDevice HUEDevice4 RGB: f38721
2014-01-26 17:57:46 HUEDevice HUEDevice13 RGB: ffc148
2014-01-26 17:57:46 HUEDevice HUEDevice5 RGB: 000000
2014-01-26 17:57:46 HUEDevice HUEDevice9 RGB: 000000
2014-01-26 17:57:46 HUEDevice HUEDevice1 RGB: 000000
2014-01-26 17:57:52 DENON_AVR DenonAVR power: on

on kommt nach dem schalten über das DenonAVR Modul dreimal.
Der letzte on kommt wenn es knack macht und die Endstufen bereit zur Wiedergabe sind...

HUEDevice7 schaltet weil ich zur zeit die set befehle vor und nach dem ELSE vertauscht habe,
ich wollte testen ob denn die abfrage volume_pct funktioniert...
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 26 Januar 2014, 19:11:51
Zitat von: der-Lolo am 26 Januar 2014, 18:22:24
Vielleicht ist das problem das on mehrfach kommt...
on kommt nach dem schalten über das DenonAVR Modul dreimal.

Gefiltert wird aber nur nach "on" bzw. "off" und das kommt nur einmal vor:

2014-01-26 17:57:43 DENON_AVR DenonAVR on

Die anderen sind: "power on".

Gruß

Damian

Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: der-Lolo am 28 Januar 2014, 17:38:14
Ich habe nun die volume_pct rausgenommen und auch die $hour abfrage entfernt...

wenn der Denon off liefert wird die Steckdose angeschaltet - bei on aus...

DenonAVR:(on|off) IF ([DenonAVR:power] eq "on") (set HUEDevice16 on) ELSE (set HUEDevice16 off)

wieso ist denn das verdreht?

Zitat
Events:
2014-01-28 17:39:35 HUEDevice HUEDevice16 bri: 254
2014-01-28 17:39:35 HUEDevice HUEDevice16 onoff: 0
2014-01-28 17:39:35 HUEDevice HUEDevice16 RGB: 000000
2014-01-28 17:39:35 DENON_AVR DenonAVR on
2014-01-28 17:39:35 DENON_AVR DenonAVR power: on
2014-01-28 17:39:40 HUEDevice HUEDevice16 onoff: 1
2014-01-28 17:39:40 HUEDevice HUEDevice16 level: 100 %
2014-01-28 17:39:40 HUEDevice HUEDevice16 pct: 100
2014-01-28 17:39:40 HUEDevice HUEDevice16 on
2014-01-28 17:39:40 HUEDevice HUEDevice16 RGB: 000000
2014-01-28 17:39:40 DENON_AVR DenonAVR off
2014-01-28 17:39:40 DENON_AVR DenonAVR power: off
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 28 Januar 2014, 17:48:10
Zitat von: der-Lolo am 28 Januar 2014, 17:38:14
Ich habe nun die volume_pct rausgenommen und auch die $hour abfrage entfernt...

wenn der Denon off liefert wird die Steckdose angeschaltet - bei on aus...

DenonAVR:(on|off) IF ([DenonAVR:power] eq "on") (set HUEDevice16 on) ELSE (set HUEDevice16 off)

wieso ist denn das verdreht?
Du kannst es auch direkt in der Kommandozeile testen.

z. B.

IF (1)  (set HUEDevice16 on) ELSE (set HUEDevice16 off)

müsste Steckdose anmachen

IF (0)  (set HUEDevice16 on) ELSE (set HUEDevice16 off)

müsste Steckdose ausmachen.

Dann mal nach dem aktuellen Zustand von power schauen und bei  power= "on"

IF ([DenonAVR:power] eq "on") (set HUEDevice16 on) ELSE (set HUEDevice16 off)

aufrufen

Jetzt sollte Steckdose angehen.

Wenn das alles funktioniert, dann kann ich mir nur erklären, dass, wie schon geschrieben, zum Eventzeitpunkt power noch nicht on ist.

Gruß

Damian


Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: der-Lolo am 28 Januar 2014, 17:55:10
Ja - das funktioniert alles anstandslos...

sobald ich aber das IF hinter das DenonAVR(on|off) setze geht es nicht mehr.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 28 Januar 2014, 18:02:22
Zitat von: der-Lolo am 28 Januar 2014, 17:55:10
Ja - das funktioniert alles anstandslos...
OK. Dann ist das so, wie ich es vermutete (kann man auch aus dem EventLog erkennen). Zuerst kommt Event on und dann erst power: on. Das heißt, wenn Event auf on getrigger wird, steht wohl noch im Reading von power der alte Zustand off und paar Millisekunden später erst der passende Zustand.

Du hast zwei Möglichkeiten, entweder, wie ich schon vorhin vorgeschlagen habe, IF ((Value("DenonAVR") eq "on") ... abfragen, denn der Zustand passt zum Event oder auf power: on triggern also:

define subwoofer_an notify DenonAVR:(power: on|power: off) IF (([DenonAVR:power] eq "on") ...


Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: der-Lolo am 28 Januar 2014, 18:20:04
also die 2te Variante liefert mir:

define subwoofer_an notify DenonAVR:(power: on|power: off) IF (([DenonAVR:power] eq "on")
Bad regexp: Unmatched ( in regex; marked by <-- HERE in m/^DenonAVR:( <-- HERE power:$/ at ./FHEM/91_notify.pm line 38.


IF ((Value("DenonAVR") eq "on")
schaltet wieder wie gehabt falschrum...
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 28 Januar 2014, 18:31:23
Zitat von: der-Lolo am 28 Januar 2014, 18:20:04
IF ((Value("DenonAVR") eq "on")
schaltet wieder wie gehabt falschrum...

Verstehe ich nicht???

Dann probier noch mal:

define subwoofer_an notify DenonAVR:(power..on|power..off) IF (([DenonAVR:power] eq "on")...

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: der-Lolo am 28 Januar 2014, 18:46:36
define subwoofer_an notify DenonAVR:(power..on|power..off) IF ([DenonAVR:power] eq "on") (set HUEDevice16 on) ELSE (set HUEDevice16 off)

schaltet nun die Steckdose passend zum zustand des Verstärkers...
Danke schonmal bis hierher... vorallem für Deine Geduld.
Ich versuch dann jetzt das $hour wieder einzufügen und die abfrage auf volume


EDIT:

define subwoofer_an notify DenonAVR:(power..on|power..off) IF (([DenonAVR:power] eq "on") and ([DenonAVR:volume_level_pct:]>..30) and ($hour ~~ [8..21])) (set HUEDevice7 on) ELSE (set HUEDevice7 off)

schaltet nun wie gewünscht erst bei Lautstärke >30 die Steckdose an, einen Schönheitsfehler hat das Konstrukt aber noch:
Wenn ich das nun richtig analysiert habe liefert der Denon ca. alle 5 Minuten ein power on das Konstrukt prüft scheinbar nicht auf Änderungen des Pegels sondern auf das event power on - im heftigstem fall schaltet die Steckdose also bis zu 5 Minuten zu spät...
Würde es was bringen wenn ich die volume abfrage nach vorne direkt hinter das IF setze?
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 29 Januar 2014, 17:37:49
Zitat von: der-Lolo am 28 Januar 2014, 18:46:36
Wenn ich das nun richtig analysiert habe liefert der Denon ca. alle 5 Minuten ein power on das Konstrukt prüft scheinbar nicht auf Änderungen des Pegels sondern auf das event power on - im heftigstem fall schaltet die Steckdose also bis zu 5 Minuten zu spät...
Würde es was bringen wenn ich die volume abfrage nach vorne direkt hinter das IF setze?
Die Änderung der Reihenfolge in der Abfrage bei IF würde nichts bringen. Wenn dein power on Event alle 5 Minuten kommt, dann wird jedes mal auch die Steckdose geschaltet - das macht dann nicht viel Sinn.
Das mehrfache Schalten könnte man evtl. mit der neuen Filteroption des set-Befehls unterdrücken oder einen zweiten IF-Befehl einbauen oder gleich THRESHOLD-Modul nehmen.

Ich verstehe aber immer noch nicht, warum die Abfrage nach dem Status mit Value(..) nicht funktioniert, obwohl on gesetzt wird - das wäre die elegantere Version.

Gruß

Damian

Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: kermi am 29 Januar 2014, 21:29:00
Hallo Damian,

super Sache, dein Modul, ich benutze es mittlerweile ziemlich oft.

Kann an auch nach einem Zahlenbereich filtern? Also z.B. >50 <100 .
Nutzen will ich es für eine einfache Statusmeldung bei bestimmten Füllständen einer Abwassergrube:

define sensor_grube_leer notify sensor_grube IF ([sensor_grube:rawValue] < 300) (set DisplayLed_16 led off)

Gruss
Stephan
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: der-Lolo am 29 Januar 2014, 21:47:44
Er schaltet ja je nach Pegel, also unter 30 aus über 30 an.
Aber eben nur in dem Moment wenn der Denon sein power on gibt. Im ~5minuten Takt kommt das ja scheinbar... Das gleiche passiert wenn ich gestern Abend alles richtig gedeutet habe auch bei der $hour Abfrage...
Keine Ahnung warum das Denon Modul so arbeitet, vielleicht soll es so etwas wie ein keep alive sein... Vielleicht sollte ich mal im Denon Thread fragen... Die haben wohl auch noch ne Alternative im Thread zur zeit nutze ich DENON_AVR es gibt auch noch DENONX_AVR und DENONZ_AVR...

Oder eben doch Threshold...
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 29 Januar 2014, 22:42:34
Zitat von: kermi am 29 Januar 2014, 21:29:00
Kann an auch nach einem Zahlenbereich filtern? Also z.B. >50 <100 .
Nutzen will ich es für eine einfache Statusmeldung bei bestimmten Füllständen einer Abwassergrube:

define sensor_grube_leer notify sensor_grube IF ([sensor_grube:rawValue] < 300) (set DisplayLed_16 led off)
Hallo Stephan,

es freut mich, dass es dir hilft.

Es ist vielleicht noch nicht deutlich geworden, aber du kannst damit alles machen, was du auch in Perl machen könntest. Im Klartext, Operationen nutzen wie: and, or, eq (gleich bei Zeichenketten), ne (ungleich bei Zeichenketten), <= (keiner gleich), >= (größer gleich), == (gleich bei Zahlen), != (ungleich bei Zahlen) usw.

Ich werde es noch in die Doku aufnehmen. Für deinen Fall bedeutet das:

define sensor_grube_leer notify sensor_grube IF ([sensor_grube:rawValue] > 50 and [sensor_grube:rawValue] < 300) (set DisplayLed_16 led off)

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: kermi am 29 Januar 2014, 23:24:46
jetzt ist es mir deutlich geworden, manchmal steht man doch echt auf dem Schlauch.
Damit wird dein "IF" ja noch wesentlich mächtiger, mir fallen ja schon wieder tausend Sachen ein.

Schönen Abend noch.
Stephan
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Navigator am 02 Februar 2014, 21:07:36
Danke, vielen dank für die Erweiterung. Ich betreibe hauptsächlich eine XS1 und bin nur interessehalber auf FHEM gestossen.  Jetzt habe ich beide Systeme und mal versucht meine XS Konfig auf FHEM zu übertragen. Die Aktoren und Sensoren anlegen ist ja noch ein leichtes, aber die Automatisierung der Scripte die in der XS fast ausschliesslich mit IF ELSE beschrieben werden, haben mich hier fast verzweifeln lassen.

Ein Beispiel aus meiner alten Konfigurtaion.

Eine Lichtautomatik angeschlossen an FS20 Dimmer, die je nach Aussenhelligkeit und dem Status Sonnenuntergang das Licht langsam hochdimmen und sich der Helligekeit anpassen.

if(lclminofday>(sunset-60))&&(lclminofday<(sunset+60))&&(Anwesenheit==100){if(Lichtautomatik_Deko<25)&&(Helligkeit==8.4||Helligkeit==8.3){_Daem_V2.1;Lichtautomatik_Deko=25;}
if(Lichtautomatik_Deko<50)&&(Helligkeit==8.1||Helligkeit==8){_Daem_V2.2;Lichtautomatik_Deko=50;}}

Eigentlich einfach zu lesender Code, ich möchte gern mal wissen wie sowas in FHEM Perl Code aussehen könnte.

Mir ist es bis jetzt als Anfänger sebst nicht gelungen ein ähnliches Konstukt in FHEM zu realisieren, man denkt einfach immer in alten Bahnen und ich hoffe mit dieser Erweiterung wieder ein kleines Erfolgserlebnis zu haben.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 02 Februar 2014, 21:31:22
Zitat von: Dittel am 02 Februar 2014, 21:07:36
Mir ist es bis jetzt als Anfänger sebst nicht gelungen ein ähnliches Konstukt in FHEM zu realisieren, man denkt einfach immer in alten Bahnen und ich hoffe mit dieser Erweiterung wieder ein kleines Erfolgserlebnis zu haben.
Ja, kann ich sehr gut nachvollziehen - auch als Perlprogrammierer.

Sobald ich etwas Zeit finde, möchte ich noch weitere typische Abfragen im IF vereinfachen. Z. B. Zeitabfrage (wird immer wieder benötigt), Abfragen von Internals (insb. Status) oder Attribute.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Navigator am 02 Februar 2014, 21:37:34
Danke Damian,

gibt es den Download noch oder hast du ihn wieder entfernt? Kann ihn gar nicht finden und es eigentlich kaum noch erwarten.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 02 Februar 2014, 21:39:16
Zitat von: Dittel am 02 Februar 2014, 21:37:34
Danke Damian,

gibt es den Download noch oder hast du ihn wieder entfernt? Kann ihn gar nicht finden und es eigentlich kaum noch erwarten.

Solange es nicht eingecheckt ist, kannst du immer die aktuelle Version aus dem ersten Post downloaden.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Navigator am 02 Februar 2014, 21:45:15
Ach da unten ist es versteckt. Danke.  8)
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: kermi am 06 Februar 2014, 17:35:25
bekomme ich dieses:

define sensor_grube_leer notify sensor_grube IF ([sensor_grube:content] > 0 and [sensor_grube:content] < 4000) (set DisplayLed_16 led off)
define sensor_grube_viertel notify sensor_grube IF ([sensor_grube:content] > 4000 and [sensor_grube:content] < 5000) (set DisplayLed_16 led green)
define sensor_grube_halb notify sensor_grube IF ([sensor_grube:content] > 5000 and [sensor_grube:content] < 6000) (set DisplayLed_16 led orange)
define sensor_grube_voll notify sensor_grube IF ([sensor_grube:content] > 6000) (set DisplayLed_16 led red)


eigentlich auch mit verschachteltem IF hin?

Gruß
Stephan
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 06 Februar 2014, 18:36:34
Zitat von: kermi am 06 Februar 2014, 17:35:25
bekomme ich dieses:

define sensor_grube_leer notify sensor_grube IF ([sensor_grube:content] > 0 and [sensor_grube:content] < 4000) (set DisplayLed_16 led off)
define sensor_grube_viertel notify sensor_grube IF ([sensor_grube:content] > 4000 and [sensor_grube:content] < 5000) (set DisplayLed_16 led green)
define sensor_grube_halb notify sensor_grube IF ([sensor_grube:content] > 5000 and [sensor_grube:content] < 6000) (set DisplayLed_16 led orange)
define sensor_grube_voll notify sensor_grube IF ([sensor_grube:content] > 6000) (set DisplayLed_16 led red)


eigentlich auch mit verschachteltem IF hin?

Gruß
Stephan

kein Problem mit:

define sensor_grube_leer notify sensor_grube
IF ([sensor_grube:content] > 6000)
  (set DisplayLed_16 led red)
ELSE (
  IF ([sensor_grube:content] > 5000)
    (set DisplayLed_16 led orange)
  ELSE (
    IF ([sensor_grube:content] > 4000)
      (set DisplayLed_16 led green)
    ELSE
      (set DisplayLed_16 led off)
  )
)


Selbst die Einrückungen kannst du für die Übersicht,  wie in jeder höheren Programmiersprache, in der DEF-Eingabe so vornehmen.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: kermi am 06 Februar 2014, 20:58:59
genial, super, vielen DANKE!!

so ähnlich hatte ich es 2 Tage lang mit immer leicht angeändertem Syntax probiert aber nicht hinbekommen.
Nun wusste ich auch nicht genau ob dieses mehrfache verschachteln unterstützt wird.

Gruß
Stephan
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 06 Februar 2014, 21:43:56
Ich würde dir empfehlen noch einen FILTER bei set zu setzen, damit du nicht jedes mal unnötig das Kommando absetzt, auch wenn sich die Zustandsanzeige nicht ändern soll.

Wenn der Zustand (state) in DisplayLed_16 red, orange oder green ist, dann könntest du z. B. einbauen:

(set DisplayLed_16:FILTER=STATE!=red led red)

damit wird der set-Befehl nur dann ausgeführt, wenn Displayled_16 seinen Zustand auch ändern soll, hier am Beispiel von red.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: kermi am 06 Februar 2014, 22:05:12
das habe ich eigentlich am Sensor so gelöst.
attr sensor_grube event-on-change-reading battery,content,rawValue
Damit bekomme ich zumindest nur Logeinträge bei Statusänderung aber der Filter hört sich irgendwie eleganter an.

Gruß
Stephan
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 06 Februar 2014, 22:06:51
Zitat von: kermi am 06 Februar 2014, 22:05:12
das habe ich eigentlich am Sensor so gelöst.
attr sensor_grube event-on-change-reading battery,content,rawValue
Damit bekomme ich zumindest nur Logeinträge bei Statusänderung aber der Filter hört sich irgendwie eleganter an.

Gruß
Stephan

ja, aber wenn der Sensor z. B. von 7000 auf 7001 geht, dann wird bei dir unnötig red geschaltet.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: kermi am 06 Februar 2014, 22:16:49
stimmt auch wieder, zwar nur bei Statusänderung aber der Bereich ist ja ziemlich groß.
Na dann werde ich mal den Filter noch setzten und Danke für den Hinweis.

Gruß
Stephan
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 07 Februar 2014, 17:40:43
Ich habe im ersten Post die Dokumentation erweitert, u. a. zu:

-mögliche Operatoren

-Nutzung mehrerer Zeilen mit Einrückung zwecks übersichtlicher Darstellung von Klammerebenen.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: mele am 07 Februar 2014, 20:30:14
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
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 07 Februar 2014, 21:04:03
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

Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: der-Lolo am 08 Februar 2014, 10:07:42
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...
Titel: Antw:neuer FHEM-Befehl IF
Beitrag 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...
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 10 Februar 2014, 22:34:10
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
Titel: Antw:neuer FHEM-Befehl IF
Beitrag 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.

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.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 10 Februar 2014, 22:56:41
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
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: der-Lolo am 10 Februar 2014, 22:59:17
Okay, dann hab ich jetzt gerade richtig was gelernt...

Tausend Dank!
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 13 Februar 2014, 18:30:53
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


Titel: Antw:neuer FHEM-Befehl IF
Beitrag 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)))


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
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 17 Februar 2014, 22:30:48
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
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 17 Februar 2014, 22:57:23
Im zweiten Bespiel waren noch die Klammern falsch gesetzt - habe das zweite Beispiel gerade angepasst.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag 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.



Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 17 Februar 2014, 23:03:34
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)


Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: noice am 17 Februar 2014, 23:23:31

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
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 18 Februar 2014, 09:49:26
Zitat von: noice am 17 Februar 2014, 23:23:31

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

Dann funktioniert ja alles, wie programmiert.  :)

Die Fehlermeldungen kommen natürlich immer dann, wenn "aus" definiert wird und nicht zum Zuge kommt (hier um 23:00 Uhr), wie jetzt bei deinen Tests.

Ich würde solche Zeitverzögerungen +00:00:30 statt mit at mit sleep machen.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: noice am 18 Februar 2014, 11:01:41
Danke nochmals.
ich werde das jetzt mal so laufen lassen. mal sehen wie es dann in der Praxis aussieht.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Eisingstone am 19 Februar 2014, 21:52:03
Hallo Damian,

erst einmal Danke für all die Mühen die Du bisher in dieses Modul gesteckt hast.
Einige Sachen habe ich mit der neuen Möglichkeit umgesetzt bekommen, aber nun habe ich den Punkt erreicht wo ich absolut nicht weiterkomme, vielleicht hast Du da eine Idee wieso es nicht funktioniert.


## GA_Unautorisierte_Tueroeffnung definieren
define GA_Unautorisierte_Tueroeffnung dummy
attr GA_Unautorisierte_Tueroeffnung group Pushover Meldungen

## GA_Unautorisierte_Tueroeffnung definieren
define GAUnautorisierteTueroeffnungAn notify GA_Tuer_Kontakt:open.* { fhem ("set GA_Unautorisierte_Tueroeffnung on") if (Value("Handy_XXXXX") eq "absent")}
define GAUnautorisierteTueroeffnungAus notify GA_Tuer_Kontakt:open.* { fhem ("set GA_Unautorisierte_Tueroeffnung off") if (Value("Handy_XXXXX") eq "present")}

define GAUnautorisierteTueroeffnungPushover notify GA_Unautorisierte_Tueroeffnung:on ........................        und so weiter


Nach diesem Cosde funktioniert soweit alles, die Pushover wird geschickt sobald das Handy_XXXXX nicht mehr "present" ist.
Wenn ich aber nun ein zweites Handy einbaue und das IF Modul benutze, geht gar nichts


##define GAUnautorisierteTueroeffnungAn notify GA_Tuer_Kontakt:open.* IF (([Handy_XXXXX:state] eq "absent") and ([Handy_YYYYY:state] eq "absent")) (set GA_Unautorisierte_Tueroeffnung on)
##define GAUnautorisierteTueroeffnungAus notify GA_Tuer_Kontakt:open.* IF (([Handy_XXXXX:state] eq "present") or ([Handy_YYYYY:state] eq "present")) (set GA_Unautorisierte_Tueroeffnung off)


Ziel soll sein das wenn "beide" Handys absent sind soll der Türkontakt eine Pushover Meldung auslösen und wenn ein Handy wieder present soll keine Meldung mehr kommen.
Bestimmt sehe ich den Wald vor lauter Bäume nicht und das Problem ist gar nicht so groß.

Vielen Dank schon einmal im vorraus.
Gruß
Stefan

Edit: man sollte auch die aktuelle Version in FHEM reinladen...... wenn man noch ein alte Version benutzt wird das irgendwie nichts  :o
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 20 Februar 2014, 09:45:37
Hallo Stefan,
wenn es keine anderen Zustände außer absent und present gibt, dann würde folgendes ausreichen:

define GAUnautorisierteTueroeffnungAn notify GA_Tuer_Kontakt:open.*
IF ([Handy_XXXXX:state] eq "absent" and [Handy_YYYYY:state] eq "absent")
   (set GA_Unautorisierte_Tueroeffnung on)
ELSE
   (set GA_Unautorisierte_Tueroeffnung off)


Ich gehe davon aus, dass die Zustände auch im Reading:state vorkommen hier also [Handy_XXXXX:state] und nicht nur im Status des Handys.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: der-Lolo am 20 Februar 2014, 09:52:57
Und hierzu noch bitte kurz zur Info für mich "or" funktioniert nicht - oder?
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 20 Februar 2014, 11:24:56
Zitat von: der-Lolo am 20 Februar 2014, 09:52:57
Und hierzu noch bitte kurz zur Info für mich "or" funktioniert nicht - oder?

natürlich funktioniert "or" in der Bedingung sowie jeder andere Operator aus Perl.

Im ersten Post ist der Link:  http://de.selfhtml.org/perl/sprache/operatoren.htm angegeben.

Hier nochmal die vollständige Operatorenliste als Kopie:

++ -- (Inkrementieren, Dekrementieren)
** (Potenzierung)
! ~ (logische und bitweise Negation)
=~ !~ (Bindung an Seite reguläre Ausdrücke)
* / % x (Multiplikation, Division, Modulo-Operation, Zeichenkettenwiederholung)
+ - . (Addition, Subtraktion, Zeichenkettenaddition)
<< >> (Verschieben von Bits)
< <= > >= lt le gt ge (Vergleich größer/kleiner)
== != eq ne (Gleichheit/Ungleichheit)
& (bitweises UND)
| ^ (bitweises ODER - inklusiv/exklusiv)
&& (logisches UND)
|| (logisches ODER)
.. (Bereichsdefinition in Seite Listen)
?: (Seite Entweder-Oder-Bedingung)
= += -= &= ^= |= (Zuweisung)
, => (Aneinanderreihung)
not (logische Negation)
and (logisches UND)
or xor (logisches ODER (inklusiv/exklusiv)

Gruß

Damian

Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: satprofi am 22 Februar 2014, 14:09:05
Hallo.
Klasse dein Modul. Fürs erste läufts, nur ELSE wird nicht angenommen. Muss mich abends damit einarbeiten.
Das ergibt ja ungeahnte Möglichkeiten.
THX !
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: satprofi am 23 Februar 2014, 15:04:42
hallo.
Wollte jetzt eine Steckdose definieren, aber irgendwas hats da:


define PAC_enough notify Pac
IF ([Pac:state] > 1500)
  (set ELRO_11111_C:FILTER=STATE!=on on)
    ELSE
      (set ELRO_11111_C:FILTER=STATE!=off off)
)


Usage: define notify IF: unknown Device: Pac Unknown command (set, try help. Unknown command ELSE, try help. Unknown command (set, try help. Unknown command ), try help.

dies funktioniert aber


define PAC_enough notify Pac IF ([Pac:state] > 1500) (set ELRO_11111_C on)


wo stehe ich da am schlauch?
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: der-Lolo am 23 Februar 2014, 15:09:21
Wenn du versuchst einfach so mehrzeiler in die config einzutragen liegt da das Problem...
Du solltest in den Details des notify auf DEF. Klicken und dort editieren.
Dann klappt es auch mit mehrzeilern - in der config trägt fhem dann einen / an jedem Zeitenwechsel ein.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: satprofi am 23 Februar 2014, 15:18:01
danke, wollte gerade mitteilen das ich fehler gefunden habe.
stark dein modul!
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 23 Februar 2014, 18:03:56
Ich habe die Dokumentation im ersten Post überarbeitet.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Bartimaus am 24 Februar 2014, 14:36:28
Hi,

ich brauche für meine Rollos einen Timer, der diese Mo+Di um 13:30 Uhr hochfährt, es sei denn, es ist ein Feiertag, oder der Masterschalter ist "off".
Stimmt dafür dieser Befehl ?

Möchte das Testszenario ungern meinen Rollomotoren zumuten....

define RolloHochMoDi at *13:30 IF ([Rollo_Master:state] eq "on") ( (  IF ( (!$we) IF ($wday == 1 || $wday == 2 ) (set Rollo on-for-timer 120) ELSE() ) ELSE () ) ELSE()


Bin mir da mit den Elsen und Klammern noch nicht ganz im reinen....
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 24 Februar 2014, 15:02:31
Du musst erst mal eine widerspruchsfreie Aussage formulieren:

"der diese Mo+Di um 13:30 Uhr hochfährt, es sei denn, es ist ein Feiertag"

Ein Montag oder Dienstag schließt aus, dass es ein Freitag ist.

Wenn du also nur am Montag und am Dienstag beim Schalterstatus "on" den Rollladen hochfahren willst, dann reicht schon:

define RolloHochMoDi at *13:30 IF ([Rollo_Master:state] eq "on" and ($wday == 1 or $wday == 2)) (set Rollo on-for-timer 120)


Der ELSE-Fall ist optional und muss nicht angegeben werden, wenn er nicht benötigt wird.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Bartimaus am 24 Februar 2014, 15:26:55
Danke für Deine schnelle Antwort.

So habe ich es derzeit eingestellt, und es läuft.
Ich möchte allerdings, das die 13:30Uhr Hochfahrzeit an einem Feiertag, der auf einen Montag fällt (Ostern,Pfingsten,Rosen) ausser Kraft gesetzt wird.....

Für diese Tage benötige ich dann einen weiteren Timer, wo die Rollos um 8:30 hochfahren .... ;)
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 24 Februar 2014, 15:41:17
Zitat von: Bartimaus am 24 Februar 2014, 15:26:55
Danke für Deine schnelle Antwort.

So habe ich es derzeit eingestellt, und es läuft.
Ich möchte allerdings, das die 13:30Uhr Hochfahrzeit an einem Feiertag, der auf einen Montag fällt (Ostern,Pfingsten,Rosen) ausser Kraft gesetzt wird.....

Für diese Tage benötige ich dann einen weiteren Timer, wo die Rollos um 8:30 hochfahren .... ;)

wenn du deine Holiday-Datei mit Attribut holiday2we definiert hast (siehe commandref), dann kannst du $we für Feiertage abfragen.

Damit bleibt dann dein Rollladen auch an Feiertagen still:

define RolloHochMoDi at *13:30 IF ([Rollo_Master:state] eq "on" and ($wday == 1 or $wday == 2) and !($we)) (set Rollo on-for-timer 120)

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Bartimaus am 24 Februar 2014, 15:44:24
Zitat von: Damian am 24 Februar 2014, 15:41:17
wenn du deine Holiday-Datei mit Attribut holiday2we definiert hast (siehe commandref), dann kannst du $we für Feiertage abfragen.

Ja, habe ich. Danke für den Hinweis. Wieder was gelernt !!!
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: der-Lolo am 02 März 2014, 16:31:55
Zitat von: der-Lolo am 02 März 2014, 10:38:33
Hallo zusammen,
ich spiele nun schon eine ganze weile mit der app herum - gestern Abend habe ich folgendes in betrieb genommen:

IF ([s4:powerPlugged:] eq "true") (set s4 ttsSay Danke,sleep 2,set s4 ttsSay ich melde mich wenn meine Batterie vollständig geladen ist)


Ergebnis: es hagelt Danke rufe aus dem s4, bis ich es wieder vom Strom trenne, dann gibt es zweimal den zweiten ttsSay Befehl als Ausgabe.
Geht das irgendwie zu "entprellen" was kann ich tun? Vielleicht hat ja jemand eine Idee..

Hallo Damian,
im thread zur fullscreen Browser app komm ich hiermit nicht weiter, hast du vielleicht eine Idee was ich ändern kann?
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 02 März 2014, 17:06:57
Zitat von: der-Lolo am 02 März 2014, 16:31:55
Hallo Damian,
im thread zur fullscreen Browser app komm ich hiermit nicht weiter, hast du vielleicht eine Idee was ich ändern kann?

Ich nehme an, dass du dein Konstrukt in einem notify-Befehl aufrufst - wie hast du dort gefiltert?

Wenn dein Device s4 immer wieder den Notify triggert, dann wird natürlich jedes mal bei true dein Befehl ausgelöst.

Du kannst bei dem Device s4 das Attribut event-on-Change-reading setzen, dann wird dein Notify nur ausgelöst, wenn sich der Zustand auch wirklich ändert.

attr s4 event-on-change-reading powerPlugged

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: der-Lolo am 02 März 2014, 17:13:42
Sorry Damian, was Du gerade vorgeschlagen hast waren sachen die auch im fullscreen thread schon abgefragt wurden - das habe ich dir unterschlagen...


Zitat von: der-Lolo am 02 März 2014, 11:45:57
Danke für Deine Antwort Rince,
das Komma zum trennen der befehle ist innerhalb des neuen IF Befehls richtig.



define sp_pow_s4_con notify s4 IF ([s4:powerPlugged] eq "true") (set s4 ttsSay Danke,sleep 2,set s4 ttsSay ich melde mich wenn meine Batterie vollständig geladen ist)


Ein  attr s4 event-on-change-reading state wird leider mit einem s4: unknown attribute event-on-change-reading. Type 'attr s4 ?' for a detailed list.

quitiiert.

Ich stecke ja immernoch in den Kinderschuhen - PERL - ist für mich ein buch mit sieben Siegeln. Das IF Modul erleichtert mir wirklich das arbeiten mit FHEM.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 02 März 2014, 17:24:53
Zitatwird leider mit einem s4: unknown attribute event-on-change-reading. Type 'attr s4 ?' for a detailed list.

Dann wird das Attribut bei diesem Device-Typ wohl nicht unterstützt. Du kannst den Event Monitor eine Zeit lang laufen lassen und schauen, welche Events von deinem s4 kommen. Wenn du einen passenden für deine Aktion gefunden hast, dann kannst du beim notify-Befehl danach filtern: wenn z. B. das Wort "powerPlugged" im Event vorkommt.


define sp_pow_s4_con notify s4:powerPlugged.* IF (....

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: der-Lolo am 02 März 2014, 17:45:36
Tausend Dank Damian, es funktioniert erstmal - leider wiederholt sich die Dame nach etwa einer Minute..
Vielleicht liegt das auch daran das der letzte ttsSay nach der Mitteilung im state des devices festgehalten wird - ich bekomme also in jedem fall ein event durch change reading.

define sp_pow_s4_con notify s4:powerPlugged.* IF (....

Ich hoffe das ich diesen REGEX kram irgendwann einmal richtig verstehe. Vom Prinzip her stolper ich ja immer wieder über die gleichen Phänomene... Ich frage nochmal im Webview thread ob das attr event-on-change-reading noch eingebaut wird... Oder hast Du noch eine andere Idee?

Ich habe noch ein ähnliches problem mit meiner Heizung - dort habe ich ein notify mit
XXXXX|timer_hzg IF (([XXXXX:residentsHome:d] > 0 ) and ([timer_hzg:state:[(on|off)]] eq "on")) (set hzg_bad desiredTemperature comfort,set hzg_balkon desiredTemperature comfort) ELSE (set hzg_bad desiredTemperature eco,set hzg_balkon desiredTemperature eco)

soweit ist auf den ersten blick alles gut - problem entsteht wenn residentsHome 1 war und die Heizung händisch verstellt wurde. Kommt nun der zweite Bewohner heim wird der händisch gesetzte Wert überschrieben.
Vielleicht hast Du ja eine Idee was ich da machen könnte..


Ich konnte das reading wechseln, es gibt ein eindeutiges presence reading im Modul...
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 02 März 2014, 18:31:16
Wenn du den Notify für "powerPlugged true" nicht eindeutig anhand der Events identifizieren kannst, dann gibt´s, wie immer Workarounds  :)

Du kannst dir z. B. den jeweiligen Zustand über einen Dummy merken und damit die mehrfachen Ausgaben verhindern.

define d_power_s4 dummy

und dann in deinem Notify definieren:

IF ([s4:powerPlugged] eq "true")
(
   IF ([d_power_s4:state] ne "on")
      (set s4 ttsSay Danke,sleep 2,set s4 ttsSay ich melde mich wenn meine Batterie vollständig geladen ist,
       set d_power_s4 on)
)
ELSE
   (set d_power_s4:FILTER=STATE!=off off)


Gruß

Damian


Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: satprofi am 04 März 2014, 18:14:07
Hallo.
Leide habe ich Probleme mit ELSE IF. Diese config schaltet leider nicht.


define Brauchwasser_on_present notify Bewohner IF ([Bewohner:state] eq "present" and (!$we) and ($hms ge "06:30" and $hms le "21:00:54")) (set Steckdose3:FILTER=STATE!=on on) ELSE IF ([Bewohner:state] eq "present" and ($we) and ($hms ge "07:30" and $hms le "21:00:54")) ELSE (set Steckdose3:FILTER=STATE!=off off)


so funktionierts aber

Bewohner IF ([Bewohner:state] eq "present" and ($hms ge "06:30" and $hms le "21:00:54")) (set Steckdose3:FILTER=STATE!=on on) ELSE (set Steckdose3:FILTER=STATE!=off off)


ich kenne else if bei linux mit elif, klappt das hier nicht?
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: der-Lolo am 04 März 2014, 18:24:35
Du kannst mehrere if s ineinander verschachteln - else if geht keines wissens nach aber nicht...
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 04 März 2014, 19:07:28
Hinter jedem IF oder ELSE muss immer eine Klammer auf, also (bei dir fehlte eine hinter ELSE und natürlich die dazugehörige am Ende):

define Brauchwasser_on_present notify Bewohner IF ([Bewohner:state] eq "present" and (!$we) and ($hms ge "06:30" and $hms le "21:00:54")) (set Steckdose3:FILTER=STATE!=on on) ELSE (IF ([Bewohner:state] eq "present" and ($we) and ($hms ge "07:30" and $hms le "21:00:54")) ELSE (set Steckdose3:FILTER=STATE!=off off))


elseif gibt es nicht. Stattdessen musst du immer ELSE (IF (... angeben. Damit kannst du allerdings alles machen, was man mit elseif machen könnte.

Bei mehreren Verschachtelungen würde ich dir empfehlen in der DEF-Eingabe Einrückungen vorzunehmen (bitte nicht in der cfg-Datei basteln), damit du später noch die Übersicht behältst bzw. schneller Klammer-Fehler findest. Siehe mein Beispiel im ersten Post zu Einrückungen.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 04 März 2014, 19:14:34
hier noch mal das Gleiche mit Einrückungen

define Brauchwasser_on_present notify Bewohner
IF ([Bewohner:state] eq "present" and (!$we) and ($hms ge "06:30" and $hms le "21:00:54"))
   (set Steckdose3:FILTER=STATE!=on on)
ELSE
(  IF ([Bewohner:state] eq "present" and ($we) and ($hms ge "07:30" and $hms le "21:00:54"))
     (.......)                            <----------------------------------------------------------------------------------------
   ELSE
     (set Steckdose3:FILTER=STATE!=off off)
)


und schon fällt auf, dass dir der dann-Fall fehlt.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: satprofi am 04 März 2014, 19:38:57
@Damian
Danke. Ich habe es mit DEF germacht, aber eben über die Klammer gestolpert bzw. die Aktion vergessen.
Leider bleibt die Einrückung nach dem Speichern nicht bestehen.

was ich ebenfalls nicht kapier ist, das du mir eine zweite klammer am ende vorschlöägst, dies aber in meinem funktionierendem beispiel aber fehlt.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 04 März 2014, 19:41:36
Zitat von: satprofi am 04 März 2014, 19:38:57
@Damian
Danke. Ich habe es mit DEF germacht, aber eben über die Klammer gestolpert bzw. die Aktion vergessen.
Leider bleibt die Einrückung nach dem Speichern nicht bestehen.

komisch bei mir schon ??? vielleicht liegst an Windows.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 04 März 2014, 20:03:18
Ich habe es bei mir noch mal getestet:

Die Einrückungen siehe Screenshot werden in der cfg-Datei wie folgt abgelegt und überdauern nach config save auch einen Reboot.

define a_test at *20:00 \
IF (1)\
(set Drucker on)\
ELSE\
( IF (1)\
   (set Drucker off)\
  ELSE\
   (set Drucker on)\
)

Ich kann mir nicht vorstellen, dass es woanders nicht funktioniert.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Bartimaus am 04 März 2014, 20:05:31
Zitat von: Damian am 02 März 2014, 18:31:16
Wenn du den Notify für "powerPlugged true" nicht eindeutig anhand der Events identifizieren kannst, dann gibt´s, wie immer Workarounds  :)

Du kannst dir z. B. den jeweiligen Zustand über einen Dummy merken und damit die mehrfachen Ausgaben verhindern.

define d_power_s4 dummy

und dann in deinem Notify definieren:

IF ([s4:powerPlugged] eq "true")
(
   IF ([d_power_s4:state] ne "on")
      (set s4 ttsSay Danke,sleep 2,set s4 ttsSay ich melde mich wenn meine Batterie vollständig geladen ist,
       set d_power_s4 on)
)
ELSE
   (set d_power_s4:FILTER=STATE!=off off)


Gruß

Damian

Hallo,

dh, ich kann mir zB einen Temperaturwert eines angeschlossenen Sensors in einem Dummy merken, und diesen Wert dann dividieren&multiplizieren und das Ergebnis als "set-on-for-timer" verwenden ?
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 04 März 2014, 20:16:54
Zitat von: Bartimaus am 04 März 2014, 20:05:31
Hallo,

dh, ich kann mir zB einen Temperaturwert eines angeschlossenen Sensors in einem Dummy merken, und diesen Wert dann dividieren&multiplizieren und das Ergebnis als "set-on-for-timer" verwenden ?


warum nicht  ;)

IF (irgendwas)
  (set test_dummy 50)
ELSE
  (set lampe on-for-timer {[test_dummy:state]*10+40-[sonstwas:state]})


In der geschweiften Klammer kannst du prinzipiell alles unterbringen, was in Perl geht.
Ich glaube das hat trotz meiner Doku noch keiner durchschaut.  ;D

Ich habe den Spieß umgedreht: hier spielt FHEM die erste Geige und Perl ist nur ein Hilfsmittel und nicht umgekehrt.

Gruß

Damian



Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Bartimaus am 04 März 2014, 21:36:36
Danke.
Timer hat sich nicht eingeschaltet, mit dem Hinweis: Bad time spec.

Zu berechnen ist testweise: *21:27 set PoolPumpe on-for-timer {[Pool:state:T]/2*3600}

state aktuell T:6.8

Lt. Wiki bekommt man diesen Hinweis, wenn der Dezimaltrenner ein "," statt "." ist. Kann es sein, das Perl aus der Berechnung einen Wert mit "," zurückliefert ?
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 04 März 2014, 21:52:04
Zitat von: Bartimaus am 04 März 2014, 21:36:36
Danke.
Timer hat sich nicht eingeschaltet, mit dem Hinweis: Bad time spec.

Zu berechnen ist testweise: *21:27 set PoolPumpe on-for-timer {[Pool:state:T]/2*3600}
state aktuell T:6.8

Lt. Wiki bekommt man diesen Hinweis, wenn der Dezimaltrenner ein "," statt "." ist. Kann es sein, das Perl aus der Berechnung einen Wert mit "," zurückliefert ?

Ich habe dir bereits zwei mal per PN geantwortet. Dennoch zur Aufklärung für andere Interessierte.
Die Sache mit den geschweiften Klammern in Kombination mit FHEM-Befehlen funktioniert nur innerhalb des IF-Befehls.  (Bitte nicht woanders nachmachen  :( )

Zum Filtern von Zahlen habe ich :d eingebaut. Man kann sich dennoch behelfen, indem man IF Funktionalität ausnutzt, auch wenn man gar kein IF braucht. In deinem Falle:

*21:27 IF (1) (set PoolPumpe on-for-timer {[Pool:state:d]/2*3600})

Natürlich kann man so etwas auch in Perl realisieren. Ob es allerdings kürzer wird oder gar eleganter, wage ich zu bezweifeln.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Bartimaus am 04 März 2014, 21:52:58
So hat es jetzt (dank Damians Hilfe) funktioniert...

define PoolPumpeAn at *21:00 IF (1) (set PoolPumpe on-for-timer {[Pool:state:d]/2*3600})
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Bartimaus am 05 März 2014, 08:43:36
Guten Morgen,

heute morgen hat sich die Poolpumpe korrekt eingeschaltet. Auch der Timer wurde korrekt ermittelt. Jedoch hat sich die Pumpe nicht zum errechneten Timerende ausgeschaltet.

Dies stand im Log: 2014.03.05 08:13:19 3: PoolPumpe_timer: Unknown command {readingsSingleUpdate($defs{'PoolPumpe'},'state','off',, try help

Aktuellstes FHEM-Update ist drauf..

Any ideas ?

LG
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 05 März 2014, 10:55:24
Zitat von: Bartimaus am 05 März 2014, 08:43:36
Guten Morgen,

heute morgen hat sich die Poolpumpe korrekt eingeschaltet. Auch der Timer wurde korrekt ermittelt. Jedoch hat sich die Pumpe nicht zum errechneten Timerende ausgeschaltet.

Dies stand im Log: 2014.03.05 08:13:19 3: PoolPumpe_timer: Unknown command {readingsSingleUpdate($defs{'PoolPumpe'},'state','off',, try help

Aktuellstes FHEM-Update ist drauf..

Any ideas ?

LG

Wann wurde der IF-Befehl ausgeführt? Du sagst der Timer wurde richtig ermittelt, wo hast du das gesehen?

Wenn die Meldung nicht zum Zeitpunkt der Ausführung des IF-Befehls kommt und der korrekte set-on-timer-Befehl absetzt wurde (müsste im Log zu finden sein), dann hat das mit IF nicht mehr viel zu tun.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Bartimaus am 05 März 2014, 12:53:43
Ich habe einen Testzyklus gestartet, mit entsprechend kurzer Laufzeit.
Start 07:30. Den errechneten Ausschaltpunkt konnte man sehen, wenn man mit der Maus über das "On-for-Timer" Symbol fuhr, dann zeigte es "On-for-Timer 2880" an. Die errechnete EndeUhrzeit sah man unter "unsorted oder everything" mit "..till 08:18".

Mit IF hat das glaube ich auch nichst zu tun. Ich werde den Test heute abend nochmal wiederholen, und dann berichten...

EDIT:
So, mal mit der Poollampe getestet, diesmal hat es geklappt ;)

Logfile:
2014.03.05 13:04:00 3: FS20 set Poollampe on-for-timer 108.8
2014.03.05 13:04:00 2: Poollampe: changing timeout to 112 from 108.8


in "unsorted" unter "at"
+00:01:52 {readingsSingleUpdate($defs{'Poollampe'},'state','off', 1); undef}
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Michi240281 am 06 März 2014, 19:12:55
Hallo Damian,

ich habe mir ein Notify gebastelt, um ein paar Lampen für 3 Minuten einzuschalten, wenn man abends zu Bett geht (DM500HD ändert sein reading "power" auf "off").


define Bettgehbeleuchtung notify DM500HD IF ($hms gt "18:00" and $hms lt "22:00" and [DM500HD:power] eq "off") (set Alle_Steckdosen_EG on-for-timer 180)


Funktioniert auch wunderbar.

Wie müsste ich das nun umändern, um den Zeitraum auf "zwischen 22 Uhr abends und 3 Uhr nachts" zu ändern?

Danke und Gruß
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: der-Lolo am 06 März 2014, 20:30:43
Interessante frage - ich habe auch keine Lösung, ich dachte zwar zuerst Du könntest ja anstelle von und ein und nicht auf
($hour ~~ [8..21]) setzen, und nicht scheint es aber nicht zu geben...
Ich bin gespannt was Damian sagt - ich habe da auch die ein oder andere Anwendung die nachts aktiv sein soll..

vielleicht geht es auch einfach wenn Du ($hour ~~ [22..2]) angibst... Keine Ahnung wie $hour da arbeitet.

2 jedenfalls weil es ja dann zutrifft bis 2:59:59
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 06 März 2014, 21:00:14
Zitat von: Michi240281 am 06 März 2014, 19:12:55

Wie müsste ich das nun umändern, um den Zeitraum auf "zwischen 22 Uhr abends und 3 Uhr nachts" zu ändern?

Ist doch ganz einfach: "größer 22 und kleiner 3", also

define Bettgehbeleuchtung notify DM500HD IF ($hms gt "22:00" and $hms lt "03:00" and [DM500HD:power] eq "off") (set Alle_Steckdosen_EG on-for-timer 180)

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 06 März 2014, 21:03:08
Zitat von: der-Lolo am 06 März 2014, 20:30:43
($hour ~~ [8..21])

Würde ich nicht nehmen, da werden Listen durchsucht - schlechte Performance.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Michi240281 am 06 März 2014, 22:38:07
Zitat von: Damian am 06 März 2014, 21:00:14
Ist doch ganz einfach: "größer 22 und kleiner 3", also

define Bettgehbeleuchtung notify DM500HD IF ($hms gt "22:00" and $hms lt "03:00" and [DM500HD:power] eq "off") (set Alle_Steckdosen_EG on-for-timer 180)

Gruß

Damian

Ok, besten Dank!

Dachte, es gäbe da vllt ein Problem wegen Mitternacht!
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 06 März 2014, 22:46:19
Zitat von: Michi240281 am 06 März 2014, 22:38:07
Ok, besten Dank!

Dachte, es gäbe da vllt ein Problem wegen Mitternacht!

Mein Denkfehler:

es muss "or" und nicht "and "heißen, die Klammern würde ich auch wegen Prioritäten zusätzlich setzen:


define Bettgehbeleuchtung notify DM500HD IF (($hms gt "22:00" or $hms lt "03:00") and [DM500HD:power] eq "off") (set Alle_Steckdosen_EG on-for-timer 180)


Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Michi240281 am 09 März 2014, 20:03:31
Hi Damian!

Funktioniert besten! :)

Habe jetzt eine weitere Anwendung für dein neues Modul:

define Ambientelicht_TV notify My_Twilight IF (([My_Twilight:light] < 3) and [DM500HD:power] eq "on") (set Alle_Steckdosen_EG on)

Dabei sollen die Steckdosen auch angehen, wenn die DM500HD bereits an war, wenn Twilight < 3 wird. Habe dafür auf "My_Twilight" ein event-on-update reading auf "light" gesetzt, leider geht irgendwas noch nicht. Ne Idee wo der Fehler sich versteckt?

Danke schonmal!
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 09 März 2014, 21:10:36
Zitat von: Michi240281 am 09 März 2014, 20:03:31
define Ambientelicht_TV notify My_Twilight IF (([My_Twilight:light] < 3) and [DM500HD:power] eq "on") (set Alle_Steckdosen_EG on)

Ich sehe keinen Fehler. Da musst du im Event Monitor schauen, ob die Events auch kommen. Vielleich hast du durch event-on-update deine Events zu stark eingeschränkt.

Ob dein IF-Ausdruck grundsätzlich funktioniert, kannst du immer testen, indem du:


IF (([My_Twilight:light] < 3) and [DM500HD:power] eq "on") (set Alle_Steckdosen_EG on)


in der Kommandozeile aufrufst.

Wenn in My_Twillight:light noch etwas anderes als eine Zahl steht, so kannst du im Reading nach Zahlen filtern:

[My_Twilight:light:d]

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Michi240281 am 09 März 2014, 21:25:40
Hab den Fehler entdeckt. Das Reading "light" wird wohl nur dann aktualisiert, wenn es sich ändert. Da muss ich nochmal schauen.

Habe das notify jetzt geändert und nutze das reading "twilight" und damit gehts jetzt! :)

Habe auch meine Klingel mit dem neuen IF Modul realisiert, ging auch erst, aber jetzt aus unerklärlichem Grund nicht mehr:

define Klingelsignal notify Klingeltaster IF (($hms gt "07:30" and $hms lt "22:30") and Klingeltaster eq "gedrueckt") (set Funk_Gong_Ton press long,set Funk_Gong_LED led greenS)

Wenn ich nur den IF Ausdruck in die Kommandozeile einfüge, kommt folgender Fehlermeldung:



Bareword "Klingeltaster" not allowed while "strict subs" in use at (eval 3529) line 1.

Was heißt das?
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 09 März 2014, 21:29:46
Zitat von: Michi240281 am 09 März 2014, 21:25:40
define Klingelsignal notify Klingeltaster IF (($hms gt "07:30" and $hms lt "22:30") and Klingeltaster eq "gedrueckt") (set Funk_Gong_Ton press long,set Funk_Gong_LED led greenS)

Wenn ich nur den IF Ausdruck in die Kommandozeile einfüge, kommt folgender Fehlermeldung:

Bareword "Klingeltaster" not allowed while "strict subs" in use at (eval 3529) line 1.

Du hast vergessen Klingeltaster mit seinem Reading in eckige Klammern zu setzen, wahrscheinlich [Klingeltaster:state]

Siehe deine anderen notifys mit IF und Reading-Angaben.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Michi240281 am 09 März 2014, 21:33:43
Achso, es muss immer ein Reading verwendet werden?
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 09 März 2014, 21:42:12
Zitat von: Michi240281 am 09 März 2014, 21:33:43
Achso, es muss immer ein Reading verwendet werden?

ja und alles, was in Perl geht, wie z. B. Variablen, die belegt sind, wie $hms

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Michi240281 am 09 März 2014, 21:56:18
Es geht!!!!!!!! :)

Besten Dank!!!!!!!!!!
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Michi240281 am 11 März 2014, 19:43:41
Hi Damian,

wie könnte ich denn Sunrise und Sunset in das IF Modul mit einbauen?

MIt dem Twilight Modul bin ich nämlich nicht 100% glücklich. Ich würde nun gerne sowas realisieren:

Wenn Sonne untergegangen ist und DM500HD:power eq on, dann set xy.

Hast du da ne Idee?

Also man müsste

define Ambientelicht_TV notify My_Twilight IF (([My_Twilight:twilight] < 3) and [DM500HD:power] eq "on") (set Alle_Steckdosen_EG:FILTER=STATE!=an an)

mit

{sunset_abs("HORIZON=-2",0,"16:00","19:30")}

kombinieren!?!?

Also statt des Twilight-Ausdrucks eben Sunset nutzen.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 12 März 2014, 17:57:41
Das machst du besser mit dem at-Befehl:

define Ambientelicht_TV at *{sunset_abs("HORIZON=-2",0,"16:00","19:30")} IF ([DM500HD:power] eq "on") (set Alle_Steckdosen_EG:FILTER=STATE!=an an)


Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Michi240281 am 13 März 2014, 09:21:29
Ahhhhhhhhh, wieder was gelernt! War nicht darauf gekommen, dass ich auch ein at vor das IF setzen kann! Sehr cool! Immer mehr Möglichkeiten tun sich auf! :)

Besten Dank!!!!!!!
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 13 März 2014, 15:45:25
Zitat von: Michi240281 am 13 März 2014, 09:21:29
War nicht darauf gekommen, dass ich auch ein at vor das IF setzen kann!

Im ersten Post sind diverse Beispiele zur Nutzung von IF, davon sind alleine acht in Kombination mit at.


Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: satprofi am 13 März 2014, 20:32:24
Zitat von: Michi240281 am 13 März 2014, 09:21:29
Ahhhhhhhhh, wieder was gelernt! War nicht darauf gekommen, dass ich auch ein at vor das IF setzen kann! Sehr cool! Immer mehr Möglichkeiten tun sich auf! :)

Besten Dank!!!!!!!

andersrum wäre es noch besser . einen at-befehl erst abgeben wenn IF erfüllt.
so eine lösung suche ich noch
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 13 März 2014, 20:43:44
Zitat von: satprofi am 13 März 2014, 20:32:24
andersrum wäre es noch besser . einen at-befehl erst abgeben wenn IF erfüllt.
so eine lösung suche ich noch

Es kommt darauf an, was du willst.

Willst du genau einmal zum Zeitpunkt des Sonnenuntergangs Lampen einschalten, wenn der Schalter an ist, dann ist das die passende Lösung.

Willst du dagegen jedes mal, wenn Schalter an geht, nach Sonnenuntergang die Lampen einschalten, dann machst du das im notify mit Abfrage des Sonnenuntergangs, hier also:

define Ambientelicht_TV notify DM500HD.power.on IF ($hms gt sunset_abs("HORIZON=-2",0,"16:00","19:30")) (set Alle_Steckdosen_EG:FILTER=STATE!=an an)


Die Eventabfrage  "DM500HD.power.on"  muss natürlich zum tatsächlichen Event passen.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Michi240281 am 13 März 2014, 20:59:24
Das ist sehr interessant, ich möchte nämlich folgendes erreichen:

Das Ambientelicht soll angehen, sobald es dunkel wird und die DM500HD läuft. Es soll aber auch angehen, wenn es bereits dunkel ist und dann erst die DM500HD eingeschaltet wird. Daher wird das mit dem at wohl leider nichts, da nur einmal geprüft wird. Schalte ich die DM500HD 1s später ein, passiert nix mehr!

Ich will einfach, dass in jeder Situation, in der es dunkel ist und ich fernsehe (DM500HD power on), das Ambientelicht angeht.

Würde das mit deinem zuletzt geposteten Notify klappen?

EDIT: Hab das notify mal eingebaut, scheint nicht zu funzen???
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 13 März 2014, 21:07:53
Zitat von: Michi240281 am 13 März 2014, 20:59:24
Würde das mit deinem zuletzt geposteten Notify klappen?

Klar, dann lässt du den define at und machst den notify mit einem anderen Namen noch dazu. Mit "set Alle_Steckdosen_EG:FILTER=STATE!=an an" wird ja nie zu viel geschaltet, wenn Lampe schon an ist.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Michi240281 am 13 März 2014, 21:16:07
Der IF Ausdruck funktikoniert, es scheint also an dem DM500HD.power.on zu liegen?!?!?!?

Hier mal ein List von DM500HD:



Internals:
   CHANGED   
   DEF        192.168.188.33 80 5 root ******
   INTERVAL   5
   NAME       DM500HD
   NR         136
   STATE      an
   TYPE       ENIGMA2
   model      dm500hd
   Readings:
     2014-03-13 21:18:20   acg             
17
     2014-03-13 21:15:14   apid            515
     2014-03-13 21:18:20   ber             
0

     2014-03-13 21:15:14   channel         VOX_HD
     2014-03-13 21:15:14   currentMedia    1:0:19:EF11:421:1:C00000:0:0:0:
     2014-03-13 21:15:14   currentTitle    Stirb langsam: Jetzt erst recht
     2014-02-08 12:44:40   enigmaversion   2012-03-27-3.2
     2014-03-13 21:18:19   eventcurrenttime 1394741897.27
     2014-03-13 21:18:19   eventcurrenttime_hr 21:18:17
     2014-03-13 21:18:19   eventcurrenttime_next 1394741897.32
     2014-03-13 21:18:19   eventcurrenttime_next_hr 21:18:17
     2014-03-12 17:56:49   eventdescription -
     2014-03-12 17:56:49   eventdescription_next -
     2014-03-13 21:15:14   eventduration   9000
     2014-03-13 21:15:14   eventduration_hr 02:30:00
     2014-03-13 21:15:14   eventduration_next 6900
     2014-03-13 21:15:14   eventduration_next_hr 01:55:00
     2014-03-13 21:15:14   eventname       Stirb langsam: Jetzt erst recht
     2014-03-13 21:15:14   eventname_next  Tango & Cash
     2014-03-13 21:18:19   eventremaining  5203
     2014-03-13 21:18:19   eventremaining_hr 01:26:43
     2014-03-13 21:15:14   eventremaining_next 6900
     2014-03-13 21:15:14   eventremaining_next_hr 01:55:00
     2014-03-13 21:15:14   eventstart      1394738100
     2014-03-13 21:15:14   eventstart_hr   20:15:00
     2014-03-13 21:15:14   eventstart_next 1394747100
     2014-03-13 21:15:14   eventstart_next_hr 22:45:00
     2014-03-13 21:15:14   eventtitle      Stirb langsam: Jetzt erst recht
     2014-03-13 21:15:14   eventtitle_next Tango & Cash
     2014-02-08 12:44:40   fpversion       None
     2014-02-08 12:44:40   imageversion    Experimental 2012-04-02
     2014-03-13 21:01:47   input           tv
     2014-02-08 11:44:22   iswidescreen    -
     2014-02-08 12:44:40   lanmac          00:09:34:2a:b8:8f
     2014-02-08 12:44:40   model           dm500hd
     2014-03-13 21:15:14   mute            off
     2014-03-13 21:15:14   nextTitle       Tango & Cash
     2014-03-13 21:15:14   onid            1
     2014-03-13 21:15:14   pcrpid          511
     2014-03-13 21:15:14   pmtpid          97
     2014-03-13 21:15:12   power           on
     2014-03-13 21:01:45   presence        present
     2014-03-13 21:15:14   providername    CBC
     2014-03-13 20:17:05   recordings      0
     2014-03-13 21:15:14   servicename     VOX HD
     2014-03-13 21:15:14   servicereference 1:0:19:EF11:421:1:C00000:0:0:0:
     2014-03-13 21:15:14   servicevideosize 1920x1080
     2014-03-13 21:15:14   sid             61201
     2014-03-13 21:18:20   snr             
86
     2014-03-13 21:18:20   snrdb           
13.86
     2014-03-13 21:15:12   state           on
     2014-03-13 21:15:14   tsid            1057
     2014-02-08 12:44:40   tuner_a         BCM4505 (DVB-S2)
     2014-03-13 21:15:14   txtpid          33
     2014-03-13 21:15:14   videoheight     1080
     2014-03-13 21:15:14   videowidth      1920
     2014-03-13 21:15:14   volume          45
     2014-03-13 21:15:14   vpid            511
     2014-02-08 12:44:40   webifversion    1.7.1
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 13 März 2014, 21:18:32
Zitat von: Michi240281 am 13 März 2014, 21:16:07
Der IF Ausdruck funktikoniert, es scheint also an dem DM500HD.power.on zu liegen?!?!?!?

Dann musst du schauen, was genau beim Event Monitor kommt. Der Punkt steht für ein beliebiges Zeichen.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Michi240281 am 13 März 2014, 21:20:38
2014-03-13 21:20:08.190 ENIGMA2 DM500HD power: aus
2014-03-13 21:20:18.671 ENIGMA2 DM500HD power: an

Habs!!!!!! :)


define Ambientelicht_TV notify DM500HD.power:.an IF ($hms gt sunset_abs("HORIZON=-2",0,"17:00","22:30")) (set Alle_Steckdosen_EG:FILTER=STATE!=an an)


Die Punkte kann ich also auch weglassen? Also dann Leerzeichen?

Und du meinst das at lasse ich auch drin für den anderen Fall, dass die DM500HD bereits läuft, wenn es dunkel WIRD???
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 13 März 2014, 21:25:42
Zitat von: Michi240281 am 13 März 2014, 21:20:38
2014-03-13 21:20:08.190 ENIGMA2 DM500HD power: aus
2014-03-13 21:20:18.671 ENIGMA2 DM500HD power: an

Dann ist doch klar, dass es nicht funktionieren kann.

müsste dann heißen:

ENIGMA2.DM500HD.power..an

Gruß

Damian




Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: satprofi am 15 März 2014, 16:03:33
Hallo.
Bin am verzweifeln

klappt einfach nicht


Bewohner IF ([Bewohner:state] eq "present" and ($hms ge "08:00" and $hms le "23:59:54")) (set Steckdose2 on)
         ELSE IF ([Status:state] eq "on" and ($hms ge "19:00" and $hms le "07:59:59")) (set Steckdose2:FILTER=STATE!=on on)
         ELSE (set Steckdose2 off)


liegts an den 2 verschiedenen state od. doch nicht?
lt. Notepad++ stimmt die Klammersetzung.

das funktioniert aber



Bewohner IF ([Bewohner:state] eq "present" and ($hms ge "08:00" and $hms le "23:59:54")) (set Steckdose2 on)
         ELSE (set Steckdose2 off)


Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: der-Lolo am 15 März 2014, 16:11:48
versuch mal
notify Bewohner|Status IF....

Und ELSE IF gibt es immer noch nicht, Du kannst aber schachteln - siehe erstes Post hier...
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 15 März 2014, 16:26:42
Hinter einem IF oder ELSE muss zuerst immer eine Klammer auf und die fehlte bei dir hier:

ELSE (IF ([Status:state] eq "on" and

dann also:

Bewohner IF ([Bewohner:state] eq "present" and ($hms ge "08:00" and $hms le "23:59:54")) (set Steckdose2 on)
         ELSE (IF ([Status:state] eq "on" and ($hms ge "19:00" and $hms le "07:59:59")) (set Steckdose2:FILTER=STATE!=on on)
         ELSE (set Steckdose2 off))


Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 15 März 2014, 16:41:16
und da fällt mir noch auf:

$hms ge "19:00" and $hms le "07:59:59"

kann nicht funktionierten: Es gibt keine Zeit, die Größer als 19:00 und gleichzeitig kleiner als 07:59:59 ist, dann schon besser mit or:


Bewohner IF ([Bewohner:state] eq "present" and ($hms ge "08:00" and $hms le "23:59:54")) (set Steckdose2 on)
         ELSE (IF ([Status:state] eq "on" and ($hms ge "19:00" or $hms le "07:59:59")) (set Steckdose2:FILTER=STATE!=on on)
         ELSE (set Steckdose2 off))


Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: satprofi am 15 März 2014, 16:44:33
danke. ich glaub jetzt hab ichs kapiert.
ich wollte beim abschalten des Satreceivers auch die Steckdose abknipsen wenn es noch vor 24h ist.
deshalb habe ich jetzt folgendes, nach deinem vorschlag nach, definiert

Bewohner IF ([Bewohner:state] eq "present" and ($hms ge "08:00" and $hms le "20:59:54")) (set Steckdose2 on)
         ELSE (IF ([Status:state] eq "on" and ($hms ge "19:00" or $hms le "07:59:59")) (set Steckdose2:FILTER=STATE!=on on)
         ELSE (set Steckdose2 off)
)


mal gucken obs klappt
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Bartimaus am 15 März 2014, 19:05:45

Hallo zusammen,


ich möchte in meinem KellerKino die Heizung wie folgt automatisch einschalten/ausschalten:


Am Tag vorm Wochenende (-86400 Sekunden = 1Tag) oder vorm Feier/Urlaubstag, soll sich die Heizung automatisch um 06:00 Uhr einschalten.
Hierfür habe ich mir folgenden Timer überlegt:



define HeizungKinoAn at *06:00 IF (($we(-86400)) (set KinoHeizung on)



Ausgeschaltet wird dann 6h vor dem nächsten Werktag.



define HeizungKinoAus at *18:00 IF (!($we(-86400)) (set KinoHeizung off)





Ist die Syntax so korrekt ? Meine *.holiday ist korrekt eingebunden.
Meine Heizung ist hydraulisch abgeglichen, und die Raumtemperatur ist durch die Vorlauftemp begrenzt, so das ich nur den Stellantrieb für die FbHz ein oder ausschalten muss.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 15 März 2014, 20:02:27
Zitat von: Bartimaus am 15 März 2014, 19:05:45

Hierfür habe ich mir folgenden Timer überlegt:



define HeizungKinoAn at *06:00 IF (($we(-86400)) (set KinoHeizung on)



Ausgeschaltet wird dann 6h vor dem nächsten Werktag.



define HeizungKinoAus at *18:00 IF (!($we(-86400)) (set KinoHeizung off)


Wie kommst du auf diese Syntax?

Meines Wissens ist $we eine Variable und keine Funktion, daher wird deine Überlegung nicht fruchten.

Dann schon eher:


define HeizungKinoAn at *06:00 IF (($wday==5 or fhem("get nrw tomorrow") ne "none") (set KinoHeizung on)


nrw musst du ersetzen durch den tatsächlichen Namen des Holiday-Moduls.

Den Ausschalt-Befehl kannst du dir jetzt selbst zur Übung überlegen  ;)

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Bartimaus am 15 März 2014, 21:49:27
Hi Damian,


danke für den Hinweis, Groschen gefallen. Das mit Variable/Funktion wusste ich noch nicht.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Michi240281 am 16 März 2014, 21:20:43
Hi Damian,

ich nutze folgenden Code als Ambientelicht:

define Ambientelicht at *{sunset_abs("HORIZON=-2",0,"17:00","19:30")} IF ([DM500HD:power] eq "on") (set Alle_Steckdosen_EG:FILTER=STATE!=an an)

Nun habe ich einen WeekdayTimer und wollte da den Filter mit einbauen, der oben drin steht, allerdings scheint das nicht zu funzen. Ist der Filter nur mit der IF-Funktion verwendbar?

define test WeekdayTimer Vase 67|14:34|an { fhem("set Vase:FILTER=state!=an %)}

Habe den Author des WeekdayTimer befragt und er kennt diese Syntax garnicht.

Also das hier geht:


define test WeekdayTimer Vase 67|14:34|an { fhem("set Vase %)}


aber mit diesem Code:


define test WeekdayTimer Vase 67|14:34|an { fhem("set Vase:FILTER=state!=an %)}


wird die Vase dennoch eingeschaltet, obwohl sie bereits an ist.

Kannst du mir nen Tipp geben?
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Olaf A am 16 März 2014, 21:43:58
Hallo Damian,

danke für das Modul so was habe ich schon lange gesucht.

Ich werde mir das mal ordentlich zu gemüte führen, aber beim ersten Problem hat es schon geholfen.

Gruß Olaf
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 16 März 2014, 22:12:00
Zitat von: Michi240281 am 16 März 2014, 21:20:43

define test WeekdayTimer Vase 67|14:34|an { fhem("set Vase:FILTER=state!=an %)}


wird die Vase dennoch eingeschaltet, obwohl sie bereits an ist.

Kannst du mir nen Tipp geben?

Versuch mal mit:

define test WeekdayTimer Vase 67|14:34|an {fhem("set Vase:FILTER=STATE!=an %)}

Warum machst du es so umständlich über Perl? Einfacher wäre:

define test WeekdayTimer Vase 67|14:34|an set Vase:FILTER=STATE!=an %

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 16 März 2014, 22:29:48
Ich habe bei mir gerade Folgendes probiert:

define test WeekdayTimer Drucker 67|14:34|on set Drucker:FILTER=STATE!=on %

Es funktioniert!

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Michi240281 am 17 März 2014, 21:05:24
Stimmt!

Hatte es so

define Steckdosen_EG_aus_nachts WeekdayTimer Alle_Steckdosen_EG 12347|23:30|:FILTER=STATE!=aus aus 67|01:00|:FILTER=STATE!=aus aus

probiert, was jedoch nicht funktionierte!

Besten Dank (mal wieder)!!! :)
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: der-Lolo am 19 März 2014, 18:12:11
Hallo Damian,
darf ich Dich nochmal fragen was hier schief läuft..?

Ich bekomme folgende Meldung:
Zitatm_Herd_on return value: Unknown command {if((ReadingValIf('mpl_Herd_m','power','(-?\d+(\.\d+)?)'), try help.

und habe dieses im DEF stehen...
mpl_Herd_m IF (([mpl_Herd_m:power:d] > 2) and ([mpl_Herd_m:power:d] < 25)) (set mpl_Herd_switch off,attr mpl_Herd_switch devStateIcon off:power-orange:on,define at +00:33:00 set mpl_Herd_switch on ;; attr m_Herd_on disable 1)

ziel ist wenn mpl_Herd_m (Leistungsmessung) größer 2 Watt ist und kleiner 25 Watt soll die Steckdose für 33 Minuten abschalten - während dieser Zeit soll das Icon orange gezeigt werden, nach 33 Minuten soll die Steckdose wieder anschalten und sich das notify selbst disablen...

Es gibt dann ein zweites Notify dessen DEF schaut so aus:
mpl_Herd_m:power IF ([mpl_Herd_m:power:d] < 2) (attr mpl_Herd_switch devStateIcon on:power-black:on off:power-black:on,attr m_Herd_on disable 0)

Wenn also die Leistungsaufnahme < 2 Watt ist soll das Icon einfach schwarz sein und das andere notify wieder aktivieren.

Unser Herd steht frei - wenn er länger als 10 Minuten an war, auch bei nur 120° springt für mehr als eine halbe stunde ein Lüfter an der wahnsinnigen Krawall macht. Wenn der Lüfter läuft verbraucht der Herd 23 Watt.
Der Herd hat eine Uhr - diese verbraucht 1,6Watt das wäre also der normalzustand.

orange als Icon setze ich hier öfter ein wenn etwas "remote" geschaltet oder abgeschaltet wurde. z.b. auch beim Subwoofer nach 22h das hat sich also etabliert, meine Frau weiss dann auch was Sache ist ;-)

Ich hoffe du kannst helfen - vielleicht wäre threshold auch eine Lösung, da wollte ich mich eh mal mit beschäftigen...
Gruß aus Berlin,
Michael
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 19 März 2014, 18:50:56
Zitat von: der-Lolo am 19 März 2014, 18:12:11

und habe dieses im DEF stehen...
mpl_Herd_m IF (([mpl_Herd_m:power:d] > 2) and ([mpl_Herd_m:power:d] < 25)) (set mpl_Herd_switch off,attr mpl_Herd_switch devStateIcon off:power-orange:on,define at +00:33:00 set mpl_Herd_switch on ;; attr m_Herd_on disable 1)

Beim IF selbst sehe ich keinen Fehler. Ich sehe aber einen bei deinem at Befehl, da fehlt der Name des at-Moduls

define ?? at +00:33:00

Auf die Fehlermeldung selbst, habe ich keinen Einfluss, da mein Parser keine Fehler im IF gefunden hat - die kommt vom FHEM-Parser.

Bei komplexeren Befehlen, kannst du immer den Fehler relativ schnell finden, wenn du den Befehl vereinfacht in der Kommandozeile aufrufst.

wenn z. B.:

IF (([mpl_Herd_m:power:d] > 2) and ([mpl_Herd_m:power:d] < 25)) (set mpl_Herd_switch off)


funktioniert (ich habe es gerade bei mir nachgestellt, und es funktioniert), dann kannst du als nächstes in der Kommandozeile testen:

IF (([mpl_Herd_m:power:d] > 2) and ([mpl_Herd_m:power:d] < 25)) (set mpl_Herd_switch off,attr mpl_Herd_switch devStateIcon off:power-orange:on)

danach mit define ... at und wenn dann alles syntaktisch korrekt ist, kannst du den ganzen Befehl in deinen Notify packen.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Michi240281 am 19 März 2014, 20:28:55
Hi Damian,

ne Idee, warum folgender WDT nicht geht?

define Abschreckung_Flurlicht WeekdayTimer Flurlicht 1234567|20:26|an IF ([Abwesend:state] eq "ja")

"Abwesend:state" ist natürlich auf ja.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 19 März 2014, 20:38:22
Zitat von: Michi240281 am 19 März 2014, 20:28:55
Hi Damian,

ne Idee, warum folgender WDT nicht geht?

define Abschreckung_Flurlicht WeekdayTimer Flurlicht 1234567|20:26|an IF ([Abwesend:state] eq "ja")

"Abwesend:state" ist natürlich auf ja.

Wie denn auch - du hast ja gar keinen Befehl im dann-Fall angegeben, dann schon eher

define Abschreckung_Flurlicht WeekdayTimer Flurlicht 1234567|20:26|an IF ([Abwesend:state] eq "ja") (set Flurlicht an)

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Michi240281 am 19 März 2014, 20:40:28
Ahso, dachte das würde auch so gehen da ja der Befehl (der WDT) davor schon steht!

Wieder was gelernt!
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: der-Lolo am 20 März 2014, 09:34:49
Wow - das war ein harter Kampf...
Ich habe das Gefühl das bei langen zeichenketten eine Beschränkung vorhanden ist. Wahrscheinlich aber eher von Perl oder FHEM aus als vom Modul. Ich habe Namen angepasst um die Zeile kürzer zu machen, ansonsten kaum nennenswerte Änderungen - jetzt funktioniert es jedenfalls.
Danke auch wegen dem define at - das hab ich wirklich total übersehen...
Als Schönheitsfehler bleibt nun das das at schon definiert ist Fehler im log, ein delete xxx bekomm ich aber nicht mehr unter.

Eine Kleinigkeit würde ich nun gerne noch hinzufügen - immer mittags um zwölf würde ich gerne kurz vom Strom trennen wenn der Herd keine Leistung >2 Watt zieht...
Hintergrund - Uhr stellen - aber einen evtl. Kochvorgang dafür nicht unterbrechen.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 20 März 2014, 10:01:43
Zitat von: der-Lolo am 20 März 2014, 09:34:49
Ich habe das Gefühl das bei langen zeichenketten eine Beschränkung vorhanden ist. Wahrscheinlich aber eher von Perl oder FHEM aus als vom Modul. Ich habe Namen angepasst um die Zeile kürzer zu machen, ansonsten kaum nennenswerte Änderungen - jetzt funktioniert es jedenfalls.
So lange Befehlsketten habe ich bisher noch nicht gehabt. Das muss ich mir mal anschauen - woher die Einschränkung kommt.

Zitat
Eine Kleinigkeit würde ich nun gerne noch hinzufügen - immer mittags um zwölf würde ich gerne kurz vom Strom trennen wenn der Herd keine Leistung >2 Watt zieht...
Hintergrund - Uhr stellen - aber einen evtl. Kochvorgang dafür nicht unterbrechen.

Kannst ja mit at-Befehl probieren, wenn es nicht funktioniert hier posten.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Jens_B am 20 März 2014, 10:22:46
Hallo zusammen,

also ich habe das Modul gerade entdeckt, noch nicht probiert. Aber die Idee finde ich gerade für einen Anfänger total gut.
Ich werde das Modul mal testen und ich meinem kleinen "Testraum" ausprobieren.

Gruß
Jens
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 20 März 2014, 15:38:08
Zitat von: der-Lolo am 20 März 2014, 09:34:49
Ich habe das Gefühl das bei langen zeichenketten eine Beschränkung vorhanden ist. Wahrscheinlich aber eher von Perl oder FHEM aus als vom Modul.

Ich kann keine Beschränkungen bei mir erkennen. Ich habe diese lange Zeile in der Kommandozeile eingegeben:

IF (([Aussensensor:humidity:d] > 10) and ([Aussensensor:humidity:d] < 90)) (set Drucker off,set Drucker off, set Drucker off, set Drucker off, set Drucker off, set Drucker off, attr Drucker devStateIcon off:power-orange:on,define at_test at +00:02 set Drucker  on;;set Drucker on ;;set Drucker on ;; attr Drucker disable 1)


Alles wurde bei mir korrekt ausgeführt. FHEM läuft bei mir auf einem Windows-Rechner.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: der-Lolo am 20 März 2014, 18:14:52
versuch es mal bitte in einer notify definition...
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 20 März 2014, 19:00:28
Zitat von: der-Lolo am 20 März 2014, 18:14:52
versuch es mal bitte in einer notify definition...

Es funktioniert bei mir alles, wie programmiert.

Ich glaube, ich weiß was dein Problem ist.

Wenn du in der Kommandozeile define n_mpl_Herd_m notify mpl_Herd_m IF .... definierst, dann müsstest du schon vier! Semiklons hinter define .. at angeben statt zwei, damit in der DEF-Zeile des notifys zwei! übrig bleiben - das erforderliche Doppeln von Semikolons führt immer wieder zu Problemen.

Du kannst dir auch behelfen, indem du in der Kommandozeile tippst:

define n_mpl_Herd_m notify mpl_Herd_m bla (bla statt IF ....)

Dann gehst du in dein notify hier also n_mpl_Herd_m über DEF und ersetzt dort "bla" durch deinen IF-Befehl mit den zwei! Semikolons hinter define  .. at.

Sorry, das Doppeln von Semikolons ist nicht auf meinem Mist gewachsen.

Man kann auch die ganze Problematik mit den Semikolons mit einem Trick umgehen. In deinem Fall könntest du tippen:

define n_mpl_Herd_m notify mpl_Herd_m
IF (([mpl_Herd_m:power:d] > 2) and ([mpl_Herd_m:power:d] < 25))
  (set mpl_Herd_switch off,attr mpl_Herd_switch devStateIcon off:power-orange:on,define a_mpl_Herd_m at +00:33:00 IF (1) (set mpl_Herd_switch on, attr m_Herd_on disable 1))


Auf diese Weise brauchst du gar keine Semikolons zu tippen, denn der zweite (missbrauchte) IF kümmert sich um die korrekte Syntax. ;)

Dann ist auch egal, ob du alles in der Kommandozeile tippst oder beim DEF des notifys selbst.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: der-Lolo am 20 März 2014, 19:07:05
Ok, danke für die Tipps! Unten das mit dem zweitem IF gefällt mir gut...
Ich gebe eigentlich immer nur
define bla notify blub IF()
ein und drücke dann enter - den rest erledige ich über die DEF - fläche...
Keine Ahnung woran es scheiterte - jetzt jedenfalls geht es erstmal.
Das ich dein IF Modul klasse finde brauche ich ja nicht mehr zu erwähnen, ich benutze es fast ausschliesslich...
Tolle Arbeit also.
Danke! Und mach weiter so ;-)
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 20 März 2014, 19:15:50
Zitat von: der-Lolo am 20 März 2014, 19:07:05
Ok, danke für die Tipps! Unten das mit dem zweitem IF gefällt mir gut...
Ich gebe eigentlich immer nur
define bla notify blub IF()
ein und drücke dann enter - den rest erledige ich über die DEF - fläche...
Keine Ahnung woran es scheiterte - jetzt jedenfalls geht es erstmal.
Das ich dein IF Modul klasse finde brauche ich ja nicht mehr zu erwähnen, ich benutze es fast ausschliesslich...
Tolle Arbeit also.
Danke! Und mach weiter so ;-)

Ich teste bereits eine weitere Version des IF-Befehls, die kann auch mit Internals umgehen nach der Syntax IF ([Device:&STATE] ...

Nach fast drei monatiger Test-Phase - es wurde bisher keine Inkonsistenz oder Fehlverhalten des IF-Befehls festgestellt - könnte man über das Einchecken des Befehls nachdenken, damit es der Allgemeinheit zugute kommt.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: der-Lolo am 20 März 2014, 20:49:00
ich heb gerne den Finger als Tester..
Mein nächstes grösseres Projekt soll werden 2 Systeme vernünftig zu koppeln schön das die Jungs gerade parallel die 98_Dummy bearbeiten, die koppeln wenn ich alles richtig verstanden habe Readings in ein Dummy - so hätte man ja auf beiden Maschinen jeweils fast das Device...

Einbinden von php steht auch noch auf der ToDo liste, genau wie IR Senden & Empfangen...
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Joachim am 20 März 2014, 21:09:44
Zitatschön das die Jungs gerade parallel die 98_Dummy bearbeiten, die koppeln wenn ich alles richtig verstanden habe Readings in ein Dummy - so hätte man ja auf beiden Maschinen jeweils fast das Device...

Tester wilkommen
http://forum.fhem.de/index.php/topic,21533.0.html

gruß Joachim
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 22 März 2014, 17:43:23
Neue Version von IF,

ich habe IF noch ein wenig erweitert. Es sind nun neben Reading-Angaben auch Internal-Angaben (mit &) möglich.

Die typische Statusabfrage kann jetzt besonders einfach nur durch die Angabe des Devices angegeben werden:

define check at +00:10 IF ([outdoor] eq "open") (set switch1 on)

entspricht mit Angabe des Internals:

define check at +00:10 IF ([outdoor:&STATE] eq "open") (set switch1 on)

Wenn der Reading "state" abgefragt werden soll, dann wird der Readingname wie bisher ohne & angegeben:

define check at +00:10 IF ([outdoor:state] eq "open") (set switch1 on)

Die neue Version habe ich bereits eingecheckt - gibt´s morgen per Update. Neue Doku siehe dann in der Commandref.

Rudi müsste noch die command_frame-Datei für deutsch und englisch anpassen, damit der IF-Befehl unter FHEM-Befehlen in der Commandref erscheint.

Edit: Die bisherige Version im ersten Post zum Download habe ich entfernt.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: paolo am 22 März 2014, 20:29:19
hallo,

wo kann ich denn die Datei/ das modul herrunter laden, ich finde es nicht
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 22 März 2014, 21:10:57
Zitat von: paolo am 22 März 2014, 20:29:19
hallo,

wo kann ich denn die Datei/ das modul herrunter laden, ich finde es nicht

Ab morgen per FHEM-Update.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Michi240281 am 23 März 2014, 01:44:43
Bei folgendem WeekdayTimer wird nur der erste Ausdruck ausgeführt, nicht der 2.!

define test WeekdayTimer Flurlicht 1234567|{sunset_abs("HORIZON=-4")}|an IF ([Abwesend:state] eq "ja") (set Flurlicht pct 25) 1234567|01:00|aus IF ([Abwesend:state] eq "ja") (set Flurlicht aus)

Ich nehme mal an, es liegt daran, dass das IF da drin ist und normalerweise trennt man ja mit Leerzeichen, allerdings sind jetzt auch Leerzeichen vor dem ersten IF, weshalb er denke ich den 2. Ausdruck nicht mehr "sieht"!

Jmd ne Lösung? Mit ";" gehts nicht.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: rudolfkoenig am 23 März 2014, 08:12:48
Habe die commandref_frame Dateien angepasst.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 23 März 2014, 08:47:50
Zitat von: rudolfkoenig am 23 März 2014, 08:12:48
Habe die commandref_frame Dateien angepasst.

Danke.

Nur mal zum Verständnis für alle, die den Download suchen:

IF ist jetzt ein Bestandteil von FHEM und braucht nicht mehr separat heruntergeladen zu werden. Es kommt wie alle anderen FHEM-Module per FHEM-Update ins Haus.

Die aktuelle Doku ist hier zu finden:

http://fhem.de/commandref_DE.html#IF

Gruß

Damian

Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 23 März 2014, 10:55:47
Zitat von: Michi240281 am 23 März 2014, 01:44:43
define test WeekdayTimer Flurlicht 1234567|{sunset_abs("HORIZON=-4")}|an IF ([Abwesend:state] eq "ja") (set Flurlicht pct 25) 1234567|01:00|aus IF ([Abwesend:state] eq "ja") (set Flurlicht aus)

Den auszuführenden Befehl solltest du nur einmal am Ende angeben, "pct 25" bzw. "aus" sind nur Argumente des Befehls und werden anstelle von % eingesetzt, siehe Doku zu WeekdayTimer:

dann schon eher:

define test WeekdayTimer Flurlicht 1234567|{sunset_abs("HORIZON=-4")}|pct:25  1234567|01:00|aus IF ([Abwesend:state] eq "ja") (set Flurlicht %)

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Michi240281 am 23 März 2014, 12:35:03
Ok! Danke!
Klappt!!!!!! :)
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: paolo am 25 März 2014, 09:50:20
Hallo,

ich bin einerseits ein Anfänger mit dem FEHM und daher bitte entschuldigt, wenn ich was frage was man evtl. wissen müsste.

ich möchte einen Pumpe von der der Heizung schalten. dafür hebe ich einen Differen-Temp-Sensor angebracht und einen schalter.

Nun ist meine Vorstellung, wenn die Differenz von Vorlauf minus Rücklauf  kleine < 1 ist soll sich die Pumpe ausschalten und wenn diese Differenz größer ist wieder einschalten. Hintergrund ist das ich einfach Strom sparen möchte da die Pumpe im Jahr ca 100,- verbraucht.
Nun habe ich die folgenden Varianten Versucht nach der Anleitung zu benutzen aber es wird nicht wirklich geschalten




define VorlaufPumpenSteuerung at +*00:01:00 { if (ReadingsVal("0_HM_HZ_Keller_Vorlauf_minus_Ruecklauf_T2_T1") < 1) { fhem("0_HM_HZ_Vorlaufpumpe on") } else { fhem("0_HM_HZ_Vorlaufpumpe off") } }
attr VorlaufPumpenSteuerung room 9.02_Steuerung


define VorlaufPumpenSteuerung_off at +*00:10:00 IF (0_HM_HZ_Keller_Vorlauf_minus_Ruecklauf_T2_T1 < 1) ( set 0_HM_HZ_Vorlaufpumpe off)
define VorlaufPumpenSteuerung_on at +*00:12:00 IF (0_HM_HZ_Keller_Vorlauf_minus_Ruecklauf_T2_T1 > 1) ( set 0_HM_HZ_Vorlaufpumpe on)
attr VorlaufPumpenSteuerung_off room 9.02_Steuerung
attr VorlaufPumpenSteuerung_on room 9.02_Steuerung


Was mache ich falsch oder ... Kann mir bitte mal jemand auf die Sprünge helfen?


Vielen Dank
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 25 März 2014, 10:09:14
Zitat von: paolo am 25 März 2014, 09:50:20



define VorlaufPumpenSteuerung at +*00:01:00 { if (ReadingsVal("0_HM_HZ_Keller_Vorlauf_minus_Ruecklauf_T2_T1") < 1) { fhem("0_HM_HZ_Vorlaufpumpe on") } else { fhem("0_HM_HZ_Vorlaufpumpe off") } }

define VorlaufPumpenSteuerung_off at +*00:10:00 IF (0_HM_HZ_Keller_Vorlauf_minus_Ruecklauf_T2_T1 < 1) ( set 0_HM_HZ_Vorlaufpumpe off)


Ob bei der Funktion ReadingsVal oder beim IF-Befehl, ein Reading muss immer durch den Device-Namen und den Reading-Namen eindeutig spezifiziert  werden.

Beim IF musst du also bei dir angeben:

define VorlaufPumpenSteuerung_off at +*00:10:00 IF ([device_name:reading_name] < 1) ( set 0_HM_HZ_Vorlaufpumpe off)

Statt device_name muss der Name deines Sensors stehen und bei reading_name der entsprechende Name des Readings deines Sensors, wo die Differenz der Temperaturen steht.

Sonst noch mal bei den Beispielen hier nachschauen: http://fhem.de/commandref_DE.html#IF

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: paolo am 25 März 2014, 20:30:01
vielen Dank hat geholfen, habe ich leider nicht ganz so verstanden gehabt. Super Arbeit Danke noch mal für das Modul
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 25 März 2014, 20:53:49
Ich sehe gerade, dass du alle 10! Minuten deine Pumpe schaltest.

Das machst du viel eleganter mit dem THRESHOLD-Modul.

Das schaltet nämlich nur dann, wenn wirklich was zu schalten ist, auch wenn dein Event im Sekundentakt käme!

siehe: http://fhem.de/commandref_DE.html#THRESHOLD

Es sind dort auch Beispiele für Zirkulationspumpen-Steuerung zu finden.

Gruß

Damian

Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Michi240281 am 26 März 2014, 20:26:00
Hab nen kleines Problem.

Folgender notify hat ja an sich super funktioniert:

define Motion_Terasse notify BM_Terasse:motion IF ([BM_Terasse:brightness] < 125 and [BM_Terasse_aktiv:state] eq "ja") (set Lampe_Terasse 100 120, define Lampe_Terasse_at at +00:02:00 set Lampe_Terasse [Lampe_Terasse:level:d])


Hintergrund war ja, dass ich wollte, dass die Lampe den Wert wieder annimmt, den sie hatte, bevor der Bewegungsmelder die Lampe angemacht hat. Soweit so gut. Jetzt ist mir letzte Tage und soeben wieder aufgefallen, dass die Lampe die ganze Zeit an war, obwohl garkeine Bewegung mehr da war und die 2 Minuten auch längst um waren. Ich habe draußen was gemacht und das notify wurde also mehrfach hintereinander ausgelöst. Meine These ist nun, dass sich die Lampe dann zwischendrin mal auf 100% befand, als das notify das nächste Mal ausgelöst wurde und dann war eben 100% der Wert, den das "at" dann wieder angenommen hat.

Wie kann ich das denn nun lösen? Jmd ne Idee? Vllt mal mit den Zeiten spielen? Andere Möglichkeit?

Danke schonmal!!!
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 26 März 2014, 20:46:46
Zitat von: Michi240281 am 26 März 2014, 20:26:00
define Motion_Terasse notify BM_Terasse:motion IF ([BM_Terasse:brightness] < 125 and [BM_Terasse_aktiv:state] eq "ja") (set Lampe_Terasse 100 120, define Lampe_Terasse_at at +00:02:00 set Lampe_Terasse [Lampe_Terasse:level:d])


probiere einfach:

define Motion_Terasse notify BM_Terasse:motion IF ([BM_Terasse:brightness] < 125 and [BM_Terasse_aktiv:state] eq "ja" and !$defs{Lampe_Terasse_at}) (set Lampe_Terasse 100 120, define Lampe_Terasse_at at +00:02:00 set Lampe_Terasse [Lampe_Terasse:level:d])


Jetzt dürfte es kein Problem sein, während der zwei Minuten den notify mehrfach auszulösen. Auch die Fehlermeldung im Log, dass Lampe_Terasse_at schon definiert ist wird nicht mehr kommen.

Was  !$defs{Lampe_Terasse_at} bedeutet, kannst du dir jetzt bestimmt schon denken. ;)

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Alex_E am 26 März 2014, 22:27:21
Hallo zusammen,

ich versuche mich gerade an einem Code, bekomme es aber einfach nicht hin. Ich würde gerne in Abhängig des Presence Moduls im Bereich Roommate eine Lampe nur dann schalten, wenn es dunkel bzw. zwischen verschiedenen Uhrzeiten ist.

Aktuell habe ich folgendes, was die Lampe grundsätzlich, ohne Uhrzeit oder Dunkelheit schaltet. Sieht so aus:
rr_Alex:home set ku_Lampe_gross on-for-timer 576

Jetzt soll also zusätzlich geprüft werden, ob es dunkel bzw. zwischen 2 Zeiten liegt und nur in dieser Abhängigkeit geschaltet werden.
Versucht habe ich es mit folgendem:

define LichtA notify rr_alex IF ([rr_Alex:home] and ($hms gt "18:00" and $hms lt "05:00") (set ku_Lampe_gross on-for-timer 576)

Jemand einen Tip für mich was ich falsch mache?

Gruß

Alex

Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 27 März 2014, 09:37:23
Zitat von: Alex_E am 26 März 2014, 22:27:21

define LichtA notify rr_alex IF ([rr_Alex:home] and ($hms gt "18:00" and $hms lt "05:00") (set ku_Lampe_gross on-for-timer 576)

Jemand einen Tip für mich was ich falsch mache?

Es gibt keine Uhrzeit, die sowohl größer als 18:00 und gleichzeitig kleiner als 05:00 Uhr ist.

Wenn es über Mitternacht geht, gibt es zwei Intervalle von 18:00 bis 00:00 Uhr und von 0:00 bis 05:00 Uhr

In solchen Fällen,  musst du beide Intervalle mit oder verknüpfen. In diesem Fall also:

define LichtA notify rr_alex IF ([rr_Alex:home] and ($hms gt "18:00" or $hms lt "05:00") (set ku_Lampe_gross on-for-timer 576)

Gruß

Damian

Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Bartimaus am 31 März 2014, 10:16:36
Zitat von: Bartimaus am 04 März 2014, 21:52:58
So hat es jetzt (dank Damians Hilfe) funktioniert...

define PoolPumpeAn at *21:00 IF (1) (set PoolPumpe on-for-timer {[Pool:state:d]/2*3600})

MoinMoin,
ich habe jetzt gemerkt, das der maximale "on-for-timer" wert "lediglich" -> 15.360s beträgt.
Das ist für meine Fälle zu wenig.
Kann man nicht auch eine "on-Till" Zeit berechnen in abhängigkeit vom einschaltzeitpunkt ?
zb
define PoolPumpeAn at *01:00 IF (set PoolPumpe on-till {01:00 + ([Pool:state:d]/2*3600)})
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 31 März 2014, 11:05:44
Zitat von: Bartimaus am 31 März 2014, 10:16:36

MoinMoin,
ich habe jetzt gemerkt, das der maximale "on-for-timer" wert "lediglich" -> 15.360s beträgt.
Das ist für meine Fälle zu wenig.
Kann man nicht auch eine "on-Till" Zeit berechnen in abhängigkeit vom einschaltzeitpunkt ?
zb
define PoolPumpeAn at *01:00 IF (set PoolPumpe on-till {01:00 + ([Pool:state:d]/2*3600)})

Im Prinzip kannst du in den geschweiften Klammern bei IF alles einbauen, was in Perl geht + Nutzung der Readings.

define PoolPumpeAn at *01:00 IF (1) ((set  PoolPumpe on-till {sprintf("%02d:%02d",1+[Pool:state:d]/2,([Pool:state:d]/2-int([Pool:state:d]/2))*60)}))

Elegant ist anders - da könnte man schon eine Perl-Routine dafür auslagern - aber es funktioniert.

Gruß

Damian



Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Bartimaus am 31 März 2014, 12:01:43
Hallo Damian,
wie immer erstmal ein fettes Danke für Deine schnelle Hilfe.
Ich habe das jetzt mal an einem Dummy ausprobiert. Dabei habe ich den *at-befehl auf 11:53 Uhr gelegt. Seit 11:53 sehe ich jetzt, das der Dummy eingeschaltet ist, mit "on-till 04:08".
D.h. in Deinem Code steckt irgendwo  noch die Einschaltuhrzeit "01:00:00" verschachtelt drin, richtig ? Ich hatte vermutet hier sprintf("%02d:%02d",1+[Pool:state:d]/4, war es aber nicht.
Pool:state = 12,6
define PoolPumpeAutomatikMaster15 at *11:53:00 IF ($month> 2 && $month< 10 and [PoolPumpe_Master:state] eq "on" and [Pool:state:d]>= 10) ((set PoolPumpe_Master2 on-till {sprintf("%02d:%02d",1+[Pool:state:d]/4,([Pool:state:d]/4-int([Pool:state:d]/4))*60)}))

Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: rudolfkoenig am 31 März 2014, 12:02:54
Das besondere an on-for-timer ist, dass die Ablaufzeit im Geraet gespeichert wird, und keine zweite Funk-Nachricht zum abschalten notwendig ist.
D.h. wenn die Nachricht (on-for-timer) nicht ankommt, dann schaltet das Geraet nicht ein, wenn es ankommt, dann schaltet es mit grosser Wahrscheinlichkeit nach Ablauf der Zeit auch ab. Z.Bsp bei einer Bewaesserungspumpe wuerde ich nur on-for-timer senden (notfalls mehrere verteilt auf dem Tag), und nicht mit on-till arbeiten. MWn deckt on-for-timer fuer Homematic einen groesseren Zeit-Bereich ab.

Ansonsten kann man auch einen Abschalt-At definieren, on-till ist nichts anderes.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 31 März 2014, 12:07:31
Zitat von: Bartimaus am 31 März 2014, 12:01:43

D.h. in Deinem Code steckt irgendwo  noch die Einschaltuhrzeit "01:00:00" verschachtelt drin, richtig ?

define PoolPumpeAutomatikMaster15 at *11:53:00 IF ($month> 2 && $month< 10 and [PoolPumpe_Master:state] eq "on" and [Pool:state:d]>= 10) ((set PoolPumpe_Master2 on-till {sprintf("%02d:%02d",1+[Pool:state:d]/4,([Pool:state:d]/4-int([Pool:state:d]/4))*60)}))

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 31 März 2014, 12:09:32
Zitat von: rudolfkoenig am 31 März 2014, 12:02:54
Ansonsten kann man auch einen Abschalt-At definieren, on-till ist nichts anderes.

ja, dennoch wird er die Abschaltzeit dynamisch anhand des Pool-Readings bestimmen wollen.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Bartimaus am 31 März 2014, 12:14:57
Danke, habe ich gerade auch mal mit 6+ getestet. Hat funktioniert.
d.h. der *at muss identisch sein mit dem sprintf(n+)...

@Rudolf
Danke für die Info. Das mit dem Abschalttimer muss ich mir mal durch den Kopf gehen lassen, allerdings wird diese bestimmt durch einen errechneten Wert (Pooltemp / n*3600)
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: betateilchen am 31 März 2014, 14:02:19
Zitat von: Damian am 27 März 2014, 09:37:23Es gibt keine Uhrzeit, die sowohl größer als 18:00 und gleichzeitig kleiner als 05:00 Uhr ist.

Das nicht. Aber alle anderen Uhrzeiten zeichnen sich dadurch aus, dass sie zwischen 05:00 und 18:00 liegen.
Wenn ich also eine Abfrage auf  ~~ [5..17] mache und das Ergebnis mit ! umkehre, brauche ich keine Intervalle berücksichtigen.

Gib doch mal folgendes ein:

{!($hour ~~ [5..17])}

um die Ecke denken ;)
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 31 März 2014, 14:22:47
Zitat von: betateilchen am 31 März 2014, 14:02:19
{!($hour ~~ [5..17])}

um die Ecke denken ;)

Ist nicht zu empfehlen. Hier wird unnötig eine Liste durchsucht, funktioniert auch nur mit ganzen Zahlen.

Gruß

Damian

Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: betateilchen am 31 März 2014, 14:31:58
Stunden sind meistens ganze Zahlen.

Und man kann das natürlich auch mit zwei Vergleichen > und < machen und braucht trotzdem keine zwei Intervalle.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 31 März 2014, 15:06:25
Zitat von: betateilchen am 31 März 2014, 14:31:58
Stunden sind meistens ganze Zahlen.

Und man kann das natürlich auch mit zwei Vergleichen > und < machen und braucht trotzdem keine zwei Intervalle.

Noch mal für alle, die jetzt total verwirrt sind:

8:00 bis 15:00 Uhr ist ein Intervall, also (a >= 8 and a<=15), mathematisch dargestellt [8,15].

Von 15:00 Uhr bis 8:00 ist bis auf die Grenzen die Negation des Oberen: also not( a >= 8 and a<= 15)  ist gleich  (a<8 or a>15) bzw.

( a> 15 or a < 8 ) (vergl. mein unterer Beitrag)

Mathematisch als zwei unbeschränkte Intervalle zu sehen also: ]-unendlich,8[ bzw. ]15,unendlich[

Ist aber schon OT hier. Bei Interesse hier weiterlesen: http://de.wikipedia.org/wiki/Intervall_(Mathematik)

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Bartimaus am 31 März 2014, 18:53:59
Zitat von: Damian am 31 März 2014, 11:05:44
Im Prinzip kannst du in den geschweiften Klammern bei IF alles einbauen, was in Perl geht + Nutzung der Readings.

define PoolPumpeAn at *01:00 IF (1) ((set  PoolPumpe on-till {sprintf("%02d:%02d",1+[Pool:state:d]/2,([Pool:state:d]/2-int([Pool:state:d]/2))*60)}))

Elegant ist anders - da könnte man schon eine Perl-Routine dafür auslagern - aber es funktioniert.

Gruß

Damian


Hi, darf ich nochmal ? Der Einschaltbefehl funktioniert, auch den errechneten Ausschaltzeitpunkt kann ich  erkennen (Windows zeigt diesen beim "drüberfahren" mit der Maus in einer Sprechblase an), beim Test war er zb: um 16:21Uhr. Nur hat der Dummy um 16:21 nicht den state von on nach off gewechselt, sondern leuchtet munter weiter. Liegt das an dem Dummy ? Theoretisch doch nicht.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 31 März 2014, 19:13:46
Zitat von: Bartimaus am 31 März 2014, 18:53:59

Liegt das an dem Dummy ?

Wahrscheinlich.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Bartimaus am 31 März 2014, 20:45:45
Tat es :)
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Bartimaus am 16 April 2014, 11:50:18
Guten Morgen,
ich versuche gerade die Zirkulationspumpemit FHEM / IF zu automatisieren.
Wenn ich folgenden Code speichere (Pumpe soll um 11:00Uhr alle 15 min jeweils für 3min laufen) :
define PumpeTest1 at *11:36:00 IF ([Abwesend:state] eq "off") (define a_test at at +*{4}00:15:00 set ZirkulationsPumpe on-for-timer 180)

erhalte ich im Logfile folgenden Eintrag:

define a_test at at +*400:15:00 set ZirkulationsPumpe on-for-timer 180 : Wrong timespec at: either HH:MM:SS or {perlcode}

Wie es aussieht, kommt IF mit +*{n} nicht zurecht, kann das sein ?
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 16 April 2014, 14:58:13
Zitat von: Bartimaus am 16 April 2014, 11:50:18
Guten Morgen,
ich versuche gerade die Zirkulationspumpemit FHEM / IF zu automatisieren.
Wenn ich folgenden Code speichere (Pumpe soll um 11:00Uhr alle 15 min jeweils für 3min laufen) :
define PumpeTest1 at *11:36:00 IF ([Abwesend:state] eq "off") (define a_test at at +*{4}00:15:00 set ZirkulationsPumpe on-for-timer 180)

erhalte ich im Logfile folgenden Eintrag:

define a_test at at +*400:15:00 set ZirkulationsPumpe on-for-timer 180 : Wrong timespec at: either HH:MM:SS or {perlcode}

Wie es aussieht, kommt IF mit +*{n} nicht zurecht, kann das sein ?
ja, z. Zt. kollidiert es mit der Möglichkeit bei IF in Kombination mit FHEM-Befehlen beliebige Perl-Ausdrücke in geschweiften Klammern ausführen zu lassen. Ich werde mir was einfallen lassen, dass beides geht.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Michi240281 am 25 April 2014, 19:47:22
Hallo,

ich möchte mir gerne, wenn es an der Haustür klingelt und ich nicht daheim bin, eine Pushnachricht schicken lassen.

So sieht das notify aus:

define Klingelbenachrichtigung_Abwesend notify Klingeltaster:closed IF ([Abwesenheit_Michael] eq "ja") (set Push msg 'Fhem-Benachrichtigung' 'Türklingel betätigt' '' 0 '')

Dabei tritt folgender Fehler auf:


IF: use " instead of ': set Push msg 'Fhem-Benachrichtigung' 'Türklingel betätigt' '' 0 ''


Der kommt auch, wenn man nur den IF-Ausdruck ausführt.

Ein

set Push msg 'Fhem-Benachrichtigung' 'Türklingel betätigt' '' 0 ''

funktioniert einwandfrei. Beim Pushover Modul muss es wohl so sein, dass die Syntax 2 Hochkommata beinhaltet, statt Apostrophs.

Ne Idee wo die Ursache liegen könnte und wie man das beheben kann?
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 25 April 2014, 21:29:50
Zitat von: Michi240281 am 25 April 2014, 19:47:22
Hallo,

ich möchte mir gerne, wenn es an der Haustür klingelt und ich nicht daheim bin, eine Pushnachricht schicken lassen.

So sieht das notify aus:

define Klingelbenachrichtigung_Abwesend notify Klingeltaster:closed IF ([Abwesenheit_Michael] eq "ja") (set Push msg 'Fhem-Benachrichtigung' 'Türklingel betätigt' '' 0 '')

Dabei tritt folgender Fehler auf:


IF: use " instead of ': set Push msg 'Fhem-Benachrichtigung' 'Türklingel betätigt' '' 0 ''


Der kommt auch, wenn man nur den IF-Ausdruck ausführt.

Ein

set Push msg 'Fhem-Benachrichtigung' 'Türklingel betätigt' '' 0 ''

funktioniert einwandfrei. Beim Pushover Modul muss es wohl so sein, dass die Syntax 2 Hochkommata beinhaltet, statt Apostrophs.

Ne Idee wo die Ursache liegen könnte und wie man das beheben kann?

Beim IF werden einfache Anführungszeichen intern benutzt, um die Kommandos an das perl-if zu übergeben, deswegen funktionieren z. Zt. nur doppelte.

Was passiert, wenn du angibst:

set Push msg "Fhem-Benachrichtigung" "Türklingel betätigt" "" 0 ""


Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Michi240281 am 25 April 2014, 21:49:14
Funktioniert!!!!!!! :)

Verstehe nicht, warum dann im PushOver Modul steht, dass es keine Anführungszeichen sein dürfen sondern Hochkommata sein müssen.........
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 25 April 2014, 22:33:17
Zitat von: Michi240281 am 25 April 2014, 21:49:14
Funktioniert!!!!!!! :)

Verstehe nicht, warum dann im PushOver Modul steht, dass es keine Anführungszeichen sein dürfen sondern Hochkommata sein müssen.........

Wenn du z. B. perl-if benutzen würdest, müsstest du den set Push-Befehl mit fhem("set Push...") aufrufen und dann würden doppelte Anführungszeichen beim Push nicht funktionieren, weil sie schon für fhem("..") genutzt würden.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 28 April 2014, 17:03:21
Zitat von: Damian am 16 April 2014, 14:58:13
ja, z. Zt. kollidiert es mit der Möglichkeit bei IF in Kombination mit FHEM-Befehlen beliebige Perl-Ausdrücke in geschweiften Klammern ausführen zu lassen. Ich werde mir was einfallen lassen, dass beides geht.

Gruß

Damian

Ich habe nun IF so angepasst, dass geschweifte Klammern in FHEM-Befehlen nicht ausgewertet werden, um kompatibel zu FHEM-Befehlen, wie z. B. at, die selbst geschweifte Klammern nutzen, zu sein. Gleichzeitig bedeutet diese Änderung, dass ich die Auswertung von Perlausdrücken innerhalb von FHEM-Befehlen spezieller fassen musste. Dies führt zur Inkompatibilität zu der bisherigen Version. Will man mit der neuen IF-Version einen Perlausdruck auswerten, muss er zusätzlich in runde Klammern gefasst werden. Ich denke diese Inkompatibilität ist zu verschmerzen, da wahrscheinlich noch nicht viele dieses Feature nutzen. Die Doku wurde entsprechend angepasst.

Beispiel aus der Doku:

aus bisher:

define temp at 18:00 IF ([outdoor:temperature] > 10) (set thermostat desired-temp {[thermostat:desired-temp:d]+1})

wird dann:

define temp at 18:00 IF ([outdoor:temperature] > 10) (set thermostat desired-temp {([thermostat:desired-temp:d]+1)})


Wer also dieses Feature bereits nutzt, muss es dann wie oben anpassen. Update des Befehls kommt in den nächsten Tagen.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Bartimaus am 29 April 2014, 10:34:44
Moin,
danke für die Rückmeldung. Wann wird das Update verfügbar sein ?
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 29 April 2014, 12:24:23
Zitat von: Bartimaus am 29 April 2014, 10:34:44
Moin,
danke für die Rückmeldung. Wann wird das Update verfügbar sein ?

Ich werde es heute hochladen. Es wird also morgen per Update verfügbar sein.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: yogiflop am 29 April 2014, 17:21:15
Zitat von: Damian am 25 April 2014, 21:29:50
Beim IF werden einfache Anführungszeichen intern benutzt, um die Kommandos an das perl-if zu übergeben, deswegen funktionieren z. Zt. nur doppelte.

Was passiert, wenn du angibst:

set Push msg "Fhem-Benachrichtigung" "Türklingel betätigt" "" 0 ""


Gruß

Damian


Das funktioniert aber leider nur so lange, wie ich keine Variable mit übergebe. Wenn ich mich richtig erinnere wird bei '$temp' der Inhalt der variablen $temp übergeben und bei "$temp" der string $temp geschrieben. Für mich währe es sehr interessant, das ich wieder eine Variable mit übergeben kann, da ich gerne in der Push-Meldung auch den Fehlertyp haben möchte, den ich mit IF abfange.

gruß
Marc
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 29 April 2014, 17:46:11
Zitat von: yogiflop am 29 April 2014, 17:21:15

Das funktioniert aber leider nur so lange, wie ich keine Variable mit übergebe. Wenn ich mich richtig erinnere wird bei '$temp' der Inhalt der variablen $temp übergeben und bei "$temp" der string $temp geschrieben. Für mich währe es sehr interessant, das ich wieder eine Variable mit übergeben kann, da ich gerne in der Push-Meldung auch den Fehlertyp haben möchte, den ich mit IF abfange.

gruß
Marc

Warum soll das mit Variablen nicht gehen? Von wo kommt $temp? Wo soll es übergeben werden? Wie sieht dein bisheriger Konstrukt aus?

Gruß

Damian

Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: yogiflop am 29 April 2014, 18:00:56
Zitat von: Damian am 29 April 2014, 17:46:11
Warum soll das mit Variablen nicht gehen? Von wo kommt $temp? Wo soll es übergeben werden? Wie sieht dein bisheriger Konstrukt aus?

Gruß

Damian

danke für die schnelle Antwort:

Momentan sieht es so aus:
+*00:05:00 IF ([ohz.owo.weather:_httpResponse_c]  ne "200 OK") ({my $temp=ReadingsVal("ohz.owo.weather","_httpResponse_c","")},{Log 2, "ohz.owo.waether Fehler Vorher: " .ReadingsVal("ohz.owo.weather","_httpResponse_c","") }, set ohz.owo.weather stationById 2856500 , set notify.push msg "FHEM" "Fehler OpenWeatherMap - Siehe Logfile - $temp" "" 0 "", {Log 2, "ohz.owo.waether Fehler Nachher: " .ReadingsVal("ohz.owo.weather","_httpResponse_c","") } )


und in der Meldung steht dann leider auch
ZitatFehler OpenWeatherMap - Siehe Logfile - $temp


Edit:
Habe zum testen das "ne" auch durch "eq" ersetzt, weil momentan arbeitet der Befehl ja wunderbar, bis auf die Pushover-Meldung
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: yogiflop am 29 April 2014, 18:19:14
Nachtrag:

Ein


{my $temp=ReadingsVal("ohz.owo.weather","_httpResponse_c","") ;; fhem("set notify.push msg 'FHEM' 'Fehler OpenWeatherMap - Siehe Logfile - $temp' '' 0 '' ") }


in der Kommandozeile erzeugt die gewünschte Nachricht mit dem $temp Wert
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 29 April 2014, 18:43:06
Zitat von: yogiflop am 29 April 2014, 18:00:56
danke für die schnelle Antwort:

Momentan sieht es so aus:
+*00:05:00 IF ([ohz.owo.weather:_httpResponse_c]  ne "200 OK") ({my $temp=ReadingsVal("ohz.owo.weather","_httpResponse_c","")},{Log 2, "ohz.owo.waether Fehler Vorher: " .ReadingsVal("ohz.owo.weather","_httpResponse_c","") }, set ohz.owo.weather stationById 2856500 , set notify.push msg "FHEM" "Fehler OpenWeatherMap - Siehe Logfile - $temp" "" 0 "", {Log 2, "ohz.owo.waether Fehler Nachher: " .ReadingsVal("ohz.owo.weather","_httpResponse_c","") } )



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
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: yogiflop am 29 April 2014, 18:53:11
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


bedankt..... klappt .....


gruß Marc
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Michi240281 am 02 Mai 2014, 19:18:49
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)
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: yogiflop am 06 Mai 2014, 19:53:02
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
Titel: Antw:neuer FHEM-Befehl IF
Beitrag 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
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: yogiflop am 06 Mai 2014, 23:06:45
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
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 09 Mai 2014, 22:00:13
Zitat
Ich werde im nächsten Update einbauen, dass diese Konstruktion auch mit Hochkomma funktioniert.

Ab morgen per Update verfügbar.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: yogiflop am 10 Mai 2014, 18:02:11
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","") } )
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 10 Mai 2014, 18:45:13
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
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: cwagner am 21 Mai 2014, 07:11:23
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
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 21 Mai 2014, 12:27:22
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
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: cwagner am 21 Mai 2014, 15:51:59
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
Titel: Antw:neuer FHEM-Befehl IF
Beitrag 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
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 21 Mai 2014, 23:14:46
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

Titel: [Gelöst]Antw:neuer FHEM-Befehl IF
Beitrag 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
Titel: Antw:[Gelöst]Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 22 Mai 2014, 10:44:03
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
Titel: Antw:[Gelöst]Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 24 Mai 2014, 14:05:54
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
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: cwagner am 24 Mai 2014, 16:31:53
Deine Erklärung zu $EVENT erklärt nun einiges (anderes) für mich. Deine ursprünglich vorgeschlagene Lösung gefällt mir inzwischen gut, ich kann Sie eben nicht mit trigger debuggen, sondern muss den Fenstergriff entsprechend handhaben. Im täglichen Betrieb ist die Lösung zuverlässlich und IF ist für mich im Vorteil, weil es verständlicher ist und die Einbindung von Readings intuitiv.

Vielen Dank dafür.

Christian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 24 Mai 2014, 16:49:41
Zitat von: cwagner am 24 Mai 2014, 16:31:53
Deine Erklärung zu $EVENT erklärt nun einiges (anderes) für mich. Deine ursprünglich vorgeschlagene Lösung gefällt mir inzwischen gut, ich kann Sie eben nicht mit trigger debuggen, sondern muss den Fenstergriff entsprechend handhaben. Im täglichen Betrieb ist die Lösung zuverlässlich und IF ist für mich im Vorteil, weil es verständlicher ist und die Einbindung von Readings intuitiv.

Vielen Dank dafür.

Christian

Zukünftig wirst du dir bei Abfragen keine Gedanken über Events und auch keine Gedanken über reguläre Ausdrücke machen müssen, denn das wird wie bei THRESHOLD auch bei DOIF unerheblich sein.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: der-Lolo am 24 Mai 2014, 16:54:18
Du spannst uns aber auch alle auf die Folter...
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 24 Mai 2014, 17:04:06
Zitat von: der-Lolo am 24 Mai 2014, 16:54:18
Du spannst uns aber auch alle auf die Folter...

Ok, ich halte meinen Mund (oder besser meine Finger). Da sich bisher keiner gegen DOIF ausgesprochen hat (wird bestimmt noch kommen), muss ich es nur noch umsetzen. Leider habe ich, neben FHEM-Hobby, noch einen echten Job, der mich etwas Zeit kostet, daher wird es noch etwas dauern.
Da ich allerdings vom Erfolg von DOIF überzeugt bin, werde ich es auf jeden Fall umsetzen - ich hoffe noch vor den Sommerferien.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: kermi am 30 Mai 2014, 00:00:24
Guten Abend alle miteinander,

warum funktionier bei meinen Jalousieschaltern (HM-LC-BL1-FM) folgender IF - Befehl nicht?
Genauer, es wird nur Jalousie jl_fenster1 herunter gefahren, der Rest wird ignoriert.

define jsWinter_Fenster_automatik_temp notify js_temperatur_winter IF (([js_temperatur_winter:state] eq "on") and ([js_automatik:state] eq "on")) ((set jl_fenster1 pct 0,set jl_fenster2 pct 0,set jl_terasse pct 0)) ELSE ((set jl_fenster1 pct 100,set jl_fenster2 pct 100,set jl_terasse pct 100))

Hab mich eigentlich genau an die WIKI gehalten.

PS:  DOIF finde ich eine genauso geniale Sache wie IF, bin gespannt wann es soweit ist.

Gruß
Stephan

Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 30 Mai 2014, 00:07:15
Zitat von: kermi am 30 Mai 2014, 00:00:24
Guten Abend alle miteinander,

warum funktionier bei meinen Jalousieschaltern (HM-LC-BL1-FM) folgender IF - Befehl nicht?
Genauer, es wird nur Jalousie jl_fenster1 herunter gefahren, der Rest wird ignoriert.

define jsWinter_Fenster_automatik_temp notify js_temperatur_winter IF (([js_temperatur_winter:state] eq "on") and ([js_automatik:state] eq "on")) ((set jl_fenster1 pct 0,set jl_fenster2 pct 0,set jl_terasse pct 0)) ELSE ((set jl_fenster1 pct 100,set jl_fenster2 pct 100,set jl_terasse pct 100))

Hab mich eigentlich genau an die WIKI gehalten.

PS:  DOIF finde ich eine genauso geniale Sache wie IF, bin gespannt wann es soweit ist.

Gruß
Stephan

Wenn ein Komma als Trennzeichen gelten soll (ist der Normalfall), dann darfst du keine doppelten Klammern verwenden: "((set jl_fenster1 pct 0,set ...", also:

define jsWinter_Fenster_automatik_temp notify js_temperatur_winter IF (([js_temperatur_winter:state] eq "on") and [js_automatik:state] eq "on")) (set jl_fenster1 pct 0,set jl_fenster2 pct 0,set jl_terasse pct 0) ELSE (set jl_fenster1 pct 100,set jl_fenster2 pct 100,set jl_terasse pct 100)

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: kermi am 30 Mai 2014, 17:09:01
jupp, das war es...

Damit ist meine Rolladensteuerung erst einmal perfekt, wenn dann DOIF erscheint kann ich ja meine ganzen merkwürdigen Konstrukte mit Dummys und Watchdog noch einmal übersichtlicher und einfacher umstricken.

Vielen Dank und einfach mal Respekt für deine generelle unermüdliche Hilfe hier!

Gruß
Stephan
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Brockmann am 24 Juni 2014, 12:32:34
Kann mir mal jemand auf die Sprünge helfen. Ich zweifel langsam an meinem Verstand (oder der Integrität meines FHEM). Ich würde dieses IF gerne nutzen, aber ich bekomme es nicht hin. Beispiel (über das Eingabefeld in FHEM eingegeben):
define test dummy
set test on
define testfun at +00:00:10 IF ([test] eq "on") (set test off)


Das sollte nach meinem Verständnis der Syntax korrekt sein, führt zu folgender Ausgabe im Logfile:
1: devspec2array ([test]: Unmatched ( in regex; marked by <-- HERE in m/^( <-- HERE ([test])$/ at fhem.pl line 1019.
3: set ([test] eq : Please define ([test] first
3: testfun: Please define ([test] first


fhem.pl sollte aktuell sein:
# $Id: fhem.pl 6080 2014-06-07 16:12:09Z rudolfkoenig $

Wo ist der Fehler? Vor oder hinter dem Bildschirm??
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Jens_B am 24 Juni 2014, 12:36:46
Kann es sein das Du eine eckige Klammer zuviel hast? Oder zuwenig? Ich kenn die Syntax des IF Befehls nicht.


Gesendet von meinem iPhone mit Tapatalk
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Brockmann am 24 Juni 2014, 12:40:34
Zitat von: Jens_B am 24 Juni 2014, 12:36:46
Kann es sein das Du eine eckige Klammer zuviel hast?

Ja, stimmt. Das war aber nur ein Fehler beim Abtippen. Habs korrigiert. Ändert aber nichts an der Fehlermeldung.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: der-Lolo am 24 Juni 2014, 16:42:15
Gibt es denn den Dummy test überhaupt..?
oder vielmehr gab es ein Save zwischendrin?
set dummy on wird sicher dann auch nicht richtig sein - oder zeigt test im state on?
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Brockmann am 24 Juni 2014, 16:50:04
Zitat von: der-Lolo am 24 Juni 2014, 16:42:15
Gibt es denn den Dummy test überhaupt..?
oder vielmehr gab es ein Save zwischendrin?
set dummy on wird sicher dann auch nicht richtig sein - oder zeigt test im state on?
Ich gebe diese drei Befehle unmittelbar hintereinander per Eingabefeld ein. Also gibt es den Test-Dummy auch.
Habe ja extra dieses Beispiel konstruiert, was jeder einfach nachvollziehen kann.

Ich vermute, dass es bei anderen klappt, denn genauso ist ja die Syntax von IF.
Nur warum klappt es bei mir nicht?? Kann ich irgendwas an meiner Installation modifiziert haben, was zu diesem Effekt führen würde?

Ich kann IF auch auf die gleiche Weise mit jedem anderen meiner Devices einsetzen und bekomme eine solche Fehlermeldung.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: der-Lolo am 24 Juni 2014, 18:04:12
set dummy on

liefert wirklich im state des dummys ein on?
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Brockmann am 24 Juni 2014, 18:59:09
Zitat von: der-Lolo am 24 Juni 2014, 18:04:12
set dummy on
liefert wirklich im state des dummys ein on?
Nee, set test on liefert ein on.
Ist aber auch egal, denn soweit kommt das IF doch gar nicht. Statt dessen erzeugt es die Fehlermeldung im Log, dass es test nicht kennt, obwohl es definiert ist.
Es geht ja nicht darum, dass IF nicht das tut, was es soll. Es tut gar nichts bzw. wirft einen Fehler, weil das referenzierte Device angeblich nicht definiert sei. Ist es aber.
Und das ist bei allen meinen Devices so, egal ob Dummy oder nicht.

Gegenprobe: Mach mir doch bitte mal ein kurzes, einfaches Szenario, was ich nachbauen kann, wo IF bei Dir funktioniert. Vielleicht bin ich ja wirklich einfach zu blöd...
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 24 Juni 2014, 19:11:03
Zitat von: Brockmann am 24 Juni 2014, 12:32:34
Kann mir mal jemand auf die Sprünge helfen. Ich zweifel langsam an meinem Verstand (oder der Integrität meines FHEM). Ich würde dieses IF gerne nutzen, aber ich bekomme es nicht hin. Beispiel (über das Eingabefeld in FHEM eingegeben):
define test dummy
set test on
define testfun at +00:00:10 IF ([test] eq "on") (set test off)


Das sollte nach meinem Verständnis der Syntax korrekt sein, führt zu folgender Ausgabe im Logfile:
1: devspec2array ([test]: Unmatched ( in regex; marked by <-- HERE in m/^( <-- HERE ([test])$/ at fhem.pl line 1019.
3: set ([test] eq : Please define ([test] first
3: testfun: Please define ([test] first


fhem.pl sollte aktuell sein:
# $Id: fhem.pl 6080 2014-06-07 16:12:09Z rudolfkoenig $

Wo ist der Fehler? Vor oder hinter dem Bildschirm??

Die Fehlermeldungen kommen alle nicht von IF.

Hast du den Befehl überhaupt? Das kannst du erst mal testen, indem du einfach IF in der Kommandozeile eingibst. Dann sollte die Syntax von IF kommen.


Gruß

Damian

Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Brockmann am 24 Juni 2014, 20:26:32
Zitat von: Damian am 24 Juni 2014, 19:11:03
Die Fehlermeldungen kommen alle nicht von IF.
Hast du den Befehl überhaupt? Das kannst du erst mal testen, indem du einfach IF in der Kommandozeile eingibst. Dann sollte die Syntax von IF kommen.

Wenn ich im Eingabefeld der WebGUI IF eingeben, bekomme ich als Antwort:
Global symbol "$EVTPART0" requires explicit package name at (eval 3581) line 1.
Global symbol "$EVTPART1" requires explicit package name at (eval 3581) line 1.
Global symbol "$EVTPART0" requires explicit package name at (eval 3581) line 1.
Global symbol "$EVTPART1" requires explicit package name at (eval 3581) line 1.


Immerhin nicht also nicht "Unknown Command".
FHEM ist frisch aktualisiert und danach neugestartet. Ausgabe von "version":
# $Id: fhem.pl 6080 2014-06-07 16:12:09Z rudolfkoenig $
# $Id: 00_CUL.pm 5487 2014-04-08 11:29:41Z rudolfkoenig $
# $Id: 10_CUL_HM.pm 6153 2014-06-23 05:13:54Z martinp876 $
# $Id: 14_CUL_MAX.pm 5282 2014-03-22 10:02:33Z mgehre $
# $Id: 57_Calendar.pm 6145 2014-06-20 09:50:14Z borisneubert $
# $Id: 95_Dashboard.pm 5921 2014-05-21 18:47:19Z svenson08 $
# $Id: 72_FB_CALLMONITOR.pm 5994 2014-05-28 17:56:09Z markusbloch $
# $Id: 01_FHEMWEB.pm 6090 2014-06-09 10:25:11Z rudolfkoenig $
# $Id: 92_FileLog.pm 5876 2014-05-16 19:54:51Z rudolfkoenig $
# $Id: 00_HMLAN.pm 6150 2014-06-21 19:09:37Z martinp876 $
# $Id: 10_IT.pm 5649 2014-04-25 22:44:27Z justme1968 $
# $Id: 10_MAX.pm 5446 2014-04-05 12:17:00Z mgehre $
# $Id: 73_PRESENCE.pm 5434 2014-04-04 15:43:23Z markusbloch $
# $Id: 99_SUNRISE_EL.pm 5851 2014-05-13 19:39:03Z rudolfkoenig $
# $Id: 98_SVG.pm 5956 2014-05-24 13:04:04Z rudolfkoenig $
# $Id: 59_Twilight.pm 6136 2014-06-18 19:08:58Z dietmar63 $
# $Id: 99_Utils.pm 5488 2014-04-08 11:32:17Z rudolfkoenig $
# $Id: 59_Weather.pm 6112 2014-06-14 17:41:36Z borisneubert $
# $Id: 99_XmlList.pm 1840 2012-09-12 13:52:08Z rudolfkoenig $
# $Id: 90_at.pm 5319 2014-03-25 10:11:47Z rudolfkoenig $
# $Id: 98_autocreate.pm 5268 2014-03-20 20:46:00Z rudolfkoenig $
# $Id: 98_cmdalias.pm 5818 2014-05-11 14:15:07Z rudolfkoenig $
# $Id: 98_dewpoint.pm 5099 2014-03-02 16:29:34Z betateilchen $
# $Id: 98_dummy.pm 4934 2014-02-15 08:23:12Z rudolfkoenig $
# $Id: 91_notify.pm 6081 2014-06-07 16:31:18Z rudolfkoenig $
# $Id: 98_structure.pm 5050 2014-02-26 08:29:44Z rudolfkoenig $
# $Id: 98_telnet.pm 4844 2014-02-08 07:54:03Z rudolfkoenig $
./FHEM/95_webViewControl.pm: No such file or directory
# $Id: 98_weblink.pm 5608 2014-04-23 10:57:16Z rudolfkoenig $

Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 24 Juni 2014, 20:47:05
Zitat von: Brockmann am 24 Juni 2014, 20:26:32
Wenn ich im Eingabefeld der WebGUI IF eingeben, bekomme ich als Antwort:
Global symbol "$EVTPART0" requires explicit package name at (eval 3581) line 1.
Global symbol "$EVTPART1" requires explicit package name at (eval 3581) line 1.
Global symbol "$EVTPART0" requires explicit package name at (eval 3581) line 1.
Global symbol "$EVTPART1" requires explicit package name at (eval 3581) line 1.


Immerhin nicht also nicht "Unknown Command".
FHEM ist frisch aktualisiert und danach neugestartet. Ausgabe von "version":
# $Id: fhem.pl 6080 2014-06-07 16:12:09Z rudolfkoenig $
# $Id: 00_CUL.pm 5487 2014-04-08 11:29:41Z rudolfkoenig $
# $Id: 10_CUL_HM.pm 6153 2014-06-23 05:13:54Z martinp876 $
# $Id: 14_CUL_MAX.pm 5282 2014-03-22 10:02:33Z mgehre $
# $Id: 57_Calendar.pm 6145 2014-06-20 09:50:14Z borisneubert $
# $Id: 95_Dashboard.pm 5921 2014-05-21 18:47:19Z svenson08 $
# $Id: 72_FB_CALLMONITOR.pm 5994 2014-05-28 17:56:09Z markusbloch $
# $Id: 01_FHEMWEB.pm 6090 2014-06-09 10:25:11Z rudolfkoenig $
# $Id: 92_FileLog.pm 5876 2014-05-16 19:54:51Z rudolfkoenig $
# $Id: 00_HMLAN.pm 6150 2014-06-21 19:09:37Z martinp876 $
# $Id: 10_IT.pm 5649 2014-04-25 22:44:27Z justme1968 $
# $Id: 10_MAX.pm 5446 2014-04-05 12:17:00Z mgehre $
# $Id: 73_PRESENCE.pm 5434 2014-04-04 15:43:23Z markusbloch $
# $Id: 99_SUNRISE_EL.pm 5851 2014-05-13 19:39:03Z rudolfkoenig $
# $Id: 98_SVG.pm 5956 2014-05-24 13:04:04Z rudolfkoenig $
# $Id: 59_Twilight.pm 6136 2014-06-18 19:08:58Z dietmar63 $
# $Id: 99_Utils.pm 5488 2014-04-08 11:32:17Z rudolfkoenig $
# $Id: 59_Weather.pm 6112 2014-06-14 17:41:36Z borisneubert $
# $Id: 99_XmlList.pm 1840 2012-09-12 13:52:08Z rudolfkoenig $
# $Id: 90_at.pm 5319 2014-03-25 10:11:47Z rudolfkoenig $
# $Id: 98_autocreate.pm 5268 2014-03-20 20:46:00Z rudolfkoenig $
# $Id: 98_cmdalias.pm 5818 2014-05-11 14:15:07Z rudolfkoenig $
# $Id: 98_dewpoint.pm 5099 2014-03-02 16:29:34Z betateilchen $
# $Id: 98_dummy.pm 4934 2014-02-15 08:23:12Z rudolfkoenig $
# $Id: 91_notify.pm 6081 2014-06-07 16:31:18Z rudolfkoenig $
# $Id: 98_structure.pm 5050 2014-02-26 08:29:44Z rudolfkoenig $
# $Id: 98_telnet.pm 4844 2014-02-08 07:54:03Z rudolfkoenig $
./FHEM/95_webViewControl.pm: No such file or directory
# $Id: 98_weblink.pm 5608 2014-04-23 10:57:16Z rudolfkoenig $


Dann stimmt bei dir etwas nicht.

Das Modul heißt "98_IF.pm" und hat die Version-Id # $Id: 98_IF.pm 5813 2014-05-10 18:03:59Z damian-s $

Gruß

Damian

Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Brockmann am 24 Juni 2014, 23:33:31
Zitat von: Damian am 24 Juni 2014, 20:47:05
Dann stimmt bei dir etwas nicht.
Das Modul heißt "98_IF.pm" und hat die Version-Id # $Id: 98_IF.pm 5813 2014-05-10 18:03:59Z damian-s $
Hmm, nur was?
Also eine Datei 98_IF.pm habe ich im Verzeichnis /opt/fhem/FHEM (da wo auch die anderen derartigen Dateien sind). Dateieigenschaften (Besitzer, Zugriffsrechte) sind genau wie bei den "Nachbardateien".
Wenn ich die Datei öffnen, beginnt sie mit der angegebenen ID:
##############################################
# $Id: 98_IF.pm 5813 2014-05-10 18:03:59Z damian-s $
package main;

Wenn ich mal grob durchschaue, scheint sie auch fehlerfrei und vollständig zu sein.

Ich habe nochmal ein update force und anschließenden Neustart gemacht, aber das hat auch keine Änderung gebracht.
Was kann ich noch tun, um dem Problem auf die Spur zu kommen?
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 24 Juni 2014, 23:44:46
Zitat von: Brockmann am 24 Juni 2014, 23:33:31
Hmm, nur was?
Also eine Datei 98_IF.pm habe ich im Verzeichnis /opt/fhem/FHEM (da wo auch die anderen derartigen Dateien sind). Dateieigenschaften (Besitzer, Zugriffsrechte) sind genau wie bei den "Nachbardateien".
Wenn ich die Datei öffnen, beginnt sie mit der angegebenen ID:
##############################################
# $Id: 98_IF.pm 5813 2014-05-10 18:03:59Z damian-s $
package main;

Wenn ich mal grob durchschaue, scheint sie auch fehlerfrei und vollständig zu sein.

Ich habe nochmal ein update force und anschließenden Neustart gemacht, aber das hat auch keine Änderung gebracht.
Was kann ich noch tun, um dem Problem auf die Spur zu kommen?

Keine Ahnung. Damit es funktioniert muss am Bildschirm diese Meldung kommen:

Usage: IF (<condition>) (<FHEM commands>) ELSE (<FHEM commands>)

wenn du in der Kommandozeile nur das Wort IF eingibst und mit Enter bestätigst.

Was passiert, wenn du in der Kommanzeile "reload 98_IF.pm" eingibst?

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Brockmann am 24 Juni 2014, 23:46:47
Zitat von: Damian am 24 Juni 2014, 23:44:46
Was passiert, wenn du in der Kommanzeile "reload 98_IF.pm" eingibst?
Dann wird einfach die Startseite von FHEM angezeigt, keine Fehler- oder sonstige Meldung.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 24 Juni 2014, 23:50:20
Zitat von: Brockmann am 24 Juni 2014, 23:46:47
Dann wird einfach die Startseite von FHEM angezeigt, keine Fehler- oder sonstige Meldung.

Dann weiß ich auch nicht weiter. Du bist der erste, bei dem sich die Sache so verhält.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Brockmann am 24 Juni 2014, 23:53:40
Zitat von: Damian am 24 Juni 2014, 23:50:20
Dann weiß ich auch nicht weiter. Du bist der erste, bei dem sich die Sache so verhält.
Ich habe inzwischen eine etwas schräge Theorie, warum das so ist. Kann ich aber erst morgen testen, weil das etwas komplexer wird. Dafür ist es mir heute zu spät.
Ich melde mich wieder, wenn es was neues gibt.
Auf alle Fälle vielen Dank für Deine Hilfe.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 24 Juni 2014, 23:53:55
wenn ich bei mir "help" in der Kommadozeile aufrufe, dann wird u. a. auch IF angezeigt:

Command   Parameter                 Description
-----------------------------------------------
?                                   get this help
IF        (<condition>) (<FHEM commands>) ELSE (<FHEM commands>)  executes FHEM commands depending on the condition
addstruct <structure> <devspec>     add <devspec> to <structure>
attr      <devspec> <attrname> [<attrval>] set attribute for <devspec>
createlog <device>                  create log/weblink for <device>
define    <name> <type> <options>   define a device/at/notify entity
delete    <devspec>                 delete the corresponding definition(s)
deleteattr <devspec> [<attrname>]    delete attribute for <devspec>
deletereading <devspec> [<attrname>]    delete user defined reading for <devspec>
delstruct <structure> <devspec>     delete <devspec> from <structure>
displayattr <devspec> [attrname]      display attributes
get       <devspec> <type dependent> request data from <devspec>
help                                get this help
include   <filename>                read the commands from <filenname>
iowrite   <iodev> <data>            write raw data with iodev
list      [devspec]                 list definitions and status info
modify    device <options>          modify the definition (e.g. at, notify)
reload    <module-name>             reload the given module (e.g. 99_PRIV)
rename    <old> <new>               rename a definition
rereadcfg [configfile]              read in the config after deleting everything
save      [configfile]              write the configfile and the statefile
set       <devspec> <type dependent> transmit code for <devspec>
setdefaultattr <attrname> <attrvalue>    set attr for following definitions
setreading <devspec> <reading> <value> set reading for <devspec>
setstate  <devspec> <state>         set the state shown in the command list
shutdown  [restart]                 terminate the server
sleep     <sec> [quiet]             sleep for sec, 3 decimal places
trigger   <devspec> <state>         trigger notify command
update    [development|stable] [<file>|check|fhem] update Fhem
usb       [scan|create]             display or create fhem-entries for USB devices
version   [filter]                  print SVN version of loaded modules
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Brockmann am 24 Juni 2014, 23:56:25
Zitat von: Damian am 24 Juni 2014, 23:53:55
wenn ich bei mir "help" in der Kommadozeile aufrufe, dann wird u. a. auch IF angezeigt:
Ja, bei mir auch. Da liegt was anderes im Argen.
Wenn meine Theorie stimmt, hat das mit Deinem Modul auch gar nichts zu tun.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 24 Juni 2014, 23:58:41
Zitat von: Brockmann am 24 Juni 2014, 23:56:25
Ja, bei mir auch. Da liegt was anderes im Argen.
Wenn meine Theorie stimmt, hat das mit Deinem Modul auch gar nichts zu tun.

Das vermute ich auch mal.

Nur mal am Rande, schaue dir DOIF mal an, damit kannst du vieles noch einfacher machen und brauchst wahrscheinlich auch kein IF.

Gruß

Damian

Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: rudolfkoenig am 25 Juni 2014, 16:00:19
Der Richtige liest mit.

cmdalias traegt beim definieren ifset in die Befehlsliste ein, und falls ein Befehl nicht gefunden wird, dann wird zuerst nach moeglichen Abkuerzungen gesucht, und erst danach werden Module mit passenden Namen nachgeladen. In diesem Fall waere das andersherum korrekter. Um das Problem zu loesen muss man entweder das cmdalias umbenennen (einfacher), oder vor dem definieren ein IF ausfuehren.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Brockmann am 25 Juni 2014, 16:09:56
Zitat von: rudolfkoenig am 25 Juni 2014, 16:00:19
In diesem Fall waere das andersherum korrekter.
In welchem Fall wäre es andersherum denn nicht korrekt?
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: satprofi am 29 Juni 2014, 19:27:10
hallo @all.

Habe ein kleines notify um klima zu schalten, weiss aber nicht, aus mangel an richtiger states ob es klappen wird.
ich will einen schalter ansteuern wenn genug leistung vorhanden u. die aussentemperatur hoch genug ist.


define Klima_WZ_off notify Pac IF ([Pac:state] < 1500) (IF ([Forecast:temp_c] < 23) (set Klima_WZ on-for-timer 660))


wird hier beides ausgewertet oder nur Pac ?
möchte das ganze noch mit Türkontakt koppeln, wenn open dann ebenfalls ansteuern des schalters
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 29 Juni 2014, 20:08:47
Zitat von: satprofi am 29 Juni 2014, 19:27:10
hallo @all.

Habe ein kleines notify um klima zu schalten, weiss aber nicht, aus mangel an richtiger states ob es klappen wird.
ich will einen schalter ansteuern wenn genug leistung vorhanden u. die aussentemperatur hoch genug ist.


define Klima_WZ_off notify Pac IF ([Pac:state] < 1500) (IF ([Forecast:temp_c] < 23) (set Klima_WZ on-for-timer 660))


wird hier beides ausgewertet oder nur Pac?
möchte das ganze noch mit Türkontakt koppeln, wenn open dann ebenfalls ansteuern des schalters

Es wird beides ausgewertet, allerdings ist bei dir der Trigger nur Pac und nicht Forecast. Das kannst du auch mit einem IF definieren:


define Klima_WZ_off notify Pac IF ([Pac:state] < 1500 and [Forecast:temp_c] < 23) (set Klima_WZ on-for-timer 660)


Zu bedenken ist, dass "set Klima_WZ on-for-timer 660" immer wieder aufgerufen wird, wenn die Bedingung stimmt.


Gruß

Damian

Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Puschel74 am 29 Juni 2014, 20:14:17
Hallo,

hier
define Klima_WZ_off notify Pac IF ([Pac:state] < 1500 and [Forecast:temp_c] < 23) (set Klima_WZ on-for-timer 660)
ist der trigger auch nur PAC und nicht Forecast.

Sollte das nicht so
define Klima_WZ_off notify (Pac|Forecast) IF ([Pac:state] < 1500 and [Forecast:temp_c] < 23) (set Klima_WZ on-for-timer 660)
sein?
Wobei man das noch auf
define Klima_WZ_off notify (Pac|Forecast):(state|temp_c) IF ([Pac:state] < 1500 and [Forecast:temp_c] < 23) (set Klima_WZ on-for-timer 660)
einschränken sollte so man auf state überhaupt triggern kann - ich hab das noch nier versucht.

Grüße
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 29 Juni 2014, 20:53:07
Zitat von: Puschel74 am 29 Juni 2014, 20:14:17
define Klima_WZ_off notify (Pac|Forecast):(state|temp_c) IF ([Pac:state] < 1500 and [Forecast:temp_c] < 23) (set Klima_WZ on-for-timer 660)
einschränken sollte so man auf state überhaupt triggern kann - ich hab das noch nier versucht.

Wird so wohl nicht funktionieren.

Schau dir  DOIF mal an, da brauchst du dir um solche "Feinheiten" keine Gedanken machen:

define Klima_WZ_off DOIF ([Pac:state] < 1500 and [Forecast:temp_c] < 23) (set Klima_WZ on-for-timer 660)

Hier wird immer richtig getrigger und "set Klima_WZ on-for-timer 660" nur einmal nach Zustandswechsel aufgeführt.

Gruß

Damian

Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Puschel74 am 29 Juni 2014, 21:10:53
Hallo,

das scheint die Feinheit an DOIF zu sein.

Sorry aber ich werde weiterhin mit if arbeiten und alle mit IF oder DOIF zu dir schicken.
Mich hat nur das regexp gewundert - aber wenn das so klappt ist es ja wunderbar.

Grüße

P.S.: Ich will damit absolut NICHT deine Arbeit oder dein Engagement schmälern.
Vor deiner Leistung kann auch ich nur meinen Hut ziehen und sagen - Toll was du leistest.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 29 Juni 2014, 21:14:26
Zitat von: Puschel74 am 29 Juni 2014, 21:10:53
Hallo,

das scheint die Feinheit an DOIF zu sein.

Sorry aber ich werde weiterhin mit if arbeiten und alle mit IF oder DOIF zu dir schicken.
Mich hat nur das regexp gewundert - aber wenn das so klappt ist es ja wunderbar.

Grüße

P.S.: Ich will damit absolut NICHT deine Arbeit oder dein Engagement schmälern.
Vor deiner Leistung kann auch ich nur meinen Hut ziehen und sagen - Toll was du leistest.

Der Tipp war eher an @satprofi gerichtet, der hier die ursprüngliche Frage stellte. Jeder soll natürlich das nutzen, womit er am besten klar kommt :)

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: satprofi am 30 Juni 2014, 08:42:29
Zitat von: Damian am 29 Juni 2014, 20:53:07
Wird so wohl nicht funktionieren.

Schau dir  DOIF mal an, da brauchst du dir um solche "Feinheiten" keine Gedanken machen:

define Klima_WZ_off DOIF ([Pac:state] < 1500 and [Forecast:temp_c] < 23) (set Klima_WZ on-for-timer 660)

Hier wird immer richtig getrigger und "set Klima_WZ on-for-timer 660" nur einmal nach Zustandswechsel aufgeführt.

Gruß

Damian

hallo.
verstehe ich das richtig das bei zustandsänderung eines der beiden werte der timer anschaltet? oder doch nur wenn beide werte passen?
ich benötige den timer eigentlich, damit die klima nicht immer ein/ausschaltet sollte Pac auf/ab wandern. so ist die klima wenigstens für den timer lang "geschützt". solange der actor "on" ist ist die klima "off" ! habe das sicherheitshalber eingebaut, falls fhem ausfällt und klima aber laufen soll.

werd mir DOIF ansehen.
gruss

[edit]

mit DOIF müsste das ganze so aussehen?


define Klima_WZ_off DOIF ([Pac:state] < 1500 and [Forecast:temp_c] < 23) (set actor on) DOELSE (set actor off)
attr Klima_WZ_off wait 660


sinn des ganzen: wenn Pac kleiner als 1500W u. Aussentemp kleiner als 23° schalte den actor für 11 Minuten, wenn nicht setze actor auf off.

gruss
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Brockmann am 30 Juni 2014, 08:58:46
Zitat von: satprofi am 30 Juni 2014, 08:42:29
verstehe ich das richtig das bei zustandsänderung eines der beiden werte der timer anschaltet? oder doch nur wenn beide werte passen?
DOIF prüft bei jeder Zustandsänderung eines der beiden Werte, ob nun (nach der Änderung) BEIDE Werte die Bedingung erfüllen und schaltet (nur) dann. Deshalb das "and" und kein "or".
Andernfalls geht es einfach so weiter, bis sich wieder einer der beiden Werte ändert.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 30 Juni 2014, 09:12:30
Zitat von: satprofi am 30 Juni 2014, 08:42:29
hallo.
verstehe ich das richtig das bei zustandsänderung eines der beiden werte der timer anschaltet? oder doch nur wenn beide werte passen?
ich benötige den timer eigentlich, damit die klima nicht immer ein/ausschaltet sollte Pac auf/ab wandern. so ist die klima wenigstens für den timer lang "geschützt". solange der actor "on" ist ist die klima "off" ! habe das sicherheitshalber eingebaut, falls fhem ausfällt und klima aber laufen soll.

werd mir DOIF ansehen.
gruss

Also eine if-Abfrage, welcher Art auch immer, hat immer zwei Zustände: wahr bzw. falsch. Falsch ist der else-Fall, den du hier nicht definiert hast.

Die Abfrage oben bedeutet, dass "set Klima_WZ on-for-timer 660" zunächst einmalig geschaltet wird, wenn die Bedingung wahr wird. Wenn die Bedingung falsch wird, wird bei dir nichts passieren, weil du keinen else-Fall definiert hast. Dennoch wird der Zustand im DOIF-Modul festgehalten. Wenn danach irgendwann wieder die Bedingung wahr sein wird (Zustandswechsel) wird wieder  "set Klima_WZ on-for-timer 660" ausgeführt.

Möchtest du dagegen jedes Mal, wenn ein Event (Pac oder Forecast) eintrifft und die Bedingung Wahr ist "set Klima_WZ on-for-timer 660" ausführen (dass würde deinem ursprünglichen notify-Konstrukt entsprechen), dann muss du beim DOIF-Modul das Attribut "do always" setzen.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: satprofi am 30 Juni 2014, 09:21:30
Zitat von: Damian am 30 Juni 2014, 09:12:30


Möchtest du dagegen jedes Mal, wenn ein Event (Pac oder Forecast) eintrifft und die Bedingung Wahr ist "set Klima_WZ on-for-timer 660" ausführen (dass würde deinem ursprünglichen notify-Konstrukt entsprechen), dann muss du beim DOIF-Modul das Attribut "do always" setzen.

Gruß

Damian

also dann so ? :


define Klima_WZ_off DOIF ([Pac:state] < 1500 and [Forecast:temp_c] < 23) (set actor on) DOELSE (set actor off)
attr Klima_WZ_off do always
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 30 Juni 2014, 09:30:13
Zitat von: satprofi am 30 Juni 2014, 09:21:30
also dann so ? :


define Klima_WZ_off DOIF ([Pac:state] < 1500 and [Forecast:temp_c] < 23) (set actor on) DOELSE (set actor off)
attr Klima_WZ_off do always


In diesem Fall, macht das do always Attribut eher wenig Sinn, denn es würde jedes mal, wenn Pac bzw. Forecast ein Event auslöst und die Bedingung wahr ist "set actor on" ausführten und das willst du wahrscheinlich nicht. Hier ist also besser ohne do always zu arbeiten, dann wird nur einmal "set actor on" und nur einmal "set actor off" ausgeführt und zwar immer dann, wenn die Bedingung von wahr auf falsch bzw. von falsch auf wahr wechselt.

Gruß

Damian

Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: satprofi am 30 Juni 2014, 10:25:57
das möchte ich ja eigentlich verhindern, soll nur schalten wenn erst einer der beiden werte mind ~11min. ansteht.
wenn danach 1min. später die bedingung zutrifft soll er wieder "off" schalten. also dann doch mit
attr Klima_WZ_off wait 660 zusätzlich.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 30 Juni 2014, 11:04:48
Zitat von: satprofi am 30 Juni 2014, 10:25:57
das möchte ich ja eigentlich verhindern, soll nur schalten wenn erst einer der beiden werte mind ~11min. ansteht.
wenn danach 1min. später die bedingung zutrifft soll er wieder "off" schalten. also dann doch mit
attr Klima_WZ_off wait 660 zusätzlich.

ja, dann mit: attr Klima_WZ_off wait 660:60

und ohne attr Klima_WZ_off do always

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: satprofi am 30 Juni 2014, 11:18:25
danke, schon erstellt.
habe im DOIF Thread weitergemacht.

gruss
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Simon74 am 29 Juli 2014, 21:46:42
Kleine Anfängerfrage.
Möchte im notify ein fhem Befehl der immer ausgeführt werden soll(Zeile1) und eine IF Abfrage(Zeile2):
Wie muss ich das trennen bzw. richtig setzen ?
notify DEF:
t5.sz.ws1:off set t5.sz.di1_Sw 0 2
if (([t5.wz.sd1_Sw:state]) eq "off" and ([t5.bo.sd2_Sw:state]) eq "off") (set group=Licht off)
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 29 Juli 2014, 21:54:38
Zitat von: Simon74 am 29 Juli 2014, 21:46:42
Kleine Anfängerfrage.
Möchte im notify ein fhem Befehl der immer ausgeführt werden soll(Zeile1) und eine IF Abfrage(Zeile2):
Wie muss ich das trennen bzw. richtig setzen ?
notify DEF:
t5.sz.ws1:off set t5.sz.di1_Sw 0 2;;IF (([t5.wz.sd1_Sw:state]) eq "off" and ([t5.bo.sd2_Sw:state]) eq "off") (set group=Licht off)

In der Kommandozeile zwei Semikolons, im DEF-Editor nur ein Semikolon dazwischen setzen.


Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Simon74 am 29 Juli 2014, 21:56:37
Schon 100x gesehen aber...
Vielen Dank für das IF und DOIF Modul !
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Invers am 06 August 2014, 13:59:39
Warum wird die Nachricht nicht verschickt?

define atSchlossUncertain at +*00:00:10 IF ([Tuerkontakt] eq "closed" and ([Schloss] eq "locked (uncertain)" or [Schloss] eq "NACK"))(set Schloss unlock;; { PushBulletText('Türstatus nicht sicher erkennbar') })

Wenn ich folgendes eingebe (Direkteingabezeile) , dann funktioniiert es. Schloss geht auf und Nachricht kommt.
set Schloss unlock; { PushBulletText('Türstatus nicht sicher erkennbar') }
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: scooty am 06 August 2014, 15:30:09
Ich würde

define atSchlossUncertain at +*00:00:10 IF ([Tuerkontakt] eq "closed" and ([Schloss] eq "locked (uncertain)" or [Schloss] eq "NACK"))(set Schloss unlock,{PushBulletText('Türstatus nicht sicher erkennbar') })

(Komma statt zwei Semikolon) versuchen.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Alex_E am 06 August 2014, 18:10:42
Hallo zusammen,

ich versuche gerade einen Homestatus zu entwickeln welcher mir mitteilt, ob meine Türen alle geschlossen sind. Leider aktualisiert sich der dafür angelegt Dummy aber nicht.

Folgendermaßen sehen die Eingaben aus:

define Homestatus dummy

define test notify Homestatus

IF ([Tuere_A] eq "closed" and [Tuere_B] eq "closed" and [Tuere_K] eq "closed") (set Homestatus off) ELSE(set Homestatus on) ELSE(set Homestatus on)

Wäre für Tips dankbar
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: der-Lolo am 06 August 2014, 18:48:26
das define test musst du ändern...

define test notify Tuere.* IF ...

Du möchtest ja schliesslich auf die Türen reagieren und den homestatus dummy damit füttern...

Es kann auch nur ein ELSE geben...
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Invers am 06 August 2014, 19:21:21
Zitat von: scooty am 06 August 2014, 15:30:09
Ich würde

define atSchlossUncertain at +*00:00:10 IF ([Tuerkontakt] eq "closed" and ([Schloss] eq "locked (uncertain)" or [Schloss] eq "NACK"))(set Schloss unlock,{PushBulletText('Türstatus nicht sicher erkennbar') })

(Komma statt zwei Semikolon) versuchen.

Danke, funktioniert. Hatte schon alles probiert, aber auf Komma kam ich einfach nicht. :-(
Ich Trottel.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Alex_E am 06 August 2014, 22:24:47
@ der Lolo

Vielen Dank, hat geklappt..
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Simon74 am 18 August 2014, 18:47:25
Ich versuche gerade diesen notify.

t5.fl.bm:motion
IF ([Personen] eq "absent") ((define at.mailalarm at +00:01 IF ([Personen] eq "absent") ({DebianMail('mail@@adr.net', 'FHEM Alarm !', 'Bewegung ohne anwesende Person !')}))
)


Im erstelleten AT Job steht dann:
IF (absent eq "absent") usw.....

Wie kann ich [ und ] escapen ?
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 19 August 2014, 20:48:30
Lösung gibt es über ReadingsVal ... siehe hier:

http://forum.fhem.de/index.php/topic,26090.msg191086.html#msg191086

werde es noch beim IF-Befehl einbauen, dass diese Art von Schachtelung auch funktioniert.

Wie ich heute so ein Problem lösen würde, kannst du dir aber bestimmt schon denken.  ;)

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Simon74 am 19 August 2014, 21:28:08
Vielen Dank.

Ich vermute mal DOIF  :)
Ich habe meinen "Bewegungsmelder (Bluetooth) Abwesenheitsalarm " nun so gelöst, endlich wie gewünscht mit 1 Minute Verzögerung.

DEF:
t5.fl.bm:motion
IF ([Personen] eq "absent" and (Value("at.mailalarm") eq ""))
((define at.mailalarm at +00:01 IF (ReadingsVal("Personen","state","") eq "absent") (set MyTTS tts Achtung. Alarm wird ausgelöst.,{DebianMail('mail@@adr.net', 'FHEM Alarm !', 'Bewegung ohne anwesende Person !')})))
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 19 August 2014, 21:36:02
Zitat von: Simon74 am 19 August 2014, 21:28:08
Vielen Dank.

Ich vermute mal DOIF  :)
Ich habe meinen "Bewegungsmelder (Bluetooth) Abwesenheitsalarm " nun so gelöst, endlich wie gewünscht mit 1 Minute Verzögerung.

DEF:
t5.fl.bm:motion
IF ([Personen] eq "absent" and (Value("at.mailalarm") eq ""))
((define at.mailalarm at +00:01 IF (ReadingsVal("Personen","state","") eq "absent") (set MyTTS tts Achtung. Alarm wird ausgelöst.,{DebianMail('mail@@adr.net', 'FHEM Alarm !', 'Bewegung ohne anwesende Person !')})))


ja, oder so:

define di_motion DOIF ([t5.fl.bm] and [Personen] eq "absent") (set MyTTS tts Achtung. Alarm wird ausgelöst.,{DebianMail('mail@@adr.net', 'FHEM Alarm !', 'Bewegung ohne anwesende Person !')})
attr di_motion wait 60


ohne notify, at und IF  :)

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Tommy82 am 21 Oktober 2014, 21:51:43
Hi,
ich versuche eine Alarmanlage zu realisieren, und habe dazu folgende IF Anweisung versucht, die allerdings untenstehende Fehler liefert wo ich keine Lösung zu finden kann.
Die Alarmanlage soll zu festen Zeiten (*20:35:00 on) an und aus (*20:43:00 off) geschaltet werden, dazu gibts einen Dummy (Alarmanlage_Wohnzimmer)der den Status annimmt. Dieser Dummy hat aber auch die webcmd on:off:auto, worüber ich denn Dummy z.b. für Urlaubsphasen immer on setzen will, oder halt immer Off setzen will, so das dann nicht die festen Zeiten greifen. Wenn der Dummy auf Auto steht sollen die festen Zeiten greifen.

Hatte mir dazu mal das angesehen http://fhem.de/commandref_DE.html#IF und dann das versucht:

alarmOn sieht jetzt so aus:
define alarmOn at *20:35:00 IF ([Alarmanlage_Wohnzimmer] "On","Auto") ( IF ([TuerFensterWohnzimmer] eq "AllesZu")  (set Alarmanlage_Wohnzimmer on) ELSE ( { FB_mail('xyz@googlemail.com','FHEM Fenster Offen','Alarm kann nicht aktiviert werden, Fenster oder Tuer noch offen' ) ) } )

Denn Dummy habe ich dann um 20:33 auf off gesetzt, so das ich erwartet hatte das die Alarmanlage nicht On geshaltet wird und ich die Email bekomme das nochwas offen ist.

Bekomme dann im Log diesen Fehler:(bzw. das ist der einzige der noch übrig geblieben ist, den rest hab ichgelöst)
alarmOn: IF: right bracket without left bracket: } Wenn ich das richtig verstehe soll eine { fehlen, aber wo? Es gibt ja vor und nach der Email eine, so das die Klammern geschlossen sind {}

alarmoff sieht jetzt so aus:
define alarmOff at *20:43:00 IF ([Alarmanlage_Wohnzimmer] "Off","Auto") (set Alarmanlage_Wohnzimmer off) ELSE (set Alarmanlage_Wohnzimmer on)


Hab die Alaramanlage dann um 20:38 auf on gesetzt, so das sie nicht off gehen sollte, allerdings bekomme ich auch dort einen Fehler:
alarmOff: syntax error at (eval 3890) line 1, near ") "Off""
Klammern sind doch alle gesetzt oder?

Was habe ich falsch angepasst, bzw. übersehen?

Danke
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 21 Oktober 2014, 22:49:06
Die Reihfolge der Klammern passt nicht und die Abfrage ist falsch, richtig wäre

define alarmOn at *20:35:00 IF ([Alarmanlage_Wohnzimmer] eq "On" or [Alarmanlage_Wohnzimmer] eq "Auto")
(  IF ([TuerFensterWohnzimmer] eq "AllesZu")
     (set Alarmanlage_Wohnzimmer on)
   ELSE
     ({FB_mail('xyz@googlemail.com','FHEM Fenster Offen','Alarm kann nicht aktiviert werden, Fenster oder Tuer noch offen' )})
)

Mit Einrückungen, kann man Klammerebenen besser erkennen.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Tommy82 am 23 Oktober 2014, 18:47:57
Hallo Damian,
habs jetzt so wie von dir gezeigt geändert und das alarmOff so gesetzt:
define alarmOff at *18:45:00 IF ([Alarmanlage_Wohnzimmer] eq "Off" or [Alarmanlage_Wohnzimmer] eq "Auto")
     (set Alarmanlage_Wohnzimmer off)
   ELSE
     (set Alarmanlage_Wohnzimmer on)


Es gibt keine Fehler mehr im Log und es scheint alles zu funktionieren.

Danke für deine Hilfe


EDIT:
Es scheint doch noch einen Fehler in meinem alarmOff zu geben.
Wenn ich den Alarm auf Auto stelle, dann geht der Alarm auch zu den gesetzten Zeiten auf On, allerdings geht er dann nicht zu den gesetzten Zeiten auf Off.

Was ist noch falsch am Code?7

Danke

MFG
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 23 Oktober 2014, 21:47:34
Zitat von: Tommy82 am 23 Oktober 2014, 18:47:57
Hallo Damian,
habs jetzt so wie von dir gezeigt geändert und das alarmOff so gesetzt:
define alarmOff at *18:45:00 IF ([Alarmanlage_Wohnzimmer] eq "Off" or [Alarmanlage_Wohnzimmer] eq "Auto")
     (set Alarmanlage_Wohnzimmer off)
   ELSE
     (set Alarmanlage_Wohnzimmer on)


Es gibt keine Fehler mehr im Log und es scheint alles zu funktionieren.

Danke für deine Hilfe


EDIT:
Es scheint doch noch einen Fehler in meinem alarmOff zu geben.
Wenn ich den Alarm auf Auto stelle, dann geht der Alarm auch zu den gesetzten Zeiten auf On, allerdings geht er dann nicht zu den gesetzten Zeiten auf Off.

Was ist noch falsch am Code?7

Danke

MFG

Dein definierter Code ist so nicht gerade sinnvoll: Es steht da, wenn Alarmanlage_Wohnzimmer gleich "off", dann diese auf "off" setzen.
Ebenso steht da bei "Auto" soll sie auf "off" gehen. Damit kann sie bei "Auto" niemals auf "on" gehen.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Puschel74 am 24 Oktober 2014, 07:23:40
Hallo,

auch macht es für FHEM einen Unterschied ob ich etwas off schalte und dann auf Off prüfe.

Grüße
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Tommy82 am 24 Oktober 2014, 07:34:48

Zitat von: Damian am 23 Oktober 2014, 21:47:34
Dein definierter Code ist so nicht gerade sinnvoll: Es steht da, wenn Alarmanlage_Wohnzimmer gleich "off", dann diese auf "off" setzen.
Ebenso steht da bei "Auto" soll sie auf "off" gehen. Damit kann sie bei "Auto" niemals auf "on" gehen.

Gruß

Damian

Ok das heißt ja dann das es noch einen größeren Fehler gibt, denn die Anlage soll ja  wenn sie auf Auto steht( Normalfall) zu den definierten Zeiten On und Off gehen, was ja nur durch die manuelle Schalter Stellung auf on bzw. Off änderbar sein soll und dann auch Bestand haben soll., bis ich sie wieder auf Auto Stelle.
Da muss ich wohl noch was basteln......
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Puschel74 am 24 Oktober 2014, 07:42:44
Moin,

@tommy
Poste doch mal Alarmon und Alarmoff hier schön untereinander in einen Beitrag so wie du sie jetzt bei dir hast.

Grüße
Titel: neuer FHEM-Befehl IF
Beitrag von: Tommy82 am 24 Oktober 2014, 08:19:18
Moin, bin leider jetzt auf der Arbeit und komme nur per Handy an fhem, das list von Alarm in sieht so aus
Internals:
   DEF        *19:45:00 IF ([Alarmanlage_Wohnzimmer] eq "On" or [Alarmanlage_Wohnzimmer] eq "Auto")  (  IF ([TuerFensterWohnzimmer] eq "AllesZu")       (set Alarmanlage_Wohnzimmer on)     ELSE       ({FB_mail('Xyz@googlemail.com','FHEM Fenster Offen','Alarm kann nicht aktiviert werden, Fenster oder Tuer noch offen' )}) )
   NAME       alarmOn
   NR         167
   REP        -1
   STATE      Next: 19:45:00
   TRIGGERTIME 1414172700
   TRIGGERTIME_FMT 2014-10-24 19:45:00
   TYPE       at
Attributes:

Das list von AlarmOff so
Internals:
   DEF        *19:55:00 IF ([Alarmanlage_Wohnzimmer] eq "Off" or [Alarmanlage_Wohnzimmer] eq "Auto")       (set Alarmanlage_Wohnzimmer off)     ELSE       (set Alarmanlage_Wohnzimmer on)
   NAME       alarmOff
   NR         172
   REP        -1
   STATE      Next: 19:55:00
   TRIGGERTIME 1414173300
   TRIGGERTIME_FMT 2014-10-24 19:55:00
   TYPE       at
Attributes:


Und die beiden Codes mit denen ich die Befehle gesetzt habe sehen so aus:

ZitatalarmOn
define alarmOn at *19:45:00 IF ([Alarmanlage_Wohnzimmer] eq "On" or [Alarmanlage_Wohnzimmer] eq "Auto")
(  IF ([TuerFensterWohnzimmer] eq "AllesZu")
     (set Alarmanlage_Wohnzimmer on)
   ELSE
     ({FB_mail('Xyz@googlemail.com','FHEM Fenster Offen','Alarm kann nicht aktiviert werden, Fenster oder Tuer noch offen' )})
)


ZitatalarmOff
define alarmOff at *19:55:00 IF ([Alarmanlage_Wohnzimmer] eq "Off" or [Alarmanlage_Wohnzimmer] eq "Auto")
     (set Alarmanlage_Wohnzimmer off)
   ELSE
     (set Alarmanlage_Wohnzimmer on)
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Puschel74 am 24 Oktober 2014, 08:48:41
Hallo,

das hatte ich befürchtet  8)
Ich hab doch vorhin geschrieben das es für FHEM durchaus einen Unterschied macht ob ich etwas on schalte und dann aber auf On prüfe.
Das nennt sich case-sensitiv  ;)

Grüße

edith: Aber ich seh schon deine nächste Frage - was ist jetzt noch falsch  :P
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Tommy82 am 24 Oktober 2014, 09:21:41
Hi, ok das case-sensitiv was du oben schon meintest hatte ich falsch verstanden, hatte verstanden das auf off schalten keinen Sinn macht es dann auf off zu prüfen...

Werd das Heut Abend mal anpassen.

Und dann mal überlegen wie die Abfrage mehr Sinn macht bzw. funktioniert, damit ich die Baustelle mal schließen kann
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Puschel74 am 24 Oktober 2014, 09:26:16
Hallo,

Zitathatte verstanden das auf off schalten keinen Sinn macht es dann auf off zu prüfen
Das habe ich auch nicht geschrieben.

Zitat von: Puschel74 am 24 Oktober 2014, 07:23:40
Hallo,
auch macht es für FHEM einen Unterschied ob ich etwas off schalte und dann auf Off prüfe.
Grüße
Ich hatte es extra für dich noch dick markiert in der Hoffnung es springt dir ins Auge  ::)
Aber da habe ich wohl zu viel erhofft  :P
Nächstesmal bekommst du Schriftgröße 36

Grüße

Edith: @Damian - ich hoffe mal das IF auch case-sensitiv ist  ???
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 24 Oktober 2014, 11:55:59
Zitat von: Puschel74 am 24 Oktober 2014, 09:26:16

Edith: @Damian - ich hoffe mal das IF auch case-sensitiv ist  ???

IF ist nichts anderes als ein Aufruf von perl-if, also kontextsensitiv, d. h.  "off" ist nicht das Gleiche wie "Off"

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Tommy82 am 24 Oktober 2014, 12:36:20
So,
hab mal meine Pause genutzt, hoffe das ich jetzt das case-sensitiv komplett berücksichtigt habe:-) , konnte es leider noch nicht testen.

define alarmOn at *19:45:00 IF ([Alarmanlage_Wohnzimmer] eq "on" or [Alarmanlage_Wohnzimmer] eq "Auto")
(  IF ([TuerFensterWohnzimmer] eq "AllesZu")
     (set Alarmanlage_Wohnzimmer on)
   ELSE
     ({FB_mail('Th.Halberstadt@googlemail.com','FHEM Fenster Offen','Alarm kann nicht aktiviert werden, Fenster oder Tuer noch offen' )})
)


define alarmOff at *19:55:00 IF ([Alarmanlage_Wohnzimmer] eq "off" or [Alarmanlage_Wohnzimmer] eq "Auto")
     (set Alarmanlage_Wohnzimmer off)
   ELSE
     (set Alarmanlage_Wohnzimmer on)


Allerdings bin ich mir bei der logik immer noch sehr unsicher............. Die Alarmanlage soll ja im "normal" zustand immer auf Auto stehn und zu den definierten Zeiten on bzw. off gehen. Wenn ich dann den Button on bzw. off betätige soll dieser Status solange gesetzt bleiben bis ich ihn wieder auf Auto stelle.

Brauch ich im alarmOff das hier berhaupt?
Zitat(set Alarmanlage_Wohnzimmer off)
   ELSE
     (set Alarmanlage_Wohnzimmer on)[/code]

Wie gesagt konnte es noch nicht testen, werd es heute abend nachholen.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Puschel74 am 24 Oktober 2014, 12:49:04
Hallo,

ZitatDie Alarmanlage soll ja im "normal" zustand immer auf Auto stehn
Und in welchem Codeteil wird sie auf Auto geschalten  ???

Ich seh überall nur ein set Alarmanlage_Wohnzimmer on und set  Alarmanlage_Wohnzimmer off
aber nirgends ein set Alarmanlage_Wohnzimmer Auto

Denkst du nicht du solltest dir heute abend besser nochmal in Ruhe das Einsteiger.pdf durchlesen?
Und das war jetzt weder böse noch sarkastisch gemeint sondern nur ein gut gemeinter Tipp.

Grüße
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Tommy82 am 24 Oktober 2014, 17:25:01
Hallo Puschel,
hab mir deinen Vorschlag zu herzen genommen, und mir grade nochmal das Einsteiger Handbuch vorgenommen und dortz vorallem den Bereich
ZitatEinfache Programmierung: if-Bedingung
, das Problem jetzt bin ich richtig verwirrt  :(
Bzw. ich hab iregendwo einen Logik fehler denn ich nicht finde, denke ja was ich erreichen will ist klar.

Neuer Ansatz:

Hab alarmOn und alarmOff mal so geändert:
define alarmOn at *19:45:00 IF ([Alarmanlage_Wohnzimmer] eq "on")
(  IF ([TuerFensterWohnzimmer] eq "AllesZu")
     (set Alarmanlage_Wohnzimmer on)
   ELSE
     ({FB_mail('xyz@googlemail.com','FHEM Fenster Offen','Alarm kann nicht aktiviert werden, Fenster oder Tuer noch offen' )})
)


define alarmOff at *19:55:00 IF ([Alarmanlage_Wohnzimmer] eq "off" )
     (set Alarmanlage_Wohnzimmer off)



Das wäre dann die normale Aktion.
Das Manuelle On /Off würde ich hier rüber regeln
define alarmManuell { IF (Value("Alarmanlage_Wohnzimmer") eq "on" ) { fhem ( "set TuerFensterWohnzimmer eq "AllesZu") } ELSE (Value("Alarmanlage_Wohnzimmer") eq "off" { fhem ("set Alarmanlage_Wohnzimmer off") } }

Werd das jetzt mal testen, aber kommt mir noch irgendwie seltsam vor........

EDIT
Hab jetzt ein wenig rumprobiert, und wie ich erwartet hatte es funktioniert nicht :-(
Titel: Antw:neuer FHEM-Befehl IF
Beitrag 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.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Puschel74 am 24 Oktober 2014, 17:47:50
Hallo,

das ist korrekt Rudi aber der Anwender sollte schon ein klein wenig Vorstellung davon haben was er erreichen möchte.
Wenn ich mir den Code so ansehe - ist es egal ob if oder IF  8)

define alarmOn at *19:45:00 IF ([Alarmanlage_Wohnzimmer] eq "on")
(  IF ([TuerFensterWohnzimmer] eq "AllesZu")
     (set Alarmanlage_Wohnzimmer on)


Um 19:45 wird geprüft on die Alarmanlage on ist, dann muss noch TuerFenster gleich AllesZu sein damit - die Alarmanlage on geschaltet wird.
Wozu? Sie ist ja bereits on sonst wären wir nicht hier.

Nun der ELSE-Teil:
Um 19:45 wird geprüft ob die Alarmanlage on ist, wenn dann TuerFenster ungleich AllesZu ist wird die Mail gesendet.
Ok, das kann Sinn machen.

define alarmOff at *19:55:00 IF ([Alarmanlage_Wohnzimmer] eq "off" )
     (set Alarmanlage_Wohnzimmer off)

Hier wird es olympisch  8)
Um 19:55 wird geprüft ob die Alarmanlage off ist um sie dann off zu schalten  ???

Tommy - egal ob if oder IF.
Du brauchst dir doch nur durchlesen was du da programmierst.
Der Code wird nicht angemeckert - syntaktisch ist er ja richtig.
Aber ergibt er auch Sinn für dich?

Grüße

Edith: Vorschlag zur Güte - ich geh mit meienr Frau in Ruhe auf die Terrasse eine rauchen.
Du schickst mir per PN WAS du genau haben möchtest - keinen Code sondern in deinen eigenen Worten (aber kein Roman).
Ich schau was ich dir daraus zaubern kann.
Das würde Damians Beitrag hier erstmal um einige Seiten entlasten  ;)
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Tommy82 am 24 Oktober 2014, 17:51:50
Hi Puschel, nein er ergibt keinen Sinn da hast du leider recht... :( Wie gesagt, hab da grad einen absoluten Logik (denk) fehler, obwohl die Aufgabenstellung eigentlich recht abstrakt ist....., steh mir echt auf dem schlauch.. Naja ich spiel noch was  ;)

So alarmOn mal so geändert, mal sehen was um 18:00 passiert :-)
define alarmOn at *18:05:00
  IF ([TuerFensterWohnzimmer] eq "AllesZu")
     (set Alarmanlage_Wohnzimmer on)
   ELSE
     ({FB_mail('xyz@googlemail.com','FHEM Fenster Offen','Alarm kann nicht aktiviert werden, Fenster oder Tuer noch offen' )})


So hier alarmOff
define alarmOff at *18:25:00 {fhem ("set Alarmanlage_Wohnzimmer off")}
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 24 Oktober 2014, 18:01:00
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.

Ich glaube, hier geht es vorallem um das grundsätzliche Verständnis der logischen Konstruktionen für Nicht-Programmierer:

Beispiel von @Tommy82:

IF ([Alarmanlage_Wohnzimmer] eq "on")
(  IF ([TuerFensterWohnzimmer] eq "AllesZu")
     (set Alarmanlage_Wohnzimmer on)
...

Warum soll ich Alarmanlage_Wohnzimmer auf "on" schalten, wenn sie schon vorher "on" war. So etwas wird auch mit if nicht gut funktionieren.

Wenn Anwender, insb. Einsteiger, IF nutzen, dann sollte man zumindest in der Einsteiger-Doku auf die Commandref zu IF hinweisen.
Dort habe ich diverse Beispiele zu IF beschrieben.

Viele Fälle kann man aber inzwischen genauso gut mit DOIF erledigen und dazu gibt es ebenso unzählige Beispiele in der Commandref.

Gruß

Damian
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Tommy82 am 24 Oktober 2014, 18:30:36
Zitat von: Tommy82 am 24 Oktober 2014, 17:51:50
Hi Puschel, nein er ergibt keinen Sinn da hast du leider recht... :( Wie gesagt, hab da grad einen absoluten Logik (denk) fehler, obwohl die Aufgabenstellung eigentlich recht abstrakt ist....., steh mir echt auf dem schlauch.. Naja ich spiel noch was  ;)

So alarmOn mal so geändert, mal sehen was um 18:00 passiert :-)
define alarmOn at *18:05:00
  IF ([TuerFensterWohnzimmer] eq "AllesZu")
     (set Alarmanlage_Wohnzimmer on)
   ELSE
     ({FB_mail('xyz@googlemail.com','FHEM Fenster Offen','Alarm kann nicht aktiviert werden, Fenster oder Tuer noch offen' )})


So hier alarmOff
define alarmOff at *18:25:00 {fhem ("set Alarmanlage_Wohnzimmer off")}

So funktioniert jetzt das On und Off, ist das denn so auch richtig?

Jetzt fehlt nur noch der Schalter ums Manuell zu schalten
Idee dafür wäre
define alarmManuel notify IF ("Alarmanlage_Wohnzimmer") eq "on" ) {fhem ("set Alarmanlage_Wohnzimmer off") } ELSE ("Alarmanlage_Wohnzimmer") eq "off" ) {fhem ("set Alarmanlage_Wohnzimmer on") aber das gefällt mir auch noch nicht so richtig....., sieht noch komisch aus.....
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Puschel74 am 24 Oktober 2014, 18:51:12
Hallo,

Mensch tommy
ZitatDas würde Damians Beitrag hier erstmal um einige Seiten entlasten

Ich grübel da per PN und du müllst den Beitrag dennoch munter voll - gehts noch  ???
*grumpf*
Lesen, denken, verstehen

Grüße
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 02 November 2014, 14:57:53
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
Titel: Antw:neuer FHEM-Befehl IF
Beitrag 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
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 21 November 2014, 10:46:37
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
Titel: Antw:neuer FHEM-Befehl IF
Beitrag 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.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 21 November 2014, 11:09:57
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
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: igami am 21 November 2014, 11:11:13
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 (http://forum.fhem.de/index.php/topic,29323.msg221687.html)
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: netbus am 21 November 2014, 11:59:36
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
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 21 November 2014, 12:41:26
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
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: netbus am 21 November 2014, 13:07:13
jetzt weiß ich was du mit zeit vergleichen meinst  :D
Funkt. Danke
Titel: Antw:neuer FHEM-Befehl IF
Beitrag 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
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 20 Dezember 2014, 19:38:50
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
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: MarkusN am 20 Dezember 2014, 20:15:20
Wahnsinn, kaum macht man es richtig funktioniert es auch. Danke Damian!

Grüße,

Markus
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Per am 14 September 2015, 00:52:02
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.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 14 September 2015, 18:03:08
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





Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Per am 14 September 2015, 18:55:18
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.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: rrr am 22 September 2015, 05:10:49
Kann man nicht mehrere IF's in einem notify hintereinander schreiben?

Beim diesem notify:
define n_Multimedia_PowerOff notify n_Multimedia_PowerOff
IF ([wz_avr:power] eq "on") (
set wz_avr off
)
IF ([wz_satpvr:power] eq "on") (
IF ([wz_satpvr:recordings] > 0)
(set wz_satpvr off)
ELSE
(set wz_satpvr shutdown)
)
IF ([wz_Kodi:system] eq "wake")
(set wz_Kodi off)



erhalte ich folgenden Fehler im Log:
n_Multimedia_PowerOff return value: IF: expected ELSE: IF ([wz_satpvr:power] eq "on") ( IF ([wz_satpvr:recordings] > 0) (set wz_satpvr off) ELSE (set wz_satpvr shutdown) ) IF ([wz_Kodi:system] eq "wake") (set wz_Kodi off)
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Brockmann am 22 September 2015, 08:43:41
Zitat von: rrr am 22 September 2015, 05:10:49
Kann man nicht mehrere IF's in einem notify hintereinander schreiben?
Klar, aber das sind dann mehrere unabhängige Befehle und die werden bei FHEM üblicherweise durch ; getrennt.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Simon74 am 02 Oktober 2015, 18:54:46
Mein DEF funktioniert so seit einem der letzten Updates nicht mehr:
t5.eg.bm:motion
IF ($we ne "1" and $hms gt "07:30" and $hms lt "20:30" and [Personen] ne "absent" and [t5.eg.ts] eq "locked")
  (set t5.eg.ts unlock;;define at.wetter at +00:00:04 {speakWetterVorhersage(1)})


Wenn ich die Wochenendabfrage rausnehme funktionierts:
t5.eg.bm:motion
IF ($hms gt "07:30" and $hms lt "20:30" and [Personen] ne "absent" and [t5.eg.ts] eq "locked")
  (set t5.eg.ts unlock;;define at.wetter at +00:00:04 {speakWetterVorhersage(1)})


Was hat sich an dieser Syntax geändert ?
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: mupko am 22 Dezember 2016, 18:15:59
Hallo,
ich versuche mich gerade reinzulesen, werde aber nicht schlau....

ich versuche in meinen 5 Geräte Kombi Code "Fernsehen ein/aus" einzufügen, dass das Rollo nur in der Zeit von 9 Uhr bis 16 Uhr morgens hochfährt

so:

define StartingFernsehen notify HarmonyHub.currentActivity:.starting.Fernsehen set Rolladen_03_Leinwand off;;set Leinwandaktor down 100
attr StartingFernsehen room 04__Wohnen,Homekit
define StartingFernsehenAus notify HarmonyHub.currentActivity:.PowerOff set Rolladen_03_Leinwand on;;set Leinwandaktor up 100

fährt das Rollo immer hoch!

habe es so getestet:

define StartingFernsehen notify HarmonyHub.currentActivity:.starting.Fernsehen set Rolladen_03_Leinwand off;;set Leinwandaktor down 100
attr StartingFernsehen room 04__Wohnen,Homekit
define StartingFernsehenAus notify HarmonyHub.currentActivity:.PowerOff set Rolladen_03_Leinwand on { if (($wday == 0) || ($wday == 1) || ($wday == 2) || ($wday == 3) || ($wday == 4) || ($wday == 5) || ($wday == 6) && (($hour >= 8 || $hour < 16))) { fhem("set Rolladen_03_Leinwand up") } };;set Leinwandaktor up 100

aber irgendwo ist ein Fehler, denn so fährt es zu keiner Uhrzeit hoch :-(
hab mich reingelesen, finde aber keine genaue Definition für mein Beispiel!
Es soll an allen Wochentagen zwischen 8 und 16 Uhr hochfahren und sonst nicht!
Ist denke ich gar nicht so schwer und gibt mehrere Varianten dies zu realisieren aber ich komm nicht weiter gerade!
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: JoeALLb am 22 Dezember 2016, 18:26:08
Ehrlich gesagt würde ich Dir zu DOIF raten. Wäre das eine Option für Dich?
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 03 Januar 2017, 14:13:49
ab morgen neue Version:

Zitat aus der Commandref:

Zitatsleep kann mit Komma verwendet werden, dabei wirkt das sleep nicht blockierend:

define check at *10:00 IF ([indoor] eq "on") (sleep 2,set lampe1 on,sleep 3,set lampe2 on)
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: JoeALLb am 03 Januar 2017, 14:50:52
Hallo Damian,

wäre es auch möglich, das neue $self von DOIF auch fürs IF zu ermöglichen? Ich würde das häufiger bei Userreaings benötigen...
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 03 Januar 2017, 15:15:10
Zitat von: JoeALLb am 03 Januar 2017, 14:50:52
Hallo Damian,

wäre es auch möglich, das neue $self von DOIF auch fürs IF zu ermöglichen? Ich würde das häufiger bei Userreaings benötigen...

Das geht leider nicht, da IF nur ein Befehl ist und kein Modul, daher hat es keinen Namen.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: JoeALLb am 03 Januar 2017, 15:19:37
Zitat von: Damian am 03 Januar 2017, 15:15:10
Das geht leider nicht, da IF nur ein Befehl ist und kein Modul, daher hat es keinen Namen.
Ach verstehe, dann wäre wohl [$name:reading] die richtige Nutzung? Danke für die rasche Antwort!!
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 04 Januar 2017, 10:42:37
Du kannst die Kürzel nehmen, die im jeweiligen Modul bekannt sind, wenn du IF in Kombination mit DOIF benutzt, kannst du selbstverständlich $SELF überall einsetzen, wenn du IF in Kombination mit notify nutzt, dann musst du die Platzhalter nehmen, die notify zur Verfügung stellt, z. B. $NAME
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: SebastianFL am 02 Mai 2017, 16:54:52
Hallo,

ich habe gerade die ersten Geräte hier im FHEM eingebunden. Darunter folgende:

ONKYO_AVR
mehrere SIRD
LG Fernseher
Harmony hub
usw. eben alles was irgendwie über Netzwerk zu erreichen ist.

Nun möchte ich, dass, wenn ich einen SIRD Hifi Adapter einschalte, der Onkyo automatisch au den richtigen Eingang geschaltet wird.

Wenn ich das richtig verstanden habe, dann kann man das mit einem IF- Befehl in einem notify machen?

Wohnzimmer:power|Wohnzimmer:power:.* \ IF ([Wohnzimmer:power] eq "on") (set WohnzimmerAVR on)\ ELSE\ (set WohnzimmerAVR off)

Das habe ich in den DEF von einem notify geschrieben, aber es reagiert einfach nicht drauf.

Wenn ich nur diese kleine Zeile reinschreibe, dann reagiert er, aber dabei ist es ja egal ob der HIFI- Adapter eingeschaltetist oder nicht
Wohnzimmer:power:.* set WohnzimmerAVR input phono

Wie muss denn die DEF aussehen, damit ich dieses Problem gelöst bekomme?
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Borkk am 15 November 2019, 11:25:09
Hallo Zusammen,

ich bin gerade ein wenig am verzweifeln. Ich habe mit IF schon eine ganze reihe an Notifys realisiert und alle laufen prima. Aufgrund des einfacheren Codes, ändere ich auch Schritt für Schritt alte Perl Notify in IF´s. Wie gesagt immer erfolgreich.

Nun scheitere ich an einer mini Sache...

ka_wm_strom:.*
IF ([ka_wm_strom] > 45) (
   (IF ([ka_wm]) eq "off")
        (set ka_wm on, set bd_luefter on, msg |Waschmaschine| läuft)
)


Wenn der Stromzähler an der Waschmaschine erkennt das sie läuft (Strom >45) und der Dummy ka_wm auf off steht, soll der Dummy auf on gestellt werden und der Lüfter eingeschaltet werden. Lief in Perl ohne Probleme aber der o.g. Code, schreibt alles was nach set ka_wm kommt in den Dummy also in diesem Fall "on, set bd_luefter on, msg |Waschmaschine| läuft". Aus welchem Grund auch immer, wird das Komma nicht interpretiert. Ein ";" bringt aber auch nichts. Ich habe schon andere IF´s laufen wo eine Befehlskette mit "," getrennt problemlos abgearbeitet wird.

Hat jemand eine Idee?
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: JoeALLb am 15 November 2019, 11:33:23
Befehle werden durch ; getrennt. Ggf ;;.
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Damian am 15 November 2019, 11:35:58
Komma ist schon richtig, du hast eine Klammer auf zu viel :)

PS: Da hast du aber einen alten Thread wieder rausgekramt :)
Titel: Antw:neuer FHEM-Befehl IF
Beitrag von: Borkk am 15 November 2019, 11:51:00
Zitat von: Damian am 15 November 2019, 11:35:58
Komma ist schon richtig, du hast eine Klammer auf zu viel :)

PS: Da hast du aber einen alten Thread wieder rausgekramt :)

Oh man.. Manchmal sieht man den Baum... :-) Vielen Dank.

ja der Thread ist alt, aber man landet hier wenn man nach IF FHEM sucht und es hat ja auch prima geklappt.

Nochmal danke für die schnelle Hilfe.

So klappt es jetzt natürlich (waren sogar zwei Klammern zuviel, deshalb bin ich beim durchzählen nicht drauf gestoßen);
ka_wm_strom:.*
IF ([ka_wm_strom] > 45) (
   IF ([ka_wm] eq "off")
      (set ka_wm on, set bd_luefter on, msg |Waschmaschine| läuft))