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
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!
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.
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