Message handling improvements

This commit is contained in:
estevez-dev 2019-03-02 18:00:25 +02:00
parent 15c54df629
commit a4736bfb5a
3 changed files with 44 additions and 106 deletions

View File

@ -9,12 +9,8 @@ class HomeAssistant {
SendMessageQueue _messageQueue; SendMessageQueue _messageQueue;
int _currentMessageId = 0; int _currentMessageId = 0;
int _statesMessageId = 0;
int _servicesMessageId = 0;
int _subscriptionMessageId = 0; int _subscriptionMessageId = 0;
int _configMessageId = 0; Map<int, Completer> _messageResolver = {};
int _userInfoMessageId = 0;
int _lovelaceMessageId = 0;
EntityCollection entities; EntityCollection entities;
HomeAssistantUI ui; HomeAssistantUI ui;
Map _instanceConfig = {}; Map _instanceConfig = {};
@ -23,12 +19,7 @@ class HomeAssistant {
Map _rawLovelaceData; Map _rawLovelaceData;
Completer _fetchCompleter; Completer _fetchCompleter;
Completer _statesCompleter;
Completer _servicesCompleter;
Completer _lovelaceCompleter;
Completer _configCompleter;
Completer _connectionCompleter; Completer _connectionCompleter;
Completer _userInfoCompleter;
Timer _connectionTimer; Timer _connectionTimer;
Timer _fetchTimer; Timer _fetchTimer;
bool autoReconnect = false; bool autoReconnect = false;
@ -211,7 +202,7 @@ class HomeAssistant {
_handleMessage(String message) { _handleMessage(String message) {
var data = json.decode(message); var data = json.decode(message);
if (data["type"] == "auth_required") { if (data["type"] == "auth_required") {
_sendAuthMessageRaw('{"type": "auth","access_token": "$_password"}'); _sendAuthMessage('{"type": "auth","access_token": "$_password"}');
} else if (data["type"] == "auth_ok") { } else if (data["type"] == "auth_ok") {
_completeConnecting(null); _completeConnecting(null);
_sendSubscribe(); _sendSubscribe();
@ -219,17 +210,12 @@ class HomeAssistant {
_completeConnecting({"errorCode": 6, "errorMessage": "${data["message"]}"}); _completeConnecting({"errorCode": 6, "errorMessage": "${data["message"]}"});
} else if (data["type"] == "result") { } else if (data["type"] == "result") {
Logger.d("[Received] <== id:${data["id"]}, ${data['success'] ? 'success' : 'error'}"); Logger.d("[Received] <== id:${data["id"]}, ${data['success'] ? 'success' : 'error'}");
if (data["id"] == _configMessageId) { if (data["success"]) {
_parseConfig(data); _messageResolver[data["id"]]?.complete(data);
} else if (data["id"] == _statesMessageId) { } else {
_parseEntities(data); _messageResolver[data["id"]]?.completeError(data["error"]["message"]);
} else if (data["id"] == _lovelaceMessageId) {
_handleLovelace(data);
} else if (data["id"] == _servicesMessageId) {
_parseServices(data);
} else if (data["id"] == _userInfoMessageId) {
_parseUserInfo(data);
} }
_messageResolver.remove(data["id"]);
} else if (data["type"] == "event") { } else if (data["type"] == "event") {
if ((data["event"] != null) && (data["event"]["event_type"] == "state_changed")) { if ((data["event"] != null) && (data["event"]["event_type"] == "state_changed")) {
Logger.d("[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"]}");
@ -247,64 +233,48 @@ class HomeAssistant {
void _sendSubscribe() { void _sendSubscribe() {
_incrementMessageId(); _incrementMessageId();
_subscriptionMessageId = _currentMessageId; _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() { Future _getConfig() async {
_configCompleter = new Completer(); await _sendInitialMessage("get_config").then((data) => _instanceConfig = Map.from(data["result"]));
_incrementMessageId();
_configMessageId = _currentMessageId;
_sendMessageRaw('{"id": $_configMessageId, "type": "get_config"}', false);
return _configCompleter.future;
} }
Future _getStates() { Future _getStates() async {
_statesCompleter = new Completer(); await _sendInitialMessage("get_states").then((data) => entities.parse(data["result"]));
_incrementMessageId();
_statesMessageId = _currentMessageId;
_sendMessageRaw('{"id": $_statesMessageId, "type": "get_states"}', false);
return _statesCompleter.future;
} }
Future _getLovelace() { Future _getLovelace() async {
_lovelaceCompleter = new Completer(); await _sendInitialMessage("lovelace/config").then((data) => _rawLovelaceData = data["result"]);
_incrementMessageId();
_lovelaceMessageId = _currentMessageId;
_sendMessageRaw('{"id": $_lovelaceMessageId, "type": "lovelace/config"}', false);
return _lovelaceCompleter.future;
} }
Future _getUserInfo() { Future _getUserInfo() async {
_userInfoCompleter = new Completer(); _userName = null;
_incrementMessageId(); await _sendInitialMessage("auth/current_user").then((data) => _userName = data["result"]["name"]);
_userInfoMessageId = _currentMessageId;
_sendMessageRaw('{"id": $_userInfoMessageId, "type": "auth/current_user"}', false);
return _userInfoCompleter.future;
} }
Future _getServices() { Future _getServices() async {
_servicesCompleter = new Completer(); await _sendInitialMessage("get_services").then((data) => Logger.d("We actually don`t need the list of servcies for now"));
_incrementMessageId();
_servicesMessageId = _currentMessageId;
_sendMessageRaw('{"id": $_servicesMessageId, "type": "get_services"}', false);
return _servicesCompleter.future;
} }
_incrementMessageId() { _incrementMessageId() {
_currentMessageId += 1; _currentMessageId += 1;
} }
void _sendAuthMessageRaw(String message) { void _sendAuthMessage(String message) {
Logger.d( "[Sending] ==> auth request"); Logger.d( "[Sending] ==> auth request");
_hassioChannel.sink.add(message); _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(); var sendCompleter = Completer();
if (queued) _messageQueue.add(message); if (queued) _messageQueue.add(message);
_connection().then((r) { _connection().then((r) {
@ -359,7 +329,7 @@ class HomeAssistant {
} }
message += '}'; message += '}';
} }
return _sendMessageRaw(message, true); return _send(message, true);
} }
void _handleEntityStateChange(Map eventData) { 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() { void _parseLovelace() {
Logger.d("--Title: ${_rawLovelaceData["title"]}"); Logger.d("--Title: ${_rawLovelaceData["title"]}");
ui.title = _rawLovelaceData["title"]; ui.title = _rawLovelaceData["title"];
@ -514,15 +451,6 @@ class HomeAssistant {
return result; 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() { void _createUI() {
ui = HomeAssistantUI(); ui = HomeAssistantUI();
if ((_useLovelace) && (_rawLovelaceData != null)) { if ((_useLovelace) && (_rawLovelaceData != null)) {

View File

@ -649,7 +649,10 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker
primary: false, primary: false,
drawer: _buildAppDrawer(), drawer: _buildAppDrawer(),
bottomNavigationBar: bottomBar, bottomNavigationBar: bottomBar,
body: _buildScaffoldBody(true) body: HomeAssistantModel(
child: _buildScaffoldBody(true),
homeAssistant: _homeAssistant,
)
); );
} else { } else {
return Scaffold( return Scaffold(

View File

@ -223,6 +223,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.5.0+1" version: "0.5.0+1"
pedantic:
dependency: transitive
description:
name: pedantic
url: "https://pub.dartlang.org"
source: hosted
version: "1.4.0"
petitparser: petitparser:
dependency: transitive dependency: transitive
description: description:
@ -262,7 +269,7 @@ packages:
name: source_span name: source_span
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.4.1" version: "1.5.4"
sqflite: sqflite:
dependency: transitive dependency: transitive
description: description:
@ -304,14 +311,14 @@ packages:
name: term_glyph name: term_glyph
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.1" version: "1.1.0"
test_api: test_api:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.2.1" version: "0.2.2"
typed_data: typed_data:
dependency: transitive dependency: transitive
description: description: