From a4736bfb5a0430a55a7cea9523893a673e078bcb Mon Sep 17 00:00:00 2001 From: estevez-dev Date: Sat, 2 Mar 2019 18:00:25 +0200 Subject: [PATCH] Message handling improvements --- lib/home_assistant.class.dart | 132 ++++++++-------------------------- lib/main.dart | 5 +- pubspec.lock | 13 +++- 3 files changed, 44 insertions(+), 106 deletions(-) diff --git a/lib/home_assistant.class.dart b/lib/home_assistant.class.dart index b5742df..8530f68 100644 --- a/lib/home_assistant.class.dart +++ b/lib/home_assistant.class.dart @@ -9,12 +9,8 @@ class HomeAssistant { SendMessageQueue _messageQueue; int _currentMessageId = 0; - int _statesMessageId = 0; - int _servicesMessageId = 0; int _subscriptionMessageId = 0; - int _configMessageId = 0; - int _userInfoMessageId = 0; - int _lovelaceMessageId = 0; + Map _messageResolver = {}; EntityCollection entities; HomeAssistantUI ui; Map _instanceConfig = {}; @@ -23,12 +19,7 @@ class HomeAssistant { Map _rawLovelaceData; Completer _fetchCompleter; - Completer _statesCompleter; - Completer _servicesCompleter; - Completer _lovelaceCompleter; - Completer _configCompleter; Completer _connectionCompleter; - Completer _userInfoCompleter; Timer _connectionTimer; Timer _fetchTimer; bool autoReconnect = false; @@ -211,7 +202,7 @@ class HomeAssistant { _handleMessage(String message) { var data = json.decode(message); if (data["type"] == "auth_required") { - _sendAuthMessageRaw('{"type": "auth","access_token": "$_password"}'); + _sendAuthMessage('{"type": "auth","access_token": "$_password"}'); } else if (data["type"] == "auth_ok") { _completeConnecting(null); _sendSubscribe(); @@ -219,17 +210,12 @@ class HomeAssistant { _completeConnecting({"errorCode": 6, "errorMessage": "${data["message"]}"}); } else if (data["type"] == "result") { Logger.d("[Received] <== id:${data["id"]}, ${data['success'] ? 'success' : 'error'}"); - if (data["id"] == _configMessageId) { - _parseConfig(data); - } else if (data["id"] == _statesMessageId) { - _parseEntities(data); - } else if (data["id"] == _lovelaceMessageId) { - _handleLovelace(data); - } else if (data["id"] == _servicesMessageId) { - _parseServices(data); - } else if (data["id"] == _userInfoMessageId) { - _parseUserInfo(data); + if (data["success"]) { + _messageResolver[data["id"]]?.complete(data); + } else { + _messageResolver[data["id"]]?.completeError(data["error"]["message"]); } + _messageResolver.remove(data["id"]); } else if (data["type"] == "event") { if ((data["event"] != null) && (data["event"]["event_type"] == "state_changed")) { Logger.d("[Received] <== ${data['type']}.${data["event"]["event_type"]}: ${data["event"]["data"]["entity_id"]}"); @@ -247,64 +233,48 @@ class HomeAssistant { void _sendSubscribe() { _incrementMessageId(); _subscriptionMessageId = _currentMessageId; - _sendMessageRaw('{"id": $_subscriptionMessageId, "type": "subscribe_events", "event_type": "state_changed"}', false); + _send('{"id": $_subscriptionMessageId, "type": "subscribe_events", "event_type": "state_changed"}', false); } - Future _getConfig() { - _configCompleter = new Completer(); - _incrementMessageId(); - _configMessageId = _currentMessageId; - _sendMessageRaw('{"id": $_configMessageId, "type": "get_config"}', false); - - return _configCompleter.future; + Future _getConfig() async { + await _sendInitialMessage("get_config").then((data) => _instanceConfig = Map.from(data["result"])); } - Future _getStates() { - _statesCompleter = new Completer(); - _incrementMessageId(); - _statesMessageId = _currentMessageId; - _sendMessageRaw('{"id": $_statesMessageId, "type": "get_states"}', false); - - return _statesCompleter.future; + Future _getStates() async { + await _sendInitialMessage("get_states").then((data) => entities.parse(data["result"])); } - Future _getLovelace() { - _lovelaceCompleter = new Completer(); - _incrementMessageId(); - _lovelaceMessageId = _currentMessageId; - _sendMessageRaw('{"id": $_lovelaceMessageId, "type": "lovelace/config"}', false); - - return _lovelaceCompleter.future; + Future _getLovelace() async { + await _sendInitialMessage("lovelace/config").then((data) => _rawLovelaceData = data["result"]); } - Future _getUserInfo() { - _userInfoCompleter = new Completer(); - _incrementMessageId(); - _userInfoMessageId = _currentMessageId; - _sendMessageRaw('{"id": $_userInfoMessageId, "type": "auth/current_user"}', false); - - return _userInfoCompleter.future; + Future _getUserInfo() async { + _userName = null; + await _sendInitialMessage("auth/current_user").then((data) => _userName = data["result"]["name"]); } - Future _getServices() { - _servicesCompleter = new Completer(); - _incrementMessageId(); - _servicesMessageId = _currentMessageId; - _sendMessageRaw('{"id": $_servicesMessageId, "type": "get_services"}', false); - - return _servicesCompleter.future; + Future _getServices() async { + await _sendInitialMessage("get_services").then((data) => Logger.d("We actually don`t need the list of servcies for now")); } _incrementMessageId() { _currentMessageId += 1; } - void _sendAuthMessageRaw(String message) { + void _sendAuthMessage(String message) { Logger.d( "[Sending] ==> auth request"); _hassioChannel.sink.add(message); } - _sendMessageRaw(String message, bool queued) { + Future _sendInitialMessage(String type) { + Completer _completer = Completer(); + _incrementMessageId(); + _messageResolver[_currentMessageId] = _completer; + _send('{"id": $_currentMessageId, "type": "$type"}', false); + return _completer.future; + } + + _send(String message, bool queued) { var sendCompleter = Completer(); if (queued) _messageQueue.add(message); _connection().then((r) { @@ -359,7 +329,7 @@ class HomeAssistant { } message += '}'; } - return _sendMessageRaw(message, true); + return _send(message, true); } void _handleEntityStateChange(Map eventData) { @@ -371,39 +341,6 @@ class HomeAssistant { )); } - void _parseConfig(Map data) { - if (data["success"] == true) { - _instanceConfig = Map.from(data["result"]); - _configCompleter.complete(); - } else { - _configCompleter.completeError({"errorCode": 2, "errorMessage": data["error"]["message"]}); - } - } - - void _parseUserInfo(Map data) { - if (data["success"] == true) { - _userName = data["result"]["name"]; - } else { - _userName = null; - Logger.w("There was an error getting current user: $data"); - } - _userInfoCompleter.complete(); - } - - void _parseServices(response) { - _servicesCompleter.complete(); - } - - void _handleLovelace(response) { - if (response["success"] == true) { - _rawLovelaceData = response["result"]; - } else { - Logger.e("There was an error getting Lovelace config: $response"); - _rawLovelaceData = null; - } - _lovelaceCompleter.complete(); - } - void _parseLovelace() { Logger.d("--Title: ${_rawLovelaceData["title"]}"); ui.title = _rawLovelaceData["title"]; @@ -514,15 +451,6 @@ class HomeAssistant { return result; } - void _parseEntities(response) async { - if (response["success"] == false) { - _statesCompleter.completeError({"errorCode": 3, "errorMessage": response["error"]["message"]}); - return; - } - entities.parse(response["result"]); - _statesCompleter.complete(); - } - void _createUI() { ui = HomeAssistantUI(); if ((_useLovelace) && (_rawLovelaceData != null)) { diff --git a/lib/main.dart b/lib/main.dart index 4c1de75..24ddb57 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -649,7 +649,10 @@ class _MainPageState extends State with WidgetsBindingObserver, Ticker primary: false, drawer: _buildAppDrawer(), bottomNavigationBar: bottomBar, - body: _buildScaffoldBody(true) + body: HomeAssistantModel( + child: _buildScaffoldBody(true), + homeAssistant: _homeAssistant, + ) ); } else { return Scaffold( diff --git a/pubspec.lock b/pubspec.lock index b343527..8b6adae 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -223,6 +223,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.5.0+1" + pedantic: + dependency: transitive + description: + name: pedantic + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.0" petitparser: dependency: transitive description: @@ -262,7 +269,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.4.1" + version: "1.5.4" sqflite: dependency: transitive description: @@ -304,14 +311,14 @@ packages: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "1.1.0" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.1" + version: "0.2.2" typed_data: dependency: transitive description: