neuer FHEM-Befehl IF

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

Vorheriges Thema - Nächstes Thema

Damian

#15
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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

hexenmeister

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.
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

Blockmove

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

hexenmeister

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
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

Damian

#19
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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

hexenmeister

Cool  :D
Bin gespannt!
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

Damian

#21
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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

ph1959de

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
Aktives Mitglied des FHEM e.V. | Moderator im Forenbereich "Wiki"

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

The-Holgi

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
HP T610 Thin Client; Docker Fhem 5.9; 2X CUL V3 868mhz; Max Heizungssteuerung; FS20kse; FS20UWS; FS20S8-3; 2 FS20DI; HM-CFG-LAN,HM-LC-SW1-PL,HM-SEC-SD, HM-SE1PBU-FM;
Harmony Hub;Hue-Bridge mit Iris, E27 Bulb & FLS-PP

hexenmeister

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
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

Damian

#26
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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

hexenmeister

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
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

Damian

#28
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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#29
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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF