Canboat and SignalK

Zusammenwirken mit Canboat und SignalK

Ab der 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, das sie 2 Spannungsversorgungen haben (3,3V und 5V) - viele ganz einfache haben das nicht!

Im Bild ist das prinzipielle set up 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 enstprechende 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 traffic 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 set up 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.

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).

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 Wegepunkt dort sichtbar.

Wenn das plugin enabled wurde ist bei AvNav unter User-Apps ein Eintrag für SignalK vorhanden, so das 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 (Wegepunkt) dorthin zurück. 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.