Outputs werden sofort nach set wieder gelöscht.

STHU
Posts: 14
Joined: 20 Feb 2019, 09:33

Outputs werden sofort nach set wieder gelöscht.

Post by STHU »

Einen wunderschönen Tag wünsch ich Euch/Uns/Allen ....

Ich darf wiedermal ein Projekt eines Kollegen übernehmen und zupf mir gerade an meinen letzten Haaren herum....

Gegeben ist ein System aus Connect 4 - MIO - AIO - RO. Software ist Node-Red (3.1.9).
Grundsätzlich funktioniert alles recht fein, die Software ist stabil, alle LEDs sind grün.

Abär: Wenn ich Ausgänge setzen möchte, dann werden diese sofort wieder zurückgesetzt.
Sprich: setze ich "PIN: RelayOutput_4" auf 1, dann klickt das Relais kurz, die LED blitz kurz auf, dann, nach geschätzen 100ms, kommt ein zweiter Klick und die LED get wieder aus (und das Relais ist nat. auch aus).
Beim Abschalten des Relais passiert nichts.
Das passiert bei allen vier Relais - aber auch bei der RevPiLED direkt am Connect 4 (halt ohne *klick*).

Node-Red ist davon höchst unbeeindruckt und zeigt am Dashboard bzw der Debug-Node die Zustände an, wie sie sein sollten.
Es laufen auch sonst keine Nodes, Flows usw. (hoff ich), nur der eine Beispiel-Flow aus den Tutorial zum Setzen der I/O Pins (oder so).

Any hints?


Mit Gruß & Dank
Stefan
STHU
Posts: 14
Joined: 20 Feb 2019, 09:33

Re: Outputs werden sofort nach set wieder gelöscht.

Post by STHU »

Nachtrag: Hat offenbar nichts mit Node-Red zu tun.
Bei der Verwendung von piTest zeigt sich das selbe Verhalten ......

Grübl
Stefan
User avatar
nicolaiB
KUNBUS
Posts: 1093
Joined: 21 Jun 2018, 10:33
Location: Berlin
Contact:

Re: Outputs werden sofort nach set wieder gelöscht.

Post by nicolaiB »

Läuft ggf. noch ein weiterer Prozess der auf das Prozessimage zugreift? Du kannst das mit dem Kommando `sudo lsof /dev/piControl0` prüfen.
Nicolai
STHU
Posts: 14
Joined: 20 Feb 2019, 09:33

Re: Outputs werden sofort nach set wieder gelöscht.

Post by STHU »

Hallo Nicolai!

Danke für die Rückmeldung.

Der Output sieht so aus:
noderedre 2623 root 4u CHR 240,0 0t74 180 /dev/piControl0
noderedre 2623 root 5u CHR 240,0 0t237 180 /dev/piControl0
noderedre 2623 root 9r CHR 240,0 0t0 180 /dev/piControl0
revpipylo 2658 root 5u CHR 240,0 0t237 180 /dev/piControl0
revpipylo 2658 root 6r CHR 240,0 0t0 180 /dev/piControl0
python3 2661 root 3u CHR 240,0 0t237 180 /dev/piControl0
python3 2661 root 4u CHR 240,0 0t221 180 /dev/piControl0
Ist da was "Böses" dabei?
python brauche ich eigentlich nicht ......


Gruß
Stefan
User avatar
nicolaiB
KUNBUS
Posts: 1093
Joined: 21 Jun 2018, 10:33
Location: Berlin
Contact:

Re: Outputs werden sofort nach set wieder gelöscht.

Post by nicolaiB »

Da laufen verschiedene Prozesse die auf das Prozessabbild zugreifen. Wenn einer der Prozesse das Abbild exklusiv beansprucht, dann schreibt dieser die Ausgänge immer aus "seiner" Sicht neu. Sprich wenn sie in dieser Applikation nicht gesetzt sind, werden sie wieder zurückgestetzt, weil es ja nichts von der anderen Applikation "weiß". Du kannst mit ps herausfinden welche Programme das sind (anhand der PID, Nummer ist der 2. Spalte).
Nicolai
STHU
Posts: 14
Joined: 20 Feb 2019, 09:33

Re: Outputs werden sofort nach set wieder gelöscht.

Post by STHU »

Ahhhja ......
2623 ? Ssl 1:51 /usr/bin/python3 /usr/sbin/noderedrevpinodes-server
2658 ? Sl 0:01 /usr/bin/python3 /usr/share/revpipyload/revpipyloadd -d
2661 ? Ssl 0:21 /usr/bin/python3 /home/pi/Desktop/revpi_shutdown.py
Das dürfte der Shutdown-Zauberspruch sein, wenn die Maschine abgeschaltet wird bzw. das Netzteil das Power-Good Signal wegschaltet.
Eigentlich reicht dazu ein read-only Zugriff, aber ... nunja, eigentlich.

Da ich das Projekt übernommen habe und nicht mehr nachfragen kann ....
Wie wird man diesen Dienst wieder los bzw. wie löst man das Shutdown Problem vielleicht eleganter. Die Anlage hat nur einen großen Hautschalter ....


Dankschön
Stefan
STHU
Posts: 14
Joined: 20 Feb 2019, 09:33

Re: Outputs werden sofort nach set wieder gelöscht.

Post by STHU »

Nachsatz: Den Shut-Down Mechanismus müßte man doch recht elegant in node-red und einer Function-Node umsetzen können, oder?
User avatar
nicolaiB
KUNBUS
Posts: 1093
Joined: 21 Jun 2018, 10:33
Location: Berlin
Contact:

Re: Outputs werden sofort nach set wieder gelöscht.

Post by nicolaiB »

Wenn du mir das Script zeigst, kann ich dir sagen, wie man das ggf auf readonly umbauen kann. Natürlich kannst du das auch in NodeRed umsetzen
Nicolai
STHU
Posts: 14
Joined: 20 Feb 2019, 09:33

Re: Outputs werden sofort nach set wieder gelöscht.

Post by STHU »

Danke - schaumamal:

2661 ? Ssl 0:21 /usr/bin/python3 /home/pi/Desktop/revpi_shutdown.py
führt zu:
import revpimodio2
import time
import os

rpi = revpimodio2.RevPiModIO(autorefresh=True)

while True:
status = rpi.io.RevPiStatus.value
if(status & 64) == 0:
os.system("shutdown -h now")
break
time.sleep(2)

2658 ? Sl 0:01 /usr/bin/python3 /usr/share/revpipyload/revpipyloadd -d
geht zu:
#!/usr/bin/python3
# EASY-INSTALL-ENTRY-SCRIPT: 'revpipyload==0.11.0','console_scripts','revpipyloadd'
import re
import sys

# for compatibility with easy_install; see #2198
__requires__ = 'revpipyload==0.11.0'

try:
from importlib.metadata import distribution
except ImportError:
try:
from importlib_metadata import distribution
except ImportError:
from pkg_resources import load_entry_point


def importlib_load_entry_point(spec, group, name):
dist_name, _, _ = spec.partition('==')
matches = (
entry_point
for entry_point in distribution(dist_name).entry_points
if entry_point.group == group and entry_point.name == name
)
return next(matches).load()


globals().setdefault('load_entry_point', importlib_load_entry_point)


if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(load_entry_point('revpipyload==0.11.0', 'console_scripts', 'revpipyloadd')())





2623 ? Ssl 1:51 /usr/bin/python3 /usr/sbin/noderedrevpinodes-server
fuft auf:
#!/usr/bin/python3
# EASY-INSTALL-ENTRY-SCRIPT: 'noderedrevpinodes-server==1.2.0','console_scripts','noderedrevpinodes-server'
import re
import sys

# for compatibility with easy_install; see #2198
__requires__ = 'noderedrevpinodes-server==1.2.0'

try:
from importlib.metadata import distribution
except ImportError:
try:
from importlib_metadata import distribution
except ImportError:
from pkg_resources import load_entry_point


def importlib_load_entry_point(spec, group, name):
dist_name, _, _ = spec.partition('==')
matches = (
entry_point
for entry_point in distribution(dist_name).entry_points
if entry_point.group == group and entry_point.name == name
)
return next(matches).load()


globals().setdefault('load_entry_point', importlib_load_entry_point)


if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(load_entry_point('noderedrevpinodes-server==1.2.0', 'console_scripts', 'noderedrevpinodes-server')())
Ich hoffe, das hilft ....

Gruß
Stefan
User avatar
nicolaiB
KUNBUS
Posts: 1093
Joined: 21 Jun 2018, 10:33
Location: Berlin
Contact:

Re: Outputs werden sofort nach set wieder gelöscht.

Post by nicolaiB »

In dem Shutdown Script musst du diese Zeile

rpi = revpimodio2.RevPiModIO(autorefresh=True)

wie folgt abändern

rpi = revpimodio2.RevPiModIO(autorefresh=True, monitoring=True)

Besser wäre es aber auf den busy loop zu verzichten und mit Events in revpimodio zu arbeiten:

Code: Select all

import revpimodio2
import os

def handler(name, value):
    if(value & 64) == 0:
        os.system("shutdown -h now")

rpi = revpimodio2.RevPiModIO(autorefresh=True, monitoring=True)
rpi.handlesignalend()
rpi.io.RevPiStatus.reg_event(handler)
rpi.mainloop()

Nicolai
Post Reply