/**
* Copyright (c) 2014-2017 by the respective copyright holders.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.smarthome.model.script.actions;
import java.util.Map;
import java.util.Map.Entry;
import org.eclipse.smarthome.core.events.EventPublisher;
import org.eclipse.smarthome.core.items.GroupItem;
import org.eclipse.smarthome.core.items.Item;
import org.eclipse.smarthome.core.items.ItemNotFoundException;
import org.eclipse.smarthome.core.items.ItemRegistry;
import org.eclipse.smarthome.core.items.events.ItemEventFactory;
import org.eclipse.smarthome.core.types.Command;
import org.eclipse.smarthome.core.types.State;
import org.eclipse.smarthome.core.types.TypeParser;
import org.eclipse.smarthome.model.script.ScriptServiceUtil;
import org.slf4j.LoggerFactory;
import com.google.common.collect.Maps;
/**
* The static methods of this class are made available as functions in the scripts.
* This gives direct write access to the Eclipse SmartHome event bus from within scripts.
* Items should not be updated directly (setting the state property), but updates should
* be sent to the bus, so that all interested bundles are notified.
*
* @author Kai Kreuzer - Initial contribution and API
* @author Stefan Bußweiler - Migration to new ESH event concept
*
*/
public class BusEvent {
/**
* Sends a command for a specified item to the event bus.
*
* @param item the item to send the command to
* @param commandString the command to send
*/
static public Object sendCommand(Item item, String commandString) {
if (item != null) {
return sendCommand(item.getName(), commandString);
} else {
return null;
}
}
/**
* Sends a number as a command for a specified item to the event bus.
*
* @param item the item to send the command to
* @param number the number to send as a command
*/
static public Object sendCommand(Item item, Number number) {
if (item != null && number != null) {
return sendCommand(item.getName(), number.toString());
} else {
return null;
}
}
/**
* Sends a command for a specified item to the event bus.
*
* @param itemName the name of the item to send the command to
* @param commandString the command to send
*/
static public Object sendCommand(String itemName, String commandString) {
ItemRegistry registry = ScriptServiceUtil.getItemRegistry();
EventPublisher publisher = ScriptServiceUtil.getEventPublisher();
if (publisher != null && registry != null) {
try {
Item item = registry.getItem(itemName);
Command command = TypeParser.parseCommand(item.getAcceptedCommandTypes(), commandString);
publisher.post(ItemEventFactory.createCommandEvent(itemName, command));
} catch (ItemNotFoundException e) {
LoggerFactory.getLogger(BusEvent.class).warn("Item '" + itemName + "' does not exist.");
}
}
return null;
}
/**
* Sends a command for a specified item to the event bus.
*
* @param item the item to send the command to
* @param command the command to send
*/
static public Object sendCommand(Item item, Command command) {
EventPublisher publisher = ScriptServiceUtil.getEventPublisher();
if (publisher != null && item != null) {
publisher.post(ItemEventFactory.createCommandEvent(item.getName(), command));
}
return null;
}
/**
* Posts a status update for a specified item to the event bus.
*
* @param item the item to send the status update for
* @param state the new state of the item as a number
*/
static public Object postUpdate(Item item, Number state) {
if (item != null && state != null) {
return postUpdate(item.getName(), state.toString());
} else {
return null;
}
}
/**
* Posts a status update for a specified item to the event bus.
*
* @param item the item to send the status update for
* @param stateAsString the new state of the item
*/
static public Object postUpdate(Item item, String stateAsString) {
if (item != null) {
return postUpdate(item.getName(), stateAsString);
} else {
return null;
}
}
/**
* Posts a status update for a specified item to the event bus.
*
* @param itemName the name of the item to send the status update for
* @param stateAsString the new state of the item
*/
static public Object postUpdate(String itemName, String stateString) {
ItemRegistry registry = ScriptServiceUtil.getItemRegistry();
EventPublisher publisher = ScriptServiceUtil.getEventPublisher();
if (publisher != null && registry != null) {
try {
Item item = registry.getItem(itemName);
State state = TypeParser.parseState(item.getAcceptedDataTypes(), stateString);
publisher.post(ItemEventFactory.createStateEvent(itemName, state));
} catch (ItemNotFoundException e) {
LoggerFactory.getLogger(BusEvent.class).warn("Item '" + itemName + "' does not exist.");
}
}
return null;
}
/**
* Posts a status update for a specified item to the event bus.
* t
*
* @param item the item to send the status update for
* @param state the new state of the item
*/
static public Object postUpdate(Item item, State state) {
EventPublisher publisher = ScriptServiceUtil.getEventPublisher();
if (publisher != null && item != null) {
publisher.post(ItemEventFactory.createStateEvent(item.getName(), state));
}
return null;
}
/**
* Stores the current states for a list of items in a map.
* A group item is not itself put into the map, but instead all its members.
*
* @param items the items for which the state should be stored
* @return the map of items with their states
*/
static public Map<Item, State> storeStates(Item... items) {
Map<Item, State> statesMap = Maps.newHashMap();
if (items != null) {
for (Item item : items) {
if (item instanceof GroupItem) {
GroupItem groupItem = (GroupItem) item;
for (Item member : groupItem.getAllMembers()) {
statesMap.put(member, member.getState());
}
} else {
statesMap.put(item, item.getState());
}
}
}
return statesMap;
}
/**
* Restores item states from a map.
* If the saved state can be interpreted as a command, a command is sent for the item
* (and the physical device can send a status update if occurred). If it is no valid
* command, the item state is directly updated to the saved value.
*
* @param statesMap a map with ({@link Item}, {@link State}) entries
* @return null
*/
static public Object restoreStates(Map<Item, State> statesMap) {
if (statesMap != null) {
for (Entry<Item, State> entry : statesMap.entrySet()) {
if (entry.getValue() instanceof Command) {
sendCommand(entry.getKey(), (Command) entry.getValue());
} else {
postUpdate(entry.getKey(), entry.getValue());
}
}
}
return null;
}
// static public JobKey timer(AbstractInstant instant, Object)
}