# hammingweight/synkctl architecture

> Architecture diagram of the GitHub repository hammingweight/synkctl, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/hammingweight/synkctl
- Repository: https://github.com/hammingweight/synkctl

## Overview

synkctl is a SunSynk inverter CLI and Go REST client. Its main workflow is command selection, configuration and authentication, then reading inverter or attached-system state, or transforming and submitting inverter settings; results are returned for CLI display. README capabilities also include inverter discovery, credential generation/verification, and separate battery, grid, input, and load queries. The tree identifies these command and REST subsystems, but their unsampled implementations are not detailed here, so uncertain call wiring is omitted.

Main entry points: [`rest/api.go`](https://github.com/hammingweight/synkctl/blob/main/rest/api.go) (HTTP transport), [`cmd`](https://github.com/hammingweight/synkctl/tree/main/cmd) (State queries), [`cmd/client.go`](https://github.com/hammingweight/synkctl/blob/main/cmd/client.go) (Client setup), [`cmd/root.go`](https://github.com/hammingweight/synkctl/blob/main/cmd/root.go) (Command dispatch)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_cli["CLI workflows"]
  node_main["CLI entry<br/>[main.go]"]
  node_commands["Command dispatch<br/>[root.go]"]
  node_reads["State queries"]
  node_discover["Inverter listing<br/>[inverter_list.go]"]
  node_settings["Settings update<br/>[inverter_update.go]"]
  node_apply["Settings apply<br/>[inverter_apply.go]"]
  node_configcmd["Config commands<br/>[configuration.go]"]
end

subgraph group_setup["Configuration and auth"]
  node_configfile["Configuration<br/>[configuration.go]"]
  node_clientfactory["Client setup<br/>[client.go]"]
  node_auth["Authentication<br/>[authentication.go]"]
end

subgraph group_rest["REST client"]
  node_client["Authenticated client<br/>[authentication.go]"]
  node_api["HTTP transport<br/>[api.go]"]
end

subgraph group_domain["Inverter domains"]
  node_inverterapi["Inverter operations<br/>[inverter.go]"]
  node_inverterdata["Inverter settings model<br/>[inverter_struct.go]"]
  node_battery["Battery state<br/>[battery.go]"]
  node_grid["Grid state<br/>[grid.go]"]
  node_input["Input state<br/>[input.go]"]
  node_load["Load statistics<br/>[load.go]"]
  node_plant["Plant data<br/>[plant.go]"]
  node_user["User data<br/>[user.go]"]
  node_details["Object details<br/>[details.go]"]
  node_value_types["CLI value types<br/>[types.go]"]
end

node_operator(("Operator"))
node_sunapi{{"SunSynk API"}}

node_operator -->|"runs"| node_main
node_main -->|"dispatches"| node_commands
node_commands -->|"dispatches"| node_reads
node_commands -->|"dispatches"| node_discover
node_commands -->|"dispatches"| node_settings
node_commands -->|"dispatches"| node_apply
node_commands -->|"dispatches"| node_configcmd
node_configcmd -->|"reads/writes"| node_configfile
node_reads -->|"creates client"| node_clientfactory
node_discover -->|"creates client"| node_clientfactory
node_settings -->|"creates client"| node_clientfactory
node_apply -->|"creates client"| node_clientfactory
node_clientfactory -->|"reads"| node_configfile
node_clientfactory -->|"authenticates"| node_auth
node_auth -->|"requests tokens"| node_sunapi
node_auth -->|"returns"| node_client
node_clientfactory -->|"configures serial"| node_client
node_settings -->|"parses flags"| node_value_types
node_settings -->|"reads and updates"| node_inverterapi
node_apply -->|"updates"| node_inverterapi
node_inverterapi -->|"uses model"| node_inverterdata
node_inverterapi -->|"requests"| node_api
node_reads -->|"queries"| node_battery
node_reads -->|"queries"| node_grid
node_reads -->|"queries"| node_input
node_reads -->|"queries"| node_load
node_reads -->|"queries"| node_inverterapi
node_discover -->|"lists"| node_inverterapi
node_battery -->|"requests"| node_api
node_grid -->|"requests"| node_api
node_input -->|"requests"| node_api
node_load -->|"requests"| node_api
node_plant -->|"requests"| node_api
node_user -->|"requests"| node_api
node_details -->|"requests"| node_api
node_api -->|"HTTP requests"| node_sunapi

click node_main "https://github.com/hammingweight/synkctl/blob/main/main.go"
click node_commands "https://github.com/hammingweight/synkctl/blob/main/cmd/root.go"
click node_reads "https://github.com/hammingweight/synkctl/tree/main/cmd"
click node_discover "https://github.com/hammingweight/synkctl/blob/main/cmd/inverter_list.go"
click node_settings "https://github.com/hammingweight/synkctl/blob/main/cmd/inverter_update.go"
click node_apply "https://github.com/hammingweight/synkctl/blob/main/cmd/inverter_apply.go"
click node_configcmd "https://github.com/hammingweight/synkctl/blob/main/cmd/configuration.go"
click node_configfile "https://github.com/hammingweight/synkctl/blob/main/configuration/configuration.go"
click node_clientfactory "https://github.com/hammingweight/synkctl/blob/main/cmd/client.go"
click node_auth "https://github.com/hammingweight/synkctl/blob/main/rest/authentication.go"
click node_client "https://github.com/hammingweight/synkctl/blob/main/rest/authentication.go"
click node_api "https://github.com/hammingweight/synkctl/blob/main/rest/api.go"
click node_inverterapi "https://github.com/hammingweight/synkctl/blob/main/rest/inverter.go"
click node_inverterdata "https://github.com/hammingweight/synkctl/blob/main/rest/inverter_struct.go"
click node_battery "https://github.com/hammingweight/synkctl/blob/main/rest/battery.go"
click node_grid "https://github.com/hammingweight/synkctl/blob/main/rest/grid.go"
click node_input "https://github.com/hammingweight/synkctl/blob/main/rest/input.go"
click node_load "https://github.com/hammingweight/synkctl/blob/main/rest/load.go"
click node_plant "https://github.com/hammingweight/synkctl/blob/main/rest/plant.go"
click node_user "https://github.com/hammingweight/synkctl/blob/main/rest/user.go"
click node_details "https://github.com/hammingweight/synkctl/blob/main/rest/details.go"
click node_value_types "https://github.com/hammingweight/synkctl/blob/main/types/types.go"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_main,node_commands,node_reads,node_discover,node_settings,node_apply,node_configcmd toneBlue
class node_configfile,node_clientfactory,node_auth toneAmber
class node_client,node_api,node_sunapi toneMint
class node_inverterapi,node_inverterdata,node_battery,node_grid,node_input,node_load,node_plant,node_user,node_details,node_value_types toneRose
class node_operator toneIndigo
```

## Components

### CLI workflows

- [CLI entry](https://github.com/hammingweight/synkctl/blob/main/main.go): `main.go`
- [Command dispatch](https://github.com/hammingweight/synkctl/blob/main/cmd/root.go): `cmd/root.go`
- [State queries](https://github.com/hammingweight/synkctl/tree/main/cmd): `cmd`
- [Inverter listing](https://github.com/hammingweight/synkctl/blob/main/cmd/inverter_list.go): `cmd/inverter_list.go`
- [Settings update](https://github.com/hammingweight/synkctl/blob/main/cmd/inverter_update.go): `cmd/inverter_update.go`
- [Settings apply](https://github.com/hammingweight/synkctl/blob/main/cmd/inverter_apply.go): `cmd/inverter_apply.go`
- [Config commands](https://github.com/hammingweight/synkctl/blob/main/cmd/configuration.go): `cmd/configuration.go`

### Configuration and auth

- [Configuration](https://github.com/hammingweight/synkctl/blob/main/configuration/configuration.go): `configuration/configuration.go`
- [Client setup](https://github.com/hammingweight/synkctl/blob/main/cmd/client.go): `cmd/client.go`
- [Authentication](https://github.com/hammingweight/synkctl/blob/main/rest/authentication.go): `rest/authentication.go`

### REST client

- [Authenticated client](https://github.com/hammingweight/synkctl/blob/main/rest/authentication.go): `rest/authentication.go`
- [HTTP transport](https://github.com/hammingweight/synkctl/blob/main/rest/api.go): `rest/api.go`

### Inverter domains

- [Inverter operations](https://github.com/hammingweight/synkctl/blob/main/rest/inverter.go): `rest/inverter.go`
- [Inverter settings model](https://github.com/hammingweight/synkctl/blob/main/rest/inverter_struct.go): `rest/inverter_struct.go`
- [Battery state](https://github.com/hammingweight/synkctl/blob/main/rest/battery.go): `rest/battery.go`
- [Grid state](https://github.com/hammingweight/synkctl/blob/main/rest/grid.go): `rest/grid.go`
- [Input state](https://github.com/hammingweight/synkctl/blob/main/rest/input.go): `rest/input.go`
- [Load statistics](https://github.com/hammingweight/synkctl/blob/main/rest/load.go): `rest/load.go`
- [Plant data](https://github.com/hammingweight/synkctl/blob/main/rest/plant.go): `rest/plant.go`
- [User data](https://github.com/hammingweight/synkctl/blob/main/rest/user.go): `rest/user.go`
- [Object details](https://github.com/hammingweight/synkctl/blob/main/rest/details.go): `rest/details.go`
- [CLI value types](https://github.com/hammingweight/synkctl/blob/main/types/types.go): `types/types.go`

### Other components

- **Operator**
- **SunSynk API**

## Connections

- Operator → CLI entry: runs
- CLI entry → Command dispatch: dispatches
- Command dispatch → State queries: dispatches
- Command dispatch → Inverter listing: dispatches
- Command dispatch → Settings update: dispatches
- Command dispatch → Settings apply: dispatches
- Command dispatch → Config commands: dispatches
- Config commands → Configuration: reads/writes
- State queries → Client setup: creates client
- Inverter listing → Client setup: creates client
- Settings update → Client setup: creates client
- Settings apply → Client setup: creates client
- Client setup → Configuration: reads
- Client setup → Authentication: authenticates
- Authentication → SunSynk API: requests tokens
- Authentication → Authenticated client: returns
- Client setup → Authenticated client: configures serial
- Settings update → CLI value types: parses flags
- Settings update → Inverter operations: reads and updates
- Settings apply → Inverter operations: updates
- Inverter operations → Inverter settings model: uses model
- Inverter operations → HTTP transport: requests
- State queries → Battery state: queries
- State queries → Grid state: queries
- State queries → Input state: queries
- State queries → Load statistics: queries
- State queries → Inverter operations: queries
- Inverter listing → Inverter operations: lists
- Battery state → HTTP transport: requests
- Grid state → HTTP transport: requests
- Input state → HTTP transport: requests
- Load statistics → HTTP transport: requests
- Plant data → HTTP transport: requests
- User data → HTTP transport: requests
- Object details → HTTP transport: requests
- HTTP transport → SunSynk API: HTTP requests
