diff --git a/posts/creating-a-router-cabinet.md b/posts/creating-a-router-cabinet.md index 76d80c5..325fdb5 100644 --- a/posts/creating-a-router-cabinet.md +++ b/posts/creating-a-router-cabinet.md @@ -2,7 +2,7 @@ title: "Creating a router cabinet" slug: /creating-a-router-cabinet/ date: 2025-10-05 -tags: ["personal", "projects", "diy"] +tags: ["personal", "projects", "DIY"] --- As you can see below, my consumer networking was quite messy. I wanted to hide @@ -51,5 +51,9 @@ my Philips Hue bridge and a Raspberry Pi 3 which I am running on the mesh network as a [Pihole](https://pi-hole.net/). The main router wouldn't sit nicely on the shelf so I just used a couple of wood screws to hold it in place. -The total cost was £38.78 covering the price of the cabinet and a new -surge-protected Masterplug extension lead. +The total cost was £35.47. + +| Product | Cost | +| ------------------------------------- | ----- | +| Wall Mounted Kitchen Storage Cabinet | 26.67 | +| Masterplug Four Socket Extension Lead | 8.80 | diff --git a/posts/homeowner-at-last.md b/posts/homeowner-at-last.md index ddd6095..cc402e1 100644 --- a/posts/homeowner-at-last.md +++ b/posts/homeowner-at-last.md @@ -2,7 +2,7 @@ title: "Homeowner at last" slug: /homeowner-at-last/ date: 2025-08-28 -tags: ["personal", "projects", "diy"] +tags: ["personal", "projects"] --- After many years of saving and renting I am finally a homeowner! I bought a diff --git a/posts/img/product-image.png b/posts/img/product-image.png new file mode 100644 index 0000000..aa35a10 Binary files /dev/null and b/posts/img/product-image.png differ diff --git a/posts/img/security-light-battery-unit.jpg b/posts/img/security-light-battery-unit.jpg new file mode 100644 index 0000000..56b78b4 Binary files /dev/null and b/posts/img/security-light-battery-unit.jpg differ diff --git a/posts/img/security-light-closeup.jpg b/posts/img/security-light-closeup.jpg new file mode 100644 index 0000000..e0b7265 Binary files /dev/null and b/posts/img/security-light-closeup.jpg differ diff --git a/posts/img/security-light-device-taping.jpg b/posts/img/security-light-device-taping.jpg new file mode 100644 index 0000000..feac69a Binary files /dev/null and b/posts/img/security-light-device-taping.jpg differ diff --git a/posts/img/security-light-feeding-cable-rotated.jpg b/posts/img/security-light-feeding-cable-rotated.jpg new file mode 100644 index 0000000..6f5a041 Binary files /dev/null and b/posts/img/security-light-feeding-cable-rotated.jpg differ diff --git a/posts/img/security-light-feeding-cable.jpg b/posts/img/security-light-feeding-cable.jpg new file mode 100644 index 0000000..3362aa7 Binary files /dev/null and b/posts/img/security-light-feeding-cable.jpg differ diff --git a/posts/img/security-light-finished.jpg b/posts/img/security-light-finished.jpg new file mode 100644 index 0000000..4f2a483 Binary files /dev/null and b/posts/img/security-light-finished.jpg differ diff --git a/posts/img/security-light-flexible-trunking.jpg b/posts/img/security-light-flexible-trunking.jpg new file mode 100644 index 0000000..7d2cced Binary files /dev/null and b/posts/img/security-light-flexible-trunking.jpg differ diff --git a/posts/img/security-light-panel-taping.jpg b/posts/img/security-light-panel-taping.jpg new file mode 100644 index 0000000..252aea1 Binary files /dev/null and b/posts/img/security-light-panel-taping.jpg differ diff --git a/posts/installing-a-solar-powered-security-light.md b/posts/installing-a-solar-powered-security-light.md new file mode 100644 index 0000000..968062c --- /dev/null +++ b/posts/installing-a-solar-powered-security-light.md @@ -0,0 +1,88 @@ +--- +title: "Installing a solar-powered security light" +slug: /installing-a-security-light/ +date: 2025-11-16 +tags: ["projects", "DIY"] +--- + + + +I recently installed a security light in the back garden. I wanted it to be +"dumb" (not IoT-linked) and solar-powered with battery power as a fallback. + +The +[Auraglow Hybrid](https://web.archive.org/web/20250826070058/https://www.diy.com/departments/auraglow-hybrid-solar-battery-twin-led-security-light-cyrus/5060539629306_BQ.prd) +met these criteria and was very cheap. + +Normally, I would pay more for a higher quality device but the reviews were +uniformly good and I wanted to see how plausible a solar-powered light would be +in English winters, before shelling out any more. + + + +I placed it above the garage side-door to illuminate the garden and the pathway +to the garage from the Command Center. + +In order to maximise access to sunlight, I had to use the full-length of the +solar panel cable (5m) to stretch it round from the back of the garage (which is +south-facing) to the side door. + +The cable connecting the solar panel to the light is a 3.5mm TRS cable - the +same as those used for earphones. It's very flimsy, like a pair of liquorice +laces and once I had tacked it along the roof of the garage I started to worry +about how well it would endure, longer-term. I think this is the only aspect of +the light where you get what you pay for. The loose wire also looked a bit +rubbish and the aesthetics of this grated on me. + + + +So, to improve its water-proofing and protect it from UV I bought some +cylindrical black conduit from Screwfix. I don't think this is truly +outdoors-grade but it's a lot better than than exposing the thin cable to the +elements. As the diameter of the conduit is several times wider than the cable, +it can be used for additional cabling down the line, should I need it. + + + +This left the cable loose at the terminals so I bought some flexible trunking to +protect the cable at the joins. (This is also intended for indoor use so I'll +have to see how well it lasts.) I joined the trunking to the conduit with +self-amalgamating tape for a water-tight seal. + + + +I'm happy with the appearance and think it looks quite professional. + + + + + +As for the device itself, the performance is as good as the reviews suggested. +The LED luminosity is very bright and the sensor is effective. (Perhaps a bit +too effective since I've noticed it being triggered by spiders weaving webs +around the light.) After a couple of days I removed the back-up batteries to see +how well the solar panel was working. I waited two days before putting them +back, and the light functioned exactly the same as it did on battery power +throughout this period. (For the last few weeks, we have mostly had cloudy, +rainy days with only occasional bursts of sunlight.) + +Other than the spiders, the only other main drawback is that it requires C-type +batteries. As rechargable batteries of this type are hard to come by it meant I +couldn't use a high-quality brand like Eneloop. I had to go for the least-worst +Chinese-branded batteries I could find on Amazon if I wanted to use +rechargables. + +Ideally I would want some visual indicator of the current capacity of the solar +battery and the back-up batteries but for a device under £20 this is probably +asking a bit too much. + +Mostly due to me over-engineering the cabling, the total cost of this project +was £60.17. + +| Product | Cost | +| ------------------------------------------------------------- | ----- | +| Auraglow Hybrid Solar & Battery Twin LED Security Light (B&Q) | 15.99 | +| Round conduit and connectors (Screwfix) | 17.52 | +| Flexible trunking (Amazon) | 6.15 | +| Self-amalgamating tape 10m (Amazon) | 6.52 | +| EBL 5000mAh C-type recharageable batteries (Amazon) | 13.99 | diff --git a/src/components/EolasListing.tsx b/src/components/EolasListing.tsx index 7d45d52..5e9a045 100644 --- a/src/components/EolasListing.tsx +++ b/src/components/EolasListing.tsx @@ -10,13 +10,13 @@ const EolasEntries = ({ entries }) => {
+
Software engineer at ITV, formerly BBC. This is my technical scrapbook and digital garden.
@@ -32,23 +32,23 @@ const HomePage = () => {+
A public frontend for my local Zettelkasten created with NodeJS, Python and React.
diff --git a/src/styles/_variables.css b/src/styles/_variables.css index 247c7cc..b2d79b8 100644 --- a/src/styles/_variables.css +++ b/src/styles/_variables.css @@ -1,79 +1,79 @@ :root { - --radius: 0.3rem; - --background: #282828; - --foreground: #ebdbb2; - --sidebar: #3c3836; - --color-red-light: #fb4934; - --color-orange-light: #fe8019; - --color-green-light: #b8bb26; - --color-aqua-muted: #689d6a; - --card: oklch(1 0 0); - --card-foreground: oklch(0.145 0 0); - --popover: oklch(1 0 0); - --popover-foreground: oklch(0.145 0 0); - --primary: #8ec07c; - --primary-muted: #689d6a; - --primary-foreground: oklch(0.985 0 0); - --secondary: oklch(0.97 0 0); - --secondary-foreground: oklch(0.205 0 0); - --muted: #bdae93; - --muted-foreground: #928374; - --accent: oklch(0.97 0 0); - --accent-foreground: oklch(0.205 0 0); - --destructive: oklch(0.577 0.245 27.325); - --border: oklch(0.922 0 0); - --input: oklch(0.922 0 0); - --ring: oklch(0.708 0 0); - --chart-1: oklch(0.646 0.222 41.116); - --chart-2: oklch(0.6 0.118 184.704); - --chart-3: oklch(0.398 0.07 227.392); - --chart-4: oklch(0.828 0.189 84.429); - --chart-5: oklch(0.769 0.188 70.08); - --sidebar-foreground: oklch(0.145 0 0); - --sidebar-primary: oklch(0.205 0 0); - --sidebar-primary-foreground: oklch(0.985 0 0); - --sidebar-accent: oklch(0.97 0 0); - --sidebar-accent-foreground: oklch(0.205 0 0); - --sidebar-border: oklch(0.922 0 0); - --sidebar-ring: oklch(0.708 0 0); - --font-monospaced: "iA Writer Mono"; - --font-sansserif: "iA Writer Quattro", sans-serif; + --radius: 0.3rem; + --background: #282828; + --foreground: #ebdbb2; + --sidebar: #3c3836; + --color-red-light: #fb4934; + --color-orange-light: #fe8019; + --color-green-light: #b8bb26; + --color-aqua-muted: #689d6a; + --card: oklch(1 0 0); + --card-foreground: oklch(0.145 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.145 0 0); + --primary: #8ec07c; + --primary-muted: #689d6a; + --primary-foreground: oklch(0.985 0 0); + --secondary: oklch(0.97 0 0); + --secondary-foreground: oklch(0.205 0 0); + --muted: #bdae93; + --muted-foreground: #928374; + --accent: oklch(0.97 0 0); + --accent-foreground: oklch(0.205 0 0); + --destructive: oklch(0.577 0.245 27.325); + --border: oklch(0.922 0 0); + --input: oklch(0.922 0 0); + --ring: oklch(0.708 0 0); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: oklch(0.205 0 0); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.708 0 0); + --font-monospaced: "IBM Plex Mono"; + --font-sansserif: "IBM Plex Sans", sans-serif; } @theme inline { - --radius-sm: calc(var(--radius) - 4px); - --radius-md: calc(var(--radius) - 2px); - --radius-lg: var(--radius); - --radius-xl: calc(var(--radius)); - --color-background: var(--background); - --color-foreground: var(--foreground); - --color-card: var(--card); - --color-card-foreground: var(--card-foreground); - --color-popover: var(--popover); - --color-popover-foreground: var(--popover-foreground); - --color-primary: var(--primary); - --color-primary-foreground: var(--primary-foreground); - --color-secondary: var(--secondary); - --color-secondary-foreground: var(--secondary-foreground); - --color-muted: var(--muted); - --color-muted-foreground: var(--muted-foreground); - --color-accent: var(--accent); - --color-accent-foreground: var(--accent-foreground); - --color-destructive: var(--destructive); - --color-border: var(--border); - --color-input: var(--input); - --color-ring: var(--ring); - --color-chart-1: var(--chart-1); - --color-chart-2: var(--chart-2); - --color-chart-3: var(--chart-3); - --color-chart-4: var(--chart-4); - --color-chart-5: var(--chart-5); - --color-sidebar: var(--sidebar); - --color-sidebar-foreground: var(--sidebar-foreground); - --color-sidebar-primary: var(--sidebar-primary); - --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); - --color-sidebar-accent: var(--sidebar-accent); - --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); - --color-sidebar-border: var(--sidebar-border); - --color-sidebar-ring: var(--sidebar-ring); + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius)); + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); } diff --git a/src/templates/BlogTemplate.tsx b/src/templates/BlogTemplate.tsx index 70b683a..b8cb3ad 100644 --- a/src/templates/BlogTemplate.tsx +++ b/src/templates/BlogTemplate.tsx @@ -5,41 +5,41 @@ import { convertDate } from "@/utils/convertDate" import { usePosts } from "@/hooks/usePosts" const BlogTemplate = () => { - const { slug } = useParams() - const { posts } = usePosts() - const post = posts?.find((x) => x.slug === slug) + const { slug } = useParams() + const { posts } = usePosts() + const post = posts?.find((x) => x.slug === slug) - return ( -