Seite 1 von 1

Svxlink Remote Display

Verfasst: Do 15. Sep 2022, 23:21
von dj1jay
Den Original Beitrag findet ihr auch auf https://fm-funknetz.de/svxlink-remote-display/

Schon immer gab es den Wunsch ein Display am Svxlink Relais zu haben, um den ein oder anderen Status zu sehen.

Über den Sinn oder Unsinn reden wir mal nicht, man geht ja davon aus, das Relais steht auf dem Berg oder auf dem Dachboden, somit kann man garnicht auf das Display schauen, im Gegenteil es Verbraucht zusätzlich Strom.

Aber genial wäre es ein Display zu haben, was man sich ins Shack oder ins Wohnzimmer stellen könnte und den Status vom Relais oder auch DjSpot angezeigt zu bekommen.
Bild
Bild
Bild
LCD Blau 4×20 Lastheard
Bild
LCD Blau 16x2
Bild
LCD Display Grün 4x20
Bild


Der Aufwand dauert nicht mal 1h bis man das erste Rufzeichen auf dem Display sieht. Der Materialaufwand ist ca 10-20 Euro auch überschaubar.

Was benötigen wir:
Tipp: Ich bestelle meist mehrere um etwas zu sparen und gebrauchen kann man sowas immer, die Projekte kommen von ganz alleine ;-).

* 1x Wemos D1 ( 1x https://amzn.to/3RZv1mi | 3x https://amzn.to/3DmmcyC | 5x https://amzn.to/3xjC5SO )
* 1x LCD Display 2×16 ( 1x https://amzn.to/3RBSAld | 3x https://amzn.to/3RBSAld | 5x https://amzn.to/3daACr1 )
* oder 4×20 ( 1x https://amzn.to/3d2DqGJ | 3x https://amzn.to/3RDblop , 5x https://amzn.to/3B6Lhe9)
* mögliches Gehäuse ( Weis > https://amzn.to/3BqsTNr | Schwarz https://amzn.to/3BNfSPu)
* ein paar Kurze Kabel um das Display mit dem Wemos zu verbinden
* Ladekabel und Netzteil
** (Optional, Praktischerweise könnte man noch einen Temperatursensor DS18b20 (https://amzn.to/3QAfvMf) mit verbauen und sich die Temperatur mit auf dem Display anzeigen lassen 😉 (an den 4,7kOhm Widerstand denken)
* Etwas Zeit

So haben wir alles auf dem Tisch liegen so bespielen wir den den Wemos D1 zuerst mit der ESPEasy Firmware.

Eine gute Anleitung findet ihr hier https://iotspace.dev/wemos-d1-mini-esp-easy-flashen/, wie ESPEasy auf den Wemos kommt.

Ein paar Kleinigkeiten sollten noch angepasst werden.
Bild

Ist man soweit, dann unter TOOLS > Advanced >
Bild

Dort den NTP Server aktivieren
Bild

Ist das erledigt, so geben wir dem Wemos noch einen passenden Netzwerknamen, dieser ist später eventuell wichtig, um den Wemos im Handy WLAN Hotspot anzusprechen.
Dazu gehen wir auf “Config” > und tragen bei Unit Namen das entsprechende ein.Unit Number sollte nicht 0 sein, ich habe hier die letzte Ziffer der IP eingetragen.
Für den Internen Wemos Netzwerkdienst darf dort keine 0 stehen.

Bild


So ist das erledigt so verbinden wir das Display mit dem Wemos laut Bild.
Bild

Anschaltung 2×16 (4×20) Display
Wichtig den Kontrast des Display’s erhöhen über den I2C Controller, Regler im Uhrzeigersinn auf Anschlag (3.3V) bei 5V ist es etwas weniger.
Bild

Display an Wemos Konfigurieren. Devices > ADD
Bild

Dann sollte man folgende Eintragungen machen. Trage in Line 1 etwas ein und drücke SUBMIT sollte der Text im Display auftauchen Herzlichen Glückwunsch…..
Falls nicht dann muss man einfach die I2C Adressen durchprobieren….

https://fm-funknetz.de/wp-content/uploa ... 8x1280.jpg

Nun kann man mittels Webbrowser testen ob wir das Display extern ansteuern können.
Webbrowser öffnen und folgende URL eingeben, Natürlich muss die IP Angepasst werden.
http://192.168.178.51/control?cmd=LCD,2 ... %20welt%22

Jetzt sollte in der 2ten Zeile auch ein Hallo Welt erscheinen. Gratulation nun gehts mit SVXlink weiter.

wir wechseln ins Verzeichnis cd /usr/share/svxlink/events.d/local
dort passen wir die ReflectorLogic.tcl an mit nano oder mcedit aufrufen.

Da suchen wir proc talker_start und talker_stop und ergänzen den Eintrag ” exec curl http://lcd-display-51.fritz.box/control ... 20start%22 & curl http://lcd-display-51.fritz.box/control ... 20TG$tg%22; ”
und
bei stop ” exec curl http://lcd-display-51.fritz.box/control ... %20stop%22 & exec curl http://lcd-display-51.fritz.box/control ... allsign%22; ” ein, Die IP / Host muss angepasst werden eventuell solle noch die variable selected_tg hinzugefügt werden mit dem if Befehl.

Schaut in die Vorlage.

Code: Alles auswählen

#
# Executed on talker start
#
#   tg        -- The talk group
#   callsign  -- The callsign of the talker node
#
proc talker_start {tg callsign} {
variable selected_tg

 if {($tg == $selected_tg)} {
### LCD 4x20 Anzeigetext - IP/Hostadresse des Wemos eintragen 3x
#exec curl http://192.168.178.51/control?cmd=GPIO,14,0 &  curl http://192.168.178.51/control?cmd=LCD,1,1,%22auf%20TG$tg%20spricht%22 &  http://192.168.178.51control?cmd=LCD,2,1,%22$callsign%22;
### LCD 2x16 Anzeigetext - IP/Hostadresse des Wemos eintragen 3x
exec curl http://192.168.178.51/control?cmd=GPIO,14,0 & curl http://192.168.178.51/control?cmd=LCD,1,1,%22auf%20TG$tg%20ist%22 &  http://192.168.178.51/control?cmd=LCD,2,1,%22$callsign%22;
}
}


#
# Executed on talker stop
#
#   tg        -- The talk group
#   callsign  -- The callsign of the talker node
 
proc talker_stop {tg callsign} {
  variable selected_tg
  variable ::Logic::CFG_CALLSIGN

set systemTime [clock seconds]
set last  [clock format $systemTime -format %H:%M:%S];

  if {($tg == $selected_tg)} {
### LCD 4x20 Anzeigetext - IP/Hostadresse des Wemos eintragen 3x
#exec curl http://192.168.178.51/control?cmd=GPIO,14,1 & curl http://192.168.178.51/control?cmd=LCD,1,1,%22Lastheard%20TG$tg%22 & exec curl http://192.168.178.51/control?cmd=LCD,2,1,%22$callsign%20$1234%22;
### LCD 2x16 Anzeigetext - IP/Hostadresse des Wemos eintragen 3x
exec curl http://192.168.178.51/control?cmd=GPIO,14,1 & curl http://192.168.178.51/control?cmd=LCD,1,1,%22Heard%20TG$tg%22 & exec curl http://192.168.178.51/control?cmd=LCD,2,1,%22$callsign%20$last%22;
}
}

Danach Speichern, Svxlink neu starten, thats it.

Erweiterung Displaytimeout (Beleuchtung)

Unter dem Reiter des Displays > Display button auswählen zb GPIO-14 (D5) – Display Timeout Zeit einstellen, ich habe aktuell 60s das ist denke vollkommen ausreichend, wenn der letzte das QSO Beendet hat.

Bild

Danach legen wir unter Device > ADD > Switch Input Switch ein neues Device an….
Bild

Und dann natürlich Konfigurieren….. GPIO-14 auswählen , Switch Button “Normal Switch” und den Haken bei Enable nicht vergessen, danach Submit und Fertig.

Bild

In der Svxlink geschichte ist der http befehl schon mit dabei also sollte es nun schon funktionieren …..

Für Verbesserungsvorschläge einfach per Mail, PN, Telegram oder Oldschool per Funk 😉

vy 73 Jens, dj1jay

Alles ohne Gewähr

Re: Svxlink Remote Display

Verfasst: Do 17. Nov 2022, 18:30
von dj1jay
Es kommt leider hin und wieder zu Aussetzern von Svxlink wenn das Display nicht im Netzwerk erreichbar ist.

Hier kommt die kleine Abhilfe.

Anlegen der Datei display-status.sh

Code: Alles auswählen

nano /root/display-status.sh
Bitte die passende IP des Display's eintragen welche euch auf dem Display angezeigt oder bekannt ist.

Code: Alles auswählen

#!/bin/bash

## Display IP eintragen
ip='192.168.178.51'

while true
do
if 
( nc -zv $ip 80 2>&1 >/dev/null );
then
echo 'online' > /tmp/display-state.txt; 
echo  $ip > /tmp/display-ip.txt;
else     
echo 'offline' > /tmp/display-state.txt; 

fi
### Abfrage alle 120s
sleep 120
done
Datei Ausführbar machen

Code: Alles auswählen

chmod +x /root/display-status.sh
Kurzer Test? mit STRG + X beenden !!

Code: Alles auswählen

sh /root/display-status.sh
unter /tmp/display-state.txt datei kontrollieren,

Code: Alles auswählen

cat /tmp/display-state.txt
Nun die ReflectorLogic.tcl bearbeiten, backup der datei kann nie schaden ;-)

Code: Alles auswählen

nano /usr/share/svxlink/events.d/local/ReflectorLogic.tcl
nun wird mittel if else in der Start und Stop Sektion folgendes erweitert

Code: Alles auswählen

#
# Executed on talker start
#
#   tg        -- The talk group
#   callsign  -- The callsign of the talker node
#
proc talker_start {tg callsign} {
variable selected_tg

## Beginn Verzeichnis hinzufügen	
	set ip1 [exec cat "/tmp/display-state.txt"]
	set ip [exec cat "/tmp/display-ip.txt"]
  #puts "### Talker start on TG #$tg: $callsign"

if {($tg == $selected_tg)} {

## Beginn Status Display einlesen 
	if {($ip1 == "offline")} {
	puts "display offline" 
  } else { 

## Ende Status Display einlesen 

exec curl -i -s -o /dev/null  http://$ip/control?cmd=GPIO,14,0 & curl  http://$ip/control?cmd=LCD,1,1,%22auf%20TG$tg%20ist%22 & curl  http://$ip/control?cmd=LCD,2,1,%22%20%20%20$callsign%22;

## Beginn Status Display einlesen Nr2
	puts "Display online "
	}
## Ende Status Display einlesen Nr2
   }
}

Code: Alles auswählen

# Executed on talker stop
#
#   tg        -- The talk group
#   callsign  -- The callsign of the talker node
#
proc talker_stop {tg callsign} {
  variable selected_tg
  variable ::Logic::CFG_CALLSIGN
  #puts "### Talker stop on TG #$tg: $callsign"
	set systemTime [clock seconds]
	set last  [clock format $systemTime -format %H:%M:%S];
## Hinzufügen der Display Status Pfades	
	set ip1 [exec cat "/tmp/display-state.txt"]
	set ip [exec cat "/tmp/display-ip.txt"]

  if {($tg == $selected_tg)} {
  
  ##Beginn Status Display einlesen
	if {($ip1 == "offline")} {
	puts "Display Offline"
  } else {
	puts "Display online"

## Ende Status Display einlesen 
 
## Display Ansteuerung via HTTP schon vorhanden (muss alles in eine Zeile)
exec curl -i -s -o /dev/null http://$ip/control?cmd=GPIO,14,1 & curl http://$ip/control?cmd=LCD,1,1,%22Lastheard%20TG$tg%22 & curl http://$ip/control?cmd=LCD,2,1,%22$callsign%20$last%22;

# Eine Klammer Hinzufügen
	}
  }
}
Die IP zum Display muss im Befehl wieder angepasst werden, falls der Code komplett kopiert wird.

Ins Verzeichnis wechseln und Starter anlegen

Code: Alles auswählen

cd /lib/systemd/system

Code: Alles auswählen

nano display.service
Folgendes Einfügen

Code: Alles auswählen

[Unit]
Description=Abfrage Svxremote Display

[Service]
ExecStart=/root/display-status.sh

[Install]
WantedBy=multi-user.target
Systemd neu laden

Code: Alles auswählen

sudo systemctl daemon-reload
Dienst in den Autostart laden

Code: Alles auswählen

sudo systemctl enable display.service
Display Dienst starten und svxlink neu starten

Code: Alles auswählen

sudo systemctl start display.service
sudo systemctl start svxlink.service
have Fun
dj1jay