Basierend auf diesem initalialen Thread zur Erweiterung dass in Smartvisu das DimLevel stimmt nach ein- und ausschalten habe ich jetzt für die Home-Easy Devices mit einem Notify auch eine virtuelle Strom-Messung dazugebaut.
Wenn man das userattr powerMax gesetzt hat wird der aus dem Dim-Level die aktuelle Leistung in W und bei einer Änderung des Levels wird der Verbrauch für die letzte Zeitperiode in kWh berechnet.
Zuerst wollte ich es über Userreadings machen aber das hatte ich sowohl Probleme mit der Reihenfolge der Berechung als auch dass es sich mit dem Statistik-Modul in die Haare kommt.
Auch das EMonitor Modul kenne, aber das ist mit den Dimmern nicht wirklich klargekommen und hat mehr als einmal mein FHEM zerschossen (und konnte zu viel mit den readinggroups etc - habe dann vor einem Jahr damit aufgegeben)
Bin offen für Verbesserungsvorschläge.
{if ($TYPE eq "TRX_LIGHT")
{
my $timeEnd = str2time(TimeNow());
my $timeStart =str2time(ReadingsTimestamp("$NAME","powerLevel",0));
my $timeElapsed= $timeEnd - $timeStart;
my $powerConsumption = ReadingsVal("$NAME","power",0)*$timeElapsed/3600000;
if ($EVENT eq "off") {
fhem ("setreading $NAME switchState $EVENT");
fhem ("setreading $NAME level 0");
fhem ("setreading $NAME powerLevel 0");
}
elsif ($EVENT eq "on"){
my $levelLastValue = ReadingsVal("$NAME","levelLast",0);
my $powerLevel = $levelLastValue * (100/15);
fhem ("setreading $NAME switchState $EVENT");
fhem ("setreading $NAME level $levelLastValue");
fhem ("setreading $NAME powerLevel $powerLevel");
}
elsif ($EVENT =~ /level/){
my $levelValue = $EVENT;
$levelValue =~ s/[^0-9]//g;
if ($levelValue >0)
{fhem ("setreading $NAME switchState on");}
else
{fhem ("setreading $NAME switchState off");}
my $powerLevel = $levelValue * (100/15);
fhem ("setreading $NAME level $levelValue");
fhem ("setreading $NAME levelLast $levelValue");
fhem ("setreading $NAME powerLevel $powerLevel");
}
my $power = ReadingsVal("$NAME","powerLevel",0)*AttrVal("$NAME","powerMax",0)/100;
fhem ("setreading $NAME power $power");
fhem ("setreading $NAME powerConsumption $powerConsumption");
}
}
level 0
levelLast 15
power 0
powerConsumption 0.214722222222222
powerLevel 0
state level 9
switchState off
Eine kleine Verbesserung weil manche HE Dimmer Level 0 nicht als off interpretieren sondern noch als 5% on. > bei Level 0 wird automatisch auf off gesetzt.#
Zitat{if ($TYPE eq "TRX_LIGHT")
{
my $timeEnd = str2time(TimeNow());
my $timeStart =str2time(ReadingsTimestamp("$NAME","powerLevel",0));
my $timeElapsed= $timeEnd - $timeStart;
my $powerConsumption = ReadingsVal("$NAME","power",0)*$timeElapsed/3600000;
if ($EVENT eq "off") {
fhem ("setreading $NAME switchState $EVENT");
fhem ("setreading $NAME level 0");
fhem ("setreading $NAME powerLevel 0");
}
elsif ($EVENT eq "on"){
my $levelLastValue = ReadingsVal("$NAME","levelLast",0);
my $powerLevel = $levelLastValue * (100/15);
fhem ("setreading $NAME switchState $EVENT");
fhem ("setreading $NAME level $levelLastValue");
fhem ("setreading $NAME powerLevel $powerLevel");
}
elsif ($EVENT =~ /level/){
my $levelValue = $EVENT;
$levelValue =~ s/[^0-9]//g;
if ($levelValue >0)
{fhem ("setreading $NAME switchState on");}
else
{
fhem ("setreading $NAME switchState off");
fhem ("set $NAME off");
}
my $powerLevel = $levelValue * (100/15);
fhem ("setreading $NAME level $levelValue");
fhem ("setreading $NAME levelLast $levelValue");
fhem ("setreading $NAME powerLevel $powerLevel");
}
my $power = ReadingsVal("$NAME","powerLevel",0)*AttrVal("$NAME","powerMax",0)/100;
fhem ("setreading $NAME power $power");
fhem ("setreading $NAME powerConsumption $powerConsumption");
}
}
Hört sich interessant an. Was hast Du alles am 46_TRX_LIGHT.pm geändert? Wenn Du mir einen Diff schickst bzw. die komplette Version, schaue ich mir das an und packe es ins SVN, wenn nichts dagegen spricht.
Grüße
Willi
Ich habe das als Notify laufen, an den Modulen selber habe ich gar nichts geändert
edit: hier die aktuelle Version (die nicht nur die smartvisu darstellung korrigiert sondern auch das dimlevel wirklich wiederherstellt ;) )
Ist alles zusammen sehr inprovisiert für meine Verhältnisse (sprich wiederstellen des Dim-Levels + einen virtuellen Verbrauch ausrechnen)
{if ($TYPE eq "TRX_LIGHT")
{
my $timeEnd = str2time(TimeNow());
my $timeStart =str2time(ReadingsTimestamp("$NAME","powerLevel",0));
my $timeElapsed= $timeEnd - $timeStart;
my $powerConsumption = ReadingsVal("$NAME","power",0)*$timeElapsed/3600000;
if ($EVENT eq "off") {
fhem ("setreading $NAME switchState $EVENT");
fhem ("setreading $NAME level 0");
fhem ("setreading $NAME powerLevel 0");
}
elsif ($EVENT eq "on"){
my $levelLastValue = ReadingsVal("$NAME","levelLast",0);
my $powerLevel = $levelLastValue * (100/15);
fhem ("setreading $NAME switchState $EVENT");
fhem ("setreading $NAME level $levelLastValue");
fhem ("setreading $NAME powerLevel $powerLevel");
fhem ("set $NAME level $levelLastValue");
}
elsif ($EVENT =~ /level/){
my $levelValue = $EVENT;
$levelValue =~ s/[^0-9]//g;
if ($levelValue >0)
{fhem ("setreading $NAME switchState on");}
else
{
fhem ("setreading $NAME switchState off");
fhem ("set $NAME off");
}
my $powerLevel = $levelValue * (100/15);
fhem ("setreading $NAME level $levelValue");
fhem ("setreading $NAME levelLast $levelValue");
fhem ("setreading $NAME powerLevel $powerLevel");
}
my $power = ReadingsVal("$NAME","powerLevel",0)*AttrVal("$NAME","powerMax",0)/100;
fhem ("setreading $NAME power $power");
fhem ("setreading $NAME powerConsumption $powerConsumption");
}
}
Aber wenn du dafür offen bist schaue ich mir gerne das modul an ob ich die dimlevel sachen einbauen kann.