2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-07 19:04:20 +00:00

00_HXB / 10_HXBDevice: modules for Hexabus devices added

git-svn-id: https://svn.fhem.de/fhem/trunk@7335 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
borisneubert 2014-12-27 17:19:31 +00:00
parent 08464ae9e2
commit 23a38c6c52
4 changed files with 441 additions and 7 deletions

View File

@ -1,5 +1,6 @@
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
# Do not insert empty lines here, update check depends on it.
- added: 00_HXB / 10_HXBDevice for Hexabus devices
- feature: HUEbridge: added group handling
added pollDevices attribute
added httpUtils for nonblocking mode

150
fhem/FHEM/00_HXB.pm Normal file
View File

@ -0,0 +1,150 @@
# $Id: $
################################################################
#
# Copyright notice
#
# (c) 2014 Copyright: Dr. Boris Neubert
# e-mail: omega at online dot de
#
# This file is part of fhem.
#
# Fhem is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# Fhem is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with fhem. If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
package main;
use strict;
use warnings;
use IO::Socket::Multicast6;
#####################################
sub
HXB_Initialize($)
{
my ($hash) = @_;
my %matchlist= (
"1:HXBDevice" => "^HX0C.+",
);
# Provider
#$hash->{WriteFn} = "HXB_Write";
$hash->{ReadFn} = "HXB_Read";
$hash->{Clients} = ":HXBDevice:";
$hash->{MatchList} = \%matchlist;
$hash->{ReadyFn} = "FHZ_Ready";
# Consumer
$hash->{DefFn} = "HXB_Define";
$hash->{UndefFn} = "HXB_Undef";
#$hash->{ReadyFn} = "HXB_Ready";
#$hash->{GetFn} = "HXB_Get";
#$hash->{SetFn} = "HXB_Set";
#$hash->{AttrFn} = "HXB_Attr";
#$hash->{AttrList}= "";
}
#####################################
sub
HXB_Define($$)
{
my ($hash, $def) = @_;
my $name= $hash->{NAME};
Log3 $hash, 3, "$name: Opening multicast socket...";
my $socket = IO::Socket::Multicast6->new(
Domain => AF_INET6,
Proto => 'udp',
LocalPort => '61616',
);
$socket->mcast_add('FF05::205');
$hash->{TCPDev}= $socket;
$hash->{FD} = $socket->fileno();
delete($readyfnlist{"$name"});
$selectlist{"$name"} = $hash;
return undef;
}
#####################################
sub
HXB_Undef($$)
{
my ($hash, $arg) = @_;
my $socket= $hash->{TCPDev};
$socket->mcast_drop('FF05::205');
$socket->close;
return undef;
}
#####################################
sub
HXB_DoInit($)
{
my $hash = shift;
$hash->{STATE} = "Initialized" if(!$hash->{STATE});
return undef;
}
#####################################
# called from the global loop, when the select for hash->{FD} reports data
sub HXB_Read($)
{
my ($hash) = @_;
my $name= $hash->{NAME};
my $socket= $hash->{TCPDev};
my $data;
return unless $socket->recv($data, 128);
Log3 $hash, 5, "$name: Received " . length($data) . " bytes.";
Dispatch($hash, $data, undef); # dispatch result to HXBDevices
}
#############################
1;
#############################
=pod
=begin html
<a name="HXB"></a>
<h3>HXB</h3>
<ul>
<br>
<a name="HXB"></a>
<b>Define</b>
<ul>
<code>define &lt;name&gt; HXB</code><br>
<br>
Defines a Hexabus. You need one Hexabus to receive multicast messages from <a href="#HXBDevice">Hexabus devices</a>.
Have a look at the <a href="https://github.com/mysmartgrid/hexabus/wiki">Hexabus wiki</a> for more information on Hexabus.
<br><br>
You need the perl modules IO::Socket::Multicast6 and Digest::CRC. Under Debian and its derivatives they are installed with <code>apt-get install libio-socket-multicast6-perl libdigest-crc-perl</code>.
</ul>
</ul>
=end html

281
fhem/FHEM/10_HXBDevice.pm Normal file
View File

