IT security, FreeBSD, Linux, mail server hardening, post-quantum crypto, DNS, retro computing & hands-on hardware hacks. Privater Tech-Blog seit 2003.

Schlagwort: Maker (Seite 3 von 3)

MacBook Pro GPU-Panic Reparatur: Backofen-Methode im Test

Mir ist vor kurzem ein Apple MacBook Pro (Mitte 2010) in die Hände gefallen. Hardware noch ganz interessant — 8 GB RAM, Core i7, SSD. Aber das Ding hatte den bekannten Bug mit der NVIDIA GeForce GT 330M. Abstürze und Reboots mitten in der Arbeit, und die wurden eher mehr als weniger.

Die Optionen

  1. Apple mit Garantie — anrufen und reparieren lassen.
  2. Apple ohne Garantie — knapp 500 € Reparaturkosten. Lohnt sich bei einem sechs Jahre alten Gerät nicht.
  3. Apple Kulanz — gab es tatsächlich, sogar bis zwei Jahre nach Garantieablauf. Für mein Gerät aber zu spät.
  4. GPU per Software deaktivieren — die NVIDIA Karte abschalten und nur mit der Intel HD Graphics in der CPU leben. Funktioniert, schiebt den endgültigen Tod aber nur auf. Irgendwann startet die Kiste gar nicht mehr.
  5. Backofen.

Backofen?

Klingt bekloppt. Ist es auch — etwas. Die NVIDIA GPU ist als BGA (Ball Grid Array) auf das Logicboard gelötet. Unter Hitze und Vibration brechen mit der Zeit einzelne Lötstellen. Die GPU verliert die Verbindung zum Board — Kernel Panic.

Wenn ich mir mein Gerät genauer anschaue, findet sich vorne links eine beachtliche Delle. Da ist das Teil draufgefallen und das war vermutlich der Anfang vom Ende.

Die Idee: Das Logicboard im Backofen auf eine Temperatur bringen, bei der das Lötzinn weich wird und die Verbindungen sich neu setzen — ein primitiver Reflow. Apple hat sich die Mühe gemacht, alle wichtigen Chips seitlich mit dem Board zu verkleben. Das hält die Chips an Ort und Stelle, während das Lot flüssig wird.

Schritt für Schritt

  1. Logicboard komplett ausbauen — iFixit hat gute Anleitungen dafür.
  2. Backofen auf 200 °C vorheizen. Ober-/Unterhitze, keine Umluft — die Vibrationen des Gebläses können das Board zerstören.
  3. Aus Alufolie kleine Füße formen und in die Bohrungen des Boards stecken. So liegt es nicht direkt auf dem Blech.
  4. Board rein, schwere Chips nach oben. Danach nicht mehr bewegen.
  5. 7 bis 8 Minuten backen.
  6. Ofen abschalten, Tür leicht öffnen, 15–20 Minuten langsam abkühlen lassen. Wenn man das Board mit der Hand greifen kann, ist es kühl genug.
  7. Zusammenbauen, Daumen drücken.

Die Kunststoffbuchsen auf dem Board halten 7 Minuten bei 200 °C aus — die müssen nicht abgedeckt werden.

Hat es funktioniert?

Ja. Überraschenderweise.

Aber — und das muss klar sein — diese Methode ist ein letzter Versuch. Die Erfolgsquote ist gering. Das Flussmittel in den Lötstellen verbrennt beim Erhitzen teilweise, daher funktioniert ein zweiter Durchgang fast nie. Wenn euer MacBook sowieso auf dem Weg in die Tonne ist: probiert es. Wenn ihr noch ernsthaft auf das Gerät angewiesen seid: lasst es.


Der Panic-Log

Für die Suchmaschinen und alle, die den gleichen Fehler haben — hier die relevanten Zeilen aus dem Kernel-Panic-Report:

*** Panic Report ***
panic(cpu 0 caller 0xffffff7f9320abad):
  "GPU Panic: [<None>] 3 3 7f 0 0 0 0 3 :
   NVRM[0/1:0:0]: Read Error 0x00610b94:
   CFG 0xffffffff 0xffffffff 0xffffffff,
   BAR0 0xd2000000 0xffffff912c33d000 0x0a5480a2, D0, P3/4"

System model name: MacBookPro6,2 (Mac-F22586C8)
Mac OS version:    15B42 (El Capitan 10.11.1)

Graphics: NVIDIA GeForce GT 330M, PCIe, 512 MB
Graphics: Intel HD Graphics, Built-In

Kernel Extensions in backtrace:
  com.apple.nvidia.classic.NVDAResmanTesla  10.0
  com.apple.nvidia.classic.NVDANV50HalTesla 10.0
  com.apple.driver.AppleMuxControl          3.11.33b1
  com.apple.iokit.IOGraphicsFamily          2.4.1

Der entscheidende Hinweis: NVRM[0/1:0:0]: Read Error mit CFG 0xffffffff — die CPU kann den Konfigurationsraum der GPU nicht mehr lesen. Die Verbindung ist weg.


Jetzt habe ich hier also so ein komisches MacBook. Der spannende Teil — auseinanderbauen und reparieren — ist erledigt. Was macht man nun damit?

Siehe auch: Parken an der Burg Blankenstein

Fragen? Einfach melden.

Temperatur und Luftfeuchtigkeit mit DHT22 am Raspberry Pi messen

Meine Wetterstation hatte aufgegeben. Wirklich interessiert haben mich aber eh nur Temperatur und Luftfeuchtigkeit draußen. Das sollte ein Raspberry Pi mit einem DHT22 für zwei Euro hinbekommen — und die Daten landen direkt in meinem Cacti.

Update März 2026 — Dieser Beitrag ist von 2014 und einer meiner ältesten hier im Blog. Die Grundidee — DHT22 an den GPIO, Werte per Cron einsammeln, per SNMP an Cacti liefern — funktioniert unverändert. Ich habe den Beitrag komplett überarbeitet und den Software-Teil auf Python aktualisiert. Die ursprünglich verwendete C-Bibliothek wiringPi wurde 2019 vom Autor offline genommen und lol_dht22 wird nicht mehr gepflegt. Der Ansatz selbst ist zeitlos.

Was du brauchst

  • Einen Raspberry Pi — egal welches Modell, solange GPIO-Pins vorhanden sind
  • Einen DHT22 / AM2302 Sensor (2–5 €)
  • Einen 4,7 kΩ Widerstand als Pull-up
  • Drei Kabel

Die Verkabelung ist simpel: VCC an 3,3 V (Pin 1), Data an GPIO 4 (Pin 7), GND an GND (Pin 6). Der 4,7 kΩ Widerstand kommt zwischen VCC und Data. Den handgezeichneten Schaltplan habe ich unten in der Bildergalerie.

Sensor auslesen — Python

Auf einem aktuellen Raspberry Pi OS brauchen wir die Adafruit CircuitPython DHT Bibliothek und libgpiod:

sudo apt install python3-pip libgpiod2
pip3 install adafruit-circuitpython-dht

Dann ein kleines Script /usr/local/bin/read_dht22.py:

#!/usr/bin/env python3
import adafruit_dht
import board
import sys

sensor = adafruit_dht.DHT22(board.D4)
try:
    print(f"{sensor.humidity:.1f}")
    print(f"{sensor.temperature:.1f}")
except RuntimeError:
    sys.exit(1)
finally:
    sensor.exit()

Ausführbar machen und testen:

chmod +x /usr/local/bin/read_dht22.py
/usr/local/bin/read_dht22.py
73.9
9.3

