{"openapi":"3.0.3","info":{"title":"Solaria API","version":"2.0.0","description":"高精度太陽追跡API - 産業用太陽光発電制御（Marduk v2.0準拠）","contact":{"name":"Solaria API Support","email":"support@solaria.example.com"},"license":{"name":"MIT","url":"https://opensource.org/licenses/MIT"}},"servers":[{"url":"https://solaria.harmonias.org","description":"Production"},{"url":"http://localhost:3003","description":"開発環境"}],"tags":[{"name":"Solar","description":"太陽位置計算"},{"name":"Tracking","description":"追跡制御"},{"name":"Industrial","description":"産業用インターフェース"},{"name":"Analytics","description":"発電効率分析"},{"name":"Calibration","description":"キャリブレーション"}],"paths":{"/api/stats/daily":{"get":{"summary":"Get api/stats/daily","description":"Auto-generated stub. Schema/responses/parameters TBD.\nVerify path matches the actual mounted URL (sub-router prefix may be missing).\n","x-stub":true,"responses":{"200":{"description":"Successful response (schema TBD)"}}}},"/api/v1/admin/abuse/reset":{"post":{"summary":"Create api/v1/admin/abuse/reset","description":"Auto-generated stub. Schema/responses/parameters TBD.\nVerify path matches the actual mounted URL (sub-router prefix may be missing).\n","x-stub":true,"responses":{"200":{"description":"Successful response (schema TBD)"}}}},"/api/v1/admin/abuse/stats":{"get":{"summary":"Get api/v1/admin/abuse/stats","description":"Auto-generated stub. Schema/responses/parameters TBD.\nVerify path matches the actual mounted URL (sub-router prefix may be missing).\n","x-stub":true,"responses":{"200":{"description":"Successful response (schema TBD)"}}}},"/api/v1/admin/waf/stats":{"get":{"summary":"Get api/v1/admin/waf/stats","description":"Auto-generated stub. Schema/responses/parameters TBD.\nVerify path matches the actual mounted URL (sub-router prefix may be missing).\n","x-stub":true,"responses":{"200":{"description":"Successful response (schema TBD)"}}}},"/api/v1/agrivoltaics/optimize":{"post":{"summary":"Create api/v1/agrivoltaics/optimize","description":"Auto-generated stub. Schema/responses/parameters TBD.\nVerify path matches the actual mounted URL (sub-router prefix may be missing).\n","x-stub":true,"responses":{"200":{"description":"Successful response (schema TBD)"}}}},"/api/v1/cache/stats":{"get":{"summary":"Get api/v1/cache/stats","description":"Auto-generated stub. Schema/responses/parameters TBD.\nVerify path matches the actual mounted URL (sub-router prefix may be missing).\n","x-stub":true,"responses":{"200":{"description":"Successful response (schema TBD)"}}}},"/api/v1/grid/integration":{"post":{"summary":"Create api/v1/grid/integration","description":"Auto-generated stub. Schema/responses/parameters TBD.\nVerify path matches the actual mounted URL (sub-router prefix may be missing).\n","x-stub":true,"responses":{"200":{"description":"Successful response (schema TBD)"}}}},"/api/v1/impact/landscape":{"post":{"summary":"Create api/v1/impact/landscape","description":"Auto-generated stub. Schema/responses/parameters TBD.\nVerify path matches the actual mounted URL (sub-router prefix may be missing).\n","x-stub":true,"responses":{"200":{"description":"Successful response (schema TBD)"}}}},"/api/v1/impact/residential":{"post":{"summary":"Create api/v1/impact/residential","description":"Auto-generated stub. Schema/responses/parameters TBD.\nVerify path matches the actual mounted URL (sub-router prefix may be missing).\n","x-stub":true,"responses":{"200":{"description":"Successful response (schema TBD)"}}}},"/api/v1/info":{"get":{"summary":"Get api/v1/info","description":"Auto-generated stub. Schema/responses/parameters TBD.\nVerify path matches the actual mounted URL (sub-router prefix may be missing).\n","x-stub":true,"responses":{"200":{"description":"Successful response (schema TBD)"}}}},"/api/v1/maintenance/predictive":{"post":{"summary":"Create api/v1/maintenance/predictive","description":"Auto-generated stub. Schema/responses/parameters TBD.\nVerify path matches the actual mounted URL (sub-router prefix may be missing).\n","x-stub":true,"responses":{"200":{"description":"Successful response (schema TBD)"}}}},"/api/v1/power/forecast":{"get":{"summary":"Get api/v1/power/forecast","description":"Auto-generated stub. Schema/responses/parameters TBD.\nVerify path matches the actual mounted URL (sub-router prefix may be missing).\n","x-stub":true,"responses":{"200":{"description":"Successful response (schema TBD)"}}},"post":{"summary":"Create api/v1/power/forecast","description":"Auto-generated stub. Schema/responses/parameters TBD.\nVerify path matches the actual mounted URL (sub-router prefix may be missing).\n","x-stub":true,"responses":{"200":{"description":"Successful response (schema TBD)"}}}},"/api/v1/power/forecast/advanced":{"post":{"summary":"Create api/v1/power/forecast/advanced","description":"Auto-generated stub. Schema/responses/parameters TBD.\nVerify path matches the actual mounted URL (sub-router prefix may be missing).\n","x-stub":true,"responses":{"200":{"description":"Successful response (schema TBD)"}}}},"/api/v1/power/optimal-tilt":{"get":{"summary":"Get api/v1/power/optimal-tilt","description":"Auto-generated stub. Schema/responses/parameters TBD.\nVerify path matches the actual mounted URL (sub-router prefix may be missing).\n","x-stub":true,"responses":{"200":{"description":"Successful response (schema TBD)"}}}},"/api/v1/reflection":{"post":{"summary":"Create api/v1/reflection","description":"Auto-generated stub. Schema/responses/parameters TBD.\nVerify path matches the actual mounted URL (sub-router prefix may be missing).\n","x-stub":true,"responses":{"200":{"description":"Successful response (schema TBD)"}}}},"/api/v1/reflection/aviation-check":{"post":{"summary":"Create api/v1/reflection/aviation-check","description":"Auto-generated stub. Schema/responses/parameters TBD.\nVerify path matches the actual mounted URL (sub-router prefix may be missing).\n","x-stub":true,"responses":{"200":{"description":"Successful response (schema TBD)"}}}},"/api/v1/reflection/calculate":{"post":{"summary":"Create api/v1/reflection/calculate","description":"Auto-generated stub. Schema/responses/parameters TBD.\nVerify path matches the actual mounted URL (sub-router prefix may be missing).\n","x-stub":true,"responses":{"200":{"description":"Successful response (schema TBD)"}}}},"/api/v1/residential/impact-assessment":{"post":{"summary":"Create api/v1/residential/impact-assessment","description":"Auto-generated stub. Schema/responses/parameters TBD.\nVerify path matches the actual mounted URL (sub-router prefix may be missing).\n","x-stub":true,"responses":{"200":{"description":"Successful response (schema TBD)"}}}},"/api/v1/sun/position":{"get":{"summary":"Get api/v1/sun/position","description":"Auto-generated stub. Schema/responses/parameters TBD.\nVerify path matches the actual mounted URL (sub-router prefix may be missing).\n","x-stub":true,"responses":{"200":{"description":"Successful response (schema TBD)"}}}}},"components":{"schemas":{"SolarPositionRequest":{"type":"object","required":["latitude","longitude","timestamp"],"properties":{"latitude":{"type":"number","format":"double","minimum":-90,"maximum":90,"description":"緯度","example":35.6762},"longitude":{"type":"number","format":"double","minimum":-180,"maximum":180,"description":"経度","example":139.6503},"elevation":{"type":"number","description":"標高（m）","example":40},"timestamp":{"type":"string","format":"date-time","description":"計算時刻（ISO 8601）"},"atmospheric_pressure":{"type":"number","description":"大気圧（hPa）","default":1013.25},"temperature":{"type":"number","description":"気温（℃）","default":20},"algorithm":{"type":"string","enum":["spa","psa","grena"],"description":"計算アルゴリズム","default":"spa"}}},"SolarPositionResponse":{"type":"object","required":["timestamp","azimuth","elevation","zenith","accuracy"],"properties":{"timestamp":{"type":"string","format":"date-time"},"azimuth":{"type":"number","format":"double","description":"方位角（度、北=0）","example":180.5234},"elevation":{"type":"number","format":"double","description":"仰角（度）","example":45.2341},"zenith":{"type":"number","format":"double","description":"天頂角（度）","example":44.7659},"accuracy":{"type":"object","properties":{"azimuth_error":{"type":"number","description":"方位角誤差（度）","example":0.0003},"elevation_error":{"type":"number","description":"仰角誤差（度）","example":0.0003}}},"atmospheric_refraction":{"type":"number","description":"大気屈折補正値（度）"},"equation_of_time":{"type":"number","description":"均時差（分）"},"declination":{"type":"number","description":"赤緯（度）"},"hour_angle":{"type":"number","description":"時角（度）"}}},"TrajectoryRequest":{"type":"object","required":["latitude","longitude","start_time","end_time","interval_minutes"],"properties":{"latitude":{"type":"number","format":"double"},"longitude":{"type":"number","format":"double"},"elevation":{"type":"number"},"start_time":{"type":"string","format":"date-time"},"end_time":{"type":"string","format":"date-time"},"interval_minutes":{"type":"integer","minimum":1,"maximum":60,"description":"計算間隔（分）"}}},"TrajectoryResponse":{"type":"object","required":["location","trajectory","sunrise","sunset","solar_noon"],"properties":{"location":{"type":"object","properties":{"latitude":{"type":"number"},"longitude":{"type":"number"},"elevation":{"type":"number"}}},"trajectory":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":"string","format":"date-time"},"azimuth":{"type":"number"},"elevation":{"type":"number"},"direct_normal_irradiance":{"type":"number","description":"直達日射量（W/m²）"}}}},"sunrise":{"type":"string","format":"date-time"},"sunset":{"type":"string","format":"date-time"},"solar_noon":{"type":"string","format":"date-time"},"daylight_hours":{"type":"number"}}},"TrackingRequest":{"type":"object","required":["system_type","location","timestamp"],"properties":{"system_type":{"type":"string","enum":["single_axis_horizontal","single_axis_tilted","dual_axis","azimuth_elevation"],"description":"追跡システムタイプ"},"location":{"type":"object","properties":{"latitude":{"type":"number"},"longitude":{"type":"number"},"elevation":{"type":"number"}}},"timestamp":{"type":"string","format":"date-time"},"system_parameters":{"type":"object","properties":{"axis_tilt":{"type":"number","description":"軸傾斜角（度）"},"axis_azimuth":{"type":"number","description":"軸方位角（度）"},"rotation_limit":{"type":"number","description":"回転制限（度）"},"backtracking":{"type":"boolean","description":"バックトラッキング有効"}}}}},"TrackingResponse":{"type":"object","required":["timestamp","control_values","solar_position","tracking_accuracy"],"properties":{"timestamp":{"type":"string","format":"date-time"},"control_values":{"type":"object","properties":{"primary_angle":{"type":"number","description":"主軸角度（度）"},"secondary_angle":{"type":"number","description":"副軸角度（度）"},"motor_steps":{"type":"object","properties":{"primary":{"type":"integer"},"secondary":{"type":"integer"}}}}},"solar_position":{"type":"object","properties":{"azimuth":{"type":"number"},"elevation":{"type":"number"}}},"tracking_accuracy":{"type":"object","properties":{"pointing_error":{"type":"number","description":"ポインティング誤差（度）"},"cosine_factor":{"type":"number","description":"コサイン係数"}}}}},"OptimizationRequest":{"type":"object","required":["system_config","location","time_range","optimization_target"],"properties":{"system_config":{"$ref":"#/components/schemas/SystemConfiguration"},"location":{"type":"object","properties":{"latitude":{"type":"number"},"longitude":{"type":"number"}}},"time_range":{"type":"object","properties":{"start":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"}}},"optimization_target":{"type":"string","enum":["energy_yield","peak_power","uniform_generation"]},"constraints":{"type":"object","properties":{"max_rotation_speed":{"type":"number","description":"最大回転速度（度/秒）"},"min_elevation":{"type":"number","description":"最小仰角（度）"},"wind_stow_threshold":{"type":"number","description":"風速収納閾値（m/s）"}}}}},"OptimizationResponse":{"type":"object","required":["optimized_schedule","expected_performance","recommendations"],"properties":{"optimized_schedule":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":"string","format":"date-time"},"angles":{"type":"object","properties":{"primary":{"type":"number"},"secondary":{"type":"number"}}},"expected_power":{"type":"number","description":"予想発電量（W）"}}}},"expected_performance":{"type":"object","properties":{"total_energy":{"type":"number","description":"総発電量（kWh）"},"improvement_percentage":{"type":"number","description":"固定設置比改善率（%）"},"capacity_factor":{"type":"number"}}},"recommendations":{"type":"array","items":{"type":"string"}}}},"ModbusRequest":{"type":"object","required":["device_address","register_mapping","tracking_data"],"properties":{"device_address":{"type":"integer","minimum":1,"maximum":247},"register_mapping":{"type":"object","properties":{"azimuth_register":{"type":"integer"},"elevation_register":{"type":"integer"},"status_register":{"type":"integer"},"command_register":{"type":"integer"}}},"tracking_data":{"type":"object","properties":{"azimuth":{"type":"number"},"elevation":{"type":"number"}}},"protocol":{"type":"string","enum":["rtu","tcp"],"default":"rtu"},"data_format":{"type":"string","enum":["int16","int32","float32"],"default":"int16"}}},"ModbusResponse":{"type":"object","required":["registers","raw_data"],"properties":{"registers":{"type":"array","items":{"type":"object","properties":{"address":{"type":"integer"},"value":{"type":"integer"},"description":{"type":"string"}}}},"raw_data":{"type":"object","properties":{"hex":{"type":"string","description":"16進数表現"},"binary":{"type":"string","description":"バイナリ表現"}}},"crc":{"type":"string","description":"CRCチェックサム"}}},"IEC61850Request":{"type":"object","required":["logical_device","logical_nodes","tracking_data"],"properties":{"logical_device":{"type":"string","example":"STRK1"},"logical_nodes":{"type":"array","items":{"type":"string"},"example":["MMXU1","MMTR1"]},"tracking_data":{"type":"object","properties":{"position":{"type":"object","properties":{"azimuth":{"type":"number"},"elevation":{"type":"number"}}},"status":{"type":"object","properties":{"operational":{"type":"boolean"},"alarm":{"type":"boolean"},"maintenance":{"type":"boolean"}}}}}}},"IEC61850Response":{"type":"object","required":["dataset","goose_message","mms_services"],"properties":{"dataset":{"type":"object","additionalProperties":{"type":"object"}},"goose_message":{"type":"object","properties":{"app_id":{"type":"integer"},"time_allowed_to_live":{"type":"integer"},"dataset_ref":{"type":"string"},"values":{"type":"array","items":{"type":"object"}}}},"mms_services":{"type":"array","items":{"type":"string"}}}},"EfficiencyAnalysisRequest":{"type":"object","required":["system_id","analysis_period","actual_data"],"properties":{"system_id":{"type":"string"},"analysis_period":{"type":"object","properties":{"start":{"type":"string","format":"date"},"end":{"type":"string","format":"date"}}},"actual_data":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":"string","format":"date-time"},"power_output":{"type":"number"},"tracker_position":{"type":"object","properties":{"azimuth":{"type":"number"},"elevation":{"type":"number"}}}}}}}},"EfficiencyAnalysisResponse":{"type":"object","required":["summary","detailed_analysis","recommendations"],"properties":{"summary":{"type":"object","properties":{"tracking_accuracy":{"type":"number","description":"追跡精度（%）"},"energy_gain":{"type":"number","description":"エネルギー増加率（%）"},"availability":{"type":"number","description":"稼働率（%）"}}},"detailed_analysis":{"type":"object","properties":{"daily_performance":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","format":"date"},"tracking_error_avg":{"type":"number"},"energy_produced":{"type":"number"},"theoretical_maximum":{"type":"number"}}}}}},"recommendations":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["calibration","maintenance","optimization"]},"priority":{"type":"string","enum":["low","medium","high"]},"description":{"type":"string"}}}}}},"CalibrationRequest":{"type":"object","required":["system_id","reference_measurements"],"properties":{"system_id":{"type":"string"},"reference_measurements":{"type":"array","minItems":10,"items":{"type":"object","properties":{"timestamp":{"type":"string","format":"date-time"},"actual_sun_position":{"type":"object","properties":{"azimuth":{"type":"number"},"elevation":{"type":"number"}}},"tracker_position":{"type":"object","properties":{"azimuth":{"type":"number"},"elevation":{"type":"number"}}}}}},"calibration_method":{"type":"string","enum":["least_squares","kalman_filter","machine_learning"],"default":"least_squares"}}},"CalibrationResponse":{"type":"object","required":["calibration_parameters","accuracy_improvement","validation_results"],"properties":{"calibration_parameters":{"type":"object","properties":{"azimuth_offset":{"type":"number","description":"方位角オフセット（度）"},"elevation_offset":{"type":"number","description":"仰角オフセット（度）"},"scale_factors":{"type":"object","properties":{"azimuth":{"type":"number"},"elevation":{"type":"number"}}},"non_linearity_correction":{"type":"array","items":{"type":"object"}}}},"accuracy_improvement":{"type":"object","properties":{"before":{"type":"object","properties":{"rms_error":{"type":"number"},"max_error":{"type":"number"}}},"after":{"type":"object","properties":{"rms_error":{"type":"number"},"max_error":{"type":"number"}}},"improvement_percentage":{"type":"number"}}},"validation_results":{"type":"object","properties":{"test_points":{"type":"integer"},"passed":{"type":"integer"},"failed":{"type":"integer"}}}}},"SystemConfiguration":{"type":"object","required":["type","specifications"],"properties":{"type":{"type":"string","enum":["single_axis","dual_axis","concentrated_pv"]},"specifications":{"type":"object","properties":{"panel_area":{"type":"number","description":"パネル面積（m²）"},"rated_power":{"type":"number","description":"定格出力（kW）"},"tracking_range":{"type":"object","properties":{"azimuth":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}}},"elevation":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}}}}}}}}},"Error":{"type":"object","required":["error","message"],"properties":{"error":{"type":"string","description":"エラーコード"},"message":{"type":"string","description":"エラーメッセージ"},"details":{"type":"object","description":"詳細情報"}}}},"responses":{"BadRequest":{"description":"不正なリクエスト","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":"INVALID_COORDINATES","message":"Latitude must be between -90 and 90 degrees"}}}},"TooManyRequests":{"description":"レート制限超過","headers":{"X-RateLimit-Limit":{"description":"レート制限数","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"残りリクエスト数","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"リセット時刻（Unix timestamp）","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":"RATE_LIMIT_EXCEEDED","message":"Too many requests. Please try again later."}}}}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"API Key認証（産業用途）"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"JWT Bearer Token認証"}}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}]}