Notes for May 01-07

Finally, an even better place to work in.

Monday, 2023-05-01

Spring Cleaning (part 3 of n), partially courtesy of another bank holiday.

  • Spent a long while faffing about with dust and cleaning rags.
  • Checked up on the state of Takahe development. a bit sad to lose a minimal timeline, but that can be worked around fairly easily.
  • Dipped into PlatformIO to flash a couple of WeMOS D1s, start soldering stuff and take another go at sometime this week.
  • Did some 3D modeling to sort out better office furniture arrangements. Looking up sizes in IKEA’s site makes for very quick work indeed.
  • Put back into my server closet, waited until it passed memtest86 twice and then streamed Horizon Zero Dawn to my living room for over half an hour. CPU and GPU temps were both around 52oC, so I’m calling this a first success even without re-enabling XMP (for which I need to finish my ).

Tuesday, 2023-05-02

Getting a tad annoyed with all the cleaning by now.

  • Dismantled and shipped out a (seldom used) exercise bike. Climbing stairs will have to do as exercise, with the side benefit of taking up less precious room in my office.
  • Fan cables for my arrived, so I left to its own devices for the afternoon and it managed to to pass a load test inside my closet with XMP enabled. Will do more load testing during the week.

Wednesday, 2023-05-03

More cleaning. Also attended an all-day remove event, which meant I could spend the time to casually empty out drawers and slowly sort them throughout the day.

  • Hacked my ultra lightweight C multicast statistics daemon to have report internal temperatures so I can keep tabs on how temperature evolves throughout the day.
  • Since NVIDIA doesn’t expose nice hwmon counters (temperature readings are done via ioctl, and running strace on nvidia-smi didn’t encourage replicating it), I wrote a (very) minimal replacement to report GPU temperature and fan speeds as well:
#!/usr/bin/env python3

from time import sleep
from subprocess import run
from json import dumps
from socket import gethostname, socket, AF_INET, SOCK_DGRAM, IPPROTO_IP, IPPROTO_UDP, IP_MULTICAST_TTL
from pynvml import nvmlInit, nvmlShutdown, nvmlDeviceGetFanSpeed, nvmlDeviceGetTemperature, nvmlDeviceGetHandleByIndex

MCAST_GRP = '224.1.1.251'
MCAST_PORT = 6000
MULTICAST_TTL = 2

sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
sock.setsockopt(IPPROTO_IP, IP_MULTICAST_TTL, MULTICAST_TTL)

def get_cpu_temp():
    with open("/sys/class/thermal/thermal_zone1/temp", "r") as t:
        return float(t.read())/1000

def get_fan_rpm(name="fan1"):
    with open(f"/sys/class/hwmon/hwmon4/{name}_input") as rpm:
        return float(rpm.read())

def get_gpu_fan_rpm(index=0):
    h = nvmlDeviceGetHandleByIndex(index)
    # assume this is a 2000rpm fan
    return(float(nvmlDeviceGetFanSpeed(h))/100*2000)

def get_gpu_temp(index=0):
    h = nvmlDeviceGetHandleByIndex(index)
    return(float(nvmlDeviceGetTemperature(h,0)))

def get_loadavg():
    with open("/proc/loadavg", "r") as load:
        return list(map(float,load.read().split()[:3]))

def get_cpu_usage():
    with open("/proc/stat", "r") as counters:
       pass # TODO - I don't feel like computing jiffie deltas this late

def get_ram_usage():
    with open("/proc/meminfo", "r") as counters:
       pass # TODO - ditto for RAM usage


try:
    nvmlInit()
    while True:
        data = {
            "hostname": gethostname(),
            "cpu_temp": get_cpu_temp(),
            "gpu_temp": get_gpu_temp(),
            "gpu_fan_rpm": get_gpu_fan_rpm(),
            "fan1_rpm": get_fan_rpm("fan1"),
            "fan2_rpm": get_fan_rpm("fan2"),
            "loadavg":  get_loadavg()
        }
        print(data)
        sock.sendto(dumps(data).encode("utf-8"), (MCAST_GRP, MCAST_PORT))
        sleep(120)

except KeyboardInterrupt:
    nvmlShutdown()
    exit()

Thursday, 2023-05-04

Star Wars Day, celebrated by chanting “this is the way” as I cleaned up even more of the office.

  • Finally managed (after nearly one year) to plug a Wemos D1 into the CN105 connector of my and control it via Wi-Fi.
  • Instead of building my own HomeKit shims to control it, I forked this project, which is working OK for me although it lacks a lot of the niceties I’ve grown used to from Tasmota firmware.
  • Looked at some nice temperature charts, decided to do a running comparison with .

Friday, 2023-05-05

Moderate feeling of vague accomplishment.

  • Assembled some IKEA furniture (I’m finally getting a soldering station, yay!).
  • Did a little checkpoint, knocked nearly a dozen items from my to-do lists.
  • I think I need to pack in the towel and give up on keeping shut away in my closet–I now know that the thermals are sort of OK, but the GPU fan kicks in at 56oC and the machine gets at least that warm on idle during a moderately cool day. There’s a pretty noticeable 10oC upswing when I shut the closet door:
A quick Node-RED hack
Also, I need to see if I can put a case fan inside rogueone.

Saturday, 2023-05-06

Coronation day. Celebrated by doing very little whatsoever.

  • Printed box labels with my usual stupid trick: Create rectangles in with the rulers set to centimeters, copy and paste into Preview, print at 100% scale (because is obtuse about print settings). The wonders of native support for Display Postscript never cease.
  • Did .

Sunday, 2023-05-07

A different viewpoint
I'm still not completely happy with Shapr3D, but it works great for doing this.

This page is referenced in: