Rückmelder für den Raspberry Pi

Rückmelder für den Raspberry Pi

Postby felix3103 » 01.05.2017, 17:34

Guten Abend,

Ich habe auf meinem Raspberry Pi ein Srcp - Server laufen, der die Modellbahn steuert. Auserdem habe ich einen zweiten Raspberry als Rückmelder für meine Modellbahn. Dabei habe ich mich an die Funkrückmelder von Helge gehalten. Soweit funktioniert auch alles. Ich wollte nur fragen, ob mir jemand das Programm erklären kann. Nicht jedes kleine Detail. Aber zum Beispiel wird an den Rocrail server eine Nachricht geschickt. Doch sagt zum Beispiel der Part "size" aus?
Es wäre schöne, wenn sich jemand melden könnte, der sich mit diesem Programm auskennt. http://wiki.rocrail.net/doku.php?id=use ... n-feedback

Zusatzlich wollte ich fragen, ob jemand lust hat sich eine technische Dokumentation von mir durchzulesen um zu schauen, ob sie inhaltlich soweit korrekt ist. Natürlich ist es nur eine Frage.

Mit freundlichen Grüßen

Felix Ohlendorf
felix3103
 

Re: Rückmelder für den Raspberry Pi

Postby felix3103 » 11.05.2017, 18:28

Hallo nochmal,
Ich habe ein Problem. Bzw. immer noch das selbe Problem, weshalb ich überhaupt gefragt habe.

Ich habe die Rückmelder so wie es beschriben war (http://wiki.rocrail.net/doku.php?id=use ... n-feedback) installiert. Alles läuft soweit. Doch trotzdem bekomme ich in Rocrail kein Feedback. Was habe ich falsch gemacht?
Image
Image
Image
Code: Select all
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#written by Helge Karkoska
# Sends sensor feedbacks via wlan to rocail server

import RPi.GPIO as GPIO
import os
import sys
import socket
from time import sleep


#user specific data: ip address rocrail server and rocrail sensor ids
rr_server_ip = '192.168.1.101'

# feedback 1
#sensor_1_rr_id = 'B1-Bf1/1'
#sensor_2_rr_id = 'B1-Cha1/2'
#sensor_3_rr_id = 'B2-Cha2/1'
#sensor_4_rr_id = 'B2-Cha2/2'
#sensor_5_rr_id = 'B5-Loop2'
#sensor_6_rr_id = 'B4-Cha4/1'
#sensor_7_rr_id = 'B3-Cha3/2'
#sensor_8_rr_id = 'B3-Cha3/1'

# feedback 2
sensor_1_rr_id = 'FB11'
sensor_2_rr_id = 'FB12'
sensor_3_rr_id = 'FB13'
sensor_4_rr_id = 'FB14'
sensor_5_rr_id = 'FB15'
sensor_6_rr_id = 'FB16'
sensor_7_rr_id = 'FB17'
sensor_8_rr_id = 'FB18'


def restart_program():
        python = sys.executable
        os.execl(python, python, * sys.argv)
        print ' Restart program '


# add the XML-Header and send it to the server
def sendMsg(s,xmlMsg):
        msg = "<xmlh><xml size=\"%d\"/></xmlh>%s" % (len(xmlMsg), xmlMsg)
        print msg
        try :
                s.sendall(msg)
        except socket.error, msg:
                print 'Send failed. Restart program'
                restart_program()

# Main program

try :
        s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)    #create a tcp/ip $
except  socket.error, msg:
        print 'Failed to create socket. Restart program '
        restart_program()

try :
        s.connect((rr_server_ip,8051))                          #connect to rocral$
except  socket.error, msg:
        print 'Failed to connect. Restart program '
        restart_program()

GPIO.setmode(GPIO.BOARD)
GPIO.setup(7,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(11,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(12,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(13,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(15,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(16,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(18,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(22,GPIO.IN,pull_up_down=GPIO.PUD_UP)

sensor_1_old = True
sensor_2_old = True
sensor_3_old = True
sensor_4_old = True
sensor_5_old = True
sensor_6_old = True
sensor_7_old = True
sensor_8_old = True

sensor1 = 0
sensor2 = 0
sensor3 = 0
sensor4 = 0
sensor5 = 0
sensor6 = 0
sensor7 = 0
sensor8 = 0

filter = 15
limit = 0.8

while True:
        for i in range(filter):
            sensor_1 = GPIO.input(7)                                                    #sensor 1
            sensor_2 = GPIO.input(11)                                                   #sensor 2
            sensor_3 = GPIO.input(12)                                                   #sensor 4
            sensor_4 = GPIO.input(13)                                                   #sensor 4
            sensor_5 = GPIO.input(15)                                                   #sensor 4
            sensor_6 = GPIO.input(16)                                                   #sensor 5
            sensor_7 = GPIO.input(18)                                                   #sensor 7
            sensor_8 = GPIO.input(22)                                                    #sensor 8
            if sensor_1 == False :
                     sensor1 = sensor1 + 1
            if sensor_2 == False :
                     sensor2 = sensor2 + 1
            if sensor_3 == False :
                     sensor3 = sensor3 + 1
            if sensor_4 == False :
                     sensor4 = sensor4 + 1
            if sensor_5 == False :
                     sensor5 = sensor5 + 1
            if sensor_6 == False :
                     sensor6 = sensor6 + 1
            if sensor_7 == False :
                     sensor7 = sensor7 + 1
            if sensor_8 == False :
                     sensor8 = sensor8 + 1

        msensor1 = sensor1 / filter
        if msensor1 > limit :
                  sensor_1 = False
                  if sensor_1_old != sensor_1 :
                        xmlcmd = '<fb id="' + sensor_1_rr_id + '" state="true"/>'
                        sendMsg(s,xmlcmd)
                        print" sensor_1 activated"
        else :
                  sensor_1 = True
                  if sensor_1_old != sensor_1 :
                        xmlcmd = '<fb id="' + sensor_1_rr_id + '" state="false"/>'
                        sendMsg(s,xmlcmd)
                        print" sensor_1 deactivated"
        sensor_1_old = sensor_1
        sensor1 = 0

        msensor2 = sensor2 / filter
        if msensor2 > limit :
                  sensor_2 = False
                  if sensor_2_old != sensor_2 :
                        xmlcmd = '<fb id="' + sensor_2_rr_id + '" state="true"/>'
                        sendMsg(s,xmlcmd)
                        print" sensor_2 activated"
        else :
                  sensor_2 = True
                  if sensor_2_old != sensor_2 :
                        xmlcmd = '<fb id="' + sensor_2_rr_id + '" state="false"/>'
                        sendMsg(s,xmlcmd)
                        print" sensor_2 deactivated"
        sensor_2_old = sensor_2
        sensor2 = 0

        msensor3 = sensor3 / filter
        if msensor3 > limit :
                  sensor_3 = False
                  if sensor_3_old != sensor_3 :
                        xmlcmd = '<fb id="' + sensor_3_rr_id + '" state="true"/>'
                        sendMsg(s,xmlcmd)
                        print" sensor_3 activated"
        else :
                  sensor_3 = True
                  if sensor_3_old != sensor_3 :
                        xmlcmd = '<fb id="' + sensor_3_rr_id + '" state="false"/>'
                        sendMsg(s,xmlcmd)
                        print" sensor_3 deactivated"
        sensor_3_old = sensor_3
        sensor3 = 0

        msensor4 = sensor4 / filter
        if msensor4 > limit :
                  sensor_4 = False
                  if sensor_4_old != sensor_4 :
                        xmlcmd = '<fb id="' + sensor_4_rr_id + '" state="true"/>'
                        sendMsg(s,xmlcmd)
                        print" sensor_4 activated"
        else :
                  sensor_4 = True
                  if sensor_4_old != sensor_4 :
                        xmlcmd = '<fb id="' + sensor_4_rr_id + '" state="false"/>'
                        sendMsg(s,xmlcmd)
                        print" sensor_4 deactivated"
   sensor_4_old = sensor_4
        sensor4 = 0

        msensor5 = sensor5 / filter
        if msensor5 > limit :
                  sensor_5 = False
                  if sensor_5_old != sensor_5 :
                        xmlcmd = '<fb id="' + sensor_5_rr_id + '" state="true"/>'
                        sendMsg(s,xmlcmd)
                        print" sensor_5 activated"
        else :
                  sensor_5 = True
                  if sensor_5_old != sensor_5 :
                        xmlcmd = '<fb id="' + sensor_5_rr_id + '" state="false"/>'
                        sendMsg(s,xmlcmd)
                        print" sensor_5 deactivated"
        sensor_5_old = sensor_5
        sensor5 = 0

        msensor6 = sensor6 / filter
        if msensor6 > limit :
                  sensor_6 = False
                  if sensor_6_old != sensor_6 :
                        xmlcmd = '<fb id="' + sensor_6_rr_id + '" state="true"/>'
                        sendMsg(s,xmlcmd)
                        print" sensor_6 activated"
        else :
                  sensor_6 = True
                  if sensor_6_old != sensor_6 :
                        xmlcmd = '<fb id="' + sensor_6_rr_id + '" state="false"/>'
                        sendMsg(s,xmlcmd)
                        print" sensor_6 deactivated"
        sensor_6_old = sensor_6
        sensor6 = 0

        msensor7 = sensor7 / filter
        if msensor7 > limit :
                  sensor_7 = False
                  if sensor_7_old != sensor_7 :
                        xmlcmd = '<fb id="' + sensor_7_rr_id + '" state="true"/>'
                        sendMsg(s,xmlcmd)
                        print" sensor_7 activated"
        else :
                  sensor_7 = True
                  if sensor_7_old != sensor_7 :
                        xmlcmd = '<fb id="' + sensor_7_rr_id + '" state="false"/>'
                        sendMsg(s,xmlcmd)
                        print" sensor_7 deactivated"
        sensor_7_old = sensor_7
        sensor7 = 0

        msensor8 = sensor8 / filter
        if msensor8 > limit :
                  sensor_8 = False
                  if sensor_8_old != sensor_8 :
                        xmlcmd = '<fb id="' + sensor_8_rr_id + '" state="true"/>'
                        sendMsg(s,xmlcmd)
                        print" sensor_8 activated"
        else :
                  sensor_8 = True
                  if sensor_8_old != sensor_8 :
                        xmlcmd = '<fb id="' + sensor_8_rr_id + '" state="false"/>'
                        sendMsg(s,xmlcmd)
                        print" sensor_8 deactivated"
        sensor_8_old = sensor_8
        sensor8 = 0
s.close                                                                                         #close server connection




LG Felix
felix3103
 

Re: Rückmelder für den Raspberry Pi

Postby smitt48 » 11.05.2017, 18:33

Hi Felix,

Hast du dem RM-Monitor schon genutzt?

http://wiki.rocrail.net/doku.php?id=sensormon-de&s[]=monitor

mfg Tom
Kind regards,
Tom Smit
Kralendijk, Bonaire - Dutch Caribbean

Märklin M & K-rails with ECoS2 (4.2.4) - Win10
RoSoft: S88n & WDD switch & SDD signal decoders
Display: Tri-ang from 1950's, Märklin from early 1960's
In build phase
smitt48
 

Re: Rückmelder für den Raspberry Pi

Postby GeSchu » 11.05.2017, 18:45

Moin Felix,
das System, welches du dir da zusammenbaust, kenne ich nicht. Dennoch finde ich es sehr interessant.
Zu Deiner Frage:
Doch trotzdem bekomme ich in Rocrail kein Feedback. Was habe ich falsch gemacht?

Wahrscheionlich hast Du nichts falsch gemacht. Wie würde ich jetzt die Fehlersuche starten?
Zunächst den Hinweis, den Tom eben gegeben hat beachten. Vorher jedoch:
Erreichen, erkennen sich die beiden Rechner? Ich sehe es doch richtig: Du baust ein System , in dem auf einem Raspi die rückmelder, auf dem anderen der REocrail server läuft. Wen dem so ist: Hast du z.B. mittels ping erforscht, ob sich die Rechner unterhalten können. Undzwar
--a) mittels IP und
--b) mittels Namen?
Wenn du die Rückmelder manuell anklickst, werden die In Rocview aktiviert, sprich: Werden die rot?
Gruß
Gerd(Geschu)
Anlage 1 : H0 C-Gleis; Tams MC; Tams B-2; Tams S88-3; Tams WD-34/Esu SwitchPilot
Server : rocrail auf raspberry/Debian stretch Client : OS X high Sierra / UBUNTU 16.04 .
Werkstatt : H0 C-Gleis; rocrail Softwarezentrale dcc32; DELTA 6604
GeSchu
 

Re: Rückmelder für den Raspberry Pi

Postby felix3103 » 11.05.2017, 18:50

Hallo Tom,
Hallo Gerd,

Ich habe mit diesem Rückmeldemonitor noch nicht gearbeitet.

Desweiteren können die Computer miteinander kommunizieren. Das habe ich bereits herausgefunden. Doch ich weiß nicht, warum die xml Nachricht nicht ankommt.
Die Rückmleder werden nicht Ror, wen ich sie anklicke.

LG Felix
felix3103
 

Re: Rückmelder für den Raspberry Pi

Postby ups60 » 11.05.2017, 19:12

felix3103 wrote:Hallo Tom,

Die Rückmleder werden nicht Ror, wen ich sie anklicke.

LG Felix

Hallo Felix,

unter Automatik -> Rückmelder simulieren aktiviert?

lg Uwe
Für Hilfestellung nicht vergessen: http://wiki.rocrail.net/doku.php?id=issue-de
Märklin H0 K-Gleis, CS3 60226 (V1.3.2(1)), Windows 10, Ubuntu 16.04, GCA_PI01, GCA_PI02, GBM-Boost + GBM-16T
ups60
 

Re: Rückmelder für den Raspberry Pi

Postby felix3103 » 11.05.2017, 19:15

Hi Uwe,
Ja ist aktiviert...
LG Felix
felix3103
 

Re: Rückmelder für den Raspberry Pi

Postby Pirat-Kapitan » 11.05.2017, 19:55

Moin Felix,
1. welche IP hat Dein Rocrailserver? Die sollte mit den Angaben im Python-Programm
Code: Select all
rr_server_ip = '192.168.1.101'
übereinstimmen.
2. wie ist Dein Feedback-RasPi mit dem Rocrailserver verbunden. Andersrum gefragt, kannst Du beide Rechner im Netz sehen und hast Du geprüft, ob der feedback-Raspi eine verbindung zum Rocrailserver hat ? (Das habe ich jetzt in deinen Beiträgen so schnell nicht gefunden)
3. ist das Pythonprogramm gestartet (bzw. der Daemon dazu)? was sagen die Meldungen auf dem Feedback-Rechner im terminalfenster (Monitor am RasPi)? Wenn die Verbindung nicht gefunden wird, erscheint dort eine durchlaufende Meldung, ein erneuter Verbindungsversuch findet m.W. nicht statt.
4. hast Du die Reihenfolge der Inbetriebnahme beachtet? erst den Rocrailserver hochfahren und dann erst den Feedback-RasPi starten.

Das sind die Fehlerpunkte, die mir immer wieder mal passieren, wenn ich nicht genau genug aufpasse.
Das die Platine mit den Rückmeldereingängen sowie die Rückmelder selbst funktionieren, setze ich als überprüft voraus.

Schöne Grüße
johannes

PS: mit dem Rückmeldemonitor habe ich das noch nicht überprüft.
Clearasilfahrer auf Spur G&H0m, Lenz LZV (3.6), ORD-20, Manhart-Funki und WLM, RS-Bus Rückmelder (Reedkontakte/GBM),
Rocrail auf RasPi mit mobilen Geräten (andRoc). Details auf http://wiki.rocrail.net/doku.php?id=use ... at-kapitan.
Pirat-Kapitan
 

Re: Rückmelder für den Raspberry Pi

Postby Pirat-Kapitan » 11.05.2017, 20:01

GeSchu wrote:Moin Felix,
das System, welches du dir da zusammenbaust, kenne ich nicht. Dennoch finde ich es sehr interessant.
Zu Deiner Frage:
Wenn du die Rückmelder manuell anklickst, werden die In Rocview aktiviert, sprich: Werden die rot?
Gruß
Gerd(Geschu)

Moin Gerd,
die einfachste Testvariation, ob es funktioniert, ist den Rückmeldereingang auf der RasPi-Rückmelder-Platine mit GND zu verbinden (loses Kabelende reicht meistens).
Das System als solches funktioniert, ich nehme es zum Rocrailseminar nach Erfurt mit, weil ich sonst für den RS-Bus eine zusätzliche Spannung benötige. Helge hat es seinerzeit für seine Anlage entworfen (siehe Link).
Die Verbindungsaufnahme bzw. Wiederaufnahme ist sicherlich verbesserungswürdig, aber mit den in meinem vorigen Beitrag gezeigten Spielregeln klappt es einwandfrei.

Schöne Grüße
Johannes
Clearasilfahrer auf Spur G&H0m, Lenz LZV (3.6), ORD-20, Manhart-Funki und WLM, RS-Bus Rückmelder (Reedkontakte/GBM),
Rocrail auf RasPi mit mobilen Geräten (andRoc). Details auf http://wiki.rocrail.net/doku.php?id=use ... at-kapitan.
Pirat-Kapitan
 

Re: Rückmelder für den Raspberry Pi

Postby felix3103 » 11.05.2017, 20:22

Hi Johannes,

der Rocrail-server läuft auf meinen Laptop. IP=192.168.1.101
hier die Meldungen aus dem Terminal
Image
LG Felix
felix3103
 

Re: Rückmelder für den Raspberry Pi

Postby Pirat-Kapitan » 11.05.2017, 20:49

Moin Felix,
aus dem Terminalbild sehe ich, dass sich das Feedbackprogramm mit dem Rocrailserver verbunden hat (sonst würden da andere Meldungen erscheinen) und dass Du den Sensor FB11 ausgelöst hast.
Damit sollte auf seiten des Feedback-RasPis alles in Ordnung sein.

Hänge doch mal deinen Rocrailplan an, (mit unverändertem FB11), dann schaue ich mal mit meinem FB11 und meinem Rocrailserver mir das an.
Damit können wir dann die korrekten Rocrailservereinstellungen checken, was dann noch übrig bleibt, ist SRCP und da muss ich bekanntermaßen passen.

Schöne Grüße
Johannes
Clearasilfahrer auf Spur G&H0m, Lenz LZV (3.6), ORD-20, Manhart-Funki und WLM, RS-Bus Rückmelder (Reedkontakte/GBM),
Rocrail auf RasPi mit mobilen Geräten (andRoc). Details auf http://wiki.rocrail.net/doku.php?id=use ... at-kapitan.
Pirat-Kapitan
 

Re: Rückmelder für den Raspberry Pi

Postby felix3103 » 11.05.2017, 20:59

Hi Johannes,
das wäre super. Vielen Dank.
LG Felix
You do not have the required permissions to view the files attached to this post.
felix3103
 

Re: Rückmelder für den Raspberry Pi

Postby Pirat-Kapitan » 11.05.2017, 21:17

Moin Felix,
noch ohne realen Test:
warum hast Du beim Rückmelder Reiter Schnittstelle "aktiv niedig" gesetzt?

Schöne Grüße
johannes
Clearasilfahrer auf Spur G&H0m, Lenz LZV (3.6), ORD-20, Manhart-Funki und WLM, RS-Bus Rückmelder (Reedkontakte/GBM),
Rocrail auf RasPi mit mobilen Geräten (andRoc). Details auf http://wiki.rocrail.net/doku.php?id=use ... at-kapitan.
Pirat-Kapitan
 

Re: Rückmelder für den Raspberry Pi

Postby felix3103 » 11.05.2017, 21:28

Hi Johannes,
Ich kann es dir jetzt garnicht sagen. Aber Auswirkungen hat es nicht.
felix3103
 

Re: Rückmelder für den Raspberry Pi

Postby felix3103 » 12.05.2017, 14:55

Hallo nochmal,
Falls es hilft, die Nachrichten kommen am Server an. Doch verarbeiten kann er es nicht. Woran kann das nun liegen?

Image

LG Felix
felix3103
 

Next

Return to Raspberry Pi (DE)