From solar-skills
Use when the user asks to export SolisCloud solar data, download solar metrics, get power station data, create hourly solar summary, or mentions SolisCloud export/download. Supports monthly bulk export.
How this skill is triggered — by the user, by Claude, or both
Slash command
/solar-skills:export-hourly-soliscloudThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Export a full month of operating data from SolisCloud and produce a single hourly CSV.
Export a full month of operating data from SolisCloud and produce a single hourly CSV.
Two export methods are available:
$ARGUMENTS — a month in YYYY-MM format. If not provided, use the current month.
$ARGUMENTS contains a value matching YYYY-MM, use it. Otherwise use the current month (date +%Y-%m).TARGET_MONTH (e.g. 2026-01).Check if the SOLISCLOUD_API_KEY environment variable is set:
echo "${SOLISCLOUD_API_KEY:-NOT_SET}"
If set → proceed to Step 3A (API export).
If not set → ask the user with AskUserQuestion:
"SolisCloud API credentials are not configured. How would you like to proceed?"
Options:
/export-hourly-soliscloud after setting env vars.Walk the user through these steps:
Request API access from Solis (one-time):
Once API access is approved:
.../station/stationdetail_1/123456789012345678)~/.zshrc, ~/.bashrc) or a .env file:export SOLISCLOUD_API_KEY="your_key_id"
export SOLISCLOUD_API_SECRET="your_key_secret"
export SOLISCLOUD_STATION_ID="your_station_id"
export SOLISCLOUD_INVERTER_SN="your_inverter_sn"
/export-hourly-soliscloud YYYY-MMpython3 ${CLAUDE_PLUGIN_ROOT}/scripts/api_export.py TARGET_MONTH
This script:
SOLISCLOUD_API_KEY, SOLISCLOUD_API_SECRET, SOLISCLOUD_STATION_ID, SOLISCLOUD_INVERTER_SNPOST /v1/api/inverterDaydata/solar_hourly_YYYY-MM.csvBoth export paths produce identical CSV output. The analyze skill depends on this exact schema.
File: data/solar_hourly_YYYY-MM.csv (or $SOLAR_DATA_DIR/solar_hourly_YYYY-MM.csv when the SOLAR_DATA_DIR environment variable is set — the export scripts honor it automatically).
Date,Hour,Readings,Avg_PV_W,PV_Energy_kWh,Avg_Battery_W,Battery_Energy_kWh,Avg_Grid_W,Grid_Energy_kWh,Avg_GridLoad_W,GridLoad_Energy_kWh,Avg_BackupLoad_W,BackupLoad_Energy_kWh,Avg_SOC_Pct,Min_SOC_Pct,Max_SOC_Pct
| Column | Description |
|---|---|
Date | Date (YYYY-MM-DD) |
Hour | Hour bucket (HH:00) |
Readings | Number of 5-min readings in this hour (typically 12) |
Avg_*_W | Average watts for the hour |
*_Energy_kWh | avg_watts × readings × 5 / 60 / 1000 |
Avg_SOC_Pct | Average battery state of charge (%) |
Min_SOC_Pct / Max_SOC_Pct | SOC range within the hour |
Power units: The SolisCloud JSON API (/api/chart/station/day/v2) returns power values in watts despite powerStr labelling them as "kW". The Chrome export script uses these values directly. To verify: compare one day's Avg_PV_W against the SolisCloud dashboard's Operating Data chart — they should match without any ×1000 scaling.
Try running the fetch script with cached auth first:
python3 ${CLAUDE_PLUGIN_ROOT}/scripts/chrome_fetch.py TARGET_MONTH
Using cached auth and succeeds → skip to Step 8B.Auth cache expired, No auth provided, or exits with code 2 → proceed to Step 4B to capture fresh auth.Call list_pages to check for an existing SolisCloud tab (URL contains soliscloud.com).
If found, call select_page to switch to it.
If not found, call new_page then navigate_page to https://www.soliscloud.com.
Call take_snapshot to check the current page state.
If the page shows a login form (not the dashboard), ask the user via AskUserQuestion:
Please log into SolisCloud in Chrome, then reply here to continue.
Once the user replies, call wait_for until the dashboard or plant list is visible before proceeding.
navigate_page to https://www.soliscloud.com/overview/plantStation.wait_for until the Plant List table is visible, then take_snapshot to get element UIDs.list_pages to find the new tab (URL contains /details/overview/), then select_page to switch to it. Close any duplicate tabs for the same URL..../details/overview/1298491919450376600). Store as STATION_ID.wait_for until the Operating Data panel is visible.take_snapshot to locate the Day/Month/Year tab row and the < / > date arrows.TARGET_MONTH, click the < or > arrow until it is, waiting for the chart to update each time.Click the < date arrow to trigger a /api/chart/station/day/v2 request.
Then find it in the network log:
list_network_requests (resourceTypes: xhr, fetch) → find the most recent /api/chart/station/day/v2 entry → note its reqid
Call get_network_request(reqid) to retrieve the full request headers and body.
Parse the cookie header and station ID from the get_network_request result, then pipe them to the fetch script. The session token is in the httpOnly token=token_<uuid> cookie; captured Content-MD5, Time, and Authorization headers are request-specific and should not be replayed.
python3 ${CLAUDE_PLUGIN_ROOT}/scripts/chrome_fetch.py TARGET_MONTH <<'EOF'
{
"cookie": "token=token_<uuid>",
"device_id": "<device-id header value, optional>",
"station_id": "1298491919450376600"
}
EOF
Fill in the cookie from the captured request's Cookie header and the station ID from the plant details URL or captured body id. The script re-signs every request, fetches every day in TARGET_MONTH, saves auth to data/.soliscloud_auth.json, and writes data/solar_hourly_TARGET_MONTH.csv.
If the script exits with code 2 (auth rejected), the cache is stale — repeat steps 4B–7B.
Searches MemPalace before answering questions about past work, people, projects, or prior decisions. Returns verbatim stored content instead of guessing from model memory.
Guides Payload CMS config (payload.config.ts), collections, fields, hooks, access control, APIs. Debugs validation errors, security, relationships, queries, transactions, hook behavior.
Implements vector databases with Pinecone, Weaviate, Qdrant, Milvus, pgvector for semantic search, RAG, recommendations, and similarity systems. Optimizes embeddings, indexing, and hybrid search.
npx claudepluginhub marfillaster/solar-skills --plugin solar-skills