mirror of
https://github.com/SyncrowIOT/web.git
synced 2025-11-27 02:34:56 +00:00
push ceiling sensor batch control
This commit is contained in:
@ -14,8 +14,9 @@ class CeilingSensorBloc extends Bloc<CeilingSensorEvent, CeilingSensorState> {
|
|||||||
|
|
||||||
CeilingSensorBloc({required this.deviceId}) : super(CeilingInitialState()) {
|
CeilingSensorBloc({required this.deviceId}) : super(CeilingInitialState()) {
|
||||||
on<CeilingInitialEvent>(_fetchCeilingSensorStatus);
|
on<CeilingInitialEvent>(_fetchCeilingSensorStatus);
|
||||||
on<CeilingBatchControlEvent>(_fetchCeilingSensorBatchControl);
|
on<CeilingFetchDeviceStatusEvent>(_fetchCeilingSensorBatchControl);
|
||||||
on<CeilingChangeValueEvent>(_changeValue);
|
on<CeilingChangeValueEvent>(_changeValue);
|
||||||
|
on<CeilingBatchControlEvent>(_onBatchControl);
|
||||||
on<GetCeilingDeviceReportsEvent>(_getDeviceReports);
|
on<GetCeilingDeviceReportsEvent>(_getDeviceReports);
|
||||||
on<ShowCeilingDescriptionEvent>(_showDescription);
|
on<ShowCeilingDescriptionEvent>(_showDescription);
|
||||||
on<BackToCeilingGridViewEvent>(_backToGridView);
|
on<BackToCeilingGridViewEvent>(_backToGridView);
|
||||||
@ -25,7 +26,8 @@ class CeilingSensorBloc extends Bloc<CeilingSensorEvent, CeilingSensorState> {
|
|||||||
CeilingInitialEvent event, Emitter<CeilingSensorState> emit) async {
|
CeilingInitialEvent event, Emitter<CeilingSensorState> emit) async {
|
||||||
emit(CeilingLoadingInitialState());
|
emit(CeilingLoadingInitialState());
|
||||||
try {
|
try {
|
||||||
var response = await DevicesManagementApi().getDeviceStatus(deviceId);
|
var response = await DevicesManagementApi()
|
||||||
|
.getDeviceStatus(event.deviceId);
|
||||||
deviceStatus = CeilingSensorModel.fromJson(response.status);
|
deviceStatus = CeilingSensorModel.fromJson(response.status);
|
||||||
emit(CeilingUpdateState(ceilingSensorModel: deviceStatus));
|
emit(CeilingUpdateState(ceilingSensorModel: deviceStatus));
|
||||||
// _listenToChanges();
|
// _listenToChanges();
|
||||||
@ -68,34 +70,76 @@ class CeilingSensorBloc extends Bloc<CeilingSensorEvent, CeilingSensorState> {
|
|||||||
}
|
}
|
||||||
emit(CeilingUpdateState(ceilingSensorModel: deviceStatus));
|
emit(CeilingUpdateState(ceilingSensorModel: deviceStatus));
|
||||||
await _runDeBouncer(
|
await _runDeBouncer(
|
||||||
deviceId: deviceId, code: event.code, value: event.value, emit: emit);
|
deviceId: deviceId,
|
||||||
|
code: event.code,
|
||||||
|
value: event.value,
|
||||||
|
emit: emit,
|
||||||
|
isBatch: false,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _onBatchControl(
|
||||||
|
CeilingBatchControlEvent event, Emitter<CeilingSensorState> emit) async {
|
||||||
|
emit(CeilingLoadingNewSate(ceilingSensorModel: deviceStatus));
|
||||||
|
if (event.code == 'sensitivity') {
|
||||||
|
deviceStatus.sensitivity = event.value;
|
||||||
|
} else if (event.code == 'none_body_time') {
|
||||||
|
deviceStatus.noBodyTime = event.value;
|
||||||
|
} else if (event.code == 'moving_max_dis') {
|
||||||
|
deviceStatus.maxDistance = event.value;
|
||||||
|
} else if (event.code == 'scene') {
|
||||||
|
deviceStatus.spaceType = getSpaceType(event.value);
|
||||||
|
}
|
||||||
|
emit(CeilingUpdateState(ceilingSensorModel: deviceStatus));
|
||||||
|
await _runDeBouncer(
|
||||||
|
deviceId: event.deviceIds,
|
||||||
|
code: event.code,
|
||||||
|
value: event.value,
|
||||||
|
emit: emit,
|
||||||
|
isBatch: true,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
_runDeBouncer({
|
_runDeBouncer({
|
||||||
required String deviceId,
|
required dynamic deviceId,
|
||||||
required String code,
|
required String code,
|
||||||
required dynamic value,
|
required dynamic value,
|
||||||
required Emitter<CeilingSensorState> emit,
|
required Emitter<CeilingSensorState> emit,
|
||||||
|
required bool isBatch,
|
||||||
}) {
|
}) {
|
||||||
|
late String id;
|
||||||
|
|
||||||
|
if (deviceId is List) {
|
||||||
|
id = deviceId.first;
|
||||||
|
} else {
|
||||||
|
id = deviceId;
|
||||||
|
}
|
||||||
|
|
||||||
if (_timer != null) {
|
if (_timer != null) {
|
||||||
_timer!.cancel();
|
_timer!.cancel();
|
||||||
}
|
}
|
||||||
_timer = Timer(const Duration(seconds: 1), () async {
|
_timer = Timer(const Duration(seconds: 1), () async {
|
||||||
try {
|
try {
|
||||||
final response = await DevicesManagementApi()
|
late bool response;
|
||||||
.deviceControl(deviceId, Status(code: code, value: value));
|
if (isBatch) {
|
||||||
|
response = await DevicesManagementApi()
|
||||||
|
.deviceBatchControl(deviceId, code, value);
|
||||||
|
} else {
|
||||||
|
response = await DevicesManagementApi()
|
||||||
|
.deviceControl(deviceId, Status(code: code, value: value));
|
||||||
|
}
|
||||||
|
|
||||||
if (!response) {
|
if (!response) {
|
||||||
add(CeilingInitialEvent());
|
add(CeilingInitialEvent(id));
|
||||||
}
|
}
|
||||||
if (response == true && code == 'scene') {
|
if (response == true && code == 'scene') {
|
||||||
emit(CeilingLoadingInitialState());
|
emit(CeilingLoadingInitialState());
|
||||||
await Future.delayed(const Duration(seconds: 1));
|
await Future.delayed(const Duration(seconds: 1));
|
||||||
add(CeilingInitialEvent());
|
add(CeilingInitialEvent(id));
|
||||||
}
|
}
|
||||||
} catch (_) {
|
} catch (_) {
|
||||||
await Future.delayed(const Duration(milliseconds: 500));
|
await Future.delayed(const Duration(milliseconds: 500));
|
||||||
add(CeilingInitialEvent());
|
add(CeilingInitialEvent(id));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -131,10 +175,12 @@ class CeilingSensorBloc extends Bloc<CeilingSensorEvent, CeilingSensorState> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
FutureOr<void> _fetchCeilingSensorBatchControl(
|
FutureOr<void> _fetchCeilingSensorBatchControl(
|
||||||
CeilingBatchControlEvent event, Emitter<CeilingSensorState> emit) async {
|
CeilingFetchDeviceStatusEvent event,
|
||||||
|
Emitter<CeilingSensorState> emit) async {
|
||||||
emit(CeilingLoadingInitialState());
|
emit(CeilingLoadingInitialState());
|
||||||
try {
|
try {
|
||||||
var response = await DevicesManagementApi().getDeviceStatus(deviceId);
|
var response =
|
||||||
|
await DevicesManagementApi().getBatchStatus(event.devicesIds);
|
||||||
deviceStatus = CeilingSensorModel.fromJson(response.status);
|
deviceStatus = CeilingSensorModel.fromJson(response.status);
|
||||||
emit(CeilingUpdateState(ceilingSensorModel: deviceStatus));
|
emit(CeilingUpdateState(ceilingSensorModel: deviceStatus));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|||||||
@ -7,9 +7,37 @@ abstract class CeilingSensorEvent extends Equatable {
|
|||||||
List<Object> get props => [];
|
List<Object> get props => [];
|
||||||
}
|
}
|
||||||
|
|
||||||
class CeilingInitialEvent extends CeilingSensorEvent {}
|
class CeilingInitialEvent extends CeilingSensorEvent {
|
||||||
|
final String deviceId;
|
||||||
|
const CeilingInitialEvent(this.deviceId);
|
||||||
|
|
||||||
class CeilingBatchControlEvent extends CeilingSensorEvent {}
|
@override
|
||||||
|
List<Object> get props => [deviceId];
|
||||||
|
}
|
||||||
|
|
||||||
|
class CeilingFetchDeviceStatusEvent extends CeilingSensorEvent {
|
||||||
|
final List<String> devicesIds;
|
||||||
|
|
||||||
|
const CeilingFetchDeviceStatusEvent(this.devicesIds);
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [devicesIds];
|
||||||
|
}
|
||||||
|
|
||||||
|
class CeilingBatchControlEvent extends CeilingSensorEvent {
|
||||||
|
final List<String> deviceIds;
|
||||||
|
final String code;
|
||||||
|
final dynamic value;
|
||||||
|
|
||||||
|
const CeilingBatchControlEvent({
|
||||||
|
required this.deviceIds,
|
||||||
|
required this.code,
|
||||||
|
required this.value,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [deviceIds, code, value];
|
||||||
|
}
|
||||||
|
|
||||||
class CeilingChangeValueEvent extends CeilingSensorEvent {
|
class CeilingChangeValueEvent extends CeilingSensorEvent {
|
||||||
final dynamic value;
|
final dynamic value;
|
||||||
|
|||||||
@ -66,3 +66,12 @@ class ShowCeilingDescriptionState extends CeilingSensorState {
|
|||||||
@override
|
@override
|
||||||
List<Object> get props => [description];
|
List<Object> get props => [description];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class CeilingBatchControlSuccessState extends CeilingSensorState {
|
||||||
|
final CeilingSensorModel ceilingSensorModel;
|
||||||
|
|
||||||
|
const CeilingBatchControlSuccessState({required this.ceilingSensorModel});
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [ceilingSensorModel];
|
||||||
|
}
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:syncrow_web/pages/device_managment/all_devices/models/device_status.dart';
|
import 'package:syncrow_web/pages/device_managment/all_devices/models/device_status.dart';
|
||||||
|
|
||||||
class CeilingSensorModel {
|
class CeilingSensorModel {
|
||||||
@ -91,6 +92,30 @@ class CeilingSensorModel {
|
|||||||
spaceType: _spaceType,
|
spaceType: _spaceType,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CeilingSensorModel copyWith({
|
||||||
|
String? presenceState,
|
||||||
|
int? sensitivity,
|
||||||
|
String? checkingResult,
|
||||||
|
int? presenceRange,
|
||||||
|
int? sportsPara,
|
||||||
|
String? bodyMovement,
|
||||||
|
String? noBodyTime,
|
||||||
|
int? maxDistance,
|
||||||
|
SpaceTypes? spaceType,
|
||||||
|
}) {
|
||||||
|
return CeilingSensorModel(
|
||||||
|
presenceState: presenceState ?? this.presenceState,
|
||||||
|
sensitivity: sensitivity ?? this.sensitivity,
|
||||||
|
checkingResult: checkingResult ?? this.checkingResult,
|
||||||
|
presenceRange: presenceRange ?? this.presenceRange,
|
||||||
|
sportsPara: sportsPara ?? this.sportsPara,
|
||||||
|
bodyMovement: bodyMovement ?? this.bodyMovement,
|
||||||
|
noBodyTime: noBodyTime ?? this.noBodyTime,
|
||||||
|
maxDistance: maxDistance ?? this.maxDistance,
|
||||||
|
spaceType: spaceType ?? this.spaceType,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum SpaceTypes {
|
enum SpaceTypes {
|
||||||
|
|||||||
@ -24,7 +24,7 @@ class CeilingSensorBatchControlView extends StatelessWidget
|
|||||||
final isMedium = isMediumScreenSize(context);
|
final isMedium = isMediumScreenSize(context);
|
||||||
return BlocProvider(
|
return BlocProvider(
|
||||||
create: (context) => CeilingSensorBloc(deviceId: devicesIds.first)
|
create: (context) => CeilingSensorBloc(deviceId: devicesIds.first)
|
||||||
..add(CeilingBatchControlEvent()),
|
..add(CeilingFetchDeviceStatusEvent(devicesIds)),
|
||||||
child: BlocBuilder<CeilingSensorBloc, CeilingSensorState>(
|
child: BlocBuilder<CeilingSensorBloc, CeilingSensorState>(
|
||||||
builder: (context, state) {
|
builder: (context, state) {
|
||||||
if (state is CeilingLoadingInitialState ||
|
if (state is CeilingLoadingInitialState ||
|
||||||
@ -33,10 +33,6 @@ class CeilingSensorBatchControlView extends StatelessWidget
|
|||||||
} else if (state is CeilingUpdateState) {
|
} else if (state is CeilingUpdateState) {
|
||||||
return _buildGridView(context, state.ceilingSensorModel,
|
return _buildGridView(context, state.ceilingSensorModel,
|
||||||
isExtraLarge, isLarge, isMedium);
|
isExtraLarge, isLarge, isMedium);
|
||||||
} else if (state is CeilingReportsFailedState) {
|
|
||||||
final model = context.read<CeilingSensorBloc>().deviceStatus;
|
|
||||||
return _buildGridView(
|
|
||||||
context, model, isExtraLarge, isLarge, isMedium);
|
|
||||||
}
|
}
|
||||||
return const Center(child: Text('Error fetching status'));
|
return const Center(child: Text('Error fetching status'));
|
||||||
},
|
},
|
||||||
@ -65,7 +61,8 @@ class CeilingSensorBatchControlView extends StatelessWidget
|
|||||||
description: 'Space Type',
|
description: 'Space Type',
|
||||||
value: model.spaceType,
|
value: model.spaceType,
|
||||||
action: (String value) => context.read<CeilingSensorBloc>().add(
|
action: (String value) => context.read<CeilingSensorBloc>().add(
|
||||||
CeilingChangeValueEvent(
|
CeilingBatchControlEvent(
|
||||||
|
deviceIds: devicesIds,
|
||||||
code: 'scene',
|
code: 'scene',
|
||||||
value: value,
|
value: value,
|
||||||
),
|
),
|
||||||
@ -79,7 +76,8 @@ class CeilingSensorBatchControlView extends StatelessWidget
|
|||||||
steps: 1,
|
steps: 1,
|
||||||
action: (int value) {
|
action: (int value) {
|
||||||
context.read<CeilingSensorBloc>().add(
|
context.read<CeilingSensorBloc>().add(
|
||||||
CeilingChangeValueEvent(
|
CeilingBatchControlEvent(
|
||||||
|
deviceIds: devicesIds,
|
||||||
code: 'sensitivity',
|
code: 'sensitivity',
|
||||||
value: value,
|
value: value,
|
||||||
),
|
),
|
||||||
@ -94,7 +92,8 @@ class CeilingSensorBatchControlView extends StatelessWidget
|
|||||||
steps: 50,
|
steps: 50,
|
||||||
description: 'm',
|
description: 'm',
|
||||||
action: (int value) => context.read<CeilingSensorBloc>().add(
|
action: (int value) => context.read<CeilingSensorBloc>().add(
|
||||||
CeilingChangeValueEvent(
|
CeilingBatchControlEvent(
|
||||||
|
deviceIds: devicesIds,
|
||||||
code: 'moving_max_dis',
|
code: 'moving_max_dis',
|
||||||
value: value,
|
value: value,
|
||||||
),
|
),
|
||||||
@ -105,7 +104,8 @@ class CeilingSensorBatchControlView extends StatelessWidget
|
|||||||
title: 'Nobody Time:',
|
title: 'Nobody Time:',
|
||||||
description: '',
|
description: '',
|
||||||
action: (String value) => context.read<CeilingSensorBloc>().add(
|
action: (String value) => context.read<CeilingSensorBloc>().add(
|
||||||
CeilingChangeValueEvent(
|
CeilingBatchControlEvent(
|
||||||
|
deviceIds: devicesIds,
|
||||||
code: 'nobody_time',
|
code: 'nobody_time',
|
||||||
value: value,
|
value: value,
|
||||||
),
|
),
|
||||||
|
|||||||
@ -29,7 +29,7 @@ class CeilingSensorControlsView extends StatelessWidget
|
|||||||
final isMedium = isMediumScreenSize(context);
|
final isMedium = isMediumScreenSize(context);
|
||||||
return BlocProvider(
|
return BlocProvider(
|
||||||
create: (context) => CeilingSensorBloc(deviceId: device.uuid ?? '')
|
create: (context) => CeilingSensorBloc(deviceId: device.uuid ?? '')
|
||||||
..add(CeilingInitialEvent()),
|
..add(CeilingInitialEvent(device.uuid ?? '')),
|
||||||
child: BlocBuilder<CeilingSensorBloc, CeilingSensorState>(
|
child: BlocBuilder<CeilingSensorBloc, CeilingSensorState>(
|
||||||
builder: (context, state) {
|
builder: (context, state) {
|
||||||
if (state is CeilingLoadingInitialState ||
|
if (state is CeilingLoadingInitialState ||
|
||||||
|
|||||||
@ -79,7 +79,7 @@ class DevicesManagementApi {
|
|||||||
body: body,
|
body: body,
|
||||||
showServerMessage: true,
|
showServerMessage: true,
|
||||||
expectedResponseModel: (json) {
|
expectedResponseModel: (json) {
|
||||||
return json['success'] ?? false;
|
return (json['successResults'] as List).isNotEmpty ;
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user