Erste Zeile Luftfeuchtigkeit, zweite Zeile Temperatur. Der DHT22 liefert nicht bei jedem Aufruf saubere Daten — manchmal kommt ein RuntimeError. Das ist normal bei diesem Sensor, deswegen der try/except und der Exit-Code. board.D4 entspricht GPIO 4, also Pin 7 auf dem Board.

Werte per Cron einsammeln

Per Cron-Job jede Minute:

* * * * * /var/scripts/getsensor.sh

Das Script /var/scripts/getsensor.sh:

#!/bin/bash
/usr/local/bin/read_dht22.py > /home/pi/both.txt 2>/dev/null

while [ ! -s "/home/pi/both.txt" ]; do
    sleep 5
    /usr/local/bin/read_dht22.py > /home/pi/both.txt 2>/dev/null
done

sed '2d' /home/pi/both.txt > /home/pi/humid.txt
sed '1d' /home/pi/both.txt > /home/pi/temp.txt

Wenn der Sensor beim ersten Versuch keine Daten liefert, probiert das Script alle fünf Sekunden erneut. Am Ende liegen Luftfeuchtigkeit und Temperatur in separaten Textdateien unter /home/pi/.

Ab in den Cacti — SNMP

Damit Cacti die Werte abfragen kann, brauchen wir SNMP auf dem Pi:

sudo apt install snmpd snmp

In der /etc/snmp/snmpd.conf zwei Pass-through OIDs anlegen. Wird eine dieser OIDs per SNMP abgefragt, führt der snmpd das zugehörige Script aus und liefert dessen Ausgabe als Antwort:

pass .1.3.6.1.2.1.25.1.8.1  /bin/sh  /usr/local/bin/humid
pass .1.3.6.1.2.1.25.1.8.2  /bin/sh  /usr/local/bin/temp

Die beiden Scripts müssen drei Zeilen ausgeben — die OID, den Datentyp und den Wert:

/usr/local/bin/temp:

#!/bin/bash
echo .1.3.6.1.2.1.25.1.8.2
echo gauge
cat /home/pi/temp.txt

/usr/local/bin/humid:

#!/bin/bash
echo .1.3.6.1.2.1.25.1.8.1
echo gauge
cat /home/pi/humid.txt

Test:

snmpget -v2c -c public localhost .1.3.6.1.2.1.25.1.8.1
iso.3.6.1.2.1.25.1.8.1 = Gauge32: 76

snmpget -v2c -c public localhost .1.3.6.1.2.1.25.1.8.2
iso.3.6.1.2.1.25.1.8.2 = Gauge32: 9

Damit lässt sich im Cacti ein Graph anlegen. Etwas von hinten durch die Brust ins Auge — aber es funktioniert seit über elf Jahren zuverlässig. Die Template-Exports für Cacti gibt es hier: cacti-temp.tar.gz


Hinweise

SNMP-Sicherheit — Im Beispiel steht public als Community-String und SNMPv2c. Für ein Heimnetz reicht das. In einem produktiven Umfeld sollte man SNMPv3 mit Authentifizierung verwenden und den Zugriff per Firewall auf den Cacti-Server beschränken.

Alternative zu Cacti — Wer kein Cacti hat: Grafana mit InfluxDB oder Prometheus wäre die modernere Alternative. Der SNMP-Weg funktioniert dort genauso, alternativ kann man die Werte auch direkt per Telegraf oder einen kleinen Python-Exporter einliefern.

Warum kein wiringPi mehr? — Gordon Henderson hat das wiringPi-Repository 2019 offline genommen. Es gibt Forks auf GitHub, die auf neueren Pi-Modellen funktionieren, aber offiziell wird die Bibliothek nicht mehr gepflegt. Für neue Projekte ist Python mit der Adafruit-Bibliothek der bessere Weg — weniger Kompilieraufwand, bessere Fehlerbehandlung und aktive Wartung.


Der Sensor da draußen

Der Sensor muss nach draußen, vor Wasser geschützt sein, aber nicht hermetisch versiegelt — sonst kann er keine Luftfeuchtigkeit messen.

Meine Lösung: Ein PVC-Rohr, den Sensor dort mit etwas Silikon eingeklebt, eine Seite mit Deckel verschlossen. So kann kein Wasser an den Sensor laufen, Luft kommt aber noch ran. Angebracht am Pfosten der Satellitenschüssel — dort oben steht die Luft selten, es kommt niemand ran und es fällt nicht auf.

Das Ding hängt dort seit 2014. Funktioniert.


Siehe auch: Raspberry Pi als Konsolenserver, Stromverbrauch messen mit Raspberry Pi, Eltako DSZ12E und Cacti

Fragen? Einfach melden.

Stromverbrauch messen mit Raspberry Pi, Eltako DSZ12E und Cacti

Siehe auch: Temperatur und Luftfeuchtigkeit mit DHT22 am Raspberry Pi messen

Im Keller hing ein alter Ferraris-Zähler mit Drehscheibe. Zählt brav für den Energieversorger, liefert aber keine Daten. Ich wollte den Stromverbrauch im Haus grafisch auswerten, am besten mit Cacti. Dafür braucht man einen Zähler mit S0-Schnittstelle.

Der Zähler

Mein Energieversorger wollte für einen digitalen Zähler Fantasiepreise. Also selbst kaufen. Die Wahl fiel auf den Eltako DSZ12E-3x80A, einen Drehstromzähler mit S0-Ausgang. 3 × 80 A reicht für den normalen Hausgebrauch locker. Kostenpunkt damals rund 75 Euro.

Wichtig: Dieser Zähler ersetzt nicht den offiziellen Zähler des Versorgers. Er wird dahinter eingebaut. Das darf nicht jeder machen. Wer nicht weiß ob er es darf, darf es nicht. Ein Elektriker braucht dafür eine halbe bis eine Stunde, mit Anfahrt kommt man auf 100 bis 150 Euro.

S0-Schnittstelle und Raspberry Pi

Die S0-Schnittstelle ist ein potentialfreier Impulskontakt. Pro verbrauchter Kilowattstunde gibt der Zähler eine bestimmte Anzahl Impulse aus, beim DSZ12E sind es 2000 Impulse pro kWh. Der Raspberry Pi zählt diese Impulse über einen GPIO-Pin.

Die Verkabelung ist simpel: S0-Ausgang des Zählers an einen GPIO-Pin und GND des Raspberry Pi. Ein Pullup-Widerstand sorgt dafür, dass der Pin sauber zwischen High und Low wechselt. Bei jedem Impuls wird ein Zähler hochgezählt und der aktuelle Verbrauch berechnet.

Die Auswertung habe ich nach dieser Anleitung aufgebaut: Stromzähler mit S0-Schnittstelle vom Raspberry Pi auswerten (Johannes Weber). Ein Python-Script zählt die Impulse und stellt die Werte per SNMP bereit.

Cacti-Graphen

Cacti fragt den Raspberry Pi per SNMP ab und zeichnet die Graphen. Neben dem aktuellen Verbrauch in Watt lassen sich mit zusätzlichen SNMP-Abfragen auch Tagesverbrauch, Wochenverbrauch und Monatsverbrauch darstellen. Die Berechnung macht das Script auf dem Pi, Cacti muss nur die fertigen Werte abgreifen und zeichnen.

Das Ergebnis: Auf einen Blick sieht man wann die Waschmaschine lief, wann der Herd an war und wie hoch die Grundlast nachts ist. Verbrauchsspitzen fallen sofort auf.

Fragen zum Aufbau? Einfach melden.

Raspberry Pi als FM-Radiosender mit PiFM

