bergclimber.deArcher MR600

Archer MR600: read and monitor the LTE signal

RSRP, RSRQ, SNR and network type of the TP-Link Archer MR600 via script instead of the app: the login traps, a ready-made Python script with Prometheus output and a rater for your values.

Rate your values

Enter the three numbers from the web UI (Advanced → Status → LTE) or from the script. The rating follows the usual real-world LTE guide values; these are not manufacturer figures.

–
–
–
Overall

No values yet.

What this is about

The Archer MR600 is an LTE router with a SIM slot, often used as a backup uplink or as the main connection in rural areas. Only the router itself knows how good reception is right now: UniFi, a Fritz!Box or a ping see latency and outages, not whether the antenna is aimed right or the cell is congested. The web UI shows the values, but nobody looks every minute. The Tether app is phone-only.

The tplinkrouterc6u library speaks the login protocol of TP-Link routers; the actual problem is which of its clients fits which firmware and how not to lock yourself out of the router by accident. That is exactly what this page covers, verified on an Archer MR600 v3.0 with firmware 1.3.0 (build 250915) that has been polled every minute for weeks.

Quick start

# Library and script (Linux, Raspberry Pi, Mac)
python3 -m venv ~/mr600 && ~/mr600/bin/pip install tplinkrouterc6u
curl -o ~/mr600/mr600.py https://bergclimber.de/mr600/dl/mr600.py

# Password of the web UI (there is no user there; internally it is "admin")
export MR600_PASSWORD='…'

# Log out of the web UI, then:
~/mr600/bin/python3 ~/mr600/mr600.py status --host http://192.168.1.1 --firmware
~/mr600/bin/python3 ~/mr600/mr600.py json
~/mr600/bin/python3 ~/mr600/mr600.py prometheus

Run the first call with the web UI logged out. If it fails with "wrong password", do not retry blindly: after five failed attempts the router locks the login for a long time. Check username, client and password first (see traps).

The traps

1. The wrong client looks like a wrong password

tplinkrouterc6u has three clients for the MR series. For the MR600 v3 with current firmware, TPLinkMR6400v7Client is the right one (MD5 hash, RSA signature, sequence number from /cgi/getParm). TPLinkMR600Client expects ECC and fails, TPLinkMR200Client yields error 71234. The library's auto-detection picks correctly here; the script uses MR6400v7 by default and can be switched with --client.

2. username="admin" is mandatory, although the web UI has no user field

The login page hashes MD5("admin" + password). The MR6400v7 client defaults to an empty username and gets error 71233 "wrong password" even though the password is correct. That costs an hour if you do not know it.

3. One admin session, and only one

As long as someone is logged into the web UI, every further login fails (/cgi/getBusy reports isLogined). Conversely, a script that holds the session locks you out of the web UI. So per query: log in, read, log out. The script always does that, even on errors.

4. Five failed attempts and it is locked

TP-Link locks the login after five rejections for a long time, also via the web UI. A monitor knocking every minute with a wrong password locks itself out. After a rejection the script pauses for 30 minutes before trying again.

5. SNR comes in tenths of a dB

The rfInfoSnr field returns 152 for 15.2 dB; the web UI shows rounded whole dB. RSRP and RSRQ, by contrast, come directly in dBm and dB. Write the raw value undivided into a dashboard and you will wonder about an SNR of 150.

6. SIM status 3 is the normal state

sim_status 3 means "SIM card prepared" and on this firmware is the state with a working connection, not an intermediate step. connect_status 4 is "connected". Alert on values other than these two, not on supposedly "more complete" codes.

The script

mr600.py is a single Python script on top of the library: login, status, logout, with backoff on rejection. Three output formats: readable, JSON and Prometheus text format, the latter optionally pushed straight to a Pushgateway. Password via environment variable or file, never as an argument (that would show up in the process list).

mr600.py status [--firmware]            readable, with rating
mr600.py json                            for your own scripts
mr600.py prometheus [--push URL]         lte_* metrics (Pushgateway: PUT)
mr600.py watch --format prometheus --interval 60 --push http://localhost:9091/metrics/job/lte_signal
Options: --host http://192.168.1.1  --username admin  --client MR6400v7|MR600|MR200|auto  --password-file PATH

As a service with Prometheus and Grafana

Example unit: mr600.service. Prometheus scrapes the Pushgateway (honor_labels); the metrics are lte_rsrp_dbm, lte_rsrq_db, lte_snr_db, lte_signal_level, lte_network_type, lte_sim_status, lte_connect_status, lte_rx/tx_speed_bytes_per_second, lte_total_statistics_bytes, lte_sms_unread and lte_signal_up. Alerts that proved useful in our setup:

  • LteSignalWeak: lte_rsrp_dbm < -110 for 15 min
  • LteSignalNoisy: lte_snr_db < 3 for 15 min
  • LteNoNetwork: lte_network_type == 0 for 5 min (critical)
  • LteSignalMonitorDown: no values for 15 min, for example because the web UI is open
sudo mkdir -p /opt/mr600 && sudo cp ~/mr600/mr600.py /opt/mr600/ && sudo cp -r ~/mr600 /opt/mr600/venv
echo '…' | sudo tee /opt/mr600/password >/dev/null && sudo chmod 600 /opt/mr600/password
sudo curl -o /etc/systemd/system/mr600.service https://bergclimber.de/mr600/dl/mr600.service
sudo nano /etc/systemd/system/mr600.service      # adjust User=, --host, --push
sudo systemctl daemon-reload && sudo systemctl enable --now mr600
journalctl -u mr600 -f

One lesson from operation: if the service delivers no values after a reboot, usually the web UI is open or the password file is not readable yet. Neither is a reason to change anything on the router.

Value reference

Fields of the library's get_lte_status(), meaning and values observed on the MR600 v3.

FieldMeaningObserved / note
rsrpReference Signal Received Power, dBm−97 with window antennas; > −100 fair, < −110 edge
rsrqReference Signal Received Quality, dB−8 to −9; > −10 good, < −16 poor
snrsignal-to-noise ratio, tenths of a dB152 = 15.2 dB; > 10 dB good, < 3 dB poor
sig_levelbars 0–54
network_typenetwork type code0 no service, 1 GSM, 2 WCDMA, 3 4G LTE, 7 4G+ LTE, 8 5G NR
connect_statusconnection status, raw TP-Link coding4 = connected
sim_statusSIM status code3 = "SIM card prepared" = normal
isp_namenetwork name per SIMe.g. "Congstar Internet" for fraenk
cur_rx_speed / cur_tx_speedcurrent rate, bytes/srouter snapshot
total_statisticsvolume since counter reset, bytesrouter counter, not the script's
sms_unread_countunread SMS on the routercarrier SMS end up here

Guide values

Valueexcellentgoodfairpooredge
RSRP (dBm)≥ −80−80 … −90−90 … −100−100 … −110< −110
RSRQ (dB)≥ −10−10 … −15−15 … −20< −20
SNR (dB)≥ 2013 … 200 … 13< 0

RSRP tells how strongly the mast arrives (position, antenna, distance). SNR tells how cleanly (interference, neighbouring cells). RSRQ reacts to cell load. All three matter for throughput; for the question "antenna or not" almost only RSRP.

Compatibility

Verified: Archer MR600 v3.0, firmware 1.3.0 0.9.1 build 250915. The library additionally lists MR600 v1/v2, MR200, MR400, MR550 and TL-MR6400 as supported; when in doubt, --client auto tells you which client fits. Feel free to report what worked for you.

Frequently asked questions

Can I do this with the Tether app or the web UI?

For a look, yes; for monitoring, no. Both only show the moment, and the web UI blocks every script login while open. For history and alerts you need a script that fetches the values regularly.

Why does the router say "wrong password" although it is correct?

Almost always the empty username or the wrong library client. See traps 1 and 2. Do not keep trying, or the lockout after five attempts kicks in.

How long does the lockout after five failed attempts last?

The firmware states no fixed time; in practice it was around 30 minutes to several hours. A router reboot clears it. After a rejection the script waits 30 minutes before trying again.

Are external antennas worth it?

If RSRP is below −100 dBm, usually yes. The MR600 has two SMA sockets; a window flat panel with two cables took us from "no connection" to −100 dBm at 44 Mbit/s. Exhaust the position first, that is free.

The service delivers nothing after a reboot.

Is someone logged into the web UI? Is the password file readable? Those are the most common causes, long before a router problem.

Does this work with Home Assistant?

Home Assistant has an integration based on the same library that can also deliver LTE values. This script is for everyone who wants Prometheus and Grafana, or simply JSON in their own tooling.

Is any data transmitted or stored?

No. The rater on this page computes in the browser. The script only talks to your router on the local network and to the target you give it.