FHEM Forum

FHEM - Hausautomations-Systeme => Unterstützende Dienste => Thema gestartet von: bugster_de am 13 Oktober 2014, 20:39:46

Titel: neues Modul für drop-down mit Perl-Aufruf
Beitrag von: bugster_de am 13 Oktober 2014, 20:39:46
Hallo Leute,

es hat mich schon lange in den Fingern gejuckt da mal was zu machen:
ihr kennt das alle: man hat auf der Oberfläche eine ganze Menge dummy Schalter, zu jedem dann einen notify, der dann eine Perl Funktion aufruft. Das funktioniert zwar echt gut, aber es wird irgendwann bei zunehmender FHEM Größe echt unübersichtlich. Deshalb habe ich mal ein kleine Modul geschrieben, welches sich an den dummy anlehnt, aber direkt eine Perl Funktion aus 99_myUtils.pm aufruft. Somit benötigt man also keinen notify mehr und spart sich einiges an Tippaufwand.

Modul mal as is anbei. Läuft bei mir soweit ganz gut.

Definition:
define mytest dummy3 erster:myperlfunc1 zweiter:myperlfunc2 dritter:myperlfunc1

Sollte eigentlich selbsterklärend sein: der dummy3 hat in diesem Beispiel dann drei mögliche Zustände: erster, zweiter, dritter
Sollte per set dummy einen der Werte gesetzt werden, so wird die entsprechende Perl Funktion aufgerufen
Also
erster       ruft       myperlfunc1        auf
zweiter     ruft       myperlfunc2        auf
dritter       ruft       myperlfunc1        auf

Wie man sieht, kann die gleiche Funktion auch von mehreren Zuständen aufgerufen werden. Man braucht also nicht zwingend mehrere Perl-Routinen.

Die Perlfunktionen sollten folgendenm Template entsprechen
sub myperfunc1( $ ) {
   my ( $status ) = @_;
   # $status enthaelt den Wert, auf den der dummy3 gesetzt wurde
}


Attribute hat es natürlich auch 2:
disable: wenn dies auf 1 gesetzt ist, dann wird die Perl Routine nicht aufgerufen. Gut um z.B. Nachtruhe oder Kindersicherung zu realisieren
donotify: per default schmeisst das Modul keinen notify, wenn der state sich geändert hat (macht ja auch keinen Sinn). Wenn man dieses Attribut auf 1 stellt, dann doch.

Ach so: der Name dummy3 ist etwas einfallslos. Wenn also jemand was besseres hat, dann her damit ...

Ach so 2: ich habe dieses mal sogar die entsprechende Doku ins Modul gemacht.
Titel: Antw:neues Modul für drop-down mit Perl-Aufruf
Beitrag von: justme1968 am 13 Oktober 2014, 21:32:44
schau dir mal readingsProxy an. damit kannst du unter anderem genau das machen. inklusive webCmds und dropDown menüs & co.

gruß
  andre
Titel: Antw:neues Modul für drop-down mit Perl-Aufruf
Beitrag von: hexenmeister am 13 Oktober 2014, 21:49:32
Kurz getestet.

Erstes Problem: beim Define wird Timestamp-String ausgegeben. 'return undef;' am Ende von dummy3_Define ergänzt, dann lässt sich  eine Instanz erstellen.

Aber im Raum wird keine Liste angezeigt, nur im Detail-Ansicht.
(http://forum.fhem.de/index.php?action=dlattach;topic=27897.0;attach=20020;image)
Titel: Antw:neues Modul für drop-down mit Perl-Aufruf
Beitrag von: bugster_de am 14 Oktober 2014, 11:42:01
@andre: Readingsproxy kenne ich. Das macht aber nicht das was ich will. Oder ich habe es nicht verstanden
Mein Anwendungsfall: ich möchte auf der Oberfläche einen Schalter haben, mit dem ich den Betriebsmodus einer Steuerung einstellen kann. Also z.B. die Rolladensteuerung auf automatic oder absence or manual stellen. Bisher habe ich das so realisiert, dass ich hierfür einen dummy definiert habe und ihm mit setlist die drei Werte mitgab. Dann habe ich einen notify, der auf den state des dummy reagiert und abhängig vom state dann eine entsprechende Aktion via Perl Routine auslöst. Somit muß man die verschiedenen states an min 3 Stellen konsistent halten. Ich habe mittlerweile eine ganze Menge solcher dummy Konstrukte (keine Angst: meine Frau sieht nur ca. 5 Stck.; der Rest ist nur für mich, um verschiedene Dinge feiner einstellen zu können ohne jedes mal gleich den Perl-Code neu machen zu müssen)

@hexenmeister:
return undef --> Ups ?! Warum geht das bei mir?
Raumansicht: mittels setlist Attribut kann man das setzen. Könnte man natürlich auch automatisieren. Sprich beim Anlegen des Device wird das Attribut setlist gleich befüllt.
Titel: Antw:neues Modul für drop-down mit Perl-Aufruf
Beitrag von: justme1968 am 14 Oktober 2014, 12:12:50
du definierst dir einen readingsProxy in etwa so:define Rolladensteuerung readingsProxy Rolladensteuerung:state
attr Rolladensteuerung setFn {fhem("setreading $DEVICE state $CMD");; Log 3, $CMD;; return undef}
attr Rolladensteuerung setList state:automatic,absence,manual
attr Rolladensteuerung webCmd state


- du definierst den radingsProxy auf sich selbst. d.h. ohne eigentliches proxy device
- in der setFn setzt du zum einen state damit im dropDown die vorauswahl zur aktuellen einstellig passt, dann rufts du deine perl routine auf. z.b. auch so myFunc($DEVICE,$CMD) -> du bekommst das device und das kommando übergeben und dann gibst du undef zurück weil schon alles gemacht ist und der readingsProxy nichts weiter tun muss.
- set list funktioniert wie beim dummy
- webCmd auch

man könnte auch eine valueFn mit $LASTCMD bauen. ist aber hier nicht weiter nötig.

gruss
  andre
Titel: Antw:neues Modul für drop-down mit Perl-Aufruf
Beitrag von: bugster_de am 14 Oktober 2014, 12:20:31
Ah, das ist der Trick: das readingsproxy auf sich selbst zu definieren! Danke! Dann kann mein Modul in den Datenmülleimer.
:-)
Titel: Antw:neues Modul für drop-down mit Perl-Aufruf
Beitrag von: justme1968 am 14 Oktober 2014, 12:31:57
das ist im prinzip der gleiche 'trick' um ein notify als makro zu verwenden. einfach auf sich selber definieren.

beim readingsProxy ist aber das return undef; am ende der setFn dann wichtig. sonst bekommst du tatsächlich eine endlosschleife.
die nächste version wird das nicht mehr nötig haben. da kann man auch mehr als ein reading für das device angeben oder das device weg lassen.

gruss
  andre