Moin zusammen,
hatte zwar eigentlich vor mein kleines Projekt erst am Ende vorzustellen wenn alles fertig ist, wurde jetzt aber darauf angesprochen, dass ich mal ein wenig erzählen soll..
Die Geschichte:
Zur Idee:
Angefangen habe ich mit einem Ambilight Mod (https://www.forum-raspberrypi.de/Thread-hyperio…ADbel-anleitung - danke an Sigi28 für die Hilfe beim Aufbau und sein tolles Tuturial), das zunächst, vermutlich wie die meisten, erstmal offen aufgebaut wurde.. Also erstmal ohne Gehäuse und einfach alles auf dem Tisch aufgebaut.
Da ich es aber als festen Bestandteil zum TV Nutze, wollte ich es auch fest und optisch schön verbauen.
Also habe ich bei ebay nach einem einfachen alten VHS, DVD, Verstärker oder was auch immer Gehäuse gesucht wo ich alles verbauen kann.
Geworden ist es am Ende dieser CD player: http://www.ebay.de/itm/311253288553
Nachdem ich das Gehäuse komplett ausgeschlachtet hatte (Bilder habe ich davon leider keine mehr) hab ich mir die ersten Gedanken gemacht was ich wie verbauen könnte.
Der Aufbau:
Rückseite (Anschlüsse):
Die Komponenten:
- Distanzbolzen zum montieren der Komponenten: http://www.ebay.de/itm/231490858268
- Kaltgeräte Einbaubuchsen: http://www.ebay.de/itm/360934175679
- Mehrere Kurze HDMI Kabel zum verbinden: http://www.amazon.de/gp/product/B007ECDZEA?psc=1&redirect=true&ref_=oh_aui_detailpage_o07_s00&tag=psblog-21 [Anzeige]
- Leise Lüfter für eventuelle Kühlung: http://www.amazon.de/gp/product/B000KY30PS?psc=1&redirect=true&ref_=oh_aui_detailpage_o02_s00&tag=psblog-21 [Anzeige]
- RJ45 LAN Adapter: http://www.amazon.de/gp/product/B00NMD5FSO?psc=1&redirect=true&ref_=oh_aui_detailpage_o05_s00&tag=psblog-21 [Anzeige]
- Wippschalter um Stromzufuhr zu unterbrechen: http://www.amazon.de/gp/product/B002NL3SKS?psc=1&redirect=true&ref_=oh_aui_detailpage_o06_s00&tag=psblog-21 [Anzeige]
- 2x 4Pin Buchse für Anschluss LED Leisten: http://www.amazon.de/gp/product/B000L11CJG?psc=1&redirect=true&ref_=oh_aui_detailpage_o05_s00&tag=psblog-21 [Anzeige]
- 2x 4Pin Stecker für Anschluss LED Leisten: http://www.amazon.de/gp/product/B000NWSMPA?psc=1&redirect=true&ref_=oh_aui_detailpage_o05_s00&tag=psblog-21 [Anzeige]
- 3x HDMI Einbauadapter: http://www.amazon.de/gp/product/B00B7AGIF8?psc=1&redirect=true&ref_=oh_aui_detailpage_o06_s00&tag=psblog-21 [Anzeige]
Nachdem ich alle Teile für die Schnittstellen hatte, habe ich mir dran gesetzt und mir überlegt wie ich die Rückseite gestalten könnte, damit alles drauf passt:
Im großen und ganzen habe ich das Layout auch so durchgeführt..
Nach einiger Zeit im Keller mit bohren Feilen und lackieren sieht das Ergebnis dann so aus:
Das Innenleben:
Die Komponenten:
- Raspberry Pi 2 B: http://www.rasppishop.de/boards/3119/ra…uadcore-1gb-ram
- Meanwell Netzteil (Betreibt eigentlich alle verbauten Komponenten): http://www.ebay.de/itm/251578050865
- USB Hub (hatte ich noch rumliegen)
- Relais Modul: http://www.amazon.de/gp/product/B005WR734M?psc=1&redirect=true&ref_=oh_aui_detailpage_o00_s00&tag=psblog-21 [Anzeige]
- HDMI Splitter (Für Ambilight): http://www.amazon.de/gp/product/B00BY07MZG?psc=1&redirect=true&ref_=oh_aui_detailpage_o04_s00&tag=psblog-21 [Anzeige]
- HDMI to AV Converter (Für Ambilight): http://www.amazon.de/gp/product/B00BUQOQCG?psc=1&redirect=true&ref_=oh_aui_detailpage_o03_s00&tag=psblog-21 [Anzeige]
- HDMI Winkeladapter (2x): http://www.amazon.de/gp/product/B00A30FE58?psc=1&redirect=true&ref_=oh_aui_detailpage_o05_s01&tag=psblog-21 [Anzeige]
- HDMI Adapter (HDMI-A -> HDMI-A): http://www.amazon.de/gp/product/B00F9XBELC?psc=1&redirect=true&ref_=oh_aui_detailpage_o05_s00&tag=psblog-21 [Anzeige]
- USB Video Grabber (Für Ambilight): http://www.amazon.de/gp/product/B00480G9HQ?psc=1&redirect=true&ref_=oh_aui_detailpage_o08_s00&tag=psblog-21 [Anzeige]
- Step-Up Modul (um 12V zu erzeugen): http://www.ebay.de/itm/1716512072…K%3AMEBIDX%3AIT
- Funk Empfänger (Für Türklingel - erklärung weiter unten ;)): http://www.pollin.de/shop/dt/MDYzOT…_Set_HD2RX.html
- 2x 230V Relais (Erklärung weiter unten ;)): http://www.ebay.de/itm/1212216906…K%3AMEBIDX%3AIT
- Wärmeleitkleber zur Montage von passiven Kühlkörpern: http://www.ebay.de/itm/161575290258
Im nächsten Schritt habe ich die Komponenten möglichst Platzsparend angeordnet.
Dafür habe ich den HDMI Splitte und den HDMI to AV Converter mittels den oben genannten Adapter übereinander montiert.
Mit hilfe der genannten Distanzbolzen habe ich alle Komponenten mit Abstand zum Gehäuseboden montiert. Dadurch vermeide ich Kurzschlüsse und als netter Nebeneffekt werden die Komponenten besser Gekühlt, wenn die Lüfter mal anspringen (Temperaturgesteuert).
Von den einzelnen Aufbauschritten habe ich leider keine Bilder, daher kann ich an der Stelle nur das aktuelle Ergebnis liefern:
Die Verkabelung ist noch nicht endgültig und wird noch Ordentlicher gemacht...
Die beiden Relais (rechts im Bild) werden jeweils über die 230V Spannung geschaltet und Betreiben dann 1x die LED Leiste in der Schrankwand (Power wird noch vor dem Pi via Bewegunsgmelder Steckdose bei anwesenheit ein und abwesenheit ausgeschaltet) und 1x den HDMI Splitter und AV Converter (Wird über Master/Slave Steckdose geschaltet. Master ist mein AV Receiver. Ist der an, ist auch der HDMI Splitter an, ist der Receiver aus, ist der Splitter aus -> schwarzes Signal fürs Ambilight)
Die Vorderseite (Frontpanel):
Hier bin ich gerade noch am Planen und überlegen wie ich alles am besten Anordnen kann..
Komponenten:
- 20x4 Zeichen LCD Display: http://www.amazon.de/gp/product/B00L8VCHJC?psc=1&redirect=true&ref_=oh_aui_detailpage_o09_s00&tag=psblog-21 [Anzeige]
- RGB Panel zur Steuerung einer weiteren LED Leiste in meiner Schrankwand: http://www.aliexpress.com/snapshot/62851…=64146014851551
- Volt- und Amperemeter: http://www.amazon.de/gp/product/B00H5KVG3I?psc=1&redirect=true&ref_=oh_aui_detailpage_o02_s00&tag=psblog-21 [Anzeige]
- Beleuchteter Reset Taster: http://www.amazon.de/gp/product/B00J3GHPM8?psc=1&redirect=true&ref_=oh_aui_detailpage_o03_s00&tag=psblog-21 [Anzeige]
- Beleuchteter Power Taster: http://www.amazon.de/gp/product/B00HSBPENW?psc=1&redirect=true&ref_=oh_aui_detailpage_o04_s00&tag=psblog-21 [Anzeige]
- Drehknopf für Poti zum Regeln der LCD Helligkeit http://www.ebay.de/itm/310710657065
Updates folgen!
Externe Hardware:
Schild für Türklingel:
Weil ich hin und wieder mal die Klingel überhöre (weil zB zu laut ein Film geschaut wird) habe ich mir eine optische Klingelanzeige gebastelt.
Das Klingelsignal wird über das in der Teileliste genannte Funkmodul an den Pi übertragen.
Das Script ist unten aufgeführt...
Das Schwarze Kabel auf den Bildern ist inzwischen im Kabelkanal verschwunden...
In Planung:
- Ein Nässe Sensor unter dem Aquarium um bei auslaufen einen Alarm zu geben
- Webcam zur Überwachung / als Bewegungsmelder, der die LED Leiste in der Schrankwand bei anwesenheit ativiert
Ambilight:
Aktuell nutze ich folgende LED Leiste:
http://www.aliexpress.com/snapshot/64038…=65087219341551
Wird aber bald durch:
http://www.aliexpress.com/snapshot/65409…=66263925531551
ersetzt.
Neue LPD8806 Leiste ist inzwischen angekommen
Installierte Scripte (größtenteils Pyton):
Anmerkung:
Mag sein, dass manche der Scripte unschön geschrieben sind.. Das liegt daran, dass ich mich mit Python, sowie Linux Systemen erst seit kurzem Beschäftige.
Daher stand für mich bisher die Funktion im Vordergrund!
- Ambilight gemäß Sigi28's Anleitung: https://www.forum-raspberrypi.de/Thread-hyperio…ADbel-anleitung
- Ein FHEM Server zum (Fern-)Steuern, Schalten und Überwachen vom Licht im Wohnzimmer gemäß der Anleitung: http://www.meintechblog.de/2013/05/fhem-s…nde-einrichten/
- Shutdown Script (Zum Herunterfahren / Starten durch einen Taster):
"Script"
Python
Alles anzeigen#!/usr/bin/python # # v0.2 # # -*- coding: utf-8 -*- import RPi.GPIO as GPIO import time, signal from subprocess import call #------------------------------------------------------------------------ # use the raspi board pin number GPIO.setmode(GPIO.BOARD) # use the gpio number #GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) shutdownPin = 5 # with GPIO.BOARD, pin#5 is gpio3 ledPin = 7 # with GPIO.BOARD, pin#7 is gpio4 GPIO.setup(ledPin, GPIO.OUT) GPIO.output(ledPin, True) GPIO.setup(shutdownPin, GPIO.IN) def Interrupt_event(pin): #Zeit = time.strftime("%d.%m.%Y %H:%M:%S") #print "{} -> GPIO {} ausgeloest!".format(Zeit, pin) if GPIO.input(shutdownPin) == GPIO.LOW: #flash led for x in range(0,5): GPIO.output(ledPin, True) time.sleep(.1) GPIO.output(ledPin, False) time.sleep(.1) #run command call('poweroff', shell=False) try: GPIO.add_event_detect(shutdownPin, GPIO.RISING, callback=Interrupt_event, bouncetime=150) #keep script running signal.pause() except (KeyboardInterrupt, SystemExit): GPIO.cleanup()
- LCD Steuerung:
"Script"
Python
Alles anzeigen#!/usr/bin/python # -*- coding: UTF-8 -*- from RPLCD import CharLCD import time, datetime import RPi.GPIO as GPIO import re, sys import subprocess import os def bytestomb(b): mb = round(float(b) / (1024*1024),2) return mb def getPiRAM(): with open('/proc/meminfo', 'r') as mem: tmp = 0 for i in mem: sline = i.split() if str(sline[0]) == 'MemTotal:': total = int(sline[1]) elif str(sline[0]) in ('MemFree:', 'Buffers:', 'Cached:'): tmp += int(sline[1]) free = tmp used = int(total) - int(free) usedPerc = (used * 100) / total return ((total/1000), (free/1000), (used/1000), usedPerc) def get_uptime(): with open('/proc/uptime', 'r') as up: for i in up: sline = i.split() uptime = int(round(float(sline[0]),0)) upsec = uptime % 60 upmin = uptime / 60 uphour = upmin / 60 upmin = upmin - (uphour * 60) upday = uphour / 24 uphour = uphour - (upday * 24) upsec = str(upsec).zfill(2) upmin = str(upmin).zfill(2) uphour = str(uphour).zfill(2) upday = str(upday) if((int(upday) < 2) & (int(upday) != 0)): return upday+"Tag "+uphour+":"+upmin+":"+upsec else: return upday+"Tage "+uphour+":"+upmin+":"+upsec def get_sysload(): s = os.getloadavg() def get_network_bytes(interface = 'eth0'): output = subprocess.Popen(['ifconfig', interface], stdout=subprocess.PIPE).communicate()[0] rx_bytes = re.findall('RX bytes:([0-9]*) ', output)[0] tx_bytes = re.findall('TX bytes:([0-9]*) ', output)[0] return (bytestomb(rx_bytes), bytestomb(tx_bytes)) def get_CPU_temp(): "Returns the CPU temperature in degrees C" with open("/sys/class/thermal/thermal_zone0/temp", 'r') as f: content = f.read().splitlines() return round((float(content[0]) / 1000.0),1) def get_CPU_speed(): with open("/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq", 'r') as f: content = f.read().splitlines() return (int(content[0]) / 1000) def get_IP(): "Returns the current IP address" arg='ip route list' p=subprocess.Popen(arg,shell=True,stdout=subprocess.PIPE) data = p.communicate() split_data = data[0].split() ipaddr = split_data[split_data.index('src')+1] hostname = subprocess.check_output("hostname") return (ipaddr, hostname) def getCPUuse(): return(str(os.popen("top -n1 | awk '/Cpu\(s\):/ {print $2}'").readline().strip(\ ))) active = True def stop(): global active active = False def start(): global active while active: lcd = CharLCD() for x in range(0,4): lcd.cursor_pos = (0, 0) lcd.write_string(datetime.datetime.now().strftime('%H:%M:%S %d.%m.%Y')) lcd.cursor_pos = (1, 0) lcd.write_string('On: ' + get_uptime()) lcd.cursor_pos = (2, 0) lcd.write_string('CPU: '+ str(get_CPU_temp()) + unichr(223) + 'C @' + str(get_CPU_speed()) + 'MHz') lcd.cursor_pos = (3, 0) lcd.write_string('RAM: ' + str(getPiRAM()[2]) + '/' + str(getPiRAM()[0]) +'MB (' + str(getPiRAM()[3]) +'%)') if not active: break time.sleep(1) lcd.clear() for x in range(0,4): lcd.cursor_pos = (0, 0) lcd.write_string('Host: '+get_IP()[1]) lcd.cursor_pos = (1, 0) lcd.write_string(str(get_IP()[0])) lcd.cursor_pos = (2, 0) lcd.write_string('Download: '+str(get_network_bytes()[0])+'MB ') lcd.cursor_pos = (3, 0) lcd.write_string('Upload: '+str(get_network_bytes()[1])+'MB ') if not active: break time.sleep(1) lcd.clear() GPIO.cleanup()
- Temperaturabhängige Lüftersteuerung:
"Script"
Python
Alles anzeigen#!/usr/bin/python # Import GPIO import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BOARD) #logfile logfile = "/home/pi/temp.txt" #Fan & GPIO fan_pin = 37 GPIO.setup(fan_pin, GPIO.OUT) GPIO.output(fan_pin, True) # SOLL Temperatur on_temp = "35" off_temp = "30" # Sleep var repeatEvery = 60 def get_temperature(): "Returns the CPU temperature in degrees C" with open("/sys/class/thermal/thermal_zone0/temp", 'r') as f: content = f.read().splitlines() return float(content[0]) / 1000.0 def logger(message): line = "["+ time.strftime("%d.%m.%Y %H:%M:%S") +"] "+ message log = open(logfile, "a") log.write(line +"\n") log.close() # Steuerung try: running = True state = True logger("+++ Script gestartet +++") while running: cTemp = get_temperature() if ((cTemp >= on_temp) & (state == True)): state = False GPIO.output(fan_pin, state) logger("CPU Temp "+str(cTemp)+" > Max "+off_temp+" -> Luefter wird eingeschaltet") elif ((cTemp <= off_temp) & (state == False)): state = True GPIO.output(fan_pin, state) logger("CPU Temp "+str(cTemp)+" < Min "+on_temp+" -> Luefter wird ausgeschaltet") #else: # if (state == True): # logger("CPU Temp "+str(cTemp)+" (Luefter sind aus!)") # else: # logger("CPU Temp "+str(cTemp)+" (Luefter sind an!)") time.sleep(repeatEvery) except Exception as e1: logger("!!! Error: " + str(e1)+" !!!") finally: running = False state = True GPIO.output(fan_pin, state) GPIO.cleanup() logger("+++ Script Beendet! +++")
- Script zum senden von Push Benachrichtigungen aufs Handy:
"Script"
Code
Alles anzeigen# -*- coding: utf-8 -*- import httplib, urllib def send(type, title, message, url = ""): apptoken = 0 if(type == "Türklingel"): apptoken = "xxx" elif(type == "Power"): apptoken = "xxx" if(apptoken != 0): # Start your connection with the Pushover API server conn = httplib.HTTPSConnection("api.pushover.net:443") # Send a POST request in urlencoded json conn.request("POST", "/1/messages.json", urllib.urlencode({ "token": apptoken, "user": "xxx", "title": ToUTF8(title), "message": ToUTF8(message), "url": url, }), { "Content-type": "application/x-www-form-urlencoded" }) # Listen for any error messages or other responses conn.getresponse() def ToUTF8(text): text = text.decode("iso-8859-1") text = text.encode("utf-8") return text
- Script für Push Benachrichtigung bei Türklingel und aktivieren der optischen Anzeige:
"Script"
Kurze Erklärung:
Über das oben in der Teileliste genannte Funkmodul wird wenn jemand an der Tür klingelt jeweils ein GPIO Pin geschaltet. Das folgende Script sendet dann eine Push Benachrichtigung auf mein Handy und aktiviert für 10 Sekunden ein Schild (man hört die Klingel nicht immer, dadurch hat man noch eine Optische anzeige :))Python
Alles anzeigen#!/usr/bin/python # -*- coding: utf-8 -*- import httplib, urllib, sys, time, datetime, RPi.GPIO as GPIO, signal, push ###GPIO SETUP### # use the raspi board pin number GPIO.setmode(GPIO.BOARD) KlingelInnenPin = 35 KlingelAussenPin = 33 Schild = 15 # only one of following for GPIO.IN: PULL = GPIO.PUD_DOWN #GPIO -> GND #PULL = GPIO.PUD_UP #GPIO -> 3V3 #------------------------------------------------------------------------ try: GPIO.setup(KlingelInnenPin, GPIO.IN, pull_up_down = GPIO.PUD_UP) GPIO.setup(KlingelAussenPin, GPIO.IN, pull_up_down = GPIO.PUD_UP) except RuntimeWarning: GPIO.setup(KlingelInnenPin, GPIO.IN) GPIO.setup(KlingelAussenPin, GPIO.IN) GPIO.setup(Schild, GPIO.OUT) GPIO.output(Schild, True) ###ENDE GPIO SETUP### active = 1 def send_push(pin): global active if (((GPIO.input(KlingelInnenPin) == GPIO.LOW) or (GPIO.input(KlingelAussenPin) == GPIO.LOW)) and (active == 0)): active = 1 if (pin == KlingelInnenPin): ort = "Innen" elif (pin == KlingelAussenPin): ort = "Außen" else: ort = "an einem unbekannten Ort" title = "Türklingel" message = "Es wurde "+ort+" am "+datetime.datetime.now().strftime('%d.%m.%Y')+" um "+datetime.datetime.now().strftime('%H:%M:%S')+" Uhr geklingelt" push.send("Türklingel", title, message) GPIO.output(Schild, False) time.sleep(10) GPIO.output(Schild, True) active = 0 try: GPIO.add_event_detect(KlingelAussenPin, GPIO.RISING, callback=send_push) GPIO.add_event_detect(KlingelInnenPin, GPIO.RISING, callback=send_push) active = 0 #keep script running signal.pause() except (KeyboardInterrupt, SystemExit): GPIO.cleanup()
- Push Benachrichtigung bei Boot / Shutdown:
"Script"
Python
Alles anzeigen#!/usr/bin/python # -*- coding: utf-8 -*- import sys, push, time, LCD, signal, datetime import RPi.GPIO as GPIO from subprocess import call from RPLCD import CharLCD try: title = "Raspberry Power Status" if(sys.argv[1] == "start"): push.send("Power", title, "RealPi wurde gestartet!") lcd = CharLCD() lcd.write_string('Willkommen!\r\n') GPIO.cleanup() time.sleep(3) LCD.start() elif(sys.argv[1] == "stop"): push.send("Power", title, "RealPi wurde heruntergefahren!") lcd = CharLCD() lcd.write_string('System wird\r\n Heruntergefahren!\r\nAm: '+datetime.datetime.now().strftime('%d.%m.%Y')+'\r\nUm: '+datetime.datetime.now().strftime('%H:%M:%S')) elif(sys.argv[1] == "reboot"): push.send("Power", title, "RealPi wurde neugestartet!") lcd = CharLCD() lcd.write_string('System wird\r\n Neugestartet!\r\nAm: '+datetime.datetime.now().strftime('%d.%m.%Y')+'\r\nUm: '+datetime.datetime.now().strftime('%H:%M:%S')) GPIO.cleanup() time.sleep(1) except (KeyboardInterrupt, SystemExit): GPIO.cleanup()
So... mehr fällt mir für den moment nicht ein..
Ich werde den 1. Post im Threat jeweils dem aktuellen Stand anpassen.
Bin auf eure Meinungen gespannt..
Viele Grüße