Canboat and SignalK

Zusammenwirken mit Canboat und SignalK

Ab Release 20200204 kann AvNav mit canboat (NMEA2000) und SignalK zusammenarbeiten.

Canboat (NMEA2000)

Mit canboat können an den Raspberry angeschlossene CAN Adapter (z.B. mit MCP2515 oder ein Waveshare RS485 CAN-HAT ) oder per USB angeschlossene Adapter (z.B. Actisene NGT-1) genutzt werden. Für die einfachen CAN-Adapter muss darauf geachtet werden, dass sie 2 Spannungsversorgungen haben (3,3V und 5V) - viele ganz einfache haben das nicht!

Im Bild ist das prinzipielle Setup zu sehen, so wie es von den headless Images bereitgestellt wird.

Für einen per SPI angeschlossenen CAN-Adapter muss meist noch ein Overlay in /boot/config.txt eingeschaltet werden. Für den MCP2515 sind entsprechende Einträge bereits vorbereitet, diese müssen auskommentiert und ggf. muss die Taktfrequenz und der für den Interrupt genutzte GPIO Pin geändert werden.

Dieser CAN-Adapter erscheint dann als Netzwerk-Interface (ggf. muss er noch entsprechend konfiguriert werden - in den Images ist das bereits vorbereitet).

Das Interface sollte mit

ifconfig can0

sichtbar sein.

Für einen per USB angeschlossenen Actisense NGT-1 siehe die Beschreibung bei canboat.

AvNav kommuniziert mit dem n2kd. Dieser konvertiert empfangene NMEA2000 Daten in NMEA0183 (nicht ganz vollständig). Die Konfiguration für n2kd erfolgt über die Datei

/etc/default/n2kd

In den Images ist hier eine Verbindung zu can0 vorbereitet, für einen per USB angeschlossenen Adapter muss diese Datei geändert werden. Falls ein solcher USB-Adapter für NMEA2000 angeschlossen wird, sollte er einen Eintrag in der avnav_server.xml bekommen, damit er dort nicht genutzt wird (bei Einstecken die Status-Seite beobachten und die USB-Id von dort kopieren), dann entsprechend eintragen:

<AVNUsbSerialReader .....>
<UsbDevice usbid="x:y.z" type="ignore"/>
....

Wenn alles korrekt konfiguriert ist, sollten auf den ports 2599 und 2598 NMEA-Daten bzw. json Daten zu sehen sein, wenn auf dem Bus NMEA2000 Datenverkehr vorhanden ist. Kontrolle z.B.

nc localhost 2599

Sonst den Zustand von canboat mit

sudo systemctl status canboat

prüfen.

Für AvNav sollten 2 Verbindungen zum n2kd konfiguriert werden. Über eine Verbindung (Port 2599) empfängt er die NMEA0183 Daten und über die andere Verbindung (Port 2598)  direkt einige JSON Daten. Das ist notwendig, da n2kd keinen NMEA-Datensatz mit Datum ausgibt (z.B. RMC). Um das Datum zu erhalten, kann AvNav direkt die pgns 126992,129029 lesen, um intern Datum und Zeit zu setzen und kann daraus auch einen RMC Datensatz generieren (wenn über NMEA gültige Positionsdaten empfangen werden).

Dazu sind in der avnav_server.xml einige Konfigurationen nötig. Diese werden bei einer Image Installation automatisch aufgesetzt, sonst sind sie im Template unter /usr/lib/avnav/raspberry/avnav_server.xml zu finden und können von dort kopiert werden.

<AVNSocketWriter port="34568" maxDevices="5"
filter=""read="true" minTime="50"
name="nmea0183tosignalk"
blackList="canboatnmea0183,canboatgen"/> <AVNSocketReader port="2599" host="localhost" filter="" name="canboatnmea0183"/> <AVNPluginHandler>
<builtin-canboat enabled="true" allowKeyOverwrite="true" autoSendRMC="30" sourceName="canboatgen"/>
</AVNPluginHandler>

Mit dem ersten Eintrag wird ein zusätzlicher Port erzeugt, auf dem AvNav seine NMEA-Daten ausgibt - aber ohne die per canboat empfangenen Daten. Das wird für die Integration mit SignalK genutzt, wenn SignalK die NMEA2000 Daten bereits selbst empfängt.

Der Socketreader localhost:2599 empfängt die konvertierten Daten vom n2kd.

Die direkte Abfrage der NMEA2000 Daten erfolgt über ein Plugin, daher muss ein Eintrag unter AVNPluginHandler gemacht werden. Mit den Settings im Beispiel wird das Plugin aktiviert, allowKeyOverwrite erlaubt das Überschreiben der internen Zeit durch das Plugin und autoSendRMC=30 sorgt dafür, das (wenn 30s kein RMC im NMEA Datenstrom aufgetaucht ist) im Intervall 1s ein RMC geschrieben wird. Für die Parameter des Plugins siehe den source code

Ein Senden von Daten über NMEA2000 ist bisher nicht vorgesehen, dass kann ggf. über SignalK konfiguriert werden.


SignalK

Mit dem Stand 20200204 ist ein erster Schritt der SignalK Integration möglich.

