@jjlmoya/utils-aquarium 1.57.0 → 1.58.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/category/index.ts +2 -1
- package/src/entries.ts +4 -1
- package/src/index.ts +2 -0
- package/src/layouts/PreviewLayout.astro +14 -1
- package/src/tests/i18n_coverage.test.ts +3 -1
- package/src/tests/tool_validation.test.ts +7 -4
- package/src/tool/aquariumFilterTurnoverStockingPlanner/aquarium-filter-turnover-stocking-planner.css +404 -0
- package/src/tool/aquariumFilterTurnoverStockingPlanner/bibliography.astro +7 -0
- package/src/tool/aquariumFilterTurnoverStockingPlanner/bibliography.ts +16 -0
- package/src/tool/aquariumFilterTurnoverStockingPlanner/component.astro +140 -0
- package/src/tool/aquariumFilterTurnoverStockingPlanner/content-builder.ts +43 -0
- package/src/tool/aquariumFilterTurnoverStockingPlanner/controller.ts +94 -0
- package/src/tool/aquariumFilterTurnoverStockingPlanner/dom-views.ts +63 -0
- package/src/tool/aquariumFilterTurnoverStockingPlanner/entry.ts +27 -0
- package/src/tool/aquariumFilterTurnoverStockingPlanner/evaluator.ts +17 -0
- package/src/tool/aquariumFilterTurnoverStockingPlanner/i18n/de.ts +48 -0
- package/src/tool/aquariumFilterTurnoverStockingPlanner/i18n/en.ts +124 -0
- package/src/tool/aquariumFilterTurnoverStockingPlanner/i18n/es.ts +41 -0
- package/src/tool/aquariumFilterTurnoverStockingPlanner/i18n/fr.ts +36 -0
- package/src/tool/aquariumFilterTurnoverStockingPlanner/i18n/id.ts +36 -0
- package/src/tool/aquariumFilterTurnoverStockingPlanner/i18n/it.ts +36 -0
- package/src/tool/aquariumFilterTurnoverStockingPlanner/i18n/ja.ts +36 -0
- package/src/tool/aquariumFilterTurnoverStockingPlanner/i18n/ko.ts +36 -0
- package/src/tool/aquariumFilterTurnoverStockingPlanner/i18n/nl.ts +36 -0
- package/src/tool/aquariumFilterTurnoverStockingPlanner/i18n/pl.ts +36 -0
- package/src/tool/aquariumFilterTurnoverStockingPlanner/i18n/pt.ts +36 -0
- package/src/tool/aquariumFilterTurnoverStockingPlanner/i18n/ru.ts +36 -0
- package/src/tool/aquariumFilterTurnoverStockingPlanner/i18n/sv.ts +36 -0
- package/src/tool/aquariumFilterTurnoverStockingPlanner/i18n/tr.ts +36 -0
- package/src/tool/aquariumFilterTurnoverStockingPlanner/i18n/zh.ts +36 -0
- package/src/tool/aquariumFilterTurnoverStockingPlanner/index.ts +11 -0
- package/src/tool/aquariumFilterTurnoverStockingPlanner/logic.test.ts +78 -0
- package/src/tool/aquariumFilterTurnoverStockingPlanner/logic.ts +99 -0
- package/src/tool/aquariumFilterTurnoverStockingPlanner/seo.astro +14 -0
- package/src/tool/aquariumFilterTurnoverStockingPlanner/storage.ts +21 -0
- package/src/tool/aquariumFilterTurnoverStockingPlanner/ui.ts +40 -0
- package/src/tools.ts +6 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
|
+
import type { SEOSection } from '@jjlmoya/utils-shared';
|
|
3
|
+
import type { AquariumFilterTurnoverStockingPlannerLocaleContent } from './entry';
|
|
4
|
+
import type { FAQItem, HowToStep } from '../../types';
|
|
5
|
+
import type { AquariumFilterTurnoverStockingPlannerUI } from './ui';
|
|
6
|
+
import { bibliography } from './bibliography';
|
|
7
|
+
|
|
8
|
+
export interface LocalizedPlannerCopy {
|
|
9
|
+
slug: string;
|
|
10
|
+
title: string;
|
|
11
|
+
description: string;
|
|
12
|
+
ui: AquariumFilterTurnoverStockingPlannerUI;
|
|
13
|
+
seo: SEOSection[];
|
|
14
|
+
faq: FAQItem[];
|
|
15
|
+
howTo: HowToStep[];
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function buildPlannerContent(copy: LocalizedPlannerCopy): AquariumFilterTurnoverStockingPlannerLocaleContent {
|
|
19
|
+
const softwareApplicationSchema: WithContext<SoftwareApplication> = {
|
|
20
|
+
'@context': 'https://schema.org',
|
|
21
|
+
'@type': 'SoftwareApplication',
|
|
22
|
+
name: copy.title,
|
|
23
|
+
applicationCategory: 'UtilitiesApplication',
|
|
24
|
+
operatingSystem: 'Web',
|
|
25
|
+
description: copy.description,
|
|
26
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
30
|
+
'@context': 'https://schema.org',
|
|
31
|
+
'@type': 'FAQPage',
|
|
32
|
+
mainEntity: copy.faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })),
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const howToSchema: WithContext<HowTo> = {
|
|
36
|
+
'@context': 'https://schema.org',
|
|
37
|
+
'@type': 'HowTo',
|
|
38
|
+
name: copy.title,
|
|
39
|
+
step: copy.howTo.map((step) => ({ '@type': 'HowToStep', name: step.name, text: step.text })),
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
return { ...copy, bibliography, schemas: [softwareApplicationSchema, faqSchema, howToSchema] };
|
|
43
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { calculatePlanner, type AquariumPlannerInput, type AquariumSetup } from './logic';
|
|
2
|
+
import { renderPlannerResult } from './dom-views';
|
|
3
|
+
import { loadPlannerState, savePlannerState } from './storage';
|
|
4
|
+
import type { AquariumFilterTurnoverStockingPlannerUI } from './ui';
|
|
5
|
+
|
|
6
|
+
const DEFAULT_STATE: AquariumPlannerInput = {
|
|
7
|
+
tankVolumeLiters: 100,
|
|
8
|
+
ratedFlowLitersPerHour: 600,
|
|
9
|
+
flowLossPercent: 25,
|
|
10
|
+
fishCount: 10,
|
|
11
|
+
averageAdultLengthCm: 5,
|
|
12
|
+
setup: 'community',
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
function input(root: HTMLElement, name: string): HTMLInputElement | null {
|
|
16
|
+
return root.querySelector<HTMLInputElement>(`[name="${name}"]`);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function readState(root: HTMLElement): AquariumPlannerInput {
|
|
20
|
+
const setup = root.querySelector<HTMLButtonElement>('[data-setup].is-active')?.dataset.setup;
|
|
21
|
+
return {
|
|
22
|
+
tankVolumeLiters: Number(input(root, 'tankVolumeLiters')?.value),
|
|
23
|
+
ratedFlowLitersPerHour: Number(input(root, 'ratedFlowLitersPerHour')?.value),
|
|
24
|
+
flowLossPercent: Number(input(root, 'flowLossPercent')?.value),
|
|
25
|
+
fishCount: Number(input(root, 'fishCount')?.value),
|
|
26
|
+
averageAdultLengthCm: Number(input(root, 'averageAdultLengthCm')?.value),
|
|
27
|
+
setup: (setup ?? 'community') as AquariumSetup,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function setValue(root: HTMLElement, name: string, value: number): void {
|
|
32
|
+
const element = input(root, name);
|
|
33
|
+
if (element) element.value = String(value);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function activateSetup(root: HTMLElement, setup: AquariumSetup): void {
|
|
37
|
+
root.querySelectorAll<HTMLButtonElement>('[data-setup]').forEach((button) => {
|
|
38
|
+
const active = button.dataset.setup === setup;
|
|
39
|
+
button.classList.toggle('is-active', active);
|
|
40
|
+
button.setAttribute('aria-pressed', String(active));
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function applyState(root: HTMLElement, state: AquariumPlannerInput): void {
|
|
45
|
+
setValue(root, 'tankVolumeLiters', state.tankVolumeLiters);
|
|
46
|
+
setValue(root, 'ratedFlowLitersPerHour', state.ratedFlowLitersPerHour);
|
|
47
|
+
setValue(root, 'flowLossPercent', state.flowLossPercent);
|
|
48
|
+
setValue(root, 'fishCount', state.fishCount);
|
|
49
|
+
setValue(root, 'averageAdultLengthCm', state.averageAdultLengthCm);
|
|
50
|
+
activateSetup(root, state.setup);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function updateRangeLabel(root: HTMLElement): void {
|
|
54
|
+
const range = input(root, 'flowLossPercent');
|
|
55
|
+
const output = root.querySelector<HTMLOutputElement>('#aquarium-filter-flow-loss-value');
|
|
56
|
+
if (range && output) output.value = `${range.value}%`;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function bindPresets(root: HTMLElement, update: () => void): void {
|
|
60
|
+
root.querySelectorAll<HTMLButtonElement>('[data-preset]').forEach((button) => {
|
|
61
|
+
button.addEventListener('click', () => {
|
|
62
|
+
const preset = button.dataset.preset;
|
|
63
|
+
if (preset === 'community') applyState(root, DEFAULT_STATE);
|
|
64
|
+
if (preset === 'planted') applyState(root, { ...DEFAULT_STATE, flowLossPercent: 20, setup: 'planted' });
|
|
65
|
+
if (preset === 'highWaste') applyState(root, { ...DEFAULT_STATE, ratedFlowLitersPerHour: 900, fishCount: 14, setup: 'highWaste' });
|
|
66
|
+
update();
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function bindSetup(root: HTMLElement, update: () => void): void {
|
|
72
|
+
root.querySelectorAll<HTMLButtonElement>('[data-setup]').forEach((button) => {
|
|
73
|
+
button.addEventListener('click', () => {
|
|
74
|
+
activateSetup(root, (button.dataset.setup ?? 'community') as AquariumSetup);
|
|
75
|
+
update();
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export function initPlanner(root: HTMLElement, ui: AquariumFilterTurnoverStockingPlannerUI): void {
|
|
81
|
+
const saved = loadPlannerState();
|
|
82
|
+
applyState(root, saved ?? DEFAULT_STATE);
|
|
83
|
+
const update = (): void => {
|
|
84
|
+
const state = readState(root);
|
|
85
|
+
updateRangeLabel(root);
|
|
86
|
+
const result = calculatePlanner(state);
|
|
87
|
+
renderPlannerResult(root, result, ui);
|
|
88
|
+
savePlannerState(state);
|
|
89
|
+
};
|
|
90
|
+
root.querySelectorAll<HTMLInputElement>('input').forEach((element) => element.addEventListener('input', update));
|
|
91
|
+
bindPresets(root, update);
|
|
92
|
+
bindSetup(root, update);
|
|
93
|
+
update();
|
|
94
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { AquariumPlannerResult } from './logic';
|
|
2
|
+
import { evaluatePlanner } from './evaluator';
|
|
3
|
+
import type { AquariumFilterTurnoverStockingPlannerUI } from './ui';
|
|
4
|
+
|
|
5
|
+
function getElement(root: HTMLElement, id: string): HTMLElement | null {
|
|
6
|
+
return root.querySelector<HTMLElement>(`#${id}`);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function format(value: number, digits = 1): string {
|
|
10
|
+
return new Intl.NumberFormat('en-US', { maximumFractionDigits: digits }).format(value);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function setText(root: HTMLElement, id: string, value: string): void {
|
|
14
|
+
const element = getElement(root, id);
|
|
15
|
+
if (element) element.textContent = value;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function updateGauge(root: HTMLElement, result: AquariumPlannerResult): void {
|
|
19
|
+
const progress = getElement(root, 'aquarium-filter-turnover-progress');
|
|
20
|
+
if (!progress) return;
|
|
21
|
+
const span = Math.min(100, Math.max(4, (result.effectiveTurnover / Math.max(result.targetMaxTurnover * 1.5, 1)) * 100));
|
|
22
|
+
progress.style.setProperty('--n-progress', `${span}%`);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function updateCurrent(root: HTMLElement, result: AquariumPlannerResult): void {
|
|
26
|
+
const current = getElement(root, 'aquarium-filter-current-ribbon');
|
|
27
|
+
if (!current) return;
|
|
28
|
+
const intensity = Math.min(1, Math.max(0.12, result.effectiveTurnover / 12));
|
|
29
|
+
current.style.setProperty('--n-current', intensity.toFixed(2));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function statusText(result: AquariumPlannerResult, ui: AquariumFilterTurnoverStockingPlannerUI): string {
|
|
33
|
+
if (result.turnoverStatus === 'under') return ui.statusUnder;
|
|
34
|
+
if (result.turnoverStatus === 'high') return ui.statusHigh;
|
|
35
|
+
return ui.statusTarget;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function loadText(result: AquariumPlannerResult, ui: AquariumFilterTurnoverStockingPlannerUI): string {
|
|
39
|
+
if (result.stockingLoad === 'heavy') return ui.loadHeavy;
|
|
40
|
+
if (result.stockingLoad === 'moderate') return ui.loadModerate;
|
|
41
|
+
return ui.loadLight;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function signalText(result: AquariumPlannerResult, ui: AquariumFilterTurnoverStockingPlannerUI): string {
|
|
45
|
+
if (result.turnoverStatus === 'under') return `${ui.bandSignalBelow} ${format(result.flowGapLitersPerHour)} ${ui.metricLiters}/${ui.metricPerHour}`;
|
|
46
|
+
if (result.turnoverStatus === 'high') return `${ui.bandSignalAbove} ${format(result.flowAboveTargetLitersPerHour)} ${ui.metricLiters}/${ui.metricPerHour}`;
|
|
47
|
+
return ui.bandSignalInside;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function renderPlannerResult(root: HTMLElement, result: AquariumPlannerResult, ui: AquariumFilterTurnoverStockingPlannerUI): void {
|
|
51
|
+
const evaluation = evaluatePlanner(result);
|
|
52
|
+
root.dataset.status = evaluation.status;
|
|
53
|
+
root.dataset.load = evaluation.load;
|
|
54
|
+
setText(root, 'aquarium-filter-effective-turnover', `${format(result.effectiveTurnover)}×`);
|
|
55
|
+
setText(root, 'aquarium-filter-status', statusText(result, ui));
|
|
56
|
+
setText(root, 'aquarium-filter-target', `${format(result.targetMinTurnover)} to ${format(result.targetMaxTurnover)}×`);
|
|
57
|
+
setText(root, 'aquarium-filter-effective-flow', `${format(result.effectiveFlowLitersPerHour)} ${ui.metricLiters}/${ui.metricPerHour}`);
|
|
58
|
+
setText(root, 'aquarium-filter-stock-proxy', `${format(result.stockingProxyCmPerLiter, 2)} ${ui.metricCentimetersPerLiter}`);
|
|
59
|
+
setText(root, 'aquarium-filter-load-badge', loadText(result, ui));
|
|
60
|
+
setText(root, 'aquarium-filter-gap', signalText(result, ui));
|
|
61
|
+
updateGauge(root, result);
|
|
62
|
+
updateCurrent(root, result);
|
|
63
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { AquariumToolEntry, ToolLocaleContent } from '../../types';
|
|
2
|
+
import type { AquariumFilterTurnoverStockingPlannerUI } from './ui';
|
|
3
|
+
|
|
4
|
+
export type { AquariumFilterTurnoverStockingPlannerUI };
|
|
5
|
+
export type AquariumFilterTurnoverStockingPlannerLocaleContent = ToolLocaleContent<AquariumFilterTurnoverStockingPlannerUI>;
|
|
6
|
+
|
|
7
|
+
export const aquariumFilterTurnoverStockingPlanner: AquariumToolEntry<AquariumFilterTurnoverStockingPlannerUI> = {
|
|
8
|
+
id: 'aquarium-filter-turnover-stocking-planner',
|
|
9
|
+
icons: { bg: 'mdi:filter-variant', fg: 'mdi:water-sync' },
|
|
10
|
+
i18n: {
|
|
11
|
+
de: () => import('./i18n/de').then((m) => m.content),
|
|
12
|
+
en: () => import('./i18n/en').then((m) => m.content),
|
|
13
|
+
es: () => import('./i18n/es').then((m) => m.content),
|
|
14
|
+
fr: () => import('./i18n/fr').then((m) => m.content),
|
|
15
|
+
id: () => import('./i18n/id').then((m) => m.content),
|
|
16
|
+
it: () => import('./i18n/it').then((m) => m.content),
|
|
17
|
+
ja: () => import('./i18n/ja').then((m) => m.content),
|
|
18
|
+
ko: () => import('./i18n/ko').then((m) => m.content),
|
|
19
|
+
nl: () => import('./i18n/nl').then((m) => m.content),
|
|
20
|
+
pl: () => import('./i18n/pl').then((m) => m.content),
|
|
21
|
+
pt: () => import('./i18n/pt').then((m) => m.content),
|
|
22
|
+
ru: () => import('./i18n/ru').then((m) => m.content),
|
|
23
|
+
sv: () => import('./i18n/sv').then((m) => m.content),
|
|
24
|
+
tr: () => import('./i18n/tr').then((m) => m.content),
|
|
25
|
+
zh: () => import('./i18n/zh').then((m) => m.content),
|
|
26
|
+
},
|
|
27
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AquariumPlannerResult, StockingLoad, TurnoverStatus } from './logic';
|
|
2
|
+
|
|
3
|
+
export interface PlannerEvaluation {
|
|
4
|
+
status: TurnoverStatus;
|
|
5
|
+
load: StockingLoad;
|
|
6
|
+
action: 'increase-flow' | 'review-species-flow' | 'check-water';
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function evaluatePlanner(result: AquariumPlannerResult): PlannerEvaluation {
|
|
10
|
+
if (result.turnoverStatus === 'under') {
|
|
11
|
+
return { status: 'under', load: result.stockingLoad, action: 'increase-flow' };
|
|
12
|
+
}
|
|
13
|
+
if (result.turnoverStatus === 'high') {
|
|
14
|
+
return { status: 'high', load: result.stockingLoad, action: 'review-species-flow' };
|
|
15
|
+
}
|
|
16
|
+
return { status: 'target', load: result.stockingLoad, action: 'check-water' };
|
|
17
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { buildPlannerContent } from '../content-builder';
|
|
2
|
+
|
|
3
|
+
export const content = buildPlannerContent({
|
|
4
|
+
slug: 'aquarium-filter-umwaelzung-besatz-planung',
|
|
5
|
+
title: 'Planer für Filterumwälzung und Fischbesatz im Aquarium',
|
|
6
|
+
description: 'Schätze die tatsächliche Filterumwälzung nach Durchflussverlusten und prüfe, wie Volumen, Einrichtung und ausgewachsene Fische die Planung verändern.',
|
|
7
|
+
ui: {
|
|
8
|
+
presetsLabel: 'Mit einem Beispiel starten', presetCommunity: 'Gesellschaftsbecken', presetPlanted: 'Pflanzenbecken', presetHighWaste: 'Hohe Abfalllast',
|
|
9
|
+
tankVolumeLabel: 'Beckenvolumen in Litern', tankVolumeHint: 'Verwende das nutzbare Wasservolumen, wenn du es kennst.',
|
|
10
|
+
ratedFlowLabel: 'Nennleistung des Filters in Litern pro Stunde', ratedFlowHint: 'Verwende die Angabe der Pumpe oder des Filters.',
|
|
11
|
+
flowLossLabel: 'Geschätzter Durchflussverlust', flowLossHint: 'Berücksichtige Förderhöhe, Schläuche, Bögen und Filtermedien.',
|
|
12
|
+
fishCountLabel: 'Anzahl ausgewachsener Fische', averageLengthLabel: 'Durchschnittliche Länge ausgewachsener Fische in Zentimetern',
|
|
13
|
+
setupLabel: 'Beckenprofil', setupCommunity: 'Gesellschaftsbecken', setupPlanted: 'Pflanzenbecken', setupHighWaste: 'Hohe Abfalllast',
|
|
14
|
+
resultEyebrow: 'Effektive Filterumwälzung', effectiveTurnoverLabel: 'Effektive Umwälzung', targetLabel: 'Planungsbereich', effectiveFlowLabel: 'Durchfluss nach Verlust', stockingProxyLabel: 'Besatzindex',
|
|
15
|
+
currentTitle: 'Dem Strömungsverlauf folgen', currentDescription: 'Ein Strömungsverlauf verlässt den Filter, durchquert das Becken und kehrt zum Ansaugpunkt zurück. Seine Geschwindigkeit reagiert auf die effektive Umwälzung.',
|
|
16
|
+
statusUnder: 'Unter dem Bereich', statusTarget: 'Im Bereich', statusHigh: 'Über dem Bereich', loadLight: 'Leichter Besatzindex', loadModerate: 'Mittlerer Besatzindex', loadHeavy: 'Hoher Besatzindex',
|
|
17
|
+
cautionTitle: 'Der Wassertest ist die letzte Prüfung', bandSignalInside: 'Im Planungsbereich', bandSignalBelow: 'Unter dem Bereich um', bandSignalAbove: 'Über dem Bereich um',
|
|
18
|
+
maintenanceText: 'Wenn der Verlust hoch geschätzt wird, prüfe Ansaugung, Schläuche und Medien, bevor du einen größeren Filter auswählst.',
|
|
19
|
+
useTestKits: 'Die Umwälzung misst nicht die biologische Kapazität. Prüfe Ammonium, Nitrit und Nitrat und passe die Strömung an die Bedürfnisse jeder Art an.',
|
|
20
|
+
metricLiters: 'l', metricPerHour: 'pro Stunde', metricCentimetersPerLiter: 'cm/l',
|
|
21
|
+
},
|
|
22
|
+
seo: [
|
|
23
|
+
{ type: 'title', level: 2, text: 'Plane mit effektivem Durchfluss, nicht nur mit dem Pumpenetikett' },
|
|
24
|
+
{ type: 'paragraph', html: 'Die Filterumwälzung ist das Verhältnis von Wasserdurchfluss zu Beckenvolumen. Ein Filter mit 600 Litern pro Stunde an einem 100 Liter Becken entspricht vor Verlusten 6 Umwälzungen pro Stunde. Bei 25 Prozent Verlust durch Förderhöhe, Schläuche und Medien bleiben schätzungsweise 450 Liter pro Stunde und 4,5 Umwälzungen.' },
|
|
25
|
+
{ type: 'title', level: 2, text: 'So liest du den Planungsbereich' },
|
|
26
|
+
{ type: 'table', headers: ['Beckenprofil', 'Planungsbereich', 'Bedeutung'], rows: [['Gesellschaftsbecken', '4 bis 6 Mal pro Stunde', 'Ein moderater Ausgangspunkt für die Strömung'], ['Pflanzenbecken', '3 bis 5 Mal pro Stunde', 'Ein sanfterer Ausgangspunkt für bepflanzte Becken'], ['Hohe Abfalllast', '6 bis 10 Mal pro Stunde', 'Ein stärkeres Signal für höhere Abfallmengen']] },
|
|
27
|
+
{ type: 'paragraph', html: 'Diese Bereiche sind Heuristiken des Planers und keine universellen Aquarienregeln. Arten unterscheiden sich bei Schwimmverhalten und Strömungsverträglichkeit. Eine hohe Zahl beweist weder eine ausgereifte biologische Filterung noch einen sicheren Besatz.' },
|
|
28
|
+
{ type: 'title', level: 2, text: 'Warum der Durchflussverlust ein eigenes Feld verdient' },
|
|
29
|
+
{ type: 'paragraph', html: 'Die Zahl auf einem Filter kann unter festgelegten Bedingungen gemessen worden sein. Förderhöhe, Schlauchführung, verschmutzte Schwämme, verstopfte Ansaugkörbe und dicht gepackte Medien verändern den Durchfluss, der tatsächlich ins Becken zurückkehrt. Miss den Auslauf, wenn möglich, oder mache deine Annahme sichtbar und überprüfe sie nach der Wartung.' },
|
|
30
|
+
{ type: 'title', level: 2, text: 'Behandle den Besatzwert als Warnsignal' },
|
|
31
|
+
{ type: 'paragraph', html: 'Der Besatzindex ist einfach die Anzahl ausgewachsener Fische multipliziert mit ihrer durchschnittlichen Länge und geteilt durch die Literzahl. Er ist leicht nachzuvollziehen, aber bewusst unvollständig. Körperform, Aktivität, Revierverhalten, Futtermenge, Sauerstoffbedarf, Verträglichkeit und der Platz von Dekor und Bodengrund fehlen.' },
|
|
32
|
+
{ type: 'tip', title: 'Nutze die Wasserwerte für die Entscheidung', html: 'Teste Ammonium und Nitrit regelmäßig, besonders nach dem Einsetzen von Fischen oder mehr Futter. Sind die Werte nicht stabil, macht eine veränderte Umwälzung das Aquarium nicht bereit für weiteren Besatz.' },
|
|
33
|
+
{ type: 'diagnostic', variant: 'warning', title: 'Mache aus dem Ergebnis keine Besatzgarantie', badge: 'Grenze', html: 'Artgerechte Pflege, ausgewachsene Größe, Verhalten, Wasserwerte und Filterreife können dieses Planungsergebnis überstimmen. Bei ungewöhnlichen Arten oder Becken hilft fachkundige Beratung.' },
|
|
34
|
+
],
|
|
35
|
+
faq: [
|
|
36
|
+
{ question: 'Was bedeutet Filterumwälzung?', answer: 'Die Umwälzung schätzt, wie oft der Filter das Beckenvolumen in einer Stunde bewegt. Dieser Planer verwendet den Durchfluss nach einem geschätzten Verlust und nicht nur die Pumpenleistung.' },
|
|
37
|
+
{ question: 'Warum entspricht die Nennleistung nicht dem echten Durchfluss?', answer: 'Herstellerwerte können unter bestimmten Bedingungen gemessen werden. Förderhöhe, Schlauchlänge, Bögen, verstopfte Medien und verschmutzte Schwämme können den Rücklauf ins Aquarium verringern.' },
|
|
38
|
+
{ question: 'Sagt mir das Tool, wie viele Fische ich halten kann?', answer: 'Nein. Die Fischfelder bilden einen transparenten Besatzindex aus ausgewachsener Länge pro Liter. Art, Verhalten, Größe, Verträglichkeit, Fütterung, Wasserqualität und Filterreife müssen zusätzlich geprüft werden.' },
|
|
39
|
+
{ question: 'Was mache ich bei einem Wert unter dem Planungsbereich?', answer: 'Prüfe verstopfte Medien, geknickte Schläuche und eine zu große Förderhöhe und miss den Auslauf, wenn möglich. Setze nicht mehr Fische als Ausgleich ein und prüfe Ammonium, Nitrit und Nitrat.' },
|
|
40
|
+
{ question: 'Ist eine höhere Umwälzung immer besser?', answer: 'Nein. Starke Strömung kann für Arten oder Pflanzen ungeeignet sein, die ruhigeres Wasser bevorzugen. Vergleiche den Planungsbereich immer mit den Pflegeangaben der jeweiligen Art.' },
|
|
41
|
+
],
|
|
42
|
+
howTo: [
|
|
43
|
+
{ name: 'Gib das Beckenvolumen ein', text: 'Verwende das Wasservolumen, auf das du dich beziehen möchtest, möglichst das nutzbare Volumen statt der Außenmaße.' },
|
|
44
|
+
{ name: 'Füge die Filterleistung hinzu', text: 'Gib die Herstellerleistung in Litern pro Stunde ein und schätze anschließend die Verluste durch Schläuche, Höhe und Medien.' },
|
|
45
|
+
{ name: 'Beschreibe den Besatz', text: 'Gib Fischanzahl und durchschnittliche ausgewachsene Länge ein. Das Tool berechnet daraus einen cm pro Liter Index und keine Besatzgarantie.' },
|
|
46
|
+
{ name: 'Lies den Strömungsverlauf', text: 'Vergleiche die effektive Umwälzung mit dem Beckenprofil und beachte Warnung und Wassertest, bevor du Technik oder Besatz änderst.' },
|
|
47
|
+
],
|
|
48
|
+
});
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
|
+
import type { AquariumFilterTurnoverStockingPlannerLocaleContent } from '../entry';
|
|
3
|
+
|
|
4
|
+
const faq = [
|
|
5
|
+
{
|
|
6
|
+
question: 'What does filter turnover mean?',
|
|
7
|
+
answer: 'Turnover is the estimated number of times the filter moves the tank volume in one hour. This planner uses the flow after an estimated loss, not only the pump rating.',
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
question: 'Why is rated filter flow not the same as real flow?',
|
|
11
|
+
answer: 'Manufacturer flow figures can be measured under specified conditions. Head height, hose length, bends, blocked media and dirty sponges can reduce the flow that reaches the aquarium.',
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
question: 'Does this tell me how many fish I can keep?',
|
|
15
|
+
answer: 'No. The fish fields create a transparent stocking load proxy based on adult length per litre. Species behaviour, adult size, compatibility, feeding, water quality and filtration maturity still need separate research.',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
question: 'What should I do if the result is under the target band?',
|
|
19
|
+
answer: 'Check for blocked media, kinked hoses and excessive head height, then measure the outlet if possible. Do not add fish to compensate for a low number, and check ammonia, nitrite and nitrate.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'Is a higher turnover always better?',
|
|
23
|
+
answer: 'No. Strong circulation can be unsuitable for species or plants that prefer gentler water. Treat the band as a planning heuristic and compare it with species specific care guidance.',
|
|
24
|
+
},
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
const howTo = [
|
|
28
|
+
{ name: 'Enter the tank volume', text: 'Use the water volume you want to plan around, ideally the usable volume rather than the outside glass dimensions.' },
|
|
29
|
+
{ name: 'Add the filter rating', text: 'Enter the manufacturer flow rating in litres per hour, then estimate the reduction caused by hoses, height and media.' },
|
|
30
|
+
{ name: 'Describe the stocking load', text: 'Enter the number of fish and their average adult length. The tool turns this into a cm per litre proxy, not a stocking guarantee.' },
|
|
31
|
+
{ name: 'Read the current trace', text: 'Compare effective turnover with the setup band, then use the warning and water test guidance before changing equipment or livestock.' },
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
const ui = {
|
|
35
|
+
presetsLabel: 'Start with a setup',
|
|
36
|
+
presetCommunity: 'Community example',
|
|
37
|
+
presetPlanted: 'Planted example',
|
|
38
|
+
presetHighWaste: 'High waste example',
|
|
39
|
+
tankVolumeLabel: 'Tank volume in litres',
|
|
40
|
+
tankVolumeHint: 'Use usable water volume when you know it.',
|
|
41
|
+
ratedFlowLabel: 'Filter rated flow in litres per hour',
|
|
42
|
+
ratedFlowHint: 'Use the pump or filter specification.',
|
|
43
|
+
flowLossLabel: 'Estimated flow loss',
|
|
44
|
+
flowLossHint: 'Allow for lift, hoses, bends and media resistance.',
|
|
45
|
+
fishCountLabel: 'Fish count at adult size',
|
|
46
|
+
averageLengthLabel: 'Average adult length in centimetres',
|
|
47
|
+
setupLabel: 'Setup profile',
|
|
48
|
+
setupCommunity: 'Community',
|
|
49
|
+
setupPlanted: 'Planted',
|
|
50
|
+
setupHighWaste: 'High waste',
|
|
51
|
+
resultEyebrow: 'Effective filter turnover',
|
|
52
|
+
effectiveTurnoverLabel: 'Effective turnover',
|
|
53
|
+
targetLabel: 'Planning band',
|
|
54
|
+
effectiveFlowLabel: 'Flow after loss',
|
|
55
|
+
stockingProxyLabel: 'Stocking load proxy',
|
|
56
|
+
currentTitle: 'Follow the current trace',
|
|
57
|
+
currentDescription: 'A current trace leaves the filter, crosses the tank and returns to the intake. Its speed responds to effective turnover.',
|
|
58
|
+
statusUnder: 'Below band',
|
|
59
|
+
statusTarget: 'Inside band',
|
|
60
|
+
statusHigh: 'Above band',
|
|
61
|
+
loadLight: 'Light load proxy',
|
|
62
|
+
loadModerate: 'Moderate load proxy',
|
|
63
|
+
loadHeavy: 'Heavy load proxy',
|
|
64
|
+
cautionTitle: 'The water test is the final check',
|
|
65
|
+
bandSignalInside: 'Inside the planning band',
|
|
66
|
+
bandSignalBelow: 'Below band by',
|
|
67
|
+
bandSignalAbove: 'Above band by',
|
|
68
|
+
maintenanceText: 'If the loss estimate is high, inspect the intake, hoses and media before choosing a larger filter.',
|
|
69
|
+
useTestKits: 'Turnover does not measure biological capacity. Check ammonia, nitrite and nitrate, and match flow to the needs of every species.',
|
|
70
|
+
metricLiters: 'L',
|
|
71
|
+
metricPerHour: 'per hour',
|
|
72
|
+
metricCentimetersPerLiter: 'cm/L',
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const softwareApplicationSchema: WithContext<SoftwareApplication> = {
|
|
76
|
+
'@context': 'https://schema.org',
|
|
77
|
+
'@type': 'SoftwareApplication',
|
|
78
|
+
name: 'Aquarium Filter Turnover and Stocking Planner',
|
|
79
|
+
applicationCategory: 'UtilitiesApplication',
|
|
80
|
+
operatingSystem: 'Web',
|
|
81
|
+
description: 'Estimate effective aquarium filter turnover after flow losses and inspect a transparent stocking load proxy.',
|
|
82
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
86
|
+
'@context': 'https://schema.org',
|
|
87
|
+
'@type': 'FAQPage',
|
|
88
|
+
mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })),
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
const howToSchema: WithContext<HowTo> = {
|
|
92
|
+
'@context': 'https://schema.org',
|
|
93
|
+
'@type': 'HowTo',
|
|
94
|
+
name: 'Plan aquarium filter turnover',
|
|
95
|
+
step: howTo.map((step) => ({ '@type': 'HowToStep', name: step.name, text: step.text })),
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
export const content: AquariumFilterTurnoverStockingPlannerLocaleContent = {
|
|
99
|
+
slug: 'aquarium-filter-turnover-stocking-planner',
|
|
100
|
+
title: 'Aquarium Filter Turnover and Stocking Planner',
|
|
101
|
+
description: 'Estimate real aquarium filter turnover after flow losses and inspect how tank volume, setup and adult fish load change the planning picture.',
|
|
102
|
+
ui,
|
|
103
|
+
seo: [
|
|
104
|
+
{ type: 'title', level: 2, text: 'Plan with effective flow, not only the pump label' },
|
|
105
|
+
{ type: 'paragraph', html: 'Filter turnover is the ratio between water flow and tank volume. A filter rated at 600 litres per hour on a 100 litre tank suggests 6 turnovers per hour before losses. If the setup loses 25 percent to lift, hoses and media, the working estimate becomes 450 litres per hour and 4.5 turnovers.' },
|
|
106
|
+
{ type: 'title', level: 2, text: 'How to read the planning band' },
|
|
107
|
+
{ type: 'table', headers: ['Setup profile', 'Planning band', 'What it represents'], rows: [['Community', '4 to 6 times per hour', 'A moderate circulation starting point'], ['Planted', '3 to 5 times per hour', 'A gentler starting point for planted displays'], ['High waste', '6 to 10 times per hour', 'A stronger circulation planning signal for heavier waste loads']] },
|
|
108
|
+
{ type: 'paragraph', html: 'These bands are heuristics built into the planner, not universal aquarium rules. Species differ in swimming behaviour and flow tolerance, and a high turnover number cannot prove that biological filtration is mature or that stocking is safe.' },
|
|
109
|
+
{ type: 'title', level: 2, text: 'Why flow loss deserves its own input' },
|
|
110
|
+
{ type: 'paragraph', html: 'The number printed on a filter can be measured under defined conditions. Head height, hose routing, dirty sponges, blocked intake screens and packed media all change the water that actually returns to the tank. Use a measured outlet flow when you have one; otherwise, make the loss assumption visible and revisit it after maintenance.' },
|
|
111
|
+
{ type: 'title', level: 2, text: 'Treat the stocking figure as a warning signal' },
|
|
112
|
+
{ type: 'paragraph', html: 'The stocking load proxy is simply adult fish count multiplied by average adult length, divided by tank litres. It is intentionally easy to audit and intentionally incomplete. It does not account for species shape, activity, territory, feeding rate, oxygen demand, compatibility or the displacement of decor and substrate.' },
|
|
113
|
+
{ type: 'tip', title: 'Use water chemistry to decide', html: 'Test ammonia and nitrite regularly, especially after adding fish or increasing feeding. If the chemistry is not stable, changing the turnover estimate does not make the aquarium ready for more livestock.' },
|
|
114
|
+
{ type: 'diagnostic', variant: 'warning', title: 'Do not turn the result into a stocking guarantee', badge: 'Limit', html: 'Species specific care, adult size, behaviour, water parameters and filter maturity can override this planning result. Ask an experienced aquatic professional when the setup or species is unusual.' },
|
|
115
|
+
],
|
|
116
|
+
faq,
|
|
117
|
+
bibliography: [
|
|
118
|
+
{ name: 'Fluval, 06 Series Filter Manual: turnover rates and flow rates', url: 'https://fluvalaquatics.com/manuals/Fluval_A202-A207-A212-A217_06-Filter-Series_Manual_NA.pdf' },
|
|
119
|
+
{ name: 'OATA, How to set up and look after a freshwater tank or aquarium', url: 'https://ornamentalfish.org/what-we-do/advice-information/care-sheets/caresheets-tropical-freshwater-fish/how-to-set-up-and-look-after-a-freshwater-tank-aquarium/' },
|
|
120
|
+
{ name: 'Deutscher Tierschutzbund, Die Haltung von Aquarienfischen', url: 'https://www.tierschutzbund.de/fileadmin/Seiten/tierschutzbund.de/Downloads/Broschueren/Broschuere_Aquarienfische_Haltung.pdf' },
|
|
121
|
+
],
|
|
122
|
+
howTo,
|
|
123
|
+
schemas: [softwareApplicationSchema, faqSchema, howToSchema],
|
|
124
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { buildPlannerContent } from '../content-builder';
|
|
2
|
+
|
|
3
|
+
export const content = buildPlannerContent({
|
|
4
|
+
slug: 'planificador-filtracion-rotacion-carga-acuario',
|
|
5
|
+
title: 'Planificador de recirculación del filtro y población del acuario',
|
|
6
|
+
description: 'Estima la recirculación real del filtro tras las pérdidas de caudal y observa cómo el volumen, el montaje y los peces adultos cambian la planificación.',
|
|
7
|
+
ui: {
|
|
8
|
+
presetsLabel: 'Empieza con un montaje', presetCommunity: 'Ejemplo comunitario', presetPlanted: 'Ejemplo plantado', presetHighWaste: 'Ejemplo de alta carga',
|
|
9
|
+
tankVolumeLabel: 'Volumen del acuario en litros', tankVolumeHint: 'Usa el volumen de agua aprovechable cuando lo conozcas.', ratedFlowLabel: 'Caudal nominal del filtro en litros por hora', ratedFlowHint: 'Usa la especificación de la bomba o del filtro.',
|
|
10
|
+
flowLossLabel: 'Pérdida de caudal estimada', flowLossHint: 'Cuenta la altura, los tubos, los codos y la resistencia del material filtrante.', fishCountLabel: 'Número de peces adultos', averageLengthLabel: 'Longitud media adulta en centímetros',
|
|
11
|
+
setupLabel: 'Perfil del montaje', setupCommunity: 'Comunitario', setupPlanted: 'Plantado', setupHighWaste: 'Alta carga', resultEyebrow: 'Recirculación efectiva del filtro', effectiveTurnoverLabel: 'Recirculación efectiva', targetLabel: 'Banda de planificación', effectiveFlowLabel: 'Caudal tras la pérdida', stockingProxyLabel: 'Índice orientativo de población',
|
|
12
|
+
currentTitle: 'Sigue el recorrido de la corriente', currentDescription: 'La corriente sale del filtro, cruza el acuario y vuelve a la toma. Su velocidad responde a la recirculación efectiva.', statusUnder: 'Por debajo de la banda', statusTarget: 'Dentro de la banda', statusHigh: 'Por encima de la banda', loadLight: 'Índice de carga ligero', loadModerate: 'Índice de carga moderado', loadHeavy: 'Índice de carga alto',
|
|
13
|
+
cautionTitle: 'El test del agua es la comprobación final', bandSignalInside: 'Dentro de la banda de planificación', bandSignalBelow: 'Por debajo de la banda en', bandSignalAbove: 'Por encima de la banda en', maintenanceText: 'Si la pérdida estimada es alta, revisa la toma, los tubos y el material filtrante antes de elegir un filtro mayor.', useTestKits: 'La recirculación no mide la capacidad biológica. Comprueba amonio, nitrito y nitrato y adapta el caudal a las necesidades de cada especie.', metricLiters: 'L', metricPerHour: 'por hora', metricCentimetersPerLiter: 'cm/L',
|
|
14
|
+
},
|
|
15
|
+
seo: [
|
|
16
|
+
{ type: 'title', level: 2, text: 'Planifica con el caudal efectivo, no solo con la etiqueta de la bomba' },
|
|
17
|
+
{ type: 'paragraph', html: 'La recirculación del filtro es la relación entre el caudal de agua y el volumen del acuario. Un filtro anunciado con 600 litros por hora en un acuario de 100 litros sugiere 6 recirculaciones por hora antes de las pérdidas. Si el montaje pierde un 25 por ciento por altura, tubos y material filtrante, la estimación de trabajo baja a 450 litros por hora y 4,5 recirculaciones.' },
|
|
18
|
+
{ type: 'title', level: 2, text: 'Cómo leer la banda de planificación' },
|
|
19
|
+
{ type: 'table', headers: ['Perfil', 'Banda de planificación', 'Qué representa'], rows: [['Comunitario', '4 a 6 veces por hora', 'Un punto de partida de circulación moderada'], ['Plantado', '3 a 5 veces por hora', 'Un punto de partida más suave para acuarios con plantas'], ['Alta carga', '6 a 10 veces por hora', 'Una señal de circulación más intensa para más residuos']] },
|
|
20
|
+
{ type: 'paragraph', html: 'Estas bandas son heurísticas incorporadas al planificador, no reglas universales. Las especies varían en comportamiento y tolerancia a la corriente, y un número alto no demuestra que la filtración biológica esté madura ni que la población sea segura.' },
|
|
21
|
+
{ type: 'title', level: 2, text: 'Por qué la pérdida de caudal merece su propio campo' },
|
|
22
|
+
{ type: 'paragraph', html: 'La cifra impresa en un filtro puede medirse bajo condiciones definidas. La altura, el trazado de los tubos, las esponjas sucias, las tomas obstruidas y el material compacto cambian el agua que realmente vuelve al acuario. Mide el caudal de salida cuando puedas; si no, deja visible la suposición de pérdida y revísala tras el mantenimiento.' },
|
|
23
|
+
{ type: 'title', level: 2, text: 'Trata la cifra de población como una señal de alerta' },
|
|
24
|
+
{ type: 'paragraph', html: 'El índice orientativo multiplica el número de peces adultos por su longitud adulta media y divide el resultado entre los litros del acuario. Es fácil de comprobar y deliberadamente incompleto. No contempla la forma, la actividad, el territorio, la alimentación, el oxígeno, la compatibilidad ni el espacio que ocupan decoración y sustrato.' },
|
|
25
|
+
{ type: 'tip', title: 'Decide con la química del agua', html: 'Comprueba amonio y nitrito con regularidad, sobre todo después de añadir peces o aumentar la alimentación. Si la química no es estable, cambiar la estimación de recirculación no prepara el acuario para más animales.' },
|
|
26
|
+
{ type: 'diagnostic', variant: 'warning', title: 'No conviertas el resultado en una garantía de población', badge: 'Límite', html: 'Los cuidados específicos, el tamaño adulto, el comportamiento, los parámetros del agua y la madurez del filtro pueden invalidar esta planificación. Busca asesoramiento especializado si el montaje o la especie son poco habituales.' },
|
|
27
|
+
],
|
|
28
|
+
faq: [
|
|
29
|
+
{ question: '¿Qué significa la recirculación del filtro?', answer: 'Es una estimación de cuántas veces el filtro mueve el volumen del acuario en una hora. Este planificador usa el caudal después de una pérdida estimada y no solo la potencia de la bomba.' },
|
|
30
|
+
{ question: '¿Por qué el caudal nominal no coincide con el real?', answer: 'Las cifras del fabricante pueden medirse en condiciones concretas. La altura, la longitud de los tubos, los codos, el material obstruido y las esponjas sucias reducen el caudal que llega al acuario.' },
|
|
31
|
+
{ question: '¿Me dice cuántos peces puedo tener?', answer: 'No. Los campos de peces crean un índice transparente basado en longitud adulta por litro. Hay que investigar además especie, comportamiento, tamaño, compatibilidad, alimentación, calidad del agua y madurez del filtro.' },
|
|
32
|
+
{ question: '¿Qué hago si el resultado queda por debajo de la banda?', answer: 'Revisa el material obstruido, los tubos doblados y la altura de impulsión y mide la salida si es posible. No añadas peces para compensar un número bajo y comprueba amonio, nitrito y nitrato.' },
|
|
33
|
+
{ question: '¿Una recirculación mayor es siempre mejor?', answer: 'No. Una corriente fuerte puede ser inadecuada para especies o plantas que prefieren agua tranquila. Compara la banda con las indicaciones de cuidado de cada especie.' },
|
|
34
|
+
],
|
|
35
|
+
howTo: [
|
|
36
|
+
{ name: 'Introduce el volumen del acuario', text: 'Usa el volumen de agua que quieres planificar, preferiblemente el volumen útil y no las medidas exteriores del cristal.' },
|
|
37
|
+
{ name: 'Añade la capacidad del filtro', text: 'Introduce el caudal nominal del fabricante en litros por hora y estima la reducción por tubos, altura y material filtrante.' },
|
|
38
|
+
{ name: 'Describe la carga de peces', text: 'Introduce el número de peces y su longitud adulta media. La herramienta lo convierte en un índice de cm por litro, no en una garantía de población.' },
|
|
39
|
+
{ name: 'Lee el recorrido de la corriente', text: 'Compara la recirculación efectiva con la banda del montaje y usa el aviso y las pruebas de agua antes de cambiar el equipo o los animales.' },
|
|
40
|
+
],
|
|
41
|
+
});
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { buildPlannerContent } from '../content-builder';
|
|
2
|
+
|
|
3
|
+
export const content = buildPlannerContent({
|
|
4
|
+
slug: 'planificateur-debit-filtration-peuplement-aquarium',
|
|
5
|
+
title: 'Planificateur du débit de filtration et du peuplement de l aquarium',
|
|
6
|
+
description: 'Estimez le débit réel du filtre après les pertes de circulation et observez l effet du volume, de l installation et des poissons adultes sur la préparation.',
|
|
7
|
+
ui: {
|
|
8
|
+
presetsLabel: 'Commencer avec une configuration', presetCommunity: 'Exemple communautaire', presetPlanted: 'Exemple planté', presetHighWaste: 'Exemple forte charge', tankVolumeLabel: 'Volume du bac en litres', tankVolumeHint: 'Utilisez le volume d eau utile lorsque vous le connaissez.', ratedFlowLabel: 'Débit nominal du filtre en litres par heure', ratedFlowHint: 'Utilisez la valeur indiquée pour la pompe ou le filtre.', flowLossLabel: 'Perte de débit estimée', flowLossHint: 'Tenez compte de la hauteur, des tuyaux, des coudes et des masses filtrantes.', fishCountLabel: 'Nombre de poissons adultes', averageLengthLabel: 'Longueur adulte moyenne en centimètres', setupLabel: 'Profil du bac', setupCommunity: 'Communautaire', setupPlanted: 'Planté', setupHighWaste: 'Forte charge', resultEyebrow: 'Débit effectif du filtre', effectiveTurnoverLabel: 'Débit effectif', targetLabel: 'Plage de planification', effectiveFlowLabel: 'Débit après perte', stockingProxyLabel: 'Indice indicatif de peuplement', currentTitle: 'Suivre le trajet du courant', currentDescription: 'Le courant sort du filtre, traverse le bac et revient vers l aspiration. Sa vitesse dépend du débit effectif.', statusUnder: 'Sous la plage', statusTarget: 'Dans la plage', statusHigh: 'Au dessus de la plage', loadLight: 'Indice de charge léger', loadModerate: 'Indice de charge modéré', loadHeavy: 'Indice de charge élevé', cautionTitle: 'Le test de l eau est la vérification finale', bandSignalInside: 'Dans la plage de planification', bandSignalBelow: 'Sous la plage de', bandSignalAbove: 'Au dessus de la plage de', maintenanceText: 'Si la perte estimée est élevée, vérifiez la crépine, les tuyaux et les masses filtrantes avant de choisir un filtre plus grand.', useTestKits: 'Le débit ne mesure pas la capacité biologique. Testez ammoniac, nitrites et nitrates et adaptez le courant aux besoins de chaque espèce.', metricLiters: 'L', metricPerHour: 'par heure', metricCentimetersPerLiter: 'cm/L',
|
|
9
|
+
},
|
|
10
|
+
seo: [
|
|
11
|
+
{ type: 'title', level: 2, text: 'Planifier avec le débit effectif et pas seulement avec l étiquette de la pompe' },
|
|
12
|
+
{ type: 'paragraph', html: 'Le débit de filtration est le rapport entre le débit d eau et le volume du bac. Un filtre annoncé à 600 litres par heure sur un bac de 100 litres suggère 6 renouvellements par heure avant les pertes. Avec 25 pour cent de perte due à la hauteur, aux tuyaux et aux masses filtrantes, l estimation devient 450 litres par heure et 4,5 renouvellements.' },
|
|
13
|
+
{ type: 'title', level: 2, text: 'Comment lire la plage de planification' },
|
|
14
|
+
{ type: 'table', headers: ['Profil', 'Plage de planification', 'Ce que cela représente'], rows: [['Communautaire', '4 à 6 fois par heure', 'Un point de départ pour un courant modéré'], ['Planté', '3 à 5 fois par heure', 'Un point de départ plus doux pour un bac planté'], ['Forte charge', '6 à 10 fois par heure', 'Un signal de courant plus fort pour une charge élevée']] },
|
|
15
|
+
{ type: 'paragraph', html: 'Ces plages sont des heuristiques du planificateur et non des règles universelles. Les espèces diffèrent par leur comportement et leur tolérance au courant. Un chiffre élevé ne prouve ni la maturité de la filtration biologique ni la sécurité du peuplement.' },
|
|
16
|
+
{ type: 'title', level: 2, text: 'Pourquoi la perte de débit a son propre champ' },
|
|
17
|
+
{ type: 'paragraph', html: 'La valeur imprimée sur un filtre peut être mesurée dans des conditions définies. La hauteur, le trajet des tuyaux, les éponges sales, la crépine bouchée et les masses compactes modifient le débit qui revient réellement dans le bac. Mesurez la sortie si possible, sinon rendez votre hypothèse visible et réévaluez la après l entretien.' },
|
|
18
|
+
{ type: 'title', level: 2, text: 'Considérer le chiffre de peuplement comme un signal' },
|
|
19
|
+
{ type: 'paragraph', html: 'L indice indicatif multiplie le nombre de poissons adultes par leur longueur adulte moyenne, puis divise par le nombre de litres. Il est facile à vérifier mais volontairement incomplet. Il ignore la forme, l activité, le territoire, la nourriture, l oxygène, la compatibilité et la place prise par le décor et le sol.' },
|
|
20
|
+
{ type: 'tip', title: 'Décider avec la chimie de l eau', html: 'Testez régulièrement ammoniac et nitrites, surtout après l ajout de poissons ou une augmentation du nourrissage. Si les paramètres sont instables, modifier le débit ne rend pas le bac prêt à accueillir d autres animaux.' },
|
|
21
|
+
{ type: 'diagnostic', variant: 'warning', title: 'Ne pas transformer le résultat en garantie de peuplement', badge: 'Limite', html: 'Les soins propres à l espèce, la taille adulte, le comportement, les paramètres de l eau et la maturité du filtre peuvent primer sur ce résultat. Demandez conseil si l espèce ou l installation est inhabituelle.' },
|
|
22
|
+
],
|
|
23
|
+
faq: [
|
|
24
|
+
{ question: 'Que signifie le débit de filtration ?', answer: 'C est l estimation du nombre de fois où le filtre déplace le volume du bac en une heure. Ce planificateur utilise le débit après une perte estimée, pas seulement la puissance de la pompe.' },
|
|
25
|
+
{ question: 'Pourquoi le débit nominal diffère t il du débit réel ?', answer: 'Les valeurs du fabricant peuvent être mesurées dans des conditions précises. La hauteur, la longueur des tuyaux, les coudes, les masses bouchées et les éponges sales réduisent le débit qui arrive au bac.' },
|
|
26
|
+
{ question: 'L outil indique t il combien de poissons je peux garder ?', answer: 'Non. Les champs de poissons créent un indice transparent fondé sur la longueur adulte par litre. L espèce, le comportement, la taille, la compatibilité, la nourriture, la qualité de l eau et la maturité du filtre demandent une étude séparée.' },
|
|
27
|
+
{ question: 'Que faire si le résultat est sous la plage ?', answer: 'Vérifiez les masses bouchées, les tuyaux pliés et la hauteur de refoulement, puis mesurez la sortie si possible. N ajoutez pas de poissons pour compenser et testez ammoniac, nitrites et nitrates.' },
|
|
28
|
+
{ question: 'Un débit plus élevé est il toujours préférable ?', answer: 'Non. Un courant fort peut ne pas convenir aux espèces ou aux plantes qui préfèrent une eau plus calme. Comparez la plage avec les recommandations propres à chaque espèce.' },
|
|
29
|
+
],
|
|
30
|
+
howTo: [
|
|
31
|
+
{ name: 'Saisir le volume du bac', text: 'Utilisez le volume d eau à planifier, de préférence le volume utile plutôt que les dimensions extérieures du verre.' },
|
|
32
|
+
{ name: 'Ajouter la valeur du filtre', text: 'Saisissez le débit constructeur en litres par heure puis estimez la réduction due aux tuyaux, à la hauteur et aux masses filtrantes.' },
|
|
33
|
+
{ name: 'Décrire la charge de poissons', text: 'Saisissez le nombre de poissons et leur longueur adulte moyenne. L outil en fait un indice en cm par litre et non une garantie de peuplement.' },
|
|
34
|
+
{ name: 'Lire le trajet du courant', text: 'Comparez le débit effectif à la plage du profil puis suivez les conseils de test de l eau avant de modifier le matériel ou les animaux.' },
|
|
35
|
+
],
|
|
36
|
+
});
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { buildPlannerContent } from '../content-builder';
|
|
2
|
+
|
|
3
|
+
export const content = buildPlannerContent({
|
|
4
|
+
slug: 'perencana-sirkulasi-filter-dan-populasi-akuarium',
|
|
5
|
+
title: 'Perencana sirkulasi filter dan populasi akuarium',
|
|
6
|
+
description: 'Perkirakan sirkulasi filter akuarium yang nyata setelah kehilangan aliran dan lihat bagaimana volume, jenis setup, serta ikan dewasa memengaruhi rencana.',
|
|
7
|
+
ui: {
|
|
8
|
+
presetsLabel: 'Mulai dengan setup', presetCommunity: 'Contoh komunitas', presetPlanted: 'Contoh tanaman', presetHighWaste: 'Contoh limbah tinggi', tankVolumeLabel: 'Volume akuarium dalam liter', tankVolumeHint: 'Gunakan volume air yang dapat dipakai jika sudah mengetahuinya.', ratedFlowLabel: 'Aliran nominal filter dalam liter per jam', ratedFlowHint: 'Gunakan spesifikasi pompa atau filter.', flowLossLabel: 'Perkiraan kehilangan aliran', flowLossHint: 'Perhitungkan ketinggian, selang, tikungan, dan media filter.', fishCountLabel: 'Jumlah ikan saat dewasa', averageLengthLabel: 'Panjang rata rata ikan dewasa dalam sentimeter', setupLabel: 'Profil setup', setupCommunity: 'Komunitas', setupPlanted: 'Tanaman', setupHighWaste: 'Limbah tinggi', resultEyebrow: 'Sirkulasi filter efektif', effectiveTurnoverLabel: 'Sirkulasi efektif', targetLabel: 'Rentang perencanaan', effectiveFlowLabel: 'Aliran setelah kehilangan', stockingProxyLabel: 'Proksi beban populasi', currentTitle: 'Ikuti jejak arus', currentDescription: 'Arus keluar dari filter, melewati akuarium, lalu kembali ke saluran masuk. Kecepatannya mengikuti sirkulasi efektif.', statusUnder: 'Di bawah rentang', statusTarget: 'Di dalam rentang', statusHigh: 'Di atas rentang', loadLight: 'Proksi beban ringan', loadModerate: 'Proksi beban sedang', loadHeavy: 'Proksi beban berat', cautionTitle: 'Tes air adalah pemeriksaan terakhir', bandSignalInside: 'Di dalam rentang perencanaan', bandSignalBelow: 'Di bawah rentang sebesar', bandSignalAbove: 'Di atas rentang sebesar', maintenanceText: 'Jika kehilangan aliran diperkirakan tinggi, periksa saluran masuk, selang, dan media sebelum memilih filter yang lebih besar.', useTestKits: 'Sirkulasi tidak mengukur kapasitas biologis. Periksa amonia, nitrit, dan nitrat serta sesuaikan arus dengan kebutuhan setiap spesies.', metricLiters: 'L', metricPerHour: 'per jam', metricCentimetersPerLiter: 'cm/L',
|
|
9
|
+
},
|
|
10
|
+
seo: [
|
|
11
|
+
{ type: 'title', level: 2, text: 'Rencanakan dengan aliran efektif, bukan hanya label pompa' },
|
|
12
|
+
{ type: 'paragraph', html: 'Sirkulasi filter adalah perbandingan antara aliran air dan volume akuarium. Filter dengan nilai 600 liter per jam pada akuarium 100 liter menunjukkan 6 kali sirkulasi per jam sebelum kehilangan. Jika setup kehilangan 25 persen karena ketinggian, selang, dan media, perkiraan kerjanya menjadi 450 liter per jam dan 4,5 kali sirkulasi.' },
|
|
13
|
+
{ type: 'title', level: 2, text: 'Cara membaca rentang perencanaan' },
|
|
14
|
+
{ type: 'table', headers: ['Profil setup', 'Rentang perencanaan', 'Maknanya'], rows: [['Komunitas', '4 sampai 6 kali per jam', 'Titik awal arus sedang'], ['Tanaman', '3 sampai 5 kali per jam', 'Titik awal yang lebih lembut untuk akuarium ber tanaman'], ['Limbah tinggi', '6 sampai 10 kali per jam', 'Sinyal arus lebih kuat untuk beban limbah besar']] },
|
|
15
|
+
{ type: 'paragraph', html: 'Rentang ini adalah heuristik bawaan alat, bukan aturan akuarium yang berlaku umum. Setiap spesies berbeda dalam perilaku berenang dan toleransi arus. Angka sirkulasi tinggi tidak membuktikan filtrasi biologis sudah matang atau populasi sudah aman.' },
|
|
16
|
+
{ type: 'title', level: 2, text: 'Mengapa kehilangan aliran perlu menjadi input sendiri' },
|
|
17
|
+
{ type: 'paragraph', html: 'Angka pada filter dapat diukur dalam kondisi tertentu. Ketinggian, jalur selang, spons kotor, saringan masuk yang tersumbat, dan media yang terlalu padat mengubah aliran yang benar benar kembali ke akuarium. Ukur aliran keluaran bila bisa; jika tidak, nyatakan perkiraan kehilangan dan tinjau kembali setelah perawatan.' },
|
|
18
|
+
{ type: 'title', level: 2, text: 'Anggap angka populasi sebagai sinyal peringatan' },
|
|
19
|
+
{ type: 'paragraph', html: 'Proksi beban populasi adalah jumlah ikan dewasa dikalikan panjang dewasa rata rata, lalu dibagi volume liter. Proksi ini mudah diperiksa dan sengaja tidak lengkap. Bentuk tubuh, aktivitas, wilayah, jumlah pakan, kebutuhan oksigen, kecocokan, serta ruang dekorasi dan substrat tidak dihitung.' },
|
|
20
|
+
{ type: 'tip', title: 'Gunakan kimia air untuk mengambil keputusan', html: 'Uji amonia dan nitrit secara rutin, terutama setelah menambah ikan atau pakan. Jika kimia air belum stabil, mengubah perkiraan sirkulasi tidak membuat akuarium siap menerima hewan tambahan.' },
|
|
21
|
+
{ type: 'diagnostic', variant: 'warning', title: 'Jangan mengubah hasil menjadi jaminan populasi', badge: 'Batasan', html: 'Perawatan khusus spesies, ukuran dewasa, perilaku, parameter air, dan kematangan filter dapat mengalahkan hasil perencanaan ini. Mintalah saran ahli jika setup atau spesiesnya tidak biasa.' },
|
|
22
|
+
],
|
|
23
|
+
faq: [
|
|
24
|
+
{ question: 'Apa arti sirkulasi filter?', answer: 'Sirkulasi adalah perkiraan berapa kali filter memindahkan volume akuarium dalam satu jam. Alat ini memakai aliran setelah perkiraan kehilangan, bukan hanya nilai pompa.' },
|
|
25
|
+
{ question: 'Mengapa aliran nominal filter berbeda dari aliran nyata?', answer: 'Angka produsen dapat diukur dalam kondisi tertentu. Ketinggian, panjang selang, tikungan, media tersumbat, dan spons kotor dapat mengurangi aliran yang mencapai akuarium.' },
|
|
26
|
+
{ question: 'Apakah alat ini memberi tahu jumlah ikan yang bisa dipelihara?', answer: 'Tidak. Kolom ikan membuat proksi beban yang transparan berdasarkan panjang dewasa per liter. Spesies, perilaku, ukuran, kecocokan, pakan, kualitas air, dan kematangan filter tetap perlu diteliti.' },
|
|
27
|
+
{ question: 'Apa yang harus dilakukan jika hasil di bawah rentang?', answer: 'Periksa media tersumbat, selang tertekuk, dan ketinggian dorong lalu ukur keluaran jika memungkinkan. Jangan menambah ikan untuk menutupi angka rendah dan periksa amonia, nitrit, serta nitrat.' },
|
|
28
|
+
{ question: 'Apakah sirkulasi lebih tinggi selalu lebih baik?', answer: 'Tidak. Arus kuat bisa tidak cocok untuk spesies atau tanaman yang menyukai air tenang. Bandingkan rentang dengan panduan perawatan setiap spesies.' },
|
|
29
|
+
],
|
|
30
|
+
howTo: [
|
|
31
|
+
{ name: 'Masukkan volume akuarium', text: 'Gunakan volume air yang ingin direncanakan, idealnya volume yang dapat dipakai bukan ukuran kaca bagian luar.' },
|
|
32
|
+
{ name: 'Tambahkan nilai filter', text: 'Masukkan nilai aliran produsen dalam liter per jam lalu perkirakan pengurangan karena selang, ketinggian, dan media.' },
|
|
33
|
+
{ name: 'Jelaskan beban ikan', text: 'Masukkan jumlah ikan dan panjang dewasa rata ratanya. Alat mengubahnya menjadi proksi cm per liter, bukan jaminan populasi.' },
|
|
34
|
+
{ name: 'Baca jejak arus', text: 'Bandingkan sirkulasi efektif dengan profil setup dan gunakan peringatan serta panduan tes air sebelum mengubah peralatan atau hewan.' },
|
|
35
|
+
],
|
|
36
|
+
});
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { buildPlannerContent } from '../content-builder';
|
|
2
|
+
|
|
3
|
+
export const content = buildPlannerContent({
|
|
4
|
+
slug: 'pianificatore-ricambio-filtro-popolazione-acquario',
|
|
5
|
+
title: 'Pianificatore del ricambio filtro e popolazione acquario',
|
|
6
|
+
description: 'Stima il ricambio reale del filtro dopo le perdite di portata e osserva come volume, allestimento e pesci adulti cambiano la pianificazione.',
|
|
7
|
+
ui: {
|
|
8
|
+
presetsLabel: 'Inizia con un allestimento', presetCommunity: 'Esempio comunitario', presetPlanted: 'Esempio piantumato', presetHighWaste: 'Esempio ad alto carico', tankVolumeLabel: 'Volume della vasca in litri', tankVolumeHint: 'Usa il volume d acqua utile quando lo conosci.', ratedFlowLabel: 'Portata nominale del filtro in litri all ora', ratedFlowHint: 'Usa il dato della pompa o del filtro.', flowLossLabel: 'Perdita di portata stimata', flowLossHint: 'Considera altezza, tubi, curve e resistenza dei materiali filtranti.', fishCountLabel: 'Numero di pesci adulti', averageLengthLabel: 'Lunghezza media adulta in centimetri', setupLabel: 'Profilo dell allestimento', setupCommunity: 'Comunitario', setupPlanted: 'Piantumato', setupHighWaste: 'Alto carico', resultEyebrow: 'Ricambio effettivo del filtro', effectiveTurnoverLabel: 'Ricambio effettivo', targetLabel: 'Intervallo di pianificazione', effectiveFlowLabel: 'Portata dopo la perdita', stockingProxyLabel: 'Indice indicativo di popolazione', currentTitle: 'Segui il percorso della corrente', currentDescription: 'La corrente esce dal filtro, attraversa la vasca e torna all aspirazione. La sua velocità risponde al ricambio effettivo.', statusUnder: 'Sotto l intervallo', statusTarget: 'Nell intervallo', statusHigh: 'Sopra l intervallo', loadLight: 'Indice di carico leggero', loadModerate: 'Indice di carico moderato', loadHeavy: 'Indice di carico alto', cautionTitle: 'Il test dell acqua è la verifica finale', bandSignalInside: 'Nell intervallo di pianificazione', bandSignalBelow: 'Sotto l intervallo di', bandSignalAbove: 'Sopra l intervallo di', maintenanceText: 'Se la perdita stimata è alta, controlla aspirazione, tubi e materiali prima di scegliere un filtro più grande.', useTestKits: 'Il ricambio non misura la capacità biologica. Controlla ammoniaca, nitriti e nitrati e adatta la corrente alle esigenze di ogni specie.', metricLiters: 'L', metricPerHour: 'all ora', metricCentimetersPerLiter: 'cm/L',
|
|
9
|
+
},
|
|
10
|
+
seo: [
|
|
11
|
+
{ type: 'title', level: 2, text: 'Pianifica con la portata effettiva e non solo con l etichetta della pompa' },
|
|
12
|
+
{ type: 'paragraph', html: 'Il ricambio del filtro è il rapporto tra portata dell acqua e volume della vasca. Un filtro dichiarato per 600 litri all ora su una vasca da 100 litri suggerisce 6 ricambi all ora prima delle perdite. Con una perdita del 25 per cento dovuta ad altezza, tubi e materiali, la stima di lavoro diventa 450 litri all ora e 4,5 ricambi.' },
|
|
13
|
+
{ type: 'title', level: 2, text: 'Come leggere l intervallo di pianificazione' },
|
|
14
|
+
{ type: 'table', headers: ['Profilo', 'Intervallo', 'Che cosa rappresenta'], rows: [['Comunitario', 'Da 4 a 6 volte all ora', 'Un punto di partenza per una corrente moderata'], ['Piantumato', 'Da 3 a 5 volte all ora', 'Un punto di partenza più delicato per le vasche con piante'], ['Alto carico', 'Da 6 a 10 volte all ora', 'Un segnale di corrente più intensa per più rifiuti']] },
|
|
15
|
+
{ type: 'paragraph', html: 'Questi intervalli sono euristiche del pianificatore e non regole universali. Le specie differiscono per comportamento e tolleranza alla corrente. Un numero alto non dimostra che la filtrazione biologica sia matura o che la popolazione sia sicura.' },
|
|
16
|
+
{ type: 'title', level: 2, text: 'Perché la perdita di portata merita un campo dedicato' },
|
|
17
|
+
{ type: 'paragraph', html: 'Il dato stampato sul filtro può essere misurato in condizioni definite. Altezza, percorso dei tubi, spugne sporche, griglie di aspirazione ostruite e materiali troppo compatti cambiano la portata che torna davvero in vasca. Misura l uscita quando puoi; altrimenti rendi visibile l ipotesi e rivalutala dopo la manutenzione.' },
|
|
18
|
+
{ type: 'title', level: 2, text: 'Considera il dato sulla popolazione come un segnale' },
|
|
19
|
+
{ type: 'paragraph', html: 'L indice indicativo moltiplica il numero di pesci adulti per la lunghezza adulta media e divide per i litri della vasca. È facile da controllare ma volutamente incompleto. Non considera forma, attività, territorio, quantità di cibo, ossigeno, compatibilità o lo spazio occupato da arredi e fondo.' },
|
|
20
|
+
{ type: 'tip', title: 'Decidi con la chimica dell acqua', html: 'Testa regolarmente ammoniaca e nitriti, soprattutto dopo aver aggiunto pesci o aumentato il cibo. Se i valori non sono stabili, cambiare la stima del ricambio non rende la vasca pronta per altri animali.' },
|
|
21
|
+
{ type: 'diagnostic', variant: 'warning', title: 'Non trasformare il risultato in una garanzia di popolazione', badge: 'Limite', html: 'Cure specifiche, dimensioni adulte, comportamento, parametri dell acqua e maturità del filtro possono prevalere su questo risultato. Chiedi consiglio a un esperto se specie o allestimento sono insoliti.' },
|
|
22
|
+
],
|
|
23
|
+
faq: [
|
|
24
|
+
{ question: 'Che cosa significa ricambio del filtro?', answer: 'È la stima di quante volte il filtro muove il volume della vasca in un ora. Questo strumento usa la portata dopo una perdita stimata, non solo il dato della pompa.' },
|
|
25
|
+
{ question: 'Perché la portata nominale non è uguale a quella reale?', answer: 'I valori del produttore possono essere misurati in condizioni specifiche. Altezza, lunghezza dei tubi, curve, materiali intasati e spugne sporche possono ridurre la portata che arriva in vasca.' },
|
|
26
|
+
{ question: 'Lo strumento dice quanti pesci posso tenere?', answer: 'No. I campi dei pesci creano un indice trasparente basato sulla lunghezza adulta per litro. Specie, comportamento, dimensioni, compatibilità, alimentazione, qualità dell acqua e maturità del filtro richiedono una verifica separata.' },
|
|
27
|
+
{ question: 'Che cosa faccio se il risultato è sotto l intervallo?', answer: 'Controlla materiali intasati, tubi piegati e altezza di mandata, poi misura l uscita se possibile. Non aggiungere pesci per compensare un valore basso e controlla ammoniaca, nitriti e nitrati.' },
|
|
28
|
+
{ question: 'Un ricambio maggiore è sempre migliore?', answer: 'No. Una corrente forte può non essere adatta a specie o piante che preferiscono acqua più calma. Confronta l intervallo con le indicazioni di cura di ogni specie.' },
|
|
29
|
+
],
|
|
30
|
+
howTo: [
|
|
31
|
+
{ name: 'Inserisci il volume della vasca', text: 'Usa il volume d acqua su cui vuoi pianificare, preferibilmente quello utile invece delle dimensioni esterne del vetro.' },
|
|
32
|
+
{ name: 'Aggiungi il dato del filtro', text: 'Inserisci la portata dichiarata dal produttore in litri all ora e stima la riduzione dovuta a tubi, altezza e materiali.' },
|
|
33
|
+
{ name: 'Descrivi il carico dei pesci', text: 'Inserisci numero di pesci e lunghezza adulta media. Lo strumento li trasforma in un indice cm per litro, non in una garanzia.' },
|
|
34
|
+
{ name: 'Leggi il percorso della corrente', text: 'Confronta il ricambio effettivo con il profilo e usa avviso e indicazioni sui test prima di cambiare attrezzatura o animali.' },
|
|
35
|
+
],
|
|
36
|
+
});
|