{
  "format": 2,
  "app": "aquaman",
  "appVersion": "1.0.0",
  "exportedAt": "2026-10-23T17:39:14.336Z",
  "tanks": [
    {
      "id": 2,
      "name": "FluvalFlex",
      "volumeL": 60,
      "waterType": "fresh",
      "photoPath": null,
      "plants": [
        {
          "name": "Pfennigkraut",
          "qty": 2
        },
        {
          "name": "Kirschblatt",
          "qty": 2
        },
        {
          "name": "Wasserfreund",
          "qty": 2
        },
        {
          "name": "Vallisneria",
          "qty": 1
        }
      ],
      "fish": [
        {
          "species": "Panzerwels",
          "qty": 3
        },
        {
          "species": "Salmler",
          "qty": 8
        }
      ],
      "hasCo2": true,
      "hasHeater": true,
      "hasFilter": true,
      "filterType": null,
      "tankState": "established",
      "paramOverrides": {},
      "feedingPlan": "# Fütterungsplan FluvalFlex (60 L)\n\n**Bewohner:** Panzerwelse x3 (Bodenfische), Salmler x8 (Mittelschicht) — **keine Garnelen/Schnecken**\n\n## Tagesablauf (1x täglich)\n\n| Tag | Futter | Menge |\n|---|---|---|\n| Mo | Sera Flora Nature (Flocken, Oberfläche) | 0,5 Prise |\n| Di | Weiches Granulat (Mittelschicht, für die Salmler) | 0,5 Prise |\n| Mi | Sera Welsfutter Chips (sinkend, für die Panzerwelse) | 1 Chip, abends |\n| Do | Sera Flora Nature (Flocken) | 0,5 Prise |\n| Fr | Weiches Granulat (Mittelschicht) | 0,5 Prise |\n| Sa | Sera Welsfutter Chips (Panzerwelse extra) | 1 Chip, abends |\n| So | **Fastentag** – nicht füttern |\n\n## Hinweise\n\n- **Panzerwelse:** Da die Salmler oben zupacken, 1–2x pro Woche (Mi + Sa) abends einen Chip für die Bodenfische einbringen.\n- **Garnelen-/Krebstfutter (Tetra Crusta Sticks, Garnelengarten, Protein Feed) weglassen** – hierfür leben keine Wirbellosen im Becken.\n- **Weniger ist mehr:** Nur so viel, dass in 2–3 Minuten alles gefressen ist. Lieber nachlegen als überfüttern.\n- Bei Wassertrübung oder steigendem NO₃ zuerst die Fütterung reduzieren, dann andere Maßnahmen prüfen.",
      "createdAt": "2026-08-30T07:35:55.996Z",
      "deletedAt": null
    },
    {
      "id": 3,
      "name": "Nanocube",
      "volumeL": 30,
      "waterType": "fresh",
      "photoPath": null,
      "plants": [
        {
          "name": "Wasserfreund",
          "qty": 2
        },
        {
          "name": "Pfennigkraut",
          "qty": 2
        },
        {
          "name": "Schwertpflanze",
          "qty": 1
        },
        {
          "name": "Zwergwasserlinsen",
          "qty": 2
        }
      ],
      "fish": [
        {
          "species": "Zwerggarnelen",
          "qty": 30
        }
      ],
      "hasCo2": false,
      "hasHeater": false,
      "hasFilter": true,
      "filterType": null,
      "tankState": "established",
      "paramOverrides": {},
      "feedingPlan": "# Fütterungsplan Nanocube (30 L, 30 Zwerggarnelen)\n\n## Wochentage im Überblick\n\n| Tag | Futter |\n|---|---|\n| Mo | Granulat (0,5 Prise) + Protein Feed (sparsam) |\n| Di | Crusta Mix Sticks (~2–3 Sticks) |\n| Mi | Granulat (0,5 Prise) |\n| Do | Protein Feed (sparsam) |\n| Fr | Granulat (0,5 Prise) + Sera Flora Flocken (0,5 Prise) |\n| Sa | Crusta Mix Sticks (~2–3 Sticks) |\n| So | **Fastentag** (fällt mit dem Wasserwechsel zusammen) |\n\n## Mengenregeln\n- **Granulat** (mittlere Wasserschichten): 0,5 Prise – nur so viel, wie in ~2 Minuten gefressen wird.\n- **Protein Feed**: 2–3×/Woche, sparsam – nur so viel, wie in 1–2 Stunden abgenommen wird.\n- **Crusta Mix Sticks**: ca. 1 Stick pro 10–15 Tiere → bei 30 Garnelen ~2–3 Sticks.\n- **Sera Flora Flocken**: nur ~1–2×/Woche als kleine Abwechslung, 0,5 Prise.\n\n## Praxis-Tipps\n- Reste nach 2–3 Stunden entfernen, um Nitrat zu vermeiden (NO₃ lag zuletzt bei 0 – so soll es bleiben).\n- Abends leicht füttern: Garnelen sind auch nachts aktiv.\n- **1 Fastentag pro Woche** (Sonntag) ist für Garnelen sinnvoll und fördert die natürliche Aufwuchsnutzung.\n- **Urlaub:** Garnelen überstehen 2–3 Tage ohne Futter problemlos; bei längerer Abwesenheit sparsame Fütterung alle 2–3 Tage statt täglich.\n- Sanfter Bodensauger-Einsatz (nur oberflächlich), um Biofilm und Mulm für die Garnelen zu erhalten.\n- Tetra Crusta Sticks können alternativ zu den Crusta Mix Sticks eingesetzt werden (1 Prise).",
      "createdAt": "2026-08-30T07:39:37.395Z",
      "deletedAt": null
    },
    {
      "id": 4,
      "name": "Becken 1",
      "volumeL": 60,
      "waterType": "fresh",
      "photoPath": null,
      "plants": [],
      "fish": [],
      "hasCo2": false,
      "hasHeater": true,
      "hasFilter": true,
      "filterType": null,
      "tankState": "established",
      "paramOverrides": {},
      "feedingPlan": null,
      "createdAt": "2026-08-30T19:48:21.919Z",
      "deletedAt": "2026-08-30T19:52:45.314Z"
    }
  ],
  "products": [
    {
      "id": 1,
      "kind": "food",
      "name": "Sera Flora Nature Flockenfutter",
      "description": "Flockenfutter für pflanzenfressende Fische, die an der Oberfläche fressen.\nSpirulina-Algen (7 %), hoher Faser- und Carotinoidgehalt, hoher Anteil\npflanzliches Protein; leicht verdaulich, formstabil, trübt das Wasser nicht.\nOhne Farb- und Konservierungsstoffe (Reihe sera Nature).\nAnalyse: 45 % Protein, 7,9 % Fett, 4 % Rohfaser, 10,8 % Rohasche, 5 % Feuchte.\nVitamine/kg: A 37.000 IE, D3 1.800 IE, C 550 mg, E 120 mg, B2 90 mg, B1 35 mg.\nZutaten u. a.: Fischmehl, Weizenmehl, Bierhefe, Spirulina, Ca-Caseinat,\nMeeresalgen, Gammarus, Volleipulver, Lebertran (34 % Omega-Fettsäuren).",
      "nutrients": {},
      "defaultDose": "0,5 pinch",
      "sourceUrl": null,
      "sourceFetchedAt": null,
      "createdAt": "2026-09-05T08:43:54.859Z",
      "deletedAt": null
    },
    {
      "id": 2,
      "kind": "food",
      "name": "Tetra Crusta Sticks",
      "description": "Alleinfutter für Garnelen und Krebse. Schnell sinkende, formstabile Sticks\nmit hohem Weizenkeimanteil (8,3 % Weizenkeimmehl); sie erlauben natürliches\nFressverhalten und belasten das Wasser nicht. Protein und Mineralstoffe sind\nauf eine gesunde Häutung ausgelegt. Enthält Farbstoffe, Antioxidantien und\nKonservierungsmittel.\nAnalyse: 47 % Rohprotein, 10 % Rohfett, 2 % Rohfaser, 8 % Feuchte.\nJe kg: Vitamin A 30.470 IE, D3 1.900 IE, Mangan 100 mg, Zink 63 mg,\nEisen 41 mg.\nZusammensetzung: pflanzl. Eiweißextrakte, Fisch- und Fischnebenerzeugnisse,\nGetreide, Hefen, Öle, Fette, Mineralstoffe.",
      "nutrients": {},
      "defaultDose": "1 pinch",
      "sourceUrl": null,
      "sourceFetchedAt": null,
      "createdAt": "2026-09-05T08:43:54.859Z",
      "deletedAt": null
    },
    {
      "id": 3,
      "kind": "food",
      "name": "Vipagran Granules",
      "description": "Alleinfutter mit weichen Granulaten für Fische, die in mittleren\nWasserschichten fressen; die flexible Struktur passt auch zu kleinem Maul\nund engem Schlund. Granulate sinken langsam, bleiben formstabil und belasten\ndas Wasser nicht. Präbiotisch durch 0,4 % Mannan-Oligosaccharide,\n4 % Insektenmehl (Hermetia illucens). Ohne Farb- und Konservierungsstoffe\n(Reihe sera Nature).\nAnalyse: 41,5 % Protein, 9,5 % Fett, 2 % Rohfaser, 5,5 % Rohasche,\n5,5 % Feuchte.\nZutaten u. a.: Maisstärke, Weizengluten, Fischmehl, Volleipulver,\nCa-Kaseinat, Insektenmehl, Fischöl, Bierhefe, Spirulina, Gammarusmehl.",
      "nutrients": {},
      "defaultDose": "0,5 pinch",
      "sourceUrl": null,
      "sourceFetchedAt": null,
      "createdAt": "2026-09-05T08:43:54.859Z",
      "deletedAt": null
    },
    {
      "id": 4,
      "kind": "food",
      "name": "Sera Welsfutter Chips Nature",
      "description": "Sinkende Chips für nachtaktive Bodenfische, die ihre Nahrung raspeln oder\nsaugen (Ancistrus, L-Welse). Ballaststoffreich durch Weidenrinde und\nErlenzapfen, dazu Spirulina; weichen auf, bleiben aber mind. 24 h formstabil\nund trüben das Wasser nicht. Ohne Farb- und Konservierungsstoffe\n(Reihe sera Nature).\nAnalyse: 31,2 % Protein, 7,2 % Fett, 4,9 % Rohfaser, 6,5 % Rohasche,\n5 % Feuchte.\nVitamine/kg: A 30.000 IE, D3 1.500 IE, C 550 mg, B2 90 mg, E 60 mg, B1 30 mg.\nZutaten u. a.: Fischmehl, Maisstärke, Weizenmehl, Weizenkeime, Spirulina,\nBierhefe, Milchpulver, Fischöl, Kräuter.",
      "nutrients": {},
      "defaultDose": "1 Chip",
      "sourceUrl": null,
      "sourceFetchedAt": null,
      "createdAt": "2026-09-05T08:43:54.859Z",
      "deletedAt": null
    },
    {
      "id": 5,
      "kind": "fertilizer",
      "name": "Dennerle Plant Elixir Basic",
      "description": "empfehlung wöchentlich: 10 ml auf 50 L Aquarienwasser.\nNK-Dünger 3 + 13 mit Spurennährstoffen, flüssiges\nPflanzenhilfsmittel. Kalium ist als K₂O deklariert:\n0,11 % K₂O ≈ 0,09 % K. Ohne Phosphat, Calcium und CO₂.\nNicht im Nährstoffkatalog: 0,14 % S, 0,0001 % Co,\n0,0001 % Al, 0,0003 % Li, 0,00004 % Ni, 0,0001 % V.\nSpurenelemente mit EDTA, HEDTA und DTPA komplexiert,\nVitamin C zur Stabilisierung; konserviert mit\nKaliumsorbat und Natriumformiat.\nBei Raumtemperatur lagern, vor Hitze und Frost schützen.",
      "nutrients": {
        "n_no3": "0,02",
        "k": "0,11",
        "mg": "0,02",
        "fe": "0,025",
        "mn": "0,01",
        "zn": "0,0005",
        "b": "0,0018",
        "mo": "0,001",
        "cu": "0,0005"
      },
      "defaultDose": null,
      "sourceUrl": null,
      "sourceFetchedAt": null,
      "createdAt": "2026-09-05T08:55:00.625Z",
      "deletedAt": null
    },
    {
      "id": 6,
      "kind": "food",
      "name": "Garnelengarten® Crusta Mix Sticks",
      "description": "Ergänzungsfuttermittel (Sticks) für Wirbellose wie Garnelen, Krebse, Krabben und Schnecken. ø 4 mm, Länge ca. 9-17 mm. Zusammensetzung: 30 % Brennnessel, 20 % Walnussblätter, je 10 % Spinat, Seealge, Luzerne, Paprika, Echinacea. Analytische Bestandteile: Rohprotein 17,12 %, Rohfett 9,88 %, Rohfaser 11,35 %, Rohasche 12,97 %. Kühl und trocken lagern.",
      "nutrients": {},
      "defaultDose": "ca. 1 Stick pro 10-15 Tiere",
      "sourceUrl": null,
      "sourceFetchedAt": null,
      "createdAt": "2026-09-05T10:20:02.865Z",
      "deletedAt": null
    },
    {
      "id": 7,
      "kind": "food",
      "name": "Protein Feed für Garnelen",
      "description": "Weiche Proteinf feed-Pads als spezielle Proteinnahrung für Garnelen mit erhöhtem Eiweißbedarf (Wachstum, Eibildung, Zucht); auch für überwiegend carnixxx Garnelen wie Macrobrachium und Amanogarnelen. Proteine ausschließlich aus Insekten, Pflanzen und Krill, ohne Fischmehl; Eiweißgehalt unter 40 %. Zusammensetzung: Pflanzliche Nebenerzeugnisse, Insekten, pflanzliche Eiweißextrakte, Getreide, Krill, Lachsöl, Kelp, Hefen, Mineralstoffe. Analyse: Rohprotein 34,5 %, Rohfett 6,2 %, Rohfaser 2,5 %, Rohasche 5,4 %.",
      "nutrients": {},
      "defaultDose": "2-3x wöchentlich, sparsam",
      "sourceUrl": null,
      "sourceFetchedAt": null,
      "createdAt": "2026-09-05T13:30:40.113Z",
      "deletedAt": null
    }
  ],
  "schedules": [
    {
      "id": 14,
      "tankId": 2,
      "actionType": "water_change",
      "intervalDays": 7,
      "preferredDays": 127,
      "autoReschedule": true,
      "lastDoneAt": "2026-10-04T08:30:15.888Z",
      "snoozedUntil": null,
      "snoozeSource": null,
      "details": "20 % (12 L of 60 L)",
      "detailData": {
        "percent": 20
      },
      "endsOn": null,
      "scheduleVersion": 9,
      "tightGapPolicy": null,
      "tightGapThresholdPct": null,
      "createdAt": "2026-08-30T07:55:03.326Z",
      "updatedAt": "2026-10-04T08:30:15.889Z",
      "active": true
    },
    {
      "id": 15,
      "tankId": 3,
      "actionType": "filter_change",
      "intervalDays": 122,
      "preferredDays": 127,
      "autoReschedule": true,
      "lastDoneAt": "2026-08-30T12:00:00.000Z",
      "snoozedUntil": null,
      "snoozeSource": null,
      "details": "Filterwechsel: Filtermedien nur teilweise erneuern (Biofilm erhalten)",
      "detailData": null,
      "endsOn": "2026-12-30",
      "scheduleVersion": 0,
      "tightGapPolicy": null,
      "tightGapThresholdPct": null,
      "createdAt": "2026-08-30T08:36:32.515Z",
      "updatedAt": "2026-08-30T08:36:32.515Z",
      "active": true
    },
    {
      "id": 16,
      "tankId": 2,
      "actionType": "feed",
      "intervalDays": 2,
      "preferredDays": 127,
      "autoReschedule": true,
      "lastDoneAt": null,
      "snoozedUntil": null,
      "snoozeSource": null,
      "details": "1 small pinch of shrimp food or 1 sinking pellet (verify dosage against the product label)",
      "detailData": {
        "foods": {
          "Shrimp food (e.g. biofilm/vegetable pellets)": "1 small pinch / 1 pellet"
        }
      },
      "endsOn": null,
      "scheduleVersion": 1,
      "tightGapPolicy": null,
      "tightGapThresholdPct": null,
      "createdAt": "2026-08-31T05:36:34.978Z",
      "updatedAt": "2026-09-04T11:13:10.494Z",
      "active": false
    },
    {
      "id": 17,
      "tankId": 3,
      "actionType": "water_test",
      "intervalDays": 14,
      "preferredDays": 64,
      "autoReschedule": true,
      "lastDoneAt": null,
      "snoozedUntil": null,
      "snoozeSource": null,
      "details": "Test NO2, NO3, GH/KH and pH; log results in the app",
      "detailData": null,
      "endsOn": null,
      "scheduleVersion": 1,
      "tightGapPolicy": null,
      "tightGapThresholdPct": null,
      "createdAt": "2026-08-31T05:36:34.980Z",
      "updatedAt": "2026-09-02T08:09:19.327Z",
      "active": true
    },
    {
      "id": 18,
      "tankId": 2,
      "actionType": "fertilize",
      "intervalDays": 7,
      "preferredDays": 64,
      "autoReschedule": true,
      "lastDoneAt": "2026-10-04T08:30:17.223Z",
      "snoozedUntil": null,
      "snoozeSource": null,
      "details": "1 ml liquid iron/micro fertilizer (verify dosage against the product label)",
      "detailData": {
        "nutrients": {
          "fe": "1 ml liquid iron fertilizer"
        }
      },
      "endsOn": null,
      "scheduleVersion": 7,
      "tightGapPolicy": null,
      "tightGapThresholdPct": null,
      "createdAt": "2026-08-31T05:36:34.981Z",
      "updatedAt": "2026-10-04T08:30:17.223Z",
      "active": true
    },
    {
      "id": 19,
      "tankId": 3,
      "actionType": "water_change",
      "intervalDays": 7,
      "preferredDays": 64,
      "autoReschedule": true,
      "lastDoneAt": "2026-10-04T08:30:20.776Z",
      "snoozedUntil": null,
      "snoozeSource": null,
      "details": "6 L of 30 L (20 %) weekly water change, temperature-matched, dechlorinated (verify dosage against the product label)",
      "detailData": {
        "percent": 20
      },
      "endsOn": null,
      "scheduleVersion": 8,
      "tightGapPolicy": null,
      "tightGapThresholdPct": null,
      "createdAt": "2026-09-02T08:08:56.752Z",
      "updatedAt": "2026-10-04T08:30:20.777Z",
      "active": true
    },
    {
      "id": 20,
      "tankId": 3,
      "actionType": "substrate_vacuum",
      "intervalDays": 14,
      "preferredDays": 64,
      "autoReschedule": true,
      "lastDoneAt": null,
      "snoozedUntil": null,
      "snoozeSource": null,
      "details": "Light surface vacuum only — preserve biofilm and mulm for the shrimp",
      "detailData": null,
      "endsOn": null,
      "scheduleVersion": 1,
      "tightGapPolicy": null,
      "tightGapThresholdPct": null,
      "createdAt": "2026-09-02T08:08:56.754Z",
      "updatedAt": "2026-09-02T08:09:42.272Z",
      "active": true
    },
    {
      "id": 21,
      "tankId": 3,
      "actionType": "feed",
      "intervalDays": 2,
      "preferredDays": 127,
      "autoReschedule": true,
      "lastDoneAt": null,
      "snoozedUntil": null,
      "snoozeSource": null,
      "details": "Small portion of shrimp food (staple pellets/wafers), only what is eaten within ~2 hours. Occasional blanched vegetable or biofilm supplement. (verify dosage against the product label)",
      "detailData": {
        "foods": {
          "Shrimp staple food": "small pinch (~ what 30 dwarf shrimp finish in 1-2 h)"
        }
      },
      "endsOn": null,
      "scheduleVersion": 0,
      "tightGapPolicy": null,
      "tightGapThresholdPct": null,
      "createdAt": "2026-09-02T08:11:01.052Z",
      "updatedAt": "2026-09-04T11:13:10.494Z",
      "active": false
    },
    {
      "id": 22,
      "tankId": 2,
      "actionType": "water_test",
      "intervalDays": 14,
      "preferredDays": 127,
      "autoReschedule": true,
      "lastDoneAt": null,
      "snoozedUntil": null,
      "snoozeSource": null,
      "details": "Test auf NO₂, NO₃, NH₃/NH₄, pH, ggf. GH/KH",
      "detailData": null,
      "endsOn": null,
      "scheduleVersion": 0,
      "tightGapPolicy": null,
      "tightGapThresholdPct": null,
      "createdAt": "2026-09-02T12:43:35.165Z",
      "updatedAt": "2026-09-02T12:43:35.165Z",
      "active": true
    },
    {
      "id": 23,
      "tankId": 2,
      "actionType": "filter_change",
      "intervalDays": 90,
      "preferredDays": 127,
      "autoReschedule": true,
      "lastDoneAt": null,
      "snoozedUntil": null,
      "snoozeSource": null,
      "details": "Filtermaterial teilweise wechseln (max. 1/3 auf einmal), um Bakterienkultur zu schonen",
      "detailData": null,
      "endsOn": null,
      "scheduleVersion": 0,
      "tightGapPolicy": null,
      "tightGapThresholdPct": null,
      "createdAt": "2026-09-02T12:43:35.167Z",
      "updatedAt": "2026-09-02T12:43:35.167Z",
      "active": true
    }
  ],
  "maintenanceLogs": [
    {
      "id": 4,
      "tankId": 2,
      "actionType": "water_change",
      "doneAt": "2026-08-30T08:31:02.739Z",
      "note": null,
      "source": "user",
      "scheduleId": null,
      "details": null,
      "detailData": null
    },
    {
      "id": 5,
      "tankId": 3,
      "actionType": "water_change",
      "doneAt": "2026-08-30T08:31:04.704Z",
      "note": null,
      "source": "user",
      "scheduleId": null,
      "details": null,
      "detailData": null
    },
    {
      "id": 11,
      "tankId": 2,
      "actionType": "water_change",
      "doneAt": "2026-09-06T15:25:03.323Z",
      "note": null,
      "source": "api",
      "scheduleId": 14,
      "details": "20 % (12 L of 60 L)",
      "detailData": {
        "percent": 20
      }
    },
    {
      "id": 12,
      "tankId": 3,
      "actionType": "water_change",
      "doneAt": "2026-09-06T15:25:06.729Z",
      "note": null,
      "source": "api",
      "scheduleId": 19,
      "details": "6 L of 30 L (20 %) weekly water change, temperature-matched, dechlorinated (verify dosage against the product label)",
      "detailData": {
        "percent": 20
      }
    },
    {
      "id": 13,
      "tankId": 2,
      "actionType": "fertilize",
      "doneAt": "2026-09-07T15:59:11.391Z",
      "note": null,
      "source": "api",
      "scheduleId": 18,
      "details": "1 ml liquid iron/micro fertilizer (verify dosage against the product label)",
      "detailData": {
        "nutrients": {
          "fe": "1 ml liquid iron fertilizer"
        }
      }
    },
    {
      "id": 14,
      "tankId": 3,
      "actionType": "fertilize",
      "doneAt": "2026-09-07T15:59:17.398Z",
      "note": null,
      "source": "api",
      "scheduleId": null,
      "details": null,
      "detailData": null
    },
    {
      "id": 15,
      "tankId": 3,
      "actionType": "water_change",
      "doneAt": "2026-09-13T08:36:13.219Z",
      "note": null,
      "source": "api",
      "scheduleId": 19,
      "details": "6 L of 30 L (20 %) weekly water change, temperature-matched, dechlorinated (verify dosage against the product label)",
      "detailData": {
        "percent": 20
      }
    },
    {
      "id": 16,
      "tankId": 2,
      "actionType": "water_change",
      "doneAt": "2026-09-13T08:36:15.445Z",
      "note": null,
      "source": "api",
      "scheduleId": 14,
      "details": "20 % (12 L of 60 L)",
      "detailData": {
        "percent": 20
      }
    },
    {
      "id": 17,
      "tankId": 2,
      "actionType": "fertilize",
      "doneAt": "2026-09-13T08:47:31.332Z",
      "note": null,
      "source": "api",
      "scheduleId": 18,
      "details": "1 ml liquid iron/micro fertilizer (verify dosage against the product label)",
      "detailData": {
        "nutrients": {
          "fe": "1 ml liquid iron fertilizer"
        }
      }
    },
    {
      "id": 18,
      "tankId": 2,
      "actionType": "water_change",
      "doneAt": "2026-09-14T11:02:37.862Z",
      "note": null,
      "source": "api",
      "scheduleId": 14,
      "details": "20 % (12 L of 60 L)",
      "detailData": {
        "percent": 20
      }
    },
    {
      "id": 19,
      "tankId": 3,
      "actionType": "fertilize",
      "doneAt": "2026-09-22T15:37:15.075Z",
      "note": null,
      "source": "api",
      "scheduleId": null,
      "details": null,
      "detailData": null
    },
    {
      "id": 20,
      "tankId": 2,
      "actionType": "fertilize",
      "doneAt": "2026-09-22T15:38:47.509Z",
      "note": null,
      "source": "api",
      "scheduleId": 18,
      "details": "1 ml liquid iron/micro fertilizer (verify dosage against the product label)",
      "detailData": {
        "nutrients": {
          "fe": "1 ml liquid iron fertilizer"
        }
      }
    },
    {
      "id": 21,
      "tankId": 2,
      "actionType": "water_change",
      "doneAt": "2026-09-23T16:22:02.076Z",
      "note": null,
      "source": "api",
      "scheduleId": 14,
      "details": "20 % (12 L of 60 L)",
      "detailData": {
        "percent": 20
      }
    },
    {
      "id": 22,
      "tankId": 2,
      "actionType": "water_change",
      "doneAt": "2026-09-26T23:46:04.656Z",
      "note": null,
      "source": "api",
      "scheduleId": 14,
      "details": "20 % (12 L of 60 L)",
      "detailData": {
        "percent": 20
      }
    },
    {
      "id": 23,
      "tankId": 2,
      "actionType": "fertilize",
      "doneAt": "2026-10-03T08:57:47.740Z",
      "note": null,
      "source": "api",
      "scheduleId": 18,
      "details": "1 ml liquid iron/micro fertilizer (verify dosage against the product label)",
      "detailData": {
        "nutrients": {
          "fe": "1 ml liquid iron fertilizer"
        }
      }
    },
    {
      "id": 24,
      "tankId": 2,
      "actionType": "water_change",
      "doneAt": "2026-10-04T08:30:15.888Z",
      "note": null,
      "source": "api",
      "scheduleId": 14,
      "details": "20 % (12 L of 60 L)",
      "detailData": {
        "percent": 20
      }
    },
    {
      "id": 25,
      "tankId": 2,
      "actionType": "fertilize",
      "doneAt": "2026-10-04T08:30:17.223Z",
      "note": null,
      "source": "api",
      "scheduleId": 18,
      "details": "1 ml liquid iron/micro fertilizer (verify dosage against the product label)",
      "detailData": {
        "nutrients": {
          "fe": "1 ml liquid iron fertilizer"
        }
      }
    },
    {
      "id": 26,
      "tankId": 3,
      "actionType": "water_change",
      "doneAt": "2026-10-04T08:30:20.776Z",
      "note": null,
      "source": "api",
      "scheduleId": 19,
      "details": "6 L of 30 L (20 %) weekly water change, temperature-matched, dechlorinated (verify dosage against the product label)",
      "detailData": {
        "percent": 20
      }
    },
    {
      "id": 27,
      "tankId": 3,
      "actionType": "fertilize",
      "doneAt": "2026-10-04T08:30:22.014Z",
      "note": null,
      "source": "api",
      "scheduleId": null,
      "details": null,
      "detailData": null
    }
  ],
  "waterTests": [
    {
      "id": 7,
      "tankId": 3,
      "measuredAt": "2026-09-04T14:44:42.802Z",
      "values": {
        "temp": 24,
        "ph": 7.2,
        "kh": 6,
        "gh": 16,
        "no2": 0,
        "no3": 0,
        "cl2": 0.02
      },
      "note": null
    },
    {
      "id": 8,
      "tankId": 2,
      "measuredAt": "2026-10-04T07:43:54.638Z",
      "values": {
        "temp": 24,
        "no3": 40,
        "no2": 0.4,
        "gh": 16,
        "ph": 7.8,
        "cl2": 0.1
      },
      "note": null
    },
    {
      "id": 9,
      "tankId": 3,
      "measuredAt": "2026-10-04T07:49:20.530Z",
      "values": {
        "temp": 24,
        "gh": 6,
        "kh": 6,
        "co2": 15,
        "ph": 7.2,
        "no2": 0.4,
        "no3": 40,
        "cl2": 0.1
      },
      "note": null
    }
  ],
  "feedLogs": [
    {
      "id": 8,
      "tankId": 2,
      "day": "2026-08-30",
      "fedAt": "2026-08-30T13:36:54.680Z",
      "timesFed": 1
    },
    {
      "id": 9,
      "tankId": 3,
      "day": "2026-08-30",
      "fedAt": "2026-08-30T13:36:56.907Z",
      "timesFed": 1
    },
    {
      "id": 10,
      "tankId": 2,
      "day": "2026-09-03",
      "fedAt": "2026-09-04T07:15:44.864Z",
      "timesFed": 1
    },
    {
      "id": 11,
      "tankId": 3,
      "day": "2026-09-03",
      "fedAt": "2026-09-04T07:15:46.155Z",
      "timesFed": 1
    },
    {
      "id": 12,
      "tankId": 3,
      "day": "2026-09-05",
      "fedAt": "2026-09-05T15:43:56.710Z",
      "timesFed": 1
    },
    {
      "id": 13,
      "tankId": 2,
      "day": "2026-09-07",
      "fedAt": "2026-09-07T15:59:12.920Z",
      "timesFed": 1
    },
    {
      "id": 14,
      "tankId": 3,
      "day": "2026-09-07",
      "fedAt": "2026-09-07T15:59:18.633Z",
      "timesFed": 1
    },
    {
      "id": 15,
      "tankId": 2,
      "day": "2026-09-10",
      "fedAt": "2026-09-10T14:06:39.955Z",
      "timesFed": 1
    },
    {
      "id": 16,
      "tankId": 2,
      "day": "2026-09-12",
      "fedAt": "2026-09-12T08:45:01.035Z",
      "timesFed": 1
    },
    {
      "id": 17,
      "tankId": 3,
      "day": "2026-09-12",
      "fedAt": "2026-09-12T08:45:34.824Z",
      "timesFed": 1
    },
    {
      "id": 18,
      "tankId": 2,
      "day": "2026-09-15",
      "fedAt": "2026-09-15T19:41:21.741Z",
      "timesFed": 1
    },
    {
      "id": 19,
      "tankId": 2,
      "day": "2026-09-19",
      "fedAt": "2026-09-19T16:37:23.274Z",
      "timesFed": 1
    },
    {
      "id": 20,
      "tankId": 3,
      "day": "2026-09-19",
      "fedAt": "2026-09-19T16:38:10.610Z",
      "timesFed": 1
    },
    {
      "id": 21,
      "tankId": 2,
      "day": "2026-09-22",
      "fedAt": "2026-09-22T15:36:19.670Z",
      "timesFed": 1
    },
    {
      "id": 22,
      "tankId": 3,
      "day": "2026-09-22",
      "fedAt": "2026-09-22T15:36:21.568Z",
      "timesFed": 1
    },
    {
      "id": 23,
      "tankId": 2,
      "day": "2026-09-24",
      "fedAt": "2026-09-24T14:09:50.066Z",
      "timesFed": 1
    },
    {
      "id": 24,
      "tankId": 3,
      "day": "2026-09-24",
      "fedAt": "2026-09-24T14:10:21.738Z",
      "timesFed": 1
    },
    {
      "id": 25,
      "tankId": 3,
      "day": "2026-09-26",
      "fedAt": "2026-09-26T09:44:13.424Z",
      "timesFed": 1
    },
    {
      "id": 26,
      "tankId": 2,
      "day": "2026-09-26",
      "fedAt": "2026-09-26T09:44:15.204Z",
      "timesFed": 1
    },
    {
      "id": 27,
      "tankId": 2,
      "day": "2026-09-28",
      "fedAt": "2026-09-28T17:41:47.216Z",
      "timesFed": 1
    },
    {
      "id": 28,
      "tankId": 2,
      "day": "2026-09-30",
      "fedAt": "2026-09-30T20:18:27.787Z",
      "timesFed": 1
    },
    {
      "id": 29,
      "tankId": 3,
      "day": "2026-09-30",
      "fedAt": "2026-09-30T20:18:30.903Z",
      "timesFed": 1
    },
    {
      "id": 30,
      "tankId": 3,
      "day": "2026-10-03",
      "fedAt": "2026-10-03T08:57:44.644Z",
      "timesFed": 1
    },
    {
      "id": 31,
      "tankId": 2,
      "day": "2026-10-03",
      "fedAt": "2026-10-03T08:57:49.251Z",
      "timesFed": 1
    },
    {
      "id": 32,
      "tankId": 2,
      "day": "2026-10-04",
      "fedAt": "2026-10-04T08:30:14.504Z",
      "timesFed": 1
    },
    {
      "id": 33,
      "tankId": 3,
      "day": "2026-10-04",
      "fedAt": "2026-10-04T08:30:19.572Z",
      "timesFed": 1
    },
    {
      "id": 34,
      "tankId": 3,
      "day": "2026-10-08",
      "fedAt": "2026-10-08T15:55:44.916Z",
      "timesFed": 1
    },
    {
      "id": 35,
      "tankId": 2,
      "day": "2026-10-08",
      "fedAt": "2026-10-08T15:55:46.832Z",
      "timesFed": 1
    }
  ],
  "aiCalls": [
    {
      "id": 14,
      "day": "2026-08-30",
      "provider": "zai",
      "model": "glm-5.3",
      "promptTokens": 0,
      "completionTokens": 1024,
      "costEstimateMicros": 5120,
      "purpose": "coach"
    },
    {
      "id": 15,
      "day": "2026-08-30",
      "provider": "zai",
      "model": "glm-5.3",
      "promptTokens": 0,
      "completionTokens": 199,
      "costEstimateMicros": 995,
      "purpose": "coach"
    },
    {
      "id": 16,
      "day": "2026-08-30",
      "provider": "zai",
      "model": "glm-5.3",
      "promptTokens": 0,
      "completionTokens": 1024,
      "costEstimateMicros": 5120,
      "purpose": "coach"
    },
    {
      "id": 17,
      "day": "2026-08-30",
      "provider": "zai",
      "model": "glm-5.3",
      "promptTokens": 0,
      "completionTokens": 1024,
      "costEstimateMicros": 5120,
      "purpose": "coach"
    },
    {
      "id": 18,
      "day": "2026-08-31",
      "provider": "zai",
      "model": "glm-5.3",
      "promptTokens": 0,
      "completionTokens": 407,
      "costEstimateMicros": 2035,
      "purpose": "coach"
    },
    {
      "id": 19,
      "day": "2026-09-01",
      "provider": "zai",
      "model": "glm-5.3",
      "promptTokens": 0,
      "completionTokens": 268,
      "costEstimateMicros": 1340,
      "purpose": "coach"
    },
    {
      "id": 20,
      "day": "2026-09-02",
      "provider": "zai",
      "model": "glm-5.3-flash",
      "promptTokens": 0,
      "completionTokens": 382,
      "costEstimateMicros": 1910,
      "purpose": "coach"
    },
    {
      "id": 21,
      "day": "2026-09-02",
      "provider": "zai",
      "model": "glm-5.3-flash",
      "promptTokens": 0,
      "completionTokens": 335,
      "costEstimateMicros": 1675,
      "purpose": "coach"
    },
    {
      "id": 22,
      "day": "2026-09-02",
      "provider": "zai",
      "model": "glm-5.3-flash",
      "promptTokens": 0,
      "completionTokens": 413,
      "costEstimateMicros": 2065,
      "purpose": "coach"
    },
    {
      "id": 23,
      "day": "2026-09-04",
      "provider": "zai",
      "model": "glm-5.3-flash",
      "promptTokens": 1433,
      "completionTokens": 600,
      "costEstimateMicros": 4433,
      "purpose": "plan_review"
    },
    {
      "id": 24,
      "day": "2026-09-04",
      "provider": "zai",
      "model": "glm-5.3-flash",
      "promptTokens": 1462,
      "completionTokens": 600,
      "costEstimateMicros": 4462,
      "purpose": "plan_review"
    },
    {
      "id": 25,
      "day": "2026-09-04",
      "provider": "zai",
      "model": "glm-5.3-flash",
      "promptTokens": 1461,
      "completionTokens": 600,
      "costEstimateMicros": 4461,
      "purpose": "plan_review"
    },
    {
      "id": 26,
      "day": "2026-09-05",
      "provider": "zai",
      "model": "glm-5.3-flash",
      "promptTokens": 1894,
      "completionTokens": 600,
      "costEstimateMicros": 4894,
      "purpose": "plan_review"
    },
    {
      "id": 27,
      "day": "2026-09-05",
      "provider": "zai",
      "model": "glm-5.3-flash",
      "promptTokens": 1971,
      "completionTokens": 600,
      "costEstimateMicros": 4971,
      "purpose": "plan_review"
    },
    {
      "id": 28,
      "day": "2026-09-05",
      "provider": "zai",
      "model": "glm-5.3-flash",
      "promptTokens": 2064,
      "completionTokens": 600,
      "costEstimateMicros": 5064,
      "purpose": "plan_review"
    },
    {
      "id": 29,
      "day": "2026-09-05",
      "provider": "zai",
      "model": "glm-5.3-flash",
      "promptTokens": 2171,
      "completionTokens": 600,
      "costEstimateMicros": 5171,
      "purpose": "plan_review"
    },
    {
      "id": 30,
      "day": "2026-09-05",
      "provider": "zai",
      "model": "glm-5.3-flash",
      "promptTokens": 2263,
      "completionTokens": 600,
      "costEstimateMicros": 5263,
      "purpose": "plan_review"
    },
    {
      "id": 31,
      "day": "2026-09-05",
      "provider": "zai",
      "model": "glm-5.3-flash",
      "promptTokens": 2358,
      "completionTokens": 600,
      "costEstimateMicros": 5358,
      "purpose": "plan_review"
    },
    {
      "id": 32,
      "day": "2026-09-05",
      "provider": "zai",
      "model": "glm-5.3-flash",
      "promptTokens": 1552,
      "completionTokens": 41,
      "costEstimateMicros": 1757,
      "purpose": "product_draft"
    },
    {
      "id": 33,
      "day": "2026-09-05",
      "provider": "zai",
      "model": "glm-5.3-flash",
      "promptTokens": 1322,
      "completionTokens": 214,
      "costEstimateMicros": 2392,
      "purpose": "product_draft"
    },
    {
      "id": 34,
      "day": "2026-09-05",
      "provider": "zai",
      "model": "glm-5.3-flash",
      "promptTokens": 2510,
      "completionTokens": 600,
      "costEstimateMicros": 5510,
      "purpose": "plan_review"
    },
    {
      "id": 35,
      "day": "2026-09-05",
      "provider": "zai",
      "model": "glm-5.3-flash",
      "promptTokens": 2599,
      "completionTokens": 313,
      "costEstimateMicros": 4164,
      "purpose": "product_draft"
    },
    {
      "id": 36,
      "day": "2026-09-05",
      "provider": "zai",
      "model": "glm-5.3-flash",
      "promptTokens": 2635,
      "completionTokens": 600,
      "costEstimateMicros": 5635,
      "purpose": "plan_review"
    },
    {
      "id": 37,
      "day": "2026-09-05",
      "provider": "zai",
      "model": "glm-5.3-flash",
      "promptTokens": 0,
      "completionTokens": 474,
      "costEstimateMicros": 2370,
      "purpose": "coach"
    },
    {
      "id": 38,
      "day": "2026-09-05",
      "provider": "zai",
      "model": "glm-5.3-flash",
      "promptTokens": 0,
      "completionTokens": 420,
      "costEstimateMicros": 2100,
      "purpose": "coach"
    },
    {
      "id": 39,
      "day": "2026-09-05",
      "provider": "zai",
      "model": "glm-5.3-flash",
      "promptTokens": 0,
      "completionTokens": 615,
      "costEstimateMicros": 3075,
      "purpose": "coach"
    },
    {
      "id": 40,
      "day": "2026-09-05",
      "provider": "zai",
      "model": "glm-5.3-flash",
      "promptTokens": 2941,
      "completionTokens": 600,
      "costEstimateMicros": 5941,
      "purpose": "plan_review"
    },
    {
      "id": 41,
      "day": "2026-09-05",
      "provider": "zai",
      "model": "glm-5.3-flash",
      "promptTokens": 0,
      "completionTokens": 587,
      "costEstimateMicros": 2935,
      "purpose": "coach"
    },
    {
      "id": 42,
      "day": "2026-09-05",
      "provider": "zai",
      "model": "glm-5.3-flash",
      "promptTokens": 2375,
      "completionTokens": 499,
      "costEstimateMicros": 4870,
      "purpose": "feeding_plan_draft"
    },
    {
      "id": 43,
      "day": "2026-09-05",
      "provider": "zai",
      "model": "glm-5.3-flash",
      "promptTokens": 3583,
      "completionTokens": 600,
      "costEstimateMicros": 6583,
      "purpose": "plan_review"
    },
    {
      "id": 44,
      "day": "2026-09-05",
      "provider": "zai",
      "model": "glm-5.3-flash",
      "promptTokens": 3568,
      "completionTokens": 600,
      "costEstimateMicros": 6568,
      "purpose": "plan_review"
    },
    {
      "id": 45,
      "day": "2026-09-05",
      "provider": "zai",
      "model": "glm-5.3-flash",
      "promptTokens": 0,
      "completionTokens": 310,
      "costEstimateMicros": 1550,
      "purpose": "coach"
    },
    {
      "id": 46,
      "day": "2026-10-04",
      "provider": "zai",
      "model": "glm-5.3-flash",
      "promptTokens": 3748,
      "completionTokens": 600,
      "costEstimateMicros": 6748,
      "purpose": "plan_review"
    },
    {
      "id": 47,
      "day": "2026-10-04",
      "provider": "zai",
      "model": "glm-5.3-flash",
      "promptTokens": 3801,
      "completionTokens": 600,
      "costEstimateMicros": 6801,
      "purpose": "plan_review"
    }
  ]
}