HomeMatic Funk-Statusanzeige - HM-Dis-WM55

Begonnen von Roaster, 14 November 2014, 20:33:48

Vorheriges Thema - Nächstes Thema

strauch

Mhhh ich muss mich mal wieder eindenken und dann mal den Wikieintrag aktualisieren. Sehr schön Arbeit bisher. Danke Martin.
FHEM 5.6 VMware mit Debian. 1 CUL für FS20 und HMLAN für Homematic, HM-CC-RT-DN, HM-LC_Sw1PBU-FM, HM-LC-Bl1PBU-FM,  HM-SEC-SC, HM-SEC-SC-2, HM-LC-Sw1-Pl2, HM-Sec-RHS, ASH2200, FHT80B, S20KSE, Sonos, XBMC, FB_Callmonitor, SMLUSB, Arduino Firmata, uvm.

martinp876

my @cntMax
Muss es heisen. Ich hatte alle definitionen falsch...
Damit legst du die anzahl der moeglichen unterschiedlichen zeilen je zeile fest.
Du solltest die werte entsprechend der eintraege im hash waehlen. Koennte man automatisch generieren... ein moeglicher fehler weniger

d.stratmann

Oki habe ich geändert - save ohne Fehler.
Jetzt nochmal zurück...

die cfg_fhemPostInit.cfg wie folgt:

set DI_FL_Dis_02 displayWM short  line1 e:{(myLine(1),"blue","noIcon")}
set DI_FL_Dis_02 displayWM short  line2 e:{(myLine(2),"yellow","noIcon")}
set DI_FL_Dis_02 displayWM short  line3 e:{(myLine(3),"yellow","noIcon")}
set DI_FL_Dis_02 displayWM short  line4 e:{(myLine(4),"yellow","noIcon")}
set DI_FL_Dis_02 displayWM short  line5 e:{(myLine(5),"yellow","noIcon")}
set DI_FL_Dis_02 displayWM short  line6 e:{(myLine(6),"yellow","noIcon")}

Ist das korrekt? Wenn ich nur den Befehl:

set DI_FL_Dis_02 displayWM short  line1 e:{(myLine(1),"blue","noIcon")}

abschicke, dann bekomme ich den Fehler: define eval must return 3 values:

Und wie definiere ich jetzt das ganze in der fhem.cfg, dass es auch aufgerufen wird?

martinp876

Der aufruf von myline hat 2 parameter.
Wenn du myline aufrufst musst du sagen, welche zeile, welcher button und long oder short du bekommen willst.
Der button long short ist in einem parameter kodiert.
Btn1 short =0
Btn1 long = 1
Btn2 short =2
Btn2 long =3

Also
Btn1 short line 1 : myLine (1,0)
Btn1 long line 3 : myLine (3,1)
So muss die definition aussehen... immer gleich

d.stratmann

Hallo martin,

jetzt habe ich verstanden und es schließt sich etwas der Kreis, wie die Sachen zusammen hängen!
Ich habe jetzt die cfg_fhemPostInit.cfg
set DI_FL_Dis_02 displayWM short  line1 e:{(myLine(1,1),"blue","noIcon")}
set DI_FL_Dis_02 displayWM short  line2 e:{(myLine(1,2),"yellow","noIcon")}
set DI_FL_Dis_02 displayWM short  line3 e:{(myLine(1,3),"yellow","noIcon")}
set DI_FL_Dis_02 displayWM short  line4 e:{(myLine(1,4),"yellow","noIcon")}
set DI_FL_Dis_02 displayWM short  line5 e:{(myLine(1,5),"yellow","noIcon")}
set DI_FL_Dis_02 displayWM short  line6 e:{(myLine(1,6),"yellow","noIcon")}


nach einem shutdown restart ist es jetzt so:
Ich drücke die Taste (es dauert einen moment, also vermute ich wird irgendwas "gerechnet") und dann bekomme ich aber folgendes angezeigt:
blue
yellow
yellow
yellow
yellow
yellow

martinp876

