{"components":{"schemas":{"Angelegt":{"properties":{"adresse":{"type":"string"},"analyse_url":{"format":"uri","type":"string"},"erneut_in_s":{"type":"integer"},"hinweis":{"type":"string"},"lat":{"type":"number"},"lon":{"type":"number"},"name":{"type":"string"},"projekt_id":{"type":"integer"},"zustand":{"enum":["l\u00e4uft"],"type":"string"}},"type":"object"},"Dachflaeche":{"properties":{"azimut_grad":{"description":"S\u00fcd = 0, Ost negativ, West positiv","type":"number"},"dachflaeche_m2":{"description":"Geneigte Fl\u00e4che, Grundfl\u00e4che geteilt durch cos(Neigung)","type":"number"},"empfohlen":{"type":"boolean"},"ertrag_enthaelt_verschattung":{"description":"Immer true. Der Verlust darunter ist eine Auskunft, kein Faktor - nicht noch einmal abziehen.","type":"boolean"},"ertrag_kwh_pro_kwp":{"nullable":true,"type":"number"},"firsthoehe_m":{"nullable":true,"type":"number"},"gebaeude":{"nullable":true,"type":"integer"},"grundflaeche_m2":{"description":"Fl\u00e4che in der Draufsicht","type":"number"},"id":{"description":"Ab eins, wie in der Anwendung","type":"integer"},"leistung_empfohlen_kwp":{"type":"number"},"leistung_moeglich_kwp":{"type":"number"},"module_empfohlen":{"type":"integer"},"module_moeglich":{"type":"integer"},"name":{"example":"Dachfl\u00e4che 3","type":"string"},"neigung_grad":{"type":"number"},"umriss":{"description":"GeoJSON-Polygon nach RFC 7946, WGS84, L\u00e4nge vor Breite","properties":{"coordinates":{"items":{"items":{"items":{"type":"number"},"type":"array"},"type":"array"},"type":"array"},"type":{"example":"Polygon","type":"string"}},"type":"object"},"verschattung":{"$ref":"#/components/schemas/Verschattung"}},"type":"object"},"Ergebnis":{"properties":{"dauer_s":{"type":"number"},"flaechen":{"items":{"$ref":"#/components/schemas/Dachflaeche"},"type":"array"},"jahresverbrauch_kwh":{"type":"number"},"lastprofil":{"type":"string"},"projekt_id":{"type":"integer"},"quellen":{"description":"Datenquellen, die genannt werden m\u00fcssen","items":{"type":"object"},"type":"array"},"warnungen":{"description":"Was am Lauf unvollst\u00e4ndig blieb","items":{"type":"string"},"type":"array"},"wirtschaftlichkeit":{"properties":{"anmeldung_noetig":{"type":"boolean"},"hinweis":{"type":"string"},"url":{"format":"uri","type":"string"},"verfuegbar":{"type":"boolean"}},"type":"object"},"zusammenfassung":{"$ref":"#/components/schemas/Zusammenfassung"},"zustand":{"enum":["fertig"],"type":"string"}},"type":"object"},"Fehler":{"description":"Nach RFC 9457, ausgeliefert als `application/problem+json`. Die Felder `type`, `title`, `status`, `detail` und `instance` sind der Standard, `fehler` und `doku` die eigene Erg\u00e4nzung f\u00fcr Agenten.","properties":{"detail":{"type":"string"},"doku":{"format":"uri","type":"string"},"fehler":{"properties":{"code":{"description":"Unver\u00e4nderliche Kennung zum Verzweigen","example":"adresse_nicht_eindeutig","type":"string"},"gefunden":{"description":"Nur bei adresse_nicht_eindeutig: die gefundenen Stellen zur Auswahl","items":{"type":"string"},"type":"array"},"meldung":{"description":"Ein Satz f\u00fcr den Menschen davor","type":"string"},"tu":{"description":"Was jetzt zu tun ist","type":"string"}},"required":["code","meldung","tu"],"type":"object"},"instance":{"type":"string"},"status":{"type":"integer"},"title":{"type":"string"},"type":{"format":"uri","type":"string"}},"required":["fehler"],"type":"object"},"Lastprofile":{"properties":{"hinweis":{"type":"string"},"profile":{"items":{"properties":{"bezeichnung":{"type":"string"},"kennung":{"type":"string"}},"type":"object"},"type":"array"},"vorgabe":{"type":"string"}},"type":"object"},"Laufstand":{"properties":{"analyse_url":{"format":"uri","type":"string"},"erneut_in_s":{"description":"Empfohlener Abstand bis zur n\u00e4chsten Abfrage","type":"integer"},"fertig":{"nullable":true,"type":"integer"},"gesamt":{"nullable":true,"type":"integer"},"hinweis":{"type":"string"},"projekt_id":{"type":"integer"},"schritt":{"nullable":true,"type":"string"},"wartet":{"description":"true hei\u00dft: noch kein freier Platz, die Rechnung hat nicht begonnen","type":"boolean"},"zustand":{"enum":["l\u00e4uft"],"type":"string"}},"type":"object"},"Projektliste":{"properties":{"anzahl":{"type":"integer"},"projekte":{"items":{"properties":{"analyse_url":{"format":"uri","type":"string"},"lat":{"nullable":true,"type":"number"},"lon":{"nullable":true,"type":"number"},"name":{"type":"string"},"ort":{"nullable":true,"type":"string"},"plz":{"nullable":true,"type":"string"},"projekt_id":{"type":"integer"},"strasse":{"nullable":true,"type":"string"},"url":{"format":"uri","type":"string"}},"type":"object"},"type":"array"},"weiter":{"description":"Adresse der n\u00e4chsten Seite oder null","format":"uri","nullable":true,"type":"string"}},"type":"object"},"Verschattung":{"description":"Kann null sein, wenn keine Messpunkte vorliegen.","nullable":true,"properties":{"messpunkte":{"items":{"properties":{"lat":{"type":"number"},"lon":{"type":"number"},"punkt":{"type":"string"},"verlust_pct":{"type":"number"}},"type":"object"},"type":"array"},"verfahren":{"example":"5-Punkt","type":"string"},"verlust_mittel_pct":{"nullable":true,"type":"number"}},"type":"object"},"Zusammenfassung":{"properties":{"auslegung_flaechen":{"nullable":true,"type":"integer"},"auslegung_kwp":{"nullable":true,"type":"number"},"auslegung_module":{"nullable":true,"type":"integer"},"bestand_kwp":{"nullable":true,"type":"number"},"dachflaeche_m2":{"nullable":true,"type":"number"},"empfehlung_kwp":{"nullable":true,"type":"number"},"ertrag_kwh":{"nullable":true,"type":"number"},"flaechen_anzahl":{"type":"integer"},"gebaeude":{"nullable":true,"type":"integer"},"grundflaeche_m2":{"nullable":true,"type":"number"},"leistung_moeglich_kwp":{"nullable":true,"type":"number"},"module_moeglich":{"nullable":true,"type":"integer"},"modulleistung_w":{"nullable":true,"type":"number"},"spez_ertrag_kwh_kwp":{"nullable":true,"type":"number"}},"type":"object"}},"securitySchemes":{"ApiKey":{"description":"Der regul\u00e4re Weg.","in":"header","name":"X-API-Key","type":"apiKey"},"ApiKeyQuery":{"description":"Notweg f\u00fcr Werkzeuge, die keine eigenen Kopfzeilen setzen k\u00f6nnen. Der Schl\u00fcssel steht dann in der Adresse, also im Zugriffsprotokoll jedes Zwischenrechners. Wer die Kopfzeile setzen kann, nimmt sie.","in":"query","name":"schluessel","type":"apiKey"}}},"externalDocs":{"description":"Anleitung f\u00fcr Agenten","url":"https://energie.schnee.co.at/api/v1/anleitung"},"info":{"contact":{"email":"martin@schnee.co.at","name":"Ing. Martin Schneeweiss B.Eng.","url":"https://energie.schnee.co.at/impressum"},"description":"Adresse hineingeben, Dachfl\u00e4chen mit Modulmenge, Leistung, Ausrichtung, Neigung und Verschattung herausbekommen. Gedacht f\u00fcr Agenten und Chatbots.\n\nDiese Schnittstelle rechnet nicht nur, sie **legt ein Projekt an**. Je Adresse und Konto gibt es genau eines, ein zweites wird mit 409 abgewiesen. Das ist der Unterschied zu einer reinen Rechenschnittstelle.\n\nDie ausf\u00fchrliche Anleitung steht unter https://energie.schnee.co.at/AGENT.md und als Seite unter https://energie.schnee.co.at/api/v1/anleitung","title":"Energie Schnee - Dachfl\u00e4chen und Potenzial","version":"1.1.0"},"openapi":"3.1.0","paths":{"/analyse":{"get":{"description":"F\u00fcr Werkzeuge, die nur Adressen abrufen k\u00f6nnen und weder POST noch eigene Kopfzeilen beherrschen. Zweimal aufgerufen legt der Endpunkt nichts doppelt an, sondern liefert den Stand des ersten Laufs. Auch die Statusabfragen z\u00e4hlen gegen die Ratengrenze dieses Endpunkts.","operationId":"analyse","parameters":[{"description":"Schl\u00fcssel, falls keine Kopfzeile m\u00f6glich ist","in":"query","name":"schluessel","required":false,"schema":{"type":"string"}},{"in":"query","name":"adresse","required":true,"schema":{"maxLength":200,"type":"string"}},{"description":"Auch als \"verbrauch\" annehmbar","in":"query","name":"jahresverbrauch_kwh","required":true,"schema":{"exclusiveMinimum":0,"type":"number"}},{"in":"query","name":"lastprofil","required":false,"schema":{"default":"H0","enum":["L0","L1","L2","H0","G0","G1","G2","G3","G4","G5","G6"],"type":"string"}},{"in":"query","name":"name","required":false,"schema":{"maxLength":150,"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ergebnis"}}},"description":"Fertig, mit allen Fl\u00e4chen"},"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Laufstand"}}},"description":"L\u00e4uft, dieselbe Adresse sp\u00e4ter erneut aufrufen"},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Fehler"}}},"description":"Eingabe unvollst\u00e4ndig oder ung\u00fcltig"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Fehler"}}},"description":"Schl\u00fcssel fehlt oder ist ung\u00fcltig"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Fehler"}}},"description":"Nicht gefunden"},"422":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Fehler"}}},"description":"Kein auswertbares Dach an dieser Stelle"},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Fehler"}}},"description":"Ratengrenze erreicht, Wartezeit in Retry-After"},"503":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Fehler"}}},"description":"Geodienst \u00fcberlastet oder nicht erreichbar"}},"summary":"Anlegen und abholen in einem einzigen Aufruf","tags":["Analyse"]}},"/anleitung":{"get":{"description":"Derselbe Inhalt wie /AGENT.md, nur als HTML. Gedacht f\u00fcr Werkzeuge, deren Sandbox den Abruf der Datei blockiert.","operationId":"anleitung","responses":{"200":{"description":"HTML-Seite"}},"security":[],"summary":"Die Anleitung f\u00fcr Agenten als Seite","tags":["\u00d6ffentlich"]}},"/doku":{"get":{"operationId":"doku","responses":{"200":{"description":"HTML-Seite"}},"security":[],"summary":"Die Dokumentation f\u00fcr Menschen","tags":["\u00d6ffentlich"]}},"/lastprofile":{"get":{"operationId":"lastprofile","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Lastprofile"}}},"description":"Liste der Profile"}},"security":[],"summary":"Die verf\u00fcgbaren Standardlastprofile","tags":["\u00d6ffentlich"]}},"/openapi.json":{"get":{"operationId":"openapi","responses":{"200":{"description":"OpenAPI 3.1"}},"security":[],"summary":"Diese Beschreibung","tags":["\u00d6ffentlich"]}},"/projekte":{"get":{"operationId":"projekteAuflisten","parameters":[{"in":"query","name":"limit","required":false,"schema":{"default":100,"maximum":200,"minimum":1,"type":"integer"}},{"description":"Nur Projekte mit kleinerer Kennung","in":"query","name":"vor_id","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Projektliste"}}},"description":"Liste der Projekte"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Fehler"}}},"description":"Schl\u00fcssel fehlt oder ist ung\u00fcltig"},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Fehler"}}},"description":"Ratengrenze erreicht, Wartezeit in Retry-After"}},"summary":"Eigene Projekte auflisten, seitenweise","tags":["Projekte"]},"post":{"operationId":"projektAnlegen","requestBody":{"content":{"application/json":{"example":{"adresse":"M\u00f6sl 5, 4841 Ungenach","jahresverbrauch_kwh":12000,"lastprofil":"L0","name":"Hof Muster"},"schema":{"properties":{"adresse":{"description":"Stra\u00dfe, Hausnummer, PLZ, Ort","maxLength":200,"type":"string"},"jahresverbrauch_kwh":{"exclusiveMinimum":0,"type":"number"},"lastprofil":{"enum":["L0","L1","L2","H0","G0","G1","G2","G3","G4","G5","G6"],"type":"string"},"name":{"description":"Name des neuen Projekts","maxLength":150,"type":"string"}},"required":["name","adresse","jahresverbrauch_kwh","lastprofil"],"type":"object"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Angelegt"}}},"description":"Angelegt, Analyse l\u00e4uft"},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Fehler"}}},"description":"Eingabe unvollst\u00e4ndig oder ung\u00fcltig"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Fehler"}}},"description":"Schl\u00fcssel fehlt oder ist ung\u00fcltig"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Fehler"}}},"description":"Nicht gefunden"},"409":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Fehler"}}},"description":"An dieser Adresse besteht bereits ein eigenes Projekt"},"415":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Fehler"}}},"description":"Rumpf nicht als JSON gesendet"},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Fehler"}}},"description":"Ratengrenze erreicht, Wartezeit in Retry-After"},"500":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Fehler"}}},"description":"Fehler in der Anwendung"}},"summary":"Projekt anlegen und Dachanalyse starten","tags":["Projekte"]}},"/projekte/{projekt_id}/dachanalyse":{"get":{"operationId":"dachanalyse","parameters":[{"in":"path","name":"projekt_id","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ergebnis"}}},"description":"Fertig, mit allen Fl\u00e4chen"},"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Laufstand"}}},"description":"L\u00e4uft noch, sp\u00e4ter erneut abfragen"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Fehler"}}},"description":"Schl\u00fcssel fehlt oder ist ung\u00fcltig"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Fehler"}}},"description":"Nicht gefunden"},"422":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Fehler"}}},"description":"Kein auswertbares Dach an dieser Stelle"},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Fehler"}}},"description":"Ratengrenze erreicht, Wartezeit in Retry-After"},"500":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Fehler"}}},"description":"Fehler in der Anwendung"},"503":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Fehler"}}},"description":"Geodienst \u00fcberlastet oder nicht erreichbar"}},"summary":"Stand und Ergebnis der Dachanalyse","tags":["Analyse"]},"post":{"description":"F\u00fcr den Fall, dass der Geodienst beim ersten Versuch nicht antwortete, und f\u00fcr Ergebnisse, die nach einem Tag verfallen sind. Verbrauch und Lastprofil kommen aus der letzten Anfrage, lassen sich aber neu mitgeben.","operationId":"dachanalyseWiederholen","parameters":[{"in":"path","name":"projekt_id","required":true,"schema":{"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"jahresverbrauch_kwh":{"exclusiveMinimum":0,"type":"number"},"lastprofil":{"enum":["L0","L1","L2","H0","G0","G1","G2","G3","G4","G5","G6"],"type":"string"}},"type":"object"}}},"required":false},"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Laufstand"}}},"description":"Analyse l\u00e4uft erneut"},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Fehler"}}},"description":"Eingabe unvollst\u00e4ndig oder ung\u00fcltig"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Fehler"}}},"description":"Schl\u00fcssel fehlt oder ist ung\u00fcltig"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Fehler"}}},"description":"Nicht gefunden"},"415":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Fehler"}}},"description":"Rumpf nicht als JSON gesendet"},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Fehler"}}},"description":"Ratengrenze erreicht, Wartezeit in Retry-After"}},"summary":"Die Analyse eines bestehenden Projekts erneut rechnen","tags":["Analyse"]}}},"security":[{"ApiKey":[]},{"ApiKeyQuery":[]}],"servers":[{"url":"https://energie.schnee.co.at/api/v1"}],"tags":[{"description":"Dachfl\u00e4chen zu einer Adresse","name":"Analyse"},{"description":"Eigene Projekte verwalten","name":"Projekte"},{"description":"Ohne Schl\u00fcssel abrufbar","name":"\u00d6ffentlich"}]}
