[vz-dev] MacGyver goes Volkszaehler !
Harald Koenig
koenig at tat.physik.uni-tuebingen.de
Fri May 28 21:26:48 CEST 2010
Hi,
hier nun die "doku" meiner ersten volkszaehler-hard- und software,
ganz ala MacGyver mit einem deftigen Linux-einschlag ;-)
(noch) mangels eines AVR-boards (und vermutlich auch mangels massig zeit
fuer den startup mit avr/ethersex/...) suchte ich nach einer anderen loesung
zum *sehr* schnellen quereinstieg in die volkszaehlerei -- der rest kommt dann
schon auch noch mal -- nach dem urlaub...;)
fuer die ungeduldigen erstmal ein paar bilder der kompletten hardware
(bis auf die kanibalisierte 230V-mehrfachsteckerleiste;)
http://www.tat.physik.uni-tuebingen.de/~koenig/vz/
und der fertige "source code" :
( strace -ttt -e read cat < /dev/ttyUSB0 > /dev/null ) 2>&1 | awk '/read\(0, "\\0", 4096\) = 1/{ t=int($1 + 0.5); system("wget -O- \"http://harald/f10/volkszaehler.org/httplog.php?uuid=00000000-0000-0000-0000-000000000001&port=0000001&time=\"" t " # >& /dev/null"); }'
zuerst die idee:
man will ja nur pulse zaehlen mit genauer "ankunfszeit", die pulse kommen
so max. 1 mal pro sekunde und sind so ~100 msec lang.
das alles erinnert *exterm* an das DCF77 funkuhr-signal (1 puls pro sekunde,
100 oder 200 msec lang == 0 oder 1)...
und seit so 2 jahrzehnten ist es usus, dass man deses dcf77-signal einfach
an eine serielle schnittstelle haengt mit 50 baud. der start des pulses
ist die startflange des "startbit" bei der async.seriellen uebertragung,
und je nach dem ob kurzer oder langer puls sind mehr oder weniger bits gesetzt
und man kann sogar die pulslaengen damit erkennen.
pulslaengen gibts hier beim stromzaehlen nicht, also noch einfacher;)
so muss man wirklich nur die S0-ausgaenge (zumind. fuer SWISSNOX)
an eine serielle schnittstelle haengen zwischen Rx und z.b. RTS
(irgend eine handshake output leitung, die man dann auf 0 (== aktiv == space)
ziehen muss).
dann muss man nur noch warten bis der S0-pulse als "startbit" ein zeichen ausloest
und dieses dann einlesen und den timestamp merken/ausgeben -- fertig!
das kann man dann direkt z.b. mit einem usb2serial adapter/kabel abgreifen,
oder auf eine echte serielle schnitstelle geben, so man noch hat;)
also: SWISSNOX klemme 21 muss mit RS232 Rx (pin 2 auf DSUB-9) und klemme 20 mit RTS (pin 7 auf DSUB-9)
verbunden werden, der rest (230V) wie gehabt.
man kann dazu direkt zwei aufgebogene bueroklammern verwenden und die
mit hilfe eines "gender changer" (weiblich/weiblich) direkt in die RS232-verbindung stecken,
oder etwas bequemer (wenn man noch 2 weitere puero klammern und 2 krokoklemmen kabel uebrig hat...).
alternativ kann man auch die reste einer original microsoft seriellen maus endlich zu was vernueftigem
verwenden und damit den anschluss an den usb/seriell adapter machen (bei mir: orange=Rx, weiss=RTS).
hier liegen ein paar bilder des gesamten "aufbaus" -- der zaehler haengt
derzeit noch in der zuleitung zu einer 3-fach-steckdose mangels besserem gehaeuse (s.u.).
http://www.tat.physik.uni-tuebingen.de/~koenig/vz/
so einfach die hardware ist, so einfach hat es MacGyver unter Linux/UN*X
auch mit der software: serielle schnittstelle richtig konfigurieren
(50 baud, jedes zeichen sofort ausgeben, ...)
stty time 1 min 1 -icanon < /dev/ttyUSB0
und schon kann man die daten wie gewuenscht lesen. doch wie an einen "guten"
time stamp kommen, wenn man kein C o.ae. programmieren will ?
z.b. so:
strace -ttt -e read cat < /dev/ttyUSB0 > /dev/null
und um das ganze besser beurteilen und verdauen zu koennen,
noch ein bissl test code dazu:
( strace -ttt -e read cat < /dev/ttyUSB0 > /dev/null ) 2>&1 | awk 'NR==1{t0=$1;next}{t=$1; print 3600e3 /(t-t1)/2000 , t-t0,t-t1,$0;t1=t}'
spalte 1 liefert dann die leistung in watt, 2 die laufende zeit in sekunden, 3 die zeit seit dem letzten puls, und dann noch den gesamten strace-output mit original timestamp.
es fallt dabei auf (zumind. bei meinem setup), dass immer mal wieder ein "falscher" zweiter puls kommen kann (ursache sollte man mal noch erforschen, evlt. mit oszi?!):
1275071653.195588 read(0, "\0", 4096) = 1
1275071681.731568 read(0, "\0", 4096) = 1
1275071710.623568 read(0, "\0", 4096) = 1
1275071739.471581 read(0, "\0", 4096) = 1
1275071768.351691 read(0, "\0", 4096) = 1
==> 1275071797.199619 read(0, "\377", 4096) = 1
1275071797.271617 read(0, "\0", 4096) = 1
1275071826.107561 read(0, "\0", 4096) = 1
aber die lassen sich ja leicht wegfiltern, z.b. mit grep 'read(0, "\\0", 4096)'
wenn man die daten gleich in der datenbank haben will (mit dem PHP/mysql code von Florian Ziegler, daher die rundung der timestamps?!), dann muss der einzeiler eben noch ein bissl wachsen;)
( strace -ttt -e read cat < /dev/ttyUSB0 > /dev/null ) 2>&1 | awk '/read\(0, "\\0", 4096\) = 1/{ t=int($1 + 0.5); system("wget -O- \"http://harald/f10/volkszaehler.org/httplog.php?uuid=00000000-0000-0000-0000-000000000001&port=0000001&time=\"" t " # >& /dev/null"); }'
und schon fuellt sich die datenbank!
wie bei jedem "einfachen" selbstbau ist das schwierigste mal wieder die gute verpackung hardware:-(
hier einige ideen:
* eine "dicke" mehrfachsteckdose, in die man den hutschienenzaehler komplett verbauen kann
* ein stecker/buchse-gehaeuse wie fuer einen energiekostenzaehler, in das dann der SWISSNOX o.ae. kommt (alternativ einen billigen steckdosenzaehler, den man ausschlachtet?!)
* ein kleines gehaeuse, in das eine kaltgeraetebuchse, der hutschienenzaehler und eine schuko-dose platz haben,
dann braucht man noch zusaetzlich ein kaltgeraetekabel und evtl. eine mehrfachverlaengerung.
wenn hier jemand gute ideen hat waere ich sehr interessiert!!!
in jeden fall wuerde man eben in das gehaeuse eine DSUB-9 buchse mit den S0-ausgaengen einbauen
und kommt ausser dem hutschienenzaehler nur noch zusatzkosten fuer das gehaeuse/dsub-buchse/...
sowie das usb-serial-kabel (~5 EUR) und schon kann man eine phase bzw. ein geraet
wunderbar ueberwachen...
und das skaliert auch ganz prima: fuer jeden weiteren kanal nur noch einen weiteren usb-rs232-adapter,
verpackung und latuerlich einen weiteren zaehler, und irgendwann vielleicht noch einen 64er usb-hub... ;-)
so nun aber gruesse und viel spass beim "nachbauen" ;-)
Harald
PS: ab sonntag bin ich erstmal eine woche in urlaub,
dann eine woche in berlin beim LinuxTag -- zumind. mit
einem 1-kanal-volksempfaenger^Wzaehler !!
vielleicht sieht man sich ja dort...
PPS: ich habe noch immer eine wiki-allergie, aber wer immer spass daran hat, darf
diese infos natuerlich gerne dorthin verfrachten;)
--
"I hope to die ___ _____
before I *have* to use Microsoft Word.", 0--,| /OOOOOOO\
Donald E. Knuth, 02-Oct-2001 in Tuebingen. <_/ / /OOOOOOOOOOO\
\ \/OOOOOOOOOOOOOOO\
\ OOOOOOOOOOOOOOOOO|//
\/\/\/\/\/\/\/\/\/
Harald Koenig // / \\ \
koenig at tat.physik.uni-tuebingen.de ^^^^^ ^^^^^
More information about the volkszaehler-dev
mailing list