public UsbUirtProcessor(IList<IrCommandEvent> commands)
    {
      _driver = new Driver();
      Log.Debug(string.Format("Usbuirt found version {0}", Driver.GetVersion(_driver)));
      _receiver = new Receiver(_driver);
      _receiver.GenerateLegacyCodes = false;
      _receiver.Received += OnIrReceive;
      _transmitter = new Transmitter(_driver);
      _learner = new Learner(_driver);

      _commands = commands;
      _learnCommand = null;

      //Event from ep source
      OnSourceEvent = (@event, sender) =>
      {
        if (@event.Channel != Channel && !string.IsNullOrEmpty(@event.Channel)) return;

        switch (@event.Name)
        {
          case "ir-transmit":
            var ir = System.Text.Encoding.Default.GetString(@event.Data);
            _transmitter.TransmitAsync(ir);
            break;
          case "ir-learn":
            _learnCommand = @event as IrCommandEvent;
            _learner.LearnAsync(CodeFormat.Uuirt, LearnCodeModifier.Default, null);
            break;
        }
      };

      //Error from ep source
      OnSourceError = (exception, sender) =>
      {
        Log.Error("Error from source endpoint", exception);
      };

      //Close connection with ep source
      OnSourceClose = (sender) =>
      {
        //Close HBus endpoint
        Stop();

        Log.Debug("closed on source close");
      };

    }
    private void LearnCompleted(object sender, LearnCompletedEventArgs e)
    {
      if (_learnCommand != null)
        _learnCommand.IrCode = e.Code;

      if (_commands.Any(c => c.IrCode == e.Code))
      {
        var cmd = _commands.First(c => c.IrCode == e.Code);
        _commands.Remove(cmd);
      }

      //Add new command
      if (_commands == null)
        _commands = new List<IrCommandEvent>();

      _commands.Add(_learnCommand);
      _learnCommand = null;
    }
Exemple #3
0
    static void Main(string[] args)
    {
      //Log init
      XmlConfigurator.Configure();

      Console.WriteLine("HBus.Server v." + Assembly.GetExecutingAssembly().GetName().Version);

      //TODO: configurator from db/xml

      #region HBus scheduler processor: schedule all sensors readings
      Console.WriteLine("..Configuring Scheduler processor");
      var interval = Convert.ToInt32(ConfigurationManager.AppSettings["processor.scheduler.interval"]);
      var sproc = new SchedulerProcessor(new[]
      {
        //Read sensor 1 from console node
        new EventSchedule(DateTime.Now.AddSeconds(10), new Event()
        {
            Name = "sensor-read",
            Address = "2",
            Channel = "hbus",
            MessageType = "event",
            Source = "SN201",
        }, ScheduleTypes.Period, interval),

        //Read sensor 2 from console node
        new EventSchedule(DateTime.Now.AddSeconds(15), new Event()
        {
            Name = "sensor-read",
            Address = "2",
            Channel = "hbus",
            MessageType = "event",
            Source = "SN202",
        }, ScheduleTypes.Period, interval),

        //Read sensor 0 from remote Arduino node
        new EventSchedule(DateTime.Now.AddSeconds(20), new Event()
        {
            Name = "sensor-read",
            Address = "7",
            Channel = "hbus",
            MessageType = "event",
            Source = "SN701",
        }, ScheduleTypes.Period, interval),
        //Read sensor 1 from remote Arduino node
        new EventSchedule(DateTime.Now.AddSeconds(25), new Event()
        {
            Name = "sensor-read",
            Address = "7",
            Channel = "hbus",
            MessageType = "event",
            Source = "SN702",
        }, ScheduleTypes.Period, interval),
        //Read sensor 3 from remote Arduino node
        new EventSchedule(DateTime.Now.AddSeconds(30), new Event()
        {
            Name = "sensor-read",
            Address = "7",
            Channel = "hbus",
            MessageType = "event",
            Source = "SN703",
        }, ScheduleTypes.Period, interval),
      });
      #endregion

      #region HBus commands processor
      Console.WriteLine("..Configuring HBus processor");
      var hbHost = ConfigurationManager.AppSettings["processor.hbus.host"];
      //HBus controller
      var bus = new BusController(Address.HostAddress,
          new Port[] {
            //new PortTcp(hbHost,5000, 5001, 0),
            new PortZMq("tcp://*:5555","tcp://127.0.0.1:5556", 0)
          });
      var hbusproc = new HBusProcessor(bus);
      hbusproc.OnSourceEvent(new Event()
      {
        Name = "pin-subscribe",
        MessageType = "event",
        Channel = "hbus",
        Source = "LS201",
        Address = "2"
      }, null);

      #endregion

      #region Websocket processor
      Console.WriteLine("..Configuring websocket processor");
      var wsproc = new WebsocketProcessor("ws://0.0.0.0:5050");
      #endregion

      #region ThingSpeak processor
      Console.WriteLine("..Configuring ThingSpeak processor");
      var tsKey = ConfigurationManager.AppSettings["processor.thingspeak.key"];
      var tsproc = new ThingSpeakProcessor(tsKey, new[] { "SN303", "SN701" });
      #endregion

      #region Artik processor
      Console.WriteLine("..Configuring Artik processor");
      //Local console sensor
      var deviceTypeId1 = ConfigurationManager.AppSettings["processor.artik.device1.type.id"];
      var deviceId1 = ConfigurationManager.AppSettings["processor.artik.device1.id"];
      var deviceToken1 = ConfigurationManager.AppSettings["processor.artik.device1.token"];
      var deviceName1 = ConfigurationManager.AppSettings["processor.artik.device1.name"];
      var deviceSource1 = ConfigurationManager.AppSettings["processor.artik.device1.source"];
      var deviceAddress1 = ConfigurationManager.AppSettings["processor.artik.device1.address"];
      //Remote arduino sensor temperature
      var deviceTypeId2 = ConfigurationManager.AppSettings["processor.artik.device2.type.id"];
      var deviceId2 = ConfigurationManager.AppSettings["processor.artik.device2.id"];
      var deviceToken2 = ConfigurationManager.AppSettings["processor.artik.device2.token"];
      var deviceName2 = ConfigurationManager.AppSettings["processor.artik.device2.name"];
      var deviceSource2 = ConfigurationManager.AppSettings["processor.artik.device2.source"];
      var deviceAddress2 = ConfigurationManager.AppSettings["processor.artik.device2.address"];
      //Remote arduino sensor humidity
      var deviceTypeId3 = ConfigurationManager.AppSettings["processor.artik.device3.type.id"];
      var deviceId3 = ConfigurationManager.AppSettings["processor.artik.device3.id"];
      var deviceToken3 = ConfigurationManager.AppSettings["processor.artik.device3.token"];
      var deviceName3 = ConfigurationManager.AppSettings["processor.artik.device3.name"];
      var deviceSource3 = ConfigurationManager.AppSettings["processor.artik.device3.source"];
      var deviceAddress3 = ConfigurationManager.AppSettings["processor.artik.device3.address"];
      //Remote arduino sensor light
      var deviceTypeId4 = ConfigurationManager.AppSettings["processor.artik.device4.type.id"];
      var deviceId4 = ConfigurationManager.AppSettings["processor.artik.device4.id"];
      var deviceToken4 = ConfigurationManager.AppSettings["processor.artik.device4.token"];
      var deviceName4 = ConfigurationManager.AppSettings["processor.artik.device4.name"];
      var deviceSource4 = ConfigurationManager.AppSettings["processor.artik.device4.source"];
      var deviceAddress4 = ConfigurationManager.AppSettings["processor.artik.device4.address"];
      //Node console shutter device
      var deviceTypeId5 = ConfigurationManager.AppSettings["processor.artik.device5.type.id"];
      var deviceId5 = ConfigurationManager.AppSettings["processor.artik.device5.id"];
      var deviceToken5 = ConfigurationManager.AppSettings["processor.artik.device5.token"];
      var deviceName5 = ConfigurationManager.AppSettings["processor.artik.device5.name"];
      var deviceSource5 = ConfigurationManager.AppSettings["processor.artik.device5.source"];
      var deviceAddress5 = ConfigurationManager.AppSettings["processor.artik.device5.address"];
      //Node console output pin
      var deviceTypeId6 = ConfigurationManager.AppSettings["processor.artik.device6.type.id"];
      var deviceId6 = ConfigurationManager.AppSettings["processor.artik.device6.id"];
      var deviceToken6 = ConfigurationManager.AppSettings["processor.artik.device6.token"];
      var deviceName6 = ConfigurationManager.AppSettings["processor.artik.device6.name"];
      var deviceSource6 = ConfigurationManager.AppSettings["processor.artik.device6.source"];
      var deviceAddress6 = ConfigurationManager.AppSettings["processor.artik.device6.address"];

      var artikproc = new ArtikProcessor(
        new[]
        {
          new ArtikEvent(deviceId1, deviceTypeId1, deviceToken1, deviceName1, deviceSource1, deviceAddress1, "hbus"),
          new ArtikEvent(deviceId2, deviceTypeId2, deviceToken2, deviceName2, deviceSource2, deviceAddress2, "hbus"),
          new ArtikEvent(deviceId3, deviceTypeId3, deviceToken3, deviceName3, deviceSource3, deviceAddress3, "hbus"),
          new ArtikEvent(deviceId4, deviceTypeId4, deviceToken4, deviceName4, deviceSource4, deviceAddress4, "hbus"),
          new ArtikEvent(deviceId5, deviceTypeId5, deviceToken5, deviceName5, deviceSource5, deviceAddress5, "hbus"),
          new ArtikEvent(deviceId6, deviceTypeId6, deviceToken6, deviceName6, deviceSource6, deviceAddress6, "hbus"),
        }
      );
      #endregion

      #region UsbUirt processor
#if USE_USBUIRT
      /*
         1500002D1FCA power
         170000821ECA 1
         150000231ECA 2       
       */
      var ircmd = new IrCommandEvent
      {
        IrCode = "170000821ECA", //button 1 on remote
        Name = "pin-activate",
        MessageType = "event",
        Channel = "hbus",
        Source = "CS201",
        Address = "2"
      };
      var irproc = new UsbUirtProcessor(new List<IrCommandEvent> { ircmd });
#endif
      #endregion

      Console.WriteLine("Build processors connections");

      //Scheduler => HBus
      Console.WriteLine("..Connect scheduler to HBus");
      sproc.AddSubscriber(hbusproc);

      //HBus => websocket
      Console.WriteLine("..Connect websocket to HBus");
      hbusproc.AddSubscriber(wsproc);

      //websocket => HBus
      Console.WriteLine("..Connect HBus to websocket");
      wsproc.AddSubscriber(hbusproc);

      //HBus => ThingsSpeak
      Console.WriteLine("..Connect ThingsSpeak to HBus");
      hbusproc.AddSubscriber(tsproc);

      //HBus => Artik Cloud
      Console.WriteLine("..Connect Artik Cloud to HBus");
      hbusproc.AddSubscriber(artikproc);

      //Artik Cloud => HBus
      Console.WriteLine("..Connect HBus to Artik Cloud ");
      artikproc.AddSubscriber(hbusproc);

#if USE_USBUIRT
      //UsbUirt => HBus
      Console.WriteLine("..Connect UsbUirt to HBus");
      irproc.AddSubscriber(hbusproc);
#endif

      Console.WriteLine("Starting processors");
      hbusproc.Start();
      wsproc.Start();
      tsproc.Start();
      artikproc.Start();
#if USE_USBUIRT
      irproc.Start();
#endif
      Console.WriteLine("Press enter to stop");
      Console.ReadLine();
      Console.WriteLine("Stopping processors");

      wsproc.Stop();
      hbusproc.Stop();
#if USE_USBUIRT
      irproc.Stop();
#endif

    }