Python Plugins: Breaking Change

Python and python framework

Moderator: leecollings

Post Reply
User avatar
Dnpwwo
Posts: 820
Joined: Sunday 23 March 2014 9:00
Target OS: Raspberry Pi / ODroid
Domoticz version: Beta
Location: Melbourne, Australia
Contact:

Python Plugins: Breaking Change

Post by Dnpwwo »

In next merge of the Python Framework into the Domoticz beta there will be a breaking change in the plugin interface. For most plugins the fix will be trivial but for plugins that use the built in HTTP protocol it will take slightly more effort.

This change is bought on by the realisation that the addition of HTTP support to the plugin framework was done in an unsustainable and non-pythonic way. The addition of specific HTTP parameters to several functions means that the addition of any other protocols will require constant updates to the API which will be unsustainable, particularly once the plugin framework makes it into the stable release code base where plugin authors have every right to expect API stability.

Plugins that have not been updated will throw this error on startup:

Code: Select all

'onMessage' failed 'TypeError':'onMessage() missing 2 required positional arguments: 'Status' and 'Extra''.
What has changed? Simply that the data that is sent to the plugin via onMessage can now be a dictionary containing protocol specific information. Similarly, data sent to the framework from the plugin via the Send() function must be structured in the same way. The now redundant additional parameters have been removed.

This means:

Code: Select all

def onMessage(self, Connection, Data, Status, Extra):
is now

Code: Select all

def onMessage(self, Connection, Data):
for the majority of plugins ony the function definition needs to be changed for them to function as they did before.


For HTTP connections the Data parameters is now a dictionary so this code:

Code: Select all

def onMessage(self, Connection, Data):
    DumpHTTPResponseToLog(Data)
        
def DumpHTTPResponseToLog(httpDict):
    if isinstance(httpDict, dict):
        Domoticz.Log("HTTP Details ("+str(len(httpDict))+"):")
        for x in httpDict:
            if isinstance(httpDict[x], dict):
                Domoticz.Log("--->'"+x+" ("+str(len(httpDict[x]))+"):")
                for y in httpDict[x]:
                    Domoticz.Log("------->'" + y + "':'" + str(httpDict[x][y]) + "'")
            else:
                Domoticz.Log("--->'" + x + "':'" + str(httpDict[x]) + "'")
will give this output:

Code: Select all

HTTP Details (3):
--->'Status':'302'
--->'Data':'b'\n\n302 Moved\nThe document has moved\nhere.\r\n\r\n''
--->'Headers (6):
------->'Cache-Control':'private'
------->'Content-Length':'262'
------->'Date':'Sat, 29 Jul 2017 01:45:56 GMT'
------->'Referrer-Policy':'no-referrer'
------->'Location':'http://www.google.com.au/?gfe_rd=cr&ei=1Oh7WfiqJIfp8weC2YPQAQ'
------->'Content-Type':'text/html; charset=UTF-8'
when sending HTTP requests rather than the verb, URL,data and headers all being separate parameters they are passed in a dictionary as well

Code: Select all

httpClientConn.Send({"Verb":"GET", "URL":"/page.html", "Headers": {"Connection": "keep-alive", "Accept": "Content-Type: text/html; charset=UTF-8"}})
New features in the framework release:
  • Initial built in support for UDP/IP. The Kodi example shows working Python for this
  • The HTTP protocol understands HHTP responses which means plugins can act as simple web servers. There is a new example called HTTP Listener which shows this
  • For HTTP a 'Content-length' header is inserted automatically if there is data but the header was not supplied in messages
  • Added option to logger to show thread ids (-logthreadids) to help troubleshooting, off by default
The reasonable man adapts himself to the world; the unreasonable one persists to adapt the world to himself. Therefore all progress depends on the unreasonable man. George Bernard Shaw
elgringo
Posts: 96
Joined: Thursday 18 May 2017 8:08
Target OS: Raspberry Pi / ODroid
Domoticz version: Left
Contact:

Re: Python Plugins: Breaking Change

Post by elgringo »

I am planning to upgrade this week which means I have to change the plugins. According to the description this should be a problem!

But I have a question:
On DenonMarantz.py line 114 the cinnection given if verified with the local instance of the connection. Is this needed?
Last edited by elgringo on Monday 31 July 2017 22:12, edited 1 time in total.
User avatar
jorgh
Posts: 124
Joined: Friday 27 June 2014 23:19
Target OS: Raspberry Pi / ODroid
Domoticz version: 3.8224
Location: Netherlands
Contact:

Re: Python Plugins: Breaking Change

Post by jorgh »

@Dnpwwo,

I've upgraded to version 3.8181, but now have a problem with sending binary data again.

Trying to send, using protocol None:

'ISCP\x00\x00\x00\x10\x00\x00\x00\x09\x01\x00\x00\x00!1NRIQSTN\x0D\x0A'

Results in the following log when debug is on:

Code: Select all

2017-07-31 19:12:27.195  (Onkyo) Sending 4 bytes of data:.
2017-07-31 19:12:27.196  (Onkyo)     49 53 43 50 .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..     ISCP
It worked fine in version 3.8072.

Regards,

Jorg
elgringo
Posts: 96
Joined: Thursday 18 May 2017 8:08
Target OS: Raspberry Pi / ODroid
Domoticz version: Left
Contact:

Re: Python Plugins: Breaking Change

Post by elgringo »

Got the same issue:

The send bytearray is handled as string. So if there is a 0x0 item it stops the message.


2017-07-31 22:08:01.933 (Led) Send message (bytes[8]) : [ 0x31 0x57 0x30 0x0 0x0 0x0 0xf 0xc7 ]
2017-07-31 22:08:01.934 (Led) Update [Led - Red] from: ('0,'13') to: (2:'34')
2017-07-31 22:08:01.934 (Led - Red) Updating device from 0:'13' to have values 2:'34'.
2017-07-31 22:08:01.960 (Led) Sending 3 bytes of data:.
2017-07-31 22:08:01.960 (Led) 31 57 30 .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. 1W0
User avatar
Dnpwwo
Posts: 820
Joined: Sunday 23 March 2014 9:00
Target OS: Raspberry Pi / ODroid
Domoticz version: Beta
Location: Melbourne, Australia
Contact:

Re: Python Plugins: Breaking Change

Post by Dnpwwo »

@elgringo,

Good pickup, I missed a couple of changes in the Denon/Marantz example, the redundant parameters need to be removed from onMessage. I will push an update.

Can you and @jorgh post the python code that are creating the issue, I need to see the Connection creation and the Send(). I made a change to improve (that was the intent :( ) the handling of different data types. Depending on how you pass data to Send() it can come across as Unicode, Bytes or ByteArray and not all those worked, I added type specific code to make it more robust but looks like I didn't get it 100% right.

Should be a quick fix if I can knock up a test plugin.
The reasonable man adapts himself to the world; the unreasonable one persists to adapt the world to himself. Therefore all progress depends on the unreasonable man. George Bernard Shaw
elgringo
Posts: 96
Joined: Thursday 18 May 2017 8:08
Target OS: Raspberry Pi / ODroid
Domoticz version: Left
Contact:

Re: Python Plugins: Breaking Change

Post by elgringo »

It is not the complete code (since I am not at home :) )
Creating the connection:

Code: Select all

self.connection = Domoticz.Connection(Name="LedenetBinair", Transport="TCP/IP", Protocol="None", Address=Parameters["Address"], Port=Parameters["Port"])
Sending data:

Code: Select all

checksum = (self.requestedStatus[1] + self.requestedStatus[2] + self.requestedStatus[3] + 0x3F +(self.requestedStatus[4] - 0xFF)) % 0x100
msg = bytes([0x31, self.requestedStatus[1], self.requestedStatus[2], self.requestedStatus[3], self.requestedStatus[4], 0x00, 0x0F, checksum])
self.connection.Send(msg)
The send message contains 0x00 bytes. I looks thease are intrepeted as end of message (like in a string)

Old plugin code (without the headers/extra/status etc) : https://github.com/ericstaal/domoticz/b ... /plugin.py
User avatar
jorgh
Posts: 124
Joined: Friday 27 June 2014 23:19
Target OS: Raspberry Pi / ODroid
Domoticz version: 3.8224
Location: Netherlands
Contact:

Re: Python Plugins: Breaking Change

Post by jorgh »

@Dnpwwo,

The code to create the connection is:

Code: Select all

def connect(self):
    if (self.blDebug ==  True):
      Domoticz.Log("Connecting to Receiver")
    self.objConnection = Domoticz.Connection(Name="Onkyo Connection", Transport="TCP/IP", Protocol="NONE", Address=self.strIPAddress, Port=self.strPort)
    self.objConnection.Connect()
    self.blConnectInitiated =  True
As you can see, I store the connection in an class instance variable, so it is cleaned up, when the the connect function exits.

The code to send data is:

Code: Select all

self.objConnection.Send(Message=createISCPFrame(MESSAGE_RECEIVER_INFORMATION))

def createISCPFrame(message):
  MESSAGE_HEADER_1 = 'ISCP\x00\x00\x00\x10\x00\x00\x00'
  MESSAGE_HEADER_2 = '\x01\x00\x00\x00'
  MESSAGE_TRAILER = '\x0D\x0A'
  ISCPFrame = bytes(MESSAGE_HEADER_1+chr(len(message)+1)+MESSAGE_HEADER_2+message+MESSAGE_TRAILER, 'UTF-8')
  return ISCPFrame
Regards,

Jorg
jammiejammie
Posts: 21
Joined: Thursday 09 October 2014 16:35
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Python Plugins: Breaking Change

Post by jammiejammie »

Dnpwwo wrote:In next merge of the Python Framework into the Domoticz beta there will be a breaking change in the plugin interface. For most plugins the fix will be trivial but for plugins that use the built in HTTP protocol it will take slightly more effort.

This change is bought on by the realisation that the addition of HTTP support to the plugin framework was done in an unsustainable and non-pythonic way. The addition of specific HTTP parameters to several functions means that the addition of any other protocols will require constant updates to the API which will be unsustainable, particularly once the plugin framework makes it into the stable release code base where plugin authors have every right to expect API stability.
Does this mean that HTTPS will be supported in the near future ????
elgringo
Posts: 96
Joined: Thursday 18 May 2017 8:08
Target OS: Raspberry Pi / ODroid
Domoticz version: Left
Contact:

Re: Python Plugins: Breaking Change

Post by elgringo »

Dnpwwo wrote: ...

New features in the framework release:
  • Initial built in support for UDP/IP. The Kodi example shows working Python for this
The Kodi example show only broadcasting from UDP. Is it also possible to listen?

See (Script to connect to LG tv, finds IP of TV via broadcast):

Code: Select all

 def getip(self):
        if self.host: return self.host
        strngtoXmit = 'M-SEARCH * HTTP/1.1\r\nHOST: 239.255.255.250:1900\r\n' + \
            'MAN: "ssdp:discover"\r\nMX: 2\r\nST: urn:schemas-upnp-org:device:MediaRenderer:1\r\n\r\n'

        bytestoXmit = strngtoXmit.encode()
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        sock.settimeout(3)
        found = False
        i = 0

        while not found and i < 5:
            try:
                sock.sendto(bytestoXmit, ('239.255.255.250', 1900))
                gotbytes, addressport = sock.recvfrom(512)
                gotstr = gotbytes.decode()
                if re.search('LG', gotstr):
                    tools.notifyLog('Returned: %s' % gotstr, level=xbmc.LOGDEBUG)
                    self.host, self.port = addressport
                    tools.notifyLog('Found device: %s' % self.host, level=xbmc.LOGDEBUG)
                    found = True
                    break
                i += 1
                time.sleep(1)
            except:
                pass
        sock.close()

        if not found: raise self.LGinNetworkNotFoundException('LG TV not found')
        tools.notifyLog("Using device: %s over transport protocol: %s" % (self.host, self.port), level=xbmc.LOGDEBUG)
        return self.host
        
User avatar
Dnpwwo
Posts: 820
Joined: Sunday 23 March 2014 9:00
Target OS: Raspberry Pi / ODroid
Domoticz version: Beta
Location: Melbourne, Australia
Contact:

Re: Python Plugins: Breaking Change

Post by Dnpwwo »

thanks for the code samples, I haven't used bytes() like that before. I will try it out.

@jammiejammie, one of the resons for this change is to allow for extra detail to be passed is for things like https. It is on the list of enhancements.

@elgringo, the code exists to listen for UDP/IP but I haven't tested it. If you want to test it that would be great. The Kodi sample will automatically broadcast if you supply a broadcast IP address (224.x.x.x up to 239.x.x.x) otherwise will go point to point I think you will need to use different connections to broadcast and listen, they will share the port.
The reasonable man adapts himself to the world; the unreasonable one persists to adapt the world to himself. Therefore all progress depends on the unreasonable man. George Bernard Shaw
cpolhout
Posts: 3
Joined: Friday 30 June 2017 11:37
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Python Plugins: Breaking Change

Post by cpolhout »

Hi,

I'm creating a plugin for Mochad (With support for dimming in opposite to the standard one). I changed the interface onMessage to accept only three parameters. This works corectly now, but in some cases the onMessage is still called with more parameters, see this error:

Code: Select all

2017-08-03 00:26:08.804  (X10_CM15) Received 39 bytes of data:.
2017-08-03 00:26:08.805  (X10_CM15)     30 38 2f 30 33 20 30 30 3a 32 36 3a 30 38 20 54 78 20 50 4c     08/03.00:26:08.Tx.PL
2017-08-03 00:26:08.805  (X10_CM15)     20 48 6f 75 73 65 3a 20 4d 20 46 75 6e 63 3a 20 4f 6e 0a ..     .House:.M.Func:.On.
2017-08-03 00:26:08.806  (X10_CM15) Calling message handler 'onMessage'.
2017-08-03 00:26:08.806  Error: (X10_CM15) 'onMessage' failed 'TypeError':'_path_importer_cache() takes 2 positional arguments but 3 were given'.
2017-08-03 00:26:08.807  Error: (X10_CM15) ----> Line 143 in /home/pi/domoticz/plugins/X10_Mochad/plugin.py, function onMessage
2017-08-03 00:26:08.807  Error: Domoticz received fatal signal 6 !...
2017-08-03 00:26:08.807  (RF USB) Lighting 2 (Woonkamer midden)
2017-08-03 00:26:08.808  (X10_CM15) Received 35 bytes of data:.
2017-08-03 00:26:08.808  (X10_CM15)     30 38 2f 30 33 20 30 30 3a 32 36 3a 30 38 20 54 78 20 50 4c     08/03.00:26:08.Tx.PL
2017-08-03 00:26:08.809  (X10_CM15)     20 48 6f 75 73 65 55 6e 69 74 3a 20 4d 33 0a .. .. .. .. ..     .HouseUnit:.M3.
2017-08-03 00:26:08.810  (X10_CM15) Calling message handler 'onMessage'.
2017-08-03 00:26:08.810  (X10_CM15) Mochad Received:b'08/03 00:26:08 Tx PL HouseUnit: M3\n'
2017-08-03 00:26:08.811  Error:   /home/pi/domoticz/domoticz() [0x1cebbc]
2017-08-03 00:26:08.811  Error:   /home/pi/domoticz/domoticz(_Z14signal_handleri+0x58) [0x1cec74]
2017-08-03 00:26:08.811  Error:   /lib/arm-linux-gnueabihf/libc.so.6(__default_sa_restorer_v2+0) [0x76b82b20]
2017-08-03 00:26:08.811  Error:   /lib/arm-linux-gnueabihf/libc.so.6(gsignal+0x40) [0x76b818dc]
I have now workaround it by adding *args as the last parameter, but something is not correct I guess.
Xavier82
Posts: 178
Joined: Tuesday 07 June 2016 22:09
Target OS: Raspberry Pi / ODroid
Domoticz version: 2023.2
Location: Netherlands
Contact:

Re: Python Plugins: Breaking Change

Post by Xavier82 »

@cpolhout,

Great work. Waiting for a long time for this to become available.
Where can we get this plugin? Would like to test it.
elgringo
Posts: 96
Joined: Thursday 18 May 2017 8:08
Target OS: Raspberry Pi / ODroid
Domoticz version: Left
Contact:

Re: Python Plugins: Breaking Change

Post by elgringo »

Dnpwwo wrote: @elgringo, the code exists to listen for UDP/IP but I haven't tested it. If you want to test it that would be great. The Kodi sample will automatically broadcast if you supply a broadcast IP address (224.x.x.x up to 239.x.x.x) otherwise will go point to point I think you will need to use different connections to broadcast and listen, they will share the port.
I created a UDP connection, send some data but never go a reply:

Code: Select all

self.udpConnection = Domoticz.Connection(Name="UDP", Transport="UDP/IP", Protocol="None", Address="239.255.255.250", Port="1900")
strngtoXmit =   'M-SEARCH * HTTP/1.1' + '\r\n' + \
                  'HOST: 239.255.255.250:1900'  + '\r\n' + \
                  'MAN: "ssdp:discover"'  + '\r\n' + \
                  'MX: 2'  + '\r\n' + \
                  'ST: urn:schemas-upnp-org:device:MediaRenderer:1'  + '\r\n' +  '\r\n'
                  
self.udpConnection.Send(strngtoXmit)  
The message is send correctly:

Code: Select all

 2017-08-04 19:07:40.855 (TV) Sending 129 bytes of data:.
2017-08-04 19:07:40.855 (TV) 4d 2d 53 45 41 52 43 48 20 2a 20 48 54 54 50 2f 31 2e 31 0d M-SEARCH.*.HTTP/1.1.
2017-08-04 19:07:40.855 (TV) 0a 48 4f 53 54 3a 20 32 33 39 2e 32 35 35 2e 32 35 35 2e 32 .HOST:.239.255.255.2
2017-08-04 19:07:40.855 (TV) 35 30 3a 31 39 30 30 0d 0a 4d 41 4e 3a 20 22 73 73 64 70 3a 50:1900..MAN:."ssdp:
2017-08-04 19:07:40.855 (TV) 64 69 73 63 6f 76 65 72 22 0d 0a 4d 58 3a 20 32 0d 0a 53 54 discover"..MX:.2..ST
2017-08-04 19:07:40.855 (TV) 3a 20 75 72 6e 3a 73 63 68 65 6d 61 73 2d 75 70 6e 70 2d 6f :.urn:schemas-upnp-o
2017-08-04 19:07:40.856 (TV) 72 67 3a 64 65 76 69 63 65 3a 4d 65 64 69 61 52 65 6e 64 65 rg:device:MediaRende
2017-08-04 19:07:40.856 (TV) 72 65 72 3a 31 0d 0a 0d 0a .. .. .. .. .. .. .. .. .. .. .. rer:1.... 
The onmessage function never gets called.
Does the reply comes via the onMessage function? Or do I need something different?
User avatar
Dnpwwo
Posts: 820
Joined: Sunday 23 March 2014 9:00
Target OS: Raspberry Pi / ODroid
Domoticz version: Beta
Location: Melbourne, Australia
Contact:

Re: Python Plugins: Breaking Change

Post by Dnpwwo »

@elgringo,

Can you move this to another thread? It will get lost in here.

UDP/IP is connectionless so it works a little differently. I haven't tested the listen part but I think it would be more like:

Code: Select all

self.udpListener = Domoticz.Connection(Name="UDP Listener", Transport="UDP/IP", Protocol="None", Port="1900")
self.udpListener.Listen()

self.udpConnection = Domoticz.Connection(Name="UDP Sender", Transport="UDP/IP", Protocol="None", Address="239.255.255.250", Port="1900")
strngtoXmit =   'M-SEARCH * HTTP/1.1' + '\r\n' + \
                  'HOST: 239.255.255.250:1900'  + '\r\n' + \
                  'MAN: "ssdp:discover"'  + '\r\n' + \
                  'MX: 2'  + '\r\n' + \
                  'ST: urn:schemas-upnp-org:device:MediaRenderer:1'  + '\r\n' +  '\r\n'
                 
self.udpConnection.Send(strngtoXmit)  
onMessage should be called for the Listener. Unlike TCP/IP no new connection is created by an incoming message so onConnect and onDisconnect will not be called because there is no connection.

@cpolhout,
This works corectly now, but in some cases the onMessage is still called with more parameters, see this error:
2017-08-03 00:26:08.806 Error: (X10_CM15) 'onMessage' failed 'TypeError':'_path_importer_cache() takes 2 positional arguments but 3 were given'.
2017-08-03 00:26:08.807 Error: (X10_CM15) ----> Line 143 in /home/pi/domoticz/plugins/X10_Mochad/plugin.py, function onMessage
That looks more like an error inside onMessage rather than a failure to call it. '_path_importer_cache()' is not a Domoticz thing, if you post your plugin source I might be able to help.
The reasonable man adapts himself to the world; the unreasonable one persists to adapt the world to himself. Therefore all progress depends on the unreasonable man. George Bernard Shaw
User avatar
Dnpwwo
Posts: 820
Joined: Sunday 23 March 2014 9:00
Target OS: Raspberry Pi / ODroid
Domoticz version: Beta
Location: Melbourne, Australia
Contact:

Re: Python Plugins: Breaking Change

Post by Dnpwwo »

@elgringo and @jorgh,

I have pushed a fix to the 'bytes()' issue into the new default 'development' branch and I'm assuming that betas will be generated from there since the new stable release a week ago. I was calculating the length of the buffer the wrong way, the Python API isn't always obvious.
The reasonable man adapts himself to the world; the unreasonable one persists to adapt the world to himself. Therefore all progress depends on the unreasonable man. George Bernard Shaw
cpolhout
Posts: 3
Joined: Friday 30 June 2017 11:37
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Python Plugins: Breaking Change

Post by cpolhout »

@xavier82 and @Dnpwwo

Please see: https://github.com/cpolhout/Domoticz_X1 ... /alpha-1.0

Note: I still have some issues. In some cases Domoticz crashes. But still testing. If you have any issues let me now.
User avatar
Dnpwwo
Posts: 820
Joined: Sunday 23 March 2014 9:00
Target OS: Raspberry Pi / ODroid
Domoticz version: Beta
Location: Melbourne, Australia
Contact:

Re: Python Plugins: Breaking Change

Post by Dnpwwo »

@cpolhout,

Had a look at your source, a few comments (in order that I saw them rather than importance):
  • onStop - is the last callback. You don't need to disconnect anything because the framework will disconnect them (and call onDisconnect() for them) before calling onStop. It is an opportunity to do final clean up only.
  • I would recommend declaring variables within your class then use 'self.<var_name>' it stops a lot of errors (for example in onStop you have a line 'con.Disconnect()' but no 'global con' before it)
  • in onConnect you don't declare con as global either, maybe that is why you think con.Connected() isn't working? In onConnect you should use the 'Connection' parameter instead, it will be the same as 'con' anyway (assuming you added a global statement)
  • in onHeartbeat you haven't referenced 'global con' either
The reasonable man adapts himself to the world; the unreasonable one persists to adapt the world to himself. Therefore all progress depends on the unreasonable man. George Bernard Shaw
cpolhout
Posts: 3
Joined: Friday 30 June 2017 11:37
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Python Plugins: Breaking Change

Post by cpolhout »

Thanks for the review @Dnpwwo.

I've refactored the plugin. Now testing it. Please see:
https://github.com/cpolhout/Domoticz_X1 ... /alpha-1.1
jake
Posts: 744
Joined: Saturday 30 May 2015 22:40
Target OS: Raspberry Pi / ODroid
Domoticz version: beta
Contact:

Re: Python Plugins: Breaking Change

Post by jake »

Dnpwwo wrote:@elgringo and @jorgh,

I have pushed a fix to the 'bytes()' issue into the new default 'development' branch and I'm assuming that betas will be generated from there since the new stable release a week ago. I was calculating the length of the buffer the wrong way, the Python API isn't always obvious.
Is it safe to say that there will be no errors for python plugin users anymore after upgrade to the latest beta? For now I remain on 3.7450 with the old versions of the plugins as well.(Kodi and Onkyo) I know that an update of Domoticz needs to be accompanied with an update of the plugins at well.
Xavier82
Posts: 178
Joined: Tuesday 07 June 2016 22:09
Target OS: Raspberry Pi / ODroid
Domoticz version: 2023.2
Location: Netherlands
Contact:

Re: Python Plugins: Breaking Change

Post by Xavier82 »

@cpolhout:
I can now see the plugin in the hardware menu....
I'm using Synology NAS with Domoticz and Mochad with CM15PRO.
When I add this new hardware do I need to delete the "old" Mochad hardware?

Or is there an option to adjust the X10 devices with the new (your) plugin so that the IDX stays the same?
This because I have a few scripts with these IDX and I also use a FrontPage where IDX are added to groups and functions...

Regards,
Xavier
cpolhout wrote: Thursday 10 August 2017 11:11 Thanks for the review @Dnpwwo.

I've refactored the plugin. Now testing it. Please see:
https://github.com/cpolhout/Domoticz_X1 ... /alpha-1.1
Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest