diff --git a/fhem/CHANGED b/fhem/CHANGED
index 60b1278ba..032dd21ae 100644
--- a/fhem/CHANGED
+++ b/fhem/CHANGED
@@ -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
diff --git a/fhem/FHEM/00_HXB.pm b/fhem/FHEM/00_HXB.pm
new file mode 100644
index 000000000..288901f2e
--- /dev/null
+++ b/fhem/FHEM/00_HXB.pm
@@ -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 .
+#
+################################################################################
+
+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
+
+
+
HXB
+
+
+
+
+ Define
+
+ define <name> HXB
+
+ Defines a Hexabus. You need one Hexabus to receive multicast messages from Hexabus devices.
+ Have a look at the Hexabus wiki for more information on Hexabus.
+
+ You need the perl modules IO::Socket::Multicast6 and Digest::CRC. Under Debian and its derivatives they are installed with apt-get install libio-socket-multicast6-perl libdigest-crc-perl
.
+
+
+
+
+
+=end html
diff --git a/fhem/FHEM/10_HXBDevice.pm b/fhem/FHEM/10_HXBDevice.pm
new file mode 100644
index 000000000..8b54e0663
--- /dev/null
+++ b/fhem/FHEM/10_HXBDevice.pm
@@ -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 .
+#
+##############################################################################
+
+# 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 HXBDevice " 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= "";
+ 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
+
+
+HXBDevice
+
+
+
+
+ Define
+
+ define <name> HXB <IPv6Address>
+
+ Defines a Hexabus device at the IPv6 address <IPv6Address>. You need one Hexabus
+ to receive multicast messages from Hexabus devices.
+ Have a look at the Hexabus wiki for more information on Hexabus.
+
+ Example:
+ define myPlug fd01:1::50:c4ff:fe04:81ad
+
+
+
+
+
+=end html
diff --git a/fhem/MAINTAINER.txt b/fhem/MAINTAINER.txt
index fc9882416..48157b84f 100644
--- a/fhem/MAINTAINER.txt
+++ b/fhem/MAINTAINER.txt
@@ -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