use of org.openhab.binding.satel.command.SatelCommand in project openhab1-addons by openhab.
the class SatelBinding method internalReceiveCommand.
/**
* {@inheritDoc}
*/
@Override
protected void internalReceiveCommand(String itemName, Command command) {
if (!isProperlyConfigured()) {
logger.warn("Binding not properly configured, exiting");
return;
}
if (!this.satelModule.isInitialized()) {
logger.debug("Module not initialized yet, ignoring command");
return;
}
for (SatelBindingProvider provider : providers) {
SatelBindingConfig itemConfig = provider.getItemConfig(itemName);
if (itemConfig != null) {
logger.trace("Sending internal command for item {}: {}", itemName, command);
SatelCommand satelCmd = itemConfig.convertCommand(command, this.satelModule.getIntegraType(), getUserCode());
if (satelCmd != null) {
this.satelModule.sendCommand(satelCmd);
}
break;
}
}
}
use of org.openhab.binding.satel.command.SatelCommand in project openhab1-addons by openhab.
the class SatelModule method disconnect.
private synchronized void disconnect() {
// notifying about send failure
while (!this.sendQueue.isEmpty()) {
SatelCommand cmd = this.sendQueue.poll();
cmd.setState(State.FAILED);
}
synchronized (this.channelLock) {
if (this.channel != null) {
this.channel.disconnect();
this.channel = null;
// notify about connection status change
this.dispatchEvent(new ConnectionStatusEvent(false));
}
}
}
use of org.openhab.binding.satel.command.SatelCommand in project openhab1-addons by openhab.
the class SatelBinding method incomingEvent.
/**
* {@inheritDoc}
*/
@Override
public void incomingEvent(SatelEvent event) {
logger.trace("Handling incoming event: {}", event);
// refresh all states that have changed
if (event instanceof NewStatesEvent) {
List<SatelCommand> commands = getRefreshCommands((NewStatesEvent) event);
for (SatelCommand command : commands) {
this.satelModule.sendCommand(command);
}
}
// if just connected, force refreshing
if (event instanceof ConnectionStatusEvent) {
ConnectionStatusEvent statusEvent = (ConnectionStatusEvent) event;
if (statusEvent.isConnected()) {
switchForceRefresh(true);
}
}
// update items
for (SatelBindingProvider provider : providers) {
for (String itemName : provider.getItemNames()) {
SatelBindingConfig itemConfig = provider.getItemConfig(itemName);
Item item = provider.getItem(itemName);
State newState = itemConfig.convertEventToState(item, event);
if (newState != null) {
logger.debug("Updating item state: item = {}, state = {}, event = {}", itemName, newState, event);
eventPublisher.postUpdate(itemName, newState);
itemConfig.setItemInitialized();
}
}
}
}
use of org.openhab.binding.satel.command.SatelCommand in project openhab1-addons by openhab.
the class SatelBinding method getRefreshCommands.
private List<SatelCommand> getRefreshCommands(NewStatesEvent nse) {
logger.trace("Gathering refresh commands from all items");
boolean forceRefresh = switchForceRefresh(false);
List<SatelCommand> commands = new LinkedList<SatelCommand>();
for (SatelBindingProvider provider : providers) {
for (String itemName : provider.getItemNames()) {
logger.trace("Getting refresh command from item: {}", itemName);
SatelBindingConfig itemConfig = provider.getItemConfig(itemName);
SatelCommand command = itemConfig.buildRefreshCommand(this.satelModule.getIntegraType());
if (command == null || commands.contains(command)) {
continue;
}
// either state has changed or this is status command (so likely RTC has changed)
// also if item hasn't received any update yet or refresh is forced
// get the latest value from the module
byte commandCode = command.getRequest().getCommand();
if (forceRefresh || !itemConfig.isItemInitialized() || (nse != null && nse.isNew(commandCode)) || commandCode == IntegraStatusCommand.COMMAND_CODE) {
commands.add(command);
}
}
}
return commands;
}
use of org.openhab.binding.satel.command.SatelCommand in project openhab1-addons by openhab.
the class SatelModule method communicationLoop.
private void communicationLoop(TimeoutTimer timeoutTimer) {
long reconnectionTime = 10 * 1000;
boolean receivedResponse = false;
SatelCommand command = null;
try {
while (!Thread.currentThread().isInterrupted()) {
// connect, if not connected yet
if (this.channel == null) {
long connectStartTime = System.currentTimeMillis();
synchronized (this) {
this.channel = connect();
}
if (this.channel == null) {
// notify about connection failure
this.dispatchEvent(new ConnectionStatusEvent(false));
// try to reconnect after a while, if connection hasn't
// been established
Thread.sleep(reconnectionTime - System.currentTimeMillis() + connectStartTime);
continue;
}
}
// get next command and send it
command = this.sendQueue.take();
logger.debug("Sending message: {}", command.getRequest());
timeoutTimer.start();
boolean sent = this.writeMessage(command.getRequest());
timeoutTimer.stop();
if (!sent) {
break;
}
command.setState(State.SENT);
// command sent, wait for response
logger.trace("Waiting for response");
timeoutTimer.start();
SatelMessage response = this.readMessage();
timeoutTimer.stop();
if (response == null) {
break;
}
logger.debug("Got response: {}", response);
if (!receivedResponse) {
receivedResponse = true;
// notify about connection success after first
// response from the module
this.dispatchEvent(new ConnectionStatusEvent(true));
}
if (command.handleResponse(this, response)) {
command.setState(State.SUCCEEDED);
} else {
command.setState(State.FAILED);
}
command = null;
}
} catch (InterruptedException e) {
// exit thread
} catch (Exception e) {
// unexpected error, log and exit thread
logger.info("Unhandled exception occurred in communication loop, disconnecting.", e);
} finally {
// stop counting if thread interrupted
timeoutTimer.stop();
}
// either send or receive failed
if (command != null) {
command.setState(State.FAILED);
}
disconnect();
}
Aggregations