kWH Zähler für Solarthermie

Begonnen von g.carls, 21 März 2014, 08:11:12

Vorheriges Thema - Nächstes Thema

amenomade

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

devien

nichts leichter als das

Save config
Floorplans
Arduino
Pufferspeicher
Solarsteuerung
UniPi
Unsorted
telegram
icoEverything Everything
Logfile
Commandref
Remote doc
Edit files
Select style
Event monitor

Internals:
   CFGFN      FHEM/unipi_inputs.cfg
   DEF        4
   EXCEPT_FD  9
   GPIO_Basedir /sys/class/gpio
   NAME       i01
   NR         74
   RPI_pin    4
   STATE      V: 158.09m3 E: 0.00kWh P: 0.00 kW
   TYPE       RPI_GPIO
   WiringPi_gpio /usr/local/bin/gpio
   Helper:
     DBLOG:
       solargesamtertrag:
         myDbLog:
           TIME       1499338402.71118
           VALUE      0
       solartagesertrag:
         myDbLog:
           TIME       1499338402.71118
           VALUE      0
   READINGS:
     2017-07-06 12:48:04   Counter         23388
     2017-07-04 07:05:15   Dblclick        on
     2017-07-06 12:53:22   Pinlevel        high
     2017-07-06 12:48:04   Toggle          off
     2017-07-06 12:53:22   solargesamtertrag 0
     2017-07-06 12:53:22   solarjahresertrag 0
     2017-07-06 12:53:22   solarmonatsertrag 0
     2017-07-06 12:53:22   solartagesertrag 0
     2017-07-06 12:53:22   state           on
   fhem:
     interfaces switch
Attributes:
   active_low no
   alias      Solarzähler
   ctsperm3   1000
   dichte     1042
   direction  input
   event-on-update-reading Counter,volumenstrom,d_volumen,solarleistung,solartagesertrag,solargesamtertrag
   icon       sani_solar
   interrupt  falling
   offset     134.7
   poll_interval 5
   pud_resistor up
   restoreOnStartup no
   room       Solarsteuerung,UniPi
   stateFormat {sprintf("V: %.2fm3",solarzaehlerstand("i01","Counter",0)).sprintf(" E: %.2fkWh",ReadingsVal("i01","solartagesertrag",0)).sprintf(" P: %.2f kW",ReadingsVal("i01","solarleistung",0));}
   userReadings volumenstrom:Counter differential {solarzaehlerstand('i01', 'Counter');}, d_volumen:Counter difference {solarzaehlerstand('i01', 'Counter');}, solarleistung:volumenstrom { get_solarleistung('i01', 'DS18B20_Vorlauf_S', 'DS18B20_Ruecklauf_S');}, solargesamtertrag {get_solarertrag('i01','DS18B20_Vorlauf_S', 'DS18B20_Ruecklauf_S'); }, solartagesertrag { get_d_solarertrag('i01', 'D_SOLARCNTATMIDNIGHT');}, solarmonatsertrag { get_d_solarertrag('i01', 'D_SOLARCNTAT1STDAYOFMONTH');}, solarjahresertrag {  get_d_solarertrag('i01','D_SOLARCNTAT1STDAYOFYEAR');}
   verbose    5
   waermekapazitaet 3.8

FHEM + UniPi + Arduino = gute Lösung

amenomade

Ok sieht soweit i.O. aus.

Bist Du sicher, dass deine funktionen geladen werden? M.A. ist folgendes falsch: deine Datei heisst 99_mySolarUtils.pm
Dann muss die Initialize Funktion so aussehen:
sub
mySolarUtils_Initialize($$)
{
   my ($hash) = @_;
}

Dann fhem shutdown restart.

oder reload 99_mySolarUtils

wenn Du dann ein zweites mal "reload 99_mySolarUtils", sollte er was in der Log schauen, wie "function xyz redifines" o.ä.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

devien

#18
ja, ich hab dadurch einträge im Log:
2017.07.06 14:04:16 5: Toggle war auf on
2017.07.06 14:04:16 5: Toggle ist jetzt off
2017.07.06 14:04:16 5: Zaehler ist jetzt 23432
2017.07.06 14:04:25 1: PERL WARNING: Subroutine mySolarUtils_Initialize redefined at ./FHEM/99_mySolarUtils.pm line 16.
2017.07.06 14:04:25 1: PERL WARNING: Subroutine solarzaehlerstand redefined at ./FHEM/99_mySolarUtils.pm line 24.
2017.07.06 14:04:25 1: PERL WARNING: Subroutine set_solarcounters redefined at ./FHEM/99_mySolarUtils.pm line 34.
2017.07.06 14:04:25 1: PERL WARNING: Subroutine get_solarenergie redefined at ./FHEM/99_mySolarUtils.pm line 45.
2017.07.06 14:04:25 1: PERL WARNING: Subroutine get_solarleistung redefined at ./FHEM/99_mySolarUtils.pm line 63.
2017.07.06 14:04:25 1: PERL WARNING: Subroutine get_solarertrag redefined at ./FHEM/99_mySolarUtils.pm line 80.
2017.07.06 14:04:25 1: PERL WARNING: Subroutine get_d_solarertrag redefined at ./FHEM/99_mySolarUtils.pm line 88.
2017.07.06 14:04:31 5: i01, in fileaccess: edge
2017.07.06 14:04:31 5: Toggle war auf off
2017.07.06 14:04:31 5: Toggle ist jetzt on
2017.07.06 14:04:31 5: Zaehler ist jetzt 23433


heißt das nun was gutes oder nicht?

auf jeden Fall gibt es noch immer keine Werte im solartagesertrag :/
Internals:
   CFGFN      FHEM/unipi_inputs.cfg
   DEF        4
   EXCEPT_FD  9
   GPIO_Basedir /sys/class/gpio
   NAME       i01
   NR         74
   RPI_pin    4
   STATE      V: 158.84m3 E: 0.00kWh P: 0.00 kW
   TYPE       RPI_GPIO
   WiringPi_gpio /usr/local/bin/gpio
   lasttrg    1499353519.77552
   Helper:
     DBLOG:
       Counter:
         myDbLog:
           TIME       1499353519.78328
           VALUE      24145
       solargesamtertrag:
         myDbLog:
           TIME       1499353519.78328
           VALUE      0
       solartagesertrag:
         myDbLog:
           TIME       1499353519.78328
           VALUE      0
   READINGS:
     2017-07-06 17:05:19   Counter         24145
     2017-07-04 07:05:15   Dblclick        on
     2017-07-06 17:05:19   Pinlevel        low
     2017-07-06 17:05:19   Toggle          off
     2017-07-06 17:05:19   solargesamtertrag 0
     2017-07-06 17:05:19   solarjahresertrag 0
     2017-07-06 17:05:19   solarmonatsertrag 0
     2017-07-06 17:05:19   solartagesertrag 0
     2017-07-06 17:05:19   state           off
   fhem:
     interfaces switch
Attributes:
   active_low no
   alias      Solarzähler
   ctsperm3   1000
   dichte     1042
   direction  input
   event-on-update-reading Counter,volumenstrom,d_volumen,solarleistung,solartagesertrag,solargesamtertrag
   icon       sani_solar
   interrupt  falling
   offset     134.7
   poll_interval 5
   pud_resistor up
   restoreOnStartup no
   room       Solarsteuerung,UniPi
   stateFormat {sprintf("V: %.2fm3",solarzaehlerstand("i01","Counter",0)).sprintf(" E: %.2fkWh",ReadingsVal("i01","solartagesertrag",0)).sprintf(" P: %.2f kW",ReadingsVal("i01","solarleistung",0));}
   userReadings volumenstrom:Counter differential {solarzaehlerstand('i01', 'Counter');}, d_volumen:Counter difference {solarzaehlerstand('i01', 'Counter');}, solarleistung:volumenstrom { get_solarleistung('i01', 'DS18B20_Vorlauf_S', 'DS18B20_Ruecklauf_S');}, solargesamtertrag {get_solarertrag('i01','DS18B20_Vorlauf_S', 'DS18B20_Ruecklauf_S'); }, solartagesertrag { get_d_solarertrag('i01', 'D_SOLARCNTATMIDNIGHT');}, solarmonatsertrag { get_d_solarertrag('i01', 'D_SOLARCNTAT1STDAYOFMONTH');}, solarjahresertrag {  get_d_solarertrag('i01','D_SOLARCNTAT1STDAYOFYEAR');}
   verbose    5
   waermekapazitaet 3.8
FHEM + UniPi + Arduino = gute Lösung

amenomade

Dann bau mal ein paar Trace-befehle in den Funktionen ein, z.B.:

