diff --git a/lib/features/devices/bloc/devices_cubit.dart b/lib/features/devices/bloc/devices_cubit.dart index 7361415..db7794b 100644 --- a/lib/features/devices/bloc/devices_cubit.dart +++ b/lib/features/devices/bloc/devices_cubit.dart @@ -8,6 +8,7 @@ import 'package:syncrow_app/features/app_layout/model/space_model.dart'; import 'package:syncrow_app/features/devices/model/device_category_model.dart'; import 'package:syncrow_app/features/devices/model/device_control_model.dart'; import 'package:syncrow_app/features/devices/model/device_model.dart'; +import 'package:syncrow_app/features/devices/model/status_model.dart'; import 'package:syncrow_app/features/devices/view/widgets/ACs/acs_view.dart'; import 'package:syncrow_app/features/devices/view/widgets/curtains/curtain_view.dart'; import 'package:syncrow_app/features/devices/view/widgets/gateway/gateway_view.dart'; @@ -280,6 +281,13 @@ class DevicesCubit extends Cubit { .indexWhere((element) => element.id == roomId); HomeCubit.getInstance().selectedSpace!.rooms![roomIndex].devices = await SpacesAPI.getDevicesByRoomId(roomId); + //get status for each device + for (var device in HomeCubit.getInstance() + .selectedSpace! + .rooms![roomIndex] + .devices!) { + getDevicesStatues(device.id!, roomIndex); + } emitSafe(GetDevicesSuccess()); } on DioException catch (error) { @@ -289,6 +297,38 @@ class DevicesCubit extends Cubit { } } + getDevicesStatues(String deviceId, int roomIndex) async { + if (_isClosed) return; + + try { + emitSafe(GetDeviceStatusLoading()); + int deviceIndex = HomeCubit.getInstance() + .selectedSpace! + .rooms![roomIndex] + .devices! + .indexWhere((element) => element.id == deviceId); + + List statuses = []; + var response = await DevicesAPI.getDeviceStatus(deviceId); + print('response : $response'); + + for (var status in response['result']['status']) { + statuses.add(StatusModel.fromJson(status)); + } + + HomeCubit.getInstance() + .selectedSpace! + .rooms![roomIndex] + .devices![deviceIndex] + .status = statuses; + emitSafe(GetDeviceStatusSuccess()); + } on DioException catch (error) { + emitSafe( + GetDeviceStatusError(ServerFailure.fromDioError(error).errMessage), + ); + } + } + ///Lights onHorizontalDragUpdate(DeviceModel light, double dx, double screenWidth) { double newBrightness = (dx / (screenWidth - 15) * 100); diff --git a/lib/features/devices/bloc/devices_state.dart b/lib/features/devices/bloc/devices_state.dart index 4fd8b2d..3375450 100644 --- a/lib/features/devices/bloc/devices_state.dart +++ b/lib/features/devices/bloc/devices_state.dart @@ -15,6 +15,16 @@ class ChangeIndex extends DevicesState {} // Devices +class GetDeviceStatusLoading extends DevicesState {} + +class GetDeviceStatusSuccess extends DevicesState {} + +class GetDeviceStatusError extends DevicesState { + final String errorMsg; + + GetDeviceStatusError(this.errorMsg); +} + class GetDevicesLoading extends DevicesState {} class GetDevicesSuccess extends DevicesState {} diff --git a/lib/features/devices/model/device_model.dart b/lib/features/devices/model/device_model.dart index fec6858..22a7c04 100644 --- a/lib/features/devices/model/device_model.dart +++ b/lib/features/devices/model/device_model.dart @@ -1,27 +1,29 @@ import 'package:syncrow_app/features/devices/model/function_model.dart'; +import 'package:syncrow_app/features/devices/model/status_model.dart'; import 'package:syncrow_app/generated/assets.dart'; import 'package:syncrow_app/utils/resource_manager/constants.dart'; class DeviceModel { int? activeTime; - String? category; - String? categoryName; - int? createTime; - String? gatewayId; - String? icon; + String? category; //unused + String? categoryName; //unused + int? createTime; //unused + String? gatewayId; //unused + String? icon; //unused String? id; - String? ip; - double? lat; + String? ip; //unused + double? lat; //unused String? localKey; - double? lon; + double? lon; //unused String? model; String? name; - String? nodeId; //rmeove + String? nodeId; //remove bool? isOnline; - String? ownerId; //remove - String? productId; //remove + List status = []; + String? ownerId; //unused + String? productId; //unused String? productName; - bool? isSub; + bool? isSub; //unused String? timeZone; int? updateTime; String? uuid; @@ -44,6 +46,7 @@ class DeviceModel { this.name, this.nodeId, this.isOnline, + required this.status, this.ownerId, this.productId, this.productName, @@ -102,6 +105,10 @@ class DeviceModel { updateTime: json['updateTime'], uuid: json['uuid'], productType: type, + status: [], + // json['status'] + // .map((e) => StatusModel.fromJson(e)) + // .toList(), // devicesTypesMap[json['productName']] ?? DeviceType.Other, ); } diff --git a/lib/features/devices/model/status_model.dart b/lib/features/devices/model/status_model.dart new file mode 100644 index 0000000..0d22625 --- /dev/null +++ b/lib/features/devices/model/status_model.dart @@ -0,0 +1,23 @@ +class StatusModel { + String? code; + dynamic value; + + StatusModel({ + required this.code, + required this.value, + }); + + factory StatusModel.fromJson(Map json) { + return StatusModel( + code: json['code'], + value: json['value'], + ); + } + + Map toJson() { + return { + 'code': code, + 'value': value, + }; + } +} diff --git a/lib/features/devices/view/widgets/ACs/ac_interface_temp_unit.dart b/lib/features/devices/view/widgets/ACs/ac_interface_temp_unit.dart index 52c471a..e5cbcf0 100644 --- a/lib/features/devices/view/widgets/ACs/ac_interface_temp_unit.dart +++ b/lib/features/devices/view/widgets/ACs/ac_interface_temp_unit.dart @@ -72,7 +72,11 @@ class AcInterfaceTempUnit extends StatelessWidget { ), // min: DeviceModel.bounds.min, // max: DeviceModel.bounds.max, - // initialValue: DeviceModel.temperature, + initialValue: deviceModel.status + .firstWhere( + (element) => element.code == 'temp_current') + .value / + 10, onChange: (value) { String valueAsString = value.toStringAsFixed(1); if (valueAsString.endsWith(".0") || @@ -107,7 +111,8 @@ class AcInterfaceTempUnit extends StatelessWidget { children: [ BodyLarge( // text: "${DeviceModel.coolTo}° C", - text: '24° C', + text: + '${deviceModel.status.firstWhere((element) => element.code == 'temp_set').value / 10}° C', style: context.bodyLarge.copyWith( color: ColorsManager.primaryColor.withOpacity(0.6), diff --git a/lib/features/devices/view/widgets/ACs/ac_mode_control_unit.dart b/lib/features/devices/view/widgets/ACs/ac_mode_control_unit.dart index e1f9416..b82e685 100644 --- a/lib/features/devices/view/widgets/ACs/ac_mode_control_unit.dart +++ b/lib/features/devices/view/widgets/ACs/ac_mode_control_unit.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:syncrow_app/features/devices/model/device_model.dart'; import 'package:syncrow_app/features/shared_widgets/default_container.dart'; @@ -17,18 +18,18 @@ class ACModeControlUnit extends StatefulWidget { } class _ACModeControlUnitState extends State { - var fanSpeeds = [ - Assets.iconsFan0, - Assets.iconsFan1, - Assets.iconsFan2, - Assets.iconsFan3, - ]; + Map fanSpeedsMap = { + 'auto': Assets.iconsFan0, + 'iconsFan1': Assets.iconsFan1, + 'iconsFan2': Assets.iconsFan2, + 'iconsFan3': Assets.iconsFan3, + }; - var tempModes = [ - Assets.iconsSunnyMode, - Assets.iconsColdMode, - Assets.iconsWindyMode, - ]; + Map tempModesMap = { + 'sunny': Assets.iconsSunnyMode, + 'cold': Assets.iconsColdMode, + 'windy': Assets.iconsWindyMode, + }; @override Widget build(BuildContext context) { @@ -43,11 +44,13 @@ class _ACModeControlUnitState extends State { // widget.model.fanSpeed == 3 ? 0 : widget.model.fanSpeed + 1; }); }, - child: const DefaultContainer( + child: DefaultContainer( height: 55, child: Center( - // child: SvgPicture.asset(fanSpeeds[widget.model.fanSpeed]), - ), + child: SvgPicture.asset(fanSpeedsMap[widget.model.status + .firstWhere((element) => element.code == 'level') + .value]!), + ), ), ), ), @@ -60,12 +63,13 @@ class _ACModeControlUnitState extends State { // widget.model.tempMode == 2 ? 0 : widget.model.tempMode + 1; }); }, - child: const DefaultContainer( + child: DefaultContainer( height: 55, child: Center( - // child: SvgPicture.asset(tempModes[widget.model.tempMode]), - - ), + child: SvgPicture.asset(tempModesMap[widget.model.status + .firstWhere((element) => element.code == 'mode') + .value]!), + ), ), ), ), diff --git a/lib/services/api/api_links_endpoints.dart b/lib/services/api/api_links_endpoints.dart index f249a1d..6e5efc0 100644 --- a/lib/services/api/api_links_endpoints.dart +++ b/lib/services/api/api_links_endpoints.dart @@ -17,6 +17,8 @@ abstract class ApiEndpoints { // Devices static const String control = '$baseUrl/device/control'; static const String devicesByRoom = '$baseUrl/device/room'; + // static const String deviceStatus = '$baseUrl/device/status/'; + static const String deviceStatus = '$baseUrl/device/'; //groups static const String groups = '$baseUrl/group'; diff --git a/lib/services/api/devices_api.dart b/lib/services/api/devices_api.dart index cf885e8..57e2ac1 100644 --- a/lib/services/api/devices_api.dart +++ b/lib/services/api/devices_api.dart @@ -34,4 +34,15 @@ class DevicesAPI { ); return response; } + + static Future> getDeviceStatus(String deviceId) async { + final response = await _httpService.get( + path: '${ApiEndpoints.deviceStatus}/$deviceId/functions/status', + showServerMessage: false, + expectedResponseModel: (json) { + return json; + }, + ); + return response; + } }