Insteon PLM Ruby Code 355
From LinuxMCE
#### Written by Dan Damron #### #355 Process Initialize #### $red = 0x1b.chr + '[31m' $green = 0x1b.chr + '[32m' $yellow = 0x1b.chr + '[33m' $blue = 0x1b.chr + '[34m' $purple = 0x1b.chr + '[35m' $aqua = 0x1b.chr + '[36m' $grey = 0x1b.chr + '[37m' $redBack = 0x1b.chr + '[41m' $greenBack = 0x1b.chr + '[42m' $yellowBack = 0x1b.chr + '[43m' $blueBack = 0x1b.chr + '[44m' $purpleBack = 0x1b.chr + '[45m' $aquaBack = 0x1b.chr + '[46m' $greyBack = 0x1b.chr + '[47m' $blackBack = 0x1b.chr + '[48m' $remoteLinkRecord = '' #$remoteRecordReady = 0 $configstring = '' $configparams = [] $childdatabases = {} $newdevices = {} $plmdatabase = [] $plmlastrecord = true $log = '' $cmdTo = '' $cmdFrom = '' $cmdPriority = '' $cmdType = '' $cmdID = '' $cmdParams = {} $children = {} $recvbuff = '' $wAIT = false $currentCmd = {} $flagsBroadcastMessage = 128 $flagsDirectMessage = 0 $flagsAckDirectMessage = 32 $flagsNackDirectMessage = 160 $flagsGroupBroadcaseMessage = 192 $flagsGroupCleanupDirectMessage = 64 $flagsGroupAckDirectMessage =96 $flagsGroupNackDirectMessage = 224 $cmdqueue = [] $currentcmd = 0 # to save state of command when receiving more data. $resetNext = 0 # used in Process IDLE to trap stalled responses. $savedstate = nil $dcequeue = [] $rerun = false $reported = false $X10HouseCodes = { '6', 'A', 'E', 'B', '2', 'C', 'A', 'D', '1', 'E', '9', 'F', '5', 'G', 'D', 'H', '7', 'I', 'F', 'J', '3', 'K', 'B', 'L', '0', 'M', '8', 'N', '4', 'O', 'C', 'P'} $X10UnitCodes = { '6', '1', 'E', '2', '2', '3', 'A', '4', '1', '5', '9', '6', '5', '7', 'D', '8', '7', '9', 'F', '10', '3', '11', 'B', '12', '0', '13', '8', '14', '4', '15', 'C', '16'} $X10CommandCodes = { '6', 'All Lights Off', 'E', 'Status = off', '2', 'On', 'A', 'Pre-Set Dim', '1', 'All Lights On', '9', 'Hail Ack', '5', 'Bright', 'D', 'Status=on', '7', 'Extended Code', 'F', 'Status Request', '3', 'Off', 'B', 'Pre-set Dim', '0', 'All Units Off', '8', 'Hail Request', '4', 'Dim', 'C', 'Extended Data(analog)'} $responseString = '<' + '/' + 'Response>' ############################## TEST Code below ################################# # testing Reading a devices Database # Common Insteon Device Memory Locations: # 0x0001 EESize - MSB of size of EEPROM chip in device # 0x0002 EEVersion - Firmware Revision number # 0x0020 EEOnLevel - Preset On-Level for lighting control # 0x0021 EERampRate - Ramp Rate for Lighting Control # 0x0030 EEX10BaseHouse - Base X10 House Code for device # 0x0031 EEX10BaseUnit - Base X10 Unit Code for device # # ALDB/L # Starts at the top of external serial eeprom and grows downward. # most limited-memory INSTEON devices, top of memory is 0x0FFF # Each Record is 8 bytes long, so the first record starts at # 0x0FF8, the second record starts at 0x0FF0 # # ALDB/L Record Format: # Record Control: 1 byte # Group: 1 Byte # ID: 3 Bytes HB MB LB # Data1: 1 Byte Link-specific data (eg. On-Level) # Data2: 1 Byte Link specific data (eg. Ramp Rates) # Data3: 1 Byte Link specific data (normally unused) # # Record Control Byte Bitmap: # 7: 1=Record in use, 0=Record is available # 6: 1=Controller of ID, 0=Responder of ID # 5: Product Dependant # 4: Product Dependant # 3: Product Dependant # 2: Product Dependant # 1: 1=Record has been used before, 0=High water mark (last record) # 0: Reserved #PLM cat 03 subcat 05 # param = {'Command' => 'StLnk', #'Parameter1' => '01', #Link code 0x01=controller #'Parameter2' => '8F' #All Link Group #} #$cmdqueue << param # param = {'Command' => 'CancelLnk'} #$cmdqueue << param #SndIns() # #Lets try the Assign to ALL-Link Group ### SUCCESS!!! #param = {'Command' => 'SndIns', #'Parameter1' => '0A', #HB #'Parameter2' => '8F', #MB #'Parameter3' => '5A', #LB #'Parameter4' => '0F', #Flags #'Parameter5' => '01', #Cmd1 #'Parameter6' => '8F' #Cmd2 #} # # #param = {'Command' => 'MngLnk', #'Parameter1' => '00', # Control Code #'Parameter2' => 'C2', #All Link Record Flags AKA Record Control Byte #'Parameter3' => '01', #All Link Group #'Parameter4' => '0A', #HB #'Parameter5' => '97', #MB #'Parameter6' => '0B', #LB #'Parameter7' => '01', #Link Data 1 ON-Level #'Parameter8' => '01', #Link Data 2 Ramp Rate #'Parameter9' => '00'} #Link Data 3 not used #$cmdqueue << param # # ## Test Device: LampLinc ID:0A.97.0B # Assign Test device to Group #param = {'Command' => 'SndIns', #'Parameter1' => '0A', #HB #'Parameter2' => '97', #MB #'Parameter3' => '0B', #LB #'Parameter4' => '0F', #Flags #'Parameter5' => '01', #Cmd1 #'Parameter6' => '01' #Cmd2 #} #$cmdqueue << param # # ############################## Real Code below ################################# log('MY DEVICE:' + device_.devid_.to_s) ################################################# #What I need to do and the order I need to do it. #done read PLM database #done get child devices #done read child devices configuration #done1 all child devices in the PLM database? #done if not, add their ID to the PLM database (new group numbers?) # get the status of each (child) device # compare the Database delta with the value stored in the configuration # Different? # read the child database # update configuration # check devices links to see if any are new # new link found, what to do?? send a message? # create new child device? # PING the new device and back to 1 ### # easiest way?.. create hash for PLM records # create hash for child devices is needed # (not needed if DBDelta is same) #reset the PLM $timeout = 3 #param = {'Command' => 'RstPLM'} #$cmdqueue << param #SndIns() #put IM in monitor mode.. param = {'Command' => 'SetCfg', 'Parameter1' => '40'} $cmdqueue << param SndIns() mainStart() ##children found... get the status of each child... #$children.keys.each{|c| # if c.length > 2 #filter out X10 for now # #pack insteon message here, and send it out! # # receive message in parsemessage and relay commands back in it. # insteonID = c.chomp.split('.') # param = {'Command' => 'SndIns', # 'Parameter1' => insteonID[0], # 'Parameter2' => insteonID[1], # 'Parameter3' => insteonID[2], # 'Parameter4' => '0F', #flags # 'Parameter5' => '19', #Status Request # 'Parameter6' => '00'} #not used. # $cmdqueue << param ## below gets the device Cat/SubCat/Firmware # param = {'Command' => 'SndIns', # 'Parameter1' => insteonID[0], # 'Parameter2' => insteonID[1], # 'Parameter3' => insteonID[2], # 'Parameter4' => '0F', #flags # 'Parameter5' => '10', #PING # 'Parameter6' => '00'} #not used. # $cmdqueue << param # # end # }