aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dot_local/bin/executable_set-ic7300-time.py86
1 files changed, 86 insertions, 0 deletions
diff --git a/dot_local/bin/executable_set-ic7300-time.py b/dot_local/bin/executable_set-ic7300-time.py
new file mode 100644
index 0000000..cf4ecf1
--- /dev/null
+++ b/dot_local/bin/executable_set-ic7300-time.py
@@ -0,0 +1,86 @@
+#!/usr/bin/env python3
+# horrible python script to set time and date on the IC7300
+# or other Icom radios that use the same protocol.
+# I made this script because the IC7300 has a faulty RTC battery and it does not have
+# ethernet connection and NTP client like the 7610, 705, 9700, R8600, etc.
+# This script sets the time slightly wrong because you cannot set seconds, only minutes.
+
+# I'm a sysadmin and not a programmer and this script violates ALL the programming
+# best practices. ALL of them. Feel free to make it much better.
+# IZ4UFQ
+#
+# cleaned up in 2026 by Ryan Kavanagh VA2RKV
+
+civaddress="0x94" #this is the default IC7300 address. Change to match your radio config.
+baudrate = 19200 #change to match your radio serial speed
+#serialport = "/dev/ttyUSB0" # Serial port of your radios serial interface. See comment below
+
+# you can set a serial port by id so that it always connect to the correct radio, usefeul if you have more than
+# one usb serial port connected (I have 8 of them)
+serialport = "/dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_IC-7300_02048039-if00-port0"
+
+
+#Import libraries we'll need to use
+import time
+import serial
+import struct
+
+# Get time in GMT. If you want local time change to "t = time.localtime()"
+t = time.localtime()
+offset = time.localtime().tm_gmtoff
+
+# extract strings for year, day, month, hour, minute
+# with a leading zero if needed
+year = str(t.tm_year)
+month = str(t.tm_mon).rjust(2,'0')
+day = str(t.tm_mday).rjust(2,'0')
+hour = str(t.tm_hour).rjust(2,'0')
+minute = str(t.tm_min).rjust(2,'0')
+off_hour = "%02d" % abs(offset // 3600)
+off_minute = "%02d" % (offset % 3600)
+off_sign = "00" if offset > 0 else "01"
+
+# set date, ci-v command is 0x94
+command = ["0xFE", "0xFE", civaddress, "0xE0", "0x1A", "0x05", "0x00" ]
+command.append("0x94")
+command.append("0x"+year[0:2])
+command.append("0x"+year[2:])
+command.append("0x"+month)
+command.append("0x"+day)
+command.append("0xFD")
+
+with serial.Serial(serialport, baudrate) as ser:
+ for cmd in command:
+ senddata = int(bytes(cmd, 'UTF-8'), 16)
+ ser.write(struct.pack('>B', senddata))
+
+# set time, ci-v command is 0x95
+# you CANNOT set seconds, so unless you want to wait for the minute mark
+# you'll end up with a time that is set incorrectly by less than one minute
+# I prefer to set time incorrectly than to wait for up to 59 seconds
+
+command = ["0xFE", "0xFE", civaddress, "0xE0", "0x1A", "0x05", "0x00" ]
+command.append("0x95")
+command.append("0x"+hour)
+command.append("0x"+minute)
+command.append("0xFD")
+
+with serial.Serial(serialport, baudrate) as ser:
+ for cmd in command:
+ senddata = int(bytes(cmd, 'UTF-8'), 16)
+ ser.write(struct.pack('>B', senddata))
+
+# set UTC offset, ci-v command is 0x96
+# Format described on page 19-11 of IC-7300 "Full Manual"
+
+command = ["0xFE", "0xFE", civaddress, "0xE0", "0x1A", "0x05", "0x00" ]
+command.append("0x96")
+command.append("0x"+off_hour)
+command.append("0x"+off_minute)
+command.append("0x"+off_sign)
+command.append("0xFD")
+
+with serial.Serial(serialport, baudrate) as ser:
+ for cmd in command:
+ senddata = int(bytes(cmd, 'UTF-8'), 16)
+ ser.write(struct.pack('>B', senddata))