[gelöst] "Ähnliche" Berechnungen in der 99_myUtils zusammenführen

Begonnen von Vize, 12 Februar 2016, 08:37:11

Vorheriges Thema - Nächstes Thema

Vize

Guten Morgen,

ich habe hier schon einige nützliche Tipps bezüglich der Berechnung des Taupunktes in der 99_myUtils erhalten, und wie man den Wert an ein device mittels userReading übergibt.

Nun habe ich es noch um die Berechnung (und Anzeige) der absoluten Feuchte erweitert.
Das Ganze sieht dann in der 99_myUtils so aus:

sub
dewpoint ($)
{
my ($name) = @_;
my $T = ReadingsVal($name,"measured-temp",0);
my $H = ReadingsVal($name,"humidity",0);
my $a = ($T > 0) ? 7.5 : 9.5;
my $b = ($T > 0) ? 237.3 : 265.5;
my $SDD = 6.1078 * 10**(($a*$T)/($b+$T));
my $DD = $H/100 * $SDD;
my $v = log10($DD/6.1078);
my $TD  = $b*$v/($a-$v);
return sprintf("%.1f",$TD);
}

sub
humidity_abs ($)
{
my ($name) = @_;
my $T = ReadingsVal($name,"measured-temp",0);
my $H = ReadingsVal($name,"humidity",0);
my $a = ($T > 0) ? 7.5 : 9.5;
my $b = ($T > 0) ? 237.3 : 265.5;
my $SDD = 6.1078 * 10**(($a*$T)/($b+$T));
my $DD = $H/100 * $SDD;
my $AF  = (10**5) * (18.016 / 8314.3) * ($DD / (273.15 + $T));
return sprintf("%.1f",$AF);
}


Dazu das Attribut userReadings im device:

dewpoint { dewpoint ($name); },humidity_abs { humidity_abs ($name); }


Meine Fragen dazu:
Die einzelnen Berechnungen dazu in der 99_myUtils unterscheiden sich ja nur in zwei bzw. drei Zeilen (jeweils die letzten). Die vorangehenden Berechnungen sind identisch.
Kann man das - um es etwas eleganter zu gestalten - in einer einzigen sub unterbringen und dann beide Werte ($TD und $AF) daraus übergeben? Wenn ja, wie sähen der code in der 99_myUtils und das Atrribut userReadings dazu aus?

Ich hab schon ein paar Sachen probiert, aber ich weiß nicht, was dann dabei z.B. in die Zeilen my ($blabla) = @_ und return blablubb gehört, und wie ich das Attribut userReadings definieren muss.

Bin für jede Hilfe dankbar!

Gruß
Andreas

Ellert

Deinen Fragen entnehme ich, dass Dir einige Grundkenntnisse in Perl fehlen. Hast Du schon mal ein Einsteigertutorial gelesen?

Schau mal hier: http://www.perlunity.de/perl/tutorial/perl_start.shtml Punkt 13

Vize

Hallo Ellert,

natürlich hast du Recht, ABER mir fehlen jegliche Grundkenntnisse...  ;)

Danke für den link, ich schau mal rein...werd aber bestimmt trotzdem nen Schubs in die richtige Richtung benötigen...

Gruß
Andreas

Vize

Hallo,

so, ich hab mal die letzte Stunde durch den link von Ellert gestöbert, aber das bleiben leider doch erstmal noch böhmische Dörfer für mich...
Sorry, ich krieg es nicht auf die Kette.

Folgendes hab ich noch im Internet gefunden, was ja meinem Vorhaben schon sehr nahe kommt, oder?


sub
af_td ($$)
{
my ($T, $rh) = @_;
my $a = ($T > 0) ? 7.5 : 9.5;
my $b = ($T > 0) ? 237.3 : 265.5;
my $SDD = 6.1078 * 10**(($a*$T)/($b+$T));
my $DD = $rh/100 * $SDD; 
my $AF = (10**5) * (18.016 / 8314.3) * ($DD / (273.15 + $T));
my $af = sprintf("%.1f",$AF);
my $v = log10($DD/6.1078);
my $TD = $b*$v/($a-$v);
my $td = sprintf("%.1f",$TD);
return($af, $td);
}


