Hallo,
Das Thema hat nur indirekt mit smarthome.py zu tun, sondern eher mit der Python programmierung,
aber da smarthome.py auf Python basiert, und hier viele dieser Programmiersprache mächtig sind,
hoffe ich dass mir hier jemand helfen kann (oder will).
Leider hab ich von Python nicht direkt viel Ahnung, hab bisher nur kleinere Smarthome-Logiken mit Copy-and-Paste erstellt.
Programmierung hab ich bisher nur mit Atmel Prozessoren in verbindung mit Bascom gemacht.
Ich bin gerade dabei mir einen Squeezebox Client auf basis eines RaspberryPi zu basteln,
nach dem vorbild dieses Projektes: http://www.emmaanuel.com/SqueezeBerr...and-Squeezebox
Das Script auf dieser Seite nutzt den Telnet-Port des Squeezebox Servers zur kommunikation,
dieser Telnet Port ist bei mir aber dauerhaft durch das SqueezeboxPlugin von smarthome.py belegt.
Nun will ich die Steuerung meines Musikplayers über das Network-Plugin von smarthome.py steuern.
Ich hab mir dazu in der items Datei einen UDP Sender definiert, der mir Lautstärke und Titelinfo an den Player sendet,
und am Player hab ich mir ein Python Script erstellt, welches mir die Infos zerlegt, und auf einem 4x20 Zeichen Display anzeigt.
Zusätzlich hab ich noch ein zweites Script erstellt, dass mir die Bedienung des Gerätes ermöglicht.
Wie auf der Projektseite hab ich ebenfalls ein Endlos-Poti für die Lautstärke, und 4 Buttons, die als Favoritentasten für die wichtigsten Sender dienen sollen.
Die beiden Scripte funktionieren unabhängig voneinander schonmal ganz gut, allerdings würde ich die beiden scripte gerne vereinen, so dass es als ein ganzes Script funktioniert.
Allerdings fehlt mir da jetzt etwas das grundverständnis von Python, so dass ich da nicht weiterkomme.
vor allem hab ich die class und def Bereiche noch nicht so ganz verstanden.
Deshalb wäre ich hier für ein paar Codeverbesserungen oder anregungen sehr dankbar.
Vor allem würde ich z.B. gerne wenn man beim Taster auf Pause schaltet das Display leeren und ausschalten,
und bei Play wieder einschalten, aber meine Versuche die beiden Scripte zu vereinen scheiterten bisher immer.
entweder kommen fehlermeldungen beim Starten des Scriptes, oder das Script startet, hängt dann aber in der UDP Schleife fest,
so dass Tastenbefehle erst reagieren, wenn eine Titelinfo über UDP empfangen wurde.
Item-Datei von Smarthome:
UDP Empfänger und LCD Ansteuerung:
(LCD Ansteuerung stammt auch aus dem Internet, und ist ursprünglich für ein HD44780 Controller, ich hab es lediglich für den KS0073 Controller meines Displays angepasst.)
Taster und Drehpoti Auswertung:
Das Thema hat nur indirekt mit smarthome.py zu tun, sondern eher mit der Python programmierung,
aber da smarthome.py auf Python basiert, und hier viele dieser Programmiersprache mächtig sind,
hoffe ich dass mir hier jemand helfen kann (oder will).
Leider hab ich von Python nicht direkt viel Ahnung, hab bisher nur kleinere Smarthome-Logiken mit Copy-and-Paste erstellt.
Programmierung hab ich bisher nur mit Atmel Prozessoren in verbindung mit Bascom gemacht.
Ich bin gerade dabei mir einen Squeezebox Client auf basis eines RaspberryPi zu basteln,
nach dem vorbild dieses Projektes: http://www.emmaanuel.com/SqueezeBerr...and-Squeezebox
Das Script auf dieser Seite nutzt den Telnet-Port des Squeezebox Servers zur kommunikation,
dieser Telnet Port ist bei mir aber dauerhaft durch das SqueezeboxPlugin von smarthome.py belegt.
Nun will ich die Steuerung meines Musikplayers über das Network-Plugin von smarthome.py steuern.
Ich hab mir dazu in der items Datei einen UDP Sender definiert, der mir Lautstärke und Titelinfo an den Player sendet,
und am Player hab ich mir ein Python Script erstellt, welches mir die Infos zerlegt, und auf einem 4x20 Zeichen Display anzeigt.
Zusätzlich hab ich noch ein zweites Script erstellt, dass mir die Bedienung des Gerätes ermöglicht.
Wie auf der Projektseite hab ich ebenfalls ein Endlos-Poti für die Lautstärke, und 4 Buttons, die als Favoritentasten für die wichtigsten Sender dienen sollen.
Die beiden Scripte funktionieren unabhängig voneinander schonmal ganz gut, allerdings würde ich die beiden scripte gerne vereinen, so dass es als ein ganzes Script funktioniert.
Allerdings fehlt mir da jetzt etwas das grundverständnis von Python, so dass ich da nicht weiterkomme.
vor allem hab ich die class und def Bereiche noch nicht so ganz verstanden.
Deshalb wäre ich hier für ein paar Codeverbesserungen oder anregungen sehr dankbar.
Vor allem würde ich z.B. gerne wenn man beim Taster auf Pause schaltet das Display leeren und ausschalten,
und bei Play wieder einschalten, aber meine Versuche die beiden Scripte zu vereinen scheiterten bisher immer.
entweder kommen fehlermeldungen beim Starten des Scriptes, oder das Script startet, hängt dann aber in der UDP Schleife fest,
so dass Tastenbefehle erst reagieren, wenn eine Titelinfo über UDP empfangen wurde.
Item-Datei von Smarthome:
Code:
[Squeezebox_5]
squeezebox_playerid = b8:27:eb:04:a6:55
[[UDP-Sender]]
type = str
enforce_updates = true
eval_trigger = Squeezebox_5.Current_Title | Squeezebox_5.Volume
eval = sh.nw.udp('192.168.0.94',7073,'Volume: '+sh.Squeezebox_5.Volumestr()+' , '+sh.Squeezebox_5.Current_Title())
[[Power]]
type = bool
squeezebox_send = <playerid> power {}
squeezebox_recv = <playerid> prefset server power
squeezebox_init = <playerid> power
nw = yes
[[Volume]]
type = num
squeezebox_send = <playerid> mixer volume {}
squeezebox_recv = <playerid> prefset server volume
squeezebox_init = <playerid> mixer volume
[[Volumestr]]
type = str
eval_trigger = Squeezebox_5.Volume
eval = str(sh.Squeezebox_5.Volume())
nw = yes
[[Volume_Up]]
type = bool
enforce_updates = true
squeezebox_send = <playerid> button volup
nw = yes
[[Volume_Down]]
type = bool
enforce_updates = true
squeezebox_send = <playerid> button voldown
nw = yes
[[Play]]
type = bool
squeezebox_send = <playerid> play
squeezebox_recv = <playerid> play
squeezebox_init = <playerid> mode
nw = yes
[[Stop]]
type = bool
squeezebox_send = <playerid> stop
squeezebox_recv = <playerid> stop
squeezebox_init = <playerid> mode
nw = yes
[[Pause]]
type = bool
squeezebox_send = <playerid> pause {}
squeezebox_recv = <playerid> pause
squeezebox_init = <playerid> mode
nw = yes
[[Current_Title]]
type = str
squeezebox_recv = <playerid> playlist newsong
squeezebox_init = <playerid> current_title
enforce_updates = true
[[AntenneBayern]]
type = bool
enforce_updates = true
squeezebox_send = <playerid> playlist play http://opml.radiotime.com/Tune.ashx?id=s42824&partnerId=16
nw = yes
[[Rockantenne]]
type = bool
enforce_updates = true
squeezebox_send = <playerid> playlist play http://opml.radiotime.com/Tune.ashx?id=s25217&partnerId=16
nw = yes
[[Bayern3]]
type = bool
enforce_updates = true
squeezebox_send = <playerid> playlist play http://opml.radiotime.com/Tune.ashx?id=s14991&partnerId=16
nw = yes
[[Bayern1]]
type = bool
enforce_updates = true
squeezebox_send = <playerid> playlist play http://opml.radiotime.com/Tune.ashx?id=s24854&partnerId=16
nw = yes
(LCD Ansteuerung stammt auch aus dem Internet, und ist ursprünglich für ein HD44780 Controller, ich hab es lediglich für den KS0073 Controller meines Displays angepasst.)
Code:
#!/usr/bin/python
# The wiring for the LCD is as follows:
# 1 : GND
# 2 : 5V
# 3 : Contrast (0-5V)*
# 4 : RS (Register Select)
# 5 : R/W (Read Write) - GROUND THIS PIN
# 6 : Enable or Strobe
# 7 : Data Bit 0 - NOT USED
# 8 : Data Bit 1 - NOT USED
# 9 : Data Bit 2 - NOT USED
# 10: Data Bit 3 - NOT USED
# 11: Data Bit 4
# 12: Data Bit 5
# 13: Data Bit 6
# 14: Data Bit 7
# 15: LCD Backlight +5V**
# 16: LCD Backlight GND
#import
import socket
import RPi.GPIO as GPIO
import time
# UDP Adresse konfigurieren
Quelle='192.168.0.94'
Port=7073
# Define GPIO to LCD mapping
LCD_RS = 7
LCD_E = 8
LCD_D4 = 25
LCD_D5 = 24
LCD_D6 = 23
LCD_D7 = 18
LCD_Backlight = 15
# Define some device constants
LCD_WIDTH = 20 # Maximum characters per line
LCD_CHR = True
LCD_CMD = False
LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line
LCD_LINE_2 = 0xA0 # LCD RAM address for the 2nd line
LCD_LINE_3 = 0xC0 # LCD RAM address for the 2nd line
LCD_LINE_4 = 0xE0 # LCD RAM address for the 2nd line
# Timing constants
E_PULSE = 0.0005
E_DELAY = 0.0005
def main():
# Main program block
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM) # Use BCM GPIO numbers
GPIO.setup(LCD_E, GPIO.OUT) # E
GPIO.setup(LCD_Backlight, GPIO.OUT)
GPIO.setup(LCD_RS, GPIO.OUT) # RS
GPIO.setup(LCD_D4, GPIO.OUT) # DB4
GPIO.setup(LCD_D5, GPIO.OUT) # DB5
GPIO.setup(LCD_D6, GPIO.OUT) # DB6
GPIO.setup(LCD_D7, GPIO.OUT) # DB7
# UDP Socket init
e_udp_sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
e_udp_sock.bind( (Quelle,Port) )
# Initialise display
lcd_init()
while True:
GPIO.output(15, True)
data, addr = e_udp_sock.recvfrom( 1024 )
# print data[:11]
# print data[13:33]
# print data[33:]
# Send some test
lcd_string(data[13:33],LCD_LINE_1)
lcd_string(data[33:],LCD_LINE_2)
lcd_string("--------------------",LCD_LINE_3)
lcd_string(data[:11],LCD_LINE_4)
def lcd_init():
# Initialise display
time.sleep(E_DELAY)
lcd_byte(0x33,LCD_CMD) # 110011 Initialise
lcd_byte(0x32,LCD_CMD) # 110010 Initialise
lcd_byte(0x2C,LCD_CMD) # 000110 Cursor move direction
lcd_byte(0x09,LCD_CMD) # 000110 Cursor move direction
lcd_byte(0x28,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off
lcd_byte(0x0C,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off
lcd_byte(0x01,LCD_CMD) # 000001 Clear display
time.sleep(E_DELAY)
time.sleep(E_DELAY)
time.sleep(E_DELAY)
lcd_byte(0x06,LCD_CMD) # 101000 Data length, number of lines, font size
def lcd_byte(bits, mode):
# Send byte to data pins
# bits = data
# mode = True for character
# False for command
GPIO.output(LCD_RS, mode) # RS
# High bits
GPIO.output(LCD_D4, False)
GPIO.output(LCD_D5, False)
GPIO.output(LCD_D6, False)
GPIO.output(LCD_D7, False)
if bits&0x10==0x10:
GPIO.output(LCD_D4, True)
if bits&0x20==0x20:
GPIO.output(LCD_D5, True)
if bits&0x40==0x40:
GPIO.output(LCD_D6, True)
if bits&0x80==0x80:
GPIO.output(LCD_D7, True)
# Toggle 'Enable' pin
lcd_toggle_enable()
# Low bits
GPIO.output(LCD_D4, False)
GPIO.output(LCD_D5, False)
GPIO.output(LCD_D6, False)
GPIO.output(LCD_D7, False)
if bits&0x01==0x01:
GPIO.output(LCD_D4, True)
if bits&0x02==0x02:
GPIO.output(LCD_D5, True)
if bits&0x04==0x04:
GPIO.output(LCD_D6, True)
if bits&0x08==0x08:
GPIO.output(LCD_D7, True)
# Toggle 'Enable' pin
lcd_toggle_enable()
def lcd_toggle_enable():
# Toggle enable
time.sleep(E_DELAY)
GPIO.output(LCD_E, True)
time.sleep(E_PULSE)
GPIO.output(LCD_E, False)
time.sleep(E_DELAY)
def lcd_string(message,line):
# Send string to display
message = message.ljust(LCD_WIDTH," ")
lcd_byte(line, LCD_CMD)
for i in range(LCD_WIDTH):
lcd_byte(ord(message[i]),LCD_CHR)
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
pass
finally:
lcd_byte(0x01, LCD_CMD)
lcd_string("Goodbye!",LCD_LINE_1)
GPIO.output(15, False)
GPIO.cleanup()
Code:
#!/usr/bin/python
import socket
import gaugette.rotary_encoder
import gaugette.switch
import RPi.GPIO as GPIO
A_PIN = 7
B_PIN = 9
SW_PIN = 0
#GPIO.setwarnings(False)
#GPIO.setmode(GPIO.BOARD)
#GPIO.setup(15, GPIO.IN)
Ziel='192.168.0.234'
Port=2727
#encoder = gaugette.rotary_encoder.RotaryEncoder(A_PIN, B_PIN)
encoder = gaugette.rotary_encoder.RotaryEncoder.Worker(A_PIN, B_PIN)
encoder.start()
switch = gaugette.switch.Switch(SW_PIN)
last_state = None
last_gpio = None
s_udp_sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
while True:
delta = encoder.get_delta()
if delta<0:
#print "lauter"
s_udp_sock.sendto( 'item|Squeezebox_5.Volume_Up|1', (Ziel,Port) )
#r = requests.get('http://192.168.0.234:2727',data=('item|Squeezebox_5.Volume_Down|1)')
elif delta>0:
#print "leiser"
s_udp_sock.sendto( 'item|Squeezebox_5.Volume_Down|1', (Ziel,Port) )
#if delta!=0:
#print "lauter %d" % delta
#print "lauter"
sw_state = switch.get_state()
if sw_state != last_state:
if last_state == 1:
#s_udp_sock.sendto( 'logic|dreamcommand|'(last_state), (Ziel,Port) )
s_udp_sock.sendto( 'logic|dreamcommand|123', (Ziel,Port) )
#print "switch %d" % sw_state
last_state = sw_state
GPIO.setmode(GPIO.BOARD)
GPIO.setup(15, GPIO.IN)
if GPIO.input(15) != last_gpio:
if last_gpio == 0:
s_udp_sock.sendto( 'item|Squeezebox_5.Bayern3|1', (Ziel,Port) )
#print "switch %d" % GPIO.input(15)
last_gpio = GPIO.input(15)
# # Wenn der Button gedrueckt wird
# else:
# print "1"
GPIO.cleanup()

