class AnalogOutput(BaseHandler):
    def __init__(self,eType,eSource,localrouter,wbTarget,aoNum):        
        super(AnalogOutput,self).__init__(localrouter)
        
        self.localrouter = localrouter
        self.wbTarget = wbTarget
        #assume the webbrick node number is equal to the last digit of the ip address
        self.nodeNum = wbTarget.split('.')[3]
        self.targetVal = 0
        self.eType = eType
        self.eSource = eSource
        self.aoNum = str(aoNum)
        
        self.aoCmd = 'AA;' + str(aoNum) + ';%(val)s:'
        self.httpAction = HttpAction(localrouter)
        self.httpAction.configure( self.MakeHttpConfig(eType,eSource,wbTarget) )
        self.httpAction.start()
        self.localrouter.subscribe( 20 , self , 'http://id.webbrick.co.uk/events/webbrick/AO' ,  'webbrick/' + self.nodeNum + '/AO/' + self.aoNum)
            
    def MakeHttpConfig(self,eType,eSource,wbTarget):
        cfg = {}
        cfg['eventtype'] = {}
        cfg['eventtype']['type'] = eType
        cfg['eventtype']['eventsource'] = {}
        cfg['eventtype']['eventsource']['source'] = eSource
        cfg['eventtype']['eventsource']['event'] = {}
        cfg['eventtype']['eventsource']['event']['url'] = {}
        cfg['eventtype']['eventsource']['event']['url']['cmd'] = "GET"
        cfg['eventtype']['eventsource']['event']['url']['uri'] = '/cfg.spi?com=' + self.aoCmd
        cfg['eventtype']['eventsource']['event']['url']['address'] = 'http://' + wbTarget
        cfg['name'] = 'HttpAction'
        cfg['module'] = 'EventHandlers.HttpAction'
        return cfg
    
    def initSubscription(self,status):
        pass
    
    def getUri(self):
        return "ANALOG_OUTPUT/" + self.wbTarget + '/' + self.aoNum 
    
    def SetAO(self,Val):
        if Val >= 0 and Val <= 100:
            newEvent = makeEvent( self.eType,self.eSource , {'val' : str(Val)} )         
            self.localrouter.publish(newEvent.getSource() , newEvent)   
            self.targetVal = int(Val)
        else:
            raise Exception("Warning , analog set point out of range : " + str(Val))        
            
    
    def doHandleEvent(self,handler,inEvent):
        if inEvent.getType() == 'http://id.webbrick.co.uk/events/webbrick/AO':
            if inEvent.getSource() == 'webbrick/' + self.nodeNum + '/AO/' + self.aoNum:
                if inEvent.getPayload()['val'] != self.targetVal:
                    self.SetAO(self.targetVal)
        return makeDeferred(StatusVal.OK)
