[gelöst] Dewpoint in 99_myUtils berechnen und als reading übergeben

Begonnen von Vize, 08 Februar 2016, 19:35:04

Vorheriges Thema - Nächstes Thema

Vize

Guten Abend zusammen,

da mir in Sachen Programmierung, Perl etc. wirklich gar kein Wissen im Weg steht, raucht mir mittlerweile schon der Kopf.

Mein Vorhaben:
Unter diesem link: Klick mich findet man eine Beschreibung, wie man die Taupunktberechnung als userReading einem Device zuordnen kann. Funktioniert auch einwandfrei.
Nun dachte ich, man kann doch bestimmt die Berechnung auch in eine sub in die 99_myUtils auslagern, damit man nicht so ein ellenlanges Reading im Device hat.
Nach stundenlanger "Googelei" und etlichen Versuchen, dies aus anderen Beispielen zusammenzubasteln, komm ich aber nicht mehr weiter, und es klappt einfach nicht...

Zuletzt hab ich es hiermit versucht:
sub
dewpoint ($$)
{
my ($name,$dp) = @_;
my $temperature = ReadingsVal($name,"measured-temp",0);
my $humidity = ReadingsVal($name,"humidity",0);
my $A = 17.2694;
my $B = ($temperature > 0) ? 237.3 : 265.5;
my $es = 610.78 * exp ( $A * $temperature / ($temperature + $B) );
my $e = $humidity / 100 * $es;
if ($e == 0) { Log 1, "Error: dewpoint() e==0: temp=$temperature, hum=$humidity";; return 0 }
my $e1 = $e / 610.78;
my $f = log ( $e1 ) / $A;
my $f1 = 1 - $f;
if ($f1 == 0) { Log 1, "Error: dewpoint() (1-f)==0: temp=$temperature, hum=$humidity";; return 0 }
my $dp = $B * $f / $f1;
$dp = sprintf("%.1f",$dp);
}


und dann versucht, im userReading-Attribut es so aufzurufen:
dewpoint { dewpoint ($dp); }

Dies produziert folgende Fehlermeldung:
Error evaluating bz_202_thermostat_klima userReading dewpoint: Global symbol "$dp" requires explicit package name at (eval 33811) line 1. Not enough arguments for main::dewpoint at (eval 33811) line 1, near "$dp)"

Ich hab auch schon andere Varianten probiert, aber ich scheitere immer wieder.

Kann mir jemand eventuell weiterhelfen mit diesem konkreten Fall? Geht das überhaupt? Wenn ja wie?

Bin für jede Hilfe dankbar!

Gruß
Andreas

justme1968

beim aufruf deiner routine im userReadings attribut muss du den namen übergeben. $db gibt es an dieser stelle nicht kann also auch nicht übergeben werden.attr <device> userReadings dewpoint { dewpoint ($name); }

und in deiner routine musst du den übergebenen namen entgegen nehmen und das ergebniss zurück liefern.

sub
dewpoint ($)
{
  my ($name) = @_;

  ...

  return sprintf("%.1f",$dp);
}


die verdoppelten ; brauchst du nicht wenn der code in 99_myUtils steckt.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

betateilchen

Nur aus reiner Neugier: warum will man eigentlich dewpoint in der 99_myUtils berechnen, wenn es dafür ein fertiges fhem-Modul gibt?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Vize

@justme1968
Danke für die Antwort...dein Tipp ergibt aber

Can't modify return in scalar assignment at ./FHEM/99_myUtils.pm line 196, near ");"

beim Speichern der 99_myUtils.

@betateilchen
Wie sagt man: Weil man's kann...  ;)
Nee, eigentlich, um zu üben und um zu lernen.
Also, why not?

Gruß
Andreas

justme1968

hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Vize

return = sprintf("%.1f",$dp);  :-[

Ich mach mal das = - Zechen weg...  :-[

Vize

...und schon läuft's...

Danke nochmal justme1968!  ;D

Gruß
Andreas