mirror of
https://github.com/SyncrowIOT/syncrow-app.git
synced 2026-10-25 09:57:55 +00:00
water leak
This commit is contained in:
@@ -0,0 +1,182 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:firebase_database/firebase_database.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:syncrow_app/features/devices/bloc/water_leak_bloc/water_leak_event.dart';
|
||||
import 'package:syncrow_app/features/devices/bloc/water_leak_bloc/water_leak_state.dart';
|
||||
|
||||
import 'package:syncrow_app/features/devices/model/device_control_model.dart';
|
||||
import 'package:syncrow_app/features/devices/model/device_report_model.dart';
|
||||
import 'package:syncrow_app/features/devices/model/status_model.dart';
|
||||
import 'package:syncrow_app/features/devices/model/water_leak_model.dart';
|
||||
import 'package:syncrow_app/services/api/devices_api.dart';
|
||||
|
||||
class WaterLeakBloc extends Bloc<WaterLeakEvent, WaterLeakState> {
|
||||
final String WLId;
|
||||
WaterLeakBloc({
|
||||
required this.WLId,
|
||||
}) : super(const WaterLeakState()) {
|
||||
on<WaterLeakInitial>(_fetchStatus);
|
||||
on<ReportLogsInitial>(fetchLogsForLastMonth);
|
||||
on<ToggleLowBatteryEvent>(_toggleLowBattery);
|
||||
on<ToggleClosingReminderEvent>(_toggleClosingReminder);
|
||||
on<ToggleWaterLeakAlarmEvent>(_toggleWaterLeakAlarm);
|
||||
}
|
||||
Timer? _timer;
|
||||
bool lowBattery = false;
|
||||
bool closingReminder = false;
|
||||
bool waterAlarm = false;
|
||||
WaterLeakModel deviceStatus =
|
||||
WaterLeakModel(waterContactState: false, batteryPercentage: 0);
|
||||
|
||||
void _fetchStatus(
|
||||
WaterLeakInitial event, Emitter<WaterLeakState> emit) async {
|
||||
emit(WaterLeakLoadingState());
|
||||
try {
|
||||
var response = await DevicesAPI.getDeviceStatus(WLId);
|
||||
List<StatusModel> statusModelList = [];
|
||||
for (var status in response['status']) {
|
||||
statusModelList.add(StatusModel.fromJson(status));
|
||||
}
|
||||
deviceStatus = WaterLeakModel.fromJson(
|
||||
statusModelList,
|
||||
);
|
||||
emit(UpdateState(waterSensor: deviceStatus));
|
||||
Future.delayed(const Duration(milliseconds: 500));
|
||||
_listenToChanges();
|
||||
} catch (e) {
|
||||
emit(WaterLeakFailedState(errorMessage: e.toString()));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Toggle functions for each switch
|
||||
void _toggleLowBattery(
|
||||
ToggleLowBatteryEvent event, Emitter<WaterLeakState> emit) async {
|
||||
emit(LoadingNewSate(waterSensor: deviceStatus));
|
||||
try {
|
||||
lowBattery = event.isLowBatteryEnabled;
|
||||
emit(UpdateState(waterSensor: deviceStatus));
|
||||
|
||||
// API call to update the state, if necessary
|
||||
await DevicesAPI.controlDevice(
|
||||
DeviceControlModel(
|
||||
deviceId: WLId,
|
||||
code: 'low_battery',
|
||||
value: lowBattery,
|
||||
),
|
||||
WLId,
|
||||
);
|
||||
} catch (e) {
|
||||
emit(WaterLeakFailedState(errorMessage: e.toString()));
|
||||
}
|
||||
}
|
||||
|
||||
void _toggleClosingReminder(
|
||||
ToggleClosingReminderEvent event, Emitter<WaterLeakState> emit) async {
|
||||
emit(LoadingNewSate(waterSensor: deviceStatus));
|
||||
try {
|
||||
closingReminder = event.isClosingReminderEnabled;
|
||||
emit(UpdateState(waterSensor: deviceStatus));
|
||||
|
||||
// API call to update the state, if necessary
|
||||
await DevicesAPI.controlDevice(
|
||||
DeviceControlModel(
|
||||
deviceId: WLId,
|
||||
code: 'closing_reminder',
|
||||
value: closingReminder,
|
||||
),
|
||||
WLId,
|
||||
);
|
||||
} catch (e) {
|
||||
emit(WaterLeakFailedState(errorMessage: e.toString()));
|
||||
}
|
||||
}
|
||||
|
||||
void _toggleWaterLeakAlarm(
|
||||
ToggleWaterLeakAlarmEvent event, Emitter<WaterLeakState> emit) async {
|
||||
emit(LoadingNewSate(waterSensor: deviceStatus));
|
||||
try {
|
||||
waterAlarm = event.isWaterLeakAlarmEnabled;
|
||||
emit(UpdateState(waterSensor: deviceStatus));
|
||||
|
||||
// API call to update the state, if necessary
|
||||
await DevicesAPI.controlDevice(
|
||||
DeviceControlModel(
|
||||
deviceId: WLId,
|
||||
code: 'water_alarm',
|
||||
value: waterAlarm,
|
||||
),
|
||||
WLId,
|
||||
);
|
||||
} catch (e) {
|
||||
emit(WaterLeakFailedState(errorMessage: e.toString()));
|
||||
}
|
||||
}
|
||||
|
||||
DeviceReport recordGroups = DeviceReport(
|
||||
startTime: '0',
|
||||
endTime: '0',
|
||||
data: [DeviceEvent(code: '111', eventTime: 23456789, value: 'tyuio')]);
|
||||
|
||||
Future<void> fetchLogsForLastMonth(
|
||||
ReportLogsInitial event, Emitter<WaterLeakState> emit) async {
|
||||
// Get the current date and time
|
||||
DateTime now = DateTime.now();
|
||||
|
||||
// Calculate the date one month ago
|
||||
DateTime lastMonth = DateTime(now.year, now.month - 1, now.day);
|
||||
|
||||
// Convert the date to milliseconds since epoch (Unix timestamp in milliseconds)
|
||||
int startTime = lastMonth.millisecondsSinceEpoch;
|
||||
int endTime = now.millisecondsSinceEpoch;
|
||||
try {
|
||||
emit(WaterLeakLoadingState());
|
||||
// var response = await DevicesAPI.getReportLogs(
|
||||
// startTime:
|
||||
// startTime.toString(), // Convert to String if the API expects it
|
||||
// endTime: endTime.toString(), // Convert to String if the API expects it
|
||||
// deviceUuid: WLId,
|
||||
// code: 'watercontact_state',
|
||||
// );
|
||||
// print('response======${response}');
|
||||
// recordGroups = response;
|
||||
// Process response here
|
||||
emit(UpdateState(waterSensor: deviceStatus));
|
||||
} on DioException catch (e) {
|
||||
final errorData = e.response!.data;
|
||||
String errorMessage = errorData['message'];
|
||||
// Handle error
|
||||
print('Error fetching logs: ${errorMessage}');
|
||||
}
|
||||
}
|
||||
|
||||
_listenToChanges() {
|
||||
try {
|
||||
DatabaseReference ref =
|
||||
FirebaseDatabase.instance.ref('device-status/$WLId');
|
||||
Stream<DatabaseEvent> stream = ref.onValue;
|
||||
|
||||
stream.listen((DatabaseEvent event) async {
|
||||
if (_timer != null) {
|
||||
await Future.delayed(const Duration(seconds: 2));
|
||||
}
|
||||
Map<dynamic, dynamic> usersMap =
|
||||
event.snapshot.value as Map<dynamic, dynamic>;
|
||||
List<StatusModel> statusList = [];
|
||||
|
||||
usersMap['status'].forEach((element) {
|
||||
statusList.add(StatusModel(code: element['code'], value: true));
|
||||
});
|
||||
|
||||
deviceStatus = WaterLeakModel.fromJson(statusList);
|
||||
if (!isClosed) {
|
||||
add(
|
||||
WaterLeakSwitch(switchD: deviceStatus.waterContactState),
|
||||
);
|
||||
}
|
||||
});
|
||||
} catch (_) {}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,102 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
|
||||
abstract class WaterLeakEvent extends Equatable {
|
||||
const WaterLeakEvent();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class WaterLeakLoading extends WaterLeakEvent {}
|
||||
|
||||
class WaterLeakSwitch extends WaterLeakEvent {
|
||||
final bool switchD;
|
||||
final String deviceId;
|
||||
final String productId;
|
||||
const WaterLeakSwitch({required this.switchD, this.deviceId = '', this.productId = ''});
|
||||
|
||||
@override
|
||||
List<Object> get props => [switchD, deviceId, productId];
|
||||
}
|
||||
|
||||
class WaterLeakUpdated extends WaterLeakEvent {}
|
||||
|
||||
class WaterLeakInitial extends WaterLeakEvent {
|
||||
const WaterLeakInitial();
|
||||
}
|
||||
|
||||
class ReportLogsInitial extends WaterLeakEvent {
|
||||
const ReportLogsInitial();
|
||||
}
|
||||
|
||||
|
||||
class WaterLeakChangeStatus extends WaterLeakEvent {}
|
||||
|
||||
|
||||
class GetCounterEvent extends WaterLeakEvent {
|
||||
final String deviceCode;
|
||||
const GetCounterEvent({required this.deviceCode});
|
||||
@override
|
||||
List<Object> get props => [deviceCode];
|
||||
}
|
||||
|
||||
|
||||
|
||||
class ToggleLowBatteryEvent extends WaterLeakEvent {
|
||||
final bool isLowBatteryEnabled;
|
||||
|
||||
const ToggleLowBatteryEvent(this.isLowBatteryEnabled);
|
||||
|
||||
@override
|
||||
List<Object> get props => [isLowBatteryEnabled];
|
||||
}
|
||||
|
||||
class ToggleClosingReminderEvent extends WaterLeakEvent {
|
||||
final bool isClosingReminderEnabled;
|
||||
|
||||
const ToggleClosingReminderEvent(this.isClosingReminderEnabled);
|
||||
|
||||
@override
|
||||
List<Object> get props => [isClosingReminderEnabled];
|
||||
}
|
||||
|
||||
class ToggleWaterLeakAlarmEvent extends WaterLeakEvent {
|
||||
final bool isWaterLeakAlarmEnabled;
|
||||
|
||||
const ToggleWaterLeakAlarmEvent(this.isWaterLeakAlarmEnabled);
|
||||
|
||||
@override
|
||||
List<Object> get props => [isWaterLeakAlarmEnabled];
|
||||
}
|
||||
|
||||
|
||||
|
||||
class SetCounterValue extends WaterLeakEvent {
|
||||
final Duration duration;
|
||||
final String deviceCode;
|
||||
const SetCounterValue({required this.duration, required this.deviceCode});
|
||||
@override
|
||||
List<Object> get props => [duration, deviceCode];
|
||||
}
|
||||
|
||||
class StartTimer extends WaterLeakEvent {
|
||||
final int duration;
|
||||
|
||||
const StartTimer(this.duration);
|
||||
|
||||
@override
|
||||
List<Object> get props => [duration];
|
||||
}
|
||||
|
||||
class TickTimer extends WaterLeakEvent {
|
||||
final int remainingTime;
|
||||
|
||||
const TickTimer(this.remainingTime);
|
||||
|
||||
@override
|
||||
List<Object> get props => [remainingTime];
|
||||
}
|
||||
|
||||
class StopTimer extends WaterLeakEvent {}
|
||||
|
||||
class OnClose extends WaterLeakEvent {}
|
||||
@@ -0,0 +1,39 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:syncrow_app/features/devices/model/water_leak_model.dart';
|
||||
|
||||
class WaterLeakState extends Equatable {
|
||||
const WaterLeakState();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class WaterLeakInitialState extends WaterLeakState {}
|
||||
|
||||
class WaterLeakLoadingState extends WaterLeakState {}
|
||||
|
||||
class WaterLeakFailedState extends WaterLeakState {
|
||||
final String errorMessage;
|
||||
|
||||
const WaterLeakFailedState({required this.errorMessage});
|
||||
|
||||
@override
|
||||
List<Object> get props => [errorMessage];
|
||||
}
|
||||
|
||||
class UpdateState extends WaterLeakState {
|
||||
final WaterLeakModel waterSensor;
|
||||
const UpdateState({required this.waterSensor});
|
||||
|
||||
@override
|
||||
List<Object> get props => [waterSensor];
|
||||
}
|
||||
|
||||
|
||||
class LoadingNewSate extends WaterLeakState {
|
||||
final WaterLeakModel waterSensor;
|
||||
const LoadingNewSate({required this.waterSensor});
|
||||
|
||||
@override
|
||||
List<Object> get props => [waterSensor];
|
||||
}
|
||||
Reference in New Issue
Block a user