sub solarzaehlerstand
{
  my($device, $counter)=@_;
  Log3 "solarzaehlerstand", 1, "Function called with device=$device und counter=$counter";
  # Berechnung des Gaszaehlerstandes in m3
  # V=m3offset+counts/countsperm3
  my($zaehlerstand)=
     AttrVal($device,"offset",0)+ReadingsVal($device,$counter,0)/AttrVal($device,"ctsperm3",1000);
  Log3 "solarzaehlerstand", 1, "Function return=$zaehlerstand";

  return($zaehlerstand);
}

und schau mal in der Log, was und wie aufgerufen wird.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

devien

ok, hab alle Funktionen mit Markern versehen und im Log erscheint nun:
2017.07.06 21:47:44 5: Zaehler ist jetzt 25114
2017.07.06 21:47:44 1: Function called with device=i01 und vorlauf=DS18B20_Vorlauf_S und ruecklauf=DS18B20_Ruecklauf_S
2017.07.06 21:47:44 1: Function called with device=i01 und vorlauf=DS18B20_Vorlauf_S und ruecklauf=DS18B20_Ruecklauf_S
2017.07.06 21:47:44 1: Function return=0
2017.07.06 21:47:44 1: Function return=0
2017.07.06 21:47:44 1: Function called with device=i01 und startdummy=D_SOLARCNTATMIDNIGHT
2017.07.06 21:47:44 1: Function return=0
2017.07.06 21:47:44 1: Function called with device=i01 und startdummy=D_SOLARCNTAT1STDAYOFMONTH
2017.07.06 21:47:44 1: Function return=0
2017.07.06 21:47:44 1: Function called with device=i01 und startdummy=D_SOLARCNTAT1STDAYOFYEAR
2017.07.06 21:47:44 1: Function return=0
2017.07.06 21:47:44 1: Function called with device=i01 und counter=Counter

ich bin kein crack in perl, aber das die Variablen sinvoller Weise nicht mit dem Variablennamen sondern dessen Wert im Log aufgeführt werden war wahrscheinlich dein Gedanke dabei, ich versuche eben gleich mal das zu korrigieren.
FHEM + UniPi + Arduino = gute Lösung

devien

#21
ich hab nun die Bestätigung das die richtigen Werte eingehen, aber aus mir unklarem grund ist der Returnwert leer...(naja, bis auf den Counter, der läuft ja bereits seit anbegin)
2017.07.06 22:09:33 1: Function get_solarertrag called with device=i01 und vorlauf=36.0625 und ruecklauf=32.75
2017.07.06 22:09:33 1: Function get_solarenergie called with device=i01 und vorlauf=36.0625 und ruecklauf=32.75
2017.07.06 22:09:33 1: Function return=0
2017.07.06 22:09:33 1: Function return=0
2017.07.06 22:09:33 1: Function called with device=i01 und startdummy=D_SOLARCNTATMIDNIGHT
2017.07.06 22:09:33 1: Function return=0
2017.07.06 22:09:33 1: Function called with device=i01 und startdummy=D_SOLARCNTAT1STDAYOFMONTH
2017.07.06 22:09:33 1: Function return=0
2017.07.06 22:09:33 1: Function called with device=i01 und startdummy=D_SOLARCNTAT1STDAYOFYEAR
2017.07.06 22:09:33 1: Function return=0
2017.07.06 22:09:33 1: Function called with device=i01 und counter=25120

FHEM + UniPi + Arduino = gute Lösung

Prof. Dr. Peter Henning

Es ist doch wohl offensichtlich, dass hier die Namen und die Inhalte von Variablen durcheinander geworfen werden. Wenn man

ReadingsVal($device,$counter,0)

mit einerm Wert von 25120 für $counter aufruft, liefert das natürlich den Wert "0" zurück, weil es ein solches Reading "25120" eben nicht gibt.

Also bitte mal genauer überlegen, was man hier eigentlich tut - dann wird das schon.

LG

pah

devien

#23
Zitat von: Prof. Dr. Peter Henning am 07 Juli 2017, 06:45:58
Es ist doch wohl offensichtlich, dass hier die Namen und die Inhalte von Variablen durcheinander geworfen werden. Wenn man

ReadingsVal($device,$counter,0)

mit einerm Wert von 25120 für $counter aufruft, liefert das natürlich den Wert "0" zurück, weil es ein solches Reading "25120" eben nicht gibt.

Also bitte mal genauer überlegen, was man hier eigentlich tut - dann wird das schon.

LG

pah
ich hatte die trace befehle etwas abgeändert damit ich erkennen kann ob der Inhalt des "Counter" Readings auch korrekt übergeben wird. entsprechend sieht meine 99mySolarUtils.pm so aus:
##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;

use strict;
use warnings;
use POSIX;
#Ganz am Anfang des Moduls folgenden Eintrag vornehmen:
use DateTime;
sub
mySolarUtils_Initialize($$)
{
  my ($hash) = @_;
}

# Enter you functions below _this_ line.
##########################################
# Irgendwo weiter unten in 99_Utils folgende Hilfsfunktionen eintragen:
sub solarzaehlerstand
{
  my($device, $counter)=@_;
  Log3 "solarzaehlerstand", 1, "Function solarzaehlerstand called with device=$device und counter=".ReadingsVal($device,$counter,0);
  # Berechnung des Gaszaehlerstandes in m3
  # V=m3offset+counts/countsperm3
  my($zaehlerstand)=
     AttrVal($device,"offset",0)+ReadingsVal($device,$counter,0)/AttrVal($device,"ctsperm3",1000);
  Log3 "solarzaehlerstand", 1, "Function solarzaehlerstand return=".$zaehlerstand;
  return($zaehlerstand);
}

sub set_solarcounters
{
  my($cts) = @_;
  Log3 "set_solarcounters", 1, "Function called with cts=".$cts;
  fhem("set D_SOLARCNTATMIDNIGHT ".$cts);
  if (DateTime->today(time_zone => 'Europe/Berlin')->day()==1)
  {
    fhem("set D_SOLARCNTAT1STDAYOFMONTH ".$cts);
    fhem("set D_SOLARCNTAT1STDAYOFYEAR ".$cts) if (DateTime->today(time_zone => 'Europe/Berlin')->month()==1);
  }
}

sub get_solarenergie
{
  my($device,$t_vorlauf,$t_ruecklauf) = @_;
  Log3 "get_solarenergie", 1, "Function get_solarenergie called with device=$device und vorlauf=".ReadingsVal($t_vorlauf, "temperature",0)." und ruecklauf=".ReadingsVal($t_ruecklauf, "temperature",0)." und d_volumen=".ReadingsVal($device,'d_volumen', 0);
  #Solarenergie=Wärmekapazität * Volumen * Dichte * (T_SOLARKREIS_VORLAUF - T_SOLARKREIS_RUECKLAUF)
  # Wärmeträger Propylenglykol
  # waermekapazität: 3.8 kJ/kgK
  # ctsperm3: 1000 Impulse/m3
  # Dichte: 993kg/m3
  # EInheiten: kJ/kgK*kg/m3*cts*1/cts/m3*K=kJ
  # Berechnung in kWs bzw kJ *1h/3600s
  my($solarenergy) = AttrVal($device,"waermekapazitaet",3.8)
                     * AttrVal($device,"dichte", 993)
                     * ReadingsVal($device,'d_volumen', 0)
                     * (ReadingsVal($t_vorlauf, "temperature",0)-ReadingsVal($t_ruecklauf, "temperature",0))
                     *1/3600;
  Log3 "get_solarenergie", 1, "Function get_solarenergie return=$solarenergy";
  return($solarenergy);
}

sub get_solarleistung
{
  my($device,$t_vorlauf,$t_ruecklauf) = @_;
  Log3 "get_solarleistung", 1, "Function get_solarleistung called with device=$device und vorlauf=".ReadingsVal($t_vorlauf, "temperature",0)." und ruecklauf=".ReadingsVal($t_ruecklauf, "temperature",0)." und d_volumen=".ReadingsVal($device,'d_volumen', 0);
  # Solarleistung=Wärmekapazität * Volumenstrom * Dichte * (T_SOLARKREIS_VORLAUF - T_SOLARKREIS_RUECKLAUF)
  # Wärmeträger Propylenglykol
  # waermekapazität: 3.8 kWs/kgK
  # volumenstrom: m3/s
  # Dichte: 993kg/m3
  # EInheiten: kWs/kgK*kg/m3*m3/s*K=kJ
  # Berechnung in kWs bzw kJ
  my($solarenergy) = AttrVal($device,"waermekapazitaet",3.8)
                     * AttrVal($device,"dichte", 993)
                     * ReadingsVal($device,'volumenstrom', 0)
                     * (ReadingsVal($t_vorlauf, "temperature",0)-ReadingsVal($t_ruecklauf, "temperature",0));
  Log3 "get_solarleistung", 1, "Function get_solarleistung return=$solarenergy";
  return($solarenergy);
}

