2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-21 07:56:03 +00:00

correction for attr poll_interval and german documentation

git-svn-id: https://svn.fhem.de/fhem/trunk@4581 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
klauswitt 2014-01-06 20:35:10 +00:00
parent ab7d743849
commit 1169d6c739

View File

@ -60,7 +60,7 @@ sub RPI_GPIO_Define($$) {
"define <name> RPI_GPIO <GPIO>"; "define <name> RPI_GPIO <GPIO>";
} }
#Prüfen, ob GPIO bereits verwendet #Prüfen, ob GPIO bereits verwendet
foreach my $dev (devspec2array("TYPE=$hash->{TYPE}")) { foreach my $dev (devspec2array("TYPE=$hash->{TYPE}")) {
if ($args[2] eq InternalVal($dev,"RPI_pin","")) { if ($args[2] eq InternalVal($dev,"RPI_pin","")) {
return "GPIO $args[2] already used by $dev"; return "GPIO $args[2] already used by $dev";
@ -70,7 +70,7 @@ sub RPI_GPIO_Define($$) {
my $name = $args[0]; my $name = $args[0];
$hash->{RPI_pin} = $args[2]; $hash->{RPI_pin} = $args[2];
#export Pin alte Version -> wird jetzt über direction gemacht (WiringPi Programm GPIO) #export Pin alte Version -> wird jetzt über direction gemacht (WiringPi Programm GPIO)
#my $exp = IO::File->new("> /sys/class/gpio/export"); #my $exp = IO::File->new("> /sys/class/gpio/export");
#print $exp "$hash->{RPI_pin}"; #print $exp "$hash->{RPI_pin}";
#$exp->close; #$exp->close;
@ -118,12 +118,20 @@ sub RPI_GPIO_Set($@) {
my $val = fileaccess($hash, "value"); #alten Wert des GPIO direkt auslesen my $val = fileaccess($hash, "value"); #alten Wert des GPIO direkt auslesen
$cmd = $val eq "0" ? "on" :"off"; $cmd = $val eq "0" ? "on" :"off";
} }
if ($cmd eq 'on') { if ($cmd eq 'on') {
fileaccess($hash, "value", "1"); fileaccess($hash, "value", "1");
$hash->{STATE} = 'on'; #$hash->{STATE} = 'on';
readingsBeginUpdate($hash);
#readingsBulkUpdate($hash, 'Pinlevel', $valalt);
readingsBulkUpdate($hash, 'state', "on");
readingsEndUpdate($hash, 1);
} elsif ($cmd eq 'off') { } elsif ($cmd eq 'off') {
fileaccess($hash, "value", "0"); fileaccess($hash, "value", "0");
$hash->{STATE} = 'off'; #$hash->{STATE} = 'off';
readingsBeginUpdate($hash);
#readingsBulkUpdate($hash, 'Pinlevel', $valalt);
readingsBulkUpdate($hash, 'state', "off");
readingsEndUpdate($hash, 1);
} else { } else {
my $slist = join(' ', keys %setsoutp); my $slist = join(' ', keys %setsoutp);
return SetExtensions($hash, $slist, @a); return SetExtensions($hash, $slist, @a);
@ -192,7 +200,7 @@ sub RPI_GPIO_Attr(@) {
} }
if ($attr eq 'direction') { if ($attr eq 'direction') {
if (!$val) { #$val nicht definiert: Einstellungen löschen if (!$val) { #$val nicht definiert: Einstellungen löschen
$msg = "$hash->{NAME}: no direction value. Use input output"; $msg = "$hash->{NAME}: no direction value. Use input output";
} elsif ($val eq "input") { } elsif ($val eq "input") {
#fileaccess($hash, "direction", "in"); #fileaccess($hash, "direction", "in");
@ -308,7 +316,7 @@ sub RPI_GPIO_Undef($$) {
sub RPI_GPIO_Except($) { sub RPI_GPIO_Except($) {
my ($hash) = @_; my ($hash) = @_;
#seek($hash->{filehandle},0,0); #an Anfang der Datei springen (ist nötig falls vorher schon etwas gelesen wurde) #seek($hash->{filehandle},0,0); #an Anfang der Datei springen (ist nötig falls vorher schon etwas gelesen wurde)
#chomp ( my $firstval = $hash->{filehandle}->getline ); #aktuelle Zeile auslesen und Endezeichen entfernen #chomp ( my $firstval = $hash->{filehandle}->getline ); #aktuelle Zeile auslesen und Endezeichen entfernen
my $eval = fileaccess($hash, "edge"); #Eintstellung Flankensteuerung auslesen my $eval = fileaccess($hash, "edge"); #Eintstellung Flankensteuerung auslesen
my ($valst, $valalt, $valto, $valcnt) = undef; my ($valst, $valalt, $valto, $valcnt) = undef;
@ -319,7 +327,7 @@ sub RPI_GPIO_Except($) {
select(undef, undef, undef, $debounce_time); select(undef, undef, undef, $debounce_time);
} }
seek($hash->{filehandle},0,0); #an Anfang der Datei springen (ist nötig falls vorher schon etwas gelesen wurde) seek($hash->{filehandle},0,0); #an Anfang der Datei springen (ist nötig falls vorher schon etwas gelesen wurde)
chomp ( my $val = $hash->{filehandle}->getline ); #aktuelle Zeile auslesen und Endezeichen entfernen chomp ( my $val = $hash->{filehandle}->getline ); #aktuelle Zeile auslesen und Endezeichen entfernen
if ( ( $val == 1) && ( $eval ne ("falling") ) ) { if ( ( $val == 1) && ( $eval ne ("falling") ) ) {
@ -344,26 +352,26 @@ sub RPI_GPIO_Except($) {
$valto = "off"; $valto = "off";
} }
#Log 1, "Toggle ist jetzt $valto"; #Log 1, "Toggle ist jetzt $valto";
if (( AttrVal($hash->{NAME}, "toggletostate", "no") ) eq ( "yes" )) { #wenn Attr "toggletostate" gesetzt auch die Variable für den STATE wert setzen if (( AttrVal($hash->{NAME}, "toggletostate", "no") ) eq ( "yes" )) { #wenn Attr "toggletostate" gesetzt auch die Variable für den STATE wert setzen
$valst = $valto; $valst = $valto;
} }
#Zählfunktion #Zählfunktion
if (!defined($hash->{READINGS}{Counter}{VAL})) { #Zähler existiert nicht -> anlegen if (!defined($hash->{READINGS}{Counter}{VAL})) { #Zähler existiert nicht -> anlegen
#Log 1, "Zähler war nicht def"; #Log 1, "Zähler war nicht def";
$valcnt = "1"; $valcnt = "1";
} else { } else {
$valcnt = $hash->{READINGS}{Counter}{VAL} + 1; $valcnt = $hash->{READINGS}{Counter}{VAL} + 1;
#Log 1, "Zähler ist jetzt $valcnt"; #Log 1, "Zähler ist jetzt $valcnt";
} }
} }
delete ($hash->{READINGS}{Toggle}) if ($eval ne ("rising" || "falling")); #Reading Toggle löschen wenn kein Wert in Variable delete ($hash->{READINGS}{Toggle}) if ($eval ne ("rising" || "falling")); #Reading Toggle löschen wenn kein Wert in Variable
readingsBeginUpdate($hash); readingsBeginUpdate($hash);
readingsBulkUpdate($hash, 'Pinlevel', $valalt); readingsBulkUpdate($hash, 'Pinlevel', $valalt);
readingsBulkUpdate($hash, 'state', $valst); readingsBulkUpdate($hash, 'state', $valst);
readingsBulkUpdate($hash, 'Toggle', $valto) if ($valto); readingsBulkUpdate($hash, 'Toggle', $valto) if ($valto);
readingsBulkUpdate($hash, 'Counter', $valcnt) if ($valcnt); readingsBulkUpdate($hash, 'Counter', $valcnt) if ($valcnt);
readingsEndUpdate($hash, 1); readingsEndUpdate($hash, 1);
#Log 1, "RPIGPIO: Except ausgelöst: $hash->{NAME}, Wert: $val, edge: $eval,vt: $valto, $debounce_time s: $firstval"; #Log 1, "RPIGPIO: Except ausgelöst: $hash->{NAME}, Wert: $val, edge: $eval,vt: $valto, $debounce_time s: $firstval";
} }
sub updatevalue($) { sub updatevalue($) {
@ -380,7 +388,7 @@ sub updatevalue($) {
} }
readingsBeginUpdate($hash); readingsBeginUpdate($hash);
readingsBulkUpdate($hash, 'Pinlevel', $valalt); readingsBulkUpdate($hash, 'Pinlevel', $valalt);
readingsBulkUpdate($hash, 'state', $valst) if (( AttrVal($hash->{NAME}, "toggletostate", "yes") ) eq ( "no" )); readingsBulkUpdate($hash, 'state', $valst) if (( AttrVal($hash->{NAME}, "toggletostate", "no") ) eq ( "no" ));
readingsEndUpdate($hash, 1); readingsEndUpdate($hash, 1);
} else { } else {
Log 1, "$hash->{NAME}: readout of Pinvalue fail"; Log 1, "$hash->{NAME}: readout of Pinvalue fail";
@ -449,7 +457,7 @@ sub inthandling($$) {
my ($hash, $arg) = @_; my ($hash, $arg) = @_;
my $msg = ''; my $msg = '';
if ( $arg eq "start") { if ( $arg eq "start") {
#FH für value-datei #FH für value-datei
my $pinroot = qq($gpiodir/gpio$hash->{RPI_pin}); my $pinroot = qq($gpiodir/gpio$hash->{RPI_pin});
my $valfile = qq($pinroot/value); my $valfile = qq($pinroot/value);
$hash->{filehandle} = IO::File->new("< $valfile"); $hash->{filehandle} = IO::File->new("< $valfile");
@ -641,12 +649,12 @@ sub inthandling($$) {
<ul> <ul>
<a name="RPI_GPIO"></a> <a name="RPI_GPIO"></a>
<p> <p>
Das Raspberry Pi ermöglicht direkten Zugriff zu einigen GPIO's über den Pfostenstecker P1 (und P5 bei V2). Die Steckerbelegung ist in den Tabellen unter Define zu finden. Das Raspberry Pi erm&ouml;glicht direkten Zugriff zu einigen GPIO's &uuml;ber den Pfostenstecker P1 (und P5 bei V2). Die Steckerbelegung ist in den Tabellen unter Define zu finden.
Dieses Modul ermöglicht es, die herausgefühten GPIO's direkt als Ein- und Ausgang zu benutzen. Die Eingänge nnen zyklisch abgefragt werden oder auch sofort bei Pegelwechsel gesetzt werden.<br><br> Dieses Modul erm&ouml;glicht es, die herausgef&uuml;hten GPIO's direkt als Ein- und Ausgang zu benutzen. Die Eing&auml;nge k&ouml;nnen zyklisch abgefragt werden oder auch sofort bei Pegelwechsel gesetzt werden.<br><br>
<b>Wichtig: Niemals Spannung an einen GPIO anlegen, der als Ausgang eingestellt ist! Die interne Logik der GPIO's arbeitet mit 3,3V. Ein überschreiten der 3,3V zerstört den GPIO und vielleicht auch den ganzen Prozessor!</b><br><br> <b>Wichtig: Niemals Spannung an einen GPIO anlegen, der als Ausgang eingestellt ist! Die interne Logik der GPIO's arbeitet mit 3,3V. Ein &uuml;berschreiten der 3,3V zerst&ouml;rt den GPIO und vielleicht auch den ganzen Prozessor!</b><br><br>
<b>Vorbereitung:</b><br> <b>Vorbereitung:</b><br>
Auf GPIO Pins wird im Modul über sysfs zugegriffen. Die Dateien befinden sich unter /system/class/gpio und können nur mit root erreicht werden. Auf GPIO Pins wird im Modul &uuml;ber sysfs zugegriffen. Die Dateien befinden sich unter /system/class/gpio und k&ouml;nnen nur mit root erreicht werden.
Dieses Modul nutzt das gpio Tool von der <a href="http://wiringpi.com/download-and-install/">WiringPi</a>. Bibliothek um GPIS zu exportieren und die korrekten Nutzerrechte zu setzen. Dieses Modul nutzt das gpio Tool von der <a href="http://wiringpi.com/download-and-install/">WiringPi</a>. Bibliothek um GPIS zu exportieren und die korrekten Nutzerrechte zu setzen.
Installation WiringPi: Installation WiringPi:
<pre> <pre>
@ -663,7 +671,7 @@ sub inthandling($$) {
<b>Define</b> <b>Define</b>
<ul> <ul>
<code>define &lt;name&gt; RPI_GPIO &lt;GPIO number&gt;</code><br><br> <code>define &lt;name&gt; RPI_GPIO &lt;GPIO number&gt;</code><br><br>
Alle verfügbaren <code>GPIO number</code> sind in den folgenden Tabellen zu finden<br><br> Alle verf&uuml;gbaren <code>GPIO number</code> sind in den folgenden Tabellen zu finden<br><br>
<table border="0" cellspacing="0" cellpadding="0"> <table border="0" cellspacing="0" cellpadding="0">
<td> <td>
@ -727,16 +735,16 @@ sub inthandling($$) {
<code>set &lt;name&gt; &lt;value&gt;</code> <code>set &lt;name&gt; &lt;value&gt;</code>
<br><br> <br><br>
<code>value</code> ist dabei einer der folgenden Werte:<br> <code>value</code> ist dabei einer der folgenden Werte:<br>
<ul><li>Für GPIO der als output konfiguriert ist <ul><li>F&uuml;r GPIO der als output konfiguriert ist
<ul><code> <ul><code>
off<br> off<br>
on<br> on<br>
toggle<br> toggle<br>
</code> </code>
</ul> </ul>
Die <a href="#setExtensions"> set extensions</a> werden auch unterstützt.<br> Die <a href="#setExtensions"> set extensions</a> werden auch unterst&uuml;tzt.<br>
</li> </li>
<li>Für GPIO der als input konfiguriert ist <li>F&uuml;r GPIO der als input konfiguriert ist
<ul><code> <ul><code>
readval readval
</code></ul> </code></ul>
@ -755,7 +763,7 @@ sub inthandling($$) {
<ul> <ul>
<code>get &lt;name&gt;</code> <code>get &lt;name&gt;</code>
<br><br> <br><br>
Gibt "high" oder "low" entsprechend dem aktuellen Pinstatus zurück und schreibt den Wert auch in das reading <b>Pinlevel</b> Gibt "high" oder "low" entsprechend dem aktuellen Pinstatus zur&uuml;ck und schreibt den Wert auch in das reading <b>Pinlevel</b>
</ul><br> </ul><br>
<a name="RPI_GPIOAttr"></a> <a name="RPI_GPIOAttr"></a>
@ -763,34 +771,34 @@ sub inthandling($$) {
<ul> <ul>
<li>direction<br> <li>direction<br>
Setzt den GPIO auf Ein- oder Ausgang.<br> Setzt den GPIO auf Ein- oder Ausgang.<br>
Standard: input, gültige Werte: input, output<br><br> Standard: input, g&uuml;ltige Werte: input, output<br><br>
</li> </li>
<li>interrupt<br> <li>interrupt<br>
<b>kann nur gewählt werden, wenn der GPIO als Eingang konfiguriert ist</b><br> <b>kann nur gew&auml;hlt werden, wenn der GPIO als Eingang konfiguriert ist</b><br>
Aktiviert Flankenerkennung für den GPIO<br> Aktiviert Flankenerkennung f&uuml;r den GPIO<br>
bei jedem interrupt Erwignis werden die readings Pinlevel und state aktualisiert<br> bei jedem interrupt Ereignis werden die readings Pinlevel und state aktualisiert<br>
Standard: none, gültige Werte: none, falling, rising, both<br><br> Standard: none, g&uuml;ltige Werte: none, falling, rising, both<br><br>
</li> </li>
<li>poll_interval<br> <li>poll_interval<br>
Fragt den Zustand des GPIO regelmäßig ensprechend des eingestellten Wertes in Minuten ab<br> Fragt den Zustand des GPIO regelm&auml;&szlig;ig ensprechend des eingestellten Wertes in Minuten ab<br>
Standard: -, gültige Werte: Dezimalzahl<br><br> Standard: -, g&uuml;ltige Werte: Dezimalzahl<br><br>
</li> </li>
<li>toggletostate<br> <li>toggletostate<br>
<b>Funktioniert nur bei auf falling oder rising gesetztem Attribut interrupt</b><br> <b>Funktioniert nur bei auf falling oder rising gesetztem Attribut interrupt</b><br>
Wenn auf "yes" gestellt wird bei jedem Triggerereignis das <b>state</b> reading invertiert<br> Wenn auf "yes" gestellt wird bei jedem Triggerereignis das <b>state</b> reading invertiert<br>
Standard: no, gültige Werte: yes, no<br><br> Standard: no, g&uuml;ltige Werte: yes, no<br><br>
</li> </li>
<li>pud_resistor<br> <li>pud_resistor<br>
Interner Pullup/down Widerstand<br> Interner Pullup/down Widerstand<br>
Standard: -, gültige Werte: off, up, down<br><br> Standard: -, g&uuml;ltige Werte: off, up, down<br><br>
</li> </li>
<li>debounce_in_ms<br> <li>debounce_in_ms<br>
Wartezeit in ms bis nach ausgelöstem Interrupt der entsprechende Pin abgefragt wird. Kann zum entprellen von mechanischen Schaltern verwendet werden<br> Wartezeit in ms bis nach ausgel&ouml;stem Interrupt der entsprechende Pin abgefragt wird. Kann zum entprellen von mechanischen Schaltern verwendet werden<br>
Standard: 0, gültige Werte: Dezimalzahl<br><br> Standard: 0, g&uuml;ltige Werte: Dezimalzahl<br><br>
</li> </li>
<li>restoreOnStartup<br> <li>restoreOnStartup<br>
Wiederherstellen der Portzustände nach Neustart<br> Wiederherstellen der Portzust&äuml;nde nach Neustart<br>
Standard: on, gültige Werte: on, off<br><br> Standard: on, g&uuml;ltige Werte: on, off<br><br>
</li> </li>
</ul> </ul>
<br> <br>