FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: griessbx am 15 März 2021, 18:32:23

Titel: Rechnen in Fhem
Beitrag von: griessbx am 15 März 2021, 18:32:23
Hallo, ich möchte eigentlich etwas ganz einfaches, bekomme es aber nicht hin. Mit Hilfe eines DOIFS Abhängig von einer Bedingung in einem Dummy einen Wert hoch oder runterzählen. Ach nach studieren des Forums bin ich nicht viel schlauer.
Hier erstmal meine Definitionen:
defmod Sonne_Status dummy
attr Sonne_Status DbLogExclude .*
attr Sonne_Status event-on-change-reading .*
attr Sonne_Status icon weather_sunset
attr Sonne_Status readingList Sonne_01 Sonne_02
attr Sonne_Status room Logik->Dummy
attr Sonne_Status setList Sonne_01 Sonne_02


defmod Rollo_DOIF_Sonne DOIF ##\
(\
[Sonne_01:ANALOG_A0] >= 160 ) ( set Sonne_Status Sonne_01 { ReadingsVal("Sonne_Status","Sonne_01",0) + 1  }\
)\
DOELSEIF (\
[Sonne_01:ANALOG_A0] < 160 and [Sonne_Status:Sonne_01] > 0 ) (set Sonne_Status Sonne_01 { ReadingsVal("Sonne_Status","Sonne_01",0) - 1  }\
)
attr Rollo_DOIF_Sonne DbLogExclude .*
attr Rollo_DOIF_Sonne disable 0
attr Rollo_DOIF_Sonne do always
attr Rollo_DOIF_Sonne event-on-change-reading .*
attr Rollo_DOIF_Sonne icon fts_shutter_shadding_run
attr Rollo_DOIF_Sonne room Logik->DOIF


Als Resultat erhalte ich in Sonne_01 "{ ReadingsVal("Sonne_Status","Sonne_01",0) - 1 }"
Wo liegt mein Denkfehler
Danke in Voraus, Gruß Roland
Titel: Antw:Rechnen in Fhem
Beitrag von: xenos1984 am 15 März 2021, 19:08:26
"Set magic" erfordert runde Klammern innerhalb der geschweiften für Perl-Ausdrücke:

http://fhem.de/commandref.html#set


set Sonne_Status Sonne_01 {( ReadingsVal("Sonne_Status","Sonne_01",0) + 1 )}


(ungetestet)
Titel: Antw:Rechnen in Fhem
Beitrag von: Sany am 16 März 2021, 09:02:30
Hallo Roland,

sieh commandref zu DOIF:
ZitatBerechnungen im Ausführungsteil   

Berechnungen können in geschweiften Klammern erfolgen. Aus Kompatibilitätsgründen, muss die Berechnung unmittelbar mit einer runden Klammer beginnen. Innerhalb der Perlberechnung können Readings, Status oder Internals wie gewohnt in eckigen Klammern angegeben werden.

Anwendungsbeispiel: Es soll ein Vorgabewert aus zwei verschiedenen Readings ermittelt werden und an das set Kommando übergeben werden:

define di_average DOIF ([08:00]) (set TH_Modul desired {([default:temperature]+[outdoor:temperature])/2})
attr di_average do always
Da steht exakt, was Du machen möchtest. Meiner Meinung nach solltest Du versuchen, wenn Du DOIF nutzt, dann bei DOIF-Syntax zu bleiben und nicht mit fhem-code mischen (solange es geht, manchmal muss man das). Und wenn es komplex und mit Perl-code sein muss dann bietet sich DOIF im Perlmodus an.

Weiterhin kannst Du den dummy sparen, da Du ja nur 2 Readings beeinflusst. Das kannst Du auch direkt im DOIF machen. Macht das Ganze evtl. übersichtlicher.

Viel Erfolg!
Titel: Antw:Rechnen in Fhem
Beitrag von: griessbx am 16 März 2021, 17:32:51
Danke, so klappt es