sub get_solarertrag
{
  my($device,$t_vorlauf,$t_ruecklauf) = @_;
  Log3 "get_solarertrag", 1, "Function get_solarertrag called with device=$device und vorlauf=".ReadingsVal($t_vorlauf, "temperature",0)." und ruecklauf=".ReadingsVal($t_ruecklauf, "temperature",0);
  my($solarenergy)=ReadingsVal($device, "solargesamtertrag",0)
     + get_solarenergie($device, $t_vorlauf,$t_ruecklauf);
  Log3 "get_solarertrag", 1, "Function get_solarertrag return=$solarenergy";
  return($solarenergy);
}

sub get_d_solarertrag
{
  my($device, $startdummy) = @_;
  Log3 "get_d_solarertrag", 1, "Function called with device=$device und startdummy=$startdummy";
  my($solarenergy)=ReadingsVal($device, "solargesamtertrag",0)
                 - ReadingsVal($startdummy,'state',0);
  Log3 "get_d_solarertrag", 1, "Function get_d_solarertrag return=$solarenergy";
  return($solarenergy);
}
1;

das Reading "Counter" gibt es in meinem Zählerdevice "i01"
Internals:
   CFGFN      FHEM/unipi_inputs.cfg
   DEF        4
   EXCEPT_FD  10
   GPIO_Basedir /sys/class/gpio
   NAME       i01
   NR         74
   RPI_pin    4
   STATE      V: 641.63m3 E: 0.00kWh P: 0.00 kW
   TYPE       RPI_GPIO
   WiringPi_gpio /usr/local/bin/gpio
   lasttrg    1499411570.98853
   Helper:
     DBLOG:
       Counter:
         myDbLog:
           TIME       1499411571.00286
           VALUE      25631
       solargesamtertrag:
         myDbLog:
           TIME       1499411571.00286
           VALUE      0
       solartagesertrag:
         myDbLog:
           TIME       1499411571.00286
           VALUE      0
   READINGS:
     2017-07-07 09:12:50   Counter         25631
     2017-07-06 22:09:33   Dblclick        on
     2017-07-07 09:12:50   Pinlevel        low
     2017-07-07 09:12:50   Toggle          on
     2017-07-07 09:12:50   solargesamtertrag 0
     2017-07-07 09:12:50   solarjahresertrag 0
     2017-07-07 09:12:50   solarmonatsertrag 0
     2017-07-07 09:12:50   solartagesertrag 0
     2017-07-07 09:12:50   state           off
   fhem:
     interfaces switch
Attributes:
   active_low no
   alias      Solarzähler
   ctsperm3   1000
   dichte     1042
   direction  input
   event-on-update-reading Counter,volumenstrom,d_volumen,solarleistung,solartagesertrag,solargesamtertrag
   icon       sani_solar
   interrupt  falling
   offset     616
   poll_interval 5
   pud_resistor up
   restoreOnStartup no
   room       Solarsteuerung,UniPi
   stateFormat {sprintf("V: %.2fm3",solarzaehlerstand("i01","Counter",0)).sprintf(" E: %.2fkWh",ReadingsVal("i01","solartagesertrag",0)).sprintf(" P: %.2f kW",ReadingsVal("i01","solarleistung",0));}
   userReadings volumenstrom:Counter differential {solarzaehlerstand('i01', 'Counter');}, d_volumen:Counter difference {solarzaehlerstand('i01', 'Counter');}, solarleistung:volumenstrom { get_solarleistung('i01', 'DS18B20_Vorlauf_S', 'DS18B20_Ruecklauf_S');}, solargesamtertrag {get_solarertrag('i01','DS18B20_Vorlauf_S', 'DS18B20_Ruecklauf_S'); }, solartagesertrag { get_d_solarertrag('i01', 'D_SOLARCNTATMIDNIGHT');}, solarmonatsertrag { get_d_solarertrag('i01', 'D_SOLARCNTAT1STDAYOFMONTH');}, solarjahresertrag {  get_d_solarertrag('i01','D_SOLARCNTAT1STDAYOFYEAR');}
   verbose    5
   waermekapazitaet 3.8


das war zuvor auch ersichtlich im log als ich den Trace nur auf die Ausgabe der Variablennamen ausgelegt hatte wie amenomade beschrieben hatte:
Zitat von: amenomade am 06 Juli 2017, 19:21:44
Dann bau mal ein paar Trace-befehle in den Funktionen ein, z.B.:

sub solarzaehlerstand
{
  my($device, $counter)=@_;
  Log3 "solarzaehlerstand", 1, "Function called with device=$device und counter=$counter";
  # Berechnung des Gaszaehlerstandes in m3
  # V=m3offset+counts/countsperm3
  my($zaehlerstand)=
     AttrVal($device,"offset",0)+ReadingsVal($device,$counter,0)/AttrVal($device,"ctsperm3",1000);
  Log3 "solarzaehlerstand", 1, "Function return=$zaehlerstand";

  return($zaehlerstand);
}

und schau mal in der Log, was und wie aufgerufen wird.
Zitat von: devien am 06 Juli 2017, 21:53:37
2017.07.06 21:47:44 1: Function called with device=i01 und counter=Counter
hab ich dich gerade missverstanden Prof.Dr.Peter Henning ?

das "get_solarenergie" einen Rückgabewert von "0" hat liegt offensichtlich daran das darin die Werte mit der Variablen d_volumen multipliziert werden, diese ist wie ich durch die Modifikation erkennen kann "0" was logischer Weise auch "0" ergibt
siehe Log:2017.07.07 09:23:05 1: Function get_solarenergie called with device=i01 und vorlauf=32.9375 und ruecklauf=32.6875 und d_volumen=0(ist der jüngste Logeintrag, nach der Nacht sind die Temperaturen nicht stark differierend.)
nur kann ich noch nicht verstehen weshalb eben d_volumen auf "0" bleibt wo doch Reading Counter langsam aber stetig hochzählt?
FHEM + UniPi + Arduino = gute Lösung

Prof. Dr. Peter Henning

Hm, es wird immer wilder.
Log3 "solarzaehlerstand", 1, "Function called with device=$device und counter=$counter";,
ist durchaus sinnvoll, weil device und counter die übergebenen Parameter sind.
Log3 "solarzaehlerstand", 1, "Function solarzaehlerstand called with device=$device und counter=".ReadingsVal($device,$counter,0);
ist hingegen schon mal Käse, weil das EBEN NICHT der Wert ist, der beim Aufruf an die Funktion übergeben wird. So etwas sollte man nicht einmal temporär machen - das wirft wirklich Namen und Inhalt durcheinander

Es ist auch keine gute Praxis, in der Berechnung eines neuen Wertes 5x "ReadingsVal" zu verwenden. Solche Werte müssen erst eingelesen und ggf. überprüft werden - dann kann man damit auch nicht auf die Nase fallen.

Das Reading "d_volumen" existiert nicht.

LG

pah

devien

