--- a/controls/DiscoveryPanel.py Fri Dec 21 13:43:41 2018 +0100
+++ b/controls/DiscoveryPanel.py Fri Dec 21 13:51:33 2018 +0100
@@ -29,10 +29,10 @@
from six.moves import xrange
import wx.lib.mixins.listctrl as listmix
-from zeroconf import ServiceBrowser, Zeroconf
+from zeroconf import ServiceBrowser, Zeroconf, get_all_addresses
-service_type = '_PYRO._tcp.local.'
+service_type = '_Beremiz._tcp.local.' class AutoWidthListCtrl(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin):
@@ -95,14 +95,13 @@
label=_('Services available:'), name='staticText1', parent=self,
pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
self.RefreshButton = wx.Button(
label=_('Refresh'), name='RefreshButton', parent=self,
pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
- self.Bind(wx.EVT_BUTTON, self.OnRefreshButton, id=refreshID)
+ self.RefreshButton.Bind(wx.EVT_BUTTON, self.OnRefreshButton) self.ByIPCheck = wx.CheckBox(self, label=_("Use IP instead of Service Name"))
+ self.ByIPCheck.SetValue(True) @@ -122,23 +121,44 @@
+ self.ZeroConfInstance = None - self.ZeroConfInstance = Zeroconf()
self.LatestSelection = None
+ self.IfacesMonitorState = None + self.IfacesMonitorTimer = wx.Timer(self) + self.IfacesMonitorTimer.Start(2000) + self.Bind(wx.EVT_TIMER, self.IfacesMonitor , self.IfacesMonitorTimer) + self.IfacesMonitorTimer.Stop() + self.ZeroConfInstance.close() + def IfacesMonitor(self, event): + NewState = get_all_addresses(socket.AF_INET) + if self.IfacesMonitorState != NewState: + if self.IfacesMonitorState is not None: + # refresh only if a new address appeared + if addr not in self.IfacesMonitorState: + self.IfacesMonitorState = NewState + self.ServicesList.DeleteAllItems() if self.Browser is not None:
- self.ZeroConfInstance.close()
- if self.Browser is not None:
+ if self.ZeroConfInstance is not None: + self.ZeroConfInstance.close() + self.ZeroConfInstance = Zeroconf() self.Browser = ServiceBrowser(self.ZeroConfInstance, service_type, self)
def OnRefreshButton(self, event):
- self.ServicesList.DeleteAllItems()
# Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
@@ -167,18 +187,20 @@
self.LatestSelection = idx
- svcname = self.getColumnText(idx, 0)
- connect_type = self.getColumnText(idx, 1)
- self.URI = str("%s://%s" % (connect_type, svcname + '.' + service_type))
if self.LatestSelection is not None:
if self.ByIPCheck.IsChecked():
- self.URI = "%s://%s:%s" % tuple(
+ svcname, scheme, host, port = \ map(lambda col:self.getColumnText(self.LatestSelection, col),
+ return ("%s://%s:%s#%s" % (scheme, host, port, svcname)) \ + else ("%s://%s:%s" % (scheme, host, port)) + svcname = self.getColumnText(self.LatestSelection, 0) + connect_type = self.getColumnText(self.LatestSelection, 1) + return str("MDNS://%s" % svcname) def remove_service(self, zeroconf, _type, name):
@@ -210,7 +232,7 @@
info = self.ZeroConfInstance.get_service_info(_type, name)
svcname = name.split(".")[0]
- typename = _type.split(".")[0][1:]
+ typename = info.properties.get("protocol", None) ip = str(socket.inet_ntoa(info.address))
--- a/runtime/ServicePublisher.py Fri Dec 21 13:43:41 2018 +0100
+++ b/runtime/ServicePublisher.py Fri Dec 21 13:51:33 2018 +0100
@@ -28,13 +28,16 @@
-service_type = '_PYRO._tcp.local.'
+service_type = '_Beremiz._tcp.local.' class ServicePublisher(object):
+ def __init__(self, protocol): # type: fully qualified service type name
- self.serviceproperties = {'description': 'Beremiz remote PLC'}
+ self.serviceproperties = { + 'description': 'Beremiz remote PLC', @@ -52,7 +55,7 @@
def _RegisterService(self, name, ip, port):
# name: fully qualified service name
- self.service_name = 'Beremiz_%s.%s' % (name, service_type)
+ self.service_name = '%s.%s' % (name, service_type)