We went to WHY2025 a hackers camp in the Netherlands.
The first time I went was in 1997, with Bigred. Many followed after that. Tyrone, Bigred were also there from our old Crew. Coline joined me several times since 2005.
I joined the Badge team, and was making spacers for the Badges in bulk using my 3D printer. Also made some fancy cases.
CasesSpacers
In case of doubt .. more leds!
Our campsite with 7m Led stringMust have more leds!
Nice weather, good friends. New friends. Booze. Food and Hacking. We visited a lot of talks and enjoyed the music. (And fire)
I worked on: RSS feed on a epaper display, Midi monitor and the MQTT Pong website.
RSS Feed display
While waiting in line for the Badge:
A stone was passed from behind! It was a ping request. We passed it forward, and 15 minutes later a TTL time exceeded stone came from the front of the line. You gotta love those nerds!
Some other stones
The Badge: This should have got much potential .. Many misses, much to learn.
Below is my python script to push messages via pushover to my phone.
It’s being run from a cron during the day.
CODE
import csv
import datetime
import requests
# configure own creds
PUSHOVER_USER_KEY = 'keykeykeykeykeykeykeykey'
PUSHOVER_API_TOKEN = 'tokentokentokentokentokentokentoken'
CSV_FILE = '/data/notifications.csv'
def send_pushover_notification(message):
url = "https://api.pushover.net/1/messages.json"
payload = {
"token": PUSHOVER_API_TOKEN,
"user": PUSHOVER_USER_KEY,
"message": message
}
response = requests.post(url, data=payload)
if response.status_code != 200:
print("Failed to send notification:", response.text)
def check_and_notify():
today = datetime.date.today()
with open(CSV_FILE, newline='') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
try:
day = int(row['day'])
month = int(row['month'])
if today.day == day and today.month == month:
send_pushover_notification(row['message'])
except ValueError:
continue
if __name__ == "__main__":
check_and_notify()
notifications.csv file
day,month,message
1,1,Birthday of a new year
16,05,Project Deadline
16,05,Test2 (blah) 2
7,3,Glorious bastard Rik Mayall birthday
27,3,International whisky day
Nice to haves (didn’t implement because i’m a lazy bastard)
3rd Saturday every may
Getting dates or updates from another app
Selecting Pushover device, level of alertness .. etc
substitutions:
name: usb-relay
friendly_name: "USB Relay"
default_state: "RESTORE_DEFAULT_OFF"
esphome:
name: xyusb1
friendly_name: xyusb1
esp8266:
board: esp01_1m
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: "ndm8xxxxxxxxxxxxxxxxxjlvrggJv3a1BkY="
ota:
- platform: esphome
password: "12cc9xxxxxxxxxxxxxxxxfb6a01e672"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Xyusb1 Fallback Hotspot"
password: "xxxxxxxxxxx"
captive_portal:
time:
- platform: homeassistant
# Blue LED
status_led:
pin:
number: GPIO16
# Relay
switch:
- platform: gpio
id: switch_relay
pin: GPIO5
# Green LED
- platform: gpio
pin: GPIO14
id: green_led
inverted: true # start on
# Switch template to link relay and green LED states
# LED is on when relay is off
- platform: template
id: relay
name: "${friendly_name}"
lambda: |-
if (id(switch_relay).state) {
return true;
} else {
return false;
}
turn_on_action:
- switch.turn_on:
id: green_led
- switch.turn_on:
id: switch_relay
turn_off_action:
- switch.turn_off:
id: green_led
- switch.turn_off:
id: switch_relay
# Button
binary_sensor:
- platform: gpio
id: hardware_button
pin:
number: GPIO04
mode: INPUT_PULLUP
inverted: True
on_press:
- switch.toggle: relay
# WiFi Signal Sensor
sensor:
- platform: wifi_signal
name: "WiFi Status"
update_interval: 60s
# Restart button
button:
- platform: restart
name: "Restart"
Reflashed my USB Volume button and added a LED-Ring.
Example is green and blue.
Funny text on box
What is a termianl assortment? LOL
Wireless Temperature/Humidity sensor for ESPHome.
Wemos D1 mini with deep sleep, voltage monitoring using A0 line. BME280 Temperature/Humidity sensor. And a 18650 battery with TP4065 battery manager. Now 3D print a little case.
While working on a client project, I tested multiple displays.
ILI9341
1.3inch SPI TFT LCD Display RGB (ST7789)
Waveshare 4.2 Epaper with ESP32 Controller
I thought it was fun to connect the Epaper to ESPHome.
This probably ends up being a Quote displayer
Universal e-Paper Driver Board with WiFi / Bluetooth SoC ESP32 onboard, supports various Waveshare SPI e-Paper raw panels
It was not without problems. For example, the ESPHome editor gave squiggly lines under type. This has to be changed in the libraries. (Already notified developers)
model: 4.20in-V2 does not work .. use model: 4.20in-v2
While attending Bornhack 2024 in Danmark, I came up with the below fun ideas.
Using Python and OpenCV, I made some funny webcam hacks.
Note: My laptop webcam is very bad, a better webcam should give you a more stable result.
First, a virtual workspace flipper. Just using my head movement to flip through my virtual desktops. (Turning left and right)
Next, an image viewer. Using your head movement up, down, left and right to control the image. Note : this is not the same movement as above. This won’t use rotation of your head!
Testing the first keyboard. It is the 8085-SDK hex matrix keyboard.
It is running on a Raspberry Pi Zero 2, without X server. So the images are displayed using the framebuffer. Also the touch data is read using evdev and the raw devices.
Todo:
HID part
Add a rotary button for the selection of the different Keyboard Layouts
Improvement keyboard matrix calculation to find out which key is being pressed.
Code to control AT/PS2 computers directly using GPIO pins
Add a controller to use Raw controlling of matrix pins ( 6502 C64 hardware for example )
import select
from math import floor
import sys
slot = 0
keysname=[["F","E","D","C","vect-int","reset"],
["B","A","9","8","GO","Single-Step"],
["7","6","5","4","Exam-reg","Subst-mem"],
["3","2","1","0","Exec","Next"],
]
keysnames=[["F","E","D","C","vect-int","reset"],
["B","A","L","H","GO","Single-Step"],
["PCL","PCH","SPL","SPH","Exam-reg","Subst-mem"],
["3","2","1","0",".",","],
]
for path in evdev.list_devices():
device = evdev.InputDevice(path)
if evdev.ecodes.EV_ABS in device.capabilities():
break
else:
sys.stderr.write('Failed to find the touchscreen.\n')
sys.exit(1)
while True:
r, w, x = select.select([device.fd], [], [])
id_ = -1
x = y = 0
for event in device.read():
if event.code == event.value == 0:
if id_ != -1:
yy = floor(( x - 600 ) / 700)
xx = floor(( y - 1377 ) / 226)
if yy < 4 and yy >=0 and xx < 6 and xx >= 00:
if slot == 1:
print(keysnames[yy][xx])
else:
print(keysname[yy][xx])
elif event.code == ABS_MT_TRACKING_ID:
id_ = event.value
elif event.code == ABS_MT_SLOT:
slot = event.value
elif event.code == ABS_MT_POSITION_X:
x = event.value
elif event.code == ABS_MT_POSITION_Y:
y = event.value
I came up with a simple matrix calculation
Pressing the 4 corner keys gave me x and y. I took averages for min and max reading. I don’t need pixel-perfect reading, and I noticed values between 960 and 3080 vertically. We want 960 – 3080 into 4 blocks, but the middle should start @ 960.
So 3080/3 = about 700 700 / 2 = 350 block 1 starts 350 sooner than 960 is ~ 600 Upper key y coords = 600-> + 700 Next is 1300 -> + 700 converting to whole numbers using floor gives me: floor(( y – 600 ) / 700) NOTE: My x and y are rotated
Example using coordinates 1600, 1600 floor(( 1600 – 600 ) / 700) = floor(1,4…) = 1st row (from row 0,1,2,3)
"If something is worth doing, it's worth overdoing."