Ben's Blog

Category: self sustainability

566 Articles
self sustainability ben July 15, 2025

A Decade Off the Grid

Well, that’s it, we’ve been off grid (minus the internet) for 10 years. Add that to the list of things I started counting in decades. And really, I’m not sure how much there is to say about it. It’s nice to acknowledge as an… achievement? But it doesn’t feel like much of one. We didn’t go through a marathon of hardships and stuck with it through thick and thin, instead things quickly became remarkably normal. Sometimes though, my brain snaps back to an earlier era, and I’m reminded that these are all uncommon and formidable adventures, only we got used to them. It’s wonderful how little I’ve had to say about all things off grid in recent years, though I figured that the 10 year anniversary would be worth a few remarks.

Maybe it’s only coincidental timing, but it’s hard not to notice that the intensity of these adventures is directly correlated with a spur of creativity and productivity in me that went far beyond building the things we needed. And as things started quieting down around year 7, so did that energy. Maybe it’s just the ebbs and flows of aging, having knowledge and energy in my 30s. Or… maybe my brain kicked into overdrive when faced with very consequential challenges.

The amount of learning by necessity that happened these past 10 years is quite frankly amazing, and that in term has made me even more curious about everything in the world. I clearly stand on the shoulders of giants, I am deeply grateful to all the people who shared their knowledge with me. I’ve talked with so many people about so many things. Phone calls, walks over to neighbors, colleagues, any question was met with generosity and patience. I’ve learned to recognize what I’d describe as a particular breed of hands-on New Englanders. People extremely smart, sharp in their observations of the natural world, of mechanical systems, coupled with decades of practice, good common sense & practical mind. Often times with a touch of humor, sometimes a little superstition, but I wouldn’t allow myself to do anything but nod, these are extremely smart and honest people, and I aspire to their greatness. On occasion and more these days, I too get questions and I’m all too happy to do my part within this great culture of knowledge and generosity.

I remember vividly moving into our tiny “house”, which was barely up. No insulation, no heating, no water, no electricity, no internet, no nothing. So what? I thought. Was that it? When flashlight batteries ran out the day was over, it’s really not as bad as it sounds. A 50% battery on the music player and a little wine were all it took to be truly happy. These first few weeks were very freeing and felt incredible. Through the years we definitely improved and ran into many joyous firsts: first water, first plumbing, first internet, first refrigeration, and many more. The goal was not to reinvent a suburban house with all the amenities, though there are things we quickly learned we wanted back but had to do without for a few years. And then there are things we’ve learned we won’t budge on. Wood heat is amazing: it’s resilient, abundant, cheap, and gets us out in nature. Solar power is plentiful but requires some management. It’s incredibly resilient and it feels like we found a universe hack to get free energy.

Winter came that first year and with it many doubts about the integrity of the new house. Its ability to withstand wind, withhold heat, and repel water when 4 tiny walls were all that stood between us and a blizzard. I did my best to be reassuring to wife & kid, and I rationally believed it, but I wasn’t exactly at ease either. So we’d talk about our escape route to the neighbors just in case. Today the house has much more mass, with multiple sections and 2 stoves. We can be in a room that doesn’t have every side shielding the anger of a storm. And it’s gone through 9 winters just fine. These worries are long gone but the first couple of years, blizzards really felt like they were trying to pry open the house to get us.

Our house is bigger, and our systems are so much better now too. It’s welcome by all, but I know the comfort we have gained is directly linked to having fewer amazing experiences. Challenging and amazing often go hand in hand this isn’t a surprise. When we didn’t have any wood storage inside, I found myself outside at night in the dead of winter many times to fetch more wood. These were surreal experiences. I often thought of earlier people and how intense nature feels when you’re more exposed to it. I have no doubt I’d believe in the supernatural if all my mind had known were such vivid experiences. The comfort of modern life has a way of toning down the intensity of the natural world. Now we have wood storage inside the house, and then again on the covered porch, and the routines in place to stay a good 3 weeks ahead so we can ride multi-day storms comfortably, which also means without surreal experiences… But it’s ok, things are supposed to get easier, in fact we are thinking about older age and we want to stay on this trajectory. Yet I am glad for having had these experiences, and they still happen on occasion.

I’m also glad we were able to overcome all these challenges. There wasn’t anything written that said we would, and there were definitely many paths that could have led to worse outcomes. Somehow we avoided them all and were able to keep making things better for ourselves. It’s impossible here not to acknowledge Nicole’s partnership in all this, the endeavor was doomed to be a massive train wreck had she not been fully on board and pushing hard just as I was. In some way, now that I know what we are capable of, I regret not having gone deeper in the middle of nowhere. But realistically I know it is better to have neighbors and some civilization nearby.

Beyond the challenges, we had a few “oh shit” moments, but nothing ever really bad fortunately. One night I got out for wood in the middle of a blizzard, and upon walking back to the house I realized after a bit I wasn’t at all headed there. No problem, I know the land well enough to get back, but I understood then all the stories I heard of people getting lost in snow storms. We also had a couple of moments at the tail end of stove season when threw our very last log on the fire and had to go out to get a tree immediately following, preferably something dead or an ash, but hey who are we to be picky? We’re often a little behind on wood, but not that terribly :).

Where we are now is that we truly live in a piece of paradise that is very hard to leave. It’s objectively picture perfect, and we get the added dimension that we know how rough it once was, and how much sweat went into softening it. The house is still unfinished but it’s quite ok and we love it. I have stopped pushing as hard as I used to and get to just enjoy things. Slowing down + things being nice is a great recipe for happiness. What’s in the future? For now we want to keep refining and enjoying what we already have. We definitely have projects: root cellar, solar for a car, green house to name a few. Just nothing our livelihood depends on, so we’ll get to them when we get to them.

agriculture, self sustainability ben July 11, 2025

Protected: Berry Tsunami

This content is password-protected. To view it, please enter the password below.

agriculture, self sustainability ben June 20, 2025

First Strawberries

It’s rare to get firsts these days :).

building, self sustainability ben June 09, 2025

Protected: Wrapping Up the Basement

This content is password-protected. To view it, please enter the password below.

self sustainability, wood ben June 09, 2025

Protected: It’s Been Wet

This content is password-protected. To view it, please enter the password below.

agriculture, self sustainability ben May 15, 2025

8 Years in the Ground

Some of the stick we put in the ground 8 years ago are starting to look like real trees. They have barely yielded any fruit so far, and so we hope that they’ll decide to produce a real crop one day. It’s been interesting to compare how well everything we bought from various nurseries performed. The best nursery by far has unfortunately closed. Another one I won’t name has given us only bad performers I’m tempted to just pull out of the ground after years of tending to. Worst failure rate, worst growth rate, worst everything, bleh.

plum

pear

maple syrup, self sustainability ben April 05, 2025

The Season is Done

Very smooth throughout. I’m not even sure how much we got, 10 gallons? More than enough for us and copious gifting. All we need to do is clean it all up now.

electronics, homestead automation, I.T., maple syrup, self sustainability ben March 15, 2025

Evaporator Regulator

This isn’t the most involved project but I might as well document it. I’ve been trying to automate some of the more boring tasks of running the evaporator, I’ve got some nice stainless steel float valves to regulate the sap going in now for example. One of the things that kept requiring constant attention is the air intake to adjust the strength of the fire. I’d have to sit with a foot on it to be able to regulate it almost constantly, to make sure the fire wasn’t burning too hard or too weak. And so naturally I thought I could do something with a Pi.

This proved quite successful even with very loose wiring and fastening just to see how it would work.

All of a sudden I barely need to pay attention to the fire’s strength, with a few refinements I won’t have to at all.

The circuit is quite simple:

Wifi barely reaches the sugarhouse so I made sure this could run independent of connectivity. Which involves coding threads on a Pi Pico, which is supported but not as one would expect.

import machine
import time
import network
import socket
from max6675 import MAX6675
import _thread
    

html = """{\"evaporator_temperature\":<TEMPERATURE>}"""

# LED
led = machine.Pin( "LED", machine.Pin.OUT )

# temperature
sck = machine.Pin( 2, machine.Pin.OUT )
cs = machine.Pin( 3, machine.Pin.OUT )
so = machine.Pin( 4, machine.Pin.IN )
sensor = MAX6675( sck, cs , so )
temperature_min = 25
temperature_max = 30
temperature = -1337.0

# servo
servo = machine.PWM( machine.Pin(0) )
servo.freq( 50 )
servo_min = 1000
servo_max = 8000
servo_at = 0


def temp_to_servo( temp ):
    if (temperature_max - temperature_min)==0:
        # right in the middle
        return int( (servo_max-servo_min)/2 )
    result = (temp - temperature_min) * (servo_max - servo_min) / (temperature_max - temperature_min) + servo_min
    if result>servo_max:
        result = servo_max
    if result<servo_min:
        result = servo_min
    return int( result )


def blink_number( number ):
    number = str( int(number) )
    for char in number:
        for i in range(int(char)):
            led.value( 1 )
            time.sleep( 0.2 )
            led.value( 0 )
            time.sleep( 0.2 )
        time.sleep( 0.3 )
        led.value( 1 )
        time.sleep( 0.1 )
        led.value( 0 )
        time.sleep( 0.3 )
            


keep_going = False
def servo_thread():
    global temperature, servo_at, servo
    
    while keep_going:
        time.sleep( 5 )
        print( "# measuring average temperature over 1 seconds..." )
        temperature_total = 0.0
        for i in range(10):
            temperature_total += sensor.read()
            time.sleep( 0.1 )
        temperature = temperature_total / 10
        blink_number( temperature )
        print( "# " + str(temperature) )
        new_servo_position = temp_to_servo( temperature )
        print( "# new_servo_position: " + str(new_servo_position) )
        step = 1
        if new_servo_position<servo_at:
            step = -1
        for i in range(servo_at, new_servo_position, step):
            time.sleep( 0.001 )
            servo_at = i
            servo.duty_u16( i )
    print( "# servo tread finishing" )

# main thread
servo.duty_u16( servo_min )
for i in range(servo_min, servo_max):
    time.sleep( 0.001 )
    servo_at = i
    servo.duty_u16( i )

try:
    ssid = "<wifi_ssid>"
    password = "<wifi_password>"
    wlan = network.WLAN( network.STA_IF )
    wlan.active( True )
    wlan.connect( ssid, password )

    # wait for connect or fail
    max_wait = 20
    while max_wait>0:
        if wlan.status() < 0 or wlan.status() >= 3:
            break
        max_wait -= 1
        print( "> waiting for connection..." )
        time.sleep( 1 )

    # handle connection error
    if wlan.status()!=3:
        print( "> network connection failed, will launch servo thread in 1 minute" )
        time.sleep( 60 )
        print( "> launching" )
        keep_going = True
        _thread.start_new_thread(servo_thread, ())
        while True:
            time.sleep( 1 )
    else:
        print( "> connected" )
        status = wlan.ifconfig()
        print( "ip = " + status[0] )

        # open socket
        addr = socket.getaddrinfo( "0.0.0.0", 80)[0][-1]
        s = socket.socket()
        s.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 )
        #s.settimeout(1)
        s.bind( addr )
        s.listen( 1 )
        print( "> web server listening on", addr )

        # listen for connections
        while True:
            print( ">" )
            try:
                cl, addr = s.accept()
                print( "client connected from", addr)

                request = cl.recv( 1024 )
               
                request = request.decode( "utf-8" ).strip()
                print( request )

                if request.startswith( "GET / " ):
                    print( "get data" )
                    response = html.replace( "<TEMPERATURE>", str(temperature) )
                    cl.send( "HTTP/1.0 200 OK\r\nContent-type: application/json\r\n\r\n" )
                    cl.send( response )
                elif request.startswith( "GET /min_temperature " ):
                     print( "get min_temperature" )
                     cl.send( "HTTP/1.0 200 OK\r\nContent-type: application/json\r\n\r\n" )
                     cl.send( str(temperature_min) )
                elif request.startswith( "GET /max_temperature " ):
                     print( "get max_temperature" )
                     cl.send( "HTTP/1.0 200 OK\r\nContent-type: application/json\r\n\r\n" )
                     cl.send( str(temperature_max) )
                elif request.startswith( "PUT /min_temperature " ):
                    print( "put min_temperature" )
                    new_min_temperature = int(request.split( "\r\n\r\n" )[1])
                    print( new_min_temperature )
                    temperature_min = new_min_temperature
                    cl.send( "HTTP/1.0 200 OK\r\nContent-type: application/json\r\n\r\n" )
                    cl.send( "\"ok\"" )
                elif request.startswith( "PUT /max_temperature " ):
                    print( "put max_temperature" )
                    new_max_temperature = int(request.split( "\r\n\r\n" )[1])
                    print( new_max_temperature )
                    temperature_max = new_max_temperature
                    cl.send( "HTTP/1.0 200 OK\r\nContent-type: application/json\r\n\r\n" )
                    cl.send( "\"ok\"" )
                elif request.startswith( "PUT /start " ):
                    print( "put start" )
                    cl.send( "HTTP/1.0 200 OK\r\nContent-type: application/json\r\n\r\n" )
                    if keep_going:
                        print( "  already started" )
                        cl.send( "\"already started\"" )
                    else:
                        keep_going = True
                        _thread.start_new_thread(servo_thread, ())
                        cl.send( "\"started\"" )
                        for i in range(5000, 6000):
                            time.sleep( 0.001 )
                            servo_at = i
                            servo.duty_u16( i )
                elif request.startswith( "PUT /stop " ):
                    print( "put stop" )
                    #cl.send( "HTTP/1.0 501 OK\r\nContent-type: application/json\r\n\r\n" )
                    #cl.send( "\"not implemented\"" )
                    # crash on stop, thread support is that bad
                    cl.send( "HTTP/1.0 200 OK\r\nContent-type: application/json\r\n\r\n" )
                    if keep_going:
                        keep_going = False
                        cl.send( "\"stopped\"" )
                    else:
                        print( "  already stopped" )
                        cl.send( "\"already stopped\"" )

                cl.close()
         
            except OSError as e:
                cl.close()
                print( "> connection closed" )
                keep_going = False
                time.sleep( 2 )
    

except KeyboardInterrupt:
    print( "> ctrl+c, wrapping up..." )
    keep_going = False
    time.sleep( 10 )
except Exception as e:
    print( e )
    print( "> unexpected exception, wrapping up..." )
    keep_going = False
    time.sleep( 10 )

import time
class MAX6675:
    MEASUREMENT_PERIOD_MS = 220

    def __init__(self, sck, cs, so):
        """
        Creates new object for controlling MAX6675
        :param sck: SCK (clock) pin, must be configured as Pin.OUT
        :param cs: CS (select) pin, must be configured as Pin.OUT
        :param so: SO (data) pin, must be configured as Pin.IN
        """
        # Thermocouple
        self._sck = sck
        self._sck.low()

        self._cs = cs
        self._cs.high()

        self._so = so
        self._so.low()

        self._last_measurement_start = 0
        self._last_read_temp = 0
        self._error = 0

    def _cycle_sck(self):
        self._sck.high()
        time.sleep_us(1)
        self._sck.low()
        time.sleep_us(1)

    def refresh(self):
        """
        Start a new measurement.
        """
        self._cs.low()
        time.sleep_us(10)
        self._cs.high()
        self._last_measurement_start = time.ticks_ms()

    def ready(self):
        """
        Signals if measurement is finished.
        :return: True if measurement is ready for reading.
        """
        return time.ticks_ms() - self._last_measurement_start > MAX6675.MEASUREMENT_PERIOD_MS

    def error(self):
        """
        Returns error bit of last reading. If this bit is set (=1), there's problem with the
        thermocouple - it can be damaged or loosely connected
        :return: Error bit value
        """
        return self._error

    def read(self):
        """
        Reads last measurement and starts a new one. If new measurement is not ready yet, returns last value.
        Note: The last measurement can be quite old (e.g. since last call to `read`).
        To refresh measurement, call `refresh` and wait for `ready` to become True before reading.
        :return: Measured temperature
        """
        # Check if new reading is available
        if self.ready():
            # Bring CS pin low to start protocol for reading result of
            # the conversion process. Forcing the pin down outputs
            # first (dummy) sign bit 15.
            self._cs.low()
            time.sleep_us(10)

            # Read temperature bits 14-3 from MAX6675.
            value = 0
            for i in range(12):
                # SCK should resemble clock signal and new SO value
                # is presented at falling edge
                self._cycle_sck()
                value += self._so.value() << (11 - i)

            # Read the TC Input pin to check if the input is open
            self._cycle_sck()
            self._error = self._so.value()

            # Read the last two bits to complete protocol
            for i in range(2):
                self._cycle_sck()

            # Finish protocol and start new measurement
            self._cs.high()
            self._last_measurement_start = time.ticks_ms()

            self._last_read_temp = value * 0.25

        return self._last_read_temp

Web requests collection.

maple syrup, self sustainability ben March 15, 2025

We’re Boiling

The operations is smoother, the kids are older. Sugaring season is liminal time between Winter and Spring sitting by the evaporator for hours on end. Often prompting discussions we wouldn’t otherwise have. I love this time of the year very much.

Now this Winter has been more more “normal” for Vermont, and sugaring season started the week after Town Meeting day which is tradition I hear, but not anything we’re used to. Sap hit hard these past few days and we had to start boiling it off fast to make room for more.

building, self sustainability ben March 11, 2025

Protected: Thermosiphons Everywhere

This content is password-protected. To view it, please enter the password below.

building, self sustainability ben March 11, 2025

Another Room Done

Tucked in a weird corner of a stair case.

It’s tiny with a tree house feel to it, we can barely stand in it.

We haven’t had an upstairs window facing this direction since the original tiny house we moved into, and now there is a an orchard to be admired.

It’s quirky as heck and we love it.

maple syrup, self sustainability ben March 04, 2025

Protected: It’s Cold

This content is password-protected. To view it, please enter the password below.

self sustainability ben January 29, 2025

Burning Brush

building, self sustainability ben January 01, 2025

Quaint Booth

We finally have the quaintest place to eat and hang out in the kitchen. It has the intimacy of a restaurant booth, and we’re surrounded by windows showing nature.

It’s not completely finished, but it’s usable. We still need to come up with a table which embraces the peculiar shapes of this space.

self sustainability, wood ben December 31, 2024

Flames from Above

The new stove does this cool thing when you engage the secondary combustion where the flames comes from the top rather than the logs at the bottom. It’s totally weird and I’m glad they gave us a heads up about it.

hunting, life in the U.S., nature encounters ben November 27, 2024

Cycles & Traditions

Did you know that turkeys literally start showing up around Thanksgiving? Didn’t see them all Summer, and now they’re here everyday, looking tasty. Something makes them bolder and get quite close. The fact that culture and tradition were shaped by environmental cycles was completely lost on me as a city dweller. Maybe it didn’t help that I lived in places where that culture had been imported not in accordance with the environment, I’ve never seen wild turkeys in Utah.

agriculture, building, self sustainability ben November 18, 2024

Protected: Leaves

This content is password-protected. To view it, please enter the password below.

building, self sustainability ben August 27, 2024

Been Building #2

The angles were very hard to get right, it’s not perfect but I did pretty good.

Trashed construction clothes are practical while rigging the double pulley to hoist subflooring.

This will be a quirky tiny room with a great view, both kids claimed it as their own.

agriculture, self sustainability ben August 23, 2024

Failed Fencelessness

With plants more established, and no clear effect, I decided to relax counter measures a bit this year and see if maybe the orchard, fruit trees, and garden could do with less fencing. The sentence was immediate, we didn’t get as many berries, trees got damaged, and hard work was voided. It is now clear that while various measures aren’t 100% effective, they definitely help. With this confirmed, they’ll get implemented with more vehemence next year.

It’s a lot less work and it looks better without fences. What a shame.

building, self sustainability ben July 21, 2024

Been Building

I started early in the season with the usual piers, beams, leveling, subfloor combination. Now I get to frame which is immensely more satisfying. Tearing the shingles was heartbreaking, I will never do shingles again. This poor early choice is likely why our house isn’t fully sided yet. I estimate it’s about 20 times the amount of work as doing boards. And I really don’t have time to side 20 houses. They’re also impossible to remove or replace. Bleh all around.

I’ve involved Robin more in the construction, he’s eager to learn for his own house. Music to my ears. We built a small covered thingy to hold all the things that might blow up. I didn’t like having them closer to buildings. This project had him use all the tools and techniques on a small scale, but he’s helped me on the subfloors since.

building, self sustainability ben July 21, 2024

2024 Construction

The house is reaching its final footprint. I still haven’t modeled the deck which didn’t really need much forethought, but I’d like to have a complete model of the house. It’s very useful on top of being fun.

This year we’re looking at a kitchen alcove/bay window.

And a “basement” with a small quirky room on top. We could really use a space to store a bunch of stuff in the absence of an actual basement.

agriculture, self sustainability ben June 16, 2024

Irrigation

It’s not much but for us it’s huge, we finally have enough water and ways to move it that we can give the gardens a good soak. For the past 9 years we’ve been reliant on the weather, which usually does its job in Vermont. Although when it didn’t, we’d be reactive and move a lot of water by hand only to keep plants alive. Now we’re able to soak several hundred square feet of soil whenever they could use it, and it’s less manual labor. Double win!

We want to build a rain capture system to diversify strategies, but that’s dependent on other projects. We’ll get there.

wood ben May 29, 2024

Fairy House

Esther loves creating Fairy houses, and I love creating wood piles.

Posts pagination

← Previous 1 2 3 … 25 Next →

This blog is solar powered

Interactive

Handwriting Capture
Mandalagaba
IPv6 link-local to MAC converter
IPv6 MAC to link-local converter
Markov Text Generation
Markov Word Generation
Markov Music Generation
Duplogrifier
Flood Fill Algorithms
Homestead Metrics
RGB Playground
Web Games

Categories

  • aesthetics112
    • plots54
    • specular holography6
  • Books4
  • I.T.207
    • 3D modeling / printing21
    • AI7
    • all out geekery38
    • electronics29
    • homestead automation7
    • maniacal paranoia27
    • plotters49
    • unix / linux29
    • video games4
    • web development30
    • web games3
  • Lego / Duplo67
  • life in the U.S.42
  • miscellaneous205
  • nature encounters116
  • old vinyls3
  • organs2
  • self sustainability566
    • agriculture110
    • apiculture38
    • apple20
    • building132
    • canning3
    • crochet6
    • foraging6
    • hunting10
    • maple syrup47
    • poultry39
    • preserving3
    • solar power28
    • water23
    • wood85
  • trip to a new life6
Theme by Bloompixel. Proudly Powered by WordPress