git-svn-id: svn://svn.code.sf.net/p/fhem/code/trunk@5477 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
klauswitt
2014-04-07 19:54:42 +00:00
parent 19e7fbe77a
commit efae7f501e
3 changed files with 33 additions and 33 deletions

View File

@@ -32,7 +32,7 @@ sub RPII2C_Initialize($) {
# Provider
$hash->{Clients} = join (':',@clients);
#$hash->{WriteFn} = "RPII2C_Write"; #wird vom client per IOWrite($@) aufgerufen
$hash->{I2CWrtFn} = "RPII2C_Write"; #zum testen als alternative für IOWrite
$hash->{I2CWrtFn} = "RPII2C_Write"; #zum testen als alternative fuer IOWrite
# Normal devices
$hash->{DefFn} = "RPII2C_Define";
@@ -54,7 +54,7 @@ sub RPII2C_Define($$) { #
Log3 undef, 2, $msg;
return $msg;
}
if(-e $gpioprg) { #I2C Devices für FHEM User lesbar machen
if(-e $gpioprg) { #I2C Devices fuer FHEM User lesbar machen
if(-x $gpioprg) {
if(-u $gpioprg) {
my $exp = $gpioprg.' load i2c';
@@ -151,12 +151,12 @@ sub RPII2C_Set($@) { #writeBlock noch nicht fertig
my @sets = ('writeByte', 'writeByteReg', 'writeBlock'); #, 'writeNBlock');
return "Unknown argument $type, choose one of " . join(" ", @sets) if @a < 2;
foreach (@a) { #Hexwerte prüfen und in Dezimalwerte wandeln
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;
return "$name: I2C Address not valid" unless ($i2ca > 3 && $i2ca < 128); #prüfe auf Hexzahl zwischen 4 und 7F
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 ($reg, $nbyte, $data) = undef;
@@ -188,7 +188,7 @@ sub RPII2C_Set($@) { #writeBlock noch nicht fertig
$i2chash->{nbyte} = $nbyte if defined($nbyte);
$i2chash->{data} = $data if defined($data);
RPII2C_HWACCESS($hash, $i2chash);
undef $i2chash; #Hash löschen
undef $i2chash; #Hash loeschen
return undef;
}
##################################### fertig?
@@ -212,7 +212,7 @@ sub RPII2C_Get($@) { #
my $status = RPII2C_HWACCESS($hash, $i2chash);
#my $received = join(" ", @{$i2chash->{received}}); #als Array
my $received = $i2chash->{received}; #als Scalar
undef $i2chash; #Hash löschen
undef $i2chash; #Hash loeschen
return (defined($received) ? "received : " . $received ." | " : "" ) . " transmission: $status";
}
return undef;
@@ -238,7 +238,7 @@ sub RPII2C_Write($$) { #wird vom Client aufgerufen
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);
undef $clientmsg #Hash löschen nachdem Daten verteilt wurden
undef $clientmsg #Hash loeschen nachdem Daten verteilt wurden
}
}
return undef;
@@ -270,7 +270,7 @@ sub RPII2C_HWACCESS($$) {
last if $inh != 0;
$status = "Ok" if $inh == 0;
}
#hier Mehrfachbeschreibung eines Registers noch entfernen und dafür Bereich mit Registeroperationen beschreiben
#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) {
@@ -299,8 +299,8 @@ sub RPII2C_HWACCESS($$) {
$rmsg .= " " if $n <= $nbyte;
$status = "Ok" if ($n + 1) == $nbyte;
}
#@{$clientmsg->{received}} = split(" ", $rmsg) if($rmsg); #Daten als Array übertragen
$clientmsg->{received} = $rmsg if($rmsg); #Daten als Scalar übertragen
#@{$clientmsg->{received}} = split(" ", $rmsg) if($rmsg); #Daten als Array uebertragen
$clientmsg->{received} = $rmsg if($rmsg); #Daten als Scalar uebertragen
} elsif ($clientmsg->{direction} eq "i2cread") { #Byte lesen
my $nbyte = defined($clientmsg->{nbyte}) ? $clientmsg->{nbyte} : 1;
my $rmsg = "";
@@ -312,8 +312,8 @@ sub RPII2C_HWACCESS($$) {
$rmsg .= " " if $n <= $nbyte;
$status = "Ok" if ($n + 1) == $nbyte;
}
#@{$clientmsg->{received}} = split(" ", $rmsg) if($rmsg); #Daten als Array übertragen
$clientmsg->{received} = $rmsg if($rmsg); #Daten als Scalar übertragen
#@{$clientmsg->{received}} = split(" ", $rmsg) if($rmsg); #Daten als Array uebertragen
$clientmsg->{received} = $rmsg if($rmsg); #Daten als Scalar uebertragen
}
$hash->{STATE} = $status;
$hash->{ERRORCNT} = defined($hash->{ERRORCNT}) ? $hash->{ERRORCNT} += 1 : 1 if $status ne "Ok";
@@ -443,7 +443,7 @@ sub RPII2C_HWACCESS($$) {
<li>
Dieses Modul nutzt das gpio Utility der <a href="http://wiringpi.com/download-and-install/">WiringPi</a> Bibliothek um FHEM Schreibrechte auf die I2C Schnittstelle zu geben.<br>
WiringPi Installation ist hier beschrieben: <a href="#RPI_GPIO">RPI_GPIO</a><br>
F&uuml;r andere Systeme (BeagleBone, etc.) oder auch für das Raspberry kann auf WiringPi verzichtet werden. In diesem Fall müssen die Dateien <code>/dev/i2c-x</code> Schreib-/Leserechte, für den User unter dem FHEM läuft, gesetzt bekommen. (z.B. in der etc/init.d/fhem)<br>
F&uuml;r andere Systeme (BeagleBone, etc.) oder auch f&uuml;r das Raspberry kann auf WiringPi verzichtet werden. In diesem Fall m&uuml;ssen die Dateien <code>/dev/i2c-x</code> Schreib-/Leserechte, f&uuml;r den User unter dem FHEM l&auml;uft, gesetzt bekommen. (z.B. in der etc/init.d/fhem)<br>
</li>
<li>
Installation der I2C Abh&auml;ngigkeiten:<br>

View File

@@ -19,11 +19,11 @@
#Inhalte des Hashes:
#i2caddress 00-7F I2C-Adresse
#direction i2cread|i2cwrite Richtung
#reg 00-FF|"" Registeradresse (kann weggelassen werden f<EFBFBD>r IC's ohne Registeradressierung)
#reg 00-FF|"" Registeradresse (kann weggelassen werden fuer IC's ohne Registeradressierung)
#nbyte Zahl Anzahl Register, die bearbeitet werden sollen (im mom 0-99)
#data 00-FF ... Daten die an I2C geschickt werden sollen (m<EFBFBD>ssen, wenn nbyte benutzt wird immer ein Vielfaches Desselben sein)
#data 00-FF ... Daten die an I2C geschickt werden sollen (muessen, wenn nbyte benutzt wird immer ein Vielfaches Desselben sein)
#received 00-FF ... Daten die vom I2C empfangen wurden, durch Leerzeichen getrennt (bleibt leer wenn Daten geschrieben werden)
#pname_SENDSTAT Ok|error zeigt <EFBFBD>bertragungserfolg an
#pname_SENDSTAT Ok|error zeigt uebertragungserfolg an
package main;
use strict;
@@ -177,12 +177,12 @@ sub I2C_PCA9532_Set($@) {
join(',', (sort { $setsP{ $a } <=> $setsP{ $b } } keys %setsP) )
unless(exists($setsP{$val}));
substr($cmd,0,4,"");
return "$name error: Port$cmd is defined as input" if ( $cmd ~~ @inports ); #Pr<EFBFBD>fen ob entsprechender Port Input ist
return "$name error: Port$cmd is defined as input" if ( $cmd ~~ @inports ); #Pruefen ob entsprechender Port Input ist
my $LSreg = int($cmd / 4); #Nummer des entspechenden LS Registers
my $regaddr = $LSreg + 6; #Adresse f<EFBFBD>r Controlregister berechnen (LS0 = 0x06)
my $regaddr = $LSreg + 6; #Adresse fuer Controlregister berechnen (LS0 = 0x06)
my $n = $LSreg * 4; #Erster Port in LSx
my $sbyte = 0;
foreach (reverse 0..3) { #ensprechendes Controlregister f<EFBFBD>llen
foreach (reverse 0..3) { #ensprechendes Controlregister fuellen
my $portn = $_ + $n;
#hier noch alle inputs auf rezessiv setzen
if (( $portn) == $cmd ) { #->wenn aktueller Port dann neuer Wert
@@ -208,7 +208,7 @@ sub I2C_PCA9532_Set($@) {
} else {
my $list = undef;
foreach (0..15) {
next if ( $_ ~~ @inports ); #Inputs <EFBFBD>berspringen
next if ( $_ ~~ @inports ); #Inputs ueberspringen
#$list .= "Port" . $_ . ":" . join(',', sort keys %setsP) . " ";
$list .= "Port" . $_ . ":" . join(',', (sort { $setsP{ $a } <=> $setsP{ $b } } keys %setsP) ) . " ";
}
@@ -240,20 +240,20 @@ sub I2C_PCA9532_I2CRec($@) { # vom physical aufgerufen
my $name = $hash->{NAME};
my $phash = $hash->{IODev};
my $pname = $phash->{NAME};
while ( my ( $k, $v ) = each %$clientmsg ) { #erzeugen von Internals f<EFBFBD>r alle Keys in $clientmsg die mit dem physical Namen beginnen
while ( my ( $k, $v ) = each %$clientmsg ) { #erzeugen von Internals fuer alle Keys in $clientmsg die mit dem physical Namen beginnen
$hash->{$k} = $v if $k =~ /^$pname/ ;
}
#hier noch <EFBFBD>berpr<EFBFBD>fen, ob Register und Daten ok
#hier noch ueberpruefen, ob Register und Daten ok
if ($clientmsg->{direction} && defined($clientmsg->{reg}) && $clientmsg->{$pname . "_SENDSTAT"} && $clientmsg->{$pname . "_SENDSTAT"} eq "Ok") {
if ( $clientmsg->{direction} eq "i2cread" && defined($clientmsg->{received}) ) { # =~ m/^[a-f0-9]{2}$/i) {
#my @rec = @{$clientmsg->{received}}; #bei <EFBFBD>bergabe im hash als array
my @rec = split(" ",$clientmsg->{received}); #bei <EFBFBD>bergabe im als skalar
#my @rec = @{$clientmsg->{received}}; #bei uebergabe im hash als array
my @rec = split(" ",$clientmsg->{received}); #bei uebergabe im als skalar
Log3 $hash, 3, "$name: wrong amount of registers transmitted from $pname" unless (@rec == $clientmsg->{nbyte});
foreach (reverse 0..$#rec) { #reverse, damit Inputs (Register 0 und 1 als letztes geschrieben werden)
I2C_PCA9532_UpdReadings($hash, $_ + $clientmsg->{reg} , $rec[$_]);
}
readingsSingleUpdate($hash,"state", "Ok", 1);
} elsif ( $clientmsg->{direction} eq "i2cwrite" && defined($clientmsg->{data}) ) { # =~ m/^[a-f0-9]{2}$/i) {#readings aktualisieren wenn <EFBFBD>bertragung ok
} elsif ( $clientmsg->{direction} eq "i2cwrite" && defined($clientmsg->{data}) ) { # =~ m/^[a-f0-9]{2}$/i) {#readings aktualisieren wenn uebertragung ok
I2C_PCA9532_UpdReadings($hash, $clientmsg->{reg} , $clientmsg->{data});
readingsSingleUpdate($hash,"state", "Ok", 1);
@@ -295,7 +295,7 @@ sub I2C_PCA9532_UpdReadings($$$) {
my $pval = 3 & ( $inh >> ($_ * 2) );
my $port = $_ + $n;
readingsBulkUpdate($hash, 'Port'.$port , $rsetsP{$pval})
if (ReadingsVal($name, 'Port'.$port,"nix") ne $rsetsP{$pval}); #nur wenn Wert ge<EFBFBD>ndert
if (ReadingsVal($name, 'Port'.$port,"nix") ne $rsetsP{$pval}); #nur wenn Wert geaendert
}
} elsif ( $reg == 3) { #wenn PWM0 Register
readingsBulkUpdate($hash, 'PWM0' , $inh);
@@ -468,7 +468,7 @@ sub I2C_PCA9532_UpdReadings($$$) {
</li>
<li>InputPorts<br>
Durch Leerzeichen getrennte Portnummern die als Inputs genutzt werden.<br>
Ports in dieser Liste k<EFBFBD>nnen nicht geschrieben werden.<br>
Ports in dieser Liste k&ouml;nnen nicht geschrieben werden.<br>
Standard: no, g&uuml;ltige Werte: 0 1 2 .. 15<br><br>
</li>
<li>T0/T1<br>

View File

@@ -107,7 +107,7 @@ sub I2C_SHT21_Catch($) {
}
sub I2C_SHT21_Attr (@) {# hier noch Werte<EFBFBD>berpr<EFBFBD>fung einf<EFBFBD>gen
sub I2C_SHT21_Attr (@) {# hier noch Werteueberpruefung einfuegen
my (undef, $name, $attr, $val) = @_;
my $hash = $defs{$name};
my $msg = '';
@@ -169,7 +169,7 @@ sub I2C_SHT21_I2CRec ($$) {
my $name = $hash->{NAME};
my $phash = $hash->{IODev};
my $pname = $phash->{NAME};
while ( my ( $k, $v ) = each %$clientmsg ) { #erzeugen von Internals für alle Keys in $clientmsg die mit dem physical Namen beginnen
while ( my ( $k, $v ) = each %$clientmsg ) { #erzeugen von Internals fuer alle Keys in $clientmsg die mit dem physical Namen beginnen
$hash->{$k} = $v if $k =~ /^$pname/ ;
}
if ($clientmsg->{direction} && $clientmsg->{type} && $clientmsg->{$pname . "_SENDSTAT"} && $clientmsg->{$pname . "_SENDSTAT"} eq "Ok") {
@@ -228,7 +228,7 @@ sub I2C_SHT21_readTemperature($) {
my $i2creq = { i2caddress => $hash->{I2C_Address}, direction => "i2cwrite" };
$i2creq->{data} = hex("F3");
CallFn($pname, "I2CWrtFn", $phash, $i2creq);
usleep(85000); #für 14bit
usleep(85000); #fuer 14bit
# Read the two byte result from device
my $i2cread = { i2caddress => $hash->{I2C_Address}, direction => "i2cread" };
@@ -250,7 +250,7 @@ sub I2C_SHT21_readHumidity($) {
my $i2creq = { i2caddress => $hash->{I2C_Address}, direction => "i2cwrite" };
$i2creq->{data} = hex("F5");
CallFn($pname, "I2CWrtFn", $phash, $i2creq);
usleep(39000); #für 12bit
usleep(39000); #fuer 12bit
# Read the two byte result from device
my $i2cread = { i2caddress => $hash->{I2C_Address}, direction => "i2cread" };
@@ -340,11 +340,11 @@ sub I2C_SHT21_readHumidity($) {
Standard: 5, g&uuml;ltige Werte: 1,2,5,10,20,30<br><br>
</li>
<li>roundHumidityDecimal<br>
Anzahl Dezimalstellen f<EFBFBD>r den Feuchtewert<br>
Anzahl Dezimalstellen f&uuml;r den Feuchtewert<br>
Standard: 1, g&uuml;ltige Werte: 0 1 2<br><br>
</li>
<li>roundTemperatureDecimal<br>
Anzahl Dezimalstellen f<EFBFBD>r den Temperaturwert<br>
Anzahl Dezimalstellen f&uuml;r den Temperaturwert<br>
Standard: 1, g&uuml;ltige Werte: 0,1,2<br><br>
</li>
<li><a href="#IODev">IODev</a></li>