Ich dachte line war der erste parameter und type der 2.
Also 1,1 2,1 3,1.....
Dann long 1,2 2,2 3,2 4,2....6,2
Dann btn 2 short 1,3 2,3 3,3....6,3
Und 2 long 1,4....6,4

Den kmpletten ablauf was beim wievielten druck passiert macht myutils.
Im grossen hash legst du alle funktionen fest.
Also min eine je line und type ... sind 6*4... also24.
Wenn du nun .. sagen wir bei btn1 short 4 level unterscheiden willst musst du statt der 6 funktionen (1 per line ) natuerlich4 mal 6 funktionen eintragen. Klar . Maxcnt fuer den type stellst du auf 4... das ist der erste eintrag in der maxcnt liste. Die funktion addiert je trigger eins. Es wird module gerechnet. ... wen der wert also 4 ist wird er auf 0 gesetzt und zaelt bis 3 hoch. Es wird fuer jede line,type kombi die xte funktion aus dem hash genommen.
Ich werde am wochenende ein beispiel machen.

d.stratmann


jens-hoppel

Hallo Andre
ZitatMhhh ich muss mich mal wieder eindenken und dann mal den Wikieintrag aktualisieren. Sehr schön Arbeit bisher. Danke Martin.
Gute Idee von dir, aber warte noch einen Augenblick bis die beiden das Rund haben, dann haben wir alle was davon  :) :) :)
FHEM auf 1.Rasberry PI, 2xCUL CC1101, HMLAN, USV 400
2.Rasberry PI als Wetterserver
HM, FS20, FHT, HMS, WS1080 Komponenten für diverse Schalt- und Überwachungsaufgaben

jens-hoppel

#248
ZitatUpdate

es gibt seit jetzt eine neue Funktion - texte dynamisch zu erstellen.

Code: [Auswählen]

set dis_02 displayWM short  line1 e:{("ca:".ReadingsVal("h.caro.Clima","desired-temp","no")."-".ReadingsVal("h.caro.Clima","measured-temp","no"),"blue",(ReadingsVal("h.caro.Clima","ValvePosition",0))?"on":"off")}
set dis_02 displayWM short  line2 e:{("lg:".ReadingsVal("h.lnge.Clima","desired-temp","no")."-".ReadingsVal("h.lnge.Clima","measured-temp","no"),"green",(ReadingsVal("h.lnge.Clima","ValvePosition",0))?"on":"off")}
set dis_02 displayWM short  line3 e:{("fh:".ReadingsVal("h.fsth.Clima","desired-temp","no")."-".ReadingsVal("h.fsth.Clima","measured-temp","no"),"green",(ReadingsVal("h.fsth.Clima","ValvePosition",0))?"on":"off")}
set dis_02 displayWM short  line4 e:{("du:".ReadingsVal("h.dact.Clima","desired-temp","no")."-".ReadingsVal("h.dact.Clima","measured-temp","no"),"yellow",(ReadingsVal("h.dact.Clima","ValvePosition",0))?"on":"off")}
set dis_02 displayWM short  line5 e:{("ba:".ReadingsVal("h.bad.Clima","desired-temp","no")."-".ReadingsVal("h.bad.Clima","measured-temp","no"),"blue",(ReadingsVal("h.bad.Clima","ValvePosition",0))?"on":"off")}
set dis_02 displayWM short  line6 e:{("o:".ReadingsVal("h_s_aussen","temperature","-")."-p:".ReadingsVal("h_s_aussen","pressure","-"),"blue","noIcon")}

set dis_01 displayWM short  line1 e:{("o:".ReadingsVal("h_s_aussen","temperature","-")."-p:".ReadingsVal("h_s_aussen","pressure","-"),"blue",(ReadingsVal("h_s_aussen","x",1))?"off":"on")}
set dis_01 displayWM short  line2 e:{("o:lum".ReadingsVal("h_s_aussen","luminosity","-"),"blue","noIcon")}
set dis_01 displayWM short  line3 e:{("s1:".ReadingsVal("h_s_az","temperature","-")."-h:".ReadingsVal("h_s_az","humidity","-"),"orange","noIcon")}
set dis_01 displayWM short  line4 e:{("s1:".ReadingsVal("h_s_keller","temperature","-")."-h:".ReadingsVal("h_s_keller","humidity","-"),"green","noIcon")}


