pskreporter adapter
This commit is contained in:
parent
a4b2ea29ee
commit
1e4477dfe5
13
docker/containers/pskreporter-to-mqtt.dockerfile
Normal file
13
docker/containers/pskreporter-to-mqtt.dockerfile
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
FROM python:3.13
|
||||||
|
|
||||||
|
# External config
|
||||||
|
ENV MQTT_HOST=
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
RUN pip install paho-mqtt
|
||||||
|
|
||||||
|
# The script itself
|
||||||
|
COPY ./scripts/pskreporter-to-mqtt /pskreporter-to-mqtt.py
|
||||||
|
|
||||||
|
# Run config
|
||||||
|
CMD ["sh", "-c", "python /pskreporter-to-mqtt.py $MQTT_HOST"]
|
@ -18,3 +18,12 @@ services:
|
|||||||
environment:
|
environment:
|
||||||
- MODE=ft8
|
- MODE=ft8
|
||||||
- MQTT_HOST=${MQTT_HOST}
|
- MQTT_HOST=${MQTT_HOST}
|
||||||
|
|
||||||
|
pskreporter_to_mqtt:
|
||||||
|
build:
|
||||||
|
context: ../..
|
||||||
|
dockerfile: docker/containers/pskreporter-to-mqtt.dockerfile
|
||||||
|
restart: unless-stopped
|
||||||
|
env_file: .env
|
||||||
|
environment:
|
||||||
|
- MQTT_HOST=${MQTT_HOST}
|
59
scripts/pskreporter-to-mqtt
Executable file
59
scripts/pskreporter-to-mqtt
Executable file
@ -0,0 +1,59 @@
|
|||||||
|
#! /usr/bin/env python3
|
||||||
|
import argparse
|
||||||
|
import sys
|
||||||
|
import logging
|
||||||
|
import json
|
||||||
|
import paho.mqtt.client as mqtt # pip install paho-mqtt
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
def main() -> int:
|
||||||
|
# Handle program arguments
|
||||||
|
ap = argparse.ArgumentParser(prog='pskreporter-to-mqtt', description='Reflects pskreporter spots to an MQTT broker')
|
||||||
|
ap.add_argument("mqtt_broker", help="MQTT broker to connect to")
|
||||||
|
ap.add_argument('-v', '--verbose', help='Enable verbose logging', action='store_true')
|
||||||
|
args = ap.parse_args()
|
||||||
|
|
||||||
|
# Configure logging
|
||||||
|
logging.basicConfig(
|
||||||
|
level=logging.DEBUG if args.verbose else logging.INFO,
|
||||||
|
format='%(levelname)s: %(message)s',
|
||||||
|
)
|
||||||
|
|
||||||
|
# Connect to the MQTT broker
|
||||||
|
mqtt_client = mqtt.Client()
|
||||||
|
mqtt_client.connect(args.mqtt_broker)
|
||||||
|
|
||||||
|
# Connect to the pskreporter MQTT broker
|
||||||
|
pskreporter_client = mqtt.Client()
|
||||||
|
pskreporter_client.connect("mqtt.pskreporter.info")
|
||||||
|
|
||||||
|
# Subscribe to the pskreporter MQTT broker
|
||||||
|
pskreporter_client.subscribe("pskr/filter/v2/+/+/+/#")
|
||||||
|
|
||||||
|
# Handle incoming pskreporter spots
|
||||||
|
def on_message(client, userdata, message):
|
||||||
|
payload = json.loads(message.payload)
|
||||||
|
logger.debug(f"Received spot: {payload}")
|
||||||
|
|
||||||
|
# Sanitize the payload
|
||||||
|
sanitized = {
|
||||||
|
"frequency_khz": float(payload["f"]) / 1000,
|
||||||
|
"mode": payload["md"],
|
||||||
|
"db": int(payload["rp"]),
|
||||||
|
"timestamp": float(payload["t"]),
|
||||||
|
"spotter": payload["rc"],
|
||||||
|
"spotter_grid": payload["rl"],
|
||||||
|
"spotted": payload["sc"],
|
||||||
|
"spotted_grid": payload["sl"],
|
||||||
|
}
|
||||||
|
mqtt_client.publish(f"radio/spots/pskreporter/{sanitized['mode']}/{sanitized['spotted']}", json.dumps(sanitized))
|
||||||
|
|
||||||
|
pskreporter_client.on_message = on_message
|
||||||
|
pskreporter_client.loop_forever()
|
||||||
|
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
sys.exit(main())
|
Loading…
x
Reference in New Issue
Block a user