webrelay-modbus/FaultMonitor.py

177 lines
5 KiB
Python

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
#
# generated by wxGlade 0.9.5 on Fri Feb 7 20:10:41 2020
#
import wx
import wx.grid
import wx.propgrid
import gettext
import re
import sys
from pubsub import pub
import pubsub.utils.notification
from WebRelay import WebRelay
from FaultView import FaultFrame
print('pubsub API version', pub.VERSION_API)
pubsub.utils.notification.useNotifyByWriteFile(sys.stdout)
class Controller:
def __init__(self, view):
self.sc = None
self.view = view
self.timer = wx.Timer()
self.timer.Bind(wx.EVT_TIMER, self.OnTimer)
self.refresh_rate = 2000
self.mode = False
self.model = WebRelay()
pub.subscribe(self.startTimer, 'monitoring_started')
pub.subscribe(self.stopTimer, 'monitoring_stopped')
pub.subscribe(self.model.apply_network_configs, 'apply_network_configs')
pub.subscribe(self.model.turn_relay_on, "turn_relay_on")
pub.subscribe(self.model.turn_relay_off, "turn_relay_off")
def startTimer(self):
self.model.connect_slave()
self.timer.Start(self.refresh_rate)
def stopTimer(self):
self.model.disconnect_slave()
self.timer.Stop()
def OnTimer(self, event):
# Read registers
relay_status = self.model.client.read_coils(0,10)
# Process registers
# Show Registers
for i, rstatus in enumerate(relay_status):
self.model.relay_status[i] = rstatus
if rstatus:
self.view.indicators[i].SetValue("ON")
self.view.indicators[i].SetBackgroundColour(wx.Colour(0, 255, 0))
else:
self.view.indicators[i].SetValue("OFF")
self.view.indicators[i].SetBackgroundColour(wx.Colour(255, 0, 0))
class MyFrame(FaultFrame):
def __init__(self, *args, **kwds):
FaultFrame.__init__(self, *args, **kwds)
pub.subscribe(self.update_display, 'read_all_registers')
self.indicators = [
self.text_ctrl_1,
self.text_ctrl_2,
self.text_ctrl_3,
self.text_ctrl_4,
self.text_ctrl_5,
self.text_ctrl_6,
self.text_ctrl_7,
self.text_ctrl_8,
self.text_ctrl_9,
self.text_ctrl_10,
]
def update_status(self, stats):
self.text_ctrl_system_status.SetValue(stats[0])
self.text_ctrl_ac1_status.SetValue(stats[1])
self.text_ctrl_dc2_status.SetValue(stats[2])
self.text_ctrl_dc3_status.SetValue(stats[3])
def update_display(self, reg, info):
ports = {k: v for (k, v) in info.items() if re.search(r'^p[1-3]_', k)}
etc = {k: v for (k, v) in info.items() if not re.search(r'^p[1-3]_', k)}
for k, v in ports.items():
self.property_page.SetPropertyValue(k, str(v.convertValue(reg[v.address])))
self.property_page.SetPropertyAttribute(k, "Units", str((reg[v.address])))
for k, v in etc.items():
self.property_page_etc.SetPropertyValue(k, str(v.convertValue(reg[v.address])))
self.property_page_etc.SetPropertyAttribute(k, "Units", str((reg[v.address])))
def ToggleMonitoring(self, event): # wxGlade: MyFrame.<event_handler>
btnLabel = self.button_1.GetLabel()
if self.button_1.Value:
pub.sendMessage("monitoring_started")
self.button_1.SetLabel("Stop")
else:
pub.sendMessage("monitoring_stopped")
self.button_1.SetLabel("Start")
def OnApply(self, event):
if self.button_1.Enabled:
return
self.input_uid.Disable()
self.input_port.Disable()
self.input_ip.Disable()
self.input_refresh.Disable()
nc_dict = {
"ipaddr": self.input_ip.GetValue(),
"port": int(self.input_port.GetValue()),
"uid": int(self.input_uid.GetValue()),
"refresh": int(self.input_refresh.GetValue()),
}
pub.sendMessage("apply_network_configs", nc_dict=nc_dict)
self.button_1.Enable()
def OnReset(self, event=None):
if not self.button_1.Enabled:
return
self.button_1.SetValue(False)
self.button_1.Disable()
self.input_uid.Enable()
self.input_port.Enable()
self.input_ip.Enable()
self.input_refresh.Enable()
def OnRelayOn(self, event):
pub.sendMessage("turn_relay_on", relay_id = event.GetId()-1)
event.Skip()
def OnRelayOff(self, event):
pub.sendMessage("turn_relay_off", relay_id = event.GetId()-11)
event.Skip()
def OnRelayPulse(self, event):
event.Skip()
# end of class MyFrame
class MyApp(wx.App):
def OnInit(self):
self.frame = MyFrame(None, wx.ID_ANY, "")
self.c = Controller(self.frame)
self.SetTopWindow(self.frame)
self.frame.Show()
return True
# end of class MyApp
if __name__ == "__main__":
gettext.install("app") # replace with the appropriate catalog name
app = MyApp(0)
app.MainLoop()
app.c.model.disconnect_slave()