Syntax:

Code: [Auswählen]

set dis_02 displayWM short  line1 e:{(text,color,icon)}

gebe ich dies an der Console ein, dann funktioniert es auch.
Nach dem nächsten Neustart von FHEM  bleibt das Display dunkel und ich muß wieder
alles neu eingeben. Wie mache ich es dauerhaft fest ?

Edit:
Wäre es so Richtig ?
define display2_1 notify global:INITIALIZED set Display_02 displayWM short line1 Innen: blue noIcon
define display2_2 notify global:INITIALIZED set Display_02 displayWM short line2 e:{(ReadingsVal("FHT_3034","temperature","-"),"blue","noIcon")}
define display2_3 notify global:INITIALIZED set Display_02 displayWM short line3 Tuerschloss: blue noIcon
define display2_4 notify global:INITIALIZED set Display_02 displayWM short line4 e:{(InternalVal("Tuerschloss","STATE","-"),"blue","noIcon")}

FHEM auf 1.Rasberry PI, 2xCUL CC1101, HMLAN, USV 400
2.Rasberry PI als Wetterserver
HM, FS20, FHT, HMS, WS1080 Komponenten für diverse Schalt- und Überwachungsaufgaben

martinp876

hier mein Vorschlag -habe es getestet. die Infos sind einfallslos.
geändert wird hier nur der text - man kann auch auf color und icon erweitern:

1: im user-fhem-config. fix. nur icon oder farbe ändern (bis man es verstanden hat)

set dis_01 displayWM short  line1 e:{(myLine(1,0),"blue","noIcon")}
set dis_01 displayWM short  line2 e:{(myLine(2,0),"blue","noIcon")}
set dis_01 displayWM short  line3 e:{(myLine(3,0),"blue","noIcon")}
set dis_01 displayWM short  line4 e:{(myLine(4,0),"blue","noIcon")}
set dis_01 displayWM short  line5 e:{(myLine(5,0),"blue","noIcon")}
set dis_01 displayWM short  line6 e:{(myLine(6,0),"blue","noIcon")}

set dis_01 displayWM long   line1 e:{(myLine(1,0),"blue","noIcon")}
set dis_01 displayWM long   line2 e:{(myLine(2,0),"blue","noIcon")}
set dis_01 displayWM long   line3 e:{(myLine(3,0),"blue","noIcon")}
set dis_01 displayWM long   line4 e:{(myLine(4,0),"blue","noIcon")}
set dis_01 displayWM long   line5 e:{(myLine(5,0),"blue","noIcon")}
set dis_01 displayWM long   line6 e:{(myLine(6,0),"blue","noIcon")}

set dis_02 displayWM short  line1 e:{(myLine(1,0),"blue","noIcon")}
set dis_02 displayWM short  line2 e:{(myLine(2,0),"blue","noIcon")}
set dis_02 displayWM short  line3 e:{(myLine(3,0),"blue","noIcon")}
set dis_02 displayWM short  line4 e:{(myLine(4,0),"blue","noIcon")}
set dis_02 displayWM short  line5 e:{(myLine(5,0),"blue","noIcon")}
set dis_02 displayWM short  line6 e:{(myLine(6,0),"blue","noIcon")}

set dis_02 displayWM long   line1 e:{(myLine(1,0),"blue","noIcon")}
set dis_02 displayWM long   line2 e:{(myLine(2,0),"blue","noIcon")}
set dis_02 displayWM long   line3 e:{(myLine(3,0),"blue","noIcon")}
set dis_02 displayWM long   line4 e:{(myLine(4,0),"blue","noIcon")}
set dis_02 displayWM long   line5 e:{(myLine(5,0),"blue","noIcon")}
set dis_02 displayWM long   line6 e:{(myLine(6,0),"blue","noIcon")}