Leider weiß ich jetzt aber immer noch nicht, wie ich meine Varianten anpassen muss, damit er z.B. measured-temp und humidity aus dem jeweiligen device übernimmt, wie die Zeile    my ($name) = @_    nun aussehen muss und wie der Aufruf mit userReadings lauten muss...

Vielleicht kann mir doch jemand hierbei einmal konkret mit dem coding helfen?

Danke!

Gruß
Andreas

Vize

Guten Morgen,

hat denn niemand eine Idee oder einen Tipp für mich?

Dank und Gruß
Andreas

Vize

Hallo,

folgendes hab ich grad mal ausprobiert:

Mit dem hier in der 99_myUtils
sub
af_td ($)
{
my ($name) = @_;
my $T = ReadingsVal($name,"measured-temp",0);
my $H = ReadingsVal($name,"humidity",0);
my $a = ($T > 0) ? 7.5 : 9.5;
my $b = ($T > 0) ? 237.3 : 265.5;
my $SDD = 6.1078 * 10**(($a*$T)/($b+$T));
my $DD = $H/100 * $SDD;
my $AF = (10**5) * (18.016 / 8314.3) * ($DD / (273.15 + $T));
my $af = sprintf("%.1f",$AF);
my $v = log10($DD/6.1078);
my $TD = $b*$v/($a-$v);
my $td = sprintf("%.1f",$TD);
return ($af, $td);
}


erhalte ich nach Eingabe von
{af_td ("bz_202_thermostat_klima")}

in der FHEM-Befehlszeile schonmal den Wert für den Taupunkt!?!
Der Wert für die abs. Feuchtigkeit wird mir nicht angezeigt...

Ich komm einfach nicht weiter...will sagen, ich brauche immer noch Hilfe...

Gruß
Andreas

stromer-12

Wenn du es so aufrufst wird dir nur der erste Rückgabewert angezeigt.
FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL

Vize

Hmmm...wieso erhalte ich denn dann den Wert des Taupunktes, welcher doch eigentlich der zweite Rückgabewert ist, oder?

Wie würde ich denn richtigerweise den zweiten Wert erhalten, bzw. wie könnte ich die einzelnen Werte zurückgeben?

Danke!

Gruß
Andreas

Ellert

Du könntest das Reading in der Funktion setzen, dann benötigst Du kein userRreading

fhem "setreading $name dewpoint <Wert1> <Wert2>"

s. http://fhem.de/commandref_DE.html#command, http://fhem.de/commandref_DE.html#perl und http://fhem.de/commandref_DE.html#setreading

oder Du gibst eine Zeichenkette, die beide Werte enthält, zurück.

Vize

Hallo Ellert,

heißt das, dass es mit meinem Versuch gar nicht klappt, beide Werte, bzw. nur den ersten oder nur den zweiten auszugeben?

Würdest du mir bitte das mit der Zeichenkette noch näher erläutern?

Die Alternative mit dem setreading kenne ich, ich würd es aber erstmal weiter mit diesem konkreten userReading versuchen, um auch das zu verstehen...

Danke!

Gruß
Andreas

Vize

Hi nochmal,

ok, zu der Zeichenkette habe ich selber was gefunden.

Mit
return ($af.$td);

erhalte ich schonmal beide Werte hintereinander...

So, jetzt muss ich erstmal was essen...  ;D

Gruß
Andreas

stromer-12

FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL

Vize

Hallo stromer-12,

danke für den link, aber den kannte ich schon...

Davon hatte ich das Beispiel unter "Getting two variables back" mal direkt so wie es da steht in die 99_myUtils eingefügt und in der FHEM-Befehlszeile dann
{ get_two }
eingegeben.

Ergebnis bzw Ausgabe:
two

Es schwebt immer noch ein großes ? über meinem Kopf...

Gruß
Andreas

stromer-12

Mach mal so:

{ my ($a,$d) = af_td ("bz_202_thermostat_klima");;"Absolut:$a Taupunkt:$d"}
FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL

Vize