@ -0,0 +1,281 @@
# $Id: $
##############################################################################
#
# 10_HXBDevice.pm
# Copyright 2014 by Dr. Boris Neubert
# e-mail: omega at online dot de
#
# This file is part of fhem.
#
# Fhem is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# Fhem is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with fhem. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
# Debian: libdigest-crc-perl
package main;
use strict;
use warnings;
use Digest::CRC;
#############################
my %HXB_PTYPES= (
HXB_PTYPE_ERROR => 0x00, # An error occured -- check the error code field for more information
HXB_PTYPE_INFO => 0x01, # Endpoint provides information
HXB_PTYPE_QUERY => 0x02, # Endpoint is requested to provide information
HXB_PTYPE_WRITE => 0x04, # Endpoint is requested to set its value
HXB_PTYPE_EPINFO => 0x09, # Endpoint metadata
HXB_PTYPE_EPQUERY => 0x0A, # Request endpoint metadata
);
#print Dumper \%HXB_PTYPES;
my %HXB_PTYPES_r = reverse %HXB_PTYPES;
my %HXB_DTYPES= (
HXB_DTYPE_UNDEFINED => 0x00, # Undefined: Nonexistent data type
HXB_DTYPE_BOOL => 0x01, # Boolean. Value still represented by 8 bits, but may only be HXB_TRUE or HXB_FALSE
HXB_DTYPE_UINT8 => 0x02, # Unsigned 8 bit integer
HXB_DTYPE_UINT32 => 0x03, # Unsigned 32 bit integer
HXB_DTYPE_DATETIME => 0x04, # Date and time
HXB_DTYPE_FLOAT => 0x05, # 32bit floating point
HXB_DTYPE_128STRING => 0x06, # 128char fixed length string
HXB_DTYPE_TIMESTAMP => 0x07, # timestamp - used for measuring durations, time differences and so on - uint32; seconds
HXB_DTYPE_65BYTES => 0x08, # raw 65 byte array, e.g. state machine data.
HXB_DTYPE_16BYTES => 0x09, # raw 16 byte array, e.g. state machine ID.
);
my %HXB_DTYPES_r = reverse %HXB_DTYPES;
my %HXB_FLAGS= (
HXB_FLAG_NONE => 0x00, # No flags set
);
my %HXB_FLAGS_r = reverse %HXB_FLAGS;
my %EP= (
EP_DEVICE_DESCRIPTOR => 0,
EP_POWER_SWITCH => 1,
EP_POWER_METER => 2,
EP_TEMPERATURE => 3,
EP_BUTTON => 4,
EP_HUMIDITY => 5,
EP_PRESSURE => 6,
EP_ENERGY_METER_TOTAL => 7,
EP_ENERGY_METER => 8,
EP_SM_CONTROL => 9,
EP_SM_UP_RECEIVER => 10,
EP_SM_UP_ACKNAK => 11,
EP_SM_RESET_ID => 12,
EP_ANALOGREAD => 22,
EP_SHUTTER => 23,
EP_HEXAPUSH_PRESSED => 24,
EP_HEXAPUSH_CLICKED => 25,
EP_PRESENCE_DETECTOR => 26,
EP_HEXONOFF_SET => 27,
EP_HEXONOFF_TOGGLE => 28,
EP_LIGHTSENSOR => 29,
EP_IR_RECEIVER => 30,
EP_LIVENESS => 31,
EP_EXT_DEV_DESC_1 => 32,
EP_GENERIC_DIAL_0 => 33,
EP_GENERIC_DIAL_1 => 34,
EP_GENERIC_DIAL_2 => 35,
EP_GENERIC_DIAL_3 => 36,
EP_GENERIC_DIAL_4 => 37,
EP_GENERIC_DIAL_5 => 38,
EP_GENERIC_DIAL_6 => 39,
EP_GENERIC_DIAL_7 => 40,
EP_PV_PRODUCTION => 41,
EP_POWER_BALANCE => 42,
EP_BATTERY_BALANCE => 43,
EP_HEATER_HOT => 44,
EP_HEATER_COLD => 45,
EP_HEXASENSE_BUTTON_STATE => 46,
EP_FLUKSO_L1 => 47,
EP_FLUKSO_L2 => 48,
EP_FLUKSO_L3 => 49,
EP_FLUKSO_S01 => 50,
EP_FLUKSO_S02 => 51,
EP_GL_IMPORT_L1 => 52,
EP_GL_IMPORT_L2 => 53,
EP_GL_IMPORT_L3 => 54,
EP_GL_EXPORT_POWER => 55,
EP_GL_EXPORT_L1 => 56,
EP_GL_EXPORT_L2 => 57,
EP_GL_EXPORT_L3 => 58,
EP_GL_IMPORT_ENERGY => 59,
EP_GL_EXPORT_ENERGY => 60,
EP_GL_FIRMWARE => 61,
EP_GL_CURRENT_L1 => 62,
EP_GL_CURRENT_L2 => 63,
EP_GL_CURRENT_L3 => 65,
EP_GL_VOLTAGE_L1 => 66,
EP_GL_VOLTAGE_L2 => 67,
EP_GL_VOLTAGE_L3 => 68,
EP_GL_POWER_FACTOR_L1 => 69,
EP_GL_POWER_FACTOR_L2 => 70,
EP_GL_POWER_FACTOR_L3 => 71,
EP_METERING_RMS_CURRENT => 72,
EP_METERING_RMS_VOLTAGE => 73,
EP_METERING_FREQUENCY => 74,
EP_METERING_REACTIVE_POWER => 75,
EP_METERING_POWER_FACTOR => 76,
EP_METERING_APPARENT_POWER => 77,
EP_METERING_FUNDAMENTAL_ACTIVE_POWER => 78,
EP_METERING_FUNDAMENTAL_REACTIVE_POWER => 79,
EP_DIMMER_MODE => 80,
EP_DIMMER_BRIGHTNESS => 81,
);
my %EP_r= reverse %EP;
#############################
sub
HXBDevice_Define($$)
{
my ($hash, $def) = @_;
my @a = split("[ \t]+", $def);
return "Usage: define <name> HXBDevice <ipv6>" if($#a != 2);
my $name= $a[0];
my $ipv6= $a[2];
$hash->{fhem}{ipv6}= $ipv6;
AssignIoPort($hash);
$modules{$hash->{TYPE}}{defptr}{"$ipv6"}= $hash;
return undef;
}
###################################
sub
HXBDevice_Initialize($)
{
my ($hash) = @_;
$hash->{Match} = "HX0C.+";
#$hash->{GetFn} = "HXBDevice_Get";
#$hash->{SetFn} = "HXBDevice_Set";
$hash->{DefFn} = "HXBDevice_Define";
$hash->{ParseFn} = "HXBDevice_Parse";
#$hash->{AttrFn} = "HXBDevice_Attr";
$hash->{AttrList} = $readingFnAttributes;
}
#####################################
sub
crc16Kermit($) {
my ($raw)= @_;
my $ctx= Digest::CRC->new(width=>16, init=>0x0000, xorout=>0x0000,
refout=>1, poly=>0x1021, refin=>1, cont=>1);
$ctx->add($raw);
return $ctx->digest;
}
#############################
sub
HXBDevice_Parse($$)
{
# we never come here if $msg does not match $hash->{MATCH} in the first place
my ($IOhash, $data) = @_; # IOhash points to the HXB, not to the HXBDevice
my $socket= $IOhash->{TCPDev};
my $ipv6= $socket->peerhost;
my $hash= $modules{"HXBDevice"}{defptr}{"$ipv6"};
return "UNDEFINED HXB_$ipv6 HXBDevice $ipv6" unless(defined($hash));
my $n= length($data);
return undef if($n< 8);
my ($magic, $ptype, $flags, $payload, $crc)= unpack("A4CCa" . ($n-8) . "n", $data);
my $raw= unpack("a" . ($n-2), $data);
return undef unless($crc = crc16Kermit($raw));
my $hxb_ptype= $HXB_PTYPES_r{$ptype};
my $hxb_flag= $HXB_FLAGS_r{$flags};
if($hxb_ptype eq "HXB_PTYPE_INFO") {
my ($eid, $dtype, $value)= unpack("NCa*", $payload);
my $ep= $EP_r{$eid};
my $hxb_dtype= $HXB_DTYPES_r{$dtype};
my $v= "<unknown>";
if($hxb_dtype eq "HXB_DTYPE_BOOL") {
$v= unpack("b", $value);
} elsif($hxb_dtype eq "HXB_DTYPE_UINT8") {
$v= unpack("C", $value);
} elsif($hxb_dtype eq "HXB_DTYPE_UINT32") {
$v= unpack("N", $value);
} elsif($hxb_dtype eq "HXB_DTYPE_DATETIME") {
$v= "?";
} elsif($hxb_dtype eq "HXB_DTYPE_FLOAT") {
$v= unpack("f", $value);
} elsif($hxb_dtype eq "HXB_DTYPE_128STRING") {
$v= "?";
} elsif($hxb_dtype eq "HXB_DTYPE_TIMESTAMP") {
$v= "?";
} elsif($hxb_dtype eq "HXB_DTYPE_65BYTES") {
$v= "?";
} elsif($hxb_dtype eq "HXB_DTYPE_16BYTES") {
$v= "?";
}
Log3 $hash,5, sprintf("%s: %s %s %s %s %s= %s",
$hash->{NAME}, $hxb_ptype, $hxb_flag,
$ep, $hxb_dtype, unpack("H*", $value), $v);
readingsSingleUpdate($hash, "state", "$ep= $v", 1);
readingsSingleUpdate($hash, $ep, $v, 1);
return $hash->{NAME};
}
return undef;
}
#############################
1;
#############################
=pod
=begin html
<a name="HXBDevice"></a>
<h3>HXBDevice</h3>
<ul>
<br>
<a name="HXB"></a>
<b>Define</b>
<ul>
<code>define &lt;name&gt; HXB &lt;IPv6Address&gt;</code><br>
<br>
Defines a Hexabus device at the IPv6 address &lt;IPv6Address&gt;. You need one <a href="#HXB">Hexabus</a>
to receive multicast messages from Hexabus devices.
Have a look at the <a href="https://github.com/mysmartgrid/hexabus/wiki">Hexabus wiki</a> for more information on Hexabus.
<br><br>
Example:
<code>define myPlug fd01:1::50:c4ff:fe04:81ad</code>
</ul>
</ul>
=end html

View File

@ -19,6 +19,7 @@ FHEM/00_CUL.pm rudolfkoenig http://forum.fhem.de SlowRF
FHEM/00_FBAHA.pm rudolfkoenig http://forum.fhem.de FRITZ!Box
FHEM/00_FHZ.pm rudolfkoenig http://forum.fhem.de SlowRF
FHEM/00_HMLAN.pm martinp876 http://forum.fhem.de HomeMatic
FHEM/00_HXB.pm borisneubert http://forum.fhem.de Sonstige Systeme
FHEM/00_KM271.pm physikus http://forum.fhem.de Sonstiges
FHEM/00_LIRC.pm rudolfkoenig http://forum.fhem.de Sonstiges
FHEM/00_MAXLAN.pm mgehre http://forum.fhem.de MAX
@ -47,6 +48,7 @@ FHEM/10_EnOcean.pm klaus-schauer http://forum.fhem.de EnOcean
FHEM/10_FBDECT.pm rudolfkoenig http://forum.fhem.de FRITZ!Box
FHEM/10_FRM.pm ntruchsess http://forum.fhem.de Sonstige Systeme
FHEM/10_FS20.pm rudolfkoenig http://forum.fhem.de SlowRF
FHEM/00_HXBDevice.pm borisneubert http://forum.fhem.de Sonstige Systeme
FHEM/10_IT.pm justme1968 http://forum.fhem.de InterTechno
FHEM/10_Itach_IR ulimaass http://forum.fhem.de Sonstige Systeme
FHEM/10_MAX.pm mgehre http://forum.fhem.de MAX
@ -164,20 +166,20 @@ FHEM/55_GDS.pm betateilchen http://forum.fhem.de Unterstue
FHEM/55_PIFACE.pm klaus.schauer http://forum.fhem.de Einplatinencomputer
FHEM/55_weco.pm betateilchen http://forum.fhem.de Unterstuetzende Dienste
FHEM/56_POKEYS.pm axelberner http://forum.fhem.de Sonstiges
FHEM/57_Calendar.pm borisneubert http://forum.fhem.de Unterstützende Dienste
FHEM/57_Calendar.pm borisneubert http://forum.fhem.de Unterstuetzende Dienste
FHEM/59_HCS.pm mfr69bs http://forum.fhem.de Automatisierung
FHEM/59_OPENWEATHER.pm tupol http://forum.fhem.de Unterstuetzende Dienste (Link senden: http://forum.fhem.de/index.php?action=pm;sa=send;u=5432)
FHEM/59_Twilight.pm dietmar63 http://forum.fhem.de Unterstuetzende Dienste
FHEM/59_PROPLANTA.pm tupol http://forum.fhem.de Unterstuetzende Dienste (Link senden: http://forum.fhem.de/index.php?action=pm;sa=send;u=5432)
FHEM/59_WWO.pm baumrasen http://forum.fhem.de Sonstiges
FHEM/59_Weather.pm borisneubert http://forum.fhem.de Unterstützende Dienste
FHEM/59_Weather.pm borisneubert http://forum.fhem.de Unterstuetzende Dienste
FHEM/60_EM.pm rudolfkoenig http://forum.fhem.de SlowRF
FHEM/61_EMWZ.pm rudolfkoenig http://forum.fhem.de SlowRF
FHEM/62_EMEM.pm rudolfkoenig http://forum.fhem.de SlowRF
FHEM/63_EMGZ.pm rudolfkoenig http://forum.fhem.de SlowRF
FHEM/64_ESA2000.pm stromer-12 http://forum.fhem.de SlowRF
FHEM/66_ECMD.pm borisneubert http://forum.fhem.de Sonstiges
FHEM/67_ECMDDevice.pm borisneubert http://forum.fhem.de Sonstiges
FHEM/66_ECMD.pm borisneubert http://forum.fhem.de Sonstige Systeme
FHEM/67_ECMDDevice.pm borisneubert http://forum.fhem.de Sonstige Systeme
FHEM/70_EGPM.pm alexus http://forum.fhem.de Sonstiges
FHEM/70_ENIGMA2.pm loredo http://forum.fhem.de Multimedia
FHEM/70_Jabber.pm BioS http://forum.fhem.de Unterstuetzende Dienste
@ -205,11 +207,11 @@ FHEM/73_MPD.pm wzut http://forum.fhem.de Multimedi
FHEM/75_MSG.pm ruebedo http://forum.fhem.de Automatisierung
FHEM/76_MSGFile.pm ruebedo http://forum.fhem.de Automatisierung
FHEM/76_MSGMail.pm ruebedo http://forum.fhem.de Automatisierung
FHEM/80_M232.pm borisneubert http://forum.fhem.de Sonstiges
FHEM/80_M232.pm borisneubert http://forum.fhem.de Sonstige Systeme
FHEM/80_xxLG7000.pm painseeker http://forum.fhem.de Sonstiges
FHEM/81_M232Counter.pm borisneubert http://forum.fhem.de Sonstiges
FHEM/81_M232Counter.pm borisneubert http://forum.fhem.de Sonstige Systeme
FHEM/82_LGTV.pm painseeker http://forum.fhem.de Sonstiges
FHEM/82_M232Voltage.pm borisneubert http://forum.fhem.de Sonstiges
FHEM/82_M232Voltage.pm borisneubert http://forum.fhem.de Sonstige Systeme
FHEM/87_WS2000.pm tdressler http://forum.fhem.de Sonstiges
FHEM/88_ALL4000T.pm sachag http://forum.fhem.de Sonstiges
FHEM/88_LINDY_HDMI_SWITCH.pm sachag http://forum.fhem.de Multimedia