The C# program (needs cleaning) /// Startup code /// IPHostEntry host; string localIP = "0"; host = Dns.GetHostEntry(Dns.GetHostName()); foreach (IPAddress ip in host.AddressList) { if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) { localIP = ip.ToString(); localIP = localIP.Substring(localIP.LastIndexOf(".") + 1); } } //20171224 Program.Setup(()=>{ Program.UseWidget("vip/control/sonoff"); }); Program .AddOption("ClientId", "Sonoff" + localIP, "0. Enter unique ID for this client", "text") . AddOption("ServerAddress", "192.168.11.210", "1. MQTT server address", "text") . AddOption("ServerPort", "1883", "2. MQTT server port", "text") . AddOption("ServerTopicStatus", "stat/sonoff2/POWER", "3. Topic", "text") . AddOption("ServerTopicCmd", "cmnd/sonoff2/power", "4. Topic", "text") . AddFeature("", "Switch", "HomeGenie.SwitchHeater", "Enable Smart Light Control", "checkbox") . AddFeature("", "", "MQTT", "Publish module on MQTT network", "checkbox") . Run(); //// Program //// /* Status stat/sonoff2/POWER ON stat/sonoff2/POWER OFF cms cmnd/sonoff2/power ON cmnd/sonoff2/power OFF */ string server = Program.Option("ServerAddress").Value.Trim(); int port = 1883; int.TryParse(Program.Option("ServerPort").Value, out port); string topicStatus = Program.Option("ServerTopicStatus").Value.Trim(); string topicCmd = Program.Option("ServerTopicCmd").Value.Trim(); string clientid = Program.Option("ClientId").Value.Trim(); string username = Program.Option("Username").Value.Trim(); string password = Program.Option("Password").Value.Trim(); string local_TopicIn = "stat/sonoff2/POWER" ;//"stat/"+topic+"/";topicStatus ; // string local_TopicOut = "cmnd/sonoff2/power"; string local_Switch = "Control.SOnOff"; string local_Switch_off = "Control.Off"; string remote_Switch_on = "ON" ; string remote_Switch_off = "OFF" ; int delayCnt = 0; // This program will be displayed as a simple button //Program.UseWidget("vip/control/sonoff"); var LastTime = DateTime.Now ; var MqttIsConnected = false; var ProgName = "MQTT SonOff"; Program.Notify(ProgName, "starting"); Pause(1); if (server == "") { Program.Notify( ProgName, "Please configure server address"); Pause(5); return; } else { Program.Notify( ProgName, "Connecting to " + server + "..."); try { if (username != "") { MqttClient.WithCredentials(username, password); } MqttClient.Service(server).Connect(port, clientid); Program.Notify( ProgName, "Connected! "+local_TopicIn); MqttIsConnected = true; } catch (Exception e) { Program.Notify( ProgName, e.Message); Pause(5); return; } } // start lezen MqttClient.Subscribe(local_TopicIn, (mtopic, mpayload) => { Program.Notify(local_TopicIn + "==" , mpayload ); var parts = mtopic.Split('/'); // check of json is if (parts.Length >1) // hebben we een bericht -->2 { try { if (mpayload == "ON") { Program.RaiseEvent( "Status.Level", "100",mpayload); //sensorstatus } if (mpayload == "OFF") { Program.RaiseEvent("Status.Level", "0",mpayload); //sensorstatus } }catch (Exception e) { Program.Notify( ProgName+" ERROR!", e.Message); } Pause(2); } }); When.WebServiceCallReceived("HomeAutomation.HomeGenie.Automation", (args) => { // All API requests going to the "MyProgram.Domain" // will hit this piece of code. // e.g. for the "On" command, will contain the string // "MyProgram.Domain/1/Control.On", so... string[] req = ((string)args).Split('/'); string domain = req[0], address = req[1], command = req[2]; // be optimistic var response = "{ \"ResponseValue\" : \"Ok\" }"; // get a reference to the addressed module var module = Modules.InDomain(domain).WithAddress(address).Get(); // process the command Program.Notify(command," Button pressed " + address + " dom. "+domain ); Pause(2); switch (command) { case "Control.On": // set the status of the module to on MqttClient.Publish("cmnd/sonoff2/power","ON"); //Program.RaiseEvent(module, "Status.Level", "1", "Switched on"); //MqttClient.Publish(local_TopicOut,remote_Switch_on); break; case "Control.Off": // set the status of the module to off MqttClient.Publish("cmnd/sonoff2/power","OFF"); //Program.RaiseEvent(module, "Status.Level", "0", "Switched off"); //MqttClient.Publish(local_TopicOut,remote_Switch_off); break; default: response = "{ \"ResponseValue\" : \"Error\" }"; Program.Notify("MyProgram", "Unrecognized command received"); break; } return response; }); while (Program.IsRunning && MqttIsConnected) {Pause(3);} //Program.GoBackground();