36_EC3000.pm 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. # $Id: 36_EC3000.pm 12057 2016-08-22 19:31:37Z justme1968 $
  2. #
  3. # TODO:
  4. package main;
  5. use strict;
  6. use warnings;
  7. use SetExtensions;
  8. sub EC3000_Parse($$);
  9. sub
  10. EC3000_Initialize($)
  11. {
  12. my ($hash) = @_;
  13. $hash->{Match} = "^\\S+\\s+22";
  14. #$hash->{SetFn} = "EC3000_Set";
  15. #$hash->{GetFn} = "EC3000_Get";
  16. $hash->{DefFn} = "EC3000_Define";
  17. $hash->{UndefFn} = "EC3000_Undef";
  18. $hash->{FingerprintFn} = "EC3000_Fingerprint";
  19. $hash->{ParseFn} = "EC3000_Parse";
  20. $hash->{AttrFn} = "EC3000_Attr";
  21. $hash->{AttrList} = "IODev".
  22. " offLevel".
  23. " $readingFnAttributes";
  24. }
  25. sub
  26. EC3000_Define($$)
  27. {
  28. my ($hash, $def) = @_;
  29. my @a = split("[ \t][ \t]*", $def);
  30. if(@a != 3 ) {
  31. my $msg = "wrong syntax: define <name> EC3000 <addr>";
  32. Log3 undef, 2, $msg;
  33. return $msg;
  34. }
  35. $a[2] =~ m/^([\da-f]{4})$/i;
  36. return "$a[2] is not a valid EC3000 address" if( !defined($1) );
  37. my $name = $a[0];
  38. my $addr = $a[2];
  39. #return "$addr is not a 1 byte hex value" if( $addr !~ /^[\da-f]{2}$/i );
  40. #return "$addr is not an allowed address" if( $addr eq "00" );
  41. return "EC3000 device $addr already used for $modules{EC3000}{defptr}{$addr}->{NAME}." if( $modules{EC3000}{defptr}{$addr}
  42. && $modules{EC3000}{defptr}{$addr}->{NAME} ne $name );
  43. $hash->{addr} = $addr;
  44. $modules{EC3000}{defptr}{$addr} = $hash;
  45. AssignIoPort($hash);
  46. if(defined($hash->{IODev}->{NAME})) {
  47. Log3 $name, 3, "$name: I/O device is " . $hash->{IODev}->{NAME};
  48. } else {
  49. Log3 $name, 1, "$name: no I/O device";
  50. }
  51. $attr{$name}{stateFormat} = 'state (power W)' if( !defined( $attr{$name}{stateFormat} ) );
  52. return undef;
  53. }
  54. #####################################
  55. sub
  56. EC3000_Undef($$)
  57. {
  58. my ($hash, $arg) = @_;
  59. my $name = $hash->{NAME};
  60. my $addr = $hash->{addr};
  61. delete( $modules{EC3000}{defptr}{$addr} );
  62. return undef;
  63. }
  64. #####################################
  65. sub
  66. EC3000_Get($@)
  67. {
  68. my ($hash, $name, $cmd, @args) = @_;
  69. return "\"get $name\" needs at least one parameter" if(@_ < 3);
  70. my $list = "";
  71. return "Unknown argument $cmd, choose one of $list";
  72. }
  73. sub
  74. EC3000_Fingerprint($$)
  75. {
  76. my ($name, $msg) = @_;
  77. return ( "", $msg );
  78. }
  79. sub
  80. EC3000_Parse($$)
  81. {
  82. my ($hash, $msg) = @_;
  83. my $name = $hash->{NAME};
  84. #return undef if( $msg !~ m/^[\dA-F]{12,}$/ );
  85. my( @bytes, $addr,$secondsTotal,$secondsOn,$consumptionTotal,$power,$powerMax,$resets,$reception );
  86. if( $msg =~ m/^OK/ ) {
  87. @bytes = split( ' ', substr($msg, 6) );
  88. $addr = sprintf( "%02X%02X", $bytes[0], $bytes[1] );
  89. $secondsTotal = ($bytes[2]<<24) + ($bytes[3]<<16) + ($bytes[4]<<8) + $bytes[5];
  90. $secondsOn = ($bytes[6]<<24) + ($bytes[7]<<16) + ($bytes[8]<<8) + $bytes[9];
  91. $consumptionTotal = ( ($bytes[10]<<24) + ($bytes[11]<<16) + ($bytes[12]<<8) + $bytes[13] )/1000.0;
  92. $power = ( ($bytes[14]<<8) + $bytes[15] )/10.0;
  93. $powerMax = ( ($bytes[16]<<8) + $bytes[17] )/10.0;
  94. $resets = $bytes[18];
  95. $reception = $bytes[19];
  96. } else {
  97. DoTrigger($name, "UNKNOWNCODE $msg");
  98. Log3 $name, 3, "$name: Unknown code $msg, help me!";
  99. return undef;
  100. }
  101. my $raddr = $addr;
  102. my $rhash = $modules{EC3000}{defptr}{$raddr};
  103. my $rname = $rhash?$rhash->{NAME}:$raddr;
  104. if( !$modules{EC3000}{defptr}{$raddr} ) {
  105. Log3 $name, 3, "EC3000 Unknown device $rname, please define it";
  106. #return undef if( $raddr eq "00" );
  107. return "UNDEFINED EC3000_$rname EC3000 $raddr";
  108. }
  109. #CommandAttr( undef, "$rname userReadings consumptionTotal:consumption monotonic {ReadingsVal($rname,'consumption',0)}" ) if( !defined( $attr{$rname}{userReadings} ) );
  110. my @list;
  111. push(@list, $rname);
  112. $rhash->{EC3000_lastRcv} = TimeNow();
  113. $rhash->{resets} = $resets;
  114. $rhash->{reception} = $reception;
  115. $rhash->{secondsOn} = $secondsOn;
  116. $rhash->{secondsTotal} = $secondsTotal;
  117. readingsBeginUpdate($rhash);
  118. #readingsBulkUpdate($rhash, "secondsTotal", $secondsTotal);
  119. #readingsBulkUpdate($rhash, "secondsOn", $secondsOn);
  120. readingsBulkUpdate($rhash, "consumption", $consumptionTotal);
  121. readingsBulkUpdate($rhash, "power", $power);
  122. readingsBulkUpdate($rhash, "powerMax", $powerMax);
  123. my $state = "on";
  124. $state = "off" if( $power <= AttrVal($rname, "offLevel", 0) );
  125. readingsBulkUpdate($rhash, "state", $state);
  126. readingsEndUpdate($rhash,1);
  127. return @list;
  128. }
  129. sub
  130. EC3000_Attr(@)
  131. {
  132. my ($cmd, $name, $attrName, $attrVal) = @_;
  133. return undef;
  134. }
  135. 1;
  136. =pod
  137. =item summary Energy Count 3000 (EC3000) devices
  138. =item summary_DE Energy Count 3000 (EC3000) Ger&auml;te
  139. =begin html
  140. <a name="EC3000"></a>
  141. <h3>EC3000</h3>
  142. <ul>
  143. The Energy Count 3000 is a AC mains plug with integrated power meter functionality from CONRAD.<br><br>
  144. It can be integrated in to FHEM via a <a href="#JeeLink">JeeLink</a> as the IODevice.<br><br>
  145. <a name="EC3000Define"></a>
  146. <b>Define</b>
  147. <ul>
  148. <code>define &lt;name&gt; EC3000 &lt;addr&gt;</code> <br>
  149. <br>
  150. addr is a 4 digit hex number to identify the EC3000 device.
  151. Note: devices are autocreated on reception of the first message.<br>
  152. </ul>
  153. <br>
  154. <a name="EC3000_Set"></a>
  155. <b>Set</b>
  156. <ul>
  157. </ul><br>
  158. <a name="EC3000_Get"></a>
  159. <b>Get</b>
  160. <ul>
  161. </ul><br>
  162. <a name="EC3000_Readings"></a>
  163. <b>Readings</b>
  164. <ul>
  165. <li>consumption</li>
  166. <li>consumptionMax</li>
  167. <li>consumptionNow</li>
  168. </ul><br>
  169. <a name="EC3000_Attr"></a>
  170. <b>Attributes</b>
  171. <ul>
  172. <li>offLevel<br>
  173. a power level less or equal <code>offLevel</code> is considered to be off</li>
  174. </ul><br>
  175. </ul>
  176. =end html
  177. =cut