The Maxspect ICV6 aquarium controller uses the Syna-G mobile app to connect the device to a home WiFi network. The app's built-in "Transmitting" feature (SmartConfig / EspTouch) frequently fails — it hangs indefinitely without ever completing the WiFi provisioning.
This script (icv6_wifi_config.py) bypasses the Syna-G app entirely. It was built by reverse-engineering the Syna-G APK and the ICV6's ESP8266 WiFi module firmware. The ICV6 exposes an AT command interface over UDP port 1025 when in AP (Access Point) mode. The script sends AT commands directly to the device to configure the home WiFi SSID and password, set a hostname, and reboot the device — all from the command line.
- The ICV6 WiFi module is an ESP8266 running custom Maxspect/Lanvee firmware (branded "W20S").
- AT commands are sent via UDP on port 1025, terminated with
\r\n. - Query syntax:
at+command=?— Set syntax:at+command=value - The device operates in sta_ap mode: it runs its own AP and connects to your home network simultaneously.
- Python 3.10+ (uses
str | Nonetype hints) — no third-party dependencies, stdlib only. - Linux — the script uses the
ip route getcommand for source IP detection. It will still work on macOS/Windows if your computer only has one network interface active, but the source IP binding logic is Linux-specific.
- Long-press the power button on the ICV6 for more than 5 seconds.
- Hold until the red LED becomes steady (stops blinking).
- The device is now broadcasting its own WiFi access point.
- Open your computer's WiFi settings and scan for available networks.
- Look for a network named
maxspect-XXXXXXXXXXXX(e.g.,maxspect-I6A1B014788). The suffix is the device's serial number. - Connect to it — there is no password (open network).
- Your computer will get an IP in the
192.168.5.xrange (DHCP pool:192.168.5.100–192.168.5.110). The device gateway is192.168.5.1.
Tip: If you also have an Ethernet cable plugged in, the script handles dual-interface routing automatically by binding to the correct source IP.
python3 icv6_wifi_config.py --ssid "YourWiFiName" --password "YourWiFiPassword"This runs a 6-step process:
- Verify device — confirms the ICV6 is reachable at
192.168.5.1 - Read current config — displays existing STA credentials and connection status
- Set WiFi credentials — writes the SSID and password to the device
- Ensure WiFi mode — confirms or sets
sta_apmode (AP + STA simultaneously) - Set hostname — sets the device hostname (default:
maxspect-icv6) - Reboot — restarts the device to apply settings and connect to your home network
After reboot (~10 seconds), the device will attempt to connect to your home WiFi while keeping its own AP active.
python3 icv6_wifi_config.py --ssid "YourWiFiName" --password "YourWiFiPassword" --no-rebootSaves the credentials on the device but does not reboot. Useful for verifying settings before applying. You can reboot manually later:
python3 icv6_wifi_config.py --at "at+reboot"| Option | Description |
|---|---|
--ssid SSID |
Home WiFi network name to connect the ICV6 to. Required for provisioning (must be paired with --password). |
--password PASSWORD |
Home WiFi password. Required when --ssid is specified. |
--hostname NAME |
Device hostname. Default: maxspect-icv6. This is the name the device will use on your home network (visible in your router's client list). |
--ip IP |
Device IP address. Default: 192.168.5.1. Only change this if the ICV6 AP uses a different gateway (e.g., 192.168.4.1 after a factory reset). |
--status |
Display the full device configuration (firmware version, WiFi mode, AP/STA settings, MAC addresses, hostname, etc.) and exit. |
--no-reboot |
Save credentials without rebooting. The device will not attempt to connect to your home WiFi until it is rebooted. |
--at CMD |
Send a raw AT command to the device and print the response. For advanced use / debugging. |
python3 icv6_wifi_config.py --statusSample output:
=======================================================
ICV6 Device Status
=======================================================
Firmware Version : w20s,v1.02(Oct 28 2015)
WiFi Mode : sta_ap
AP SSID/Config : maxspect-I6A1B014788,,open,1,show
AP IP Address : 192.168.5.1,255.255.255.0,192.168.5.1
STA WiFi Config : RbklHome_IoT,Bangkok2015!
STA Status : got_ip
STA IP Address : 192.168.50.xxx
MAC Addresses : 3c:e9:0e:cf:2f:b9,3e:e9:0e:cf:2f:b9
Hostname : maxspect-icv6
...
=======================================================
python3 icv6_wifi_config.py --ssid "MyNetwork" --password "MySecret" --hostname "reef-light-1"# Query firmware version
python3 icv6_wifi_config.py --at "at+ver=?"
# Query current WiFi mode
python3 icv6_wifi_config.py --at "at+wifi_mode=?"
# Query STA connection status
python3 icv6_wifi_config.py --at "at+sta_status=?"python3 icv6_wifi_config.py --ip 192.168.4.1 --statusOnce the device reboots and connects to your home WiFi, it will have a new IP assigned by your router. To discover it, send a $identify UDP broadcast on your home network:
python3 -c "
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
s.settimeout(5)
s.sendto(b'\$identify', ('255.255.255.255', 1025))
print(s.recvfrom(1024))
"The response contains the device's new IP, MAC address, and firmware version.
You can also check your router's DHCP client list for a device named maxspect-icv6 (or whatever hostname you set).
| Command | Query | Set | Description |
|---|---|---|---|
at+ver |
at+ver=? |
— | Firmware version |
at+wifi_mode |
at+wifi_mode=? |
at+wifi_mode=sta_ap |
WiFi mode (ap, sta, sta_ap) |
at+sta_conf |
at+sta_conf=? |
at+sta_conf=SSID,PASSWORD |
STA (home WiFi) credentials |
at+sta_status |
at+sta_status=? |
— | STA connection state (got_ip, connecting, ap_not_found) |
at+sta_ip |
at+sta_ip=? |
— | STA IP address (from home router) |
at+ap_conf |
at+ap_conf=? |
at+ap_conf=NAME,,open,1,show |
AP configuration |
at+ap_ip |
at+ap_ip=? |
at+ap_ip=IP,MASK,GW |
AP IP address |
at+mac |
at+mac=? |
— | MAC addresses (STA, AP) |
at+hostname |
at+hostname=? |
at+hostname=NAME |
Device hostname |
at+mode |
at+mode=? |
at+mode=VALUE |
Network mode (TCP/UDP) |
at+port |
at+port=? |
at+port=VALUE |
TCP server port |
at+uart_conf |
at+uart_conf=? |
— | UART configuration |
at+smartconf |
at+smartconf=? |
— | SmartConfig state |
at+reboot |
— | at+reboot |
Reboot the device |
at+default |
— | at+default |
Factory reset (use with caution!) |
Warning:
at+defaultperforms a full factory reset. The AP SSID will change tolanvee_cf2fb9, the AP IP will change to192.168.4.1, and all saved WiFi credentials will be erased.
| Problem | Solution |
|---|---|
Device not reachable |
Make sure you are connected to the ICV6 AP WiFi (maxspect-*). Check with ping 192.168.5.1. |
(no response) on AT commands |
The device may not be in AP mode. Long-press the power button >5 seconds until the red LED is steady. |
| Script works but device doesn't connect to home WiFi | Verify SSID and password are correct. The ICV6 only supports 2.4 GHz networks (ESP8266 limitation). |
| Device IP changed after factory reset | Use --ip 192.168.4.1 — the factory-default AP IP is 192.168.4.1, not 192.168.5.1. |
| UDP packets lost / intermittent timeouts | If both Ethernet and WiFi are connected, the script auto-binds to the correct source IP. If issues persist, disconnect Ethernet temporarily. |