FHEM Forum

FHEM => Automatisierung => Thema gestartet von: Fixel2012 am 18 Dezember 2017, 11:39:12

Titel: Readings mit gleichen Namen von unterschiedlichen Devices zusammen rechnen
Beitrag von: Fixel2012 am 18 Dezember 2017, 11:39:12
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
Titel: Antw:Readings mit gleichen Namen von unterschiedlichen Devices zusammen rechnen
Beitrag von: igami am 18 Dezember 2017, 11:55:01
Es gibt im DOIF die Funktion aggregieren von Werten
Titel: Antw:Readings mit gleichen Namen von unterschiedlichen Devices zusammen rechnen
Beitrag von: kumue am 18 Dezember 2017, 11:56:44
ich denke mit einem DOIF sollte es gehen...
siehe hier
http://www.fhem.de/commandref_DE.html#DOIF_aggregation (http://www.fhem.de/commandref_DE.html#DOIF_aggregation)
Es sind auch viele Besipiele aufgeführt. Denke, damit bekommst Du es hin...
Titel: Antw:Readings mit gleichen Namen von unterschiedlichen Devices zusammen rechnen
Beitrag von: Fixel2012 am 18 Dezember 2017, 13:08:33
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.
Titel: Antw:Readings mit gleichen Namen von unterschiedlichen Devices zusammen rechnen
Beitrag von: rudolfkoenig am 18 Dezember 2017, 13:09:26
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
Titel: Antw:Readings mit gleichen Namen von unterschiedlichen Devices zusammen rechnen
Beitrag von: Fixel2012 am 18 Dezember 2017, 13:17:56
Super, Danke dir!

"Fuer Fortgeschrittene" verstehe ich Momentan noch nicht, werde ich mir nun mal genauer anschauen!
Titel: Antw:Readings mit gleichen Namen von unterschiedlichen Devices zusammen rechnen
Beitrag von: Damian am 18 Dezember 2017, 13:31:22
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.