Resolves #21: Handling socket disconnect by sink done Future
This commit is contained in:
parent
ebb2f2b4e5
commit
98d716109b
@ -19,7 +19,9 @@ class _SwitchEntityWidgetState extends _EntityWidgetState {
|
|||||||
value: widget.entity.isOn,
|
value: widget.entity.isOn,
|
||||||
onChanged: ((switchState) {
|
onChanged: ((switchState) {
|
||||||
sendNewState(switchState);
|
sendNewState(switchState);
|
||||||
|
setState(() {
|
||||||
widget.entity.state = switchState ? 'on' : 'off';
|
widget.entity.state = switchState ? 'on' : 'off';
|
||||||
|
});
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -25,7 +25,7 @@ class HomeAssistant {
|
|||||||
Timer _connectionTimer;
|
Timer _connectionTimer;
|
||||||
Timer _fetchTimer;
|
Timer _fetchTimer;
|
||||||
|
|
||||||
int messageExpirationTime = 20; //seconds
|
int messageExpirationTime = 50; //seconds
|
||||||
Duration fetchTimeout = Duration(seconds: 30);
|
Duration fetchTimeout = Duration(seconds: 30);
|
||||||
Duration connectTimeout = Duration(seconds: 10);
|
Duration connectTimeout = Duration(seconds: 10);
|
||||||
|
|
||||||
@ -51,9 +51,9 @@ class HomeAssistant {
|
|||||||
_fetchCompleter = new Completer();
|
_fetchCompleter = new Completer();
|
||||||
_fetchTimer = Timer(fetchTimeout, () {
|
_fetchTimer = Timer(fetchTimeout, () {
|
||||||
closeConnection();
|
closeConnection();
|
||||||
_finishFetching({"errorCode" : 9,"errorMessage": "Connection timeout or connection issues"});
|
_finishFetching({"errorCode" : 9,"errorMessage": "Couldn't get data from server"});
|
||||||
});
|
});
|
||||||
_reConnectSocket().then((r) {
|
_connection().then((r) {
|
||||||
_getData();
|
_getData();
|
||||||
}).catchError((e) {
|
}).catchError((e) {
|
||||||
_finishFetching(e);
|
_finishFetching(e);
|
||||||
@ -69,7 +69,7 @@ class HomeAssistant {
|
|||||||
_hassioChannel = null;
|
_hassioChannel = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future _reConnectSocket() {
|
Future _connection() {
|
||||||
if ((_connectionCompleter != null) && (!_connectionCompleter.isCompleted)) {
|
if ((_connectionCompleter != null) && (!_connectionCompleter.isCompleted)) {
|
||||||
TheLogger.log("Debug","Previous connection is not complited");
|
TheLogger.log("Debug","Previous connection is not complited");
|
||||||
} else {
|
} else {
|
||||||
@ -78,14 +78,19 @@ class HomeAssistant {
|
|||||||
_connectionCompleter = new Completer();
|
_connectionCompleter = new Completer();
|
||||||
_connectionTimer = Timer(connectTimeout, () {
|
_connectionTimer = Timer(connectTimeout, () {
|
||||||
closeConnection();
|
closeConnection();
|
||||||
_finishConnecting({"errorCode" : 1,"errorMessage": "Connection timeout or connection issues"});
|
_finishConnecting({"errorCode" : 1,"errorMessage": "Couldn't connect to Home Assistant. Looks like a network issues"});
|
||||||
});
|
});
|
||||||
_hassioChannel = IOWebSocketChannel.connect(_hassioAPIEndpoint, pingInterval: Duration(seconds: 60));
|
_hassioChannel = IOWebSocketChannel.connect(
|
||||||
|
_hassioAPIEndpoint, pingInterval: Duration(seconds: 30));
|
||||||
_hassioChannel.stream.handleError((e) {
|
_hassioChannel.stream.handleError((e) {
|
||||||
TheLogger.log("Error", "Unhandled socket error: ${e.toString()}");
|
TheLogger.log("Error", "Unhandled socket error: ${e.toString()}");
|
||||||
});
|
});
|
||||||
_hassioChannel.stream.listen((message) =>
|
_hassioChannel.stream.listen((message) =>
|
||||||
_handleMessage(_connectionCompleter, message));
|
_handleMessage(_connectionCompleter, message));
|
||||||
|
_hassioChannel.sink.done.whenComplete(() {
|
||||||
|
TheLogger.log("Debug","Socket sink finished. Assuming it is closed.");
|
||||||
|
closeConnection();
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
//TheLogger.log("Debug","Socket looks connected...${_hassioChannel.protocol}, ${_hassioChannel.closeCode}, ${_hassioChannel.closeReason}");
|
//TheLogger.log("Debug","Socket looks connected...${_hassioChannel.protocol}, ${_hassioChannel.closeCode}, ${_hassioChannel.closeReason}");
|
||||||
_finishConnecting(null);
|
_finishConnecting(null);
|
||||||
@ -211,7 +216,7 @@ class HomeAssistant {
|
|||||||
_sendMessageRaw(String message, bool queued) {
|
_sendMessageRaw(String message, bool queued) {
|
||||||
var sendCompleter = Completer();
|
var sendCompleter = Completer();
|
||||||
if (queued) _messageQueue.add(message);
|
if (queued) _messageQueue.add(message);
|
||||||
_reConnectSocket().then((r) {
|
_connection().then((r) {
|
||||||
_messageQueue.getActualMessages().forEach((message){
|
_messageQueue.getActualMessages().forEach((message){
|
||||||
TheLogger.log("Debug", "[Sending queued] ==> $message");
|
TheLogger.log("Debug", "[Sending queued] ==> $message");
|
||||||
_hassioChannel.sink.add(message);
|
_hassioChannel.sink.add(message);
|
||||||
|
@ -197,14 +197,7 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _callService(String domain, String service, String entityId, Map<String, String> additionalParams) {
|
void _callService(String domain, String service, String entityId, Map<String, String> additionalParams) {
|
||||||
setState(() {
|
_homeAssistant.callService(domain, service, entityId, additionalParams).catchError((e) => _setErrorState(e));
|
||||||
_isLoading = true;
|
|
||||||
});
|
|
||||||
_homeAssistant.callService(domain, service, entityId, additionalParams).then((r) {
|
|
||||||
setState(() {
|
|
||||||
_isLoading = false;
|
|
||||||
});
|
|
||||||
}).catchError((e) => _setErrorState(e));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _showEntityPage(Entity entity) {
|
void _showEntityPage(Entity entity) {
|
||||||
|
Reference in New Issue
Block a user