A small library to communicate with ICOM devices using CI-V protocol
Project description
IU2FRL ICOM CI-V Python Library
Python library for communicating with iCOM radios using CI-V.
Compatible devices
Theorically speaking, all ICOM devices implementing the CI-V protocol should be compatible, in particular, the following devices were tested:
- IC-7300 (fw: 1.42)
- IC-706 MKII
- IC-821H
Usage
1. Installing dependencies
- Install the package using
pip install iu2frl-civ
2. Importing the module
- Import the module using
from iu2frl_civ.device_factory import DeviceFactory
3. Creating the device object
- Initialize the target device using
radio = DeviceFactory.get_repository(radio_address="0x94", device_type=DeviceType.Generic, port="COM10")
[!TIP] Usage of named arguments (like
radio_address="0x94") over positional arguments is highly recommended as it provides better support for future releases or library code reviews
Where:
device_type = DeviceType.Genericis the type of device you want to controlradio_address = 0x94is the transceiver address
Then, additional arguments can be passed:
port = "/dev/ttyUSB0": communication port of the transceiverbaudrate: int = 19200: baudrate of the devicedebug = False: useful to troubleshoot communication issuescontroller_address = "0xE0": address of the controller (this library)timeout = 1: serial port communication timeout in secondsattempts = 3: how many attempts to perform in case of timeout or errorsfake = False: if set to True, the library will use a fake connection to the transceiver (serial commands will be printed to the console and not sent to any port)
4. Use the radio object
Once the device object is created, any supported method can be used, for example:
- Power on the transceiver:
device.power_on() - Get the current frequency:
device.read_operating_frequency()
5. Check the command output
Some commands have an expected value to be returned (like the device.read_operating_frequency()), most returns a boolean value, while other returns nothing (void). If the device does not support a command (or it was not yet implemented), or if some error occurred, an exception is thrown:
NotImplementedError: the current device does not implement this feature yetCivCommandException: something went wrong in the data exchange between the transceiver and the library (probably due to device misconfiguration, faulty cables, etc)CivTimeoutException: the communication timed out (something wrong with wiring or connection parameters like port or baudrate)
6. Debugging
If some commands are not working as expected, the following code can be used to enable debugging:
import logging
logger = logging.getLogger("iu2frl-civ")
logger.setLevel(logging.DEBUG)
Sample code
[!IMPORTANT] Do not rename the
testsfolder or thefake_generic.pyfile, as those are used for testing the library.
Some sample commands are available in the tests folder.
ic7300.py: A simple test script that demonstrates how to use the library to communicate with the IC-7300 transceiver.ic7300_clock.py: A simple script to set the clock of the IC-7300 transceiver by syncing to the PC.ic706_mkii.py: A simple test script that demonstrates how to use the library to communicate with the IC-706 MKII transceiver.fake_generic.py: A simple test script that fakes a connection to transceiver, used to validate builds.
Developer info
Any help is welcome to either add more devices or improve existing ones, please see the developers section, accessible via relative link or GitHub Link
Device-specific documentation
IC-821H
General information
- The device seems not to support the
set_operating_frequencymethod, so you should usesend_operating_frequencyinstead. - The device seems not to reply to CI-V commands (or maybe my unit is defective?), so the library does not acknowledge any command.
- The device is quite slow in responding to commands, so you should use a longer timeout (default is 1 second).
Programming a memory channel
To program a memory channel, you can use the set_memory_mode method. For example, to set 145.600 FM to channel 79:
print("- Writing 145.600 MHz to memory 79")
radio.set_memory_mode(79)
time.sleep(1)
radio.send_operating_frequency(145600000)
time.sleep(1)
radio.set_operating_mode(OperatingMode.FM)
time.sleep(1)
radio.memory_write()
time.sleep(1)
Scan modes
To scan through memory channels, you first set the channel mode, then you toggle the scan mode:
print("- Setting memory mode")
radio.set_memory_mode(i + 1)
time.sleep(1)
print("- Starting scan")
radio.start_scan()
time.sleep(10)
print("- Stopping scan")
radio.stop_scan()
To scan trough frequencyes, first set the frequency mode, then toggle the scan mode:
print("- Setting VFO A")
radio.set_vfo_mode(VFOOperation.SELECT_VFO_A)
time.sleep(1)
print("- Starting scan")
radio.start_scan()
time.sleep(10)
print("- Stopping scan")
radio.stop_scan()
Project info
Original project
This project was forked and then improved from: siyka-au/pycom
Contributors
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file iu2frl_civ-0.3.0.tar.gz.
File metadata
- Download URL: iu2frl_civ-0.3.0.tar.gz
- Upload date:
- Size: 39.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2dd80d2423c8b5408fda8eadf743018f20a68dc6bcfa5ea58c5b13491eca9b1d
|
|
| MD5 |
15a42364e128272257c49d1576f87c2c
|
|
| BLAKE2b-256 |
15deed7b53fffae488a51eb46734e4c4dc9dde058767bbb0ec60f0f88575ab2b
|
Provenance
The following attestation bundles were made for iu2frl_civ-0.3.0.tar.gz:
Publisher:
publish.yml on iu2frl/iu2frl-civ
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
iu2frl_civ-0.3.0.tar.gz -
Subject digest:
2dd80d2423c8b5408fda8eadf743018f20a68dc6bcfa5ea58c5b13491eca9b1d - Sigstore transparency entry: 267947612
- Sigstore integration time:
-
Permalink:
iu2frl/iu2frl-civ@8ee2b1f39c882c063ea0c23a0ef4a1b7b4663936 -
Branch / Tag:
refs/tags/0.3.0 - Owner: https://github.com/iu2frl
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@8ee2b1f39c882c063ea0c23a0ef4a1b7b4663936 -
Trigger Event:
release
-
Statement type:
File details
Details for the file iu2frl_civ-0.3.0-py3-none-any.whl.
File metadata
- Download URL: iu2frl_civ-0.3.0-py3-none-any.whl
- Upload date:
- Size: 47.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4550534a3d0c06b8e6dee49c59c7140cc63a71234c6c5c2c39dd7ef97077e217
|
|
| MD5 |
3eaf8340b52bdc2a0e5eab4db6f6ac7e
|
|
| BLAKE2b-256 |
eaf338517a3e53fb603769fc26d96adc70014038d0037e5e96e0a66c08ec608f
|
Provenance
The following attestation bundles were made for iu2frl_civ-0.3.0-py3-none-any.whl:
Publisher:
publish.yml on iu2frl/iu2frl-civ
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
iu2frl_civ-0.3.0-py3-none-any.whl -
Subject digest:
4550534a3d0c06b8e6dee49c59c7140cc63a71234c6c5c2c39dd7ef97077e217 - Sigstore transparency entry: 267947631
- Sigstore integration time:
-
Permalink:
iu2frl/iu2frl-civ@8ee2b1f39c882c063ea0c23a0ef4a1b7b4663936 -
Branch / Tag:
refs/tags/0.3.0 - Owner: https://github.com/iu2frl
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@8ee2b1f39c882c063ea0c23a0ef4a1b7b4663936 -
Trigger Event:
release
-
Statement type: