Infotavler

Samfundet har besluttet å gå til anskaffelse av infotavler, i denne noden ønsker vi å samle litt krav vi setter til systemet, både programvare og maskinvare.

Maskinvare

Baserer oss så langt på Asus Pundit-R (RS200) da disse har VGA, DVI, S-Video og Composit-utgang. Dette gjør oss lite bundet til hva slags medie vi ønsker å kjøre på.

Så langt har vi anskaffet følgende skjermer:

Programvare

show er ikke lenger i bruk på Samfundet. Informasjonen under er kun historisk og mulgiens til nytte om noen finner ut at skjermene skal opp igjen.

Samfundets nåværende infoskjermsystem er utviklet her på huset og tilpasset våre behov. De viktigste featurene til systemet er innhenting av RSS, iCal, visning av statisk tekst og bilder.

Systemet er bygget opp av følgende komponenter:

Cron

En cron-jobb i /etc/cron.d/show som kjører ti på halv og hel time henter inn oppdateringer. Per i dag er det bare iCal- og feed-innhenting som blir gjort.

Feed-koden prøver å sjekke HTTP-headerne "Not-Modified" og "E-Tag" når den ber om feeder. iCal-koden gjør ikke noe slikt enda (og www.samfundet.no sin iCal støtter det heller ikke).

Klienter

show-klienter er utrolig enkelt satt opp :) De er en minimal Debian etch-instalalsjon med X, pywebkit som kjører i fullscreen, en cron-jobb samt noen andre små programmer. For full oversikt over hva som inngår se Puppet-klassen show-node.

XHTML+CSS+JavaScript

Visningen drives av show.js som bruker Prototype for å slippe å slåss med for mye browser quirks og lignende.

Merk at ting styres av show.css og style.css, hvor show.css inneholder et generelt stilsett mens style.css er site-spesifikt. CSS-stilene er avhengige av hvorvidt <body> har CSS-klassen show, f.eks:

.show #head {
    postition: absolute;
    top: 0;
}
.show #foot {
    postition: absolute;
    bottom: 0;
}

CSS-en sørger videre for at det kunne er <div id="splash"> som vises ved oppstart i show-modus inntil JavaScript-koden bytter slide.

JavaScript-koden sjekker også om vi er i show-modus. Om dette er tilfellet gjør den følgende:

  1. Sjekk at vi fikk lastet de eksterne scriptene (prøv igjen om det feiler)
  2. Installer event handlers
  3. Fiks bilder og tekststørrelse på alle element med klasse page
  4. Sjekk om siden er for gammel og at vi har sider å vise
  5. Sett timeout for når splash-screenen skal fjernes og showet startes

Backend

Måten ting henger sammen intern kan grovt sett forklares med følgende ASCII-art:

 +------+      +-----+        +--------+
 | show |---+->| foo |------->| ical-1 |
 +------+   |  +-----+       /+--------+
     ^      |           ,---` 
     |      |  +-----+ /       +-------+
     |      +->| bar |------->| rss-1 |
     |      |  +-----+        +-------+
     |      |
     |      |  +-----+        +-----+
     |      +->| baz |------->| ... |
     |         +-----+        +-----+
 +--------+
 | maskin |
 +--------+

Litt mer forklaring er sikkert greit; maskiner mappes opp mot show ved at en maskin går inn på URL-en /h/<hostnavn>. Koblingen til show brukes til å finne hvilke katgorier showet består av. Alle sidene hentes fra kategoriene.

Show består idag av følgende moduler/Django-apps:

common
inneholder show, kategorier og maskiner samt plugin-koden
page
gir støtte for statisk infotekst formatert med Markdown, samt ett bilde
image
fullscreen bildevisning
feed
import av RSS/Atom-feeds ved hjelp av feedparser
ical
innhenting av iCal-eventer vha. vobject
weather
henter værvarsel fra yr.no

Mesteparten av show sin backend er bygget med helt standard Django og burde være fint forståelig om man først leser gjennon følgende tutorial. Plugin-systemet som er brukt trenger nok litt mer forklaring ettersom det er egenutviklet for formålet.

La oss begynne med det enkle, å legge til en plugin gjøres med følgende kode:

from show.common.models import plugins

class FooBar(models.Model)
    ....

plugins.add(FooBar)

Plugin-systemet utvider så klassen med en mange-til-mange kobling til kategorier, sist modifisert dato, opprettet dato og varighet (kan slås av med kwargs til add()). Når vi skal vise et show, brukes plugin-systemet sin metode plugins.all(categories), som gjør et oppslag i f.eks. FooBar.objects.filter(categories__in=[1,2,3]) (fremmednøkkelen som slås opp mot kan endres via kwargs til add()).

Ved oppdatering sjekker vi alle pluginene som er registrert og kjører metoden update() på alle objektene som finnes.

Avhengigheter

Gammel kravspek

Samfundet kjørte phunky, utviklet av apario.net ved BTD (Bjørn Torkel Dahl elns). Under testperioden kom vi frem til følgende krav systemet må oppfylle.

Kunstnerisk del

Brukergrensesnitt

Teknisk del

Ønsker

Nye forslag fra LIM

Lenker: Start

Mail: itk@samfundet.no | Telefon: 992 15 925 | Sist endret: 2011-12-10 19:42 | Revisjon: 23 (historie, blame) | Totalt: 1420 kB | Rediger