initial commit - proof of concept

master
nq4t 1 year ago
commit fa4717d907

@ -0,0 +1,25 @@
# Log4OM Web Status
This python program will take UDP messages blasted at it from Log4OM and will write it to a HTML file. It will
continually update this file as messages come in. It requires you to let Log4OM automatically send status packets.
### Usage
Place the script on a system that can hear UDP from Log4OM and has a way of putting the resulting HTML file on a webserver
as fast as possible.
### Basic Operation
Log4OM has a feature that has it send out UDP messages automatically as long as specific conditions are met. This python
script/program will take in the messages sent at it's IP and parse a few things out of the XML. It writes this to an
HTML file every time a message comes in; so the HTML generated is set to auto-reload every 5 seconds. It currently displays
the following in a very basic way:
- Your current VFO frequency and opearating mode.
- Your TX offset/split if it exists
If no data is received from Log4OM, because you turned your rig off or shutdown Log4OM; it will indicate your radio is
off and wait for data to come back. Support is planned to show if rig is in transmit.
The "Radio Off" message happens after 15 seconds of no data. This is done by checking the elapsed time since the timestamo
was last updated; which happens every time a message comes in.

@ -0,0 +1,56 @@
from threading import *
import time
import xml.etree.ElementTree as ET
import socket
UDP_IP = "0.0.0.0"
UDP_PORT = 2242 # Default Log4OM UDP Out Port
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))
tot = time.time()
def monitor():
global tot
while True:
tc = time.time() - tot # time since last timestamp
if tc < 15: # 15 seconds
time.sleep(6)
else:
writehtml(f"Radio off")
time.sleep(30)
def log4om():
global tot
global rstatus
while True:
data, addr = sock.recvfrom(1024)
root = ET.fromstring(data.decode("utf-8"))
freq = int(root.find("Freq").text)
tx_freq = int(root.find("TXFreq").text)
mode = root.find("Mode").text
f = freq / 100
tf = tx_freq / 100
sv = tf - f # Determines split value
if sv > 0:
writehtml(f"Frequency: {f}kHz {mode}<br>Up: {sv:.2f} kHz")
elif sv < 0:
sv = sv * -1 # Invert negative numbers
writehtml(f"Frequency: {f}kHz {mode}<br>Down: {sv:.2f} kHz")
else:
writehtml(f"Frequency: {f}kHz {mode}")
tot = time.time() #timestamp
time.sleep(.1)
def writehtml(rs):
header = "<html>\n<head>\n<title>FT-1000MP Status</title>\n<meta http-equiv=\"refresh\" content=\"5\">\n</head>\n<body>\n"
with open("/var/www/log/radio.html", "w") as html: # Modify file location as needed.
html.write(header + rs + "\n</body>\n</html>")
T = Thread(target=monitor,daemon=True)
L = Thread(target=log4om)
L.start() # Start the UDP thread
time.sleep(5) # Wait 5 seconds in case Log4OM is already running.
T.start() # Start monitor
Loading…
Cancel
Save