Gelöst: Frage zum Slider

Begonnen von Marc1993, 25 Mai 2014, 06:07:54

Vorheriges Thema - Nächstes Thema

Marc1993

Hallo,

Mein Projekt neigt sich dem Ende zu.  :)
Nach Investition von viel Geld und noch viel mehr Zeit wird mein Server langsam fertig.

Jetzt habe ich eine "Schönheitsfrage"  :D ;D


Beim einstellen des Dimmwertes über einen Slider, nimmt FHEM den neuen Wert an aber der Slider springt wieder auf den ursprünglichen Dimmwert bis der Dimmer den Dimmwert eingestellt hat. Dann springt der Slider auf den neu eingestellten Wert.

Nichts dramatisches, aber halt unschön  ::)


Einer nen Lösungsvorschlag? :)

martinp876

nicht direkt.
Der Vorteil aktuell ist, dass der Slider an dem Ort steht, den der Dimmer meldet - auch wenn er lokal geändert wird (am Taster).
Wenn du es von set in FHEM abhängig machst musst du dir hier eine Lösung einfallen lassen.
Du kannst das Reading pct ändern durch ein Notify - diesen Wert nimmt dann der Slider an

Marc1993

Das hatte ich schon probiert. Hatte auch ein notify erstellt, der einen am Taster geänderten Wert zurückmeldet. Bin dann in einer Schleife gelandet :D

Der HMLAN ging innerhalb von ein paar Sekunden in "overload".

martinp876

nutze nich pct als trigger des notify sondern level
Alternativ ändere das Reading mit readingsSingleUpdate($defs<device>,"pct",<wert>,0);
Die letzte '0' bedeuten "keinen Trigger bitte"

evtl mit UserReadings arbeiten

Marc1993

Das werde ich heute Nachmittag mal probieren.
Danke.

Marc1993

#5
Meine Lösung:

define wz_decke dummy
attr wz_decke setList state:slider,0,1,100
attr wz_decke webCmd state
define wz_decke_send notify wz_decke set CUL_HM_HM_LC_Dim1TPBU_FM_1A93E1_Sw % ;; attr wz_decke_ret disable 1 ;; attr wz_decke_tim disable 0
define wz_decke_ret notify CUL_HM_HM_LC_Dim1TPBU_FM_1A93E1_Sw:level:.* set wz_decke %
attr wz_decke_ret disable 0
define wz_decke_tim at +*00:00:05 attr wz_decke_ret disable 0 ;; attr wz_decke_tim disable 1\
attr wz_decke_tim disable 1\


Sicherlich nicht die eleganteste. Aber es geht :)

Marc1993

Jetzt würde ich gerne noch den "phy" den Dimmers im Dummy nutzen um ein Dimmlevel abhängiges Icon anzuzeigen.
Mit stateFormat geht es nicht. Dann habe ich das Problem wieder, das der Slider dann auch den "phy" Wert annimmt.

Wie könnt ich das lösen ohne den Slider zu beeinflussen?

martinp876

hast du schon
http://fhem.de/commandref.html#devStateIcon
durchgearbeitet? Das ist kein eigentliches HM problem - du solltest für solche Dinge evtl in CodeSchnipsel u.ä suche

Marc1993

Mein State hat ja 2 Formate.

Einmal:
"level: set_75" beim fahren des Dimmers auf 75%
und:
"75" Eingestelltes Dimmlevel


Wenn State ohne "level: set_" wäre, könnte ich das ja mit einer IF abfrage lösen und dann im Bereich 70-79 ein Icon anzeigen lassen.

martinp876

dann lösche das set_
my $lvl = ReadingsVal("name","level",0);;$lvl = s/set_//;;

Marc1993

Ich bekomme das leider nicht eingebaut :/

Es funktioniert nicht und mein slider springt beim anklicken direkt auf null. Also wenn ich klicke um den slider zu ziehen.

Marc1993

Hab es gelöst bekommen  ::)