class Pump():
    def __init__(self,cfgDict,localrouter):
        #stuff
        #wbTarget
        #wbCmd
        cfgXml =""" <eventInterface module='EventHandlers.HttpAction' name='HttpAction' usetwisted='0'>
                        <eventtype type="http://id.webbrick.co.uk/events/webbrick/TD">
                            <!-- events from a source of a specific type -->
                            <eventsource source="webbrick/100/TD/0" >
                                <!-- all events from a single source -->
	                            <event>
                                    <params>
                                    </params>
		                            <url cmd="GET" address="localhost:59999" uri="/test?medianame=ITunes&amp;mediacmd=volup" />
                                    Test
	                            </event>
                            </eventsource>
                        </eventtype>
                    </eventInterface>
                """
        
        self.httpAction = HttpAction(thisRouter)
        self.httpAction.configure(cfgXml)
        
    def doAction(self,actionDict):
        for key in actionDict:
            if key == "TURN_ON":
                self.turnOn()
            elif key == "TURN_OFF":
                self.turnOff()
        return {"GETURL" : url}
        
    def turnOn(self):
        self.hvac("dosomething")
        return {"GETURL" : url}
        
    def turnOff(self):
        self.hvac("dosomething")
        return {"GETURL" : url}
 def __init__(self,eType,eSource,localrouter,wbTarget,aoNum):        
     super(AnalogOutput,self).__init__(localrouter)
     
     self.localrouter = localrouter
     self.wbTarget = wbTarget
     #assume the webbrick node number is equal to the last digit of the ip address
     self.nodeNum = wbTarget.split('.')[3]
     self.targetVal = 0
     self.eType = eType
     self.eSource = eSource
     self.aoNum = str(aoNum)
     
     self.aoCmd = 'AA;' + str(aoNum) + ';%(val)s:'
     self.httpAction = HttpAction(localrouter)
     self.httpAction.configure( self.MakeHttpConfig(eType,eSource,wbTarget) )
     self.httpAction.start()
     self.localrouter.subscribe( 20 , self , 'http://id.webbrick.co.uk/events/webbrick/AO' ,  'webbrick/' + self.nodeNum + '/AO/' + self.aoNum)
 def __init__(self,eType,eSource,localrouter,wbTarget,doNum):        
     super(DigitalOutput,self).__init__(localrouter)              
     self.localrouter = localrouter
     self.wbTarget = wbTarget
     #assume the node number is equal to the last digit of the ip address
     self.nodeNum = wbTarget.split('.')[3]        
     self.eType = eType
     self.eOnSource = eSource + '/on'
     self.eOffSource = eSource + '/off'
     self.eDwellSource = eSource + '/dwell'
     self.doNum = str(doNum)
     self.onCmd = 'DO;' + str(doNum) + ';N:'
     self.offCmd = 'DO;' + str(doNum) + ';F:'
     self.dwellCmd = 'DO;' + str(doNum) + ';D;%(val)s:'
     self.httpAction = HttpAction(localrouter)
     self.httpAction.configure( self.MakeHttpConfig() )
     self.httpAction.start()
     self.dwellTime = -1
     self.localrouter.subscribe( 20 , self , 'http://id.webbrick.co.uk/events/webbrick/DO' ,  'webbrick/' + self.nodeNum + '/DO/' + self.doNum)
    def __init__(self,cfgDict,localrouter):
        #stuff
        #wbTarget
        #wbCmd
        cfgXml =""" <eventInterface module='EventHandlers.HttpAction' name='HttpAction' usetwisted='0'>
                        <eventtype type="http://id.webbrick.co.uk/events/webbrick/TD">
                            <!-- events from a source of a specific type -->
                            <eventsource source="webbrick/100/TD/0" >
                                <!-- all events from a single source -->
	                            <event>
                                    <params>
                                    </params>
		                            <url cmd="GET" address="localhost:59999" uri="/test?medianame=ITunes&amp;mediacmd=volup" />
                                    Test
	                            </event>
                            </eventsource>
                        </eventtype>
                    </eventInterface>
                """
        
        self.httpAction = HttpAction(thisRouter)
        self.httpAction.configure(cfgXml)
class DigitalOutput(BaseHandler):
    
    def __init__(self,eType,eSource,localrouter,wbTarget,doNum):        
        super(DigitalOutput,self).__init__(localrouter)              
        self.localrouter = localrouter
        self.wbTarget = wbTarget
        #assume the node number is equal to the last digit of the ip address
        self.nodeNum = wbTarget.split('.')[3]        
        self.eType = eType
        self.eOnSource = eSource + '/on'
        self.eOffSource = eSource + '/off'
        self.eDwellSource = eSource + '/dwell'
        self.doNum = str(doNum)
        self.onCmd = 'DO;' + str(doNum) + ';N:'
        self.offCmd = 'DO;' + str(doNum) + ';F:'
        self.dwellCmd = 'DO;' + str(doNum) + ';D;%(val)s:'
        self.httpAction = HttpAction(localrouter)
        self.httpAction.configure( self.MakeHttpConfig() )
        self.httpAction.start()
        self.dwellTime = -1
        self.localrouter.subscribe( 20 , self , 'http://id.webbrick.co.uk/events/webbrick/DO' ,  'webbrick/' + self.nodeNum + '/DO/' + self.doNum)
        
    def MakeHttpConfig(self):
        cfg = {}
        cfg['eventtype'] = [{},{},{}]
        cfg['eventtype'][0]['type'] = self.eType
        cfg['eventtype'][0]['eventsource'] = {}
        cfg['eventtype'][0]['eventsource']['source'] = self.eOnSource
        cfg['eventtype'][0]['eventsource']['event'] = {}
        cfg['eventtype'][0]['eventsource']['event']['url'] = {}
        cfg['eventtype'][0]['eventsource']['event']['url']['cmd'] = 'GET'
        cfg['eventtype'][0]['eventsource']['event']['url']['uri'] = '/cfg.spi?com=' + self.onCmd
        cfg['eventtype'][0]['eventsource']['event']['url']['address'] = self.wbTarget
        
        cfg['eventtype'][1]['type'] = self.eType
        cfg['eventtype'][1]['eventsource'] = {}
        cfg['eventtype'][1]['eventsource']['source'] = self.eOffSource
        cfg['eventtype'][1]['eventsource']['event'] = {}
        cfg['eventtype'][1]['eventsource']['event']['url'] = {}
        cfg['eventtype'][1]['eventsource']['event']['url']['cmd'] = 'GET'
        cfg['eventtype'][1]['eventsource']['event']['url']['uri'] = '/cfg.spi?com=' + self.offCmd
        cfg['eventtype'][1]['eventsource']['event']['url']['address'] = self.wbTarget
        
        cfg['eventtype'][2]['type'] = self.eType
        cfg['eventtype'][2]['eventsource'] = {}
        cfg['eventtype'][2]['eventsource']['source'] = self.eDwellSource
        cfg['eventtype'][2]['eventsource']['event'] = {}
        cfg['eventtype'][2]['eventsource']['event']['url'] = {}
        cfg['eventtype'][2]['eventsource']['event']['url']['cmd'] = 'GET'
        cfg['eventtype'][2]['eventsource']['event']['url']['uri'] = '/cfg.spi?com=' + self.dwellCmd
        cfg['eventtype'][2]['eventsource']['event']['url']['address'] = self.wbTarget
        
        cfg['name'] = 'HttpAction'
        cfg['module'] = 'EventHandlers.HttpAction'
        return cfg
    
    def initSubscription(self,status):
        pass
    
    def getUri(self):
        return "DIGITAL_OUTPUT/" + self.wbTarget + '/' + self.doNum 
        
    def turnOn(self,dwell = 0):
        if dwell > 8:
            #TODO deal with this better somehow
            #dwell must be above 8 seconds as below that are the dwell presets
            newEvent = makeEvent (self.eType,self.eDwellSource,{'val':str(int(dwell))} )
            self.dwellAmount = dwell
            self.dwellTime = time.time() + dwell
        else:
            newEvent = makeEvent( self.eType, self.eOnSource,  {} )      
            self.dwellTime = 0    
            self.dwellAmount = 0  
        self.targetVal = '1' 
        self.localrouter.publish(newEvent.getSource() , newEvent)
    
    def turnOff(self):
        newEvent = makeEvent( self.eType,self.eOffSource , {} )         
        self.localrouter.publish(newEvent.getSource() , newEvent)   
        self.targetVal = '0'
        
    def doHandleEvent(self,handler,inEvent):
        if inEvent.getType() == 'http://id.webbrick.co.uk/events/webbrick/DO':
            if inEvent.getSource() == 'webbrick/' + self.nodeNum + '/DO/' + self.doNum:
                if inEvent.getPayload()['state'] != self.targetVal:
                    if self.targetVal == '0':          
                        self._log.error("Webbrick DO not at target value is off , should be on")
                        self.turnOff()
                    elif self.targetVal == '1':
                        #check if we were dwelling
                        if self.dwellAmount:
                            if self.dwellTime < time.time():
                                #dwell time has expired being off is fine
                                self.targetVal = '0'
                            else:
                                #dwell not expired , dwell must have failed to set
                                self._log.error("Webbrick DO not at target value is off , should be on for %i seconds" %self.dwellTime)
                                self.turnOn(self.dwellAmount)
                        else:                    
                            self._log.error("Webbrick DO not at target value is off , should be on")
                            self.turnOn()
        return makeDeferred(StatusVal.OK)