• Category Archives Raspberry Pi
  • Technology » Raspberry Pi
  • Using PuTTY with Jaws 18.

    Please be aware that I don’t recommend that you use PuTTY exclusively for SSH access. Especially in Windows 10. There are a number of better alternatives out there at this point for most day to day use. I’ll add links to one or two below. However, there are times when PuTTY or Putty as it’s pronounced is just the best tool for the job so it’s important that you can get some feedback from Jaws.

    Note as of 26th October 2017

    Please note that this post is now out of date. You should use these fantastic PuTTY scripts instead as they provide much more complete functionality.

    I had posted a script before that worked with previous versions of Jaws and in fact, it would probably work with Jaws 18 as well but the SayNonHighlightedText function in Jaws 18 has been updated so it’s only right that I tweak it slightly and publish it here to be used in a PuTTY.jss file.

    Here’s the code:

    Include “HjGlobal.jsh” ; default HJ global variables
    Include “hjconst.jsh” ; default HJ constants
    Include “HjHelp.jsh” ; Help Topic Constants
    Include “common.jsm” ; message file
    include “MSAAConst.jsh”
    include “UIA.jsh”

    NavigationByLineTickThreshold = 200
    int LastLineNavigationTick

    Void Function SayNonHighlightedText (handle hwnd, string buffer)
    ; NonHighlightedText Function for speaking all newly written nonhighlighted
    ; text.
    If GetScreenEcho () > ECHO_NONE
    && hWnd == GetFocus()
    If GetWindowClass(GetFocus()) == “PuTTY”
    && GetTickCount()-LastLineNavigationTick > NavigationByLineTickThreshold
    ;New text should be spoken only if it is not a result of navigation by line.
    ;This prevents double speaking when navigating through a command history,
    ;since the SayLineUnit will already have spoken the new text.
    ;Now clear LastLineNavigationTick, just in case more new text appears shortly after the navigation.
    LastLineNavigationTick = 0
    if (GetScreenEcho() > 1) then

    There are a number of great alternatives to PuTTY.
    Over on Git Hub, Microsoft have a rather nice SSH Powershell module that provides a method of accessing an OpenSSH server on Linux from within Powershell.
    The best way to use SSH on Windows in my opinion is to install Git. Be sure that you choose to make git features available from the command line so that you can use SSH without starting the Git Bash shell first.
    Lastly, another really good option if you are using Windows 10 is to install Bash or Linux for Windows. This is an add on that you can install from within Programs and Features\Windows Features.

    There are now more ways than ever to access your Linux servers over SSH from within Windows. Have fun!

  • Answered: MongoDB + PyMongo – Searching within a date range.

    I wrote a short blog post last night when I felt that I couldn’t get any further independently with searching within a Mongo database for data between a date and time range.

    I was highlighting a question that I had posed on Stack overflow.

    Fortunately today when I got home from work very late I found there were two very short and very useful responses.
    Turns out that I was over complicating my approach. The date is actually represented in the Mongo shell as an ISo date but it’s actually a BSON date type.

    So by converting it to a string I was causing the problem in the first place.

    Here’s what I was trying:

    date1 = datetime.datetime.utcnow()-datetime.timedelta(minutes=15)
    date1 = date1.strftime(“%Y-%m-%dT%H:%M:%S.000Z”)
    for cursor in sensors.find({‘Date’:{“$gte”:’ISODate(“‘date1’)”‘}}):

    First line is defining the date and time minus 15 minutes.
    Second line is converting it into the right format.
    Third line is creating the cursor and adding the ISODate(“”) component.

    However, here’s what I should have been doing.

    date1 = datetime.datetime.utcnow()-datetime.timedelta(minutes=15)
    for cursor in sensors.find({‘Date’:{“$gte”: date1}}):

    That simple!

    However, on my travels I found that you can profile a Mongo database.
    Learn about profiling MOngo here
    This turns on profiling:


    This shows you the entries written to the profile table:


    This is the kind of output you can expect from profiling:

    “query”, “ns” : “DatabaseName.CollectionName”, “query” : { “Date” : { “$gte” : “ISODate(\”2014-12-31T12:30:09.000Z\”)” } }, “ntoreturn” : 0, “ntoskip” : 0, “nscanned” : 0, “keyUpdates” : 0, “nreturned” : 0, “responseLength” : 20, “millis” : 1, “client” : “”, “user” : “” }

    My huge thanks to the people on Stack overflow who helped out.

  • Question: MongoDB + PyMongo – Searching within a date range.

    Here we go again. I blogged about this before but now I’m trying to do it using Python. I don’t know why this is so difficult!

    I had to ask the question on Stack overflow because I’m no closer to solving it.

    When I eventually find the answer or if someone helps, I’ll of course post the solution here. It’s funny, when researching this, I kept finding the blog post I wrote before. Funny but ever so slightly irritating as well because I really don’t need to read wheat I’ve written!

    Updated on 8th January 2015 at 11PM: I have written a second blog post with the answer to this question here.

  • Turning on and off your Christmas tree lights from the Raspberry Pi.

    Thanks to a suggestion from my wife last week, I bought a Energenie socket controller for the Raspberry Pi. This little gadget allows wireless communication to a special socket that plugs into an electrical outlet. When working, this allows you to easily write code that will turn on or off that socket. The pack comes with one transmitter and two receiving sockets but actually, I bought two kits as each socket may be controlled by up to two transmitters and one transmitter may control up to four sockets.

    The reason that I bought this is quite simple. I have a new Raspberry Pi B+ in our living room with RaspBMC to allow us to use the XBMC media center software. we also put up our Christmas tree last weekend so we have the yearly problem of having to reach around quite a large christmas tree to reach the socket to turn off power to the lights every night. As they would say on twitter, it’s a perfect example of a first world problem! I hate that term but I’m getting off the point. Thanks to the RP and the Energenie I can turn on and off our Christmas tree lights remotely without going anywhere near that hard to reach socket.

    The problem of course was, on Wednesday after I spent a short amount of time getting this set up the night before, my wife posted a status to facebook saying, “It’s bad when I’m not technical enough to turn on the christmas tree lights”. Point taken. I set about creating a web interface to allow us to do this from our phones.

    I have never used the Flask Python web micro framework so this was a very new venture for me. the code you see before is my second version. The first one didn’t use views, a config file, templates or flash messages. It worked but it wasn’t as clean. I like to learn to do things properly so I scrapped it and read about how to do this properly. If you are interested in Flask, I really suggest you read this incredibly helplful tutorial by guel Grinberg.
    Here are all the steps. Hopefully I haven’t left anything out. To make this a little more conveenient for you, I’ve also included a package of all the code and graphics you will need to get this running on your own system.

    What you’ll need

    • A Raspberry Pi
    • An Energenie socket

    Getting your environment ready.

    I’m installing this on RaspBMC. This is the Raspberry Pi distribution for XBMC use primarily.
    Update the aptitude repository
    sudo apt-get update
    Install build dependencies.
    apt-get install gcc python-dev
    install the Python GPIO package to gain control of the pins on the Pi.
    cd /tmp
    wget https://pypi.python.org/packages/source/R/RPi.GPIO/RPi.GPIO-0.5.8.tar.gz

    Extract the contents of the archive.
    tar xzvf RPi.GPIO-0.5.8.tar.gz
    cd RPi.GPIO-0.5.8
    sudo python setup.py install

    Change to your home directory and get the Energenie install software from the following address.
    wget https://energenie4u.co.uk/res/software/ENER002-2PI.py

    Now install this.
    sudo python ENER002-2PI.py
    Make a directory that will hold your project

    cd {ProjectName}

    Get the really fantastic library created by Amy Mather’s. More information can be found here.
    wget https://github.com/MiniGirlGeek/energenie-demo/raw/master/energenie.py
    Get the Python setup tools package.
    sudo apt-get install python-setuptools
    get the Flask micro web framework.
    sudo easy_install flask
    Get the Jinja2 Python template engine.
    sudo easy_install Jinja2
    You now have all the components required to get coding.

    create your app file and directory structure

    The structure is as follows:

    The code

    The following section has the code for each file along with a description of what that file is used for.


    You will use this file to launch your application.

    from app import app
    app.run(host='', debug=True) # Set to be accessible over the network with debugging enabled.


    The config.py file does as you would expect. It is used to store config variables for the application.
    SECRET_KEY = 'YourSecretKey'
    The secret key is what ever you define. This is used by the flash messaging component.


    This is the main part of your application. all of the processing happens here.

    # Import statements.
    from flask import render_template, flash
    from app import app
    from energenie import switch_on, switch_off

    # Main page. accessible from http://yourIPAddress:5000/
    def index():
    return render_template('index.html', title='Christmas')

    # Code that is called with http://yourIPAddress:5000/on. This turns on the lights and adds a message to say the lights are on.
    def on():
    flash('Christmas tree lights on.')
    return render_template('index.html', title='Christmas - Lights On')

    # Code that is called with http://yourIPAddress:5000/off. This turns off the lights and adds a message to say the lights are off.
    def off():
    flash('Christmas tree lights off.')
    return render_template('index.html', title='Christmas - Lights Off')


    App initialization. Also includes the definition of the config file and tells flask that we are using views.py.

    from flask import Flask
    app = Flask(__name__)
    from app import views


    You need to put static files into the static directory. The following style sheet definition defines some basic page layout options.

    body {
    font-size: 30px;

    .red-button-link {
    text-decoration: none;
    padding: 15px 20px;
    background: red;
    color: #FFF;
    -webkit-border-radius: 6px;
    -moz-border-radius: 6px;
    border-radius: 6px;
    border: solid 2px #20538D;
    text-shadow: 0 -2px 0 rgba(0, 0, 0, 0.4);
    -webkit-box-shadow: inset 0 2px 0 rgba(255, 255, 255, 0.4), 0 2px 2px rgba(0, 0, 0, 0.2);
    -moz-box-shadow: inset 0 2px 0 rgba(255, 255, 255, 0.4), 0 2px 2px rgba(0, 0, 0, 0.2);
    box-shadow: inset 0 2px 0 rgba(255, 255, 255, 0.4), 0 2px 2px rgba(0, 0, 0, 0.2);
    -webkit-transition-duration: 0.2s;
    -moz-transition-duration: 0.2s;
    transition-duration: 0.2s;
    .red-button-link:hover {
    background: red;
    border: solid 2px #2A4E77;
    text-decoration: none;
    .red-button-link:active {
    text-decoration: none;
    -webkit-box-shadow: inset 0 2px 6px rgba(0, 0, 0, 0.6);
    -moz-box-shadow: inset 0 2px 6px rgba(0, 0, 0, 0.6);
    box-shadow: inset 0 2px 6px rgba(0, 0, 0, 0.6);
    background: red;
    border: solid 2px #23E5F;

    .green-button-link {
    text-decoration: none;
    padding: 15px 20px;
    background: green;
    color: #FFF;
    -webkit-border-radius: 6px;
    -moz-border-radius: 6px;
    border-radius: 6px;
    border: solid 2px #20538D;
    text-shadow: 0 -2px 0 rgba(0, 0, 0, 0.4);
    -webkit-box-shadow: inset 0 2px 0 rgba(255, 255, 255, 0.4), 0 2px 2px rgba(0, 0, 0, 0.2);
    -moz-box-shadow: inset 0 2px 0 rgba(255, 255, 255, 0.4), 0 2px 2px rgba(0, 0, 0, 0.2);
    box-shadow: inset 0 2px 0 rgba(255, 255, 255, 0.4), 0 2px 2px rgba(0, 0, 0, 0.2);
    -webkit-transition-duration: 0.2s;
    -moz-transition-duration: 0.2s;
    transition-duration: 0.2s;
    .green-button-link:hover {
    background: green;
    border: solid 2px #2A4E77;
    text-decoration: none;
    .green-button-link:active {
    text-decoration: none;
    -webkit-box-shadow: inset 0 2px 6px rgba(0, 0, 0, 0.6);
    -moz-box-shadow: inset 0 2px 6px rgba(0, 0, 0, 0.6);
    box-shadow: inset 0 2px 6px rgba(0, 0, 0, 0.6);
    background: green;
    border: solid 2px #203E5F;

    PNG files

    Add the graphics from the attached zip file if you like but if you would rather use your own, add them to the static folder.


    This is the template file. The UI that you will see is defined in this file.

    {{ title }}

    Picture of the Christmas Tree.
    Turn the lights on      Turn the lights off

    {% with messages = get_flashed_messages() %}
    {% if messages %}
    {% for message in messages %}
    {{ message }} {% endfor %}
    {% endif %}
    {% endwith %}

    Download the files required in an archive

    You may download the archive here

    if you would rather not copy and paste the code.

  • Using date ranges in MongoDB and PHP.

    I have also written similar posts relating to date ranges in Python. You can find my Question here from when I was getting frustrated and The answer to my problems here.

    You seriously wouldn’t believe the trouble I’ve had in the past two weeks trying to make some progress on my Arduino, Raspberry pi, Python, PHP and MongoDB project.

    Work has been very busy so the only time I’ve had to work on this is on the bus on the way to and from Dublin and from time to time very late at night.

    Right, so here are a few of the problems I came up against:
    The first hing I wanted to do was limit the size of my table in MongoDB. I’m collecting quite a lot of sensor data from the Arduino but I don’t need to retain this data for any more than around 2 weeks.

    MongoDB allows you to create a TTL index which will delete data that was created more than a certain number of seconds ago. This is a really handy feature however, it didn’t really work for me. I think you need to store the date in BSON format and I had stored my date in ISO format because I think it will make it easier to retrieve and write the sensor entries.

    Regardless, here is the code I used:

    db.envirocheck.sensors.ensureIndex( { “Date”: 1 }, { expireAfterSeconds: 604800 } )

    You can learn more about TTL indexes using the Fantastic MongoDB documentation that covers TTL Indexes

    As I said, this didn’t work for me at all so a suggestion on Twitter that I received weeks before made me think of capped collections. These are similar to TTL indexes in that they delete old data but instead of the TTL index, this works by deleting entries that are old however it does so when the collection reaches a certain value. By writing data once a second, I find that with 500Bytes I can store just over two hours of data. I obviously need to figure out how many bytes I need for storing two weeks worth but that’s something to do when I’m feeling more awake.

    The code to create a capped collection is here:

    db.createCollection( “sensors”, { capped: true, size: 500000 } )

    Again, look here for the MongoDB documentation for capped collections.

    Next, I of course needed to set an index on my date field as I’m going to be using this to select specific temperature values for date and time ranges. That was quite straight forward.

    db.sensors.ensureIndex( { “Date”: 1 } )

    Next, I needed to find a way of selecting between two dates in MongoDB and PHP. You might think this is easy, but no! It’s far from it! I stupidly tried to get ahead of myself by making this really complicated. I looked at Doctrine but trust me on this, the documentation for this project is absolutely crap! Now, maybe it’s me. Maybe I’m not experienced enough to figure this out but for god sake, this documentation might seem great from a high level but unless you read it from start to finish like a book, it’s useless! there’s no context to any of their examples and huge chunks of code are missing without any pointers to the parts of the documentation that might reference them. I wasted a week reading that documentation. There’s also different variations and different versions so the whole thing is really frustrating. All I wanted to do was find data between a date or time range. I liked the simplicity of the query builder and I can really see the power of this library but the documentation really turned me off.

    Finally, I came to my senses last night at about 11:30PM when I really should have been a sleep. Come to think of it, I should really be a sleep now as well but I want to get all this out of my head and on paper so to speak before I forget it. I came across This post on the MongoDB blog which made things very very clear. I had of course tried something very similar to that before I started looking for alternatives but really, it was so simple! All I was missing was converting the date into strToTime before I tried to convert it into MongoDate format. I did a lot of searching on Google but although I could find shed lodes of documentation on converting from MongoDate into PHP, I couldn’t find anything on the other way around. I obviously wasn’t looking in the right place because as soon as I saw those few letters strToTime, it all clicked.

    Here’s the example from the MongoDB blog:

    $start = new MongoDate(strtotime(‘1971-01-01 00:00:00’));
    $end = new MongoDate(strtotime(‘1999-12-31 23:59:59’));
    $collection->find(array(“create_date” => array(‘$gt’ => $start, ‘$lte’ => $end)));

    This actually converts the date and time into a number like this:


    Armed with this information, I set about dynamically setting the date and time. This code will get the sensor values saved to MongoDB over the past day:

    $start = new MongoDate(strtotime(date(“Y-m-d H:i:s”,”-1 days”)));
    $end = new MongoDate(strtotime(date(“Y-m-d H:i:s”)));

    See how easy that is? Isn’t that frustrating! I’ve spent about ten hours reading about this. Such a waste in a lot of ways but I suppose I probably learned plenty on my travels to finding out more about Mongo and the way it handles dates. Funny, in the collection, the date is stored in ISO format. For example: 2014-27-02 23:46:05. It must do some very interesting conversion back into a standard format. When I tried to check using the format that the date is stored in within the collection using (Y-m-d H:m:s) it failed to pull back any records. Maybe because MongoDate is trying to parse that from the expected strToTime number. That’s weird though because that wasn’t even working when I wasn’t using MongoDate. It’s a question I must ask on the forums when I eventually get around to creating an account.

    As you can see, I’m still learning and in a lot of ways this is really frustrating. I could probably do with reading a few books on these subjects but where’s the fun in that? I rather learn as I go along.

  • Fixing my first problem with MongoDB.

    working with MongoDB seemed easy at first.

    It isn’t available in the APT repository and compiling it on the Raspberry pi is a little different so I followed this very helpful guide.

    That got me up and running so next I had to learn a little more about MongoDB. Fortunately, the MongoDB manual is fantastic so This section told me everything I needed to know to create my first database and collection. Note, collection is similar to a table in SQL world.

    Next, I wanted to dive right in and connect my Python application that is taking data over serial from my Arduino. The idea was to add this data to a collection in MongoDB so that historical graphs could be generated. With a quick Google search, I found This quick tutorial that shows the basics of Python and MongoDB. Armed with a little knowledge I successfully learned how to add data to my new collection in MongoDB. Everything was working perfectly.

    That was on Friday night. Saturday was a very busy day so I didn’t get near this stuff at all until late on Sunday. With a lot of frustration, I found that no data was shown in MongoDB any more and MongoDB was frequently hanging without providing me with a prompt. This seemed to be any time I tried to use the db operation. I was absolutely certain that data had been written to the database and collection so I set about trying to find out what was going wrong.

    First, I checked the logs in /var/log/mongod/mongodb.log. All they were showing me were the connection attempts.

    Then I looked at the ocasional time out error message that I was getting from within the MongoDB shell. Still nothing useful.

    I even tried searching forums etc for some hint of what might be going wrong.

    I found two useful pages that I’ll keep for future reference but unfortunately, they were of no help with this problem. This is a forum post that someone created when MongoDB seemed to be hung. and This one shows how to troubleshoot hanging issues.

    I decided to try running MongoDB as a user run process instead of a system daemon. Of course, then, i was using the default settings so I thought that it might show me if anything was going wrong with the settings in /etc/mongo.conf. No. All I got was a message about the dBPath not set. This was of no use to me because I quickly found out that in /etc/mongod.conf, the DBPath was set to /var/lib/mongodb/. However, this pointed me toward looking at the permissions on that folder. I had set them while installing MongoDB but I thought I’d check again to be sure that the permissions were set recursively for child files and folders. Again, this wasn’t the problem, however I noticed a file called mongod.lock. I thought maybe this was a place holder to show that the database was locked so I tried moving that file out of the /var/lib/mongodb directory. Sure enough, I made a little more progress. The show dbs command was still causing the MongoDB shell to hang. I deleted the databases that I created while working with Python earlier from the /var/lib/mongodb/ directory and this let the show dbs file runn a little longer but it was still causing MongoDB to freeze. I deleted the MyDB database that was created when I was learning MongodB first as well and the command completed successfully. Of course, I was very aware that I had deleted files from the file system and the databases were still there but were probably now corrupt within MongodB so with another quick search on Google, I found the short command to delete databases from within MongoDB. I also found the command to drop mongoDB collections as well but I don’t particularly need that at the moment. Handy to have for future reference of course.

    So, after deleting the files and deleting the databases within MongoDB, the system is working perfectly. However, I hear you say, “There’s nothing in the system, of course it’s running perfectly!” Your absolutely right, but for the moment, there’s no locking so I@m going to hope either one of the tutorials / forum posts were wrong or it was just something in one of the databases that became corrupt.

  • Progressing slowly with the arduino and the Raspberry Pi

    Work on the Arduino and the Raspberry Pi is ongoing. So far, I’ve made Led’s flash, used a light meter to determine when the LED’s are on and off, taken the temperature of the room and moved a camera using a Servo. On the Pi side, I’ve set up Email alerts when motion has been detected by the phone and I even found an application that supports push on the IOS platform so I may even be able to get the Pi to send alerts directly to my iPhone.

    I’ve encountered a few challenges of course. Almost all of the tutorials for the Arduino use a delay function to pause when the servo is running or when the motor is spinning but that’s no good when you need the loop to continue processing while all of this happens. So, I looked into a few alternatives. Using a counter to count the milliseconds since the device was turned on was fine but this would need to reset after 34 days which would cause a problem with the timing of the loop. I then tried a library called ElapsedMilis. This works fine but I had a lot of problems figuring out the logic. I got there in the end though but unfortunately my approach wasn’t completely sound.

    After asking a question on the Arduino forum I was pointed in the direction of another library called Delay Timer. I don’t think it’s released because when I included it first in one of my projects I had a bit of debugging to do to get it working. I must subscribe to Git Hub to suggest my changes. Unlike my previous approach, with this library, I can use as many timers as I want. The last time, I was using one hardware timer and a number of intervals to try to mark when functions should be executed. This should have worked fine in theory but the problem is that the loop is processed so quickly that it can run through the process too quickly and miss an important event. With this new approach, I can have different timers running concurrently and I can check each one. When it is time to execute that function, the timer resets again and its place in the loop is never lost.

    Of course, it’s not all programming. Some of this work is also about putting the components together and making it sit properly. One problem I was having is that the servo was generating too much vibration. This would cause the camera to constantly think it was detecting motion. I came up with the great idea of using a bit of Velcro to help mount the servo to the side of the Raspberry Pi and then Velcro the camera board to the moving part of the servo. Now, the vibration is absorbed by the servo. It’s funny the solutions that show themselves when you’re stuck.