FHEM - Hausautomations-Systeme > ZWave

Command Class SENSOR_MULTLEVEL und METER

(1/2) > >>

Mx112:
Hallo Zusammen,

ich habe hier eine Erweiterung und einen Änderungswunsch an 10_ZWave.pm.

ich hab einen Fibaro Wall Plug (FGWPE) der die verbrauche Energie in kWh über die Command Class METER reportet, sowie den aktuellen Verbrauch in W über SENSOR_MULILEVEL.

Dazu habe ich die 10_ZWave.pm wie folgt erweitert (letzte 3 Zeilen), was auch funktioniert:


--- Code: ---  SENSOR_MULTILEVEL        => { id => '31',
    get   => { smStatus    => "04" },
    parse => { "06310501(..)(....)" => 'sprintf("temperature:%0.1f %s",'.
                      'hex($2)/(10**int(hex($1)/32)), '.
                      'hex($1)&8 ? "F":"C")',
   "05310505(..)(..)" => 'sprintf("humidity:%0.1f %%", '.
                      'hex($2)/(10**int(hex($1)/32)))',
   "06310504(..)(....)" => 'sprintf("power:%0.1f %s",'.
                      'hex($2)/(10**int(hex($1)/32)), '.
                      'hex($1)&8 ? "Btu/h":"W")'},},

--- Ende Code ---

Das Problem ist das METER ebenfalls das reading "power" verwendet anstatt "energy". Ideal wäre hier wenn das Reading entsprechend der übertragenen Maßeinheit benannt werden würde. Also "power" bei W, "energy" bei kWh und kVA/h sowie "pulseCount". Dann würde es auch 1:1 mir den readings der FBDECT übereinstimmen.

Ist das denkbar? Die wahrscheinlich einfachere aber auch denkbare Variante wäre das Reading Analog zur Command Class Specification einfach "electric" zu nennen. Dann kann es sich jeder passend mit userReadings umbauen.

FBDECT verwendet die readings analog und dann wäre es schön einheitlich.

Gruß
Matthias

rudolfkoenig:
Danke fuer den Patch, habs eingecheckt (samt DOKU!)

Klar kann man das anders formulieren, ich uebernehme gerne die Aenderungsvorschlaege  :)

Mx112:
Danke!

Auf die schnelle würde ich das so Lösen:
"energy" für kWh,KVAh, und pulseCount [Accumulated values]
"power" für W [Instant value]

Gruß
Matthias

--- Code: ---sub
ZWave_ParseMeter($)
{
  my ($val) = @_;
  return if($val !~ m/^(..)(..)(.*)$/);
  my ($v1, $v2, $v3) = (hex($1) & 0x1f, hex($2), $3);
  my @prectab = (1,10,100,1000,10000,100000,1000000, 10000000);
  my $prec  = $prectab[($v2 >> 5) & 0x7];
  my $scale = ($v2 >> 3) & 0x3;
  my $size  = ($v2 >> 0) & 0x7;
  my @txt = ("undef", "energy", "gas", "water");
  my $txt = ($v1 > $#txt ? "undef" : $txt[$v1]);
  my %unit = (energy => ["kWh", "kVAh", "W", "pulseCount"],
              gas   => ["m3",  "feet3", "undef", "pulseCount"],
              water => ["m3",  "feet3", "USgallons", "pulseCount"]);
  my $unit = $txt eq "undef" ? "undef" : $unit{$txt}[$scale];
  $v3 = hex(substr($v3, 0, 2*$size))/$prec;
  if ($unit == "W") { $txt = "power"; }
  return "$txt:$v3 $unit";
}

--- Ende Code ---

Doku:

--- Code: ---  <br><br><b>Class METER</b>
  <li>energy:val [kWh|kVAh|pulseCount]</li>
  <li>power:val [W]</li> 
  <li>gas:val [m3|feet3|pulseCount]</li>
  <li>water:val [m3|feet3|USgallons|pulseCount]</li>

--- Ende Code ---

rudolfkoenig:
Habs eingecheckt.

Mx112:
Hallo Rudi,

In @txt wird die Variable noch als power definiert, und die Prüfung auf "W" validiert immer zu TRUE (wusste ich nicht das Perl zwischen = und eq unterscheidet).

So funktioniert es jetzt bei mir, hab auch den Negativ Test gemacht:

--- Code: ---  my @txt = ("undef", "energy", "gas", "water");

--- Ende Code ---
und:

--- Code: ---  $txt = "power" if ($unit eq "W");

--- Ende Code ---

Gruß
Matthias

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln