Raspberry Pi GPIO input: notify triggert von OFF auf OFF

Begonnen von bertl, 23 April 2018, 14:18:03

Vorheriges Thema - Nächstes Thema

bertl

Hallo,

bitte um Hilfe zu folgender Herausforderung:

Ich frage den Status meiner Alarmanlage in FEHM ab und werde über eine Änderung (aktiviert/deaktiviert) informiert.
Leider bekomme ich in nicht vorhersehbaren Abständen die Info, dass die Alarmanlage deaktiviert wurde, obwohl sie zwischenzeitlich nicht aktiviert wurde.
Der GPIO Pin ist entweder auf GND oder auf +3,3V geschaltet.
Welche Einstellungen bzw. Attribute muss ich setzen, dass ich das Notify von OFF auf OFF nicht bekomme?
Ein Workaround wäre, dass ich beim Notify von OFF einfach prüfe ob der alte Wert ungleich dem aktuellen Wert ist, aber eigentlich sollte ja von OFF auf OFF gar nicht auslösen!

Hardware-Aufbau:
Über einen Transistorausgang meiner Alarmanlage (Terxon-MX) steuere ich ein Relais an.
Das Relais habe ich wie folgt am Raspberry Pi angeschlossen: NO: +3,3V / COM: GPIO-12 / NC: GND

Meine Einstellungen in FEHM:
define Alarmanlage_Aktiviert RPI_GPIO 12
attr Alarmanlage_Aktiviert direction input
attr Alarmanlage_Aktiviert event-on-change-reading Longpress
attr Alarmanlage_Aktiviert interrupt both

define ntf_Alarmanlage_Aktiviert notify Alarmanlage_Aktiviert:Longpress:.* {\
if ($EVENT eq "Longpress: on") {\
  fhem("set Telegram message Die Alarmanalge wurde aktiviert / scharf geschaltet!");;\
  }\
elsif ($EVENT eq "Longpress: off") {\
  Log 1, "ntf_Alarmanlage_Aktiviert: ".OldValue("Alarmanlage_Aktiviert")."/".Value("Alarmanlage_Aktiviert");;\
  fhem("set Telegram message Die Alarmanalge wurde deaktiviert / ausgeschaltet!");;\
  }\
}


Log-File:
2018.04.23 12:03:48 1: ntf_Alarmanlage_Aktiviert: off/off

Danke für eure Unterstützung!

Beta-User

Hallo bertl,

willkommen im Forum.

Bist du sicher, dass du den Fehler beim richtigen notify suchst? Soweit erkennbar passt der log-Eintrag nicht zu "Aktiviert", sondern zu "Einbruch".

Was den Rest angeht: Könnte sein, dass der PIN noch entprellt werden müßte, aber da kenne ich mich nicht aus (habe vor langer Zeit beschlossen, die Finger von PI-GPIOs zu lassen und ggf. einen Arduino oä. dazwischen zu schalten).

Gruß, Beta-User
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

bertl

Hallo Beta-User,

danke für die Info, da hat sich ein Copy/Past-Fehler eingeschlichen - hab ihn schon korrigiert!
(Ich frage nämlich 4 verschiedene Alarm-Stati ab und bei jedem tritt der Fehler auf).

Bezüglich entprellen:
Der OFF auf OFF Trigger tritt auch auf, obwohl stunden nichts geschaltet wurde, folglich glaube ich, dass es nichts mit dem Prellen beim Schalten zu tun haben sollte.

Gruß bertl

Beta-User

Kommen diese Events alle zusammen (mehrere GPIO's) und hast du den PI zwischenzeitlich neu gestartet?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Beta-User

Argh, das könnte noch was anderes sein:

Der Ablauf ist normalerweise so, dass STATE des triggernden Devices erst nach Abarbeitung des notify geändert wird. Darauf greifst du aber mit Value() innerhalb der notify-Routine zu. Vermutlich wäre es besser, hier mit $EVTPART1 zu arbeiten.

Gruß, Beta-User
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

bertl

Nein, die Events kommen undefiniert - ich kann keinerlei Logik oder Abhängigkeit darin erkennen.

Dein PI habe ich zwischeinzeitlich öfter neu gestartet, da ich schon mehrere Tage mit dem Phänomen kämpfe!

Den Log und somit die Abfrage mit Value() habe ich erst heute eingefügt, das Problem besteht aber schon länger!

Otto123

Hi,

mach doch das notify erstmal "unsensibler"
define ntf_Alarmanlage_Aktiviert notify Alarmanlage_Aktiviert:Longpress:.(on|off) {}
Dann logge den Event außerhalb vom if
Log 1, $EVENT;
Frag nur den teil ab der interessiert, also $EVTPART1 eq "on"

Und in jedem Fall würde ich mit diesen Attributen arbeiten!!!
Zitatpud_resistor
Interner Pullup/down Widerstand
Funktioniert aussließlich mit installiertem gpio Tool der WiringPi Bibliothek.
Standard: -, gültige Werte: off, up, down

debounce_in_ms
Wartezeit in ms bis nach ausgelöstem Interrupt der entsprechende Pin abgefragt wird. Kann zum entprellen von mechanischen Schaltern verwendet werden
Standard: 0, gültige Werte: Dezimalzahl

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

bertl

Hallo Otto123,

danke für deine Infos, habe ich gleich umgesetzt!

Den pud_resistor habe ich insofern realisiert, dass der NC (normally closed - Schalter Grundstellung) auf GND hängt.
Sollte ja eigentlich das gleiche machen oder?

Wie hoch sollte ich debounce_in_ms setzten? - habe es mal auf 200 eingestellt um auf der sicheren Seite zu sein.

Gruß bertl

Otto123

Zitat von: bertl am 23 April 2018, 15:53:39
Den pud_resistor habe ich insofern realisiert, dass der NC (normally closed - Schalter Grundstellung) auf GND hängt.
Sollte ja eigentlich das gleiche machen oder?
Moin,

das verstehe ich nicht ganz.  ???

Die GPIO Eingänge sind extrem Hochohmig, in dem Zustand, dass dort ein Kontakt offen ist, das heisst keiner einen Pegel an den Eingang legt, dient der Pull up bzw. Pull down Widerstand dazu einen definierten Pegel zu schaffen.
https://www.elektronik-kompendium.de/public/schaerer/pullr.htm

Ein Schalter der in Ruhe geschlossen ist, ist bei Betätigung offen und dann empfängt der GPIO Eingang auch die elektrischen Signale kopulierender Motschekiebchen in einigen Metern Abstand  ;D

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

bertl

Hallo Otto,

kurze Erklärung meiner Schaltung:
Ich habe ein Relaismodul (siehe Anhang) im Einsatz, welches zwischen NO und NC schaltet.
Die Eingänge vom Relaismodul hängen an der Alarmanlage.
Die Ausgänge vom Relaismodul hängen wie folgt am Raspi:
1) NC1 bis NC4 hängen alle an GND
2) NO1 bis NO4 hängen alle an +3,3V
3) COM1 bis COM4 hängen an den GPIO-Eingängen 12, 16, 20 und 21
Somit schaltet die Alarmanlage die GPIO-Pins zwischen GND und +3,3V und ein undefinierter Zustand besteht maximal während des Schaltvorganges.

Übrigens:
Seit ich deine Einstellungen gemacht habe, sind keine undefinierten Events/Trigger mehr gekommen.
Ich verstehe zwar nicht warum, aber es funktioniert!

Danke für deine Hilfe

Otto123

Naja es ist so wie Du sagst: ein undefinierter Zustand besteht maximal während des Schaltvorganges.

Ich finde die Art der Anbindung ja völlig "überdimensioniert" - eigentlich eher für quer.  :D

Eigentlich hätten die Optokoppler der Relaiseingänge an sich gereicht. sowas hier, hab nix besseres gefunden auf die Schnelle.

Damit hättest Du das prellen der Relais Kontakte nicht und eine Menge Platz gespart.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

bertl

Hallo Otto!

Danke für den Link, habe ich mir gleich bestellt - kannte ich vorher nicht!

Nun zum eigentlichen Thema dieses Beitrags:

Die Einstellungen von Otto123 haben zur Lösung des Problems geführt.
Seit ich diese umgesetzt habe, sind keine unnötigen notifys mehr gekommen.

Die Lösung war meiner Meinung nach das notify mit ".(on|off)" anstelle ".*" etwas unsensibler zu machen!

define ntf_Alarmanlage_Aktiviert notify Alarmanlage_Aktiviert:Longpress:.(on|off) {}

Danke an Otto123!