Metadata-Version: 2.4
Name: inet-control
Version: 1.0.0
Summary: Async Python library for Busch-Jaeger iNet Radio devices
Author: Jonatan_M
Project-URL: Homepage, https://github.com/JonatanMGit/iNet-control
Project-URL: Bug Tracker, https://github.com/JonatanMGit/iNet-control/issues
Keywords: home-automation,radio,busch-jaeger,inet,iot
Classifier: Development Status :: 5 - Production/Stable
Classifier: License :: OSI Approved :: MIT License
Classifier: Framework :: AsyncIO
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Home Automation
Classifier: Operating System :: OS Independent
Classifier: Intended Audience :: Developers
Requires-Python: >=3.11
Description-Content-Type: text/markdown
License-File: LICENSE
Dynamic: license-file


# Busch-Radio iNet Python Library

Asynchronous Python library for controlling and monitoring **Busch-Jaeger iNet Radios** via their UDP protocol. Features real-time push notifications for state changes (volume, station, power) from physical buttons.

## Installation

```bash
pip install inet-control
```

## Quick Start

### 1. Discover radios on your network

```python
import asyncio
from inet_control import RadioManager

async def discover():
    manager = RadioManager()
    await manager.start()
    
    # Broadcast discover and wait for responses
    await manager.discover()
    await asyncio.sleep(2)  # Wait for responses
    
    for ip, radio in manager.radios.items():
        print(f"{radio.name} → {ip}")
    
    await manager.stop()

asyncio.run(discover())
```

**Output:**
```
RADIO-LIVINGROOM → 192.168.1.100
RADIO-KITCHEN → 192.168.1.101
```

### 2. Control a radio

```python
import asyncio
from inet_control import RadioManager

async def control():
    manager = RadioManager()
    await manager.start()
    
    # Connect to a specific radio by IP
    radio = await manager.connect("192.168.1.100", timeout=3.0)
    print(f"Connected: {radio.name} (volume={radio.volume}, power={radio.power})")
    
    # Control the radio
    await manager.turn_on(radio)
    await manager.set_volume(radio, 8)
    await manager.play_station(radio, 1)  # Play station preset 1-8
    
    # State is updated automatically via callbacks
    await asyncio.sleep(1)
    print(f"Now playing: {radio.playing_station_name}")
    
    await manager.stop()

asyncio.run(control())
```

### 3. Monitor state changes (callbacks)

```python
import asyncio
from inet_control import RadioManager

async def monitor():
    manager = RadioManager()
    await manager.start()
    radio = await manager.connect("192.168.1.100")
    
    # Register callback for any state change
    def on_change():
        print(f"[UPDATE] {radio.name}: vol={radio.volume} power={radio.power} "
              f"station={radio.playing_station_name}")
    
    radio.register_callback(on_change)
    print("Listening for changes... (press Ctrl+C to stop)")
    
    try:
        await asyncio.Future()  # Run forever
    except KeyboardInterrupt:
        pass
    finally:
        await manager.stop()

asyncio.run(monitor())
```
## CLI Usage

The library includes a command-line interface:

```bash
# Discover radios
python -m inet_control monitor

# Control a specific radio
python -m inet_control ctl 192.168.1.100 status
python -m inet_control ctl 192.168.1.100 on
python -m inet_control ctl 192.168.1.100 off
python -m inet_control ctl 192.168.1.100 volume 8
python -m inet_control ctl 192.168.1.100 play 3    # Play station 3
python -m inet_control ctl 192.168.1.100 mute
```
