FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Vize am 08 Februar 2016, 19:35:04

Titel: [gelöst] Dewpoint in 99_myUtils berechnen und als reading übergeben
Beitrag von: Vize am 08 Februar 2016, 19:35:04
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 (http://www.fhemwiki.de/wiki/Dewpoint) 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
Titel: Antw:Dewpoint in 99_myUtils berechnen und als reading übergeben
Beitrag von: justme1968 am 08 Februar 2016, 19:42:56
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.
Titel: Antw:Dewpoint in 99_myUtils berechnen und als reading übergeben
Beitrag von: betateilchen am 08 Februar 2016, 20:06:41
Nur aus reiner Neugier: warum will man eigentlich dewpoint in der 99_myUtils berechnen, wenn es dafür ein fertiges fhem-Modul gibt?
Titel: Antw:Dewpoint in 99_myUtils berechnen und als reading übergeben
Beitrag von: Vize am 08 Februar 2016, 20:11:47
@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
Titel: Antw:Dewpoint in 99_myUtils berechnen und als reading übergeben
Beitrag von: justme1968 am 08 Februar 2016, 20:33:47
und was genau steht in deiner zeile 196 ?
Titel: Antw:Dewpoint in 99_myUtils berechnen und als reading übergeben
Beitrag von: Vize am 08 Februar 2016, 20:37:21
return = sprintf("%.1f",$dp);  :-[

Ich mach mal das = - Zechen weg...  :-[
Titel: Antw:Dewpoint in 99_myUtils berechnen und als reading übergeben
Beitrag von: Vize am 08 Februar 2016, 20:47:57
...und schon läuft's...

Danke nochmal justme1968!  ;D

Gruß
Andreas