define wz_decke_ico notify CUL_HM_HM_LC_Dim1TPBU_FM_1A93E1_Sw:pct.* {\
  my $pctwz = %EVTPART1;;\
  fhem("attr wz_decke devStateIcon .*:light_light_dim_00")  if($pctwz > -0.1) && ($pctwz < 9.9);;\
  fhem("attr wz_decke devStateIcon .*:light_light_dim_10")  if($pctwz > 10.1) && ($pctwz < 19.9);;\
  fhem("attr wz_decke devStateIcon .*:light_light_dim_20")  if($pctwz > 20.1) && ($pctwz < 29.9);;\
  fhem("attr wz_decke devStateIcon .*:light_light_dim_30")  if($pctwz > 30.1) && ($pctwz < 39.9);;\
  fhem("attr wz_decke devStateIcon .*:light_light_dim_40")  if($pctwz > 40.1) && ($pctwz < 49.9);;\
  fhem("attr wz_decke devStateIcon .*:light_light_dim_50")  if($pctwz > 50.1) && ($pctwz < 59.9);;\
  fhem("attr wz_decke devStateIcon .*:light_light_dim_60")  if($pctwz > 60.1) && ($pctwz < 69.9);;\
  fhem("attr wz_decke devStateIcon .*:light_light_dim_70")  if($pctwz > 70.1) && ($pctwz < 79.9);;\
  fhem("attr wz_decke devStateIcon .*:light_light_dim_80")  if($pctwz > 80.1) && ($pctwz < 89.9);;\
  fhem("attr wz_decke devStateIcon .*:light_light_dim_90")  if($pctwz > 90.1) && ($pctwz < 99.9);;\
fhem("attr wz_decke devStateIcon .*:light_light_dim_100")  if($pctwz > 99.9) && ($pctwz < 100.1);;\
}

martinp876

#12
prima.
aus effizienzgründen würde ich es so machen. In deinem Fall muss perl immer alle if prüfen - mit else darf nach einem treffer abgebrochen werden. Ausserdem kann man in jedem if eine Abfrage - auf den min-wert - weglassen.
Die Funktion sollte identisch sein.

define wz_decke_ico notify CUL_HM_HM_LC_Dim1TPBU_FM_1A93E1_Sw:pct.* {\
  my $pctwz = %EVTPART1;;\
  if   ($pctwz <   9.9){fhem("attr wz_decke devStateIcon .*:light_light_dim_00") }\
  elsif($pctwz <  19.9){fhem("attr wz_decke devStateIcon .*:light_light_dim_10") }\
  elsif($pctwz <  29.9){fhem("attr wz_decke devStateIcon .*:light_light_dim_20") }\
  elsif($pctwz <  39.9){fhem("attr wz_decke devStateIcon .*:light_light_dim_30") }\
  elsif($pctwz <  49.9){fhem("attr wz_decke devStateIcon .*:light_light_dim_40") }\
  elsif($pctwz <  59.9){fhem("attr wz_decke devStateIcon .*:light_light_dim_50") }\
  elsif($pctwz <  69.9){fhem("attr wz_decke devStateIcon .*:light_light_dim_60") }\
  elsif($pctwz <  79.9){fhem("attr wz_decke devStateIcon .*:light_light_dim_70") }\
  elsif($pctwz <  89.9){fhem("attr wz_decke devStateIcon .*:light_light_dim_80") }\
  elsif($pctwz <  99.9){fhem("attr wz_decke devStateIcon .*:light_light_dim_90") }\
  elsif($pctwz < 100.1){fhem("attr wz_decke devStateIcon .*:light_light_dim_100")}\
}


alternativ mit Berechnung - deterministische Laufzeit. ok, das if für 0 ist notwendig - wegen der "00" - die eigentlich unsauber ist (bei hundert hat man 3 zeichen ...
define wz_decke_ico notify CUL_HM_HM_LC_Dim1TPBU_FM_1A93E1_Sw:pct.* {\
  my $pctwz = int(%EVTPART1/10)*10;;\
  $pctwz = "00" if (!$pctwz);;\
  fhem("attr wz_decke devStateIcon .*:light_light_dim_$pctwz") }\
}


p.s.
Die letzte Zeile im ersten Vorschlag ist falsch. da sollte stehen
  else    {fhem("attr wz_decke devStateIcon .*:light_light_dim_100")}\

die Abfrage auf <100.1 ist sinnlos. Falls du andere Rückgaben für pctwz erwartest solltest du ein else als default einbauen - mit einem "error-icon"

Marc1993

Hab deinen ersten Vorschlag jetzt mal so übernommen. Funktioniert prima.
Danke :)