FHEM Forum

FHEM - Hardware => Einplatinencomputer => Thema gestartet von: Frank_Huber am 19 November 2015, 17:51:08

Titel: TOGGLE Funktion über GPIO
Beitrag von: Frank_Huber am 19 November 2015, 17:51:08
Nabend,

versuche mich gerade an IO Steuerungen mit dem RPI.
Schalten und Zeitsteuerung (Treppenhauslicht) funktionieren gut, nur mit dem Toggle hänge ich fest.

Taster hängt am GPIO10 direkt am PI. device: GPIO_IN_10
Der Ausgang hängt an einem MCP_23017 device: OUT_1 PortA2

hier mein aktueller Schnippsel:
define TASTER_10_TOGGLE notify GPIO_IN_10:on.* {\ if (Value("OUT_1 PortA2") eq "off") {fhem ("set OUT_1 PortA2  on")};;\if (Value("OUT_1 PortA2") ne "off") {fhem ("set OUT_1 PortA2 off");;\};;\
attr TASTER_10_TOGGLE room EG

Der Taster reagiert gar nicht. :-(
ich versuche schon paar Stunden mit Google und Foren das ganze hinzubekommen, es geht einfach nicht.

vielleicht sieht ja einer der Profis den Fehler. Den Code habe ich übrigens über Google gefunden und an meine IOs angepasst.

Bin für jede Hilfe dankbar. :-)

Grüße
Frank
Titel: Antw:TOGGLE Funktion über GPIO
Beitrag von: Frank_Huber am 20 November 2015, 07:40:20
nach weiteren Stunden habe ich jetzt de MCP_23017 GPIOs mit ReadingsProxy vereinzelt und das hier in der cfg:

define relaisschalten notify GPIO_IN_10 {\ if (Value("OUT1_A3") eq "off") {fhem ("set OUT1_A3 on")};;\ if (Value("OUT1_A3") ne "off") {fhem ("set OUT1_A3 off")};;\ ;;\}

Es will aber immernoch nicht. im Log bekomme ich:
relaisschalten return value: syntax error at (eval 742) line 1, near "\ if"
syntax error at (eval 742) line 1, near "\ if"
Titel: Antw:TOGGLE Funktion über GPIO
Beitrag von: gero am 20 November 2015, 07:46:44
Nimm einfach mal die Backslashes (\) weg, falls der Code wirklich in einer Zeile steht.
Ein Backslash am Ende(!) einer Zeile bedeutet, dass der String in der nächsten Zeile weitergeht. In diesem Fall darf aber nach dem Backslash kein weiteres Zeichen stehen.

Gruß,
Gero
Titel: Antw:TOGGLE Funktion über GPIO
Beitrag von: Frank_Huber am 20 November 2015, 08:06:01
Danke Gero, jetzt kenne ich auch die Bedeutung der "\", das mit der neuen Zeile wusste ich nicht.

mit: define relaisschalten notify GPIO_IN_10:on.* {if (Value("OUT1_A3") eq "on") {fhem ("set OUT_1 PortA3 off")};; if (Value("OUT1_A3") eq "off") {fhem ("set OUT_1 PortA3 on")};;;;}

schaltet jetzt der Ausgang, er macht aber immer beide befehle. also kurz aus und wieder an.
Das ist bestimmt auch nur ein falsches Zeichen. Aber ich finde es nicht.

Grüße
Frank
Titel: Antw:TOGGLE Funktion über GPIO
Beitrag von: gero am 20 November 2015, 08:49:25
Probier es mal damit:

define relaisschalten notify GPIO_IN_10:on.* {if (Value("OUT1_A3") eq "on") {fhem ("set OUT_1 PortA3 off")}else {fhem ("set OUT_1 PortA3 on")};;;;}


Gruß,
Gero
Titel: Antw:TOGGLE Funktion über GPIO
Beitrag von: Frank_Huber am 20 November 2015, 09:01:34
Gero, Du bist mein Held. ;-)
es funktioniert!
vielen Dank dafür.

muss wohl noch viel lernen...

Grüße
Frank
Titel: Antw:TOGGLE Funktion über GPIO
Beitrag von: gero am 20 November 2015, 09:28:56
Zitat von: Frank_Huber am 20 November 2015, 09:01:34
muss wohl noch viel lernen...

Das kommt mit der Zeit. Nur nicht entmutigen lassen.

BTW: Kann es sein, dass du die fhem.cfg direkt editierst? Du kannst viele Fehler vermeiden, wenn du ausschließlich über die Weboberfläche arbeitest.
Ich habe mich anfangs auch dagegen gesträubt, aber es ist wirklich der bessere Weg.


Gruß,
Gero
Titel: Antw:TOGGLE Funktion über GPIO
Beitrag von: Frank_Huber am 20 November 2015, 09:39:50
Ja, ich editiere viel in der cfg. erscheint mir einfacher. gerade wenn ich Code-Schnipsel vom Forum kopiere.
Das macht Probleme? inwiefern denn?

