Frage zu Stromzähler und 1-Wire (WIKI)

Begonnen von dieter114, 29 März 2015, 10:50:54

Vorheriges Thema - Nächstes Thema

dieter114

Hallo Leute,

ich habe da ein Problem mit dem WIKI: "Stromzähler und 1-Wire, OWServer, OWDevice".
Die Hardware funktioniert einwandfrei, die Graphen sind i.O und auch nachvollziehbar.
Nur die Anzeige der Zählerstände und dementsprechend die verbrauchten Mengen stimmen absolut nicht.
Wenn ich einen Zählerstand z.B. Stromzähler eingebe, sollte der auch in der Anzeige so wie eingegeben erscheinen - tut er aber nicht.
Meine Vermutung ist, das die Funktion zum Berechnen der Offset-Werte nicht - oder nur teilweise arbeitet.
Meine Pearl Kenntnisse sind allerdings sehr begrenzt, daher meine Frage an dieser Stelle.
RPi II+III+V,OWX,div.1W Module,HM Zisterne,div. CUL, sduino MAPLESDuino(adv), div ESPEasy, div Tasmota, MQTT2Server,WU-Upload,TabletUI,Poolsteuerung mit fhem, Fronius, BYD Solaranlage

fiedel

Hi Wolfdieter,

poste mal alles was du gemacht hast!
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

dieter114

Also hier die Zeilen:
die Zähler stehen so bei 30.000 Einheiten.
Meine Vermutung ist das my $setoffsetA = (ReadingsVal("Offset_A","Zaehlerstand_Strom",0)-$valueA);;\ führt zu nichts
Es wird der Wert von "0" abgezogen; das ergibt den negativen Wert von 30.502 bei Gas...


Code:
#
define OW_Strom_Gas_Zaehler OWDevice 1D.881710000000 120
attr OW_Strom_Gas_Zaehler IODev myOWServer
attr OW_Strom_Gas_Zaehler model DS2423
attr OW_Strom_Gas_Zaehler offsetA -171.146666666667
attr OW_Strom_Gas_Zaehler offsetB -30.502
attr OW_Strom_Gas_Zaehler polls counters.A,counters.B
attr OW_Strom_Gas_Zaehler room 1_Energie
attr OW_Strom_Gas_Zaehler stateFormat { sprintf("%.3f kWh %.3f m³", ReadingsVal("OW_Strom_Gas_Zaehler","displayA","kWh"), ReadingsVal("OW_Strom_Gas_Zaehler","displayB","m³"));; }
attr OW_Strom_Gas_Zaehler userReadings displayA {ReadingsVal("OW_Strom_Gas_Zaehler","counters.A",0)/1000.0+AttrVal("OW_Strom_Gas_Zaehler","offsetA",0);;}, consumption_power differential {ReadingsVal("OW_Strom_Gas_Zaehler","counters.A",0)*3.6;;}, daily_power {ReadingsVal("OW_Strom_Gas_Zaehler","displayA",0)-Value("Dum_DP_Diff_D");;}, displayB {ReadingsVal("OW_Strom_Gas_Zaehler","counters.B",0)/1000.0+AttrVal("OW_Strom_Gas_Zaehler","offsetB",0);;}, consumption_gas differential {ReadingsVal("OW_Strom_Gas_Zaehler","counters.B",0)*3.6;;}, daily_gas {ReadingsVal("OW_Strom_Gas_Zaehler","displayB",0)-Value("Dum_DG_Diff_D");;}
#
# Dummys zum Eingeben der realen Zählerstände:
define Offset_A dummy
attr Offset_A alias Berechn. Offset A
attr Offset_A comment Eingabefeld für Zählerstand Strom zur Berechnung von "offsetA"
attr Offset_A group OWDevice
attr Offset_A room 1_Energie
attr Offset_A setList Zaehlerstand_Strom:textField
attr Offset_A webCmd Zaehlerstand_Strom

define Offset_B dummy
attr Offset_B alias Berechn. Offset B
attr Offset_B comment Eingabefeld für Zählerstand Strom zur Berechnung von "offsetB"
attr Offset_B group OWDevice
attr Offset_B room 1_Energie
attr Offset_B setList Zaehlerstand_Gas:textField
attr Offset_B webCmd Zaehlerstand_Gas

# Funktion zum Berechnen und Setzen der Offset- Werte:
# Meine Zähler haben beide je 1000 Impulse pro kWh Strom oder Qm Gas !
define Func_SetOffset_N notify Offset_A|Offset_B  { \
\
  my $aufrufer_SetOffset = "@" ;;\
  my $valueA = (ReadingsVal("OW_Strom_Gas_Zaehler","counters.A",0)/1000.0);;\
  my $valueB = (ReadingsVal("OW_Strom_Gas_Zaehler","counters.B",0)/1000.0);;\
  my $setoffsetA = (ReadingsVal("Offset_A","Zaehlerstand_Strom",0)-$valueA);;\
  my $setoffsetB = (ReadingsVal("Offset_B","Zaehlerstand_Gas",0)-$valueB);;\
\
if ($aufrufer_SetOffset eq "Offset_A") { \
     Log 1, "Setze OW_Strom_Gas_Zaehler.offsetA auf: $setoffsetA";; \
     fhem("attr OW_Strom_Gas_Zaehler offsetA $setoffsetA");;\
     fhem("set Offset_A $setoffsetA");;\
} \
if ($aufrufer_SetOffset eq "Offset_B") { \
     Log 1, "Setze OW_Strom_Gas_Zaehler.offsetB auf: $setoffsetB";; \
     fhem("attr OW_Strom_Gas_Zaehler offsetB $setoffsetB");;\
     fhem("set Offset_B $setoffsetB");;\
}\
                                             { \
     fhem("save");;\
}\
}
attr Func_SetOffset_N group Berechnungen
attr Func_SetOffset_N room 1_Energie

#
# Dummys für Daily
define Dum_DP_Diff_D dummy
attr Dum_DP_Diff_D group Berechnungen
attr Dum_DP_Diff_D room 1_Energie

define Dum_DG_Diff_D dummy
attr Dum_DG_Diff_D group Berechnungen
attr Dum_DG_Diff_D room 1_Energie

define Dum_Daily_Power_D dummy
attr Dum_Daily_Power_D event-on-change-reading state
attr Dum_Daily_Power_D group Berechnungen
attr Dum_Daily_Power_D room 1_Energie

define Dum_Daily_Gas_D dummy
attr Dum_Daily_Gas_D event-on-change-reading state
attr Dum_Daily_Gas_D group Berechnungen
attr Dum_Daily_Gas_D room 1_Energie

# Dummys für Monthly
define Dum_MP_Diff_D dummy
attr Dum_MP_Diff_D group Berechnungen
attr Dum_MP_Diff_D room 1_Energie

define Dum_MG_Diff_D dummy
attr Dum_MG_Diff_D group Berechnungen
attr Dum_MG_Diff_D room 1_Energie

define Dum_Monthly_Power_D dummy
attr Dum_Monthly_Power_D event-on-change-reading state
attr Dum_Monthly_Power_D group Berechnungen
attr Dum_Monthly_Power_D room 1_Energie

define Dum_Monthly_Gas_D dummy
attr Dum_Monthly_Gas_D event-on-change-reading state
attr Dum_Monthly_Gas_D group Berechnungen
attr Dum_Monthly_Gas_D room 1_Energie

# Berechnung Energieverbrauch Tag gesamt
define Func_Daily_Energy_A at *23:50:00 {prg_Daily_Stat()}
attr Func_Daily_Energy_A group Berechnungen
attr Func_Daily_Energy_A room 1_Energie

# Berechnung Energieverbrauch Monat gesamt
define Func_Monthly_Energy_A at *23:55:00 {prg_Monthly_Stat()}
attr Func_Monthly_Energy_A group Berechnungen
attr Func_Monthly_Energy_A room 1_Energie
#
## Plotzuweisungen (CFG):##
#

define 00_Stromverbrauch SVG myDbLog:stromverbrauch:CURRENT
attr 00_Stromverbrauch label "Min $data{min1}, Max $data{max1}, Last $data{currval1}"
attr 00_Stromverbrauch plotfunction OW_Strom_Gas_Zaehler
attr 00_Stromverbrauch room 1_Energie

define 01_Gasverbrauch SVG myDbLog:gasverbrauch:CURRENT
attr 01_Gasverbrauch label "Min $data{min1}, Max $data{max1}, Last $data{currval1}"
attr 01_Gasverbrauch plotfunction OW_Strom_Gas_Zaehler
attr 01_Gasverbrauch room 1_Energie

define 02_Energie_Monat SVG myDbLog:energie_monat:CURRENT
attr 02_Energie_Monat fixedrange month
attr 02_Energie_Monat label "Min $data{min1}, Max $data{max1}, Last $data{currval1}"
attr 02_Energie_Monat room 1_Energie

define 03_Energie_Jahr SVG myDbLog:energie_jahr:CURRENT
attr 03_Energie_Jahr fixedrange year
attr 03_Energie_Jahr label "Min $data{min1}, Max $data{max1}, Last $data{currval1}"
attr 03_Energie_Jahr room 1_Energie
#
RPi II+III+V,OWX,div.1W Module,HM Zisterne,div. CUL, sduino MAPLESDuino(adv), div ESPEasy, div Tasmota, MQTT2Server,WU-Upload,TabletUI,Poolsteuerung mit fhem, Fronius, BYD Solaranlage

dieter114

Dazu kommt noch die 99_myUtils wie im WIKI ohne Änderung
RPi II+III+V,OWX,div.1W Module,HM Zisterne,div. CUL, sduino MAPLESDuino(adv), div ESPEasy, div Tasmota, MQTT2Server,WU-Upload,TabletUI,Poolsteuerung mit fhem, Fronius, BYD Solaranlage

fiedel

#4
Auf den ersten Blick fallen mir die negativen Offsetwerte auf. Ist das real? Ggf. beim ersten Mal mit Taschenrechner auf Plausib. prüfen. Bei mir sind die immer positiv, weil der reale Z-Stand ja immer höher ist, als der OW- Zähler. Habe mit neg. Werten nicht getestet. Oder auch mal den OW- Zähler zurücksetzen (könnte aber ggf. nicht so einfach sein).
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

dieter114

#5
Es passiert Folgendes:
Stand counters.A 29145; Eingabe Room Energie, Berechn. OffsetA z.B. "0"
Nach deiner Formel sollte also 29145 - 29145/1000 = 29115.855 das Ergebnis sein oder?
Das Ergebnis ist aber -(minus!)29.145 also nur der Wert / 1000 und auch noch Negativ.
Daraus entnehme ich das die Zeile my $setoffsetA = (ReadingsVal("Offset_A","Zaehlerstand_Strom",0)-$valueA);;\
einfach nicht funktioniert - oder?
RPi II+III+V,OWX,div.1W Module,HM Zisterne,div. CUL, sduino MAPLESDuino(adv), div ESPEasy, div Tasmota, MQTT2Server,WU-Upload,TabletUI,Poolsteuerung mit fhem, Fronius, BYD Solaranlage

dieter114

#6
Oder noch weiter probiert: Du kannst eingeben was du willst,
es kommt immer nur der Zählerstand countersA / 1000 heraus und nichts mehr.
Hab ich das überhaupt richtig verstanden: In das Feld "Berechn. OffsetA" soll der abgelesene -echte Zählerstand
der Strom / Gaszählers eingetragen werden und die Routine zählt weiter
so dass ein evt. Rechenfehler oder Aussetzer der Zählhardware erkannt wird.
RPi II+III+V,OWX,div.1W Module,HM Zisterne,div. CUL, sduino MAPLESDuino(adv), div ESPEasy, div Tasmota, MQTT2Server,WU-Upload,TabletUI,Poolsteuerung mit fhem, Fronius, BYD Solaranlage

fiedel

ZitatHab ich das überhaupt richtig verstanden: In das Feld "Berechn. OffsetA" soll der abgelesene -echte Zählerstand
der Strom / Gaszählers eingetragen werden und die Routine zählt weiter
so dass ein evt. Rechenfehler oder Aussetzer der Zählhardware erkannt wird.

Genau so ist es. Werde es bei Gelegenh. mal nachvollz. Bin im Mom. etwas knapp mit Zeit.

Gruß

Frank
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

dieter114

#8
Hallo Frank,
Ich glaube ich habs:
http://forum.fhem.de/index.php/topic,13383.msg82902.html#msg82902
Dort hast du die Werte noch in der Form : "set Dum_Input_A_D <Wert>" ins Eingabefeld gegeben.
Die Version mit :
attr Offset_A setList Zaehlerstand_Strom:textField
attr Offset_A webCmd Zaehlerstand_Strom
funktioniert einfach nicht.
Wenn man "0" als Zahl eingibt, ist das state "Zaehlerstand_Strom 0" also wird m.E. beim Auslesen nicht
die Zahl 0 sonder der String Zaelerstand... gelesen, welches in der nachfolgenden Berechnung auch zu nichts führt.
Oder bin ich jetzt total auf dem Holzweg.....
Wolfdieter
RPi II+III+V,OWX,div.1W Module,HM Zisterne,div. CUL, sduino MAPLESDuino(adv), div ESPEasy, div Tasmota, MQTT2Server,WU-Upload,TabletUI,Poolsteuerung mit fhem, Fronius, BYD Solaranlage

