Skip to content
Mähbarkeitsindex

FAQ & Feldreferenz

Ausführliche Erklärungen zu allen Antwortfeldern, dem Checks-Objekt, dem Verhalten bei optionalen Eingaben und zum Wartungsmodus – mit konkreten Beispielen und Hintergrundinformationen.

Allgemeines

Allgemeine Handhabung

Grundlegendes Verhalten der API bei optionalen Feldern, ungültigen Werten und dem Einfluss auf die Ergebnisqualität.

Was passiert, wenn ich optionale Felder nicht übermittle?

Optionale Felder, die nicht im Request enthalten sind, werden von der API vollständig ignoriert – ohne Fehlermeldung. Die Berechnung des MFI läuft trotzdem durch, basiert dann aber ausschließlich auf den vorhandenen Daten.

Intern vermerkt die API, welche Felder fehlten: Sie erscheinen im Antwortfeld missing_fields als Array. Das ist keine Fehleranzeige, sondern lediglich eine Transparenzinformation – du weißt dadurch genau, womit die API gerechnet hat.

Konkrete Folge: Jeder Check, der auf ein fehlendes Feld angewiesen ist, wird übersprungen. Der Temperatur-Check und der Regen-Check laufen immer, weil ihre Felder Pflicht sind. Der Bodentemperatur-Check (soiltemp) läuft nur, wenn soil_temperature geliefert wurde. Der Luftfeuchtigkeits-Check (humidity) nur, wenn humidity vorliegt. Gleiches gilt für den Wind-Check und wind_speed.

Übersprungene Checks fließen nicht in die Score-Berechnung ein – sie beeinflussen den index_score weder positiv noch negativ. Der Score wird also nicht schlechter, weil ein Check fehlt, aber er wird durch den fehlenden Check auch nicht abgesichert.

Was passiert, wenn ein optionales Feld einen ungültigen Wert enthält?

Ungültige Werte bei optionalen Feldern werden ebenfalls stillschweigend ignoriert – genauso als wäre das Feld gar nicht übermittelt worden. Das gilt in zwei Fällen:

  • Nicht-numerischer Wert: Wenn ein Feld einen String wie "abc" enthält, wird es verworfen.
  • Außerhalb des Gültigkeitsbereichs: Liegt ein Wert außerhalb der definierten Grenzen (z. B. humidity: 110 bei einem Bereich von 0–100), wird er ebenfalls verworfen.

Das verworfene Feld erscheint dann in missing_fields, obwohl es technisch übermittelt wurde. Aus Sicht der API-Logik gilt es als „nicht vorhanden".

Anders bei Pflichtfeldern (temperature und precipitation_rate): Fehlen oder ungültige Werte dort führen sofort zu einem HTTP 422-Fehler.

Wie beeinflusst die Menge übermittelter Daten die Qualität des Ergebnisses?

Je mehr relevante Felder übermittelt werden, desto fundierter ist die Bewertung. Das spiegelt sich direkt im Feld data_quality wider, das drei Stufen kennt: full, partial und minimal.

Ein konkretes Beispiel: Wer nur temperature und precipitation_rate übergibt, erhält ein gültiges Ergebnis – aber ohne Boden-, Feuchtigkeits- oder Windanalyse. Der Score basiert dann auf zwei von fünf möglichen Checks. Der Gesamtstatus (main_status) kann dadurch tendenziell optimistischer wirken, weil problematische Faktoren wie nasser Boden oder Böen gar nicht bewertet wurden.

Das Ergebnis ist in jedem Fall korrekt auf Basis der gelieferten Daten – es ist jedoch nicht dasselbe wie ein Ergebnis mit vollständigen Eingaben. data_quality und missing_fields helfen dabei, diesen Unterschied transparent nachzuvollziehen.

Kann ich eine bestimmte Jahreszeit für die Berechnung erzwingen?

Standardmäßig bestimmt die API die Jahreszeit automatisch aus dem aktuellen Monat des Servers (season_source: "auto"). Für Tests lässt sich die Jahreszeit gezielt erzwingen, um das Verhalten der saisonabhängigen Schwellenwerte und Gewichtungen zu prüfen, ohne auf den passenden Kalendermonat warten zu müssen.

Dazu werden zwei Steuerfelder gemeinsam im Request mitgesendet:

  • debug – muss auf true stehen. Ohne aktiven Debug-Modus wird eine übermittelte Jahreszeit ignoriert.
  • season – die gewünschte Jahreszeit: spring, summer, autumn oder winter.

Greift der Override, enthält die Antwort season_source: "manual" und das Feld season trägt die erzwungene Jahreszeit. Es handelt sich um eine reine Test-/Debug-Funktion; im Produktivbetrieb sollten beide Felder nicht gesendet werden.

Beispiel – Winter erzwingen
{
  "temperature":        4.0,
  "precipitation_rate": 0.0,
  "debug":              true,
  "season":             "winter"
}

Die Antwort enthält dann "season": "winter" und "season_source": "manual" – unabhängig vom realen Kalendermonat.

Wartungsmodus

Verhalten bei aktivem Wartungsmodus

Wie sich die API im Wartungsmodus verhält und wie dieser erkannt werden kann.

Was passiert mit Anfragen, wenn der Wartungsmodus aktiv ist?

Ist der Wartungsmodus aktiviert, lehnt die API jeden Request an den /v1/calculate-Endpoint sofort ab – unabhängig davon, ob ein gültiger API-Key mitgesendet wurde oder die Eingabedaten korrekt wären. Die Antwort lautet stets:

HTTP 503 – Wartungsmodus
{
  "status":  "error",
  "mfi":     null,
  "message": "The API is currently undergoing maintenance. Please try again later."
}

Die Prüfung auf den Wartungsmodus erfolgt serverseitig sehr früh im Request-Lifecycle – noch vor der Authentifizierung und Eingabevalidierung. Es gibt keine Möglichkeit, den Wartungsmodus mit einem speziellen Key zu umgehen.

Der /health-Endpoint bleiben im Wartungsmodus weiterhin erreichbar.

Wie kann ich den Wartungsmodus vorab erkennen?

Der /health-Endpoint ist der empfohlene Weg, um den aktuellen Systemzustand zu prüfen – ohne Authentifizierung und ohne Rate-Limit-Auswirkungen. Bei aktivem Wartungsmodus enthält die Health-Antwort:

GET /health – Wartungsmodus aktiv
{
  "status": "maintenance",
  "mfi": {
    "status":           "maintenance",
    "maintenance_mode": true,
    "mfi_version":      "1.0",
    "checks": { ... },
    "response_time_ms": 4
  },
  "message": "The API is in maintenance mode."
}

Sinnvolles Muster für Produktionssysteme: Vor dem eigentlichen Berechnungs-Request einmalig /health aufrufen und nur wenn status === "ok", den eigentlichen Request senden. Der /health-Endpoint kann auch für externes Monitoring (z. B. Uptime-Tools) verwendet werden.

API-Antwort

Top-Level-Felder im mfi-Objekt

Alle Felder, die direkt im mfi-Objekt einer erfolgreichen Antwort erscheinen, ausführlich erklärt.

mfi_version string

Die Version der intern verwendeten MFI-Berechnungslogik – zum Beispiel "1.0". Dieser Wert wird aus den API-Einstellungen gelesen und ist nicht identisch mit der API-Versionsnummer (z. B. v1 im URL-Pfad).

Die mfi_version wird immer dann erhöht, wenn sich die Berechnungslogik, Schwellwerte oder Gewichtungen grundlegend ändern – zum Beispiel wenn neue Checks hinzugefügt oder bestehende Algorithmen überarbeitet werden. Damit können Nutzer nachvollziehen, ob sich ein unterschiedliches Ergebnis aus geänderten Eingabedaten oder aus einer aktualisierten Logik ergibt.

season string spring | summer | autumn | winter

Die Jahreszeit, die der API-Server zum Berechnungszeitpunkt als aktiv erkennt. Die Zuordnung basiert ausschließlich auf dem aktuellen Monat des Servers – unabhängig vom Standort des Nutzers oder der übermittelten Wetterdaten:

März–Mai

spring

Juni–Aug.

summer

Sept.–Nov.

autumn

Dez.–Feb.

winter

Die Jahreszeit beeinflusst maßgeblich, wie streng oder nachsichtig einzelne Checks bewertet werden. Die Schwellenwerte für Temperatur, Boden, Wind und Feuchtigkeit sind je Jahreszeit hinterlegt. Zusätzlich steuert die Jahreszeit im Minimum-Modell, wie stark der schlechteste Check gewichtet wird: In Herbst und Winter fällt dieses Gewicht höher aus, weil der Boden träger abtrocknet und ein limitierender Faktor länger bestimmend bleibt. Dadurch werden ungünstige Bedingungen in der Vegetationsruhe insgesamt kritischer bewertet.

season_source string auto | manual

Gibt an, woher die für die Berechnung verwendete Jahreszeit stammt:

  • auto – automatisch aus dem aktuellen Monat des Servers bestimmt. Das ist der Normalfall.
  • manual – im Request erzwungen (siehe Abschnitt zur Saison-Simulation). Nur im Debug-/Testkontext möglich.

Im Produktivbetrieb steht hier praktisch immer auto.

index_score integer · 0–100

Der zusammengesetzte Gesamt-Indexwert, der die Mähbarkeit als einzelne Zahl ausdrückt. Je höher der Wert, desto besser die Bedingungen. Berechnet wird er nach dem Minimum-Modell (Liebigsches Minimumprinzip):

Gesamt = w · min(Check-Indexwerte) + (1 − w) · gewichtetes Mittel

  • Minimum-Anteil: Der niedrigste Check-Indexwert (der limitierende Faktor) geht mit dem Gewicht w ein. So kann ein einzelner kritischer Faktor das Gesamtergebnis dominieren.
  • Gewichtetes Mittel: Alle ausgeführten Checks fließen anteilig nach ihrer Mährelevanz ein (Regen und Luftfeuchte am stärksten, Wind am schwächsten).

Das Gewicht w ist saisonal: in Herbst und Winter höher, sodass der schlechteste Faktor stärker durchschlägt. Nur tatsächlich ausgeführte Checks zählen; übersprungene Checks verändern den Wert weder positiv noch negativ. Welcher Check limitierend war, steht in score_basis.limiting_check.

main_status string OK WARNING BLOCK

Der Gesamtstatus – im Kern aus dem index_score abgeleitet:

OK Index ≥ 70 – Mähen möglich
WARNING Index 40–69 – Mähen eingeschränkt möglich
BLOCK Index < 40 – vom Mähen wird abgeraten

Zusätzlich gelten Durchgriffsregeln, die den reinen Score-Wert überstimmen können:

  • Hat irgendein ausgeführter Check den Status BLOCK, ist der Gesamtstatus zwingend BLOCK – unabhängig vom rechnerischen Index.
  • Hat der Regen- oder Luftfeuchte-Check den Status WARNING, ist der Gesamtstatus mindestens WARNING.
data_quality string full | partial | minimal

Gibt an, wie vollständig die übermittelten Eingabedaten im Verhältnis zu allen möglichen Feldern waren. Grundlage ist das Verhältnis gültig übermittelter Felder zur Gesamtzahl von 17 Eingabefeldern – jedes Feld zählt einzeln, auch die Niederschlagsfenster rain_1h, rain_12h und rain_24h.

full ≥ 85 % der Felder gültig übermittelt (≥ 13 von 15 Gruppen)
partial 50–84 % der Felder gültig übermittelt (8–12 von 15 Gruppen)
minimal < 50 % der Felder gültig übermittelt (< 8 von 15 Gruppen)

minimal bedeutet nicht, dass das Ergebnis falsch ist – aber die API hat mit sehr wenigen Datenpunkten gearbeitet und relevante Faktoren möglicherweise nicht berücksichtigt.

score_basis object

Macht transparent, auf welcher Datenbasis der index_score berechnet wurde:

  • checks_used – Anzahl der tatsächlich eingeflossenen Checks.
  • checks_total – Anzahl der insgesamt möglichen Checks (in der Regel 5).
  • limiting_check – der limitierende, also schlechteste Check. Er bestimmt im Minimum-Modell den Minimum-Anteil des Gesamt-Indexwerts.

Liegt checks_used unter checks_total, wurden Checks mangels Daten übersprungen – der Wert ist trotzdem auf Basis der vorhandenen Checks korrekt.

available_fields array<string>

Ein Array aller Eingabefelder, die im Request enthalten waren, gültige numerische Werte hatten und im definierten Gültigkeitsbereich lagen. Nur diese Felder haben tatsächlich in die Berechnung Einfluss genommen.

Beispiel: Wurde humidity: 150 übermittelt (außerhalb des Bereichs 0–100), erscheint humidity nicht in available_fields, sondern in missing_fields. Das ermöglicht es, Eingabefehler auf Clientseite zu erkennen und zu debuggen.

missing_fields array<string>

Das Gegenstück zu available_fields: Alle bekannten Felder, die entweder nicht übermittelt wurden, nicht-numerische Werte hatten oder außerhalb des Gültigkeitsbereichs lagen.

missing_fields enthält keine Fehleraussage über den Request – es ist eine Checkliste für die Vollständigkeit. Aus dieser Liste lässt sich direkt ableiten, welche Felder ergänzt werden könnten, um die data_quality zu verbessern und mehr Checks zu aktivieren.

protocol object

Ein Diagnoseobjekt, das zusammenfasst, was während der Berechnung übersprungen oder nur teilweise ausgeführt wurde. Es enthält immer zwei Schlüssel:

  • skipped_checksObject – Checks, die vollständig übersprungen wurden, weil ein benötigtes Feld fehlte. Key = Check-Name, Value = englischer Grund.
  • partial_checksObject – Checks, bei denen einzelne Sub-Analysen nicht durchgeführt werden konnten, weil optionale Felder fehlten.

Optional: calculation_error – erscheint nur bei einem internen Berechnungsfehler.

Beispiel – protocol
"protocol": {
  "skipped_checks": {
    "soiltemp": "soil_temperature not provided",
    "wind":     "wind_speed not provided"
  },
  "partial_checks": {
    "humidity": {
      "dew_point_analysis": "dew_point not provided – dew point analysis skipped"
    }
  }
}
rain_source_info object | nicht vorhanden

Erscheint, sobald mindestens eines der Niederschlagsfenster rain_1h, rain_12h oder rain_24h übermittelt wurde. Das Feld macht transparent, aus welchen Fenstern der Regen-Check seine Bewertung gebildet hat – je mehr Fenster, desto feiner die Auswertung.

  • windows_used – die tatsächlich genutzten Niederschlagsfenster
  • cumulative_source – das breiteste Fenster, das die kumulierte Bodenlast liefert
  • not_provided – nicht übermittelte Fenster
  • note – englischsprachiger Hinweis zur Auswertung

Wurde keines der drei Fenster übergeben, entfällt das Feld.

calculated_at string · Y-m-d H:i:s

Der Zeitstempel, zu dem die Berechnung auf dem Server abgeschlossen wurde – im Format 2025-06-15 14:32:10. Es handelt sich um die Serverzeit. Kann für Logging, Caching oder zur Nachvollziehbarkeit von Ergebnissen verwendet werden.

Bei normaler API-Latenz liegt zwischen Request-Eingang und calculated_at typischerweise weniger als eine Sekunde.

Checks-Objekt

Felder im checks-Objekt

Das checks-Objekt enthält die Ergebnisse der bis zu fünf Bewertungsmodelle: temperature, soiltemp, rain, wind, humidity. Jedes Modell gibt dieselben Felder zurück.

executed boolean

true, wenn der Check durchgeführt wurde. false, wenn er wegen fehlender Eingabedaten übersprungen wurde. Bei false sind alle anderen Check-Felder außer skipped_reason entweder null oder leere Strukturen.

Check Ausführungsbedingung
temperatureImmer – Pflichtfeld
rainImmer – Pflichtfeld
soiltempNur wenn soil_temperature vorhanden
windNur wenn wind_speed vorhanden
humidityNur wenn humidity vorhanden
skipped_reason string | null

Enthält einen englischsprachigen Erklärungstext, warum executed den Wert false hat. Ist null, wenn der Check ausgeführt wurde.

Typische Werte: "soil_temperature not provided", "wind_speed not provided", "humidity not provided". In seltenen Fällen auch "Internal calculation error".

status string | null OK WARNING BLOCK

Das Bewertungsergebnis dieses spezifischen Checks: OK, WARNING oder BLOCK. null wenn executed: false.

Jeder Check bewertet ausschließlich seinen eigenen Bereich. Keiner der Checks kennt die Ergebnisse der anderen – die Gesamtbewertung entsteht erst auf Ebene des index_score.

Adaptive Logik kann den Status eines Checks im Nachhinein anpassen: Im Herbst werden Regen-BLOCK-Status unter bestimmten Umständen auf WARNING abgemildert, im Sommer werden Hitze-WARNINGs unter Umständen weicher bewertet. Wenn adaptive Logik eingegriffen hat, erscheint ein Hinweis im meta-Objekt.

score integer 0–100 | null

Der check-interne Score – ein Wert zwischen 0 und 100, der die Güte der Mähbedingungen für diesen spezifischen Aspekt ausdrückt. Je höher, desto besser. null wenn executed: false.

Grobgrenzwerte: Scores ≥ 70 korrespondieren mit OK, 40–69 mit WARNING, unter 40 mit BLOCK. Diese Grenzen sind nicht absolut – verschiedene Checks nutzen unterschiedliche Berechnungsformeln.

Die Check-Scores fließen über das Minimum-Modell in den index_score ein: Der niedrigste Check-Score (der limitierende Faktor) wird mit einem saisonalen Gewicht kombiniert, der Rest geht als gewichtetes Mittel nach Mährelevanz ein. Ein einzelner sehr niedriger Check-Score kann den Gesamt-Indexwert dadurch deutlich nach unten ziehen.

data_confidence string | null high | partial | low

Gibt an, wie gut die Datenbasis für diesen spezifischen Check war – unabhängig von data_quality, das die Gesamtmenge aller Felder bewertet.

  • highAlle optionalen Ergänzungsfelder für diesen Check wurden übergeben. Maximale Informationsdichte.
  • mediumEinige Ergänzungsfelder fehlen. Teilanalysen werden übersprungen. Details in skipped_parts.
  • lowNur beim Regen-Check: keinerlei Niederschlagshistorie übermittelt, die Bewertung stützt sich allein auf die aktuelle Niederschlagsrate.

Beispiel: Ist nur humidity vorhanden, aber nicht dew_point, ist data_confidence: "partial" – die Taubildungsanalyse wird übersprungen, die allgemeine Feuchtigkeitsbewertung läuft aber durch.

reasons array<string>

Ein Array mit deutschsprachigen Begründungstexten, die erklären, warum der Check diesen Status und Score hat. Das Array ist leer, wenn der Check nicht ausgeführt wurde oder keine bemerkenswerten Auffälligkeiten vorliegen.

Die Texte werden automatisch priorisiert: Kritische Befunde (BLOCK-Ursachen) erscheinen immer. Trend-Informationen (z. B. anhaltende Kälteperiode in den letzten 14 Tagen) erscheinen zusätzlich, wenn sie relevant sind. Reine Info-Texte nur bei unkritischem Gesamtbefund.

Beispiele: "Niederschlagsrate von 2,1 mm/h – aktiver Regen verhindert das Mähen." · "Bodentemperatur von 1,2 °C liegt im kritischen Frostbereich."

skipped_parts object

Beschreibt auf Englisch, welche Sub-Analysen innerhalb eines ausgeführten Checks übersprungen wurden, weil bestimmte optionale Ergänzungsfelder fehlten. Ein leeres Objekt bedeutet, dass alle möglichen Teilanalysen durchgeführt werden konnten.

Unterschied zu skipped_reason: Letzteres gilt für den ganzen Check, skipped_parts gilt für einzelne Teilaspekte innerhalb eines ausgeführten Checks.

// SoilCheck ohne min_temp_3d und min_temp_3h:
"skipped_parts": {
  "recovery_3d_analysis": "min_temp_3d not provided – 3-day frost analysis could not be performed",
  "recovery_3h_analysis": "min_temp_3h not provided – 3-hour recovery analysis could not be performed"
}

// HumidityCheck ohne dew_point:
"skipped_parts": {
  "dew_point_analysis": "dew_point not provided – dew point analysis skipped"
}
meta object

Ein Diagnoseobjekt mit den tatsächlich verwendeten Eingabewerten und intern berechneten Zwischenwerten des jeweiligen Checks. Der Inhalt ist check-spezifisch.

  • temperature: temperature, season, ggf. min_temp_14d
  • soiltemp: soil_temp, season, ggf. min_temp_3d, min_temp_3h, soil_moisture, soil_moisture_load_class
  • rain: rain_rate, rain_source, rain_cumulative, soil_load, limiting_factor, season
  • wind: wind, ggf. gust, season
  • humidity: humidity, temperature, ggf. dew_point_depression, season

Wenn adaptive Logik das Ergebnis eines Checks verändert hat, enthält meta zusätzlich den Schlüssel adaptive_logic_applied mit einer englischsprachigen Beschreibung der angewendeten Regel.

Fragen, Probleme oder Feedback?

Fehlt eine Erklärung, ist etwas unklar oder wurde ein Fehler gefunden? Einfach Kontakt aufnehmen.

Kontakt aufnehmen →