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

netpirat

Hallo Otto,
hallo Dr. Peter,

vielen Dank für die Antworten.

@Otto - Danke das lässt mich hier klarer sehen. Auch habe ich wieder Fachbegriffe gelernt. :-) Werde deine Hilfen beim nächsten mal anwenden. Danke dafür.

@Peter - Ich gebe Dir da vollkommen recht. Leider bin ich beim Auslagern noch nicht richtig Fit und vermeide das Ganze daher gerne mal. Vielleicht muss ich mich damit mal intensiver befassen um das stärker zu nutzen. Bislang scheue ich das noch etwas. Danke für deinen Input!

Und zum Schluß nochmal einen Dank an alle die FHEM zu dem gemacht haben was es ist. Ich bin und bleibe Fan von Fhem auch wenn es sicherlich (noch) nicht die beste DesignApp (fürs Smartphone) besitzt und ich mir wünschen würde die MDT IP mit IP Secure einzubinden. Und, ja auch ein paar Programmierkenntnissen sind gerade bei FHEM von Vorteil. Wer sich aber ein wenig mit FHEM beschäftigt kann unhemlich viel anbinden und selbst konfigurieren. Und danach funktionierts! Aus eigener Erfahrung ist das nich bei allen Homeautomationen immer der Fall. Daumen Hoch und ein riesen Dank an alle die in dieser Community FHEM so einigartig machen! Danke!

Grüße

Tim