mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-05-04 22:19:38 +00:00
updated commandref
git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@6206 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
e43f7ef5ad
commit
a62c4a9f77
@ -31,7 +31,6 @@ my $check_ioctl_ph = 1;
|
|||||||
|
|
||||||
sub RPII2C_Initialize($) {
|
sub RPII2C_Initialize($) {
|
||||||
my ($hash) = @_;
|
my ($hash) = @_;
|
||||||
|
|
||||||
eval "use Device::SMBus;";
|
eval "use Device::SMBus;";
|
||||||
$libcheck_SMBus = 0 if($@);
|
$libcheck_SMBus = 0 if($@);
|
||||||
eval {require "sys/ioctl.ph"};
|
eval {require "sys/ioctl.ph"};
|
||||||
@ -78,10 +77,10 @@ sub RPII2C_Define($$) { #
|
|||||||
return $name . ": Error! no library for Hardware access installed";
|
return $name . ": Error! no library for Hardware access installed";
|
||||||
}
|
}
|
||||||
my $device = "/dev/i2c-".$dev;
|
my $device = "/dev/i2c-".$dev;
|
||||||
if ( RPII2C_CHECK_GPIO_DEVICE($device) ) {
|
if ( RPII2C_CHECK_I2C_DEVICE($device) ) {
|
||||||
Log3 $hash, 1, "file $device not accessible try to use gpio utility to fix it";
|
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)) ) {
|
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
|
} else { #I2C Devices mit gpio utility fuer FHEM User lesbar machen
|
||||||
my $exp = $gpioprg.' load i2c';
|
my $exp = $gpioprg.' load i2c';
|
||||||
$exp = `$exp`;
|
$exp = `$exp`;
|
||||||
@ -97,7 +96,7 @@ sub RPII2C_Define($$) { #
|
|||||||
$attr{$name}{dummy} = 1;
|
$attr{$name}{dummy} = 1;
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
my $check = RPII2C_CHECK_GPIO_DEVICE($device);
|
my $check = RPII2C_CHECK_I2C_DEVICE($device);
|
||||||
return $name . $check if $check;
|
return $name . $check if $check;
|
||||||
|
|
||||||
$hash->{DeviceName} = $device;
|
$hash->{DeviceName} = $device;
|
||||||
@ -285,10 +284,9 @@ sub RPII2C_Write($$) { #wird vom Client aufgerufen
|
|||||||
#}
|
#}
|
||||||
#####################################
|
#####################################
|
||||||
|
|
||||||
sub RPII2C_CHECK_GPIO_DEVICE {
|
sub RPII2C_CHECK_I2C_DEVICE {
|
||||||
my ($dev) = @_;
|
my ($dev) = @_;
|
||||||
my $ret = undef;
|
my $ret = undef;
|
||||||
#unless (defined($hash->{gpio_util_exists})) {
|
|
||||||
if(-e $dev) {
|
if(-e $dev) {
|
||||||
if(-r $dev) {
|
if(-r $dev) {
|
||||||
unless(-w $dev) {
|
unless(-w $dev) {
|
||||||
@ -306,7 +304,6 @@ sub RPII2C_CHECK_GPIO_DEVICE {
|
|||||||
sub RPII2C_CHECK_GPIO_UTIL {
|
sub RPII2C_CHECK_GPIO_UTIL {
|
||||||
my ($gpioprg) = @_;
|
my ($gpioprg) = @_;
|
||||||
my $ret = undef;
|
my $ret = undef;
|
||||||
#unless (defined($hash->{gpio_util_exists})) {
|
|
||||||
if(-e $gpioprg) {
|
if(-e $gpioprg) {
|
||||||
if(-x $gpioprg) {
|
if(-x $gpioprg) {
|
||||||
unless(-u $gpioprg) {
|
unless(-u $gpioprg) {
|
||||||
@ -336,7 +333,7 @@ sub RPII2C_SWAPI2C0 {
|
|||||||
system "$gpioprg -g mode 1 ALT0";
|
system "$gpioprg -g mode 1 ALT0";
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Log3 $hash, 1, $ret if $ret;
|
Log3 $hash, 1, $hash->{NAME} . ": " . $ret if $ret;
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -431,9 +428,9 @@ sub RPII2C_HWACCESS_ioctl($$) {
|
|||||||
|
|
||||||
my $i2caddr = hex(sprintf "%x", $clientmsg->{i2caddress});
|
my $i2caddr = hex(sprintf "%x", $clientmsg->{i2caddress});
|
||||||
if ( sysopen(my $fh, $hash->{DeviceName}, O_RDWR) != 1) { #Datei oeffnen
|
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
|
} 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
|
} elsif (defined($clientmsg->{nbyte}) && defined($clientmsg->{reg}) && defined($clientmsg->{data}) && $clientmsg->{direction} eq "i2cblockwrite") { #Registerblock beschreiben
|
||||||
my $data = chr($clientmsg->{reg});
|
my $data = chr($clientmsg->{reg});
|
||||||
foreach (split(" ", $clientmsg->{data})) {
|
foreach (split(" ", $clientmsg->{data})) {
|
||||||
@ -441,7 +438,7 @@ sub RPII2C_HWACCESS_ioctl($$) {
|
|||||||
}
|
}
|
||||||
my $retval = syswrite($fh, $data, length($data));
|
my $retval = syswrite($fh, $data, length($data));
|
||||||
unless (defined($retval) && $retval == 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 {
|
} else {
|
||||||
$status = "Ok";
|
$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)."|";
|
Log3 $hash, 5, "$hash->{NAME}: HWaccess block schreiben, Reg: 0x". unpack( "H2",pack "C", $clientmsg->{reg}) . " Inh(dec):|$clientmsg->{data}|, laenge: |".length($data)."|";
|
||||||
@ -458,7 +455,7 @@ sub RPII2C_HWACCESS_ioctl($$) {
|
|||||||
my $data = (defined($reg) ? chr($reg++) : "") . chr($_);
|
my $data = (defined($reg) ? chr($reg++) : "") . chr($_);
|
||||||
my $retval = syswrite($fh, $data, length($data));
|
my $retval = syswrite($fh, $data, length($data));
|
||||||
unless (defined($retval) && $retval == 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";
|
$status = "error";
|
||||||
last;
|
last;
|
||||||
}
|
}
|
||||||
@ -472,14 +469,14 @@ sub RPII2C_HWACCESS_ioctl($$) {
|
|||||||
Log3 $hash, 5, "$hash->{NAME}: HWaccess byteweise lesen setze Registerpointer auf " . ($clientmsg->{reg} + $n);
|
Log3 $hash, 5, "$hash->{NAME}: HWaccess byteweise lesen setze Registerpointer auf " . ($clientmsg->{reg} + $n);
|
||||||
my $retval = syswrite($fh, chr($clientmsg->{reg} + $n), 1);
|
my $retval = syswrite($fh, chr($clientmsg->{reg} + $n), 1);
|
||||||
unless (defined($retval) && $retval == 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;
|
last;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
my $buf = undef;
|
my $buf = undef;
|
||||||
my $retval = sysread($fh, $buf, 1);
|
my $retval = sysread($fh, $buf, 1);
|
||||||
unless (defined($retval) && $retval == 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;
|
last;
|
||||||
}
|
}
|
||||||
$rmsg .= ord($buf);
|
$rmsg .= ord($buf);
|
||||||
@ -508,8 +505,23 @@ sub RPII2C_HWACCESS_ioctl($$) {
|
|||||||
<b>preliminary:</b><br>
|
<b>preliminary:</b><br>
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<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>
|
<ul>
|
||||||
|
<li>
|
||||||
|
<code>sudo apt-get install i2c-tools<br>
|
||||||
|
sudo adduser fhem i2c<br>
|
||||||
|
sudo reboot</code><br>
|
||||||
|
</li><br>
|
||||||
<li>
|
<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>
|
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>
|
<code>
|
||||||
@ -518,33 +530,20 @@ sub RPII2C_HWACCESS_ioctl($$) {
|
|||||||
sudo chmod +t /dev/i2c-*<br>
|
sudo chmod +t /dev/i2c-*<br>
|
||||||
sudo chmod 660 /dev/i2c-*<br>
|
sudo chmod 660 /dev/i2c-*<br>
|
||||||
</code>
|
</code>
|
||||||
</li>
|
</li><br>
|
||||||
<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>
|
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>
|
WiringPi installation is described here: <a href="#RPI_GPIO">RPI_GPIO.</a><br>
|
||||||
gpio utility will be automaticly used, if installed.<br>
|
gpio utility will be automaticly used, if installed.<br>
|
||||||
|
Important: to use I2C-0 at P5 connector you must use attribute <code>swap_i2c0</code>.<br>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li><br>
|
||||||
<li>
|
<li>
|
||||||
installation of i2c dependencies:<br>
|
<b>Optional</b>: access via IOCTL will be used if Device::SMBus is not present.<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>
|
|
||||||
To access the I2C-Bus via the Device::SMBus module, following steps are necessary:<br>
|
To access the I2C-Bus via the Device::SMBus module, following steps are necessary:<br>
|
||||||
<code>sudo apt-get install libmoose-perl<br>
|
<ul><code>sudo apt-get install libmoose-perl<br>
|
||||||
sudo cpan Device::SMBus</code><br>
|
sudo cpan Device::SMBus</code></ul><br>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<a name="RPII2CDefine"></a><br>
|
<a name="RPII2CDefine"></a><br>
|
||||||
@ -628,55 +627,57 @@ sub RPII2C_HWACCESS_ioctl($$) {
|
|||||||
<h3>RPII2C</h3>
|
<h3>RPII2C</h3>
|
||||||
<ul>
|
<ul>
|
||||||
<a name="RPII2C"></a>
|
<a name="RPII2C"></a>
|
||||||
Ermöglicht den Zugriff auf die I2C Schnittstellen des Raspberry Pi über logische Module. Register von I2C IC's können auch direkt gelesen und geschrieben werden.<br><br>
|
Ermöglicht den Zugriff auf die I2C Schnittstellen des Raspberry Pi, BBB, Cubie über logische Module. Register von I2C IC's können auch direkt gelesen und geschrieben werden.<br><br>
|
||||||
Dieses Modul funktioniert grunsätzlich auf allen Linux Systemen, die <code>/dev/i2c-x</code> bereitstellen.<br><br>
|
Dieses Modul funktioniert grunsätzlich auf allen Linux Systemen, die <code>/dev/i2c-x</code> bereitstellen.<br><br>
|
||||||
|
|
||||||
<b>Vorbereitung:</b><br>
|
<b>Vorbereitung:</b><br>
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
|
I2C Kernelmodule laden:<br>
|
||||||
|
modules Datei öffnen<br>
|
||||||
|
<ul><code>sudo nano /etc/modules</code></ul><br>
|
||||||
|
folgendes einfügen<br>
|
||||||
|
<ul><code>
|
||||||
|
i2c-dev<br>
|
||||||
|
i2c-bcm2708<br>
|
||||||
|
</code></ul>
|
||||||
|
</li> <br>
|
||||||
|
<li><b>Eine</b> der folgenden drei Möglichkeiten wählen um dem FHEM User Zugriff auf <code>/dev/i2c-*</code> zu geben:
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
Folgende Zeilen mü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ü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ügen:<br>
|
||||||
<code>
|
<code>
|
||||||
sudo chown fhem /dev/i2c-*<br>
|
sudo chown fhem /dev/i2c-*<br>
|
||||||
sudo chgrp dialout /dev/i2c-*<br>
|
sudo chgrp dialout /dev/i2c-*<br>
|
||||||
sudo chmod +t /dev/i2c-*<br>
|
sudo chmod +t /dev/i2c-*<br>
|
||||||
sudo chmod 660 /dev/i2c-*<br>
|
sudo chmod 660 /dev/i2c-*<br>
|
||||||
</code>
|
</code>
|
||||||
</li>
|
</li><br>
|
||||||
<li>
|
<li>
|
||||||
Für 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>
|
Für 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>
|
WiringPi Installation ist hier beschrieben: <a href="#RPI_GPIO">RPI_GPIO</a><br>
|
||||||
Das gpio Utility wird, wenn vorhanden, automatisch verwendet<br>
|
Das gpio Utility wird, wenn vorhanden, automatisch verwendet<br>
|
||||||
|
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>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li><br>
|
||||||
<li>
|
<li>
|
||||||
Installation der I2C Abhängigkeiten:<br>
|
<b>Optional</b>: Hardwarezugriff via IOCTL wird standardmäßig genutzt, wenn Device::SMBus nicht installiert ist<br>
|
||||||
<code>sudo apt-get install libi2c-dev i2c-tools build-essential</code><br>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
I2C Kernelmodule laden:<br>
|
|
||||||
modules Datei öffnen<br>
|
|
||||||
<code>sudo nano /etc/modules</code><br>
|
|
||||||
folgendes einfügen<br>
|
|
||||||
<code>
|
|
||||||
i2c-dev<br>
|
|
||||||
i2c-bcm2708<br>
|
|
||||||
</code>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
Optional, Hardwarezugriff via IOCTL wird standardmäßig genutzt, wenn Device::SMBus nicht installiert ist<br>
|
|
||||||
Soll der Hardwarezugriff über das Perl Modul Device::SMBus erfolgen sind diese Schritte notwendig:<br>
|
Soll der Hardwarezugriff über das Perl Modul Device::SMBus erfolgen sind diese Schritte notwendig:<br>
|
||||||
<code>sudo apt-get install libmoose-perl<br>
|
<ul><code>sudo apt-get install libmoose-perl<br>
|
||||||
sudo cpan Device::SMBus</code><br>
|
sudo cpan Device::SMBus</code></ul><br>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<a name="RPII2CDefine"></a><br>
|
<a name="RPII2CDefine"></a><br>
|
||||||
<b>Define</b>
|
<b>Define</b>
|
||||||
<ul>
|
<ul>
|
||||||
<code>define <name> RPII2C <I2C Bus Number></code><br>
|
<code>define <name> RPII2C <I2C Bus Number></code><br>
|
||||||
Die <code><I2C Bus Number></code> ist die Nummer des I2C Bus an den die I2C IC's angeschlossen werden (0 oder 1)<br><br>
|
Die <code><I2C Bus Number></code> ist die Nummer des I2C Bus an den die I2C IC's angeschlossen werden<br><br>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<a name="RPII2CSet"></a>
|
<a name="RPII2CSet"></a>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user