2014-06-16 7 views
2

내 TV에 XBMC 상자가 연결되어 있습니다. 또한 2 대의 Foscam IP 카메라가 있는데, 두 명의 어린 소녀를 아기 모니터링에 사용합니다.XBMC 알림 이미지 (IP 캠에서 제공) 업데이트되지 않음

Foscam의 알람 중 하나가 트리거되면 관련 Foscam 카메라의 라이브 이미지와 함께 XBMC에 대한 알림이 표시되도록 스크립트를 작성하는 것이 좋습니다. 이것으로 kiddos를 면밀히 주시하면서 TV를 볼 수있었습니다.

그래서 XBMC 상자에는 매초 Foscam 경보 상태를 확인하는 쉘 스크립트가 있습니다. 알람이 트리거되면 XBMC 스크립트를 실행하라는 명령을 XBMC에 보내고 30 초 동안 검사를 일시 중단하고 알람 상태 확인을 다시 시작합니다. XBMC 스크립트는 내 딸 중 한 명 (트리거 된 카메라에 따라 다름)과 귀여운 사진, 30 초 간격으로 업데이트되는 관련 Foscam의 라이브 스냅 샷을 포함하는 30 초 알림을 표시합니다.

이 모든 것이 완벽하게 정상적으로 작동했으며 완전히 훌륭했습니다. 그러나 지난주에 나는 Foscam의 펌웨어를 업그레이드했습니다. 새로운 펌웨어 (펌웨어 설명에서 언급)의 유일한 변경 사항은 카메라의 HTTP 인증 방법을 basic에서 digest으로 변경하는 것입니다. 그리고 그때 이래, 나는 XBMC 스크립트에 문제가있다. 원래 스크립트가 나는 편리한 방법의 모든 종류에 digest 인증을 지원하지 않았다 발견 urllib을 사용

# Import the XBMC/XBMCGUI modules. 
from requests.auth import HTTPDigestAuth 
import xbmc, xbmcgui, xbmcvfs, xbmcaddon 
import sys, os, requests, time 


# Class to manage the notification image 
class CamView(xbmcgui.WindowDialog): 

    urlpath = "/snapshot.cgi?resolution=16" 
    imagename = "snapshot.jpg" 

    def __init__(self, camname,camport,idx,username,password): 

     # Construct correct URL 
     self.baseurl = 'http://' + camname + 'cam:' + camport 

     # Cams use digest authentication 
     self.auth = HTTPDigestAuth(username, password) 

     # Set 
     path = xbmc.translatePath('special://profile/addon_data/%s' % xbmcaddon.Addon().getAddonInfo('id')) 
     if not xbmcvfs.exists(path): 
      xbmcvfs.mkdir(path) 
     self.imagefile = os.path.join(path, self.imagename) 

     # Message 
     self.msg = { 
      "1": camname.capitalize() + ' moved', 
      "3": camname.capitalize() + ' made a sound', 
     }.get(idx, camname.capitalize() + 'cam fired alarm') 

     # set the initial image before the window is shown 
     self.image = xbmcgui.ControlImage(870, 383, 380, 253, "") 
     self.addControl(self.image) 


    def update_image(self): 

     f = requests.get(self.baseurl+self.urlpath, auth=self.auth) 
     with open(self.imagefile, "wb") as local_file: 
      local_file.write(f.content) 

     self.image.setImage("") 
     self.image.setImage(self.imagefile) 

    def __enter__(self): 
     return self 

    def __exit__(self,type,value,traceback): 
     os.remove(self.imagefile) 


def main(): 

    for i in range(1,len(sys.argv)): 
     str,dummy,val = sys.argv[i].partition("=") 
     if str == "alarm_id": idx  = val 
     if str == "cam_id" : camname = val 
     if str == "cam_port": camport = val 
     if str == "username": username = val 
     if str == "password": password = val 

    with CamView(camname,camport,idx,username,password) as viewer: 

     viewer.show() 

     start_time = time.time() 
     firstimage = True 
     while(time.time() - start_time <= 30): 

      viewer.update_image() 
      curr_time = round(time.time()-start_time, 0) 

      if firstimage: 

       firstimage = False 
       nowtime = time.strftime("%I:%M %p") 

       viewer.image.setAnimations([('conditional', 'effect=fade start=0 end=100 time=750 delay=125 condition=true'), 
              ('conditional', 'effect=slide start=400,0 end=0,0 time=750 condition=true')]) 

       xoptions = ("Notification(\"" + viewer.msg + "\", " + nowtime + ", 29500, special://masterprofile/addon_data/" + 
          xbmcaddon.Addon().getAddonInfo('id') + "/" + camname + ".png)") 
       xbmc.executebuiltin(xoptions) 


      elif curr_time == 30: 
       viewer.image.setAnimations([('conditional', 'effect=fade start=100 end=0 time=750 condition=true'), 
              ('conditional', 'effect=slide start=0,0 end=400,0 time=750 condition=true')]) 

      else: 
       viewer.image.setAnimations([('conditional', 'effect=fade start=100 end=100 time=0 condition=true')]) 


      xbmc.sleep(500) 


if __name__ == "__main__": 

    if xbmc.getInfoLabel("Window(10000).Property(foscamScriptRunning)") == "True": 
     xbmc.log('Script already running', level=xbmc.LOGERROR) 
    else: 
     xbmc.log('Foscam alarm triggered', level=xbmc.LOGNOTICE) 
     xbmcgui.Window(10000).setProperty("foscamScriptRunning", "True") 
     main() 
     xbmcgui.Window(10000).setProperty("foscamScriptRunning", "False") 

:

그래서 첫째, 여기에 스크립트의 현재 버전입니다. 그래서 urllib2으로 변경되었습니다. 이것은 내 XBMC 팝업의 이미지가 첫 번째 이미지 이후에 업데이트되지 않는다는 점에서 작동하지 않았습니다. 때로는 이미지조차 전혀 없었습니다.

약간의 파고를했는데 인증을 사용하여 urllib2의 스냅 샷을 얻는 데 7 초가 조금 걸렸습니다. (예전의 펌웨어로는 0.1 초도 안 걸렸습니다). 이것이 이미지가 업데이트되지 않는 원인 일 수 있다고 생각하여 모든 것을 requests 모듈로 변경했습니다. 프로파일 링을 통해 카메라에서 단일 스냅 샷을 얻는 데 약 0.25 초 정도 걸렸습니다. 여전히 다소 느린 IMHO이지만 아마 수용 가능할 것입니다. 그러나이 방법으로도 알림 이미지가 업데이트되지 않습니다.

원격 SSH를 통해 스크립트를 트리거하므로 XBMC 로그 등을 확인할 수 있습니다. snapshot.jpg 파일의 타임 스탬프도 확인했는데 스크립트 트리거 시간과 0.25 초 지연 requests. XBMC 스크립트에서 이미지를 지우고 성공할 때마다 가능한 모든 순서대로 새 스냅 샷으로 설정하는 순서를 변경했습니다. 이미지 지우기와 다시 설정 사이에 지체를두면 깜박 거리는 이미지가 표시되어 모든 이미지가 작동한다는 것을 알 수 있습니다. 그러나 항상 동일한 스냅 샷으로 다시 설정됩니다.

그래서, 나는 정말 붙어 있습니다. 나는 무엇을 여기에서 바라보고 있냐? 그것은 가치가 무엇인지에 대한

+0

이전 펌웨어로 롤백 할 수있는 기회가 있습니까 ??? 우리가 같은 하드웨어를 가지고 있지 않다면 아무도 도와 줄 수 없다. (( – mlwn

+0

) 정말로 현재 카메라에는 "현재 펌웨어 저장"옵션이 없다. ..... 나는 그것이 문제가 파이썬 코드와 함께, 또는 누군가가 다이제스트 인증과 함께 사용되는 모듈과 비슷한 문제를 경험했다 ... –

+0

나는이 주제에 관심이 있고 .. 내 도움을 제공하고 싶습니다.하지만 그런 하드웨어로 일한 적이 없어. .. 어딘가에 온라인 시뮬레이터가있을 것이라고 생각하십니까? 편리한 방법으로 도울 준비가되었습니다 ... – mlwn

답변

0

는 : 나는 마지막으로 "고정"

고유 이름으로 각각의 스냅 샷을 저장하여 문제가 (이름은 마이크로와 시간을 기준으로 생성), 그리고 이후 모든 개인 파일을 제거.

이 내용은 xbmcgui.ControlImage.setImage()과 관련된 일부 캐싱 문제의 방향을 암시하지만 캐싱을 언급하는 설명서를 찾을 수 없습니다 ...

내가이 접근법에서 경험 한 한 가지 문제점은 알림이 표시되는 동안 Esc을 누르면 (모든 XBMC 제어가 손실 될 수 있기 때문에) 이미지가 항상 올바르게 정리되지 않는다는 것입니다. 상대적으로 사소한 문제이지만, 이것이 냄새 나는 해결책이라는 명확한 증거입니다. :)