Hauptmenü

Quellcode kurz erklären?

Begonnen von IKaRuS1978, 28 November 2016, 07:49:29

Vorheriges Thema - Nächstes Thema

IKaRuS1978

Hallo zusammen,

ich beschäftige mich erst seit kurzem mit FHEM und stehe noch ziemlich am Anfang.
Dennoch möchte ich natürlich nicht nur Quellcodes aus Tutorials übernehmen, sondern möchte sie auch verstehen.

Das bringt mich zu folgendem:

Ich habe jetzt meinen Gaszähler in FHEM eingebunden.
Und zwar nach diesem Turorial:
http://voizchat.de/gaszaehler-verbrauch-erfassen-mit-fhem-und-raspberry-gpio/

Nun geht es mir um den sogenannten Gasverbrauch pro Stunde. Da wird auf HourCounter zugegriffen und folgende Berechnung durchgeführt:

ZitatGasverbrauch {
my $GasUmlaufzeit=ReadingsVal("Gasverbrauch","pauseTimeEdge","0")+ReadingsVal("Gasverbrauch","pulseTimeEdge","0");
my $GasProStd=36/$GasUmlaufzeit;
my $GasProStdRounded=int(100 * $GasProStd + 0.5) / 100;

Das würde ich nun gern verstehen.

Ich bin so weit gekommen, dass in der ersten Zeile die Dauer seit dem letzten Verbrauch von 0,01m3 berechnet wird, indem die Pause zwischen den Impulsen und die Dauer des Impulses aufaddiert wird.

In der dritten Zeile wird wohl das Ergebnis aus der zweiten Zeile gerundet. Das habe ich verstanden, aber die Berechnung der Rundung gehrt irgendwie nicht in meinen Kopf.

Die zweite Zeile ist das größte Mysterium. Ich komme nicht hinter die "36"... Warum 36?

Wäre toll, wenn mir da mal jemand erklären könnte, auf welchem Knoten ich da stehe. :-D

Vielen Dank!



Prof. Dr. Peter Henning

Wieviel Sekunden hat eine Stunde ? Dividiere dies durch die Anzahl von 0,01 m³ in einem m³.

Es hilft immer, solche Rechnungen mit den korrekten Einheiten zu machen...

LG

pah

Muschelpuster

#2
Bei der Rundung kann ich helfen  ;)
Es wird auf 2 Stellen nach dem Komma gerundet. Da die genutzte Funktion int einfach alles hinter dem Komma weg schneidet, wird der zu rundende Wert mit 100 multipliziert. Dann schneidet int alles hinter dem Komma weg und das Ergebnis wird durch 100 geteilt, somit hat man 2 Kommastellen. Da int einfach abschneidet, würde bei int(9,999*100)/100 9,99 raus kommen, was keiner mathematisch annähernd korrekten Rundung entspricht. Daher wird vor der Rundung dem Produkt noch 0,5 drauf geschlagen (im Beispiel also 999,9+0,5 = 1000,4) und so korrekt gerundet. Bei 9,99499999 käme also immer noch 9,99 raus, erst ab 9,995 wäre das Ergebnis 10.

runde Grüße
Niels
fhem @ ZBOX mit 1,6MHz Celeron, 4GB RAM & 120GB SSD mit Debian Bullseye # MiLight # Homematic via CCU3 # W&T WebIO # Rademacher DuoFern # ESPeasy # logdb@mysql # configdb@mysql # Shelly @ MQTT2 # go-eCharger mit PV-Überschussladung via DOIF

IKaRuS1978

Ja, jetzt wird mir einiges klarer.
Vielen Dank euch beiden.

Die Sache mit der Rundung ist auch irgendwie klar. Aber man macht sich keine Gedanken, wenn man in nahezu jeder Sprache eine vorgefertigte Funktion zum runden benutzt. :-D