fiedel

Ich hab da noch nie "0" eingegeben, sondern immer den akt. Zählerstand. Dann sollte das auch mit dem Eingabefeld klappen. Es ist in der Prax. ja meist so, dass der Zähler schon älter ist und der OW- Zähler neu (fast leer) dazu kommt. Dann wird der Offsetwert positiv. Den Fall wenn später der alte Zähler gegen einen neuen (leeren) getauscht wird, habe ich noch nicht simuliert / berücksichtigt.
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

dieter114

Hallo Frank,

hast du denn überhaupt schon mal Werte zum ändern eingegeben?
Ich meine die Funktion geht nicht.
Bei mir habe ich jetzt die Berechnung abgeschaltet, die richtigen Offset-Werte mit dem Taschenrechner
berechnet und eingegeben. Alle funktioniert nun so wie es soll:
Man kann den "berechneten" mit dem "echten" Zählerstand vergleichen usw.
Mit geht es nur um :
attr Offset_A setList Zaehlerstand_Strom:textField
attr Offset_A webCmd Zaehlerstand_Strom
das läuft irgendwie nicht.
Wenn ich da z.B. 1000 Eingebe, erscheint nicht die Zahl sondern "Zaehlerstand_Strom 1000".
Also ohne Doppelpunkt und nicht nur die Zahl 1000 als solches.
Äh.. ich habe das Ganze auf dBLog umgebaut und nicht FileLog - könnte da damit zusammenhängen?

Gruß Wolfdieter
RPi II+III+V,OWX,div.1W Module,HM Zisterne,div. CUL, sduino MAPLESDuino(adv), div ESPEasy, div Tasmota, MQTT2Server,WU-Upload,TabletUI,Poolsteuerung mit fhem, Fronius, BYD Solaranlage

fiedel

#11
An der Arte des Loggings sollte es nicht liegen. Bis auf die Leerzeichen um die "-" herum, die ich in der Berechnung habe konnte ich auch keine Fehler in deinem Code feststellen (keine Ahnung, ob das relevant ist):

my $aufrufer_SetOffset = "@" ;;\
  my $valueA = (ReadingsVal("OW_Strom_Gas_Zaehler","counters.A",0)/1000.0);;\
  my $valueB = (ReadingsVal("OW_Strom_Gas_Zaehler","counters.B",0)/1000.0);;\
  my $setoffsetA = (ReadingsVal("Offset_A","Zaehlerstand_Strom",0) - $valueA);;\
  my $setoffsetB = (ReadingsVal("Offset_B","Zaehlerstand_Gas",0) - $valueB);;\


Ansonsten klappt das bei mir problemlos:

(http://forum.fhem.de/index.php?action=dlattach;topic=35594.0;attach=30346;image)
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

dieter114

Ich wollte das Tool zum Eingeben der Werte ja auch nur aus "Faulheit" weg. der Berechnung einfügen.....
Meine Wertezählerei und Berechnung funktioniert jetzt einwandfrei.
Sogar der selbstgebaute optische Gaszähler läuft synchron mit dem Drehrad der Gemeindewerke.
Ich habe reale Zahlen eingegeben bzw. Offsets berechnet - alles OK.
Vermutlich liegt es tatsächlich an dem "-" Zeichen und die Blanks Drumherum .....
nur ist es mir zu heiss dies Tool nochmal einzufügen.
Durch diese ganze Bastelei habe ich einen ziemlichen Unsinn in der Datenbank stehen und kriege die einfach nicht bereinigt:
Kurze Nachfrage: DeleteOldDays in der Datenbank geht nicht, oder jedenfalls nicht richtig.
Die "Leichen" von vor 2 Woche sind immer noch da und die Datei wird auch irgendwie nicht kleiner, funktioniert aber noch !
Hast Du noch einen Tipp für mich?
RPi II+III+V,OWX,div.1W Module,HM Zisterne,div. CUL, sduino MAPLESDuino(adv), div ESPEasy, div Tasmota, MQTT2Server,WU-Upload,TabletUI,Poolsteuerung mit fhem, Fronius, BYD Solaranlage