RasPi does the Home Automation (Part II): Crossing the bridge to JavaFX


before JavaFX can take over, I need some bottom-up stuff to control my Intertechno-Devices.

Basically this is the schema:

Right now I have 2 radio intermediate adapters to switch the lights of my terrace/garden and the fountain. And one of these to control the lights in front of my house (cool: can be combined with existing light switch) :

Some Details:

Pragmatic approach: “Runtime.getRuntime().exec(...)
Clearly to pipe the data to the C implementation via a JNI call would be nice, but to get ahead in time by now for me it’s ok to use Runtime.getRuntime().exec(...) to run my “send” CLI command:

 public class Send {

  public enum Command {

  public static final String SEND_COMMAND = "/home/pi/rcswitch-pi/send";
  private static final Logger logger = Logger.getLogger(Send.class.getName());

  public void send(String deviveCode, Command command) {
    try {
      String commandLine = String.
              format("%s %s %s", SEND_COMMAND, deviveCode, command.ordinal());
      logger.log(Level.INFO, "send: {0}", commandLine);

      Runtime rt = Runtime.getRuntime();
      Process pr = rt.exec(commandLine);
      BufferedReader rd = new BufferedReader(new InputStreamReader(pr.
      String line;
      while ((line = rd.readLine()) != null) {
        logger.log(Level.INFO, line);

    } catch (IOException ex) {
              log(Level.SEVERE, null, ex);
  public boolean isSendCommandExecutable(){
      return Files.isExecutable(Paths.get(SEND_COMMAND));

The Java-Send is used by DeviceControl:

public class DeviceControl {

    private Send send = new Send();
    private static final Logger logger = Logger.getLogger(DeviceLoader.class.getName());
    private static DeviceControl me;

    private DeviceControl() {

    public static DeviceControl get() {
        if (me == null) {
            me = new DeviceControl();
        return me;

    public void turnOn(Device device) {
        logger.log(Level.INFO, "About to {0} {1} ({2})", new Object[]{Send.Command.TURN_ON, device.getName(), device.getId()});
        if (send.isSendCommandExecutable()) {
            send.send(device.getId(), Send.Command.TURN_ON);
        } else {
            logger.log(Level.SEVERE, "{0} could not be executed!", Send.SEND_COMMAND);

    public void turnOff(Device device) {
        logger.log(Level.INFO, "About to {0} {1} ({2})", new Object[]{Send.Command.TURN_OFF, device.getName(), device.getId()});
        if (send.isSendCommandExecutable()) {
            send.send(device.getId(), Send.Command.TURN_OFF);
        } else {
            logger.log(Level.SEVERE, "{0} could not be executed!", Send.SEND_COMMAND);

A Intertechno-appliance is represented by Device:

public class Device {

  private String name;
  private String houseCode;
  private String group;
  private String device;

  public Device() {

  public Device(String name, String houseCode, String group, String device) {
    this.name = name;
    this.houseCode = houseCode;
    this.group = group;
    this.device = device;

  public String getId() {
    return String.format("%s %s %s", houseCode, group, device);

 [.... getter & setter ....]


The available Devices are defined via a configuration-file:

<?xml version="1.0" encoding="UTF-8"?>
        <device name="Haustür" houseCode="a" group="1" device="1"/>
        <device name="Terrasse" houseCode="a" group="1" device="2"/>
        <device name="Springbrunnen" houseCode="a" group="1" device="3"/>

Finally utility class DeviceLoader.load(); loads the configuration and provides a List of Devices.
The HomeControlBoardController dynamically creates DevicePanes according to the configured devices.

That’s it for now.

RasPi does the Home Automation (Part III): ‘Let’s Put It All Together’

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

2 thoughts on “RasPi does the Home Automation (Part II): Crossing the bridge to JavaFX”