Command Class SENSOR_MULTLEVEL und METER

Begonnen von Mx112, 18 November 2013, 19:41:42

Vorheriges Thema - Nächstes Thema

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:


  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")'},},


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
FHEM 5.5 SVN - FB7390 FRITZ!OS 06.03 - RaspberryPi - Z-Wave - FBDECT

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

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";
}


Doku:

  <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>
FHEM 5.5 SVN - FB7390 FRITZ!OS 06.03 - RaspberryPi - Z-Wave - FBDECT

rudolfkoenig


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:

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

und:

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


Gruß
Matthias
FHEM 5.5 SVN - FB7390 FRITZ!OS 06.03 - RaspberryPi - Z-Wave - FBDECT

rudolfkoenig

Ich haette es aber wissen muessen, habe aber gepennt.
Danke fuer den Hinweis, habs eingecheckt.

Mx112

Danke, funktioniert.
Was muss eigentlich bei ZW_Dongle RAW als Parameter übergeben werden? Was ich bisher probiert hatte resultierte lediglich in Timeouts?

Gruß Matthias
FHEM 5.5 SVN - FB7390 FRITZ!OS 06.03 - RaspberryPi - Z-Wave - FBDECT

rudolfkoenig

Raw ist ja "developer only" :), insofern muss man in %gets nach Beispielen schauen:
  "caps"      => "07",     # SERIAL_API_GET_CAPABILITIES
  "ctrlCaps"  => "05",     # ZW_GET_CONTROLLER_CAPS
  "nodeInfo"  => "41%02x", # ZW_GET_NODE_PROTOCOL_INFO
  "nodeList"  => "02",     # SERIAL_API_GET_INIT_DATA
  "homeId"    => "20",     # MEMORY_GET_ID
  "version"   => "15",     # ZW_GET_VERSION
  "raw"       => "%s",

also muesste "get ZWD raw 02" mit ""get ZWD nodeList" equivalent sein.
Ich glaube hier ist noch viel zu tun, ich habe nichtmal 10% der Kommandos auf diese Ebene implementiert.


Mx112

Vieleicht will ich ja noch ein Develpoer werden  :).

get ZWDongle_0 raw 02 bringt timeout:
Timeout reading answer for get get ZWDongle_0 raw
FHEM 5.5 SVN - FB7390 FRITZ!OS 06.03 - RaspberryPi - Z-Wave - FBDECT