Trip to Nepal and Bhutan

We got back from our latest long haul trip on Saturday, where we had a week in Bhutan and a couple of days either side in Nepal. The tl;dr version is that Bhutan was stunning, with its abundance of vertiginous mountain passes, unpolluted air and crystal clear streams. It’s difficult not to make unfair comparisons with Nepal: Kathmandu had the bustle, hectic traffic and air quality that you might expect in any big city (our final two days Bhaktapur had a little less of each of the above) but it was nonetheless a fascinating place to visit.

A few bits and pieces before I dig into our itinerary…

Elevation

Neither my wife nor I ski. I’ve never seen the appeal but I have an old knee injury which has helped to make up my mind. We’ve also never really done a lot of hill walking. I think the nearest proper hiking to home would be in the Peak District, which we have been to, albeit about 12 years ago. Cambridgeshire, where we live, is notoriously flat: the town we live in has precisely one hill which must be all of about 5 metres high. We are also 10 metres above sea level.

So, deciding to go on holiday to the Eastern Himalayas was always going to be something of a stretch for us. We spent the majority of our time in Bhutan at between 2.4k and 3k metres. Admittedly, this isn’t going to trouble most people; nor was our guide dropping bottles of oxygen at strategic points along our route. But if you’re in your mid 50s, a bit overweight and asthmatic (I am all of these), it can be bloody hard work: walking up a couple of flights of stairs had us gasping for air at the start of the week.

Or, as my wife said at one point during our hike to the Tiger’s Nest, “I can feel my pulse in my eyes”. More on that later.

Packing and the Weather

Not quite as challenging as our extremely weight constrained trip to Botswana, packing was still tricky: the weather swung from just below zero overnight to a maximum of 29C. So we had to account for all eventualities. One unanticipated factor was that the forecast apps on our phones (AccuWeather and Apple’s own) were consistently and laughably inaccurate in both countries. I imagine that the Himalayas don’t play too well with Radar.

Phones and WiFi

Having had a successful experience with an eSIM for our trip to Korea, I briefly looked into it again but I couldn’t find any deals that covered both Nepal and Bhutan. We managed fine without it: all of the hotels had very reliable WiFi.

Bhutan: Sustainable Development Fee

Anyone who has looked into travelling to Bhutan will have come across this: it’s $100 per day per person, and includes your guide and food. The holiday company that we used did the processing (and rolled it into the price of the holiday). Food wise, the practical implication was that the majority of what we ate was buffet style. For the 2 or 3 nights when we were served dinner at the table, we didn’t have a choice on what arrived. In general it was very tasty: lots of veg, and small portions of protein (generally a curry of some description). If we had one minor criticism, more often than not it wasn’t very warm. 

Wildlife

Next to nothing during the entire two weeks. I think the most excitement we had was when a mouse ran across the bar in the hotel in Thimpu. We saw one yak, which was in a rehab centre for injured takins (national animal of Bhutan: kind of like a cross between a gnu and a night club bouncer). I didn’t take my long lens and didn’t miss it.

Kathmandu

We started our trip with a couple of nights in Kathmandu. Getting there was reasonably straightforward: we flew with Qatar Airlines, and had a layover of a couple of hours in Doha on the way. We’d never flown with them before and it was a pretty nice experience. It has to be said that using their website to reserve seats and check in was a thoroughly puzzling affair: lots of timeouts and unclear messaging as to whether what we had just tried to do had worked.

We had two nights in the Kathmandu Guest House which is in a touristy area of the city (Thamel). It’s an ok hotel, built around a pleasant courtyard and garden, but the rooms and fittings were tired. We had the first day to ourselves to explore, navigating the riotous motorbike traffic, storm drains and absence of footpaths. We found a couple of nice places to eat (particularly a spot called the Third Eye), but the area is kind of what you’d expect: lots of shops selling tat and knock-off brands. I’ve never seen counterfeit North Face kit before, and it was everywhere – but I guess it’s in keeping with the location.

This was nice…

The weather on the first day was warm and sunny, which led to us making a rather poor spur of the moment decision on the morning of the second day when we were going out on a walking tour. It looked cloudy, so I threw on a new pair of long trousers and flip-flops. A quick aside on those bloody trousers, which I’d bought just before we left: they are kind of like tracksuit bottoms, but with a soft, slightly stretchy chino type material, and an elasticated waist. While they sound hideous, they look ok and are incredibly comfortable, and I’d originally planned on travelling in them. What I hadn’t anticipated was that the waistband wasn’t up to the rigours of a full day of walking, particularly when it included steps up and down various temples and monuments.

Back to the walking tour. Shortly after we started, the temperature dropped and it started to pour. We have made the same mistake time and time again: we get bound up in the enthusiasm of our tour guide who ends up walking the legs off us. We ended up walking for 7 hours, including a lunch stop. Parts of the city (particularly around Durbar Square) were quite muddy. At one point a few hours in, rather than taking in the sights, I was looking at the mud mixed with fresh pigeon shit squelching between my toes, all the while I holding a fistful of my trousers to stop them from falling down. Meanwhile it continued to rain… My wife was was having similar thoughts about her choice of footwear (sandals): she’d discovered a blister on her foot before she set out, and was wondering about how it would fare under the onslaught of mud and poo.

I don’t have a lot of pictures from that walking tour: it was too wet for my SLR and I spent a lot of time looking at my feet – while intermittently hoicking my trousers up. We saw some interesting stuff but to be honest, I think my lasting memory will be of a mixture of jet lag, rain and pigeon shit.

Durbar Square. And pigeons.

Bhutan: Paro and Thimpu

We had a 5am start for our flight to Paro. I am not the greatest fan of flying so I deliberately avoided doing any research on the approach through the mountains that the plane has to take. It was actually pretty exciting, and the pilot got an impromptu round of applause from the passengers – probably in part through relief. My wife spent a couple of years living in Hong Kong and said it was comparable to the landing at Kai Tak, except that you are threading your way through tree-topped mountainsides rather than skyscrapers.

Paro has to rate as the most beautiful international airport that we’ve ever been through, although it has to be said it’s not exactly up against fierce competition for that accolade.

We had a short drive to the Rinpung Dzong, where there was a Buddhist festival celebrating the start of spring (Paro Tshechu).

Buddhist monk, Paro Tshechu, Rinpung Dzong
Paro Tshechu, Rinpung Dzong

From there we drove to Thimpu, where we had 3 nights in a hotel called the Namgay Heritage. It was by far the best hotel that we stayed in: very friendly, comfortable rooms, and some of the best food that we had.

Namgay Heritage

Downtown Thimpu

Great Buddha Dordenma, Thimpu

We had a 3 hour forest hike back from the statue above, and I think it was our guide’s way of testing our fitness levels. It nearly killed me and, suffice to say, I think he noticed.

This isn’t a great shot (I had to push the ISO and there is a fair amount of chromatic aberration) but it was part of an interesting visit to an artisanal paper making mill:

Lokta paper, made from a plant called Daphne.
Dried cheese snack – hard as rock. I wasn’t wild about it.

Thimpu to Punakha…

We had a couple of nights in a smallish hotel called the Dhumra Farm Resort. “Farm” is an over enthusiastic piece of marketing. I had half-formed ideas of yaks ambling past and rosy cheeked locals sitting around making cheese. “Hotel with large vegetable garden” is closer to the reality. It was, nonetheless, a very nice place to spend a couple of days.

…And Back to Paro.

Rinpung Dzong, Paro
Tachogang Lhakhang, the metal chain bridge. Outskirts of Paro.

Our last accommodation in Bhutan was the Tenzinling Resort: it was the biggest hotel but, like many of the other places that we stayed, it wasn’t busy at all. Perfectly comfortable, if a little unremarkable. Our room had a nice view of the valley (including one of the monasteries that we visited on our last day).

The weather continued to be very mixed. One of the highest points that we went through in both directions between Paro and Thimpu – the Dochula Pass, about 3.2k metres – was completely clouded over both times. We had to write off one sightseeing stop on the agenda, which was a walk that kicked off at 4k metres, as the road to the pass was covered in snow. Our guide had already said that we would struggle with the elevation which, after my performance during the Buddha statue hike, was probably a polite way of saying “you will die and I will feel guilty for a couple of days”.

The Tiger’s Nest

On the second last day we had a 6:45am start for the Tiger’s Nest. We didn’t know if it was going to be a runner, as it was still very cloudy when we left the hotel, but it cleared and turned out to be a perfect temperature for the hike.

A man in hired national dress (a gho) with a questionable choice of hiking footwear…

Even though we were partly acclimated to the slightly thinner air, no matter how you slice it, it’s a very tough hike. According to my phone, you start at about 2.6k metres and end at the monastery at 3.1k, but it’s a pretty hard won 500 metres difference. Needless to say there were super fit 70-somethings with quads of steel bounding past us. Thankfully, there was also a good sprinkling of much younger near-casualties along the way. I remember looking at their tortured, pallid faces and thinking, “yep, that’s probably what I look like, and I’m betting you work in IT too”. 

There is a point about 2/3 of the way where you turn a corner to have a clear view of the monastery, and which you get to by a series of steps. Rather dishearteningly, you have to go down to get back up. At this point, say a couple of hours in, it really starts to hurt. One funny observation: when you finally enter the monastery door, the first thing you are greeted with is yet more steps. It would be interesting to hang around there to hear the various takes on “you’ve got to be ****ing kidding me!” at that point. We certainly said it.

The Tiger’s Nest – almost there…!
A little closer…

We grossed 7 hours for the round trip, which included a stop for coffee on the way up, and lunch on the return leg at the café, which roughly marks the halfway point.

Data from Garmin Connect: yep, feels about right…

We had a nice end to the day planned on our itinerary, which was a traditional hot stone bath. We drove to another hotel which had what looked like a long shed out the back. This was divided into cubicles, each with wooden baths, the ends of which jutted out of the wall. A couple of people grabbed round boulders out of a fire, plunged them briefly in water – presumably to clean them, and possibly to take the edge off the temperature – and then dropped them into the bath. It’s less perilous than it sounds: the compartment for the stones was separated from the rest of the bath with wooden slats. However, it was potentially dangerous for the people operating the giant tongs to lift the stones from the fire: one of them split into 3 pieces, each of which rolled very close to the person’s foot. I lasted about 15 minutes in the bath before I was cooked.

Paro to Kathmandu

We had a 4am alarm to get to the airport at Paro. While the airport building is lovely, there are no departure boards and, correspondingly, a haphazard assignment of gates. There are only 3 but, to all intents and purposes, we found out our gate by a rumour that spread through the passengers, as we bided our time during the hour we were delayed. While the takeoff isn’t as memorable as the landing, we did get a fantastic view of Everest. 

Possibly the worst picture I’ve ever taken. Outbound flight: this is either Everest or a cloud…
…but this definitely is. From the return flight: directly under the wing tip (with an iPhone reflected in the window)

One point that we hadn’t really thought about up to this point was the implications for the visa, specifically re-entering Nepal. You are best to ‘pre-apply’ before you arrive. You queue to pay after presenting your form, and then get the passport stamp and sticker at immigration. It’s a multiple entry visa so you can come and go for as many days as it’s valid for.

Bhaktapur

We didn’t stay in Kathmandu: our travel agent suggested Bhaktapur as a kind of half-way house between low population, pristine beauty of Bhutan and the hive of activity that is the capital. To be honest, there wasn’t that much difference: the motorcycle traffic was just as bonkers as Kathmandu had been. The air quality was better, though.

Bhaktapur

Our final accommodation for the last couple of nights was the Hotel Bhadgaon. I’d say this was probably the smartest of the places that we stayed in throughout the holiday. It was a nice room and, unlike the Guesthouse in Kathmandu, it didn’t feel like the power sockets were going to come away from the wall every time you pulled a plug out. We were back to fending for ourselves for food. Lunch on the first day was in Durbar Square in a spot called the Cafe D’Tradional Restaurant. It was awful. I found a piece of nylon fibre in my momo (Tibetan version of Gyoza that you get all over the place). In contrast, we went to the same place for dinner both nights based on the Google ratings – the Balakhu Food Point – and it was terrific.

Vegetarian momos in broth, the Balkhu Food Point.

Sightseeing wise, we had the first day to ourselves and, after the 4am start, we were shattered. We had a slightly confusing conversation with our guide (the same one whom we’d had in Kathmandu) about a pass that we needed for the Old Town: from our hotel, there were a couple of nearby bridges where the passes were issued and then checked (very half-heartedly) on subsequent admission.

Bhaktapur

We had a very enjoyable last half day of sightseeing with the guide although I think he had given up on us a little bit, as we were invariably trailing behind him by about 20 metres.

Our guide survived the encounter with the moped driver whose eyes were closed.
Thanka Painting School, Bhaktapur.
Changu Narayan temple

…And the flight home.

Our flight from Kathmandu was delayed by more than an hour, which left us starting to feel a bit tense about our layover in Doha. This wasn’t helped by the very lax approach to providing information updates about what was going on. The airport was a perfect mixture of efficiency and chaos.

When we finally got to Doha we had about 40 minutes from the plane touching down to get to the gate. To be fair, the airline did manage this part well: there were about 30 passengers all transferring to our flight (and about a similar number for a flight to JFK). A guy was waiting with a printout of the flight number and he force-marched us through security and to the gate. While we got to our seats with about 10 minutes to spare the plane was then delayed, presumably while our luggage was stowed.

Final Thoughts…

We had a thoroughly enjoyable, thoroughly exhausting trip. It’s now two days since we got back, and we’re both feeling under the weather: all of the early starts have caught up with us.

Bhutan was stunning. It has enviable infrastructure, and has the retention of a minimum of 60 per cent forestation written into the constitution. It is also sandwiched between two superpowers. It appears to be thriving, something that hopefully it will have the chance to continue to do. I’d go back in a heartbeat – maybe after working on the fitness levels.

