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
Es gibt im DOIF die Funktion aggregieren von Werten
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...
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.
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
Super, Danke dir!
"Fuer Fortgeschrittene" verstehe ich Momentan noch nicht, werde ich mir nun mal genauer anschauen!
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.