#################################################################################### # Web Accessible Heating / Hot Water Programmer # http://www.ns-tech.co.uk/blog/2011/06/web-accessible-heating-hot-water-programmer #################################################################################### from synapse.platforms import * from synapse.switchboard import * #------------------------------------------------------------------------------- PROGRAMMER_NODE= '\x22\x22\x22' HW_ONOFF_LED = GPIO_14 HW_ONOFF_BTN = GPIO_0 HW_EXTRA_LED = GPIO_13 HW_EXTRA_BTN = GPIO_2 HW_OVRPERM_SW_ON = GPIO_12 HW_OVRPERM_SW_OFF = GPIO_11 HW_RELAY = GPIO_18 HE_ONOFF_LED = GPIO_16 HE_ONOFF_BTN = GPIO_3 HE_EXTRA_LED = GPIO_15 HE_EXTRA_BTN = GPIO_4 HE_OVRPERM_SW_ON = GPIO_5 HE_OVRPERM_SW_OFF = GPIO_6 HE_RELAY = GPIO_17 panel_inputs = ( (HW_ONOFF_BTN, 'btn hot_water override temp onoff'), (HW_EXTRA_BTN, 'btn hot_water override temp extra'), (HW_OVRPERM_SW_ON, 'btn hot_water override perm cont'), (HW_OVRPERM_SW_OFF, 'btn hot_water override perm off'), (HE_ONOFF_BTN, 'btn heating override temp onoff'), (HE_EXTRA_BTN, 'btn heating override temp extra'), (HE_OVRPERM_SW_ON, 'btn heating override perm cont'), (HE_OVRPERM_SW_OFF, 'btn heating override perm off'), ) panel_outputs = ( (HW_ONOFF_LED, 'ohwlo'), (HW_EXTRA_LED, 'ohwle'), (HW_RELAY, 'ohwre'), (HE_ONOFF_LED, 'ohelo'), (HE_EXTRA_LED, 'ohele'), (HE_RELAY, 'ohere'), ) """ panel_outputs = ( (HW_ONOFF_LED, 'output hot_water led_onoff'), (HW_EXTRA_LED, 'output hot_water led_extra'), (HW_RELAY, 'output hot_water relay'), (HE_ONOFF_LED, 'output heating led_onoff'), (HE_EXTRA_LED, 'output heating led_extra'), (HE_RELAY, 'output heating relay'), ) """ #------------------------------------------------------------------------------- @setHook(HOOK_STARTUP) def startupEvent(): #Turn on LED to show operation setPinDir(GPIO_1, True) writePin(GPIO_1, True) #setPinDir(GPIO_7, True)#RS232 #setPinDir(GPIO_8, True)#RS232 #setPinDir(GPIO_9, True)#RS232 #setPinDir(GPIO_10, True)#RS232 #Init inputs, monitor for changes, enable pullups total = len(panel_inputs) i = 0 while (i < total): setPinDir(panel_inputs[i][0], False) setPinPullup(panel_inputs[i][0], True) monitorPin(panel_inputs[i][0], True) i = i + 1 #Init outputs total = len(panel_outputs) i = 0 while (i < total): setPinDir(panel_outputs[i][0], True) writePin(panel_outputs[i][0], False) i = i + 1 #Setup wireless serial data tunnel #initUart(1, 9600) #flowControl(1, False) crossConnect(DS_TRANSPARENT, DS_STDIO) stdinMode(0, False) ucastSerial(PROGRAMMER_NODE) #Init outputs/inputs print "bootup" #----------------- @setHook(HOOK_GPIN) def buttonEvent(pinNum, isSet): #If button press if (not isSet): #Retrieve event name total = len(panel_inputs) i = 0 while (i < total): if (panel_inputs[i][0] == pinNum): print panel_inputs[i][1] break i = i + 1 #----------------- @setHook(HOOK_STDIN) def dataReceived(buffer): updcfm = 0 #While data left in buffer while (len(buffer) > 0): #If output event if (buffer[0:1] == 'o'): #Find out what event just happened total = len(panel_outputs) i = 0 while (i < total): matchlen = len(panel_outputs[i][1]) #If found a match if (buffer[0:matchlen] == panel_outputs[i][1]): #Turn on if (buffer[matchlen:matchlen+1] == '1'): writePin(panel_outputs[i][0], True) updcfm = updcfm + 1 elif (buffer[matchlen:matchlen+1] == '0'): #Turn off writePin(panel_outputs[i][0], False) updcfm = updcfm + 1 break i = i + 1 buffer = buffer[6:] else: #Unrecognised data, clear buffer buffer = '' if (updcfm > 0): print "updcfm " + str(updcfm)