Script zur Berechnung der aktuellen Leistungsaufnahme

Begonnen von thoweiss, 28 März 2013, 09:41:29

Vorheriges Thema - Nächstes Thema

thoweiss

Hallo zusammen,

ich habe mir ein kleines Sub in die 99myutils eingebaut.
Funktioniert soweit prima bis auf die Berechnung der aktuellen Leitung:

#--------------------Leistung in kw berechnen
# Faktor 0,083 entspricht der Messzeit von 5 Minuten
    #$kw = sprintf ("%.2f",(($delta_strom*3600)/(300*$zk)));
$kw = $delta_strom;
fhem("set du.power.strom $kw");



Irgendwie schein die Variable $delta_strom keinen Inhalt mehr zu haben?
Die beiden anderen Berechnungen Funktionieren...

Kann man irgendwie Logging in so ein Script einbauen?

Irgendwie habe ich ein Brett vorm Kopf...


#############################################################
# energy
# Berechnet den Strom und Gasverbrauch
sub Energy() {
#---------------Datenübernahme aus Aufruf der Sub-Routine---------
#my ($cnt_strom, $cnt_gas) = @_;
my $cnt_strom = ReadingsVal("ow.cnt.energy","counters.A",0);
my $cnt_gas = ReadingsVal("ow.cnt.energy","counters.B",0);

#Globale Variablen
use vars qw($cnt_strom_old);
use vars qw($cnt_gas_old);  

#---------------Lokale - Variablen---------------
my $delta_strom;
my $kwh;
my $kw;
my $delta_gas;
my $m3;
my $Gas_kWh;

#---------------Konstanten--------------------------
my $zk = 75; #Zählerkonstante
my $einheit_gas = 0.01; #m³/impuls
my $Gas_faktor = 11.25; # umrechnungsfaktor m³ in kWh für Gas

#-----------------Strom---------------------------
$delta_strom = $cnt_strom - $cnt_strom_old; #Berechne Differenz alt/neu
$cnt_strom_old = $cnt_strom;                    #Speichere neuen wert

#-----------------Gas-----------------------------
$delta_gas = $cnt_gas - $cnt_gas_old;
$cnt_gas_old = $cnt_gas;

#--------------------Leistung in kw berechnen
# Faktor 0,083 entspricht der Messzeit von 5 Minuten
    #$kw = sprintf ("%.2f",(($delta_strom*3600)/(300*$zk)));
$kw = $delta_strom;
fhem("set du.power.strom $kw");

#--------------------Verbrauch in kwh berechnen
$kwh = $delta_strom / $zk;
$kwh = sprintf ("%.2f",(Value("du.cnt.strom") + $kwh));
fhem("set du.cnt.strom $kwh");

#--------------------Verbrauch in m³ berechen----------
$m3 = $delta_gas * $einheit_gas;
$m3 = sprintf ("%.2f",(Value("du.cnt.gas") + $m3));
fhem("set du.cnt.gas $m3");

}

decaflo

Ja, loggen geht. Probiert mal
Log(1, "delta_strom: $delta_strom");
Geloggt wird dann vermutlich nach ./log/fhem-2013-03.log

Grüsse, Florian

thoweiss

Danke für die Info, dann will ich das einmal testen...


thoweiss

So ich habe mal ein bisschen Logging eingebaut.
Meine 99_myUtil.pm hab ich mal angehängt.

Der Aufruf der Sub-Routine erfolgt so:

define nt.cnt.energy notify ow.cnt.energy {Energy}

Ausgabe:
2013.04.01 13:09:17 1: Ergebnis kw: 0.64
2013.04.01 13:09:17 1: Ergebnis kwh: 18126.63
2013.04.01 13:09:17 1: Ergebnis m3: 9545.14
2013.04.01 13:09:17 1: Ergebnis kw: 0.00
2013.04.01 13:09:17 1: Ergebnis kwh: 18126.63
2013.04.01 13:09:17 1: Ergebnis m3: 9545.14
2013.04.01 13:14:17 1: Ergebnis kw: 0.48
2013.04.01 13:14:18 1: Ergebnis kwh: 18126.67
2013.04.01 13:14:18 1: Ergebnis m3: 9545.14
2013.04.01 13:14:18 1: Ergebnis kw: 0.00
2013.04.01 13:14:18 1: Ergebnis kwh: 18126.67
2013.04.01 13:14:18 1: Ergebnis m3: 9545.14
2013.04.01 13:19:18 1: Ergebnis kw: 0.80
2013.04.01 13:19:19 1: Ergebnis kwh: 18126.74
2013.04.01 13:19:19 1: Ergebnis m3: 9545.14
2013.04.01 13:19:19 1: Ergebnis kw: 0.00
2013.04.01 13:19:19 1: Ergebnis kwh: 18126.74
2013.04.01 13:19:19 1: Ergebnis m3: 9545.14


Es sieht so aus, als wenn der Code immer zweimal ausgeführt würde.

Beim Zweiten mal ist die Differenz ja immer 0, daher auch keine Sinnvollen werte...

Aber warum?
Bug im OWFS-device?

Das Device ist so eingetragen:
define ow.cnt.energy OWDevice 1D.601209000000 300

Hat jemand eine Idee?

Gruß,
Thorsten

thoweiss

So ich bin jetzt ein stück weiter...


Ich habe einmal den Log-Level hochgedreht um zu schauen was beim auslösen des notifys passiert:

2013.04.02 18:23:43 5: Triggering ow.cnt.energy (2 changes)
2013.04.02 18:23:43 5: Notify loop for ow.cnt.energy counters.A: 678859
2013.04.02 18:23:43 5: Triggering nt.cnt.energy
2013.04.02 18:23:43 5: Cmd: >{Energy}<
2013.04.02 18:23:43 1: Ergebnis kw: 1.28
2013.04.02 18:23:43 5: Cmd: >set du.power.strom 1.28<
2013.04.02 18:23:43 4: dummy set du.power.strom 1.28
2013.04.02 18:23:43 5: Triggering du.power.strom (1 changes)
2013.04.02 18:23:43 5: Notify loop for du.power.strom 1.28
2013.04.02 18:23:43 1: Ergebnis kwh: 18142.21
2013.04.02 18:23:43 5: Cmd: >set du.cnt.strom 18142.21<
2013.04.02 18:23:43 4: dummy set du.cnt.strom 18142.21
2013.04.02 18:23:43 5: Triggering du.cnt.strom (1 changes)
2013.04.02 18:23:43 5: Notify loop for du.cnt.strom 18142.21
2013.04.02 18:23:43 1: Ergebnis m3: 9545.14
2013.04.02 18:23:43 5: Cmd: >set du.cnt.gas 9545.14<
2013.04.02 18:23:43 4: dummy set du.cnt.gas 9545.14
2013.04.02 18:23:43 5: Triggering du.cnt.gas (1 changes)
2013.04.02 18:23:43 5: Notify loop for du.cnt.gas 9545.14
2013.04.02 18:23:43 5: Triggering nt.cnt.energy
2013.04.02 18:23:43 5: Cmd: >{Energy}<
2013.04.02 18:23:43 1: Ergebnis kw: 0.00
2013.04.02 18:23:43 5: Cmd: >set du.power.strom 0.00<
2013.04.02 18:23:43 4: dummy set du.power.strom 0.00
2013.04.02 18:23:43 5: Triggering du.power.strom (1 changes)
2013.04.02 18:23:43 5: Notify loop for du.power.strom 0.00
2013.04.02 18:23:43 1: Ergebnis kwh: 18142.21
2013.04.02 18:23:43 5: Cmd: >set du.cnt.strom 18142.21<
2013.04.02 18:23:43 4: dummy set du.cnt.strom 18142.21
2013.04.02 18:23:43 5: Triggering du.cnt.strom (1 changes)
2013.04.02 18:23:43 5: Notify loop for du.cnt.strom 18142.21
2013.04.02 18:23:43 1: Ergebnis m3: 9545.14
2013.04.02 18:23:43 5: Cmd: >set du.cnt.gas 9545.14<
2013.04.02 18:23:43 4: dummy set du.cnt.gas 9545.14
2013.04.02 18:23:43 5: Triggering du.cnt.gas (1 changes)
2013.04.02 18:23:43 5: Notify loop for du.cnt.gas 9545.14


Das Notify triggert immer zweimal, da aber die Differenz beim zweiten mal null ist, wird der zuvor berechnete Wert wieder überschrieben...
Kann ich das irgendwie unterdrücken? Das nur einmal getriggert wird?





thoweiss

So das Brett ist jetzt ab!

Ich habe dem 1-Wire-Counter ein event-on-change-reading counters.A[/i] verpasst!

Jetzt wird nur noch getriggert wenn sich beim Stromzähler etwas ändert.

Manchmal ist es einfach zu einfach.

Gruß,
Thorsten