Skip to content

12.2 AI in Agriculture

12.2.1 Deep Learning-Based Crop Disease Recognition

Crop disease is one of the leading causes of yield loss. Traditional identification relies on agricultural technicians visually inspecting leaf lesions, color, and morphology — an experience-driven form of judgment that is not only susceptible to subjectivity but also struggles to catch early, subtle symptoms. When a planting base reaches tens or even hundreds of hectares, plant-by-plant inspection is practically infeasible in manpower terms. Over the past few years, the combination of computer vision and the convolutional neural network (CNN) became one of the earliest directions in agricultural AI to move into engineering practice. Its core logic is straightforward: a camera captures a leaf image, a trained CNN model runs inference, and the output is a label of "healthy" or a specific disease category. The main engineering challenge lies not in the algorithmic principle itself, but in model selection, training-data acquisition, and whether stable inference accuracy can be maintained on edge devices with limited resources and limited bandwidth.

The Basic CNN Pipeline for Disease Recognition

Once a crop leaf image enters a CNN, it passes through a series of learnable feature-extraction steps. The input image goes through several "convolution + pooling" combinations — the convolution kernel slides across the image, learning hierarchical features from edges and textures up to shapes; the pooling layer downsamples, reducing the spatial resolution of the feature maps and controlling the parameter count. The feature maps are then flattened into a one-dimensional vector and fed into fully connected layers to complete the classification decision. In a crop disease recognition task, the number of nodes in the output layer is typically set to the total count of "healthy + each disease class," and a Softmax function outputs a normalized probability distribution.

Figure 12-4 Crop Disease Recognition CNN Pipeline (Architecture)Leaf images go through three conv-pool stages for hierarchical features and progressive downsampling, then flatten into dense layers; Softmax outputs health and disease probabilities.Figure 12-4 Crop Disease Recognition CNN Pipeline (Architecture)Convolution extracts hierarchical features, pooling downsamples stage by stage, dense layers output disease probabilitiesLeaf image224×224×3RGBConv + Pool ①Conv2D + ReLUMaxPool2D16×112×112Conv + Pool ②Conv2D + ReLUMaxPool2D32×56×56Conv + Pool ③Conv2D + ReLUMaxPool2D64×28×28FlattenFlatten to 1-D50,176Dense128 units · ReLUDisease probabilitiesSoftmax · C classesHealthy 0.01Powdery mildew 0.88Rust 0.05 · leaf spot 0.06InputFeature extraction & downsamplingClassification decisionProbability outputThree feature stages: edges → texture → shapeSpatial resolution falls and channels rise stage by stage; C = disease classes + healthyFigure 12-4 Three conv-pool stages shrink spatial resolution from 224 to 28 while channels grow from 3 to 64, moving features from edges and texture to shape; Softmax outputs health and disease probabilities, and the largest wins as the recognition result.
Figure 12-4 Crop Disease Recognition CNN Pipeline (Architecture)

Public Datasets and Transfer Learning

The first prerequisite for training such a CNN is a labeled disease-image dataset of sufficient scale. Across international and domestic communities, several representative resources together form the evaluation basis of this field. PlantVillage is a public crop disease image dataset covering many crops and disease/health states, containing a sizable collection of leaf images with clearly divided classes, which made it a common benchmark in early crop disease recognition papers. The AI Challenger crop pest and disease subset, in contrast, introduces images much closer to real field scenes: cluttered backgrounds, uneven lighting, leaves occluding one another or smeared with mud. This "domain shift" places higher demands on the model's generalization ability.

On these two datasets, the prevailing industry practice is transfer learning rather than training from scratch. The concrete procedure is to load a CNN model pretrained on ImageNet (a million-scale general image dataset) — such as ResNet-50, MobileNetV2, or EfficientNet-B0 — freeze the weights of its shallow layers, which extract generic features such as edges and textures, and replace and fine-tune only the fully connected layers at the top so that the outputs fit the crop disease classification task. This strategy effectively mitigates the overfitting risk brought by the relatively small scale of agricultural image datasets, while substantially reducing training time and computing cost.

On controlled datasets such as PlantVillage, mainstream models trained with transfer learning usually achieve high classification accuracy. But when deployed directly to real fields, factors such as changing light, damaged leaves, insect occlusion, and dew glare cause accuracy to drop markedly. In actual engineering practice, data augmentation is an indispensable step — through random rotation, cropping, color jittering, adding Gaussian noise, and similar operations, the model "sees" a wider variety of input variations, narrowing the performance gap between the laboratory and the real environment.

Lightweight Models and Edge Deployment

Accuracy is not the only metric. If a usable field disease recognition node depends on cloud inference — uploading the image to a cloud server and waiting for the result to return — then over a wireless link with limited bandwidth (a few hundred kbps or even lower is common in agricultural settings), the end-to-end latency is often on the order of seconds to tens of seconds, which cannot support the real-time response of "photograph a diseased leaf and trigger an action." The more sensible engineering solution is on-device inference: deploy the model on an edge computing device close to the camera, and after inference, send only the lightweight "disease type + confidence" message back to the backend over a low-power network.

Edge deployment imposes hard constraints on model size and compute. The engineering response is lightweight architectures. The MobileNet family introduces depthwise separable convolution, splitting a standard convolution into a "depthwise convolution" and a "pointwise convolution." This structural design cuts the parameter count and the number of multiply operations significantly compared with standard convolution, while the loss in classification accuracy stays relatively limited. The EfficientNet family, in turn, uses neural architecture search (NAS) to systematically balance network depth, width, and input resolution; under the same compute budget it usually achieves higher Top-1 accuracy than MobileNet, at the cost of a slightly larger model file. Choosing between the two depends on the target edge device's compute, memory, and hard requirements on inference latency.

A typical deployment workflow proceeds in three steps: first, train and validate the model on a PC with TensorFlow or PyTorch; next, use a converter supported by the target runtime to generate an INT8 or FP16 model — the quantization method, operator support, and acceleration gains must be verified against the target hardware; finally, push the model to the edge device and load it for execution. Acceptance is not only about parameter count and frame rate — on the same data split and hardware, it must also record classification/detection/segmentation metrics, P50/P95, peak memory, per-inference energy, and thermal stability.

Whether the quantization step passes depends first on the calibration set. The calibration set for field quantization should cover different seasons, lighting conditions, leaf growth stages, devices, and backgrounds, rather than being randomly sampled only from a controlled dataset. On the path, try post-training quantization (Post-Training Quantization, PTQ) first — it leaves the training pipeline untouched and needs only a few hundred representative field images to complete calibration; only when the accuracy loss after PTQ exceeds the acceptance target should quantization-aware training (Quantization-Aware Training, QAT) be considered, which lets the model "perceive" quantization noise during training at the cost of redoing the whole training and tuning cycle. Once the model is live, one guardrail cannot be skipped: OTA upgrade packages must be bound to signature verification, a device compatibility matrix, and a rollback target, so that one failed upgrade does not turn field nodes into "bricks". Weak-network fault tolerance must likewise be settled at design time — the node first caches recognition results and key samples locally, then re-uploads them by data freshness and priority once the link recovers; a diseased leaf photographed yesterday must not be taken for today's field state.

Extending from Classification to Detection, Segmentation, and Multimodality

Single-leaf classification suits proof of concept, but a field system often also has to answer where the lesions are, how large their area is, and whether they are spreading continuously — hence detection and segmentation metrics are needed, along with the ability to decline to answer on unknown diseases or low-confidence samples. Vision can also be fused with weather, soil, irrigation, and historical time series; before fusion, align time, plots, crop batches, and quality codes, and evaluate the fallback capability when one modality is missing.

Vision-language models can assist with interpreting images, retrieving agronomic knowledge, and generating inspection recommendations, but natural-language fluency must not substitute for lesion localization and real field metrics. Actions such as spraying and irrigation remain constrained by rules, policies, and human confirmation.

Agricultural edge acceptance card: compare full-precision and quantized models on the same hardware; report worst-subgroup metrics across seasons/lighting/devices, P95, memory, and energy; exercise weak-network caching, model-update failure, and rollback; results on controlled data such as PlantVillage must not be taken directly as real field performance.

Engineering Trade-offs and Deployment Considerations

A practical disease recognition node is far more than the model itself. The camera trigger method (scheduled capture, or waking when an infrared sensor detects an approaching leaf), image preprocessing (resizing, normalization), and the strategy for aggregating and uploading inference results together determine the whole system's power consumption and responsiveness. If the node runs entirely on battery, its endurance depends on the chosen processor's power draw, the capture frequency, and the sleep strategy. No single design can simultaneously deliver the highest accuracy, the lowest cost, and the longest battery life. Early in a project, trade-offs must be made explicitly on the basis of the crop's economic value, the speed at which disease spreads, and the critical control window of each disease: prioritize recognition accuracy (a stronger model, a shorter recognition cycle), or prioritize endurance (a lower sampling frequency, a lighter model).

The table below summarizes the design trade-offs commonly faced at the prototyping stage:

Decision dimensionOptionsEngineering trade-off
Model architectureMobileNetV2 / EfficientNet-B0 / ResNet-50Parameter count vs. inference speed: MobileNetV2 is the smallest after quantization; ResNet-50 is usually more accurate on comparable datasets, but also the costliest to deploy
Edge hardwareRaspberry Pi / ESP32-S3 / NVIDIA Jetson NanoPower vs. compute: an MCU design (ESP32-S3) draws far less system power than a single-board computer but offers limited compute; selection depends on whether the node supports intermittent power and whether solar energy is available
Inference frameworkTensorFlow Lite / ONNX Runtime / OpenVINOToolchain maturity: TFLite has the broadest support; ONNX Runtime offers good cross-platform compatibility; OpenVINO targets Intel platforms for extra acceleration
Trigger methodScheduled capture (e.g., a 30-minute interval) / motion-detection trigger / manual button confirmationScheduled capture is the simplest to implement but wastes power; motion detection cuts power significantly but requires extra hardware cost and calibration
Network uplinkLoRaWAN / NB-IoT / Wi-FiThe data payload is tiny (only class + confidence is sent, tens of bytes), so LPWAN is fully sufficient; Wi-Fi has the lowest latency but requires infrastructure coverage

This scheme — AI inference at the edge, disease identified the moment it is photographed — drastically shortens the chain between front-end sensing results and back-end behavior control. When the model detects a typical disease, the system can directly trigger linked actions — for example, sending an adjustment command to the smart irrigation module, or marking the disease coordinates on a map as a reference for later precision spraying. This link also forms the key interface connecting the yield prediction and precision-operation modules.

12.2.2 Yield Prediction Models and Time-Series Analysis

Yield is not determined at sowing time — it is shaped jointly by weather, soil, pests, and management decisions, accumulating step by step. If a farm can obtain a reasonably accurate yield estimate weeks or even months before harvest, it can adjust its water and fertilizer plan in advance, schedule the harvest, and lock in sales channels. Behind this lies a typical time-series forecasting problem: build a model, from historical environmental sensor data and the corresponding yield records, that can estimate the final future yield. The output is a continuous value (for example, kilograms per hectare); the input is a multi-dimensional observation sequence that varies over time — temperature, precipitation, soil moisture, growing days.

Models fall roughly into two classes: statistical models and deep learning models. ARIMA (Auto-Regressive Integrated Moving Average) predicts future values using only the target variable's own history; it is simple in structure and highly interpretable. LSTM (Long Short-Term Memory), by contrast, naturally supports multiple exogenous variables (such as temperature and precipitation) as inputs and can learn their nonlinear relationships with yield. For annual crops, yield is not merely a function of "past yields" — it is strongly driven by environmental variables, and a single rainstorm or a spell of persistent low temperature is enough to push yield far off the historical trend. In practice, therefore, models like the LSTM that can fuse multi-dimensional features are preferred. Yet the ARIMA analysis framework — including stationarity tests and differencing — remains valuable for understanding the structure of time-series data: at minimum, it helps you judge whether the data is stationary and whether it is amenable to linear modeling.

12.2.2.1 ARIMA Modeling Steps

Suppose you have several years of annual yield records for one field; the typical ARIMA modeling workflow is as follows:

  1. Stationarity test. Use the ADF test (Augmented Dickey-Fuller Test) to check whether the series has a unit root. If the p-value is greater than 0.05, the series is non-stationary (for example, its mean increases year by year).
  2. Differencing. Take the first difference of a non-stationary series (y_t - y_{t-1}) to remove the trend. If the differenced series is stationary, the differencing order d = 1; otherwise keep differencing until it is.
  3. Model identification. Plot the autocorrelation function (ACF) and partial autocorrelation function (PACF), and estimate the AR order p and the MA order q from their tailing-off or cutting-off patterns.
  4. Parameter estimation and model diagnostics. Estimate the parameters by maximum likelihood, then use the Ljung-Box test to check whether the residuals are white noise. A model that passes the test is ready for forecasting.

ARIMA produces point forecasts with confidence intervals, but its forecasting power depends heavily on historical patterns continuing. If the external environment changes sharply (a new variety is introduced, or extreme weather strikes), the prediction error grows markedly.

12.2.2.2 LSTM Structure and Feature Engineering

LSTM's gating structure helps model sequence dependencies, but it is not inherently suitable for every agricultural forecast. When data volume is small, sites differ substantially, or exogenous variables dominate, tree models, state-space models, or models with agronomic priors may be more robust. Select the input window through time-series cross-validation and align it with the phenological stage, forecast horizon, and sampling period. "30–60 days" is only a candidate range to validate.

Temperature, precipitation, and soil moisture are the core environmental factors that directly affect water stress and photosynthetic efficiency. Growing days correspond to the crop's phenological stage — the same crop's sensitivity to environmental change at the heading stage is entirely different from that at the grain-filling stage. These environmental variables can be collected through wireless sensor networks. Multivariate input gives the LSTM the ability to capture how these factors interact along the time dimension.

12.2.2.3 Model Evaluation Metrics

The two most common metrics for evaluating yield prediction models are RMSE (Root Mean Squared Error) and MAE (Mean Absolute Error). RMSE penalizes large errors more heavily, which suits scenarios where large deviations must be avoided; MAE is more intuitive, reflecting the average level of deviation. As for what a "good" RMSE threshold is, it depends entirely on crop type, data quality, and use case — coarse yield early-warning tolerates far more error than agricultural insurance loss assessment.

12.2.2.4 Building an LSTM with TensorFlow/Keras

The code framework below converts sensor time-series data into the standard three-dimensional tensor (number of samples, time steps, number of features) as input to the LSTM network.

python
# Code 12-2 Framework for building an LSTM yield-prediction model with TensorFlow/Keras
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
from tensorflow.keras.optimizers import Adam
from sklearn.metrics import mean_squared_error, mean_absolute_error
from sklearn.model_selection import train_test_split

time_steps = 30
n_features = 4  # temperature, precipitation, soil moisture, growing days

# illustrative data; in production, read production records from the time-series store
np.random.seed(42)
n_samples = 1000
X = np.random.rand(n_samples, time_steps, n_features).astype(np.float32)
y = np.random.rand(n_samples, 1).astype(np.float32)

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

model = Sequential([
    LSTM(64, return_sequences=True, input_shape=(time_steps, n_features),
         activation='tanh'),
    Dropout(0.2),
    LSTM(32, return_sequences=False, activation='tanh'),
    Dropout(0.2),
    Dense(16, activation='relu'),
    Dense(1, activation='linear')
])

model.compile(optimizer=Adam(learning_rate=0.001),
              loss='mse', metrics=['mae'])

history = model.fit(
    X_train, y_train, validation_data=(X_test, y_test),
    epochs=50, batch_size=32, verbose=0
)

y_pred = model.predict(X_test)
rmse = np.sqrt(mean_squared_error(y_test, y_pred))
mae = mean_absolute_error(y_test, y_pred)

In real projects, use MinMaxScaler to normalize the environmental features, set the time steps sensibly to match the sensor sampling frequency, and export the model as a TensorFlow SavedModel deployed to edge nodes for real-time inference.

Engineering wrap-up: ARIMA can serve as a univariate statistical baseline, while LSTM is one candidate for multivariate sequence modeling. A universal "2–3 growing cycles" rule cannot decide whether to adopt deep learning. The relevant question is whether plots, years, cultivars, extreme weather, and management practices cover the target distribution. At minimum, hold out data by year, validate across plots or seasons, report confidence intervals, and compare against naive seasonal baselines, tree models, and domain models.

Figure 12-5 Yield Prediction: ARIMA vs. LSTMARIMA uses only the history of the target variable; LSTM fuses temperature, rainfall, soil moisture, and growing days; both are scored by RMSE and MAE.Figure 12-5 Yield Prediction: ARIMA vs. LSTMStatistics reads its own history · deep learning fuses multi-source environment · continuous yield output (kg/ha)Statistical · ARIMA (autoregressive integrated moving average)Uses only the history of the target itself; simple and highly interpretable1Stationarity testADF test · p>0.05 means non-stationary2DifferencingFirst difference y_t − y_{t−1} removes trend, d=13Model identificationACF/PACF tailing and cutoffs set orders p and q4Estimation & diagnosticsMaximum likelihood · Ljung-Box tests residual white noise5ForecastPoint forecast + confidence interval, assuming history repeatsDeep learning · LSTM (long short-term memory)Fuses exogenous variables to learn nonlinear environment–yield relationsInput: multivariate environment sequencesTemperature · rainfall · soil moisture · growing days (n_features=4)Sliding window: past T days (30–60 days)Covers full stages like grain filling; reshaped into 3-D tensorsLSTM layer + DropoutMemory cells and gates fix vanishing gradients; Dropout prevents overfittingDense regression outputlinear activation, outputs future yield (kg/ha)Shared Evaluation MetricsRMSE root mean square error · penalizes large errors moreMAE mean absolute error · a more intuitive average deviationARIMA · statistical routeLSTM · deep-learning routeStart with an ARIMA baseline under tight resources; gather 2–3 full growing seasons before moving to LSTMFigure 12-5 Yield prediction has two routes: ARIMA uses only the historical values of yield itself and is highly interpretable; LSTM fuses multiple variables — temperature, rainfall, soil moisture, and growing days — and captures nonlinear relationships. Both routes are finally evaluated with RMSE and MAE.
Figure 12-5 Yield Prediction: ARIMA vs. LSTM

12.2.3 The Control Logic of a Smart Irrigation System

Crop disease recognition and yield prediction show the farm manager the signs and the endgame of a problem, but the most frequent decision in daily operations is still "whether to irrigate, and how much." Irrigation control logic is the final execution layer of smart agriculture — all upstream analysis ultimately resolves into one valve opening or closing. The engineering difficulty here is not algorithmic complexity, but how to make robust field decisions from limited sensor data and weather forecasts.

Basic threshold control is the easiest scheme for an engineer to pick up. The system sets two soil moisture thresholds — a lower bound and an upper bound. Sensors report the real-time moisture value at fixed intervals, and each time the control program receives a reading it makes a binary decision: open the irrigation valve when the value falls below the lower bound, stop watering when it reaches the upper bound. These rules are simple and reliable, sufficient for routine conditions in a small greenhouse or test field. But threshold control sees only the "present," not the "future" — in the evening the soil moisture drops below the lower bound, the system starts automatic watering, yet the forecast shows moderate rain after midnight. Irrigating then not only wastes water but may also cause soil compaction and root hypoxia.

Introducing weather-forecast feedforward control is the engineering answer to this problem. The augmented rule logic runs roughly as follows:

  1. Obtain the precipitation probability and the forecast precipitation amount for the next 12–24 hours (via a free API or a local weather station).
  2. If soil moisture is below the lower bound but the precipitation probability over the coming period exceeds a preset threshold, postpone irrigation and record the basis for the decision.
  3. If moisture is below the lower bound and no effective precipitation is forecast, proceed to the irrigation-amount calculation.
  4. If moisture is above the upper bound but heavy rain is forecast, shorten the next sampling interval and raise the probability of triggering the drainage contingency plan.

This augmented rule needs no machine learning model at all — a few if-then-else statements implement it — yet it completely changes the system's decision mode, upgrading from feedback control that "reacts after seeing history" to hybrid control that "anticipates the future before deciding." The reliability of the weather API is what makes or breaks this scheme: free APIs deviate considerably at high latitudes or in mountainous areas, so a small local weather station should be set up as a supplementary data source. During implementation, run bare threshold control first, accumulate weather data and irrigation records for a while, and only then enable the feedforward part step by step.

Calculating the irrigation amount requires refined agronomic parameters. The formulas below are intended to illustrate dimensional relationships; they are not production thresholds that can be applied as-is, and actual values must be calibrated by an agronomist against local varieties and soils. The water requirement does not mean "filling the soil up" — it depends on the target crop's evapotranspiration rate at the current growth stage and the soil's current deficit. The common approach is based on the water-balance formula:

