Monday, December 1, 2025

CQ world wide DX CW contest 2025

Nice to see this type of action on 10m. 

Once again, the CQ WW CW contest has come to an end. Although the conditions were not as favorable as last year, it was still a fantastic event. Some highlights included contacting fellow blogger Bas, who was using his new contest call PA6G on 20m, as well as reaching ZD7VJ on St. Helena Island and VP8NO on the Falkland Islands. 


 

I was pleasantly surprised to connect with many South American stations on 10m on Sunday afternoon. I’m pleased to report there were no station issues at all—everything ran very smoothly.


 

Monday, November 24, 2025

Python and what I have been up too.

 

A snippet of the shutdown python script as actions are taken. 

Python and what I’ve been up to… well, let me tell you!
I’ve honestly surprised myself with the automation I’ve built for starting up and shutting down my contesting setup. Before Python, the startup routine was a long chain of manual steps: launching VSPE and waiting, then clicking on Win4Icom Suite and waiting again, then starting N1MM+ and waiting some more, then opening Firefox, navigating to the Reverse Beacon Network, entering my call, checking that I was spotted, and refreshing it every 10 minutes.

Now? Thanks to Python, all of that happens with a single mouse click. I LOVE IT!

 With one mouse click my Kasa plug turns on, powers on my Astron power supply and Pi4B and it begins its startup. Then VSPE starts, then Win4icom starts, N1MM+ starts and finally Firefox opens to Reverse beacon network were it logs in and then enters my call sign to show who is hearing my CQ contest calling and will refresh every 10 minutes. 

Now If you’re curious about the hiccups and challenges I ran into along the way, keep reading. Or, if you’d rather skip ahead, feel free to jump to the end where I share some of my upcoming Python-and-amateur-radio project—you might be surprised!

Let’s start with the Wi-Fi plug that kicks off the entire startup process. I needed a Python library to communicate with my Kasa plug—easy enough. Then I needed to find the plug’s IP address—again, no problem. But one day, my Python terminal that handles the whole start-and-stop sequence suddenly threw an error related to the Wi-Fi plug. After some investigating, I realized our router had restarted and reassigned the plug a new IP address. That completely broke my script.

More research led me to a great solution: I could assign a name to the plug and have Python search for the device by name, then automatically discover whatever IP address the router had given it. Problem solved—elegantly.

With the Wi-Fi plug sorted out, I moved on to scripting the rest of the startup sequence. I added every program I needed, in the exact order they had to launch, and it worked beautifully… until I noticed that some programs loaded slower than others. That meant certain tasks weren’t finished before the next program in the chain started, and everything just froze. The fix turned out to be simple: insert time delays between launches to give each program the breathing room it needs.

Next came Win4Icom. Tom, VE2FSQ, does an incredible job keeping his software updated—there’s a new version roughly every month with improvements and bug fixes. But once a new version came out, my Python script kept opening the old one. To fix that, I wrote code that automatically checks for the latest installed version every time and launches that one instead.

Then I ran into another issue: occasionally Python wasn’t shutting down my Icom 7610 correctly through the Win4Icom software. That meant the radio was being abruptly disconnected when the Wi-Fi plug powered off my power supply. NOT GOOD. So instead of relying on Win4Icom for shutdown, I added the Icom CI-V shutdown command directly into my Python script. That ensured the 7610 powered down properly every single time.

My Pi4B is also tied into the Wi-Fi plug, but that part is simple—when the plug turns on, the Pi boots normally, no Python needed. Shutting the Pi down, however, is a different adventure involving Windows and Python… and I’ll save that story for the next post.

As promised, here’s a preview of what I’m working on next. When a contest is over, I normally have to:

  1. Go to the 3830 scoring site and manually enter my score.

  2. Generate a CAB file and submit it to the contest sponsor.

  3. Generate an ADIF file within N1MM+.

  4. Submit that ADIF to my logging program Amateur Radio Contest Log then do the same for LOTW, Club Log, CWops, and QRZ.com

I’m developing a Python program that will do all of that automatically:
• Login to 3830, fill in the band breakdowns, multipliers, total contacts and multipliers and final score.
• Generate a CAB file from within N1MM+.
• Generate an ADIF file from N1MM+ and load it into Amateur Radio Contest Log.
• From within Amateur Contest Log program, automatically open Club Log and LOTW and submit the logs.
• Then log into QRZ.com and CWops and submit the score there as well.

All with one mouse click—while I sit back and watch it happen.

My next post will be dealing with the contest shutdown process. At this point I am just starting the new project I mentioned above.  

Monday, November 17, 2025

Welcome back KE9V

 Jeff welcome back to the blog sphere I for one have missed your insight, my morning coffee has been enhanced by your read on things....even though at this end I may be to much tech.....:) 

Friday, November 14, 2025

Step one in my Python coding adventure



 

In my first post regarding my Python adventure, I shared how I wanted to use python coding in the shack. As my readers know I am an avid CW contester and before a contest begins I have 5 programs that need to be launched. The issue is if I launch them out of order or if one program has an issue things get all screwed up, and I have to start all over again. In doing so, most of the time I need to go into some programs and reconnect some com ports and clear lots of error messages. My first Python project will be one double-click on a desktop icon that will get all my contest stuff up and running smoothly in the right order. 

The approach I am using is to write python code to start each individual program. Then save those in a file. This will get my whistle wet with python coding, both with success and some head scratching. At this point I have coded out most of my programs so they start. Once that is fully completed, it will be grouping them all together into one process. 

In a nutshell, here is the plan:

- Turn on a Wi-Fi plug which powers on my power supply and Pi4B power supply

- Start my VSPE virtual com port program and minimize it.

- Start my Wn4icom program which also starts my Icom 7610 radio. 

- Start my N1MM contest software.

- Then finally Firefox will start, open Reverse Beacon Network, log me in, set up search for my call and set it to refresh my call sign spots every 10 minutes.   

Lets take a fast look at the python coding for the WiFi plug. 

 import asyncio
from kasa import SmartPlug

async def main():
    plug = SmartPlug("10.0.0.71")  # Replace with your plug's IP address
    await plug.update()
    await plug.turn_on()
    print("Plug turned on"


asyncio.run(main())

For the Kasa smart WiFi plug by TP link to work I had to first download into python the kasa library. I opened up python and entered the code below...well actually cut and paste. 

 pip install python-kasa


Now below in a nut shell is what the code is all about for the Kasa WiFi plug to turn on. 

1. Python loads the  needed modules. (asyncio and SmartPlug)

2. Program defines async functions or in English connecting to the wifi plug could take time and this allows things not to freeze if the process takes time. 

So now modules are loaded and it knows some actions could take time. 

3. Now asyncio.run(main()) runs  and this is what happens.

Smart plug is created for IP address 10.0.071

The plugs state is defined (on or off)

The plug is turned on via network command 

A message printed in python code window "plug turned on" 

Program closes. 

In closing I am not by any means a pythonista regarding code and I am sure many who are can poke holes in the coding or what I left out regarding what to explain. This is my first attempt at this game and I was actually shocked that it worked. BUT your input will and always is welcomed. 

Next post is about the learning curve, hiccups and added lines of code for smoothness and reliable start up.