Hauptmenü

Einfügen

Begonnen von netpirat, 16 November 2025, 14:40:30

Vorheriges Thema - Nächstes Thema

netpirat

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

netpirat

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!

Otto123

#2
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.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Prof. Dr. Peter Henning

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