userreading: Subtraktion mit statistics

Begonnen von Kornelius777, 02 September 2023, 17:26:59

Vorheriges Thema - Nächstes Thema

Kornelius777

Hallo zusammen,

nachdem mein Balkonkraftwerk nun Strom produziert, möchte ich gerne ausrechnen, wie viel vom produzierten Strom ich selber "verbraten" habe. Das sollte "eigentlich" ziemlich einfach sein.

Der gesamte vom Balkonkraftwerk produzierte Strom ist im Reading ('OUT.Balkonkraftwerk','YieldDay').
Der ins Betreibernetz eingespeiste Strom liegt als Statistics-Wert vor:
('HAR.StromZaehler','statTotal_feed_kwh'): Hour: 0.0000 Day: 1.4148 Month: 1.4148 Year: 1.4148

Nun würde ich gerne ein Userreading nutzen, das "Produzierter Strom" minus "Eingespeister Strom" rechnet.

Aber: Wie komme ich an den Wert "Heute eingespeister Strom" (im Userreading)?

Ein noch genauerer Ansatz wäre:
Nimm für die Berechnung der aktuellen Stromeinspeisung den ('HAR.StromZaehler','total_feed') und ziehe den Tageswert vom (HAR.StromZaehler','statTotal_feed_kwhLast') ab.

Doch auch hier habe ich keine Idee, wie ich an den $statTotal_feed_kwhLast[3] komme.

Mag mir bitte jemand helfen?

Herzlichen Dank!

betateilchen

#1
Zitat von: Kornelius777 am 02 September 2023, 17:26:59Aber: Wie komme ich an den Wert "Heute eingespeister Strom" (im Userreading)?

Mit ReadingsNum() vermutlich.

Zum Verständnis: Dein Text liest sich ziemlich wirr, da ist es recht schwer, das Richtige rauszulesen. Im Moment habe ich das so verstanden:

Eigenverbrauch = ('OUT.Balkonkraftwerk','YieldDay') - Tagesverbrauch('HAR.StromZaehler','statTotal_feed_kwh')

Korrekt?

Aber wo kommen dann noch zusätzlich die Werte von ('HAR.StromZaehler','total_feed') und (HAR.StromZaehler','statTotal_feed_kwhLast')  ins Spiel?

Mach doch mal ein list von HAR.StromZaehler und poste das hier.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Untestet und nur eine Vermutung:

attr HAR.StromZaehler userReading eigenverbrauch:total_feed.* { ReadingsNum('HAR.StromZaehler','statTotal_feed_kwhLast',0) =~ m/(\d+\.\d+)/g; return ReadingsNum('HAR.StromZaehler','total_feed',0) - $3;}
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Kornelius777

Tut mir leid, wenn ich nicht klar genug war.

Hier mein Stromzähler:


Internals:
   DEF        /dev/serial/by-id/usb-Silicon_Labs_CP2104_USB_to_UART_Bridge_Controller_01304F5B-if00-port0@9600,8,N,1 SML
   DeviceName /dev/serial/by-id/usb-Silicon_Labs_CP2104_USB_to_UART_Bridge_Controller_01304F5B-if00-port0@9600,8,N,1
   FD         12
   FUUID      5c5c4799-f33f-f563-243e-46dba155386aff16
   MeterType  SML
   NAME       HAR.StromZaehler
   NR         59
   PARTIAL   
   STATE      16385.2116 kWh
   TYPE       OBIS
   eventCount 3179
   Helper:
     DBLOG:
       L1:
         DBLogging:
           TIME       1693670777.87681
           VALUE      14
       L2:
         DBLogging:
           TIME       1693670777.87681
           VALUE      167
       L3:
         DBLogging:
           TIME       1693670777.87681
           VALUE      10
       power:
         DBLogging:
           TIME       1693670777.87681
           VALUE      192
       statTotal_consumption_kwh:
         DBLogging:
           TIME       1693670777.87681
           VALUE      Hour: 0.0227 Day: 2.3619 Month: 2.3619 Year: 1834.9946
       statTotal_consumption_kwhLast:
         DBLogging:
           TIME       1693670395.02522
           VALUE      Hour: 0.1139 Day: 5.6172 Month: 258.6145 Year: 2655.8036
       statTotal_feed_kwh:
         DBLogging:
           TIME       1693666795.0122
           VALUE      Hour: 0.0000 Day: 1.4148 Month: 1.4148 Year: 1.4148 (since: 2023-09-01_18:47:13 )
       statTotal_feed_kwhLast:
         DBLogging:
           TIME       1693670395.02522
           VALUE      Hour: 0.0000 Day: 0.0000 Month: 0.0000 Year: - (since: 2023-09-01_18:47:13 )
       total_consumption:
         DBLogging:
           TIME       1693670777.87681
           VALUE      16385211.6
       total_consumption_kwh:
         DBLogging:
           TIME       1693670777.87681
           VALUE      16385.2116
       total_feed:
         DBLogging:
           TIME       1693666278.79778
           VALUE      1555.2
       total_feed_kwh:
         DBLogging:
           TIME       1693666278.79778
           VALUE      1.5552
   READINGS:
     2021-02-16 08:19:09   1.0.0.0.9.255   09-01-49-53-4B-00-04-1E-7A-A9
     2021-02-16 08:19:09   129.129.199.130.3.255 ISK
     2021-02-16 08:19:09   129.129.199.130.5.255 2F50-5AEB-BF1A-4
     2023-09-02 18:06:17   L1              14
     2023-09-02 18:06:17   L2              167
     2023-09-02 18:06:17   L3              10
     2023-09-02 18:06:17   ManufID         ISK
     2023-09-02 18:06:17   PublicKey       
     2023-09-02 18:06:17   Serial          09-01-49-53-4B-
     2021-03-24 16:01:58   Version         
     2023-09-02 18:06:17   einsparung      2838.72
     2023-09-02 18:06:17   power           192
     2023-09-02 18:06:17   statPowerDay    Min: -517 Avg: 49 Max: 740
     2023-09-01 23:58:55   statPowerDayLast Min: -623 Avg: 228 Max: 2812
     2023-09-02 18:06:17   statPowerMonth  Min: -517 Avg: 49 Max: 740
     2023-09-01 23:58:55   statPowerMonthLast Min: -623 Avg: 345 Max: 6927
     2023-09-02 18:06:17   statPowerYear   Min: -623 Avg: 308 Max: 7465
     2023-01-01 23:58:55   statPowerYearLast Min: -45 Avg: 302 Max: 8008
     2023-09-02 18:06:17   statTotal_consumption_kwh Hour: 0.0227 Day: 2.3619 Month: 2.3619 Year: 1834.9946
     2023-09-02 17:59:55   statTotal_consumption_kwhLast Hour: 0.1139 Day: 5.6172 Month: 258.6145 Year: 2655.8036
     2023-09-02 18:06:17   statTotal_feed_kwh Hour: 0.0000 Day: 1.4148 Month: 1.4148 Year: 1.4148 (since: 2023-09-01_18:47:13 )
     2023-09-02 17:59:55   statTotal_feed_kwhLast Hour: 0.0000 Day: 0.0000 Month: 0.0000 Year: - (since: 2023-09-01_18:47:13 )
     2023-09-01 11:51:01   state           opened
     2023-09-02 18:06:17   total_consumption 16385211.6
     2023-09-02 18:06:17   total_consumption_Ch1 16385211.6
     2023-09-02 18:06:17   total_consumption_Ch2 0
     2023-09-02 18:06:17   total_consumption_kwh 16385.2116
     2023-09-02 18:06:17   total_feed      1555.2
     2023-09-02 18:06:17   total_feed_Ch1  1555.2
     2023-09-02 18:06:17   total_feed_Ch2  0
     2023-09-02 18:06:17   total_feed_kwh  1.5552
   helper:
     BUFFER     
     DIRECTIONSUM >
     EoM        1
     LastPacketTime 1693670777.878
     SPEED      5
     SPEED2     5
     TRIGGERTIME 1693586713.18381
     _98_statistics HAR.StromZaehler.Statistics
     Channels:
       1.0.36.7.0.255 L1
       1.0.56.7.0.255 L2
       1.0.76.7.0.255 L3
     DEVICES:
       
       60
       
     RULECACHE:
       1-0:0.0.9*255 Serial
       1-0:1.8.0*255 Counter
       1-0:1.8.1*255 Counter
       1-0:1.8.2*255 Counter
       1-0:16.7.0*255 Channels
       1-0:2.8.0*255 Counter
       1-0:2.8.1*255 Counter
       1-0:2.8.2*255 Counter
       129-129:199.130.3*255 ManufID
       129-129:199.130.5*255 PublicKey
     directions:
Attributes:
   DbLogInclude total_consumption,total_feed,power,L1,L2,L3,total_consumption_kwh,total_feed_kwh,heute_eingespart,stat.*
   channels   {"1.0.36.7.0.255"=>"L1","1.0.56.7.0.255"=>"L2","1.0.76.7.0.255"=>"L3"}
   comment    Zählernummer: 1ISK0069106345

/dev/serial/by-id/usb-Silicon_Labs_CP2104_USB_to_UART_Bridge_Controller_01304F5B-if00-port0@9600,8,N,1 SML
/dev/ttyS2@9600,8,N,1
   event-on-change-reading .*
   interval   60
   pollingMode on
   room       HAR
   stateFormat total_consumption_kwh kWh
   userReadings total_consumption_kwh {ReadingsVal("HAR.StromZaehler","total_consumption",0)/1000},
total_feed_kwh {ReadingsVal("HAR.StromZaehler","total_feed",0)/1000}

Kornelius777

Ich habe mich entschlossen, den (für mich) einfacheren Weg über ein notify zu gehen:

defmod notify_HAR.StromZaehler.EinspeisungBerechnen notify OUT.Balkonkraftwerk:YieldDay:.* \
{\
my $tagesertrag_balkonkraftwerk = ReadingsVal('OUT.Balkonkraftwerk','YieldDay','');;\
my @stromstatistik = split(/\s/,ReadingsVal('HAR.StromZaehler','statTotal_feed_kwhLast',''));;\
my $total_eingespeist = ReadingsVal('HAR.StromZaehler','total_feed','') / 1000;;\
my $tageseinspeisung = $total_eingespeist - $stromstatistik[3];;\
my $stromeinsparung = $tagesertrag_balkonkraftwerk - ($tageseinspeisung * 1000);;\
\
fhem("setreading OUT.Balkonkraftwerk heute_eingespart $stromeinsparung");;;;\
}
attr notify_HAR.StromZaehler.EinspeisungBerechnen DbLogExclude .*


Herzlichen Dank für Euer Mitdenken!

Viele Grüße!

betateilchen

Da ist eigentlich nichts einfacher, im Gegenteil.
Ein userReading ist grundsätzlich nichts anderes als ein notify, nur dass es innerhalb eines devices eingebaut wird.

Aber wenn Du mit Deiner Lösung zufrieden bist, soll es mir auch recht sein.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Kornelius777