Problem in FHEMWEB: Rekursiver cmdalias für Leuchten "set"

Begonnen von vbs, 07 September 2021, 22:54:21

Vorheriges Thema - Nächstes Thema

vbs

Hi Ihr,

folgendes Problem:
Ich hab einen HM-Zwischenstecker-Dimmer an dem eine Leuchte hängt, mit einer dimmbaren E17-Filament-LED-Birne. Das Problem ist, dass die zwar dimmbar ist, die Kennlinie jedoch alles andere als linear ist. Also wenn man von 100% auf 50% runter dimmt, dann tut sich erstmal nicht viel. Erst wenn man unter 30% dimmt, passiert wirklich was. Der dimmbare Bereich liegt effektiv zwischen 15% und 30%.

Das ist nun natürlich doof wenn man das selbst berücksichtigen muss beim Bedienen in FHEM. Gerade wenn man mehrere Leuchten zusammen auf z.B. 50% dimmen möchte, ist das doof, wenn eine so eine abweichende Kennlinie hat.

Nur war meine Idee, ein cmdalias anzulegen, welches sozusagen, die "set pct"-Kommandos für das entsprechende Device "abfängt", den Wert korrigiert und erst dann weiterleitet. Sieht dann so aus:
defmod sys_ca_lightSet cmdalias set wz_lightRed pct .* AS {setLightLedBulb($EVENT)}

Die Funktion sieht dann so aus:
sub setLightLedBulb {
    my ($event) = @_;

    Log 3, "setLightLedBulb: event: $event";
   
    my @params = split " ", $event;
   
    my $device = shift @params;
    my $set = shift @params;
    my $raw = shift @params;
    my $extraparams = join " ", @params;
   
    Log 3, "setLightLedBulb: Device: $device Raw: $raw";
    my $val = getLedBulbCurveValue($raw);
   
    my $cmd = "set $device pct $val $extraparams";
    Log 3, "setLightLedBulb: cmd: $cmd";
    fhem($cmd);
}


Die Funktion "getLedBulbCurveValue" nimmt den linearen Wunschwert entgegen (z.B. 50) und gibt den an die Kennwerte angeglichenen Wert zurück (z.B. 23).

Die Idee ist, dass diese Korrektur ohne weitere Anpassungen "global" in FHEM für diese Leuchte funktioniert, da es für alle "set pct"-Befehle an das Device greifen sollte. Eigentlich ist das auch so.

Jedoch zwei Probleme sind aufgefallen:
1. Einerseits merkt FHEM, dass das Ganze ja einen rekursiven Aufruf darstellt, da ja der cmdalias am Ende auch wieder "set pct" aufruft. FHEM meldet dann "cmdalias sys_ca_lightSet called recursively, skipping execution". Ist das irgendwie ein Problem? Generell stört mich das nicht, wenn es nur geloggt wird und aber korrekt gehandhabt wird.

2. Viel schlimmer: Ich hab für alle meine HM-Dimmer-Leuchten "webcmd pct" gesetzt, so dass in FHEMWEB ein Slider für die Helligkeit angezeigt wird. Jetzt nach anlegen des cmdalias sind die Slider in FHEMWEB verschwunden und es taucht stattdessen nur der String "pct" auf. Also offenbar stört das cmdalias das FHEMWEB? Versteht jemand, woran das liegt? Und viel wichtiger: gibt es dafür wohl eine Lösung?