Kinder sind etwas Wunderbares, so auch meine beiden. Die Größere hört zum Einschlafen gerne ein Hörspiel, beim Spielen hören und tanzen beide zu Kindermusik. Klar haben sie eine kleine Kompaktanlage im Kinderzimmer. Aber Kinderhörspiele gibt es kaum noch auf Kassette — fast nur noch auf CD oder als MP3. Keine Ahnung wie es bei euren Kindern ist, bei uns leben CDs nicht sonderlich lange. Ich grille in der Woche 3 bis 4 Stück. Noch schlimmer: Die Lieblings-CD trifft nach 38 Minuten auf einen Kratzer und macht nur noch unverständlichen Lärm.

MPD als CD-Ersatz

Ich hatte noch einen Raspberry Pi herumliegen. Den zusammen mit dem Music Player Daemon (MPD) als Musikspieler nutzen — die gekauften MP3-Alben liegen eh auf dem Server und lassen sich per NFS mounten. WLAN ist im ganzen Haus, und wir Eltern steuern alles per Android-App. Das Projekt war in anderthalb Stunden erledigt, getestet und von den Kindern abgenommen.

Seitdem fristet der CD-Spieler ein ungenutztes Leben. Nur das Radio läuft hin und wieder am Abend. Radio… irgendwo hatte ich doch im Zusammenhang mit dem Raspberry Pi etwas zu FM-Radio gelesen.

PiFM — FM-Sender über GPIO

PiFM (mittlerweile weiterentwickelt als rpitx) nutzt den GPIO-Pin 4 des Raspberry Pi, um ein FM-Signal zu erzeugen. Eine ca. 15 cm lange Antenne — ein Stück Draht — reicht. Der Pi generiert per DMA ein Taktsignal auf dem GPIO, das direkt als FM-moduliertes HF-Signal abstrahlt. Kein zusätzlicher Sender-IC nötig.

Eine WAV-Datei auf 90,0 MHz senden:

sudo ./pifm musik.wav 90.0

Einen Web-Stream — zum Beispiel einen Kinderradiosender — per sox umwandeln und direkt an PiFM pipen:

sox -t mp3 http://stream-url -t wav -r 22050 -c 1 - | sudo ./pifm - 90.0

MPD kann auch streamen — so lässt sich die gesamte Musikbibliothek per FM ins Kinderzimmerradio schicken.

Verstärkerschaltung

Das reine GPIO-Signal ist schwach. Um es etwas zu verstärken und sauber zu filtern, habe ich eine kleine Schaltung gebaut — den handgezeichneten Schaltplan mit Bauteileliste findet ihr in den Bildern unten. Mit der Schaltung reicht das Signal für das ganze Haus inklusive Garten.

Rechtliches

In Deutschland darf man im FM-Band senden — aber nur mit extrem geringer Leistung. Die Bundesnetzagentur erlaubt ohne Genehmigung Sendeanlagen mit wenigen Nanowatt, was in der Praxis etwa einen Meter Reichweite ergibt. Der Raspberry Pi mit Verstärkerschaltung überschreitet das deutlich. Dieses Projekt bleibt deshalb ein einmaliger Versuchsaufbau.

Schade eigentlich — der WDR-Kinderkanal MausLive (ehemals KiRaKa) ist nur per DAB+ oder Internet-Stream zu empfangen. Per PiFM könnte man den Stream als FM-Signal im Haus verteilen und die Kinder könnten überall mit einem einfachen Radio hören. Aber so ist die Rechtslage.


Bilder vom Projekt — Platine, Schaltplan mit Bauteileliste und das Ergebnis auf dem Radio:

Fragen? Einfach melden.

D-Link DWL-900AP+ aufbohren: Sendeleistung per Lötkolben erhöhen

Vor einiger Zeit hat sich mitten im Download mein Access Point verabschiedet. Ein D-Link DWL-900AP+ Version B. Über das kabelgebundene LAN noch erreichbar, konfigurieren kein Problem. Nur WLAN: tote Hose.

Aufschrauben

Ich bin jemand, der defekte Geräte erstmal aufschraubt. Garantie war durch, also schauen wir mal. Im Access Point war nicht viel zu sehen, bis auf eine Kleinigkeit: Auf der Hauptplatine steckte eine normale PCMCIA-WLAN-Karte. Nicht schön bedruckt, jemand hatte eine externe Antenne an das Kärtchen gelötet, aber es war eindeutig eine PCMCIA-Karte.

Etwas Recherche ergab, dass die verbaute Karte fast baugleich mit der DWL-650+ ist. Und genau so eine lag bei mir im Schrank und staubte ein. Kurz entschlossen reingesteckt und schon ging das WLAN wieder.

Das Antennen-Problem

Zufrieden alles zusammengeschraubt, AP zurück an seinen Platz. Aber die Verbindung war nicht mehr wie früher. Das Signal riss nach kürzerer Entfernung ab, der Datendurchsatz war geschrumpft. Also direkt wieder aufgeschraubt.

Die externe Antenne musste an die neue Karte. Nach einigem nicht sehr professionellem Gefummel hatte ich die Platine meiner DWL-650+ freigelegt. Tatsächlich: eine Buchse für den Antennenanschluss. Die Antenne im AP hatte allerdings keinen Stecker, sondern war aufgelötet. Also Buchse ablöten, Antenne direkt anlöten.

Die Datenblätter

Da ich nun schon das SMD-Besteck auf dem Tisch liegen hatte, schaute ich mir die Bauteile genauer an. Auch vor dem HF-Gehäuse habe ich nicht Halt gemacht. Die Chipbezeichnungen bei Google eingetippt, und zwei Datenblätter fielen mir in die Hände: MAX2242 und RF2948B.

Mit diesen Dokumenten fand ich heraus, dass die Sendeleistung der DWL-650+ über die Spannung am Vorverstärker im RF2948B eingestellt wird. PIN 8 ist ein analoger Eingang: Mehr Spannung bedeutet mehr Sendeleistung. Direkt daneben liegt PIN 7, das ist VCC (etwa 2,7 V). Schließt man PIN 8 mit PIN 7 kurz, sagt man dem Vorverstärker: Arbeite mit maximaler Leistung.

Der Lötpunkt

Der DAC gibt nun einen Strom ab, den er normalerweise nie liefern würde. Der liegt aber unter 1 mA, was an einem Widerstand Richtung DAC liegt. Nicht tödlich für den Chip, er wird nur etwas wärmer. Ich habe 32 bis 38 °C unter Last gemessen, bei 25 °C Umgebungstemperatur.

Der IC gibt seine Wärme nur über die Beinchen und das Kupfer der Platine ab. Im Sommer könnte es im HF-Gehäuse zu Rechenfehlern kommen. Einen Metallkühlkörper kann man im HF-Gehäuse nicht einfach draufsetzen, der könnte die Felder stören. Lösung: Ein Klecks nicht leitende Wärmeleitpaste auf den IC, damit er etwas Kontakt zum Metalldeckel des HF-Gehäuses hat. Da er ohnehin nicht sonderlich warm wird, reicht das.

Ergebnis

Die Konstruktion lief über ein Jahr problemlos. Statt der normalen ~17 dBm kommen nun ~22,5 dBm raus. Ein ordentlicher Gewinn. Die Lötpunkte sind allerdings winzig, man sollte mit dem Lötkolben umgehen können. Und: Die maximal zulässige Sendeleistung beachten. Mit einer guten Antenne dazu bewegt man sich schnell außerhalb des Erlaubten.

RF2948B Chip auf der DWL-650+ Platine
Antennenanschluss auf der DWL-650+ Platine
D-Link DWL-650+ PCMCIA WLAN-Karte
D-Link DWL-900AP+ geöffnet, Blick auf die Hauptplatine
D-Link DWL-900AP+ geöffnet, Detailansicht

Fragen? Einfach melden.

Neuere Beiträge »

© 2026 -=Kernel-Error=-RSS

Theme von Anders NorénHoch ↑