FHEM Forum

FHEM - Hausautomations-Systeme => ZWave => Thema gestartet von: Mx112 am 18 November 2013, 19:41:42

Titel: Command Class SENSOR_MULTLEVEL und METER
Beitrag von: Mx112 am 18 November 2013, 19:41:42
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
Titel: Antw:Command Class SENSOR_MULTLEVEL und METER
Beitrag von: rudolfkoenig am 18 November 2013, 20:04:39
Danke fuer den Patch, habs eingecheckt (samt DOKU!)

Klar kann man das anders formulieren, ich uebernehme gerne die Aenderungsvorschlaege  :)
Titel: Antw:Command Class SENSOR_MULTLEVEL und METER
Beitrag von: Mx112 am 18 November 2013, 22:47:41
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>
Titel: Antw:Command Class SENSOR_MULTLEVEL und METER
Beitrag von: rudolfkoenig am 19 November 2013, 09:25:58
Habs eingecheckt.
Titel: Antw:Command Class SENSOR_MULTLEVEL und METER
Beitrag von: Mx112 am 22 November 2013, 17:56:01
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
Titel: Antw:Command Class SENSOR_MULTLEVEL und METER
Beitrag von: rudolfkoenig am 23 November 2013, 12:08:04
Ich haette es aber wissen muessen, habe aber gepennt.
Danke fuer den Hinweis, habs eingecheckt.
Titel: Antw:Command Class SENSOR_MULTLEVEL und METER
Beitrag von: Mx112 am 24 November 2013, 22:02:31
Danke, funktioniert.
Was muss eigentlich bei ZW_Dongle RAW als Parameter übergeben werden? Was ich bisher probiert hatte resultierte lediglich in Timeouts?

Gruß Matthias
Titel: Antw:Command Class SENSOR_MULTLEVEL und METER
Beitrag von: rudolfkoenig am 24 November 2013, 22:48:59
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.

Titel: Antw:Command Class SENSOR_MULTLEVEL und METER
Beitrag von: Mx112 am 27 November 2013, 00:23:33
Vieleicht will ich ja noch ein Develpoer werden  :).

get ZWDongle_0 raw 02 bringt timeout:
Timeout reading answer for get get ZWDongle_0 raw