admin 14 tools · 8 R · 6 W · 1 disabled

ToolR/WHTTP + EndpointStatusDescription
createDynamicDashboard W POST /api/DynamicDashboards enabled HITL write — Create a new dynamic dashboard owned by the current user on one interface. Scope: dashboard is owned by the caller (BE sets UserId from JWT). Other org members will NOT see it (no auto-share). Body: interfaceId (required), name (required, max 100 chars), description (optional, max 500 chars), isPopular (optional bool, default false), layout (optional JSON object — typical shape { widgets: [{ type, position, config }], setting?: { customStyle?: {...} } }). Returns the created dashboard with assigned Id (Guid). BE enforces InterfaceWrite scoped to InterfaceId. Confirmation required.
createGlobalConfiguration W POST /api/globalconfiguration enabled HITL write — Create a new GlobalConfiguration record on one interface. Scope is PER-INTERFACE only (not tenant-wide). Body: interfaceId (required), siteAreaSize (m², METRIC ONLY, optional), waterCostPerKl (currency-agnostic numeric, optional), startDay (1-31, optional), startMonth (1-12, optional). CASCADE: waterCostPerKl flows into MTD cost calculations across Reports — applied to NEW computations only, NOT retroactively rewritten on historical rows. siteAreaSize feeds water/area normalisation in Reports. Multiple records per interface are allowed; reporting typically reads the most recent. Returns the created record. BE enforces InterfaceWrite scoped to InterfaceId. Confirmation required.
deleteDynamicDashboard W DELETE /api/DynamicDashboards/${args.id} DISABLED HITL write — Delete a dynamic dashboard by ID (Guid). DESTRUCTIVE — cannot be undone, no soft-delete recovery. CASCADE: bookmarks/links pointing to this dashboard ID will 404 going forward; the underlying widget data sources (sensors, programs) are NOT affected. The Layout JSON and any per-dashboard customStyle are permanently lost. BE permission gap: NO [RequireAuthorization] — service layer scopes by current userId only (caller can only delete dashboards they own). Returns boolean. Confirmation required.
getDynamicDashboard R GET /api/DynamicDashboards/${id} enabled Get a single dynamic dashboard by ID (Guid). Returns { Id, UserId, InterfaceId, Name, Description, IsPopular, Layout (JSON object) }. Read-only. BE permission gap: NO [RequireAuthorization] attribute — the service layer scopes by current userId only. Returns 404 (or null) when the caller does not own the dashboard.
getErrorCode R GET /api/errorCode/${interfaceId}/${errorCode} enabled Translate a numeric error code emitted by a controller into operator-friendly text. Error codes are INTERFACE-SCOPED — the same numeric code (e.g. 17) may mean different things across interface types (TWC vs decoder vs MQTT). Always pass the originating interfaceId. Returns { InterfaceId, ErrorCode, Description, Severity? } when matched, or null when the (interfaceId, errorCode) pair has no entry in the BE catalogue. Used to decorate raw codes from interface logs / alerts. Read-only. JWT-authenticated only.
getGlobalConfiguration R GET /api/globalconfiguration/${interfaceId}/${id} enabled Get a single GlobalConfiguration record by ID, scoped to one interface. Returns { Id, InterfaceId, SiteAreaSize (m²), WaterCostPerKl, StartDay (1-31), StartMonth (1-12) }. EndDay/EndMonth fields are commented out on BE and never populated. Read-only. BE enforces InterfaceRead scoped to interfaceId.
getMyProfile R GET /api/user/profile enabled Get the current user profile for the bearer-token user. Returns { Id, Name, Email, Role (e.g. /), Organizations: [...], MeasureId (1=Metric, 2=Imperial), Language (BCP-47 code, e.g. /), TimeZone (timezone row ID — NOT IANA string, NOT GMT offset), GMTTimeZoneId }. Reads /api/user/profile which the BE proxies to the Identity service /api/users/me and enriches with measure/language/timezone fallbacks. Read-only. JWT-authenticated only — operates on the caller\
getTimezonesByCountry R GET /api/timezone/get-by-country enabled List timezones for a country (or all timezones when countryId is omitted). Each item: { Id (numeric — THIS is what updateMyProfile.timeZone expects, NOT the IANA string), ZoneId (IANA name e.g.
listCountries R GET /api/country enabled List all countries known to CisgenX. Each item: { Id (numeric, used as countryId in other tools), Name, ISO (2-letter ISO 3166-1 alpha-2 e.g. ), ISO3 (3-letter alpha-3 e.g. ), ISONumeric (3-digit code e.g. 704), FIPS code }. Static reference data — safe to cache for the session. Returns the full unpaged list. Used to populate country pickers and to feed countryId into getTimezonesByCountry. Read-only. JWT-authenticated only.
listDynamicDashboards R GET /api/DynamicDashboards enabled List dynamic dashboards visible to the current user on one interface. Scope: BE service layer scopes by current userId — returns dashboards owned by the caller (use userId filter to narrow). Each item: { Id (Guid), UserId, InterfaceId, Name, Description, IsPopular, Layout (JSON: { widgets: [...], setting?: {...} }) }. Returns paged result { Items, TotalCount, PageIndex, PageSize }. Read-only. BE enforces InterfaceRead scoped to the query interfaceId.
listGlobalConfigurations R GET /api/globalconfiguration enabled List GlobalConfiguration records for ONE interface (controller). Despite the name, scope is PER-INTERFACE — not tenant-wide and not org-wide. Each record carries site-level settings used by reporting and irrigation calculations: SiteAreaSize (m², metric only), WaterCostPerKl (currency-agnostic numeric, applied to MTD cost in reports), StartDay (1-31), StartMonth (1-12). Returns a paged list { Items: [...], TotalCount, PageIndex, PageSize }. Read-only. BE enforces InterfaceRead scoped to interfaceId.
updateDynamicDashboard W PUT /api/DynamicDashboards/${args.id} enabled HITL write — Update an existing dynamic dashboard by ID (Guid). Full-replacement (PUT) semantics on the layout: passing layout overwrites the entire stored Layout JSON, NOT a merge — to preserve existing widgets, fetch with getDynamicDashboard first, mutate, then send the full object back. name and isPopular also fully replace. description=undefined will clear to empty string (BE coalesces ?? \). Body: id (required, Guid), name (required, max 100), description (optional, max 500), isPopular (optional bool), layout (optional JSON). CASCADE: changes affect this dashboard only — sibling dashboards or shared widget templates are not impacted. BE permission gap: NO [RequireAuthorization] — service layer scopes by current userId only. Returns the updated dashboard. Confirmation required.
updateGlobalConfiguration W PUT /api/globalconfiguration enabled HITL write — Update an existing GlobalConfiguration record. PUT semantics: BE accepts only the fields you send (this tool omits undefined fields from the body); existing values are preserved for omitted fields. Body: id (required), interfaceId (required), siteAreaSize (m², METRIC ONLY, optional), waterCostPerKl (optional), startDay (1-31, optional), startMonth (1-12, optional). CASCADE: changing waterCostPerKl affects MTD cost calculations going forward only — historical Reports rows already computed are NOT rewritten. siteAreaSize changes will re-normalise upcoming Reports water-per-area metrics. Returns the updated record. BE enforces InterfaceWrite scoped to InterfaceId. Confirmation required.
updateMyProfile W PUT /api/user/profile enabled HITL write — Update the current user profile. Only profile preferences are mutable here: measureId, language, timeZone, gmtTimeZoneId. Body fields (all optional, omitted fields unchanged): measureId (1=Metric, 2=Imperial), language (BCP-47 code, e.g. /), timeZone (timezone row ID from /api/timezone — call getTimezonesByCountry to discover; NOT an IANA string), gmtTimeZoneId (alternate timezone ID). User Role/Email/Name are NOT settable from this endpoint. CASCADE / session staleness: the new settings persist immediately in Identity, but the current session\

agronomic 27 tools · 10 R · 17 W · 5 disabled

ToolR/WHTTP + EndpointStatusDescription
createEmitter W POST /api/Emitter enabled Create a new emitter type (sprinkler / drip / rotor / bubbler) on an interface. Used by stations to convert program minutes to applied water depth. Confirmation required (HITL).
createEtReference W POST /api/ETReference/${proposedArgs.interfaceId} enabled Create a new ET reference (historical evapotranspiration profile) on an interface. Includes 12 monthly average daily ET values (January..December in mm/day) plus the remote ET source. METRIC ONLY. Confirmation required (HITL). Set isUsed=true to make this the active reference for the interface.
createEtZone W POST /api/ETZone enabled Create a new ET zone on an interface. Groups one or more stations under a shared ET-driven irrigation zone (used by CisgenicET program mode). Geometry is optional (GeoJSON Polygon for the zone boundary on the map). Confirmation required (HITL).
createPlant W POST /api/Plant enabled Create a new plant species/cultivar on an interface. METRIC ONLY for measurements. Confirmation required (HITL). Used by stations/programs to compute water need = ET * Kc and to decide cycle/soak split.
createSoil W POST /api/Soil enabled Create a new soil profile on an interface. METRIC ONLY. Confirmation required (HITL). Soil parameters set the upper bound on run-time before runoff and drive cycle/soak split decisions.
deleteEmitter W DELETE /api/Emitter DISABLED Delete an emitter type by ID. DESTRUCTIVE — cannot be undone. Stations that reference this emitter will lose their emitter link. Confirmation required (HITL).
deleteEtReference W DELETE /api/ETReference/${interfaceId}/${id} DISABLED Delete an ET reference by ID. DESTRUCTIVE — cannot be undone. Plants linked via waterReferenceId and programs running on RunCisgenET / Evapotranspiration mode will lose their ET source. Confirmation required (HITL).
deleteEtZone W DELETE /api/ETZone DISABLED Delete an ET zone by ID. DESTRUCTIVE — cannot be undone. Stations grouped under this zone will lose the zone link. Programs running on CisgenicET mode that target this zone will need to be re-pointed. Confirmation required (HITL).
deletePlant W DELETE /api/Plant DISABLED Delete a plant species/cultivar by ID. DESTRUCTIVE — cannot be undone. Stations/programs that reference this plant will lose their plant link. Confirmation required (HITL).
deleteSoil W DELETE /api/Soil DISABLED Delete a soil profile by ID. DESTRUCTIVE — cannot be undone. Stations that reference this soil will lose their soil link. Confirmation required (HITL).
getEmitter R GET /api/Emitter/${interfaceId}/${id} enabled Get detailed information about a specific emitter type.
getEtReference R GET /api/ETReference/${interfaceId}/${id} enabled Get detailed information about a specific ET reference (full 12-month profile + remote ET).
getEtZone R GET /api/ETZone/${interfaceId}/${id} enabled Get detailed information about a specific ET zone (geometry, stations, sensor link).
getFilteredEmitters W POST /api/emitter/filteredemitter enabled Filter emitter records by interface and selection state across one or more interface groups. Body is an ARRAY of filter blocks: each block carries interfaceId + emitterIds (numeric array) + isSelected (boolean). Returns a flat list of { id, name, interfaceId, isSelected } matching the filter. Read-only despite the POST verb. Used in Manual Operation flow to verify which emitters are currently selected per interface.
getFilteredPlants W POST /api/plant/filteredplant enabled Filter plant records by interface and selection state across one or more interface groups. Body is an ARRAY of filter blocks: each block carries interfaceId + plantIds (numeric array) + isSelected (boolean). Returns a flat list of { id, name, interfaceId, isSelected } matching the filter. Read-only despite the POST verb. Used in Manual Operation flow to verify which plants are currently selected per interface.
getPlant R GET /api/Plant/${interfaceId}/${id} enabled Get detailed information about a specific plant by id (including linked ET reference profile).
getSoil R GET /api/Soil/getbyid enabled Get detailed information about a specific soil profile. The profile carries Wilting Point, Holding Capacity, Water Target, and (when present) a Deviation Threshold used to decide DRY (moisture < Water Target by more than Deviation Threshold; if Deviation Threshold is missing from the response, fall back to LLM judgment and surface that the threshold is unconfigured). Recovery = moisture returns to Water Target. Soil-moisture decisions are sensor/microclimate-scoped: every station bound to the same microclimate shares this profile.
listEmitters R GET /api/Emitter enabled Get paged list of emitter types (sprinkler / drip etc.) configured on a specific interface. Returns emitter name and efficiency.
listEtReferences R GET /api/ETReference enabled Get paged list of ET references (historical evapotranspiration profiles) for an interface. Used by RunCisgenET / Evapotranspiration program modes and referenced by plant.waterReferenceId.
listEtZones R GET /api/ETZone/${interfaceId} enabled Get paged list of ET zones for a specific interface. Returns zone name, optional sensor/floor links, geometry, and the stations grouped under each zone.
listPlants R GET /api/Plant enabled Get paged list of plant species/cultivars configured on a specific interface. Returns plant description, root zone, allowable depletion, factor, and the linked ET reference.
listSoils R GET /api/Soil enabled Get paged list of soil profiles configured on a specific interface. Returns soil description, holding capacity, wilting point, intake rate, and max surface accumulation. Soil-moisture irrigation logic is sensor/microclimate-based, not per-station: every station attached to the same microclimate inherits the same Wilting Point / Holding Capacity / Water Target thresholds from this profile. DRY condition = current sensor moisture is below Water Target by more than the configured Deviation Threshold (if the BE response omits Deviation Threshold, fall back to LLM judgment and note in your reply that the threshold is not configured). Recovery (post-irrigation) = sensor moisture returns to Water Target.
updateEmitter W PUT /api/Emitter enabled Update an existing emitter type. Full-replacement (PUT). Confirmation required (HITL).
updateEtReference W PUT /api/ETReference/${proposedArgs.interfaceId}/${proposedArgs.id} enabled Update an existing ET reference (12-month profile + remote ET source). METRIC ONLY. Confirmation required (HITL). Full-replacement (PUT) — all 12 monthly values written.
updateEtZone W PUT /api/ETZone enabled Update an existing ET zone. Full-replacement (PUT) — name, sensor/floor links, geometry, and station group all written. Confirmation required (HITL).
updatePlant W PUT /api/Plant enabled Update an existing plant species/cultivar. All fields are full-replacement (PUT semantics — null fields clear). METRIC ONLY for measurements. Confirmation required (HITL).
updateSoil W PUT /api/Soil enabled Update an existing soil profile. METRIC ONLY. Confirmation required (HITL). Full-replacement (PUT) — all fields written.

alerts 1 tools · 1 R · 0 W

ToolR/WHTTP + EndpointStatusDescription
getAlerts R GET /notification/api/notification/${interfaceId}/${encodeURIComponent(email)} enabled Get alerts and notifications for the current user on a specific interface. Returns system alerts, irrigation warnings, and device notifications.

devices 9 tools · 8 R · 1 W · 1 LIVE

ToolR/WHTTP + EndpointStatusDescription
getAreaHierarchy R GET enabled Get the area hierarchy (parent areas + their sub-areas) for an interface. Use this to map stations to zones/areas for reports or to answer questions. Returns a combined tree: each parent area has a subAreas[] array populated from the sub-area endpoint.
getControllerDetails R GET /api/controller/get-details enabled Get detailed information about controllers (IO configuration) for a specific interface.
getDiagnostics R GET /api/diagnostic enabled Get diagnostic data (station diagnostics) for a specific interface. Requires interfaceId — ASP.NET rejects the request with 400 if it is missing.
getInterfaces R GET enabled Get list of interfaces (sites/properties) accessible to the current user. An interface represents a physical site or controller installation. Returns a paged result — read for the array of interfaces (each has
getStationDetails R GET /api/station/${interfaceId}/getlistwithdetail enabled Get stations with full detail including flow rates and configuration.
getStationMapOverlay R GET /api/station/${interfaceId}/station-mapoverlay enabled Get station locations and status for map visualization.
listControllers R GET /api/controller enabled Get paged list of controllers/decoders for a specific interface. Returns controller names, types, connection status, and associated interfaces.
listStations R GET /api/station/${interfaceId} enabled Get list of irrigation stations for a specific interface. Returns station names, zones, valve types, and flow information.
runStation LIVE HARDWARE W POST /api/station/run enabled Start or stop one or more irrigation stations manually. mode=1 starts the stations for the given runningTime (format ); mode=2 stops them. Accepts multiple stations in a single call. Station metadata (id, address, index, locationId, programIds, etc.) should come from listStations or getStationDetails. LIVE HARDWARE: confirm via UI before executing.

fertigation 16 tools · 7 R · 9 W · 3 disabled

ToolR/WHTTP + EndpointStatusDescription
createCisFertigation W POST /api/CisFertigation enabled Create a new CIS-style fertigation on a pipe. Modern fertigation profile (preferred over legacy fertigation tools). Optionally links auxiliary devices via Guid ids: fertiliser line, agitator, flushing decoder, flow sensor, pump start, and water level decoder. Confirmation required (HITL).
createFertigation W POST /api/Fertigation enabled Create a new legacy fertigation profile on an interface. Used by older CIS controllers; new installations should prefer cisFertigation tools instead. Confirmation required (HITL).
createTurfQuality W POST /api/TurfQuality enabled Create a new turf quality preset. Programs reference these via program.turfQualityId to apply a global irrigation-factor multiplier and a calculated water budget. Confirmation required (HITL).
deleteCisFertigation W DELETE /api/CisFertigation/${id} DISABLED Delete a CIS fertigation by Guid ID. DESTRUCTIVE — cannot be undone. Programs that reference this fertigation will lose the link. Confirmation required (HITL).
deleteFertigation W DELETE /api/Fertigation DISABLED Delete a legacy fertigation profile by ID. DESTRUCTIVE — cannot be undone. Programs that reference this fertigation in program.fertigations[] will lose the link. Confirmation required (HITL).
deleteTurfQuality W DELETE /api/TurfQuality DISABLED Delete a turf quality preset by ID. DESTRUCTIVE — cannot be undone. Programs that reference this preset via turfQualityId will lose the link. Confirmation required (HITL).
getCisFertigation R GET /api/CisFertigation/${id} enabled Get detailed information about a specific CIS fertigation by Guid id.
getFertigation R GET /api/Fertigation/${interfaceId}/${id} enabled Get detailed information about a specific legacy fertigation profile.
getTurfQuality R GET /api/TurfQuality/${id} enabled Get detailed information about a specific turf quality preset.
listCisFertigationsByPipe R GET /api/CisFertigation/${interfaceId}/${pipeId} enabled Get paged list of CIS-style fertigations on a specific pipe. Use this when investigating which fertigations run through a particular pipe.
listCisFertigationsByPipes R GET enabled Get a flat list of CIS-style fertigations across multiple pipes (basic fields only). Useful when summarising fertigations across an irrigation site without paging.
listFertigations R GET /api/Fertigation enabled Get paged list of legacy fertigation profiles for an interface. Referenced by program.fertigations[]. Returns name, address, controller link, and capacity.
listTurfQualities R GET /api/TurfQuality enabled Get paged list of turf quality presets. Programs reference these via program.turfQualityId. Returns name, irrigation factor, and calculated water budget.
updateCisFertigation W PUT /api/CisFertigation enabled Update an existing CIS fertigation. Full-replacement (PUT) — all linked device Guids written. Pass null to clear an optional device link. Confirmation required (HITL).
updateFertigation W PUT /api/Fertigation enabled Update an existing legacy fertigation profile. Full-replacement (PUT). Confirmation required (HITL).
updateTurfQuality W PUT /api/TurfQuality enabled Update an existing turf quality preset. Full-replacement (PUT). Confirmation required (HITL).

geography 40 tools · 16 R · 24 W · 7 disabled

ToolR/WHTTP + EndpointStatusDescription
createArea W POST /api/area/parent enabled Create a new PARENT area on a CisgenX interface (POST /api/area/parent). A parent area can optionally bulk-create sub-areas in the same call by passing a list of sub-area names in . The BE assigns ids sequentially (parent first, then each sub) — concurrent creates may race. Use to add a sub-area to an existing parent. Precondition: the interface must be ONLINE — BE returns 404 if it is not.
createCustomMarker W POST enabled Create a new operator-placed custom marker (map pin) on a floor. Markers are used to label pump stations, sensor clusters, gates, and other points of interest in the map view. Coordinates are decimal degrees latitude/longitude (METRIC ONLY); the field names are / (do NOT use station-style names). shortName is capped at 2 characters and auto-uppercased to match the FE form convention. note is capped at 256 characters by BE validation. Interface must be online; otherwise the API returns 404 Interface_Offline.
createFloor W POST /api/floor enabled Create a new floor (Level) under a location. Required: interfaceId, locationId, name. The default-floor flag (isDefault) is BE-managed and NOT exposed by this tool — the FE create form does not render it, and BE auto-promotes the appropriate floor based on count and ordering. Returns rows-affected as a bare integer (NOT the new floor id); to surface the new id, chain a listFloorsByLocation call after this succeeds.
createFloorOverlay W POST /api/flooroverlay enabled Create OR replace a floor overlay — an image bounding box (with rotation) pinned over a floor on the map. Body fields: topRightLatitude, topRightLongitude, bottomLeftLatitude, bottomLeftLongitude (decimal degrees, METRIC), rotate (degrees, usually 0), imageUrl + imageFileName (the desktop-density image), mobileImageUrl + mobileImageFileName (the mobile-density image — pass empty strings if not applicable), typeId (1 = OverlayWithAllAnnotations, 2 = OverlayWithoutPipes), floorId, interfaceId. SILENT UPSERT: if a floor overlay already exists for (interfaceId, floorId, typeId), the BE transparently flips to UpdateAsync, overwrites all fields, AND deletes the previous image from S3 storage. IMAGE UPLOAD IS OUT OF SCOPE FOR THIS TOOL: upload the overlay image via the web UI first to obtain the S3 URL, then pass it as . This tool only sends a JSON body; it does not handle multipart image bytes.
createLocation W POST /api/location enabled Create a new location under a site. The body is name + parent siteId + interfaceId; locations carry no map coordinates of their own (overlay/pin coordinates are managed via the separate floor-overlay flow). Side effect: creating a location also auto-creates a default floor named under it (LocationAppService.cs:260-271). Note: the web UI restricts to 1 location per site, but this tool can create additional ones via API. Confirm with the user this is intentional before calling. Returns the BE SaveChangesAsync rows-affected count, not the new id; follow up with listLocations to look up the new location id if needed.
createSite W POST /api/site enabled Create a new site on a CisgenX interface. Sites are the top of the geography hierarchy (site > location > floor > stations). Sites carry only a name — no map coordinates at create time (lat/lng is added later via the separate site-overlay flow). Requires InterfaceWrite permission. BE returns the SaveChangesAsync result (rows affected); the new site id is not directly returned, so follow up with listSites if the caller needs the id.
createSiteOverlay W POST /api/siteoverlay enabled Create OR replace the site overlay — the single-point lat/lng pin marker shown for a site on the map. Body fields: latitude, longitude (both decimal degrees, METRIC), siteId, interfaceId. SILENT UPSERT: if a site overlay already exists for (interfaceId, siteId), the BE transparently flips to UpdateAsync and overwrites the existing coordinates — no 409 conflict is raised. No image is uploaded by this tool — the site overlay is just a coordinate pair, not an image overlay.
createSubArea W POST /api/area enabled Create a new SUB-AREA under an existing parent area on a CisgenX interface (POST /api/area). Returns 404 if the given parentId does not exist on the interface. To create a parent area instead, use createArea. Precondition: the interface must be ONLINE — BE returns 404 if it is not.
deleteArea W DELETE /api/area DISABLED Delete an area (parent OR sub) on a CisgenX interface (DELETE /api/area). A single endpoint serves both: pass any area id and the BE deletes it. If the id refers to a PARENT area, all of its sub-areas are deleted in cascade. PRECONDITION: cannot delete an area that has stations pinned. The BE returns 403 Forbidden () if any station has subAreaId equal to this area id or any of its child area ids. Use getAreaHierarchy or station tools first to verify, or re-pin those stations to a different area before calling delete. Precondition: the interface must be ONLINE — BE returns 404 if it is not.
deleteCustomMarker W DELETE /api/markercustom DISABLED Permanently delete a custom marker (map pin) by id. No cascade to other entities; just removes the marker row. Note: in the FE, the trash icon deletes immediately without a confirmation dialog — this copilot HITL prompt is the only safety net. Interface must be online; otherwise the API returns 404 Interface_Offline. If the user only mentions the marker by name, look it up via listCustomMarkers first to surface the marker name in the confirmation summary.
deleteFloor W DELETE /api/floor DISABLED Permanently delete a floor (Level). Cascade: BE orphans every station on this floor (clearing their floorId to null) and removes the floor overlay rows for this floor from the DB. Note: floor-overlay images on S3 are NOT cleaned up by this delete path (only deleteSite / deleteLocation also remove S3 images). WIRE FORMAT: this DELETE uses LOWERCASE query keys (?interfaceid=&id=) — the only delete in the geography batch with lowercase keys. The FE wire matches floorApi.ts:27-29; ASP.NET model binding is case-insensitive on the BE side.
deleteFloorOverlay W DELETE /api/flooroverlay DISABLED Permanently delete a floor overlay (image bounding box on the map). Removes the overlay row from the database AND deletes the associated image file from S3 storage. The floor itself, its stations, and any custom markers are NOT affected. IMPORTANT: This is a destructive write action. The web UI does NOT show a confirm modal for this delete (single-click X-icon delete) so always confirm details with the user before executing.
deleteLocation W DELETE /api/location DISABLED Permanently delete a location and cascade-delete its child entities. Cascade behavior (LocationAppService.cs:294-370): all floors under the location are deleted; all floor overlays under those floors are deleted (including S3 image cleanup); every station on those floors is orphaned (floorId and GPS coordinates cleared); every controller assigned to the location is orphaned (locationId set to null); the location row is then removed. This is irreversible. IMPORTANT: This is a destructive write action. Always confirm details with the user before executing — the HITL summary spells out the cascade in full.
deleteSite W DELETE /api/site DISABLED Permanently delete a site. WARNING: 5-level cascade. Deleting a site removes every child location, every floor under those locations, every floor overlay (plus their S3-hosted images), and every site overlay. Stations on those floors are orphaned (FloorId and GPS coordinates cleared); controllers assigned to those locations are orphaned (LocationId cleared). The deletion is NOT blocked when child data exists — it cascades silently and irreversibly. Requires InterfaceWrite permission. IMPORTANT: This is a destructive write action. Always confirm details with the user before executing, and surface the cascade scope in the confirmation so the user understands the blast radius.
deleteSiteOverlay W DELETE /api/siteoverlay DISABLED Permanently delete a site overlay (the lat/lng pin marker shown for a site on the map). Removes the overlay row only — does NOT touch the site, its locations, floors, stations, or floor overlays. IMPORTANT: This is a destructive write action. The web UI does NOT show a confirm modal for this delete (single-click X-icon delete) so always confirm details with the user before executing.
floorOverlayExists R GET /api/flooroverlay/is-exist enabled Check whether ANY floor overlay record exists for the given interface. Returns a plain boolean (true/false). Used to gate UI features that depend on at least one floor overlay being configured. The check is interface-wide — it does NOT scope to a specific floor.
getArea R GET /api/area/${interfaceId}/${id} enabled Get a single area record (parent OR sub-area) by id on a CisgenX interface. Returns the area with id, name, parentId (null for parent areas), level (1 for parent, 2+ for sub), and a recursive subAreas[] list when the record is a parent. For the full parent + sub-area tree of an interface, use getAreaHierarchy (in devices.ts) instead — that aggregates the same data shape but for ALL areas on the interface in a single call.
getAreaParent R GET /api/area/parent/${interfaceId} enabled List the PARENT areas on an interface (controllers organise areas as parent -> sub-area). Returns a list of DetailAreaResponseDto entries (id, name, parentId=null, level=1). Use when you only need the parent set; for the full tree, prefer getAreaHierarchy. BE enforces InterfaceRead.
getAreaSub R GET /api/area/sub/${interfaceId}/${parentId} enabled List the SUB-AREAS under a single parent area on an interface. Returns DetailAreaResponseDto entries scoped to one parent. Cheaper than getAreaHierarchy when the user only cares about one parent\
getDefaultFloor R GET /api/floor/getdefaultfloor/${locationId} enabled Fetch the default floor (the one with isDefault=true) for a given location. Returns a single FloorResponseDto: { id, interfaceId, locationId, name, isDefault }. 404 if no default floor exists for the location (rare — createLocation auto-creates a default
getFilteredSiteLocations W POST /api/sitelocation/filteredsitelocation enabled Filtered site-location read: POST a list of (interfaceId + siteIds + locationIds + isSelected) selectors and the BE returns the matching site-location set across all selectors in one call. Used by the manual-operation UI to pre-resolve the operator\
getFloor R GET /api/floor/${interfaceId}/${id} enabled Fetch a single floor (Level) by interface + id (the two-segment shape). Returns { id, interfaceId, locationId, name, isDefault }. 404 if no floor with that id exists for the given interface.
getLocation R GET /api/location/${interfaceId}/${id} enabled Fetch a single location record by composite (interfaceId, id). This is the two-segment getter that powers the FE detail view. Returns { id, name, siteId, interfaceId } (sparser than the list shape — no floor counts). Returns 404 if the (interfaceId, id) pair does not match any location.
getSite R GET /api/site/${interfaceId}/${id} enabled Fetch a single site by (interfaceId, id). Returns SiteResponseDto: { id, interfaceId, name, numOfLocations }. Returns 404 if no site with that id exists on the given interface.
getSiteOverlay R GET /api/siteoverlay/${siteId} enabled Get the site overlay (single-point lat/lng pin marker on the map) for a specific site. Returns the overlay record { id, latitude, longitude, siteId, interfaceId } if one exists, or 404 if the site has no overlay configured. Coordinates are decimal degrees (METRIC). BE permission gap — verify with BE team before broad rollout.
listCustomMarkers R GET /api/markercustom enabled List custom markers (operator-placed map pins such as pump stations, sensor clusters, gates) for a given interface and floor. Returns a flat array (NOT paged). Each item includes id, name, shortName, optional note, coordinatedLatitude/coordinatedLongitude (decimal degrees, METRIC ONLY), markerId (icon ref), s3Url (icon image URL), and optional externalURL. Both interfaceId and floorId are required by the BE.
listFloors R GET /api/floor enabled List floors (also called in the FE UI) across an interface, with optional keyword search, sorting, and pagination. Returns a paged envelope: { data, page, size, totalPage, totalCount, mobileTotalCount, sort } where each row is { id, interfaceId, locationId, name, isDefault }. Pass interfaceId via the BE query string when needed; omitting filters returns all floors the user has read access to. BE permission gap — verify with BE team before broad rollout: GET /api/floor has no [RequireAuthorization] attribute.
listFloorsByLocation R GET /api/floor/${locationId} enabled List every floor (Level) under a single location, returned as a flat array (NOT paged) of { id, interfaceId, locationId, name, isDefault } objects. The BE FE method is named getById(locationId), which is misleading because it returns a list — this tool name (listFloorsByLocation) reflects the actual semantic. The path parameter is locationId, NOT interfaceId; BE does not enforce an interface-scope check on this endpoint. Optional filter (note the BE typo — preserved verbatim): pass 1 to restrict the result to floors that LACK an overlay; omit or pass 0 to return all floors. BE permission gap — verify with BE team before broad rollout: GET /api/floor/{locationId} has no [RequireAuthorization] attribute.
listLocations R GET /api/location enabled List locations across the tenant with paging, keyword search, and sort. Returns a PagedResult with shape { data, page, size, totalPage, totalCount, mobileTotalCount, sort }. Each location row includes id, name, siteId, interfaceId, numOfFloors, and numOfFloorOverlays. BE permission gap — verify with BE team before broad rollout: this endpoint lacks [RequireAuthorization] and may return cross-tenant rows depending on the caller token scope.
listSiteLocations R GET /api/sitelocation enabled Get a paged list of site-location pairs (Site x Location intersections used for irrigation org tree) on an interface. Optional filtering by locationId, free-text keyword, sort. BE enforces InterfaceRead.
listSites R GET /api/site enabled List all sites the caller can see, paginated. Sites are the top of the CisgenX geography hierarchy (site > location > floor > stations). Returns a PagedResult with shape { data: SiteResponseDto[], page, size, totalPage, totalCount, mobileTotalCount, sort } where each row is { id, interfaceId, name, numOfLocations }. Sort is whitelisted to id/name/numOfLocations on the BE; other sortBy values are silently ignored. BE permission gap — verify with BE team before broad rollout: this endpoint has no [RequireAuthorization] attribute and may return sites across every interface the caller has any visibility into.
listSitesByOverlay R GET /api/siteoverlay/${interfaceId}/sites enabled List all sites for an interface paired with their overlays and a nested location/floor/overlay tree. Heavy aggregator query used by the map dashboard. Returns a paged result of MapSiteOverlayResponseDto entries where each entry contains { site, overlay?, locations: [{ location, floors: [{ floor, overlays, stationCount }] }] }. Optional filter: 1 = only sites that HAVE an overlay; 0 (default) = all sites. Note the BE preserves the typo — this Zod arg name mirrors the wire param verbatim.
updateArea W PUT /api/area/parent enabled Update an existing PARENT area on a CisgenX interface (PUT /api/area/parent). The body carries a list with mixed create+update semantics: each item with is CREATED as a new sub-area in the same call; each item with UPDATES the existing sub-area with that id. IMPORTANT: items NOT included in are NOT deleted — use deleteArea for sub-area removal. Pass to leave sub-areas unchanged. Precondition: the interface must be ONLINE — BE returns 404 if it is not.
updateCustomMarker W PUT /api/markercustom enabled Update an existing operator-placed custom marker (map pin). All fields are full replacements (no partial patch). Coordinates are decimal degrees latitude/longitude (METRIC ONLY); use field names /. shortName is capped at 2 characters and auto-uppercased. note is capped at 256 characters by BE validation. Interface must be online; otherwise the API returns 404 Interface_Offline. If the user only mentions the marker by name, look it up via listCustomMarkers first to surface the marker name in the confirmation summary.
updateFloor W PUT /api/floor enabled Update an existing floor (Level). Same fields as createFloor plus a required id. IMPORTANT default-flag warning: the BE auto-promotes the IsDefault value silently — if the location has only ONE floor, it is forced to default; if no floor in the location is currently default and this one has the smallest id, it is also forced to default. The user-supplied is therefore NOT always honored verbatim; pass it knowing BE may override it based on the floor\
updateFloorOverlay W PUT /api/flooroverlay enabled Update an existing floor overlay (image bounding box on the map) by its overlay id. Body fields mirror createFloorOverlay plus a required . Coordinates are decimal degrees (METRIC); rotate is degrees. KNOWN BE BUG: this endpoint may delete the freshly-uploaded NEW image from S3 due to a duplicate cleanup call (FloorOverlayAppService.cs:177, 179 — DeleteFileFromLinkAsync invoked twice). The first call deletes the old image (correct), the second may delete the new one. Surface failures to the BE team. Workaround: delete then create instead of updating. IMAGE UPLOAD IS OUT OF SCOPE FOR THIS TOOL: upload the overlay image via the web UI first to obtain the S3 URL, then pass it as . This tool only sends a JSON body; it does not handle multipart image bytes.
updateLocation W PUT /api/location enabled Rename a location and/or re-attach it to a different parent site. Body: { id, interfaceId, siteId, name }. The BE looks up the location by (interfaceId, id) and overwrites the editable fields via AutoMapper. 404 if either the interface or the location is missing. No cascade — only the location row itself is updated.
updateSite W PUT /api/site enabled Rename an existing site. Update body is exactly { id, interfaceId, name } — sites have no other editable fields at this layer (map overlay coordinates live on a separate entity). Requires InterfaceWrite permission.
updateSiteOverlay W PUT /api/siteoverlay enabled Update an existing site overlay (single-point map pin) by its overlay id. Body fields: id, latitude, longitude (decimal degrees, METRIC), siteId, interfaceId.
updateSubArea W PUT /api/area enabled Update an existing SUB-AREA on a CisgenX interface (PUT /api/area). Use this for in-place sub-area edits. To update a parent area, use updateArea (which can also bulk-edit its sub-areas in one call). Precondition: the interface must be ONLINE — BE returns 404 if it is not.

hydraulic 33 tools · 18 R · 15 W · 4 disabled · 2 LIVE

ToolR/WHTTP + EndpointStatusDescription
createFlowRule W POST /api/FlowRule enabled HITL write — Create a new flow rule for a pipe. AllowedIdleFlow in L/min (LOGICAL — do NOT pre-multiply by 10). Deviations (maxLow/maxHigh/stable) are raw 8-bit counters (0-255), not percentages. Delays in seconds. Body: see params. Returns the created rule. BE enforces interface.write. Confirmation required.
createFlowSensor W POST /api/FlowSensor enabled HITL write — Create a new flow sensor on a flow rule. Pair (address, index) must be unique within the interface — the BE rejects duplicates with 4xx. Returns the created sensor. BE enforces interface.write. Confirmation required.
createFlowValve W POST /api/FlowValve enabled HITL write — Create a new flow valve attached to a flow rule. Capacity in L/min (LOGICAL — do NOT pre-multiply by 10). Body: see params. Returns the created valve. BE enforces interface.write. Confirmation required.
createPipe W POST /api/Pipe enabled HITL write — Create a new pipe on an interface. Send capacity as the LOGICAL flow capacity (L/min) — the BE multiplies by 10 before persisting to DB and divides by 10 on read. Do NOT pre-multiply. Body: interfaceId (required), description (required, display name), capacity (required, L/min logical), parentId (optional Guid/int — null/omit for top-level pipe). Returns the created pipe. BE enforces interface.write. Confirmation required.
deleteFlowRule W DELETE /api/FlowRule DISABLED HITL write — Delete a flow rule. DESTRUCTIVE — cannot be undone. CASCADE: associated flow valves and flow sensors keep referencing the deleted ruleId until reassigned — orphaned valves/sensors will fail at runtime. Reassign or delete dependents first. BE enforces interface.write. Confirmation required.
deleteFlowSensor W DELETE /api/FlowSensor DISABLED HITL write — Delete a flow sensor. DESTRUCTIVE — cannot be undone. CASCADE: any flow valve referencing this FlowSensorId becomes orphaned (set to 0/null on the valve before deletion to keep readings sane). The IO address/index pair is freed for reuse. BE enforces interface.write. Confirmation required.
deleteFlowValve W DELETE /api/FlowValve DISABLED HITL write — Delete a flow valve. DESTRUCTIVE — cannot be undone. CASCADE: stations or pipes that referenced this valveId will fail at runtime; reassign before deleting. The underlying IO address/index is freed for reuse. BE enforces interface.write. Confirmation required.
deletePipe W DELETE /api/Pipe DISABLED HITL write — Delete a pipe. DESTRUCTIVE — cannot be undone. CASCADE: deleting a pipe with attached flow rules / valves / sensors will fail or orphan them depending on BE referential integrity (flag returns 4xx with reason). Reassign or delete dependents first. Confirmation required.
getControllerInputOptions R GET /api/controller/get-details-input enabled Get the list of available controller input IO options for an interface. Used to populate the IO picker when creating a flow sensor.
getFlowRule R GET /api/FlowRule/${interfaceId}/${id} enabled Get detailed information about a specific flow rule.
getFlowRuleNextId R GET /api/FlowRule/get-src-id enabled Get the next available flow rule source id for a given interface. Use this before creating a new flow rule when the FE needs a pre-assigned id.
getFlowSensor R GET /api/FlowSensor/${interfaceId}/${id} enabled Get detailed information about a specific flow sensor by id.
getFlowSensorMapOverlay R GET /api/flowsensor/${interfaceId}/mapoverlay enabled Get flow sensor map-overlay markers for an interface. Used by the geo-tag device map. Optional location/floor/keyword filters.
getFlowValve R GET /api/FlowValve/${interfaceId}/${id} enabled Get detailed information about a specific flow valve by id. Capacity (L/min, LOGICAL — already divided by 10 by the BE) bounds the flow that can pass through this valve. For concurrent station runs sharing this valve, sum the candidate station flow rates and compare against Capacity; if the sum exceeds Capacity, recommend sequencing rather than running concurrently.
getPipe R GET /api/Pipe/${interfaceId}/${id} enabled Get detailed information about a specific pipe by id. Capacity (L/min, LOGICAL — already divided by 10 by the BE) is the value to compare against the SUMMED flow rates of candidate stations for hydraulic feasibility. If the sum exceeds Capacity, recommend sequencing concurrent station runs across multiple windows.
getPipeDropdown R GET /api/Pipe/dropdown-pipe enabled Get a short pipe list intended for dropdowns/pickers. Returns minimal fields (id, description, capacity, parent) per pipe.
getPipeFertigationMode R GET /api/Pipe/${pipeId}/fertigation-mode enabled Get fertigation mode (Serial=0, Parallel=1) for a pipe, plus optional FertiliserId / PumpStartId.
getWaterEngineFlowSensors R GET /api/waterengine/flowsensors enabled List flow sensors managed by the water-engine subsystem. includedUsed=true to include already-assigned sensors.
listFlowRules R GET /api/FlowRule enabled Get paged list of flow rules for one interface. Each rule: { Id, InterfaceId, PipeId, Active, AutoAction, AllowedIdleFlow (L/min, LOGICAL), MaxLowDeviation/MaxHighDeviation/StableDeviation (0-255 raw counter), StartDelay/ChangeDelay/ErrorDelay (seconds, 0-34464), StableCount (0-100), StableMax (0-30), State, TargetState, NextMeas, ErrorDetected, ObservedIdleFlow / MeasuredFlow (L/min, LOGICAL) }. Same x10-DB-divides-by-10 quirk applies to flow fields. Read-only. BE enforces interface.read.
listFlowSensors R GET /api/FlowSensor enabled Get paged list of flow sensors for one interface. Each sensor: { Id, FlowRuleId, Address (IO), Index (IO), Active, TwiId, MeasuredFlow (L/min, LOGICAL — already divided by 10) }. Read-only. BE enforces interface.read.
listFlowValveErrors R GET /api/FlowValve/error enabled Get the list of flow valves currently in an error state for an interface. Returns error code, error name, and any detailed reason/action metadata.
listFlowValves R GET /api/FlowValve enabled Get paged list of flow valves for one interface. Each valve: { Id, FlowRuleId, Active, Type (numeric enum), Priority, Index (IO index), Address (IO address), FlowSensorId (0=none), StartDelay/StopDelay (seconds), Capacity (L/min, LOGICAL), TwiId, State / TargetState (runtime numeric enums), LastStart / LastTargetChange (epoch timestamps), ErrorState, ErrorCode }. x10-DB-divides-by-10 quirk applies to Capacity. Hydraulic feasibility: a valve\
listPipePureNames R GET /api/pipe/pure/names enabled Get a paged list of pipe names (lightweight, names + minimal fields) for an interface. Useful for pickers/sensor config.
listPipes R GET /api/Pipe enabled Get paged list of pipes (with parent/child hierarchy) for one interface. Returns each node with { Id, Description, ParentId, Capacity (L/min, LOGICAL), CurrentFlow (L/min, LOGICAL), LocalFlow (L/min, LOGICAL), sensors/valves counts, water consumption summary }. CRITICAL: BE stores Capacity / CurrentFlow / LocalFlow / AllowedIdleFlow / MeasuredFlow / ObservedIdleFlow as value*10 in DB and divides by 10 in responses — what you receive is already the LOGICAL (un-multiplied) value. Never multiply by 10 yourself when reading. Hydraulic feasibility: Capacity (L/min) is the value to compare against the SUMMED flow rates of candidate stations when planning concurrent runs. If the sum of station flow rates exceeds pipe Capacity, recommend sequencing the stations across multiple windows rather than running them simultaneously (this tool does not enforce the check — surface the recommendation in your reply). Read-only. BE enforces interface.read scoped to interfaceId.
listPipesPure R GET /api/Pipe/pure enabled Get a flat (non-hierarchical) paged list of pipes for an interface. Use this when a flat list is more convenient than the hierarchy returned by listPipes.
listPipesPureV2 R GET /api/v2/pipe/pure enabled V2 of pipe-pure list — paged flat pipe list using the v2 API (api/v2/pipe/pure). Prefer listPipesPure unless the v1 endpoint is missing fields you need.
resetFlowValveErrorById LIVE HARDWARE W POST /api/FlowValve/reset-error-by-id enabled LIVE HARDWARE: HITL write — Reset ErrorState/ErrorCode to 0 for ONE flow valve. Use after inspecting the error reason and confirming the physical fault is cleared. Errors will re-trigger if the underlying hardware fault persists. Confirmation required.
resetFlowValveErrors LIVE HARDWARE W POST /api/FlowValve/reset-errors enabled LIVE HARDWARE: HITL write — Reset ErrorState/ErrorCode to 0 for ALL flow valves on the interface. Bus-wide blast radius — every valve currently flagged with an error will be cleared simultaneously. Use this AFTER you have inspected listFlowValveErrors and confirmed the underlying physical fault is gone (broken solenoid, wiring fault). Clearing errors does NOT fix the fault — they will re-trigger if hardware is still misbehaving. To clear one valve only, use resetFlowValveErrorById. Confirmation required.
updateFlowRule W PUT /api/FlowRule enabled HITL write — Update an existing flow rule (PUT, full body required — every field below is mandatory). AllowedIdleFlow / MeasuredFlow / ObservedIdleFlow are L/min (LOGICAL — do NOT pre-multiply by 10). Deviations are raw 8-bit counters (0-255). State / TargetState / NextMeas / ErrorDetected are runtime-managed counters — fetch via getFlowRule and pass current values back unless you intentionally want to reset them. CASCADE: changing autoAction affects whether the controller reacts to deviations automatically. Returns the updated rule. BE enforces interface.write. Confirmation required.
updateFlowSensor W PUT /api/FlowSensor enabled HITL write — Update an existing flow sensor (PUT, full body required). Changing address/index reassigns the IO binding — verify hardware match before committing. Returns the updated sensor. BE enforces interface.write. Confirmation required.
updateFlowValve W PUT /api/FlowValve enabled HITL write — Update an existing flow valve (PUT, full body required). Capacity in L/min (LOGICAL — do NOT pre-multiply by 10). State / TargetState / LastStart / LastTargetChange / ErrorState / ErrorCode are runtime-managed runtime fields — fetch via getFlowValve and pass current values back unless you intentionally want to reset error state (use resetFlowValveErrorById for that, not this tool). CASCADE: changing capacity affects parent pipe water-flow calculations. Returns the updated valve. BE enforces interface.write. Confirmation required.
updatePipe W PUT /api/Pipe enabled HITL write — Update an existing pipe (PUT, full body required: capacity / currentFlow / localFlow are NOT optional). Capacity / CurrentFlow / LocalFlow are LOGICAL L/min — the BE multiplies by 10 internally; do NOT pre-multiply. To preserve a field, fetch via getPipe first and send back the same value. CASCADE: changing capacity affects flow-rule deviation thresholds downstream (rules compare measuredFlow against capacity). Returns the updated pipe. BE enforces interface.write. Confirmation required.
updatePipeFertigationMode W PUT /api/Pipe/fertigation-mode enabled HITL write — Update the fertigation mode of one pipe. fertigationMode: 0=Serial (one fertiliser at a time, sequential), 1=Parallel (multiple fertilisers simultaneously). fertiliserId and pumpStartId are Guids (string), nullable — passing null clears the binding. Full-replacement (PUT): both Guid fields are sent every call; omit by setting null, do not omit silently. CASCADE: switching modes mid-cycle may interrupt active fertigation. Returns boolean. BE enforces interface.write. Confirmation required.

interfaceConfig 35 tools · 26 R · 9 W · 1 disabled · 5 LIVE

ToolR/WHTTP + EndpointStatusDescription
cancelCisgenicTask W POST /api/cisgenic-task/${taskId}/cancel enabled Cancel a running cisgenic task (upload/import job) by its task ID. Wraps POST /api/cisgenic-task/{taskId}/cancel. The task transitions to Cancelled and any in-flight work stops at the next checkpoint. CASCADE — partial-state risk: rows already INSERTed/UPDATEd by the task before the cancel checkpoint REMAIN in the DB (no automatic rollback). For mk2-decoder uploads this means partial decoder rows may persist; for common-data uploads this means partial station/sensor rows may persist. Operator may need to re-run the import or manually clean up. BE PERMISSION GAP: route has only [Authorize] (JWT) and no [RequireAuthorization] permission attribute — any authenticated user can cancel any task across any tenant — logged in project_copilot_be_permission_gaps.md. The copilot layer guards read-only User role. HITL — confirmation required: always confirm taskId with the user before executing.
downloadMk2DecoderImportTemplate R GET enabled Download the MK2 decoder import template (an Excel .xlsx file) for an interface. Wraps the FE Setup -> Import controllers action (GET /api/setup/{interfaceId}/import/download-mk2-decoder). Workbook columns (typical, BE-generated from current interface state): Decoder Address (0..240), Decoder Type (1=Output / 2=Input / 4=Sdi12), IO ID, Station Name, Notes. Returns the workbook bytes as a base64 string plus filename, contentType, byteLength, and the echoed interfaceId. Operator fills in MK2 decoder rows offline and re-uploads via the FE upload UI (no copilot tool wraps the upload yet). BE enforces [RequireAuthorization(InterfaceRead, )]. HITL — confirmation required: this kicks a server-side workbook build and streams a binary file back. Always confirm interfaceId with the user before executing. No DB writes — pure read-as-export.
getCisgenicTaskProgress R GET /api/cisgenic-task/${taskId}/progress enabled Get the progress of a long-running cisgenic task (upload/import job) by its task ID. Wraps GET /api/cisgenic-task/{taskId}/progress. Returns PendingRunningCompletedCancelledFailed. Returns null/empty payload if the task ID is unknown. Use to poll an upload kicked off by a setup-import flow (mk2-decoder upload, common-data upload). Diagnostic interpretation: repeated Failed statuses tied to decoder operations signal bus degradation — surface as a communication-error trend and correlate with getTwoWireVoltages (under 36V warning / 25V critical) and getTwoWireLeaks (>3 coil-leak sites) across a 1-month window. Read-only, no DB or hardware side effects.
getCommonDataImportActiveTask R GET /api/v2/Setup/${interfaceId}/import/upload-common-data/active enabled Get the active common-data import task (if any) for an interface. Wraps GET /api/v2/Setup/{interfaceId}/import/upload-common-data/active. Returns a JSON envelope: when no task is in flight, ; when a task is running, RunningPending. Use to decide whether the FE should poll progress (via getCisgenicTaskProgress with the TaskId), render a cancel button (via cancelCisgenicTask), or allow a fresh upload. BE enforces [RequireAuthorization(InterfaceRead, )]. Read-only, no DB or hardware side effects.
getControllerDecoderTypes R GET /api/controller/decoderType enabled List the decoder-type catalog available across the platform with optional paging/keyword filtering. Wraps GET /api/controller/decoderType. Returns — paged DecoderTypeResponseDto entries used to populate decoder-type pickers when configuring a controller. BE PERMISSION GAP: route has no [RequireAuthorization] attribute (only the controller-wide JWT auth applies). Read-only, no DB or hardware side effects.
getControllerDetail R GET /api/controller/getdetail enabled Get the full configuration detail for a single controller (decoder) by composite key (interfaceId + address + id [+ optional twiId]). Wraps GET /api/controller/getdetail. Returns . Use when drilling into one decoder slot for diagnostics or audit. BE enforces [RequireAuthorization(InterfaceRead, )]. Read-only, no DB or hardware side effects.
getControllerDetailForStationByOrdinal R GET /api/controller/getdetailforstationbyordinal enabled Look up the controller (decoder) bound to a station by its ordinal GUID. Wraps GET /api/controller/getdetailforstationbyordinal. Returns a nullable — when no controller is currently bound to the station. Used by station detail views to resolve the underlying decoder configuration. BE PERMISSION GAP: route has no [RequireAuthorization] attribute (only the controller-wide JWT auth applies). Read-only, no DB or hardware side effects.
getControllersByLocation R GET /api/controller/getbylocation enabled List the controllers (decoders) for an interface filtered by location, with optional selected/unselected keyword filtering. Wraps GET /api/controller/getbylocation. Returns — separating decoders already attached to the location from the candidates available for selection. Used by the FE when binding controllers to a location. BE PERMISSION GAP: route has no [RequireAuthorization] attribute (only the controller-wide JWT auth applies). Read-only, no DB or hardware side effects.
getInterface R GET /api/interface/${id} enabled Get the full configuration detail for a single interface (controller) by ID. Includes hardware metadata, sub-interface map, and current operational state. BE enforces InterfaceRead.
getInterfaceHeartbeat R GET /api/interface/heartbeat enabled Get the live heartbeat status of an interface (controller). Wraps GET /api/interface/heartbeat. Returns . Used to diagnose offline / comms-loss situations. BE enforces InterfaceRead. Read-only, no DB or hardware side effects.
getInterfaceSubs R GET /api/interface/${interfaceId}/subs enabled List the sub-interfaces (child controllers) for a parent interface. Used to enumerate the controller tree under a multi-controller deployment. BE enforces InterfaceRead.
getIOConfigByDecoder R GET /api/ioconfig/get-by-decoder enabled List the IO configurations for a specific decoder slot on a controller. Wraps GET /api/ioconfig/get-by-decoder. Returns Station
getIOConfigByMultipleDecoders R GET /api/ioconfig/get-by-multiple-decoders enabled Get the IO configuration entries (channel mappings) for every decoder on an interface, in one round trip. Wraps GET /api/ioconfig/get-by-multiple-decoders. Returns Station
getLineUnitDecoderReadings R GET /api/lineunit/decoder-readings enabled Get LIVE decoder readings (sensor values, valve state) for a specific line-unit IO point on a controller. Wraps GET /api/lineunit/decoder-readings. Returns . WARNING: this is a LIVE READ from the controller hardware — may return 5xx / time out if the interface or controller is offline. Used when drilling into a single decoder address/index pair. BE enforces InterfaceRead. Read-only — no DB writes, no MQTT publishes, but note the live HTTP fan-out to hardware.
getManualSrcObjectSyncIo R GET /api/autosyncdata/manual-src-objectsync-io enabled Trigger a manual sync of SRC object/IO data for a single interface (controller). Wraps GET /api/autosyncdata/manual-src-objectsync-io. The BE enqueues a Hangfire background job (DiscoverDecoder) and returns immediately with no body — the actual sync runs asynchronously and results are NOT visible from this call (no progress URL, no task ID returned by this route). Use to ask the controller to re-discover its decoders/IO when configuration drifts. CASCADE — async DB writes once the job runs: scans decoders on the two-wire bus, INSERTs newly discovered LineUnit/Decoder/IO rows, may UPDATE existing rows with current state, may soft-mark missing decoders. Downstream FE views (controller list, two-wire info, line-unit decoder readings) refresh on next read. No MQTT, no destructive writes — additive sync only. BE PERMISSION GAP: route has no [RequireAuthorization] attribute (only the controller-wide JWT auth applies). Treated as read-style by FE despite the side effect since this call itself returns nothing.
getManualSyncDataInterface R GET /api/autosyncdata/manual-sync-data-interface enabled Trigger a manual sync of ALL interface metadata from SRC across the entire platform. Wraps GET /api/autosyncdata/manual-sync-data-interface. The BE enqueues a Hangfire background job (SyncInterface) covering EVERY interface the system can see — not scoped to a single interface or tenant — and returns immediately with no body. The actual sync runs asynchronously and results are NOT visible from this call. CASCADE — broad blast radius: every interface row in the BE may be UPDATEd with fresh metadata from SRC; downstream caches (interface list, heartbeat, sub-interfaces) refresh on next read; the job can take minutes for large tenants. No DB rows are deleted — additive/update sync only. NO MQTT, no hardware writes. Use sparingly — only when operators report stale interface state across the platform; for a single-interface refresh use getManualSrcObjectSyncIo. BE PERMISSION GAP: route has no [RequireAuthorization] attribute and no per-resource scoping (only the controller-wide JWT auth applies) — any authenticated user can trigger a system-wide resync.
getMk2DecoderImportActiveTask R GET /api/v2/Setup/${interfaceId}/import/upload-mk2-decoder/active enabled Get the active MK2 decoder import task (if any) for an interface. Wraps GET /api/v2/Setup/{interfaceId}/import/upload-mk2-decoder/active. Returns a JSON envelope: when no task is in flight, ; when a task is running, RunningPending. Use to decide whether the FE should poll progress (via getCisgenicTaskProgress with the TaskId), render a cancel button (via cancelCisgenicTask), or allow a fresh upload. BE enforces [RequireAuthorization(InterfaceRead, )]. Read-only, no DB or hardware side effects.
getOrganizationInterfaces R GET /api/organization/${organizationId}/interfaces enabled List interface IDs scoped to an organization, optionally filtered to those not yet assigned. Mirrors the FE Operations admin call to /api/organization/{organizationId}/interfaces (singular path, main API base URL). NOTE: the main-API OrganizationController is currently commented out in the BE source (verified 2026-05-02), so this call may 404 or hit a fallback handler depending on environment. The Identity service hosts /api/organizations/{organizationId}/interfaces (plural) without the onlyUnassigned parameter. If you need a guaranteed list of interfaces for an organization, consider using the Identity-side route via a dedicated tool when it is added. BE auth (when active) enforces OrgRead scoped to organizationId.
getTwoWireInfo R GET /api/twowire/info enabled Get a short summary of the two-wire bus state for a single interface (controller). Wraps GET /api/twowire/info. Returns . Used as a quick health overview before drilling into voltages or leaks. Diagnostic thresholds (apply when interpreting / ): flag bus voltage that drops below 36V as a WARNING and below 25V as CRITICAL; flag bus current draw that exceeds 600mA. When evaluating 2-wire health, look at the past 1 month of metrics to spot a trend rather than a single sample. BE enforces InterfaceRead. Read-only, no DB or hardware side effects.
getTwoWireLeaks R GET /api/twowire/leaks enabled Get the list of leakage faults detected on the two-wire bus for an interface. Wraps GET /api/twowire/leaks. Returns . Each entry identifies a line-unit reporting current outside spec. Use to diagnose moisture intrusion or shorted decoders. Diagnostic thresholds: flag when MORE THAN 3 sites report a coil leak in the response, OR when standby (idle) current has increased without a corresponding rise in device count — both patterns indicate bus degradation. Evaluate over a 1-month window when looking for a trend rather than a single snapshot. BE enforces InterfaceRead. Read-only, no DB or hardware side effects.
getTwoWireStateEnum R GET /api/twowire/stateenum enabled Get the human-readable description of two-wire bus state codes for an interface — a lookup map . Wraps GET /api/twowire/stateenum. Use to interpret the numeric field from listTwoWire / getTwoWireInfo responses (e.g. 0=Idle, 1=Active, 2=Fault, etc. — exact mapping is BE-driven and may evolve). BE enforces InterfaceRead. Read-only, no DB or hardware side effects.
getTwoWireTest R GET /api/twowire/test enabled Get the most recent built-in self-test (BIST) result for the two-wire bus on an interface. Wraps GET /api/twowire/test. Returns the cached BIST envelope — null if no test has ever been run. Diagnostic interpretation: repeated decoder faults across recent BIST results signal bus degradation — correlate with getTwoWireVoltages (under 36V warning, under 25V critical) and getTwoWireLeaks (>3 coil-leak sites) over a 1-month window before recommending field action. BE enforces InterfaceRead. Read-only — this does NOT trigger a new test, only reads the cached last result.
getTwoWireVoltages R GET /api/twowire/voltages enabled Get the most recent voltage readings across line-units on the two-wire bus. Wraps GET /api/twowire/voltages. Returns — up to maxCount samples per decoder. Used to spot voltage drops indicating cable/decoder faults (low voltage = excessive cable resistance or a shorted decoder pulling the bus down). Diagnostic thresholds: flag any sample that drops below 36V as a WARNING and below 25V as CRITICAL. Evaluate the past 1 month of samples to distinguish a sustained drop (real degradation) from a transient dip (programme inrush). Pair with getTwoWireLeaks (>3 coil-leak sites, or rising standby current without device-count increase) to confirm bus-wide degradation. BE enforces InterfaceRead. Read-only, no DB or hardware side effects.
getWaterEngine R GET /api/waterengine/${interfaceId} enabled Get the current WaterEngine state for an interface (controller). Wraps GET /api/waterengine/{interfaceId}. Returns . Use this to inspect the controller settings BEFORE deciding to call setWaterEngineModeAndTestMode or setWaterEngineRainOperation — especially required before a partial rain-operation update because omitted fields RESET to zero on the hardware. BE enforces InterfaceRead. Read-only, no DB or hardware side effects.
listInterfaces R GET /api/interface enabled List interfaces (controllers) visible to the current user, with optional paging/filtering parameters. Wraps GET /api/interface. Returns — paged list. BE PERMISSION GAP: this endpoint has no [RequireAuthorization] attribute (results are filtered server-side by the caller token JWT — relies on JWT claims for tenant scoping rather than per-resource attribute). Read-only, no DB or hardware side effects.
listLineUnits R GET /api/lineunit/${interfaceId}/${address} enabled List the line-units (decoders) at a specific interface and address on the two-wire bus. Wraps GET /api/lineunit/{interfaceId}/{address}. Returns the full reading payload for that address slot — . Use to enumerate decoders before calling getLineUnitDecoderReadings on a specific IO. BE enforces InterfaceRead. Read-only, no DB or hardware side effects (returns cached state, not a live SRC ping).
listTwoWire R GET /api/twowire enabled List two-wire decoder bus entries with optional paging/filtering. Wraps GET /api/twowire. Returns — paged list of decoders on the bus. BE PERMISSION GAP: this endpoint has no [RequireAuthorization] attribute (only the controller-wide JWT auth applies). Read-only, no DB or hardware side effects.
resetLineUnit LIVE HARDWARE W POST /api/lineunit/reset enabled DESTRUCTIVE LIVE HARDWARE — reset ALL line-units (decoders) on a controller. Wraps POST /api/lineunit/reset?interfaceId={id}. Issues a BUS-WIDE reset across every two-wire decoder address on the given interface (NOT scoped to a single decoder). CASCADE — significant blast radius: (1) ANY in-flight irrigation programs on this controller are interrupted mid-cycle (valves drop to default state); (2) every decoder loses its current state and must re-discover from the bus; (3) sensors briefly read invalid/stale until decoders re-handshake; (4) operators may need to verify program resumption manually. Use ONLY when an operator has confirmed the bus is in a stuck/inconsistent state and a soft re-discovery (getManualSrcObjectSyncIo) has already been tried. BE enforces [RequireAuthorization(InterfaceWrite)]. The BE binds only the query-string interfaceId; no body fields are read. HITL — confirmation required: always confirm interfaceId and the operator-verified bus-stuck condition with the user before executing.
runDecoderDiagnostic LIVE HARDWARE W POST /api/diagnostic/decoder enabled LIVE HARDWARE — run a diagnostic against the listed decoders on a controller. Wraps POST /api/diagnostic/decoder. Per BE service code this PINGS each decoder via the SRC controller proxy AND on success persists controller.Value=1 in the local DB — i.e. it is state-changing despite the InterfaceRead attribute. CASCADE: each ping briefly occupies the two-wire bus; if a station program is mid-irrigation the ping does NOT preempt it but heavy fan-out (many decoderIds at once) can briefly delay scheduled events. After ACK the BE updates controller.Value=1 in DB → downstream FE controller-state widgets refresh. No MQTT publishes. Diagnostic interpretation: repeated decoder errors returned by this ping signal bus degradation — pair with getTwoWireVoltages (under 36V warning / 25V critical), getTwoWireLeaks (>3 coil-leak sites or rising standby current without device-count increase), and a 1-month trend window before recommending field action. BE PERMISSION GAP: route is annotated [RequireAuthorization(InterfaceRead)] although it mutates state and pings hardware (should be InterfaceWrite) — logged in project_copilot_be_permission_gaps.md. The copilot layer guards read-only User role to mirror the intent. HITL — confirmation required: confirm interfaceId + decoderIds with the user before executing.
setupCommonDataDeleteByType W POST /api/setup/${args.interfaceId}/common-data/delete-by-type DISABLED DESTRUCTIVE — delete a category of SRC common-data on an interface. Wraps POST /api/setup/{interfaceId}/common-data/delete-by-type. The selects which data set to wipe; CASCADE per type:\n - 1=Fertigation (FertigationDataStatus=false): WIPES all fertigation injection plans on the controller — programs that inject fertilizer LOSE their injection schedule (irrigation continues, but with water only).\n - 2=Station (StationDataStatus=false): WIPES all station bindings — every program tied to this controller LOSES its station map, irrigation effectively halts until stations are re-bound.\n - 3=AllExceptFertigationStation: WIPES ETZone + Sensor + Area + Emitter + Soil + Plant + ETReference + Hydraulic + Init (ALL agronomic + hydraulic data) — ET-driven scheduling, soil-moisture triggers, plant-coefficient lookups, and hydraulic-flow rules ALL break until re-imported. Fertigation and Station data survive.\n - 4=AllCommon: WIPES Station + everything in #3 + Fertigation. Effectively a full clean-slate for the controller — every program on this interface is broken until full re-import.\nPAGED DELETE: BE may run the delete in chunks and returns when more pages remain — re-call with the next page number until . Cannot be undone via this tool. BE enforces [RequireAuthorization(InterfaceWrite)] on the route interfaceId. HITL — confirmation required: always confirm interfaceId, type-category, and the post-delete re-import plan with the user before executing.
setupReset W POST /api/setup/${args.interfaceId}/reset enabled DESTRUCTIVE — reset an interface (controller): clears the SRC setup data so the controller can be re-initialised. Wraps POST /api/setup/{interfaceId}/reset. CASCADE — wipes ALL SRC setup state on the controller (when the BE actually runs): every program/station/sensor configuration mapped to this controller loses its setup binding and the controller must be re-provisioned (re-import common-data, re-discover decoders, re-attach stations) before irrigation programs can run. Cannot be undone via this tool. WHITELIST QUIRK — non-obvious blast radius surface: BE has a hardcoded special-case branch for ONLY (SetupController.cs:422). For any other interfaceId the BE method body is EMPTY and the call is a silent no-op (still returns 200 OK with no error) — operator may believe the reset ran when it did not. Confirm with operations whether your interface is whitelisted before relying on this tool. BE enforces [RequireAuthorization(InterfaceWrite)] on the route interfaceId. HITL — confirmation required: always confirm interfaceId, the confirmDelete phrase, and the post-reset re-provisioning plan with the user before executing.
setWaterEngineMode LIVE HARDWARE W POST /api/waterengine/mode enabled LIVE HARDWARE — set the irrigation runtime mode on a controller (mode-only variant; use setWaterEngineModeAndTestMode to also change the test-mode flag atomically). Wraps PATCH /api/waterengine/mode. Sends a PATCH to the SRC hardware via Crysberg proxy — failure here means the hardware did not accept the change (BE throws SRCException, does NOT swallow). The BE only persists the new state to its DB AFTER the hardware ACKs the command. Idempotent calls re-issue identical hardware commands. CASCADE — mode change affects program execution: 1=Manual = scheduled programs are blocked, only user-triggered runs execute; 2=Auto = scheduled programs run normally; 3=Paused = ALL irrigation halts immediately (in-flight programs stop). BE enforces [RequireAuthorization(InterfaceWrite)] on InterfaceId. Mode values 1=Manual, 2=Auto, 3=Paused are user-settable; Init (0), Raining (4), ToNotOperational (5) are system-managed. HITL — LIVE HARDWARE: confirm interfaceId and mode with the user before executing.
setWaterEngineModeAndTestMode LIVE HARDWARE W POST /api/WaterEngine/modeandtestmode enabled LIVE HARDWARE — atomically set the irrigation runtime mode + test-mode flag on a controller. Wraps PATCH /api/WaterEngine/modeandtestmode. Sends a PATCH to the SRC hardware via Crysberg proxy — failure here means the hardware did not accept the change (BE throws SRCException, does NOT swallow). The BE only persists the new state to its DB AFTER the hardware ACKs the command. Idempotent calls re-issue identical hardware commands (the BE does not deduplicate). CASCADE — mode change affects program execution: 1=Manual = scheduled programs are blocked, only user-triggered runs execute; 2=Auto = scheduled programs run normally on their schedule; 3=Paused = ALL irrigation halts immediately (in-flight programs stop). Test mode ON (isTestMode=true) simulates command execution WITHOUT opening valves — useful for dry-runs but no actual watering occurs. BE enforces [RequireAuthorization(InterfaceWrite)] on InterfaceId. Mode values 1=Manual, 2=Auto, 3=Paused are user-settable; Init (0), Raining (4), ToNotOperational (5) are system-managed. HITL — LIVE HARDWARE: confirm interfaceId, mode, and test-mode flag with the user before executing.
setWaterEngineRainOperation LIVE HARDWARE W POST /api/WaterEngine/rain-operation enabled LIVE HARDWARE — configure rain-detection sensor on a controller. Wraps PATCH /api/WaterEngine/rain-operation. Sends a PATCH to the SRC hardware via Crysberg proxy — failure here means the hardware did not accept the change (BE throws SRCException, does NOT swallow). DESTRUCTIVE PARTIAL-UPDATE WARNING — per BE WaterEngineAppService.cs:235-237, omitting or RESETS those fields to ZERO on the hardware (NOT preserved). Provide all fields you want preserved, or expect resets. / / are preserved when omitted (BE merges with current SRC state); is sent as null when omitted. CASCADE: rain-detection drives auto-pause behavior — when configured rain is detected the WaterEngine transitions to Mode=4 (Raining) automatically and pauses scheduled irrigation; misconfiguring (wrong unit) can cause false-positive auto-pauses or rain to never trigger. Read getWaterEngine FIRST to see current values before partial update. The BE only persists the new state to its DB AFTER the hardware ACKs the command. BE enforces [RequireAuthorization(InterfaceWrite)] on InterfaceId. WIRE-UNIT QUIRK: unit is unresolved (BE comment suggests inches, FE convertToMetricV2() suggests millimetres) and is capped at 6.5535 (internally scaled by 10000 to a uint16 hardware register). HITL — LIVE HARDWARE: confirm every field with the user before executing.
updateInterface W PUT /api/interface enabled Update interface (controller) metadata: display name, picture, country/timezone, DST flag, and associated WeatherLink stations. Wraps PUT /api/interface — BE auth attribute resolves the resource from body.id. Full-replacement (PUT) semantics: every field on the request body is written; REPLACES the entire association set (passing clears all associations — read first via getInterface to preserve existing). CASCADE: timezone/DST changes shift how all program schedules display; weather-station re-association affects which weather data feeds into ET / rain calculations on this interface. Persists to DB only — no hardware/SRC call, no MQTT. BE enforces [RequireAuthorization(InterfaceWrite)] on body.id. HITL — confirmation required: always confirm interfaceId, name, weatherLinkStationIds list, and timezone changes with the user before executing.

operations 12 tools · 5 R · 7 W · 1 disabled · 1 LIVE

ToolR/WHTTP + EndpointStatusDescription
createWaterTank W POST /api/WaterTank enabled Create a new water tank on an interface. Bind a tank-level sensor (sensorAddress + sensorIndex) and optionally one or more fill valves. Use getTankLevelSensorOptions / getTankTopUpValveOptions to find valid IDs.
deleteWaterTank W DELETE /api/WaterTank/${id} DISABLED Delete a water tank by id.
getTankLevelSensorOptions R GET /api/WaterTank/tank-level-sensors enabled Get a list of tank-level sensors available to bind to a water tank on an interface. Use this when populating the sensor picker for createWaterTank / updateWaterTank.
getTankTopUpValveOptions R GET /api/WaterTank/topup-valve enabled Get a list of top-up (fill) valves available to bind to a water tank on an interface. Use this when populating the fill-valve picker for createWaterTank / updateWaterTank.
getWaterTank R GET /api/WaterTank/${id} enabled Get detailed information about a specific water tank by id.
getWaterTankActivity R GET /api/WaterTank/activity enabled Get paged activity history for a water tank (level changes, fill events, alarms). Use this to inspect what a tank has been doing over time.
listWaterTanks R GET /api/WaterTank enabled Get paged list of water tanks for a specific interface. Returns water tank entities with sensor binding, area, height-to-overflow, low/high level alarms, and associated fill valves.
runDiagnostic LIVE HARDWARE W POST /api/Diagnostic enabled Trigger a live hardware diagnostics run on one or more stations of an interface. BE returns per-station diagnostic readings (voltage / leak / status). LIVE HARDWARE: confirm via UI before executing.
stopDiagnostic W POST /api/Diagnostic/stop enabled Stop / reset an in-progress diagnostics run on an interface.
subscribeNotificationTags W PUT /notification/api/notification/tags enabled Subscribe a user to a set of notification tags (alert categories) for a given object (typically an interface). Replaces the user\
updateNotificationInfo W PUT /notification/api/notification/updateInfo enabled Update a user\re subscribed to — use subscribeNotificationTags for that.
updateWaterTank W PUT /api/WaterTank/${proposedArgs.id} enabled Update an existing water tank. All fill valves passed in must include their existing (use listWaterTanks / getWaterTank to get current valve ids).

programs 22 tools · 9 R · 13 W · 2 disabled · 1 LIVE

ToolR/WHTTP + EndpointStatusDescription
autoUpdateWaterBudget W POST /api/program/auto-update-water-budget-create-program enabled Computes a suggested WaterBudget% based on watering time + station runtimes. Read-only — does NOT persist a program (verified in be-probe.md). The route name is misleading: it is a pre-flight calculator used before calling createProgram. FE is not wired to this endpoint yet; the copilot is the first client. BE permission gap: there is no [RequireAuthorization] attribute on this action — verify with the BE team before broad rollout. METRIC ONLY (m², mm).
calculateProgramRuntime W POST /api/program/runtime enabled Calculates runtime per station based on program mode + watering plan. No persistence — pure compute dispatched to StationRuntimeHelperService. Returns an array of { stationId, runTime } where runTime is formatted . Use before scheduling or saving a program to surface expected per-station durations. METRIC ONLY (m², mm).
checkOverlappingPrograms R GET /api/program/check-overlapping-program enabled Check if a proposed program schedule would overlap with existing programs.
createGlobalExclusion W POST /api/globalexclusiontime enabled Create one or more global exclusion time windows on a CisgenX interface. Global exclusions block ALL programs on the interface during the window and are cascaded to existing programs by the BE. METRIC ONLY: hours 0-23, minutes 0-59, months 1-12, days 1-31.
createProgram W POST enabled Create a new irrigation program on a CisgenX interface. Supports all 8 program modes (Run-Time, Run-Mm, Water Alloc, Run-Cisgen.ET, Run-Soil Moisture, LearnFlow, VerifyFlow, Evapotranspiration). Required fields differ by programMode — read the field descriptions and supply only mode-relevant fields; the tool fills safe defaults for everything else. Note: For Run-Soil Moisture, the BE silently ignores triggerConditions on POST; a follow-up updateProgram (PUT) call is required to persist trigger thresholds.
deleteGlobalExclusion W DELETE /api/globalexclusiontime/${proposedArgs.interfaceId}/${proposedArgs.id} DISABLED Permanently delete a global exclusion time window from a CisgenX interface. Cascades the deletion to every program currently linked to this exclusion via the SRC water-engine firmware. The deletion cannot be undone.
deleteProgram W DELETE /api/program DISABLED Permanently delete an irrigation program. BE service ProgramService.DeleteAsync removes the program from SRC (water-engine firmware) first, then cascade-deletes related DB rows: WateringTime, ExclusionTime, Step, TimeSlot, TriggerCondition, ProgramFertigation, ProgramCisFertigation, and SRCLog history. BE rejects the delete if the program is currently running. If the user only mentions the program by name, look it up via listPrograms first to surface the program name in the confirmation summary.
enableProgram W PUT /api/program/enable enabled Enable or disable an irrigation program (set its flag). When status=true, BE syncs the active flag to SRC firmware and enqueues Hangfire jobs to schedule the program; when status=false, BE removes scheduled jobs. This is a reversible toggle, not a destructive delete, but still a write action.
exportWaterFlowSimulationCsv W POST /api/simulation/exprot-waterflow enabled Export the water-flow simulation timeline as a CSV file (returned by the BE as File blob). Same simulation data as runWaterFlowSimulation but formatted for download. Read-flavored compute: no DB writes, no hardware state changes. BE enforces InterfaceWrite (read-only User role denied here too). Note: response is a binary CSV — copilot returns the raw blob payload; surface a download link to the user.
getAutoUpdateWaterBudgetProgramNotCompleted R GET /api/simulation/auto-update-water-budget-program-not-completed enabled Get the auto-update water-budget recommendation for a program that did not finish on its scheduled run. Returns the projected adjustment (or null if no adjustment is needed). Compute-only: BE invokes the auto-update simulator with isJob=false so no DB write occurs. BE enforces InterfaceRead.
getProgram R GET /api/program/${interfaceId}/${programId} enabled Get detailed information about a specific irrigation program.
getProgramAllocPercent R GET /api/Program/allocPercent enabled Returns the water-allocation percentage for a program based on landscape area, water allocation, and ET reference. Pure compute — no DB writes. Returns 0 if the ET reference cannot be found. METRIC ONLY: landscapeArea in m², waterAllocation in mm.
getProgramRunHistory R GET /api/v2/historylog/run-history enabled Get run history for a specific program. Shows past executions, duration, and completion status.
getUpcomingPrograms R GET /api/program/upcoming enabled Get upcoming scheduled irrigation programs. Shows what programs are about to run or are currently running.
listGlobalExclusions R GET /api/globalexclusiontime/${interfaceId} enabled Lists all global exclusion time windows configured for an interface. Returns each exclusion with id, oddEvenType, weekDays, active flag, date/time range and repeat settings. Read-only.
listPrograms R GET /api/program enabled Get list of irrigation programs with details. Can filter by interface. Returns program names, schedules, stations, and status.
runProgram LIVE HARDWARE W PUT /api/program/run enabled Start or stop an irrigation program immediately (manual run). Use start=true to run the program, start=false to stop it. LIVE HARDWARE: confirm via UI before executing.
runStationSimulation W POST /api/simulation/station-simulation enabled Simulate per-station runtime data across a date range. Returns a list of dynamic dictionaries (one per station) with simulated start/stop timing and flow. Both fromDate and toDate are required by this endpoint. Read-flavored compute: no DB writes, no hardware state changes. BE enforces InterfaceWrite (read-only User role denied here too).
runWaterFlowSimulation W POST /api/simulation/water-flow enabled Simulate the projected water-flow timeline for an interface across a date range. The BE fetches simulation data from the SRC/Crysberg hardware proxy and returns a list of WaterFlowSimulationDto entries (timestamp, totalFlow, totalWaterConsumed, per-station breakdown). Read-flavored compute: no DB writes, no hardware state changes — but Crysberg unreachability surfaces as an error. BE enforces InterfaceWrite (read-only User role denied here too).
updateGlobalExclusion W PUT /api/globalexclusiontime enabled Update an existing global exclusion time window on a CisgenX interface. The BE cascades the new times/days to every program currently linked to this global exclusion. METRIC ONLY: hours 0-23, minutes 0-59, months 1-12, days 1-31. BE permission gap: this PUT endpoint currently lacks [RequireAuthorization] — verify with the BE team before broad rollout.
updateProgram W PUT /api/program enabled Update an existing irrigation program on a CisgenX interface. Supports the same 8 program modes as createProgram (Run-Time, Run-Mm, Water Alloc, Run-Cisgen.ET, Run-Soil Moisture, LearnFlow, VerifyFlow, Evapotranspiration). Required fields differ by programMode — read the field descriptions and supply only mode-relevant fields; the tool fills safe defaults for everything else. Nested arrays (wateringTime, exclusionTime, triggerConditions, cisFertigations) accept optional per-item : include the id to edit an existing row, omit it to insert a new one, omit the row entirely to delete it. METRIC ONLY (mm, m^2, minutes). Unlike POST, this PUT path persists triggerConditions inline — no follow-up call required for Run-Soil Moisture. BE has imperative validation in ProgramService.UpdateAsync; errors surface as 400 BadRequest.
validateProgram R GET /api/simulation/validate-program enabled Checks whether a program can still run (not completed). Returns true if the program window is still open, false if the program has already completed or is invalid. Use before scheduling a manual run. BE action: CheckProgramIsNotCompleted.

reports 31 tools · 25 R · 6 W

ToolR/WHTTP + EndpointStatusDescription
exportFlowLog R GET enabled Export the Flow Log as a CSV file for a recent lookback window, optionally filtered by flow rule IDs. Wraps the FE Report page action (GET /api/report/export-flow-log). CSV columns (typical): Date/Time (interface-local), Station ID, Station Name, Expected Flow Rate (L/min — METRIC), Actual Flow Rate (L/min — METRIC), Deviation (%), Rule ID, Rule Name, Status (OK/Unexpected). Returns the CSV bytes as a base64 string plus filename, byteLength, rowCount,
exportFlowSensorWaterConsumption W POST enabled Export a CSV of Flow Sensor water consumption for selected pipes within a date range. Wraps the Operations -> Sensors -> Flow Sensor action (POST /api/v2/historylog/export-water-consumption). CSV columns (typical): Date/Time, Pipe ID, Pipe Name, Flow Rate (L/min — METRIC), Total Volume (L — METRIC), Duration (seconds), Program Name. Returns the CSV bytes as a base64 string plus a short text preview of the first rows, byteLength, rowCount, and flag. Inputs: interfaceId (required), pipeIds (up to 10), and optional ISO 8601 fromDate / toDate (default: last 7 days, UTC start-of-day for both endpoints; user override format YYYY-MM-DDTHH:mm:ss.SSSZ). EMPTY-DATA QUIRK: when the BE has no data in the requested range, the CSV body is the literal string (no header row) — surfaced as in the result. Tell the user the export ran but produced no rows, instead of pretending it returned data. CASCADE: pure DB joins (Pipe / FlowRule / FlowSensor / SRCLog), no MQTT, no hardware writes, no external HTTP. Note: the FE caller subtracts the browser timezone offset before sending; copilot does not have a user-timezone signal, so dates pass through as UTC. HITL — confirmation required: this kicks a server-side report build. Always confirm interfaceId, pipeIds, and date range with the user before executing.
exportHistoryLogV2 W POST enabled Export the simulation / history log as a CSV file for a date range. Wraps the FE FlowHistory page action (POST /api/v2/historylog/exprot-history-log; the typo is intentional and consistent FE -> BE — do NOT correct it). CSV columns (typical): Date/Time (interface-local), Program ID, Program Name, Station ID, Station Name, Status, Runtime (seconds — METRIC), Water Consumed (L — METRIC), Flow Rate (L/min — METRIC), Error Message. Returns the CSV bytes as a base64 string plus filename, byteLength, rowCount,
exportStationRuntime R GET enabled Export the Station Runtime log as a CSV file for an absolute datetime range. Wraps the FE Report page action (GET /api/report/export-station-runtime). CSV columns (typical): Date/Time (interface-local), Station ID, Station Name, Type ID, Runtime (seconds — METRIC), Volume (deciliters dL — METRIC, NOT liters), Program ID, Program Name. Returns the CSV bytes as a base64 string plus filename, byteLength, rowCount,
getActualTotalWaterUsageChartV2 R GET /api/v2/monthlyreportcard/chart-actual-total-water-usage enabled Get the v2 monthly chart of ACTUAL total water usage for an interface. Wraps GET /api/v2/monthlyreportcard/chart-actual-total-water-usage (Reports / MonthlyReportCard). Returns + + — per-day water-usage series for the requested month. Use this for and to render daily usage bars/lines. V2 supersedes the legacy v1 route of the same name (intentionally not wrapped — use v2 unless the user explicitly asks for the legacy shape). For projected/scheduled flow instead of actual, see getProjectedFlowLog. Read-only, no DB or hardware side effects. month / year default to the current calendar month / year.
getActualTotalWaterUsageV2 R GET /api/v2/historylog/actual-total-water-usage enabled Get actual total water-usage series for an interface, optionally filtered by device type. Wraps GET /api/v2/historylog/actual-total-water-usage (V2 history log). Returns L — array of usage records, may be empty. The optional filter is a numeric device-type discriminator (BE enum — common values: 1=Station, 2=Sensor, 3=Pump, 4=Valve; omit to include all device types — verify exact mapping with BE if filter narrows results unexpectedly). BE PERMISSION GAP: class-level [Authorize] only (no scope check) — logged in project_copilot_be_permission_gaps.md. Read-only, no DB or hardware side effects.
getActualWaterUsage R GET /api/historylog/actual-total-water-usage enabled Get actual total water usage series for an interface (optionally filtered by device type).
getAverageTemperature R GET /api/report/average-temperature enabled Get a list of daily average-temperature aggregates for an interface across a date range. Wraps GET /api/report/average-temperature. Returns °C. / are ISO 8601 strings WITHOUT a trailing — the BE interprets them in the interface timezone. Default FE lookback is 7 days; copilot callers should pass explicit values. Read-only, no DB or hardware side effects.
getDynamicReport W POST /api/report/dynamic-report enabled Get a flexible-range irrigation report via POST /api/report/dynamic-report. ONE endpoint drives multiple report types selected by :\n- FLOW_LOG: per-minute expected vs measured vs unexpected flow (attrs 24/25/78)\n- FLOW_VOLUME: per-hour expected vs measured vs UNEXPECTED volume — use for questions (attrs 18/17/77)\n- PROGRAM_START: all program start events in range, including progState running/manual (attr 27). Covers without needing a programId.\n- STATION_RUNTIME: station runtime records (attrs 21/32/27). Response has staId only — join with listStations or getAreaHierarchy for zone names.\n- MONTHLY_RAINFALL: per-hour rainfall volume (attr 20).\nDate format for fromDate/toDate is (ISO date). Arbitrary range supported (3 days / week / month / quarter).
getEstWaterUsageNextMonth R GET /api/monthlyreportcard/est-water-usage-next-month enabled Get the estimated total water usage for the month FOLLOWING the requested month. Wraps GET /api/monthlyreportcard/est-water-usage-next-month (Reports / MonthlyReportCard). The (month, year) inputs identify the CURRENT reference month; the BE returns the projection for the next calendar month based on historical usage + ET + weather forecast + configured irrigation schedule. Returns + + — single object, not an array. Use this for . Distinct from getNextMonthTotalWaterUsage (single-param projection always relative to today) — this tool lets the caller pick the reference month explicitly. Read-only, no DB or hardware side effects. month / year default to the current calendar month / year.
getFlowHistoryV2 W POST /api/v2/historylog/flow-history enabled Get water-flow history records for an interface within a date range. Wraps POST /api/v2/historylog/flow-history (V2 history log). Returns — array of flow records, may be empty. Date semantics: fromDate / toDate are interpreted in the interface timezone (BE converts to UTC server-side via TimeZoneInfo.ConvertTimeToUtc). Pass plain ISO 8601 strings — e.g. — WITHOUT trailing Z so the BE applies interface-local time. BE PERMISSION GAP: this v2 endpoint has class-level [Authorize] only (no [RequireAuthorization(InterfaceRead)] scope check) — logged in project_copilot_be_permission_gaps.md. Read-only, no DB or hardware side effects.
getFlowLog R GET /api/report/flow-log enabled Get a JSON aggregate of flow log entries for an interface over the last days, optionally filtered by . Wraps GET /api/report/flow-log. Returns . NOTE: this is the JSON read variant. The CSV download counterpart is in
getMonthlyClimate R GET /api/monthlyreportcard/mtd-avg-daily-et enabled Get monthly climate metrics for a site: MTD daily averages for ET (evapotranspiration), rainfall, and temperature.
getMonthlyEt R GET /api/report/monthly-et enabled Get monthly evapotranspiration (ET) aggregates for an interface across a date range. Wraps GET /api/report/monthly-et. Returns mm — one entry per calendar month overlapping the range. / are ISO 8601 strings WITHOUT a trailing (BE applies interface timezone). Read-only, no DB or hardware side effects.
getMonthlyEtChart R GET /api/monthlyreportcard/chart-monthly-et enabled Get the monthly evapotranspiration (ET) chart for an interface. Wraps GET /api/monthlyreportcard/chart-monthly-et (Reports / MonthlyReportCard). Returns + — per-day ET series for the requested month. Use this to answer or to chart daily evapotranspiration over a single month. For multi-month ET aggregates, use getMonthlyEt (date-range tool) instead. Read-only, no DB or hardware side effects. month / year default to the current calendar month / year (resolved at execute() time).
getMonthlyFinancials R GET /api/v2/monthlyreportcard/financial-ytd-water-usage enabled Get monthly financial metrics for a site: year-to-date water usage and cost-of-water (financial year calculation).
getMonthlyRainFall R GET /api/report/monthly-rain-fall enabled Get monthly rainfall aggregates over a rolling N-day window for an interface. Wraps GET /api/report/monthly-rain-fall. Returns mmmm. The BE rolls back calendar days from today and groups by month, so the first / last month in the window may be partial. Read-only, no DB or hardware side effects.
getMonthlyWaterUsage R GET /api/v2/monthlyreportcard/mtd-total-water-usage enabled Get monthly water usage metrics for a site (total MTD water usage + chart breakdown). Returns month-to-date total water consumption and a per-day chart series.
getMonthlyWeatherInfoChart R GET /api/monthlyreportcard/chart-weather-info enabled Get the monthly weather chart for an interface. Wraps GET /api/monthlyreportcard/chart-weather-info (Reports / MonthlyReportCard). Returns + + — per-day weather series for the requested month. Use this for compound weather views over one calendar month — temperature trend, rainy-day count, wind exposure. For temperature-only daily aggregates use getAverageTemperature (date-range tool). For monthly rainfall totals use getMonthlyRainFall. Read-only, no DB or hardware side effects. month / year default to the current calendar month / year.
getMtdCostOfWater R GET /api/v2/monthlyreportcard/mtd-cost-of-water enabled Get the month-to-date (MTD) cost of water for an interface. Wraps GET /api/v2/monthlyreportcard/mtd-cost-of-water (Reports / MonthlyReportCard). Returns + + $/m³\$/L\ + USD — single object. Use this for financial reporting questions like + or . The BE picks up the per-interface rate / currency / fiscal-year config — no override here. Read-only, no DB or hardware side effects. month / year default to the current calendar month / year.
getNextMonthTotalWaterUsage R GET /api/historylog/next-month-total-water-usage enabled Get the estimated total water usage (in liters, L — METRIC) for the next calendar month for a given interface. Wraps GET /api/historylog/next-month-total-water-usage. Returns a single decimal scalar (e.g. L) or when the BE has insufficient history to forecast. Estimation runs server-side from historical usage + scheduled programs + ET / weather forecast inputs (server-side stochastic model — output is a point estimate, no confidence interval). Distinct from on MonthlyReportCard, which is bound to a specific (month, year) reference month — this tool is always . Read-only, no DB or hardware side effects.
getProgramHistoryV2 W POST /api/v2/historylog/program-history enabled Get all program runs on an interface within a date range. Wraps POST /api/v2/historylog/program-history (V2 history log). Returns — array of program-run records, may be empty. Date semantics: fromDate / toDate are interpreted in the interface timezone (BE converts to UTC server-side via TimeZoneInfo.ConvertTimeToUtc). Pass plain ISO 8601 strings — e.g. — WITHOUT trailing Z so the BE applies interface-local time. Distinct from getProgramRunHistory (GET /api/v2/historylog/run-history): that tool is scoped to a single programId and returns the past runs for that one program. This tool takes a date range and returns ALL programs that ran in the window — no programId filter. BE PERMISSION GAP: class-level [Authorize] only (no [RequireAuthorization] scope check). Read-only, no DB or hardware side effects.
getProgramStartReport R GET /api/report/program-start enabled Get program-start counts for an interface over a recent window. Wraps GET /api/report/program-start (Reports domain). Returns — a two-number summary. NOTE: despite the parameter, the response is NOT a per-day schedule; it is a two-number summary. Use getProgramRunHistory or getProgramHistoryV2 if the user wants a per-run list. SIDE EFFECT: BE calls EnsureActiveOnlineAsync(interfaceId) — this tool will FAIL if the interface is offline (despite being read-only otherwise). Read-only on the DB side, but does a live online-status check. No confirmation required.
getProjectedFlowLog R GET /api/historylog/projected-flow-log enabled Get a paginated list of projected (scheduled / upcoming) flow log entries for an interface. Wraps GET /api/historylog/projected-flow-log. Returns — paged wrapper. Pagination is 1-based ( starts at 1, BE convention). The wrapper is returned as-is so the LLM can decide whether to fetch additional pages by incrementing . Read-only, no DB or hardware side effects.
getStationRuntimeReport R GET /api/report/station-runtime enabled Get the structured Station Runtime report for an interface across an absolute datetime range. Wraps GET /api/report/station-runtime (Reports domain). Returns describing each station-run event in the window. Distinct from exportStationRuntime (CSV export with similar columns). fromTime / toTime are ISO 8601 strings WITHOUT trailing Z (e.g. ) — BE interprets them in the interface timezone. UNIT QUIRK: volumes use deciliters (dL = 0.1 L), NOT liters — divide by 10 if reporting to a user expecting L. Runtimes are seconds. METRIC ONLY. Read-only, no DB or hardware side effects.
getWaterConsumptionHistoryV2 W POST /api/v2/historylog/water-consumption-historylog enabled Get water-consumption history records for an interface within a date range. Wraps POST /api/v2/historylog/water-consumption-historylog (V2 history log). Returns L — array of consumption records, may be empty. Date semantics: fromDate / toDate are interpreted in the interface timezone (BE converts to UTC server-side). Pass plain ISO 8601 strings — e.g. — WITHOUT trailing Z so the BE applies interface-local time. BE PERMISSION GAP: this v2 endpoint has class-level [Authorize] only (no [RequireAuthorization(InterfaceRead)] scope check) — logged in project_copilot_be_permission_gaps.md. Read-only, no DB or hardware side effects.
getWaterConsumptionReport R GET /api/v2/watersource/report/monthly enabled Get monthly water consumption report for a site. Shows total water usage, per-station breakdown, and month-over-month trend.
getWaterTankReport R GET /api/v2/watertank/report/history enabled Get water tank level history (readings over a date range). Requires the specific tank id plus a fromDate and toDate.
getWaterUsageLog R GET /api/historylog/water-usage enabled Get water usage history series for an interface (optionally filtered by device type and a rolling number of months).
getWaterUsageV2 R GET /api/v2/historylog/water-usage enabled Get water-usage history series for an interface over a rolling window of months, optionally filtered by device type. Wraps GET /api/v2/historylog/water-usage (V2 history log). Returns L — one entry per period within the rolling window, may be empty. The optional is a numeric device-type discriminator (BE enum — typical: 1=Station, 2=Sensor, 3=Pump, 4=Valve); is the rolling lookback in months (1..24). BE PERMISSION GAP: class-level [Authorize] only (no scope check) — logged in project_copilot_be_permission_gaps.md. Read-only, no DB or hardware side effects.
getWeatherReportHistoric R GET /api/weather/report/historic enabled Get historical weather data for an interface across a date range. Wraps GET /api/weather/report/historic. The BE returns — the response shape is NOT strongly typed server-side and varies by weather-data provider, so do NOT promise specific fields to the user. Common fields include (YYYY-MM-DD), (°C — METRIC), (% RH 0..100), (m/s), (mm), (W/m²), (provider tag). If the interface has no weather integration configured, the BE may return an empty list. / are ISO date strings (YYYY-MM-DD); FE default lookback is 30 days. Inspect /api/weather/report/historic in the interface dashboard for the canonical shape on a given site. Read-only, no DB or hardware side effects.

sensors 11 tools · 7 R · 4 W

ToolR/WHTTP + EndpointStatusDescription
exportLeafSensorXlsx W POST enabled Export Leaf Wetness sensor data as an Excel (.xlsx) file for a date range. Wraps the FE Operations -> Sensors -> Leaf Wetness action (POST /api/sensor/{interfaceId}/export/leaf). The BE returns an Excel workbook (one worksheet per sensor named ; columns: Date, Time, Leaf Wetness Minutes (minutes wet in the period, 0..15 for 15-min cadence), Average Leaf Wetness (count of low-threshold readings), High Leaf Wetness (count of high-threshold readings)) — NOT a CSV, despite the FE method historically being named exportCsvLeaf. Returns the workbook bytes as a base64 string plus filename, content type, byte length, and the echoed parameters. Inputs: interfaceId (required, numeric path slug), sensorListIds (required, 1..10 numeric leaf-sensor IDs — flat array, no station context), and optional ISO 8601 fromDate / toDate WITH trailing Z (default: last 7 days, UTC start-of-day -> end-of-day). Leaf-sensor IDs come from filtered by type=104 (LeafWetness). When the BE has no rows in the requested window, it still returns a valid XLSX (200 OK) with a single sheet containing a placeholder row — surfaced via the echoed dates and a small byteLength. HITL — confirmation required: this kicks a server-side workbook build and streams a binary file back. Always confirm interfaceId, sensor list, and date range with the user before executing. No DB writes — pure read-as-export, but server-resource-heavy.
exportSoilmoistureSensorXlsx W POST enabled Export Soil Moisture sensor data as an Excel (.xlsx) file for a date range. Wraps the FE Operations -> Sensors -> Soil Moisture action (POST /api/sensor/{interfaceId}/export/soilmoisture). The BE returns an Excel workbook (one worksheet per sensor named after the sensor; columns include Date, Time, Moisture (% VWC, 0..100), EC (mS/cm), Soil Temperature (°C) time-series) — NOT a CSV, despite the FE method historically being named exportCsvSoilMoisture. Returns the workbook bytes as a base64 string plus filename, content type, byte length, and the echoed parameters. Inputs: interfaceId (required, numeric path slug), sensorList (required, 1..10 entries — each entry must contain BOTH and for the sensor; the leaf export uses a flat ID list, but soil-moisture is ASYMMETRIC and requires the station binding for every sensor), and optional ISO 8601 fromDate / toDate WITH trailing Z (default: last 7 days, UTC start-of-day -> end-of-day). Each sensor needs both AND — call first to harvest matching pairs (sensor row provides both and for soil sensors). A flat ID array WILL silently fail BE validation because the controller reads and binds nothing — output will be an empty workbook (still 200 OK). When the BE has no rows in the requested window, it still returns a valid XLSX (200 OK) with a single placeholder row. HITL — confirmation required: this kicks a server-side workbook build and streams a binary file back. Always confirm interfaceId, sensor list, and date range with the user before executing. No DB writes — pure read-as-export, but server-resource-heavy.
getComparisonData R GET /api/sensor/comparison-data enabled Get multi-sensor comparison time-series (soil moisture, EC, soil temperature) over a date range. Wraps GET /api/sensor/comparison-data. Returns one record per requested sensor . Per-sensor inner arrays may be independently empty (BE always returns the envelope, never null). Body uses field name (NOT ). Inputs: interfaceId, fromDate / endDate as ISO 8601 with milliseconds and trailing Z (FE convention: day-start / day-end UTC), isAvg (true = daily aggregates, false = raw ~15-min cadence; FE rule: true only when range >= 29 days), and listSensorIds (1..20 ids from getComparisonSensorOptions). Read-only, no DB or hardware side effects.
getComparisonSensorOptions R GET /api/sensor/comparison-sensor enabled List sensors available for the multi-sensor comparison chart on an interface. Wraps GET /api/sensor/comparison-sensor. Returns an array of comparison-eligible sensors Soil Moisture
getLeafWetnessHistory W POST /api/sensor/${interfaceId}/leafs/${sensorId} enabled Get historical leaf-wetness readings for a single leaf-wetness sensor over a date range. Wraps POST /api/sensor/{interfaceId}/leafs/{sensorId} (a POST-as-read: body carries date range + per-channel isAvg flags, but no DB writes). Returns . Body uses field name (NOT ). Date format: ISO 8601 with milliseconds and trailing Z (FE convention: day-start / day-end UTC). The single parameter only applies to the Low channel — High and Leaf channels are always returned raw, mirroring the FE wire shape (high.isAvg and leaf.isAvg are hard-coded false; the top-level IsAvg field is unused by the BE). EMPTY-WINDOW QUIRK: BE returns 200 OK with for an unknown sensorId, an empty window, AND a sensorId that does not belong to the given interfaceId — the three cases are indistinguishable from the response. Read-only, no DB or hardware side effects.
getSoilSensorCisgenicDetail R GET /api/sensor/${interfaceId}/soils/${address}/${ioId} enabled Get the LIVE reading + configuration of a Cisgenic-source soil moisture sensor on a line-unit. Wraps GET /api/sensor/{interfaceId}/soils/{address}/{ioId}. Returns . WARNING: this is a LIVE READ from controller hardware via the Crysberg LU SRC service (V220LUSRCService) — may return 5xx / time out if the interface or controller is offline. Slugs: is the line-unit hardware address (long, NOT a sensorId); is the IO channel index (int). Distinct from getSoilMoistureHistory which targets WeatherLink-source sensors via POST. Read-only, no DB writes, no MQTT publishes — but note the live HTTP fan-out to hardware. Soil-moisture interpretation: the calibrated (% VWC) is what to compare against the sensor profile (Wilting Point / Holding Capacity / Water Target, plus Deviation Threshold when configured) to label DRY (moisture < Water Target by more than Deviation Threshold; fall back to LLM judgment if threshold is absent) or Recovery (back to Water Target). Targeting is sensor/microclimate-scoped, not per-station.
getWeatherDataComparison W POST /api/sensor/weather-data enabled Get historical weather data (temperature, rainfall, ET) for a WeatherLink station to overlay on the comparison chart. Wraps POST /api/sensor/weather-data (a POST-as-read pattern: the body carries the date range + isAvg flag, but no DB writes happen). Returns . Each array is always present in the response and may be independently empty. Body uses field name (NOT ). interfaceId and stationId go on the URL as query params; fromDate / endDate / isAvg go in the JSON body. Date format: ISO 8601 with milliseconds and trailing Z (FE convention: day-start / day-end UTC). isAvg defaults false (set true for ranges >= 29 days). Read-only, no DB or hardware side effects.
getWeatherlinkSensors R GET /api/sensor/weatherlink/sensors enabled List WeatherLink sensors synced into the BE (global inventory across all tenants). Wraps GET /api/sensor/weatherlink/sensors. Returns a paged list of WeatherLink station/sensor pairs . BE PERMISSION GAP: this endpoint has no [RequireAuthorization] attribute AND the input DTO carries no filter, so the response is the GLOBAL WeatherLink catalog across every tenant the BE has synced — surface this to the BE team before broad rollout. Read-only, no DB or hardware side effects.
getWeatherStationShorts R GET /api/sensor/stations enabled Get a SHORT list of available WeatherLink stations (id + name only) — useful as a dropdown source when picking a station to attach to an interface. Wraps GET /api/sensor/stations. No params; returns the global third-party station catalog as a flat array of . BE PERMISSION GAP: this endpoint has no [RequireAuthorization] attribute — JWT-only auth, no per-interface scoping (informational rather than destructive since the WeatherLink catalog is third-party reference data). Read-only, no DB or hardware side effects.
listSensors R GET /api/sensor/${interfaceId} enabled List sensors registered to an interface (per-interface inventory across all sensor types: SoilMoisture, LeafWetness, ISS, Barometer, AirTemperature, Humidity, Rainfall, etc.). Wraps GET /api/sensor/{interfaceId}. Returns a paged result . is the sensor primary key (long); is the BE station id used in soil-moisture export pairing. FE convention defaults to PageSize=0 (all rows in one call). Use this BEFORE exportSoilmoistureSensorXlsx to obtain valid pairs (the BE export reads both fields and silently no-ops if is missing). Microclimate context: for soil-moisture decisions, the microclimate (group of sensors) is the proper grouping unit, NOT the individual station — stations attached to the same microclimate inherit the same Wilting Point / Holding Capacity / Water Target. Each soil-moisture sensor carries its own configurable thresholds; some BE responses additionally expose a Deviation Threshold (DRY = moisture < Water Target by more than Deviation Threshold; if absent, fall back to LLM judgment with a note that the threshold is unconfigured; Recovery = back to Water Target). Read-only, no DB or hardware side effects.
listWeatherStations R GET /api/sensor/weatherlink/stations enabled List WeatherLink (third-party) stations with full metadata, paged. Wraps GET /api/sensor/weatherlink/stations. Returns a paged list . Optional interfaceId narrows results to stations available to that interface; omit to query the global catalog. BE PERMISSION GAP: no [RequireAuthorization] attribute on this endpoint — JWT-only auth. Read-only, no DB or hardware side effects.

stations 40 tools · 13 R · 27 W · 4 disabled · 13 LIVE

ToolR/WHTTP + EndpointStatusDescription
applyControllerConfig LIVE HARDWARE W PUT /api/Controller/apply-cfg enabled LIVE HARDWARE ACTION. Apply the pending IO configuration to a single decoder via PUT /api/Controller/apply-cfg. The BE writes the config to the decoder via SRC LU.AppliesIoCfgToLineUnit and updates ConfigurationId on the entity. Always confirm details with the user before executing.
applyControllerConfigMultiple LIVE HARDWARE W PUT /api/Controller/apply-cfg-multiple enabled LIVE HARDWARE ACTION. Apply an IO configuration to up to 100 output decoders on the interface via PUT /api/Controller/apply-cfg-multiple. This endpoint is paginated server-side: if response.isPaging is true, call this tool again with page+1 and concatenate response.errors into the errors param. Returns { isSuccessful, isPaging, errors }. Always confirm details with the user before executing.
applyObservedFlow LIVE HARDWARE W POST /api/station/apply-observed-flow enabled LIVE HARDWARE ACTION. Calibrate each listed station\
controlController LIVE HARDWARE W POST /api/controller enabled LIVE HARDWARE ACTION. Send a typed control command to a decoder on the two-wire bus via POST /api/controller. type 1=On energizes the valve, 2=Off de-energizes it, 3=AutoSwitch toggles, 4=Ping verifies connectivity. This is the same endpoint the FE reuses for water-tank fill-valve toggles and discovered-decoder actions in the setup wizard. NOT a create — there is no separate decoder-create endpoint; decoders are registered implicitly by SRC discovery. Always confirm the decoder id, address, and interface with the user before invoking.
createStation W POST /api/station enabled Create a new irrigation station on a CisgenX interface. Controller must be an irrigation output decoder (controllerType=1, Purpose=IRRIGATION); pass its address+index. Writes to the BE database AND issues SRC commands; will trigger SignalR realtime events. METRIC ONLY (mm, mm/h, l/min, seconds).
createStationGroup W POST /api/station/stationgroup enabled Create a new virtual station group on an interface. The group is initially empty; stations are bound to it via the station-group membership flow (out of scope for this tool).
createStationQueue LIVE HARDWARE W POST /api/station/createqueue enabled LIVE HARDWARE ACTION (preparation step). Build or rebuild a manual-run queue of stations to run sequentially on an interface. Queues stations; does NOT start the run — actual start happens via runStation (POST /api/station/run). No FE callsite — relies on BE DTO FilteredLocationStationRequestDto. Physically affects controller scheduling — verify station IDs and group memberships before invoking. Writes a queue file to disk on the BE (/temp/running_station_queue.json) and creates ManualStationEntity rows; may reorganize stations into groups of 5. Heavy operation. LIVE HARDWARE: confirm via UI before executing.
customManualRunStation LIVE HARDWARE W POST /api/Station/custom-manual-run enabled LIVE HARDWARE ACTION. Manually run a batch of stations on the same interface in a single call (no FE callsite — relies on BE DTO CustomManualRunStationRequestDto). Physically actuates valves on the controller — verify ALL station IDs before invoking; a single invalid ID rolls back the entire batch with a 404. Writes to the BE database AND issues SRC commands per station; will trigger SignalR realtime events. LIVE HARDWARE: confirm via UI before executing.
deleteController W DELETE /api/controller DISABLED Delete a controller (decoder) via DELETE /api/controller. REQUIRES three query params: interfaceId, address, AND id (decoder index). The FE helper omits address and 400s — this tool sends all three. Hard delete on the BE. Always confirm details with the user before executing.
deleteStation W DELETE /api/station DISABLED Hard-delete an irrigation station. Calls SRC WE.DeleteStation under the hood and removes the BE record.
deleteStationGroup W DELETE /api/station/stationgroup DISABLED Delete a virtual station group. By default the group wrapper is removed and member stations are detached (kept on the interface, just unbound from the group). Setting isDataInclude=true ALSO deletes every station inside the group — this is destructive and irreversible. IMPORTANT: This is a write action. Always confirm details with the user before executing, and double-check isDataInclude.
deleteStationGroupManualStations W POST /api/station/stationgroup/manual-stations DISABLED Remove specific stations from a manual-run station group. Verb is POST but operation is DELETE — the BE method is (POST-with-body delete convention). Body field is the stationGroupId (BE DTO misnaming). Only the listed stationIds are detached from the group; the group itself is preserved. Source stationIds from getStationGroupManualStations or listStations rather than inventing values. IMPORTANT: Always confirm details with the user before executing.
getActualRunTime R GET /api/station/getactualruntime enabled Pure calculator: returns the seasonally-adjusted runtime as an string given a base runtime and a seasonalAdjust percentage. Formula: actualRuntime = baseRuntimeSeconds * (seasonalAdjust / 100). seasonalAdjust=100 returns the input unchanged; seasonalAdjust=50 halves it; seasonalAdjust=0 returns . Bad inputs silently fall back to (no error). No DB access. BE permission gap — pure calculator, no business data, low severity (JWT-only, no [RequireAuthorization] attribute on BE).
getFilteredLocationStations W POST /api/station/filteredlocationstation?${qs.toString()} enabled List stations grouped by sub-area for the manual-operation pin selector. Despite being a POST endpoint, the BE reads every filter from the query string and ignores the request body. Returns a paged result of NestedAreaStationResponseDto, where each row is { interfaceId, areaId, areaName, subAreaId, subAreaName, stations[] }. Pre-filters by manual-operation membership.
getMatrixProgramData R GET /api/station/station/matrix-program-data enabled Paged matrix view of stations vs. their assigned programs on an interface. Returns a PagedResult envelope { page, size, totalPage, totalCount, data: [...] }; each row carries { id, name, programIds[], programNames[], programData[][] } where programData is per-program nested step output. Set pageSize=0 to return ALL rows in a single page (BE substitutes totalCount). Defaults: pageIndex=1, pageSize=10. Read-only.
getProgramsByStation R GET /api/station/${input.interfaceId}/getlistprogrambystationasync enabled Paged list of stations on an interface with their assigned program ids. Each row exposes { interfaceId, id (=stationId), programId, controller, locationId, isPicked } where programId is named singular but holds an array of program ids (BE DTO misnaming — JSON key carries a list). PagedResult envelope { page, size, totalPage, totalCount, data: [...] }. Set pageSize=0 to return ALL rows in a single page (the FE convention for ). Defaults: pageIndex=1, pageSize=10. Read-only.
getStation R GET /api/station/${interfaceId}/${id} enabled Single-station full detail incl. relations (controller, plant, emitter, pipe, soil, ETZone, floor, sub-area, location, site) and live runtime state (state, error code, remaining/cycle/soak time). For paginated lists use getStationDetails. Note: RemainingTime is computed live and fluctuates between calls; PrecipitationRate, ExpectedFlow, ObservedFlow are returned in user-facing units (METRIC ONLY).
getStationGroupById R GET /api/station/stationgroup/${interfaceId}/${id} enabled Get one station group by id, returning the full VirtualStationGroupResponseDto: { id, name, stations[] } where stations[] is an array of QueuedDetailStationResponseDto with full per-station detail (address, index, locationId, programIds, controller, order, startTime, endTime). Distinct from listStationGroups: that returns a list filtered by stationGroupId; this returns the bare object. Read-only.
getStationGroupManualStations R GET /api/station/stationgroup/manual-stations enabled List the manual-run stations for an interface, nested by station group. Returns an array of NestedManualStationResponseDto: each outer entry is one station group with id (= stationGroupId) and a stations[] array of { id, address, index, locationId, name, locationName, startTime, endTime }. Optionally filter to a single group by passing stationGroupId. Read-only.
getStationGroupTime W POST /api/station/stationgroup/time enabled Compute the proposed start/end time window for one or more station groups, given a chained running-time and seasonal adjustment. POST verb but BE method is a READ (only InterfaceRead permission, no DB write); the body carries filter parameters. BE chains start times across groups: group 1 starts at startTime, group 2 starts at group 1 end, etc. Returns List<StationGroupTimeResponseDto>: [{ interfaceId, stationGroupId, stationGroupName, startTime, endTime }]. FE sends empty/zero defaults when in state; BE tolerates them.
getStationInformation R GET /api/station/station-information enabled Returns per-interface summary list of stations on an interface (different from getStation which returns a single-station full detail). Each entry contains stationId, stationName, address, and controllerId. Best for dropdowns and name/id lookups. Note: controllerId here is mapped from StationEntity.Index (decoder index inside the address column), NOT a controller PK/GUID. BE performs a soft online-check (EnsureActiveOnlineAsync) — if the interface is offline, this call throws an error.
getTotalRunTime R GET /api/station/gettotalruntime enabled Pure calculator: returns the cumulative runtime across N stations as an string. Formula: total = actualRunTimeSeconds * numOfStations. Use after getActualRunTime to estimate the wall-clock duration of a sequential multi-station run. numOfStations=0 returns . Bad actualRunTimeStr silently coerces to . No DB access. BE permission gap — pure calculator, no business data, low severity (JWT-only, no [RequireAuthorization] attribute on BE).
listStationGroups R GET /api/station/stationgroup/${interfaceId} enabled List the virtual station groups for an interface. Each group is a user-defined manual-operation bucket (distinct fromthe SRC StationGroupId stored on a station). Returns each group + +
manualRunStation LIVE HARDWARE W POST /api/Station/manual-run enabled LIVE HARDWARE ACTION. Manually run a single irrigation station with optional cycle/soak. Physically actuates valves on the controller — verify station ID before invoking. Time inputs (runtimeMinutes/cycleMinutes/soakMinutes) accept MINUTES (METRIC ONLY) and are converted to seconds at the BE boundary. Yup constraints (mirrored from FE): runtimeMinutes max 120, cycleMinutes <= runtimeMinutes, integers only. Writes to the BE database AND issues SRC commands; will trigger SignalR realtime events. LIVE HARDWARE: confirm via UI before executing.
manualRunStationWithTime LIVE HARDWARE W POST /api/Station/manual-run-with-time enabled LIVE HARDWARE ACTION. Manually run a single irrigation station for a fixed runtime (no cycle/soak — the BE explicitly nulls them out). Physically actuates valves on the controller — verify station ID before invoking. runtimeMinutes accepts MINUTES (METRIC ONLY, max 120) and is converted to seconds at the BE boundary. Writes to the BE database AND issues SRC commands; will trigger SignalR realtime events. LIVE HARDWARE: confirm via UI before executing.
multiUpdateStations W PUT /api/Station/multi-stations enabled Bulk-update map pins for stations on the floor map. Updates only the location/floor/sub-area assignment and lat/long; does NOT touch agronomic fields. Affects N stations at once. SECURITY NOTE: BE has NO [RequireAuthorization] attribute on this endpoint (only the controller-level JWT auth). Verify the array contents before confirming.
quickCreateStation W POST /api/Station/quick-create enabled Lighter station create: only the bare-minimum fields are required. BE expands this to a full create server-side, pulling Emitter/Soil/Plant/SubArea defaults from per-interface settings; DefaultRunTime is forced to . If any default lookup is missing on the BE side, the call will fail. No FE form exists for this endpoint (BE-only contract; usually consumed by mobile or batch tooling).
quickUpdateStation W PUT /api/Station/quick-update enabled Lighter station update: only the bare-minimum fields. Same shape as quickCreateStation plus required id. WARNING: BE forces DefaultRunTime to
resetAllStationErrors R GET /api/station/reset-errors enabled Bulk-clear error codes (set State=Idling, ErrorCode=0) on every station of an interface that currently has an error. Issues SRC WE.ResetStationErrors and triggers SignalR realtime events. NOTE: This clears error STATE only; it does NOT reset controller or station configuration. IMPORTANT: This is a write action affecting all stations on the interface. Always confirm details with the user before executing.
resetStationErrorById R GET /api/station/reset-error-by-id enabled Clear the error code (set State=Idling, ErrorCode=0) on a single station. Issues SRC WE.ResetStationErrorById and triggers SignalR realtime events. NOTE: This clears error STATE only; it does NOT reset controller or station configuration.
runStationByAction LIVE HARDWARE W POST /api/Station/runbyaction enabled LIVE HARDWARE ACTION. Run a station or station group by an action enum (1=Run-Seconds, 2=Run-Minutes, 3=Apply-Amount, 4=Verify-Flow). Hidden from BE Swagger (ApiExplorerSettings.IgnoreApi); endpoint is fully functional but undocumented. No FE callsite — relies on BE DTO ControlStationRequestDto. Physically actuates valves on the controller — verify station/group ID and the action enum before invoking. Writes to the BE database AND issues SRC commands; will trigger SignalR realtime events. LIVE HARDWARE: confirm via UI before executing.
setDecoderTypeConfig W PUT /api/Controller/decoder-type-configuration enabled Set per-decoder OutputDecoderType (1=Irrigation, 2=Fertigation, 3=Filtration, 4=PumpStart, 5=MV-NO, 6=MV-NC, 7=BoosterPump) and configuration binding via PUT /api/Controller/decoder-type-configuration. BE QUIRK: pass either ONE item (single-decoder update) OR the FULL set of output decoders on the interface — mismatched counts return false without applying. decoderType is OUTPUT-decoder only; do not target input decoders. Always confirm details with the user before executing.
stationOff LIVE HARDWARE R GET /api/station/off enabled LIVE HARDWARE ACTION. Close the valve at a single station on the given interface. Physically actuates hardware on the controller. Note: this also cancels any active manual run or scheduled cycle currently active on the station — not just a manual run. Always confirm the specific station id and interface id with the user before executing.
stationOffMultiple LIVE HARDWARE W POST /api/station/off/multiple enabled LIVE HARDWARE ACTION with a DECEPTIVE BLAST RADIUS — read carefully. The tool name and BE route suggest stopping only the listed stations, but the backend service actually issues an OffAllStation command to the controller, physically stopping EVERY active station on the interface. The provided station id list only controls which database rows have their state updated; stations not in the list will be physically stopped but will appear as still running in the DB until the next sync. Use stopAllStations if you want a clean site-wide stop. Always confirm with the user that they understand the full blast radius before executing.
stationOn LIVE HARDWARE R GET /api/station/on enabled LIVE HARDWARE ACTION. Open the valve at a single station on the given interface. The valve stays open until a stationOff (or stopAllStations) command arrives — there is no automatic time limit on this endpoint. Physically actuates hardware on the controller. Always confirm the specific station id and interface id with the user before executing.
stopAllStations LIVE HARDWARE W POST /api/station/stopAll enabled LIVE HARDWARE ACTION. Stop every running station on the entire interface in one call. Affects every active station on the site, not a subset. This is an emergency-stop level action: it cancels all in-flight manual runs and clears scheduling state for every active station on the interface. Always confirm the interface id with the user before executing.
updateController W PUT /api/controller enabled Update a controller (decoder) record via PUT /api/controller. Sets the name, decoder purpose (OutputDecoderType: 1=Irrigation, 2=Fertigation, 3=Filtration, 4=PumpStart, 5=MV-NO, 6=MV-NC, 7=BoosterPump), configuration binding, and TWI id. If the configuration changes, the BE also calls SRC LU.AppliesIoCfgToLineUnit which is a live-hardware effect — review before confirming. Always confirm details with the user before executing.
updateStation W PUT /api/station enabled Update an existing irrigation station. Same fields as createStation plus required id. Writes to the BE database AND issues SRC commands (UpdateLineUnit + UpdateStation); changing description cascades to the linked controller name. Triggers SignalR realtime events. METRIC ONLY.
updateStationGroup W PUT /api/station/stationgroup enabled Rename an existing station group. Rename only — this endpoint does NOT update station memberships. To change which stations belong to a group, use the dedicated membership flow (out of scope for this tool).
updateStationGroupManualStations W PUT /api/station/stationgroup/manual-stations enabled Replace the full set of manual-run stations under a station group (bulk replacement, not delta). Body field is the stationGroupId (BE DTO misnaming). The array carries per-row detail (id = stationId, plus optional address/index/locationId/name/locationName/startTime/endTime); fetch this from listStations or getStationGroupManualStations rather than inventing values. Stations omitted from the new list are removed from the group. IMPORTANT: Always confirm details with the user before executing.

telemetry 20 tools · 13 R · 7 W · 1 disabled · 1 LIVE

ToolR/WHTTP + EndpointStatusDescription
exportWeatherlinkXlsx W POST enabled Export WeatherLink station telemetry as an Excel (.xlsx) file for a date range. Wraps the FE Operations -> Weather Dashboard action (POST /api/weather/export-weatherlink). The BE returns an Excel workbook (one worksheet per station; columns: Date/Time (UTC), Temperature (°C), Humidity (% RH 0..100), Dew Point (°C), Wind Speed (m/s), Wind Direction (degrees 0..360, 0=North), Rain (mm), ET (mm — reference ET₀), THSW (°C apparent), Solar Radiation (W/m²), UV index (0..15)) — NOT a CSV, despite the FE method historically being named exportCSV. METRIC-ONLY units (BE hard-coded — imperial conversion deferred per project_copilot_imperial_unit_followup memory). Returns the workbook bytes as a base64 string plus filename, content type, byte length, and the echoed parameters. Inputs: interfaceId (required, numeric), stationWeatherLinkIds (required, >=1 station; numeric values from the interface\No data from: {from} to: {to}
getCurrentWeather R GET /api/weather enabled Fetch current weather conditions from OpenWeather for a lat/lon. Use lat/lon from getInterfaces -> site geo coords (siteOverlay center). Returns OpenWeather native units (NOT pre-converted): / / / in KELVIN — to display Celsius, subtract 273.15; in m/s; 0..360 (0=North, clockwise); in hPa; 1h in mm/h (last hour); in metres (capped at 10000); % cloud cover 0..100; timestamps / / in unix epoch seconds UTC; % RH 0..100. All numeric fields may be null. BE permission gap: only class-level [Authorize] JWT, no [RequireAuthorization] resource guard — defensible because the endpoint is a stateless OpenWeather proxy not bound to any tenant resource. Read-only, no DB or hardware side effects.
getFlowSensors R GET /api/flowsensor/get-details enabled Get detailed flow sensor readings for a specific interface. Returns water flow rate, total volume, and flow status per sensor.
getIrrigationOverview R GET /api/irrigationoverview/${interfaceId} enabled Get high-level irrigation overview for a specific interface/site (areas, stations, program status). Requires interfaceId — use getInterfaces first if unknown.
getSensorMapOverlay R GET /api/sensor/${interfaceId}/mapoverlay enabled Get soil moisture data formatted for map overlay view. Shows spatial distribution of moisture across the site.
getSimulationProgramStatus W POST /api/simulation/program enabled Get scheduled and currently-running irrigation programs/stations for an interface via POST /api/simulation/program (lowercase path — browser reality). Accepts ISO timestamps for fromDate/toDate; the tool internally converts to the US-locale format the BE expects. To get
getSoilMoisture R GET /api/sensor/${interfaceId}/soils/${sensorId} enabled Get soil moisture sensor readings for a specific interface (site/controller). Returns sensor data including moisture percentage, temperature, and EC values.
getSoilMoistureHistory W POST /api/sensor/${interfaceId}/soils/${sensorId} enabled Get historical soil moisture readings for a specific sensor over a date range via POST /api/sensor/{interfaceId}/soils/{sensorId}. Note the body uses fromDate + endDate (NOT toDate).
getSoilMoistureSensorDetail R GET /api/sensor/soil-moisture/${sensorId} enabled Get a soil moisture sensor detail (name plus agronomic settings: holdingCapacity, wiltingPoint, waterTarget; some BE responses also include a Deviation Threshold field). Wraps GET /api/sensor/soil-moisture/{sensorId}. Returns — same shape that updateSoilMoistureSensor accepts. Useful as the read-side of a read-then-update workflow. Soil-moisture irrigation logic is sensor/microclimate-scoped (stations sharing a microclimate share these thresholds): DRY = current moisture < waterTarget by more than the configured Deviation Threshold (if Deviation Threshold is absent from the response, fall back to LLM judgment and note that the threshold is unconfigured); Recovery (post-irrigation) = moisture returns to waterTarget. Read-only, no DB or hardware side effects.
getStationLastUpdated W POST /api/weather/weatherlink/${stationId}/get-last-updated enabled Fetch the latest sensor reading metadata for a WeatherLink station. Wraps POST /api/weather/weatherlink/{stationId}/get-last-updated. POST-as-read — body is empty, no DB writes, no MQTT, no hardware. Returns at minimum ; other freshness fields may be present and are passed through unchanged. Use when the user asks or to surface freshness of WeatherLink data on a dashboard. Read-only, no side effects despite POST verb.
getTelemetryAssets R GET /api/asset/list enabled Get list of all telemetry assets (devices) from the Telemetry Hub. Returns asset names, IDs, and metadata.
getTelemetryTagKeys R GET /api/tag/keys/${assetId} enabled Get all available data key names (metrics) for a specific telemetry asset. Use this to discover what data points are available before querying.
getWeatherForecast R GET /api/weather/forecast enabled Fetch a 5-day / 3-hour weather forecast from OpenWeather for a lat/lon (typically 40 entries — ). Use lat/lon from getInterfaces -> site geo coords. Response shape: 3h. All numeric fields may be null. BE permission gap: only class-level [Authorize] JWT, no [RequireAuthorization] resource guard — defensible (stateless external proxy). Read-only, no DB or hardware side effects.
getWeatherlinkAtmospheric R GET /api/weather/weatherlink/${interfaceId}/temperature enabled Get current atmospheric weatherlink readings for a station: temperature (°C — air temp, currentValue + today high/low), humidity (% RH 0..100, currentValue), barometric pressure (hPa, last 24-rows trend + currentValue), and THSW comfort index (°C — Temperature/Humidity/Sun/Wind apparent temperature, currentValue + today high). Fans out to 4 BE endpoints in parallel and returns — each part is so a single 404/null leg does not blank the whole response. Pass optional ISO 8601 UTC / (with trailing ) to bound the barometers history; the other 3 parts ignore time params and return the latest reading. When / are omitted, the BE returns the last 24 barometer rows (a sliding COUNT window, NOT a 24-hour window — sample cadence is variable). Note: humidity has no current FE consumer; this tool exposes BE capability directly. Read-only, no DB or hardware side effects.
getWeatherlinkPrecipitation R GET /api/weather/weatherlink/${interfaceId}/rain enabled Get current precipitation weatherlink readings for a station: rain (mm — current day total, current storm total, current rate mm/h), rain-total (mm — last 1h / 24h / 7d cumulative sums), and ET evapotranspiration (mm — 1d / 7d / 30d cumulative reference ET₀). Fans out to 3 BE endpoints in parallel; returns with per-part mm. Partial failures are reported per part. METRIC-ONLY output (BE hard-coded — imperial conversion deferred per project_copilot_imperial_unit_followup memory). BE quirk: only the endpoint actually honors the unit param; and always emit mm regardless. Read-only, no DB or hardware side effects.
getWeatherlinkSolar R GET /api/weather/weatherlink/${interfaceId}/solar enabled Get current solar radiation weatherlink reading for a station — incoming shortwave irradiance in W/m² (typical clear-sky daytime range 0..1200; nighttime 0). Atomic 1:1 wrapper over GET /api/weather/weatherlink/{interfaceId}/solar. BE returns the shared WeatherLinkWindSpeedResponseDto shape ; only (latest sample) and (today high) are populated for solar — the other DTO fields (low, gust, etc.) are null. Returns W/m². Read-only, no DB or hardware side effects.
getWeatherlinkWind R GET /api/weather/weatherlink/${interfaceId}/wind-speed enabled Get current wind weatherlink readings for a station: wind speed (m/s — current + today high), wind direction (compass degrees 0..360, 0=North, clockwise; plus 16-point cardinal label N/NNE/NE/ENE/.../NNW), and wind rose (% distribution 0..100 per direction across m/s buckets — today only; the BE always returns null for week/month aggregates). Fans out to 3 BE endpoints in parallel and returns with per-part . Partial failures are reported per part. Note: wind-rose has no current FE consumer; this tool exposes BE capability directly. Read-only, no DB or hardware side effects.
purgeSoilSensorDataBefore W DELETE /api/sensor/delete-data-soilmoisture DISABLED DESTRUCTIVE — soft-delete ALL soil moisture sensor readings older than a cutoff date. Wraps DELETE /api/sensor/delete-data-soilmoisture (sets IsDeleted=true on every ThirdPartyDataEntity row where TimeSpan < for the given sensor; the BE timezone-adjusts from the interface or station timezone). The parameter is a CUTOFF, NOT a single-day delete — everything older than is purged. CASCADE: any chart, comparison, or report (getComparisonData / getWeatherDataComparison / monthly-report-card / soil-moisture history exports) that pulls from this sensor will lose all rows older than the cutoff. The sensor record itself is NOT deleted; only its historical readings. Cannot be undone via this tool — soft-deleted rows could in theory be restored by direct DB access flipping IsDeleted=false, but no copilot tool exposes that. SECURITY NOTE: the FE requires interactive password verification before firing this delete; this copilot tool does NOT enforce that password gate (known FE/BE permission gap). HITL — confirmation required. Always confirm interface, sensor, station, and cutoff date (verify timezone) with the user before executing.
syncWeatherStationSensors W POST /api/weather/sync-station-site-sensor enabled Refresh / Discover sensor sync. Pulls latest WeatherLink stations and sensor metadata into the CisgenX backend. Wraps GET /api/weather/sync-station-site-sensor — typically takes a few seconds (live external HTTP). Use when the user asks to
updateSoilMoistureSensor LIVE HARDWARE W PUT /api/sensor/soil-moisture enabled Update a soil moisture sensor name and agronomic settings (holdingCapacity, wiltingPoint, waterTarget). Wraps PUT /api/sensor/soil-moisture. Full-replacement (PUT) semantics: every field on the request body is written; omitted optional/nullable fields are upserted to the BE row (the BE upserts a SoilMoistureSensorSetting row keyed by ThirdPartySensorId — passing null clears that field). All three agronomic params are in % VWC, 0..100. CASCADE: the new thresholds drive irrigation-decision logic for any program tied to this sensor — and because soil-moisture targeting is sensor/microclimate-scoped, every station attached to the same microclimate inherits these thresholds (holdingCapacity = field-capacity ceiling, wiltingPoint = stress floor, waterTarget = mid-band trigger; DRY = current moisture < waterTarget by more than the configured Deviation Threshold, Recovery = back to waterTarget). Be careful — wrong values can cause programs to under-irrigate (raised wiltingPoint) or over-irrigate (raised holdingCapacity). BE rejects with NotFound if the sensor id does not exist. Side effects: DB-only (no SRC/MQTT writes, no live hardware effect). HITL — confirmation required: always confirm sensorId, name, and the three thresholds with the user before executing.

ui 1 tools · 0 R · 0 W · 1 client

ToolR/WHTTP + EndpointStatusDescription
selectInterface C CLIENT (client-side) enabled Set the user\

waterSource 7 tools · 4 R · 3 W · 1 disabled

ToolR/WHTTP + EndpointStatusDescription
createWaterSource W POST /api/WaterSource enabled HITL write — Create a new WaterSource. Cost is in metric ($/m³) — do NOT convert from $/kL (FE displays $/kL but storage is per m³; user-supplied $/kL must be divided by 1000 before passing here). Each (flowValveId, flowSensorId) pair must be free — call listFlowValvesForWaterSource / listFlowSensorsForWaterSource (without waterSourceId) to discover available pairs. Body: see params. Returns the created WaterSource. BE enforces interface.write. Confirmation required.
deleteWaterSource W DELETE /api/WaterSource/${id} DISABLED HITL write — Delete a WaterSource. DESTRUCTIVE — cannot be undone. CASCADE: the bound flow valve and flow sensor are released back to the available pool (other WaterSources can re-bind them). MTD water-cost calculations going forward will lose this source\
getWaterSource R GET /api/WaterSource/${id} enabled Get one WaterSource by id. URL is /api/WaterSource/{id} — does NOT take interfaceId in path (unlike other hydraulic domains which use /{interfaceId}/{id}). Returns full DTO incl. Cost in metric ($/m³). Read-only. BE enforces interface.read scoped via the row\
listFlowSensorsForWaterSource R GET /api/WaterSource/flowsensor enabled Picker helper — list flow sensors available to associate with a WaterSource on the given interface. Returns sensors NOT already bound to another WaterSource. When editing, pass the existing waterSourceId so the current sensor appears in the list (otherwise it would be filtered out as already-bound). Read-only.
listFlowValvesForWaterSource R GET /api/WaterSource/flowvalve enabled Picker helper — list flow valves available to associate with a WaterSource on the given interface. Returns valves NOT already bound to another WaterSource. When editing, pass the existing waterSourceId so the current valve appears in the list (otherwise it would be filtered out as already-bound). Read-only.
listWaterSources R GET /api/WaterSource enabled Get paged list of WaterSource entities for one interface. Each item: { Id, Name, InterfaceId, FlowValveId, FlowSensorId, Description, Cost (per m³, currency-agnostic numeric — FE converts to $/kL for display) }. Paging via PageIndex (1-based) / PageSize (0=fetch all). Read-only. BE enforces interface.read.
updateWaterSource W PUT /api/WaterSource/${proposedArgs.id} enabled HITL write — Update an existing WaterSource (PUT /api/WaterSource/{id}, body without id). Full-replacement — every field below is mandatory; fetch via getWaterSource first to preserve unchanged fields. Cost in $/m³ (metric). Reassigning flowValveId/flowSensorId requires the new pair to be free — pass the current waterSourceId to listFlowValvesForWaterSource / listFlowSensorsForWaterSource so the current valve/sensor stays in the picker list. CASCADE: changing cost affects MTD water-cost calculations going forward only — historical Reports rows are NOT recomputed. BE enforces interface.write. Confirmation required.