Irrigation amount (mm) = (field capacity − current soil water content) × root depth (m) × 1000 × planned wetting fraction

Here the "planned wetting fraction" is an empirical coefficient indicating that only part of the root zone is irrigated; it is usually set to 0.3–0.8, depending on crop species and irrigation method. Reference ranges of daily evapotranspiration for different crops at different growth stages can be found in the FAO-56 standard; in real projects, recalibrate after determining the crop coefficient Kc locally. Common figures: about 4–6 mm/d for wheat at the jointing stage, and about 6–9 mm/d for maize at the grain-filling stage (both are reference ranges and require local calibration).

An engineering reminder on unit conversion: multiply the soil moisture difference (a fraction) by the root depth (meters) to obtain the water deficit depth, then multiply by the planned wetting fraction and the irrigated area to obtain the total water volume. Make sure all input variables share consistent dimensions — this is a step that goes wrong easily during debugging yet must be pinned down.

An engineering checklist for irrigation decisions:

  • ☐ Have the data sources (soil sensors, weather API) been normalized to the same time interval?
  • ☐ Were the thresholds calibrated through field trials or FAO-56 references, rather than gut-feel values?
  • ☐ Is there a fallback strategy in place for weather-API offline or timeout (reverting to pure threshold control)?
  • ☐ Is the unit chain of the irrigation amount (soil moisture difference → deficit depth → total water volume) verified automatically?

Code 12-3 Irrigation decision pseudocode (running on an edge gateway)

python
def irrigation_decision(moisture, rain_prob_12h):
    T_LOW, T_HIGH = 30.0, 80.0   # illustrative values
    if moisture >= T_LOW:
        return
    if rain_prob_12h > 0.7:     # illustrative threshold
        log("Rain forecast, postpone irrigation")
        return

    # irrigation amount calculation (illustrative parameters, calibrated by an agronomist)
    field_cap = 85.0
    root_depth = 0.5
    wet_ratio = 0.6
    deficit_mm = (field_cap - moisture) / 100 * root_depth * 1000
    vol_m3 = deficit_mm * irrig_area_m2 * wet_ratio / 1000

    # rotation scheduling
    for t in split_into_periods(vol_m3, n=3):
        open_valve(), sleep(t), close_valve()
        sleep(900)  # infiltration pause

The pseudocode decomposes the decision into four independent steps. Engineers can first disable the weather-forecast part and debug the bare thresholds, then introduce the feedforward rules step by step. All the logic can run on a low-power MCU or an edge gateway — a direct embodiment of edge computing in agriculture. In real projects, thresholds, irrigated area, and flow coefficients must all be calibrated through field trials or by the FAO-56 method; what is given here serves only to explain the principle.

Figure 12-6 Smart Irrigation Control: Threshold + Weather FeedforwardWhen moisture falls below the lower limit, check the rain forecast first: defer irrigation if rain is coming, otherwise compute the amount and open the valve; above the upper limit, shorten the sampling interval.Figure 12-6 Smart Irrigation Control: Threshold + Weather FeedforwardHybrid control: from reacting to history to deciding on forecastSensor reports live moistureMoisture < lower limit?No · wait for next sampleNoYesFetch 12–24 h rain forecastRain probability > threshold?Yes · defer irrigation and log the reasonYesNoCompute irrigation amount (water balance)Irrigation (mm) = (field capacity − current moisture) × root depth (m) × 1000 × planned wetting fractionPlanned wetting fraction 0.3–0.8, by crop and irrigation typeOpen valve → irrigate → stop after infiltrationEngineering note: weather API reliability makes or breaks feedforwardFree APIs drift at high latitudes and in mountains — add a local mini weather station; run bare threshold control first to collect data, then enable feedforward gradually; fall back to pure threshold control when the API is offline.Figure 12-6 Irrigation decisions first check whether moisture has fallen below the lower limit, then consult the rainfall forecast: if rain is forecast, irrigation is deferred; only otherwise is the irrigation amount computed with the water-balance formula and the valve opened, avoiding the waste of watering right before it rains.
Figure 12-6 Smart Irrigation Control: Threshold + Weather Feedforward

From Industrial Software to AI Agents · Building a multi-protocol, cloud-native, open-source industrial IoT platform ready to evolve toward AI agents