[Gelöst] Numerischer Vergleich in DOIF funktioniert nicht.

Begonnen von juemuc, 15 April 2017, 19:20:07

Vorheriges Thema - Nächstes Thema

juemuc

Hallo,

ich habe die "Waschmachinenprüfung" aus https://forum.fhem.de/index.php/topic,39498.0.html in abgewandelter Form übernommen. Allerdings funktioniert bei mir die DOIF-Prüfung nicht. Ich erhalte folgende Fehlermeldung:
Zitatcondition c01: Can't modify non-lvalue subroutine call in scalar assignment, line 1, at EOF
Ich habe folgende Definitionen:
Waschmaschine:
defmod Waschmaschine dummy
attr Waschmaschine userattr configPowerDone
attr Waschmaschine configPowerDone 3.00
attr Waschmaschine devStateIcon Aus:general_aus@black An:scene_washing_machine@red
attr Waschmaschine event-on-change-reading .*
attr Waschmaschine event-on-update-reading power
attr Waschmaschine icon scene_washing_machine@black
attr Waschmaschine room Testraum
attr Waschmaschine stateFormat { my $state = ReadingsVal($name, "state", "");; my $power = ReadingsVal($name, "power", "");; if($state eq 'on') { "An" } elsif($state eq "done") { "Fertig" } elsif($state eq "running") { "Läuft ($power W)" } else { "Aus" } }

setstate Waschmaschine Läuft (40.00 W)
setstate Waschmaschine 2017-04-15 19:09:34 power 40.00
setstate Waschmaschine 2017-04-15 18:23:27 state running


Übergabe der Daten von der Steckdose (AVM)
defmod Waschmaschine.Sync.DOIF DOIF ([FBDECT_FB_08761_0316841:power]) \
({my $W_POWER = '[FBDECT_FB_08761_0316841:power]';;;;\
  $W_POWER=~ s/ W//g;;;;\
  fhem ("setreading Waschmaschine power $W_POWER")})\

attr Waschmaschine.Sync.DOIF do always
attr Waschmaschine.Sync.DOIF room Testraum

setstate Waschmaschine.Sync.DOIF cmd_1
setstate Waschmaschine.Sync.DOIF 2017-04-15 19:13:34 Device FBDECT_FB_08761_0316841
setstate Waschmaschine.Sync.DOIF 2017-04-15 19:13:34 cmd 1
setstate Waschmaschine.Sync.DOIF 2017-04-15 19:13:34 cmd_event FBDECT_FB_08761_0316841
setstate Waschmaschine.Sync.DOIF 2017-04-15 19:13:34 cmd_nr 1
setstate Waschmaschine.Sync.DOIF 2017-04-15 19:13:34 e_FBDECT_FB_08761_0316841_power 0.00 W
setstate Waschmaschine.Sync.DOIF 2017-04-15 19:13:34 state cmd_1


Verarbeitung der Daten im DOIF mit Fehler
defmod Programm.Waschmaschine.DOIF DOIF ([Waschmaschine:power] = '0.00') \
(set Waschmaschine off,\
set Testdummy off) \
DOELSEIF \
([Waschmaschine:power] > '0.00' and \
  [Waschmaschine:state] eq 'off' and\
  [Waschmaschine:power] <= AttrVal("Waschmaschine", \
                           "configPowerDone", 3)) \
(set Waschmaschine on,\
  set Testdummy on)\
DOELSEIF\
([Waschmaschine:power] => AttrVal("Waschmaschine", \
                           "configPowerDone", 3)) \
(set Waschmaschine running,\
  set Testdummy running) \
DOELSEIF \
([Waschmaschine:power] <= AttrVal("Waschmaschine", \
                           "configPowerDone", 3) and \
  [Waschmaschine:state] eq 'running') \
(set Waschmaschine done,\
  set Testdummy done)
attr Programm.Waschmaschine.DOIF room Testraum

setstate Programm.Waschmaschine.DOIF initialized
setstate Programm.Waschmaschine.DOIF 2017-04-15 19:16:27 Device Waschmaschine
setstate Programm.Waschmaschine.DOIF 2017-04-15 19:15:58 cmd 0
setstate Programm.Waschmaschine.DOIF 2017-04-15 19:16:27 e_Waschmaschine_power 0.00
setstate Programm.Waschmaschine.DOIF 2017-04-15 19:16:27 e_Waschmaschine_state off
setstate Programm.Waschmaschine.DOIF 2017-04-15 19:16:27 error condition c01: Can't modify non-lvalue subroutine call in scalar assignment, line 1, at EOF\

setstate Programm.Waschmaschine.DOIF 2017-04-15 19:15:58 state initialized


Wenn ich die Vergleichsoperanden auf die Stringvarianten ändere ist zwar der Fehler weg aber das Ergebnis falsch, da ja dann '10.00' ge '3.00' falsch ist.

Wo liegt der Fehler? Ich bitte um Hilfe.

juemuc
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

Ellert


kumue

ich würde erstmal beim numerischen Vergelich die Hochkommas weglassen und bei der Prüfung auf Gleichheit das = verdoppeln...
also
defmod Programm.Waschmaschine.DOIF DOIF ([Waschmaschine:power] == 0.00) \
(set Waschmaschine off,\
set Testdummy off) \
DOELSEIF \
([Waschmaschine:power] > 0.00 and \

juemuc

Danke.

Wer lesen kann ist klar im Vorteil.  8)

Schon funktioniert es.

Viele Grüße und schöne Ostern

juemuc
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).