Mein all in one Gehäuse

  • 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:

    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:

    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:


    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...

    Ausgeschalteter Zustand:

    Eingeschalteter Zustand:

    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"
    • LCD Steuerung:

      "Script"
    • Temperaturabhängige Lüftersteuerung:

      "Script"
    • Script zum senden von Push Benachrichtigungen aufs Handy:

      "Script"
    • 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 :))

    • Push Benachrichtigung bei Boot / Shutdown:

      "Script"


    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.. :geek:

    Viele Grüße

  • Also ich bin echt begeistert!

    Sieht echt alles ziemlich gut aus. Ich schaffe meine Selbstbau Gehäuse zwar auch immer zuende aber sehen halt immer aus wie sonst wo her^^

    Habe nicht das nötige Werkzeug / Wissen um z.B. ein Alu Case umzubauen

    Viele Grüße
    Daniel

    Aequat omnes cinis. Impares nascimur, pares morimur! - Asche macht alle gleich! Ungleich werden wir geboren, gleich sterben wir! (Seneca)

  • Danke :)
    Ich habe größtenteils einfach mit einer standbohrmaschine die Öffnungen vorgebohrt und dann mit Seitenschneider raus getrennt.
    Anschließend noch mit Feile begradigt. (Ist übrigens ein blech Gehäuse)
    Die Front wird allerdings aus einem 1mm alu blech gefertigt (leichter zu bearbeiten :))

    Viele grüße

  • Als kleiner Tip für deine Scripts: So gut es geht auf externe Programme verzichten, da diese selbst eine Last verursachen. Insbesondere vcgencmd verursacht gerne bis zu 10%.

    Sowas wie CPU Temperatur kannst du aus der Datei /sys/class/thermal/thermal_zone0/temp auslesen:

    Spoiler anzeigen

    [code=php]
    def getTemp():
    with open('/sys/class/thermal/thermal_zone0/temp', 'r') as f:
    CPUtemp = int(float(f.readline().split()[0]))
    CPUtemp = round((CPUtemp/1000.0), 2)
    return CPUtemp
    [/php]

    Ebenso wie den RAM, kann man auch aus der virtuellen Datei /proc/meminfo auslesen:

    Spoiler anzeigen

    [code=php]
    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 usedPerc
    [/php]

    Die CPU-Freq kriegt man ebenfalls aus den virtuellen Dateien: /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq

    Und 'top' zu verwenden um den CPU Load auszulesen verfälscht das Ergebnis (siehe ersten Satz)

    Allgemein lohnt sich auch ein Blick ins python Modul psutil


    Bezüglich Lüftersteuerung empfehl ich auch einen Blick in meins, da du unnützerweise mehrmals im selben Schleifendurchgang die Temperatur via vcgencmd ausliest

    "lueftersteuerung.py"

    [code=php]#!/usr/bin/python3
    #
    # v0.2 by meigrafd
    #
    import RPi.GPIO as GPIO
    import time
    #------------------------------------------------------------------------

    MaxTemp = 60
    MinTemp = 50

    # gpio pin zur transistor-basis um gnd fuer den luefter zu schalten
    GPIOpin = 4

    # Check every ... sec
    CheckEvery = 5

    #------------------------------------------------------------------------


    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

    if __name__ == '__main__':
    try:
    running = True
    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(GPIOpin, GPIO.OUT)
    fanState = False
    GPIO.output(GPIOpin, fanState)

    while running:
    cTemp = get_temperature()
    Now = time.strftime("%H:%M:%S")
    if cTemp > MaxTemp and not fanState:
    print("[{}] CPU Temp {:6} > Max {} ... Luefter wird eingeschaltet".format(Now, str(cTemp), MaxTemp))
    fanState = True
    GPIO.output(GPIOpin, fanState)
    elif cTemp > MinTemp and fanState:
    print("[{}] CPU Temp {:6} > Min {} ... Luefter bleibt eingeschaltet".format(Now, str(cTemp), MinTemp))
    elif cTemp < MinTemp and fanState:
    print("[{}] CPU Temp {:6} < Min {} ... Luefter wird ausgeschaltet".format(Now, str(cTemp), MinTemp))
    fanState = False
    GPIO.output(GPIOpin, fanState)
    else:
    print("[{}] CPU Temp {}".format(Now, cTemp))
    time.sleep(CheckEvery)
    except Exception as e1:
    print("Error: " + str(e1))
    except (KeyboardInterrupt, SystemExit):
    print("\nQuit\n")
    finally:
    running = False
    GPIO.output(GPIOpin, False)
    GPIO.cleanup()
    [/php]

    ..Aber ansonsten ein nettes Projekt :thumbs1:

  • Danke für die codeschnipsel.
    Stimmt ich hatte schon gelesen, dass ich eine relativ ressourcenfressende auslesemethode verwende... Wollte ich sowieso noch ändern.. Top!

    CPU Last lese ich meist nicht in der Console, sondern mittels ios App "SimplePi" aus.
    Und die ist gerade mal zwischen 2 und 6% (im ambilight betrieb)
    Aber du hast schon recht, ich habs auch lieber sauberer :)

    Werde mich am Wochenende mal ran setzen!

    Viele grüße

  • Script zur Lüftersteuerung wurde überarbeitet (danke an meigrafd):

    &quot;neues Lüftersteuerungsscript&quot;
  • Hm hast du nicht einen kleinen Fehler in der ersten if Abfrage? state beziffert den aktuellen status des Lüfters, wenn True dann ist der eingeschaltet, wenn False dann ausgeschaltet. Das hast du aber verdreht :s

    Und was soll "time.sleep" innerhalb jeder if Schleife :s Und danach dann ein 'continue' ?
    Es werden doch ' if ... elif ... else ' genutzt, also kann nur jeweils eine der Bedingungen zutreffen. Wenn Temperatur >= 35 und state = True, nur dann trifft die erste schleife zu, wenn aber nicht wird die Bedingung der 2. Bedingung (elif) geprüft: Temperatur <= 30 und state = False, trifft das aber auch nicht zu wird 'else' ausgeführt - also brauchen innerhalb der Schleifen weder sleeps noch continues stehen (vorallem letzteres macht da absolut gar kein Sinn). Das sleep packste am besten ganz ans Ende der while Schleife

    Und beim Log lässt du nur Uhrzeit schreiben, aber nicht das Datum.
    Auch mehrmals den Code zu wiederholen ist etwas ungünstig. Leg dir dafür lieber eine Funktion an, an welche du nur die zu loggende Zeile übergibst. Zum Beispiel:
    [code=php]def logit(message):
    line = "["+ time.strftime("%d.%m.%Y %H:%M:%S") +"] "+ message
    print line
    f = open(logfile, "a")
    f.write(line +"\n")
    f.close()

    logit("CPU Temp "+ str(cTemp) +" (Luefter sind aus!)")

    logit("!!! Error: "+ str(e1) +" !!!")
    [/php]

    "except Exception as e1:" geht aber soweit ich weiß auch nur mit python3, mit python2 müsste das "except Exception, e1:" lauten.
    Beachte, mein Shebang im oben geposteten Script zeigt auf python3 :fies:

    Wenn der Lüfter ofters eingeschaltet wird usw würd ich aber auch drüber nachdenken in die logit Funktion eine Prüfung der Dateigröße einzubauen, und beim erreichen eines Limits eine Logfile-Rotation einzubauen ;)

    //EDIT: Hier meine Logfile-Rotation Funktion:

    Spoiler anzeigen

    [code=php]# (c) by meigrafd
    import time, os, glob

    # Create Logfile?
    Logging = True
    Logfile = "/tmp/cputemp.txt"
    # Maximale Logfile Groesse in Bytes? (512000 bytes = 500 kilobytes = 0.48 megabytes)
    MAXLOGSIZE = 512000
    # Beim erreichen von MAXLOGSIZE: Logfile rotieren(True) oder loeschen(False)?
    LOGROTATE = True

    def get_filesize(file):
    if os.path.isfile(file):
    return int(os.path.getsize(file))
    else:
    return False

    def logit(message):
    line = "["+ time.strftime("%d.%m.%Y %H:%M:%S") +"] "+ message
    print line
    if Logging:
    if get_filesize(Logfile) >= MAXLOGSIZE:
    if LOGROTATE:
    print "["+ time.strftime("%d.%m.%Y %H:%M:%S") +"] Rotating Logfile"
    file_count = len(glob.glob1(os.path.dirname(Logfile), os.path.basename(Logfile)+"*"))
    if file_count == 1:
    extension = ".1"
    elif file_count > 1:
    extension = "."+ str(file_count + 1)
    os.rename(Logfile, Logfile + extension)
    else:
    os.remove(Logfile)
    with open(Logfile, 'a') as f:
    f.write(line +"\n")

    logit("test")
    [/php]

  • Hast recht.. war schlampig programmiert.. (das continue war noch eine Leiche aus einer ganze alten version... :/)
    Ich neige irgendwie immer zu quick-n-dirty lösungen.. :lol:

    das except funktioniert, hatte ich schon (unfreiwillig) kurz getestet ^^

    Das neue Script:

    &quot;überarbeitete Version&quot;

    EDIT: ganz vergessen (wurde jetzt nur im Chat erwähnt) die Erklärung für das "verdrehte" True / False:
    Es ist Optisch verkehrt rum, richtig.
    Da ich das ganze aber über ein Relaismodul steuere und das bei False durchschaltet, ist es schon richtig so! :)

  • Weil ich grad eh schon am Optimieren war hab ich noch mein LCD Script überarbeitet:

    &quot;LCD Script&quot;

    Hat jemand noch nen weg wie ich an die Netzwerkdaten (gesendet / empfangen) ran komme ohne subprocess? Dann hätte ich die Subprocess geschichte komplett draußen :)

    Oder noch besser als Non plus ultra:
    Die gesendet / empfangen / Up-down-speed aus der Fritzbox auslesen??

    Viele Grüße

  • Hat jemand noch nen weg wie ich an die Netzwerkdaten (gesendet / empfangen) ran komme ohne subprocess? Dann hätte ich die Subprocess geschichte komplett draußen :)

    Beitrag#6 -> psutil -> http://pythonhosted.org/psutil/#network


  • Oder noch besser als Non plus ultra:
    Die gesendet / empfangen / Up-down-speed aus der Fritzbox auslesen??

    http://avm.de/service/schnittstellen/
    http://avm.de/fileadmin/user…fconfigSCPD.pdf
    http://www.wehavemorefun.de/fritzbox/Statusanfragen_per_UPnP
    [code=php]
    #!/usr/bin/env python
    from SOAPpy import SOAPProxy
    print SOAPProxy(proxy='http://192.168.178.1:49000/upnp/control/WANCommonIFC1',
    namespace='urn:schemas-upnp-org:service:WANIPConnection:1',
    soapaction='urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress',
    noroot=True).GetExternalIPAddress()
    [/php]
    oder hier:
    Webtraffic von einer Fritz!Box 7390 auslesen
    führt nach hier:
    http://www.linux-tips-and-tricks.de/de/programmier…ython-und-bash/

  • danke an euch beide:thumbs1:

    mal die aktuelle Version ohne subprocesses...

    &quot;aktuelle LCD.py&quot;


    die Geschichte mit SOAPpy bekomme ich (noch?) nicht zu laufen. Könnte aber evtl auch daran liegen, dass meine Fritzbox 6490 von KabelBW etwas beschnitten ist.. :shy:

    Bekomme zB beim script

    Python
    #!/usr/bin/env python
    from SOAPpy import SOAPProxy
    print SOAPProxy(proxy='http://192.168.178.1:49000/upnp/control/WANCommonIFC1',
                    namespace='urn:schemas-upnp-org:service:WANIPConnection:1',
                    soapaction='urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress',
                    noroot=True).GetExternalIPAddress()


    folgende Ausgabe/Fehler:


    meigrafd:
    Seit gestern mussten die Lüfter übrigens noch kein einziges mal anspringen.. ^^ (nie über 35° gewesen :))

    Viele Grüße

  • Guter Punkt!
    Hatte ich im 1. Post glaube ich nicht erwähnt..

    Das ganze läuft bei mir so:
    mal von Rechts nach Links betrachtet (wenn man von hinten auf die Anschlüsse schaut) ->

    Stromanschluss ganz Rechts: Versorgt das Meanwell Netzteil, somit erstmal den Pi

    Stromanschluss in der Mitte: Der Anschluss bekommt von einer Master /Slave Steckdose Strom.
    Einfach gesagt: Wenn mein AVR Receiver an geht, wird Strom auf den mittleren Stromanschluss gegeben, dadurch wird in meinem Gehäuse ein 230V Relais geschaltet und mein HDMI Splitter wird eingeschaltet (Fürs Ambilight).
    Auf der Master Slave Steckdosenleiste hängt unter anderem auch noch mein TV und ein paar andere Dinge. Daher hats ich die Möglichkeit für mich angeboten.

    Stromanschluss ganz Links: Versorgt meine LED Beleuchtung in meiner Wohnzimmerschrankwand (wird von einer RGB LED Leiste beleuchtet).

    Der Stromanschluss wird mit einem Bewegungsmelder aktiviert wenn jemand im Raum ist. D.h. jemand im Wohzimmer -> Beleuchtung an; ->Niemand da -> Beleuchtung aus.


    Hoffe das ganze war so verständlich ^^

  • Hey ,
    Ich finde das Projekt echt super und es hat mich Inspiriert . Mein Projekt ist eine kleine NAS in einem altem PC Netzteil.
    Meine Frage ist nun was ist aus dem Wassersensor geworden ? Würde mich echt über eine Antwort Freuen.


    Grüße

    Einmal editiert, zuletzt von NoisyDarkness27869 (9. Juni 2015 um 21:28)

  • Moin moin,

    Freut mich zu hören :)

    Ich hab grad so viele Baustellen gleichzeitig.. Komme nur schleppend vorran.
    Heute hab ich aber wieder weiter gemacht. Bin gerade dabei den funk Empfänger für das klingelschild gegen ein anderes zu tauschen (wegen defekt)
    Evtl werde ich dann bald auch endlich das Frontpanel in angriff nehmen! :)

    Den wassersensor hab ich derzeit noch nicht gebastelt (hab aber nebenbei noch ein größeres Projekt fürs Aquarium gestartet. Wassertemperatur, durchfluss com Filter, ph Sensor, Erinnerung für wasserwechsel und noch einiges mehr... Das ganze über ein touchscreen bedienbar)
    Das Material sollte in den nächsten 4 Wochen bei mir einschlagen.. Vorher werde ich vermutlich noch keine (finale) Version vom außensensor basteln. Evtl steck ich mir aber mal was auf dem breadboard zusammen. :)

    Viele grüße

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!