Umlaute
git-svn-id: svn://svn.code.sf.net/p/fhem/code/trunk@5477 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
@@ -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ü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ü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>
|
||||
</li>
|
||||
<li>
|
||||
Installation der I2C Abhängigkeiten:<br>
|
||||
|
||||
@@ -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önnen nicht geschrieben werden.<br>
|
||||
Standard: no, gültige Werte: 0 1 2 .. 15<br><br>
|
||||
</li>
|
||||
<li>T0/T1<br>
|
||||
|
||||
@@ -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ü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ür den Feuchtewert<br>
|
||||
Standard: 1, gültige Werte: 0 1 2<br><br>
|
||||
</li>
|
||||
<li>roundTemperatureDecimal<br>
|
||||
Anzahl Dezimalstellen f<EFBFBD>r den Temperaturwert<br>
|
||||
Anzahl Dezimalstellen für den Temperaturwert<br>
|
||||
Standard: 1, gültige Werte: 0,1,2<br><br>
|
||||
</li>
|
||||
<li><a href="#IODev">IODev</a></li>
|
||||
|
||||
Reference in New Issue
Block a user