Advertisement
Guest User

Untitled

a guest
Jul 16th, 2017
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module.exports = (env) ->
  2.  
  3.   deviceConfigDef = require("./device-config-schema");
  4.  
  5.   random = require('random-number').generator({
  6.     min:  1000000,
  7.     max:  9999999,
  8.     integer: true
  9.   });
  10.  
  11.   WebSocket = require('ws');
  12.   UUID = require('uuid');
  13.   Rx = require('rxjs');
  14.  
  15.   class Homematic extends env.plugins.Plugin
  16.  
  17.     constructor: ->
  18.       @homegearId = UUID.v4();
  19.  
  20.     sendRequest: (request) =>
  21.  
  22.       request.id = request.id || random();
  23.       request.jsonrpc = "2.0";
  24.  
  25.       env.logger.debug("Sending Request: #{JSON.stringify(request)}");
  26.  
  27.       @serverSocket.next(JSON.stringify(request));
  28.       return @serverSocket.filter((response) =>
  29.         return response.id == request.id;
  30.       ).map((response) =>
  31.         env.logger.debug("Received Response: #{JSON.stringify(response)}");
  32.         return response;
  33.       ).first();
  34.  
  35.     onNotification: (peerId) =>
  36.  
  37.       return @serverSocket.filter((message) ->
  38.         return message.id == undefined
  39.       );
  40.  
  41.     subscribePeer: (peerId) =>
  42.       return @sendRequest({
  43.         method: "subscribePeers",
  44.         params:[@homegearId, [peerId]]
  45.       });
  46.  
  47.     init: (app, @framework, @config) =>
  48.  
  49.       ###@framework.deviceManager.registerDeviceClass("HomematicHeatingThermostat", {
  50.         configDef: deviceConfigDef.HomematicHeatingThermostat,
  51.         createCallback: (config, lastState) -> new HomematicHeatingThermostat(config, lastState)
  52.       })###
  53.  
  54.       @serverSocket = Rx.Observable.webSocket({
  55.         url: "ws://#{@config.host}:#{@config.port}/#{@homegearId}",
  56.         WebSocketCtor: WebSocket,
  57.         protocol: 'server',
  58.         openObserver:
  59.           next: (e) =>
  60.             env.logger.info("Connected to homegear system [#{@homegearId}]. #{e.target.protocol}")
  61.       });
  62.  
  63.       @clientSocket = Rx.Observable.webSocket({
  64.         url: "ws://#{@config.host}:#{@config.port}/#{@homegearId}",
  65.         openObserver: @openObserver,
  66.         WebSocketCtor: WebSocket,
  67.         protocol: 'client',
  68.         openObserver:
  69.           next: (e) =>
  70.             env.logger.info("Connected to homegear system [#{@homegearId}]. #{e.target.protocol}");
  71.       });
  72.  
  73.       @serverSocket.subscribe((message) =>
  74.         env.logger.debug("MESSAGE (Server): #{JSON.stringify(message)}")
  75.       );
  76.  
  77.       @clientSocket.subscribe((message) =>
  78.         env.logger.debug("MESSAGE (Client): #{JSON.stringify(message)}")
  79.       );
  80.  
  81.       @framework.deviceManager.registerDeviceClass("HomematicSwitch", {
  82.         configDef: deviceConfigDef.HomematicSwitch,
  83.         createCallback: (config, lastState) => new HomematicSwitch(config, lastState)
  84.       })
  85.  
  86.       @framework.deviceManager.registerDeviceClass("HomematicPowerSwitch", {
  87.         configDef: deviceConfigDef.HomematicPowerSwitch,
  88.         createCallback: (config, lastState) => new HomematicPowerSwitch(config, lastState)
  89.       })
  90.  
  91.   homegear = new Homematic
  92.  
  93.   class HomematicSwitch extends env.devices.PowerSwitch
  94.  
  95.     constructor: (@config, @lastState) ->
  96.       @name = @config.name;
  97.       @id = @config.id;
  98.       super();
  99.  
  100.       env.logger.debug('LastState:', @lastState);
  101.       @_state = @lastState;
  102.  
  103.       homegear.subscribePeer(@config.peerId).subscribe((response) =>
  104.         env.logger.debug("Peer subscribed to homegear. [Server] #{@config.peerId}");
  105.       );
  106.  
  107.       homegear.onNotification(@config.peerId).subscribe((notification) =>
  108.         env.logger.debug("Received Notification for #{@config.peerId}: #{JSON.stringify(notification)}");
  109.       );
  110.  
  111.     destroy: () =>
  112.       super();
  113.  
  114.     getState: =>
  115.       if @_state? then return Rx.Observable.of(@_state).toPromise();
  116.       return homegear.sendRequest({
  117.         method: 'getValue',
  118.         params: [@config.peerId, 1, "STATE"]
  119.       }).map((response) =>
  120.         return @_state = response.result;
  121.       ).toPromise();
  122.  
  123.     changeStateTo: (state) =>
  124.       if @_state is state then return Rx.Observable.of(@_state).toPromise();
  125.       return homegear.sendRequest({
  126.         method: 'setValue',
  127.         params: [@config.peerId, 1, "STATE", state]
  128.       }).map((response) =>
  129.         @emit("state", @_state = state);
  130.         return @_state;
  131.       ).toPromise();
  132.  
  133.   class HomematicPowerSwitch extends HomematicSwitch
  134.  
  135.     constructor: (@config, @lastState) ->
  136.       super(@config, @lastState);
  137.  
  138.     destroy: () =>
  139.       super();
  140.  
  141.   return homegear;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement