Industrial Equipment Monitoring via Mobile App

NOVASOLUTIONS.TECHNOLOGY is engaged in the development, support and maintenance of iOS, Android, PWA mobile applications. We have extensive experience and expertise in publishing mobile applications in popular markets like Google Play, App Store, Amazon, AppGallery and others.
Development and support of all types of mobile applications:
Information and entertainment mobile applications
News apps, games, reference guides, online catalogs, weather apps, fitness and health apps, travel apps, educational apps, social networks and messengers, quizzes, blogs and podcasts, forums, aggregators
E-commerce mobile applications
Online stores, B2B apps, marketplaces, online exchanges, cashback services, exchanges, dropshipping platforms, loyalty programs, food and goods delivery, payment systems.
Business process management mobile applications
CRM systems, ERP systems, project management, sales team tools, financial management, production management, logistics and delivery management, HR management, data monitoring systems
Electronic services mobile applications
Classified ads platforms, online schools, online cinemas, electronic service platforms, cashback platforms, video hosting, thematic portals, online booking and scheduling platforms, online trading platforms

These are just some of the types of mobile applications we work with, and each of them may have its own specific features and functionality, tailored to the specific needs and goals of the client.

Showing 1 of 1 servicesAll 1735 services
Industrial Equipment Monitoring via Mobile App
Complex
from 1 week to 3 months
FAQ
Our competencies:
Development stages
Latest works
  • image_mobile-applications_feedme_467_0.webp
    Development of a mobile application for FEEDME
    756
  • image_mobile-applications_xoomer_471_0.webp
    Development of a mobile application for XOOMER
    624
  • image_mobile-applications_rhl_428_0.webp
    Development of a mobile application for RHL
    1052
  • image_mobile-applications_zippy_411_0.webp
    Development of a mobile application for ZIPPY
    947
  • image_mobile-applications_affhome_429_0.webp
    Development of a mobile application for Affhome
    862
  • image_mobile-applications_flavors_409_0.webp
    Development of a mobile application for the FLAVORS company
    445

Industrial Equipment Monitoring via Mobile App

Industrial equipment monitoring — task not so much of development as of choosing right data collection architecture. Vibration sensor on bearing generates 25,600 samples per second. Temperature sensor — once per 5 seconds. Motor current — 1,000 measurements per second. Mobile app cannot and should not work with this stream directly — only aggregated metrics, trends and alerts.

Data Collection Architecture

Equipment-level data collected by Edge component: industrial gateway (Moxa, Advantech, Siemens IPC) or custom Linux server. Normalizes data from different protocols and publishes aggregates to MQTT or serves via REST/WebSocket.

For mobile app two streams important:

  • Real-time — current key parameter values, update every 1-5 seconds. WebSocket.
  • History — trends over shift, day, week. REST API with pagination and aggregation.
Sensors → PLC / Edge Gateway → Time-Series DB (InfluxDB / TimescaleDB)
                                         ↓
                                 Backend API (REST + WebSocket)
                                         ↓
                                 Mobile app

Real-time via WebSocket: Flutter

class EquipmentMonitorRepository {
  WebSocketChannel? _channel;
  final StreamController<EquipmentState> _stateController =
      StreamController.broadcast();

  Stream<EquipmentState> get stateStream => _stateController.stream;

  void connect(String equipmentId, String token) {
    _channel = WebSocketChannel.connect(
      Uri.parse('wss://iiot.factory.com/ws/equipment/$equipmentId'),
    );

    _channel!.stream
        .map((event) => json.decode(event as String))
        .map(EquipmentState.fromJson)
        .listen(
          _stateController.add,
          onError: _handleError,
          onDone: _scheduleReconnect,
        );

    _channel!.sink.add(json.encode({'auth': token}));
  }

  void _scheduleReconnect() {
    Future.delayed(const Duration(seconds: 5), () => connect(_lastId, _lastToken));
  }
}

BLoC for monitoring screen state management:

class EquipmentMonitorBloc extends Bloc<EquipmentEvent, EquipmentMonitorState> {
  StreamSubscription<EquipmentState>? _subscription;

  EquipmentMonitorBloc(this._repository) : super(EquipmentMonitorInitial()) {
    on<StartMonitoring>((event, emit) async {
      _subscription = _repository.stateStream.listen(
        (state) => add(StateUpdated(state)),
      );
      _repository.connect(event.equipmentId, event.token);
    });

    on<StateUpdated>((event, emit) {
      final current = event.state;
      final isAlert = current.temperature > 85.0 || current.vibrationRms > 12.5;
      emit(EquipmentMonitorRunning(state: current, hasAlert: isAlert));
    });
  }
}

Trend Visualization

For historical data use fl_chart (Flutter) or MPAndroidChart (Android native). Key optimization — don't pass all 86,400 points per day to chart, aggregate on API side. Query to InfluxDB-based API:

GET /api/v1/equipment/{id}/trend?
  parameter=temperature&
  from=2024-01-15T06:00:00Z&
  to=2024-01-15T18:00:00Z&
  resolution=300  # aggregate per 5 minutes

Response — 144 points instead of 43,200. Chart renders without freezes.

Baseline and Deviations

Useful feature — display baseline (normal range) on graph. If motor current normal 12-15A, highlight zone, operator immediately sees deviation:

LineChartData buildTrendChart(List<TrendPoint> data, Range baseline) {
  return LineChartData(
    extraLinesData: ExtraLinesData(
      horizontalLines: [
        HorizontalLine(y: baseline.min, color: Colors.green.withOpacity(0.3)),
        HorizontalLine(y: baseline.max, color: Colors.green.withOpacity(0.3)),
      ],
    ),
    betweenBarsData: [
      BetweenBarsData(
        fromIndex: 0,
        toIndex: 0,
        color: Colors.green.withOpacity(0.1),
      ),
    ],
    lineBarsData: [
      LineChartBarData(
        spots: data.map((p) => FlSpot(p.timestamp.toDouble(), p.value)).toList(),
        color: data.any((p) => p.value > baseline.max || p.value < baseline.min)
            ? Colors.red
            : Colors.blue,
      ),
    ],
  );
}

Alerts and Escalation

Simple alert — push via FCM/APNs. But for critical situations need escalation: if operator doesn't acknowledge alert within 5 minutes — goes to shift master, then shop chief.

Keep escalation logic on backend, mobile app only displays and acknowledges. Alert acknowledgement:

Future<void> acknowledgeAlert(String alertId) async {
  await _dio.post('/api/v1/alerts/$alertId/acknowledge', data: {
    'acknowledgedBy': currentUser.id,
    'acknowledgedAt': DateTime.now().toIso8601String(),
    'note': _noteController.text,
  });
}

Alert screen shows escalation history — who received, who saw, who acknowledged. Important for post-shift analysis.

Offline and Shop Work

Factory shops — unstable Wi-Fi zone. Cache critical data (current metrics, active alerts) in SQLite via Room or Drift. On connection loss show last known state with "data from HH:MM, no connection" label.

Monitoring app development for one equipment type with WebSocket telemetry and historical trends — 4-6 weeks. Adding support for multiple equipment types, complex alerts with escalation, offline mode — 2-3 months. Cost calculated individually after analyzing data sources and reliability requirements.