Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

Pushing Java EE outside of the Enterprise - Home Automation

2 608 vues

Publié le

Presented during JavaOne (San Francisco Sept.2014)

Publié dans : Technologie
  • Soyez le premier à commenter

Pushing Java EE outside of the Enterprise - Home Automation

  1. 1. 1
  2. 2. Pushing Java EE outside of the Enterprise Home Automation David Delabassee -­‐ @delabassee Software Evangelist – Java EE Oracle September, 2014 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | 2
  3. 3. Safe Harbor Statement The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | 3
  4. 4. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Program Agenda Home Automation Java EE Demo Wrap-­‐up 1 2 3 4 4
  5. 5. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Program Agenda Home Automation Java EE Demo Wrap-­‐up 1 2 3 4 5
  6. 6. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Home Automation • “Devices” control - Lights, windows, blinders, audio, doors, wall-­‐plugs, heating, etc. - From different “terminal” • Monitoring & dashboard - Power consumption, weather, motion/presence, intrusion, etc. • Scenario, scene, scheduling & automation • “Flexible” configuration Features 6
  7. 7. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Home Automation Benefits • Better control • Improves day-­‐to-­‐day life • Improves security • More Eco friendly • … 7
  8. 8. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Home Automation Market • Crowded space • Just the beginning! • IoT 8
  9. 9. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Home Automation Technologies • X10 / PCLBUS • RF433 • EnOcean • Z-­‐Wave • ZigBee • Domologic 9 • Domintell • NikoBus / HomeControl • Chacon / DI-­‐O • Somfy RTS • io-­‐homecontrol • VelBus • Domologic • KNX • BLE • HomeKit • Thread • …
  10. 10. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Home Automation • Sensors - Switches, motion, temperature, CO2, humidity, wind speed, etc. • Actuators - Lights, blinders, windows, doors, audio, wall-­‐plugs, etc. • Network - Wired or/and wireless + TCP/IP • Hub, box, gateway - Provides added values Actors 10
  11. 11. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Z-­‐Wave “Z-­‐Wave, The Interoperable Standard” • “Interoperable wireless RF-­‐based communications technology designed for control, monitoring and status reading applications in residential and light commercial environments.” • Proprietary • Z-­‐Wave Alliance - Consortium of 250 manufacturers and service providers worldwide ! http://www.z-­‐wavealliance.org 11
  12. 12. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Z-­‐Wave “Z-­‐Wave, The Interoperable Standard” • Meshed wireless network • Range 100 ft (open-­‐sight) • 232 modules per controller • Cheap and simple 12
  13. 13. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Connectivity • Physical connectivity - Razberry-­‐Pi Daughter Card - Aeon Labs Z-­‐Stick, … • Middleware - OpenZwave - RaZberry / Z-­‐Wave-­‐me / Z-­‐Way - Domoticz, … 13
  14. 14. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Principles 14 Switch Z-­‐Wave Chip 1 1 Z-­‐Wave Midd. App. Set(0) Set(0) Set(0) Get() Get() 1 (inv.) 0 (valid.) 0
  15. 15. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | In real life 15
  16. 16. “The worldwide STANDARD for home and building control” - 40,189 KNX Partners in 125 countries - 100 Scientific Partners in 28 countries - 13 User clubs in 12 countries Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | KNX • ISO/IEC 14543-­‐3 • KNX Association - 340 KNX Members in 37 countries - 40 KNX National Groups - 275 Training Centres in 51 countries ! http://www.knx.org 16
  17. 17. “The worldwide STANDARD for home and building control” Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | KNX • Media - TP, PL, RF and IP • Engineering Tool Software - Manufacturer independent configuration software tool - Design and configure intelligent home and building KNX installations 17
  18. 18. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Connectivity • Physical connectivity - KNX/USB Router - KNX/IP Router - Eelectron Raspberry Pi KNX interface 18
  19. 19. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Calimero • Java library for KNX/EIB applications - KNX Network services and data encodings - Routing - Local device management - Datapoint type and property type translation - ETS4 import, … • Min Java 2 Micro-­‐Edition CDC Foundation Profile • http://calimero.sourceforge.net 19
  20. 20. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Config only Optional Principles KNX Bus Bus Power Supply IP KNX KNX Output module KNX Input module ETS IP Controller Gateway … 110/220v 20
  21. 21. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | In real life 21
  22. 22. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Z-­‐Wave Vs. KNX • Proprietary • 232 devices per controller • Residential grade • Wireless, more sensible • Powered via batteries and PL • Controller is the Single PoF • Simple, non intrusive • Cheap • ISO Standard • Up to 58.000 bus devices • Industrial, professional grade • Wired, more reliable • Powered through the Bus • No real PoF • Complex, intrusive • Expensive 22
  23. 23. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Program Agenda Home Automation Java EE Demo Wrap-­‐up 1 2 3 4 23
  24. 24. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Java EE ENTERPRISE EDITION ▪Batch ▪Concurrency ▪Simplified JMS DEVELOPER PRODUCTIVITY ▪More annotated POJOs ▪Less boilerplate code ▪Cohesive integrated platform ▪WebSockets ▪JSON ▪Servlet 3.1 NIO ▪REST MEETING ENTERPRISE DEMANDS Java EE 7 24
  25. 25. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Java EE ENTERPRISE EDITION Java EE 25 • Connectivity - EE to clients - EE to HA • Events
  26. 26. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | JSON-­‐P • API to parse and generate JSON • Streaming API (javax.json.stream) - Low-­‐level, efficient way to parse/generate JSON - Similar to StAX API in XML world • Object model API (javax.json) - Simple, easy to use high-­‐level API - Similar to DOM API in XML world JSR 353 26
  27. 27. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | public class Notification { ! // bunch of Getters & Setters ! public String toJson() { JsonObject model = Json.createObjectBuilder() .add("source", getSource()) .add("target", getTarget()) .add("val", getValue()) .add("type", getType()) .add("medium", getMedium()) .add("cyclic", isCyclic()) .add("time", getTimestamp()) .build(); return model; } 27 JSON-­‐P
  28. 28. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Java API for Web Socket • Bidirectional full-­‐duplex messaging - Initial HTTP handshake - Over a single TCP connection • IETF defined protocol: RFC 6455 • HTML5 / W3C defined JavaScript API • JSR 356 - Client & Server API JSR 356 28
  29. 29. WebSocket Server Endpoint (1/2) @ServerEndpoint("/wsEndPt") public class InboundWebsocket implements Serializable { ! static Queue<Session> queue = new ConcurrentLinkedQueue<>(); @OnOpen public void openConnection(Session session) { Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | queue.add(session); } ! public void onEvent(Notification notif) { sendAllEndpoints(notif.toJson()); } ! … 29
  30. 30. WebSocket Server Endpoint (2/2) Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | ! … public static synchronized void sendAllEndpoints(String payload) { try { for (Session session : queue) { if (session.isOpen()) { session.getBasicRemote().sendText(payload); } } } catch (IOException e) { // Oooops } } 30
  31. 31. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | WebSocket Client Endpoint function connect() { wsocket = new WebSocket('ws://' + window.location.host + '/dashboard/wsEndPt'); wsocket.onmessage = onMessage; } ! function onMessage(evt) { jsonData = JSON.parse(evt.data); targetDiv = jsonData.target; var myDiv = document.getElementById(targetDiv); ! if (jsonData.type === "switch") { if (jsonData.val === "true") value = "ON"; else value = "OFF"; } else value = jsonData.val; $(myDiv).text(value); } 31
  32. 32. Contexts and Dependency Injection for Java EE 1.1 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | JSR 346 • Core component model - Enabled by default in implicit bean archives • Expanded use of CDI Interceptors - Transactional interceptors - Method-­‐level validation interceptors • New CDI scopes - @TransactionScoped - @FlowScoped 32
  33. 33. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | CDI Events • Observer Design Pattern • Defined by - A java object (the event object) - Event Qualifier(s) JSR 346 33
  34. 34. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | CDI Events JSR 346 34 !public class producerClass { ! @Inject Event<SomeEvent> someEvent; public void someMethod(...) { ... someEvent.fire(myEvent); } } !public class anotherClass { public void someObserver(@Observes SomeEvent someEvent ) { ... ! } }
  35. 35. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | 35 CDI Events MDB ! @MessageDriven( … ) public class KnxMdb implements KnxListener { ! @Inject @HomeEvent Event<Notification> homeEvent; ! @KnxMessage(type="sensor") public void handleKnxSensor(Notification notif) { … homeEvent.fire(notif); } ! }
  36. 36. CDI Events @ServerEndpoint("/wsEndPt") public class InboundWebsocket implements Serializable { Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | !! @Inject @HomeEvent Event<Notification> homeEvent; ! @OnOpen public void openConnection(Session session) { … } ! public void onEvent(@Observes @HomeEvent Notification notif) { sendAllEndpoints(notif.toJson()); } … 36 WebSocker Server Endpoint
  37. 37. Java API for RESTful Web Services 2.0 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | • Filters and Interceptors • Asynchronous Processing • Hypermedia • Validation • Client API JSR 339 37
  38. 38. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | JAX-­‐RS Client !! private void zwaveCommand(String url, String node, boolean val) { //http://host/ZWaveAPI/Run/devices[3].instances[0].commandClasses[0x25].Set(false) ! String zwaveUrl = url + node + ".Set(" + val + ")"; ! private final Client jaxrsClient = ClientBuilder.newClient(); ! String zwaveResp = jaxrsClient.target(zwaveUrl) .request(MediaType.TEXT_PLAIN_TYPE) .get(String.class); } 38
  39. 39. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | REST Endpoint ! @Path("/zwave") public class ZwaveEndpoint { @Inject @HomeEvent Event<Notification> homeEvent; ! @PUT @Path("/{id}/{val}/") @Produces("text/plain") public String swithZ(@PathParam("id") String id, @PathParam("val") String val) { Notification notif = new Notification(id, "switch" , val, "ZWAVE"); notif.setTarget(id); // target is required to identify the Zwave device notif.setValue(val); homeEvent.fire(notif); } ! } 39
  40. 40. Java Connector Architecture 1.7 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | • Resource Adapter - JCA component for a specific EIS - Mediates communication between the container and the EIS by means of contracts - Packaged as a RAR • EIS - Packaged Applications, ERP, CICS, mail server, MoM, etc. • Contracts - Lifecycle, Connection (inc. pooling), TX, Work Management, CCI, … 40 JSR 322
  41. 41. Java Connector Architecture 1.7 Outbound Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | 41 JSR 322 Java EE Container Java EE Application Resource Adapter EIS Inbound
  42. 42. Java Connector Architecture 1.7 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | 42 JSR 322 Java EE Container Java EE Application Resource Adapter EIS MDB Inbound
  43. 43. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Message Driven Bean @MessageDriven ( activationConfig = { @ActivationConfigProperty( propertyName="destinationLookup", propertyValue="…"), @ActivationConfigProperty( propertyName="destinationType", propertyValue="javax.jms.Queue") } ) ! public class MyJmsMdb implements MessageListener { @Override public void onMessage(Message message) { //do the work } ! } 43 JMS
  44. 44. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Message Driven Bean 44 • “A MDB is an asynchronous message consumer…” • “A MDB is invoked by the container as a result of the arrival of a message at the destination or endpoint that is serviced by the MDB…” • “MDB listen to an Inbound Ressource Adapter” - Eg. JMS
  45. 45. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | 45 Message Driven Bean KNX @MessageDriven( activationConfig = { @ActivationConfigProperty( propertyName = “knx", propertyValue = "10.0.0.60") } ) ! public class KnxMdb implements KnxListener { ! @Override public void onMessage(Message message) { //handle the KNX Message } ! }
  46. 46. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | 46 Message Driven Bean KNX @MessageDriven( activationConfig = { @ActivationConfigProperty( propertyName = “knx", propertyValue = "10.0.0.60") } ) ! !public class KnxMdb implements KnxListener { @KnxMessage(type="sensor") public void handleKnxSensor(Notification notif) { … } @KnxMessage(type=“switch") public void switchKnx(Notification notif) { … } ! }
  47. 47. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Inbound RA • public interface KnxListener { } - Will be implemented by the MDB • public class KnxResourceAdapter implements ResourceAdapter {…} - Do the actual work, without real constraints (e.g. threads) - Handle MDB activation - Will listen on the KNX bus via WorkManager • public class KnxActivationSpec implements ActivationSpec {…} - Expose RA configuration to the application !! 47
  48. 48. Inbound RA @Override public void endpointActivation(MessageEndpointFactory endpointFactory, ActivationSpec spec) throws ResourceException { Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | tSpec = (TrafficActivationSpec) spec; Class endpointClass = endpointFactory.getEndpointClass(); tSpec.setBeanClass(endpointClass); tSpec.findCommandsInMDB(); ObtainEndpointWork work = new ObtainEndpointWork(this, endpointFactory); workManager.scheduleWork(work); } 48
  49. 49. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Inbound RA public void findCommandsInMDB() { ! for (Method method : beanClass.getMethods()) { if (method.isAnnotationPresent(KnxMessage.class)) { KnxMessage tCommand = method.getAnnotation(KnxMessage.class); commands.put(tCommand.type(), method); } } … } 49
  50. 50. KNX (real) Listener // KNX ProcessedEvent from the Calimero stack switch (actor) { Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | case "0/7/4": messageType = "sensor"; notif.setType("humidity"); processedEvent = Float.toString(knxSensorHumidity(pe)); notif.setValue(processedEvent); // and so on… break; } ! if (spec.getCommands().containsKey(messageType)) { // Does the MDB support this message? Method mdbMethod = spec.getCommands().get(messageType); try { callMdb(mdb, mdbMethod, notif); } catch (ResourceException ex) { // Ooops! } } else { // Unknown command ?! } 50
  51. 51. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | KnxMessage ! /* Annotation to decorate methods in the MDB */ @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface KnxMessage { String type() default ""; String info() default ""; } 51
  52. 52. Inbound connector private Notif callMdb(MessageEndpoint mdb, Method command, Notification param) Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | throws ResourceException { ! try { mdb.beforeDelivery(command); Object ret = command.invoke(mdb, param); notif = (Notif) ret; } catch (NoSuchMethodException | ResourceException | IllegalAccessException | IllegalArgumentException |InvocationTargetException ex) { // MDB invocation error :( … } mdb.afterDelivery(); return notif; } 52
  53. 53. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | KNX MDB 53 @MessageDriven( activationConfig = { @ActivationConfigProperty( propertyName = “knx", propertyValue = "10.0.0.60") } ) ! public class KnxMdb implements KnxListener { ! @KnxMessage(type="sensor") public void handleKnxSensor(Notification notif) { … } @KnxMessage(type=“switch") public void switchKnx(Notification notif) { … } ! }
  54. 54. Java Connector Architecture 1.7 Outbound Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | 54 JSR 322 Java EE Container Java EE Application Resource Adapter EIS
  55. 55. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | And more… • EJB • CDI Interceptors • JAX-­‐RS Interceptors • Concurrency Utilities for Java EE • Java Persistence API • JavaServer Faces • OpenMQ Stomp support • Jersey SSE, MVC… 55
  56. 56. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Program Agenda Home Automation Java EE Demo Wrap-­‐up 1 2 3 4 56
  57. 57. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Dashboard • HTML Client - “Pure” JS - Real-­‐time notifications via WebSocket - Control devices via REST • Java EE 7 backend - KNX (JCA) & Z-­‐Wave (REST) - In & Outbound 57
  58. 58. KNX Sensors Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | KNX Bus Bus Power Supply IP KNX KNX Output module VPN IP Java EE 110/220v 58 KNX Output module KNX Input module KNX Input module KNX Input module Z-­‐Wave Output module Z-­‐Wave KNX Sensors Z-­‐Wave Input module Demo JCA REST
  59. 59. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Program Agenda Home Automation Java EE Demo Wrap-­‐up 1 2 3 4 59
  60. 60. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | • Connectivity - JAX-­‐RS, JCA, WebSocket, JMS… • ‘Event’ driven capabilities - MDB, CDI event • Non blocking IO • Asynchronous • Scheduling • Persistence • Component models • UI - JSF, JAX-­‐RS • Container - Lifecycle - Monitoring & Management - Ressources pooling - Logging - … Java EE for Home Automation 60
  61. 61. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | What’s next • PoC - KNX, Z-­‐Wave & InfraRed • Improvements - Additional ‘connectors’, e.g. RF433 - More types, e.g. range for blinders - State Management - User interface - Add ‘scenario’s - Leverage Java EE more, e.g. CDI Interceptors 61
  62. 62. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Java EE and IoT • Connected devices • Messages / data producer • Data aggregation / processing - Deeper in the network • Scaling • Security 62
  63. 63. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Java EE 8 • CDI 2.0 • JMS 2.1 • MVC 1.0 • JAX-­‐RS 2.1 • JSON-­‐B + JSON-­‐P TBC! 63
  64. 64. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Resources • The Java EE 7 Tutorial - http://docs.oracle.com/javaee/7/tutorial/doc/home.htm • GlassFish 4.1 - http://glassfish.org • NetBeans 8.0.1 - http://netbeans.org 64
  65. 65. Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | 65
  66. 66. 66
  67. 67. 67

×