diff --git a/lib/screens/monitoring/wind_speed_monitoring_screen.dart b/lib/screens/monitoring/wind_speed_monitoring_screen.dart index f56b33f..eb7ecf5 100644 --- a/lib/screens/monitoring/wind_speed_monitoring_screen.dart +++ b/lib/screens/monitoring/wind_speed_monitoring_screen.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; import 'package:fl_chart/fl_chart.dart'; +import 'package:firebase_database/firebase_database.dart'; +import 'dart:async'; import 'widgets/monitoring_shared.dart'; /// WIND SPEED MONITORING SCREEN @@ -13,9 +15,41 @@ class WindSpeedMonitoringScreen extends StatefulWidget { class _WindSpeedMonitoringScreenState extends State { String _selectedPeriod = "Hari Ini"; + // realtime database state + final DatabaseReference _realtimeRef = FirebaseDatabase.instance.ref('anemometer/realtime'); + StreamSubscription? _realtimeSub; + double _currentSpeed = 0.0; + List _dailySpeeds = List.filled(24, 0.0); + + + @override + void initState() { + super.initState(); + _realtimeSub = _realtimeRef.onValue.listen(_onRealtimeData); + } + + void _onRealtimeData(DatabaseEvent event) { + final data = event.snapshot.value; + if (data is Map) { + final speed = (data['kecepatan'] ?? 0).toDouble(); + setState(() { + _currentSpeed = speed; + // shift hourly data, keep latest at end + _dailySpeeds.removeAt(0); + _dailySpeeds.add(speed); + }); + } + } + + @override + void dispose() { + _realtimeSub?.cancel(); + super.dispose(); + } + @override Widget build(BuildContext context) { - return Scaffold( + return Scaffold, appBar: AppBar( title: const Text("Monitoring Kecepatan Angin"), centerTitle: true, @@ -155,12 +189,10 @@ class _WindSpeedMonitoringScreenState extends State { List _getWindSpeedPeriodData() { switch (_selectedPeriod) { case "Hari Ini": + // use live-updated hourly speeds if available return List.generate(24, (i) { - final values = [ - 5.0, 5.2, 4.8, 4.5, 4.3, 4.6, 5.1, 6.0, 7.2, 8.5, - 9.0, 10.2, 11.0, 10.5, 10.0, 9.2, 8.0, 6.5, 5.5, 5.0, 4.8, 4.5, 5.0, 5.2 - ]; - return FlSpot(i.toDouble(), values[i]); + final value = _dailySpeeds[i]; + return FlSpot(i.toDouble(), value); }); case "Minggu Ini": return [ @@ -366,7 +398,7 @@ class _WindSpeedMonitoringScreenState extends State { ), lineBarsData: [ LineChartBarData( - spots: _getWindSpeedPeriodData(), + spots: _getWindSpeedPeriodData(), // uses _dailySpeeds now isCurved: true, barWidth: 2.5, dotData: FlDotData( diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 00d0898..608950e 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -8,11 +8,13 @@ import Foundation import cloud_firestore import firebase_auth import firebase_core +import firebase_database import google_sign_in_ios func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { FLTFirebaseFirestorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseFirestorePlugin")) FLTFirebaseAuthPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseAuthPlugin")) FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) + FLTFirebaseDatabasePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseDatabasePlugin")) FLTGoogleSignInPlugin.register(with: registry.registrar(forPlugin: "FLTGoogleSignInPlugin")) } diff --git a/pubspec.lock b/pubspec.lock index bce6ad9..7d18d73 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: _flutterfire_internals - sha256: e4a1b612fd2955908e26116075b3a4baf10c353418ca645b4deae231c82bf144 + sha256: cd83f7d6bd4e4c0b0b4fef802e8796784032e1cc23d7b0e982cf5d05d9bbe182 url: "https://pub.dev" source: hosted - version: "1.3.65" + version: "1.3.66" async: dependency: transitive description: @@ -133,10 +133,10 @@ packages: dependency: "direct main" description: name: firebase_core - sha256: "29cfa93c771d8105484acac340b5ea0835be371672c91405a300303986f4eba9" + sha256: "923085c881663ef685269b013e241b428e1fb03cdd0ebde265d9b40ff18abf80" url: "https://pub.dev" source: hosted - version: "4.3.0" + version: "4.4.0" firebase_core_platform_interface: dependency: transitive description: @@ -149,10 +149,34 @@ packages: dependency: transitive description: name: firebase_core_web - sha256: a631bbfbfa26963d68046aed949df80b228964020e9155b086eff94f462bbf1f + sha256: "83e7356c704131ca4d8d8dd57e360d8acecbca38b1a3705c7ae46cc34c708084" url: "https://pub.dev" source: hosted - version: "3.3.1" + version: "3.4.0" + firebase_database: + dependency: "direct main" + description: + name: firebase_database + sha256: f13676fab84671a808eb5eaeecfa2bcb5a3fed2802798c0dd16cb786139a6492 + url: "https://pub.dev" + source: hosted + version: "12.1.3" + firebase_database_platform_interface: + dependency: transitive + description: + name: firebase_database_platform_interface + sha256: "2444ec9999a7295b0e7f3fea60105dbbe72fdfad5a9e4c93e72d0b51c181f128" + url: "https://pub.dev" + source: hosted + version: "0.3.0+2" + firebase_database_web: + dependency: transitive + description: + name: firebase_database_web + sha256: "211b6deff7ac373bb539f079d909799e9231397daddc9e0f1768f50f6216f034" + url: "https://pub.dev" + source: hosted + version: "0.2.7+3" fl_chart: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 8b9171e..6660d29 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -9,6 +9,7 @@ dependencies: sdk: flutter firebase_core: ^4.3.0 firebase_auth: ^6.1.3 + firebase_database: ^10.0.6 cloud_firestore: ^6.1.1 rxdart: ^0.27.7 google_sign_in: ^7.2.0 @@ -19,6 +20,7 @@ dependencies: path: packages/user_repository cupertino_icons: ^1.0.8 fl_chart: ^1.1.1 + firebase_database: ^12.1.3 dev_dependencies: flutter_test: