{"id":591,"date":"2013-07-08T23:46:55","date_gmt":"2013-07-08T21:46:55","guid":{"rendered":"http:\/\/www.jensd.de\/wordpress\/?p=591"},"modified":"2013-12-19T12:46:16","modified_gmt":"2013-12-19T11:46:16","slug":"raspi-does-the-home-automation-part-iii-lets-put-it-all-together","status":"publish","type":"post","link":"https:\/\/www.jensd.de\/wordpress\/?p=591","title":{"rendered":"RasPi does the Home Automation (Part III): &#8216;Let&#8217;s Put It All Together&#8217;"},"content":{"rendered":"<p>Hi,<br \/>\nnow it&#8217;s time to put it all together:<br \/>\n<strong>1st<\/strong>: a mini Custom Control for each gear, looking like this:<\/p>\n<p><a href=\"http:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/07\/Gear.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"593\" data-permalink=\"https:\/\/www.jensd.de\/wordpress\/?attachment_id=593\" data-orig-file=\"https:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/07\/Gear.png\" data-orig-size=\"1257,166\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}\" data-image-title=\"Gear\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/07\/Gear-300x39.png\" data-large-file=\"https:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/07\/Gear-1024x135.png\" tabindex=\"0\" role=\"button\" src=\"http:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/07\/Gear-300x39.png\" alt=\"Gear\" width=\"300\" height=\"39\" class=\"aligncenter size-medium wp-image-593\" srcset=\"https:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/07\/Gear-300x39.png 300w, https:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/07\/Gear-1024x135.png 1024w, https:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/07\/Gear.png 1257w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Its controller takes a <code><strong>Device<\/strong><\/code> to trigger <code><strong>DeviceControl<\/strong><\/code> to switch the radio controlled gears:<\/p>\n<p>[java]<br \/>\npublic class DevicePane extends AnchorPane {<\/p>\n<p>    @FXML<br \/>\n    private Button offButton;<br \/>\n    @FXML<br \/>\n    private Button onButton;<br \/>\n    @FXML<br \/>\n    private Text deviceNameText;<\/p>\n<p>    public DevicePane(Device device) {<br \/>\n        init(device);<br \/>\n    }<\/p>\n<p>    private void init(final Device device) {<br \/>\n        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(&#8220;\/fxml\/DevicePane.fxml&#8221;));<br \/>\n        fxmlLoader.setRoot(this);<br \/>\n        fxmlLoader.setController(this);<br \/>\n        try {<br \/>\n            fxmlLoader.load();<br \/>\n        } catch (IOException ex) {<br \/>\n            Logger.getLogger(DevicePane.class.getName()).log(Level.SEVERE, null, ex);<br \/>\n        }<\/p>\n<p>        deviceNameText.setText(device.getName());<\/p>\n<p>        offButton.setOnAction(new EventHandler<ActionEvent>() {<br \/>\n            @Override<br \/>\n            public void handle(ActionEvent t) {<br \/>\n                DeviceControl.get().turnOff(device);<br \/>\n            }<br \/>\n        });<\/p>\n<p>        onButton.setOnAction(new EventHandler<ActionEvent>() {<br \/>\n            @Override<br \/>\n            public void handle(ActionEvent t) {<br \/>\n                DeviceControl.get().turnOn(device);<br \/>\n            }<br \/>\n        });<br \/>\n    }<br \/>\n}<br \/>\n[\/java]<\/p>\n<p>Finally the main controller <code><strong>HomeControlBoardController<\/strong><\/code> creates <code><strong>DevicePane<\/strong><\/code>s based on the configuration:<\/p>\n<p>[java]<br \/>\npublic class HomeControlBoardController {<\/p>\n<p>    @FXML<br \/>\n    private Button exitButton;<br \/>\n    @FXML<br \/>\n    private AnchorPane root;<br \/>\n    @FXML<br \/>\n    private VBox devicesPane;<\/p>\n<p>    public HomeControlBoardController() {<br \/>\n    }<\/p>\n<p>    @FXML<br \/>\n    void initialize() {<br \/>\n        assert devicesPane != null : &#8220;fx:id=\\&#8221;devicesPane\\&#8221; was not injected: check your FXML file &#8216;HomeControlBoard.fxml&#8217;.&#8221;;<br \/>\n        assert exitButton != null : &#8220;fx:id=\\&#8221;exitButton\\&#8221; was not injected: check your FXML file &#8216;HomeControlBoard.fxml&#8217;.&#8221;;<br \/>\n        assert root != null : &#8220;fx:id=\\&#8221;root\\&#8221; was not injected: check your FXML file &#8216;HomeControlBoard.fxml&#8217;.&#8221;;<\/p>\n<p>        \/\/ Running on RasPi always provide a way out instead of kill command<br \/>\n        final EventHandler<KeyEvent> exitOnCrtlCEventHandler =<br \/>\n                new EventHandler<KeyEvent>() {<br \/>\n            @Override<br \/>\n            public void handle(final KeyEvent keyEvent) {<br \/>\n                if (keyEvent.isControlDown() &#038;&#038; KeyCode.C.equals(keyEvent.getCode())) {<br \/>\n                    Platform.exit();<br \/>\n                    keyEvent.consume();<br \/>\n                }<br \/>\n            }<br \/>\n        };<br \/>\n        root.setOnKeyPressed(exitOnCrtlCEventHandler);<\/p>\n<p>        List<Device> devices = DeviceLoader.load();<\/p>\n<p>        for (Device device : devices) {<br \/>\n            addDevice(device);<br \/>\n        }<br \/>\n    }<\/p>\n<p>    private void addDevice(Device device) {<br \/>\n        DevicePane devicePane = new DevicePane(device);<br \/>\n        devicesPane.getChildren().add(devicePane);<br \/>\n    }<\/p>\n<p>    @FXML<br \/>\n    public void exit() {<br \/>\n        Platform.exit();<br \/>\n    }<br \/>\n}<br \/>\n[\/java]<\/p>\n<p>So finally (by now) it looks like this:<\/p>\n<p><a href=\"http:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/07\/HomeControl2.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"612\" data-permalink=\"https:\/\/www.jensd.de\/wordpress\/?attachment_id=612\" data-orig-file=\"https:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/07\/HomeControl2.png\" data-orig-size=\"800,449\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}\" data-image-title=\"HomeControl2\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/07\/HomeControl2-300x168.png\" data-large-file=\"https:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/07\/HomeControl2.png\" tabindex=\"0\" role=\"button\" src=\"http:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/07\/HomeControl2-300x168.png\" alt=\"HomeControl2\" width=\"800\" height=\"449\" class=\"aligncenter size-medium wp-image-612\" srcset=\"https:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/07\/HomeControl2-300x168.png 300w, https:\/\/www.jensd.de\/wordpress\/wp-content\/uploads\/2013\/07\/HomeControl2.png 800w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><\/p>\n<p>Next: <a href=\"http:\/\/www.jensd.de\/wordpress\/?p=638\" title=\"RasPi does the Home Automation (Part IV): Cut the \u2018rope\u2019\">RasPi does the Home Automation (Part IV): Cut the \u2018rope\u2019<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hi, now it&#8217;s time to put it all together: 1st: a mini Custom Control for each gear, looking like this: Its controller takes a Device to trigger DeviceControl to switch the radio controlled gears: [java] public class DevicePane extends AnchorPane { @FXML private Button offButton; @FXML private Button onButton; @FXML private Text deviceNameText; public DevicePane(Device&hellip; <span class=\"clear\"><\/span><a href=\"https:\/\/www.jensd.de\/wordpress\/?p=591\" class=\"more-link read-more\" rel=\"bookmark\">Continue Reading <span class=\"screen-reader-text\">RasPi does the Home Automation (Part III): &#8216;Let&#8217;s Put It All Together&#8217;<\/span><i class=\"fa fa-arrow-right\"><\/i><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false,"jetpack_publicize_message":"#JavaFX: #RasberryPi does the #HomeAutomation (Part III): 'Let's Put It All Together' http:\/\/wp.me\/p38FCL-9x","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[20,21,22,30,4],"tags":[87,88,91,76,86],"jetpack_publicize_connections":[],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p38FCL-9x","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.jensd.de\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/591"}],"collection":[{"href":"https:\/\/www.jensd.de\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.jensd.de\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.jensd.de\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.jensd.de\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=591"}],"version-history":[{"count":41,"href":"https:\/\/www.jensd.de\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/591\/revisions"}],"predecessor-version":[{"id":662,"href":"https:\/\/www.jensd.de\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/591\/revisions\/662"}],"wp:attachment":[{"href":"https:\/\/www.jensd.de\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=591"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.jensd.de\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=591"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.jensd.de\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=591"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}