{"_id":"@asobacloud/sdk","_rev":"7-81ebee01243b58a97b8d221e69d29549","name":"@asobacloud/sdk","dist-tags":{"latest":"1.1.1"},"versions":{"1.0.0":{"name":"@asobacloud/sdk","version":"1.0.0","keywords":["asoba","asobacloud","ona","energy","solar","forecasting","iot","edge-computing","sdk"],"author":{"name":"Asoba","email":"support@asoba.co"},"license":"MIT","_id":"@asobacloud/sdk@1.0.0","maintainers":[{"name":"asoba","email":"shingai@asoba.co"}],"homepage":"https://github.com/AsobaCloud/sdk","bugs":{"url":"https://github.com/AsobaCloud/sdk/issues"},"dist":{"shasum":"1c055fb7011ff1050e2808f0fc7a967143b7b115","tarball":"https://registry.npmjs.org/@asobacloud/sdk/-/sdk-1.0.0.tgz","fileCount":28,"integrity":"sha512-opS9P/5C5ZZTTAnke6O1wMS4QrBvrhAB7caWFpolUJulx2Lg99gRvDS5oBJPPaU0xmiMJyG8J/DxG5zP/pA6ig==","signatures":[{"sig":"MEUCIQCulIVqDH7Wge93FSAcns2lTguv66aO/6l0UtopoGG9WgIgfyveeqgCqw9veqJ7w8+bjAx57quBCaYCEXTOIPtserU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114370},"main":"src/index.js","types":"src/types/index.d.ts","engines":{"node":">=14.0.0"},"gitHead":"f3b7f3d13ad8608599d09b444d2bec8b19f7128c","scripts":{"lint":"eslint src/**/*.js","test":"node --test tests/**/*.test.js","format":"prettier --write src/**/*.js"},"_npmUser":{"name":"asoba","email":"shingai@asoba.co"},"repository":{"url":"git+https://github.com/AsobaCloud/sdk.git","type":"git","directory":"javascript"},"_npmVersion":"12.0.2","description":"Official JavaScript SDK for the Asoba Energy Management Platform","directories":{},"_nodeVersion":"24.18.0","dependencies":{"aws4":"^1.12.0","axios":"^1.6.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.50.0","prettier":"^3.0.0","typescript":"^5.2.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.0.0_1786179058106_0.9317656824174732","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@asobacloud/sdk","version":"1.0.1","keywords":["asoba","asobacloud","ona","energy","solar","forecasting","iot","edge-computing","sdk"],"author":{"name":"Asoba","email":"support@asoba.co"},"license":"MIT","_id":"@asobacloud/sdk@1.0.1","maintainers":[{"name":"asoba","email":"shingai@asoba.co"}],"homepage":"https://github.com/AsobaCloud/sdk","bugs":{"url":"https://github.com/AsobaCloud/sdk/issues"},"dist":{"shasum":"60c4717a66da51074147d5dfacb0e0910e1471f2","tarball":"https://registry.npmjs.org/@asobacloud/sdk/-/sdk-1.0.1.tgz","fileCount":28,"integrity":"sha512-LG78mPZesnLjGwrQjMss76wJ94RRKI2UvjnWrXtdoBqkc1SlTvH6jqZAkKhNOL1Bcv0+Ux+/sKoinprm1yssgQ==","signatures":[{"sig":"MEYCIQDDDgiFRgvQGyi0+DAYeRC6RIbk9lW+C7x1Xxo67iEkJAIhAL76jsJuCnxtYWhiaZaE/p/7pfVuWNUIgaUtsGn7Spcj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":112834},"main":"src/index.js","types":"src/types/index.d.ts","engines":{"node":">=14.0.0"},"gitHead":"a917fc5bc957ca36605e53d78eea6cbb2a9b8b4a","scripts":{"lint":"eslint src/**/*.js","test":"node --test tests/**/*.test.js","format":"prettier --write src/**/*.js"},"_npmUser":{"name":"asoba","email":"shingai@asoba.co"},"repository":{"url":"git+https://github.com/AsobaCloud/sdk.git","type":"git","directory":"javascript"},"_npmVersion":"12.0.2","description":"Official JavaScript SDK for the Asoba Energy Management Platform","directories":{},"_nodeVersion":"24.18.0","dependencies":{"aws4":"^1.12.0","axios":"^1.6.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.50.0","prettier":"^3.0.0","typescript":"^5.2.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.0.1_1786180639427_0.5834661085240742","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@asobacloud/sdk","version":"1.0.2","keywords":["asoba","asobacloud","ona","energy","solar","forecasting","iot","edge-computing","sdk"],"author":{"name":"Asoba","email":"support@asoba.co"},"license":"MIT","_id":"@asobacloud/sdk@1.0.2","maintainers":[{"name":"asoba","email":"shingai@asoba.co"}],"homepage":"https://github.com/AsobaCloud/sdk","bugs":{"url":"https://github.com/AsobaCloud/sdk/issues"},"dist":{"shasum":"21a37f77a5aa57e63281cbc299fe45d5c7f6f144","tarball":"https://registry.npmjs.org/@asobacloud/sdk/-/sdk-1.0.2.tgz","fileCount":28,"integrity":"sha512-iUFQ3N4ujXAbcEDE9s61/NPcT7v4GT3gmF2unOAoExG7BXY9Oq66BNnrGLTABRwZvHIt8GSmxnZqGqQ5JqhkkA==","signatures":[{"sig":"MEQCIFIvvdcCZf4k9BqfAQ4HKCNn70XyTI/LJJ2fxCpfBrCZAiAjkULdaTeLAbFKXvZxOzHqgpXuS4TU+J2jfZ9z4Y8cXg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":112737},"main":"src/index.js","types":"src/types/index.d.ts","engines":{"node":">=14.0.0"},"gitHead":"01fd1fc1749e83ff81ff88e5a493e9efea983fb0","scripts":{"lint":"eslint src/**/*.js","test":"node --test tests/**/*.test.js","format":"prettier --write src/**/*.js"},"_npmUser":{"name":"asoba","email":"shingai@asoba.co"},"repository":{"url":"git+https://github.com/AsobaCloud/sdk.git","type":"git","directory":"javascript"},"_npmVersion":"12.0.2","description":"Official JavaScript SDK for the Asoba Energy Management Platform","directories":{},"_nodeVersion":"24.18.0","dependencies":{"aws4":"^1.12.0","axios":"^1.6.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.50.0","prettier":"^3.0.0","typescript":"^5.2.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.0.2_1786184547666_0.4145461413202782","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@asobacloud/sdk","version":"1.0.3","keywords":["asoba","asobacloud","ona","energy","solar","forecasting","iot","edge-computing","sdk"],"author":{"name":"Asoba","email":"support@asoba.co"},"license":"MIT","_id":"@asobacloud/sdk@1.0.3","maintainers":[{"name":"asoba","email":"shingai@asoba.co"}],"homepage":"https://github.com/AsobaCloud/sdk","bugs":{"url":"https://github.com/AsobaCloud/sdk/issues"},"dist":{"shasum":"8968e9d8134e0ae2061e8dfb8aae51d1f5ab524d","tarball":"https://registry.npmjs.org/@asobacloud/sdk/-/sdk-1.0.3.tgz","fileCount":28,"integrity":"sha512-WZT8mdR+te42thcSJ1wTSem2lbOtrHsNN9zi54OSAS4f8/rymwbuZ2+g6szefWPf1R0utk/vuV/4fHJS8sur0w==","signatures":[{"sig":"MEQCIEQhC3IGk5v254XM7mo4bRZKSRn2P1XPKDakLmMg+UXcAiBaNVBoGxbphoBXIL2FxtaPOIUeiQcJGHKCvlW52K8mkw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110318},"main":"src/index.js","types":"src/types/index.d.ts","engines":{"node":">=14.0.0"},"gitHead":"fd709e24a8fae26330c687593661434f54a4617c","scripts":{"lint":"eslint src/**/*.js","test":"node --test tests/**/*.test.js","format":"prettier --write src/**/*.js"},"_npmUser":{"name":"asoba","email":"shingai@asoba.co"},"repository":{"url":"git+https://github.com/AsobaCloud/sdk.git","type":"git","directory":"javascript"},"_npmVersion":"12.0.2","description":"Official JavaScript SDK for the Asoba Energy Management Platform","directories":{},"_nodeVersion":"24.18.0","dependencies":{"aws4":"^1.12.0","axios":"^1.6.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.50.0","prettier":"^3.0.0","typescript":"^5.2.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.0.3_1786198270294_0.540470039505847","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@asobacloud/sdk","version":"1.0.4","keywords":["asoba","asobacloud","ona","energy","solar","forecasting","iot","edge-computing","sdk"],"author":{"name":"Asoba","email":"support@asoba.co"},"license":"MIT","_id":"@asobacloud/sdk@1.0.4","maintainers":[{"name":"asoba","email":"shingai@asoba.co"}],"homepage":"https://github.com/AsobaCloud/sdk","bugs":{"url":"https://github.com/AsobaCloud/sdk/issues"},"dist":{"shasum":"1a2be46211fd269bc9adc818f027051ae11b3ad5","tarball":"https://registry.npmjs.org/@asobacloud/sdk/-/sdk-1.0.4.tgz","fileCount":28,"integrity":"sha512-wy0mLbRgSKR8oiqrY3x/6HjzS/MA5rxoLINsFFGZujIY/1w5Kwo/tDAzIV5ITYAcUUzLDbiMi9EXlX5vVwBg+w==","signatures":[{"sig":"MEUCIHIkChlNb/joZ3A9eCJaImnCbUzK2W9I8DSmWJ84DS+MAiEAsippYEczcUl5GsZ8IeTsQ/5hVZ5oRHTRL6Mp9T2eTS8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110730},"main":"src/index.js","types":"src/types/index.d.ts","engines":{"node":">=14.0.0"},"gitHead":"950b19eb781e5cad0cbb712bf1e69dbcc876bcfe","scripts":{"lint":"eslint src/**/*.js","test":"node --test tests/**/*.test.js","format":"prettier --write src/**/*.js"},"_npmUser":{"name":"asoba","email":"shingai@asoba.co"},"repository":{"url":"git+https://github.com/AsobaCloud/sdk.git","type":"git","directory":"javascript"},"_npmVersion":"12.0.2","description":"Official JavaScript SDK for the Asoba Energy Management Platform","directories":{},"_nodeVersion":"24.18.0","dependencies":{"aws4":"^1.12.0","axios":"^1.6.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.50.0","prettier":"^3.0.0","typescript":"^5.2.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.0.4_1786207304210_0.18995108134693783","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@asobacloud/sdk","version":"1.0.5","keywords":["asoba","asobacloud","ona","energy","solar","forecasting","iot","edge-computing","sdk"],"author":{"name":"Asoba","email":"support@asoba.co"},"license":"MIT","_id":"@asobacloud/sdk@1.0.5","maintainers":[{"name":"asoba","email":"shingai@asoba.co"}],"homepage":"https://asoba.co","bugs":{"url":"https://github.com/AsobaCloud/sdk/issues"},"dist":{"shasum":"a05f71e060339d131d689fd37b1a85725b943010","tarball":"https://registry.npmjs.org/@asobacloud/sdk/-/sdk-1.0.5.tgz","fileCount":28,"integrity":"sha512-Kpb87dN3rotE55ErehXQIcDnXDLDNaka/H13AuNOKv2yACeqo9GaqKI0SqDryh+TF4ap4kEAUIH6t83fZ3qPPw==","signatures":[{"sig":"MEYCIQCUmlziycwZbhdAnFgLbFzxgmxDh8h6E+ap7afiPZy1IAIhALLjCi5yWfHZUKiFuPiyyX69joGElrqJKvNXgy6fvC52","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110784},"main":"src/index.js","types":"src/types/index.d.ts","engines":{"node":">=14.0.0"},"gitHead":"aa2cfe3f628fa7eeb8cf0ee1787a18b19b73706e","scripts":{"lint":"eslint src/**/*.js","test":"node --test tests/**/*.test.js","format":"prettier --write src/**/*.js"},"_npmUser":{"name":"asoba","email":"shingai@asoba.co"},"repository":{"url":"git+https://github.com/AsobaCloud/sdk.git","type":"git","directory":"javascript"},"_npmVersion":"12.0.2","description":"Official JavaScript SDK for the Asoba Energy Management Platform","directories":{},"_nodeVersion":"24.18.0","dependencies":{"aws4":"^1.12.0","axios":"^1.6.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.50.0","prettier":"^3.0.0","typescript":"^5.2.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.0.5_1786343432161_0.3333621270789009","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@asobacloud/sdk","version":"1.1.1","description":"Official JavaScript SDK for the Asoba Energy Management Platform","main":"src/index.js","types":"src/types/index.d.ts","scripts":{"test":"node --test tests/**/*.test.js","lint":"eslint src/**/*.js","format":"prettier --write src/**/*.js"},"keywords":["asoba","asobacloud","ona","energy","solar","forecasting","iot","edge-computing","sdk"],"author":{"name":"Asoba","email":"support@asoba.co"},"license":"MIT","homepage":"https://asoba.co","bugs":{"url":"https://github.com/AsobaCloud/sdk/issues"},"repository":{"type":"git","url":"git+https://github.com/AsobaCloud/sdk.git","directory":"javascript"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"dependencies":{"axios":"^1.6.0","aws4":"^1.12.0"},"devDependencies":{"@types/node":"^20.0.0","eslint":"^8.50.0","prettier":"^3.0.0","typescript":"^5.2.0"},"engines":{"node":">=14.0.0"},"gitHead":"93bb07ae0488afaad19a9463eeba4278c5b75b99","_id":"@asobacloud/sdk@1.1.1","_nodeVersion":"24.19.0","_npmVersion":"12.0.2","dist":{"integrity":"sha512-XJC6YuVKJNWN8BFvvOKoC2YUG0x0Lz2P3RUgP602X/OtjCe7Z/ZfDuJpX8xb/vE5wscB9lY75RvTt25MBcNDKQ==","shasum":"6c9dc88d717f45c7a431eac6fdbf447eec57de28","tarball":"https://registry.npmjs.org/@asobacloud/sdk/-/sdk-1.1.1.tgz","fileCount":28,"unpackedSize":110788,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@asobacloud%2fsdk@1.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQD1t+8Up78qIRSfFrCffMzATGqufxFc3qNp4MP/0/CQjAIhANDVJUBgZXGCQhB9FZdQWZBjzdobvB0bfpdrLJg0Cf76"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:fdb28e37-05f8-47b0-8dac-04f92100bc8f"}},"directories":{},"maintainers":[{"name":"asoba","email":"shingai@asoba.co"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk_1.1.1_1787279472702_0.6661715793328236"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-08T08:50:57.829Z","modified":"2026-08-21T02:31:13.283Z","1.0.0":"2026-08-08T08:50:58.255Z","1.0.1":"2026-08-08T09:17:19.570Z","1.0.2":"2026-08-08T10:22:27.844Z","1.0.3":"2026-08-08T14:11:10.435Z","1.0.4":"2026-08-08T16:41:44.349Z","1.0.5":"2026-08-10T06:30:32.309Z","1.1.1":"2026-08-21T02:31:12.868Z"},"bugs":{"url":"https://github.com/AsobaCloud/sdk/issues"},"author":{"name":"Asoba","email":"support@asoba.co"},"license":"MIT","homepage":"https://asoba.co","keywords":["asoba","asobacloud","ona","energy","solar","forecasting","iot","edge-computing","sdk"],"repository":{"type":"git","url":"git+https://github.com/AsobaCloud/sdk.git","directory":"javascript"},"description":"Official JavaScript SDK for the Asoba Energy Management Platform","maintainers":[{"name":"asoba","email":"shingai@asoba.co"}],"readme":"# <img src=\"https://raw.githubusercontent.com/AsobaCloud/sdk/main/docs/asoba-logo.svg\" alt=\"Asoba\" width=\"36\" height=\"36\" align=\"bottom\" /> Ona SDK — JavaScript\n\n[![npm](https://img.shields.io/npm/v/@asobacloud/sdk.svg)](https://www.npmjs.com/package/@asobacloud/sdk)\n[![CI](https://github.com/AsobaCloud/sdk/actions/workflows/javascript-ci.yml/badge.svg)](https://github.com/AsobaCloud/sdk/actions/workflows/javascript-ci.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n\nJavaScript SDK for live energy asset data — inverter telemetry, OODA terminal alerts, Partner API snapshots, and battery warranty intelligence.\n\n## Installation\n\n```bash\nnpm install @asobacloud/sdk\n```\n\n## Quick start\n\n```javascript\nconst { OnaSDK } = require('@asobacloud/sdk');\n\nconst sdk = new OnaSDK();\n// apiKey from ASOBA_API_KEY env var\n\n// Query historical inverter data\nconst records = await sdk.inverterTelemetry.getInverterTelemetry({\n  asset_id: 'INV-1000000054495190',\n  site_id: 'Sibaya',\n  time_range: { start: '2025-11-01T00:00:00', end: '2025-11-01T12:00:00' },\n  resolution: '5min',\n  limit: 100,\n});\n\n// Stream live data\nfor await (const record of sdk.inverterTelemetry.streamInverter({\n  asset_id: 'INV-1000000054495190',\n  site_id: 'Sibaya',\n  polling_interval: 30,\n})) {\n  console.log(`${record.timestamp}: ${record.power} kW`);\n}\n```\n\nSet environment variables before running:\n\n```bash\nexport ASOBA_API_KEY=<your_api_key>\n```\n\nThe same API key works for inverter telemetry, OODA terminal alerts, and the Partner API. Endpoint URLs are hardcoded to the canonical production values.\n\n## Inverter Telemetry\n\n```javascript\n// Historical data for one inverter\nconst records = await sdk.inverterTelemetry.getInverterTelemetry({\n  asset_id: 'INV-1000000054495190',\n  site_id: 'Sibaya',\n  time_range: { start: '2025-11-01T00:00:00', end: '2025-11-01T12:00:00' },\n  resolution: '5min',   // '5min' | 'daily'\n  limit: 100,\n});\n\n// Historical data for all inverters at a site\nconst siteRecords = await sdk.inverterTelemetry.getSiteTelemetry({\n  site_id: 'Sibaya',\n  time_range: { start: '2025-11-01T00:00:00', end: '2025-11-01T12:00:00' },\n});\n\n// Discover available data range\nconst period = await sdk.inverterTelemetry.getDataPeriod({ site_id: 'Sibaya' });\nconsole.log(`Data from ${period.first_record} to ${period.last_record}`);\n\n// Stream a single inverter (cursor-resumable)\nfor await (const record of sdk.inverterTelemetry.streamInverter({\n  asset_id: 'INV-1000000054495190',\n  site_id: 'Sibaya',\n  polling_interval: 30,\n})) {\n  console.log(`${record.timestamp}: ${record.power} kW`);\n}\n```\n\n## OODA Terminal Alerts\n\n```javascript\n// Historical alerts for one terminal device\nconst alerts = await sdk.oodaTerminal.getTerminalAlerts({\n  terminal_device_id: 'TERM-1000000054495190',\n  site_id: 'Sibaya',\n  time_range: { start: '2025-11-01T00:00:00', end: '2025-11-01T12:00:00' },\n  limit: 100,\n});\n\n// All terminal devices at a site\nconst siteAlerts = await sdk.oodaTerminal.getSiteAlerts({\n  site_id: 'Sibaya',\n  time_range: { start: '2025-11-01T00:00:00', end: '2025-11-01T12:00:00' },\n});\n\n// Stream live alerts\nfor await (const alert of sdk.oodaTerminal.streamTerminal({\n  terminal_device_id: 'TERM-1000000054495190',\n  site_id: 'Sibaya',\n  polling_interval: 30,\n})) {\n  console.log(`${alert.timestamp}: [${alert.alert_severity}] ${alert.message}`);\n}\n```\n\n## Partner API\n\nPre-computed snapshots with ETag caching — sub-100ms on repeat calls.\n\n```javascript\n// KPI rollup (typed KpiRollupSnapshot with EarKpis + FinancialKpis)\nconst kpis = await sdk.partner.getKpiRollup({ site_id: 'Sibaya' });\nconst cached = await sdk.partner.getKpiRollup({ site_id: 'Sibaya' }); // uses ETag\n\n// Maintenance signals (detected anomalies)\nconst signals = await sdk.partner.getMaintenanceSignals({\n  site_id: 'Sibaya',\n  since: '2025-11-01T00:00:00',\n  severity: 'high',\n});\n\n// 24h solar forecast snapshot\nconst forecast = await sdk.partner.getForecastSnapshot({ site_id: 'Sibaya' });\nconsole.log(`${forecast.horizon_hours}h, ${forecast.intervals.length} intervals`);\n\n// 90-day preventive maintenance schedule (SEP-062)\nconst schedule = await sdk.partner.getMaintenanceSchedule({ site_id: 'Sibaya' });\nfor (const task of schedule.tasks) {\n  console.log(`${task.recommended_date} — ${task.asset_id} — ${task.task_type} (${task.priority})`);\n}\n```\n\n## Battery & Site Intelligence\n\n```javascript\n// Site summary with battery health KPIs\nconst summary = await sdk.terminal.getSiteSummary({ site_id: 'Sibaya' });\nconsole.log(`Fleet PR: ${summary.fleet_pr_pct}%`);\n\nif (summary.soiling) {\n  console.log(`Soiling rate: ${summary.soiling.soiling_rate_pct_day}%/day`);\n}\n\n// Asset detail (includes warranty fields for battery assets)\nconst asset = await sdk.terminal.getAsset({\n  customer_id: 'cust123',\n  asset_id: 'BAT-001',\n});\n\n// Calculate remaining warranty life\nconst status = sdk.terminal.constructor.calculateRemainingWarrantyLife({\n  warranty_expiry_date: asset.warranty_expiry_date,\n  warranty_throughput_kwh: asset.warranty_throughput_kwh,\n  current_throughput_kwh: 5420.5,\n});\nconsole.log(`${status.warranty_status} — limited by ${status.limiting_factor}`);\n```\n\n## Advanced ML Services\n\n```javascript\n// Gap detection\nconst gaps = await sdk.gapDetection.detectGaps({ customer_id: 'Sibaya' });\nif (gaps.needs_backfill) {\n  console.log(`Missing intervals: ${gaps.total_missing_intervals}`);\n}\n```\n\n## Error handling\n\n```javascript\nconst { ConfigurationError, ValidationError, AuthenticationError } = require('@asobacloud/sdk');\n\ntry {\n  const records = await sdk.inverterTelemetry.getInverterTelemetry({ ... });\n} catch (err) {\n  if (err instanceof ValidationError)     console.error('Bad params:', err.message);\n  else if (err instanceof AuthenticationError) console.error('Auth failed:', err.message);\n  else if (err instanceof ConfigurationError)  console.error('Config:', err.message);\n  else throw err;\n}\n```\n\n## API reference\n\n### Inverter Telemetry\n\n| Method | Description |\n|--------|-------------|\n| `getInverterTelemetry(params)` | Historical data for one inverter |\n| `getSiteTelemetry(params)` | Historical data for all inverters at a site |\n| `getDataPeriod(params)` | Available data time range |\n| `streamInverter(params)` | Stream live data from one inverter |\n| `streamSite(params)` | Stream live data from all inverters at a site |\n\n### OODA Terminal Alerts\n\n| Method | Description |\n|--------|-------------|\n| `getTerminalAlerts(params)` | Historical alerts for one terminal device |\n| `getSiteAlerts(params)` | Historical alerts for all terminal devices at a site |\n| `getAsset(params)` | Asset details including battery capacity and warranty |\n| `getSiteSummary(params)` | Site summary with battery health KPIs |\n| `getDataPeriod(params)` | Available alert time range |\n| `streamTerminal(params)` | Stream live alerts from one terminal device |\n| `streamSite(params)` | Stream live alerts from all terminal devices at a site |\n\n### Partner API\n\n| Method | Description |\n|--------|-------------|\n| `getKpiRollup(params)` | KPI summary snapshot (`KpiRollupSnapshot` with `EarKpis` + `FinancialKpis`) |\n| `getMaintenanceSignals(params)` | Pending maintenance and health signals |\n| `getForecastSnapshot(params)` | Pre-computed 24h solar forecast |\n| `getMaintenanceSchedule(params)` | 90-day preventive maintenance task list |\n| `getSnapshot(params)` | Generic snapshot fetch by kind |\n\n### Shared parameters\n\n| Parameter | Description |\n|-----------|-------------|\n| `resolution` | `\"5min\"` (default) or `\"daily\"` |\n| `limit` | Max records per query (default 100, max 1000) |\n| `cursor` | Resume from a previous position |\n| `polling_interval` | Seconds between polls when streaming (min 5, default 5) |\n\n### Rate limits\n\n- 60 requests per minute per API key\n- Max 1000 records per query\n- Max 31-day time range per query\n- Min 5-second polling interval for streaming\n\n## TypeScript\n\nType definitions are included. The `PartnerApiClient`, `KpiRollupSnapshot`, `EarKpis`, and `FinancialKpis` interfaces are exported from `src/types/index.d.ts`.\n\n```typescript\nimport { OnaSDK, KpiRollupSnapshot, EarKpis } from '@asobacloud/sdk';\n\nconst sdk = new OnaSDK({ ... });\nconst kpis: KpiRollupSnapshot = await sdk.partner.getKpiRollup({ site_id: 'Sibaya' });\n```\n\n## Examples\n\n```bash\nnode examples/inverter-telemetry-example.js\nnode examples/ooda-terminal-example.js\nnode examples/partner-api-example.js\n```\n\n## Development\n\n```bash\ngit clone https://github.com/AsobaCloud/sdk.git\ncd sdk/javascript\nnpm install\nnpm test\n```\n\n## License\n\nMIT © [Asoba](https://asoba.co)\n","readmeFilename":"README.md"}