Nepal was, to all intents and purposes, an extended transit point for us. While both of the cities that we stayed in weren’t exactly laid back and relaxing, they were fascinating, and we barely scratched the surface of the country.

Tkinter, the after() Method, and Threading

Over the summer, I wrote up a post on my latest Raspberry Pi project, which is based around an 8 inch touchscreen and some Tkinter code.

It is heavily reliant on the after() method to periodically update the state of the various labels and buttons that comprise the UI elements. The main label cycles through RSS feeds, a shared Google calendar, and a NASA image of the day which involves some screenscraping. (I’m well aware of how bad an idea this is; in fact its reliability is something I’ll come back to in a second.) There is also a row of per-Hue light buttons that are constantly polling the bulbs’ states, and setting their colours in a meaningful way.

I continued refining the functionality after I posted the write-up and when I finally got to a point where I thought I was done, I noticed a problem. After a day or two, the buttons started to fall permanently out of sync with the bulb states. They displayed the wrong colour (for on / off / unreachable) but still worked to control the lights. For weeks, the cause was a complete mystery.

I think I’m starting to figure it out, starting with a few novice-level implementation errors. Despite the fact that I’ve been using Python for a very long time, it has generally been for fire-and-forget utility scripts. This code is fundamentally different in that it has to run indefinitely, which elevates the need for stability. At the same time, I introduced a few new moving parts (for me): using modules to try to make everything more readable and potentially reusable, and the use of the Python logging framework.

One embarrassingly simple mistake that I was also making was using a desktop shortcut to launch the GUI. While this made sense for the touchscreen, it meant I was losing anything that was being written to standard error. With the benefit of hindsight I am sure I could have redirected this using the logger but at the time, it appeared as if the functionality was failing silently no matter what logging statements I was using. But there was another aspect to this: the problem seems to have been with errors that I’d intuitively expect to be unrelated.

It appears that Tkinter is very sensitive to exceptions being thrown, and it’s worth digging into how this manifests in more detail. I have one module which is using an after() method call in a 15 second loop to poll the Hue hub for every bulb, using the Requests library. In another module, I have a randomised selection of content, all of which uses Requests in one way or another. One of these is for the NASA image of the day. The approach I use for this is pretty ridiculous: a search for a relative URL in the HTML, and then the construction of an absolute URL to haul down the image it refers to. Coming as a shock to absolutely no-one, this is occasionally unreliable.

What I wasn’t expecting was a Requests exception in one module affecting the use of the same library in another one.

While I have used threading in other languages, I haven’t in Python. I imagine that each of the after() calls I make is running in its own thread: I can’t see how this works any other way, otherwise the main event loop would be blocked. But the exception in one thread tearing other threads down? I’m not sure about this. There are plenty of hits on Google if you search for ‘Tkinter thread safety’ but, from what I can see, these get into discussions on what happens if you implement threads yourself as opposed to what’s going on under the hood.

I have – I think – eliminated most of the obviously problematic sources of errors by doing what I should have done in the first place for long-running code: surrounding the various calls to Requests, JSON parsing etc. in try / except clauses. This seems to have ironed out the stability issues. So far.

But I haven’t discounted the possibility that I’ve made a fundamental mistake with the approach I’ve taken…

Bedside Pi: Hue Light Controller with 7″ Touchscreen

A couple of years ago, I built a little Kubernetes cluster using 4 Raspberry Pis. While I learned tons about K8s doing it, the cluster wasn’t reliable over the longer term. I only budgeted for one SSD (for the cluster master), and the SD cards in the other 3 Pis started to become unreliable after a few months. While I started cannibalising some of the hardware, the Pis themselves were gathering dust. Well, only 3 of them are now…

I bought a 7″ touchscreen (which seem to be in very short supply at the moment), and paired it with the matching enclosure which is linked to on the official site. I decided that I wouldn’t try to design my own model for 3D printing, having made a bit of a mess of it the first time round.

I’ve spent the last few evenings writing some code for it based around the CustomTkInter library, which is really nice. The ability to put things on the event loop using .after() is perfect for light control – e.g., polling the light state every 10 seconds to check for something other than the UI having switched them on or off.

I repurposed the same code I used for the eInk display to have persistent access to Google Calendar. I’ve not seen this widely documented but it’s pretty straightforward:

  • Create a project in the Google Console.
  • Create a service account
  • Export the private key of the service account. Given my day job, I feel obliged to say this is not good practice, but the alternatives rely on using some industrial authentication infrastructure which really isn’t going to be a whole lot of fun to run at home.
  • Add the service account to have access to your calendar.

While my choice of RSS feeds and button names is unlikely to be wildly interesting, the code is here.