Werde natürlich jetzt wo ich auch das weis mich versuchen nur noch an der web zu halten. ;)

Grüße
Frank
Titel: Antw:TOGGLE Funktion über GPIO
Beitrag von: gero am 20 November 2015, 09:54:40
Zitat von: Frank_Huber am 20 November 2015, 09:39:50
Das macht Probleme? inwiefern denn?
Im Forum gibt es unzählige Beispiele, was alles schiefgehen kann, wenn man die fhem.cfg direkt editiert.
Das Webinterface bietet einen komfortablen Editor, in dem z.B. Zeilenumbrüche auch korrekt behandelt werden. D.h. du kannst deinen Code über mehrere Zeilen vernünftig formatieren ohne mit Backslashes arbeiten zu müssen. Ebenso ist die Doppelung einiger Zeichen (z.B. des Semikolons) in fast allen Fällen nicht nötig, sondern wird vom Editor korrekt in die fhem.cfg umgesetzt. Zusätzlich bekommst du bei einem Fehler direkt eine Fehlermeldung angezeigt und mußt nicht im Logfile nachsehen.

Dass viele Code-Schnipsel im Forum aus der cfg Datei kopiert sind, ist leider unschön und wird hoffentlich in Zukunft immer mehr vermieden.

Gruß,
Gero
Titel: Antw:TOGGLE Funktion über GPIO
Beitrag von: klausw am 20 November 2015, 10:30:00
Zitat von: Frank_Huber am 20 November 2015, 09:39:50
Ja, ich editiere viel in der cfg. erscheint mir einfacher. gerade wenn ich Code-Schnipsel vom Forum kopiere.
Das macht Probleme? inwiefern denn?
Bei Eingabe über die Weboberfläche bekommst du eine direkte Rückmeldung, wenn was falsch ist.
Das kann recht hilfreich sein  8)

Das Hauptproblem ist die Reihenfolge in der fhem.cfg.
Beim Starten von FHEM wird die fhem.cfg von oben nach unten durchgearbeitet.

Wenn du jetzt beispielsweise als erstes den MCP23017 definiert hast und nachfolgend das RPII2C Modul dann wird der MCP23017 nicht funktionieren, da er ein IODEV hat.
Und du suchst den Fehler, den du jetzt auch in der Weboberfläche nicht findest. Die defines sind ja grundsätzlich richtig.
Sowas passiert über die Weboberfläche halt nicht.
Titel: Antw:TOGGLE Funktion über GPIO
Beitrag von: Wernieman am 20 November 2015, 10:35:22
Das ist auch (indirekt) der einzigste Grund, warum man eventuell die fhem.cfg noch direkt bearbeitet.

Bei mir z.B. ist schon mehrfach der "sispmctrl" Eintrag verloren gegangen. Der muß aber VOR den sispm-Einträge stehen .. was man eben nur direkt hinbekommt. Ansonsten ... im Zweifelsfalle über die Weboberfläche!
Titel: Antw:TOGGLE Funktion über GPIO
Beitrag von: Frank_Huber am 20 November 2015, 10:37:21
Danke euch für die Aufklärung!
Eure Erklärungen machen Sinn! werde mich daran halten.

Grüße
Frank
Titel: Antw:TOGGLE Funktion über GPIO
Beitrag von: Frank_Huber am 20 November 2015, 14:32:04
solangsam steig ich durch.
Hab das Toggle mit Zeit und Dauerschaltung jetzt über einen Dummy-Schalter auf einen GPIO umgeleitet.

define VIRT_SWITCH_1 dummy

define n_VIRT_SWITCH_1 notify VIRT_SWITCH_1:on {if(OldValue('VIRT_SWITCH_1') eq 'off'){fhem("set VIRT_SWITCH_1 on");;fhem("define a_tmp_VIRT_SWITCH_1 at +00:00:05 set VIRT_SWITCH_1  off");;}elsif(OldValue('VIRT_SWITCH_1') eq 'on'){fhem("set VIRT_SWITCH_1 off");;}}

define n_GPIO_IN_10 notify GPIO_IN_10:on {Log 1,$EVENT;;;;{if (Value("VIRT_SWITCH_1") eq "on") {fhem ("set VIRT_SWITCH_1 off")}else {fhem ("set VIRT_SWITCH_1 on")}};;;;}

define n_VIRT_SWITCH_1_longpress notify GPIO_IN_10:Longpress:.*on {Log 1,$EVENT;;fhem("delete a_tmp_VIRT_SWITCH_1");;}

define N_VIRT1_GPIO notify VIRT_SWITCH_1 set OUT_1 PortA1 $EVENT\


Ich bin begeistert von den Möglichkeiten. ;-) werde wohl noch viel Spass mit FHEM haben.
Ist bestimmt nicht der beste code, aber er funktioniert.

btw: obiges im Browser erstellt, lediglich über cfg rauskopiert. :)

Grüße
Frank