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

Hi,

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

Basically this is the schema:
RaspiSendSetup

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) :
ITL-230_assembly

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 {
    TURN_OFF, TURN_ON;
  }

  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.
              getInputStream()));
      String line;
      while ((line = rd.readLine()) != null) {
        logger.log(Level.INFO, line);
      }

    } catch (IOException ex) {
      Logger.getLogger(Send.class.getName()).
              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"?>
<home-configuration>
    <devices>
        <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"/>
    </devices>
</home-configuration>

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.

Next:
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”