Styr din tellstick med python

Moderator: Telldus

bonega
Posts: 3
Joined: Fri Mar 17, 2023 9:45 am

Styr din tellstick med python

Post by bonega »

Här kommer ett litet pythonscript för att styra tellsticken.

import sys, termios, time

class Tellstick:
def __init__(self, device):
self.fd = open(device, 'w')
self.reciver = {}
new = termios.tcgetattr(self.fd)
cflag = termios.B4800 | termios.CS8 | termios.CLOCAL | termios.CREAD
iflag = termios.IGNPAR
oflag = 0
termios.tcflush(self.fd, termios.TCIFLUSH)
new[0] = iflag
new[1] = oflag
new[2] = cflag
termios.tcsetattr(self.fd, termios.TCSANOW, new)

def power(self, name, power):
bitmask = 0x0001
codes = self.reciver[name]
txcode = codes[0]
txcode |= codes[1] << 4
txcode |= 0x6 << 8
txcode |= power << 11
txstr = 'S'
for bit in range(12):
if bitmask & txcode == 0:
txstr += ' ` `'
else:
txstr += ' `` '
bitmask = bitmask << 1
txstr += ' }+'
self.fd.write(txstr)
self.fd.flush()

def addReciver(self, name, housecode, channelcode):
self.reciver[name] = [housecode,channelcode]

def quit(self):
self.fd.close()

tellstick = Tellstick('/dev/tellstick')
tellstick.addReciver('test', 0, 0)
toggle= True
for i in range(6):
tellstick.power('test', toggle)
toggle=not toggle
time.sleep(0.9)

tellstick.quit()

EDIT: Ser att tabuleringen gick åt skogen..
Någon som vet hur man ordnar det?
Python litar på tabbar för logiken, så koden fungerar ej utan
krambriw
Posts: 654
Joined: Fri Mar 17, 2023 9:45 am

Post by krambriw »

Hej Bonega,

Detta med tabuleringen är nog inget problem för den som är van vid python ;)

Det jag osökt tänkte på är att du tydligen inte utnyttjar Telldus dll-fil

Om Micke P läser detta kanske han kunde sno ihop en ny plug-in till EventGhost så att vi äntligen kan få en plug-in utan den irriterande buggen vi har i den nuvarande versionen

mvh Walter

PS Använd funktionen "Code" så ser det ut som nedan

Code: Select all

class TellStick(eg.PluginClass):

    def __init__(self):
        self.AddAction(TurnOn)
        self.AddAction(Dim)
        self.AddAction(TurnOff)
        self.AddAction(Bell)

    def __start__(self):
        self.dll = None
        try:
            self.dll = windll.LoadLibrary("TellUsbD101.dll")
        except: 
            raise eg.Exception("TellUsbD101.dll not found.")
krambriw
Posts: 654
Joined: Fri Mar 17, 2023 9:45 am

Post by krambriw »

termios funkar inte under windows va?

Kanske måste använda "from msvcrt import getch"
bonega
Posts: 3
Joined: Fri Mar 17, 2023 9:45 am

Post by bonega »

Det finns ingen termios för windows, tror som du säger att det är getch som gäller.

Kan hända att jag skriver något eventghost plugin också.
Jag har antagligen inte samma setup som er andra dock.
Annars så kommer jag säkerligen att skriva plugins för XBMC.
krambriw
Posts: 654
Joined: Fri Mar 17, 2023 9:45 am

Post by krambriw »

Hej, eftersom detta är Linux avdelningen kanske det skulle vara en ide att öppna en tråd för detta (python stöd för tellstick) också under Windows. Att skapa ditt enkla exempel i python så att det kör under Windows vore väldigt intressant tycker jag

mvh Walter
micke.prag
Site Admin
Posts: 2243
Joined: Fri Mar 17, 2023 9:45 am
Location: Lund
Contact:

Post by micke.prag »

I version 2 av vår programvara kommer det hända lite roligare saker.
Samma API som på Windows portas till både Linux och Mac OS X. Detta gör också att det går att göra en riktig python-plugin som är enkel att använda och blir likadan på alla plattformar.

För övrigt så kan jag inte få felet längre i Eventghost. Jag hoppas det beror på att jag har löst problemet men behöver testa på fler datorer.
Micke Prag
Software
Telldus Technologies
bonega
Posts: 3
Joined: Fri Mar 17, 2023 9:45 am

Post by bonega »

Finns det några speciella fördelar med erat API? Föredrar att använda ren python istället för att länka in C.

angående plattformsoberoende:

Code: Select all


try:
    import termios
except Importerror:
    #setup  fd for windows here
else:
    #termios..... linux here.

 
typ
micke.prag
Site Admin
Posts: 2243
Joined: Fri Mar 17, 2023 9:45 am
Location: Lund
Contact:

Post by micke.prag »