2: im 99_myUtils.pm
initial - fix. nicht ändern
# define counter and counterlimit per press-type
# presstype are 0: btn1 short
# presstype are 1: btn1 long
# presstype are 2: btn2 short
# presstype are 3: btn2 long

my @cnt = (0,0,0,0); #init one counter per press
my @cntMax ;         #number of entries per press


die einzelnen Zeilen
my %lineArr = (0 => #============Btn Type 0: Btn1 short
                   {0 => #-------itteration 0
                        { 1=>"{\"b1-short:0\"}"                                 #  line 1
                         ,2=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 2
                         ,3=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 3
                         ,4=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 4
                         ,5=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 5
                         ,6=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 6
                         }
                   ,1 => #-------itteration 1
                        { 1=>"{\"b1-short:1\"}"                                 #  line 1
                         ,2=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 2
                         ,3=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 3
                         ,4=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 4
                         ,5=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 5
                         ,6=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 6
                        }
                   ,2 => #-------itteration 2
                        { 1=>"{\"b1-short:2\"}"                                 #  line 1
                         ,2=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 2
                         ,3=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 3
                         ,4=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 4
                         ,5=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 5
                         ,6=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 6
                        }
                   ,3 => #-------itteration 3
                        { 1=>"{\"b1-short:3\"}"                                 #  line 1
                         ,2=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 2
                         ,3=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 3
                         ,4=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 4
                         ,5=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 5
                         ,6=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 6
                        }
                   ,4 => #-------itteration 4
                        { 1=>"{\"b1-short:4\"}"                                 #  line 1
                         ,2=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 2
                         ,3=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 3
                         ,4=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 4
                         ,5=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 5
                         ,6=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 6
                        }
                   }
              ,1 => #============Btn Type 0: Btn1 Long
                   {0 => #-------itteration 0
                        { 1=>"{\"b1-long:0\"}"                                  #  line 1
                         ,2=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 2
                         ,3=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 3
                         ,4=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 4
                         ,5=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 5
                         ,6=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 6
                        }                                                       
                   ,1 => #-------itteration 1
                        { 1=>"{\"b1-long:1\"}"                                  #  line 1
                         ,2=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 2
                         ,3=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 3
                         ,4=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 4
                         ,5=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 5
                         ,6=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 6
                        }                                                       
                   ,2 => #-------itteration 2
                        { 1=>"{\"b1-long:2\"}"                                  #  line 1
                         ,2=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 2
                         ,3=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 3
                         ,4=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 4
                         ,5=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 5
                         ,6=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 6
                        }
                   }
              ,2 => #============Btn Type 2: Btn2 short
                   {0 => #-------itteration 0
                        { 1=>"{\"b2-short:0\"}"                                 #  line 1
                         ,2=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 2
                         ,3=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 3
                         ,4=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 4
                         ,5=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 5
                         ,6=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 6
                        }                                                       
                   ,1 => #-------itteration 1
                        { 1=>"{\"b2-short:1\"}"                                 #  line 1
                         ,2=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 2
                         ,3=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 3
                         ,4=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 4
                         ,5=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 5
                         ,6=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 6
                        }                                                       
                   ,2 => #-------itteration 2
                        { 1=>"{\"b2-short:2\"}"                                 #  line 1
                         ,2=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 2
                         ,3=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 3
                         ,4=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 4
                         ,5=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 5
                         ,6=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 6
                        }
                   }
              ,3 => #============Btn Type 3: Btn2 Long
                   {0 => #-------itteration 0
                        { 1=>"{\"b2-long:0\"}"                                  #  line 1
                         ,2=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 2
                         ,3=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 3
                         ,4=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 4
                         ,5=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 5
                         ,6=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 6
                        }                                                       
                   ,1 => #-------itteration 1
                        { 1=>"{\"b2-long:1\"}"                                  #  line 1
                         ,2=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 2
                         ,3=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 3
                         ,4=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 4
                         ,5=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 5
                         ,6=>"ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")" #  line 6
                        }                                                       
                   }
   );


