Alle Fragen und Anregungen zum gpio Plugin bitte in diesen Thread.
Ankündigung
Einklappen
Keine Ankündigung bisher.
Support Thread für das GPIO Plugin
Einklappen
X
-
Hi Onkelandy,
wir haben gerade bemerkt dass es wohl Probleme gibt, wenn das GPIO Plugin verwendet wird und zusätzlich noch ein weiteres Plugin welches die Lib RPI.GPIO benutzt.
Vom Verhaltensieht es dananch aus wie:
a) gpio plugin läuft und reserviert den Zugriff auf die GPIOs
b) das nächste Plugin welches auch die GPIO Lib nutzt bekommt keinen Zugriff auf die GPIOs mehr.
wurde so etwas schon mal beobachtet?
Grüße
Frank
-
Hi!
Ich denke nicht, dass wir das Problem lösen können. Du meinst schon, dass der Zugriff auf die gleichen Pins nicht funzt, oder? Weil auf andere müsste man auf jeden Fall zugreifen können.
Was man theoretisch machen könnte.. im Plugin optional ein GPIO-cleanup() einfügen und mal schauen, was dann los ist. Aber sobald der Status wieder abgefragt wird, wird dann wohl auch der Zugriff auf jenen Pin blockiert.
Eventuell macht eine andere Library das anders? Dann müssten wir umstellen.
Kommentar
-
Hallo,
ich habe mir ein kleines Testsystem aufgebaut, auf dem außer dem GPIO plugin und dem rcs1000 Plugin nichts genutzt wird
plugin.yaml
Code:%YAML 1.1 --- database: plugin_name: database driver: sqlite3 connect: - database:./var/db/smarthomeng.db - check_same_thread:0 GPIO: plugin_name: gpio plugin_enabled: true rcs1000: plugin_name: rcs1000n rcs1000n_gpio: '17' rcs1000n_sendDuration: '0.1'
Code:Schaltsteckdose1: schalten: type: bool rcs_SystemCode: 11010 rcs_ButtonCode: 'D' Relais1: name: Relais1 schalten: type: bool gpio_out: 29 Relais2: name: Relais2 schalten: type: bool gpio_out: 31
Code:ERROR plugins.rcs1000n Error: during instantiation of object or during send to device: local variable 'rfdevice' referenced before assignment
Deaktiviert man im plugin.yaml das GPIO plugin, funktioniert das RC1000 fehlerfrei, d.h. kein Eintrag im Log und die Dose schaltet wie gewünscht.
Ich habe mal ins rcs1000 Plugin geschaut. Dort gibt es im file cRcSocketSwitch.py den Befehl:
Code:try: rfdevice = RFDevice(self.gpio) ... finally: rfdevice.cleanup()
Vielen Dank für allen Support im Voraus :-)
Daniel
Kommentar
-
Zitat von Onkelandy Beitrag anzeigenJa, das wäre interessant. Prinzipiell kann man's ja testen, indem man bei aktivem Plugin einfach noch eine python Konsole aufmacht und dort das Modul importiert und einen Pin, der nicht belegt ist, abcheckt. Das hätte bei mir soweit ohne Probleme geklappt.
meinst Du eine Standard Python console die erstmal nichts mit shng zu tun hat?
Kommentar
-
Kann es sein, dass das rcs1000 Plugin, das im Einsatz ist, sehr alt ist..? Es hat nun ein n hinten dran und der Code ist ziemlich anders. Ob die neue Version das Problem behebt, sei dahin gestellt, aber aktualisiere doch bitte mal, dafra
Hasenradball ja genau
Kommentar
-
Onkelandy
Das rcs1000n gibt es erst seit v1.9.4, es gab zuvor kein derartig bezeichnetes plugin.
Daher ist es das aktuelle
😊
Ich habe mal folgendes getestet.
Man nehme zwei Scripte
gpio_test1.py
gpio_test2.py
Man lässt das erste laufen welches den GPIO X schaltet. Und macht kein Cleanup beim verlassen.
Danach ruft man das zweite Script auf.
Das zweite Script wirft nur eine warning wenn man den gleichen GPIO X schalten will, schaltet aber dennoch.
Wenn man aber einen anderen GPIO Y schaltet kommt keine warning.
Was ich noch nicht testen konnte wäre, wenn script1 noch activ ist und script2 activ wird.
Kommentar
-
Hab die Details im oberen Beitrag übersehenDer Code im cRcSocketSwitch.py macht so jedenfalls keinen Sinn. Das Cleanup darf nur passieren, wenn RFDevice(self.gpio) erfolgreich war. Das müsstest bitte fixen.
Das mit den Testscripts.. hast du parallel auch das Plugin am Laufen, ja? Also auf gut Deutsch, da kommt sich nix in die Quere, oder?
Kommentar
-
Zitat von Onkelandy Beitrag anzeigenaber aktualisiere doch bitte mal, dafra
Ich nutze bereits die aktuellste, releaste Version aller Plungins.
Kommentar
-
Zitat von Onkelandy Beitrag anzeigenHab die Details im oberen Beitrag übersehenDer Code im cRcSocketSwitch.py macht so jedenfalls keinen Sinn. Das Cleanup darf nur passieren, wenn RFDevice(self.gpio) erfolgreich war. Das müsstest bitte fixen.
Das mit den Testscripts.. hast du parallel auch das Plugin am Laufen, ja? Also auf gut Deutsch, da kommt sich nix in die Quere, oder?
ich gebe Dir recht in dercRcSocketSwitch.pyCode:try: ... finally:
Das gehe ich an...
Jedoch kommt der Fehler:
2023-04-08 19:12:58 ERROR plugins.rcs1000n Error: during instantiation of object or during send to device: local variable 'rfdevice' referenced before assignmentrcs1000n.__init.py__ => update_ItemCode:# sending commands and avoid parallel access by threading.Lock() with self._lock: try: # create Brennenstuhl RCS1000N object obj = cRcSocketSwitch.RCS1000N(self._gpio) # prepare and send values obj.send(*values) except Exception as err: self.logger.error('Error: during instantiation of object or during send to device: {}'.format(err)) else: self.logger.info('Info: setting Device {} with SystemCode {} to {}'.format(ButtonCode, SystemCode, value)) finally: # give the transmitter time to complete sending of the command (but not more than 10s) time.sleep(min(self._send_duration, 10))
Die Instantiierung des Objectes schlägt fehl:
Code:# create Brennenstuhl RCS1000N object obj = cRcSocketSwitch.RCS1000N(self._gpio) # prepare and send values obj.send(*values) except Exception as err: self.logger.error('Error: during instantiation of object or during send to device: {}'.format(err))
a) wenn das GPIO Plugin aktiv ist wird, ist eine weitere Insrtanz der RPI.GPIO lib nicht möglich und es kommt obiger Fehler.
b) ist das GPIO Plugin nicht aktiv, dann lässt sich hiermit eine Instanz der RPI.GPIO erzeugen und der Code funktioniert:
Code:try: # create Brennenstuhl RCS1000N object obj = cRcSocketSwitch.RCS1000N(self._gpio) # prepare and send values obj.send(*values)
Bzw. braucht das GPIO Plugiin die ganze zeit die Instanz der RPI.GPIO?
Die rcs1000n erszeugt die Instanz nur kurz und gibt sie wieder frei, das müsste doch beim GPIO Plugin genauso gehen.
Immer nur wenn geschaltet werden soll => Instanz erzeugen => schalten => Instanz freigeben (jedoch ohne cleanup, sonst gehen die GPIOs wieder in Ursprungszustand).
Das rcs1000n braucht den Zugriff nur für wenige ms.
PS: Ich werde den Code überarbeiten, aber das wird das Problem erstmal nicht beheben, hab da gerade keine Idee.
Kommentar
-
Wenn ich die Stellen wie folgt fixe:
cRcSocketSwitch.py
Code:try: rfdevice = RFDevice(self.gpio) except Exception as err: logging.error('Error: during instantiation of object: {}'.format(err)) else: rfdevice.enable_tx() rfdevice.tx_repeat = 10 values = self.prepareCodes(systemCode, btn_code, status) send_code = self.calc_DecimalCode_python_style(*values) self.config['code'] = send_code rfdevice.tx_code(**self.config) rfdevice.cleanup() finally: pass
und in
rcs1000n.__init.py__ => update_Item
Code:with self._lock: try: # create Brennenstuhl RCS1000N object obj = cRcSocketSwitch.RCS1000N(self._gpio) except Exception as err: self.logger.error('Error: during instantiation of object: {}'.format(err)) else: # prepare and send values obj.send(*values) self.logger.info('Info: setting Device {} with SystemCode {} to {}'.format(ButtonCode, SystemCode, value)) finally: # give the transmitter time to complete sending of the command (but not more than 10s) time.sleep(min(self._send_duration, 10))
2023-04-08 19:55:15 ERROR root Error: during instantiation of object: A different mode has already been set!
Kommentar
-
Onkelandy, dafra,
Problem gelöst bzw. verstanden was der Grund ist!
Wenn das gpio Plugin und rcs1000n Plugin verschiedene Modi nutzen funktioniert das nicht....
Also wenn beide Plugins zum Beispiel den modeCode:BCM
Dann tut es.
dafra
kannst Du das GPIO Plugin mal aufBCM
Beim rcs1000n ist derzeit nicht vorgesehen den mode zu ändern.
Kommentar
-
Kommentar