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.  


 




Tuesday, November 11, 2025

Having a snake of a time.

 


In retirement, I want to keep my mind sharp, and to do that, I have to challenge myself. My latest adventure is learning Python coding.
A little history about Python coding: the founder, Guido van Rossum, a Dutch programmer, came from the Netherlands. His goal was to birth a code that was easy to read general purpose programming language. Why the name Python and not Rossum, you ask? The name came from Monty Python, and he felt that gave it a light-hearted name. In the Zen of Python, this phrase sums up the code experience: "Simple is better than complex." Oh, and those who code in Python are known as Pythonista's and I am striving to become just that.
So why all of a sudden my interest in coding......well, it has to do with my son Ben, who is a whiz kid at this stuff. Funny story.....Ben went to the University of Toronto and majored in cyber security. He wanted to get into a top tier program and had to have some interviews. He was given a few exams and then called in for an interview. The interview was conducted by the department head, the lead professor and the admin for the program. The main purpose he was called in was because the most complex question and the main question on the exam he left blank. When asked, he told them the question had incorrect coding and he was not going to waste time on it! He was asked to explain, and he did, and was told Thank you for coming in. Ben called me after the interview and told me the story. I could not believe what he did and was about to give him a piece of my mind. Before that could happen, he told me the professor called later in the day and told  he was accepted, no more interviews or exams were required, and they were changing the question as he was correct.
In a phone conversation with Ben, he challenged me to pass some of my time learning Python coding. He said it was very user friendly and it could really help with my ham radio adventure. I took him up on the offer, and now I am in the process of coding to make ham radio at VE9KK a little more automated.  More on how that is coming very soon, as I have already produced some coding that has shocked me and is helping VE9KK's CW contesting station become a “Geek shack”