294 lines
14 KiB
HTML
294 lines
14 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en" dir="auto">
|
||
|
||
<head><meta charset="utf-8">
|
||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||
<script defer data-domain="selfhosted.rsmsn.co" src="https://analytics.rsmsn.co/js/script.js"></script>
|
||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||
<meta name="robots" content="index, follow">
|
||
<title>Posts | Norm-working Packets 💾</title>
|
||
<meta name="keywords" content="">
|
||
<meta name="description" content="Posts - Norm-working Packets 💾">
|
||
<meta name="author" content="Norm Rasmussen">
|
||
<link rel="canonical" href="./posts.html">
|
||
<link crossorigin="anonymous" href="./assets/css/stylesheet.5cfc680b1eeaeef9efbced92d46c2a9e876b72ee14fba85846afc4cff9e6e6f8.css" integrity="sha256-XPxoCx7q7vnvvO2S1Gwqnodrcu4U+6hYRq/Ez/nm5vg=" rel="preload stylesheet" as="style">
|
||
<link rel="icon" href="./favicon.ico">
|
||
<link rel="icon" type="image/png" sizes="16x16" href="./favicon-16x16.png">
|
||
<link rel="icon" type="image/png" sizes="32x32" href="./rsmsncircles.ico">
|
||
<link rel="apple-touch-icon" href="./apple-touch-icon.png">
|
||
<link rel="mask-icon" href="./safari-pinned-tab.svg">
|
||
<meta name="theme-color" content="#2e2e33">
|
||
<meta name="msapplication-TileColor" content="#2e2e33">
|
||
<link rel="alternate" type="application/rss+xml" href="./posts/index.xml">
|
||
<noscript>
|
||
<style>
|
||
#theme-toggle,
|
||
.top-link {
|
||
display: none;
|
||
}
|
||
|
||
</style>
|
||
</noscript>
|
||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-X8VR5M0K20"></script>
|
||
<script>
|
||
var doNotTrack = false;
|
||
if (!doNotTrack) {
|
||
window.dataLayer = window.dataLayer || [];
|
||
function gtag(){dataLayer.push(arguments);}
|
||
gtag('js', new Date());
|
||
gtag('config', 'G-X8VR5M0K20', { 'anonymize_ip': false });
|
||
}
|
||
</script>
|
||
<meta property="og:title" content="Posts" />
|
||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||
<meta property="og:type" content="website" />
|
||
<meta property="og:url" content="/posts.html" /><meta property="og:site_name" content="Norm-working Packets" />
|
||
|
||
<meta name="twitter:card" content="summary"/>
|
||
<meta name="twitter:title" content="Posts"/>
|
||
<meta name="twitter:description" content="A semi-technical blog & series of experiences working in tech and my homelab"/>
|
||
|
||
|
||
<script type="application/ld+json">
|
||
{
|
||
"@context": "https://schema.org",
|
||
"@type": "BreadcrumbList",
|
||
"itemListElement": [
|
||
{
|
||
"@type": "ListItem",
|
||
"position": 1 ,
|
||
"name": "Posts",
|
||
"item": "/posts.html"
|
||
}
|
||
]
|
||
}
|
||
</script>
|
||
</head>
|
||
|
||
<body class="list dark" id="top">
|
||
<script>
|
||
if (localStorage.getItem("pref-theme") === "light") {
|
||
document.body.classList.remove('dark')
|
||
}
|
||
|
||
</script>
|
||
|
||
<header class="header">
|
||
<nav class="nav">
|
||
<div class="logo">
|
||
<a href="./" accesskey="h" title="Norm-working Packets 💾 (Alt + H)">Norm-working Packets 💾</a>
|
||
<div class="logo-switches">
|
||
<button id="theme-toggle" accesskey="t" title="(Alt + T)">
|
||
<svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||
stroke-linejoin="round">
|
||
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
|
||
</svg>
|
||
<svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||
stroke-linejoin="round">
|
||
<circle cx="12" cy="12" r="5"></circle>
|
||
<line x1="12" y1="1" x2="12" y2="3"></line>
|
||
<line x1="12" y1="21" x2="12" y2="23"></line>
|
||
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
|
||
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
|
||
<line x1="1" y1="12" x2="3" y2="12"></line>
|
||
<line x1="21" y1="12" x2="23" y2="12"></line>
|
||
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
|
||
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
|
||
</svg>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
<ul id="menu">
|
||
<li>
|
||
<a href="./posts.html" title="Posts">
|
||
<span>Posts</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
</header>
|
||
<main class="main">
|
||
<header class="page-header"><div class="breadcrumbs"><a href="./">Home</a></div>
|
||
<h1>
|
||
Posts
|
||
</h1>
|
||
</header>
|
||
|
||
<article class="post-entry">
|
||
<figure class="entry-cover"><img loading="lazy" src="./esp_medicine_indicator.png" alt="ESP8266 Logo with a Medicine Icon, Colorized">
|
||
</figure>
|
||
<header class="entry-header">
|
||
<h2>ESP8266 Medicine Indicator Light
|
||
</h2>
|
||
</header>
|
||
<div class="entry-content">
|
||
<p>This is a quick treat! We recently learned that one of our children needs to take medicine twice a day for the foreseeable future. He’s too young to take it on his own, so the twice-a-day responsibility is split up between my partner and I. However, sometimes our schedules don’t overlap so succinctly, so we needed some sort of indicator to let the other know if the previous dose was (or wasn’t!...</p>
|
||
</div>
|
||
<footer class="entry-footer"><span title='2023-10-16 11:34:14 -0400 EDT'>October 16, 2023</span> · 6 min · 1170 words · Me</footer>
|
||
<a class="entry-link" aria-label="post link to ESP8266 Medicine Indicator Light" href="./posts/medicine_indicator_light.html"></a>
|
||
</article>
|
||
|
||
<article class="post-entry">
|
||
<figure class="entry-cover"><img loading="lazy" src="./birdnet-homeassistant-part2.png" alt="Part 2 of my foray into HomeAssistant dashboard featuring BirdNET-Pi Sensors">
|
||
</figure>
|
||
<header class="entry-header">
|
||
<h2>BirdNET-PI & HomeAssistant: Part 2
|
||
</h2>
|
||
</header>
|
||
<div class="entry-content">
|
||
<p>Checking for Entities If you’re following up on this from my first post, you’ve already added your AppDaemon script and confirmed that the AppDaemon logs don’t show any errors. Now is the true test if it’s working: do you have the new sensors in HomeAssistant?!
|
||
The best way to do this is by just type e from any screen in the HomeAssistant UI! That will bring up a list of entities....</p>
|
||
</div>
|
||
<footer class="entry-footer"><span title='2023-10-04 10:35:23 -0400 EDT'>October 4, 2023</span> · 10 min · 1986 words · Me</footer>
|
||
<a class="entry-link" aria-label="post link to BirdNET-PI & HomeAssistant: Part 2" href="./posts/birdnet_homeassistant_part2.html"></a>
|
||
</article>
|
||
|
||
<article class="post-entry">
|
||
<figure class="entry-cover"><img loading="lazy" src="./birdnet-homeassistant.png" alt="BirdNET-Pi and HomeAssistant: Happier together!">
|
||
</figure>
|
||
<header class="entry-header">
|
||
<h2>Creating a BirdNetPi Dashboard in HomeAssistant - Part 1
|
||
</h2>
|
||
</header>
|
||
<div class="entry-content">
|
||
<p>This is Part One of a Two Part Series. You can find Part Two, here.
|
||
Update: 10/11/2023. A huge thanks to Mastodon User e_mobile2014 who found a broken link in this guide and pointed out that I never explained how to get the mqtt sensors into HomeAssistant!
|
||
What you will need BirdNET-Pi HomeAssistant AppDaemon MQTT Broker (I use Mosquitto) Background In early 2023, at the height of the Raspberry Pi shortage I felt like a king with an extra Rpi laying around, not being used....</p>
|
||
</div>
|
||
<footer class="entry-footer"><span title='2023-09-30 11:21:55 -0400 EDT'>September 30, 2023</span> · 12 min · 2484 words · Me</footer>
|
||
<a class="entry-link" aria-label="post link to Creating a BirdNetPi Dashboard in HomeAssistant - Part 1" href="./posts/birdnet_homeassistant.html"></a>
|
||
</article>
|
||
|
||
<article class="post-entry">
|
||
<figure class="entry-cover"><img loading="lazy" src="./multiple-git-cover-img.png" alt="git commands">
|
||
</figure>
|
||
<header class="entry-header">
|
||
<h2>Pushing a Single Local Git Repo to Multiple Remote Repos
|
||
</h2>
|
||
</header>
|
||
<div class="entry-content">
|
||
<p>Why push to multiple repos? Do want to use both Github & and a Self-hosted Git Repo? Here’s how I’ve been doing it!
|
||
I really enjoy self-hosting services that I use everyday. One of those includes a git-style version control software. In my case, I’ve been running Gitea for a few years now and have been really satisfied with everything (except for that one time that an update broke all my templates)....</p>
|
||
</div>
|
||
<footer class="entry-footer"><span title='2023-09-22 15:07:10 -0400 EDT'>September 22, 2023</span> · 2 min · 403 words · Me</footer>
|
||
<a class="entry-link" aria-label="post link to Pushing a Single Local Git Repo to Multiple Remote Repos" href="./posts/multiple_git_remotes.html"></a>
|
||
</article>
|
||
|
||
<article class="post-entry">
|
||
<figure class="entry-cover"><img loading="lazy" src="./hugo-nginx-trouble.png" alt="Hugo Logo, Nginx Logo, Tired Face emoji">
|
||
</figure>
|
||
<header class="entry-header">
|
||
<h2>Trouble Hosting Hugo with Nginx
|
||
</h2>
|
||
</header>
|
||
<div class="entry-content">
|
||
<p>Intro For the last 3 days, I have been spending a few hours after working trying to figure out why my brand new Hugo site was not loading correctly on my sub-domain. For context, I use Nginx to host all my apps and servers, most of them using reverse proxy protocols such as $proxy_host, $forward_scheme, and $port. There are a few more and I’m happy to share some reverse proxy nginx config files....</p>
|
||
</div>
|
||
<footer class="entry-footer"><span title='2023-09-20 11:33:22 -0400 EDT'>September 20, 2023</span> · 5 min · 888 words · Me</footer>
|
||
<a class="entry-link" aria-label="post link to Trouble Hosting Hugo with Nginx" href="./posts/hosting_hugo_troubles.html"></a>
|
||
</article>
|
||
|
||
<article class="post-entry">
|
||
<figure class="entry-cover"><img loading="lazy" src="./npm_to_nginx.png" alt="NginxProxyManger to Nginx">
|
||
</figure>
|
||
<header class="entry-header">
|
||
<h2>Tutorial: Move from NginxProxyManager to Nginx
|
||
</h2>
|
||
</header>
|
||
<div class="entry-content">
|
||
<p>Goal A Tutorial Repo for migrating your Nginx Proxy Manager proxy setup to Nginx. I wrote this originally for this reddit post and to post this my Github profile. Thought my website would also be a good place to share it for any passers-by.
|
||
To give clear instructions to help users migrate from using Nginx Proxy Manager (NPM) to standard Nginx. This tutorial is not exhaustive and there are many other implementations of this transition....</p>
|
||
</div>
|
||
<footer class="entry-footer"><span title='2023-08-05 15:23:51 -0500 -0500'>August 5, 2023</span> · 8 min · 1635 words · Me</footer>
|
||
<a class="entry-link" aria-label="post link to Tutorial: Move from NginxProxyManager to Nginx" href="./posts/npm_to_nginx_tutorial.html"></a>
|
||
</article>
|
||
|
||
<article class="post-entry">
|
||
<figure class="entry-cover"><img loading="lazy" src="./merged-pr-accepted.png" alt="Git Pull Request with an arrow pointing to a check mark">
|
||
</figure>
|
||
<header class="entry-header">
|
||
<h2>My First Merged PR!
|
||
</h2>
|
||
</header>
|
||
<div class="entry-content">
|
||
<p>Admittedly, I feel a bit like a child sharing something like this, as there are so many devs that pull and merge requests from contributors on a regular basis. However, while I’ve contributed to documentation and/or tutorials and other non-coding portions of repositories, I feel a tiny bit proud that this was the first instance where I was using a library, found a bug, created an issue, cloned the repo to my local machine, found and fixed the code, and opened a pull request....</p>
|
||
</div>
|
||
<footer class="entry-footer"><span title='2022-09-01 13:25:02 -0400 EDT'>September 1, 2022</span> · 2 min · 328 words · Me</footer>
|
||
<a class="entry-link" aria-label="post link to My First Merged PR!" href="./posts/whiptail-first-merged-pr.html"></a>
|
||
</article>
|
||
</main>
|
||
|
||
<footer class="footer">
|
||
<span>© 2023 <a href="./">Norm-working Packets 💾</a></span>
|
||
<span>
|
||
Powered by
|
||
<a href="https://gohugo.io/" rel="noopener noreferrer" target="_blank">Hugo</a> &
|
||
<a href="https://github.com/adityatelange/hugo-PaperMod/" rel="noopener" target="_blank">PaperMod</a>
|
||
</span>
|
||
</footer>
|
||
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
|
||
<path d="M12 6H0l6-6z" />
|
||
</svg>
|
||
</a>
|
||
|
||
<script>
|
||
let menu = document.getElementById('menu')
|
||
if (menu) {
|
||
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
|
||
menu.onscroll = function () {
|
||
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
|
||
}
|
||
}
|
||
|
||
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||
anchor.addEventListener("click", function (e) {
|
||
e.preventDefault();
|
||
var id = this.getAttribute("href").substr(1);
|
||
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
|
||
behavior: "smooth"
|
||
});
|
||
} else {
|
||
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
|
||
}
|
||
if (id === "top") {
|
||
history.replaceState(null, null, " ");
|
||
} else {
|
||
history.pushState(null, null, `#${id}`);
|
||
}
|
||
});
|
||
});
|
||
|
||
</script>
|
||
<script>
|
||
var mybutton = document.getElementById("top-link");
|
||
window.onscroll = function () {
|
||
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
|
||
mybutton.style.visibility = "visible";
|
||
mybutton.style.opacity = "1";
|
||
} else {
|
||
mybutton.style.visibility = "hidden";
|
||
mybutton.style.opacity = "0";
|
||
}
|
||
};
|
||
|
||
</script>
|
||
<script>
|
||
document.getElementById("theme-toggle").addEventListener("click", () => {
|
||
if (document.body.className.includes("dark")) {
|
||
document.body.classList.remove('dark');
|
||
localStorage.setItem("pref-theme", 'light');
|
||
} else {
|
||
document.body.classList.add('dark');
|
||
localStorage.setItem("pref-theme", 'dark');
|
||
}
|
||
})
|
||
|
||
</script>
|
||
</body>
|
||
|
||
</html>
|