Download Latest Version LEDnotify.zip (60.2 MB)
Email in envelope

Get an email when there's a new version of LEDnotify

Home
Name Modified Size InfoDownloads / Week
LEDnotify.zip 2014-02-10 60.2 MB
A_ReadMe.txt 2014-02-10 62.1 kB
LEDnotify_Dream-Cheeky.gif 2013-06-28 427.1 kB
Totals: 3 Items   60.7 MB 0
*******************************************************************************
LEDnotify - USB LED alerter - V2.0.1
*******************************************************************************
Released under the GNU GPL (General Public License)
(c) Copyright 2013 Ian Dawson

Content:
   About LEDnotify
      Contact Me
      Known Problems
      More changes soon
      Release notes
      More about LEDnotify
   Licensing
   Installation notes
      Pre-requisites
      Installing LEDnotify code
      Getting the LED unit working
         Types of unit
         Dream-Cheeky USB WebMail-notifier
         Blink1 Smart LEDs
         AVR - Objective Development USB LED
         Useful linux commands
         Useful references
         Permission problems
         Device persistance problems
   Customisation notes
      dbus notes
      configuration files
   Starting LEDnotify
   Usage notes
   Security notes
   Cryptography Notice
   References
      Hardware
      Software
   Thank you...

   【ツ】

*******************************************************************************
About LEDnotify
*******************************************************************************
LEDnotify lights-up a USB attached LED lamp unit to alert on events - to keep
you informed, independently of your monitor being turned on.
I started with a Dream-Cheeky Webmail notifier - and now have two (to display
separate sets of alerts...).
I have also purchased a Blink1 type device - LEDnotify can now use that too
- from my initial playing : Its very bright, and adds more options to try.

LEDnotify features are intended to be flexible, selectable, extendible
and configurable.   See the notes below on installation, customisation, etc...

LEDnotify includes modules to check these for new mail/messages:
   * Gmail
   * Twitter (under development)

LEDnotify monitors for events - these maybe issues by applications such as :
   * Thunderbird email client (employing a dbus message plug-in)
   * Pidgin - for Instant Messages and Buddy activity
   * anything that can issue dbus messages
   * anything that can run the dbus-send command
   * see: www.freedesktop.org/wiki/Software/DbusProjects/

LEDnotify will cycle around any "outstanding" alerts - if these have different
LED colour assigned, then the LED unit will display them each in turn.

Alerts may optionally also be shown in any of these ways:
  * Ubuntu Indicator Applet icon - this sits on the top bar in Ubuntu, and
    appears     as the LEDnotify coloured envelope icon - when an alert occurs,
    this is high-lit with a while background.  See notes on Ubuntu version,
    and menu usage below.
    The Indicator Applet menu also provides other options for managing
    LEDnotify - click on the icon to see the menu.

  * Notification messages - Ubuntu displays a message "bubble" top right, that 
    fades away after a moment...

  * Pop-up messages in a small window with an "OK" button to dismiss them.
    These use bash & zenity scripts (LEDnotify_*.sh)

  * Play a sound file.

Gmail checking :
- IMAP SSL is employed for secure access to Gmail.
- Encryption may be used by LEDnotify when it (optionally) saves your id & 
  password.  This allows LEDnotify to restart the polling if a problem occurs,
  without you needing to re-enter your password.  It will always require
  the password if LEDnotify is restarted - there are options on how this is done.
- The polling task checkpoints which emails it has seen, so will pick up from
  where it left off.

LEDnotify keeps track of any long running processes it starts (such as the 
polling processes for Gmail and Twitter, and will restart them if they
stop unexpectedly.


Contact Me
===========
For questions, feedback, suggestions, criticism and everything else, feel free
to contact me:
    author: Ian Dawson
    gmail:  irdroid3@gmail.com
    website http://sourceforge.net/projects/lednotify/
            http://sourceforge.net/p/lednotify/wiki/Home/
    blog:   http://irdroid3.wordpress.com/about/

Enjoy...
   Ian.


Release notes
==============
   * See the file: A_Release-notes.txt

Known Problems
===============
   * Not guaranteed bug free...
   * Not all features you see in the conf file are fully working yet - I try and
     mark those as "TBA" - but I do keep adding more TBAs...
   * Any reference to "???" is like TBA = room for future development...
   * Pidgin IM messages are triggering the following warning message - I think this
     might be to do with LEDnotify listening to dbus messages from Pidgin, but I
     have yet to find a fix - AND it does not appear to cause a problem...   ==>
     (Pidgin:31827): LIBDBUSMENU-GLIB-WARNING **: Trying to remove a child that doesn't believe we're it's parent.
   * Please check if calendar events are triggered at the correct time - see notes
     on timezones/daylight-saving (note#001)
   * See notes on USB bus/dev identifiers changing if a device is unplugged (note#02)
     - The "Assign Unit" GUI needs "*" adding (TBA)

More changes soon
==================
   * LEDnotify is under active development - you will see "TBA" in this document
     and in the config files - these are areas yet to be fully developed or added.
   * Please feedback to me to have an influence on what gets worked on and how...


More about LEDnotify
=====================
Most of the code is in Python, with some optional scripts, and a program to 
drive the LED unit.

This project was started off of from Dennis Schulze's dBird notifier project
- see the "References" section below, but keeps growing with my experience...

LEDnotify modifies the set-led program (via the dBird project, from Objective
Development) to drive the USB LED unit.  This has been modified to drive
a Dream-Cheeky WebMail-notifier (see References).
The changes were made for the different "Vendor-ID" & "Product-ID" the 
Dream-Cheeky unit has from the Objective Development AVR unit.
LEDnotify has an option for customising which program is used to drive this
sort of unit.

Where used, the Thunderbird and Pidgin applications need to be configured
for your email and IM accounts.
Thunderbird maybe launched by LEDnotify.


*******************************************************************************
Licensing
*******************************************************************************
Released under the GNU GPL (General Public License)
(c) Copyright 2013 Ian Dawson
See the file included with LEDnotify : gpl.txt

This work is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE.

I make no apologies for using code from other projects - they are all covered
by Public Licensing.   But I would like to acknowledge their input - please
see "References" section.


*******************************************************************************
Installation notes
*******************************************************************************
Pre-requisites
==============
- LEDnotify needs these packages -
  ??? NEEDS CHECKING AND UPDATING... coming soon
  ??? How many come with Ubuntu OR need adding???
		Notes = #1 pre-installed with Ubuntu (12.04)
                #2 seperate package needs to be installed

     Python (2.7.3)
     python-time
     python-notify
     python-dbus
     pyGTK,
     # python-twitter - removed, as it lacks the oauth_dance module
     ??? python-simpleJson	- ??? this is not needed !!!
     python-tk 			- for password prompting (aka tkinter)
     python-pmw         - Python MegaWidgets - for some GUI elements
     python-imaging-tk  - for GUI png images
     ??? - liburl, liburl2
     python-oauth or python-oauth2 for logging onto twitter
       - not used if not needed...
     python-usb (aka pyusb)
     python-udev (aka pyudev) - maybe - testing with this... (???)
     threading          - used for the alerts GUI (#1)

     dbus-send command must be installed, IE: /usr/bin/dbus-send
		- does this come with Ubuntu ???

     python-psutil - help LEDnotify cleanup all other processes it started
            - If a version => 0.5.0 is used then LEDnotify will use it to kill
              all processes, otherwise it will try and directly kill the
              processes it knows about.

     * If twitter polling is required:
        ubuntu : install "python-setuptools" - needed by pip
        ubuntu : install "python-pip" to install twitter
        sudo pip install twitter
        ubuntu : install "python-request"

     * If pidgin alerts are required:
        Install : html2text
         - this is shipped with LEDnotify
         - it is used to format some pidgin messages
         - see reference to Aaron Swartz's html2text tool below

     * For email via Thunderbird, the Thunderbird dbus extensions/plug-in is
       needed see:
		http://www.oelerich.org/dbus-signals-from-thunderbird-new-extension/
		https://github.com/janoliver/thunderbird-dbus-sender
           Copyright (c) 2012 Paul Neulinger, Jan Oliver Oelerich
		See the README.md file for installation instructions.
        These are included in LEDnotify in the Thunderbird-dBus folder.

     * If Google Calendar (gcal) polling is required:
        Ref: https://developers.google.com/gdata/articles/python_client_lib
        ElementTree is required by the Gdata code.
        If you are using Python version 2.5 or higher, you won't need to install
        ElementTree since it comes with the Python package.
           - See: http://effbot.org/zone/element-index.htm
        Installing the gdata-python-client:
           - See the google webpage refered to above.
           - I used the gdata-2.0.18 package and ran the command (in that dir):
             $ sudo python setup.py install
		Python V2 needs the pytz package to aid with timezones (I think V3
        might fix this?!) - on Ubuntu, install :
           - python-tz : Python version of the Olson timezone database

- LEDnotify was developed and tested with:
      Ubuntu 12.04 - untested on other levels, or Windows.
             It looks like Indicator Applets do not work well on versions prior
             to 11.10 ! - I have seen a rumor that this is broken after 12.04
      Python 2.7.3
      psutil-0.7.1 : (Optional)
                     it starts when it is shutdown.
                     http://code.google.com/p/psutil/
                     http://psutil.googlecode.com/hg/INSTALL
                     cd xxx; sudo python setup.py install
                     Prereq: install python-dev package 
                      - this seems to suggest auto updates will not be allowed
                        for lots of other packages though???
                     prereq = http://code.google.com/p/psutil/issues/detail?id=155

- LEDnotify.conf located through:
     the path in the $XDG_CONFIG_HOME environment variable
     the users $HOME directory, and then /.config/ within that
     or in LEDnotify's current working directory.

- LEDnotify writes some files to /tmp :
     LEDnotify.gpw : your Gmail id & password encrypted (see notes)
     LEDnotify.gck : A checkpoint file of the last msgid LEDnotify saw - to try
                     and avoid missing any... especially over restarts
     LEDnotify.uck : remembers GUI updates to LED unit config (USB setup)


Getting the USB unit working
============================
Types of unit
-------------
This is a summary list of the hardware that LEDnotify was written for.
The LEDnotify.conf file holds the configuration that defines how these are used.
See the more detailed section on each of these below.
See the References section at the bottom of this document on these.
See note#02 on USB Device persistance problems.

* AVR - Objective Development USB LED
      I have not seen one of these, but it looks like the set-led program I took
      from Dennis Schulze's dBird notifier project should work ok.
      The set-led program for driving the Dream unit was based on this one - the
      commands to drive this are fairly simple, and translate well to the LEDnotify
      alerts in the conf file.
      This is a USB device with Vendor-Id=5824, & Product-Id=1500.

* Blink1 Smart LEDs
      My second LED unit. This has more function than the Dream unit, and seems
      to be brighter (without a case admittedly).
      Blink's blink1raw program drives this unit well, and has a richer command
      set than the Dream unit.
      LEDnotify has two definitions for this unit: "ThingM" will use the simple
      "r g b" alert definitions that the Dream unit uses, and the "BlinkM"
      definition employs the native blink1raw command set in the alert definitions.
      This is a USB device with Vendor-Id=27b8, & Product-Id=01ed.

* Dream-Cheeky USB WebMail-notifier
      My first LED unit...  A neat little USB attached box.
      This is a USB device with Vendor-Id=1d34, & Product-Id=0004.

* More ?
      I am more than happy to look at other devices - contact me and tell me more...


THIS IS STILL A MYSTERY TO ME - My Dream units (2x) both work fine, but I had
to unplug replug them in the first time, to get the scripts to update the
permissions...    Any feedback on this is welcome...

I have found this - http://ubuntuforums.org/showthread.php?t=1610142
It said to power off (TOTALLY!), wait 5 mins, then re-boot...  Well - it did
work for me - a quick reboot to apply Ubuntu maintainance did not show my
Dream Cheeky units in the lsusb listing - even running the udevadm trigger
commands did not get them - but unplugging and replugging the USBs did work...
A power down; a coffee; and a reboot - and it all came up fine...
Nasty USB...   !?!?!?!?!?!?!?


Dream-Cheeky USB WebMail-notifier
---------------------------------
for the following, see the files packages with LEDnotify in the Dream-USB-LED directory:
      Sample_99-usblamp.rules
      symlink-usblamp.sh
      rc.local

By default with Linux - when the lamp gets plugged in, it is only usable for the root user.
To fix this, a udev rule is needed:

Add the following two lines (note the SUBSYSTEM line is all one
line) to the file : /etc/udev/rules.d/99-usblamp.rules :

# Dream-Cheeky USB Webmail notifier:
SUBSYSTEM=="usb", ATTRS{idVendor}=="1d34", ATTRS{idProduct}=="0004", MODE="0666", RUN+="/etc/udev/symlink-usblamp.sh %k" , SYMLINK+="LEDnotify-%k"

This will run a shell script whenever an usb lamp is plugged in.
  
Now create that shell script (/etc/udev/symlink-usblamp.sh) and make it executable:
(copy the file: ./LEDnotify/DREAM-USB-LED/symlink-usblamp.sh)

NOTE: When booting the computer with the lamp attached, the rule does not get called.

BUT: You may work around this problem by putting the following line into your
/etc/rc.local file:

/sbin/udevadm trigger --action=change

If you know how to fix this properly without messing with rc.local, please tell
 me and Christian Weiske - see references on udev).


Blink1 Smart LEDs
-----------------
See the Blink-USB-LED folder packaged with LEDnotify - this contains the blink1raw
program that LEDnotify uses to drive the USB device.

Add the following two lines (note the SUBSYSTEM line is all one
line) to the file : /etc/udev/rules.d/99-usblamp.rules :

# BlinkM/ThingM USB LED unit:
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="27b8", ATTRS{idProduct}=="01ed", MODE="0666", RUN+="/etc/udev/symlink-usbblink.sh %k", SYMLINK+="LEDnotify-%k"

Now create that shell script (/etc/udev/symlink-usbblink.sh) and make it executable:
(copy the file: ./LEDnotify/DREAM-USB-LED/symlink-usbblink.sh)

NOTE: When booting the computer with the lamp attached, the rule does not get called.

BUT: You may work around this problem by putting the following line into your
/etc/rc.local file:
sudo /sbin/udevadm trigger --action=change


If you know how to fix this properly without messing with rc.local, please tell
 me and Christian Weiske - see references on udev).


AVR - Objective Development USB LED
-----------------------------------
I have not seen one of these, but it should work like a Dream (pun intended).
As supplied, LEDnotify's set-led program is for the Dream unit - you will need
to copy the set-led program from the AVR-USB-LED sub-directory into the LEDnoify
directory OR you will have to use the unit definition in the LEDnotify.conf
file to specify the vid&pid - EG:
   #        type,bus,dev,vid#,pid# - see lsusb
   @mail  = AVR,00?,00?,5824,1500
This should also support multiple AVR units,or a mix of Dream and AVR units !?!?!


Useful linux commands
---------------------
lsusb
 - List attached USB devices
      EG: Bus 001 Device 005: ID 1d34:0004 Dream Cheeky Dream Cheeky Webmail Notifier
          Bus 001 Device 006: ID 1d34:0004 Dream Cheeky Dream Cheeky Webmail Notifier
 - also see about the usb-ids file below, to update the device descriptions
 - try:
   lsusb -v | grep -E '\<(Bus|iProduct|bDeviceClass|bDeviceProtocol)' 2>/dev/null

the udev rules setup aliases, which help to see that they ran, look for :
ls -al /dev/LEDnotify*

the script triggered by the udev rule for the Dream-Cheeky creates log files in /tmp :
ls -al /tmp/usblamp-*.log

use the find command to look for Dream-Cheeky units:
 - find /sys -name green -ls
      EG:  23641    0 -rw-r--r--   1 root     root         4096 Sep 10 16:03 /sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.5/1-1.5:1.0/green
           20777    0 -rw-rw-rw-   1 root     root         4096 Sep  9 08:18 /sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.6/1-1.6:1.0/green

list the usb devices under /dev :
   ls -al /dev/bus/usb/001/
      EG: crw-rw-rw- 1 root root 189, 4 Sep 10 16:00 005
          crw-rw-r-- 1 root root 189, 5 Sep 10 15:38 006


Useful references
-----------------
* The list of USB VID/PIDs is maintained at : http://www.linux-usb.org/usb-ids.html

* Use the command "update-usbids" to download the current version onto your system.

* Linux uses this file to detail the lsusb output etc. See: /var/lib/usbutils/usb.ids

* The latest version of this file can be found at : http://www.linux-usb.org/usb.ids

* A vesrion of this file can be found in the LEDnotify package in the sub-directory:
  ./Dream-USB-LED/usb.ids


Permission problems
-------------------
An example of what you might see:
   run the command:
      ./set-led set 100 0 0

   The output will look like this:
      libusb:error [op_open] libusb couldn't open USB device /dev/bus/usb/001/005: Permission denied.
      libusb:error [op_open] libusb requires write access to USB device nodes.
      Could not open USB device.
      RC=fffffffd
      RC=LIBUSB_ERROR_ACCESS
      Segmentation fault (core dumped)

Device persistance problems (note#02)
---------------------------
Some USB LED units (EG: the Dream-Cheeky) are identified by their USB Bus/Dev
numbers.  When USB devices are unplugged/replugged, or when the PC is restarted,
the Dev identifiers (and even the Bus id) may change.  This is more likely if
the unit is plugged into a USB hub that may be switched off (EG when integrated
into a monitor for example).
I suggest one of these unit is configured using the generic ("*") id, such that
it is then driven regarless of the Bus/Dev.
TBA : I have yet to add code to LEDnotify to better cope with this...
Devices that are identified by their /dev/hidraw* path (EG the Blink units)
appear to persist across a power off - but obviously will not work whilst
powered off.


Installing LEDnotify code
=========================
  - create a folder, EG
    mkdir /home/yourname/LEDnotify

  - copy the LEDnotify files in that directory

  - edit the configuration files (see Customisation notes below):
    gedit ./LEDnotify.conf
       (don't forget to save your changes before closing gedit)
    gedit ./LEDnotify_gmail_poll.conf
       (don't forget to save your changes before closing gedit)

  - check permissions ???

  - Start LEDnotify - see "Starting LEDnotify" below.

  - Checkout the sample scripts: test-mail.sh, test1.sh, and test2.sh for
    triggering alerts - try these from the shell command line:
       cd <location-of-LEDnotify-code>
       ./test-mail.sh      # Gmail alerts
                           #   - Note: this sets the LED alerts, but does not
                           #     trigger the sounds, as that is done by the
                           #     poller task.
       ./test1.sh          # LEDnotify alert _test1
       ./test2.sh          # LEDnotify alert _test2


*******************************************************************************
Customisation notes
*******************************************************************************
dbus notes
==========
The dbus names and paths are set by LEDnotify by default, but may be overridden
in the conf files - see the "dbus" and "dpath" attributes below.

LEDnotify listens to "net.sourceforge.lednotify" on the dbus for alerts specific
to it - either alerts raised externally to it (see [LEDlisten] alerts), or by
the various plugins (EG the Gmail poller).
It also listens to other applications, where configured to do so, EG: Pidgin IM
client and Thunderbird email client.

The LEDnotify alert signals detail depends on its use.  The [LEDlisten] alerts
only require one argument that relates to the alert name in the LEDnotify
conf file.  Another specific alert flags errors to the user, and this passes
the argument "*error*" to LEDnotify

configuration files
===================
These configuration files are read by LEDnotify at startup:
    - LEDnotify.conf               - the main configuration file
    - LEDnotify_poll_gmail.conf    - for more gmail settings
See the sections below for more on these.

- LEDnotify tries to check critical options in the conf file, but you need to
  check them...
  See the sample LEDnotify.conf file supplied - and the comments within...
  Also see the notes on the conf file options below,
     (under "internal data structures")

- Thunderbird notifier Add-on:
   LEDnotify has been tested with this plug-in:
      http://www.oelerich.org/dbus-signals-from-thunderbird-new-extension/
      https://github.com/janoliver/thunderbird-dbus-sender
   Note: other plugins may use differing dbus options (EG the signal name),
         so you may need to change these in the conf file.

- USB LED notifier unit:
   LEDnotify has been developed with this unit:
      Dream-Cheeky WebMail-notifier (VID=1d34/PID=0004)
         http://www.dreamcheeky.com/webmail-notifier
         see: ./LEDnotify/Dream-USB-LED/set-led program, and the notes on
              this in the [set-led] configuration section below.
   Other units I know of:
      Objective Development (VID=5824/PID=150x)
      see: ./LEDnotify/AVR-USB-LED/set-led

- References to "current working directory" mean the path to the currently
  running LEDnotify_Engine code.

LEDnotify configuration file - LEDnotify.conf
=============================================
  * See the supplied LEDnotify.conf file for more notes...

  * LEDnotify.conf configuration file located by -
     $XDG_CONFIG_HOME environment variable
     or in ~/.config/ (the userd $HOME directory, and then /.config)
     or in current working dir

  * The following are allowed in the path definition for icon & sound files:
        a prefix of "~" will employ the path in $HOME
        a prefix of "." will employ the path to the current working directory.

  * The Ubuntu Application Applet icon and menu are only enabled if at least
    one section defines "indicate = True".
    Also read about the [menulabels] section of the config file.

  * The LEDnotify.conf configuration file is parsed by the Python configparser 
    library.  The file consists of sections, each started by a [section] header
    and followed by "<attribute-name> = <attribute-value>" settings.

    Some sections are mandatory - IE [LEDnotify] has various setting at the top
    of every config file.
    See the list of section headings below.
    Some section names maybe suffixed to allow multiple of that type to be used -
    these are denoted below with "(with optional suffix)" below.
    Suffixes must start with a hyphen ("-"), EG gmail-test

    [LEDnotify]
     - Settings for the main LEDnotify program.
     - Attributes for this section only :
       * plugins     : Lists the sections to enable.   Section names here are then
                       defined below with their names enclosed between "[" and "]".
       * timer       : The cycle time (heartbeat) in seconds for the LED unit to
                       cycle alerts.
                       Note that an internal "idle timer" is set to save cpu/power
                       when there are no alerts, or just a single alert outstanding
                       - this is set as half smallest other timer = value (or
                       10*heartbeat if bigger).
       * logging     : Currently this automatically logs to stdout and a log file.
       * diag        : The message level to stdout and for popup messages to the user.
                       Recommend this is set to "Warning" or "Alert" for more detail.
                       Options = debug | info | alert | warning | error | critical
       * logdiag     : (optional - defaults to diag) - the message level written to
                       the log file on disk.
       * poperr      : sets the alert level for popup messages - defaults to Warning
                       Recommend "Warning" or "Alert"
       * logviewer   : program called when the "View Log" menu item is used.
       * logsize     : How large the log file can grow to.
                       Currently LEDnotify will create up to 3 more generations of
                       log file if this size if exceeded
                        - suffiex with ".1"/".2"/".3".
       * log         : log file path and name.
       * AppTitle    : Indicator Applet Title (blank for just icon)
       * MenuTitle   : Indicator Applet menu-title line (optional)
       * icon-active : Normal Indicator Applet icon.
       * icon-alert  : Indicator Applet icon when an alert is outstanding.
       * syspop      : is for a Popup window for for the duration, allowing
                       LEDnotify shutdown
                       This nolonger has code to reset the LED units on shutdown (TBA)
       * authtype    : How LEDnotify manages passwords for other plugins -
                       master  - LEDnotify asks the user for a password at startup
                                 and uses that to encrypt passwords for all
                                 plugsins that use a password.
                                 Plugin passwords are saved across sessions, and only
                                 the master password is prompted for at startup.
                       session - LEDnotify creates a random password each time it
                                 starts up, and uses that to encrypt plugin passwords.
                                 All passwords will be requested when LEDnotify
                                 starts.  (This was the default prior to V2.0.0)
                       * see the id/pw options in the config files for the plugin
                         EG LEDnotify_poll_gmail.conf

    [set-led]
     - Settings for the Dream-Cheeky USB Webmail Notifier LED unit
       * default   : the default alert colour (R G B) if an alert is missing.
       * units     : a list of unit names that may be refered to in the alerts in
                     later sections.  EH "units = @mail,@diary"
                     If no units are listed then a default of "-DFLT-" is set;
                     this is also set as the default value for any  section that
                     does not specify a unit name for it's alerts.
                     Each unit is then described here with the following keyword/attrubutes:

       * @xxx      : these names must start with an "at" ("@") character, and
                     each unit has these attributes:
                        <type>,<bbb>,<ddd>
                     where:
                        unittype is LEDnotify type identify - see below
                        bbb      is the Bus number
                        ddd      is the Device number of the unit.

                     The output of the lsusb command gives these values, EG:

                        Bus#    Device#     VID# PID#
                         ===        ===     ==== ====
                     Bus 001 Device 014: ID 1d34:0004 Dream Cheeky Dream Cheeky Webmail Notifier
                     Bus 001 Device 015: ID 1d34:0004 Dream Cheeky Dream Cheeky Webmail Notifier

                     A "generic" address may be specified using an asterisk ("*") for the
                     bus and dev addresses.  LEDnotify will then drive the first unit
                     it finds of each type.  This relies on the Dream and Blink drivers
                     providing that function.  Also see note#02 on device persistance.
                     TBA : The "Assign Unit" GUI needs "*" adding...

                     Note: LEDnoify checks the bus/dev settings at startup and prompts the
                     user if the USB settings differ.  LEDnotify will also remember the new
                     user provided settings between sessions - overriding the conf values.
                     (Delete the /tmp/LEDnotify.uck file to reset that).

     * -unittype   : these must start with a hyphen ("-") character,
                     and define the USB units Vendor-Id,Product-Id values 
                     (see the lsusb command), and the program name LEDnotify used
                     to drive the unit.
                     The unittypes supported by LEDnotify (so far), are:
                     -Dream   - Dream-Cheeky USB device
                     -BlinkM  - use full Blink commands
                     -ThingM  - translate "r g b" alerts (ala Dream) for a Blink LED
                     -AVR     - OBJECTIVE DEVELOPMENT USB device

     Notes on values in the alert-name perms in the following sections -
        * The alert values depend on the type of alert unit being used.
              -Dream,-ThingM,-AVR : all use the alert format:
                  <r> <g> <b>
                    * Where <r> is the red light value, <g> for green, and <b>
                      for blue.  Each being a number in the range 0 - 255.
              -BlinkM  - use full Blink commands see the LEDnotify subdirectory -
                         Blink-USB-LED/README.txt file.  LEDnotify passes the alert
                         value as the end "arg" to the blink1raw command -
                              =R,G,B,t       -- fade to color
                              :R,G,B         -- set color (now)
                              @step:R,G,B,t  -- set step
                              +step          -- start playing at step
                              -[step]        -- stop playing at step (default zero)
                              %              -- clear all steps
                              _              -- turn off
                              _t             -- fade off

    [xxx]
     - Settings that apply to most other sections :
       * start     : Used to monitor for tasks that are required by the relevant section
                     for alerting to work.
                     EG: pidgin, thunderbird, and LEDnotify polling tasks.
                     Each of these will be shown in the Tools submenu too.
       * stop      : True/False = stop this app when you stop LEDnotify alerting
                     on it.  Usually only for apps like pidgin or thunderbird, where
                     you might want it started, but only ever stopped manually.
       * popup     : Issue  popup dialog box on an alert = true/false
       * popclient : Stat a program when an alert is issued = true/false
       * launch    : The program to start when an alert is issued.
       * notify    : Use Ubuntu Notification "bubbles" on alerts = true/false
       * indicate  : Use the Ubuntu Indicator Applet menu to show alerts = true/false
       * escalate  : Only allow one alert active for this section at a time. An alert
                     will turn override any alerts lower in the list of alerts for this
                     section = true/false
                     So the LED will not flash between two or more alerts for the same
                     section - only the highest (first in the list) will be illuminated.
                     But - all alerts are still shown by the Ubuntu Indicator Applet.
                     This is intended to save on power, but more to be less annoying...
                     If there are multiple alerts for a section and one is reset via the
                     Indicator Applet menu, then LEDnotify will enable the next alert down,
                     and the LED will be illuminated accordingly.
       * icon      : Path to the icon file to use : EG: ./icons/gmail.png
                     see note on paths above.
       * retries   : The number of times LEDnotify will restart a polling task
                     (EG for Gmail) if it has crashed unexpectedly - after that
                     the task is disabled, pending the user restarting it from
                     the Indicator Applet Tools menu (or LEDnotify being stopped
                     and started).
       * dbus      : Needed for some alert types that listen to the dbus
                     These are usually set by default by LEDnotify, EG:
                        LEDnotify:            dbus = net.sourceforge.lednotify
                        pidgin:               dbus = im.pidgin.purple.PurpleInterface
                        thunderbird [email]:  dbus = org.mozilla.thunderbird.DBus
                     So these are optional, unless you need to override one, or use
                     one LEDnotify does not have (yet -> please feedback to me).
       * dpath     : Needed for some alert types that listen to the dbus
                     These are usually set by default by LEDnotify, EG:
                        LEDnotify:            dpath = /net/sourceforge/lednotify
       * timer     : How often to check; in seconds (600 = 10 minutes)
       * sound	   : If specified, the sound file will be played for an alert.
                     see note on paths above.
       * myalerts  : The alert names for this section EG : _email,_label,_other
                     The "_" prefix is just a naming convention to help destinguish
                     the alert names from the other settings, and prevent conflicts.
       * menutags  : These refer to attribute names in the [menulabels] section
                     EG: 004 could refer to : "004 = gmail:messages" for [gmail] "_email" alerts
       * _xxx      : Alert-name for each alert in the "myalerts" list above, defines
                     the LED colours to use.
                     * See the notes on alert values in the [set-led] section above.
                     The "_" prefix is just a naming convention to help destinguish
                     the alert names from the other settings, and prevent conflicts.
                     EG: "_email    : 30 0 0" = The mix of Red:30 Green:0 Blue:0
       * function  : for 

    [menulabels]
     - defines the order and menu item text for each entry - this is linked to
       the relevant alert with the relevant sections menutags attribute.
     - Note, sections maybe added here, even if they are not run at start-up
       due to the [LEDnotify] sections plugin attrubute.

    [messages]
     - TBA for national language support

    [pidgin]
     - Settings for alerting from the pidgin IM client.
     - See pidgin below in the usage section

    [LEDlisten]
     - Alerts sent to LEDnotify via the dbus, EG using the "dbus-send" command.
       The alert names are passed in the dbus message and mapped directly to
       the alert-name ("_xxx") in this section.

       The following python code fragment should achieve this:
           LEDNIFACE = 'net.sourceforge.lednotify.engine'
           LEDNPATH = '/net/sourceforge/lednotify/engine'
           x = call(["/usr/bin/dbus-send","--session",\
               "--dest=%s"%LEDNIFACE,"--type=method_call",LEDNPATH,\
               LEDNIFACE+".LEDlisten","string:\"_alert-name\""])
        - Where "_alert-name" is the alert label in LEDnotify.conf file.

    [gmail] (with optional suffix)
     - Gmail/Googlemail alerting settings
     - Also see notes on the LEDnotify_poll_gmail.conf file below.

    [gcal] (with optional suffix)
     - Google Calendar alerting settings
     - Also see notes on the LEDnotify_poll_gcal.conf file below.
     - Also see the supplied file : ../Dream-USB-LED/Calendar_mask.odt for
       converting a Dream Cheeky Webmail notifier into a Calendar notifier.

    [email]
     - Alerts from Thunderbird email client - this required a plugin to be
       added to Thunderbird (see installation notes above).
     - Other email clients might be configured - more details later : TBA
     - A more generic imap/email poller being written : TBA

    [twitter] (with optional suffix : TBA)
     - Twitter alerting settings - yet to be fully implemented (TBA)

    [external] (with optional suffix : TBA)
     - Settings for custom plugins.
     - TBA - untested
     - External tasks may be started by LEDnotify, and other dbus messages may
       be configured.
     - External tasks may alert LEDnotify in either of two ways, through 
       dbus messages:

       1) LEDnotify listens for alerts that trigger the LED to be illuminated.
       The following python code fragment should achieve this:
           LEDNIFACE = 'net.sourceforge.lednotify.engine'
           LEDNPATH = '/net/sourceforge/lednotify/engine'
           x = call(["/usr/bin/dbus-send","--session",\
               "--dest=%s"%LEDNIFACE,"--type=method_call",LEDNPATH,\
               LEDNIFACE+".Manager","string:\"_alert-name\""])
        - Where:
          * "_alert-name" is the alert label in LEDnotify.conf file.  EG, see
            "_test1" in the supplied conf file.
          * Manager is the name of this config section, EG [Tester] Manager = Tester

       The Linux dbus-send command could be run from other programs, shell scripts etc:

       dbus-send --session --type=signal --dest=net.sourceforge.lednotify /net/sourceforge/lednotify net.sourceforge.lednotify string:"_alert-name"


??? test this ???






       2) LEDnotify listens for Error alerts -
       Here is a python code fragment for alerting LEDnotify to an error:
           LEDNIFACE = 'net.sourceforge.lednotify.engine'
           LEDNPATH = '/net/sourceforge/lednotify/engine'
           x = call(["/usr/bin/dbus-send","--session",\
               "--dest=%s"%LEDNIFACE,"--type=method_call",LEDNPATH,\
               LEDNIFACE+".Error","string:\"xxxxx\""])
       The xxxxx will be displayed in an error message by LEDnotify.
       The enclosing quotes are "escaped" with "\", and are required.
       If the message string is empty (IE ,"string:\"\""]) then LEDnotify
       will not display an error.  The point of this is to have LEDnotify
       run the heartbeat routine and check for any missing tasks, etc.
       Also see the LEDnotify "_error" alert - that is used to indicate LEDnotify
       falures.


LEDnotify Gmail configuration file - LEDnotify_poll_gmail.conf
==============================================================
Googlemail/Gmail may be monitored by the LEDnotify_poll_gmail task.
See the [gmail] section if the LEDnotify.conf file.

  * LEDnotify requires IMAP SSL to access Gmail.  You may need to enable this
    on your Gmail account, See:
    https://support.google.com/mail/troubleshooter/1668960?hl=en&rd=2

  * There are various references to "label" and "box" - these are the same thing.
    Google label emails, but they can be then treated as folders or boxes...

  * LEDnotify only "peeks" at mail, so should not effect the "read" flags on Gmail.

  * Gmail alerts are further configurable with the LEDnotify_poll_gmail.conf
    file.  This file is divided into sections (denoted by a label between a
    "[" and "]" symbols.

  The first label of [LEDnotify] is for the general LEDnotify settings to poll
    Gmail:
      id        - userid
      pw        - password option:
                     <file>    : uses the pwfile option below.
                                 * The id parm above is OPTIONAL (see pwfile)
                     <prompt>  : a popup panel is used to prompt for the password
                                 * The id parm above is REQUIRED.
                     <module>  : uses the pwmodule option below.
                                 * The id parm above is OPTIONAL (see pwmodule)
                     - anything else is treaded as the password string to use...

      pwfile    - a file containing either the userid and password or just the
                  password (in which case the id parm above is REQUIRED). 
                  (untested! TBA)
      pwmodule  - a module that returns the userid and password or just the
                  password (in which case the id parm above is REQUIRED).
                  (untested! TBA)
      timer     - poll interval in seconds
      encrypt   - { NONE | AES | ARC2 | Blowfish | CAST | DES | DES3 | IDEA | RC5 }
				  Default = NONE
                  Also see "Cryptography Notice" below.
      keeppass  - if keeppass = true, then LEDnotify will save a "<prompt>" password
                  in a temp file - this will be encrypted using the "encrypt" type
                  encryption.
                  NOTE: if  encrypt=NONE and keeppass=true, the password is kept in
                  plain un-encrypted text in the temp file on disk.
                  Also see the LEDnotify authtype setting and how it could effect this.
      dbus        used to issue dbus messages - LEDnotify listens for: "com.gmail.DBus"
      dpath       "    "  "     "    "          "         "       "    "/com/gmail/DBus"
      url         Web address for Gmail SSL logon - imap.gmail.com
      diag        The message level to stdout and for popup messages to the user
                  Recommend this is set to "Warning" or "Alert" for more detail.
      logdiag     (optional - defaults to diag) - the message level written to the log
                  file on disk.
      maxerr

  The rest of the section [labels] match Gmail "labels"
  EG [Inbox] in the config file matches any emails labeled "Inbox" - this is googles
  standard label for new emails.  Any label in Gmail may be matched by LEDnotify.
  See the Gmail help pages for more on the use of labels.

  For each label, alerts are categories as one of the following:
      alert = 

         _peremail  - issue a detailed alert (sender & subject) for each new email
                      messages for that label.

         _label     - issue a single alert for new emails with this label.
                      IE a total-new-count for the emails with labels listed in
                      the LEDnotify_poll_gmail.conf file.

         _lab-xxx   - where xxx is the Gmail label name - allowing separate
                      alerts by label name.

         _totother  - issue a single alert for new "other" emails - IE emails not
                      covered by the first two types.  This alerts with a count of
                      "other" new emails with labels not alerted on by "peremail" or
                      "perlabel" - BUT only new emails covered by the Gmail labels
                      LEDnotify checks for - IE a total for all [section/labels]
                      with "alert = total"

          _perrest  - issue a detailed alert (sender & subject) for each new email
                      message for this label, that did not get alerted on by any of
                      the above types.  EG for [INBOX] emails not selected in any
                      alert above.

  urgency : (TBA & untested)
        urgencies['low']      = pynotify.URGENCY_CRITICAL
        urgencies['normal']   = pynotify.URGENCY_NORMAL
        urgencies['critical'] = pynotify.URGENCY_CRITICAL


*******************************************************************************
Starting LEDnotify
*******************************************************************************
LEDnotify may be started is a couple of ways -
1) open file explorer and click on one of the programs below.
 
2) open a terminal, change directory to the LEDnotify folder, or 
   specify a full path to one of the programs below.
   (running in a terminal, you will see more messages - useful if you
    need to diagnose a problem).
   EG:
       cd <your-path>;./LEDnotify.py

   The programs : 
      * LEDnotify.py - this is a python script that Ubuntu will run
      * LEDnotify.sh - this is a bash script that will run the semi-compiled
        LEDnotify.pyc program (TBA)

The Application Launcher file is a place-holder:
   LEDnotify.desktop
   - If used, Ubuntu says it is an "Untrusted Application Launcher"
     I have yet to workout what this mean...   TBA


*******************************************************************************
Usage notes
*******************************************************************************

When running
============
Alerts may optionally be shown in any of these ways:
  * Ubuntu Indicator Applet icon - this sits on the top bar in Ubuntu, and appears
    as the LEDnotify coloured envelope icon - when an alert occurs, this is high-lit
    with a while background.  See notes on Ubuntu version, and menu usage below.

  * Notification messages - Ubuntu displays a message "bubble" top right, that 
    fades away after a moment...

  * Popup messages in a small window with an "OK" button to dismiss them.
    These use bash & zenity scripts (LEDnotify_*.sh)

  * Play a sound file.

Ubuntu Indicator Applet icon & menu:
  If enabled, click on the Ubuntu Indicator Applet icon
  (this will be a multi-coloured envelope icon on the system bar)
  to pull-down the menu.  The options available on the menu are:
     - Clear All   : Clears all outstanding alerts
     - xxx         : This section of menu items show the alerts LEDnotify is
       xxx           watching for, and they high-light when an alert is issued,
       xxx           and indicate the number of alerts of that type.
                     Also read about the "escalate" option in the config section above.
     - Tools       : opens a submenu - see below
     - About       : Launches a popup with info about LEDnotify.
     - Quit        : LEDnotify exits and all its tasks are ended.

  The Tools sub-menu contains:
     - View Log    : View messages in /tmp/LEDnotify.log
                     LEDnotify limits the size of the log file, and allows 3
                     generations of older logs to be kept.
                     The log format is:
                      - date
                      - time
                      - message level {DEBUG|INFO|ALERT|WARNING|ERROR|CRITICAL}
                      - message source
                     More than one task may write to stdout and to the log file,
                     so there is a convention of the 4th word in the log being 
                     used to indicate the message source:
                     - LEDnotify uses             ":"
                     - LEDnotify_poll_gmail uses  "-"
     - Restart xxx : If any polling steps are running, this can restart them
                     after an error, or force a restart if they get stuck.
     - Edit xxx    : to edit the various config files
     - Test LED    : Cycle through some coloured lights on the USB unit.


You may trigger LEDnotify alerts using dbus messages
    EG: with the command (all one line):
    dbus-send --session --dest=net.sourceforge.lednotify.engine --type=method_call /net/sourceforge/lednotify/engine net.sourceforge.lednotify.engine.Manager string:"_alert-name"

    Where:
     - string:"_alert-name" : the _alert-name is to match an one of the alerts
       listed in the myalerts list in the [LEDnotify] section of the conf file.
       EG: "_test1" in the sample conf file.
       Note: "_error" is reserved by LEDnotify for alerting on LEDnotify failures.

     - --dest=xxx : the xxx is the [LEDnotify] dbus attribute value
     - the / delimited name is the same as the dbus name, but in this format...
     - the dbus name is then used again with the .Manager suffix - it just is..

Popup boxes for alerting - only one popup will open per alert section in the
     conf file.  This is to try and keep the screen less cluttered.
     Clearing a popup alert will clear all alerts for that type (EG all types
     of Gmail alert, etc).

Pidgin:
     - the notify option is ignored, as Pidgin will give that on-screen alert
     - Alerts for:
        - Buddy   : If a user matching your buddies conf setting messages you.
            - see the buddies value in the [pidgin] section of LEDnotify.conf
        - Domain  : If a user (not a buddy) with an id in a domain matching
                    your domains setting messages you.
            - see the buddies value in the [pidgin] section of LEDnotify.conf
        - Unknown : any IM messages that do not match the above.
        - Buzz    : if "allowbuzz = True" set in the conf, then this alerts
                    you to anyone buzzing you.
        - BuddyOn : Alerts you to any buddies coming online
     - LEDnotify destinguishes between a new conversation (IE a new dialogue
       window has opened, or an update to an existing conversation for each of
       the above (see the "1"/"2" suffix in the alert names in the conf file;
       and labeled with "- continued" in the supplied config.)
     - LEDnotify monitors for a process with the name "pidgin" and alerts if
       one is not running.

Googlemail:
     - The poller is designed to terminate when it gets an "abort" error from
       google.  The main LEDnotify task will restart the poller when this 
       happens, and due to the checkpointing, you should not miss any new mail.
       BUT - I have also see the poller end with a strange looking error from
       google - EG:
           BYE response: System Error xxxxxxxxxxxxx
           NO response: Lookup failed xxxxxxxxxxxxx
       where the xxxxxxxxxxxxx is an odd code of various characters...
       In this case the poller needs to be manually restarted from the Ubuntu
       Indicator Applet dropdown menu (Tools -> Restart Gmail polling)
       I may add some code to retry the logon after such an event.
       Also see Googles "Known issues" page for some know IMAP problems :
           https://support.google.com/mail/known-issues/
              EG: Large mailboxes could be a problem for google & imap

Google Calendar:
     - Calendar events with a reminder will trigger a LEDnotify alert for the
       reminder time (* See Note1).
     - Calendar events without a reminder set will use the "notice" attribute
       in the LEDnotify_poll_gcal.conf file as the reminder period, and alert
       that much before the event (* See Note1).
     * Note1 : The Google Calender is checked cyclically - based on the timer
       value in the LEDnotify_poll_gcal.conf file.  Alerts are generated for
       all reminder times that fall within the following cycle period (EG 10
       minutes), so alerts may be generated upto a full cycle earlier than
       the time they are set for.
     - One challenge for calendar alerts is coping with timezones (note#01)
       LEDnotify does all calculations using UTC - this should cope with
       daylight savings too - please let me know of any problems with this.

Email through Thunderbird:
     - LEDnotify monitors for a process with the name "thunderbird" and alerts
       if one is not running.  It can not check that the plugin is installed
       though.

*******************************************************************************
Security notes
*******************************************************************************
The gmail password may optionally be saved in a temporary file by LEDnotify.
(See "<prompt>" & "encrypt" in the conf file).
This only applies to the <prompt> option.
Also see "Cryptography Notice" below.

This has the advantage that you can use pw=<prompt> - so not having the password
permanently on disk, but only type it in once when LEDnotify starts.

If the polling task dies (EG with an unexpected error from Gmail - which I do
try and trap - but I also try and recover from...), then LEDnotify will restart
the poll_gmail task, and it can then use the saved password.

The one-time encryption key is only remembered by LEDnotify whilst it is running,
and it generates a new random key every-time it is started - so any old files left
on disk are as secure (as the encryption allows (IE read up on DES, etc)).

LEDnotify passes the key to the poll_gmail task via stdin - so this is not too
visible.

But this is NOT 100% secure - it relies on :
1) You PC being secure - IE not publicly accessible.
2) The encryption is secure, but with access to your PC whilst LEDnotify is
   running, someone who REALLY wanted to, might crack it.
So - the risk is high, but the chance of the risk depends on your PC security.
I welcome feedback on this...


*******************************************************************************
Cryptography Notice
*******************************************************************************
  This distribution optionally uses cryptographic software. The country in
  which you currently reside may have restrictions on the import, possession,
  use, and/or re-export to another country, of encryption software.
  BEFORE using any encryption software, please check your country's laws,
  regulations and policies concerning the import, possession, or use, and
  re-export of encryption software, to see if this is permitted.
  For more information, see:
     <http://www.bis.doc.gov/encryption>
     <http://www.wassenaar.org/>

  The U.S. Government Department of Commerce, Bureau of Industry and Security
  (BIS), has classified this type of software as Export Commodity Control
  Number (ECCN) 5D002.C.1, which includes information security software
  using or performing cryptographic functions with symmetric algorithms.
  The form and manner of this distribution makes it eligible for export
  under the License Exception ENC Technology Software Unrestricted (TSU)
  exception (see the BIS Export Administration Regulations, Section 740.13)
  for both object code and source code.
  For more information, see:
     <http://www.bis.doc.gov/encryption>


*******************************************************************************
References
*******************************************************************************
I have used work from these pages, or have learned from them.
Some of these then refer to other projects... etc etc etc 

Hardware
========

* Linux USB - a great resource when looking at hardware:
   http://www.linux-usb.org/
   http://www.linux-usb.org/usb.ids

* The Dream-Cheeky USB Webmail notifier hardware
	http://www.dreamcheeky.com/webmail-notifier
		customerservice@dreamcheeky.com
		sales@dreamcheeky.com
		marketing@dreamcheeky.com
	http://www.geeksmart.co.uk/usb-email-webmail-notifier
	ebay / google...
    vendor_id=0x1d34, product_id=0x0004 # Dream Cheeky Dream Cheeky Webmail Notifier

* AVR-USB : OBJECTIVE DEVELOPMENT
	- dBird used the set-led C program from "Project: hid-custom-rq example"
	  by Christian Starkjohann, using an "AVR-USB" unit by OBJECTIVE DEVELOPMENT Software GmbH.
	  This appears to use: vendor_id=0x5824 & product_id=0x1500

* BlinkM Smart LEDs
      http://blinkm.thingm.com/
      http://thingm.com/fileadmin/thingm/downloads/BlinkM_datasheet.pdf
         I2C slave device - maybe connected with a USB-to-I2C adapter !?
      or maybe try -
         BlinkM USB status light:
            http://thingm.com/products/blink-1.html
      or ebay - search for "SLboat - A USB RGB LED Compatible Blink1"
      vendor_id=0x27b8, product_id=0x01ed # Thing M

* USBEmailNotifier
	  http://svn3.xp-dev.com/svn/USBEmailNotifier/
      Using - USB Universal E-mail/Webmail/IM Notifier :
      http://dx.com/p/usb-universal-e-mail-webmail-im-notifier-gmail-outlook-outlook-express-pop3-27062
      This appears to use one of these:
      vendor_id=0x1294, product_id=0x1320 # Evelop device
      vendor_id=0x0c45, product_id=0x0826 # Airplain device

Software
========
* I nearly forgot this reference (sorry) - it was early on when I first received
  my Dream-Cheeky unit - to help get the USB device working (plugin and out...):
  Christian Weiske's page:
    http://cweiske.de/tagebuch/usblamp-monitoring.htm  : on udev rules...
* Thunderbird plugin to send dbus messages for new mail
	http://www.oelerich.org/dbus-signals-from-thunderbird-new-extension/
	https://github.com/janoliver/thunderbird-dbus-sender
	https://github.com/janoliver/thunderbird-dbus-sender/blob/master/README.md
* The gmailnotify project
	https://github.com/knopwob/gmailnotify
	knopwob@googlemail.com
* The Mail Notification tool -
    http://www.nongnu.org/mailnotify/
* Twitter...
  A lot of older Twitter tools stopped working when Twitter moved from V1 to
  V1.1 of their API and eventually turned off the V1 API.
  Unless apps had updates for that, they could no longer logon or get info
  from Twitter.  This applies to dBird.
* dBird notifier - my starting point for this project
	http://dbirdnotifier.sourceforge.net/
	http://sourceforge.net/projects/dbirdnotifier/
	Dennis Schulze : emailfordennis.schulze@googlemail.com
	                 emailfuerdennis@web.de
    (c) of changes: Dennis Schulze 4/30/2009 - GPL
    Dennis refers to Mumbles as the origin of the twitter polling code.
    Copyright (c) 2008 dot_j <dot_j[AT]mumbles-project[DOT]org>
	https://sourceforge.net/projects/mumbles/
    Also see: http://www.linuxformat.com/forums/viewtopic.php?t=6597
* The DBus Project : http://www.freedesktop.org/wiki/Software/dbus
* Ubuntu Indicator Applets (and more on gmail)
	- http://conjurecode.com/create-indicator-applet-for-ubuntu-unity-with-python/
	- http://freakaboutlinux.wordpress.com/2010/12/02/custom-indicator-applet-icon/
* Python
	- http://www.python.org/
	- http://docs.python.org/3/
* HTML
    - See Aaron Swartz's html2text tool - I used to help format IM messages.
      (and have shipped with LEDnotify) 
       - html2text : (C) 2004-2008 Aaron Swartz. GNU GPL 3.
       - me@aaronsw.com
       - http://www.aaronsw.com/2002/html2text/
       - https://github.com/aaronsw/html2text
* Google Calendar
    - See: https://developers.google.com/google-apps/calendar/v1/developers_guide_python
    - Also see the supplied file : ../Dream-USB-LED/Calendar_mask.odt for converting
      a Dream Cheeky Webmail notifier into a Calendar notifier.
* Sound files : License: Attribution 3.0
    - Some sound files in LEDnotify originated from: http://soundbible.com/ :
      pin-drop.wav = pin_dropping-Brian_Rocca-2084700791.wav
         Recorded by Brian Rocca - http://soundbible.com/1992-Pin-Dropping.html
      gong.wav = Metal_Gong-Dianakc-109711828.wav
         Recorded by Dianakc - http://soundbible.com/2062-Metal-Gong-1.html
      lazer.wav = Laser_Cannon-Mike_Koenig-797224747.wav
         Recorded by Mike Koenig - http://soundbible.com/1771-Laser-Cannon.html
      metal.wav = Hitting_Metal-Douglas_Vicente-1756278897.wav
         Recorded by Douglas Vicente - http://soundbible.com/1750-Hitting-Metal.html
      blip.wav = Robot_blip-Marianne_Gagnon-120342607.wav
          Recorded by Marianne Gagnon - http://soundbible.com/1682-Robot-Blip.html
      ting.wav = Ting-Popup_Pixels-349896185.wav
          Recorded by Popup Pixels - http://soundbible.com/1628-Ting.html
      click.wav = Dry Fire Gun-SoundBible.com-2053652037.wav
          Recorded by Mike Koenig - http://soundbible.com/1405-Dry-Fire-Gun.html
      siren.wav = Tornado_Siren_II-Delilah-747233690.wav
          Recorded by Delilah - http://soundbible.com/1937-Tornado-Siren-II.html
      blop.wav = Blop-Mark_DiAngelo-79054334.wav
          Recorded by Mark DiAngelo - http://soundbible.com/2067-Blop.html
      page_turn.wav = Page_Turn-Mark_DiAngelo-1304638748.wav
          Recorded by Mark DiAngelo - http://soundbible.com/2066-Page-Turn.html
      tick.wav = Tick-DeepFrozenApps-397275646.wav
          Recorded by DeepFrozenApps - http://soundbible.com/2044-Tick.html

And finally - my thanks for the many other web pages I have read to help develop
this...  Python, Eclipse, dbus, pidgin, gmail, etc etc etc
	 - too many to keep track of..





































Source: A_ReadMe.txt, updated 2014-02-10