Metadata-Version: 2.4
Name: jumpstarter-driver-http-power
Version: 0.8.2.dev313+g8bbbd2278
Summary: A power driver for HTTP enabled PDUs or smart sockets, like the Shelly splug
Project-URL: Homepage, https://jumpstarter.dev
Project-URL: source_archive, https://github.com/jumpstarter-dev/repo/archive/8bbbd2278456a896d01877134859a95b8db7304f.zip
Author-email: Miguel Angel Ajo <majopela@redhat.com>
License-Expression: Apache-2.0
Requires-Python: >=3.11
Requires-Dist: anyio>=4.10.0
Requires-Dist: jumpstarter-driver-power==0.8.2.dev313+g8bbbd2278
Requires-Dist: jumpstarter==0.8.2.dev313+g8bbbd2278
Description-Content-Type: text/markdown

# HTTP Power Driver

`jumpstarter-driver-http-power` provides functionality for controlling power via HTTP endpoints and reading power measurements.

## Installation

```shell
pip3 install --extra-index-url https://pkg.jumpstarter.dev/simple/ jumpstarter-driver-http-power
```

## Configuration

Example configuration:

```yaml
export:
  http_power:
    type: jumpstarter_driver_http_power.driver.HttpPower
    config:
      name: "device"
      power_on:
        url: "http://power-controller.local/api/power/on"
        method: "POST"
        data: "action=on"
      power_off:
        url: "http://power-controller.local/api/power/off"
        method: "POST"
        data: "action=off"
      power_read:
        url: "http://power-controller.local/api/power/status"
        method: "GET"
      auth:
        basic:
          user: "admin"
          password: "secret"
```

### Example configuration for Shelly Smart Plug (Gen1):

```yaml
apiVersion: jumpstarter.dev/v1alpha1
kind: ExporterConfig
metadata:
  namespace: default
  name: demo
endpoint: ""
token: ""
export:
  power:
    type: jumpstarter_driver_http_power.driver.HttpPower
    config:
      name: "my-splug"
      power_on:
        url: "http://192.168.1.65/relay/0?turn=on"
      power_off:
        url: "http://192.168.1.65/relay/0?turn=off"
      auth:
        basic:
          user: admin
          password: something
```

### Example configuration for Shelly Smart Plug (Gen2/Gen3):

Gen2/Gen3 plugs (e.g. Plug S G3) use the RPC API and report `voltage`/`current`
as top-level keys, so `read()` works with no path configuration:

```yaml
export:
  power:
    type: jumpstarter_driver_http_power.driver.HttpPower
    config:
      name: "my-splug"
      power_on:
        url: "http://192.168.0.111/rpc/Switch.Set?id=0&on=true"
      power_off:
        url: "http://192.168.0.111/rpc/Switch.Set?id=0&on=false"
      power_read:
        url: "http://192.168.0.111/rpc/Switch.GetStatus?id=0"
```

Using the `examples/exporter-shelly-gen3.yaml` config, power on, take 4 measurements one second apart, then power off:

```shell
$ jmp shell --exporter-config exporter.yaml -- sh -c 'j power on && j power read -n 4 -i 1 && j power off'
[06/23/26 23:00:26] INFO     [driver.HttpPower] Powering on shellyplugsg3 via
HTTP
voltage=236.6 V  current=0.0 A  apparent_power=0.0 VA
voltage=236.5 V  current=0.09 A  apparent_power=21.285 VA
voltage=236.6 V  current=0.016 A  apparent_power=3.7856 VA
voltage=236.6 V  current=0.0 A  apparent_power=0.0 VA
[06/23/26 23:00:30] INFO     Powering off shellyplugsg3 via HTTP
```

### Config parameters

| Parameter | Description | Type | Required | Default |
|-----------|-------------|------|----------|---------|
| name | Name of the device, for logging purposes | str | no | "device" |
| power_on | HTTP endpoint config for powering on | HttpEndpointConfig | yes | |
| power_off | HTTP endpoint config for powering off | HttpEndpointConfig | yes | |
| power_read | HTTP endpoint config for reading power measurements. When unset, `read()` raises rather than returning a fake zero measurement | HttpEndpointConfig | no | None |
| auth | Authentication configuration | HttpAuthConfig | no | None |
| auth.basic | Basic authentication credentials | HttpBasicAuth | no | None |

#### HttpEndpointConfig parameters

| Parameter | Description | Type | Required | Default |
|-----------|-------------|------|----------|---------|
| url | The HTTP endpoint URL | str | yes | |
| method | HTTP method (GET, POST, PUT, etc.) | str | no | "GET" |
| data | Request body data for POST/PUT/PATCH requests | str | no | None |
| voltage_path | On a `power_read` endpoint: dotted JSON path to the voltage value (e.g. `emeter.voltage`, `StatusSNS.ENERGY.Voltage`) | str | no | top-level `voltage` |
| current_path | On a `power_read` endpoint: dotted JSON path to the current value | str | no | top-level `current` |

#### HttpBasicAuth parameters

| Parameter | Description | Type | Required | Default |
|-----------|-------------|------|----------|---------|
| user | Username for basic authentication | str | yes | |
| password | Password for basic authentication | str | yes | |

## API Reference

```{eval-rst}
.. autoclass:: jumpstarter_driver_power.client.PowerClient()
    :members: on, off, read, cycle
    :no-index:
```

### Examples

Basic power control:
```python
# Power on the device
http_power_client.on()

# Power off the device
http_power_client.off()
```


Reading measurements: `read()` parses the JSON returned by `power_read` and pulls
voltage and current from `voltage_path` / `current_path` (defaulting to top-level
`voltage` and `current` keys). A field the device doesn't report reads as `0.0`; a
configured path that isn't found raises an error.

```yaml
      power_read:
        url: "http://192.168.1.65/cm?cmnd=Status%2010"   # Tasmota
        voltage_path: "StatusSNS.ENERGY.Voltage"
        current_path: "StatusSNS.ENERGY.Current"
```

```{note}
Authentication is optional and supports HTTP Basic Auth only.
```