List der Leucht:
Internals:
   DEF        2072A5
   FUUID      5c42ef58-f33f-af31-0ab8-6670dd79f4bd018b
   IODev      sys_culHm
   LASTInputDev sys_culHm
   MSGCNT     1
   NAME       wz_lightRed
   NR         120
   NTFY_ORDER 50-wz_lightRed
   STATE      on
   TYPE       CUL_HM
   chanNo     01
   disableNotifyFn 1
   lastMsg    No:EA - t:10 s:2072A5 d:F15544 0601C8003A
   peerList   wz_virtBtnLight_0_1,wz_virtBtnLight_0_2,wz_virtBtnLight_100_1,wz_virtBtnLight_100_2,wz_virtBtnLight_RDC_100_10,wz_virtBtnLight_RDC_100_3
   protLastRcv 2021-09-07 21:52:29
   protRcv    1 last_at:2021-09-07 21:52:29
   protSnd    2 last_at:2021-09-07 21:52:29
   protState  CMDs_done
   rssi_at_sys_culHm cnt:1 min:-58 max:-58 avg:-58 lst:-58
   rssi_sys_culHm cnt:1 min:-58 max:-58 avg:-58 lst:-58
   sys_culHm_MSGCNT 1
   sys_culHm_RAWMSG 0501003AEAA4102072A5F155440601C8003A
   sys_culHm_RSSI -58
   sys_culHm_TIME 2021-09-07 21:52:29
   READINGS:
     2021-09-07 21:47:39   CommandAccepted yes
     2019-07-20 10:25:52   D-firmware      2.2
     2019-07-20 10:25:52   D-serialNr      KEQ0041260
     2021-09-07 21:52:29   IODev           sys_culHm
     2019-07-20 10:26:51   PairedTo        0xF15544
     2019-07-20 10:26:51   R-pairCentral   0xF15544
     2019-07-20 10:26:52   R-powerUpAction off
     2019-07-20 10:26:54   R-wz_virtBtnLight_0_1-lgActionTypeDim toggelDim
     2019-07-20 10:26:54   R-wz_virtBtnLight_0_1-lgOnLevel 100 %
     2019-07-20 10:26:54   R-wz_virtBtnLight_0_1-shActionTypeDim jmpToTarget
     2019-07-20 10:26:54   R-wz_virtBtnLight_0_1-shOnLevel 100 %
     2019-07-20 10:26:57   R-wz_virtBtnLight_0_2-lgActionTypeDim toggelDim
     2019-07-20 10:26:57   R-wz_virtBtnLight_0_2-lgOnLevel 100 %
     2019-07-20 10:26:57   R-wz_virtBtnLight_0_2-shActionTypeDim jmpToTarget
     2019-07-20 10:26:57   R-wz_virtBtnLight_0_2-shOnLevel 100 %
     2019-07-20 10:26:55   R-wz_virtBtnLight_100_1-lgActionTypeDim toggelDim
     2019-07-20 10:26:55   R-wz_virtBtnLight_100_1-lgOnLevel 100 %
     2019-07-20 10:26:55   R-wz_virtBtnLight_100_1-shActionTypeDim jmpToTarget
     2019-07-20 10:26:55   R-wz_virtBtnLight_100_1-shOnLevel 100 %
     2019-07-20 10:27:00   R-wz_virtBtnLight_100_2-lgActionTypeDim toggelDim
     2019-07-20 10:27:00   R-wz_virtBtnLight_100_2-lgOnLevel 100 %
     2019-07-20 10:27:00   R-wz_virtBtnLight_100_2-shActionTypeDim jmpToTarget
     2019-07-20 10:27:00   R-wz_virtBtnLight_100_2-shOnLevel 100 %
     2019-07-20 10:27:01   R-wz_virtBtnLight_RDC_100_10-lgActionTypeDim toggelDim
     2019-07-20 10:27:01   R-wz_virtBtnLight_RDC_100_10-lgOnLevel 100 %
     2019-07-20 10:27:01   R-wz_virtBtnLight_RDC_100_10-shActionTypeDim jmpToTarget
     2019-07-20 10:27:01   R-wz_virtBtnLight_RDC_100_10-shOnLevel 100 %
     2019-07-20 10:26:58   R-wz_virtBtnLight_RDC_100_3-lgActionTypeDim toggelDim
     2019-07-20 10:26:58   R-wz_virtBtnLight_RDC_100_3-lgOnLevel 100 %
     2019-07-20 10:26:58   R-wz_virtBtnLight_RDC_100_3-shActionTypeDim jmpToTarget
     2019-07-20 10:26:58   R-wz_virtBtnLight_RDC_100_3-shOnLevel 100 %
     2019-07-20 10:26:51   RegL_00.        00:00 02:01 0A:F1 0B:55 0C:44 15:FF 16:00
     2019-07-20 10:26:52   RegL_01.        00:00 30:06 32:50 33:64 34:4B 35:50 56:00 57:24
     2019-07-20 10:26:54   RegL_03.wz_virtBtnLight_0_1 00:00 01:00 02:00 03:00 04:32 05:64 06:00 07:FF 08:00 09:FF 0A:01 0B:55 0C:55 0D:55 0E:20 0F:00 10:00 11:C8 12:00 13:0A 14:0A 15:00 16:C8 17:0A 18:0A 19:04 1A:04 81:00 82:00 83:00 84:32 85:64 86:00 87:FF 88:00 89:FF 8A:26 8B:14 8C:52 8D:63 8E:20 8F:00 90:14 91:C8 92:0A 93:05 94:05 95:00 96:C8 97:0A 98:0A 99:04 9A:04
     2019-07-20 10:26:57   RegL_03.wz_virtBtnLight_0_2 00:00 01:00 02:00 03:00 04:32 05:64 06:00 07:FF 08:00 09:FF 0A:01 0B:55 0C:55 0D:55 0E:20 0F:00 10:00 11:C8 12:00 13:14 14:14 15:00 16:C8 17:0A 18:0A 19:04 1A:04 81:00 82:00 83:00 84:32 85:64 86:00 87:FF 88:00 89:FF 8A:26 8B:14 8C:52 8D:63 8E:20 8F:00 90:14 91:C8 92:0A 93:05 94:05 95:00 96:C8 97:0A 98:0A 99:04 9A:04
     2019-07-20 10:26:55   RegL_03.wz_virtBtnLight_100_1 00:00 01:00 02:00 03:00 04:32 05:64 06:00 07:FF 08:00 09:FF 0A:01 0B:22 0C:22 0D:22 0E:20 0F:00 10:00 11:C8 12:00 13:0A 14:0A 15:00 16:C8 17:0A 18:0A 19:04 1A:04 81:00 82:00 83:00 84:32 85:64 86:00 87:FF 88:00 89:FF 8A:26 8B:14 8C:52 8D:63 8E:20 8F:00 90:14 91:C8 92:0A 93:05 94:05 95:00 96:C8 97:0A 98:0A 99:04 9A:04
     2019-07-20 10:27:00   RegL_03.wz_virtBtnLight_100_2 00:00 01:00 02:00 03:00 04:32 05:64 06:00 07:FF 08:00 09:FF 0A:01 0B:22 0C:22 0D:22 0E:20 0F:00 10:00 11:C8 12:00 13:14 14:14 15:00 16:C8 17:0A 18:0A 19:04 1A:04 81:00 82:00 83:00 84:32 85:64 86:00 87:FF 88:00 89:FF 8A:26 8B:14 8C:52 8D:63 8E:20 8F:00 90:14 91:C8 92:0A 93:05 94:05 95:00 96:C8 97:0A 98:0A 99:04 9A:04
     2019-07-20 10:27:01   RegL_03.wz_virtBtnLight_RDC_100_10 00:00 01:00 02:00 03:00 04:32 05:64 06:00 07:FF 08:00 09:FF 0A:01 0B:22 0C:22 0D:22 0E:20 0F:00 10:00 11:C8 12:00 13:2A 14:2A 15:00 16:C8 17:0A 18:0A 19:04 1A:04 81:00 82:00 83:00 84:32 85:64 86:00 87:FF 88:00 89:FF 8A:26 8B:14 8C:52 8D:63 8E:20 8F:00 90:14 91:C8 92:0A 93:05 94:05 95:00 96:C8 97:0A 98:0A 99:04 9A:04
     2019-07-20 10:26:58   RegL_03.wz_virtBtnLight_RDC_100_3 00:00 01:00 02:00 03:00 04:32 05:64 06:00 07:FF 08:00 09:FF 0A:01 0B:22 0C:22 0D:22 0E:20 0F:00 10:00 11:C8 12:00 13:1E 14:1E 15:00 16:C8 17:0A 18:0A 19:04 1A:04 81:00 82:00 83:00 84:32 85:64 86:00 87:FF 88:00 89:FF 8A:26 8B:14 8C:52 8D:63 8E:20 8F:00 90:14 91:C8 92:0A 93:05 94:05 95:00 96:C8 97:0A 98:0A 99:04 9A:04
     2021-09-07 21:47:39   _autoCmd_smartlight 100
     2020-10-20 23:25:15   cfgState        ok
     2021-09-07 21:52:29   commState       CMDs_done
     2021-09-07 21:52:29   deviceMsg       on (to VCCU)
     2021-09-07 21:52:29   dim             stop:on
     2021-09-07 21:52:29   level           100
     2020-04-26 01:00:14   levelMissed     desired:70.5
     2021-09-07 21:52:29   overheat        off
     2021-09-07 21:52:29   overload        off
     2021-09-07 21:52:29   pct             100
     2021-09-07 21:52:16   peerList        wz_virtBtnLight_0_1,wz_virtBtnLight_0_2,wz_virtBtnLight_100_1,wz_virtBtnLight_100_2,wz_virtBtnLight_RDC_100_10,wz_virtBtnLight_RDC_100_3
     2021-09-07 21:52:29   recentStateType info
     2021-09-07 21:52:29   reduced         off
     2021-09-07 21:52:29   state           on
     2021-09-07 21:52:29   timedOn         off
     2021-09-07 21:46:41   trigLast        fhem:02
   helper:
     HM_CMDNR   234
     cSnd       ,01F155442072A5010E
     lastMsgTm  1631044349.97052
     mId        00A4
     peerFriend peerSens,peerVirt
     peerIDsState complete
     peerOpt    3:dimmer
     regLst     0,1,3p
     rxType     1
     supp_Pair_Rep 0
     cmds:
       TmplKey    wz_virtBtnLight_0_1,wz_virtBtnLight_0_2,wz_virtBtnLight_100_1,wz_virtBtnLight_100_2,wz_virtBtnLight_RDC_100_10,wz_virtBtnLight_RDC_100_3:no:1631044336.20373
       TmplTs     1631044336.20373
       cmdKey     1:1:0::wz_lightRed:00A4:01:wz_virtBtnLight_0_1,wz_virtBtnLight_0_2,wz_virtBtnLight_100_1,wz_virtBtnLight_100_2,wz_virtBtnLight_RDC_100_10,wz_virtBtnLight_RDC_100_3
       cmdLst:
         assignHmKey noArg
         clear      [(readings|trigger|register|oldRegs|rssi|msgEvents|{msgErrors}|attack|all)]
         deviceRename -newName-
         down       'change:'[(0..100;1|{10})] [(-ontime-|{0})] [(-ramptime-|{2.4})] 'ontime: 0 = forever'
         eventL     -peer- -cond-
         eventS     -peer- -cond-
         fwUpdate   -filename- [-bootTime-]
         getConfig  noArg
         getDevInfo noArg
         getRegRaw  (List0|List1|List2|List3|List4|List5|List6|List7) [-peerChn-]
         getVersion noArg
         inhibit    [(on|{off})]
         off        noArg
         old        noArg
         on         noArg
         on-for-timer -ontime- [(-ramptime-|{})]
         on-till    -time- [(-ramptime-|{})]
         pair       noArg
         pct        (-value-|old) [(-ontime-|{0})] [(-ramptime-|{2.4})] 'ontime: 0 = forever'
         peerBulk   -peer1,peer2,...- [({set}|unset)]
         peerIODev  [IO] -btn- [({set}|unset)] 'not for future use'
         peerSmart  -peerOpt-
         press      [(long|{short})] [(-peer-|{self01})] [(-repCount-|{0})] [(-repDelay-|{0.25})]
         pressL     [(-peer-|{self01})]
         pressS     [(-peer-|{self01})]
         raw        -data- [...]
         regBulk    -list-.-peerChn- -addr1:data1- [-addr2:data2-]...
         regSet     [(prep|{exec})] -regName- -value- [-peerChn-]
         reset      noArg
         sign       [(on|{off})]
         statusRequest noArg
         stop       noArg
         toggle     noArg
         tplDel     -tplDel-
         tplSet_0   -tplChan-
         tplSet_wz_virtBtnLight_0_1 -tplPeer-
         tplSet_wz_virtBtnLight_0_2 -tplPeer-
         tplSet_wz_virtBtnLight_100_1 -tplPeer-
         tplSet_wz_virtBtnLight_100_2 -tplPeer-
         tplSet_wz_virtBtnLight_RDC_100_10 -tplPeer-
         tplSet_wz_virtBtnLight_RDC_100_3 -tplPeer-
         unpair     noArg
         up         'change:'[(0..100;1|{10})] [(-ontime-|{0})] [(-ramptime-|{2.4})] 'ontime: 0 = forever'
       lst:
         condition  slider,0,1,255
         peer       wz_virtBtnLight_0_1,wz_virtBtnLight_0_2,wz_virtBtnLight_100_1,wz_virtBtnLight_100_2,wz_virtBtnLight_RDC_100_10,wz_virtBtnLight_RDC_100_3
         peerOpt    bd_doorContact,bd_virtTempWeather,bd_wandTaster_Btn1,bd_wandTaster_Btn2,fl_benPowerMeter_SenF,fl_benPowerMeter_SenI,fl_benPowerMeter_SenPwr,fl_benPowerMeter_SenU,fl_eingangTaster_Btn1,fl_eingangTaster_Btn2,fl_lightChainVirt,fl_lightChrystalVirt,fl_virtActor_entrance_Btn1,fl_virtActor_entrance_Btn2,fl_virtActor_wall_Btn1,fl_virtActor_wall_Btn2,fl_virtBtnLight_0_1,fl_virtBtnLight_0_2,fl_virtBtnLight_100_03,fl_virtBtnLight_100_1,fl_virtBtnLight_100_2,fl_virtBtnLight_30_2,fl_virtBtnLight_30_3,fl_virtBtnLight_55_0_2,ku_therme_SenF,ku_therme_SenI,ku_therme_SenPwr,ku_therme_SenU,ku_virtActor_Btn1,ku_virtActor_Btn2,ku_wandTaster_Btn1,ku_wandTaster_Btn2,sz_bettTaster_Btn1,sz_bettTaster_Btn2,sz_lightAmbientVirt,sz_lightSpotVirt,sz_presenceTaster_Btn1,sz_presenceTaster_Btn2,sz_virtActor_bed_Btn1,sz_virtActor_bed_Btn2,sz_virtActor_entrance_Btn1,sz_virtActor_entrance_Btn2,sz_virtBtnLight_0_1,sz_virtBtnLight_0_2,sz_virtBtnLight_100_1,sz_virtBtnLight_70_2,sz_wndContact,wz_lightCrystalVirt,wz_lightDeskVirt,wz_lightSpotVirt,wz_virtActor_Btn1,wz_virtActor_Btn2,wz_virtBtnLight_0_1,wz_virtBtnLight_0_2,wz_virtBtnLight_100_1,wz_virtBtnLight_100_2,wz_virtBtnLight_RDC_100_10,wz_virtBtnLight_RDC_100_3,wz_wandTaster_Btn1,wz_wandTaster_Btn2,wz_wndContact
         tplChan   
         tplDel     
         tplPeer    DimOff_long,DimOff_short,DimOn_long,DimOn_short,SwCondAbove_long,SwCondAbove_short,SwCondBelow_long,SwCondBelow_short,SwOnCond_long,SwOnCond_short,motionOnDim_long,motionOnDim_short
       rtrvLst:
         cmdList    [({short}|long)]
         deviceInfo [({short}|long)]
         list       [({normal}|full)]
         param      -param-
         reg        -addr- -list- [-peerChn-]
         regList    noArg
         regTable   noArg
         regVal     -addr- -list- [-peerChn-]
         saveConfig [-filename-]
         tplInfo    noArg
     dir:
       cur        stop
     expert:
       def        1
       det        0
       raw        1
       tpl        0
     io:
       flgs       0
       newChn     +2072A5,00,00,00
       nextSend   1631044350.26182
       rxt        0
       vccu       VCCU
       p:
         2072A5
         00
         00
         00
       prefIO:
         sys_culHm
     mRssi:
       mNo        EA
       io:
         sys_culHm:
           -52
           -52
     peerIDsH:
       00000000   broadcast
       F1554416   wz_virtBtnLight_0_1
       F155441A   wz_virtBtnLight_100_1
       F155441B   wz_virtBtnLight_0_2
       F155441C   wz_virtBtnLight_RDC_100_3
       F155441D   wz_virtBtnLight_100_2
       F155441F   wz_virtBtnLight_RDC_100_10
     prt:
       bErr       0
       sProc      0
       rspWait:
       tryMsg:
     q:
       qReqConf   
       qReqStat   
     role:
       chn        1
       dev        1
       prs        1
     rpt:
       IO         sys_culHm
       flg        A
       ts         1631044349.97052
       ack:
         HASH(0x55ff9d7e9350)
         EA8002F155442072A500
     rssi:
       at_sys_culHm:
         avg        -58
         cnt        1
         lst        -58
         max        -58
         min        -58
       sys_culHm:
         avg        -58
         cnt        1
         lst        -58
         max        -58
         min        -58
     tmpl:
Attributes:
   IOgrp      VCCU:sys_culHm
   alias      WZ Rot
   assistantName Rot
   autoReadReg 4_reqStatus
   devStateIcon { VBSUtils_GetDimmerDevStateIcon($name) }
   dimSteps   17,23,40,100
   event-on-change-reading pct,state,dim
   event-on-update-reading 1
   expert     defReg,rawReg
   firmware   2.2
   group      Licht
   icon       light_floor_lamp
   model      HM-LC-DIM1T-PL-2
   peerIDs    00000000,F1554416,F155441A,F155441B,F155441C,F155441D,F155441F
   room       GoogleAssistant,Wohnzimmer
   serialNr   KEQ0041260
   subType    dimmer
   userattr   dimSteps
   webCmd     pct


Wenn ich das cmdalias disable und dann FHEM neu starte, dann legt sich das Problem wieder und die Slider tauchen in FHEMWEB wieder auf. Screenshots im Anhang.

Hat dazu jemand eine Idee? Danke!

rudolfkoenig

Zitat1. Einerseits merkt FHEM, dass das Ganze ja einen rekursiven Aufruf darstellt [...] Ist das irgendwie ein Problem?
Nicht wirklich, man kann es mit "attr cmdalias verbose 2" abstellen.

Zitat2. Viel schlimmer: [...] Jetzt nach anlegen des cmdalias sind die Slider in FHEMWEB verschwunden [...] Also offenbar stört das cmdalias das FHEMWEB?
So einfach ist das nicht, mit dem folgenden Test-Konfig gibt es keine Probleme:
define w FHEMWEB 8083
defmod d1 dummy
attr d1 setList pct:slider,1,1,100 on off
attr d1 webCmd pct
define c1 cmdalias set d1 pct .* AS set d1 pct 7

Und ich bin grad zu faul dein list in "list -r" umzuwandeln, damit ich es nachstellen kann :)

vbs

Hi Rudi,

ich sitze auch gerade wieder dran und ich bin mir mittlerweile einigermaßen sicher, dass das mit dem cmdalias eine falsche Fährte war, sorry! Ich kann das Phänomen jetzt zumindest sicher reproduzieren und es tritt auch auf, nachdem ich das cmdalias komplett gelöscht habe.

Ich hab momentan noch gar keine Idee, was dahinter steckt. aber es fehlen dann nicht nur bei den Leuchten die Helligkeitsslider, sondern es fehlen offenbar alle Slider in FHEMWEB (wie in den Screenshots). Zum Beispiel auch bei dem Lautstärkeregler meines Verstärkers.

Ich muss erstmal noch selbst suchen, denke ich. Wenn ich einen Anhaltspunkt habe, melde ich mich nochmal. Nochmal sorry für die (vemutl.) falsche Fährte mit dem cmdalias :/

Ich weiß bzgl. dieser Slider in FHEMWEB gar nicht, wo ich anfangen könnte zu suchen. Kannst du mir einen groben Fingerzeig geben, in welcher Richtung ich ermitteln könnte? Wie könnte FHEMWEB auf die Idee kommen, statt des Slider-Widgets nur den String "pct" anzuzeigen?

