{"components":{"schemas":{"AdiabaticStep":{"allOf":[{"$ref":"#/components/schemas/FlowInput"},{"properties":{"eff":{"description":"Benadering verzadigingslijn (0\u20131)","maximum":1,"minimum":0,"type":"number"},"mode":{"const":"effectiveness"},"type":{"const":"adiabatic"}},"required":["type","mode"],"type":"object"}]},"ChartData":{"properties":{"chart_type":{"$ref":"#/components/schemas/ChartType"},"p_Pa":{"description":"Luchtdruk voor diagramachtergrond","type":"number"},"points":{"items":{"properties":{"id":{"type":"string"},"x":{"type":"number"},"y":{"type":"number"}},"required":["id","x","y"],"type":"object"},"type":"array"},"series":{"items":{"$ref":"#/components/schemas/ChartSeries"},"type":"array"}},"required":["chart_type","series","points"],"type":"object"},"ChartSeries":{"properties":{"id":{"type":"string"},"points":{"items":{"properties":{"x":{"type":"number"},"y":{"type":"number"}},"required":["x","y"],"type":"object"},"type":"array"}},"required":["id","points"],"type":"object"},"ChartType":{"enum":["mollier","psychrometric"],"type":"string"},"CoolingStep":{"allOf":[{"$ref":"#/components/schemas/FlowInput"},{"properties":{"Q_total_W":{"description":"Required when mode=power (negative for cooling)","type":"number"},"T_out_K":{"description":"Required when mode=target_temperature","type":"number"},"mode":{"enum":["power","target_temperature"],"type":"string"},"type":{"const":"cooling"}},"required":["type","mode"],"type":"object"}]},"DehumidificationStep":{"allOf":[{"$ref":"#/components/schemas/FlowInput"},{"properties":{"mode":{"enum":["water_remove","target_w"],"type":"string"},"type":{"const":"dehumidification"},"w_out_kg_kgda":{"description":"Required when mode=target_w","type":"number"},"water_kg_s":{"description":"Required when mode=water_remove","type":"number"}},"required":["type","mode"],"type":"object"}]},"FlowInput":{"properties":{"V_dot_m3_h":{"description":"Luchtdebiet [m\u00b3/h] (voorkeur)","minimum":0,"type":"number"},"m_da_kg_s":{"description":"Legacy droge-luchtmassa [kg/s]","exclusiveMinimum":0,"type":"number"}},"type":"object"},"HeatingStep":{"allOf":[{"$ref":"#/components/schemas/FlowInput"},{"properties":{"Q_total_W":{"description":"Required when mode=power","type":"number"},"T_out_K":{"description":"Required when mode=target_temperature","type":"number"},"mode":{"enum":["power","target_temperature"],"type":"string"},"type":{"const":"heating"}},"required":["type","mode"],"type":"object"}]},"HumidificationStep":{"allOf":[{"$ref":"#/components/schemas/FlowInput"},{"properties":{"mode":{"enum":["water_add","target_w"],"type":"string"},"type":{"const":"humidification"},"w_out_kg_kgda":{"description":"Required when mode=target_w","type":"number"},"water_kg_s":{"description":"Required when mode=water_add","type":"number"}},"required":["type","mode"],"type":"object"}]},"HumidityInput":{"properties":{"kind":{"enum":["phi","w"],"type":"string"},"value":{"type":"number"}},"required":["kind","value"],"type":"object"},"MixStep":{"allOf":[{"$ref":"#/components/schemas/FlowInput"},{"properties":{"mix_pct":{"description":"Massafractie aanvoer in het mengsel (0% = alleen retour, 100% = alleen aanvoer)","maximum":100,"minimum":0,"type":"number"},"mode":{"const":"percentage"},"supply_T_K":{"description":"Droge-boltemperatuur aanvoer [K]","type":"number"},"supply_phi":{"description":"Relatieve vochtigheid aanvoer (0\u20131)","maximum":1,"minimum":0,"type":"number"},"type":{"const":"mix"}},"required":["type","mode","mix_pct","supply_T_K","supply_phi"],"type":"object"}]},"ProcessRequest":{"properties":{"chart_type":{"$ref":"#/components/schemas/ChartType"},"initial_state":{"$ref":"#/components/schemas/StateInput"},"projectnaam":{"type":"string"},"steps":{"items":{"$ref":"#/components/schemas/ProcessStep"},"type":"array"}},"required":["chart_type","initial_state","steps"],"type":"object"},"ProcessResponse":{"properties":{"chart_data":{"$ref":"#/components/schemas/ChartData"},"points":{"items":{"$ref":"#/components/schemas/StateOutput"},"type":"array"},"steps":{"items":{"$ref":"#/components/schemas/StepResult"},"type":"array"}},"required":["steps","chart_data","points"],"type":"object"},"ProcessStep":{"oneOf":[{"$ref":"#/components/schemas/CoolingStep"},{"$ref":"#/components/schemas/HeatingStep"},{"$ref":"#/components/schemas/HumidificationStep"},{"$ref":"#/components/schemas/DehumidificationStep"},{"$ref":"#/components/schemas/AdiabaticStep"},{"$ref":"#/components/schemas/MixStep"},{"$ref":"#/components/schemas/WtwSensibleStep"},{"$ref":"#/components/schemas/WtwEnthalpyStep"}]},"RecallRequest":{"properties":{"id":{"format":"uuid","type":"string"}},"required":["id"],"type":"object"},"ReportRequest":{"properties":{"chart_type":{"$ref":"#/components/schemas/ChartType"},"date":{"type":"string"},"lang":{"type":"string"},"location":{"type":"string"},"mollier_png_base64":{"type":"string"},"mollier_svg_base64":{"type":"string"},"projectnaam":{"type":"string"},"table_rows":{"items":{"items":{"type":"string"},"type":"array"},"type":"array"}},"required":["projectnaam","chart_type","table_rows","mollier_svg_base64"],"type":"object"},"SaveRequest":{"properties":{"calculation-id":{"type":"string"},"calculation_id":{"type":"string"},"save-data":{"description":"Opgeslagen staat (schema_version, projectnaam, chart_type, initial_state, steps). Anonieme updates vereisen _mollier_write_token.\n","type":"object"}},"required":["save-data"],"type":"object"},"StateInput":{"properties":{"T_K":{"type":"number"},"humidity":{"$ref":"#/components/schemas/HumidityInput"},"p_Pa":{"default":101325,"type":"number"}},"required":["T_K","humidity"],"type":"object"},"StateOutput":{"properties":{"T_K":{"type":"number"},"Tdp_K":{"type":"number"},"h_J_kgda":{"type":"number"},"p_Pa":{"type":"number"},"phi":{"type":"number"},"w_kg_kgda":{"type":"number"}},"required":["T_K","p_Pa","w_kg_kgda","phi","h_J_kgda","Tdp_K"],"type":"object"},"StepResult":{"properties":{"Q_latent_W":{"type":"number"},"Q_sensible_W":{"type":"number"},"Q_total_W":{"type":"number"},"inlet":{"$ref":"#/components/schemas/StateOutput"},"outlet":{"$ref":"#/components/schemas/StateOutput"},"water_added_kg_s":{"type":"number"},"water_removed_kg_s":{"type":"number"}},"required":["inlet","outlet","Q_total_W","Q_sensible_W","Q_latent_W","water_removed_kg_s","water_added_kg_s"],"type":"object"},"WtwEnthalpyStep":{"allOf":[{"$ref":"#/components/schemas/FlowInput"},{"properties":{"extract_T_K":{"description":"Afvoerlucht droge-boltemperatuur [K]","type":"number"},"extract_phi":{"description":"Afvoerlucht RV (0\u20131)","maximum":1,"minimum":0,"type":"number"},"heat_eff":{"description":"Warmteterugwinning (0\u20131)","maximum":1,"minimum":0,"type":"number"},"mode":{"const":"effectiveness"},"moisture_eff":{"description":"Vochtterugwinning (0\u20131)","maximum":1,"minimum":0,"type":"number"},"type":{"const":"wtw_enthalpy"}},"required":["type","mode","heat_eff","moisture_eff","extract_T_K","extract_phi"],"type":"object"}]},"WtwSensibleStep":{"allOf":[{"$ref":"#/components/schemas/FlowInput"},{"properties":{"extract_T_K":{"description":"Afvoerlucht droge-boltemperatuur [K]","type":"number"},"extract_phi":{"description":"Afvoerlucht RV (0\u20131)","maximum":1,"minimum":0,"type":"number"},"heat_eff":{"description":"Warmteterugwinning (0\u20131), platenwisselaar zonder vocht","maximum":1,"minimum":0,"type":"number"},"mode":{"const":"effectiveness"},"type":{"const":"wtw_sensible"}},"required":["type","mode","heat_eff","extract_T_K","extract_phi"],"type":"object"}]}},"securitySchemes":{"ApiKeyAuth":{"in":"header","name":"X-API-Key","type":"apiKey"},"BearerAuth":{"scheme":"bearer","type":"http"},"SessionAuth":{"in":"cookie","name":"session","type":"apiKey"}}},"info":{"description":"Mollier proces-API (vochtige lucht). De web-UI berekent via POST /v1/process; client-side plotting blijft voor het diagram. Autosave via /save-quiet en /recall.\n","title":"OC Mollier API","version":"1.0.0"},"openapi":"3.1.0","paths":{"/docs":{"get":{"summary":"Redoc UI"}},"/health":{"get":{"responses":{"200":{"description":"OK"}},"summary":"Liveness (alias)"}},"/health/live":{"get":{"responses":{"200":{"description":"OK"}},"summary":"Liveness"}},"/health/ready":{"get":{"responses":{"200":{"description":"ready"},"503":{"description":"not ready"}},"summary":"Readiness"}},"/openapi.json":{"get":{"summary":"OpenAPI 3.1 (JSON)"}},"/openapi.yaml":{"get":{"summary":"OpenAPI 3.1 (YAML, static file)"}},"/ready":{"get":{"responses":{"200":{"description":"ready"},"503":{"description":"not ready"}},"summary":"Readiness (alias)"}},"/recall":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecallRequest"}}},"required":true},"responses":{"200":{"description":"OK"},"404":{"description":"Unknown calculation"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"SessionAuth":[]}],"summary":"Laad opgeslagen berekening op GUID"}},"/report-html":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportRequest"}}},"required":true},"responses":{"200":{"content":{"text/html":{"schema":{"type":"string"}}},"description":"HTML"},"400":{"description":"Invalid payload"},"401":{"description":"Not authenticated"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"SessionAuth":[]}],"summary":"Genereer HTML-rapport (A4, afdrukbaar)"}},"/save":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveRequest"}}},"required":true},"responses":{"200":{"description":"OK"},"400":{"description":"Invalid payload"},"403":{"description":"Unauthorized update"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"SessionAuth":[]}],"summary":"Sla berekening op (expliciet)"}},"/save-quiet":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveRequest"}}},"required":true},"responses":{"200":{"description":"OK"},"400":{"description":"Invalid payload"},"403":{"description":"Unauthorized anonymous update"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"SessionAuth":[]}],"summary":"Autosave (debounced UI)"}},"/v1/openapi.json":{"get":{"summary":"OpenAPI 3.1 (JSON, versioned path)"}},"/v1/process":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessResponse"}}},"description":"OK"},"400":{"description":"Invalid payload"},"401":{"description":"Not authenticated"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"SessionAuth":[]}],"summary":"Bereken processtappen"}}},"servers":[{"description":"Productie-mount","url":"/mollier/api"},{"description":"Direct (dev)","url":"/api"}]}
