# arris-modem-status 🚀
[](https://github.com/csmarshall/arris-modem-status/actions/workflows/quality-check.yml)
[](https://codecov.io/gh/csmarshall/arris-modem-status)
[](https://badge.fury.io/py/arris-modem-status)
[](https://pypi.org/project/arris-modem-status/)
[](https://opensource.org/licenses/MIT)
[](https://www.buymeacoffee.com/cs_marshall)
I got tired of logging into my Arris cable modem's clunky web interface just to check signal levels. So, with the help of AI (Claude), I reverse-engineered the modem's API and built this Python library!
## What's This Thing Do? 🤔
It grabs **ALL** the juicy details from your Arris S34 (and likely S33/SB8200) cable modem:
- 📊 Signal levels, SNR, error counts
- 🌊 Downstream/upstream channel info
- 🔧 Model name, firmware version, hardware version
- ⏰ System uptime (e.g., "27 day(s) 10h:12m:37s")
- 🔒 Boot status, security status, connectivity state
- ⚡ And it's FAST (< 2 seconds in serial mode)
## Quick Start 🏃♂️
```bash
# Install the latest version (v1.0.2)
pip install arris-modem-status
# Check your modem (serial mode by default for reliability)
arris-modem-status --password YOUR_PASSWORD
# Get JSON for your monitoring setup
arris-modem-status --password YOUR_PASSWORD --quiet | jq
# Use parallel mode if your modem supports it (30% faster but may fail)
arris-modem-status --password YOUR_PASSWORD --parallel
```
## Python Usage 🐍
```python
from arris_modem_status import ArrisModemStatusClient
# Serial mode by default (recommended)
with ArrisModemStatusClient(password="YOUR_PASSWORD") as client:
status = client.get_status()
print(f"Modem: {status['model_name']}")
print(f"Firmware: {status['firmware_version']}")
print(f"Uptime: {status['system_uptime']}")
# Check signal levels
for channel in status['downstream_channels']:
print(f"Channel {channel.channel_id}: {channel.power} / SNR: {channel.snr}")
# Use concurrent mode if your modem handles it well
with ArrisModemStatusClient(password="YOUR_PASSWORD", concurrent=True) as client:
status = client.get_status() # ~30% faster but may get HTTP 403 errors
```
## Serial vs Parallel Mode ⚠️
**DEFAULT: Serial mode** - Requests are made one at a time. Slower but much more reliable.
Many Arris modems have buggy HNAP implementations that return HTTP 403 errors when handling concurrent requests. This causes inconsistent data like:
- Sometimes getting model name, sometimes not
- Missing internet status randomly
- Partial channel information
If you want to try parallel mode for speed (at your own risk):
```bash
arris-modem-status --password YOUR_PASSWORD --parallel
```
## Complete Data Retrieved 📦
The library retrieves **ALL** available modem information, but the output format differs depending on how you use it:
### Command Line Interface Output
When using the CLI, you get both human-readable summaries (to stderr) and structured JSON (to stdout):
**Human-readable summary (stderr):**
```
============================================================
ARRIS MODEM STATUS SUMMARY
============================================================
Model: S34
Hardware Version: 1.0
Firmware: AT01.01.010.042324_S3.04.735
Uptime: 27 day(s) 10h:12m:37s
Uptime (days): 27.4
Connection Status:
Internet: Connected
Network Access: Allowed
Boot Status: OK
Security: Enabled (BPI+)
Downstream Status:
Frequency: 549000000 Hz
Comment: Locked
System Information:
MAC Address: 01:23:45:67:89:AB
Serial Number: 000000000000000
Current Time: 07/30/2025 23:31:23
Current Time (ISO): 2025-07-30T23:31:23
Channel Summary:
Downstream Channels: 32
Upstream Channels: 8
Channel Data Available: true
Sample Channel: ID 1, 549000000 Hz, 0.6 dBmV, SNR 39.0 dB, Errors: 15/0
============================================================
```
**JSON output (stdout) with CLI metadata:**
```json
{
"model_name": "S34",
"hardware_version": "1.0",
"firmware_version": "AT01.01.010.042324_S3.04.735",
"system_uptime": "31 day(s) 03h:42m:48s",
"system_uptime-seconds": 2691768.0,
"current_system_time": "08/03/2025 17:02:43",
"current_system_time-ISO8601": "2025-08-03T17:02:43",
"mac_address": "01:23:45:67:89:AB",
"serial_number": "000000000000000",
"internet_status": "Connected",
"network_access": "Allowed",
"boot_status": "OK",
"boot_comment": "Operational",
"configuration_file_status": "OK",
"security_status": "Enabled",
"security_comment": "BPI+",
"downstream_frequency": "549000000 Hz",
"downstream_comment": "Locked",
"downstream_channels": [
{
"channel_id": "1",
"frequency": "549000000 Hz",
"power": "0.6 dBmV",
"snr": "39.0 dB",
"modulation": "256QAM",
"lock_status": "Locked",
"corrected_errors": "15",
"uncorrected_errors": "0",
"channel_type": "downstream"
}
],
"upstream_channels": [
{
"channel_id": "1",
"frequency": "30600000 Hz",
"power": "46.5 dBmV",
"snr": "N/A",
"modulation": "SC-QAM",
"lock_status": "Locked",
"channel_type": "upstream"
}
],
"query_timestamp": "2025-08-03T15:30:45",
"query_host": "192.168.100.1",
"client_version": "1.0.0",
"elapsed_time": 1.85,
"configuration": {
"max_workers": 2,
"max_retries": 3,
"timeout": [5, 15],
"concurrent_mode": false,
"http_compatibility": true,
"quick_check_performed": false
}
}
```
### Python Library Output
When using the Python library directly, you get a cleaner dictionary focused on modem data:
```python
from arris_modem_status import ArrisModemStatusClient
with ArrisModemStatusClient(password="your_password") as client:
status = client.get_status()
print(status)
```
**Returns:**
```python
{
'model_name': 'S34',
'hardware_version': '1.0',
'firmware_version': 'AT01.01.010.042324_S3.04.735',
'system_uptime': '31 day(s) 03h:42m:48s',
'system_uptime-datetime': datetime.timedelta(days=31, seconds=13368), # Python datetime.timedelta object
'system_uptime-seconds': 2691768.0, # Automatically parsed
'current_system_time': '08/03/2025 17:02:43',
'current_system_time-ISO8601': '2025-08-03T17:02:43', # Auto-formatted
'current_system_time-datetime': datetime.datetime(2025, 8, 3, 17, 2, 43), # Python datetime.datetime object
'mac_address': '01:23:45:67:89:AB',
'serial_number': '000000000000000',
'internet_status': 'Connected',
'network_access': 'Allowed',
'boot_status': 'OK',
'boot_comment': 'Operational',
'connectivity_status': 'OK',
'connectivity_comment': 'Operational',
'configuration_file_status': 'OK',
'security_status': 'Enabled',
'security_comment': 'BPI+',
'downstream_frequency': '549000000 Hz',
'downstream_comment': 'Locked',
'downstream_channels': [
ChannelInfo(
channel_id='1',
frequency='549000000 Hz',
power='0.6 dBmV',
snr='39.0 dB',
modulation='256QAM',
lock_status='Locked',
corrected_errors='15',
uncorrected_errors='0',
channel_type='downstream'
) # ... more channels
],
'upstream_channels': [
ChannelInfo(
channel_id='1',
frequency='30600000 Hz',
power='46.5 dBmV',
snr='N/A',
modulation='SC-QAM',
lock_status='Locked',
channel_type='upstream'
) # ... more channels
],
'channel_data_available': True,
'_request_mode': 'serial', # Internal metadata
'_performance': {
'total_time': 1.85,
'requests_successful': 4,
'requests_total': 4,
'mode': 'serial'
}
}
```
### Key Differences
| Feature | CLI Output | Python Library |
|---------|------------|----------------|
| **Human Summary** | ✅ Printed to stderr | ❌ Not included |
| **CLI Metadata** | ✅ Query info, host, version | ❌ Not included |
| **Channel Objects** | ❌ Serialized to dicts | ✅ Rich ChannelInfo objects |
| **Time Parsing** | ✅ Enhanced fields | ✅ Enhanced fields |
| **Performance Data** | ✅ Configuration details | ✅ Basic timing info |
| **Monitoring Ready** | ✅ JSON with metadata | ✅ Python objects |
Both formats include automatically parsed time fields (like `system_uptime-seconds`) and enhanced data, but the CLI adds operational metadata while the Python library provides rich objects for programmatic use.
## The Cool Technical Bits 🤓
I spent way too much time figuring out:
- 🔐 The HNAP authentication (challenge-response with HMAC-SHA256)
- 🏎️ Why concurrent requests fail (modem firmware bugs causing HTTP 403)
- 🛡️ HTTP compatibility quirks (urllib3 is... picky)
- 📦 Complete HNAP request mapping (including the missing GetCustomerStatusSoftware!)
- 🐛 Why data was inconsistent (partial request failures in concurrent mode)
## Monitoring Integration 📈
Perfect for Grafana, Prometheus, or any monitoring stack:
```python
# Quick Prometheus exporter example
from prometheus_client import Gauge
downstream_power = Gauge('arris_downstream_power_dbmv', 'Power', ['channel'])
# Update metrics
for ch in status['downstream_channels']:
downstream_power.labels(channel=ch.channel_id).set(float(ch.power.split()[0]))
```
## Disclaimer
This is an unofficial library not affiliated with ARRIS® or CommScope, Inc. ARRIS® is a registered trademark of CommScope, Inc.
This is a personal project provided as-is under the MIT license.
## Is my modem supported? ☎️
I tested this on an Arris S34 (running the "AT01.01.010.042324_S3.04.735" firmware on Comcast in the USA), so chances are good that it will work on its older sibbling the S33. I hope to validate the SB8200 in the near future, but otherwise if it's an Arris modem it may work, or not 🤷🏻. I'm open to helping to triage files, but the procedure will be a little loosey goosey until I do one or two.
## Found a Bug? Want a Feature? 🐛
Open an issue! PRs welcome! The codebase is pretty clean thanks to the AI helping me follow best practices.
## The Story 📖
I started this because I'm obsessive about my internet connection quality (aren't we all?). After discovering the modem had an API, I went down a rabbit hole of reverse engineering with Claude as my copilot.
Fun discoveries:
- The modem returns the same data in multiple HNAP responses (redundancy FTW)
- Many modems can't handle concurrent requests (firmware bugs)
- The missing firmware version was in GetCustomerStatusSoftware all along
- Serial mode is more reliable than parallel for most modems
## Requirements 📋
- Python 3.9+
- An Arris S34 (and likely S33/SB8200) cable modem
- The admin password [by default the last 8 digits of your modem's serial number](https://arris.my.salesforce-sites.com/consumers/articles/Knowledge/S33-Web-Manager-Access/?l=en_US&fs=RelatedArticle)
- Patience if your modem hates concurrent requests
## License 📄
MIT - Use it, modify it, monitoring-ify it!
---
Built with 🧠 + 🤖 by Charles Marshall | [GitHub](https://github.com/csmarshall)
Raw data
{
"_id": null,
"home_page": null,
"name": "arris-modem-status",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "arris, modem, cable, router, DOCSIS, networking, monitoring, HNAP, status, diagnostics, internet",
"author": "Charles Marshall",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/50/4d/871f9a3e6dcbcb9a97fd6fd1cd7d285ecfbfbdea548fc4a4890ac280f4f0/arris_modem_status-1.0.2.tar.gz",
"platform": null,
"description": "# arris-modem-status \ud83d\ude80\n\n[](https://github.com/csmarshall/arris-modem-status/actions/workflows/quality-check.yml)\n[](https://codecov.io/gh/csmarshall/arris-modem-status)\n[](https://badge.fury.io/py/arris-modem-status)\n[](https://pypi.org/project/arris-modem-status/)\n[](https://opensource.org/licenses/MIT)\n[](https://www.buymeacoffee.com/cs_marshall)\n\nI got tired of logging into my Arris cable modem's clunky web interface just to check signal levels. So, with the help of AI (Claude), I reverse-engineered the modem's API and built this Python library!\n\n## What's This Thing Do? \ud83e\udd14\n\nIt grabs **ALL** the juicy details from your Arris S34 (and likely S33/SB8200) cable modem:\n- \ud83d\udcca Signal levels, SNR, error counts\n- \ud83c\udf0a Downstream/upstream channel info\n- \ud83d\udd27 Model name, firmware version, hardware version\n- \u23f0 System uptime (e.g., \"27 day(s) 10h:12m:37s\")\n- \ud83d\udd12 Boot status, security status, connectivity state\n- \u26a1 And it's FAST (< 2 seconds in serial mode)\n\n## Quick Start \ud83c\udfc3\u200d\u2642\ufe0f\n\n```bash\n# Install the latest version (v1.0.2)\npip install arris-modem-status\n\n# Check your modem (serial mode by default for reliability)\narris-modem-status --password YOUR_PASSWORD\n\n# Get JSON for your monitoring setup\narris-modem-status --password YOUR_PASSWORD --quiet | jq\n\n# Use parallel mode if your modem supports it (30% faster but may fail)\narris-modem-status --password YOUR_PASSWORD --parallel\n```\n\n## Python Usage \ud83d\udc0d\n\n```python\nfrom arris_modem_status import ArrisModemStatusClient\n\n# Serial mode by default (recommended)\nwith ArrisModemStatusClient(password=\"YOUR_PASSWORD\") as client:\n status = client.get_status()\n\n print(f\"Modem: {status['model_name']}\")\n print(f\"Firmware: {status['firmware_version']}\")\n print(f\"Uptime: {status['system_uptime']}\")\n\n # Check signal levels\n for channel in status['downstream_channels']:\n print(f\"Channel {channel.channel_id}: {channel.power} / SNR: {channel.snr}\")\n\n# Use concurrent mode if your modem handles it well\nwith ArrisModemStatusClient(password=\"YOUR_PASSWORD\", concurrent=True) as client:\n status = client.get_status() # ~30% faster but may get HTTP 403 errors\n```\n\n## Serial vs Parallel Mode \u26a0\ufe0f\n\n**DEFAULT: Serial mode** - Requests are made one at a time. Slower but much more reliable.\n\nMany Arris modems have buggy HNAP implementations that return HTTP 403 errors when handling concurrent requests. This causes inconsistent data like:\n- Sometimes getting model name, sometimes not\n- Missing internet status randomly\n- Partial channel information\n\nIf you want to try parallel mode for speed (at your own risk):\n```bash\narris-modem-status --password YOUR_PASSWORD --parallel\n```\n\n## Complete Data Retrieved \ud83d\udce6\n\nThe library retrieves **ALL** available modem information, but the output format differs depending on how you use it:\n\n### Command Line Interface Output\n\nWhen using the CLI, you get both human-readable summaries (to stderr) and structured JSON (to stdout):\n\n**Human-readable summary (stderr):**\n```\n============================================================\nARRIS MODEM STATUS SUMMARY\n============================================================\nModel: S34\nHardware Version: 1.0\nFirmware: AT01.01.010.042324_S3.04.735\nUptime: 27 day(s) 10h:12m:37s\nUptime (days): 27.4\nConnection Status:\n Internet: Connected\n Network Access: Allowed\n Boot Status: OK\n Security: Enabled (BPI+)\nDownstream Status:\n Frequency: 549000000 Hz\n Comment: Locked\nSystem Information:\n MAC Address: 01:23:45:67:89:AB\n Serial Number: 000000000000000\n Current Time: 07/30/2025 23:31:23\n Current Time (ISO): 2025-07-30T23:31:23\nChannel Summary:\n Downstream Channels: 32\n Upstream Channels: 8\n Channel Data Available: true\n Sample Channel: ID 1, 549000000 Hz, 0.6 dBmV, SNR 39.0 dB, Errors: 15/0\n============================================================\n```\n\n**JSON output (stdout) with CLI metadata:**\n```json\n{\n \"model_name\": \"S34\",\n \"hardware_version\": \"1.0\",\n \"firmware_version\": \"AT01.01.010.042324_S3.04.735\",\n \"system_uptime\": \"31 day(s) 03h:42m:48s\",\n \"system_uptime-seconds\": 2691768.0,\n \"current_system_time\": \"08/03/2025 17:02:43\",\n \"current_system_time-ISO8601\": \"2025-08-03T17:02:43\",\n \"mac_address\": \"01:23:45:67:89:AB\",\n \"serial_number\": \"000000000000000\",\n \"internet_status\": \"Connected\",\n \"network_access\": \"Allowed\",\n \"boot_status\": \"OK\",\n \"boot_comment\": \"Operational\",\n \"configuration_file_status\": \"OK\",\n \"security_status\": \"Enabled\",\n \"security_comment\": \"BPI+\",\n \"downstream_frequency\": \"549000000 Hz\",\n \"downstream_comment\": \"Locked\",\n \"downstream_channels\": [\n {\n \"channel_id\": \"1\",\n \"frequency\": \"549000000 Hz\",\n \"power\": \"0.6 dBmV\",\n \"snr\": \"39.0 dB\",\n \"modulation\": \"256QAM\",\n \"lock_status\": \"Locked\",\n \"corrected_errors\": \"15\",\n \"uncorrected_errors\": \"0\",\n \"channel_type\": \"downstream\"\n }\n ],\n \"upstream_channels\": [\n {\n \"channel_id\": \"1\",\n \"frequency\": \"30600000 Hz\",\n \"power\": \"46.5 dBmV\",\n \"snr\": \"N/A\",\n \"modulation\": \"SC-QAM\",\n \"lock_status\": \"Locked\",\n \"channel_type\": \"upstream\"\n }\n ],\n \"query_timestamp\": \"2025-08-03T15:30:45\",\n \"query_host\": \"192.168.100.1\",\n \"client_version\": \"1.0.0\",\n \"elapsed_time\": 1.85,\n \"configuration\": {\n \"max_workers\": 2,\n \"max_retries\": 3,\n \"timeout\": [5, 15],\n \"concurrent_mode\": false,\n \"http_compatibility\": true,\n \"quick_check_performed\": false\n }\n}\n```\n\n### Python Library Output\n\nWhen using the Python library directly, you get a cleaner dictionary focused on modem data:\n\n```python\nfrom arris_modem_status import ArrisModemStatusClient\n\nwith ArrisModemStatusClient(password=\"your_password\") as client:\n status = client.get_status()\n print(status)\n```\n\n**Returns:**\n```python\n{\n 'model_name': 'S34',\n 'hardware_version': '1.0',\n 'firmware_version': 'AT01.01.010.042324_S3.04.735',\n 'system_uptime': '31 day(s) 03h:42m:48s',\n 'system_uptime-datetime': datetime.timedelta(days=31, seconds=13368), # Python datetime.timedelta object\n 'system_uptime-seconds': 2691768.0, # Automatically parsed\n 'current_system_time': '08/03/2025 17:02:43',\n 'current_system_time-ISO8601': '2025-08-03T17:02:43', # Auto-formatted\n 'current_system_time-datetime': datetime.datetime(2025, 8, 3, 17, 2, 43), # Python datetime.datetime object\n 'mac_address': '01:23:45:67:89:AB',\n 'serial_number': '000000000000000',\n 'internet_status': 'Connected',\n 'network_access': 'Allowed',\n 'boot_status': 'OK',\n 'boot_comment': 'Operational',\n 'connectivity_status': 'OK',\n 'connectivity_comment': 'Operational',\n 'configuration_file_status': 'OK',\n 'security_status': 'Enabled',\n 'security_comment': 'BPI+',\n 'downstream_frequency': '549000000 Hz',\n 'downstream_comment': 'Locked',\n 'downstream_channels': [\n ChannelInfo(\n channel_id='1',\n frequency='549000000 Hz',\n power='0.6 dBmV',\n snr='39.0 dB',\n modulation='256QAM',\n lock_status='Locked',\n corrected_errors='15',\n uncorrected_errors='0',\n channel_type='downstream'\n ) # ... more channels\n ],\n 'upstream_channels': [\n ChannelInfo(\n channel_id='1',\n frequency='30600000 Hz',\n power='46.5 dBmV',\n snr='N/A',\n modulation='SC-QAM',\n lock_status='Locked',\n channel_type='upstream'\n ) # ... more channels\n ],\n 'channel_data_available': True,\n '_request_mode': 'serial', # Internal metadata\n '_performance': {\n 'total_time': 1.85,\n 'requests_successful': 4,\n 'requests_total': 4,\n 'mode': 'serial'\n }\n}\n```\n\n### Key Differences\n\n| Feature | CLI Output | Python Library |\n|---------|------------|----------------|\n| **Human Summary** | \u2705 Printed to stderr | \u274c Not included |\n| **CLI Metadata** | \u2705 Query info, host, version | \u274c Not included |\n| **Channel Objects** | \u274c Serialized to dicts | \u2705 Rich ChannelInfo objects |\n| **Time Parsing** | \u2705 Enhanced fields | \u2705 Enhanced fields |\n| **Performance Data** | \u2705 Configuration details | \u2705 Basic timing info |\n| **Monitoring Ready** | \u2705 JSON with metadata | \u2705 Python objects |\n\nBoth formats include automatically parsed time fields (like `system_uptime-seconds`) and enhanced data, but the CLI adds operational metadata while the Python library provides rich objects for programmatic use.\n\n## The Cool Technical Bits \ud83e\udd13\n\nI spent way too much time figuring out:\n- \ud83d\udd10 The HNAP authentication (challenge-response with HMAC-SHA256)\n- \ud83c\udfce\ufe0f Why concurrent requests fail (modem firmware bugs causing HTTP 403)\n- \ud83d\udee1\ufe0f HTTP compatibility quirks (urllib3 is... picky)\n- \ud83d\udce6 Complete HNAP request mapping (including the missing GetCustomerStatusSoftware!)\n- \ud83d\udc1b Why data was inconsistent (partial request failures in concurrent mode)\n\n## Monitoring Integration \ud83d\udcc8\n\nPerfect for Grafana, Prometheus, or any monitoring stack:\n\n```python\n# Quick Prometheus exporter example\nfrom prometheus_client import Gauge\ndownstream_power = Gauge('arris_downstream_power_dbmv', 'Power', ['channel'])\n\n# Update metrics\nfor ch in status['downstream_channels']:\n downstream_power.labels(channel=ch.channel_id).set(float(ch.power.split()[0]))\n```\n\n## Disclaimer\n\nThis is an unofficial library not affiliated with ARRIS\u00ae or CommScope, Inc. ARRIS\u00ae is a registered trademark of CommScope, Inc.\n\nThis is a personal project provided as-is under the MIT license.\n\n## Is my modem supported? \u260e\ufe0f\n\nI tested this on an Arris S34 (running the \"AT01.01.010.042324_S3.04.735\" firmware on Comcast in the USA), so chances are good that it will work on its older sibbling the S33. I hope to validate the SB8200 in the near future, but otherwise if it's an Arris modem it may work, or not \ud83e\udd37\ud83c\udffb. I'm open to helping to triage files, but the procedure will be a little loosey goosey until I do one or two.\n\n\n## Found a Bug? Want a Feature? \ud83d\udc1b\n\nOpen an issue! PRs welcome! The codebase is pretty clean thanks to the AI helping me follow best practices.\n\n## The Story \ud83d\udcd6\n\nI started this because I'm obsessive about my internet connection quality (aren't we all?). After discovering the modem had an API, I went down a rabbit hole of reverse engineering with Claude as my copilot.\n\nFun discoveries:\n- The modem returns the same data in multiple HNAP responses (redundancy FTW)\n- Many modems can't handle concurrent requests (firmware bugs)\n- The missing firmware version was in GetCustomerStatusSoftware all along\n- Serial mode is more reliable than parallel for most modems\n\n## Requirements \ud83d\udccb\n\n- Python 3.9+\n- An Arris S34 (and likely S33/SB8200) cable modem\n- The admin password [by default the last 8 digits of your modem's serial number](https://arris.my.salesforce-sites.com/consumers/articles/Knowledge/S33-Web-Manager-Access/?l=en_US&fs=RelatedArticle)\n- Patience if your modem hates concurrent requests\n\n## License \ud83d\udcc4\n\nMIT - Use it, modify it, monitoring-ify it!\n\n---\n\nBuilt with \ud83e\udde0 + \ud83e\udd16 by Charles Marshall | [GitHub](https://github.com/csmarshall)\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Unofficial Python client for Arris cable modem status via HNAP",
"version": "1.0.2",
"project_urls": {
"Bug Tracker": "https://github.com/csmarshall/arris-modem-status/issues",
"Changelog": "https://github.com/csmarshall/arris-modem-status/blob/main/CHANGELOG.md",
"Documentation": "https://github.com/csmarshall/arris-modem-status#readme",
"Homepage": "https://github.com/csmarshall/arris-modem-status",
"Repository": "https://github.com/csmarshall/arris-modem-status",
"Source Code": "https://github.com/csmarshall/arris-modem-status"
},
"split_keywords": [
"arris",
" modem",
" cable",
" router",
" docsis",
" networking",
" monitoring",
" hnap",
" status",
" diagnostics",
" internet"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "6cd2b46f0eb813bc5b402f8d8b9cc81ff1fa790a420bf9e21a9ac15381ca8388",
"md5": "80eaee828ea789ee80d52c9b29d8c5ae",
"sha256": "c8d12261c6bf33e8aa068b0bb6f5d98eb0052a842dfe5c2c3e54bc4670939b85"
},
"downloads": -1,
"filename": "arris_modem_status-1.0.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "80eaee828ea789ee80d52c9b29d8c5ae",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 131166,
"upload_time": "2025-08-04T18:04:06",
"upload_time_iso_8601": "2025-08-04T18:04:06.720475Z",
"url": "https://files.pythonhosted.org/packages/6c/d2/b46f0eb813bc5b402f8d8b9cc81ff1fa790a420bf9e21a9ac15381ca8388/arris_modem_status-1.0.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "504d871f9a3e6dcbcb9a97fd6fd1cd7d285ecfbfbdea548fc4a4890ac280f4f0",
"md5": "2b40aa43a91dc902bde3940a7a1ffaa0",
"sha256": "703ade407bde4361b74c331a25ef56f6ef7b0becb9e2cdfc4d56809e3dd50292"
},
"downloads": -1,
"filename": "arris_modem_status-1.0.2.tar.gz",
"has_sig": false,
"md5_digest": "2b40aa43a91dc902bde3940a7a1ffaa0",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 158667,
"upload_time": "2025-08-04T18:04:07",
"upload_time_iso_8601": "2025-08-04T18:04:07.687307Z",
"url": "https://files.pythonhosted.org/packages/50/4d/871f9a3e6dcbcb9a97fd6fd1cd7d285ecfbfbdea548fc4a4890ac280f4f0/arris_modem_status-1.0.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-04 18:04:07",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "csmarshall",
"github_project": "arris-modem-status",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"tox": true,
"lcname": "arris-modem-status"
}