The Milesight Gateway API is a Python client that provides an interface for interacting with Milesight Gateways through various REST API endpoints. It supports fetching device data, network server settings, packet forwarder information, profiles, payload codecs, and more.
Use at your own risk.
There are some feature missing in the original firmware from Milesight, which can become a problem, especially in large installations with several gateways.
For example:
- Its not possible to export the device list. -> Fixed
- Its not possible to export the custom payload codecs. -> Fixed
- use all get endpoints
- use post endpoints to write on gateways
- IoT Developer Api
- state engine to use this API for receiving the actuall sensor values.
The Milesight Gateway firmware must be 60.0.0.42-r5/56.0.0.4
or higher. (from May 28, 2024 )
To install the package from PyPI, simply run:
pip install Milesight-Gateway-API
Milesight-Gateway-API on pypi.org
The MilesightGatewayClient class provides the following features:
- Fetch Devices: Fetch devices and their details with pagination and search options.
- Fetch Network Server Settings: Get network server settings from the Milesight Gateway.
- Packet Forwarder Information: Retrieve information about the packet forwarder and connected servers.
- Fetch Applications: Retrieve all applications with pagination.
- Data Transmission Integration: Fetch integration details by ID and transmission type (HTTP or MQTT).
- Fetch Payload Codecs: Fetch default or custom payload codecs with pagination and optional search.
- Fetch Profiles: Fetch profiles for an organization and application, with optional profileID for specific content search.
- Fetch Gateway Fleet: Retrieve gateway details with optional search by name or gateway ID.
See /tests/test_client.py how to use all functions.
First, import the MilesightGatewayClient class and configure it with your credentials. Ensure you have the required environment variables or load them from a .env file. You can copy .env_eample to .env and change the IP, Username and Password.
from milesight_gateway_api.milesight_gateway_client import MilesightGatewayClient
import os
from aiohttp import ClientSession
# Load environment variables (e.g., USERNAME, PASSWORD, etc.)
username = os.getenv('USERNAME') # admin
password = os.getenv('PASSWORD') # the WebUI Login Password
secret_key = bytes(os.getenv('SECRET_KEY'), 'utf-8')
iv = bytes(os.getenv('IV'), 'utf-8')
base_url = os.getenv('BASE_URL')
port = os.getenv('PORT')
client = MilesightGatewayClient(username, password, secret_key, iv, base_url, port)
You must retrieve the JWT token before making other requests. Use the get_jwt_token method:
async with ClientSession() as session:
jwt_token = await client.get_jwt_token(session)
You can fetch all devices with pagination or search for a specific device by providing the search parameter.
# Fetch all devices
all_devices, devices_total_count = await client.get_all_devices(session)
print(f"Total Devices: {devices_total_count}")
print(all_devices)
search_device_string = "device_id_here"
search_device = await client.get_device(session, search_device_string)
print(f"Search Results for {search_device_string}:")
print(search_device)
To fetch all applications:
# Fetch all applications with pagination
applications, total_applications = await client.get_all_applications(session)
print(f"Total Applications: {total_applications}")
print(applications)
You can fetch payload codecs by type (default or custom) with optional search functionality.
# Fetch all default payload codecs
payload_codecs, codecs_total_count = await client.get_payload_codecs(session, codec_type='default')
print(f"Total Payload Codecs: {codecs_total_count}")
print(payload_codecs)
search_payload_codecs, codecs_total_count = await client.get_payload_codecs(session, codec_type='custom', search="custom_codec_name")
print(f"Search Results: {search_payload_codecs}")
You can fetch profiles for an organization and application, with an optional profile_id to search for specific profile content.
# Fetch profiles
organization_id = "1"
application_id = "5"
profiles, total_profiles = await client.get_profiles(session, organization_id, application_id)
print(f"Total Profiles: {total_profiles}")
print(profiles)
# Fetch specific profile by profileID
profile_id = "your_profile_id"
profiles_by_id, total_profiles = await client.get_profiles(session, organization_id, application_id, profile_id=profile_id)
print(f"Profiles for profileID {profile_id}: {profiles_by_id}")
Fetch the gateway fleet with optional search by gateway name or ID.
# Fetch gateway fleet
organization_id = "1"
gateway_fleet, total_gateways = await client.get_gateway_fleet(session, organization_id)
print(f"Total Gateways: {total_gateways}")
print(gateway_fleet)
gateway_fleet_search, total_gateways = await client.get_gateway_fleet(session, organization_id, search="gateway_name_or_id")
print(f"Search Results: {gateway_fleet_search}")
This project is licensed under the MIT License. See the LICENSE file for more details.