Skip to content

Commit

Permalink
better timing for getting dict from ap ..
Browse files Browse the repository at this point in the history
changes in V 7.38.353@ 2021-03-19
==================
1. changed expect script for getting dicts from AP, switch UDMpro
   better timing, should result in much fewer restarts
2. changed log level for restarts, now only every 3 time level is warning 6 is error
 rest is  info / debug  in plugin.log file
  • Loading branch information
kw123 committed Mar 19, 2021
1 parent 166da02 commit dae9f05
Show file tree
Hide file tree
Showing 7 changed files with 115 additions and 52 deletions.
2 changes: 1 addition & 1 deletion uniFiAP.indigoPlugin/Contents/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<plist version="1.0">
<dict>
<key>PluginVersion</key>
<string>7.38.352</string>
<string>7.38.353</string>
<key>ServerApiVersion</key>
<string>2.0.0</string>
<key>IwsApiVersion</key>
Expand Down
4 changes: 0 additions & 4 deletions uniFiAP.indigoPlugin/Contents/Server Plugin/Actions.xml
Original file line number Diff line number Diff line change
Expand Up @@ -532,10 +532,6 @@
</ConfigUI>
</Action>





<Action id="powerCyclePort">
<Name>POWER cycle a port on a UniFi switch</Name>
<CallbackMethod>buttonConfirmpowerCycleCALLBACKaction</CallbackMethod>
Expand Down
18 changes: 12 additions & 6 deletions uniFiAP.indigoPlugin/Contents/Server Plugin/Devices.xml
Original file line number Diff line number Diff line change
Expand Up @@ -430,18 +430,24 @@ If in config enabled for all or off, this setting is ignored, this setting is on
<ControlPageLabel>ip</ControlPageLabel>
</State>

<State id="name">
<ValueType>string</ValueType>
<TriggerLabel>nameOnNVR</TriggerLabel>
<ControlPageLabel>nameOnNVR</ControlPageLabel>
</State>

<State id="id">
<ValueType>string</ValueType>
<TriggerLabel>id</TriggerLabel>
<ControlPageLabel>id</ControlPageLabel>
</State>

<State id="lcdMessage">
<ValueType>string</ValueType>
<TriggerLabel>lcdMessage</TriggerLabel>
<ControlPageLabel>lcdMessage</ControlPageLabel>
</State>

<State id="name">
<ValueType>string</ValueType>
<TriggerLabel>nameOnNVR</TriggerLabel>
<ControlPageLabel>nameOnNVR</ControlPageLabel>
</State>

<State id="type">
<ValueType>string</ValueType>
<TriggerLabel>type</TriggerLabel>
Expand Down
10 changes: 10 additions & 0 deletions uniFiAP.indigoPlugin/Contents/Server Plugin/MenuItems.xml
Original file line number Diff line number Diff line change
Expand Up @@ -751,6 +751,16 @@ it will make the plugin restart </Label>

<Field id="cameraProtectCmdxlabel" type="Label" > <Label>2. Actions === </Label> </Field>
<Field id="simpleSeparatorACTIONS" type="separator"/>
<!--
<Field id="lcdMessage" type="textField" defaultValue="do not change" >
<Label>=== lcd message if present set:</Label>
</Field>
<Field id="sendlcdMessagetoProtect" type="button" tooltip="" >
<Label> Click to </Label><Title>SET message</Title><CallbackMethod>buttonSendCommandToProtectLcdMessageCALLBACK</CallbackMethod>
</Field>
<Field id="simpleSeparatorlcd" type="separator"/>
-->

<Field id="camLEDenabled" type="menu" defaultValue="0" >
<Label>=== LED set ON off:</Label>
Expand Down
10 changes: 4 additions & 6 deletions uniFiAP.indigoPlugin/Contents/Server Plugin/dictLoop.exp
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ expect {
set timeout 3
expect "Permission denied" {send \003\r"; exit 1}
sleep 2
expect *
expect -re $
send "\r"
expect "$promptOnServer" {puts "startxxxx\r";}
sleep 1.0
Expand All @@ -34,12 +34,10 @@ send "\r"
sleep 0.2
expect "$promptOnServer"
send "$cmd \r"
sleep 4
expect *
send "\r"
sleep 6
expect "$promptOnServer"
sleep 0.2
puts "$endDictToken$i\r\r"
sleep 1
puts "$endDictToken$i\r"
sleep $readDictEverySeconds
send "\r"
expect "$promptOnServer"
Expand Down
116 changes: 81 additions & 35 deletions uniFiAP.indigoPlugin/Contents/Server Plugin/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -482,10 +482,10 @@ def startup(self):
self.MACloglist = {}

self.readDictEverySeconds = {}
self.readDictEverySeconds[u"AP"] = 60 #unicode(int(self.pluginPrefs.get(u"readDictEverySecondsAP", 60) ))
self.readDictEverySeconds[u"GW"] = 60 #unicode(int(self.pluginPrefs.get(u"readDictEverySecondsGW", 120) ))
self.readDictEverySeconds[u"SW"] = 60 #unicode(int(self.pluginPrefs.get(u"readDictEverySecondsSW", 120) ))
self.readDictEverySeconds[u"UD"] = 60 #unicode(int(self.pluginPrefs.get(u"readDictEverySecondsUD", 60) ))
self.readDictEverySeconds[u"AP"] = 58 #unicode(int(self.pluginPrefs.get(u"readDictEverySecondsAP", 60) ))
self.readDictEverySeconds[u"GW"] = 58 #unicode(int(self.pluginPrefs.get(u"readDictEverySecondsGW", 120) ))
self.readDictEverySeconds[u"SW"] = 58 #unicode(int(self.pluginPrefs.get(u"readDictEverySecondsSW", 120) ))
self.readDictEverySeconds[u"UD"] = 58 #unicode(int(self.pluginPrefs.get(u"readDictEverySecondsUD", 60) ))
self.readDictEverySeconds[u"DB"] = 40 #unicode(int(self.pluginPrefs.get(u"readDictEverySecondsDB", 40) ))
self.getcontrollerDBForClientsLast = 0
self.devStateChangeList = {}
Expand Down Expand Up @@ -4463,7 +4463,7 @@ def executeCMDOnControllerReset(self, wait=False, calledFrom=""):
self.unifiControllerOS = ""
self.lastUnifiCookieRequests = 0.
self.lastUnifiCookieCurl = 0
if wait: self.sleep(0.5)
if wait: self.sleep(1.0)
except Exception, e:
if unicode(e).find(u"None") == -1:
self.indiLOG.log(40,u"in Line {} has error={}".format(sys.exc_traceback.tb_lineno, e) )
Expand Down Expand Up @@ -4694,8 +4694,9 @@ def executeCMDOnController(self, dataSEND={}, pageString=u"",jsonAction=u"return

if self.unifiCloudKeySiteName == "":
if not self.setunifiCloudKeySiteName(method="response", cookies=cookies, headers=headers ): continue

if self.unifiCloudKeySiteName == "": continue


if protect:
url = "https://"+self.unifiCloudKeyIP+":"+self.unifiCloudKeyPort+"/proxy/protect/"+pageString.strip("/")
else:
Expand Down Expand Up @@ -5245,6 +5246,34 @@ def setupStructures(self, xType, dev, MAC, init=False):



####-----------------init main loop ---------
def setupCameraVariables(self):
try:
if self.cameraSystem == "protect":
if not self.enableSqlLogging:
try: indigo.variable.delete(u"Unifi_Camera_with_Event")
except: pass
try: indigo.variable.delete(u"Unifi_Camera_Event_PathToThumbnail")
except: pass
try: indigo.variable.delete(u"Unifi_Camera_Event_DateOfThumbNail")
except: pass
try: indigo.variable.delete(u"Unifi_Camera_Event_Date")
except: pass

try: indigo.variable.create(u"Unifi_Camera_Event_Date", value ="", folder=self.folderNameIDVariables)
except: pass
try: indigo.variable.create(u"Unifi_Camera_with_Event", value ="", folder=self.folderNameIDVariables)
except: pass
try: indigo.variable.create(u"Unifi_Camera_Event_PathToThumbnail", value ="", folder=self.folderNameIDVariables)
except: pass
try: indigo.variable.create(u"Unifi_Camera_Event_DateOfThumbNail", value ="", folder=self.folderNameIDVariables)
except: pass
except Exception, e:
if unicode(e).find(u"None") == -1:
self.indiLOG.log(40,u"in Line {} has error={}".format(sys.exc_traceback.tb_lineno, e))
return


########################### MAIN LOOP ############################
####-----------------init main loop ---------
def fixBeforeRunConcurrentThread(self):
Expand All @@ -5262,23 +5291,8 @@ def fixBeforeRunConcurrentThread(self):

self.writeJson(dataVersion, fName=self.indigoPreferencesPluginDir + "dataVersion")

self.buttonConfirmGetAPDevInfoFromControllerCALLBACK()

try: indigo.variable.delete(u"Unifi_Camera_with_Event")
except: pass
indigo.variable.create(u"Unifi_Camera_with_Event", value ="", folder=self.folderNameIDVariables)

try: indigo.variable.delete(u"Unifi_Camera_Event_PathToThumbnail")
except: pass
indigo.variable.create(u"Unifi_Camera_Event_PathToThumbnail", value ="", folder=self.folderNameIDVariables)

try: indigo.variable.delete(u"Unifi_Camera_Event_DateOfThumbNail")
except: pass
indigo.variable.create(u"Unifi_Camera_Event_DateOfThumbNail", value ="", folder=self.folderNameIDVariables)

try: indigo.variable.delete(u"Unifi_Camera_Event_Date")
except: pass
indigo.variable.create(u"Unifi_Camera_Event_Date", value ="", folder=self.folderNameIDVariables)
self.buttonConfirmGetAPDevInfoFromControllerCALLBACK()

## if video enabled
if self.cameraSystem == "nvr" and self.vmMachine !="":
Expand Down Expand Up @@ -5472,8 +5486,10 @@ def fixBeforeRunConcurrentThread(self):

self.lastRefreshProtect = 0

self.setupCameraVariables()
self.getProtectIntoIndigo()
self.protectThread = {u"thread":"", u"status":""}

if self.cameraSystem == u"protect":
self.protectThread[u"status"] = u"run"
self.protectThread[u"thread"] = threading.Thread(name=u'get-protectevents', target=self.getProtectEvents)
Expand Down Expand Up @@ -7617,7 +7633,7 @@ def checkIfRestartNeeded(self, goodDataReceivedTime, aliveReceivedTime, startErr

if startError != "":
startErrorCount +=1
if startErrorCount%10 == 0:
if startErrorCount%3== 0:
self.indiLOG.log(40,u"getMessages: connect start connect error in listener {}, to @ {} ::::{}::::".format(uType, ipNumber, startError) )
retCode = 2
self.sleep(15)
Expand Down Expand Up @@ -7686,16 +7702,18 @@ def checkIfErrorReceived(self, goodDataReceivedTime, newlinesFromServer, uType,
if newlinesFromServer != "":
self.dataStats[u"tcpip"][uType][ipNumber][u"inMessageCount"] += 1
self.dataStats[u"tcpip"][uType][ipNumber][u"inMessageBytes"] += len(newlinesFromServer)
## any error messages from OSX?
## any error messages from OSX?
pos1 = newlinesFromServer.find(u"closed by remote host")
pos2 = newlinesFromServer.find(u"Killed by signal")
pos3 = newlinesFromServer.find(u"Killed -9")
if ( pos1 >- 1 or pos2 >- 1 or pos3 > -1):
self.indiLOG.log( 30,u"getMessage: {} {} returning: ".format(uType, ipNumber) )
if pos1 >-1: self.indiLOG.log(30,u"...{}".format(newlinesFromServer[max(0,pos1 - 100):pos1 + 100]) )
if pos2 >-1: self.indiLOG.log(30,u"...{}".format(newlinesFromServer[max(0,pos2 - 100):pos2 + 100]) )
if pos3 >-1: self.indiLOG.log(30,u"...{}".format(newlinesFromServer[max(0,pos3 - 100):pos3 + 100]) )
self.indiLOG.log( 30,u"...: {} we should restart listener on server ".format(uType) )
pos4 = newlinesFromServer.find(u"mca-ctrl: error") ##mca-ctrl: error while loading shared libraries: libubus.so: cannot ope...
if ( pos1 >- 1 or pos2 >- 1 or pos3 > -1 or pos4 > -1):
self.indiLOG.log( 20,u"getMessage: {} {} returning: ".format(uType, ipNumber) )
if pos1 >-1: self.indiLOG.log(20,u"...(1){}".format(newlinesFromServer[max(0,pos1 - 100):pos1 + 100]) )
if pos2 >-1: self.indiLOG.log(20,u"...(2){}".format(newlinesFromServer[max(0,pos2 - 100):pos2 + 100]) )
if pos3 >-1: self.indiLOG.log(20,u"...(3){}".format(newlinesFromServer[max(0,pos3 - 100):pos3 + 100]) )
if pos4 >-1: self.indiLOG.log(20,u"...(4){}".format(newlinesFromServer) )
self.indiLOG.log( 20,u"...: {} we should restart listener on server ".format(uType) )
goodDataReceivedTime = 1#
except Exception, e:
if unicode(e).find(u"None") == -1:
Expand Down Expand Up @@ -8231,6 +8249,7 @@ def getProtectIntoIndigo(self):
states[u"speakerVolume"] = int(self.getIfinDict(camera[u"speakerSettings"],u"volume", default=100))
states[u"areSystemSoundsEnabled"] = self.getIfinDict(camera[u"speakerSettings"],u"areSystemSoundsEnabled", default=False)
states[u"micVolume"] = int(self.getIfinDict(camera,u"micVolume", default=100))
states[u"lcdMessage"] = self.getIfinDict(camera[u"lcdMessage"],u"text")
states[u"modelKey"] = self.getIfinDict(camera,u"modelKey")
states[u"motionRecordingMode"] = self.getIfinDict(camera[u"recordingSettings"], u"mode")
states[u"motionMinEventTrigger"] = self.getIfinDict(camera[u"recordingSettings"], u"minMotionEventTrigger")
Expand Down Expand Up @@ -8591,7 +8610,7 @@ def getProtectEventPicsAndupdateDevices (self, checkIds):
if self.PROTECT[cameraId][u"devId"] > 0:
dev = indigo.devices[self.PROTECT[cameraId][u"devId"]]
props = dev.pluginProps
if u"eventThumbnailOn" in props and props[u"eventThumbnailOn"]:
if u"eventThumbnailOn" in props and props[u"eventThumbnailOn"] and "thumbnailwh" in props:
wh = props[u"thumbnailwh"].split("/")
params = {"accessKey": "", "h": wh[1], "w": wh[0],}
data = self.executeCMDOnController(dataSEND=params, pageString=u"api/thumbnails/{}".format(protectEV["rawEvent"][u"thumbnail"]), jsonAction=u"protect", cmdType=u"get", protect=True, raw=True, ignore40x=True)
Expand Down Expand Up @@ -8681,6 +8700,32 @@ def getProtectEventPicsAndupdateDevices (self, checkIds):

####----------------- ---------
####-----send commd parameters to cameras through protect ------
####----------------- ---------
def buttonSendCommandToProtectLcdMessageCALLBACKaction (self, action1=None, filter="", typeId="", devId=""):
return self.buttonSendCommandToProtectLcdMessageCALLBACK(valuesDict= action1.props)
def buttonSendCommandToProtectLcdMessageCALLBACK(self, valuesDict=None, filter="", typeId="", devId="",returnCmd=False):
try:
area = u"lcdMessage"
payload ={area:{}}
if valuesDict[u"lcdMessage"] != u"do not change": payload[area][u"text"] = valuesDict[u"lcdMessage"]
data = self.setupProtectcmd( valuesDict[u"cameraDeviceSelected"], payload)
ok = True
if area not in data: ok = False
else:
for xx in data[area]:
if data[area][xx] != payload[area][xx]:
ok = False
break

valuesDict[u"msg"] = u"ok" if ok else u"error"
if self.decideMyLog(u"Protect"): self.indiLOG.log(10,u"setupProtectcmd returned data: {} ".format(data[area]))
self.addToMenuXML(valuesDict)
except Exception, e:
if unicode(e).find(u"None") == -1:
self.indiLOG.log(40,u"updateIndigoWithLogData in Line {} has error={}".format(sys.exc_traceback.tb_lineno, e))
return valuesDict


####----------------- ---------
def buttonSendCommandToProtectLEDCALLBACKaction (self, action1=None, filter="", typeId="", devId=""):
return self.buttonSendCommandToProtectLEDCALLBACK(valuesDict= action1.props)
Expand All @@ -8695,7 +8740,7 @@ def buttonSendCommandToProtectLEDCALLBACK(self, valuesDict=None, filter="", type
if area not in data: ok = False
else:
for xx in data[area]:
if data[area][xx] != payload[area][x]:
if data[area][xx] != payload[area][xx]:
ok = False
break

Expand Down Expand Up @@ -8731,7 +8776,7 @@ def buttonSendCommandToProtectenableSpeakerCALLBACK(self, valuesDict=None, filte
if area not in data: ok = False
else:
for xx in payload[area]:
if data[area][xx] != payload[area][x]:
if data[area][xx] != payload[area][xx]:
ok = False
break

Expand Down Expand Up @@ -8861,7 +8906,7 @@ def buttonSendCommandToProtectIRCALLBACK(self, valuesDict=None, filter="", typeI
if area not in data: ok = False
else:
for xx in payload[area]:
if data[area][xx] != payload[area][x]:
if data[area][xx] != payload[area][xx]:
ok = False
break

Expand Down Expand Up @@ -8994,10 +9039,11 @@ def buttonConfirmPrintProtectDeviceInfoCALLBACK(self, valuesDict, typeId):
out +=u" uniFiAP Protect Camera devices END ============================================================================================================================= \n"

self.indiLOG.log(20,out)

valuesDict[u"msg"] = u"printed"
except Exception, e:
if unicode(e).find(u"None") == -1:
self.indiLOG.log(40,u"in Line {} has error={}".format(sys.exc_traceback.tb_lineno, e))
return valuesDict

###########################################
####------ camera PROTEC --- -------END
Expand Down
7 changes: 7 additions & 0 deletions uniFiAP.indigoPlugin/Contents/changeLog.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
changes in V 7.38.353@ 2021-03-19
==================
1. changed expect script for getting dicts from AP, switch UDMpro
better timing, should result in much fewer restarts
2. changed log level for restarts, now only every 3 time level is warning 6 is error
rest is info / debug in plugin.log file

changes in V 7.38.352@ 2021-03-15
==================
1. fixed some exception handling errors
Expand Down

0 comments on commit dae9f05

Please sign in to comment.