Heute gibt es hier mal ein, so finde ich, spannendes Thema, was ich behandeln möchte: Die Übertragung von Wetterdaten (Temperatur, Luftdruck, Luftfeuchte) als WX-Station zu APRS – genauer in den APRSIS, das Servernetzwerk vom APRS.
Wie fing alles an? Nun, ich habe ein Rudel ESP32-Boards mit entsprechenden Temperatursensoren (DHT22), einer von diesen ist noch mit einem BMP280 ausgestattet parallel, um auch den Luftdruck zu bekommen. Dieses „andersartige Setup“ befindet sich außen auf dem Balkon und dient mir als „Außenfühler“.
Jetzt kam gestern die Idee, ich könnte diese ermittelten Werte doch auch als WX-Stationsdaten in APRS integrieren. Also machte ich mich auf die Suche, wie das denn im Zusammenspiel mit Homeassistant funktionieren könnte.
Um es vorneweg zu sagen: die Lösung ist geschaffen und es kommen Daten an:
Doch mal Schritt für Schritt zur Lösung:
Übermittlung der Daten an APRSIS
Ich fange hier mal „Hinten“ an, nämlich bei der Übermittlung der Daten selbst an APRSIS, da dieses Script an anderen Stellen, die dann im Homeassistant konfiguriert werden, vorhanden sein muss, weil man sich darauf bezieht, also macht das jetzt erstmal Sinn.
Ich habe für diesen Job ein kleines Python-Script geschrieben, welches so aussieht:
import sys
from datetime import datetime
import aprslib
# Zugriff auf die Übergabeparameter
temperature = float(sys.argv[1]) # Erster Parameter
humidity = int(sys.argv[2]) # Zweiter Parameter
pressure = float(sys.argv[3]) # Dritter Parameter
# Temperatur von °C zu Fahrenheit
temperature = (9 * temperature / 5) + 32
# Umrechnung Druck
pressure = pressure * 10
# Aktuelle Zeit
now = datetime.now()
# Ausgabe erzeugen
output = f"DG9VH-13>APRS,TCPIP*:/{now.day:02d}{now.hour:02d}{now.minute:02d}z4913.92N/00650.08E_c...s...g...t{int(temperature):03d}h{humidity:02d}b{int(pressure):04d}P...p...r...Homeassistant Weather by DG9VH (https://dg9vh.de)"
# a valid passcode for the callsign is required in order to send
AIS = aprslib.IS("DG9VH-13", passwd="*****", port=14580) # Passcode muss man sich generieren
AIS.connect()
# send a single status message
AIS.sendall(output)
print(f"Message sent")
Dieses Script legte ich unter /config/scripts/beacon.py ab. Was passiert in diesem Script? Nun, es bekommt als Übergabeparameter die 3 Werte Temperatur, Luftfeuchte und Luftdruck. Man kann das auch dann prima auf der Console ausprobieren, indem man das Script dann mit python3 ./beacon.py 10 56 1023
aufruft. Es wird dann (im Beispiel 10 Grad, 56% und 1023 HPa) an APRSIS übermittelt.
Bereitstellung des Übermittlungsscripts als Kommando im Homeassistant
Der nächste Punkt war die Integration des Aufrufs dieses Scripts in den Homeassistant. Dies erfolgt über eine Ergänzung in der configuration.yaml, welche so aussieht:
shell_command:
send_aprs_data: "/usr/local/bin/python /config/scripts/beacon.py {{ temperature }} {{ humidity }} {{ pressure }}"
Diese beiden Zeilen stellen das Kommando zur Verfügung, damit es anschließend im Homeassistant in einer Automation verwendet werden kann. Man sieht, dass hier mit {{ temperature }} {{ humidity }} {{ pressure }}
dem Programm die Werte als Variablen übergeben werden.
Erstellung der Automatisierung
Der letzte Schritt war jetzt die Erstellung der Automatisierung in der automations.yaml. Hierin wird nun definiert, in welchen Zeitabständen die Übermittlung stattfinden soll und von welchen Entities die Werte genommen werden sollen. Der Codeschnipsel hierzu sieht so aus:
- id: APRS-WX
alias: Send Weather Data to APRS
triggers:
minutes: "/10" # Alle 10 Minuten
trigger: time_pattern
actions:
- data:
temperature: "{{ states('sensor.esphome_web_52ca00_temperature') }}"
humidity: "{{ states('sensor.esphome_web_52ca00_humidity') }}"
pressure: "{{ states('sensor.esphome_web_52ca00_bmp180_pressure') }}"
action: shell_command.send_aprs_data
Wenn man es also so nimmt – recht wenig Aufwand, dafür aber ne lange Zeit der Recherche.
Das Ergebnis bei APRS.fi sieht dann folgendermaßen aus:
Ich habe also die Daten erfolgreich übermittelt und sie werden in der Karte anzeigt.