im util initialize
sub myUtils_Initialize($$) {
  my ($hash) = @_;

  @cntMax = (scalar keys %{$lineArr{0}}
            ,scalar keys %{$lineArr{1}}
            ,scalar keys %{$lineArr{2}}
            ,scalar keys %{$lineArr{3}});
}


und dann der code:

sub myLine($$){
  my ($line,$type) = @_;
  $cnt[$type] = ($cnt[$type] +1)%$cntMax[$type] if ($line == 1); # rotate counter per type
  return eval $lineArr{$type}{$cnt[$type]}{$line};
}



viel Spass

d.stratmann

Hallo martin,
PERFEKT - genau so habe ich mir das vorgestellt! Vielen Dank schon einmal für die ganze Mühe.

Ich habe noch 3 Fragen bzw. Wünsche.

1.
Wenn ich jetzt
{ 1=>"{\"Wohnzimmer\"}"                                 #  line 1
                         ,2=>"ReadingsVal(\"HK_WZ_Clima\",\"measured-temp\",\"no\")" #  line 2
                         ,3=>"ReadingsVal(\"HK_WZ_Clima\",\"desired-temp\",\"no\")" #  line 3
ausgebe, steht da ja erstmal nur die Ziffern bzw. der abgefragte Wert.
Kann man hier z.B. das so machen, dass dort steht:
Zeile 1: Wohnzimmer
Zeile 2: Ist: (Wert)
Zeile 3: Soll: (Wert)

(Wert) in diesem Fall der abgefragte Wert.

2. Beim Fenster wird angezeigt "open" oder "closed" kann man das auf offen oder zu ändern?

3.
Die Farbe kann ich ja auch mit übergeben, wenn ich das erweiter.
Hier wäre mein Wunsch, wenn Fenster offen steht der Text "zu" in grün und wenn Fenster "offen" dann in rot.

Kann man sich hier eigentlich irgendwie bedanken?

martinp876

Zitatset dis_01 displayWM short  line6 e:{(myLine(6,0),"blue","noIcon")}

set dis_01 displayWM long   line1 e:{(myLine(1,0),"blue","noIcon")}
ist falsch.
bei Btn1 short muss immer  myLine(x,0)
bei Btn1 long muss immer  myLine(x,1)
bei Btn2 short muss immer  myLine(x,2)
bei Btn2 long muss immer  myLine(x,3)
stehen

du kannst  es so machen:
,2=>"{\"test:\".ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")}" #  line 2

also das ganze in {} packen und dann einenstring basteln. ", welche im Kommando vorkommen werden mit \" übergeben.

Zitat2. Beim Fenster wird angezeigt "open" oder "closed" kann man das auf offen oder zu ändern?
auf viele Arten. Ändere es im Device mit dem üblichen FHEM methoden und zeige diese an. Im myUtil für den WM55 würde ich das nicht einbauen. du willst es sicher generell.

ZitatDie Farbe kann ich ja auch mit übergeben, wenn ich das erweiter.
Hier wäre mein Wunsch, wenn Fenster offen steht der Text "zu" in grün und wenn Fenster "offen" dann in rot.
im Prinzip habe ich hier einen Ansatz zur freien Programmierung geliefert. das kannst du beliebig erweitern.
set dis_01 displayWM short  line1 e:{(myLine(1,0),"blue","noIcon")}
nutzt jetzt ein kommando für kommand. du kannst
a) eine routine bauen, die 3 Werte rückliefert
b) 3 routinen einbauen.

bei a) kannst du anstelle von 

line1 e:{(myLine(1,0),"blue","noIcon")}
ein
line1 e:{(myLineA(1,0))}

definieren - mit
sub myLineA(1,0){
.....
return ($line,$color,$icon);
}

jetzt wird es aber ziemlich spezifisch.

bei b) kannst du
line1 e:{(myLine(1,0),myCol(1,0),myIcon(1,0))}
bauen und das gleiche noch einmal etablieren.

und alles zwischen drin....
ich würde mir eine Art Tabelle ausdenken und die ich dann ausgeben.

Versuche zu verstehen, was ich gemacht habe - dann denke dir etwas aus, was passt.

Shax

Wahnsinn was hier für geniale Arbeit gemacht wird. Hab mich gerade durch den Thread gelesen.
Daumen hoch! Ich arbeite mich gerade in die ganze Geschichte ein und kann irgendwann vielleicht
auch helfen. Aber das dauert noch bis ich alles gecheckt habe ;)

In Perl, PHP und einigen anderen Sprachen bin ich bewandert.
Ich komme von der RWE Smarthome Schiene, die ich gerade überall rausreisse und ersetze.
Raspberry Pi2 mit CUL SCC 1.2 - Raspberry Pi2 CUL SCC 2.0 - Raspberry Pi 3 mit RPI-RF-MOD - Raspberry Pi Relaissteuerung für Gartenstrom

martinp876

also hier - step 1:

set dis_01 displayWM short  line1 e:{myLineA(1,0)}
set dis_01 displayWM short  line2 e:{myLineA(2,0)}
.....                                                 
set dis_01 displayWM long   line1 e:{myLineA(1,1)}
set dis_01 displayWM long   line2 e:{myLineA(2,1)}
...


dann eine tabelle (ein hash) mit routinen für (t)ext, (c)olor und (i)con
my %lineArr = (0 => #============Btn Type 0: Btn1 short
                   {0 => #-------itteration 0
                        { 1=>{t=>"{\"b1-short:0\"}"                                            ,c=>"{\"blue\"}" ,i=>"{\"off\"}" }#  line 1
                         ,2=>{t=>"{\"test:\".ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")}",c=>"{\"blue\"}" ,i=>"{\"off\"}" }#  line 2
                         ,3=>{t=>"{ReadingsVal(\"h_s_aussen\",\"luminosity\",\"-\")}"          ,c=>"{\"blue\"}" ,i=>"{\"off\"}" }#  line 3


wie gehabt - nur mit 3 Einträgen.
myLineA gibt dann ein array zurück, nicht nur einen String:
sub myLineA($$){
  my ($line,$type) = @_;
  $cnt[$type] = ($cnt[$type] +1)%$cntMax[$type] if ($line == 1); # rotate counter per type
  return (eval $lineArr{$type}{$cnt[$type]}{$line}{t}
         ,eval $lineArr{$type}{$cnt[$type]}{$line}{c}
         ,eval $lineArr{$type}{$cnt[$type]}{$line}{i}
         );
}


im nächsten schritt empfehle ich vereinfachungen einzubauen. wenn du also viele Fenster anzeigen willst dann mache ein
sub myWinDisp($$){
  my ($e,$t)=@_;
  return ReadingsVal($e,"myreading","-");
}


$t könnte dann eben t,i,c sein und du baust ein if t, dann erstelle text, if c suche die Farbe... ein. Sollte lösbar sein.


martinp876

so - hat mir keine Ruhe gelassen.

will man es komplett umstellen macht man
set dis_01 displayWM short  line1 e:{myLineA(1,0)}
set dis_01 displayWM short  line2 e:{myLineA(2,0)}
set dis_01 displayWM short  line3 e:{myLineA(3,0)}
.................                                                 
set dis_01 displayWM long   line1 e:{myLineA(1,1)}
set dis_01 displayWM long   line2 e:{myLineA(2,1)}
..............                                                 
set dis_02 displayWM short  line1 e:{myLineA(1,2)}
set dis_02 displayWM short  line2 e:{myLineA(2,2)}
............


in MyUtils die definition der Zeilen.
fix ist
my @cnt = (0,0,0,0); #init one counter per press
my @cntMax ;         #number of entries per press

variable - wie vor ein Eintrag für (type,line,itteration)... hier nur ein Auszug
my %lineArr = (0 => #============Btn Type 0: Btn1 short
                   {0 => #-------itteration 0
                        { 1=>"{myTh(\"s1:\",\"h_s_s1\","    #  line 1
                         ,2=>"{myTh(\"s2:\",\"h_s_s1\","    #  line 2
                         ,3=>"{myTh(\"au:\",\"h_s_aussen\","#  line 3
                         ,4=>"{myPr(\"  :\",\"h_s_aussen\","#  line 3
                         ,4=>"{myTx(\"txt1\",\"\","#  line 4
                         ,5=>"{myTx(\"\",\"\","#  line 5
                         ,6=>"{myTx(\"txt6:\",\"\","#  line 6
                         }
                   ,1 => #-------itteration 1
                        { 1=>"{myTh(\"s1:\",\"h_s_s1\","    #  line 1
                         ,2=>"{myTh(\"s2:\",\"h_s_s1\","    #  line 2
                         ,3=>"{myTh(\"au:\",\"h_s_aussen\","#  line 3
                         ,4=>"{myPr(\"  :\",\"h_s_aussen\","#  line 3
                         ,4=>"{myTx(\"txt1\",\"\","#  line 4
                         ,5=>"{myTx(\"\",\"\","#  line 5
                         ,6=>"{myTx(\"txt6:\",\"\","#  line 6
                         }
                   }

im init nicht vergessen
sub myUtils_Initialize($$) {
  my ($hash) = @_;

  @cntMax = (scalar keys %{$lineArr{0}}
            ,scalar keys %{$lineArr{1}}
            ,scalar keys %{$lineArr{2}}
            ,scalar keys %{$lineArr{3}});
}

die primäre routine. Zeile 1 muss ausgeführ werden um weiter zu zählen...
sub myLineA($$){
  my ($line,$type) = @_;
  $cnt[$type] = ($cnt[$type] +1)%$cntMax[$type] if ($line == 1); # rotate counter per type
 
  return (eval $lineArr{$type}{$cnt[$type]}{$line}."\"t\")}"
         ,eval $lineArr{$type}{$cnt[$type]}{$line}."\"c\")}"
         ,eval $lineArr{$type}{$cnt[$type]}{$line}."\"i\")}"
         );
}


und jetzt: eine routine je typ, den ich ausgeben will:
sub myRT($$$){
  my ($p,$e,$t) = @_;
  if($t eq "t"){return $p.ReadingsVal($e,"desired-temp","no")."-".ReadingsVal($e,"measured-temp","no");  }
  if($t eq "c"){return    ReadingsVal($e,"measured-temp",0)>20 ? "red" : "blue" }
  if($t eq "i"){return    ReadingsVal($e,"ValvePosition",0)    ? "on"  : "off"  }
  return "nix";
}
sub myTh($$$){#temp sensor
  my ($p,$e,$t) = @_;
  if($t eq "t"){return $p.ReadingsVal($e,"temperature","no")."-".ReadingsVal($e,"humidity","-");  }
  if($t eq "c"){return    ReadingsVal($e,"temperature",0)>20 ? "red" : "blue" }
  if($t eq "i"){return    ReadingsVal($e,"battery",0)    ? "ok"  : "no"  }
  return "nix";
}
sub myPr($$$){#Sensor Pressure
  my ($p,$e,$t) = @_;
  if($t eq "t"){return $p.ReadingsVal($e,"pressure","no")."-".ReadingsVal($e,"luminosity","-");  }
  if($t eq "c"){return    ReadingsVal($e,"luminosity",0)>1000 ? "green" : "red" }
  if($t eq "i"){return    ReadingsVal($e,"battery",0)        ? "ok"  : "no"  }
  return "nix";
}
sub myTx($$$){#text only
  my ($p,$e,$t) = @_;
  return $p;
}



die "sensortyperoutine"  bekommt einen prefix für die Zeile. ausserdem wird es 3-mal ausgeführt, je einmal für text, farbe und icon. das macht alles die allgemeine routine.

unter all  den Möglichkeiten gefällt mir die am besten...
die Konfiguration erfolgt dann im myUtil.