Paul's Programming Notes     Archive     Feed     Github

Reading RFID With Raspberry Pi (or any linux device) + Reader

I'm using the following Parallax USB RFID reader: http://www.parallax.com/Portals/0/Downloads/docs/prod/audiovis/28140-28340-RFIDreader-v2.2.pdf

First you will need to ensure you have PySerial installed by trying to "import PySerial" while running Python's IDLE. If you receive an error:
    Install PySerial:
      1. Install python's setuptools: apt-get install python-setuptools
      2. Install PySerial: pip install pyserial

    Once you have PySerial installed, open IDLE again and use the following code to see output from the reader:

    #! /usr/bin/python
    import serial
    import time
    ser = serial.Serial('/dev/ttyUSB0', 2400, timeout=1) # replace '/dev/ttyUSB0' with your port
    while True:
    response = ser.read(12)
    if response <> "":
    print "raw: " + str(response)
    print "hex: " + str(response[-8:])
    print "dec: " + str(int(response[-8:], 16))
    time.sleep(1)
    ser.close()
    view raw rfid.py hosted with ❤ by GitHub

    Why didn't ser.read(12) return the same unique identifier as what is written on the fob?:
    • If the key on the card says 30788590 and the reader returns 3501D5CBEE. The "1D5CBEE" part is the card number. Try going from the card number in DEC to HEX it in the windows calculator while it's in scientific mode if you don't believe me.

    "margin-left: auto;" and "margin-right: auto;" Not Working In IE8

    To get something centered within a div in IE8, it requires doing something unusual. I wasn't able to get the "display: block;" trick working. But this worked:

    #super-wrap { position: absolute; width: 100%; text-align: center; } 
    #page-wrap { position: relative; width: 970px; margin: auto auto;  }

    I had to do this to get the InfoGrid (http://css-tricks.com/examples/InfoGrid/) to center in IE8. The div with the ID of #page-wrap already exists, but the super-wrap div needs to be created outside of the page-wrap div.

    Using "nth-of-type" with IE8

    IE8 apparently doesn't support the CSS selector "nth-of-type".

    You can fix it by adding this script to your page: https://github.com/keithclark/JQuery-Extended-Selectors/blob/master/jquery-extra-selectors.js

    You will also need to add the following script to the bottom of your page (of course you will need to swap the numbers with your own):

    $("div:nth-of-type(1)").css("background", "#b44835");


    I used this to fix an IE8 compatibility issue with something called InfoGrid: http://css-tricks.com/examples/InfoGrid/

    Function To Find Largest UID Number In LDAP


     I got most of this function from http://bakery.cakephp.org/articles/UncleBill/2006/10/15/using-ldap-as-a-database. It will find all the uidNumbers, sorting them largest to smallest, then return the largest number.

    $ds = ldap_connect("localhost");  // assuming the LDAP server is on this host

        function findLargestUidNumber($ds)
        {
          $s = ldap_search($ds, "ou=people,dc=yourdomain,dc=com", 'uidnumber=*');
          if ($s)
          {
             // there must be a better way to get the largest uidnumber, but I can't find a way to reverse sort.
             ldap_sort($ds, $s, "uidnumber");

             $result = ldap_get_entries($ds, $s);
             $count = $result['count'];
             $biguid = $result[$count-1]['uidnumber'][0];
             return $biguid;
          }
          return null;
        }

    $largestUID = findLargestUidNumber($ds);

    LDAP shadowlastchange - Weird Date Format


    I'm working on a PHP script that adds an user to a directory using LDAP.

    Here's the formula required to get the date format that shadowlastchange uses:
    $unixTimeDays = floor(time()/86400);

    It's the days since the last epoch.

    Py2exe Issues

    When getting the directory of the file you're executing in python use the correct example:

    CORRECT: os.path.abspath(os.path.dirname(sys.argv[0]))
    INCORRECT: os.path.dirname(inspect.getsourcefile( lambda:None ))

    If you're using py2exe, the incorrect example will just give error messages.

    Outlook 2010 - Run a Script (Blank)


    Apparently a script does not equal a macro in outlook. When you're setting up a rule, you have the option to run a script. However, your macro will not show up in the script menu unless it has (MyMail As MailItem) as an argument. Example:

    Sub Save(MyMail As MailItem)

    SaveEmailAttachmentsToFolder "AgentReports", "html", "C:\Users\EBRNPAL\Documents\Agent Reports\Saved"

    End Sub

    Save Outlook Attachments Automatically With A Macro

    Source: http://www.rondebruin.nl/mail/folder2/saveatt.htm


    Sub Test()
    'Arg 1 = Folder name in your Inbox
    'Arg 2 = File extension, "" is every file
    'Arg 3 = Save folder, "C:\Users\Ron\test" or ""
    'If you use "" it will create a date/time stamped
    'folder for you in the "My Documents" folder.
    'Note: If you use this "C:\Users\Ron\test" the folder must exist

        SaveEmailAttachmentsToFolder "AgentReports", "html", "C:\Users\Paul\Documents\Agent Reports\Saved"

    End Sub

    Sub SaveEmailAttachmentsToFolder(OutlookFolderInInbox As String, _
                                     ExtString As String, DestFolder As String)
        Dim ns As NameSpace
        Dim Inbox As MAPIFolder
        Dim SubFolder As MAPIFolder
        Dim Item As Object
        Dim Atmt As Attachment
        Dim FileName As String
        Dim MyDocPath As String
        Dim I As Integer
        Dim wsh As Object
        Dim fs As Object

        On Error GoTo ThisMacro_err

        Set ns = GetNamespace("MAPI")
        Set Inbox = ns.GetDefaultFolder(olFolderInbox)
        Set SubFolder = Inbox.Folders(OutlookFolderInInbox)

        I = 0
        ' Check subfolder for messages and exit of none found
        If SubFolder.Items.Count = 0 Then
            MsgBox "There are no messages in this folder : " & OutlookFolderInInbox, _
                   vbInformation, "Nothing Found"
            Set SubFolder = Nothing
            Set Inbox = Nothing
            Set ns = Nothing
            Exit Sub
        End If

        'Create DestFolder if DestFolder = ""
        If DestFolder = "" Then
            Set wsh = CreateObject("WScript.Shell")
            Set fs = CreateObject("Scripting.FileSystemObject")
            MyDocPath = wsh.SpecialFolders.Item("mydocuments")
            DestFolder = MyDocPath & "\" & Format(Now, "dd-mmm-yyyy hh-mm-ss")
            If Not fs.FolderExists(DestFolder) Then
                fs.CreateFolder DestFolder
            End If
        End If

        If Right(DestFolder, 1) <> "\" Then
            DestFolder = DestFolder & "\"
        End If

        ' Check each message for attachments and extensions
        For Each Item In SubFolder.Items
            For Each Atmt In Item.Attachments
                If LCase(Right(Atmt.FileName, Len(ExtString))) = LCase(ExtString) Then
                    FileName = DestFolder & Item.SenderName & " " & Atmt.FileName
                    Atmt.SaveAsFile FileName
                    I = I + 1
                End If
            Next Atmt
        Next Item

        ' Show this message when Finished
        If I > 0 Then
            MsgBox "You can find the files here : " _
                 & DestFolder, vbInformation, "Finished!"
        Else
            MsgBox "No attached files in your mail.", vbInformation, "Finished!"
        End If

        ' Clear memory
    ThisMacro_exit:
        Set SubFolder = Nothing
        Set Inbox = Nothing
        Set ns = Nothing
        Set fs = Nothing
        Set wsh = Nothing
        Exit Sub

        ' Error information
    ThisMacro_err:
        MsgBox "An unexpected error has occurred." _
             & vbCrLf & "Please note and report the following information." _
             & vbCrLf & "Macro Name: SaveEmailAttachmentsToFolder" _
             & vbCrLf & "Error Number: " & Err.Number _
             & vbCrLf & "Error Description: " & Err.Description _
             , vbCritical, "Error!"
        Resume ThisMacro_exit

    End Sub