Re: [Hamlib-developer] Python API
Library to control radio transceivers and receivers
Brought to you by:
n0nb
From: Adrian <vk...@gm...> - 2025-03-30 12:43:55
|
Well true, you can use rigctl direct to radio or rigctld server allowing lan / internet access. I use rigctld with node-red full time . 73 vk4tux On 30/3/25 22:25, Dave Baxter wrote: > > Not sure, but you don't need rigctld, to use rigctl. At least not in > my limited experience, only using hamlib on Linux. > > I'll have a play... > > 73. > Dave > > > On Sun, 30 Mar 2025, 13:19 Adrian, <vk...@gm...> wrote: > > Isn't rigctl a rigctld client ? It works for me that way.. > > On 30/3/25 21:27, Dave Baxter via Hamlib-developer wrote: >> >> Steve. >> >> If you've already got "rigctld" open as a daemon in the >> background, you do not need to issue "rigctl" commands, just open >> a TCP socket to the daemon, and issue commands, and receive >> status replies via that route. >> >> rigctld and rigctl are different animals. >> >> You can have also more than one rigctld running, listening on >> different TCP/IP ports, for different radio's. >> >> As Erik wrote, they can even be on a different machine, so long >> as the address/port is accessible from "your" machine, the radio >> and it's local computer (even a Pi) could be the other side of >> the planet if needed. >> >> Python is very network friendly in that way, and it works very >> well too. "localhost:port" is your friend... >> >> This crude code below, is what I used a while ago to get the old >> FT-736r to appear as a readable radio, to keep gpredict happy >> back in the hamlib 3.3 days. No longer needed with hamlib 4.x >> >> ------------------------------------------------------------------------ >> >> import socket >> >> def Main(): >> >> # Local temporary string storage. >> subfreq = "435000000" >> mainfreq = "145000000" >> >> # GPredict side host:port >> # Well away from any default Hamlib port. >> gphost = 'localhost' >> gpport = 50000 >> >> # HamLib side host:port >> # Well away from any default Hamlib port. >> hlhost = 'localhost' >> hlport = 50736 >> >> # Create a Server socket for GPredict to connect to as a client. >> gpSocket = socket.socket() >> gpSocket.bind((gphost,gpport)) >> gpSocket.listen(3) >> print ("FT-736 Helper listening on port " + str(gpport)) >> >> # Create a Client socket, to connect to the HamLib server. >> # NOTE! rigctld MUST be started before this script is run! >> # Like this... >> >> # $ rigctld -m110 -r /dev/ttyUSB4 -s 4800 -T localhost -t 50736 >> # (post HamLib 4.x use -m1010 for the model number.) >> >> while True: >> gpconn, gpaddr = gpSocket.accept() >> # print ("Connection from: " + str(gpaddr).rstrip()) >> >> # The Hamlib backend will automatically have done this, >> but it >> # will be needed if we turn CAT off, when Gpredict >> "Disengages" >> # and we later "Engage" the radio. >> # Not needed for Hamlib 3.3 or later, it does the right thing >> # by default. >> >> # hlcmd = "w \\0x00\\0x00\\0x00\\0x00\\0x00\n" >> # print ("Sending " + hlcmd) >> # hlSocket.sendall(hlcmd.encode()) >> >> # NOTE! If this is used, rigctld "Expects" a reply from >> the rig, >> # that will never arrive. So there will be a delay of >> some 2 seconds >> # or more before it returns to us. >> >> hlSocket = socket.socket() >> hlSocket.connect((hlhost,hlport)) >> print ("Linked to rigctld") >> >> while True: >> gpcmd = gpconn.recv(1024).decode() >> if not gpcmd: >> break >> print ("From Gpredict: " + gpcmd.rstrip()) >> >> if gpcmd[0] == "F": >> # Set Main frequency: Remember the value. >> mainfreq = (gpcmd[1:]).lstrip() >> # code here to send to Hamlib >> hlSocket.sendall(gpcmd.encode()) >> reply = hlSocket.recv(1024).decode() >> # print ("To Gpredict: " + reply.rstrip()) >> gpconn.sendall(reply.encode()) >> >> elif gpcmd[0] == "I": >> # Set Sub frequency: Remember the value. >> subfreq = (gpcmd[1:]).lstrip() >> # code here to send to Hamlib >> hlSocket.sendall(gpcmd.encode()) >> reply = hlSocket.recv(1024).decode() >> # print ("To Gpredict: " + reply.rstrip()) >> gpconn.sendall(reply.encode()) >> >> elif gpcmd[0] == "f": >> # fake read of the main frequency >> reply = mainfreq + "\n" >> # print ("To Gpredict: " + reply.rstrip()) >> gpconn.sendall(reply.encode()) >> >> elif gpcmd[0] == "i": >> # fake read of the sub frequency >> reply = subfreq + "\n" >> # print ("To Gpredict: " + reply.rstrip()) >> gpconn.sendall(reply.encode()) >> >> elif gpcmd[0] == "q": >> print ("Unlinking from rigctld") >> # hlcmd = "w \\0x00\\0x00\\0x00\\0x00\\0x80\n"ri >> # See earlier notes at lines 45 and 55. >> hlSocket.sendall(gpcmd.encode()) # or hlcmd >> >> else: >> hlSocket.sendall(gpcmd.encode()) >> reply = hlSocket.recv(1024).decode() >> # print ("To Gpredict: " + reply.rstrip()) >> gpconn.sendall(reply.encode()) >> >> gpconn.close() >> >> >> if __name__ == '__main__': >> Main() >> >> ------------------------------------------------------------------------ >> >> Heck, if I can do it, etc... No need to comment on bad Python >> practices, this was all my own work mistookes included, but it >> worked very well indeed. >> >> As above, no longer needed for the Hamlib 4.x, the local >> frequency memory is now implemented within the hamlib backend for >> the 736, and also it keeps the rig CAT port open between so long >> as at least one application itself stays connected to that >> instance of rigctld (if just to avoid the annoying beeps from the >> rig!) >> >> I could never find a reliable way to detect if the needed daemon >> was already running and if not, start it from within Python, >> though I'm sure it can be done, just the doc's are somewhat >> impenetrable to someone who is not a pro snake charmer!. >> >> That code was itself invoked from a bash script that started the >> daemon, started the Python helper tool, and then launched Gpredict. >> >> Killing stuff off in the reverse order, when Gpredict was itself >> exited/ended. >> >> Best of all, it is entirely cross platform, others used it on >> various Windows machines, while I was doing this on Linux. >> >> 73. >> >> Dave G0WBX. >> >> >> On 30/03/2025 08:53, Stephen Pattinson via Hamlib-developer wrote: >>> Hi Erik, >>> Thanks for responding. >>> My Python 3 app is starting rigctld effectively in the >>> background using the subprocessPopen() mechanism. Then to >>> retrieve parameters from the radio, it is running >>> subprocess.Run() which effectively executes "rigctl -m 2 f" for >>> example to get the VFO frequency by capturing the response, but >>> firing off a windows EXE program every second is pretty awful. I >>> assumed I could via the API I assumed was available, open a >>> channel/pipe/whatever and effectively do what ever rigctl is >>> doing internally. >>> I've looked at the API references and web pages, but they seem >>> convulsively C. I see tantalizing references to python bindings >>> (I'm not sure what that means) and in the Debian world I see a >>> python3-hamlib library, but of course I'm looking for a Windows >>> solution. >>> Am I looking for something that doesn't exist Erik? >>> 73 Steve >>> VK3SPX >>> >>> >>> On 30/03/2025 18:32, Erik Icket wrote: >>>> Hi Steve, >>>> >>>> One way to obtain a better segregation between your Python app >>>> and the rig, >>>> is to go via the rigctld daemon. >>>> Once the daemon runs (local or remote), you may open a socket >>>> to it and >>>> issue your commands. >>>> For example, to know the frequency, just issue a write to >>>> socket with "f\n" >>>> contents. >>>> >>>> It is not a straight program to rig interface, as you are >>>> looking for. >>>> However, it does not require to launch the rigctl app each time >>>> you issue a >>>> command. >>>> >>>> g'day ! >>>> Erik >>>> ON4PB >>>> >>>> -----Original Message----- >>>> From: Stephen Pattinson via Hamlib-developer >>>> <ham...@li...> >>>> <mailto:ham...@li...> >>>> Sent: Saturday, 29 March 2025 09:06 >>>> To: ham...@li... >>>> Subject: [Hamlib-developer] Python API >>>> >>>> Hi, >>>> I have written a Python (3.12.3) to talk to my IC7300 via Hamlib >>>> (V4.6.2) in a Windows 10 environment, but I'm just issuing >>>> "rigctl" >>>> commands and capturing the response. This works fine, but it's >>>> rather crude. >>>> Of course I would like to use the API which I believe is >>>> available, but I >>>> cannot find how to download the necessary additional software >>>> or library, or >>>> find the documentation for the Python API. >>>> I have looked at >>>> "https://hamlib.sourceforge.net/manuals/4.3/index.html" >>>> <https://hamlib.sourceforge.net/manuals/4.3/index.html>, but >>>> this seems >>>> exclusively C Ironically, the most pertinent info I retrieved >>>> from a search >>>> is from the Google AI (Sigh!) which suggests I need >>>> "hamlib-python", but I >>>> can't find where the AI has scooped up this information. >>>> If anybody can point me at installation instructions and >>>> documentation for >>>> the API, I would be grateful. >>>> Thanks/73 >>>> Steve VK3SPX >>>> >>>> >>>> _______________________________________________ >>>> Hamlib-developer mailing list >>>> Ham...@li... >>>> https://lists.sourceforge.net/lists/listinfo/hamlib-developer >>>> >>> >>> >>> >>> _______________________________________________ >>> Hamlib-developer mailing list >>> Ham...@li... >>> https://lists.sourceforge.net/lists/listinfo/hamlib-developer >> >> >> _______________________________________________ >> Hamlib-developer mailing list >> Ham...@li... >> https://lists.sourceforge.net/lists/listinfo/hamlib-developer > |