Als ergänzende Software zum OpenStreetMap Server habe ich etwas gesucht, damit man Marker auf eine Karte setzen kann. Gefunden habe ich UMap und habe den Docker gleich mal installiert. Nun ist es möglich frei auf der Karte Marker mit Infos zu erstellen. Auch Linien und Flächen sind möglich. Zudem lassen sich die Karten mit Namen und Berechtigungen speichern, auch komplett öffentlich.

uMap Deggingen Notfunkwochenende Übung

Für die Installation habe ich mich für den Docker Container entschieden (GitHub: https://github.com/umap-project/umap). Mit dem Docker Compose laufen die zwei Container (db und app) innerhalb kürzester Zeit.

Docker-Compose.yml

version: '3'
services:
  db:
    healthcheck:
        test: ["CMD-SHELL", "pg_isready -U postgres"]
        interval: 2s
    image: postgis/postgis:14-3.3-alpine
    restart: always
    environment:
      - POSTGRES_HOST_AUTH_METHOD=trust
    volumes:
      - db:/var/lib/postgresql/data

 

  app:
    depends_on:
      db:
        condition: service_healthy
    image: umap/umap:2.2.0
    restart: always
    ports:
      - "${PORT-8000}:8000"
    environment:
      - DATABASE_URL=postgis://postgres@db/postgres
      - SECRET_KEY=5047233200
      - SITE_URL=http://pbx/
      - UMAP_ALLOW_ANONYMOUS=True
      - DEBUG=1
    volumes:
      - data:/srv/umap/uploads

 

volumes:
  data:
  db:

Damit man sich in das Admin Backend (http://server:8000/admin) anmelden kann, muss man sich einen Superuser erstellen, das geschieht im Container:

umap createsuperuser

Zusätzlich habe ich noch einige Icons installiert, dies geht auch um einiges schneller über die CLI. Download hier: OSMIC Icons, REMIX Icons

Installation:

# Copy to docker volume
cp remix /var/lib/docker/volumes/umap_data/_data/pictogram -r
cp osmic /var/lib/docker/volumes/umap_data/_data/pictogram -r

# Jump into Container
sudo docker exec -it umap-app-1 /bin/bash

# Import Icons
umap import_pictograms --attribution "REMIX" /srv/umap/uploads/piktogram/remix
umap import_pictograms --attribution "OSMIC" /srv/umap/uploads/piktogram/osmic

# You can remove the folders

Nun fehlt nur noch der passende Tile Server im Backend. Erstmal habe ich den default entfernt und OpenStreetMap hinzugefügt. Für die lokale Open Street Map wurde es nun schwieriger, denn bis jetzt habe ich noch keine Option gefunden auf die aktuelle Host-URL mit einem anderen Port zu verweisen. Demnach habe ich die lokalen Maps mit allen möglichen Hostnames ertellt, in meinem Fall pbx:8080 und dc9pa-001.local.mesh:8080.

uMap Administration Tile Server

Die URL sind immer nach dem gleichen Prinzip aufgebaut:

http://{s}.<host>/tiles/{z}/{x}/{y}.png => z = Zoom, x und y = Position, s = Server (a - c, optional)

http://pbx:8080/tile/{z}/{x}/{y}.png

http://{s}.openstreetmap.org/tile/{z}/{x}/{y}.png

Vom 12.04. - 14.04.2024 findet vom DARC eine Notfunkübung für die lokalen OVs statt. (Ausschreibung: https://www.darc.de/der-club/referate/notfunk/veranstaltungen/notfunkuebung-april-2024/) Ziel ist es, möglichst lange autark Funkkontakt mit den Kollegen halten zu können.

Um die Übung danach auswerten zu können und etwas anreiz für die OMs zu schaffen, sollen alle QSOs geloggt und bepunktet werden. Einen passenden Contest gibt es natürlich in keine bekannten Software. Nach den Vorgaben vom DARC ist es nur möglich auf einem eigenen Zettel (ist ja im Notfunk auch meist nur verfügbar) oder in einer eigenen Tabelle zu loggen. Eingereicht werden soll das Log aber dennoch im ADIF Format.

Um nun das Papierlog oder die bereits digitale Tabelle in das ADIF Format zu bekommen, habe ich einen kleinen Converter geschrieben, der von CSV in ADIF umwandelt. Um das Log in CSV zu bekommen, kann jedes bekannte Tabellenprogramm benutzt werden und das Dateiformat .csv beim speichern ausgewählt werden. Damit lässt sich das Log universell in mein Programm "CSV to ADIF Converter" einlesen. Das Programm findet ihr auf GitHub: https://github.com/Stiles96/CSV-to-ADIF-Converter

Ein passendes Template für die Notfunkübung habe ich natürlich für den schnellen Import beigefügt.

CSV to ADIF Converter

Notfunk Telefonanlage

Dell Optiplex 3070

der DARC startete vor einiger Zeit eine Beta-Phase für eine Notfunkanlage, die auf Dockerbasis und einem kleinen Linux läuft. Nach der ersten Vorstellung habe ich diese bei mir auf einen DELL Optiplex 3070 installiert. Die Dokumentation ist super und die kleine Telefonanlage lief sehr schnell. (Link: https://www.darc.de/der-club/referate/notfunk/news/nachricht/news/notfunk-telefonanlage-geht-in-den-darc-internen-beta-test-1/)

OpenStreetMap Tile Server

Nach dem die pbx nun läuft, kam die nächste Idee, was würde man benötigen, wenn man irgendwo offline steht? Genau, eine Karte, weil in gedruckter Form hat man ja den Bereich, den man gerade braucht sowieso nicht. Auch den OpenStreetMap Server gibt es als Docker. Die Anleitung und Beispiele sind ausreichend für die Konfiguration. Der Import dauert aber einige Stunden, nach etwa 10h Import konnte ich dann die erste Map aufrufen. Dem Container sollte man etwas mehr Power geben und ich wollte, dass der sich die Map Daten selbst downloaded. Zudem noch ein paar Angeben, wann Tiles neu gerenderd werden und Updates aktiviert, geht aber nur solange, wie auch der Client online ist.

Die Dockerkonfig von mir habe ich mir mal dazu:

 

- name: Create docker volume
  become: true
  docker_volume:
    name: "{{ item }}"
  with_items:
    - osm-data
    - osm-tiles
  register: osmvolume

- name: Import Docker Container
  become: true
  docker_container:
    name: osm-server
    image: overv/openstreetmap-tile-server:{{ osm_tile_server_version }}
    state: started
    restart: none
    restart_policy: none
    interactive: false
    tty: yes
    ports:
      - "8080:80"
    env:
      DOWNLOAD_PBF:  "https://download.geofabrik.de/europe/germany-latest.osm.pbf"
      DOWNLOAD_POLY: "https://download.geofabrik.de/europe/germany.poly"
      OSM2PGSQL_EXTRA_ARGS: "-C 8096"
      THREADS: "16"
    volumes: 'osm-data:/data/database/'
    command: import
  when: osmvolume.changed

- name: Get Docker details
  docker_container_info:
    name: osm-server
  register: result

- name: Run Docker Container
  become: true
  docker_container:
    name: osm-server
    image: overv/openstreetmap-tile-server:{{ osm_tile_server_version }}
    shm_size: 8g
    state: started
    restart: no
    restart_policy: always
    interactive: true
    tty: yes
    ports:
      - "8080:80"
    env:
      OSM2PGSQL_EXTRA_ARGS: "-C 8096"
      THREADS: "16"
      EXPIRY_MINZOOM: "13"
      EXPIRY_TOUCHFROM: "13"
      EXPIRY_DELETEFROM: "19"
      EXPIRY_MAXZOOM: "20"
      UPDATES: "enabled"
      REPLICATION_URL: "https://planet.openstreetmap.org/replication/hour/"
      MAX_INTERVAL_SECONDS: "60"
    volumes:
      - 'osm-data:/data/database/'
      - 'osm-tiles:/data/tiles/'
    command: run
  register: osmrun
  when: not osmvolume.changed and (result.container['Config']['Cmd'] is search("import") and not result.container['State']['Running']) or result.container['Config']['Cmd'] is search("run")

Für das Pre-Rendering führt man im Container folgenden Befehl aus:

render_list -a -m default -z 0 -Z 13 &

In dem Container ist eine kleine Demo vorhanden, die die Karte anzeigt, in meinem Fall Deutschland. Marker und andere Elemente können nicht gesetzt werden. Dadurch kam der nächste Service gleich dazu.

HamNetDB

hamnetdb.net ist eine Datenbank mit allen hamnet Knoten, IPs und Links. Die Knoten und Links werden auch interaktiv auf einer Map angezeigt und es können Höhenprofile berechnet werden. Die ganze Seite Projekt gibt es auch als GitHub Repository: https://github.com/hamnetdb/hamnetdb. Die Installationsanleitung war jetzt nicht unbedingt die beste, aber es ist machbar. Folgende Pakete habe ich auf meinem Ubuntu installiert:

  • apache2
  • perl
  • libdbd-mysql-perl
  • mysql-server
  • mysql-client

Für die ausführung der .cgi Scripten musste der Apache noch etwas angepasst werden. Dazu muss das Modul CGI (a2enmod CGI) aktiviert werden und zusätzlich habe ich in der VirtualHost Config folgendes ergänzt:

<Directory /var/www/hamnet/>
    AddHandler cgi-script .cgi .pl
    AddDefaultCharset UTF-8
    Options FollowSymlinks ExecCGI
    DirectoryIndex index.cgi index.html
    AllowOverride All
    Require all granted
</Directory>

Die anderen Konfigurationen können wie im Github beschrieben übernommen werden. Damit ist die HamNetDB Seite lauffähig. Nun musste nur noch der Verweis her, damit ich auch die lokale OpenSteetMap benutzen kann. Dazu muss eine Datei bearbeitet werden: /var/www/hamnet/osm/hamnetdb-lf.js

Sucht am besten nach openstreetmap und ihr findet einen "if (soure == 3)//hamnet" Block. Nach dem if, fügt ihr den else if Block hier ein und speichert das ganze.

else if (source == "local") //local
{
  var mapnikUrl = 'http://' + window.location.hostname + ':8080/tile/{z}/{x}/{y}.png';
  var mapnikUrl1 = 'http://' + window.location.hostname + ':8080/tile/{z}/{x}/{y}.png';
  var landscapeUrl = 'http://' + window.location.hostname + ':8080/tiles_topo/{z}/{x}/{y}.png';
  var cycleUrl = 'http://' + window.location.hostname + ':8080/tiles_cyclemap/{z}/{x}/{y}.pn';
  var satUrl= 'http://' + window.location.hostname + ':8080/tiles_sat/{z}/{x}/{y}.jpg';
  var mapnikZoom = 16 ;
  var landscapeZoom =16;
  var cycleZoom = 16;
  var satZoom = 11;
}

Nun könnt ihr die source in der URL mit übergeben ==> http://hamnetdbserver/map.cgi?source=local. Damit holt die die Map die Tiles von eurem lokalen Tile Server und das funktioniert auch offline.

Zu Weihnachten gab es eine kleine smarte Wetterstation von Bresser (Link). Eine Einbindung in das Tuya (auch SmartLife) Smart Home ging schnell und die ersten Daten sind auf dem Display, wie auf dem Handy zu sehen.

 

Wetterdaten abfragen

Nun war die Idee, diese Daten auch grafisch am PC dazustellen und diese auch noch ins APRS zu senden. Die Schwirigkeit bestand aber nun darin, die Wetterdaten von der Wetterstation ersteinmal abzufragen. Nach langer Recherche bin ich auf ein paar kleine Projekte gestoßen:

  1. Tuyapi: https://github.com/codetheweb/tuyapi
  2. TuyaAPI: https://bitbucket.org/serkanp/smg.tuyaapi/src/TuyaApi

Beide Projekte gaben mir ein kleinen Grundstein für mein Projekt. Ich erstellte auf https://iot.tuya.com/ einen Account und erstellte mein erstes Projekt (Datacenter: Central Europe Data Center) mit folgenden Services:

  • IoT Core
  • Authirization Token Management
  • Smart Home Scene Linkage

Nach der Erstellung habe ich meine API Zugangsdaten bekommen, diese benötigen wir später für den Code. Zudem muss einmalig das Konto mit der App verknüpft werden, das geht am einfachsten per QR-Code Scan mit dem Handy und schon tauchen die Geräte mit ID im Browser auf.

 

Wetterdaten ablegen

Nachdem wir nun Zugriff auf die Daten haben, müssen wir diese nur abfragen und speichern. Am besten eignet sich eine InfluxDB dafür. Diese habe ich einfach als Docker Container auf einem Ubuntu 22.04 gestartet und ein Bucket angelegt. Die Daten werden dann per HTTP Request in das Bucket übertragen.

 

Wetterdaten anzeigen

Für die Anzeige der Daten habe ich mich für Grafana entschieden, das lässt sich auch einfach per Container betreiben. Die Datenquelle InfluxDB lässt sich dabei spielend einbinden und nach belieben Grafiken erstellen lassen. Das Dashboard habe ich hier zusammengestellt: Grafana Dashboard

Grafana Waether Dashboard

Public URL: http://weather.he-it.eu

 

Wetterdaten an APRS senden

Damit nun auch die Daten an APRS gesendet werden können, muss ein Passcode erstellt werden. Dieses geht ganz einfach hier: https://apps.magicbug.co.uk/passcode/

Das Programm sendet die Wetterdaten als String per Telnet an die APRS Server. Die URL wird als rotate.aprs.net angegeben und verbindet sich mit einem Loadbalancer auf einen der APRS Server.

Die Wetterdaten in APRS sehen wie folgt aus:

APRS Weather Data

 

Das Programm

Nachdem wir alle Punkte zusammen haben, muss das ganze nur noch in ein Programm gebracht werden, was auf einem Server ausgeführt werden kann. Ich habe zudem das als Service verfasst und kann diesen interaktiv auf dem Windows Server laufen lassen.

Der Quellcode befindet sich im Git Repository: https://github.com/Stiles96/WeatherTuyaAPI

Nach dem Clone müssen die passenden Zugangsdaten eingetragen werden, wie das Programm compilet werden und mit dem beiliegenden Batch File als Service installiert werden.