neuer FHEM-Befehl IF

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

Vorheriges Thema - Nächstes Thema

hexenmeister

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

Damian

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

hexenmeister

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 ;)

Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

Damian

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

Damian

#34
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

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

fiedel

#35
Mal als kleine Auflockerung zwischendurch: So könnte das dann in der Zukunft mal aussehen.

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
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

Damian

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

Invers

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.
Pi3B+ mit SSD/ Bullseye | FB7590 AX | 12 x Dect200 | CUL433+868 | SDuino | HM-LAN | 3 x Heizung FHT + FKontakte | KeyMatic + 4 FB | HM Wandtaster 2-fach m. LED | 6 x Türkont. TFK-TI | HM-Bew.-Melder innen | 3 x Smoked. HM-SEC-SD-2

Damian

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

Invers

Nehme ich nicht persönlich, da du ja auch Recht hast, wie meine Ausführungen bestätigt haben dürften.
Pi3B+ mit SSD/ Bullseye | FB7590 AX | 12 x Dect200 | CUL433+868 | SDuino | HM-LAN | 3 x Heizung FHT + FKontakte | KeyMatic + 4 FB | HM Wandtaster 2-fach m. LED | 6 x Türkont. TFK-TI | HM-Bew.-Melder innen | 3 x Smoked. HM-SEC-SD-2

Damian

#40
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

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

Rince

Auf jeden Fall liest es sich sehr eindrucksvoll :)

Ich hätte dafür sofort Verwendung ;)
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Franz Tenbrock

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
cubi3, Cul 868, ESA2000WZ, EM1000GZ,  FS20, dashboard, 1-Wire, Max Thermos, Max Wandthermo, Max Lan, Fritzbox callmonitor, , nanocul, HM Led16, HM Bewegungsmelder, HM Schalter, RPi, banana, ESP8266, DoorPi

Damian

#43
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



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

Zrrronggg!

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.
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL