Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
81e5a18460 | ||
|
|
6adf40df07 | ||
|
|
cf31d448f8 | ||
|
|
1bf1a67b89 | ||
|
|
e8760b0916 | ||
|
|
5ee35669b6 | ||
|
|
a892b2c88d
|
||
|
|
fcefefee86 | ||
|
|
a489c49f41
|
||
|
|
6f4be41780
|
||
|
|
7aeeb735bf | ||
|
|
4d0fd100a8 | ||
|
|
364f4bc8a0 | ||
|
|
882ad7eee0 | ||
|
|
6319fa8cc0 | ||
|
|
2849945311
|
||
|
|
a2ad4fe77c
|
||
|
|
756389b61b | ||
|
|
184c7380bc | ||
|
|
c7e7767e43 | ||
|
|
f2af90479a | ||
|
|
75c4b6de3f | ||
|
|
71da3d83cd | ||
|
|
de7fd2af11 | ||
|
|
ef7ba795ca |
@@ -0,0 +1,140 @@
|
||||
# Sample workflow for building and deploying a Hugo site to GitHub Pages
|
||||
name: Deploy Hugo site to Pages
|
||||
|
||||
on:
|
||||
# Runs on pushes targeting the default branch
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
|
||||
# Runs on pull requests
|
||||
pull_request:
|
||||
|
||||
# Allows you to run this workflow manually from the Actions tab
|
||||
workflow_dispatch:
|
||||
|
||||
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
|
||||
permissions:
|
||||
contents: read
|
||||
pages: write
|
||||
id-token: write
|
||||
|
||||
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
|
||||
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
|
||||
concurrency:
|
||||
group: "pages"
|
||||
cancel-in-progress: false
|
||||
|
||||
# Default to bash
|
||||
defaults:
|
||||
run:
|
||||
# GitHub-hosted runners automatically enable `set -eo pipefail` for Bash shells.
|
||||
shell: bash
|
||||
|
||||
jobs:
|
||||
# Build job
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
HUGO_VERSION: 0.148.0
|
||||
HUGO_ENVIRONMENT: production
|
||||
TZ: America/New_York
|
||||
steps:
|
||||
- name: Install Hugo CLI
|
||||
run: |
|
||||
wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb
|
||||
sudo dpkg -i ${{ runner.temp }}/hugo.deb
|
||||
- name: Install Dart Sass
|
||||
run: sudo snap install dart-sass
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
fetch-depth: 0
|
||||
- name: Setup Pages
|
||||
id: pages
|
||||
uses: actions/configure-pages@v5
|
||||
- name: Cache Restore
|
||||
id: cache-restore
|
||||
uses: actions/cache/restore@v4
|
||||
with:
|
||||
path: |
|
||||
${{ runner.temp }}/hugo_cache
|
||||
key: hugo-${{ github.run_id }}
|
||||
restore-keys:
|
||||
hugo-
|
||||
- name: Configure Git
|
||||
run: git config core.quotepath false
|
||||
- name: Build with Hugo
|
||||
run: |
|
||||
hugo \
|
||||
--gc \
|
||||
--minify \
|
||||
--baseURL "${{ steps.pages.outputs.base_url }}/" \
|
||||
--cacheDir "${{ runner.temp }}/hugo_cache"
|
||||
- name: Create CNAME file
|
||||
run: |
|
||||
cat << EOF > public/CNAME
|
||||
neilhanlon.me
|
||||
neilhanlon.com
|
||||
hanlon.ninja
|
||||
thepotato.tech
|
||||
EOF
|
||||
- name: Cache Save
|
||||
id: cache-save
|
||||
uses: actions/cache/save@v4
|
||||
with:
|
||||
path: |
|
||||
${{ runner.temp }}/hugo_cache
|
||||
key: ${{ steps.cache-restore.outputs.cache-primary-key }}
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-pages-artifact@v3
|
||||
with:
|
||||
path: ./public
|
||||
|
||||
# Deployment job
|
||||
deploy:
|
||||
if: github.ref == 'refs/heads/main'
|
||||
environment:
|
||||
name: github-pages
|
||||
url: ${{ steps.deployment.outputs.page_url }}
|
||||
runs-on: ubuntu-latest
|
||||
needs: build
|
||||
steps:
|
||||
- name: Deploy to GitHub Pages
|
||||
id: deployment
|
||||
uses: actions/deploy-pages@v4
|
||||
|
||||
# PR Preview job
|
||||
preview:
|
||||
if: github.event_name == 'pull_request'
|
||||
runs-on: ubuntu-latest
|
||||
needs: build
|
||||
steps:
|
||||
- name: Download artifact
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: github-pages
|
||||
path: ./preview
|
||||
- name: Extract site
|
||||
run: |
|
||||
cd preview
|
||||
tar -xf artifact.tar
|
||||
- name: Install surge
|
||||
run: npm install -g surge
|
||||
- name: Deploy to surge.sh
|
||||
run: |
|
||||
export SURGE_DOMAIN="thepotato-tech-pr-${{ github.event.number }}.surge.sh"
|
||||
surge ./preview --domain $SURGE_DOMAIN --token ${{ secrets.SURGE_TOKEN }}
|
||||
echo "Preview URL: https://$SURGE_DOMAIN" >> $GITHUB_STEP_SUMMARY
|
||||
- name: Comment PR
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const domain = `thepotato-tech-pr-${{ github.event.number }}.surge.sh`;
|
||||
github.rest.issues.createComment({
|
||||
issue_number: context.issue.number,
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
body: `🚀 Preview deployed to: https://${domain}`
|
||||
});
|
||||
@@ -1,3 +1,4 @@
|
||||
public/
|
||||
resources/
|
||||
pages.git/
|
||||
.hugo_build.lock
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
image: registry.gitlab.com/pages/hugo/hugo_extended:latest
|
||||
|
||||
variables:
|
||||
GIT_SUBMODULE_STRATEGY: recursive
|
||||
|
||||
pages:
|
||||
script:
|
||||
- hugo
|
||||
artifacts:
|
||||
paths:
|
||||
- public
|
||||
only:
|
||||
- main
|
||||
@@ -1,3 +1,3 @@
|
||||
[submodule "themes/hugo-sustain"]
|
||||
path = themes/hugo-sustain
|
||||
url = https://git.shrug.pw/neil/hugo-sustain
|
||||
url = https://git.shrug.pw/neil/hugo-sustain.git
|
||||
|
||||
@@ -1,57 +0,0 @@
|
||||
---
|
||||
branches: main
|
||||
|
||||
variables:
|
||||
surge_settings: &surge_settings
|
||||
path: public
|
||||
surge_token:
|
||||
from_secret: SURGE_TOKEN
|
||||
forge_type: gitea
|
||||
forge_url: https://git.shrug.pw
|
||||
forge_repo_token:
|
||||
from_secret: SURGE_GITEA
|
||||
|
||||
clone:
|
||||
git:
|
||||
image: woodpeckerci/plugin-git
|
||||
settings:
|
||||
recursive: true
|
||||
|
||||
pipeline:
|
||||
build:
|
||||
image: registry.gitlab.com/pages/hugo/hugo_extended:latest
|
||||
commands:
|
||||
- hugo
|
||||
|
||||
preview:
|
||||
image: woodpeckerci/plugin-surge-preview
|
||||
secrets: [SURGE_TOKEN, SURGE_GITEA]
|
||||
settings: *surge_settings
|
||||
when:
|
||||
event: pull_request
|
||||
|
||||
teardown-preview:
|
||||
image: woodpeckerci/plugin-surge-preview
|
||||
secrets: [SURGE_TOKEN, SURGE_GITEA]
|
||||
settings: *surge_settings
|
||||
environment:
|
||||
- CI_BUILD_EVENT=pull_close
|
||||
when:
|
||||
event: push
|
||||
|
||||
publish:
|
||||
image: git.shrug.pw/neil/containers/woodpecker-ci:latest
|
||||
secrets: [ssh_key]
|
||||
environment:
|
||||
- GIT_AUTHOR_NAME="Woody the Woodpecker"
|
||||
- GIT_AUTHOR_EMAIL=ci@shrug.pw
|
||||
commands:
|
||||
- mkdir -p ~/.ssh/
|
||||
- echo "$SSH_KEY" > ~/.ssh/id_rsa
|
||||
- chmod 0700 ~/.ssh/
|
||||
- chmod 0600 ~/.ssh/id_rsa
|
||||
- bash deploy.sh
|
||||
when:
|
||||
branch: main
|
||||
event: [push]
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
$primary-color: #ABC9E3;
|
||||
//$primary-color: #ABC9E3;
|
||||
$primary-color: #115c9e;
|
||||
$hover-color: #5E7191;
|
||||
|
||||
|
||||
html, body {
|
||||
border-top-color: $primary-color;
|
||||
}
|
||||
@@ -16,3 +18,114 @@ div.footer {
|
||||
.panel-default h4 a, h5 a {
|
||||
color: $primary-color;
|
||||
}
|
||||
|
||||
figure.inline {
|
||||
display: inline-flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: auto;
|
||||
width: 90%;
|
||||
}
|
||||
|
||||
figure.inline-40 {
|
||||
display: inline-flex;
|
||||
height: auto;
|
||||
width: 40%;
|
||||
}
|
||||
|
||||
figure.inline-60 {
|
||||
display: inline-flex;
|
||||
height: auto;
|
||||
width: 60%;
|
||||
}
|
||||
|
||||
figure.inline-80 {
|
||||
display: inline-flex;
|
||||
height: auto;
|
||||
width: 80%;
|
||||
}
|
||||
|
||||
figure.right {
|
||||
float: right;
|
||||
}
|
||||
|
||||
figure.left {
|
||||
float: left;
|
||||
}
|
||||
|
||||
figure > img {
|
||||
display: inline-flex;
|
||||
width: 90%;
|
||||
}
|
||||
|
||||
h2, h3 {
|
||||
clear: both;
|
||||
}
|
||||
|
||||
h5 {
|
||||
font-weight: bold
|
||||
}
|
||||
|
||||
.clearfix {
|
||||
overflow: auto;
|
||||
}
|
||||
.clearfix::after {
|
||||
content: "";
|
||||
clear: both;
|
||||
display: table;
|
||||
}
|
||||
|
||||
/* Projects page styling */
|
||||
.project-card {
|
||||
background: #fff;
|
||||
border: 1px solid #e8e8e8;
|
||||
border-radius: 8px;
|
||||
padding: 1.5rem;
|
||||
height: 100%;
|
||||
transition: box-shadow 0.3s ease, transform 0.2s ease;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.project-card:hover {
|
||||
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
|
||||
.project-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.project-icon {
|
||||
font-size: 1.8rem;
|
||||
color: $primary-color;
|
||||
margin-right: 1rem;
|
||||
min-width: 2rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.project-title {
|
||||
margin: 0;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.project-title a {
|
||||
color: $primary-color;
|
||||
text-decoration: none;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.project-title a:hover {
|
||||
color: $hover-color;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.project-description {
|
||||
color: #666;
|
||||
line-height: 1.6;
|
||||
margin: 0;
|
||||
flex: 1;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
---
|
||||
title: 'Dont disable IPV6'
|
||||
description: "Just... don't"
|
||||
date: 2022-11-28T10:22:59-05:00
|
||||
draft: false
|
||||
categories: []
|
||||
tags: []
|
||||
---
|
||||
@@ -1,8 +0,0 @@
|
||||
---
|
||||
title: 'Golden images best practices'
|
||||
description: ''
|
||||
date: 2022-08-31T13:39:35-04:00
|
||||
draft: false
|
||||
categories: []
|
||||
tags: []
|
||||
---
|
||||
@@ -0,0 +1,57 @@
|
||||
---
|
||||
title: 'Joining ResolveX as a Technical Advisor: Infrastructure and Crisis Response'
|
||||
description: "I've joined ResolveX as a technical advisor to help scale their crisis response software. Working on infrastructure, security, and scaling decisions for 988 suicide prevention lines and mental health crisis centers."
|
||||
date: 2025-08-08T10:17:20-04:00
|
||||
draft: false
|
||||
categories: ['consulting', 'social-impact']
|
||||
tags: ['crisis-response', 'mental-health', 'infrastructure', 'advisory', 'resolvex', '988']
|
||||
---
|
||||
|
||||
I'm excited to share that I've joined [ResolveX](https://resolvex.com) as a technical advisor. ResolveX
|
||||
builds software and data solutions for crisis call centers—988 suicide
|
||||
prevention lines, domestic violence hotlines, and other critical mental health
|
||||
resources.
|
||||
|
||||
## Why This Matters
|
||||
|
||||
Mental health crisis response has significant gaps that technology can help address. ResolveX builds tools to make crisis counselors more effective and help researchers understand patterns that could prevent crises.
|
||||
|
||||
They serve 988 operators—resource-constrained nonprofits handling life-or-death situations. The technical requirements are unique: rock-solid reliability, security for sensitive mental health data, and cost-effectiveness for organizations that measure impact in lives saved.
|
||||
|
||||
## The Technical Challenge
|
||||
|
||||
ResolveX is hitting the classic startup infrastructure inflection point—scaling from scrappy solutions to supporting a primary mental health data warehouse without over-engineering.
|
||||
|
||||
My role: provide neutral perspective on infrastructure, security, and scaling decisions. Lightweight advisory rather than hands-on implementation, helping spot issues early and suggest practical solutions within their budget and mission.
|
||||
|
||||
## What I'm Doing
|
||||
|
||||
The immediate priorities are pretty straightforward:
|
||||
|
||||
- **Infrastructure & Security Audit**: Review current hosting, architecture, and configurations. Light security testing and access review.
|
||||
|
||||
- **Ongoing Advisory**: Lightweight consultation (~5 hours/week) for feedback and neutral oversight on scaling decisions.
|
||||
|
||||
- **Content Collaboration**: Educational content that benefits both crisis response and broader tech communities.
|
||||
|
||||
## The Bigger Picture
|
||||
|
||||
This isn't just consulting work—I've been getting into emergency response volunteering (CERT, amateur radio) and care deeply about how we handle mental health crises. ResolveX has potential to become an open-source-friendly, public-impact organization changing mental health data collection and analysis.
|
||||
|
||||
## Technical Philosophy
|
||||
|
||||
The constraints make this engaging: high reliability and security requirements, minimal budget, maximum impact. Every architectural decision must justify real value to crisis counselors and those they help.
|
||||
|
||||
This requires "appropriate technology"—sophisticated enough for requirements but simple enough to maintain and afford. Systems engineering with purpose, not hope-based engineering.
|
||||
|
||||
## Looking Forward
|
||||
|
||||
I'll write follow-ups about specific technical challenges as this develops. Infrastructure engineering for social impact deserves more attention.
|
||||
|
||||
If you're working on mission-driven technology or considering how your skills could have broader social impact, reach out. **There's more of this work that needs doing.**
|
||||
|
||||
---
|
||||
|
||||
If you're interested in similar advisory or consulting work, you can reach me
|
||||
through [my consulting practice](https://shrugpw.com) or find me on the usual places around the
|
||||
internet.
|
||||
|
After Width: | Height: | Size: 110 KiB |
|
After Width: | Height: | Size: 68 KiB |
@@ -0,0 +1,258 @@
|
||||
---
|
||||
title: 'Smarthome Soldering Iron with Home Assistant and ESPHome (also: web GUIs for Pinecil)'
|
||||
description: 'Learn how to create a smart soldering iron using Pinecil with Home Assistant and ESPHome, as well as explore the options for controlling and monitoring your Pinecil with Bluetooth'
|
||||
date: 2023-03-28T19:01:25-04:00
|
||||
draft: false
|
||||
categories: [Home Automation, DIY, FOSS]
|
||||
tags: [Pinecil, Home Assistant, DIY, RISC-V, Blisp, PineSAM, Pine64, esphome]
|
||||
---
|
||||
|
||||
About a year ago, [wesdottoday](https://hachyderm.io/@wesdottoday) told me to
|
||||
buy a Pinecil and, once they came back in stock before the holidays.. I did just
|
||||
that... Fast forward a couple months and I've got a
|
||||
[copr](https://copr.fedorainfracloud.org/coprs/neil/blisp/) for flashing the
|
||||
Pinecil's firmware (IronOS), and am spending my weekends playing around with
|
||||
Bluetooth Low Energy (BLE) and Home Assistant to automatically turn on my fan
|
||||
when I start tinkering at my desk, lest my lungs die from the fumes.
|
||||
|
||||
<p>
|
||||
|
||||
{{< figure src="pinecil-esp32.jpg" alt="ESP-WROOM-32 Development MCU with a Pinecil v2 leaning on it" class="inline-40 left" >}}
|
||||
|
||||
By popular demand, I'm writing a blog post about the Pinecil, how to flash the
|
||||
latest firmware, and then what you can (currently) do with bidirectional
|
||||
communication to your soldering iron.
|
||||
</p>
|
||||
|
||||
We'll also go over two Pinecil community projects offering in-browser
|
||||
experiences (PineSam and Joric's 'Pinecil'), and lastly some instructions on
|
||||
using an [ESP32](https://www.espressif.com/en/products/socs/esp32) and
|
||||
[ESPHome](https://esphome.io/) to send Pinecil data to
|
||||
[HomeAssistant](https://home-assistant.io/) so you can do everything from
|
||||
visualize your soldering statistics, to automatically turn on an exhaust fan
|
||||
when you start working.
|
||||
|
||||
### Acknowledgements
|
||||
|
||||
- [Ben Brown (Ralim)](https://github.com/ralim) - Maintainer and developer of IronOS for Pinecil and Miniware Irons
|
||||
- Support them on [Ko-fi](https://ko-fi.com/ralim)
|
||||
- [Gamiee (Gamelaster)](https://github.com/gamelaster) - Developer and maintainer of pine64_updater, IronOS
|
||||
- [River-Mochi](https://github.com/river-mochi) for reviewing this article and their excellent organization and documentation work for Pine64 and the Pinecil.
|
||||
- [TomW1605](https://github.com/TomW1605) & [ithinkido](https://github.com/ithinkido) for their work on the implementation of the Pinecil ESP32 integration
|
||||
- [Builder555](https://github.com/builder555) - PineSAM maintainer and developer
|
||||
- [Joric](https://github.com/joric) - Developer of original BLE GATT application for Pinecil
|
||||
|
||||
## The Pinecil
|
||||
|
||||
The [Pinecil](https://www.pine64.org/pinecil/) is an open-source soldering iron
|
||||
based on the RISC-V architecture produced by Pine64. There are two versions of
|
||||
Pinecil - v1 and v2. Pinecil v1 does not have a Bluetooth Low Energy (BLE) chip,
|
||||
whereas Pinecil v2 does. In this blog post, we will focus on Pinecil v2. Pine64
|
||||
does not distinguish between v1 and v2 except for on the PCB as a revision. If
|
||||
you're buying a Pinecil in 2023 or beyond, and it's from an official source, it
|
||||
is a v2.
|
||||
|
||||
You can find more information about the Pinecil in the links below, including
|
||||
where to buy. Check the Pinecil Wiki for up-to-date information on where to buy
|
||||
a genuine Pinecil, and how to avoid fakes.
|
||||
|
||||
### Links
|
||||
|
||||
- [Pine64.com](https://pine64.com/) - Offical store for Pine64 devices. Ships
|
||||
from China and takes 3-4 weeks for delivery
|
||||
- [Pine64.org](https://pine64.org) - The community associated with Pine64
|
||||
devices. Check out the Discord/Telegram chat for a great group of tinkerers,
|
||||
and if you have any trouble with your Pinecil or associated tools
|
||||
- [Pinecil Wiki](https://wiki.pine64.org/wiki/Pinecil) - Lots of tips and
|
||||
tricks, as well as up to date purchasing and troubleshooting information.
|
||||
- Shout out to River-Mochi for their _awesome_ work on keeping this up to date
|
||||
and useful
|
||||
- [Pine64 Updater](https://github.com/pine64/pine64_updater) - v1 Pinecil updater tool
|
||||
- [Pinecil Development Projects](https://wiki.pine64.org/wiki/Pinecil#Development_Projects) - Updated links to all community projects
|
||||
|
||||
## Blisp
|
||||
|
||||
Blisp is a flashing tool used to flash ironOS on Pinecil v2 that stands for
|
||||
'Bouffalo Labs In-System Programming'. It's used to flash the Bouffalo BL706 MCU
|
||||
that was integrated on the v2 Pinecil. You can find the source code for Blisp on
|
||||
[GitHub](https://github.com/pine64/blisp).
|
||||
|
||||
I also maintain a Fedora COPR respository for it
|
||||
[here](https://copr.fedorainfracloud.org/coprs/neil/blisp/), where you can find
|
||||
packages with precompiled binaries for Fedora and Enterprise Linux (8/9). I am
|
||||
working with Pine64 to make it easier to get it packaged for Fedora and other
|
||||
Linux distributions down the road.
|
||||
|
||||
### Flashing the beta firmware with blisp
|
||||
|
||||
Until version v2.21 of IronOS ships, a beta firmware is required to use the BLE
|
||||
functionality of the Pinecil v2. There has been a significant amount of testing
|
||||
and development on the BLE stack on the main tree in the last few months and the
|
||||
developers have been making sure the BLE features are ready before they are
|
||||
released to a much larger audience.
|
||||
|
||||
{{< figure src="blisp-flash.png" alt="Flashing the Pinecilv2 with blisp CLI" class="" >}}
|
||||
|
||||
Once v2.21 is released, binaries can be retrieved from the
|
||||
[IronOS Releases](https://github.com/Ralim/IronOS/releases) page.
|
||||
|
||||
#### Steps to download and flash
|
||||
|
||||
These steps assume you have a compiled version of `blisp` in your system path,
|
||||
either by installing from my COPR, or compiling on your own using the
|
||||
instructions in the repository.
|
||||
|
||||
1. Find the latest sucessful actions run on the ironos repo
|
||||
[here](https://github.com/Ralim/IronOS/actions/workflows/push.yml?query=branch%3Adev+event%3Apush).
|
||||
2. Download the `Pinecilv2` zip file for that run, and unzip it
|
||||
3. Plug your Pinecil into your computer while holding down the 'Minus' (-)
|
||||
button. The screen should **not** turn on. If on Linux, `dmesg` should report
|
||||
seeing the BL706 as a serial device.
|
||||
4. Run the following command to flash the firmware to your Pinecil:
|
||||
```
|
||||
blisp write -c bl70x --reset /path/to/Pinecilv2_extracted/Pinecilv2_EN.bin
|
||||
```
|
||||
5. Un-plug and plug the Pinecil back in to boot the new firmware
|
||||
|
||||
NOTE: You may ignore the .dfu and .hex files provided in the .zip file.
|
||||
|
||||
##### Pinecilv2 vs Pinecilv2_multi-lang
|
||||
|
||||
Two variants of firmwares for Pinecil are provided: combined mutli-language binaries, and individual per-language binaries. The per-language binaries are much smaller, and while the Pinecilv2 has more flash available to store the mutli-language images, for general usage, you will have an easier time with the language-specific binary rather than the multi-lang binaries.
|
||||
|
||||
Multi-lang provides three bundles of languages:
|
||||
|
||||
1. Chinese and Japanese
|
||||
2. Russian, Ukranian, Serbian, and Bulgarian
|
||||
3. European (All not mentioned above)
|
||||
|
||||
Ultimately, it is up to you which you decide to use
|
||||
|
||||
#### Pineflash
|
||||
|
||||
[Spagett1](https://github.com/Spagett1) updated their Pineflash tool which allows
|
||||
for a non-command-line experience for flashing new versions of IronOS on the Pinecil V1 and V2, similar to the Pine64 updater (add link) utility for the v1 Pinecil. You can find
|
||||
more information on the PineFlash
|
||||
[GitHub repo](https://github.com/Spagett1/PineFlash). Feel free to check it out
|
||||
and give them feedback!
|
||||
|
||||
Pineflash supports Linux and MacOS at this time (2023-04-03), and support for Windows is a work in progress. If you would like to help test, please join the chat and make yourself known.
|
||||
|
||||
## Bluetooth Low Energy
|
||||
|
||||
Bluetooth Low Energy (BLE) is a wireless communication protocol that is designed
|
||||
to consume less energy than classic Bluetooth. There is upcoming support in
|
||||
browser APIs to allow access to BLE devices, and so there are a handful of
|
||||
options for how to get your Pinecil talking to your computer.
|
||||
|
||||
## Interacting with your Pinecil over Bluetooth
|
||||
|
||||
### PineSAM by [Builder555](https://github.com/builder555)
|
||||
|
||||
PineSAM (Pinecil Settings and Menus) started out as an in-browser way to see and
|
||||
change settings. It's served a multitude of uses from helping people with
|
||||
cracked or non-functional screens, all the way to adding really helpful
|
||||
accessibility features to those who struggle to read the small screen on the
|
||||
Pinecil. It's is a Python and Vue-based application that has to have a server
|
||||
component running locally--along with a machine that has bluetooth. You can find
|
||||
the source code for PineSAM on [GitHub](https://github.com/builder555/PineSAM/), but read on below for how to grab precompiled versions of the application.
|
||||
|
||||
{{< figure src="pinesam.png" alt="PineSAM UI" class="inline" >}}
|
||||
|
||||
PineSAM allows the user to not only see the live temperature, wattage, and
|
||||
voltage of their device but change the settings and temperatures at a click.
|
||||
Uniquely, it allows users to set temperature presets for one-click changes
|
||||
between temperatures--for example to switch between leaded and unleaded solder.
|
||||
|
||||
You can access PineSAM from your mobile device once it's running on your computer to have a touch-capable way of controlling your settings. On your phone, flip the screen to portait mode in order to see the graph as on desktop.
|
||||
|
||||
{{< figure src="pinesam-mobile.png" alt="Screenshot of PineSAM UI on Mobile device" class="inline-40 left" >}}
|
||||
|
||||
The PineSAM project is working to integrate a "Work" screen which takes
|
||||
inspiration from Joric's UI. Due to this, it's likely these two projects will
|
||||
end up combining into one, in my opinion, despite their distinct mechanisms for
|
||||
retrieving BLE data from the Pinecil.
|
||||
|
||||
#### Setting up PineSAM
|
||||
|
||||
See the
|
||||
[project readme](https://github.com/builder555/PineSAM#i-using-pre-made-binaries)
|
||||
for the most up-to-date instructions. If you run into any trouble, come find us
|
||||
in the #pinecil channel on Pine64's Discord or Telegram chat.
|
||||
|
||||
### [Joric](https://github.com/joric/)'s BLE API
|
||||
|
||||
Another project is a more simple web UI that uses in-browser Bluetooth support
|
||||
(currently only really well supported in Chromium/Firefox, and even then it's
|
||||
not universal or without bugs. This UI shows a nice graph of your Pinecil's
|
||||
temperature and power supply information, but is limited to devices supporting
|
||||
WebBLE, and also is only able to change the set point (temperature) on the
|
||||
device. You can also find the source code for Joric UI on
|
||||
[GitHub](https://github.com/joric/pinecil).
|
||||
|
||||
{{< figure src="joric-ui.png" alt="Joric's UI" class="inline-60 right" >}}
|
||||
|
||||
#### Setting up Joric's UI
|
||||
|
||||
No setup needed! Just browse to
|
||||
[https://joric.github.io/pinecil/](https://joric.github.io/pinecil/) in a
|
||||
compatible browser. I've personally tested Firefox and Chromium on Fedora 37,
|
||||
but I know others have got it working on Windows and MacOS, too.
|
||||
|
||||
As with PineSAM, feel free to come to chat for help and support.
|
||||
|
||||
## Home Assistant Setup with ESPHome
|
||||
|
||||
If Home Assistant (HASS) is more your speed, read on below. Be warned to get
|
||||
this setup, you will need some sort of ESP32 device to read data from your
|
||||
Pinecil and report it to Home Assistant. I used one of the
|
||||
[WROOM ESP32 dev boards](https://www.amazon.com/ESP-WROOM-32-Development-Microcontroller-Integrated-Compatible/dp/B08D5ZD528)
|
||||
I've had in my closet for a few months (not an affiliate link).
|
||||
|
||||
If you're not familiar, Home Assistant is an open-source home automation
|
||||
platform which can inte grate with ESPHome, another open source system to
|
||||
control your ESP8266/ESP32 using just YAML configurations. In this section, I'll
|
||||
walk though how to setup an ESP32 with will show you how to create a smart
|
||||
soldering iron using Pinecil with Home Assistant and ESPHome.
|
||||
|
||||
{{< figure src="hass-soldering.png" alt="Home Assistant Soldering UI" class="inline" >}}
|
||||
|
||||
To make this work, we'll use an
|
||||
[ESPHome configuration file](https://github.com/TomW1605/esphome_pinecilv2_ble/blob/main/esphome_pinecilv2_ble.yaml)
|
||||
put together by Pine64 community member TomW1605. Thank you again, Tom!
|
||||
|
||||
## Requirements
|
||||
|
||||
- ESP32 device (Non affiliate link:
|
||||
[ESP-WROOM-32 Development MCU on Amazon](https://www.amazon.com/ESP-WROOM-32-Development-Microcontroller-Integrated-Compatible/dp/B08D5ZD528))
|
||||
- Home Assistant already setup
|
||||
- ESPHome already setup
|
||||
|
||||
## Steps
|
||||
|
||||
1. Login to ESPHome
|
||||
2. Import
|
||||
[this ESPHome configuration file](https://github.com/TomW1605/esphome_pinecilv2_ble/blob/main/esphome_pinecilv2_ble.yaml).
|
||||
3. Modify and set up the configuration file as follows:
|
||||
1. Change board in esp32 section to your board.
|
||||
- If using the WROOM 32 I linked above, use `nodemcu-32s`
|
||||
2. Setup an encryption key. This must be a base64-encoded, 32 bit string.
|
||||
- You can create one on the CLI using `openssl rand -base64 32`
|
||||
3. Change OTA password to desired
|
||||
4. Change wifi SSID and password for your network in ESPHome secrets
|
||||
5. Change wifi access point fallback settings to desired
|
||||
6. **Important** - Change ble_client mac address to your Pinecil's MAC. This
|
||||
can be found in the settings as well as in logs from the above tools
|
||||
(Joric/PineSAM)
|
||||
{{< figure src="pinecil-esphome.png" alt="Pinecil esp32 configuration example" class="inline" >}}
|
||||
4. Flash the firmware to the ESP32 device
|
||||
5. Add the device to Home Assistant
|
||||
6. Create a Home Assistant dashboard to control and monitor your smart soldering
|
||||
iron.
|
||||
- An example dashboard can be found at
|
||||
https://gist.github.com/NeilHanlon/83d6e2cdc6eb83cb205b617f80c2a7c3
|
||||
- It uses the 'mini-graph-card' and 'auto-entities' integrations from HACS
|
||||
{{< gist neilhanlon 83d6e2cdc6eb83cb205b617f80c2a7c3 >}}
|
||||
|
||||
Now that you've got that setup, you should start to see data coming in about
|
||||
your Pinecil's settings! Go on and automate thy solder.
|
||||
|
After Width: | Height: | Size: 91 KiB |
|
After Width: | Height: | Size: 153 KiB |
|
After Width: | Height: | Size: 104 KiB |
|
After Width: | Height: | Size: 126 KiB |
|
After Width: | Height: | Size: 181 KiB |
@@ -1,15 +0,0 @@
|
||||
---
|
||||
title: 'Tests are stupid'
|
||||
description: ''
|
||||
date: 2022-06-01T17:10:19-04:00
|
||||
draft: false
|
||||
categories: []
|
||||
tags: []
|
||||
---
|
||||
|
||||
* they always fucking make every god damn package not build
|
||||
* unreliable network tests that fail in real build environments
|
||||
* spotty tests in general that may fail run to run for "reasons" (not environmental)
|
||||
* no one actually fucking looks at them
|
||||
* I estimate i've wasted ten years of my life tracking vague test failures
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
---
|
||||
title: Why you should host your own git forge
|
||||
subtitle: Emails should have stamps, and other reasons why I haven't left my room in weeks (send help)
|
||||
description: You don't need github, I promise.
|
||||
date: 2022-03-28T20:30:36-04:00
|
||||
draft: false
|
||||
categories: []
|
||||
tags: []
|
||||
---
|
||||
|
||||
## What is a git forge
|
||||
|
||||
A git forge is, simply, a thing that hosts a(n) git repository. Your computer is likely a git forge if you have git installed on it, you just don't know it.
|
||||
|
||||
Inside the FOSS (Free and Open-Source Software) space, a forge, generally, is considered a web-based "thing" that allows collaboration. Optionally, many git forges stack on additional "features" (we'll touch on this later) and have integrations with third party software that it can host all on its own. Some even go so far as to throw every "feature" under the sun at it in the hopes of remaining profitable.
|
||||
|
||||
## wtf is this?
|
||||
|
||||
thepotato.tech is a place, on the internet. You're here.
|
||||
@@ -3,4 +3,5 @@ categories: ["projects"]
|
||||
date: "2016-10-02T22:55:05-04:00"
|
||||
tags: ["projects"]
|
||||
title: "Projects"
|
||||
layout: "projects"
|
||||
---
|
||||
|
||||
@@ -1,6 +1,30 @@
|
||||
name: Projects
|
||||
source:
|
||||
- icon: fa fa-github
|
||||
- icon: fa-solid fa-building
|
||||
name: Rocky Enterprise Software Foundation
|
||||
description: Board member for the non-profit foundation behind Rocky Linux. Focus on strategic governance, financial oversight, and advancing the mission of community-driven enterprise Linux distribution development.
|
||||
url: https://rockylinux.org/about
|
||||
- icon: fa-brands fa-github
|
||||
name: Rocky Linux
|
||||
description: All the infrastructure for Rocky Linux, from soup to nuts. Work with a team of professionals to architect, design, and implement secure systems and proceudres to write Infrastructure as Code to provide systems for the various teams within the Rocky Enterprise Software Foundation, especially Rocky Linux as it gets off the ground. Also work closely with Release Engineering on building next generation Build Automation pipeline tools and ensuring reliability and security in the supply chain.
|
||||
description: Infrastructure architect and core team member for Rocky Linux. Built and maintain all infrastructure from bare metal to cloud services, including CI/CD pipelines, build systems, and supply chain security. Work closely with Release Engineering on next-generation build automation and ensuring security throughout the software supply chain.
|
||||
url: https://github.com/rocky-linux/
|
||||
- icon: fa-solid fa-code-branch
|
||||
name: OpenELA
|
||||
description: Technical Steering Committee member for OpenELA, the Open Enterprise Linux Association. Help guide technical strategy and governance for collaborative development of enterprise Linux distributions, focusing on open source supply chain transparency and community collaboration.
|
||||
url: https://openela.org/
|
||||
- icon: fa-solid fa-heart
|
||||
name: ResolveX
|
||||
description: Board member and technical advisor for ResolveX, building software and data solutions for crisis call centers including 988 suicide prevention lines and mental health resources. Provide strategic guidance on scaling infrastructure and technology decisions for mission-critical systems.
|
||||
url: https://resolvex.com/
|
||||
- icon: fa-solid fa-handshake
|
||||
name: Shrug PW Consulting
|
||||
description: Founder and Principal Consultant providing infrastructure architecture, DevOps automation, and technical advisory services. Specialize in scaling systems for mission-driven organizations, supply chain security, and building reliable infrastructure on constrained budgets.
|
||||
url: https://shrugpw.com/
|
||||
- icon: fa-brands fa-fedora
|
||||
name: Fedora Project
|
||||
description: Active contributor to Fedora RISC-V SIG and Community Operations (CommOps). Work on infrastructure, packaging ecosystem, build systems, and community tooling. Focus on RISC-V architecture support and community infrastructure reliability.
|
||||
url: https://fedoraproject.org/
|
||||
- icon: fa-solid fa-cloud
|
||||
name: OpenStack
|
||||
description: Core reviewer for OpenStack-Ansible and contributor to OpenStack-Kolla projects. Support OpenStack integration with Rocky Linux and work in CentOS NFV and Cloud SIGs. Focus on deployment automation, bare metal provisioning, and enterprise Linux integration.
|
||||
url: https://openstack.org/
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
#!/bin/bash -ex
|
||||
|
||||
export GIT_AUTHOR_NAME="${GIT_AUTHOR_NAME}"
|
||||
export GIT_AUTHOR_EMAIL="${GIT_AUTHOR_EMAIL}"
|
||||
export GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no"
|
||||
|
||||
REMOTE="${PUSH_REMOTE:-git@git.shrug.pw:neil/neilhanlon.me.git}"
|
||||
|
||||
rm -fr pages.git
|
||||
mkdir pages.git
|
||||
|
||||
( cd pages.git && git init -b pages )
|
||||
rsync -av public/* pages.git
|
||||
|
||||
cat << EOF > pages.git/.domains
|
||||
neilhanlon.me
|
||||
neilhanlon.com
|
||||
hanlon.ninja
|
||||
thepotato.tech
|
||||
EOF
|
||||
|
||||
cd pages.git
|
||||
|
||||
set -x
|
||||
git config user.name "$GIT_AUTHOR_NAME"
|
||||
git config user.email "$GIT_AUTHOR_EMAIL"
|
||||
git add -A
|
||||
git commit -m "Deployment at $(date -u -Is)"
|
||||
git remote add origin $REMOTE
|
||||
git push -f origin pages
|
||||
@@ -5,7 +5,7 @@ title = "Neil Hanlon"
|
||||
# Enable comments by entering your Disqus shortname
|
||||
disqusShortname = ""
|
||||
# Enable Google Analytics by entering your tracking code
|
||||
googleAnalytics = ""
|
||||
# googleAnalytics = ""
|
||||
theme = "hugo-sustain"
|
||||
|
||||
[permalinks]
|
||||
@@ -23,9 +23,11 @@ theme = "hugo-sustain"
|
||||
|
||||
[params.social]
|
||||
Github = "NeilHanlon"
|
||||
Email = "neil@shrug.pw.com"
|
||||
Twitter = "NeilHanlon"
|
||||
Email = "neil@shrug.pw"
|
||||
Bluesky = "@shrug.pw"
|
||||
LinkedIn = "hanlonneil"
|
||||
Signal = "hScowCEn-H1GKkCrare0m_xOEPqTWxt51pW9SI2bU5TlXrMW9QFD6qHBLqG1jDq9"
|
||||
Keybase = "nhanlon"
|
||||
#Stackoverflow = "username"
|
||||
#Medium = "hanlon.neil"
|
||||
Instagram = "noellathekitty"
|
||||
@@ -0,0 +1,25 @@
|
||||
{{ define "main" }}
|
||||
<!-- Header -->
|
||||
{{ partial "header" . }}
|
||||
|
||||
<div class="container">
|
||||
<section id="projects">
|
||||
<h4 class="my-5">{{ .Site.Data.projects.name }}</h4>
|
||||
<div class="row">
|
||||
{{ range $el := .Site.Data.projects.source }}
|
||||
<div class="col-md-6 mb-4">
|
||||
<div class="project-card">
|
||||
<div class="project-header">
|
||||
<i class="{{ .icon }} project-icon"></i>
|
||||
<h5 class="project-title">
|
||||
<a href="{{ .url }}" target="_blank">{{ $el.name }}</a>
|
||||
</h5>
|
||||
</div>
|
||||
<p class="project-description">{{ $el.description }}</p>
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
{{ end }}
|
||||