DOIF soll Werte aus dummy auslesen und addieren

Begonnen von moonsorrox, 26 August 2022, 18:50:35

Vorheriges Thema - Nächstes Thema

Damian

In deiner ursprünglichen Definition wurde, warum auch immer, NOTIFYDEV nicht richtig gesetzt:

ZitatNOTIFYDEV  global,di_counter_new

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

moonsorrox

ich habe ein zweites DOIF in meiner Produktivumgebung erstellt.
Es gibt in beiden DOIF dieses
NOTIFYDEV di_counter_new,global

Produktiv Fhem
NOTIFYDEV di_pvanlage_1,global

Was kann ich jetzt noch machen.?
Ich habe die dummys beobachtet es sind teilweise nur 90sec. das es aktualisiert wird wobei jetzt auf dem Nachmittag die kWh nicht mehr so steigen.

Diese dummys werden vom ioBroker erstellt, weil es dort dieses Growatt Modul gibt sonst hätte ich gar keine Werte, aber wie gesagt die Übermittlung funktioniert tadellos.
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Damian

Die Readings müssen zum Zeitpunkt der Definition des DOIF  (defmod) existieren, sonst klappt das nicht.

Beim anderen DOIF (mit den beiden Diagrammen) sieht es dagegen besser aus:

ZitatNOTIFYDEV  global,growatt.0.294937.devices.QMB39212B4.deviceData.eMonth,growatt.0.294937.devices.QMB39212B4.deviceData.eTotal
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

moonsorrox

ja das habe ich schon verglichen und auch gesehen.
Aber wie bekomme ich das denn hin.?

Kann ich das im nachhinein erstellen.?
NOTIFYDEV  global,growatt.0.294937.devices.QMB39212B4.deviceData.eTotal

Wenn ich dieses DOIF erstellen gehe ich in die Kommandozeile und trage folgendes ein
define di_counter_new DOIF {}
weil ich ja das ganze DOIF nicht in der Kommandozeile erstellen kann.

Dann gehe ich in die RAW Definition und trage es komplett ein und speichere. Dabei sollte er doch das
NOTIFYDEV
erstellen..! oder nicht?
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Damian

NOTIFYDEV wird von FHEM selbst erstellt, es bringt nichts es selbst zu manipulieren.

Du musst dich herantasten an das Problem.

Wird NOTIFYDEV gesetzt, bei

define di_growatt_test DOIF ([growatt.0.294937.devices.QMB39212B4.deviceData.eTotal:state])()

?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

moonsorrox

ja es wird erstellt

Internals:
   CFGFN     
   DEF        ([growatt.0.294937.devices.QMB39212B4.deviceData.eTotal:state])()
   FUUID      630e3f6a-f33f-b063-5dc8-07e16a8ba4b91330
   MODEL      FHEM
   NAME       di_growatt_test
   NOTIFYDEV  global,growatt.0.294937.devices.QMB39212B4.deviceData.eTotal
   NR         1602
   NTFY_ORDER 50-di_growatt_test
   STATE      cmd_1
   TYPE       DOIF
   VERSION    26182 2022-06-29 18:57:26
   eventCount 2
   READINGS:
     2022-08-30 18:50:27   Device          growatt.0.294937.devices.QMB39212B4.deviceData.eTotal
     2022-08-30 18:49:57   cmd             1
     2022-08-30 18:49:57   cmd_event       growatt.0.294937.devices.QMB39212B4.deviceData.eTotal
     2022-08-30 18:49:57   cmd_nr          1
     2022-08-30 18:50:27   e_growatt.0.294937.devices.QMB39212B4.deviceData.eTotal_state 3281.9
     2022-08-30 18:48:42   mode            enabled
     2022-08-30 18:49:57   state           cmd_1
   Regex:
     accu:
     collect:
     cond:
       growatt.0.294937.devices.QMB39212B4.deviceData.eTotal:
         0:
           state      ^growatt.0.294937.devices.QMB39212B4.deviceData.eTotal$:^state:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'growatt.0.294937.devices.QMB39212B4.deviceData.eTotal','state')
   do:
     0:
       0         
     1:
   helper:
     NOTIFYDEV  global,growatt.0.294937.devices.QMB39212B4.deviceData.eTotal
     event      3281.9
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   growatt.0.294937.devices.QMB39212B4.deviceData.eTotal
     timerevent 3281.9
     triggerDev growatt.0.294937.devices.QMB39212B4.deviceData.eTotal
     timerevents:
       3281.9
     timereventsState:
       state: 3281.9
     triggerEvents:
       3281.9
     triggerEventsState:
       state: 3281.9
   internals:
   readings:
     all         growatt.0.294937.devices.QMB39212B4.deviceData.eTotal:state
   trigger:
   uiState:
   uiTable:
Attributes:
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Damian

OK, dann poste mal deine komplette Definition von di_counter_new als RAW-Definition, damit ich es bei mir nachvollziehen kann.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

moonsorrox

gerne

defmod di_counter_new DOIF subs {\
## Device Reading\
push (@{$_counter},["growatt.0.294937.devices.QMB39212B4.deviceData.eTotal","state"]);; ## PV-Energie Einspeisung\
\
sub midnight { ## Diese Funktion wird um Mitternacht ausgeführt\
  my ($device,$reading,$mday,$yday)=@_;;\
  set_Reading("$device.$reading.day_counter",ReadingsVal($device, $reading,1));;   \
  set_Reading("$device.$reading.last_day",get_Reading("$device.$reading.day",0),1);;\
  set_Reading("$device.$reading.day",0,1);;\
  set_Reading ("$device.$reading.month",int((ReadingsVal($device, $reading,0)-(get_Reading("$device.$reading.month_counter",0)))*1000)/1000,1);;\
  set_Reading ("$device.$reading.year",int((ReadingsVal($device, $reading,0)-(get_Reading("$device.$reading.year_counter",0)))*1000)/1000,1);;\
\
  if ($mday == 1) {\
    set_Reading("$device.$reading.month_counter",ReadingsVal($device, $reading,0));;\
    set_Reading("$device.$reading.last_month",get_Reading("$device.$reading.month",0),1);;\
    set_Reading("$device.$reading.month",0,1);;\
  }\
  if ($yday == 1) {\
    set_Reading("$device.$reading.year_counter",ReadingsVal($device, $reading,0));;\
    set_Reading("$device.$reading.last_year",get_Reading("$device.$reading.year",0),1);;\
    set_Reading("$device.$reading.year",0,1);;\
  }\
}\
\
sub init_readings {\
  my ($device,$reading)=@_;;\
  if (get_Reading("$device.$reading.day_counter","") eq "") {   ## Initialisierung der Readings\
    ## aktuellen Zählerstand initialisieren\
    set_Reading("$device.$reading.last_counter",ReadingsVal($device, $reading,0));;\
    set_Reading("$device.$reading.day_counter",ReadingsVal($device, $reading,0));; \
    set_Reading("$device.$reading.month_counter",ReadingsVal($device, $reading,0));;\
    set_Reading("$device.$reading.year_counter",ReadingsVal($device, $reading,0));;\
  \
    set_Reading ("$device.$reading.day",0);;           ## aktueller Tagesverbrauch\
    set_Reading ("$device.$reading.month",0);;         ## aktueller Monatsverbrauch\
    set_Reading ("$device.$reading.year",0);;          ## aktueller Jahresverbrauch\
    set_Reading ("$device.$reading.last_day",0);;      ## Verbrauch des letzten Tages\
    set_Reading ("$device.$reading.last_month",0);;    ## Verbrauch des letzten Monats\
    set_Reading ("$device.$reading.last_year",0);;     ## Verbrauch des letzten Jahres\
## Log definieren\
fhem ("defmod log.counter.$device.$reading FileLog ./log/counter.$device.$reading.log $SELF:$device.$reading.(last_(day|month|year)|(day|month)_counter):.*");;\
    fhem ("attr log.counter.$device.$reading room Logs");;\
}\
\
}\
} ## Ende subs-Block\
\
mid {[00:01];;                          ## Sicherung der Daten um Mitternacht\
  for (my $i=0;;$i<@{$_counter};;$i++) { ## Für jeden Zähler wird die Funktion midnight aufgerufen\
    midnight($_counter[$i][0],$_counter[$i][1],$mday,$yday);;\
  }\
}\
\
init {                                ## initialisierung aller Readings\
  for (my $i=0;;$i<@{$_counter};;$i++) {## Für jeden Zähler werden Readings über die Funktion init_readings initialisiert\
    init_readings($_counter[$i][0],$_counter[$i][1]);;\
  }\
}\
\
DEF TPL_stat (\
  day_count_$1_$2 { ## bei einem Event des Zählers, wird der tägliche, monatliche und jährliche Verbrauch im jeweiligen Reading festgehalten\
                    ##  $1 Zählerdevice, $2 Zählerreading\
\
    my $diff = int(([$1:$2,0]-(get_Reading("$1.$2.last_counter",0)))*1000)/1000;;\
    set_Reading ("$1.$2.last_counter",[$1:$2,0]);;\
    set_Reading ("$1.$2.day",int(([$1:$2,0]-(get_Reading("$1.$2.day_counter",0)))*1000)/1000,1);;\
    set_Reading ("$1.$2.month",int(([$1:$2,0]-(get_Reading("$1.$2.month_counter",0)))*1000)/1000,1);;\
    set_Reading ("$1.$2.year",int(([$1:$2,0]-(get_Reading("$1.$2.year_counter",0)))*1000)/1000,1);;\
  }\
)\
\
\
\
## Pro Zähler wird über eine FOR-Schleife ein day_count_<Device>_<Reading>-Block generiert\
FOR(@{$_counter},TPL_stat($1$1,$1$2)) ## $1$1 entspricht dem Device, $1$2 entspricht dem Reading
attr di_counter_new room AutomationTest
attr di_counter_new uiTable {package ui_Table;;;;$ANIMATE=0}\
## Tabellendefinition\
card([di_counter_new:growatt.0.294937.devices.QMB39212B4.deviceData.eTotal.state.day:col],"Solarenergie Tagesverlauf in KWh","",0,10,30,90,"kWh",undef,"1","160,1,1,0,1,,200","0,0,0,0,2")|
card([di_counter_new:growatt.0.294937.devices.QMB39212B4.deviceData.eTotal.state.last_day:col4w],"Solarenergie in kWh pro Tag","",0,10,30,90,"kWh",undef,"1","160,1,1,0,1,,200","0,0,0,0,2")|
card([di_counter_new:growatt.0.294937.devices.QMB39212B4.deviceData.eTotal.state.last_month:col365d],"Solarenergie in kWh pro Monat","",0,600,30,90,"kWh",undef,"0","160,1,1,0,1,,200","0,0,0,0,2")

Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Damian

Es liegt wohl an den Punkten in deinem growatt-Devicenamen. Der Devicename wird intern auch als DOIF-Blockname genutzt und Punkte sind dort nicht vorgesehen.

Wenn du statt Punkte _ benutzen kannst, dann sollte es gehen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

moonsorrox

da ich dieses dummy mit den Punkten vom ioBroker bekomme habe ich darauf keinen Einfluss.
ich müßte mir ein etwas erstellen welches jedesmal dieses device übernimmt und dann umwandelt.
Puuh das ist ja ein Aufwand, ich denke ich muss mir dann was anderes einfallen lassen wie ich die Werte oder besser den Wert bekomme.
Es ging ja hauptsächlich darum einen Wert jährlich zu bekommen weil ich den nicht habe, die anderen Werte habe ich ja bereits mit deinen Card's umgesetzt.

Ich denke mal etwas nach.... was ich am besten mache  ;)
Vielen Dank ersteinmal für die Unterstützung.
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Damian

Du brauchst doch nur definieren:

define my_growatt DOIF {set_State([growatt.0.294937.devices.QMB39212B4.deviceData.eTotal:state])}

und im anderen DOIF die push-Zeile ändern in:

push (@{$_counter},["my_growatt","state"]);; ## PV-Energie Einspeisung\

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

moonsorrox

hier nun mal die Rückmeldung von mir, ist ja erst seit gestern so, aber es scheint zu funktionieren  ;) Vielen Dank Damian

Muss jetzt nochmal schauen wie er den Jahreswert berechnet, denn den habe ich ja noch nicht visualisiert mit "uiTable"
Ein Momentan Screeshot
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Damian

Zitat von: moonsorrox am 01 September 2022, 17:04:57
hier nun mal die Rückmeldung von mir, ist ja erst seit gestern so, aber es scheint zu funktionieren  ;) Vielen Dank Damian

Muss jetzt nochmal schauen wie er den Jahreswert berechnet, denn den habe ich ja noch nicht visualisiert mit "uiTable"
Ein Momentan Screeshot

Das sieht doch schon mal gut aus, da du ja alle wichtigen Daten im log hast (last_day, last_month, last_year), kannst du dir zusätzlich zu uiTable  auch svg-plots bauen. Den Jahresverlauf kann man im dritten Diagramm sehen, der Jahresverbrauch selbst wird am 01.01 im Reading last_year erscheinen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

moonsorrox

Ja klar das mit den Plots weiß ich, aber ich bin nicht so der PlotFan ;)
Wobei das bei der PV Anlage sicher mal eine Idee wäre, denke ich mal drüber nach.

Was mich ein wenig stört grad ist das er eben den gesamten Jahresverbrauch nicht anzeigt, kann er ja auch nicht weil er ja die Werte nicht hat, dass heißt auch am 01.01.2023 hat er nur die Werte von gestern ab.
Habe schon überlegt ob ich ihn nicht irgendwie überlisten ;) kann, denn ich habe sie ja als Monatswerte vorliegen und brauche sie nur zusammen rechnen.
Aber das wird wohl nicht funktionieren diese einzupflegen.

Einen Vesuch habe ich schon gestartet in dem ich mit "deletereading" die Werte lösche und mit setreading wieder die errechneten rein bringe, hat aber nicht funktioniert, er hat dann den einen Wert doppelt gehabt und nicht überschrieben das war der Wert mit *.year am Ende. Weißt du ob das gehen würde, dann hätte ich schon mal den Wert dann für das aktuelle Jahr.
Der hohe Wert von aktuell 3295.6 ist ja der Gesamtwert seit der Installation am 21.04.2012.
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Damian

Zitat von: moonsorrox am 01 September 2022, 23:31:29
Ja klar das mit den Plots weiß ich, aber ich bin nicht so der PlotFan ;)
Wobei das bei der PV Anlage sicher mal eine Idee wäre, denke ich mal drüber nach.

Was mich ein wenig stört grad ist das er eben den gesamten Jahresverbrauch nicht anzeigt, kann er ja auch nicht weil er ja die Werte nicht hat, dass heißt auch am 01.01.2023 hat er nur die Werte von gestern ab.
Habe schon überlegt ob ich ihn nicht irgendwie überlisten ;) kann, denn ich habe sie ja als Monatswerte vorliegen und brauche sie nur zusammen rechnen.
Aber das wird wohl nicht funktionieren diese einzupflegen.

Einen Vesuch habe ich schon gestartet in dem ich mit "deletereading" die Werte lösche und mit setreading wieder die errechneten rein bringe, hat aber nicht funktioniert, er hat dann den einen Wert doppelt gehabt und nicht überschrieben das war der Wert mit *.year am Ende. Weißt du ob das gehen würde, dann hätte ich schon mal den Wert dann für das aktuelle Jahr.
Der hohe Wert von aktuell 3295.6 ist ja der Gesamtwert seit der Installation am 21.04.2012.

Dann ist dir wahrscheinlich entgangen, dass im Reading ..year (nicht ...last_year) der aktuelle Jahresverbrauch drin steht, dieser wird täglich um Mitternacht aktualisiert, also brauchst du nur diesen darzustellen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF