RasPi does the Home Automation (Part IV): Cut the ‘rope’
Hi all,
until now all UI-Actions to control my wireless gears had to run directly on the Pi which controls the remote as e.g. deviceControl.turnOn(device);
is called.
But now I’d rather make a web service available for this purpose to be more independently.
Question is: Which server should I use?
- Apache/PHP: too less Java 😉
- GlassFish/Java EE: too fat for this purpose and hard to take for a RasPi
But wait a minute: wasn’t there a HttpServer
class that comes with Java6?
Using HttpServer
I wrote a very small Server to provide the desired service.
Now I can switch my devices by an URL like this:
http://RASPI-IP:PORT/CONTEXT?houseCode=HOUSE-CODE&group=GROUP&device=DEVICE&command=COMMAND
e.g. http://raspi.home:22222/homeserver?houseCode=a&group=1&device=2&command=1
Recently my Pi received a command from Madrid (thanks José for supporting me ;-)):
For a more convenient usage with e.g. an JavaFX-EventHandler I use a HttpCommand
to act like a DeviceContol
:
public class SendHttpCommand { public static void main(String[] args) { Settings settings = new Settings(); HttpCommand httpCommand = new HttpCommand(settings.getProperty("sweethome.server.ip.local")); Device terrace = new Device("Terrace", "a", "1", "2"); String result = httpCommand.turnOn(terrace); System.out.println(result); } }
Now the DevicePane
looks like this:
public class DevicePane extends AnchorPane { @FXML private Button offButton; @FXML private Button onButton; @FXML private Text deviceNameText; private Device device; private DeviceControl deviceControl; private HttpCommand httpCommand; public DevicePane(final Device device) { this.device = device; init(); } private void init() { FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/fxml/DevicePane.fxml")); fxmlLoader.setRoot(this); fxmlLoader.setController(this); try { fxmlLoader.load(); } catch (IOException ex) { Logger.getLogger(DevicePane.class.getName()).log(Level.SEVERE, null, ex); } Settings settings = new Settings(); httpCommand = new HttpCommand(settings.getProperty("sweethome.server.ip.local")); deviceControl = new DeviceControl(); deviceNameText.setText(device.getName()); offButton.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent t) { turnOff(); } }); onButton.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent t) { turnOn(); } }); } private void turnOn() { Platform.runLater(new Runnable() { @Override public void run() { deviceControl.turnOn(device); httpCommand.turnOn(device); } }); } private void turnOff() { Platform.runLater(new Runnable() { @Override public void run() { deviceControl.turnOff(device); httpCommand.turnOff(device); } }); } }
Leave a Reply