Hamster Rad

Page content

Projekt Hamster Counter

Hamsterrad

Reed Sensor

Installation

Ziel

Ein kleiner Hamster Rad Zähler, um etwas über das (nächtliche) Laufverhalten des Nagers zu erfahren.

Website

Das Projekt hat nen kleinen Webserver bekommen mit Live Statistiken Webserver nur IPv6 erreichbar

Hardware

Aufbau

das Supermaget klebst Du auf das Hamsterrad auf die Rückseite. Das Rad so gut wie es geht am Gehäuse befestigen. Der Magnetsensor steckst/klebst Du ans Gehäuse und kuckst, dass ca. 1 cm Abstand hast zum Magneten am Rad. Die zwei Kabel am Magneten schraubst/lötest du an die 10m Litze und gehst damit auf den Serial Stecker. Dort schliesst Du die Drähte am Pin 4 und Pin 6 an. Das Script gibt logisch “1” auf den DTR Pin und wenn das Magnet schliesst, dann hast Du Logisch “1” auf DSR. DSR wird dann im Script ausgelesen und gezählt

APU

PC Engines hab ich mit OpenBSD aufgesetzt, Bash, Git, Python3 und CSVkit installiert. Sonst ist eingentlich nix besonderes notwendig.

Software

Python Script

cat << 'EOF' > hamster-serial.py
import datetime
import os
import serial
import sys

# Round Counter
round = 0

# Check for commandline argument. The first argument is the the name of the program.
if len(sys.argv) < 2:
  print ("Usage: python %s [Out File]" % sys.argv[0])
  exit()

# Open the serial port we'll use the pins on and the file we'll write to.
ser = serial.Serial("/dev/tty00")

# Read last Round from file
with open(sys.argv[1], 'r') as f:
   lastline = (list(f)[-1])
round = int(lastline.split(';',4)[2])

# Open the file we're going to write the results to.
f = open(sys.argv[1], 'a')

# Bring DTR to 1. This will be shorted to DSR when the switch is activated as the wheel turns.
ser.setDTR(1)

# Waits for the DSR pin on the serial port to turn off. This indicates that the
# switch has turned off and the magnet is no longer over the switch.
def waitForPinOff():
  while ser.getDSR() == 1:
    1 # Don't do anything while we wait.

# Waits for the DSR pin on the serial port to turn on. This indicates that the
# switch has turned on and the magnet is current over the switch.
def waitForPinOn():
  while ser.getDSR() == 0:
    1 # Don't do anything while we wait.


print ( "%s;%d;%1.2fm\n" % ( datetime.datetime.now().strftime("%Y-%m-%d;%H:%M:%S.%f"), round, 0 ) )


# The main loop of the program.
while 1:

  waitForPinOn()

  print ("pin closed")

  waitForPinOff()

  print ("pin open")

  round = round + 1
  dist  = round * 0.6

  print ("Runde:   %d" % round)
  print ("Strecke: %1.2f meter" % dist)

  a = datetime.datetime.now()

  # Log it to and flush the file so it actually gets written.
  f.write ( "%s;%d;%1.2f meter\n" % ( datetime.datetime.now().strftime("%Y-%m-%d;%H:%M:%S.%f"), round, dist ) )

  f.flush()
EOF

chmod 755 hamster-serial.py

Wrapper

kritzelt alle Runden ins runden.dat

cat << 'EOF' > run.sh
doas python3 hamster-serial.py runden.dat
EOF

chmod 755 run.sh

Statistiken

macht ne Statistik jeden Tag und schickt sie per Mail

cat << 'EOF' > dailystats.sh
#!/usr/bin/env bash

src=runden.dat
today=$(date "+%Y%m%d")
log=stats/$today

mkdir -p stats

head -1 $src > $log.dat
tail -1 $src >> $log.dat

cat $log.dat |/usr/local/bin/csvlook > $log.log

cat $log.log |mail -s "Hamster: $today" -r hamster@world.net meine-geheime-email@irgendwas.com

exit 0
EOF

chmod 755 dailystats.sh

Cronjob

zuletzt noch alles in nen Crontab werfen und warten, bis der Hamster rennt :)

0       6       *       *       *       cd /home/hamster/hamstercount; ./dailystats.sh

sha256: 60f7d9d1d7a6c2293ef524516092daadc9e21addd2baffec31d3328f998679cb