All posts by Lemon Grass

The VirtualBox Guest Additions are software services which allow client operating systems to interact with the Virtualisation environment, breaking the limitation of strictly running the client OS on emulated hardware. Facilities provided include cut and paste between the Client OS and the host system, much better display support with resizing, and even drag and drop of files (which I have not got working).

Up until about Ubuntu 14.04, the method for installing the VirtualBox Guest Additions was to install Ubuntu and then to (virtually) install the Guest Additions CD image provided by VirtualBox and run the installation from that. This no longer works under Ubuntu 17.10 (and I read that it didn’t work for Ubuntu 16, but I can’t verify that). Instead, packages are provided in Ubuntu itself to support the VirtualBox virtualisation facilities.

Based on a video by ‘Linux Video Tutorials’, here are the steps to install the VirtualBox Guest Additions in Ubuntu 17.10:

Settings for VirtualBox VM

    • set plenty of Video Memory (128Mb) in Display->Screen
    • set 3D Acceleration active in Display->Screen
    • enable PAE/NX under System->Processor
    • enable the bidirectional clipboard and drag and drop if you want them, in General->Advanced.

Installing the software

% sudo apt-get update
% sudo apt-get upgrade
% sudo apt-get install build-essential virtualbox-guest-dkms virtualbox-guest-x11
% sudo shutdown -r now

Checking that the software is working

The client OS should now boot with flexible display resizing and cut and paste support. The VirtualBox Guest Additions services should be enabled and running. I found I had to start them:

% hostnamectl
% sudo systemctl status virtualbox-guest-utils.service
% sudo systemctl start virtualbox-guest-utils.service
% sudo systemctl status virtualbox-guest-utils.service

% ps -ef | grep -i vbox
 root 280 2 0 11:36 ? 00:00:00 [iprt-VBoxWQueue]
 lemon 1501 1 0 11:37 ? 00:00:00 /usr/bin/VBoxClient --clipboard
 lemon 1504 1501 0 11:37 ? 00:00:00 /usr/bin/VBoxClient --clipboard
 lemon 1505 1 0 11:37 ? 00:00:00 /usr/bin/VBoxClient --display
 lemon 1506 1505 0 11:37 ? 00:00:00 /usr/bin/VBoxClient --display
 lemon 1512 1 0 11:37 ? 00:00:00 /usr/bin/VBoxClient --seamless
 lemon 1513 1512 0 11:37 ? 00:00:00 /usr/bin/VBoxClient --seamless
 lemon 1519 1 0 11:37 ? 00:00:00 /usr/bin/VBoxClient --draganddrop
 lemon 1520 1519 0 11:37 ? 00:00:00 /usr/bin/VBoxClient --draganddrop
 root 20751 1 0 11:40 ? 00:00:00 /usr/sbin/VBoxService

BT Internet uses the defunct SMTPS protocol for outgoing SMTP connections from a customer.  To set up Exim4 to be able to send mail via this interface requires a dirty hack.  The main part of the configuration is as described in this Ask Ubuntu article in the accepted answer (based on Tony Scelfo’s article).  However, that does not take account of BT’s peculiar configuration.  An additional step is required:  before running update-exim4.conf, edit /etc/exim4/exim4.conf.template. Find the section starting with


Insert a new line following the line driver = smtp like this:

  protocol = smtps

Then continue with the steps in the article above. Use for the address of the smarthost when running dpkg-reconfigure.

This is a hack because it subverts the SMTP smarthost function to use SMTPS. However as you can only have one smarthost at a time, that doesn’t matter.

By the way, Raspbian on the Raspberry Pi uses Exim4 and this was how I got email working from it.

The instructions  for installing Emoncms on the Raspberry Pi are at available through the OpenEnergyMonitor site.  However I had to take some additional steps.  This page lists what I did, drawing heavily from those instructions with thanks.

I used a Raspberry Pi 2 model B.  This has Ethernet which I needed to connect to the network, though you could use a Wifi dongle.  Before you can use the Pi, you have to install its operating system on a micro-SD card–I used an 8Gbyte one.  To receive wireless data from emonTx and emonTh modules, you need an expansion card such as the RFM69Pi.

Install Raspbian

Using Windows, fetch the Raspbian installation image.  Extract the zip file to obtain the single image file, in my case called 2015-02-16-raspbian-wheezy.img.  Write this image to the micro-SD card using Win32DiskImager.  Insert the micro-SD card into the Raspberry Pi (it goes in upside down) and power up. Watch in amazement as the boot images whizz by on the HDMI-connected monitor.  The initial screens allow you to set the password for the “pi” user, and if you are not based in the UK, you can change the Internationalisation options.

The EmonCMS installation instructions suggest making an additional data partition on the SD card.  I preferred not to do this for two reasons: the data is precious and the SD card has limited life, even with the write buffering.  Instead, I plan to mount a shared folder from my Synology NAS drive to hold the data.  I cover this in a separate post, as it is tricky.  However, following the instructions caused the root filesystem to overflow during the installation of pre-requisite software, so I recommend expanding the filesystem to the full size of the SD card.  There’s an option to do this in the initial configuration screens.  If you’ve already exited, type “sudo raspi-config” to re-invoke the configuration screeen.

Disable Serial Port login

By default, Raspbian Wheezy is configured to support login on the serial port.  This would conflict with the use of that port for radio communications, so we need to disable logins on the serial port.  Edit the configuration files as follows:

sudo nano /etc/inittab

At the bottom of the file comment out the last line, by adding a ‘# ’ at the beginning:

# T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

[Ctrl+X] then [y] then [Enter] to save and exit.  Next, edit the boot command line:

sudo nano /boot/cmdline.txt

Raspbian has been updated since the Emoncms instructions were written, and the line to change is now a little different.  Remove “console=ttyAMA0,115200” from the line, so that it reads

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

Change the filesystem to be mounted read-only

To reduce wear on the SD card, the filesystem can be mounted read-only, except when software updates are necessary.  The data will be stored on an external NAS drive. Before switching to read-only mode, we need to create commands to switch between read-only and read-write modes, and create a mount-point for the data partition. Do this while logged in as “pi”.

mkdir /home/pi/data

Turn on the TMPFS filesystem:

sudo cp /etc/default/tmpfs /etc/default/tmpfs.orig
sudo nano /etc/default/tmpfs

Find the line that says


Change it by removing the “# ” at the beginning of the line and changing “no” to “yes”:


Use [Ctrl+X] then [y] then [Enter] to save and exit.

Next, replace the filesystem mount point table:

sudo mv /etc/fstab /etc/fstab.orig
sudo sh -c "echo 'tmpfs           /tmp            tmpfs   nodev,nosuid,size=30M,mode=1777       0    0' >> /etc/fstab"
sudo sh -c "echo 'tmpfs           /var/log        tmpfs   nodev,nosuid,size=30M,mode=1777       0    0' >> /etc/fstab"
sudo sh -c "echo 'proc            /proc           proc    defaults                              0    0' >> /etc/fstab"
sudo sh -c "echo '/dev/mmcblk0p1  /boot           vfat    defaults                              0    2' >> /etc/fstab"
sudo sh -c "echo '/dev/mmcblk0p2  /               ext4    defaults,ro,noatime,errors=remount-ro 0    1' >> /etc/fstab"
sudo sh -c "echo '  /home/pi/data   nfs    user=pi                   0    0' >> /etc/fstab"
sudo sh -c "echo ' ' >> /etc/fstab"
sudo mv /etc/mtab /etc/mtab.orig
sudo ln -s /proc/self/mounts /etc/mtab

Note: The line referring to /home/pi/data will need to be changed to reflect your NAS drive’s IP address (or DNS name) and shared folder path.  See my separate post for instructions on making this work with Synology DiskStation DSM 5.1.

Create the commands to switch between read-only and read-write mode:

sudo nano /usr/bin/rpi-rw

In the empty file which loads, enter the following:

sudo mount -o remount,rw /dev/mmcblk0p2  /
echo "Filesystem is unlocked - Write access enabled"
echo "Type 'rpi-ro' to lock"

[Ctrl+X] then [y] then [Enter] to save and exit, and then type the following to make the command executable:

sudo chmod +x  /usr/bin/rpi-rw

Similarly, create the opposite script:

sudo nano /usr/bin/rpi-ro

In the empty file which loads, enter the following:

sudo mount -o remount,ro /dev/mmcblk0p2  /
echo "Filesystem is locked - Write access disabled"
echo "Type 'rpi-rw' to unlock"

[Ctrl+X] then [y] then [Enter] to save and exit, and then type the following to make the command executable:

sudo chmod +x  /usr/bin/rpi-ro

Reboot to bring the changes into effect:

sudo shutdown -r now

Log in again and change the permissions on the data directories. This may bring up error messages when using the Synology NAS.

sudo chmod -R a+w data
sudo chown -R pi data
sudo chgrp -R pi data

Continue to follow the instructions from “Installing Dependencies” in the instructions in installing Emoncms on the Raspberry Pi.  However, it turns out it is not really feasible to run MySQL with its data directory NFS mounted from Synology DSM.  This is due to a number of factors:

  • NFS mounts are not in place by the time MySQL starts (this could be worked around)
  • Synology NFS exports have weird permissions and ownership issues (see separate post; I have no solution)
  • I seem to recall criticism of the idea anyhow, on the basis that database storage should be local to the server for resiliency reasons.

All is not lost however.  Synology DSM is a flexible beast, and MySQL is available as a downloadable package for it, called MariaDB.

  1. Log into DSM as “admin” at http://diskstation:5000 (for example)
  2. Open “Package Center” and find MariaDB under “Utilities”. Press the “Install” button and wait until the magic is done.
  3. Find and install “phpMyAdmin”, also under “Utilities”.
  4. Open “phpMyAdmin” – this opens a new tab or browser window and presents the phpMyAdmin login screen.
  5. Log in as user “root” with no password.
  6. Under “General Settings”, select “Change password”.  In the pop-up window, enter a new password for the “root” MySQL user, and then press “Go”.
  7. In the ribbon at the top centre of the screen, select “Users”.
  8. Halfway down the screen, there’s a section called “New”.  Click on “Add user”.
  9. Under “Login information” enter the name “emoncms” in the “User name” field.
  10. Leave the “host” field set to the default value, to allow login from any host (or, for additional security, you could select “Use text field” and enter the IP address of the Raspberry Pi which will run the emoncms software).
  11. Enter a password for the “emoncms” user in the two fields provided.
  12. Under “Database for user”, select the checkbox marked “
  13. Click “Go” (which is at the very bottom right of the page).

Continue with the instructions, but disable the MySQL service on the Raspberry Pi, as we’ll use the one on the Diskstation instead:

sudo update-rc.d mysql disable

In the section of the instructions entitled “Set emoncms database settings,” set the username to “emoncms” and the password to the password you set in step 11 above. Set the hostname to the IP address of the DiskStation.  Set the database name to “emoncms”.  Once these settings have been made, reboot the Raspberry Pi and point your web browser its newly installed EmonCMS installation.  Assuming the Raspberry Pi’s address is, this would be  Register a new account on that page.  You should see an account status page.  In the “My Account” column, there is an entry called “Write API key”.  Copy that value (it’s a string of letters and numbers) as you’ll need it in the next step.

Enable writing to the SD card with the “sudo rpi-rw” command.  Edit the emonhub configuration file.  The instructions show how to edit the file, but they don’t explain what to change. Under “Reporters” you’ll see a line like this:

        apikey = xxxxxxxxxxxxxxxxxxxxxxxxxxxx

Change the string of “x”s to the value of the Write API key you copied above.  Save the file and exit the editor. Restart emonhub:

sudo service emonhub restart

At this point your EmonCMS installation should be working (although a reboot of the Raspberry Pi might be a good idea) and upon logging in to EmonCMS and clicking on “Input”, you might be lucky enough to see any nodes you have already installed listed with their data values.

Three years ago, I wrote about making Trixbox work in the UK with TDM400P analogue line cards in a PC to connect to the PSTN and normal telephone extensions.  That setup served me well for ages, but I began to have difficulties with the Digium TDM400P cards when driving the lines to the exchange.  One of the channels started to play up, and as the DAHDI drivers are not really user-friendly either, I migrated to a pair of Linksys SPA3102 boxes.  These are sweet devices which have a lot more functionality in them than I use in my setup.  The SPA3102 provides an exchange line (PSTN) interface socket and also a traditional analogue phone interface socket, as well as two Ethernet interfaces, one intended to connect to the Internet (or in this case, to my Asterisk server) and one which I do not use, intended to serve a PC or home/office network.

Things in the Asterisk world have moved on in three years, and one change is that Trixbox is no longer supported.  Feeling that the time was right for an upgrade, I looked around the web and concluded that the front runner these days is PBX in a Flash.  This is very similar in scope to Trixbox, being a complete distribution presented as a bootable DVD which takes over and overwrites the entire machine it is booted on.  Beware!  For my upgrade, I disconnected the existing disk drive and used a different one for the new installation.  In typical calavier fashion, I didn’t write much down about my existing configuration and just went ahead and installed the new one.  I used PBX-in-a-Flash (PIAF) v2. which includes CentOS 6.2, and I used the 64-bit version.  PIAF requires the user to make quite a lot of choices during installation, and I chose FreePBX 2.9 and Asterisk 1.8, these being the most recent stable versions.

Installation takes forever,  belying its name.  The massive distribution doesn’t even include half the stuff you need, instead relying on the Internet to download and automatically install additional components.  There are several guides to installation on the Web, so I shan’t attempt one here.  What I do want to cover though is the mysteries of getting the TDM400P cards to be recognised.

The best guide to this which I found is Configuring and Testing Dahdi Hardware.  This covered the basics for me, though I had to recompile and reinstall the DAHDI drivers first:

# cd /usr/src/dahdi/
# make all
# make install
# make config

# cd tools
# make distclean
# ./configure
# make install

Then reboot the machine.

The undocumented magic for me was:

# dahdi_genconfig
# cd /etc/asterisk

Edit chan_dahdi.conf and add this line near the end, before chan_dahdi_additional.conf:

#include dahdi-channels.conf

After that, it’s time to reboot again and confirm that the channels exist:

# dahdi_cfg -vv

This should list lots of channels on the cards you are configuring.  They should also be visible in the Asterisk command-line interface (this output is specific to my setup):

piaf*CLI> dahdi show channels
Chan Extension  Context         Language   MOH Interpret        Blocked    State
pseudo            default                    default                         In Service
1            from-internal              default                         In Service
2            from-internal              default                         In Service
3            from-pstn                  default                         In Service
4            from-pstn                  default                         In Service
5            from-internal              default                         In Service
6            from-internal              default                         In Service
7            from-internal              default                         In Service
8            from-internal              default                         In Service

One more magic step: use a browser to access the FreePBX administration interface on your server, and go to the Setup->DAHDi screen.  Under Analogue Hardware, find a line entitled “FXS Ports” and hit the “Edit” link.  If the Group entries are blank for your channels, enter “1” in each group field, then save and apply the settings.  At that point you should be able to create DAHDI extensions.  Hoorah!

The UK-specific changes I documented in my first article on this subject probably still apply, but I haven’t tried them as I no longer use the FXO ports.

Turn it on

{Administrator}=>service system modify
[state] = enabled
[log] = false
:service system modify name=SNMP_AGENT state=enabled log=disabled

Add a RO community

{Administrator}=>snmp community add
securityname = ROCommunity
communityname = ******
Please retype communityname for verification.
communityname = ******
:snmp community add securityname=ROCommunity communityname=_DEV_E43BC822A4BAE52F
{Administrator}[snmp community]=>

Where the asterisks are type your chosen community name.

Once this is done I could access the router using SNMP version 1 and my RO community string.

This information was taken from with thanks.

I was reading this interesting catalogue of telco-powered products which rely on the ultra-reliable batteries in telephone exchanges in many countries including the UK.  In my imagination, after the apocolypse, as we’re all sitting in our cellars drinking the best bottles of wine, but we can’t find the corkscrew because the lights have all gone off, we will rig up lights powered from the telephone line and everything will, somewhat briefly, be all right.

But then I had this fantastic idea.  Where I come from, there’s a trend to solar power and micro-generation with the government subsidising technologies and products which allow locally generated electricity to be sold into the national power grid, at really good prices too.  But why wait for the solar panels and micro-generation? We have a great source of local power already: the phone company!  I now plan to develop a gadget that takes power from the phone line and sells it to the power company.  OK, so the amount of power available will be very small, but it will always be there!

Another idea would be to take cheap energy in the night time, store it in hot water tanks, and generate electricity from it again in the day, selling it back to the power company at a better rate later.  Could this be my future income stream??

I’ve been trying to use Ruby libraries to access Sharepoint and am having trouble getting to the starting line.  NTLM authentication from Ruby doesn’t seem to be in a good state.  I’m using httpi-0.9.6 as my HTTP library, which by default uses httpclient-2.2.4, and for NTLM support I’m using httpi-ntlm-0.9.6.  All this is running under Ruby 1.8.7 which incorporates Net::NTLM 0.1.1 which http-ntlm relies on.

In my enterprise environment, I need to use NTLM authentication to access the Sharepoint server.  So, I format the username string supplied to httpi as “USERDOMAIN\username”.  It happens that the Sharepoint machine I want to access is in a different NTLM domain than the user account that I want to access it with.  When httpclient does the NTLM authentication phase, it uses facilities from Net::NTLM to format a Type 1 Message.  This is where the problems start.  Firstly, httpclient doesn’t do the right (undocumented) things necessary to get Net::NTLM to properly include the user’s domain into the request.

case state
  when :init
    t1 =
    t1.domain = domain if domain
    return t1.encode64

The trouble here is that this code doesn’t properly tell Net::NTLM that this domain information should be incorporated into the request.  As written, HTTPI generates a corrupt request, as can be seen from a Wireshark trace.  It’s additionally necessary to enable the resulting SecurityBuffer and to set a flag in the request indicating that the domain is being signalled:

case state
  when :init
    t1 =
    if domain
      t1.domain = domain
    return t1.encode64

But when you do this, you find that the packet is still corrupt, because the offset to the domain name data in the resulting request is incorrect.  This is because of what appears to be a bug in Net::NTLM.  That’s not so easy to fix and play about with, because it’s incorporated into Ruby itself.  The problem is that the offsets are calculated by adding the sizes of the SecurityBuffers defined for the message type, regardless of whether a particular SecurityBuffer is active or not. For my testing purposes, I forced the additional “workstation” SecurityBuffer to be active (with an arbitrary non-null value) in the same way as the Domain, and by doing so, was able to generate a valid request.

But imagine my horror when my requests were still denied by the server.  Further investigation revealed that Net::NTLM ignores the user-specified domain when generating the subsequent Type 3 Message, substituting instead the Target value returned in the Challenge of the Type 2 Message.

Further hackery will be required to fix that, but another approach might be to use Curb instead of httpclient.

52 Brasstack Lane

3rd September

Dear Mary,

By heck, it were grand to go striding over the Peaks wi’ you last month.  I’ll never forget t’way t’rain trickled down your Parka.  And the lovely pink colour your face went when you choked on my Kendal Mint Cake.  And as for your blisters!  It fair makes me knees go weak to think about ’em.

Back here in Cleggithorpe, life’s just not the same.  At t’Miner’s Arms last night, Willy and Dick fair gave me a ribbin’.  “Eeee, Davey, lad,” they said, “hast lost thi sense o’ perspective?  She’s only a lass when all’s said and done.  Have another pint, lad, and we’ll get some black puddin’ on t’way home.”

But somehow, as I stared moodily at t’black puddin’, I couldn’t help thinkin’ o’you.  Tell me Mary, can you come up next weekend?  We could climb Cleggie Crags and hold hands in t’sleet.


Several years ago, the smart dining chairs I’d been given for my 21st birthday began to fall apart, and I started to restore them.  The chair bodies were mostly deconstructed, sanded and glued back together again—slow, careful work, but very relaxing.  I used PU wood glue which is wonderful stuff.  After final sanding, the wood was wiped down with white spirit and three coats of polyurethane varnish.  When it came to restoring the ripped and ruined seats though, I was less confident how to proceed.  Luckily, a friend had been on a furniture restoration course, and she remembered enough about the process to get me started.


Magnetised Tack Hammer
Curved upholstery needle
Heavy duty scissors


Hessian (cloth)
Calico (cloth)
Plasticised cloth or leatherette, etc. (outer covering)
13mm tacks (used for what?  Webbing?)
10mm tacks (used for hessian, calico and outer covering)
Gimp pins (used for fine work on outer covering)
Number 2 upholstery twine (thickish twine)


These instructions explain how to upholster a solid-based chair seat using traditional materials.  There are other ways to do this job using more modern materials; typically foam padding is used and cut to shape using specialist equipment.  I wanted a more traditional approach which I felt would better match the dining chairs I have restored.

The chair with the solid wooden seat-base fitted

I have assumed that the chair seat has a solid base, as mine had.  If instead the seat has an empty, rectangular frame, then webbing must be mounted on the frame first.  I have not done this myself.  Once the webbing is in place, these instructions can be adopted as though the seat had a solid wooden cover.

Underside of the solid base

Underside of the solid base

Hessian layer

Place the seat frame upside down on top of a sheet of hessian, and fold the hessian around the frame.  The hessian should be cut large enough to allow it to fold around the bottom of the frame as shown in the photo.  Cutting hessian is not easy.  Where possible, try to cut true to the “grain” of the hessian.  One might mark the cutting line with a fat permanent marker, or one can remove a single thread of the hessian to create a straight line to cut along.  Choosing the right size for the hessian is important.  As shown in the photo below, the idea is to have enough material to cover the top and extend around the sides of the seat, finishing quite close to the edge on the bottom of the seat.  The material is folded under itself before being tacked, as you can see at the corners in the photo below.  The reason for tacking the hessian close to the edge of the seat base is to allow room further from the edge for the additional nails which will hold down the subsequent coverings.

With the seat frame sitting face down on top of the cut hessian sheet,  place one of a pair of parallel frame edges towards you.  Fold the nearest edge of the hessian up onto the back of the frame, tuck the edge under and tack in the centre of the side using a 10mm tack.  Do the same at the opposite edge, stretching the hessian taut.  Then do the same again on the other two edges, placing one tack in the centre of each edge.

Tacking the hessian layer to the solid base

Tacking the hessian layer to the solid base

Then, add tacks to the left and right of the initial tacks, spaced about 0.5in to 0.75in (15mm, say) apart.  Add two tacks on the side nearest to you, two on the opposite side, then two on the left side and two on the right, tightening the hessian as you go.  Then work towards the corners, adding two tacks per side at a time.  Tidy the corners as best you can without allowing multiple layers to overlap as this would impede fitting the seat back onto the chair.

Finishing a corner of the hessian layer

Finishing a corner of the hessian layer

Twine spiral

The cushioning of the seat is provided by soft padding called coir, which is made from coconut husks.  This padding needs to be held in place so that it doesn’t bunch up or migrate, and loops of twine are used to achieve this.  As shown in the second photo below, I used a “square spiral” layout for the twine.  Attach the end of the twine to the hessian using a knot close to the one edge and half a hand-width from one corner.  Using a curved upholstery kneedle, make a stitch into the hessian one hand-width away from the starting point, parallel to the edge.  The size of the loop is governed by the width and height of the four fingers around which you thread the twine, as shown in the photo below.  I found this was a good size to allow a suitable amount of coir to be packed beneath it.

Each loop should be about a hand-width wide

Each loop should be about a hand-width wide

When forming each loop, take care not to tighten the previous loop—each loop has to have room under it to pack the padding material in the next step.  Continue forming loops in a line parallel with the edge of the seat, finishing the last one half a hand-width from the opposite edge.  Then, turn parallel with that edge and continue stitching loops until the same distance short of the next edge.  Continue in this fashion following a kind-of spiral pattern until the entire surface of the hessian layer is spanned by loops.

The complete twine spiral will allow even distribution of the padding

The complete twine spiral will allow even distribution of the padding

Pack surface with coir

Pull a bunch of coir from your stock and feed it under the first loop.  Select the quantity of coir for each bunch such that the bunches just overlap each other.  Be careful when packing the coir in, not to pull twine from the next loop!  Don’t let the coir spill over the edge of the seat.

Pack bunches of coir under the twine, extending to the edge of the seat

Pack bunches of coir under the twine, extending to the edge of the seat

The bunches away from the edge of the seat can be a little larger than those at the edge, to provide a slightly deeper cushion in the centre of the seat.  The corner bunches need to be a little longer than the rest, as they have to gather right around the corner stitches, covering more area.

The seat showing all the coir packed under the twine loops

The seat showing all the coir packed under the twine loops

Cover with calico

Place the padded seat cover upside-down on a sheet of calico, and fold the material up around the bottom of the seat cover so that it reaches several inches in from the edge of the seat, and cut it off.  Don’t cut the material at all close to the edge, because one needs a good length of material to pull on, during this step.

The calico is stretched across the coir padding and tacked inwards of the hessian

The calico is stretched across the coir padding and tacked inwards of the hessian

Calico is fairly thin material and overlaps can be tolerated on the bottom face of the seat, but not at the corners.  Using a similar technique to that used when attaching the hessian, tack once at the center of each side, stretching the material to compress the coir padding before knocking in the second and subsequent tacks.  Place the tacks just inwards of the folded hessian beneath.  Once the first tacks are in place on each side, stretch the material as tight as possible before putting in the next tacks—the firmness of the resulting cushion will be determined by how tightly the calico is stretched, so this is important.

Avoid overlaps at the outer edge on the corners of the seat

Avoid overlaps at the outer edge on the corners of the seat

The calico-covered cushion, from above

The calico-covered cushion, from above

Add skin felt mat (optional)

Some cushions are further padded with “skin wadding,” which is applied on top of the calico layer.  I did not use this on my seat cover, for fear of fattening the base sideways so much that it would not fit into the chair.  It might be particularly appropriate if the final covering is a bit thin—coir is quite wiry and could potentially penetrate a thin covering.

Planning the folds for the final covering layer

Planning the folds at the corners was the most challenging aspect of this project.  I made a mock-up of the corner folds using a piece of paper, and I recommend this method before starting to cut your real covering material.

The next five photographs illustrate the folding method I devised.

Place the seat cushion on a rectangle of paper

Place the seat cushion on a rectangle of paper

Fold one edge up

Fold one edge up

Fold the paper around the corner as shown

Fold the paper around the corner as shown

Fold the top back and down

Fold the top back and down

The first diagonal fold (above) creates three layers of material.  By careful cutting, the two lower layers can be removed to avoid extra thickness.

Fold the material up against the second side and fold onto the bottom of the seat as shown

Fold the material up against the second side and fold onto the bottom of the seat as shown

The second diagonal fold (above) also creates three layers of material.  The underlying two layers can again be trimmed out.

The same folds with the real covering material

The same folds with the real covering material

Above you can see a trial folding using the real covering material.  This demonstrates the extra thickness and the need to trim away the inner layers.

Applying the final covering

I chose a leatherette-style covering, perhaps a little over half a millimeter thick and backed with a fine mesh.  It’s important not to choose too thick a material as some overlap at the corners is unavoidable, and the extra thickness was a potentially serious issue for me.

Initial tacking of the final covering material

Initial tacking of the final covering material

Applying the final covering material starts in the same way as the previous layers did: one tack in the centre of each side, stretching the material strongly before hammering in the tacks.  However, before progressing too far outward with the tacks on each side, the corners must be folded and trimmed, following the plan devised above.

It's much harder to manipulate the covering material than it was the paper

It’s much harder to manipulate the covering material than it was the paper

First (below), fold the material from the right hand side around the corner, against the front face:

Fold across the front

Fold across the front

Next (below), fold the excess above the corner back and downwards:

Fold back and down

Fold back and down

Next, fold the material from the front upwards and back over the front edge:

The second diagonal fold

The second diagonal fold

The result is too bulky.

Crease and reopen the folds

Crease and reopen the folds

More to come!