Implements detailed tracking of soil composition, nutrients, climate, lighting, and surrounding environment to help understand plant success and optimize growing conditions. Environmental Data Types (lib/environment/types.ts): - Soil composition (type, pH, texture, drainage, organic matter) - Soil amendments (compost, perlite, amendments tracking) - Nutrient profiles (NPK, secondary nutrients, micronutrients, EC, TDS) - Fertilizer applications (type, schedule, NPK values) - Lighting conditions (natural/artificial, hours, spectrum, PPFD/DLI) - Climate tracking (temperature, humidity, airflow, CO2, USDA zones) - Growing location (indoor/outdoor/greenhouse with details) - Container information (type, material, size, drainage) - Watering schedule (method, frequency, water quality/pH) - Surrounding environment (companion plants, pests, diseases, ecosystem) - Growth metrics (measurements, health scores, vigor tracking) Environmental Analysis (lib/environment/analysis.ts): - Compare environments with similarity scoring (0-100) - Generate personalized growing recommendations - Calculate environmental health scores - Find plants with similar conditions - Analyze growth correlations across network - Identify optimal growing conditions API Endpoints: - /api/environment/recommendations - Get plant-specific advice - /api/environment/similar - Find plants with similar conditions - /api/environment/compare - Compare two plants environments - /api/environment/analysis - Network-wide growth correlation Features: - Comprehensive soil tracking (pH, texture, drainage, amendments) - Full NPK and micronutrient monitoring - Sunlight exposure and artificial light tracking - Temperature and humidity ranges - Water quality monitoring (pH, TDS, chlorine) - Pest and disease tracking - Companion planting recommendations - Environmental health scoring with priority-based recommendations - Growth success analysis across similar environments Integration: - Updated PlantData type to include environment and growthMetrics - Compatible with existing blockchain structure - Optional environmental data (backward compatible) Use Cases: - Track what works for your plants - Learn from successful growers with similar conditions - Get personalized recommendations based on your setup - Compare your environment with thriving plants - Optimize conditions for better yield/health - Share growing knowledge with the community - Research optimal conditions by species This enables growers to: - Understand why plants thrive or struggle - Replicate successful growing conditions - Make data-driven decisions - Learn from the collective experience - Improve propagation success rates
74 lines
2.3 KiB
TypeScript
74 lines
2.3 KiB
TypeScript
/**
|
|
* API Route: Find plants with similar growing environments
|
|
* GET /api/environment/similar?plantId=xyz&minScore=70
|
|
*/
|
|
|
|
import type { NextApiRequest, NextApiResponse } from 'next';
|
|
import { getBlockchain } from '../../../lib/blockchain/manager';
|
|
import { findSimilarEnvironments } from '../../../lib/environment/analysis';
|
|
|
|
export default async function handler(
|
|
req: NextApiRequest,
|
|
res: NextApiResponse
|
|
) {
|
|
if (req.method !== 'GET') {
|
|
return res.status(405).json({ error: 'Method not allowed' });
|
|
}
|
|
|
|
try {
|
|
const { plantId, minScore } = req.query;
|
|
|
|
if (!plantId || typeof plantId !== 'string') {
|
|
return res.status(400).json({ error: 'Missing plantId parameter' });
|
|
}
|
|
|
|
const blockchain = getBlockchain();
|
|
const targetPlant = blockchain.getPlant(plantId);
|
|
|
|
if (!targetPlant) {
|
|
return res.status(404).json({ error: 'Plant not found' });
|
|
}
|
|
|
|
if (!targetPlant.environment) {
|
|
return res.status(400).json({
|
|
error: 'Plant has no environmental data',
|
|
message: 'Add environmental information to find similar plants',
|
|
});
|
|
}
|
|
|
|
// Get all plants
|
|
const allPlants = Array.from(
|
|
new Set(blockchain.chain.map(block => block.plant.id))
|
|
)
|
|
.map(id => blockchain.getPlant(id)!)
|
|
.filter(Boolean);
|
|
|
|
const minScoreValue = minScore ? parseInt(minScore as string) : 70;
|
|
const similarPlants = findSimilarEnvironments(targetPlant, allPlants, minScoreValue);
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
targetPlant: {
|
|
id: targetPlant.id,
|
|
commonName: targetPlant.commonName,
|
|
scientificName: targetPlant.scientificName,
|
|
},
|
|
similarCount: similarPlants.length,
|
|
similar: similarPlants.map(({ plant, comparison }) => ({
|
|
plant: {
|
|
id: plant.id,
|
|
commonName: plant.commonName,
|
|
scientificName: plant.scientificName,
|
|
owner: plant.owner.name,
|
|
location: plant.location.city || plant.location.country,
|
|
},
|
|
similarityScore: comparison.score,
|
|
similarities: comparison.similarities,
|
|
differences: comparison.differences,
|
|
})),
|
|
});
|
|
} catch (error: any) {
|
|
console.error('Error finding similar environments:', error);
|
|
res.status(500).json({ error: error.message || 'Internal server error' });
|
|
}
|
|
}
|