EDIT:
Achso und nochmals sorry: "list -r" kannte ich noch nicht.

vbs

Argh, ok, ich weiß, woran es liegt. Ich hatte mir diese besagte Funktion geschrieben:

sub getLedBulbCurveValue {
    my ($x) = @_;

    %data = (100,   100,
         90,    46,
         50,    26,
         25,    17,
         20,    15,
         10,    14,
         0,     0,
        );
       
    return undef if (!exists($data{0}));
    return undef if (!exists($data{100}));
   
    my @sortk = sort { $data{$a} <=> $data{$b} } keys %data;
   
    for my $i (1 .. $#sortk) {
        my $in_lower = $sortk[$i - 1];
        my $in_upper = $sortk[$i];
        my $lower = $data{$in_lower};
        my $upper = $data{$in_upper};
       
        if ($in_lower <= $x && $in_upper >= $x) {
            my $k = $x - $in_lower;
            my $diff = $in_upper - $in_lower;
           
            my $fac = $k / $diff;
           
            my $sol = $lower + (($upper - $lower) * $fac);
            return $sol;
        }
    }
}

Leider fehlt bei der Deklaration der Variable "data" das "my", so daß ich damit die in FHEM global existierende Variable "data" plätte und dann eben ziemlich komische Sachen passieren...  :o