Fördelar för programmeraren:
* Du får implementationen av alla protokoll och behöver inte tänka på när nya protokoll eller andra enheter implementeras.
Fördelar för användaren:
* Enheter som konfigureras behöver bara konfigureras en gång. Man slipper lägga in samma enheter flera gånger i olika program. Att t.ex. ändra en enhetskod görs bara på ett ställe och påverkar överallt där den används.
Micke Prag
Software
Telldus Technologies
ThorH
Posts: 2
Joined: Fri Mar 17, 2023 9:45 am

Post by ThorH »

Jag håller på med ett projekt att styra en tellstick med python i linux men jag är rätt så nybörjare.

Från krambriws inlägg får jag intrycket att jag kan använda telldus dll-fill för att göra processen enklare. Finns det nån dokumentation på vad som finns tillgängligt? Nu har jag bara en osnygg lösning där python exekverar rfcmd. Jag har letat runt på telldus.se men hittar inget.

Lite hjälp kanske? Tack :)
micke.prag
Site Admin
Posts: 2243
Joined: Fri Mar 17, 2023 9:45 am
Location: Lund
Contact:

Post by micke.prag »

Vi har tyvärr ingen dokumentation för 1.x serien utan bara till 2.0 som ännu bara finns som alpha.
Kolla gärna källkoden till EventGhost istället: http://eventghost.svn.sourceforge.net/v ... iew=markup
Micke Prag
Software
Telldus Technologies
ThorH
Posts: 2
Joined: Fri Mar 17, 2023 9:45 am

Post by ThorH »

Tack, det där ska jag nog kunna få styr på :)
M
Posts: 6
Joined: Fri Mar 17, 2023 9:45 am
Location: Skåneland

Post by M »

Bonega: Du råkar inte ha gjort ett plugin till XBMC?
linen
Posts: 10
Joined: Fri Mar 17, 2023 9:45 am

Re: Styr din tellstick med python

Post by linen »

Jag ser fördelen med bongeas lösning - minimalt med tjafs, men jag ser också fördelen med att inkludera telldus dll:erna också.

Min fråga till er som kan lite mer om det här: om jag vill använda dll:er, kan jag använda windows dll:er till Linux till exempel? Jag kör en Qnap-nas med ARM-processor, måste jag då lyckas kompilera specifikt mot den, eller är det så flexibelt att jag kan använda en annan dll?

Ett av mina mål är att man lätt ska kunna deploya om på olika plattformar, med minimalt konfigurerande. Bongeas variant använder ju bara saker som redan finns i Python, vilket är ett klart plus. Å andra sidan använder han termios som inte finns på windows vilket är ett klart minus...
micke.prag
Site Admin
Posts: 2243
Joined: Fri Mar 17, 2023 9:45 am
Location: Lund
Contact:

Re: Styr din tellstick med python

Post by micke.prag »

Linux kan inte använda en Windows-dll rakt av. Framför allt inte på en annan processor-arkitektur. Du måste kompilera om för var arkitektur.
Vår Linux-mjukvara ska dock vara anpassad även för en embedded miljö. Åtminstone har vi den ambitionen.
Micke Prag
Software
Telldus Technologies
linen
Posts: 10
Joined: Fri Mar 17, 2023 9:45 am

Re: Styr din tellstick med python

Post by linen »

En fundering, stöder din kod self learning devices? Ser på shift-operationerna att det verkar vara housecode på 4 bitar och channelcode på 4 bitar = totalt 8 bitar. Self-learning har väl 24-bitars adresser?

För övrigt för att se formatteringen som fallit bort i bonegas kod, gör "Visa källkod" på webbsidan. Där ligger den kvar :)

bonega wrote:Här kommer ett litet pythonscript för att styra tellsticken.

import sys, termios, time

class Tellstick:
def __init__(self, device):
self.fd = open(device, 'w')
self.reciver = {}
new = termios.tcgetattr(self.fd)
cflag = termios.B4800 | termios.CS8 | termios.CLOCAL | termios.CREAD
iflag = termios.IGNPAR
oflag = 0
termios.tcflush(self.fd, termios.TCIFLUSH)
new[0] = iflag
new[1] = oflag
new[2] = cflag
termios.tcsetattr(self.fd, termios.TCSANOW, new)

def power(self, name, power):
bitmask = 0x0001
codes = self.reciver[name]
txcode = codes[0]
txcode |= codes[1] << 4
txcode |= 0x6 << 8
txcode |= power << 11
txstr = 'S'
for bit in range(12):
if bitmask & txcode == 0:
txstr += ' ` `'
else:
txstr += ' `` '
bitmask = bitmask << 1
txstr += ' }+'
self.fd.write(txstr)
self.fd.flush()

def addReciver(self, name, housecode, channelcode):
self.reciver[name] = [housecode,channelcode]

def quit(self):
self.fd.close()

tellstick = Tellstick('/dev/tellstick')
tellstick.addReciver('test', 0, 0)
toggle= True
for i in range(6):
tellstick.power('test', toggle)
toggle=not toggle
time.sleep(0.9)

tellstick.quit()

EDIT: Ser att tabuleringen gick åt skogen..
Någon som vet hur man ordnar det?
Python litar på tabbar för logiken, så koden fungerar ej utan
Post Reply