The worlds #1 unfinished contest logger *According to my daughter Corinna.
- Not1MM
- What and why is Not1MM
- Current state
- Our Code Contributors ✨
- List of should be working contests
- Recent Changes (Polishing the Turd)
- Flatpak
- Installation
- After the install
- Various data file locations
- The Database
- Station Settings dialog (It's REQUIRED Russ)
- Selecting a contest (It's REQUIRED Russ)
- Configuration Settings
- Logging WSJT-X FT8/FT4/ETC and FLDIGI RTTY contacts
- Sending CW
- Editing macro keys
- cty.dat and QRZ lookups for distance and bearing
- Other uses for the call field
- The Windows
- Cabrillo
- ADIF
- Recalulate Mults
- ESM
- Call History Files
- Contest specific notes
Not1MM's interface is a blatant ripoff of N1MM. It is NOT N1MM and any problem you have with this software should in no way reflect on their software.
Not1MM attempts to be a useable amateur radio, or HAM, contest logger. It's written in Python, 3.9+, and uses Qt6 framework for the graphical interface and SQLite for the database.
The primary target for this application is Linux. It may be able to run on other platforms, BSD, Mac and Windows. But I don't have a way, or desire, to directly support them.
Currently this exists for my own personal amusement. I've recently retired after 35+ years working for 'The Phone Company', GTE -> Verizon -> Frontier. And being a Gentleman of Leisure, needed something to do in my free time. I'm a casual contester and could not find any contesting software for Linux that I wanted to use. There is Tucnak which is very robust and mature. It just wasn't for me.
In short... Don't. There are much better general purpose QSO logging programs. Try QLog or CQRLog.
The current state is "BETA".
I've used it for quite a few contests, and was able to work contacts and submit cabrillos at the end. There are still quite a few features I'd like to implement. And "BETA" is a sort of get out of jail free badge for coders. A safety net for when the program craps the bed. I'm only one guy, so if you see a bug let me know.
I've recently added portions of code to watch for WSTJ-X and fldigi QSOs. I've added the Weekly RTTY Test, So RTTY could be tested. Also added FT8/4 and RTTY to ARRL Field Day and ARRL VHF. Found it works better if you don't use FlDigi for making the QSO at all. Rather just using it as a RTTY modem and sending the text for it to send from Not1MM using the function keys or ESM.
Of note, state QSO parties. I haven't worked any yet. And no one has submitted a PR adding one... So there you go. In the near future I'll probably add California, guess where I live, and the 4 states QSO party.
I wish to thank those who've contributed to the project. Below is an automatically generated, 'cause I'm lazy, list of those who've submitted PR's.
- General Logging (There are better general loggers like QLog, KLog, CQRLog)
- 10 10 Fall CW
- 10 10 Spring CW
- 10 10 Summer Phone
- 10 10 Winter Phone
- ARRL 10M
- ARRL 160M
- ARRL DX CW, SSB
- ARRL Field Day
- ARRL Sweepstakes CW, SSB
- ARRL VHF January, June, September
- CQ 160 CW, SSB
- CQ WPX CW, RTTY, SSB
- CQ World Wide CW, RTTY, SSB
- CWOps CWT
- DARC Xmas
- Helvetia
- IARU Fieldday R1 CW, SSB
- IARU HF
- ICWC MST
- Japan International DX CW, SSB
- K1USN Slow Speed Test
- LZ DX
- NAQP CW, RTTY, SSB
- Phone Weekly Test
- RAEM
- RAC Canada Day
- REF CW, SSB
- Stew Perry Topband
- Weekly RTTY
- Winter Field Day
- [24-12-15] Fixed Button focus policy in the bandmap window.
- [24-12-14] Changed method of detecting fldigi QSOs. See docs.
- [24-12-12] Add a try exception for a unicode decode error.
- [24-12-11-1] Add RTC to RAC Canada Day, ARRL VHF, ARRL Field Day, ARRL SS, ARRL DX, 10 10
- [24-12-11] Add RTC to IARU HF, IARU Field Day, DARC XMAS, CQ WW, CQ WPX
- [24-12-9] Add RTC to Winter Field Day, Stew Perry, REF, RAEM, NAQP, LZ-DX, JIDX
- [24-12-8-2] Add RTC to ARRL 10M, Tweaked cabrillo file output.
- [24-12-8-1] Changed cabrillo names for Weekly RTTY, CW Ops CWT and K1USN SST.
- [24-12-8] Fix: Weekly RTTY mults. Add RTC to Weekly RTTY.
- [24-12-6] Add RTC to K1USN. -[24-12-5-1] ARRL 160 gets rtc.
- [24-12-5] Add 'real time' score posting to external sites.
- [24-12-4] Merged PR from @alduhoo Add STATION_CALLSIGN field to ADIF output
- [24-12-3-1] Adding ARRL 160
- [24-12-3] Add button to bandmap to delete marked spots.
See CHANGELOG.md for prior changes.
I've tried for a couple days to get not1mm to build as a flatpak. I've failed. It keeps failing at building numpy. If you happen to be a flatpak savant, please feel free to look at com.github.mbridak.not1mm.yaml and python3-modules.yaml and clue me into the black magic needed to get it to work.
not1mm requires:
- Python 3.9+
- PyQt6
- libportaudio2
- libxcb-cursor0 (maybe... Depends on the distro)
You should install these through your distribution's package manager before continuing.
I've taken the time to install some common Linux distributions into a VM and noted the minimum steps needed to install not1mm.
Ubuntu 22.04 LTS, 23.04 and 24.04 LTS
sudo apt update
sudo apt upgrade
sudo apt install -y python3-pip python3-numpy libxcb-cursor0 libportaudio2
python3 -m pip install -U pip
# Logout and back in
pip3 install PyQt6
pip3 install not1mm
sudo apt update
sudo apt upgrade
sudo apt install -y libportaudio2 pipx libxcb-cursor0
pipx install not1mm
pipx ensurepath
sudo apt update
sudo apt upgrade
sudo apt install -y libportaudio2 pyqt6-dev-tools python3-pip
pip install --break-system-packages not1mm
source .profile
Fedora 38, 39 and 40
sudo dnf upgrade --refresh
sudo dnf install python3-pip pipx portaudio
pipx install not1mm
pipx ensurepath
sudo dnf upgrade --refresh
sudo dnf install python3-pip pipx python3-pyqt6 portaudio
pipx install not1mm
pipx ensurepath
This software is a Python package hosted on PyPI, and installable with the pip or pipx command. If this is your first exposure to Python packaging you can get all the details from:
- The PyPA
- Install packages in a virtual environment using pip and venv
- Installing stand alone command line tools
In short, You should install stuff into a Python virtual environment. Newer Linux distros will make you do this unless you include a command line argument akin to '--break-my-system' when using pip. I'm not telling you to use pipx. But... Use pipx.
Assuming you have only Python installed, your path to pipx is:
# First get pip installed. Either with apt or dnf, or the ensurepip command.
python3 -m ensurepip
# Update the pip that was just installed.
python3 -m pip install --upgrade pip
# Install pipx
python3 -m pip install --user pipx
python3 -m pipx ensurepath
Then installing not1mm is as simple as:
# Install not1mm
pipx install not1mm
If you need to later update not1mm, you can do so with:
# Update not1mm
pipx upgrade not1mm
Installing from GitHub source.
Since this is packaged for PyPI, if you want to work on your own source branch, after cloning from github you would:
pip install --upgrade pip
pip install setuptools
pip install build
source rebuild.sh
from the root directory. This installs a build chain and a local editable copy of not1mm.
There's two ways to launch the program from the local editable copy.
You can either be in the root of the source directory and type:
python not1mm
or be in some other directory and just type:
not1mm
You can now open a new terminal and type not1mm
. On it's first run, it may or
may not install a lovely non AI generated icon, which you can later click on to
launch the application.
WARNING: The script not1mm is installed in '/home/mbridak/.local/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
If you do, just logout and back in, or reboot.
Warning: Ignoring XDG_SESSION_TYPE=wayland on Gnome. Use QT_QPA_PLATFORM=wayland to run on Wayland anyway.
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
You can use your package manager to load libxcb-cursor0.
If that's not an option, you can export an environment variable and launch the app like this:
mbridak@vm:~$ export QT_QPA_PLATFORM=wayland; not1mm
For a more permanent solution you can place the line
export QT_QPA_PLATFORM=wayland
in your home directories .bashrc file. Then
after logging out and back in you should be able to launch it normally.
After all the configuration stuff below and before operating in a contest, you might want to update the CTY and SCP files. You can do this by choosing FILE->Update CTY and FILE->Update MASTER.SCP
If your system has an XDG_DATA_HOME
environment variable set, the database and
CW macro files can be found there. Otherwise they will be found at
yourhome/.local/share/not1mm
Configuration file(s) can be found at the location defined by XDG_CONFIG_HOME
.
Otherwise they will be found at yourhome/.config/not1mm
The database holds... wait for it... data... I know shocker right. A database can hold one or many contest logs. It also holds the station information, everything shown in the Station Settings dialog. You can have one database for the rest of your life. Filled with hundreds of contests you've logged. Or, you can create a new database to hold just one contest. You do You Boo.
On the initial running, a database is created for you called ham.db
. This, and
all future databases, are located in the data directory mentioned above.
You can create a new database by selecting File
> New Database
from the main
window, and give it a snazzy name. Why limit yourself. Hell, create one every
day for all I care. You can manage your own digital disaster.
You can select a previously created databases for use by selecting
File
> Open Database
.
After initial run of the program or creating a new database you will need to fill out the Station Settings dialog that will pop up.
You can fill it out if you want to. You can leave our friends behind. 'Cause your friends don't fill, and if they don't fill. Well, they're no friends of mine.
You can fill. You can fill. Everyone look at your keys.
Station information can be changed any time by going to
File
> Station Settings
and editing the information.
Select File
> New Contest
Select File
> Open Contest
You can edit the parameters of a previously defined contest by selecting it as
the current contest. Then select File
> Edit Current Contest
. Click OK
to
save the new values and reload the contest. Cancel
to keep the existing
parameters.
To setup your CAT control, CW keyer, Callsign lookups, select
File
> Configuration Settings
The tabs for groups and n1mm are disabled and are for future expansion.
For callsign lookup, Two services are supported. QRZ and HamQTH. They require a username and password, Enter it here.
Choose the sound output device for the voice keyer.
Under the CAT
TAB, you can choose either rigctld
normally with an IP of
127.0.0.1
and a port of 4532
. Or flrig
, IP normally of 127.0.0.1
and a
port of 12345
. None
is always an option, but is it really? There's an
onscreen icon for CAT status. Green good, Red bad, Grey neither.
Under the CW
TAB, There are three options. cwdaemon
, which normally uses IP
127.0.0.1
port 6789
. pywinkeyer
which normally uses IP 127.0.0.1
port 8000
and
CAT
which if your radio supports it, sends Morse characters via rigctld.
Under the Cluster
TAB you can change the default AR Cluster server, port and
filter settings used for the bandmap window.
Work has started on N1MM udp packets. So far just RadioInfo, contactinfo, contactreplace and contactdelete.
When entering IP and Ports, enter them with a colon ':' between them. You can enter multiple pairs on the same line if separated by a space ' '.
You can define which bands appear in the main window. Those with checkmarks will appear. Those without will not.
On the Options TAB you can:
- Select to use Enter Sends Message (ESM), and configure it's function keys.
- Select whether or not to use Call History info.
- Select whether or not to send XML score info to online scoreboards.
not1mm listens for WSJT-X UDP traffic on the Multicast address 224.0.0.1:2237. No setup is needed to be done on not1mm's side. That's good because I'm lazy.
not1mm polls for fldigi QSOs via it's XMLRPC interface. It does this in a rather stupid
way. It just keeps asking what was the last QSO and compares it to the previous response.
If it's different, it's new.
not1mm watches for fldigi qso's by watching for UDP traffic from fldigi on 127.0.0.1:9876.
The F1-F12 function keys be sent to fldigi via XMLRPC. Fldigi will be placed into TX mode, the message will be sent and a ^r will be tacked onto the end to place it back into RX mode.
Unlike WSJT, fldigi needs to be setup for this to work. The XMLRPC interface needs to be active. And in fldigi's config dialog go to CONTESTS -> General -> CONTEST and select Generic Contest. Make sure the Text Capture Order field says CALL EXCHANGE.
Other than sending CW by hand, you can also send predefined CW text messages by pressing F1 - F12. See next section on Editing macro keys.
If you need to send something freeform, you can press CTRL-SHIFT-K
, this will
expose an entry field at the bottom of the window which you can type directly into.
When you're done you can either press CTRL-SHIFT-K again, or press the Enter Key to
close the field.
To edit the macros, choose File
> Edit Macros
. This will open your systems
registered text editor with current macros loaded. When your done just save the
file and close the editor. The file loaded to edit, CW, SSB or RTTY, will be
determined by your current operating mode and contest. Each contest gets it's own
copy of the macros.
After editing and saving the macro file. You can force the logger to reload the
macro file by toggeling between Run
and S&P
states.
You can include a limited set of substitution instructions.
Macro | Substitution |
---|---|
{MYCALL} | Sends the station call. |
{HISCALL} | Send what's in the callsign field. |
{SNT} | Sends 5nn (cw) or 599 (ssb) |
{SENTNR} | Sends whats in the SentNR field. |
{EXCH} | Sends what's in the Sent Exchange field when contest is defined. |
'#' | Sends serial number. |
The macros when used with voice, will also accept filenames of WAV files to
play, excluding the file extension. The filename must be enclosed by brackets.
For example [CQ]
will play cq.wav
, [again]
will play again.wav
. The wav
files are stored in the operators personal data directory. The filenames must be
in lowercase. See Various data file locations
above for the location of your data files. For me, the macro [cq]
will play
/home/mbridak/.local/share/not1mm/K6GTE/cq.wav
The current wav files in place are not the ones you will want to use. They sound like an idiot. You can use something like Audacity to record new wav files in your own voice.
Aside from the [filename]
wav files, there are also NATO phonetic wav files
for each letter and number. So if your macro key holds
{HISCALL} {SNT} {SENTNR}
and you have entered K5TUX in callsign field during
CQ WW SSB while in CQ Zone 3. You'll here Kilo 5 Tango Uniform X-ray, 5 9 9, 3.
Hopefully not in an idiots voice.
When a callsign is entered, a look up is first done in a cty.dat file to determin the country of origin, geographic center, cq zone and ITU region. Great circle calculations are done to determin the heading and distance from your gridsquare to the grographic center. This information then displayed at the bottom left.
After this, a request is made to QRZ for the gridsquare of the callsign. If there is a response the information is recalculated and displayed. You'll know is this has happened, since the gridsquare will replace the word "Regional".
- [A Frequency] You can enter a frequency in kilohertz. This will change the band you're logging on. If you have CAT control, this will change the frequency of the radio as well.
- [CW, SSB, RTTY] You can set the mode logged. If you have CAT control this will also change the mode on the radio.
- [OPON] Change the operator currently logging.
You must press the SPACE bar after entering any of the above.
Key | Result |
---|---|
[Esc] | Stops cwdaemon from sending Morse. |
[PgUp] | Increases the cw sending speed. |
[PgDown] | Decreases the cw sending speed. |
[Arrow-Up] | Jump to the next spot above the current VFO cursor in the bandmap window (CAT Required). |
[Arrow-Down] | Jump to the next spot below the current VFO cursor in the bandmap window (CAT Required). |
[TAB] | Move cursor to the right one field. |
[Shift-Tab] | Move cursor left One field. |
[SPACE] | When in the callsign field, will move the input to the first field needed for the exchange. |
[Enter] | Submits the fields to the log. Unless ESM is enabled. |
[F1-F12] | Send (CW/RTTY/Voice) macros. |
[CTRL-S] | Spot Callsign to the cluster. |
[CTRL-M] | Mark Callsign to the bandmap window to work later. |
[CTRL-G] | Tune to a spot matching partial text in the callsign entry field (CAT Required). |
[CTRL-SHIFT-K] | Open CW text input field. |
[CTRL-=] | Log the contact without sending the ESM macros. |
[CTRL-W] | Clears the input fields of any text. |
Window
>Log Window
The Log display gets updated automatically when a contact is entered. The top half is a list of all contacts.
The bottom half of the log displays contacts sorted by what's currently in the call entry field. The columns displayed in the log window are dependant on what contests is currently active.
You can double click a cell in the log window and edit its contents.
You can also Right-Click on a cell to bring up the edit dialog.
You can not directly edit the multiplier status of a contact. Instead see the
next section on recalculating mults. If you change the callsign make sure the
WPX
field is still valid.
Window
>Bandmap
Put your callsign in the top and press the connect button.
The bandmap window is, as with everything, a work in progress. The bandmap now follows the VFO.
VFO indicator now displays as small triangle in the frequency tickmarks. A small blue rectangle shows the receivers bandwidth if one is reported.
Clicked on spots now tune the radio and set the callsign field. Previously worked calls are displayed in red.
Window
>Check Window
As you enter a callsign, the Check Window will show probable matches to calls either in the MASTER.SCP file, your local log or the recent telnet spots. The MASTER.SCP column will show results for strings of 3 or more matching characters from the start of the call string. The local log and telnet columns will show matches of any length appearing anywhere in the string.
Clicking on any of these items will change the callsign field.
You can control the VFO on a remote rig by following the directions listed in the link below. It's a small hardware project with a BOM of under $20, and consisting of two parts.
- Making the VFO...
- Then...
Window
>VFO
Click on File
> Generate Cabrillo
The file will be placed in your home directory. The name will be in the format of:
StationCall
_ContestName
_CurrentDate
_CurrentTime
.log
So for me it would look like:
K6GTE_CANADA-DAY_2023-09-04_07-47-05.log
Look, a log eh?
This outlines some differences between ARRL Field Day and Canada Day.
File
> Generate ADIF
Boom... ADIF
StationCall
_ContestName
_Date
_Time
.adi
After editing a contact and before generating a Cabrillo file. There is a Misc menu option that will recalculate the multipliers incase an edit had caused a change.
I caved and started working on ESM or Enter Sends Message. To test it out you can
go to FILE -> Configuration Settings
Check the mark to Enable ESM and tell it which function keys do what. The keys will need to have the same function in both Run and S&P modes. The function keys will highlight green depending on the state of the input fields. The green keys will be sent if you press the Enter key. You should use the Space bar to move to another field.
The contact will be automatically logged once all the needed info is collected and the QRZ (for Run) or Exchange (for S&P) is sent.
I've started work on using 'call history files'. To test it, you can
go to FILE -> Configuration Settings
Place a check in the Use Call History
box. Call history files are very specific to the contest you are working. Example files can be obtained from n1mm's website. They have a searchbox so you can find the contest you are looking for. If you are feeling masocistic, you can craft your own. The general makeup of the file is a header defining the fields to be used, followed by by lines of comma separated data.
An example file excerpt looks like:
!!Order!!,Call,Name,State,UserText,
#
# 0-This is helping file, LOG what is sent.
# 1-Last Edit,2024-08-18
# 2-Send any corrections direct to [email protected]
# 3-Updated from the log of Marsh/KA5M
# 4-Thanks Bjorn SM7IUN for his help.
# 5-Thanks
# NAQPCW
# NAQPRTTY
# NAQPSSB
# SPRINTCW
# SPRINTLADD
# SPRINTNS
# SPRINTRTTY
# SPRINTSSB
AA0AC,DAVE,MN,Example UserText
AA0AI,STEVE,IA,
AA0AO,TOM,MN,
AA0AW,DOUG,MN,
AA0BA,,TN,
AA0BR,,CO,
AA0BW,,MO,
The first line is the field definition header. The lines starting with a #
are comments. Some of the comments are other contests that this file also works with.
This is followed by the actual data. If the matched call has UserText
information, that user text is populated to the bottom left of the logging window.
So if one were to go to FILE -> LOAD CALL HISTORY FILE
and choose a downloaded call history file for NAQP and typed in the call AA0AC while operating in the NAQP, after pressing space, one would see:
Where the Name and State would auto-populate and the UserText info apprears in the bottom left.
I found it might be beneficial to have a section devoted to wierd quirky things about operating a specific contests.
This was a pain in the tukus. There are so many elements to the exchange, and
one input field aside from the callsign field. So I had to write sort of a
'parser'. The parser moves over your input string following some basic rules and
is re-evaluated with each keypress and the parsed result will be displayed in
the label over the field. The exchange looks like 124 A K6GTE 17 ORG
, a Serial
number, Precidence, Callsign, Year Licenced and Section. even though the
callsign is given as part of the exchange, the callsign does not have to be
entered and is pulled from the callsign field. If the exchange was entered as
124 A 17 ORG
you would see:
You can enter the serial number and precidence, or the year and section as
pairs. For instance 124A 17ORG
. This would ensure the values get parsed
correctly.
You do not have to go back to correct typing. You can just tack the correct
items to the end of the field and the older values will get overwritten. So if
you entered 124A 17ORG Q
, the precidence will change from A to Q. If you need
to change the serial number you must append the precidence to it, 125A
.
If the callsign was entered wrong in the callsign field, you can put the correct callsign some where in the exchange. As long as it shows up in the parsed label above correctly your good.
The best thing you can do is play around with it to see how it behaves.
In the Sent Exchange
field of the New Contest dialog put in the Precidence,
Call, Check and Section. Example: A K6GTE 17 ORG
.
For the Run Exchange macro I'd put {HISCALL} {SENTNR} {EXCH}
.
In the New/Edit Contest dialog, in the exchange field put just your Lat and Lon.
for me 33N117W. And in the exchange macro put # {EXCH}
.