Använda en TellStick tillsammans med Raspberry PI
OBS! detta är en gammal artikel, det finns en ny uppdaterad artikel om installationen, se Uppdaterad artikel om Tellstick på Raspberry PI. OBS!. Ursäkta länken här var fel, nu pekar den rätt
TellStick är en USB enhet som kan styra olika typer av fjärrströmbrytare m.m. från bland annat Nexa, Proove, Sartano, Waveman och Roxcore och kostar mellan 600 -1000 kr (2013) beroende på vilken modell man köper. I Denna artikel använder jag en enklaste modellen men en äldre variant som jag haft ett par år
men den som finns idag har förbättrad räckvidd då den har en extern antenn
Först måste vi se till att ett antal paket finns installerade på maskinen, kör
sudo apt-get install libftdi1 libftdi-dev
för att installera bibliotek och utvecklingsfiler för USB kontrollern och
sudo apt-get install libconfuse0 libconfuse-dev
för bibliotek som Tellstick mjukvaran använder.
Börja med att kontroller att Tellstick har hittats av operativsystemet
Den sista raden visar att den hittats, använd nu vendor id (1781) och produkt id (0c30) för att ladda kenelmodulen för Tellsick, sätt 0x framför nummrena för att visa att de är hexadecimala tal.
sudo modprobe ftdi_sio vendor=0x1781 product=0x0c30
kontrollera sedan att module verkligen laddads med
lsmod | grep ftdi
När man verifiera att modulen laddats korrekt måste man lägga in mobprobe raden i en fil för att den ska laddas automatiskt vi uppstart. Kör
sudo nano /etc/modules
och lägg in följande rader i filen
1 |
ftdi_sio vendor=0x1781 product=0x0c30 |
och spara filen. Nu är hårdvarustödet löst, nu är det dax att hämta hem mjukvara för tellsticken och kompilera upp den för Reaspberry PI.
Först behöver mjukvara ett program som heter cmake, kör
sudo apt-get install cmake
Nu är det dax att hämta hem källkoden för Tellstick från http://download.telldus.se/TellStick/Software/telldus-core/, den senaste är just nu från Feb 2012 och denna laddas ner med wget med
wget http://download.telldus.se/TellStick/Software/telldus-core/telldus-core-2.1.1.tar.gz
När filen är nerladdat packar man upp den med
tar xfz telldus-core-<versionen du laddade ner>.tar.gz
och sedan gör man cd ner i katalogen som skapade vid uppackningen
cd telldus-code-<versionen du laddade ner>
När du står i katalogen kör du cmake med kommandot
cmake .
observera punken i kommandot, om allt gick bra bör du ha en skärm som ser ut som nedan.
Nu kan man köra make och luta sig tillbaka en stund medan alla filer kompileras
make
Om all går bra sa du inte få några felmeddelanden
Nu är den bara att installera filerna men make install
sudo make install
Nu måste man få ld att hitta biblioteken som kopierades och det gör man med
sudo ldconfig
Sen ska man skapa en ny fil med namnet /etc/init.d/telldusd
sudo nano /etc/init.d/telldusd
och klistra in följande rader
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
#! /bin/sh ### BEGIN INIT INFO # Provides: telldusd # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Tellstick service daemon # Description: Tellstick service daemon controlling remove switches ### END INIT INFO # Author: Kjell Haveskold (nimmis) <kjell.havneskold@gmail.com> # Do NOT "set -e" # PATH should only include /usr/* if it runs after the mountnfs.sh script PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin DESC="Tellstick service daemon" NAME=telldusd DAEMON=/usr/local/sbin/$NAME DAEMON_ARGS="" PIDFILE=/var/run/$NAME.pid SCRIPTNAME=/etc/init.d/$NAME # Exit if the package is not installed [ -x "$DAEMON" ] || exit 0 # Read configuration variable file if it is present [ -r /etc/default/$NAME ] && . /etc/default/$NAME # Load the VERBOSE setting and other rcS variables . /lib/init/vars.sh # Define LSB log_* functions. # Depend on lsb-base (>= 3.2-14) to ensure that this file is present # and status_of_proc is working. . /lib/lsb/init-functions # # Function that starts the daemon/service # do_start() { # Return # 0 if daemon has been started # 1 if daemon was already running # 2 if daemon could not be started start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \ || return 1 start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \ $DAEMON_ARGS \ || return 2 # Add code here, if necessary, that waits for the process to be ready # to handle requests from services started subsequently which depend # on this one. As a last resort, sleep for some time. } # # Function that stops the daemon/service # do_stop() { # Return # 0 if daemon has been stopped # 1 if daemon was already stopped # 2 if daemon could not be stopped # other if a failure occurred start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME RETVAL="$?" [ "$RETVAL" = 2 ] && return 2 # Wait for children to finish too if this is a daemon that forks # and if the daemon is only ever run from this initscript. # If the above conditions are not satisfied then add some other code # that waits for the process to drop all resources that could be # needed by services started subsequently. A last resort is to # sleep for some time. start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON [ "$?" = 2 ] && return 2 # Many daemons don't delete their pidfiles when they exit. rm -f $PIDFILE return "$RETVAL" } # # Function that sends a SIGHUP to the daemon/service # do_reload() { # # If the daemon can reload its configuration without # restarting (for example, when it is sent a SIGHUP), # then implement that here. # start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME return 0 } case "$1" in start) [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" do_start case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; stop) [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" do_stop case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; status) status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $? ;; #reload|force-reload) # # If do_reload() is not implemented then leave this commented out # and leave 'force-reload' as an alias for 'restart'. # #log_daemon_msg "Reloading $DESC" "$NAME" #do_reload #log_end_msg $? #;; restart|force-reload) # # If the "reload" option is implemented then remove the # 'force-reload' alias # log_daemon_msg "Restarting $DESC" "$NAME" do_stop case "$?" in 0|1) do_start case "$?" in 0) log_end_msg 0 ;; 1) log_end_msg 1 ;; # Old process is still running *) log_end_msg 1 ;; # Failed to start esac ;; *) # Failed to stop log_end_msg 1 ;; esac ;; *) #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2 echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2 exit 3 ;; esac |
spara filen och gör den sen körbar med
sudo chmod +x /etc/init.d/telldusd
och sätt up den för autostart med
sudo update-rc.d telldusd defaults
Nu är mjukvaran installerad så nu återstår bara att definiera upp fjärrströmbrytarna som man ska styra i filen /etc/tellstick.conf, det finns en enkel dokumentation på Telldus hemsida men den är ganska kortfattad.I min test har jag använt mig av NEXA strömbrytare t.ex denna 3-pack från Kjell & Co för 199 kr eller en liknade från Jula för 239 kr. I beskrivningen så är det lite otydligt hur man definierar upp model = fältet i konfigurationsfilen, när man väljer vilken typ man vill använda så ska man lägga till :nexa till definitionen, så codeswitch ska i alla fall för NEXA skrivas som codeswitch:nexa.
Här är min test definition i /etc/tellstick.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
user = "nobody" group = "plugdev" ignoreControllerConfirmation = "false" device { id = 1 name = "switch1" protocol = "arctech" model = "codeswitch:nexa" parameters { house = "A" unit = "10" } } device { id = 2 name = "switch2" protocol = "arctech" model = "codeswitch:nexa" parameters { house = "A" unit = "2" } } device { id = 3 name = "switch3" protocol = "arctech" model = "codeswitch:nexa" parameters { house = "A" unit = "5" } } |
Varje gång man gjort en ändring av /etc/tellstick.conf måste tellus tjänsten startas om för att ändningarna ska läsas in, detta gör med kommandot
sudo /etc/init.d/telldusd restart
Nu kan man använda kommando tdtool för att styra switcharna, tdtool –list ger en lista av alla definierade switchar
Man kan sedan Slå på en enhet med tdtool –on och antingen nummer eller namn för enheten, så man kan aktivera enheten antingen med tdtool –on 1 eller tdtool –on switch1. Man slår av en enhet på samma sätt med tdtool –off och antingen nummer eller namn för enheten, så man kan aktivera enheten antingen med tdtool –off 1 eller tdtool –off switch1.
Någon kanske noterar att jag använder fasta adresser på självlärande strömbrytare men det är för att jag använder dem just nu i den enhet som inte hanterar självlärande enheter. Detta innebär att tdtool -learn inte stöds för dessa, det är egentligen inget problem då man kan lära enhent genom att skicka tdtool –on i stället för tdtool –learn
Detta avslutar installationsdelen, jag återkommer senare med program för styrning
hejsan jag har en fråga, om jag använder rasperry pi och installerar lstp i dem, och de ska vara kopplad till ubuntu server, hur kopplar man dem tillsamans? är det via sladd eller via ip adress?
Nu vet jag inte vad du menar med sladd, men anslutningen går via ipadress, antingen via TP-anslutningen eller via en wi-fi adapter
hur kopplar man en thin clients till en server?
Jag vill att thin clients (tunna klienter) ska kunna kommunicera med server. Hur gör man det? ska man koppla först thin clients till en switch först eller direkt till servern?
En switch fungerar som en kopplingspunkt mellan alla anslutna enheter till switchen. Switchen vet sedan vilken enhet som sitter i vilket uttag och skicka paketen till rätt enhet. För att nätet ska fungera måste varje enhet har ett eget IP-nummer. Normalt har man en DHCP-server i routern som sköter om att dela ut dessa adresser och hålla reda på vilken enhet som har vilket nummer.
Det går att koppla direkt mellan två enheter, se artikeln http://raspberry.arctics.se/2013/04/01/raspberry-pi-kopplad-direkt-till-dator/, principen är densamma men jag rekommenderar det inte då det kräver en massa konfigurering på servern för att få allt att fungera (den måste bl a agera DHCP-server för klienten). Ska man sedan kunna nå några andra maskiner förutom server måste den ha 2 nätverkskort.
Grym instruktion! – Jag har dock en liten lustighet. Efter reboot av min PI (raspbmc) så har jag inte kontakt med min tellstick. Misstänker det har något att göra med ordningen mitt system bootar up i.
Detta är felen från SYSLOG:
telldusd: Trying to execute action, but no controller found. Rescanning USB ports
telldusd: No contoller (TellStick) found after one retry. Giving up.
Posten innan i SYSLOG är “procps: Activating swap”
En enkel work around just nu är att jag bara kör restart på demonen – sen fungerar allt som det ska tills jag rebootar igen.
TIPS?
//Niklas
Tack för en strålande guide!
Hej,
Jag skulle vilja veta när fortsättningen på denna “artikel” kommer… Är ju intresserad av att veta =)
Fantastic. Tack. Har precis bytt ut min NSLU2 mot en Pi och den här sidan var allt jag behövde för att få igång Tellsticken!
Tack för denna!
Tack för guiden! Kommer behövas när jag får hem grejorna. Fast jag är inte så hemma på Linux så efter att läst guiden inser jag att jag borde köpt en Tellstick Net trots allt..
Hej! Angående program för styrning så håller jag på att implementera Tellstick-stöd i ago control, som bl.a. kan köras på RPi. Just nu under utveckling, men alla viktiga bitar fungerar.
Tack för en mycket detaljerad och intuitiv beskrivning 🙂 … men jag har tyvärr sprungit på ett problem. Med tanke på att jag är en RaspberryPi-noob så hoppas jag du kan ha överseende med min fråga. Jag har följt din beskrivning till punkt och pricka men när jag kör “tdtool –on 1” så får jag svaret “Turning on device 1, KitchenLamp – TellStick not found”. Betyder detta att min Tellstick (classic) inte kan identifieras eller?
Mvh,
Marcus
Vill bara påpeka att om man vill bygga paketen som för exemepvis Ubuntu, så har jag och några till skrivit ihop en instruktion till hur man kompilerar om paketen för en Raspberry Pi som kör Debian (Raspbin). Då behöver man inte tar:a och så, utan det mesta görs automatiskt med några få kommandon.
Instruktionerna finns sedan länge på Tellsticks forum.
Hej
Glad i hågen att följa de andra entusiasterna så införskaffade jag en Tellstick till min Raspberry Pi. Jag följde guiden ända ner till där telldus-core skulle laddas ner från telldus.se och här får jag problem. Versionen har uppdaterats till 2.1.2 och den tidigare går inte ladda ner. Men jag kör vidare på 2.1.2 och kommer till “cmake .” och där får jag felmeddelanden. Jag har både kört med och utan “sudo” i hopp om att detta kunde vara en väg men inte. Jag ser i guiden ovan att även där fås meddelande “Not Found” men inte error.
pi@raspberrypi ~/telldus-core-2.1.2 $ sudo cmake .
— The C compiler identification is GNU 4.6.3
— The CXX compiler identification is GNU 4.6.3
— Check for working C compiler: /usr/bin/gcc
— Check for working C compiler: /usr/bin/gcc — works
— Detecting C compiler ABI info
— Detecting C compiler ABI info – done
— Check for working CXX compiler: /usr/bin/c++
— Check for working CXX compiler: /usr/bin/c++ — works
— Detecting CXX compiler ABI info
— Detecting CXX compiler ABI info – done
— Looking for include file pthread.h
— Looking for include file pthread.h – found
— Looking for pthread_create
— Looking for pthread_create – not found.
— Looking for pthread_create in pthreads
— Looking for pthread_create in pthreads – not found
— Looking for pthread_create in pthread
— Looking for pthread_create in pthread – found
— Found Threads: TRUE
— Found PkgConfig: /usr/bin/pkg-config (found version “0.26”)
— checking for one of the modules ‘libftdi’
— Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE)
CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
FTDI_LIBRARY
linked by target “telldusd” in directory /home/pi/telldus-core-2.1.2/service
— Configuring incomplete, errors occurred!
pi@raspberrypi ~/telldus-core-2.1.2 $ cd ..
pi@raspberrypi ~ $ cd telldus-core-2.1.2/
pi@raspberrypi ~/telldus-core-2.1.2 $ make
make: *** Inga mål angavs och ingen makefil hittades. Stannar.
pi@raspberrypi ~/telldus-core-2.1.2 $
Av denna anledning kommer jag inte vidare.
Hur går jag vidare?
Tacksam för svar?
Med vänlig hälsning
Thomas
Hej igen
Nu har jag provat att backa till 2.1.1 som det står i denna guide och liknande fel dyker upp igen. Ser ut som att jag saknar något i mitt system som har med “ftdi”. vad nu det kan vara?
pi@raspberrypi ~ $ tar xfz telldus-core-2.1.1.tar.gz
pi@raspberrypi ~ $ cd telldus-core-2.1.1/
pi@raspberrypi ~/telldus-core-2.1.1 $ cmake .
— The C compiler identification is GNU 4.6.3
— The CXX compiler identification is GNU 4.6.3
— Check for working C compiler: /usr/bin/gcc
— Check for working C compiler: /usr/bin/gcc — works
— Detecting C compiler ABI info
— Detecting C compiler ABI info – done
— Check for working CXX compiler: /usr/bin/c++
— Check for working CXX compiler: /usr/bin/c++ — works
— Detecting CXX compiler ABI info
— Detecting CXX compiler ABI info – done
— Looking for include file pthread.h
— Looking for include file pthread.h – found
— Looking for pthread_create
— Looking for pthread_create – not found.
— Looking for pthread_create in pthreads
— Looking for pthread_create in pthreads – not found
— Looking for pthread_create in pthread
— Looking for pthread_create in pthread – found
— Found Threads: TRUE
— Found PkgConfig: /usr/bin/pkg-config (found version “0.26”)
— checking for one of the modules ‘libftdi’
CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
FTDI_LIBRARY
linked by target “telldusd” in directory /home/pi/telldus-core-2.1.1/service
— Configuring incomplete, errors occurred!
pi@raspberrypi ~/telldus-core-2.1.1 $
/Thomas
Jag kollade upp denna sida utan gott resultat:
http://www.ftdichip.com/Drivers/D2XX.htm
Jag börjar tro att jag har fel utgåva på min raspbian trots att jag laddat ner den nyss och gjort uppdatering direkt. Nu skiter jag i det här och testar en NOOBS utgåva och ser ifall detta går bättre.
🙁
Det är för otroligt…
Jag missade en rad i början av denna guide:
sudo apt-get install libftdi1 libftdi-dev
nu fick jag inga error på kommandot “cmake .”
🙂
Obs trots ny utgåva 2.1.2
Denna ger fortfarande fel trots detta.
telldus-core/telldus-core-2.1.2.tar.gz
Men 2.1.1 fungerar och håller på att installeras nu d v s
telldus-core/telldus-core-2.1.1.tar.gz
är den som skall väljas