#25
Zitat von: Prof. Dr. Peter Henning am 07 Juli 2017, 11:47:48
Hm, es wird immer wilder.
Log3 "solarzaehlerstand", 1, "Function called with device=$device und counter=$counter";,
ist durchaus sinnvoll, weil device und counter die übergebenen Parameter sind.
jup, bin ich ganz bei dir
Zitat von: Prof. Dr. Peter Henning am 07 Juli 2017, 11:47:48
Log3 "solarzaehlerstand", 1, "Function solarzaehlerstand called with device=$device und counter=".ReadingsVal($device,$counter,0);
ist hingegen schon mal Käse, weil das EBEN NICHT der Wert ist, der beim Aufruf an die Funktion übergeben wird. So etwas sollte man nicht einmal temporär machen - das wirft wirklich Namen und Inhalt durcheinander
sorry, ich wollte hier niemanden durcheinander bringen ;)
Zitat von: Prof. Dr. Peter Henning am 07 Juli 2017, 11:47:48
Es ist auch keine gute Praxis, in der Berechnung eines neuen Wertes 5x "ReadingsVal" zu verwenden. Solche Werte müssen erst eingelesen und ggf. überprüft werden - dann kann man damit auch nicht auf die Nase fallen.
die eigentlichen Perl-subs habe ich aus dem Ursprünglichen (diesem) Thread übernommen, bzw. aus dem daraus entstandenen wiki Eintrag https://wiki.fhem.de/wiki/Ertragsmessung_Solarthermie
es ist nicht "best practice", offensichtlich, jedoch schien es ursprünglich beim Verfasser und mind. einem anderen Nutzer zu funktionieren. Sobald ich das Geraffel zum Laufen habe schaue ich ob ich diesen Faupax bereinigt bekomme und evt. eine Korrektur ins Wiki erreiche.
Zitat von: Prof. Dr. Peter Henning am 07 Juli 2017, 11:47:48
Das Reading "d_volumen" existiert nicht.
"d_volumen" wird im userReading (an 2ter Stelle) des eigentlichen Volumenzählers generiert:
userReadings volumenstrom:Counter differential {solarzaehlerstand('i01', 'Counter');;}, d_volumen:Counter difference {solarzaehlerstand('i01', 'Counter');;}, solarleistung:volumenstrom { get_solarleistung('i01', 'DS18B20_Vorlauf_S', 'DS18B20_Ruecklauf_S');;}, solargesamtertrag {get_solarertrag('i01','DS18B20_Vorlauf_S', 'DS18B20_Ruecklauf_S');; }, solartagesertrag { get_d_solarertrag('i01', 'D_SOLARCNTATMIDNIGHT');;}, solarmonatsertrag { get_d_solarertrag('i01', 'D_SOLARCNTAT1STDAYOFMONTH');;}, solarjahresertrag {  get_d_solarertrag('i01','D_SOLARCNTAT1STDAYOFYEAR');;}

und da hängt sich bei mir dann die Suppe an der Gabel auf, soweit ich das zusammenbokke scheint d_volumen:Counter difference {solarzaehlerstand('i01', 'Counter');;} die differenz zwichen aktuellem Counter-Stand und dem solarzählerstand zu sein welcher wiederum die Summe von Counter und offset /1000 bildet.sub solarzaehlerstand
{
  my($device, $counter)=@_;
  Log3 "solarzaehlerstand", 1, "Function solarzaehlerstand called with device=$device und counter=".ReadingsVal($device,$counter,0);
  # Berechnung des Gaszaehlerstandes in m3
  # V=m3offset+counts/countsperm3
  my($zaehlerstand)=
     AttrVal($device,"offset",0)+ReadingsVal($device,$counter,0)/AttrVal($device,"ctsperm3",1000);
  Log3 "solarzaehlerstand", 1, "Function solarzaehlerstand return=".$zaehlerstand;
  return($zaehlerstand);
}
Ergibt bei mir =offset/1000 . Was jedoch nicht errechnet werden müsste und erstrecht nich "0" ist.

ja wahrscheinlich hab ich einen Denkfehler, aber irgendwie hänge ich gerade in einer gedanklichen Schleife und komme nicht herraus.
FHEM + UniPi + Arduino = gute Lösung

amenomade

Was ist das Ergebnis von folgendes in Fhemweb im Kommando Befehl ?
{ solarzaehlerstand("i01", "Counter") }
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

devien

Zitat von: amenomade am 08 Juli 2017, 02:24:58
Was ist das Ergebnis von folgendes in Fhemweb im Kommando Befehl ?
{ solarzaehlerstand("i01", "Counter") }

645.469 (logisch, der aktuelle Wert)
FHEM + UniPi + Arduino = gute Lösung

amenomade

Dann verstehe ich auch nicht warum d_volumen nicht gesetzt wird... :(
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

Wobei... vielleicht doch eine Idee. Probier mal folgendes:
userReadings solarzs:Counter {solarzaehlerstand('i01', 'Counter');;}, volumenstrom:Counter differential {ReadingsVal('i01', 'solarsz');;}, d_volumen:Counter difference {ReadingsVal('i01', 'solarsz');;}, solarleistung:Counter { get_solarleistung('i01', 'DS18B20_Vorlauf_S', 'DS18B20_Ruecklauf_S');;}, solargesamtertrag {get_solarertrag('i01','DS18B20_Vorlauf_S', 'DS18B20_Ruecklauf_S');; }, solartagesertrag { get_d_solarertrag('i01', 'D_SOLARCNTATMIDNIGHT');;}, solarmonatsertrag { get_d_solarertrag('i01', 'D_SOLARCNTAT1STDAYOFMONTH');;}, solarjahresertrag {  get_d_solarertrag('i01','D_SOLARCNTAT1STDAYOFYEAR');;}
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus