FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: netpirat am 16 November 2025, 14:40:30

Titel: Einfügen
Beitrag von: netpirat am 16 November 2025, 14:40:30
Hallo,

wenn ich mit Masse etwas einfügen möchte, zum Beispiel ein Userreading;

Status:StatusStellwert.* { if (ReadingsNum($name,'StatusStellwert',0) == 0) { "Aus" }
elsif (ReadingsNum($name,'StatusStellwert',0) > 0 && ReadingsNum($name,'StatusStellwert',0) < 100) { "Verfahren" }
elsif (ReadingsNum($name,'StatusStellwert',0) == 100) { "An" }
else { "Status unbekannt" } } ,
OnBeginn:Status.* { if(ReadingsVal($name,'Status',0) eq "An") {time() } else {ReadingsVal($name,'OnBeginn',0)}   },
OffEnde:Status.* { if(ReadingsVal($name,'Status',0) eq "Aus") {time() } else {ReadingsVal($name,'OffEnde',0)}  },
Betriebszeit:OffEnde.* { if(ReadingsVal($name,'Status',0) eq "Aus") {(ReadingsNum($name, "OffEnde", 0))  - (ReadingsNum($name, "OnBeginn", 0))  } },
Zwischenwert:Betriebszeit.* { if(ReadingsVal($name,'Status',0) eq "Aus")  { ((ReadingsNum($name,'Betriebszeit',0) / 2 ) +
ReadingsNum($name,'GesamtZeit_neu',0) )} else {ReadingsNum($name,'GesamtZeit_neu',0)} },
GesamtZeit_neu:Zwischenwert.*  { (ReadingsNum($name,'Zwischenwert',0)  ) },
GesamtZeit:GesamtZeit_neu.* { ((sprintf("%.2f",ReadingsNum($name,'GesamtZeit_neu',0)  / 3600) ." h")) },
cycle:Status.* {if (ReadingsVal($name,'Status',0) eq "An") {(ReadingsNum($name,'cycle',0) + 1  )}
else {(ReadingsNum($name,'cycle',0) )}

Diese versucher ich dann mit

attr HEI_.* userReadings Status:StatusStellwert.* { if (ReadingsNum($name,'StatusStellwert',0) == 0) { "Aus" }
elsif (ReadingsNum($name,'StatusStellwert',0) > 0 && ReadingsNum($name,'StatusStellwert',0) < 100) { "Verfahren" }
elsif (ReadingsNum($name,'StatusStellwert',0) == 100) { "An" }
else { "Status unbekannt" } } ,
OnBeginn:Status.* { if(ReadingsVal($name,'Status',0) eq "An") {time() } else {ReadingsVal($name,'OnBeginn',0)}   },
OffEnde:Status.* { if(ReadingsVal($name,'Status',0) eq "Aus") {time() } else {ReadingsVal($name,'OffEnde',0)}  },
Betriebszeit:OffEnde.* { if(ReadingsVal($name,'Status',0) eq "Aus") {(ReadingsNum($name, "OffEnde", 0))  - (ReadingsNum($name, "OnBeginn", 0))  } },
Zwischenwert:Betriebszeit.* { if(ReadingsVal($name,'Status',0) eq "Aus")  { ((ReadingsNum($name,'Betriebszeit',0) / 2 ) +
ReadingsNum($name,'GesamtZeit_neu',0) )} else {ReadingsNum($name,'GesamtZeit_neu',0)} },
GesamtZeit_neu:Zwischenwert.*  { (ReadingsNum($name,'Zwischenwert',0)  ) },
GesamtZeit:GesamtZeit_neu.* { ((sprintf("%.2f",ReadingsNum($name,'GesamtZeit_neu',0)  / 3600) ." h")) },
cycle:Status.* {if (ReadingsVal($name,'Status',0) eq "An") {(ReadingsNum($name,'cycle',0) + 1  )}
else {(ReadingsNum($name,'cycle',0) )}

auf alle Heizungsakoren zu kopieren.

Leider kommt nur das an. Es wird nach vor dem ertsen elsif abgschnitten.
userReadings

Status:StatusStellwert.* { if (ReadingsNum($name,'StatusStellwert',0) == 0) { "Aus" }

Was kann ich tun? Kann man noch eine zuätzliche Klammer setzen um das Problem zu beheben?

LG
Tim
Titel: Aw: Einfügen
Beitrag von: netpirat am 16 November 2025, 14:49:09
Oh man, das war sehr simpel. Es ist das Enter-Leerzeichen zwischen dem Ende und elsif. Herangerückt funktioniert es, allerdings nur über den Eingabeprompt (oben auf der Seite), nicht über das Plus!
Titel: Aw: Einfügen
Beitrag von: Otto123 am 16 November 2025, 15:25:22
Was Du willst geht im DEF Editor ...
Über "das Plus" (Raw Editor) musst Du die Zeilen "Verbinden"
Zeile 1\
Zeile 2\
Letzte Zeile

Schau es Dir mal an wenn Du ein existierende Device mit Zeilenumbruch in der Raw Definition und im DEF Editor anschaust. ;)

Und auch auf Semikolons im Code achten! ;) DEF einfach, Raw Def und FHEM Kommandozeile (Eingabeprompt (oben auf der Seite)) doppelt.
Titel: Aw: Einfügen
Beitrag von: Prof. Dr. Peter Henning am 16 November 2025, 17:17:39
Das ist aber keine gute Praxis und schwer zu warten.

Besser: Die ganzen Bedingungen und Berechnungen als Perl-subs in eine Datei 99_HeizungsUtils.pm auszulagern und bei einem Status-Event des jeweiligen Heizungsaktors aufrufen. Dabei natürlich die Bezeichnung des Aktors bei Aufruf mitgeben, so dass der Code nur _einmal_ vorhanden ist.

LG

pah