SignalK

Im Default Setup schickt AvNav alle seine Daten an SignalK weiter (per NMEA0183), nicht jedoch die per canboat empfangenen Daten. Dafür sollte SignalK direkt konfiguriert werden (im Image bereits vorhanden). Dazu wird bei AvNav der Port 34568 genutzt (siehe oben). Bei SignalK wird ein enstprechender Kanal konfiguriert.

Wenn AvNav innerhalb von OpenPlotter genutzt wird, ist der Signalfluss anders aufgesetzt. In diesem Falle gehen auch die NMEA0183 Daten zunächst direkt zu SignalK und erst von dort zu AvNav. In diesem Falle sollten in AvNav keine NMEA0183 Schnittstellen konfiguriert werden.

AvNav pollt 1x pro Sekunde die URL

http://localhost:3000/signalk/v1/api/vessels/self

und trägt die empfangenen Daten intern unter

gps.signalk....

ein (nur die values der Werte). Seit Version 20201202 wird (falls verfügbar) auch eine Websocket-Verbindung aufgesetzt, sodass Änderungen schneller bei AvNav verfügbar werden. Das Polling erfolgt dann nur noch alle 10s.

Damit sind diese Daten in der App anzeigbar. Ein entsprechendes Layout wird mitgeliefert und kann angepasst werden. Dieses Layout kann über die Settings Seite gewählt werden (system.plugin.builtin-signalk.example) - es ist aber nur sichtbar, wenn das Plugin aktiv ist. Alternativ kann man auch sein eigenes Layout mit dem Layout Editor erstellen, das SignalK Werte anzeigt.

Die Kommunikation mit SignalK erfolgt über ein Plugin, das entsprechend konfiguriert werden muss (in den Images entsprechend vorbereitet, Beispiel sonst wieder unter /usr/lib/avnav/raspberry/avnav_server.xml):

<AVNSocketWriter port="34568" maxDevices="5" filter="" read="true" minTime="50" name="nmea0183tosignalk" blackList="canboatnmea0183,canboatgen"/> <AVNPluginHandler>       <builtin-signalk enabled="true"/> </AVNPluginHandler>

Wenn die canboat Integration ebenfalls genutzt wird, dann bitte beide Plugins gemeinsam unter einem AVNPluginHandler Eintrag konfigurieren.

Da SignalK alle NMEA Daten von AvNav empfängt, ist beispielsweise auch ein aktiver Wegpunkt dort sichtbar.

Wenn das Plugin enabled wurde, ist bei AvNav unter User-Apps ein Eintrag für SignalK vorhanden, sodass die Web Oberfläche geöffnet werden kann.

Es sind natürlich auch andere Konfigurationen einstellbar - z.B. AvNav empfängt seine NMEA Daten von SignalK und schickt nur RMB (Wegpunkt) dorthin zurück (Default on OpenPlotter). Dabei muss jedoch sorgfältig konfiguriert werden, um Schleifen zu vermeiden. In AvNav stehen dabei an den SocketReadern die filter- und name-Optionen und an den Writern die filter-, readFilter- und blackList-Optionen zur Verfügung. Auch die canboat Integration kann dann u.U. komplett über signalK abgewickelt werden.

Es gibt die folgenden Parameter für das Plugin

Name Default Beschreibung
enabled false Nur aktiv, wenn true
port 3000 SignalK Port
period 1000 Abfrage Zeit in ms (ab 202011xx nur relevant wenn nicht web sockets genutzt werden)
host localhost (ab Version 202011xx) Adresse des Servers, auf dem SignalK läuft
useWebsockets true (ab Version 202011xx) Wenn vorhanden, nutze WebSockets für die Abfrage von SignalK (Änderungen werden schneller verfügbar)


SignalK - Karten

Ab Version 202011xx ist auch der SignalK chart provider integriert. Karten, die von dort angeboten werden, können auf der Einstiegsseite ebenfalls ausgewählt werden. Dazu muss natürlich innerhalb von SignalK das entsprechende Plugin installiert und aktiviert sein - und Karten müssen dort verfügbar sein.

Im Normalfall werden durch AvNav nur die Informationen über die Karten bereitgestellt, der Zugriff auf die Karten erfolgt direkt vom Browser zu SignalK.

Falls das z.B. durch Firewall Einstellungen verhindert wird, kann man auch alle Karten-Zugriffe über AvNav leiten (Proxy).

Für die Karten-Einbindung gibt es einige neue Parameter im Plugin. Normalerweise müssen diese aber nicht angepasst werden.

Name Default Beschreibung
chartQueryPeriod 10000 Intervall in ms, in dem die Kartenliste von SignalK abgefragt wird. Wenn auf 0 gesetzt, ist die Nutzung der SignalK Karten ausgeschaltet.
chartProxyMode sameHost Entscheidet, ob die Requests für die Karten direkt zu SignalK gehen oder über AvNav geleitet werden.
sameHost: direkt zu SignalK, wenn dieses auf dem gleichen Rechner läuft wie AvNav, sonst über AvNav
never: immer direkt zu SignalK
always: immer über AvNav