How to test with Virtual Devices

Last updated: October 9, 2026

Simulate solar, battery, thermostat, and EV telemetry on demand, with no real hardware required.

Virtual Devices is a simulator built into the Texture dashboard that stands in for real hardware. It generates realistic, continuously updating telemetry for any device type under any conditions you choose, such as a battery in backup mode, a heat wave in Phoenix, or a fleet of 8 EVs charging overnight. Use it to test your integration, demo a scenario, or reproduce an edge case without waiting on real-world weather, hardware, or customer behavior.

Virtual Devices lives under Developer → Virtual Devices and has three tabs: Accounts (virtual OEM accounts used to test the Connect flow), Sites (each site runs a scenario that drives its telemetry), and Devices (the individual simulated inverters, batteries, thermostats, and EV chargers).

Devices don't play back pre-recorded data. Each site runs a seeded simulation of solar position, weather, building load, HVAC, and battery dispatch, all driven by the settings you choose. Change a setting and the simulated telemetry changes with it.

Step 1: Create a virtual account

Virtual devices belong to a virtual TextureOS OEM account. During testing, the Connect flow treats this account as your customer's account.

  1. Open Virtual Devices. Go to Developer → Virtual Devices → Accounts.

  2. Click Create Account.

  3. Fill in the form. Enter a name, an email, and a password, and choose an Account Type. Default reuses your workspace's default virtual account; OAuth creates a new account with its own Connect-flow credentials, which is what you want for testing the Connect flow.

  4. Click Create. Your new account appears in the list with a confirmation message.

Step 2: Create a virtual site

A site is where you pick a scenario preset, optionally adjust its settings, and create devices, all in one dialog.

  1. Open the Sites tab and click Create Site.

  2. Name the site. Choose something that describes what you're testing.

  3. Pick a preset. This is the biggest decision in the form. Each preset is a realistic combination of device roles (solar, battery, HVAC, EV, EV charger) and baseline settings. The description and role badges show what it simulates before you change anything. See the preset list below.

  4. Set reproducibility and location (optional). A fixed Seed replays the exact same noise pattern every time, and Start can be back-dated to simulate a past window instead of "now." Location (search for an address) and Timezone feed the solar-position and weather model directly, so they affect the results. Both default to the preset's location if you leave them blank.

  5. Adjust parameters (optional). See Step 4.

  6. Create devices (optional). At the bottom of the dialog, choose the account the devices should belong to and check the roles that should get a real device record on this site. You can also skip this and attach existing devices later.

  7. Click Create.

Step 3: Add devices to a site

You can create devices while you create the site (the optional Create devices section in Step 2), or add them later from the Devices tab.

  1. Open the Devices tab and click Create Device.

  2. Choose an account. This is the virtual account the device belongs to.

  3. Choose a site. Every device belongs to a site, and the site's scenario sets what the device simulates. If your workspace has no virtual sites yet, the dialog prompts you to create one first, with a Go to Sites button.

  4. Choose a device type. Options are Battery, Charger, Thermostat, Vehicle, and Inverter.

  5. Click Create.

Step 4: Override scenario settings

Below the location fields, a collapsed Parameters panel lets you customize the preset. You don't need to write any code or JSON.

  1. Expand Parameters. Settings are grouped into Environment, Site, Load, and one section for each role the preset includes (Solar, Battery, HVAC, EV, EVSE). Each field shows a plain-language label, unit, and description.

  2. Expand a section to see each field's current value (the preset default unless you've changed it).

  3. Click Override next to the field you want to change.

  4. Set your value. The control fits the field: percentages use a slider, choices such as battery mode use a menu with readable labels ("Self-consumption (use solar first)"), and optional limits such as the grid charge window or forced rate offer three choices: Use preset default, No limit, or Set a value.

  5. Reset if needed. Click Reset on a field to return to the preset default.

Section headers show a count badge (for example, "2 overridden"), and the Parameters panel shows the total, so you can see what you've customized without opening every section.

Step 5: Review the simulation

After you create the site, its detail page shows the resolved scenario (preset, seed, start time, timezone, location, and any overrides) followed by a Simulation preview.

  • Pick a time window. Choose Next 24h, Last 24h, Last 7 days, First 48h, or a shorter recent window of 15 minutes, 30 minutes, or 1 hour.

  • Read the charts. Site power shows Grid, Load, Solar, Battery (positive when discharging), and HVAC, and a separate chart shows battery state of charge over time.

  • Check the devices. The Devices list shows each simulated device and the role it fills (inverter → solar, battery → battery, thermostat → hvac).

  • Script events. Use the Timeline to add discrete events, such as an outage, a state-of-charge jump, or an API error, on top of the continuous simulation. This tests how your integration reacts to edge cases, not just steady-state telemetry.

NOTE

The charts reflect your settings.

The Solar curve follows the site's latitude, longitude, and cloud cover. The battery curve follows the battery mode and backup reserve you chose. The Load curve follows the preset's usage pattern.

Scenario presets

Each preset is a starting point. Pick the one closest to what you want to test, then override only the few settings that matter.

Residential

Preset

What it simulates

Good for testing

default-site

Mild climate and a typical residential load. No role is required, so only the devices you bind run.

A single device type in isolation, such as just a battery or just an HVAC unit.

solar-battery-summer

Hot, clear summer days in Phoenix with 8 kW of solar and a 13.5 kWh battery in self-consumption.

Peak solar production and a battery charging from excess solar rather than the grid.

tou-peak-shaving

Battery in time-of-use mode, discharging through a 16:00–21:00 peak window.

Rate-driven dispatch, where behavior changes at a specific time of day.

ev-commuter

Daily commute with overnight charging on a home charger.

A single-vehicle overnight charging pattern.

winter-heating

Cold-climate (Minneapolis) home where heat pump load dominates.

Heating-dominated load and a leakier building.

outage-drill

A scheduled 2-hour grid outage 6 hours into the simulation, with the battery backing up the site.

How your integration detects and reacts to an outage; the event is built in.

Commercial

Preset

What it simulates

Good for testing

commercial-office

Office load (weekdays, 07:00–19:00) with 50 kW of solar, four rooftop HVAC units, and a 200 kWh battery peak-shaving to a 120 kW demand limit.

Multiple HVAC units on one site and a site-wide demand cap.

retail-store

Retail load with long open hours, a weekend peak, 30 kW of solar, and two rooftop units.

A load shape with no battery and a weekend-heavier pattern.

fleet-depot

Eight vans charging overnight under a shared site cap, with a 250 kWh battery covering the return spike.

Many EVs and chargers sharing one cap, and what happens when demand exceeds it.

workplace-charging

Office load with six chargers serving anonymous cars that arrive in the morning and leave at night.

Chargers without a specific vehicle record.

Using the API

Everything in the dashboard is also available through the Texture API, so you can set up virtual accounts, sites, and devices from your own test scripts. Requests go to https://api.texturehq.com/v1 and are authenticated with your API key in a Texture-Api-Key header. See the API reference for full request and response details.

A typical flow

  • Find a preset. Call GET /virtual/scenarios and pick a preset ID, such as outage-drill.

  • Create a site. Call POST /virtual/sites with the preset ID and any overrides. You can create devices in the same call.

  • Connect devices. Devices created through the API are registered on the platform with POST /virtual/devices/{id}/connect, after which they appear as connected devices (GET /v1/devices/{id}). Devices on an OAuth account go through the Connect flow instead.

  • Script edge cases. Add events with POST /virtual/sites/{id}/events. Event types are offline, comms_dropout, api_error, outage, set_soc, unplug, plug_in, charge_stall, trip, set_param, and command_failure. Times can be an ISO timestamp or an offset from the site's start, such as +PT6H.

  • Check the results. Read the simulated series with GET /virtual/sites/{id}/timeseries, or a single device's state with GET /virtual/devices/{id}/state.

Accounts

Method

Endpoint

What it does

POST

/virtual/accounts

Create a virtual account (type DEFAULT or OAUTH).

GET

/virtual/accounts

List virtual accounts. Filter with type=OAUTH to find accounts with Connect-flow credentials.

GET

/virtual/accounts/{id}

Get one account, including its Connect-flow credentials.

Scenarios

Method

Endpoint

What it does

GET

/virtual/scenarios

List every scenario preset, with its roles and its settings as JSON Schema.

Sites

Method

Endpoint

What it does

POST

/virtual/sites

Create a site from a preset. Accepts seed, startAt, timezone, latitude, longitude, settings overrides, and up to 50 devices in the same call.

GET

/virtual/sites

List your virtual sites with their scenarios and device bindings.

GET

/virtual/sites/{id}

Get one site.

PUT

/virtual/sites/{id}/scenario

Replace a site's preset and settings. Seed, start time, and location are kept unless you send new ones.

DELETE

/virtual/sites/{id}

Delete a site. Fails while live devices remain at it, or if it's an account's default site.

GET

/virtual/sites/{id}/timeseries

Get the simulated series for every role at a site over a time range (up to 20,160 points).

POST

/virtual/sites/{id}/poll

Queue an immediate platform poll so new scenario state shows up without waiting for the next scheduled poll.

Timeline events

Method

Endpoint

What it does

POST

/virtual/sites/{id}/events

Add one scripted event or an array of up to 100.

GET

/virtual/sites/{id}/events

List the site's timeline: scripted events and recorded commands, oldest first.

DELETE

/virtual/sites/{id}/events/{eventId}

Remove a scripted event. Recorded commands can't be removed.

Devices

Method

Endpoint

What it does

POST

/virtual/devices

Create a virtual device (battery, charger, thermostat, vehicle, or inverter), optionally at a site and under an existing account.

GET

/virtual/devices

List your virtual devices.

PATCH

/virtual/devices/{id}

Move a device to another site and/or set its role.

POST

/virtual/devices/{id}/connect

Register a device on the platform so it appears as a connected device, optionally linking a site and customer.

GET

/virtual/devices/{id}/state

Get a device's simulated state at a point in time (defaults to now).

DELETE

/virtual/devices/{id}

Delete a virtual device. It stops producing data immediately; its platform device record stays until you delete it with DELETE /v1/devices/{id}.

Good to know

  • Same seed, same results. A fixed seed with the same settings always produces the same curves, which makes tests repeatable.

  • Location matters. Location and timezone drive the solar and weather models, so change them to match the region you want to simulate.

  • Start from a preset. Override a handful of settings rather than building a scenario from scratch.

  • Devices are optional at creation. You can create a site first and add devices to it later from the Devices tab (Step 3).