Schnittstelle zu Python

  • Hallo zusammen,

    zu unserem laufenden Projekt kam die Frage auf, wie man im laufenden Betrieb von Svxlink Informationen abgreifen kann zur Weiterverarbeitung mit Python.

    Der Sinn dahinter ist, dass bei einem Gateway auf einem 2,8" Display zu erkennen sein soll,

    1. wer derzeitig eingeloggt ist
    2. wer gerade netzseitig spricht.

    Zu Punkt 1, dort wäre eine Abfrage aus dem laufenden Log sicher machbar, in dem man passend formatiert Text ausliest. Bei Punkt 2 wird es dann aber kniffeliger. Vorgestellt haben wir uns so etwas, dass entweder auf dem Display aus Liste der eingeloggten Stationen sichtbar ist und ein ">" sich vor der sendenden Station sich abbildet, oder die aktuell sendende Station mit ihrem Rufzeichen in einem Bestimmten Feld erscheint. So, oder so ähnlich wäre die Anforderung.

    Diese Funktionalität gibt es ja im Prinzip auch bei Qtel oder Windows Echolink, wo die sendende Station ja auch erkennbar ist.

    Die Frage wäre nun, wie kann man diese Informationen so aufbereiten bzw. abgreifen, als dass man sie dann wiederum mit Python weiterverarbeiten kann. Gibt es vielleicht die Möglichkeit, dies per TCL in eine temporäre Datei auszulagern?


    Hat jemand eine Idee?

  • Jo, vielen Dank Sven.

    Keine Ahnung warum ich das bisher nicht gesehen hatte.

    Hast Du Erfahrung damit? Würde mich ggf. gerne noch einmal melden wollen, wenn es denn hakt.

  • Hallo Gemeinde!

    Ist denn vielleicht jemand willens bei der Angelegenheit zu helfen?

    Es wäre eben eine oder ggf. zwei TCL zu programmieren, die mir die Möglichkeit verschafft, ähnlich wie im Windows Echolink zu sehen, wer ist eingeloggt und wer spricht gerade.
    Würde dies gerne dann über ein Display (mit Arduino im Rücken) darstellen wollen.

  • Hi Stefan,

    Quote

    Es wäre eben eine oder ggf. zwei TCL zu programmieren, die mir die Möglichkeit verschafft, ähnlich wie im Windows Echolink zu sehen, wer ist eingeloggt und wer spricht gerade.

    Die eingeloggten Stationen werden in der Prozedur

    Code
    proc remote_connected {call} {
    ...


    erfasst. Hier muß mal nur die Calls in einer Variable speichern. Ist jetzt nicht so aufwändig. Wer gerade spricht wird momentan noch nicht an TCL weitergegeben allerdings sind das nur wenige Änderungen im Quelltext.
    Was interessanter wäre: In welcher Form willst Du die Daten auswerten. Irgendwie mußt Du ja die aktuellen Daten an Dein Display übertragen (Seriell, Parallel, irgendein Bus,...).

    vy 73s de Adi / DL1HRC

  • Nabend......

    Also!

    Bei unserem laufenden Projekt soll, sofern machbar ein Touchscreen zum Einsatz kommen, über den alle Informationen über Svxlink, APRS, Telemetrie (Ströme, Spannungen, Temperaturen etc..) und Relaiszustände ersichtlich sind. Dieser Screen hängt an einem Arduino MEGA 2560.

    Es ist vorgesehen, das der Arduino mit dem Banana Pi per I2C korrespondiert, auf dem auch die SvxlinkSoft läuft. Python deswegen, da ich gehofft habe, dass außer dem Protokoll was man ja simpel abgreifen kann, eben auch Live QSO Daten von Svxlink zu bekommen sind. Beides könnte dann vom BPI zum Arduino und dort zur Anzeige gebracht werden. Dabei würde ich gerne sehen wollen

    -Wer ist eingeloggt und seit wann
    -Wer aktuell spricht

    Ähnlich der Anzeige wie beim Windows Echolink auf der rechten Seite.

    Der Gedanke war, eine TCL Routine, die eine Variable erzeugt, dessen Inhalt per Python Richtung Arduino per I2C geschoben werden kann. Wenn es eine bessere Lösung dazu gibt gerne :)

    Das wäre die Zielvorstellung.

    Adi, dein nett gemeinter Hinweis hilft mir/uns eigentlich gar nicht so recht. Wie ich ja schon mehrmals erwähnt habe, hab ichs nicht mit dem Programmieren. Anpassen oder was editieren, ok, aber eine TCL zu schreiben, von Grund auf...... Nö! Aber danke für Dein Vertrauen in meine Fähigkeiten :D

    Denke, wenn es so etwas geben könnte, dann wäre es vielleicht auch ein leichteres für andere ambitionierte OM`s mit diesen Daten spielen zu können, um sie ähnlich wie z. B. bei D-Star im Netz zu monitoren.

  • Hallo Stefan,

    bei Deinem Projekt (BananaPi, Arduino, I2C, Python, Telemetrie etc.) wirst Du wohl um entsprechende Programmierarbeit nicht 'drum herum kommen. Ganz in Gegenteil, das schreit gerade danach, hi. Bei dem Ganzen ist dann die Anpassung von SvxLink vermutlich nur eines der kleineren Probleme.

    Wenn Ziel der Anstrengungen hauptsächlich der Lernerfolg sein soll ist das Projekt natürlich prima dazu geeignet. Aber eben auch nicht ganz ohne. Denn es sind viele verschiedene Aufgaben zu lösen. Wenn Du das dann aber fertig hast kannst Du sehr stolz darauf sein und hast eine Menge dabei gelernt.

    Wenn lediglich die von Dir beschriebenen Funktionen (EchoLink Statusanzeige) im Vordergrund stehen würde ich das vielleicht anders lösen. Warum unbedingt einen zweiten Rechner (Arduino) wenn Du doch schon das SvxLink-System (BananaPi) hast? Ich würde dort das Display anschließen und geeignet ansteuern. Ich meine Adi hat bei seinem BananaPi-Projekt so etwas ähnliches sogar schon vorbereitet (siehe hier).

    Da das Display immer nur vom Sysop gesehen wird (falls er gerade daneben sitzt) ist das alles aber vermutlich nur eine nette "Spielerei". Wäre es nicht etwas schöner wenn die durchaus nützlichen Informationen vielleicht alle Interessierten sehen könnten? Also anstatt des Displays lieber ein Webinterface mit Statusanzeige bauen? Das würde dann auch bei entfernten Standorten wie Relaisfunkstellen funktionieren. Und damit vielleicht auch für andere SvxLink-Anwender interessant sein. Irgendeinen Browser zur Anzeige der Daten hat heute ja fast schon jeder (notfalls in Form eines Smartphones).

    In beiden Fällen (Display/Webinterface) kommt man aber um eine geeignete SvxLink-Schnittstelle nicht 'drum herum. Schön wäre es wenn SvxLink alle relevanten Informationen irgendwie in einem einfach auswertbaren Format zur Verfügung stellen könnte. Im Moment gibt es eigentlich nur die Logdatei, ggf. kann man sich noch über Pseudoterminals (PTY) selbst etwas bauen ...

    Schönen Gruß
    Frank, DL3DCW

  • Hallo Frank,

    nun das mit dem Touchscreen über den Arduino ist leicht erklärt.

    Zunächst habe ich trotz Recherche nichts gefunden, was mich bei der Programmierung eines Touchscreen in Verbindung mit irgendeinem Pi unterstützt. Arduino bietet da für Laien oder Anfänger doch schon viel mehr und ein erster Erfolg stellt sich relativ schnell ein. Bibliotheken werden zur Verfügung gestellt, welche ich bisher für einen Pi vergebens gesucht habe. Es ist also nicht so, dass das eine Entscheidung ins Blaue war. :)
    Arduino auch deswegen, da es auch viele Veröffentlichungen gibt, aus denen man Bausteine für die eigenen Aufgaben bekommen kann, wie z. b. das Messen von Spannungen.

    Adi hat ein Zwei-Zeilen-Display verbaut, was keine Touchoberfläche bietet um auch etwas (umzu)schalten. Der Informationsinhalt ist eben auch nur auf 2 Zeilen beschränkt. Seine Veröffentlichung haben wir natürlich auch gesehen.

    Und ja, ich werde letztlich wohl der einzige sein, der das Display sieht und bedient. Hab hier ja auch keine automatische Station und das Gate wird auch nur temporär aktiviert. Aber wiederum sooft das ich bereits auf Karten mit Echolinkstationen gelistet wurde. War nie Absicht :roll:
    Daher ist eine Veröffentlichung auf einer Weboberfläche wäre sicher witzig, aber dann würden sich noch mehr drauf stürzen :) Letztlich bräuchte man aber auch dafür irgendeine Schnittstelle aus Svxlink heraus. Denn die Informationen kommen ja nicht alleine ins Netz. Sicher, sieht toll aus. Wenn Du dir mal die Dash-Boards von Reflektoren fürs D-Star Netz ansiehst. Da kann man alles prima sehen.

    Hmmm aber nun hast Du mich neugierig gemacht. Was hat es auf sich mit diesem Pseudoterminal?


    Grüße

    Stefan

  • Hallo Stefan,

    Pseudoterminals sind im Prinzip eine Linux-Grundfunktion (siehe https://de.wikipedia.org/wiki/Pseudoterminal). Auch SvxLink kann damit umgehen. Allerdings habe ich bisher noch nicht wirklich viele Infos bzw. Programmierbeispiele dazu gefunden. Vielleicht hat Adi ein paar Tipps?

    Die Pseudoterminals kann man dann zum einfachen Datenaustausch zwischen SvxLink und einer beliebigen Anwendung benutzen. SvxLink muss nur die entsprechenden Statusinfos dort herein schreiben. Das scheint vorbereitet zu sein, allerdings wohl nicht für alle Funktionen. Man muss also vermutlich selbst Hand anlegen und das Ganze den eigenen Wünschen/Anforderungen entsprechend erweitern.

    Die Signalanzeige unseres 10m FM-Relais DB0SKY beruht übrigens auf einer solchen Lösung (nach den Beispielcodes von Rob, PE1CHL). Diese befinden sich im Verzeichnis "eventsource" in jeder SvxLink-Installation. Die Daten für unsere Statusübersicht bekommen wir hingegen aus den Logdateien sowie dem EchoLink- und APRS-System. Ist zwar absolut umständlich aber funktioniert, hi.

    Mit den Pseudoterminals kann man das bestimmt eleganter und sauberer machen. Daher bin ich daran ebenfalls sehr interessiert ...

    Schönen Gruß
    Frank, DL3DCW

  • Hallo Frank,

    ich seh schon, wir haben da einen ähnlichen Interessenpfad :D

    Ok, das Script von Rob ist sicher interessant und wenn ich die Site https://pc7x.net/repeaters/#/map/google/pi2nos sehe, wow. Ne Menge Arbeit. Die Sache mit dem Pseudoterminal finde ich hoch interessant, allerdings bin ich damit völlig überfordert. Das ist echt was für Könner.

    Interessant ist nur, dass die Infos ja irgendwie bereit stehen, die wir brauchen. Selbst im Qtel kannst Du sehen wer spricht und eingeloggt ist. Und das gilt es in unserem Fall eben in eine oder 2 Variable(n) als Zeichenkette, ggf. in Verbindung mit einem Timestamp auszuleiten. Wenn es die Variable einmal gibt und die entsprechend gefüllt wird, dann sollte der Weiterverarbeitung nichts mehr im Weg stehen.

    Nur wie? Adi hat ja geschrieben, dass es nicht so aufwendig sei.

    Hmmm Adi , ob Du da vielleicht unterstützend tätig werden könntest? Also..... wenn mal etwas Zeit ist :) Kanns leider selber nicht selber.


    Grüße

    Stefan

  • Hallo alle,

    Quote

    Nur wie? Adi hat ja geschrieben, dass es nicht so aufwendig sei.

    Ich habe noch mal nachgeschaut, das Call und der Status (1=sendet, 0=aus) wird bereits an tcl übergeben. Alle Voraussetzungen sind also vom TCL/SvxLink her gegeben.
    Das etwas größere Problem ist, dass ich noch nicht so eine richtig schöne Lösung habe, wie man per TCL direkt auf I2C schreiben kann. Es gibt zwar Libs allerdings mußt Du die selber aus den Sourcen bauen. Ob das alles so einfach hinhaut?
    Möglicherweise mußt Du den Weg über die PTY's gehen und dann an der "anderen Seite" ein Skript andocken, das I2C etwas besser unterstützt (Perl oder Python z.B.).
    Muß mal noch ein bisschen googeln.

    vy 73s de Adi / DL1HRC

  • Hallo Adi,

    ich denke der Weg von TCL direkt nach I2C macht keinen großen Sinn. Denn für die Übertragung der Daten zwischen zwei Rechnern (Banana Pi zu Arduino) ist das I2C-Protokoll eher weniger geeignet. Es ist ja primär für den Datenaustausch von IC zu IC gedacht. Daher auch der Name "Inter-Integrated Circuit" Protokoll.

    Bezüglich der PTY würden vielleicht schon zwei klitzekleine Codeschnipsel weiterhelfen:

    - Call/Status von TCL auf PTY scheiben
    - PTY lesen und weiterverarbeiten

    Dann kann man das beliebig (z.B. mit Phyton) ausbauen. Und sogar recht universell für viele interessante Projekte nutzen. Der Kreativität sind dann eigentlich keine Grenzen mehr gesetzt ...

    Schönen Gruß
    Frank, DL3DCW

  • Hallo Frank,

    Quote


    ich denke der Weg von TCL direkt nach I2C macht keinen großen Sinn. Denn für die Übertragung der Daten zwischen zwei Rechnern (Banana Pi zu Arduino) ist das I2C-Protokoll eher weniger geeignet. Es ist ja primär für den Datenaustausch von IC zu IC gedacht. Daher auch der Name "Inter-Integrated Circuit" Protokoll.

    Na ich gunkte eigentlich davon aus, dass beide Boards direkt über zwei kurze Leitungen (dem I2C-Bus) miteinander verbunden sein sollen (Pin-zu-Pin), also der Touch-Screen sich direkt am Repeater bzw. der Steuerung befindet!? Oder irre ich mich da?
    Wenn das abgesetzt über mehrere Meter betrieben werden soll, dann wäre eine Anbindung per Netzwerk sehr viel besser geeignet und es ist auch noch universeller verwendbar (mehrere Touch-Screens, Webseiten updaten,...). Hat der Atmel in der verwendeten Version eine Ethernet-Schnittstelle?

    vy 73s de Adi / DL1HRC

  • Hallo Adi,

    wie es letztendlich auch aussieht: Ich würde in einem ersten Schritt über die PTY's gehen. Dann kann man beliebig weiterverarbeiten, also z.B. nach I2C, SPI, TCP/IP oder was auch immer. Man braucht auf jeden Fall eine Schnittstelle welche die Statusinformationen aus SvxLink heraus zur Verfügung stellt. Diese sollte möglichst universell sein. Daher die PTYs. Damit ist das Ganze dann auch nicht nur auf ein einziges spezielles Projekt zugeschnitten sondern recht universell einsetzbar ...

    Schönen Gruß
    Frank, DL3DCW

  • Hallo nochmal......

    In unserem Falle ist es so, dass alles in einem halben 19" Gehäuse untergebraucht ist. Quer verläuft eine Backplane, die u. a. auch I2C zwischen den Komponenten ermöglicht. Ist auch deswegen schon erforderlich, da das Netzteil zwecks Messung und Überwachung durch einen Mega8 mit Hall-Sensoren mit I2C versorgt ist. Und dies ist wohl auch schon getestet.
    Abgesetzt ist nur der TRX und das 230V/13,8V für den TRX.

    Denke die Übergabe an Python ist da der sinnvollere Weg. Zumal ja Svxlink auf dem BPI läuft. Daher der Gedanke die Informationen direkt von einem eigenen Prozess bei Svxlink abholen zu lassen und per I2C an den Arduino und von dort aus zum Display.

    Übrigens, der Touchscreen versteht kein I2C. Der hängt quasi direkt am Arduino 2560 und soll vertikal vorne an die Frontblende, damit man das Teil von vorne betrachten und bedienen kann.


    Grüße

    Stefan

  • Quote

    Wie kann ich die TCL auslesen aus der herauskommt wer gerade Sendet und wer nicht ?

    Das wird in der Prozedur EchoLink::is_reciving{rx call} behandelt. Dort ist bekannt, dass die Station call gerade sendet (1) oder aufgehört hat (0).
    Leider ist Pty offensichtlich im tcl nicht implementiert oder muß zumindest über weitere Libs aufwändig installiert werden. Was allerdings immer geht ist in ein File schreiben und dieses File dann mit einer eigenen Anwendung wieder auslesen, hier mal ein Versuch aus dem Bauch raus:

    Code
    proc is_receiving {rx call} {
      if {$rx == 0} {
        playTone 1000 100 100;
      }
      set fp [open "/tmp/echolinkinfo" "w"];
      puts $fp $call;
      close $fp;
    }

    Während und nach einer EchoLink-Verbindung sollte dann ein File /tmp/echolinkinfo existieren in dem ein Rufzeichen steht. Die eigene Applikation kann dann periodisch das File auslesen und dann z.B. das Display ansteuern. Ist jetzt sicher keine Optimallösung....

    vy 73s de Adi / DL1HRC

  • Hallo Adi!

    ......aber ein Anfang.

    Besten Dank zunächst. Hatte am WE keine Zeit, aber werde mich in Kürze damit befassen.


    Grüße

    Stefan