Fix wrong password issue and infinity reconnects issue

This commit is contained in:
Yegor Vialov 2018-10-07 18:21:55 +03:00
parent 16a9392fa6
commit e99c3f5742
2 changed files with 32 additions and 12 deletions

View File

@ -13,6 +13,7 @@ class HomeAssistant {
int _servicesMessageId = 0; int _servicesMessageId = 0;
int _subscriptionMessageId = 0; int _subscriptionMessageId = 0;
int _configMessageId = 0; int _configMessageId = 0;
int _userInfoMessageId = 0;
EntityCollection _entities; EntityCollection _entities;
ViewBuilder _viewBuilder; ViewBuilder _viewBuilder;
Map _instanceConfig = {}; Map _instanceConfig = {};
@ -24,6 +25,7 @@ class HomeAssistant {
Completer _connectionCompleter; Completer _connectionCompleter;
Timer _connectionTimer; Timer _connectionTimer;
Timer _fetchTimer; Timer _fetchTimer;
bool autoReconnect = false;
StreamSubscription _socketSubscription; StreamSubscription _socketSubscription;
@ -70,8 +72,10 @@ class HomeAssistant {
await _hassioChannel.sink.close().timeout(Duration(seconds: 3), await _hassioChannel.sink.close().timeout(Duration(seconds: 3),
onTimeout: () => TheLogger.log("Warning", "Socket sink closing timeout") onTimeout: () => TheLogger.log("Warning", "Socket sink closing timeout")
); );
await _socketSubscription.cancel();
_hassioChannel = null; _hassioChannel = null;
} }
} }
Future _connection() { Future _connection() {
@ -79,6 +83,7 @@ class HomeAssistant {
TheLogger.log("Debug","Previous connection is not complited"); TheLogger.log("Debug","Previous connection is not complited");
} else { } else {
_connectionCompleter = new Completer(); _connectionCompleter = new Completer();
autoReconnect = false;
if ((_hassioChannel == null) || (_hassioChannel.closeCode != null)) { if ((_hassioChannel == null) || (_hassioChannel.closeCode != null)) {
disconnect().then((_){ disconnect().then((_){
TheLogger.log("Debug", "Socket connecting..."); TheLogger.log("Debug", "Socket connecting...");
@ -92,15 +97,17 @@ class HomeAssistant {
_hassioChannel = IOWebSocketChannel.connect( _hassioChannel = IOWebSocketChannel.connect(
_hassioAPIEndpoint, pingInterval: Duration(seconds: 30)); _hassioAPIEndpoint, pingInterval: Duration(seconds: 30));
_socketSubscription = _hassioChannel.stream.listen( _socketSubscription = _hassioChannel.stream.listen(
(message) => _handleMessage(_connectionCompleter, message), (message) => _handleMessage(message),
cancelOnError: true, cancelOnError: true,
onDone: () { onDone: () {
TheLogger.log("Debug","Disconnect detected. Reconnecting..."); TheLogger.log("Debug","Socket disconnected. Automatic reconnect is $autoReconnect");
disconnect().then((_) { if (autoReconnect) {
_connection().catchError((e){ disconnect().then((_) {
_completeConnecting(e); _connection().catchError((e){
_completeConnecting(e);
});
}); });
}); }
}, },
onError: (e) { onError: (e) {
TheLogger.log("Error","Socket stream Error: $e"); TheLogger.log("Error","Socket stream Error: $e");
@ -120,6 +127,7 @@ class HomeAssistant {
_getConfig().then((result) { _getConfig().then((result) {
_getStates().then((result) { _getStates().then((result) {
_getServices().then((result) { _getServices().then((result) {
_getUserInfo();
_completeFetching(null); _completeFetching(null);
}); });
}); });
@ -133,11 +141,10 @@ class HomeAssistant {
_completeConnecting(error); _completeConnecting(error);
if (!_fetchCompleter.isCompleted) { if (!_fetchCompleter.isCompleted) {
if (error != null) { if (error != null) {
disconnect().then((_){ _fetchCompleter.completeError(error);
_fetchCompleter.completeError(error);
});
} else { } else {
_fetchCompleter.complete(); _fetchCompleter.complete();
autoReconnect = true;
} }
} }
} }
@ -155,7 +162,7 @@ class HomeAssistant {
} }
} }
_handleMessage(Completer connectionCompleter, String message) { _handleMessage(String message) {
var data = json.decode(message); var data = json.decode(message);
//TheLogger.log("Debug","[Received] => Message type: ${data['type']}"); //TheLogger.log("Debug","[Received] => Message type: ${data['type']}");
if (data["type"] == "auth_required") { if (data["type"] == "auth_required") {
@ -164,7 +171,7 @@ class HomeAssistant {
_completeConnecting(null); _completeConnecting(null);
_sendSubscribe(); _sendSubscribe();
} else if (data["type"] == "auth_invalid") { } else if (data["type"] == "auth_invalid") {
_completeFetching({"errorCode": 6, "errorMessage": "${data["message"]}"}); _completeConnecting({"errorCode": 6, "errorMessage": "${data["message"]}"});
} else if (data["type"] == "result") { } else if (data["type"] == "result") {
if (data["id"] == _configMessageId) { if (data["id"] == _configMessageId) {
_parseConfig(data); _parseConfig(data);
@ -172,6 +179,8 @@ class HomeAssistant {
_parseEntities(data); _parseEntities(data);
} else if (data["id"] == _servicesMessageId) { } else if (data["id"] == _servicesMessageId) {
_parseServices(data); _parseServices(data);
} else if (data["id"] == _userInfoMessageId) {
TheLogger.log("Debug","User ingo: $message");
} else if (data["id"] == _currentMessageId) { } else if (data["id"] == _currentMessageId) {
TheLogger.log("Debug","Request id:$_currentMessageId was successful"); TheLogger.log("Debug","Request id:$_currentMessageId was successful");
} }
@ -212,6 +221,15 @@ class HomeAssistant {
return _statesCompleter.future; return _statesCompleter.future;
} }
void _getUserInfo() {
//_servicesCompleter = new Completer();
_incrementMessageId();
_userInfoMessageId = _currentMessageId;
_sendMessageRaw('{"id": $_userInfoMessageId, "type": "auth/current_user"}', false);
//return _servicesCompleter.future;
}
Future _getServices() { Future _getServices() {
_servicesCompleter = new Completer(); _servicesCompleter = new Completer();
_incrementMessageId(); _incrementMessageId();

View File

@ -113,7 +113,9 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver {
_settingsSubscription = eventBus.on<SettingsChangedEvent>().listen((event) { _settingsSubscription = eventBus.on<SettingsChangedEvent>().listen((event) {
TheLogger.log("Debug","Settings change event: reconnect=${event.reconnect}"); TheLogger.log("Debug","Settings change event: reconnect=${event.reconnect}");
if (event.reconnect) { if (event.reconnect) {
_initialLoad(); _homeAssistant.disconnect().then((_){
_initialLoad();
});
} }
}); });
_initialLoad(); _initialLoad();