linux - net - tech and fun

Zum Inhalt | Zum Menü | Zur Suche

Dienstag, Juni 16 2015

Raspberry Pi Photobooth

Kathrin_und_Maltes_Hochzeit_363.jpg

Im Rahmen meiner anstehenden Hochzeit suchte ich nach günstigen, zunächst mietbaren, Photobooth Boxen. Diverese Hochzeitsfotografen bieten diese Boxen an, jedoch für einen relativ hohen Preis. Dafür bekommt man jedoch hochqualitative Fotos, denn häufig beinhalten die Boxen teure Spiegelreflexkameras, teure Software und/oder eingebaute Fotodrucker.
Da mir dies jedoch alles zu teuer war, suchte ich nach DIY Alternativen und stieß relativ schnell auf die Seite von Chris Evans (KLICK). Er hatte auf Basis des Raspberry Pi, Raspbian und einem kleinen Pythonprogramm eine wirklich schlanke und einfache Photobooth Lösung gebaut, die meiner Vorstellung einer solchen Box schon recht nah kam. Einen Raspberry hatte ich noch in der Schublade, es fehlte nur noch das Raspberry Kameramodul. Diesbezüglich war ich mir zunächst nicht ganz sicher, denn ich hatte gelesen, dass die Kamera insbesondere bei wenig Licht sehr stark rauschen würde und die Qualität auch nicht wirklich toll sein sollte. Meiner Ansicht nach, ist die Qualität der Fotos jedoch nicht das einzige bzw. ausschlaggebende Argument, welches es bei einer Box zu beachten gibt.
Ich bin der Ansicht, dass das Hauptaugenmerk auf dem Spass und witzigen Fotos liegen sollte, statt auf perfekt ausgeleuchteten, rauscharmen Fotos mit höchster Pixelzahl. Also bestellte ich die Kamera und ich muss sagen, die Qualität ist völlig in Ordnung! Natürlich kann man keine Wunder erwarten, aber für ein paar Fotos bei normalem Licht reicht die Kamera vollkommen aus und wichtiger noch: Sie ist schnell und einfach programmier- und bedienbar!

1. Modifikationen gegenüber der Originalbox im Überblick
1.1 Email und Tumblr Upload deaktiviert
1.2 Wasserzeichen im Bild
1.3 Countdown Overlay im Livebild
1.4 4-Fachdarstellung der geschossenen Bilder (Speicherung aller Einzelbilder und der 4er-Bilder)
1.5 Standby-Replay Modus (wenn keine Fotos gemacht wird, werden nach Zufallsprinzip gemachte Bilder gezeigt)
1.6 RGB LED Beleuchtung
1.7 Mini Webgallerie auf lokalem Webserver, erreichbar über
1.8 WiFi Accesspoint (WLAN Modul)
1.9 Shutdown/Reset Prevention Routine (System Shutdown/Reboot nur über Button-Longpress aktivierbar)
1.10 Externer Buzzer
1.11 Beleuchtete Auslöseschalter
1.12 Speicherung der Fotos auf USB Stick statt SD Karte



1.1 Email und Tumblr Upload deaktiviert
Anders als bei Chris, wollte ich die Bilder nicht zu Tumblr oder irgendeiner anderen Bildplattform hochladen und so konnte der gesamte Teil in meiner neuen Fotobox Software entfallen. Zudem wollte ich den Raspberry auch nicht mit mobilem Internetzugang auststatten.

1.2 Wasserzeichen im Bild
Um den Bildern einen professionellen Touch zu geben, soll ein kleines Wasserzeichen bzw. Logo in der unteren linken Ecke der Bilder angezeigt werden. Um den Rechenprozess beim Erstellen der 4-fach Ansicht zu beschleunigen, werden die Fotos direkt nach der Aufnahme und während des Countdowns im Hintergrund mit dem Logo versehen. Dies geschieht mittels eines System-Call des ImageMagick Programms montage:

    graphicsmagick = "composite -gravity southwest /home/pi/watermark3.png " + filename + " " + filename + "&"
    os.system(graphicsmagick)


Wichtig ist hierbei besonders das "&" Symbol am Ende, welches die Hintergrundausführung des composite Kommandos ermöglicht, also während bereits neue Fotos gemacht werden.



1.3 Countdown Overlay im Livebild
Anders als in der originalen Version der Box wollte ich noch einen Countdown, der als Overlay über das Live-Kamerabild gelegt wird, sodass die Nutzer auch sehen können, wann das Foto geschossen wird. Da im Originalcode sowieso eine kurze Pause zwischen den einzelnen Aufnahmen liegt, musste nur noch ein Bild zur richtigen Zeit ein- und ausgeblendet werden. Hierzu erstellte ich einige Grafiken, die dann halbtransparent über das Kamera-Livebild gelegt werden. Als ich diesen Teil programmierte enthielt die picamera Bibliothek (1.8) noch einen Bug, der ein Memory Leak durch mehrfaches Hinzufügen und Entfernen von Overlays produzierte (Fixed a nasty memory leak in overlay renderers which caused the camera to run out of memory when overlays were repeatedly created and destroyed (#174)). Glücklicherweise wurde dieser mit Veröffentlichung der neuen Version behoben.

def countdown_overlay( camera ):
    n=4
    for i  in range(1,n):
	gc.collect()
    	img = Image.open(str(i)+'.png')
    	pad = Image.new('RGB', (
        	((img.size[0] + 31) // 32) * 32,
        	((img.size[1] + 15) // 16) * 16,
        	))
    	pad.paste(img, (0, 0))
	o = camera.add_overlay(pad.tostring(), size=img.size)
	o.alpha = 100 #128
    	o.layer = 3
	sleep(1)
	camera.remove_overlay(o)
   	del img
   	del pad



1.4 4-Fachdarstellung der geschossenen Bilder (Speicherung aller Einzelbilder und der 4er-Bilder)
Um den gesamten Fotoprozess zu beschleunigen und so mehreren Leuten die Möglichkeit zum Fotografieren zu geben, entschied ich mich, anders als bei Chris die Bilder nicht einzeln sondern alle 4 Bilder gleichzeitig nach der Session auf dem Bildschirm darzustellen. Auch hier kommt wieder Imagemagick ins Spiel und kombiniert die 4 Einzelbilder zu einem:

    #Aus den 4 Einzelbildern 1 Bild montieren
    graphicsmagick = "montage "+ file_path + now + "-01.jpg " + file_path + now + "-02.jpg " + file_path + now + "-03.jpg " + file_path + now + "-04.jpg -geometry 640x512+2+2 "+ file_path + now + "-montage.jpg "
    os.system(graphicsmagick)
    #Kopieren der Einzelbilder nach ./single und in Anschluss löschen
    bilder_wech="cp "+ file_path + now + "-01.jpg " + file_path + now + "-02.jpg " + file_path + now + "-03.jpg " + file_path + now + "-04.jpg "+ file_path + "single/"
    os.system(bilder_wech)
    bilder_wech="rm -f "+ file_path + now + "-01.jpg " + file_path + now + "-02.jpg " + file_path + now + "-03.jpg " + file_path + now + "-04.jpg " 
    os.system(bilder_wech)

8.JPG

1.5 Standby-Replay Modus
Um den Bildschirm optimal auszunutzen sollen während der Fotopausen, d.h. wenn gerade keine Bilder gemacht werden, nach dem Zufallsprinzip Bilder angezeigt werden. Hierzu wird bei jedem Aufruf der Funktion das Bildverzeichnis eingelesen und dann aus dieser Menge fortlaufend zufällig Bilder ausgewählt und angezeigt, bis ein Benutzer den Auslöseknopf drückt. So können sich Benutzer einfach bereits gemachte Bilder anschauen und sich weitere Ideen für neue Fotos holen.

while not GPIO.event_detected(button1_pin) :
		piclist = list()
		x = 0
		for infile in glob.glob(os.path.join(file_path,'*.jpg')):
			piclist.append(infile)
		print random.choice(piclist)
		pygame.display.set_caption('Photo Booth Pics')
		pygame.mouse.set_visible(False) #hide the mouse cursor
		filename = random.choice(piclist)
		del piclist
		img=pygame.image.load(filename)
		img = pygame.transform.scale(img,(transform_x,transfrom_y))
		screen.blit(img,(offset_x,offset_y))
		pygame.display.flip() # update the display
		sleep(3)
		#print "next pic..."
		gc.collect()	

	pygame.quit()
	print "killed random image process"
	GPIO.remove_event_detect(button1_pin)
	start_again = True
	GPIO.output(led2_pin,False)



1.6 RGB LED Beleuchtung
Eine schöne optische Verbesserung mit positivem Nebeneffekt bietet der (die) RGB-LED Strip. Zum einen macht die Beleuchtung natürlich einen tollen Eindruck und unterstützt gleichzeitig in den Abendstunden oder bei schlechten Lichtverhältnissen beim Fotografieren. Fernbedienung und IR Empfänger sind seitlich in der Wartungsklappe untergebracht, was einen schnellen Farbwechsel oder eine Anpassung der Helligkeit ermöglicht. Um noch mehr Lichtleistung in den schmalen Schlitz zu bekommen, entschied ich mich 2 LED Streifen einzubauen. Einen, der nach oben strahlt und auf eine weiße und somit reflektierende Fläche trifft und einen anderen, der direkt nach vorne strahlt. Durch das auf der Rückseite aufgerauhte Plexiglas wird die Scheibe diffus und matt und bietet so ein recht gleichmäßiges relativ blendfreies Licht.

4.JPG

9.JPG




1.7 Mini Webgallerie auf lokalem Webserver
Um den Gästen die Möglichkeit zu geben sich die Bilder mit dem Smartphone oder Tablet anzusehen, benötigte ich neben einem Webserver eine Galleriesoftware, die möglichst wenig Ressourcen benötigt und möglichst ohne große Konfiguration und zusätzliche Bibliotheken oder Datenbanken auskommt. Nach einiger Suche stieß ich auf MiniGal (http://www.minigal.dk/) Perfekt! Nachdem der Server und die Gallerie aufgesetzt waren, stellte ich jedoch ein Problem fest welches mich davon abbrachte, diese Konfiguration produktiv einzusetzen: Die Generierung der Vorschaubilder in der Gallerie geschieht scheinbar ebenfalls mit Imagemagick - Eigentlich kein Problem, doch bei einer Vorschau von 8 Bildern, wurden ebenfalls auch 8 Prozesse gestartet, die die kleine CPU des Raspberry für kurze Zeit vollständig auslasteten. Da gerade bei vielen gleichzeitigen Zugriffen auf den Webserver die Lauffähigkeit des Photobooth Programms nicht sichergestellt werden kann, entschied ich mich dieses Feature zu deaktivieren.

1.8 WiFi Accesspoint
Eigentlich der Tatsache geschuldet, dass der Ethernetanschluss des Pi nur schlecht zu erreichen ist richtete ich einen WLAN Accesspoint, DHCP und DNS Server auf dem Raspberry ein. So ist eine schnelle und unkomplizierte Wartung per WLAN und Laptop, Handy oder Tablet möglich. Leider läuft der Accesspoint nicht wirklich stabil und ich habe häufiger Probleme mich mit dem WLAN zu verbinden. Nach ein paar Neustarts ist das Problem jedoch meist behoben. Ursache könnte der verwendete Stick oder aber ein Softwareproblem sein. Da der Zugriff aber i.d.R. nur bei Problemen oder Wartungen von Nöten ist, ist dies kein Problem.

1.9 Shutdown/Reset Prevention Routine
Nach einigen Stunden des Testens, stellte ich immer wieder fest, dass die Hardwarebuttons scheinbar ohne ersichtlichen Grund von Zeit zu Zeit schließen bzw. auslösen. Beim Auslösebutton ist dies zwar nicht besonders schlimm (man hat eben nur ein leeres Foto), bei den Knöpfen für Shutdown oder Reboot liegt das Problem jedoch auf der Hand. Leider konnte ich nicht wirklich herausfinden, was der Grund für das ungewollte auslösen der Buttons ist. In Supportforen habe ich Leute mit einem ähnlichen Problem, aber ohne eine vernünftige Lösung gefunden. Um nun also dieses ungewollte Drücken zu unterbinden, habe ich eine kleine Routine programmiert, die den Shutdown oder Reboot Befehl erst dann durchführt, wenn der Button längere Zeit gedrückt wird. Diese Lösung ist allerdings programmiertechnisch nicht sauber und eher experimentell, aber sie funktioniert (irgendwie… ;-) ).

def reset_event_detection_shutdown():
	sleep(0.5)
	GPIO.remove_event_detect(button2_pin)
	sleep(0.1)
	GPIO.add_event_detect(button2_pin, GPIO.FALLING, callback=shut_it_down, bouncetime=300) 

def shut_it_down(channel):
	sleep(0.5)
	counter=0
	while GPIO.input(channel) == GPIO.LOW :
		counter=counter+1
		sleep(0.1)
	     
	if (counter >= 8): 
		print str(counter) + "counter"
		print "Shutting down..." 
		GPIO.remove_event_detect(button2_pin)
		lightshow(1)
		#GPIO.output(led1_pin,True);
		#GPIO.output(led2_pin,True);
		#GPIO.output(led3_pin,True);
		#GPIO.output(led4_pin,True);
		time.sleep(3)
		os.system("sudo shutdown now -h")
    	
	else:
		print "Press longer to shutdown!"
		print str(counter) + "counter"
		reset_event_detection_shutdown()


3.JPG

1.10 Externer Buzzer
Neben dem Auslöser an der Box wollte ich gerne noch eine Möglichkeit eines stehenden Buzzers realisieren, der etwas von der Box entfernt stehen sollte. Da ich beabsichtigt hatte den Buzzer später auch zu beleuchten, brauchte ich also eine 4-adriges Kabel und eine Möglichkeit ihn einfach von der Box an und abzukoppeln. Hier entschied ich mich auf ein USB Kabel zurückzugreifen, was sich m.E. hierfür prima eignet.
6.JPG

1.11 Beleuchtete Auslöseschalter
Um die Gäste zu animieren und das Aussehen optisch zu verbessern entschied ich mich die Buttons noch zu beleuchten. Standardmäßig sind die Arcardebuttons mit 12V Glühbirnchen versehen, was eine (An-)Steuerung mittels Raspberry und GPIO erschwerte, da dieser nur 5V liefert. Also entschloss ich mich die Beleuchtung komplett autonom zu steuern und verpasste dem Lampensystem ein eigenes 12V Netzteil welches ich mit einem Wechselblinker (Bausatz) koppelte. Sofern der Buzzer angeschlossen ist, blinkt der Auslöser am Gehäuse und der Buzzer im Wechsel, ansonsten ist die Lampe dauerhaft beleuchtet.



1.12 Speicherung der Fotos auf USB Stick statt SD Karte
Um zum einen Schreibzugriffe auf die SD Karte zu minimieren und das Kopieren der Fotos zu vereinfachen, habe ich einen USB Stick installiert, welcher beim Systemstart automatisch gemountet wird. Dieser ist FAT32 formatiert und kann also auch problemlos von Fremdbetriebsystemen wie MacOS oder Windows gelesen werden. Der Stick kann beim Systemstart mit folgendem Eintrag in der /etc/fstab automatisch gemundet werden:
UUID=<UUID des USBSTICK> /var/www/photos vfat defaults,auto,umask=022,users,rw 0
Die UUID kann mit dem Befehl blkid festgestellt werden.

Ich begann zunächst mit der Installation und Einrichtung des Raspbian Systems und begann dann mit dem Auf- und Nachbau der Elektronik auf einem Breadboard. Erste Tests funktionierten gut und so konnte ich mich dem Code widmen. Da ich nur wenig Erfahrung mit der Programmierung mit Python habe, war die Programmierung etwas holperig. Glücklicherweise findet sich überall gute Dokumentation im Netz und ich brauchte nicht viel neu zu programmieren und konnte so weite Teile von Chris‘ Code einfach recyclen.
Glücklicherweise verfügt mein verwendeter Monitor über eingebaute USB Schnittstellen, weswegen ein externes Netzteil für den Raspberry enfällt. Intern verwende ich eine 3fach Steckdose die mit Monitor, Lampennetzteil und LED Netzteil voll belegt ist. Durch die interne Verwendung der 3er Dose hat die Box nur ein Stromkabel welches nach aussen geht.
2.JPG 1.JPG



Probleme

  • Fehlendes Internet, daher keine Zeitsynchronisation --> keine bzw. falsche Zeitstempel bei Fotos
  • Aufgrund (vermutlich) langer Kabel willkürliches ungewolltes Drücken der Buttons (siehe 1.9)
  • WLAN Verbindungsprobleme (Verbindung mit Photobooth schlägt fehl)



Ideen für zukünftige Verbesserungen

  • Mobiles Internet mit DynDNS Adresse für Wartungszwecke
  • Ethernet Wartungsanschluss
  • Sound (Auslösegeräusch, Countdown Ton)

5.JPG

7.JPG

Der komplette Code: photobooth.py

Umzug zu dotclear

Aufgrund meines begrenzten PHP Speichers von nur rund 16MB und den sich häufenden "Memory Exhausted" Fehlern insbesondere im Backend von Wordpress, habe ich den Blog nun auf die Software dotclear migriert. Glücklicherweise bietet die einen Wordpress Import Assistenten, sodass auch die alten Beiträge alle wieder da sind (wenn auch ohne Absätze).

Viel Spass!

Freitag, Juli 11 2014

Quadcopter UDI 818a

Nachdem der UDI 818a Quadcopter nun schon einige Zeit besitze, möchte ich kurz meine Erfahrungen dazu teilen. Zunächst mal tut der UDI 818a eigentlich alles was er soll, nämlich fliegen. Bezüglich der Steuerung lässt sich sagen,dass er mir im Modus 1 (Anfängermodus) viel zu träge reagiert und die wenigen ersten Abstürze auf das Konto diesesModus 1 gehen. Nachdem ich dann nur noch den Modus 2 (ohne Limitierung) genutzt habe klappte auch der Flug immer besser. Einziges Manko: der Akku. Dieser ist nämlich innerhalb weniger Minuten leer und auch nach mehrmaligem Aufladen der Akkus(ich habe direkt noch ein 3er Set bestellt) wurde dieses Verhalten auch nicht besser. Meine Vermutung ist hier, dassder mitgelieferte Lader, nicht nach einem Ladeprogramm (wie bei LiPo Akkus eigentlich nötig) arbeitet, sondern einfach eine Abschaltung des Ladestroms bei 4,2 Volt vornimmt. Aufgrund dieser Vermutung und der fehlenden Möglichkeit mehrere Akkusgleichzeitig zu laden, entschied ich mich für den Kauf eines ordentlichen Ladegeräts (Jamara X-Peak 80). Damit scheint die Flugzeit doch noch einmal etwas zu steigen und man hat einfach ein besseres Gefühl beim Laden. Doch auch der Tausch des Laders konnte die Tatsache der kurzen Flugzeit nicht wett machen und so entschloss ich mich für eine Modifikation. Besser gesagt, ich entfernte die Plastikschutzverkleidung. Diese eigentlich nur kleine Änderungmachte sich extrem in der Agilität und auch in der Akkulaufzeit bemerkbar. Der Quadcopter war nun deutlich besser zukontrollieren und auch das berühmte "Parken in der Luft" klappte nun einwandfrei. Auch leichter Wind war so kein Problem mehr. Lediglich ab und zu schien es eine Störung des Gyroskops zu geben und der Copter trudelte einfach langsam zu Boden, setzte kurz auf und flog dann wieder hoch. Insbesonderen nach den 360° Drehungen. Abgesehen von diesen Kleinigkeiten ansonsten alles in allem eigentlich soweit ganz gut. Ich habe einige schöne Flüge gemacht und auch einige nette Aufnahmen mit der integrierten Kamera gefilmt, die nun wirklich keine tolle Qualität hat, für ein paar kleine Videos aus der Höhe aber vollkommen ausreicht. Problematisch wurde die Fliegerei allerdings, als der Copter plötzlich und unverhofft Probleme mit dem Rückwärtsflug bekam.Er ließ sich nur noch schwer und mit viel manuellem Nachtrimmen wieder zurück fliegen und ladete aufgrund dieser Tatsache auchschonmal frontal vor einer Wand. Als nun auch noch die Akkuleistung rapide abnahm, ging ich zuerst von defekten Akkus aus. Wie ich nach einigen Tests herausfinden musste, war scheinbar einer der kleinen Motoren defekt und zog so viel Strom, dass die Akkus nach knapp 1 Minute komplett leer waren. Nachdem ich einen neuen Ausleger inklusive Motor bestellt und montiert hatte, schien wieder alles im Lot zu sein, das war es leider aber nicht - der Copter ließ sich zunächst prima steuern, kippte dann aber während des Flugs unverhofft nach vorne und entfernte sich so schnell, dass mir nur noch das prompte Abschalten der Motoren weiterhalf und der Copter aus gut 30-40 Metern auf den Asphalt stürtzte. Glücklicherweise wurde keine Person verletzt und nichts beschädigt, dennoch ein Schockmoment. Der Copter hat, abgesehen von einem umgeknickten Propeller den Sturz unbeschadetüberstanden, dennoch scheint ja offensichtlich auch ein weiterer Motor defekt zu sein... Mittlerweile überlege ich tatsächlich, ob ich überhaupt noch Geld in den Flieger investieren soll. Wenn man überlegt welcheSumme ich mittlerweile für Akkus, Lader und Ersatzteile berappt habe, würde ich direkt zu einem teureren/besseren Modell raten. Auch wenn die Qualität eigentlich ganz in Ordnung ist. Was jedoch ein wenig ärgert ist, dass z.B. der Vorgang der Gyroskopkalibrierung mit keiner Silbe im beigelegten Manual erläutertwird! Daher kurz zur Info: Nach dem Binden des Copters an die Fernbedienung sofort den rechten Steuerhebel erst nach hinten und dann sofortnach unten rechts ziehen (quasi eine L-Form). Daraufhin blinken die Beleuchtungsleds und das Gyroskop ist kalibriert. Fazit: Das UDI 818a ist ein guter und günstiger Copter für Leute, die sich (wie ich) neu mit diesem Hobby beschäftigen. Man findet sich schnell mit der Steuerung zurecht und bekommt ein gutes Gefühl, wie sich solche Fluggeräte verhalten. Die verbaute Kamera istein nettes Feature, die Qualität der Videos ist allerdings nicht wirklich toll, von den Fotos ganz zu schweigen!Besser scheint mir lieber einmal mehr Geld in die Hand zu nehmen und einen ordentlichen Copter, wie z.B. den DJI Phantom zu kaufen,der sicherlich auch für Anfänger gut zu steuern ist, aber deutlich hochwertiger und mit nützlichen Features wie Return Home und Altitude Lockausgestattet ist. Wer billig kauft, kauft 2x ...

Dienstag, Juli 30 2013

Fazit iRobot Roomba 780

iRobot Roomba 780 Staubsaugroboter - Ein Zwischenfazit Nachdem ich den Roomba nun schon einige Zeit besitze, möchte ich doch nochmal kurz resümieren. Anfangs war ich doch etwas skeptisch als er regelmäßig vor Schränke, Tische und Stühle "donnerte" und auf diese Weise selbstständig durch den Raum navigierte. Keines der Möbel hat bisher dadurch irgendeinen Schaden oder auch nur ein Macke davongetragen und ich gehe davon aus, dass auch keiner mehr auftritt. Zugegeben irgendwie hatte ich etwas mehr Intelligenz erwartet aber trotzdem erstaunten mich diverse Dinge, wie das präzise parallele Abfahren von Kanten und Wänden und die automatische Erkennung von Tischbeinen und runden Objekten. Zunächst aber zur   Reinigungsleistung Mittlerweile möchte ich "Robi" nicht mehr missen, denn bei seinen Fahrten durch die Wohnung sammelt er solch enorme Mengen an Staub auf, dass man glauben könnte es würde nie gereinigt und man sich wirklich fragt, wo lag dieser ganze Staub. Alleine diese Tatsache qualifiziert ihn in meinen Augen schon als vernünftiges Haushaltsgerät. Wenn man dann noch in Betracht zieht, dass er auch an Stellen reinigen kann, die mit dem normalen Staubsauger nur schwer oder gar nicht zu erreichen sind (z.B. unter dem Bett) wird der Mehrwert deutlich. Der Roomba ersetzt sicherlich keinen herkömmlichen Staubsauger, erspart aber in jedem Fall das ständige Staubsaugen und reduziert die Anzahl der normalen Saugvorgänge auf ein Minimum. Eigentlich muss nur in Ecken oder an Übergängen oder überstehenden Kanten, die der Roomba nicht erreichen kann, ab und an nachgesaugt werden. Die Reinigungsleistung ist in Summe wirklich einwandfrei und alle (von ihm erreichbaren) Stellen sind sauber. Lediglich um die Dockingstation und um Lighthouses herum wird (aus technischen Gründen?) nicht gesaugt.   Reinigung des Roboters Ich reinige den Roomba eigentlich wöchtentlich, jeweils mit dem dem leeren des Staubbehälters. Die Reinigung ist schnell und einfach erledigt und auch die mitgelieferten Werkzeuge erweisen sich als n¸tzlich. Ich nehme zusätzlich noch immer eine kleine Nagelschere um die eingedrehten Haare an den Rändern der Bürsten zu entfernen. Die Gummib¸ste lässt sich auch problemlos unter warmem Wasser abspülen, für den Rest eignet sich ein feuchter Lappen. Als sehr nützlich hat sich für mich der Einsatz von Druckluft (Luftsprühdose, Kompressor oder Luftpumpe) herausgestellt, da sich doch überall in Ritzen und Öffnungen noch Staub festsetzt der so schnell und einfach entfernt werden kann.   Navigation, Multiroom-Cleaning und Docking Ein kleines Manko und eigentlich das einzig Negative ist die Navigation oder zumindest Teile davon. Während der Roomba in manchen Situationen scheinbar intelligent handelt (z.B. Reduktion der Geschwindigkeit vor Hindernissen), knallt er nur wenige Augenblicke später mit voller Fahrt von genau dieses Hindernis, welches er vorher erkannte. Dies hat natürlich keine Auswirkung auf die Reinigung, lässt aber schon an der Programmierung zweifeln. Weiterhin scheint der Roomba manchmal starke Orientierungsschwierigkeiten zu haben und versucht fröhlich mehrfach durch ein offensichtliches Hindernis zu fahren. Besonders im Zusammenhang mit Lighthouses gibts offenbar auch einige Probleme, was sich durch mehrfaches Drehen um die eigene Achse äussert, als versuche der Roboter Dock oder Lighthouse zu orten. Dies hat zwar keinerlei Auswirkung auf Reinigung o.ä., macht aber einen komischen Eindruck. Weiterhin erscheint mir manchmal der Wechsel in einen anderen Raum sehr holperig. Obwohl er offensichtlich komplett gereinigt ist, überfährt der Roomba die virtuelle Schranke erst sehr spät. Dieses Phänomen tritt ab und an auch bei der Rückkehr zum Dock nach der Reinigung auf. Die Schranke wird nicht überfahren, obwohl der aktuelle Raum zum einen bereits gereinigt ist und zu anderen nur noch der Rückweg zu meistern wäre... Vielleicht liegt das aber auch an meiner Lighthouse Positionierung? Ansonsten funktioniert die Mehrraumreinigung aber gut und zuverlässig. Zu beachten ist nur, dass eine gewisse Roboterfreundlichkeit der Räume gewährleistet ist, denn ansonsten kann es vorkommen dass der Roboter sich fest fährt oder auch selbst einsperrt und bis zum Akkuende vergeblich versucht zu entkommen. Heizungen, Hänge WCs oder auch Vorhänge sind da sehr gefährlich ;). Wie auch bei allem anderen treten neben dem an sich sehr akuraten Dockingvorgang ab und an kleinere Probleme beim Befahren des Docks auf, wobei der Roboter das Dock auch schonmal selbsttätig verschiebt. Dies könnte in meinem Fall aber auch an der recht unoptimalen Position des Docks in einer Ecke liegen.   Fazit Alles in allem war und ist der Roomba 780 eine absolut empfehlenswerte Anschaffung insbesondere für Menschen mit hohem Sauberkeitsbedürfnis und staubfangenden Hartböden wie Laminat, Fliesen oder ähnliches. Der hohe Preis schreckt zwar zunächst ab, stellt man dem aber die Zeitersparnis und Bequemlichkeit gegenüber relativiert sich dieser.    

Dienstag, April 16 2013

Spacewalk 1.9 Channel Clone Error

Seit dem Update auf Spacewalk 1.9 gab es beim Versuch Software Channel zu klonenen einen 500 Internal Server Error. Dieser lässt sich auf einen fehlenden Link im Dateisystem zurückführen: ln -s /var/www/html/network/software/ /usr/share/spacewalk/web/network/software Dann sollte wieder alles wie gewohnt funktionieren.

Montag, April 15 2013

[LVM] root Volume verkleinern

Um ein LVM Volume zu verkleinern muss das logische Volume zunächst unmountet werden. Da das bei einer Root Partition im laufenden Betrieb nicht möglich ist, muss eine Live CD gebootet werden. Dort im Terminal folgende Befehle eingeben: Zunächst das LVM aktivieren bzw. einlesen vgchange -a y Vor der Änderung sollte das Volume nochmal auf Fehler überprüft werden e2fsck -f /dev/<volumegroup>/<logisches_volume> Wichtig! Vor dem verkleinern des Volume auf jeden Fall zunächst das Dateisystem verkleinern, da sonst Datenverlust droht (Hier auf 20GB): resize2fs /dev/<volumegroup>/<logisches_volume> 20G Jetzt darf auch das Volume verkleinert werden (ebenfalls 20GB): lvreduce -L 20G /dev/<volumegroup>/<logisches_volume> Das Ergebnis kann jetzt mit lvs überprüft werden. Nun noch den Rechner neustarten und von der frisch verkleinerten root Partition booten.  

Donnerstag, März 7 2013

linux-generic-pae Dependency Problems

Abschließend lässt sich leider gar nicht mehr genau feststellen, was zu dem Problem führte was mich jedoch lange beschäftigte. Durch ein Update des Linuxkernels bzw. der Kernelheader trat ein dependency Problem auf, welches sich nicht durch apt-get -f install / autoremove /clean oder ähnliches beheben ließ. Bei jeder Paketinstallation und jedem Upgrade brach der Updateprozess mit dem folgenden Fehler ab:
Die folgenden Pakete haben unerfüllte Abhängigkeiten: linux-generic-pae : 
Hängt ab von: linux-image-generic-pae (= 3.2.0.37.44) soll aber nicht installiert werden
Hängt ab von: linux-headers-generic-pae (= 3.2.0.37.44) aber 3.2.0.38.46 soll installiert werden
linux-image-server : Hängt ab von: linux-image-generic-pae soll aber nicht installiert werden
Die Lösung fand ich dann nach einger Recherche hier: http://askubuntu.com/questions/251862/broken-count-error-linux-generic-pae-depends-linux-image-generic-pae-3-2 Das linux-generic-pae Paket muss zuerst mittels dpkg entfernt werden und kann dann mit apt wieder mit den korrigierten Anhängigkeiten reinstalliert werden.
sudo dpkg --remove linux-generic-pae
sudo apt-get install linux-generic-pae
 

Donnerstag, Februar 14 2013

[pfsense] Routingproblem nach Umstellung IPSec auf OpenVPN

Nachdem ich sehr lange gebraucht habe um diesen "Fehler" zu finden, hier die zugegeben sehr einfache Lösung. Vielleicht ist ja jemand in genau der gleichen Situation :). Zunächst zum Problem: Weil ein IPSec VPN bei mir einige Probleme verursachte, habe ich mich zur Umstellung des VPN auf OpenVPN entschieden. Um natürlich für den Fall der Fälle nicht alle Infos des alten IPSec VPNs zu verlieren, habe ich einfach den Phase 1 Eintrag deaktiviert und danach den OpenVPN Server gestartet. Der Tunnel baute sich ohne ein Murren auf, jedoch gab es ein Problem, es ließ sich keine einzige Adresse pingen bzw. von der Gegenseite erreichen. Die virtuellen Adressen des OpenVPN Transportnetzes waren beide pingbar, also musste auch der Tunnel stehen. Die Lösung: Nach dem Deaktivieren der IPSec Phase werden die ausgehandelten SAs noch behalten und verhindern daher das Routing von OpenVPN ins LAN. Löscht man unter Status --> IPSec --> SAD bzw. SPD die Associations. Funktioniert auch das Routing mit OpenVPN einwandfrei!  

Dienstag, November 20 2012

CPU mit Linux komplett auslasten

Eine CPU unter Linux komplett auslasten? Kein Problem! Wir veranlassen das System einfach dauerhaft Zufallszahlen auf das Nulldevice zu schreiben: cat /dev/urandom > /dev/null Damit erreicht man eine 100%ige CPU Auslastung durch den einen Prozess. Bei Mehrkern-CPUs kann dieser Befehl auch mehrfach ausgeführt werden um eine vollständige Systemauslastung zu erreichen.

Mittwoch, November 7 2012

[Miniscript] DNS zu IP

Aus einer Not heraus entstand dieses kleine Bash Script, welches eine Liste (liste.txt) von DNS Namen zu IP Adressen mittels nslookup auflöst: #!/bin/sh for i in $(cat liste.txt); do nslookup $i | awk '{ print $2 }' | sed -n '0~5p' sleep 1 done exit 0

Mittwoch, Oktober 31 2012

Veraltete SSH Keys entfernen

Möchte man einen veralteten SSH Key aus seiner known_hosts entfernen kann man sich entweder mit ssh-keygen bemühen (wie bei Ubuntu zum Beispiel vorgeschlagen), selbst in der Datei Hand anlegen oder unter Angabe der Zeile des alten Keys in der known_hosts sed mit folgenden Parametern verwenden: sed -i "5 d" .ssh/known_hosts Dieser Befehl löscht die entsprechende Zeile einfach aus der Datei ohne umständliches Aufrufen eines Editors oder Befehls. Im obigen Beispiel würde der Key in der 5. Zeile gelöscht. Da SSH den "falschen" Key stets mit Zeile angibt braucht die 5 nur durch den entsprechenden Wert ersetzt werden.

Donnerstag, Oktober 11 2012

Ich lebe noch...

Hallo, Salut und Bonjour! Ein kurzes Lebenszeichen meinerseits. Bald werde ich mal wieder ins Blogging einsteigen...   Stay tuned!

Sonntag, Oktober 9 2011

ATI Catalyst Treiber unter Ubuntu entfernen

Einige Leute werden das Problem kennen: Aus Neugier installiert man den offiziellen proprietären ATI/AMD Treiber für Linux von der Homepage und stellt danach ernüchtert fest, dass das System langsamer geworden ist und scrollen und Fenster verschieben nur sehr hakelig von statten geht. Will man nun den offiziellen Treiber wieder loswerden, stellt sich die Frage nach dem wie!?! ATI hat eine einfache übersichtliche GUI erstellt um die Module zu kompilieren und zu installieren, eine einfache Deinstallationsroutine ist allerdings nicht integriert. Wer nun den fglrx Treiber komplett entfernen möchte, manövriert in das Verzeichnis /usr/share/ati und führt dort als Root User (sudo) das Skript fglrx-uninstall.sh aus. Damit sollte der Treiber und seine Überreste nach einem Neustart ins Nirvana verschwunden sein.

Freitag, August 12 2011

Multi WAN Firewall/Router pfsense

Heute möchte ich gern über mein neustes Projekt berichten: Einem Multi WAN Router mit sehr guter Firewall namens pfsense. pfsense ist ein FreeBSD Derivat und entstand aus dem bekannten m0n0wall Projekt. Anders als m0n0wall kann pfsense aber problemlos mit mehreren WAN und LAN Verbindungen umgehen. Es passt automatisch Routen an, bietet Failover und Load Balancing und lässt sich durch zahlreiche Plugins und Addons erweitern. Besonders das Problem mit https Verbindungen, welche empfindlich auf Balancing reagieren löst pfsense mit so genannten Sticky Connections. Das bedeutet, dass Verbindungen so lange über die gleiche Route / den gleichen Router laufen, bis die Verbindung abgebaut wurde oder durch einen Timeout ungültig wird. Neben umfangreichem Traffic Shaping, QoS Konfigurationen und Firewalling bietet pfsense noch eine Reihe an automatisch produzierten RRD Graphen und Statistiken an, die dem User Auskunft über die Verbindungen geben. Das System wird komplett über die Weboberfläche konfiguriert, bietet jedoch zu Wartungszecken auch direkten Zugang via SSH. pfsense kann entweder zwischen einen bestehenden Router und das interne Netzwerk geschaltet werden, oder auch direkt PPPOE Verbindungen zum Provider aufbauen. Selbst die Intregration von WLAN Karten und die Nutzung als Accesspoint soll laut Forum gut funktionieren. Mein bisheriger Eindruck ist wirklich positiv. pfsense ersetzt den selbstkonfigurierten Router/Server und macht dabei eine gute Figur. Das Netz wirkt agiler und insgesamt zügiger, was vermutlich aber auch an der Trennung der Netze mittels VLANs liegt. pfsense arbeitet in meinen Futro S200 Thinclient, der zusätzlich mit einer Dualnetzwerkkarte ausgerüstet wurde. Wer einen günstigen und hochwertigen und komplett konfigurierbaren Router mit VPN, DNS, DHCP, SNMP uvm. sucht, sollte definitiv einen Blick auf die pfsense Software in Verbindung mit einem Thinclient werfen. [1] http://m0n0.ch/wall/ [2] http://www.pfsense.org/

Montag, Juli 18 2011

Primary Monitor festlegen in Ubuntu 10.10 Gnome

Als ich meinen zweiten Monitor als Desktoperweiterung an meinen PC anschloss, stand ich vor dem Problem, dass der zweite Monitor immer der Primärmonitor wurde. Doch genau das war ja nicht gewünscht, denn der zweite Monitor sollte eben nur eine Erweiterung zum Hauptmonitor sein. Der Hauptmonitor ist per DVI angeschlossen und der Sekundäre per VGA. Nach einigem googlen stiess ich auf die Information, man solle die ~/.config/monitor.xml ändern, was in meinem Fall überhaupt nicht funktionierte. Um die Monitore richtig einzurichten, habe ich xrandr bemüht und sofort das richtige Ergebnis erhalten: Zuerst muss festgestellt werden, wie der Hauptmonitor heisst, dazu reicht der einfach xrandr Aufruf in der Konsole, was in meinem Fall die Monitore DVI-0 und VGA-0 zu tage förderte. Mittels xrandr --output DVI-0 --primary kann so der DVI Monitor als Primärmonitor gesetzt werden. Voila!

Freitag, Juli 15 2011

Mini OS: Android für x86, SliTaz und xPud und Co

Was viele schon von ihrem Smartphone kennen, findet nun auch auf dem heimischen PC Einzug: "Android" bzw. Android x86, ein speziell für x86 Architekturen aufbereitetes Androidsystem. Dies klang erstmal ziemlich gut und sollte seinen Platz auf meinem Futro S200 finden, dessen installiertes Browserlinux scheinbar überfordert war. Wie ich später herausfand, lag das wohl an der Inkompatibilität des Transmeta CPU mit dem Linuxkernel, welcher die CPU als i686 erkennt. Leider ist der TM Crusoe 800 jedoch kein vollwertiger i686 Prozessor, was sich durch Freezes und Systemträgheit bemerkbar machte. Daraufhin wollte ich Adroid x86 versuchen, welches in einer virtuellen Maschine schon einen sehr guten Eindruck machte und, so dachte ich, die schwachen Resourcen des Futro perfekt ausnutzen würde. Leider Fehlanzeige, denn mit keinem Kernelparameter konnte ich Android x86 mit dem Transmeta Crusoe zum Booten bewegen, sämtliche Versuche endeten mit einem schlichten "Unsupported CPU". Also suchte ich weiter nach einer schlanken und leistungsfähigen Distribution die sich mit der Futro Hardware verstand und stieß nach einiger Suche auf die Distribution SliTaz. Sehr vielversprechend wurde die CPU sofort erkannt und SliTaz bootete fix bis zum Desktop. Erstaunt von der Geschwindigkeit die dann doch mit wenig Speicher und schwacher CPU zu erreichen war testete ich das Surfen im Internet. Der mitgelieferte Midori Browser inklusive Flash Plugin lief für die gegebenen Verhältnisse wirklich zügig, jedoch schien SliTaz doch etwas zu überladen. So versuchte ich xPud, dessen Konzept mich voll überzeugt hat. Denn xPud stellt nur eine absolut minimale Oberfläche zur Verfügung, enthält aber einen aktuellen Firefox mit Flash Plugin und einige kleinere Programme, wodurch xPud eine größe von nur wenigen MB erreicht. Theoretisch, kann man mittels eigenem "Appstore" noch ein paar Programme nachladen (Skype, Mediaplayer usw.) was jedoch bei mir nicht funktionierte. Insgesamt stelle ich fest, dass es sich manchmal sehr lohnen kann sich nach Minidistributionen umzusehen, denn ein System wie xPud ist so klein und so schnell gestartet, dass es sich zur Installation neben einem Windows anbietet, da es eine Bootzeit von nur wenigen Sekunden hat. Quellen & weitere Mini Linuxe: www.android-x86.org/ www.slitaz.org www.xpud.org/ www.puppylinux.org www.browserlinux.com

Montag, Mai 16 2011

Ich mach mal eben nen Jailbreak...

... oder: die komplizierte Geschichte eines Updates. Viele Otto-Normalnutzer sind mit ihrem iPhone und dessen Betriebssystem iOS vollkommen zufrieden und wissen gar nicht was ein Jailbreak überhaupt ist, geschweige denn wie man das iPhone überhaupt updatet. Manchmal sind diese Leute tatsächlich zu beneiden, denn sie ersparen sich unter Umständen viel Ärger. Wer sein iOS Device mit einer neuen Firmware versorgen will, macht natürlich zuerst einmal ein Backup seines Geräts; und das dauert... und dauert... und dauert... und.... wo ist iTunes?! Abgestürzt! Verdammt! Das Ganze noch einmal... Und endlich klappts! Puh, ein großer Schritt ist geschafft. Nun die zuvor geladene Firmware Datei mit dem Shift-Trick wiederherstellen: Klick, ... überprüfe Firmware Update mit Apple... und klack Fehler 3195 - Toll! Hin und her, Tiny Umbrella, neustart und irgendwie klappts dann. Ist die neue Firmware endlich drauf, kanns losgehen mit dem Jailbreak! Juhu! RedSn0w ist das Mittel zum Zweck, Firmware File laden... huch, abgestürtzt... nochmal das Ganze. Nun klappts endlich! Jetzt noch den DFU Mode hinfummeln, zum Glück ist das jetzt im Programm interaktiv für Idioten erklärt, also kein Problem! AHA! "Waiting for iPhone to reboot..." Da warte ich mit... irgendwie scheint es nicht zu wollen. Hmmmmm... Also iPhone reset, nochmal die ganze Prozedur. Und wer hätte es gedacht, diesmal klappts! Jailbreak gemacht! Kein Problem oder? :)

Donnerstag, Mai 12 2011

Der verflixte lila-blank-screen-post-Grub Fehler

Da es anscheinend kaum jemanden zu geben scheint der das folgende Problem mit dem Grub2 Bootloader hat/gelöst hat, will ich es mal auf diesem Weg versuchen; Vielleicht hat ja jemand eine passende Lösung parat? Nach der (Neu)Installation von Ubuntu Natty Narwhal und dem damit verbundenen Reinstall des Grub2 Bootloaders  fingen die Probleme an. Eigentlich kein wirkliches Problem, aber nervig allemal: Nach der Auswahl des Bootmenüeintrags verschwindet das Menü und Grub hängt nun gut 10 bis 15 Sekunden fest, dabei bleibt der Bildschirm komplett lila (Im Prinzip verschwindet nur der Text vom Menü). Der Rechner tut jedoch die ganze Zeit lang nichts! Dann lässt sich der restliche Bootprozess in der Konsole ablesen, jedoch keine Fehlermeldung oder ähnliches. Plymouth habe ich deaktiviert um das Problem sicher eingrenzen zu können. Auch an den Grafiktreibern kann es nicht liegen, da ich statt der proprietären ATI Treiber, die freien radeon Treiber verwende. Ich habe nun schon mit einigen Kernelparametern und Grub Optionen herumgespielt, viel gegoogelt und gelesen, jedoch lies sich das Problem bisher nicht lösen. Auch mit bootchart konnte ich nichts ungewöhnliches feststellen (...klar eigentlich, das Problem tritt ja vorher auf...). Für Tipps und Ideen bin ich dankbar!

Mittwoch, April 13 2011

Nach DSCPs filtern mit ngrep

Da ich aus den man-pages von ngrep nicht wirklich schlau geworden bin, wie man nun auf einzelne Bits im IP Header prüft und daraus Filter baut, will ich den Vorgang kurz am Beispiel von DSCPs erläutern. Auf sämtlichen Websites finden sich nur Erklärungen zum Filtern nach einfachen Attributen wie z.B. IP, Port oder bestimmten Signalwörtern wie Login oder Mail, komplexere Filterbeispiele findet man jedoch kaum. Um nun DSCPs filtern zu können muss das entsprechende Feld im IP Header durchsucht werden und mit dem Hex-Wert für den jeweiligen DSCP verglichen werden. Das TOS Feld beginnt ab dem zweiten Byte des Headers, also muss ip[1] benutzt werden, statt ip[0] oder ip was das erste Byte auswählen würde. Nun gibt es zwei Möglichkeiten, entweder man filtert nach dem kompletten TOS Feld oder nur nach dem DSCP Wert. Der Einfachheit halber nehmen wir hier das gesamt TOS Feld, bestehend aus 6 Bits für den DSCP und 2 Bits für ECN. Nun rechnen wir unseren gewünschten DSCP Wert in einen Hex-Wert um. Dabei wird aus dem DSCP Wert AF32 <--> DEC 28 <--> BIN 011100 <--> HEX 0x1C Da die ECN Felder meistens leer sind, können wir in diesem Fall einfach zwei Nullen an unseren Binär DSCP hängen und haben somit das komplette TOS Feld ausgefüllt. Der Hex-Wert für das TOS Feld lautet demnach 0x70. Um nun mit ngrep nach DSCP AF32 zu filtern nutzen wir nun einfach den Befehl ngrep -i ip[0] == 0x70 und ngrep filtert. Gleiches lässt sich natürlich auch auf die IP Präzedenz Klassifizierung übertragen. Links: http://ngrep.sourceforge.net/ http://www.stearns.org/doc/ngrep-intro.current.html

Dienstag, Februar 22 2011

Cisco Egress-Queue Threshold HowTo

Gedacht als kleine Gedankennotiz an mich selbst. Konfiguration der Egress Queues auf Cisco Switches (hier 3560): Wir konfigurieren das Output Q-Set 1 und verteilen die verfügbare Buffergröße auf die 4 Queues (Q1 bekommt 10% Q2 90%, die anderen 0%): mls qos queue-set output 1 buffers 10 90 0 0 Jetzt im Q-Set 1 die Threshold Werte für Bufferqueue 1 definieren: mls qos queue-set output 1 threshold 1 100 100 100 100 Hierbei ist die Syntax ab threshold{BUFFERQUEUE #}{threshold 1}{threshold 2}{reserve}{maximum}. Ein Threshold Wert von 50 bedeutet, dass ab einer Bufferfüllung von 50% Pakete verworfen werden. Threshold 3 ist automatisch 100% und kann nicht konfiguriert werden. Bufferqueue 2 wird wie folgt konfiguriert: mls qos queue-set output 1 threshold 2 400 50 100 400 400% sind der Maximale Threshold Wert obwohl theoretisch 3200% angenommen werden. Jetzt müssen ausgehende Pakete anhand ihres DSCP oder COS Werts auf die beiden Queues aufgeteilt werden. Zusätzlich zu ihrer Zuteilung zu einer Queue bekommen sie auch einen Threshold Wert (1,2 oder 3) der für die jeweilige Queue konfiguriert wurde. (Beispiel Queue2 Threshold 2 = 50%) Zuerst wird Verkehr mit den DSCP Werten 0-7 auf Queue 2 Threshold 2 gemappt: mls qos srr-queue output dscp-map queue 2 threshold 2 0 1 2 3 4 5 6 7 Der Befehl kann nur 8 DSCP Werte als Parameter entgegennehmen, daher muss er für die übrigen DSCPs wiederholt werden. Hochpriorer Verkehr (DSCP 40 - 63) soll auf Queue 1 gemappt werden. Da hier erst Pakete verworfen werden, wenn der gesamte Buffer gefüllt ist und jeder Threshold bei 100% liegt, kann hier entweder T1, T2 oder T3 verwendet werden: mls qos srr-queue output dscp-map queue 1 threshold 3 40 41 42 43 44 45 46 47 Gleiches sollte auch noch für die COS Werte geschehen. COS Werte von 0-4 werden auf Queue 2 Threshold 2 verteilt und die übrigen Werte 5-7 auf Queue 1 Threshold 3: mls qos srr-queue output cos-map queue 2 threshold 2 0 1 2 3 4 mls qos srr-queue output cos-map queue 1 threshold 3 5 6 7

- Seite 1 von 15