diff --git a/fhem/FHEM/19_Revolt.pm b/fhem/FHEM/19_Revolt.pm new file mode 100644 index 000000000..7926bced0 --- /dev/null +++ b/fhem/FHEM/19_Revolt.pm @@ -0,0 +1,162 @@ +############################################## +# # +# Written by Martin Paulat, 2013 # +# # +############################################## + +package main; + +use strict; +use warnings; +use Date::Parse; + + + +##################################### +sub +Revolt_Initialize($) +{ + my ($hash) = @_; + +# r00C5E100303203C85921FF + $hash->{Match} = "^r......................\$"; + $hash->{DefFn} = "Revolt_Define"; + $hash->{UndefFn} = "Revolt_Undef"; + $hash->{ParseFn} = "Revolt_Parse"; + $hash->{AttrList} = "IODev ". + $readingFnAttributes; +} + +##################################### +sub +Revolt_Define($$) +{ + my ($hash, $def) = @_; + my @a = split("[ \t][ \t]*", $def); + + return "wrong syntax: define Revolt " if(int(@a) != 3); + $a[2] = lc($a[2]); + return "Define $a[0]: wrong format: specify a 4 digit hex value" + if($a[2] !~ m/^[a-f0-9][a-f0-9][a-f0-9][a-f0-9]$/); + + $hash->{ID} = $a[2]; + #$hash->{STATE} = "Initialized"; + $modules{REVOLT}{defptr}{$a[2]} = $hash; + AssignIoPort($hash); + return undef; +} + +##################################### +sub +Revolt_Undef($$) +{ + my ($hash, $name) = @_; + delete($modules{REVOLT}{defptr}{$hash->{ID}}) + if(defined($hash->{ID}) && + defined($modules{REVOLT}{defptr}{$hash->{ID}})); + return undef; +} + +##################################### +sub +Revolt_Parse($$) +{ + my ($hash, $msg) = @_; + + $msg = lc($msg); + my $seq = substr($msg, 1, 2); + my $dev = substr($msg, 3, 4); + my $cde = substr($msg, 7, 4); + my $val = substr($msg, 11, 22); + my $id = substr($msg, 1, 4); + my $voltage = hex(substr($msg, 5, 2)); + my $current = hex(substr($msg, 7, 4))*0.01; + my $freq = hex(substr($msg, 11, 2)); + my $power = hex(substr($msg, 13, 4))*0.1; + my $pf = hex(substr($msg, 17, 2))*0.01; + my $energy = hex(substr($msg, 19, 4))*0.01; + my $lastval; + my $avg; + + my $type = ""; + + if(!defined($modules{REVOLT}{defptr}{$id})) { + Log3 undef,3, "Unknown Revolt device $id, please define it"; + $type = "Revolt" if(!$type); + return "UNDEFINED ${type}_$id Revolt $id"; + } + + my $def = $modules{REVOLT}{defptr}{$id}; + my $name = $def->{NAME}; + return "" if(IsIgnored($name)); + + my $state; + $state="P: ".sprintf("%5.1f",$power)." E: ".sprintf("%6.2f",$energy)." V: ".sprintf("%3d",$voltage)." C: ".sprintf("%6.2f",$current)." F: $freq Pf: ".sprintf("%4.2f",$pf); + + readingsBeginUpdate($def); + + if (defined($def->{READINGS}{".lastenergy"})) { + $lastval=$def->{READINGS}{".lastenergy"}{VAL}; + if ($lastval != $energy) { + $avg=(($lastval-$energy)*1000.0*3600.0)/(str2time($def->{READINGS}{".lastenergy"}{TIME})-gettimeofday()); + readingsBulkUpdate($def,".lastenergy", $energy,1); + readingsBulkUpdate($def,"avgpower", sprintf("%.2f",$avg),1); + } + } else { + readingsBulkUpdate($def,".lastenergy", $energy,1); + } + + readingsBulkUpdate($def,"state", $state,1); + Log3 $name,4, "$name: $state"; + readingsBulkUpdate($def,"voltage", $voltage,1); + #Log3 $def,3, "$name:voltage $voltage"; + readingsBulkUpdate($def,"current", $current,1); + #Log3 $def,3, "$name:current $current"; + readingsBulkUpdate($def,"frequency", $freq,1); + #Log3 $def,3, "$name:frequency $freq"; + readingsBulkUpdate($def,"power", $power,1); + #Log3 $def,3, "$name:power $power"; + readingsBulkUpdate($def,"pf", $pf,1); + #Log3 $def,3, "$name:Pf $pf"; + readingsBulkUpdate($def,"energy", $energy,1); + #Log3 $def,3, "$name:energy $energy"; + + readingsEndUpdate($def, 1); + + return $name; +} + +1; + +=pod +=begin html + + +

Revolt NC-5462

+
    + Provides voltage, current, frequency, power, pf, energy readings for Revolt NC-5462 devices via CUL. +

    + + + Define +
      + define <name> Revolt <id> +

      + <id> is a 4 digit hex number to identify the NC-5462 device.
      + Note: devices are autocreated on reception of the first message.
      +
    +
    + + Readings +
      +
    • energy [kWh]
    • +
    • power [W]
    • +
    • voltage [V]
    • +
    • current [A]
    • +
    • frequency [Hz]
    • +
    • Pf
    • +
    + +
+=end html +=cut \ No newline at end of file