<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Adam Compton (Posts about emulation)</title><link>https://handyman5.github.io/</link><description></description><atom:link href="https://handyman5.github.io/tags/emulation.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2026 &lt;a href="mailto:comptona@gmail.com"&gt;Adam Compton&lt;/a&gt; </copyright><lastBuildDate>Fri, 19 Jun 2026 07:21:15 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>NESPi Case LED Light and Buttons Script</title><link>https://handyman5.github.io/posts/nespi-case-led-light-and-buttons-script/</link><dc:creator>Adam Compton</dc:creator><description>&lt;p&gt;I have a &lt;a href="https://retroflag.com/nespi-case-plus.html"&gt;NESPi Case&lt;/a&gt; for my &lt;a href="https://retropie.org.uk/"&gt;RetroPie&lt;/a&gt; emulation console. It has a little red LED light on the front and I wanted it to work. However, after I installed &lt;a href="https://www.lakka.tv/"&gt;Lakka&lt;/a&gt; (which is great in all other respects), I couldn't figure out how.&lt;/p&gt;
&lt;p&gt;I spent some time figuring it out, and now you get to reap the benefits of my investigation.&lt;/p&gt;
&lt;!-- TEASER_END --&gt;

&lt;h3 id="setup"&gt;Setup&lt;/h3&gt;
&lt;p&gt;First things first, I should list what hardware I'm using so you have an idea of whether this might be relevant for you.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Board&lt;/strong&gt;: Raspberry Pi 3 Model B Plus Rev 1.3&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Case&lt;/strong&gt;: &lt;a href="https://retroflag.com/nespi-case-plus.html"&gt;NESPi Case Plus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OS&lt;/strong&gt;: &lt;a href="https://www.lakka.tv/"&gt;Lakka&lt;/a&gt;, a Linux distribution that packages &lt;a href="https://www.retroarch.com/"&gt;RetroArch&lt;/a&gt; and basically nothing else&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The case has a red LED light and &lt;code&gt;Power&lt;/code&gt; and &lt;code&gt;Reset&lt;/code&gt; buttons, along with a GPIO header for the Raspberry Pi that connects them. The case manufacturers have &lt;a href="https://github.com/RetroFlag/retroflag-picase"&gt;a repo&lt;/a&gt; that includes a script to read those headers and do useful things (reboot when the buttons are pressed, turn on the light, etc.). I wanted the red light to turn on while the machine is running, because of course.&lt;/p&gt;
&lt;h3 id="investigation"&gt;Investigation&lt;/h3&gt;
&lt;p&gt;Unfortunately, that script is not designed to work on Lakka, which (as I mentioned before) does not include many of the niceties of a modern Linux distribution like a package manager.&lt;/p&gt;
&lt;p&gt;Someone put together &lt;a href="https://github.com/marcelonovaes/lakka_nespi_power"&gt;a version of the script&lt;/a&gt; that &lt;em&gt;is&lt;/em&gt; supposed to work on Lakka, but it hasn't been touched in 8 years and it didn't work on my machine when I tried:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;Lakka:~&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# python /storage/scripts/shutdown.py&lt;/span&gt;
Traceback&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;most&lt;span class="w"&gt; &lt;/span&gt;recent&lt;span class="w"&gt; &lt;/span&gt;call&lt;span class="w"&gt; &lt;/span&gt;last&lt;span class="o"&gt;)&lt;/span&gt;:
&lt;span class="w"&gt;  &lt;/span&gt;File&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/storage/scripts/shutdown.py"&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;line&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;module&amp;gt;
&lt;span class="w"&gt;    &lt;/span&gt;import&lt;span class="w"&gt; &lt;/span&gt;RPi.GPIO&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;GPIO
ImportError:&lt;span class="w"&gt; &lt;/span&gt;/storage/lib/RPi/GPIO.so:&lt;span class="w"&gt; &lt;/span&gt;wrong&lt;span class="w"&gt; &lt;/span&gt;ELF&lt;span class="w"&gt; &lt;/span&gt;class:&lt;span class="w"&gt; &lt;/span&gt;ELFCLASS32
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The repo includes a precompiled version of the GPIO library that doesn't work with the current version of the kernel (Lakka &lt;a href="https://www.lakka.tv/articles/2021/05/22/lakka-3.0/"&gt;switched to aarch64 in 2021&lt;/a&gt;, which postdates this repo), and there aren't any trivial ways to get a new version cross-compiled and uploaded. But, luckily for us, Lakka started including the &lt;code&gt;python-raspberry-gpio&lt;/code&gt; package &lt;a href="https://github.com/libretro/Lakka-LibreELEC/issues/1227"&gt;in 2021&lt;/a&gt;, which installs the &lt;a href="https://pypi.org/project/lgpio/"&gt;lgpio python package&lt;/a&gt; (&lt;a href="https://abyz.me.uk/lg/py_lgpio.html"&gt;relevant package docs&lt;/a&gt;). This is not a drop-in replacement for the &lt;code&gt;RPi.GPIO&lt;/code&gt; library (which is what the precompiled binary includes); if you do need such a replacement, apparently &lt;a href="https://pypi.org/project/rpi-lgpio/"&gt;rpi-lgpio&lt;/a&gt; will do the trick. But as I mentioned, Lakka does not have a package installation mechanism (including &lt;code&gt;pip&lt;/code&gt;), so I had to rewrite the manufacturers' script to use &lt;code&gt;lgpio&lt;/code&gt; instead of &lt;code&gt;RPi.GPIO&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="script"&gt;Script&lt;/h3&gt;
&lt;p&gt;To save you all the trouble, here's the new script:&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;said script&lt;/summary&gt;

&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="ch"&gt;#!/usr/bin/env python3&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lgpio&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;signal&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sys&lt;/span&gt;

&lt;span class="c1"&gt;# =====================&lt;/span&gt;
&lt;span class="c1"&gt;# Pin definitions (BCM)&lt;/span&gt;
&lt;span class="c1"&gt;# =====================&lt;/span&gt;
&lt;span class="n"&gt;powerPin&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="n"&gt;resetPin&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;ledPin&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;
&lt;span class="n"&gt;powerenPin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;

&lt;span class="n"&gt;GPIOCHIP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;DEBOUNCE_US&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;200_000&lt;/span&gt;  &lt;span class="c1"&gt;# 200 ms&lt;/span&gt;

&lt;span class="n"&gt;chip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;

&lt;span class="c1"&gt;# =====================&lt;/span&gt;
&lt;span class="c1"&gt;# Cleanup&lt;/span&gt;
&lt;span class="c1"&gt;# =====================&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;cleanup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signum&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;chip&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;chip&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;lgpio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gpio_write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# LED off on exit&lt;/span&gt;
            &lt;span class="n"&gt;lgpio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gpiochip_close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chip&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SIGINT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cleanup&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SIGTERM&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cleanup&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# =====================&lt;/span&gt;
&lt;span class="c1"&gt;# Main&lt;/span&gt;
&lt;span class="c1"&gt;# =====================&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;chip&lt;/span&gt;

    &lt;span class="n"&gt;chip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lgpio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gpiochip_open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GPIOCHIP&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Power enable (always HIGH)&lt;/span&gt;
    &lt;span class="n"&gt;lgpio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gpio_claim_output&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;powerenPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# LED output — ON at startup&lt;/span&gt;
    &lt;span class="n"&gt;lgpio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gpio_claim_output&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Inputs with pull-ups&lt;/span&gt;
    &lt;span class="n"&gt;lgpio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gpio_claim_input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;powerPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lgpio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SET_PULL_UP&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;lgpio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gpio_claim_input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resetPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lgpio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SET_PULL_UP&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Debounce&lt;/span&gt;
    &lt;span class="n"&gt;lgpio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gpio_set_debounce_micros&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;powerPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DEBOUNCE_US&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;lgpio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gpio_set_debounce_micros&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resetPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DEBOUNCE_US&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"NESPi shutdown controller running (LED ON)"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;last_power&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lgpio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gpio_read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;powerPin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;last_reset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lgpio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gpio_read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resetPin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# ---- Power button ----&lt;/span&gt;
        &lt;span class="n"&gt;power&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lgpio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gpio_read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;powerPin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;power&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;last_power&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# Blink LED while held&lt;/span&gt;
            &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;lgpio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gpio_read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;powerPin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;lgpio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gpio_write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;lgpio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gpio_write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="c1"&gt;# Ensure LED returns to ON state&lt;/span&gt;
            &lt;span class="n"&gt;lgpio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gpio_write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"shutdown -h now"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;last_power&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;power&lt;/span&gt;

        &lt;span class="c1"&gt;# ---- Reset button ----&lt;/span&gt;
        &lt;span class="n"&gt;reset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lgpio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gpio_read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resetPin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;reset&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;last_reset&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"shutdown -r now"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;last_reset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reset&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"__main__"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;/details&gt;

&lt;p&gt;This enables the power LED and also the button functionality (which I don't ever use, but while I was in the neighborhood).&lt;/p&gt;
&lt;h3 id="installation"&gt;Installation&lt;/h3&gt;
&lt;p&gt;I put the new script in &lt;code&gt;/storage/scripts/shutdown.py&lt;/code&gt; like the old Lakka-installing repo's &lt;a href="https://github.com/marcelonovaes/lakka_nespi_power/blob/master/install.sh"&gt;installation script&lt;/a&gt; did. That script also adds a line to &lt;code&gt;/storage/.config/autostart.sh&lt;/code&gt; which is Lakka's mechanism for &lt;a href="https://wiki.libreelec.tv/configuration/startup-shutdown#autostart.sh"&gt;automatically starting programs on boot&lt;/a&gt;. The only change I had to make was to have the autostart bit &lt;code&gt;cd&lt;/code&gt; to &lt;code&gt;/tmp&lt;/code&gt; before running the new python script, because otherwise I was getting weird permissions errors:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Jan 04 18:10:55 Lakka systemd[1]&lt;/span&gt;&lt;span class="nt"&gt;: retroarch-autostart.service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Deactivated successfully.&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Jan 04 18:10:55 Lakka systemd[1]&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Stopped retroarch-autostart.service.&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Jan 04 18:10:55 Lakka systemd[1]&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Starting retroarch-autostart.service...&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Jan 04 18:10:55 Lakka systemd[1]&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Finished retroarch-autostart.service.&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Jan 04 18:10:55 Lakka sh[1158]&lt;/span&gt;&lt;span class="nt"&gt;: 2026-01-04 18:10:55 xCreatePipe&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Can't set permissions (436) for //.lgd-nfy0, No such file or directory&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Jan 04 18:10:55 Lakka sh[1158]&lt;/span&gt;&lt;span class="nt"&gt;: Traceback (most recent call last)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Jan 04 18:10:55 Lakka sh[1158]&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;File "/storage/scripts/shutdown_lgpio.py", line 3, in &amp;lt;module&amp;gt;&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Jan 04 18:10:55 Lakka sh[1158]&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;import lgpio&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Jan 04 18:10:55 Lakka sh[1158]&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;File "/usr/lib/python3.11/site-packages/lgpio.py", line 562, in &amp;lt;module&amp;gt;&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Jan 04 18:10:55 Lakka sh[1158]&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;File "/usr/lib/python3.11/site-packages/lgpio.py", line 504, in __init__&lt;/span&gt;
&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Jan 04 18:10:55 Lakka sh[1158]&lt;/span&gt;&lt;span class="nt"&gt;: FileNotFoundError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Errno 2&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;No such file or directory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;'.lgd-nfy-3'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Running the script from a working directory where it has proper permissions did the trick.&lt;/p&gt;
&lt;h3 id="wrapup"&gt;Wrapup&lt;/h3&gt;
&lt;p&gt;This was a fun evening's investigation and hopefully it'll prove useful to somebody someday. Good luck and happy emulating!&lt;/p&gt;</description><category>emulation</category><category>howto</category><guid>https://handyman5.github.io/posts/nespi-case-led-light-and-buttons-script/</guid><pubDate>Mon, 05 Jan 2026 07:54:09 GMT</pubDate></item></channel></rss>