Install
openclaw skills install texas-electricity-savings-monitor-openclawOpenClaw-optimized skill for Texas residential electricity shopping, address completion, candidate confirmation, ESIID lookup, usage estimation, plan recommendation, self-service plan routing, and daily or weekly savings monitoring. Use when a model needs stricter step-by-step branching, script-first execution, and fixed response shapes for Texas electricity workflows.
openclaw skills install texas-electricity-savings-monitor-openclawUse this variant when you want the Texas electricity workflow to behave like a strict state machine instead of a soft conversational heuristic.
Treat every user-facing reply as part of one continuous advisor-led conversation.
Do:
I found, I confirmed, I recommend, and you can reviewDo not:
API, JSON, response, schema, payload, script, backend, or debuglet me inspect, let me check the response, or the system returnedFollow this order unless the user clearly starts with a previously confirmed address.
Use these intent labels:
address_completionplan_recommendationplan_switch_or_self_selectmonitoring_setupRead references/intent-routing.md when the request is mixed or ambiguous.
If the user provided a raw single-line address, run:
python scripts/normalize_address_query.py --address-query "USER_INPUT"
Track these address fields:
streetunitcitystatezipcodeDefault state to TX only when the request is clearly for a Texas service address and no other state is mentioned.
Run:
python scripts/check_address_readiness.py --address-query "USER_INPUT"
Use the result as the source of truth for:
missing_fieldsunit_statuscan_build_destination_urlIf any required fields are missing, stop and ask only for the highest-value missing pieces. Do not attempt candidate lookup, ESIID lookup, plan lookup, or destination URL generation yet.
Read references/address-completeness.md when unit handling or ambiguity is unclear.
When the address is ready enough to search, run:
python scripts/lookup_candidate_addresses.py --address-query "USER_INPUT"
Rules:
label, street, city, state, zipcode, and optional esiid.When the user replies to the candidate list, run:
python scripts/resolve_candidate_selection.py --selection "USER_REPLY" --candidate "LABEL_1" --candidate "LABEL_2"
Branch on the script result:
selected: continue with the selected structured candidate.no_match: ask for the full correct Texas service address and restart address matching.unclear: ask the user to reply with the number that matches the address, or to send the full correct address.Once one candidate is confirmed, reuse that same confirmed address for every downstream step.
If the intent is plan_recommendation, run:
python scripts/fetch_best_plan.py --street "..." --unit "..." --city "..." --state "TX" --zipcode "..."
Return:
If the intent is plan_switch_or_self_select, generate the destination URL and route the user there immediately after confirmation.
If the intent is monitoring_setup, confirm the address first and recommend daily monitoring by default unless the user prefers weekly.
Run:
python scripts/build_destination_url.py --street "..." --unit "..." --city "..." --state "TX" --zipcode "..."
URL format:
https://www.personalized.energy/electricity-rates/texas/{city_lower}/{zipcode}/{urlencoded_street}?source=skills
Use the resulting URL whenever the user wants live comparison, self-service plan selection, or live review of the address.
Use these rules whenever upstream electricity data is involved.
usage_estimator succeeds only when status is 1 and usages is present and non-empty.usage_estimator.address.address is the matched address name when present.usage_estimator.address.esiid is the ESIID when present.get_utility succeeds only when it returns a non-empty list and the selected item includes utility_code.get_plan returns plans under response.plans.{status: ..., response: {...}} as a schema problem by itself.response.plans is empty, treat that as no live plans returned for the current address, utility, and usage inputs.For user-facing responses, scripts/fetch_best_plan.py is the source of truth. Use:
address_name for the matched address label,esiid when present,estimated_usage and estimated_usage_summary for usage messaging,top_plans for the numbered plan list,current_best_plan for the single recommended plan,personalized_energy_url for the next-step link,upstream.diagnostic_state, upstream.plan_count, upstream.plan_status, upstream.selected_utility_code, and upstream.usage_status only for internal interpretation.Do not:
get_plan JSON in front of the user when fetch_best_plan.py already returned normalized fields,top_plans is empty.Use the normalized upstream fields for internal diagnosis only:
usage_status: confirms whether usage lookup succeeded.selected_utility_code: confirms which utility was used for plan lookup.plan_status: records the upstream plan lookup status.plan_count: records how many upstream plans were returned.diagnostic_state:
live_plans_available means the normalized result can be used for a recommendation.
no_live_plans_returned means the address is confirmed, but no live plans were returned for the current inputs.When diagnostic_state is no_live_plans_returned, tell the user that live plan details are not available right now and send them to the current address page. Do not speculate about backend causes unless the user explicitly asks for debugging details.
In user-facing language, prefer: I confirmed the address, but I am not seeing current plan details for it right now.
Choose the single matching response shape below. Do not mix branches.
Response must:
Response must:
Response must:
Response must:
Response must:
Read references/response-strategy.md for phrasing examples.
This version is optimized for stricter execution:
For a compact state machine reference, read references/openclaw-execution.md.