Skip to main content

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.Generic is the type of device you want to control
  • radio_address = 0x94 is the transceiver address

Then, additional arguments can be passed:

  • port = "/dev/ttyUSB0": communication port of the transceiver
  • baudrate: int = 19200: baudrate of the device
  • debug = False: useful to troubleshoot communication issues
  • controller_address = "0xE0": address of the controller (this library)
  • timeout = 1: serial port communication timeout in seconds
  • attempts = 3: how many attempts to perform in case of timeout or errors
  • fake = 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 yet
  • CivCommandException: 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 tests folder or the fake_generic.py file, 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_frequency method, so you should use send_operating_frequency instead.
  • 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

  • IU2FRL as owner of the library and the initial implementation for IC-7300
  • IU1LCU for extensive testing on the IC-7300
  • ch3p4ll3 for implementing the DeviceFactory code and testing on the IC-706 MKII

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

iu2frl_civ-0.3.0.tar.gz (39.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

iu2frl_civ-0.3.0-py3-none-any.whl (47.6 kB view details)

Uploaded Python 3

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

Hashes for iu2frl_civ-0.3.0.tar.gz
Algorithm Hash digest
SHA256 2dd80d2423c8b5408fda8eadf743018f20a68dc6bcfa5ea58c5b13491eca9b1d
MD5 15a42364e128272257c49d1576f87c2c
BLAKE2b-256 15deed7b53fffae488a51eb46734e4c4dc9dde058767bbb0ec60f0f88575ab2b

See more details on using hashes here.

Provenance

The following attestation bundles were made for iu2frl_civ-0.3.0.tar.gz:

Publisher: publish.yml on iu2frl/iu2frl-civ

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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

Hashes for iu2frl_civ-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4550534a3d0c06b8e6dee49c59c7140cc63a71234c6c5c2c39dd7ef97077e217
MD5 3eaf8340b52bdc2a0e5eab4db6f6ac7e
BLAKE2b-256 eaf338517a3e53fb603769fc26d96adc70014038d0037e5e96e0a66c08ec608f

See more details on using hashes here.

Provenance

The following attestation bundles were made for iu2frl_civ-0.3.0-py3-none-any.whl:

Publisher: publish.yml on iu2frl/iu2frl-civ

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page