Readings mit gleichen Namen von unterschiedlichen Devices zusammen rechnen

Begonnen von Fixel2012, 18 Dezember 2017, 11:39:12

Vorheriges Thema - Nächstes Thema

Fixel2012

Hi,

ich suche eine Möglichkeit den gegebenen Stromverbrauch meiner ZWave Rollladenaktoren zusammen zu rechnen. Zusätzlich will ich allerdings, dass auch wenn neue Geräte, die ein Stromverbrauch melden dazu gerechnet werden.

Sprich, ich will die entspechenden Readings herausfiltern. Bei meinen ZWave Aktoren heißt das Reading "energy".



Habe mal angefangen eine Sub zu erstellen. Dazu versuche ich mit TYPE alle ZWave aktoren mit dem Reading energy zu Filtern. Anschließend will ich dies in ein Array anlegen lassen. So wie ich das gelesen habe, geht das wohl mit DevSpec2array. Daraufhin soll in einer foreach schleife so oft durch gegangen werden, bis alle Devices durch sind, bei jedem durchgang soll der energy counter mit dem energy reading addiert werden.

Allerdings kriege ich einen Error beim speichern, ich werde nicht so recht schlau daraus.

Dazu kommt noch, dass ich absoluter Anfänger was per und generelles Programmieren angeht. Mache gerade meine ersten Anfänge mit perl in der MyUtils.pm  8)


Hier die Fehlermeldung:

Can't modify constant item in scalar assignment at ./FHEM/99_myUtils.pm line 232, near "ZWave energy)"

Hier meine sub:

sub ZWaveStromKosten() {

my $WattGesamt = 0;
my @Geraete = (devspec2array(TYPE=ZWave energy));

foreach my $Gereate_2 (@Geraete) {

my $WattProGeraet = ReadingsVal($Gereate_2, "energy", "0");

$WattGesamt + $WattProGeraet = $WattGesamt;

}

return $WattGesamt;

}




Ich habe auch schon versucht den Code ein wenig anhand von anderen Beispielen um zu stellen, allerdings kriege ich dann eine andere Fehlermeldung:

Can't modify constant item in scalar assignment at ./FHEM/99_myUtils.pm line 234, near "ZWave energy)"

Meine neue sub:

sub ZWaveStromKosten() {

my $WattGesamt = 0;
#my @Geraete = (devspec2array(TYPE=ZWave energy));

foreach my $Gereate_2 (devspec2array(TYPE=ZWave energy)) {
#(@Geraete)
my $WattProGeraet = ReadingsVal($Gereate_2, "energy", "0");

$WattGesamt + $WattProGeraet = $WattGesamt;

}

return $WattGesamt;

}


Ich hoffe es ist verständlich, was ich vor habe  :)

Würde mich freuen, wenn ihr mir perl ein wenig näher bringen könntet  :D

Gruß,

Fixel
Fhem 5.8 auf Raspi 3, HMLAN und 868MHz CUL mit einigen Komponenten, Z-Wave Rollladenaktoren, Tablet UI, 433 MHz CUL mit Baumarktsteckdosen und Temp Sensoren, Amazon Echo, Echo Dot, 2x SONOS  play1, 1x SONOS Connect AMP,  presence, HUE, Lightify

igami

Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

kumue

ich denke mit einem DOIF sollte es gehen...
siehe hier
http://www.fhem.de/commandref_DE.html#DOIF_aggregation
Es sind auch viele Besipiele aufgeführt. Denke, damit bekommst Du es hin...

Fixel2012

So ganz verstehen tue ich das nicht...  :(

Wollte nun erstmal versuchen den Rollladen mit dem höchsten Verbrauch in den state zu schreiben.

Allerdings funktioniert das Attr "state" bei mir nicht.

Bei mir wird weiterhin initialized im STATE angezeigt.

Internals:
   CFGFN     
   DEF       
   NAME       KW_Verbrauch_ZWave
   NR         32098
   NTFY_ORDER 50-KW_Verbrauch_ZWave
   STATE      initialized
   TYPE       DOIF
   READINGS:
     2017-12-18 13:06:02   cmd             0
     2017-12-18 13:06:02   state           initialized
   Regex:
     STATE:
       :
         STATE:
           "TYPE=ZWave energy:d2" TYPE=ZWave energy:d2
   condition:
   devices:
   do:
     0:
   helper:
     DOIF_Readings_events
     DOIF_eventas
     globalinit 1
     last_timer 0
     sleeptimer -1
   itimer:
   uiState:
   uiTable:
Attributes:
   state      [@max"TYPE=ZWave energy:d2":energy:$_,0]


Noch dazu kommt dann am Ende, dass ich alle Readings noch addieren will.
Fhem 5.8 auf Raspi 3, HMLAN und 868MHz CUL mit einigen Komponenten, Z-Wave Rollladenaktoren, Tablet UI, 433 MHz CUL mit Baumarktsteckdosen und Temp Sensoren, Amazon Echo, Echo Dot, 2x SONOS  play1, 1x SONOS Connect AMP,  presence, HUE, Lightify

rudolfkoenig

Fuer perl Anfaenger:
sub
ZWaveStromKosten()
{
  my $WattGesamt = 0;
  my @Geraete = devspec2array("energy=.+");
  foreach my $Gereate_2 (@Geraete) {
    my $WattProGeraet = ReadingsNum($Gereate_2, "energy", "0");
    $WattGesamt = $WattGesamt+ $WattProGeraet
  }
  return $WattGesamt;
}


Fuer Fortgeschrittene:
sub
ZWaveStromKosten2()
{
  my $WattGesamt = 0;
  map { $WattGesamt+=ReadingsNum($_,"energy","0") } devspec2array("r:energy=.+");
  return $WattGesamt;
}


Test:
fhem> define d1 dummy
fhem> define d2 dummy
fhem> setreading d2 energy 17
fhem> setreading d1 energy 7
fhem> { ZWaveStromKosten() }
24

Fixel2012

Super, Danke dir!

"Fuer Fortgeschrittene" verstehe ich Momentan noch nicht, werde ich mir nun mal genauer anschauen!
Fhem 5.8 auf Raspi 3, HMLAN und 868MHz CUL mit einigen Komponenten, Z-Wave Rollladenaktoren, Tablet UI, 433 MHz CUL mit Baumarktsteckdosen und Temp Sensoren, Amazon Echo, Echo Dot, 2x SONOS  play1, 1x SONOS Connect AMP,  presence, HUE, Lightify

Damian

oder einfach

define di_sum DOIF
attr di_sum state [#sum:d2:":energy":energy:$TYPE eq "ZWave"]


Der Status des Moduls beinhaltet immer die aktuelle Summe der Readings. Sobald sich irgendein energy-Reading verändert, wird die Summe automatisch aktualisiert. Die Summe wird hier auf zwei Nachkommastellen formatiert.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF