KOAS ja ilmaisen sähkön aikakausi on omalta osaltani päättynyt. Nyt on aika nipistää kaikista kojeista löysät pois. Siispä aloitan nyt epävirallisen blogikirjoitusten sarjan, jossa on tarkoitus esitellä erilaisia energiaa säästäviä ja silti mukavuutta lisääviä arkipäivän innovaatioita.
Ensimmäisenä listalla on tulostin, joka on niin vähän käytetty apparaatti, että se takuulla kuluttaa enemmän sähköä valmiustilaansa kuin tulostamiseen. Se on kuitenkin näppärää olla aina päällä, koska on ihan vehkeestä etsiä virtajohdon päätä siinä vaiheessa, kun pitäisi jotakin saada tulostettua ja nopeasti. Olisi ihan näppärää, kun tietokone tekisi tämän kaiken puolestani. Mitenhän tämä onnistuisi?
Tulostimenani on HP:n vanha palvelija, Laserjet 6L, jonka ostin Maakuthilta käytettynä pari vuotta sitten. Hyvä peli on ollut se, ei moittimista. Toinen keskeinen komponentti on Silvershield PMS, tuttavallisemmin saksalainen ihmeroikka. Laitteessa on 4 USB:n välityksellä ohjattavaa ulostuloa, eli sillä voi toteuttaa tietokoneohjauksen ilman sähköasennuksia. Ajuri löytyy mm. Linuxille, eli homma toimii.
Homma ei ole mitenkään tulostinriippuvaista, koska temppu toimii kaikilla tulostimilla, jotka käynnistyvät saatuaan sähköä. Myöskään releohjaimen tyypillä ei ole väliä. Tässä käytetyn ohjaimen lisäksi myös esimerkiksi DMX-väylään liitettävät ohjaimet soveltuvat. Joutuu tietysti sitten muuttamaan komentoja.
Periaate on yksinkertainen. Halutaan, että tulostimessa on sähköä kun tulostus alkaa ja että se sammuisi, kun homma on valmista. Lisäksi olisi ihan mukavaa, ettei se sammu ihan heti, koska usein tulostamaan ryhtyessään tarvitsee sitä muutaman minuutin päästä uudestaan. Siispä tehdään vaatimusmäärittely:
- Rele vetää ennen, kuin laitteelle lähetetään tulostustyö
- Rele pidetään vedettynä koko tulostustyön ajan
- Rele päästetään 5 minuutin kuluttua tulostumisen valmistumisesta, mikäli uusia tulostustöitä ei ole saapunut siihen mennessä.
Vaatimukset vaikuttavat yksinkertaisilta, tosin viimeinen kohta vaatii vähän enemmän. Tarvitaan jonkinlaista tilallista sovellusta.
Tutkitaan vähän ongelmakenttää. Tiedetään, että Linuxissa tulostamisesta vastaa CUPS-niminen palvelinsovellus. Lisäksi saksalainen ihmeroikka tottelee komentoja sovellukselta sispmctl, joka löytyy mm. Debian-jakelusta. Nopeasti pähkäilemällä selviää, että tarvitaan CUPSiin ennen tulostamista (pre) ja tulostamisen jälkeen (post) suoritettava hook, jonka edesmennyt lehtorimme nimeäisi mieluusti koukuksi.
Nopean googletuksen jälkeen kävi ilmi, että CUPS ei tällaista vakiona tarjoa, mutta tulostuskiintiöiden laskentaan käytettävä sovellus Tea4CUPS tarjoaa moisen ominaisuuden. Siistiä. Siispä erästä kissoihin viehättynyttä tohtorilehtoria lainatakseni: Suoraan hommiin vaan!
Noudetaan tämä verraton Python-sovellus ja siirretään kamat oikeaan paikkaan:
svn co http://svn.pykota.com/tea4cups/trunk tea4cups
sudo cp tea4cups/tea4cups /usr/lib/cups/backend
sudo chown root:root /usr/lib/cups/backend/tea4cups
sudo chmod 700 /usr/lib/cups/backend/tea4cups
Tämän jälkeen muokataan tiedostoa /etc/cups/printers.conf, jonne lisätään tulostimen laitepolun eteen tea4cups://. Lopputuloksena tässä tapauksessa saadaan seuraavaa:
DeviceURI tea4cups://usb://HP/LaserJet%206L
Sitten jäljellä on enää koukkujen kiinnittäminen. Konffataan koukku luomalla tiedosto /etc/cups/tea4cups.conf ja kirjoittamalla sinne seuraavaa:
[global]
directory : /var/spool/cups/
prehook_0 : /usr/local/sbin/printer_power up
posthook_0 : /usr/local/sbin/printer_power down
Lopuksi tarvitaan itse koukku. Tarinan tässä vaiheessa minulta loppui kiinnostus tehdä asiat tyylikkäästi, unohdin korkean tason ihanteeni, funktionaalisen kauneuden. Sen sijaan loin uuden tiedoston /usr/local/sbin/printer_power ja työnsin sormet syvälle kurkkuuni. Katsotaan mitä tulee:
#!/bin/bash -eu
#
JOBFILE=/var/local/printerjob
RELAY=2
if [[ $# -ne 1 ]]; then
echo 'No parameters given'
elif [[ $1 == "up" ]]; then
# Remove possible power-downs
[[ -e $JOBFILE ]] && atrm $(<$JOBFILE) || true
# Switch power up even if it is on already
/usr/bin/sispmctl -o $RELAY
elif [[ $1 == "down" ]]; then
# Queue shutdown and write queue number with ugly screenscraping.
echo /usr/bin/sispmctl -f $RELAY |\
at now + 5 minutes 2>&1 |\
tail -n+2 | sed 's/^job \([0-9]*\).*/\1/' >$JOBFILE
else
echo "Invalid parameter, use either 'up' or 'down'"
fi
Skripti tarvitsee luonnollisesti vielä suoritusoikeudet ja at-paketin:
sudo chmod a+x /usr/local/sbin/printer_power
sudo apt-get install at
Lopuksi käynnistetään CUPS uudelleen:
sudo service cups restart
Sitten avataan tietysti Emacs ja painetaan tulostuspainiketta. Jännitetään.
TOIMII!
... ja maailma pelastuu!!!!









