2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-17 11:26:03 +00:00

updated commandref

git-svn-id: https://svn.fhem.de/fhem/trunk@6206 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
klauswitt 2014-07-06 21:37:48 +00:00
parent 3ce996bc02
commit fc130a6a18

View File

@ -30,45 +30,44 @@ my $libcheck_SMBus = 1;
my $check_ioctl_ph = 1;
sub RPII2C_Initialize($) {
my ($hash) = @_;
eval "use Device::SMBus;";
$libcheck_SMBus = 0 if($@);
eval {require "sys/ioctl.ph"};
$check_ioctl_ph = 0 if($@);
my ($hash) = @_;
eval "use Device::SMBus;";
$libcheck_SMBus = 0 if($@);
eval {require "sys/ioctl.ph"};
$check_ioctl_ph = 0 if($@);
# Provider
$hash->{Clients} = join (':',@clients);
#$hash->{WriteFn} = "RPII2C_Write"; #wird vom client per IOWrite($@) aufgerufen
$hash->{I2CWrtFn} = "RPII2C_Write"; #zum testen als alternative fuer IOWrite
#$hash->{WriteFn} = "RPII2C_Write"; #wird vom client per IOWrite($@) aufgerufen
$hash->{I2CWrtFn} = "RPII2C_Write"; #zum testen als alternative fuer IOWrite
# Normal devices
$hash->{DefFn} = "RPII2C_Define";
$hash->{UndefFn} = "RPII2C_Undef";
$hash->{GetFn} = "RPII2C_Get";
$hash->{SetFn} = "RPII2C_Set";
$hash->{AttrFn} = "RPII2C_Attr";
$hash->{DefFn} = "RPII2C_Define";
$hash->{UndefFn} = "RPII2C_Undef";
$hash->{GetFn} = "RPII2C_Get";
$hash->{SetFn} = "RPII2C_Set";
$hash->{AttrFn} = "RPII2C_Attr";
$hash->{NotifyFn} = "RPII2C_Notify";
$hash->{AttrList}= "do_not_notify:1,0 ignore:1,0 showtime:1,0 " .
"$readingFnAttributes";
$hash->{AttrList}= "do_not_notify:1,0 ignore:1,0 showtime:1,0 " .
"$readingFnAttributes";
$hash->{AttrList} .= " useHWLib:IOCTL,SMBus " if( $libcheck_SMBus && $check_ioctl_ph);
$hash->{AttrList} .= " swap_i2c0:off,on";
}
#####################################
sub RPII2C_Define($$) { #
my ($hash, $def) = @_;
my @a = split("[ \t][ \t]*", $def);
unless(@a == 3) {
my $msg = "wrong syntax: define <name> RPII2C <0|1>";
Log3 undef, 2, $msg;
return $msg;
}
my ($hash, $def) = @_;
my @a = split("[ \t][ \t]*", $def);
unless(@a == 3) {
my $msg = "wrong syntax: define <name> RPII2C <0|1>";
Log3 undef, 2, $msg;
return $msg;
}
$hash->{SMBus_exists} = $libcheck_SMBus if($libcheck_SMBus);
$hash->{ioctl_ph_exists} = $check_ioctl_ph if($check_ioctl_ph);
my $name = $a[0];
my $dev = $a[2];
my $dev = $a[2];
if ($check_ioctl_ph) {
$hash->{hwfn} = \&RPII2C_HWACCESS_ioctl;
@ -78,53 +77,53 @@ sub RPII2C_Define($$) { #
return $name . ": Error! no library for Hardware access installed";
}
my $device = "/dev/i2c-".$dev;
if ( RPII2C_CHECK_GPIO_DEVICE($device) ) {
Log3 $hash, 1, "file $device not accessible try to use gpio utility to fix it";
if ( RPII2C_CHECK_I2C_DEVICE($device) ) {
Log3 $hash, 3, "$hash->{NAME}: file $device not accessible try to use gpio utility to fix it";
if ( defined(my $ret = RPII2C_CHECK_GPIO_UTIL($gpioprg)) ) {
Log3 $hash, 1, $ret if $ret;
Log3 $hash, 1, "$hash->{NAME}: " . $ret if $ret;
} else { #I2C Devices mit gpio utility fuer FHEM User lesbar machen
my $exp = $gpioprg.' load i2c';
$exp = `$exp`;
}
}
}
$hash->{NOTIFYDEV} = "global";
#$hash->{Clients} = $clientsI2C;
#$hash->{MatchList} = \%matchListI2C;
#$hash->{Clients} = $clientsI2C;
#$hash->{MatchList} = \%matchListI2C;
if($dev eq "none") {
Log3 $name, 1, "$name device is none, commands will be echoed only";
$attr{$name}{dummy} = 1;
return undef;
}
my $check = RPII2C_CHECK_GPIO_DEVICE($device);
return $name . $check if $check;
if($dev eq "none") {
Log3 $name, 1, "$name device is none, commands will be echoed only";
$attr{$name}{dummy} = 1;
return undef;
}
my $check = RPII2C_CHECK_I2C_DEVICE($device);
return $name . $check if $check;
$hash->{DeviceName} = $device;
$hash->{STATE} = "initialized";
return undef;
return undef;
}
#####################################
sub RPII2C_Notify { #
my ($hash,$dev) = @_;
my $name = $hash->{NAME};
my $type = $hash->{TYPE};
if( grep(m/^(INITIALIZED|REREADCFG)$/, @{$dev->{CHANGED}}) ) {
RPII2C_forall_clients($hash,\&RPII2C_Init_Client,undef);;
} elsif( grep(m/^SAVE$/, @{$dev->{CHANGED}}) ) {
}
my ($hash,$dev) = @_;
my $name = $hash->{NAME};
my $type = $hash->{TYPE};
if( grep(m/^(INITIALIZED|REREADCFG)$/, @{$dev->{CHANGED}}) ) {
RPII2C_forall_clients($hash,\&RPII2C_Init_Client,undef);;
} elsif( grep(m/^SAVE$/, @{$dev->{CHANGED}}) ) {
}
}
#####################################
sub RPII2C_forall_clients($$$) { #
my ($hash,$fn,$args) = @_;
foreach my $d ( sort keys %main::defs ) {
if ( defined( $main::defs{$d} )
&& defined( $main::defs{$d}{IODev} )
&& $main::defs{$d}{IODev} == $hash ) {
&$fn($main::defs{$d},$args);
}
}
return undef;
my ($hash,$fn,$args) = @_;
foreach my $d ( sort keys %main::defs ) {
if ( defined( $main::defs{$d} )
&& defined( $main::defs{$d}{IODev} )
&& $main::defs{$d}{IODev} == $hash ) {
&$fn($main::defs{$d},$args);
}
}
return undef;
}
#####################################
sub RPII2C_Init_Client($@) { #
@ -142,19 +141,19 @@ sub RPII2C_Init_Client($@) { #
}
#####################################
sub RPII2C_Undef($$) { #
my ($hash, $arg) = @_;
my $name = $hash->{NAME};
my ($hash, $arg) = @_;
my $name = $hash->{NAME};
foreach my $d (sort keys %defs) {
if(defined($defs{$d}) &&
defined($defs{$d}{IODev}) &&
$defs{$d}{IODev} == $hash)
{
Log3 $name, 3, "deleting port for $d";
delete $defs{$d}{IODev};
}
}
return undef;
foreach my $d (sort keys %defs) {
if(defined($defs{$d}) &&
defined($defs{$d}{IODev}) &&
$defs{$d}{IODev} == $hash)
{
Log3 $name, 3, "deleting port for $d";
delete $defs{$d}{IODev};
}
}
return undef;
}
#####################################
sub RPII2C_Attr(@){
@ -170,20 +169,20 @@ sub RPII2C_Attr(@){
}
#####################################
sub RPII2C_Set($@) { #writeBlock noch nicht fertig
my ($hash, @a) = @_;
my $name = shift @a;
my $type = shift @a;
my ($hash, @a) = @_;
my $name = shift @a;
my $type = shift @a;
my @sets = ('writeByte', 'writeByteReg', 'writeBlock'); #, 'writeNBlock');
return "Unknown argument $type, choose one of " . join(" ", @sets) if @a < 2;
return "Unknown argument $type, choose one of " . join(" ", @sets) if @a < 2;
foreach (@a) { #Hexwerte pruefen und in Dezimalwerte wandeln
return "$name: $_ is no 1byte hexadecimal value" if $_ !~ /^(0x|)[0-9A-F]{1,2}$/xi ;
$_ = hex;
}
my $i2ca = shift @a;
my $i2ca = shift @a;
return "$name: I2C Address not valid" unless ($i2ca > 3 && $i2ca < 128); #pruefe auf Hexzahl zwischen 4 und 7F
my $i2chash = { i2caddress => $i2ca, direction => "i2cwrite" };
my $i2chash = { i2caddress => $i2ca, direction => "i2cwrite" };
my ($reg, $nbyte, $data) = undef;
if ($type eq "writeByte") {
$data = join(" ", @a);
@ -218,15 +217,15 @@ sub RPII2C_Set($@) { #writeBlock noch nicht fertig
}
##################################### fertig?
sub RPII2C_Get($@) { #
my ($hash, @a) = @_;
my $nargs = int(@a);
my $name = $hash->{NAME};
my @gets = ('read');
unless ( exists($a[1]) && $a[1] ne "?" && grep {/^$a[1]$/} @gets ) {
my ($hash, @a) = @_;
my $nargs = int(@a);
my $name = $hash->{NAME};
my @gets = ('read');
unless ( exists($a[1]) && $a[1] ne "?" && grep {/^$a[1]$/} @gets ) {
return "Unknown argument $a[1], choose one of " . join(" ", @gets);
}
}
if ($a[1] eq "read") {
return "use: \"get $name $a[1] <i2cAddress> [<RegisterAddress> [<Number od bytes to get>]]\"" if(@a < 3);
return "use: \"get $name $a[1] <i2cAddress> [<RegisterAddress> [<Number od bytes to get>]]\"" if(@a < 3);
return "$name: I2C Address not valid" unless ( $a[2] =~ /^(0x|)([0-7]|)[0-9A-F]$/xi);
return "$name register address must be a hexvalue" if (defined($a[3]) && $a[3] !~ /^(0x|)[0-9A-F]{1,4}$/xi);
return "$name number of bytes must be decimal value" if (defined($a[4]) && $a[4] !~ /^[0-9]{1,2}$/);
@ -234,41 +233,41 @@ sub RPII2C_Get($@) { #
$i2chash->{reg} = hex($a[3]) if defined($a[3]); #startadresse zum lesen
$i2chash->{nbyte} = $a[4] if defined($a[4]);
#Log3 $hash, 1, "Reg: ". $i2chash->{reg};
#my $status = RPII2C_HWACCESS_ioctl($hash, $i2chash);
#my $status = RPII2C_HWACCESS_ioctl($hash, $i2chash);
my $status = &{$hash->{hwfn}}($hash, $i2chash);
#my $received = join(" ", @{$i2chash->{received}}); #als Array
my $received = $i2chash->{received}; #als Scalar
undef $i2chash; #Hash loeschen
return (defined($received) ? "received : " . $received ." | " : "" ) . " transmission: $status";
}
return undef;
return undef;
}
#####################################
sub RPII2C_Write($$) { #wird vom Client aufgerufen
my ($hash, $clientmsg) = @_;
my ($hash, $clientmsg) = @_;
my $name = $hash->{NAME};
my $ankommen = "$name: vom client empfangen";
foreach my $av (keys %{$clientmsg}) { $ankommen .= "|" . $av . ": " . $clientmsg->{$av}; }
foreach my $av (keys %{$clientmsg}) { $ankommen .= "|" . $av . ": " . $clientmsg->{$av}; }
Log3 $hash, 5, $ankommen;
if ( $clientmsg->{direction} && $clientmsg->{i2caddress} ) {
$clientmsg->{$name . "_" . "SENDSTAT"} = &{$hash->{hwfn}}($hash, $clientmsg);
#$clientmsg->{$name . "_" . "SENDSTAT"} = RPII2C_HWACCESS($hash, $clientmsg);
#$clientmsg->{$name . "_" . "SENDSTAT"} = RPII2C_HWACCESS($hash, $clientmsg);
}
foreach my $d ( sort keys %main::defs ) { #zur Botschaft passenden Clienten ermitteln geht auf Client: I2CRecFn
#Log3 $hash, 1, "d: $d". ($main::defs{$d}{IODev}? ", IODev: $main::defs{$d}{IODev}":"") . ($main::defs{$d}{I2C_Address} ? ", I2C: $main::defs{$d}{I2C_Address}":"") . ($clientmsg->{i2caddress} ? " CI2C: $clientmsg->{i2caddress}" : "");
if ( defined( $main::defs{$d} )
#Log3 $hash, 1, "d: $d". ($main::defs{$d}{IODev}? ", IODev: $main::defs{$d}{IODev}":"") . ($main::defs{$d}{I2C_Address} ? ", I2C: $main::defs{$d}{I2C_Address}":"") . ($clientmsg->{i2caddress} ? " CI2C: $clientmsg->{i2caddress}" : "");
if ( defined( $main::defs{$d} )
&& defined( $main::defs{$d}{IODev} ) && $main::defs{$d}{IODev} == $hash
&& defined( $main::defs{$d}{I2C_Address} ) && defined($clientmsg->{i2caddress})
&& $main::defs{$d}{I2C_Address} eq $clientmsg->{i2caddress} ) {
my $chash = $main::defs{$d};
&& $main::defs{$d}{I2C_Address} eq $clientmsg->{i2caddress} ) {
my $chash = $main::defs{$d};
Log3 $hash, 5, "$name ->Client gefunden: $d". ($main::defs{$d}{I2C_Address} ? ", I2Caddress: $main::defs{$d}{I2C_Address}":"") . ($clientmsg->{data} ? " Data: $clientmsg->{data}" : "");
CallFn($d, "I2CRecFn", $chash, $clientmsg);
CallFn($d, "I2CRecFn", $chash, $clientmsg);
undef $clientmsg #Hash loeschen nachdem Daten verteilt wurden
}
}
}
return undef;
return undef;
}
#####################################
#FRM_forall_clients($$$)
@ -285,10 +284,9 @@ sub RPII2C_Write($$) { #wird vom Client aufgerufen
#}
#####################################
sub RPII2C_CHECK_GPIO_DEVICE {
sub RPII2C_CHECK_I2C_DEVICE {
my ($dev) = @_;
my $ret = undef;
#unless (defined($hash->{gpio_util_exists})) {
my $ret = undef;
if(-e $dev) {
if(-r $dev) {
unless(-w $dev) {
@ -305,8 +303,7 @@ sub RPII2C_CHECK_GPIO_DEVICE {
sub RPII2C_CHECK_GPIO_UTIL {
my ($gpioprg) = @_;
my $ret = undef;
#unless (defined($hash->{gpio_util_exists})) {
my $ret = undef;
if(-e $gpioprg) {
if(-x $gpioprg) {
unless(-u $gpioprg) {
@ -336,13 +333,13 @@ sub RPII2C_SWAPI2C0 {
system "$gpioprg -g mode 1 ALT0";
}
} else {
Log3 $hash, 1, $ret if $ret;
Log3 $hash, 1, $hash->{NAME} . ": " . $ret if $ret;
}
return
}
sub RPII2C_HWACCESS($$) {
my ($hash, $clientmsg) = @_;
my ($hash, $clientmsg) = @_;
my $status = "error";
my $inh = undef;
Log3 $hash, 5, "$hash->{NAME}: HWaccess I2CAddr: " . sprintf("0x%.2X", $clientmsg->{i2caddress});
@ -369,23 +366,23 @@ sub RPII2C_HWACCESS($$) {
# }
#hier Mehrfachbeschreibung eines Registers noch entfernen und dafuer Bereich mit Registeroperationen beschreiben
} elsif (defined($clientmsg->{reg}) && defined($clientmsg->{data}) && $clientmsg->{direction} eq "i2cwrite") { #Register beschreiben
my @data = split(" ", $clientmsg->{data});
foreach (@data) {
my @data = split(" ", $clientmsg->{data});
foreach (@data) {
$inh = $dev->writeByteData($clientmsg->{reg},$_);
Log3 $hash, 5, "$hash->{NAME}; Register ".sprintf("0x%.2X", $clientmsg->{reg})." schreiben - Inhalt: " .sprintf("0x%.2X",$_) . " Returnvar.: $inh";
last if $inh != 0;
$status = "Ok" if $inh == 0;
}
} elsif (defined($clientmsg->{data}) && $clientmsg->{direction} eq "i2cwrite") { #Byte(s) schreiben
my @data = split(" ", $clientmsg->{data});
foreach (@data) {
my @data = split(" ", $clientmsg->{data});
foreach (@data) {
$inh = $dev->writeByte($_);
Log3 $hash, 5, "$hash->{NAME} Byte schreiben; Inh: " . $_ . " Returnvar.: $inh";
last if $inh != 0;
$status = "Ok" if $inh == 0;
}
} elsif (defined($clientmsg->{reg}) && $clientmsg->{direction} eq "i2cread") { #Register lesen
my $nbyte = defined($clientmsg->{nbyte}) ? $clientmsg->{nbyte} : 1;
my $nbyte = defined($clientmsg->{nbyte}) ? $clientmsg->{nbyte} : 1;
my $rmsg = "";
for (my $n = 0; $n < $nbyte; $n++) {
$inh = $dev->readByteData($clientmsg->{reg} + $n );
@ -426,14 +423,14 @@ sub RPII2C_HWACCESS_ioctl($$) {
my ($fh, $msg) = undef;
my $ankommen = "$hash->{NAME}: vom client empfangen";
foreach my $av (keys %{$clientmsg}) { $ankommen .= "|" . $av . ": " . $clientmsg->{$av}; }
foreach my $av (keys %{$clientmsg}) { $ankommen .= "|" . $av . ": " . $clientmsg->{$av}; }
Log3 $hash, 5, $ankommen;
my $i2caddr = hex(sprintf "%x", $clientmsg->{i2caddress});
if ( sysopen(my $fh, $hash->{DeviceName}, O_RDWR) != 1) { #Datei oeffnen
Log3 $hash, 1, "$hash->{NAME}: HWaccess sysopen failure: $!"
Log3 $hash, 3, "$hash->{NAME}: HWaccess sysopen failure: $!"
} elsif( not defined( ioctl($fh,$I2C_SLAVE,$i2caddr) ) ) { #I2C Adresse per ioctl setzen
Log3 $hash, 1, "$hash->{NAME}: HWaccess (0x".unpack( "H2",pack "C", $clientmsg->{i2caddress}).") ioctl failure: $!"
Log3 $hash, 3, "$hash->{NAME}: HWaccess (0x".unpack( "H2",pack "C", $clientmsg->{i2caddress}).") ioctl failure: $!"
} elsif (defined($clientmsg->{nbyte}) && defined($clientmsg->{reg}) && defined($clientmsg->{data}) && $clientmsg->{direction} eq "i2cblockwrite") { #Registerblock beschreiben
my $data = chr($clientmsg->{reg});
foreach (split(" ", $clientmsg->{data})) {
@ -441,24 +438,24 @@ sub RPII2C_HWACCESS_ioctl($$) {
}
my $retval = syswrite($fh, $data, length($data));
unless (defined($retval) && $retval == length($data)) {
Log3 $hash, 1, "$hash->{NAME}: HWaccess blockweise nach 0x".unpack( "H2",pack "C", $clientmsg->{i2caddress})." schreiben, Reg: 0x". unpack( "H2",pack "C", $clientmsg->{reg}) . " Inh: $clientmsg->{data}, laenge: ".length($data)."| -> syswrite failure: $!";
Log3 $hash, 3, "$hash->{NAME}: HWaccess blockweise nach 0x".unpack( "H2",pack "C", $clientmsg->{i2caddress})." schreiben, Reg: 0x". unpack( "H2",pack "C", $clientmsg->{reg}) . " Inh: $clientmsg->{data}, laenge: ".length($data)."| -> syswrite failure: $!";
} else {
$status = "Ok";
Log3 $hash, 5, "$hash->{NAME}: HWaccess block schreiben, Reg: 0x". unpack( "H2",pack "C", $clientmsg->{reg}) . " Inh(dec):|$clientmsg->{data}|, laenge: |".length($data)."|";
}
#(my $datah = $data) =~ s/(.|\n)/sprintf("%.2X ",ord($1))/eg;
#Log3 $hash, 1, "$hash->{NAME}: HWaccess block schreiben data:|$clientmsg->{data}|, laenge: |".length($data)."|";
#Log3 $hash, 1, "$hash->{NAME}: HWaccess block schreiben data:|$clientmsg->{data}|, laenge: |".length($data)."|";
#$status = "Ok" if $resulw == length($data);
} elsif (defined($clientmsg->{data}) && $clientmsg->{direction} eq "i2cwrite") { #byteweise beschreiben
my $reg = undef;
my $reg = undef;
$reg = $clientmsg->{reg} if (defined($clientmsg->{reg}));
$status = "Ok";
foreach (split(" ", $clientmsg->{data})) {
my $data = (defined($reg) ? chr($reg++) : "") . chr($_);
my $retval = syswrite($fh, $data, length($data));
unless (defined($retval) && $retval == length($data)) {
Log3 $hash, 1, "$hash->{NAME}: HWaccess byteweise nach 0x".unpack( "H2",pack "C", $clientmsg->{i2caddress})." schreiben, ". (defined($reg) ? "Reg: 0x". unpack( "H2",pack "C", ($reg - 1)) . " " : "")."Inh: 0x" . unpack( "H2",pack "C", $_) .", laenge: ".length($data)."| -> syswrite failure: $!";
Log3 $hash, 3, "$hash->{NAME}: HWaccess byteweise nach 0x".unpack( "H2",pack "C", $clientmsg->{i2caddress})." schreiben, ". (defined($reg) ? "Reg: 0x". unpack( "H2",pack "C", ($reg - 1)) . " " : "")."Inh: 0x" . unpack( "H2",pack "C", $_) .", laenge: ".length($data)."| -> syswrite failure: $!";
$status = "error";
last;
}
@ -472,14 +469,14 @@ sub RPII2C_HWACCESS_ioctl($$) {
Log3 $hash, 5, "$hash->{NAME}: HWaccess byteweise lesen setze Registerpointer auf " . ($clientmsg->{reg} + $n);
my $retval = syswrite($fh, chr($clientmsg->{reg} + $n), 1);
unless (defined($retval) && $retval == 1) {
Log3 $hash, 1, "$hash->{NAME}: HWaccess byteweise von 0x".unpack( "H2",pack "C", $clientmsg->{i2caddress})." lesen,". (defined($clientmsg->{reg}) ? " Reg: 0x". unpack( "H2",pack "C", ($clientmsg->{reg} + $n)) : "") . " -> syswrite failure: $!" if $!;
Log3 $hash, 3, "$hash->{NAME}: HWaccess byteweise von 0x".unpack( "H2",pack "C", $clientmsg->{i2caddress})." lesen,". (defined($clientmsg->{reg}) ? " Reg: 0x". unpack( "H2",pack "C", ($clientmsg->{reg} + $n)) : "") . " -> syswrite failure: $!" if $!;
last;
}
}
my $buf = undef;
my $retval = sysread($fh, $buf, 1);
unless (defined($retval) && $retval == 1) {
Log3 $hash, 1, "$hash->{NAME}: HWaccess byteweise von 0x".unpack( "H2",pack "C", $clientmsg->{i2caddress})." lesen,". (defined($clientmsg->{reg}) ? " Reg: 0x". unpack( "H2",pack "C", ($clientmsg->{reg} + $n)) : "") . " -> sysread failure: $!" if $!;
Log3 $hash, 3, "$hash->{NAME}: HWaccess byteweise von 0x".unpack( "H2",pack "C", $clientmsg->{i2caddress})." lesen,". (defined($clientmsg->{reg}) ? " Reg: 0x". unpack( "H2",pack "C", ($clientmsg->{reg} + $n)) : "") . " -> sysread failure: $!" if $!;
last;
}
$rmsg .= ord($buf);
@ -508,43 +505,45 @@ sub RPII2C_HWACCESS_ioctl($$) {
<b>preliminary:</b><br>
<ul>
<li>
Access rights for /dev/i2c-* devices
load I2C kernel modules:<br>
open /etc/modules<br>
<ul><code>sudo nano /etc/modules</code></ul><br>
add these lines<br>
<ul><code>
i2c-dev<br>
i2c-bcm2708<br>
</code></ul>
</li><br>
<li>Choose <b>one</b> of the three follwing methodes do grant access to <code>/dev/i2c-*</code> for FHEM user:
<ul>
<li>
Add following lines into <code>/etc/init.d/fhem</code> before <code>perl fhem.pl</code> line in start or into <code>/etc/rc.local</code>:<br>
<code>sudo apt-get install i2c-tools<br>
sudo adduser fhem i2c<br>
sudo reboot</code><br>
</li><br>
<li>
Add following lines into <code>/etc/init.d/fhem</code> before <code>perl fhem.pl</code> line in start or into <code>/etc/rc.local</code>:<br>
<code>
sudo chown fhem /dev/i2c-*<br>
sudo chgrp dialout /dev/i2c-*<br>
sudo chmod +t /dev/i2c-*<br>
sudo chmod 660 /dev/i2c-*<br>
</code>
</li>
<li>
Alternatively for Raspberry Pi you can install the gpio utility from <a href="http://wiringpi.com/download-and-install/">WiringPi</a> library change access rights of I2C-Interface<br>
</li><br>
<li>
Alternatively for Raspberry Pi you can install the gpio utility from <a href="http://wiringpi.com/download-and-install/">WiringPi</a> library change access rights of I2C-Interface<br>
WiringPi installation is described here: <a href="#RPI_GPIO">RPI_GPIO.</a><br>
gpio utility will be automaticly used, if installed.<br>
</li>
Important: to use I2C-0 at P5 connector you must use attribute <code>swap_i2c0</code>.<br>
</li>
</ul>
</li>
</li><br>
<li>
installation of i2c dependencies:<br>
<code>sudo apt-get install libi2c-dev i2c-tools build-essential</code><br>
</li>
<li>
load I2C kernel modules:<br>
open /etc/modules<br>
<code>sudo nano /etc/modules</code><br>
add theese lines<br>
<code>
i2c-dev<br>
i2c-bcm2708<br>
</code>
</li>
<li>
Optional, access via IOCTL will be used if Device::SMBus is not present.<br>
<b>Optional</b>: access via IOCTL will be used if Device::SMBus is not present.<br>
To access the I2C-Bus via the Device::SMBus module, following steps are necessary:<br>
<code>sudo apt-get install libmoose-perl<br>
sudo cpan Device::SMBus</code><br>
<ul><code>sudo apt-get install libmoose-perl<br>
sudo cpan Device::SMBus</code></ul><br>
</li>
</ul>
<a name="RPII2CDefine"></a><br>
@ -559,15 +558,15 @@ sub RPII2C_HWACCESS_ioctl($$) {
<ul>
<li>
Write one byte (or more bytes sequentially) directly to an I2C device (for devices that have only one register to write):<br>
<code>set &lt;name&gt; writeByte &lt;I2C Address&gt; &lt;value&gt;</code><br><br>
<code>set &lt;name&gt; writeByte &lt;I2C Address&gt; &lt;value&gt;</code><br><br>
</li>
<li>
Write n-bytes to an register range (as an series of single register write operations), beginning at the specified register:<br>
<code>set &lt;name&gt; writeByteReg &lt;I2C Address&gt; &lt;Register Address&gt; &lt;value&gt;</code><br><br>
<code>set &lt;name&gt; writeByteReg &lt;I2C Address&gt; &lt;Register Address&gt; &lt;value&gt;</code><br><br>
</li>
<li>
Write n-bytes to an register range (as an block write operation), beginning at the specified register:<br>
<code>set &lt;name&gt; writeBlock &lt;I2C Address&gt; &lt;Register Address&gt; &lt;value&gt;</code><br><br>
<code>set &lt;name&gt; writeBlock &lt;I2C Address&gt; &lt;Register Address&gt; &lt;value&gt;</code><br><br>
</li><br>
Examples:
<ul>
@ -628,55 +627,57 @@ sub RPII2C_HWACCESS_ioctl($$) {
<h3>RPII2C</h3>
<ul>
<a name="RPII2C"></a>
Erm&ouml;glicht den Zugriff auf die I2C Schnittstellen des Raspberry Pi &uuml;ber logische Module. Register von I2C IC's k&ouml;nnen auch direkt gelesen und geschrieben werden.<br><br>
Erm&ouml;glicht den Zugriff auf die I2C Schnittstellen des Raspberry Pi, BBB, Cubie &uuml;ber logische Module. Register von I2C IC's k&ouml;nnen auch direkt gelesen und geschrieben werden.<br><br>
Dieses Modul funktioniert gruns&auml;tzlich auf allen Linux Systemen, die <code>/dev/i2c-x</code> bereitstellen.<br><br>
<b>Vorbereitung:</b><br>
<ul>
<li>
I2C Kernelmodule laden:<br>
modules Datei &ouml;ffnen<br>
<ul><code>sudo nano /etc/modules</code></ul><br>
folgendes einf&uuml;gen<br>
<ul><code>
i2c-dev<br>
i2c-bcm2708<br>
</code></ul>
</li> <br>
<li><b>Eine</b> der folgenden drei M&ouml;glichkeiten w&auml;hlen um dem FHEM User Zugriff auf <code>/dev/i2c-*</code> zu geben:
<ul>
<li>
Folgende Zeilen m&uuml;ssen der Datei <code>/etc/init.d/fhem</code> vor <code>perl fhem.pl</code> in start hinzu, oder in die Datei <code>/etc/rc.local</code> eingef&uuml;gt werden:<br>
<code>
sudo apt-get install i2c-tools<br>
sudo adduser fhem i2c</code><br>
</li><br>
<li>
Folgende Zeilen entweder in die Datei <code>/etc/init.d/fhem</code> vor <code>perl fhem.pl</code> in start, oder in die Datei <code>/etc/rc.local</code> eingef&uuml;gen:<br>
<code>
sudo chown fhem /dev/i2c-*<br>
sudo chgrp dialout /dev/i2c-*<br>
sudo chmod +t /dev/i2c-*<br>
sudo chmod 660 /dev/i2c-*<br>
</code>
</li>
<li>
F&uumlr das Raspberry Pi kann alternativ das gpio Utility der <a href="http://wiringpi.com/download-and-install/">WiringPi</a> Bibliothek benutzt werden um FHEM Schreibrechte auf die I2C Schnittstelle zu bekommen.<br>
</li><br>
<li>
F&uumlr das Raspberry Pi kann alternativ das gpio Utility der <a href="http://wiringpi.com/download-and-install/">WiringPi</a> Bibliothek benutzt werden um FHEM Schreibrechte auf die I2C Schnittstelle zu bekommen.<br>
WiringPi Installation ist hier beschrieben: <a href="#RPI_GPIO">RPI_GPIO</a><br>
Das gpio Utility wird, wenn vorhanden, automatisch verwendet<br>
</li>
Wichtig: um den I2C-0 am P5 Stecker des Raspberry nutzen zu können muss das Attribut <code>swap_i2c0</code> verwendet werden.<br>
</li>
</ul>
</li>
</li><br>
<li>
Installation der I2C Abh&auml;ngigkeiten:<br>
<code>sudo apt-get install libi2c-dev i2c-tools build-essential</code><br>
</li>
<li>
I2C Kernelmodule laden:<br>
modules Datei &ouml;ffnen<br>
<code>sudo nano /etc/modules</code><br>
folgendes einf&uuml;gen<br>
<code>
i2c-dev<br>
i2c-bcm2708<br>
</code>
</li>
<li>
Optional, Hardwarezugriff via IOCTL wird standardm&auml;&szlig;ig genutzt, wenn Device::SMBus nicht installiert ist<br>
<b>Optional</b>: Hardwarezugriff via IOCTL wird standardm&auml;&szlig;ig genutzt, wenn Device::SMBus nicht installiert ist<br>
Soll der Hardwarezugriff &uuml;ber das Perl Modul Device::SMBus erfolgen sind diese Schritte notwendig:<br>
<code>sudo apt-get install libmoose-perl<br>
sudo cpan Device::SMBus</code><br>
<ul><code>sudo apt-get install libmoose-perl<br>
sudo cpan Device::SMBus</code></ul><br>
</li>
</ul>
<a name="RPII2CDefine"></a><br>
<b>Define</b>
<ul>
<code>define &lt;name&gt; RPII2C &lt;I2C Bus Number&gt;</code><br>
Die <code>&lt;I2C Bus Number&gt;</code> ist die Nummer des I2C Bus an den die I2C IC's angeschlossen werden (0 oder 1)<br><br>
Die <code>&lt;I2C Bus Number&gt;</code> ist die Nummer des I2C Bus an den die I2C IC's angeschlossen werden<br><br>
</ul>
<a name="RPII2CSet"></a>
@ -684,15 +685,15 @@ sub RPII2C_HWACCESS_ioctl($$) {
<ul>
<li>
Schreibe ein Byte (oder auch mehrere nacheinander) direkt auf ein I2C device (manche I2C Module sind so einfach, das es nicht einmal mehrere Register gibt):<br>
<code>set &lt;name&gt; writeByte &lt;I2C Address&gt; &lt;value&gt;</code><br><br>
<code>set &lt;name&gt; writeByte &lt;I2C Address&gt; &lt;value&gt;</code><br><br>
</li>
<li>
Schreibe n-bytes auf einen Registerbereich (als Folge von Einzelbefehlen), beginnend mit dem angegebenen Register:<br>
<code>set &lt;name&gt; writeByteReg &lt;I2C Address&gt; &lt;Register Address&gt; &lt;value&gt;</code><br><br>
<code>set &lt;name&gt; writeByteReg &lt;I2C Address&gt; &lt;Register Address&gt; &lt;value&gt;</code><br><br>
</li>
<li>
Schreibe n-bytes auf einen Registerbereich (als Blockoperation), beginnend mit dem angegebenen Register:<br>
<code>set &lt;name&gt; writeBlock &lt;I2C Address&gt; &lt;Register Address&gt; &lt;value&gt;</code><br><br>
<code>set &lt;name&gt; writeBlock &lt;I2C Address&gt; &lt;Register Address&gt; &lt;value&gt;</code><br><br>
</li><br>
Beispiele:
<ul>