diff --git a/lib/entity.page.dart b/lib/entity.page.dart index d997699..c310a16 100644 --- a/lib/entity.page.dart +++ b/lib/entity.page.dart @@ -19,7 +19,7 @@ class _EntityViewPageState extends State { void initState() { super.initState(); _stateSubscription = eventBus.on().listen((event) { - TheLogger.debug("State change event handled by entity page: ${event.entityId}"); + Logger.d("State change event handled by entity page: ${event.entityId}"); if (event.entityId == widget.entityId) { setState(() {}); } diff --git a/lib/entity_collection.class.dart b/lib/entity_collection.class.dart index 18c1682..2d21cc2 100644 --- a/lib/entity_collection.class.dart +++ b/lib/entity_collection.class.dart @@ -19,7 +19,7 @@ class EntityCollection { _allEntities.clear(); //views.clear(); - TheLogger.debug("Parsing ${rawData.length} Home Assistant entities"); + Logger.d("Parsing ${rawData.length} Home Assistant entities"); rawData.forEach((rawEntityData) { addFromRaw(rawEntityData); }); @@ -89,11 +89,13 @@ class EntityCollection { } } - void updateState(Map rawStateData) { + bool updateState(Map rawStateData) { if (isExist(rawStateData["entity_id"])) { updateFromRaw(rawStateData["new_state"] ?? rawStateData["old_state"]); + return false; } else { addFromRaw(rawStateData["new_state"] ?? rawStateData["old_state"]); + return true; } } @@ -101,10 +103,9 @@ class EntityCollection { _allEntities[entity.entityId] = entity; } - Entity addFromRaw(Map rawEntityData) { + void addFromRaw(Map rawEntityData) { Entity entity = _createEntityInstance(rawEntityData); _allEntities[entity.entityId] = entity; - return entity; } void updateFromRaw(Map rawEntityData) { diff --git a/lib/entity_widgets/controls/light_controls.dart b/lib/entity_widgets/controls/light_controls.dart index e8bec5b..fcd13cd 100644 --- a/lib/entity_widgets/controls/light_controls.dart +++ b/lib/entity_widgets/controls/light_controls.dart @@ -52,7 +52,7 @@ class _LightControlsWidgetState extends State { setState(() { _tmpColor = color; _changedHere = true; - TheLogger.debug( "Color: [${color.red}, ${color.green}, ${color.blue}]"); + Logger.d( "Color: [${color.red}, ${color.green}, ${color.blue}]"); if ((color == Colors.black) || ((color.red == color.green) && (color.green == color.blue))) { eventBus.fire(new ServiceCallEvent( entity.domain, "turn_off", entity.entityId, diff --git a/lib/entity_widgets/controls/media_player_widgets.dart b/lib/entity_widgets/controls/media_player_widgets.dart index 569e7ad..d71bd3a 100644 --- a/lib/entity_widgets/controls/media_player_widgets.dart +++ b/lib/entity_widgets/controls/media_player_widgets.dart @@ -120,12 +120,12 @@ class MediaPlayerPlaybackControls extends StatelessWidget { void _setPower(MediaPlayerEntity entity) { if (entity.state != EntityState.unavailable && entity.state != EntityState.unknown) { if (entity.state == EntityState.off) { - TheLogger.debug("${entity.entityId} turn_on"); + Logger.d("${entity.entityId} turn_on"); eventBus.fire(new ServiceCallEvent( entity.domain, "turn_on", entity.entityId, null)); } else { - TheLogger.debug("${entity.entityId} turn_off"); + Logger.d("${entity.entityId} turn_off"); eventBus.fire(new ServiceCallEvent( entity.domain, "turn_off", entity.entityId, null)); @@ -134,7 +134,7 @@ class MediaPlayerPlaybackControls extends StatelessWidget { } void _callAction(MediaPlayerEntity entity, String action) { - TheLogger.debug("${entity.entityId} $action"); + Logger.d("${entity.entityId} $action"); eventBus.fire(new ServiceCallEvent( entity.domain, "$action", entity.entityId, null)); diff --git a/lib/entity_widgets/history_chart/combined_history_chart.dart b/lib/entity_widgets/history_chart/combined_history_chart.dart index 628cf98..ac5ae8e 100644 --- a/lib/entity_widgets/history_chart/combined_history_chart.dart +++ b/lib/entity_widgets/history_chart/combined_history_chart.dart @@ -94,11 +94,11 @@ class _CombinedHistoryChartWidgetState extends State } List> _parseHistory() { - TheLogger.debug(" parsing history..."); + Logger.d(" parsing history..."); Map> numericDataLists = {}; int colorIdCounter = 0; widget.config.numericAttributesToShow.forEach((String attrName) { - TheLogger.debug(" parsing attribute $attrName"); + Logger.d(" parsing attribute $attrName"); List data = []; DateTime now = DateTime.now(); for (var i = 0; i < widget.rawHistory.length; i++) { @@ -152,7 +152,7 @@ class _CombinedHistoryChartWidgetState extends State } List> result = []; numericDataLists.forEach((attrName, dataList) { - TheLogger.debug(" adding ${dataList.length} data values"); + Logger.d(" adding ${dataList.length} data values"); result.add( new charts.Series( id: "value", diff --git a/lib/entity_widgets/history_chart/entity_history.dart b/lib/entity_widgets/history_chart/entity_history.dart index 5cd38da..41c2ab6 100644 --- a/lib/entity_widgets/history_chart/entity_history.dart +++ b/lib/entity_widgets/history_chart/entity_history.dart @@ -42,7 +42,7 @@ class _EntityHistoryWidgetState extends State { void _loadHistory(HomeAssistant ha, String entityId) { DateTime now = DateTime.now(); if (_historyLastUpdated != null) { - TheLogger.debug("History was updated ${now.difference(_historyLastUpdated).inSeconds} seconds ago"); + Logger.d("History was updated ${now.difference(_historyLastUpdated).inSeconds} seconds ago"); } if (_historyLastUpdated == null || now.difference(_historyLastUpdated).inSeconds > 30) { _historyLastUpdated = now; @@ -52,7 +52,7 @@ class _EntityHistoryWidgetState extends State { _needToUpdateHistory = false; }); }).catchError((e) { - TheLogger.error("Error loading $entityId history: $e"); + Logger.e("Error loading $entityId history: $e"); setState(() { _history = []; _needToUpdateHistory = false; @@ -122,7 +122,7 @@ class _EntityHistoryWidgetState extends State { } default: { - TheLogger.debug(" Simple selected as default"); + Logger.d(" Simple selected as default"); return SimpleStateHistoryChartWidget( rawHistory: _history, ); diff --git a/lib/entity_widgets/state/date_time_state.dart b/lib/entity_widgets/state/date_time_state.dart index c9744df..a210eb3 100644 --- a/lib/entity_widgets/state/date_time_state.dart +++ b/lib/entity_widgets/state/date_time_state.dart @@ -54,7 +54,7 @@ class DateTimeStateWidget extends StatelessWidget { } }); } else { - TheLogger.warning( "${entity.entityId} has no date and no time"); + Logger.w( "${entity.entityId} has no date and no time"); } } diff --git a/lib/entity_widgets/state/text_input_state.dart b/lib/entity_widgets/state/text_input_state.dart index 1552b56..06beebc 100644 --- a/lib/entity_widgets/state/text_input_state.dart +++ b/lib/entity_widgets/state/text_input_state.dart @@ -85,7 +85,7 @@ class _TextInputStateWidgetState extends State { }), ); } else { - TheLogger.warning( "Unsupported input mode for ${entity.entityId}"); + Logger.w( "Unsupported input mode for ${entity.entityId}"); return SimpleEntityState(); } } diff --git a/lib/home_assistant.class.dart b/lib/home_assistant.class.dart index e55102e..fed5d67 100644 --- a/lib/home_assistant.class.dart +++ b/lib/home_assistant.class.dart @@ -61,16 +61,16 @@ class HomeAssistant { _password = password; _authType = authType; _useLovelace = useLovelace; - TheLogger.debug( "Use lovelace is $_useLovelace"); + Logger.d( "Use lovelace is $_useLovelace"); } Future fetch() { if ((_fetchCompleter != null) && (!_fetchCompleter.isCompleted)) { - TheLogger.warning("Previous fetch is not complited"); + Logger.w("Previous fetch is not complited"); } else { _fetchCompleter = new Completer(); _fetchTimer = Timer(fetchTimeout, () { - TheLogger.error( "Data fetching timeout"); + Logger.e( "Data fetching timeout"); disconnect().then((_) { _completeFetching({ "errorCode": 9, @@ -90,7 +90,7 @@ class HomeAssistant { disconnect() async { if ((_hassioChannel != null) && (_hassioChannel.closeCode == null) && (_hassioChannel.sink != null)) { await _hassioChannel.sink.close().timeout(Duration(seconds: 3), - onTimeout: () => TheLogger.debug( "Socket sink closed") + onTimeout: () => Logger.d( "Socket sink closed") ); await _socketSubscription.cancel(); _hassioChannel = null; @@ -100,15 +100,15 @@ class HomeAssistant { Future _connection() { if ((_connectionCompleter != null) && (!_connectionCompleter.isCompleted)) { - TheLogger.debug("Previous connection is not complited"); + Logger.d("Previous connection is not complited"); } else { if ((_hassioChannel == null) || (_hassioChannel.closeCode != null)) { _connectionCompleter = new Completer(); autoReconnect = false; disconnect().then((_){ - TheLogger.debug( "Socket connecting..."); + Logger.d( "Socket connecting..."); _connectionTimer = Timer(connectTimeout, () { - TheLogger.error( "Socket connection timeout"); + Logger.e( "Socket connection timeout"); _handleSocketError(null); }); if (_socketSubscription != null) { @@ -131,15 +131,15 @@ class HomeAssistant { } void _handleSocketClose() { - TheLogger.debug("Socket disconnected. Automatic reconnect is $autoReconnect"); + Logger.d("Socket disconnected. Automatic reconnect is $autoReconnect"); if (autoReconnect) { _reconnect(); } } void _handleSocketError(e) { - TheLogger.error("Socket stream Error: $e"); - TheLogger.debug("Automatic reconnect is $autoReconnect"); + Logger.e("Socket stream Error: $e"); + Logger.d("Automatic reconnect is $autoReconnect"); if (autoReconnect) { _reconnect(); } else { @@ -186,7 +186,7 @@ class HomeAssistant { _fetchCompleter.completeError(error); } else { autoReconnect = true; - TheLogger.debug( "Fetch complete successful"); + Logger.d( "Fetch complete successful"); _fetchCompleter.complete(); } } @@ -220,7 +220,7 @@ class HomeAssistant { } else if (data["type"] == "auth_invalid") { _completeConnecting({"errorCode": 6, "errorMessage": "${data["message"]}"}); } else if (data["type"] == "result") { - TheLogger.debug("[Received] <== id:${data["id"]}, ${data['success'] ? 'success' : 'error'}"); + Logger.d("[Received] <== id:${data["id"]}, ${data['success'] ? 'success' : 'error'}"); if (data["id"] == _configMessageId) { _parseConfig(data); } else if (data["id"] == _statesMessageId) { @@ -234,15 +234,15 @@ class HomeAssistant { } } else if (data["type"] == "event") { if ((data["event"] != null) && (data["event"]["event_type"] == "state_changed")) { - TheLogger.debug("[Received] <== ${data['type']}.${data["event"]["event_type"]}: ${data["event"]["data"]["entity_id"]}"); + Logger.d("[Received] <== ${data['type']}.${data["event"]["event_type"]}: ${data["event"]["data"]["entity_id"]}"); _handleEntityStateChange(data["event"]["data"]); } else if (data["event"] != null) { - TheLogger.warning("Unhandled event type: ${data["event"]["event_type"]}"); + Logger.w("Unhandled event type: ${data["event"]["event_type"]}"); } else { - TheLogger.error("Event is null: $message"); + Logger.e("Event is null: $message"); } } else { - TheLogger.warning("Unknown message type: $message"); + Logger.w("Unknown message type: $message"); } } @@ -302,7 +302,7 @@ class HomeAssistant { } void _sendAuthMessageRaw(String message) { - TheLogger.debug( "[Sending] ==> auth request"); + Logger.d( "[Sending] ==> auth request"); _hassioChannel.sink.add(message); } @@ -311,11 +311,11 @@ class HomeAssistant { if (queued) _messageQueue.add(message); _connection().then((r) { _messageQueue.getActualMessages().forEach((message){ - TheLogger.debug( "[Sending queued] ==> $message"); + Logger.d( "[Sending queued] ==> $message"); _hassioChannel.sink.add(message); }); if (!queued) { - TheLogger.debug( "[Sending] ==> $message"); + Logger.d( "[Sending] ==> $message"); _hassioChannel.sink.add(message); } sendCompleter.complete(); @@ -367,8 +367,10 @@ class HomeAssistant { void _handleEntityStateChange(Map eventData) { //TheLogger.debug( "New state for ${eventData['entity_id']}"); Map data = Map.from(eventData); - entities.updateState(data); - eventBus.fire(new StateChangedEvent(data["entity_id"], null)); + eventBus.fire(new StateChangedEvent( + entityId: data["entity_id"], + needToRebuildUI: entities.updateState(data) + )); } void _parseConfig(Map data) { @@ -385,7 +387,7 @@ class HomeAssistant { _userName = data["result"]["name"]; } else { _userName = null; - TheLogger.warning("There was an error getting current user: $data"); + Logger.w("There was an error getting current user: $data"); } _userInfoCompleter.complete(); } @@ -398,19 +400,19 @@ class HomeAssistant { if (response["success"] == true) { _rawLovelaceData = response["result"]; } else { - TheLogger.error("There was an error getting Lovelace config: $response"); + Logger.e("There was an error getting Lovelace config: $response"); _rawLovelaceData = null; } _lovelaceCompleter.complete(); } void _parseLovelace() { - TheLogger.debug("--Title: ${_rawLovelaceData["title"]}"); + Logger.d("--Title: ${_rawLovelaceData["title"]}"); ui.title = _rawLovelaceData["title"]; int viewCounter = 0; - TheLogger.debug("--Views count: ${_rawLovelaceData['views'].length}"); + Logger.d("--Views count: ${_rawLovelaceData['views'].length}"); _rawLovelaceData["views"].forEach((rawView){ - TheLogger.debug("----view id: ${rawView['id']}"); + Logger.d("----view id: ${rawView['id']}"); HAView view = HAView( count: viewCounter, id: "${rawView['id']}", @@ -501,10 +503,10 @@ class HomeAssistant { void _createUI() { ui = HomeAssistantUI(); if ((_useLovelace) && (_rawLovelaceData != null)) { - TheLogger.debug("Creating Lovelace UI"); + Logger.d("Creating Lovelace UI"); _parseLovelace(); } else { - TheLogger.debug("Creating group-based UI"); + Logger.d("Creating group-based UI"); int viewCounter = 0; if (!entities.hasDefaultView) { HAView view = HAView( @@ -543,7 +545,7 @@ class HomeAssistant { //String endTime = formatDate(now, [yyyy, '-', mm, '-', dd, 'T', HH, ':', nn, ':', ss, z]); String startTime = formatDate(now.subtract(Duration(hours: 24)), [yyyy, '-', mm, '-', dd, 'T', HH, ':', nn, ':', ss, z]); String url = "$homeAssistantWebHost/api/history/period/$startTime?&filter_entity_id=$entityId"; - TheLogger.debug("[Sending] ==> $url"); + Logger.d("[Sending] ==> $url"); http.Response historyResponse; if (_authType == "access_token") { historyResponse = await http.get(url, headers: { @@ -558,7 +560,7 @@ class HomeAssistant { } var history = json.decode(historyResponse.body); if (history is List) { - TheLogger.debug( "[Received] <== ${history.first.length} history recors"); + Logger.d( "[Received] <== ${history.first.length} history recors"); return history; } else { return []; diff --git a/lib/log.page.dart b/lib/log.page.dart index 7e623d6..2d58c24 100644 --- a/lib/log.page.dart +++ b/lib/log.page.dart @@ -19,7 +19,7 @@ class _LogViewPageState extends State { } _loadLog() async { - _logData = TheLogger.getLog(); + _logData = Logger.getLog(); } @override diff --git a/lib/main.dart b/lib/main.dart index 66297dc..1104739 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -91,8 +91,8 @@ String homeAssistantWebHost; void main() { FlutterError.onError = (errorDetails) { - TheLogger.error( "${errorDetails.exception}"); - if (TheLogger.isInDebugMode) { + Logger.e( "${errorDetails.exception}"); + if (Logger.isInDebugMode) { FlutterError.dumpErrorToConsole(errorDetails); } }; @@ -100,9 +100,9 @@ void main() { runZoned(() { runApp(new HAClientApp()); }, onError: (error, stack) { - TheLogger.error("$error"); - TheLogger.error("$stack"); - if (TheLogger.isInDebugMode) { + Logger.e("$error"); + Logger.e("$stack"); + if (Logger.isInDebugMode) { debugPrint("$stack"); } }); @@ -160,11 +160,11 @@ class _MainPageState extends State with WidgetsBindingObserver { _settingsLoaded = false; WidgetsBinding.instance.addObserver(this); - TheLogger.debug(" Creating new HomeAssistant instance"); + Logger.d(" Creating new HomeAssistant instance"); _homeAssistant = HomeAssistant(); _settingsSubscription = eventBus.on().listen((event) { - TheLogger.debug("Settings change event: reconnect=${event.reconnect}"); + Logger.d("Settings change event: reconnect=${event.reconnect}"); if (event.reconnect) { _homeAssistant.disconnect().then((_){ _initialLoad(); @@ -185,7 +185,7 @@ class _MainPageState extends State with WidgetsBindingObserver { @override void didChangeAppLifecycleState(AppLifecycleState state) { - TheLogger.debug("$state"); + Logger.d("$state"); if (state == AppLifecycleState.resumed && _settingsLoaded) { _refreshData(); } @@ -212,7 +212,12 @@ class _MainPageState extends State with WidgetsBindingObserver { _subscribe() { if (_stateSubscription == null) { _stateSubscription = eventBus.on().listen((event) { - setState(() {}); + if (event.needToRebuildUI) { + Logger.d("New entity. Need to rebuild UI"); + _refreshData(); + } else { + setState(() {}); + } }); } if (_serviceCallSubscription == null) { @@ -257,8 +262,8 @@ class _MainPageState extends State with WidgetsBindingObserver { _setErrorState(e) { if (e is Error) { - TheLogger.error(e.toString()); - TheLogger.error("${e.stackTrace}"); + Logger.e(e.toString()); + Logger.e("${e.stackTrace}"); _showErrorBottomBar( message: "There was some error", errorCode: 13 diff --git a/lib/settings.page.dart b/lib/settings.page.dart index 28557a1..09a6ac5 100644 --- a/lib/settings.page.dart +++ b/lib/settings.page.dart @@ -83,13 +83,13 @@ class _ConnectionSettingsPageState extends State { icon: Icon(Icons.check), onPressed: (){ if (_checkConfigChanged()) { - TheLogger.debug("Settings changed. Saving..."); + Logger.d("Settings changed. Saving..."); _saveSettings().then((r) { Navigator.pop(context); eventBus.fire(SettingsChangedEvent(true)); }); } else { - TheLogger.debug("Settings was not changed"); + Logger.d("Settings was not changed"); Navigator.pop(context); } } diff --git a/lib/ui_widgets/view.dart b/lib/ui_widgets/view.dart index 4bd7831..d68e562 100644 --- a/lib/ui_widgets/view.dart +++ b/lib/ui_widgets/view.dart @@ -78,7 +78,7 @@ class ViewWidgetState extends State { Future _refreshData() { if ((_refreshCompleter != null) && (!_refreshCompleter.isCompleted)) { - TheLogger.debug("Previous data refresh is still in progress"); + Logger.d("Previous data refresh is still in progress"); } else { _refreshCompleter = Completer(); eventBus.fire(RefreshDataEvent()); diff --git a/lib/utils.class.dart b/lib/utils.class.dart index 2f622b9..9fd17d3 100644 --- a/lib/utils.class.dart +++ b/lib/utils.class.dart @@ -1,6 +1,6 @@ part of 'main.dart'; -class TheLogger { +class Logger { static List _log = []; @@ -20,15 +20,15 @@ class TheLogger { return inDebugMode; } - static void error(String message) { + static void e(String message) { _writeToLog("Error", message); } - static void warning(String message) { + static void w(String message) { _writeToLog("Warning", message); } - static void debug(String message) { + static void d(String message) { _writeToLog("Debug", message); } @@ -50,7 +50,7 @@ class HAUtils { if (await canLaunch(url)) { await launch(url); } else { - TheLogger.error( "Could not launch $url"); + Logger.e( "Could not launch $url"); } } } @@ -58,8 +58,13 @@ class HAUtils { class StateChangedEvent { String entityId; String newState; + bool needToRebuildUI; - StateChangedEvent(this.entityId, this.newState); + StateChangedEvent({ + this.entityId, + this.newState, + this.needToRebuildUI: false + }); } class SettingsChangedEvent {