Search in sources :

Example 1 with SatelCommand

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;
        }
    }
}
Also used : SatelBindingProvider(org.openhab.binding.satel.SatelBindingProvider) SatelCommand(org.openhab.binding.satel.command.SatelCommand) SatelBindingConfig(org.openhab.binding.satel.SatelBindingConfig)

Example 2 with SatelCommand

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));
        }
    }
}
Also used : ConnectionStatusEvent(org.openhab.binding.satel.internal.event.ConnectionStatusEvent) SatelCommand(org.openhab.binding.satel.command.SatelCommand)

Example 3 with SatelCommand

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();
            }
        }
    }
}
Also used : Item(org.openhab.core.items.Item) SatelBindingProvider(org.openhab.binding.satel.SatelBindingProvider) ConnectionStatusEvent(org.openhab.binding.satel.internal.event.ConnectionStatusEvent) State(org.openhab.core.types.State) NewStatesEvent(org.openhab.binding.satel.internal.event.NewStatesEvent) SatelCommand(org.openhab.binding.satel.command.SatelCommand) SatelBindingConfig(org.openhab.binding.satel.SatelBindingConfig)

Example 4 with SatelCommand

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;
}
Also used : SatelBindingProvider(org.openhab.binding.satel.SatelBindingProvider) SatelCommand(org.openhab.binding.satel.command.SatelCommand) SatelBindingConfig(org.openhab.binding.satel.SatelBindingConfig) LinkedList(java.util.LinkedList)

Example 5 with SatelCommand

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();
}
Also used : ConnectionStatusEvent(org.openhab.binding.satel.internal.event.ConnectionStatusEvent) SatelCommand(org.openhab.binding.satel.command.SatelCommand) IOException(java.io.IOException)

Aggregations

SatelCommand (org.openhab.binding.satel.command.SatelCommand)5 SatelBindingConfig (org.openhab.binding.satel.SatelBindingConfig)3 SatelBindingProvider (org.openhab.binding.satel.SatelBindingProvider)3 ConnectionStatusEvent (org.openhab.binding.satel.internal.event.ConnectionStatusEvent)3 IOException (java.io.IOException)1 LinkedList (java.util.LinkedList)1 NewStatesEvent (org.openhab.binding.satel.internal.event.NewStatesEvent)1 Item (org.openhab.core.items.Item)1 State (org.openhab.core.types.State)1