Hauptmenü

IF ELSE Abfrage mit GPIO

Begonnen von kurtklaiber, 19 August 2015, 11:17:23

Vorheriges Thema - Nächstes Thema

kurtklaiber

Hallo Freunde,

ich bräuchte mal wieder Hilfe.
Ich möchte gerne in der Datei 99_myUtils.pm den Status eines GPIO Ports abfragen.
Leider habe ich mit der Symtax meine liebe Mühe. Meine Abfrage schaut im Moment wie folgt aus:

if {([GPIO_4] eq "open")} {
    ($f1 =0);
    }
    else {
    ($f1=1);
    }

Ich habe schon unzählige Varianten ausprobiert, bekomme aber immer die folgende Fehlermeldung:

Syntax error at ./FHEM/99_myUtils.pm line 35, near "if {" syntax error at ./FHEM/99_myUtils.pm line 38, near "else" syntax error at ./FHEM/99_myUtils.pm line 56, near "}"

Hat jemand eine Idee was ich falsch mache.

Grüße

Kurt

Ellert


kurtklaiber

JA,
ich habe es wie folgt definiert:

Define GPIO_4 RPI_GPIO 4

Ellert

Wenn Du in Perl auf die Readings eines Device zugreifen möchtest, dann geht das mit ReadingsVal oder Value. Wegen der genauen Syntax möchte ich Dich bitten in der Commandref unter Perl Specials nach zu sehen.

Der gemeldete Fehler liegt in der Nähe von if {, da möchte ich Dich bitten Dir die Syntax von if-Anweisungen in einem Perl Tutorial an zu schauen.

http://fhem.de/commandref_DE.html#perl
http://perl-6.de/tutorials/anfaenger/if-anweisung


kurtklaiber

Ich habe das Problem inzwischen gelöst. Das schwierige ist nicht die IF Abfrage, sondern den Status des GPIO Eingangs zu lesen.

Die Abfrage von GPIO Eingänge ist etwas komplex. Die Daten der GPIO Eingänge werden alle in "Hashes" abgespeichert und können von dort abgerufen warden.
Ein Hash ist ein Array, welches mit Strings indiziert wird.

Der Aufruf erfolgt dann wie folgt:

$a=($defs{GPIO_4}{READINGS}{Pinlevel}{VAL});

Damit wird der Wert des Pinlevels (high oder low) des GPIO_4 an die Variable $a übergeben.
Damit kann dann ganz einfach die folgende Abfrage gemacht werden:

if ($a eq "high") {         
    ($f1 =1);     }
   else {
    ($f1=0);
   }

Leider gibt es dazu keinerlei vernünftige Literatur, weshalb ich das alles empirisch ermitteln musste. So komme täglich in ganz kleinen Schritten voran.

Ellert

Na ja, die Fehlermeldung im 1. Beitrag deutet schon auf ein Unverständnis zur Syntax des if.

Die eigentliche Frage hast Du explizit gar nicht gestellt, nämlich: Wie greife ich in Perl auf Readings eines Devices zu?

Da gibt es vernünftige Literatur, die Commandref und dort steht :

ZitatReadingsVal(<devicename>,<reading>,<defaultvalue>)
Gibt den Inhalt der "readings" zurück (den Inhalt der in dem "Readings"-Abschnitt von "list device" angezeigt wird)

In Deinem Fall ReadingsVal("GPIO_4","Pinlevel","DeinDefault")

Zu  Deiner Lösung über die Hashes steht was im Wiki: http://www.fhemwiki.de/wiki/DevelopmentModuleIntro#Readings

Alles beschrieben schon in vernünftiger Literatur beschrieben.