Jun 27, 2022
In an effort to consolidate some posts from elswhere, here is one I wrote in 2020 about the uBitx v5 I built.
uBitx by AG7SU on Digital Oddballs Radio Club
This was my first HF radio, and I made lots of great contacts on it before I upgraded to an Icom IC7300.
Some quick details on modifications I made to this radio:
- IF Tap to use an external SDR as a panadapter
- Switched RX port, shares antenna with a wide bandwidth SDR, grounds on TX
- DSP S-Meter/Spectrum Scope
- KD8CEC Firmware
- 3.2" Nextion Touch SCreen
- P-Channel MOSFET reverse polarity protection & fused power input
- Built in USB Soundcard
- External tuner control for my LDG antenna tuner.
uBitx by AG7SU on Digital Oddballs Radio Club
Jun 26, 2022
In my last post (Hamshack Hotline Weather Alert ... in October, yikes!) I described the way I set up an extension on my asterisk server to play a stream of the local weather broadcast.
Since putting this system together, I've moved from a stream hosted online to one captured locally using an rtl_sdr dongle.
This replaces the 'Find a weather broadcast stream' part of my previous post, instead of using the URL of an external weather broadcast stream, I'm creating my own.
RTL_SDR Dongle and Antenna
I'm using a generic rtl dongle, these are a product originally intended to be used as a TV tuner for a market outside the US. Someone created drivers that allow it to be used as a fairly decent SDR (Software Defined Radio) to capture RF signals the original designers of the hardware never intended.
My rtl dongle is plugged into my server and passed through to one of my more multi-purpose VMs. The rtl gets a crudely made 2ish meter dipole made with a bnc to banana plug adapter, this is hung vertically down the back of a cabinet.
This setup requires
rtl_sdr to be installed
A script named wxstream.sh is placed in my
/usr/local/share/ directory with contents:
rtl_fm -f 162.550m -M fm - 2> /dev/null | lame -r -s 24 -m m -b 24 --cbr - - | ezstream -c /home/tyler/kig98.xml
The rtl_fm command can be edited to change frequency to listen to whatever you're interested in capturing.
The xml file referenced in the previous script looks like this:
<?xml version="1.0" encoding="UTF-8"?>
This could be named/edited for whatever makes sense for whatever stream is being captured.
A systemd service is created as /etc/systemd/system/wxstream.service with contents:
Both icecast2.service and wxstream.service are enabled at startup in systemd.
With all this running, I have a mp3 stream of the live capture of KIG98 available at http://myserver:8000/KIG98.mp3 to which I can point an extension on my PBX.
Oct 11, 2021
Hamshack Hotline (HH) is a SIP phone system set up by a group of Amateur Radio Operators (hams). There are different use cases for HH, for me it is an excuse to run a PBX at home and play with phones.
I run an instance of FreePBX in a VM on my main server (Dell R610) FreePBX is CentOS + Asterisk + a nice web UI.
Some of what I did to build my Weather Alert extension is done from the UI and some is done by manipulating Asterisk's config files directly.
My goal was to create an extension button on my hard phones (desk sets) that would play a stream of the local NOAA Weather Radio broadcast. I wanted the LED controlled by the Busy Lamp Field (BLF) for that button to light up with a specific pattern if there is a weather alert for my area. This would give me visual indication of potential hazardous weather affecting the area, and one press access to the weather broadcast to listen to.
For this how-to I will assume you are running FreePBX, I'm on version 126.96.36.199
Set up Music On Hold (MoH), queue and extension
Edit Config Files, Create Custom Device State
/etc/asterisk/extensions_custom.conf for editing
- add the following lines:
exten => UNUSED_EXTENSION,hint,Custom:DEVICE
same => 1,Goto(from-internal,ABOVE_EXTENSION,1)
- UNUSED_EXTENSION: Another unused extension
- DEVICE: Create a name for the Custom Device State
- ABOVE_EXTENSION: The Extension you created in the above section
example from my PBX:
exten => 101,hint,Custom:WXAlert
same => 1,Goto(from-internal,6000,1)
Install/Set-up control script
The control script queries NOAA's API for active alerts for a selected 'zone'
usage: wxalert [-h] -z ZONE -d DEVICE
-h, --help show this help message and exit
-z ZONE, --zone ZONE NOAA Weather Zone
-d DEVICE, --device DEVICE
Custom device state to target
If there is an active alert it will set the state of the device passed into it with the
-d flag to an appropriate state for the highest severity of active alerts.
Source code for the control scipt can be found here
The fastest way to install the control script is to
sudo pip install asterisk_wxalert
Once installed you can add an entry into the root user's crontab so the script runs regularly:
*/5 * * * * /usr/bin/wxalert -z ZONE -d DEVICE
example from my PBX:
*/5 * * * * /usr/bin/wxalert -z WAZ039 -d WXAlert
Your NOAA Forecast Zone can be found on this site
It will be in the form WAZ039 (2 Letter state, The letter Z, then the 3 digits from the map of your state above)
Phone set-up will differ between phones, but for the most part, pointing one of your BLF buttons at the extension created in
/etc/asterisk/extensions_custom.conf in my case
101 should get you the desired behavior. The BLF LED will illuminate with the status set by the control script, and pressing the button will call the extension that immediately forwards to the MoH Queue.
Hopefully this gets you at least part of the way toward a working implementation of this system. I will treat this as a living document, and will update it based on my own experiences and feedback from anyone who tries to follow the directions. Feel free to email me at the address listed on my QRZ page, or message me on the HH Discord server.
Thanks and 73, Tyler - AG7SU
Oct 02, 2021
My introduction to Chatbots, Asynchronous programming
One of my pet 'projects' is an online community (currently on Discord) called the Digital Oddballs Radio Club (DORC)
We're a group of hams who are into computers, programming and all kinds of other fun stuff. Being such a group, congregating in an online chatroom, I figured we needed an equally DORCy chatbot.
DORCBot sits in our Discord server, and accepts several different commands. DORCBot will tell you what the solar forcast is using the
!solar command. DORCBot will also give you a list of the 5 most recent DORCs who were spotted/reported on the air by other hams, this uses data from one of my other projects.
DORCBot is meant to be a way for members of the club to bring their development projects into the chatroom.
One of the neatest things that DORCBot will do uses an API and data model developed by one of our members. Andrew, KC2G's Propagation Site gives predictions of useable frequencies over the entire globe, it is an amazing project you should definitely check out.
DORCBot will grab data from Andrew's API to return the Maximum Observed Frequency between two stations. If you have your Discord display name in
name_callsign format, any time you give a function that normally takes two callsigns as input only one callsign, DORCBot will assume you want to use your own callsign as the other argument, and pull it from your display name. This means that if I set my display name to
Tyler AG7SU all I have to do to get a prediction of propagation to any other station/grid is issue the command
!mof CALLSIGN or
Lessons, New Experiences
Before working on DORCBot I had had no experience with Github Actions, CI/CD or working on development projects with other people. Each of these have been great learning experiences for me.
DORCBot is a Python program, for ease of deployment it is running inside a docker container. When a commit is pushed/a Pull Request sent to the Github repository tests are run and a new docker image is built and tagged with the commit hash. This means that I can pull and test a specific commit/PR seconds after it has been pushed.
When a commit is pushed with a
vX.X tag to the
main branch A production docker image is built and tagged with the version number and also with
Using Watchtower on the server that runs the production instance of DORCBot means that not long after a new production image is built it is in production and available on our Discord server.
Before DORCBot, most of my limited programming experience has been with small command line programs, or with web applications, Flask in particular. A chatbot, at least the way I wrote DORCBot, is a lot like a command line application, it mostly ingests/outputs text. Instead of print statements to output text, however, everything has to go through an extra layer, integration with Discord's API.
More to Come
As part of being a place for DORCs to bring their projects together/into the chat room, DORCBot is under continued development. New features are being added whenever we think to do so.
Oct 02, 2021
What is PylogCQ, and why?
PylogCQ is a curses based TUI logging program for Amateur Radio use.
I started writing PylogCQ because I wanted a dead simple logging program that I could use from the command line, and remotely. PylogCQ uses the
npyscreen library to build it's UI and
Hamlib for CAT control.
PylogCQ is meant to be simple.
PylogCQ exposes the
cq endpoint when installed.
If no rig control arguments are passed to
cq the TUI offers basic contact (QSO) information fields to the user for input.
Frequency and Mode input is retained between QSOs, PylogCQ assumes you haven't changed these things unless you tell it you have. PylogCQ will also assume a perfect 599 signal report both ways if nothing is input. QSO time/date are recorded at the time of logging. These all combine to result in extremely fast logging of QSOs, leaving the user free to work the radio and make contacts.
If a hamlib
rigctld server is specified, as:
cq -r 127.0.0.1 -p 4534 PylogCQ reads the frequency and mode from a connected radio.
PylogCQ writes each QSO to a running swap (recovery) file in JSON format, and converts that file to an ADIF on clean exit.
PylogCQ is available on the Python Package Index (PyPI)
python3 -m pip install pylogcq