Wohnzimmertisch aus Weinkisten

Heute mal etwas ohne Technik. Wir hatten noch ein paar alte Weinkisten hier rumstehen (ja, wir trinken viel Wein). Damit diese Kisten nicht nur als Deko in der Ecke stehen, habe ich einen Tisch daraus gebaut. Die Weinkisten werden später, auf der Seite liegend, quadratisch angeordnet.

IMG_6835

Dazu benötigt man eine Grundplatte die mit meinen Weinkisten etwa 70×70 cm groß sein musste. Die Weinkisten sind nicht immer gleich groß und evtl. auch etwas krumm. Am besten die Kisten vorher mal auslegen und messen. Ich habe dann beim Schreiner eine einfache Fichtenplatte entsprechend zuschneiden lassen und diese dann mit Lasur gestrichen.

IMG_6834

IMG_6836

Damit der Tisch später auch bewegt werden kann, habe ich ihm 4 Räder spendiert. Welche Räder man nutzt ist geschmacksache. Die gibt es in allen Formen und Farben zu kaufen. Ich habe mich für eine Version mit relativ kleinen Holzrädern und Gummiringen auf der Lauffläche entschieden. Man kann natürlich auch großen Rollen nehmen, wie man sie z.B. von Krankenhausbetten kennt. Die Räder hab ich einfach mit kurzen Holzschrauben an die Ecken mit jeweils etwa 5cm Abstand an die Platte geschraubt.

IMG_6839

Dann werden die Kisten auf dem Brett ausgerichtet und mit dem Boden von oben verschraubt. Ich habe die Kisten untereinander auch noch mit der ein oder anderen Schraube verschraubt. Oben drauf kommt eine 8mm Glasplatte (ESG) mit abgerundeten Ecken vom Schreiner. Diese habe ich mit Korkplättchen einfach auf die Kisten gelegt. Fertig ist der neue (rustikale) Wohnzimmertisch.

IMG_6842

Viel Spaß beim bauen!

Gruß
Chris

Wortuhr – Stromverbrauch

Ich habe mal den Stromverbrauch meiner Wortuhr über einige Tage gemessen und das Ergebnis graphisch dargestellt.

Bei der gemessenen Wortuhr nutze ich die Platine von Elmotex, das Netzteil MW 3N06GS und die LED´s LED 5-05000 WS von Reichelt.

Stromverbrauch Wortuhr

Ich war überrascht, dass der Verbrauch doch relativ gering ist. Im Mittel etwa 0,45 Watt. Die LED´s schalte ich per Software zwischen 01:00 und 06:00 Uhr aus was auch in dem Graph zu sehen ist.

 

Gruß

Chris

M-BUS – Wasserzähler

Von einem Freund habe ich einen M-Bus (Meter-Bus) Wasserzähler und einen Wärmemengenzähler bekommen. Der M-BUS ist ein Feldbus der über eine Zweidrahtleitung über sehr lange Strecken genutzt werden kann. Ein M-BUS Master fragt dabei alle Slaves im Strang oder Stern ab. Die Slaves werden teilweise vom M-Bus-Master mit Spannung versorgt. Mehr Details im Wiki.

Techem Wärmemengenzähler Techem Wasserzähler

Der M-Bus-Master sollte in meinem Fall aus dem Raspberry und einem Pegelwandler bestehen. Pegelwandler gibt es fertig von verschiedenen Herstellen (Relay, Wachendorff). Diese sind aber, je nachdem für wieviele Slaves sie ausgelegt sind, relativ teuer.

Mein erster Ansatz war daher der Selbstbau eines Pegelwandlers inkl. RS232-Schnittstelle zum Anschluss an den Raspberry Pi. Im Netz gibt es verschiedene Beschreibungen einer einfachen Schaltung und einige wenige Forumseinträge die sich mit dem Selbstbau eines Pegelwandlers bzw. generell mit M-Bus beschäftigen. Leider habe ich in keinem Forum eine Diskussion gefunden die bis zu einem funktionierenden System verfolgt wurde. Egal, ich habe es trotzdem mal versucht…

 

Selbstbau Pegelwandler

Auf der Platine ist der Pegelwandler inkl. einer RSA232 Schnittstelle die aus einem MAX3232 besteht. Die +/-15 Volt für den Pegelwandler habe ich mittels DCDC-Wandler IH0515S der Fa. XP Power erzeugt. Dieses Bauteil kann man z.B. bei Farnell beziehen. Dann das Ganze auf Lochraster zusammen gelötet und mit dem Raspi und dem Wärmemengenzähler verbunden.

IMG_7707 IMG_7708

max3232Lochrasterplan

Damit der Raspberry das M-Bus Protokoll versteht bzw. auch den Pegelwandler korrekt anspricht, habe ich die Bibliotheken von rSCADA genutzt. Die Quellen liessen sich problemlos auf dem Raspberry kompilieren. Im Ergebnis wurden verschiedene Binaries erzeugt um mit Slaves im Bus zu kommunizieren.

Meine ersten Versuche waren jedoch nicht von Erfolg gekrönt. Es wurde kein M-Bus-Gerät gefunden. Bei der Fehlersuche habe ich zuerst die serielle Schnittstelle separat getestet und mit Minicom über den Raspberry mit einem anderen Linux-Rechner kommuniziert. Das hat funktioniert. Die weitere Fehlersuche z.B. am M-Bus-Ausgang sind allerdings am fehlenden Oszilloskop gescheitert, da das Multimeter mich nicht wirklich weiter brachte.

Etwas niedergeschlagen habe ich dann nach drei Tagen erfolgloser Fehlersuche nochmal nach fertigen Pegelwandlern gesucht und ein relativ preiswertes Gerät gefunden und kurzerhand gekauft. Damit fiel die Fehlerquelle „Pegelwandler“ schon mal weg.

 

Versuch mit gekauftem Pegelwandler

Der neue Pegelwandler benötigt zum Anschluss an den Raspberry Pi auch eine RS232 Schnittstelle. Um mir diesmal das Löten zu ersparen, hab ich erstmal den kompletten Versuchsaufbau auf einem Breadboard gesteckt. Der Pegelwandler läuft mit einer Spannung von 12-24 V DC weshalb ich den DCDC-Wandler aus dem ersten Versich auch nicht benötige.

IMG_7739

Die Binaries von rSCADA unterscheiden zwischen TCP- und seriell angeschlossenen M-Bus-Pegelwandlern. Da meiner seriell angeschlossen ist, benutze ich „mbus-serial-scan“ um nach angeschlossenen Slaves im Bus zu suchen.
Als Argumente übergebe ich „-d“ für den Debugmodus, „-b 2400“ um 2400 Baud zu nutzen und „/dev/ttyAMA0“ als serielle Schnittstelle des Pi.

Zu meiner Überraschung wurde direkt ein Slave (der Wasserzähler) erkannt. Sehr schön…

pi@raspberry2 ~/libmbus-0.8.0/bin $ ./mbus-serial-scan -d -b 2400 /dev/ttyAMA0
Scanning primary addresses:
0 [2014-12-13 13:59:21] SEND (005): 10 40 00 40 16
[2014-12-13 13:59:21] RECV (001): E5

Found a M-Bus device at address 0
1 [2014-12-13 13:59:22] SEND (005): 10 40 01 41 16
2 [2014-12-13 13:59:22] SEND (005): 10 40 02 42 16
3 [2014-12-13 13:59:22] SEND (005): 10 40 03 43 16
4 [2014-12-13 13:59:22] SEND (005): 10 40 04 44 16
5 [2014-12-13 13:59:23] SEND (005): 10 40 05 45 16
6 [2014-12-13 13:59:23] SEND (005): 10 40 06 46 16
7 [2014-12-13 13:59:23] SEND (005): 10 40 07 47 16
...

Hat man alle angeschlossenen M-Bus-Geräte per Scan identifiziert, können mit einem weiteren Programm die Daten des Gerätes ausgelesen werden. Auch hier gibt es wieder das Argument „-d“ für den Debugmodus, „-b“ zur Einstellung der Baudrate, das Device der seriellen Schnittstelle und die vom Scan ermittelte Device-Nummer. Im Fall meines Wasserzählers ist das die „0“. Die Daten der Slaves werden in einer einfachen XML-Struktur zurück geliefert.

./mbus-serial-request-data -d -b 2400 /dev/ttyAMA0 0
[2014-12-13 14:06:46] SEND (005): 10 5B 00 5B 16
[2014-12-13 14:06:47] RECV (084): 68 4E 4E 68 08 00 72 12 37 16 46 68 50 49 07 B6 00 00 00 0C 14 53 42 00 00 8C 10 12 35 53 42 00 0B 3B 00 00 00 8C 20 14 53 42 00 00 8C 30 14 00 00 00 00 04 6D 21 0F CD 1C 4C 14 02 00 00 00 42 6C BF 1C 42 EC 7E DF 1C 0A 92 2A 00 10 0A 92 2B 00 10 3E 16
mbus_frame_print: Dumping M-Bus frame [type 4, 84 bytes]: 68 4E 4E 68 08 00 72 12 37 16 46 68 50 49 07 B6 00 00 00 0C 14 53 42 00 00 8C 10 12 35 53 42 00 0B 3B 00 00 00 8C 20 14 53 42 00 00 8C 30 14 00 00 00 00 04 6D 21 0F CD 1C 4C 14 02 00 00 00 42 6C BF 1C 42 EC 7E DF 1C 0A 92 2A 00 10 0A 92 2B 00 10 3E 16



46163712
TCH
73

Water
182
00
0000



Instantaneous value
Volume (1e-2  m^3)
4253
2014-12-13T14:06:47



Instantaneous value
Volume (1e-4  m^3)
425335
2014-12-13T14:06:47

...

Da es auf Anhieb funktioniert hat, habe ich die serielle Schnittstelle auf Lochraster gebannt und der Pegelwandler wird mittels kleinem 12V-Netzteil betrieben. Dann Raspberry Pi, Pegelwandler und Platine im Netzwerkschrank verstauen…

MAX3232

 

Software

Den Stand des Wasserzählers protokolliere ich nun einmal täglich um 23:59 Uhr. Das wird per Cronjob und einem kleinen PHP-Script erledigt. Warum PHP? Weil ich zu ungeduldig war und das schnell umsetzen wollte und schon das ein oder andere ähnliche PHP-Script fertig hatte.

Das Script ruft das Binary wie oben erklärt per shell_exec auf. Ab dem XML-Teil parse ich die Ausgabe und extrahiere die relevanten Informationen die dann in eine MySQL-Tabelle geschrieben werden.

[cc lang=“php“]
‚));
$xmloutput = new SimpleXMLElement($xmloutput);
$zaehlerID=$xmloutput->SlaveInformation->Id;
$zaehlerStand=$xmloutput->DataRecord[1]->Value/10000;

$mysqlhost=““;
$mysqluser=““;
$mysqlpwd=““;
$connection=mysql_connect($mysqlhost,$mysqluser,$mysqlpwd) or die („Verbindungsversuch fehlgeschlagen“);
$mysqldb=““;
mysql_select_db($mysqldb,$connection) or die(„Konnte die Datenbank nicht waehlen.“);
$sql = „INSERT INTO wasserzaehler (timestamp,zaehlerid,zaehlerstand) VALUES (CURRENT_TIMESTAMP,$zaehlerID,$zaehlerStand)“;
$query = mysql_query($sql) or die(„Anfrage 1 nicht erfolgreich“);
?>;
[/cc]

Da ich auf meiner Webseite aber nicht nur den absoluten Wasserverbrauch darstellen möchte sondern auch den Tagesverbrauch, kommt folgendes SQL zum Einsatz. Hier werden die Einträge aus zwei aufeinanderfolgenden Zeilen subtrahiert um die Differenz zum Vortag zu bestimmen.

SELECT 
    CASE DATE_FORMAT(wz1.timestamp,'%w')
	WHEN 0 THEN 'Sonntag'
	WHEN 1 THEN 'Montag'
	WHEN 2 THEN 'Dienstag'
	WHEN 3 THEN 'Mittwoch'
	WHEN 4 THEN 'Donnerstag'
	WHEN 5 THEN 'Freitag'
	WHEN 6 THEN 'Samstag'
    ELSE 'fehler' END,
	wz1.zaehlerstand - IFNULL(wz2.zaehlerstand, 0) AS verbrauch
    FROM wasserzaehler wz1
    LEFT JOIN wasserzaehler wz2
    ON wz2.timestamp = (
	SELECT MAX(timestamp)
	FROM wasserzaehler wz3
	WHERE wz3.timestamp < wz1.timestamp
   )
ORDER BY wz1.timestamp

Das Ergbnis sieht dann wie folgt aus. Ich war etwas erschreckt wieviel Wasser man an machen Tagen verbraucht!

wasserzaehler_screenshot

 

Selbstgebauter Pegelwandler

Da ich ja nun weiß das es generell funktioniert und der Fehler meiner ersten Lösung definitiv im selbstgebauten Pegelwandler liegt, werde ich den Versuch mit dem Selbstbau demnächst nochmal angehen.

 

Sobald der Wärmemengenzähler in den Wasserlauf des Kachelofens eingebaut ist, werde ich nochmal einen kurzen Beitrag schreiben. Das Prinzip des Auslesens ist ja analog zum Wasserzähler aber vielleicht gibt es in den zurückgelieferten Daten unterschiede.

 

Viel Spaß mit dem M-Bus!

Chris

Stabiler 24/7 Betrieb des Raspberry – Netzwerk neu starten

Zum Thema stabiler 24/7-Betrieb des Raspberry PI´s gibt es viele gute Blogeinträge die sich mit dem richtigen Netzteil, dem korrektem Umgang von Linux mit der SD-Karte, evtl. Hitzeprobleme und Netzwerkproblemen aufgrund zu hoher Last beschäftigen.

Siehe z.B.: hier oder hier

Unter anderem wird auch immer wieder der Hardware-Watchdog des PI genannt. Diesen Watchdog hab ich auch aktiviert, da ich in der Vergangenheit immer wieder Probleme mit dem Netzwerk (Stichwort smsc95xx errors und weiterführende Links) hatte. Dies äusserte sich immer wieder mit dem Einfrieren des PI. Der Watchdog machte im Fehlerfall einen Restart und gut war. Nach den letzten Firmwareupdates hat sich die Frequenz der Restarts auch stark verringert.

Dann aber war mein Raspi plötzlich per SSH nicht mehr erreichbar und auch die Webseite wurde nicht mehr angezeigt. Seltsamerweise erfolgte kein Neustart durch den Watchdog. Da ich den Raspi Headless betreibe, blieb mir nicht viel anderes übrig als ihn einfach vom Strom zu trennen und wieder anzuschliessen. Danach lief alles wieder einwandfrei. Leider häuften sich diese Probleme so das es mir zu nervig wurde, ständig den Strom zu kappen. Schliesslich ist mein Raspi ja ein Server und soll gescheit laufen.

Nach den Neustarts ist mir aber auch aufgefallen, das die Daten der Leseköpfe lückenlos in die Datenbank geschrieben wurden. Anscheind lief der Raspi noch und nur das Netzwerk war nicht verfügbar.

Das Problem war teilweise im Message-Log zu sehen:


Nov 22 12:51:10 raspberrypi kernel: [1279051.095475] usb 1-1: USB disconnect, device number 10
Nov 22 12:51:10 raspberrypi kernel: [1279051.095493] usb 1-1.1: USB disconnect, device number 11
Nov 22 12:51:10 raspberrypi kernel: [1279051.095887] smsc95xx 1-1.1:1.0 eth0: unregister 'smsc95xx' usb-bcm2708_usb-1.1, smsc95xx USB 2.0 Ethernet
Nov 22 12:51:10 raspberrypi kernel: [1279051.095954] smsc95xx 1-1.1:1.0 eth0: hardware isn't capable of remote wakeup
Nov 22 12:51:10 raspberrypi kernel: [1279051.136136] usb 1-1.2: USB disconnect, device number 12
Nov 22 12:51:10 raspberrypi kernel: [1279051.136650] cp210x ttyUSB0: cp210x converter now disconnected from ttyUSB0
Nov 22 12:51:10 raspberrypi kernel: [1279051.136748] cp210x 1-1.2:1.0: device disconnected
Nov 22 12:51:10 raspberrypi kernel: [1279051.137275] usb 1-1.3: USB disconnect, device number 13
Nov 22 12:51:10 raspberrypi kernel: [1279051.137769] ftdi_sio ttyUSB1: FTDI USB Serial Device converter now disconnected from ttyUSB1
Nov 22 12:51:10 raspberrypi kernel: [1279051.137876] ftdi_sio 1-1.3:1.0: device disconnected
Nov 22 12:51:10 raspberrypi kernel: [1279051.295583] Indeed it is in host mode hprt0 = 00021501
Nov 22 12:51:11 raspberrypi kernel: [1279051.575374] usb 1-1: new full-speed USB device number 14 using dwc_otg
Nov 22 12:51:11 raspberrypi kernel: [1279051.575636] Indeed it is in host mode hprt0 = 00021501
Nov 22 12:51:11 raspberrypi kernel: [1279051.825598] usb 1-1: not running at top speed; connect to a high speed hub
Nov 22 12:51:11 raspberrypi kernel: [1279051.825950] usb 1-1: New USB device found, idVendor=0424, idProduct=9512
Nov 22 12:51:11 raspberrypi kernel: [1279051.825971] usb 1-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
Nov 22 12:51:11 raspberrypi kernel: [1279051.836520] hub 1-1:1.0: USB hub found
Nov 22 12:51:11 raspberrypi kernel: [1279051.836765] hub 1-1:1.0: 3 ports detected
Nov 22 12:51:11 raspberrypi kernel: [1279052.115374] usb 1-1.1: new full-speed USB device number 15 using dwc_otg
Nov 22 12:51:11 raspberrypi kernel: [1279052.215553] usb 1-1.1: not running at top speed; connect to a high speed hub
Nov 22 12:51:11 raspberrypi kernel: [1279052.215947] usb 1-1.1: New USB device found, idVendor=0424, idProduct=ec00
Nov 22 12:51:11 raspberrypi kernel: [1279052.215973] usb 1-1.1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
Nov 22 12:51:11 raspberrypi kernel: [1279052.219107] smsc95xx v1.0.4
Nov 22 12:51:11 raspberrypi kernel: [1279052.280966] smsc95xx 1-1.1:1.0 eth0: register 'smsc95xx' at usb-bcm2708_usb-1.1, smsc95xx USB 2.0 Ethernet, b8:27:eb:bd:01:0b
Nov 22 12:51:12 raspberrypi kernel: [1279052.375552] usb 1-1.2: new full-speed USB device number 16 using dwc_otg
Nov 22 12:51:12 raspberrypi kernel: [1279052.477284] usb 1-1.2: New USB device found, idVendor=10c4, idProduct=ea60
Nov 22 12:51:12 raspberrypi kernel: [1279052.477318] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Nov 22 12:51:12 raspberrypi kernel: [1279052.477334] usb 1-1.2: Product: CP2104 USB to UART Bridge Controller
Nov 22 12:51:12 raspberrypi kernel: [1279052.477349] usb 1-1.2: Manufacturer: Silicon Labs
Nov 22 12:51:12 raspberrypi kernel: [1279052.477362] usb 1-1.2: SerialNumber: 0065B522
Nov 22 12:51:12 raspberrypi kernel: [1279052.479039] cp210x 1-1.2:1.0: cp210x converter detected
Nov 22 12:51:12 raspberrypi kernel: [1279052.479519] usb 1-1.2: cp210x converter now attached to ttyUSB0
Nov 22 12:51:12 raspberrypi kernel: [1279052.491197] smsc95xx 1-1.1:1.0 eth0: hardware isn't capable of remote wakeup
Nov 22 12:51:12 raspberrypi kernel: [1279052.535606] smsc95xx 1-1.1:1.0 eth0: hardware isn't capable of remote wakeup
Nov 22 12:51:12 raspberrypi kernel: [1279052.555550] usb 1-1.3: new full-speed USB device number 17 using dwc_otg
Nov 22 12:51:12 raspberrypi kernel: [1279052.640093] smsc95xx 1-1.1:1.0 eth0: hardware isn't capable of remote wakeup
Nov 22 12:51:12 raspberrypi kernel: [1279052.661511] usb 1-1.3: New USB device found, idVendor=0403, idProduct=6001
Nov 22 12:51:12 raspberrypi kernel: [1279052.661547] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Nov 22 12:51:12 raspberrypi kernel: [1279052.661563] usb 1-1.3: Product: FT232R USB UART
Nov 22 12:51:12 raspberrypi kernel: [1279052.661577] usb 1-1.3: Manufacturer: FTDI
Nov 22 12:51:12 raspberrypi kernel: [1279052.661590] usb 1-1.3: SerialNumber: A4009G5A
Nov 22 12:51:12 raspberrypi kernel: [1279052.664914] ftdi_sio 1-1.3:1.0: FTDI USB Serial Device converter detected
Nov 22 12:51:12 raspberrypi kernel: [1279052.665117] usb 1-1.3: Detected FT232RL
Nov 22 12:51:12 raspberrypi kernel: [1279052.665314] usb 1-1.3: Number of endpoints 2
Nov 22 12:51:12 raspberrypi kernel: [1279052.665337] usb 1-1.3: Endpoint 1 MaxPacketSize 64
Nov 22 12:51:12 raspberrypi kernel: [1279052.665353] usb 1-1.3: Endpoint 2 MaxPacketSize 64
Nov 22 12:51:12 raspberrypi kernel: [1279052.665367] usb 1-1.3: Setting MaxPacketSize 64
Nov 22 12:51:12 raspberrypi kernel: [1279052.667714] usb 1-1.3: FTDI USB Serial Device converter now attached to ttyUSB1
Nov 22 12:51:13 raspberrypi kernel: [1279054.248030] smsc95xx 1-1.1:1.0 eth0: link up, 100Mbps, full-duplex, lpa 0xC5E1

An dem Raspi hängt der Lesekopf für den Stromzähler und für die Heizung. Der Raspi scheint die USB-Ports aus irgendwelchen Gründen unmotiviert neu zu starten. Das funktioniert für die USB-Ports immer erfolgreich, aber das Netzwerk blieb dabei gelegentlich auf der Strecke (obwohl in der letzten Zeile gegenteiliges behauptet wird). Das hängt anscheinend immer noch mit Fehlern im smsc95xx zusammen.

Neustart des Netzwerkinterfaces

Nun gut…dann muss das Netzwerk halt nochmal gestartet werden. Folgendes Bash-Script rufe ich alle 10 Minuten per Cron auf. Ist das Netzwerk verfügbar, passiert nichts. Ist das Netzwerk nicht verfügbar wird versucht des Interface neu zu starten. Gelingt auch das nicht, wird der Raspi rebootet. Mittels logger wird der Neustart in /var/log/messages geloggt.

[cc lang=“bash“ lines=“40″]
#!/bin/sh
IP_TO_TEST=“
PING_COUNT=1
PING=“/bin/ping“
IFUP=“/sbin/ifup“
IFDOWN=“/sbin/ifdown –force“
INTERFACE=“eth0″ #Device angeben welches geprüft werden soll
LOCKF=“/opt/lockf“
$PING -c $PING_COUNT $IP_TO_TEST > /dev/null 2> /dev/null
if [ $? -ge 1 ]
then
logger „$INTERFACE scheint unten zu sein, versuche restart…“
if [ -e $LOCKF]
then
logger „$INTERFACE immer noch unten, NEUSTART…“
rm -f $LOCKF 2>/dev/null
sudo reboot
else
touch $LOCKF
logger $(sudo $IFDOWN $INTERFACE)
sleep 10
logger $(sudo $IFUP $INTERFACE)
fi
else
#logger „$INTERFACE laueft“
rm -f $LOCKF 2>/dev/null
fi
[/cc]

Im Log sieht man dann den erfolgreichen Neustart des Netzwerkinterfaces durch das obige Bach-Script.


Nov 22 12:51:12 raspberrypi kernel: [1279052.665353] usb 1-1.3: Endpoint 2 MaxPacketSize 64
Nov 22 12:51:12 raspberrypi kernel: [1279052.665367] usb 1-1.3: Setting MaxPacketSize 64
Nov 22 12:51:12 raspberrypi kernel: [1279052.667714] usb 1-1.3: FTDI USB Serial Device converter now attached to ttyUSB1
Nov 22 12:51:13 raspberrypi kernel: [1279054.248030] smsc95xx 1-1.1:1.0 eth0: link up, 100Mbps, full-duplex, lpa 0xC5E1
Nov 22 13:00:02 raspberrypi logger: eth0 scheint unten zu sein, versuche restart...
Nov 22 13:00:09 raspberrypi kernel: [1279589.925658] smsc95xx 1-1.1:1.0 eth0: hardware isn't capable of remote wakeup
Nov 22 13:00:09 raspberrypi kernel: [1279590.124240] smsc95xx 1-1.1:1.0 eth0: hardware isn't capable of remote wakeup
Nov 22 13:00:09 raspberrypi logger: Stopping NTP server: ntpd. Starting NTP server: ntpd.
Nov 22 13:00:11 raspberrypi kernel: [1279591.726167] smsc95xx 1-1.1:1.0 eth0: link up, 100Mbps, full-duplex, lpa 0xC5E1
Nov 22 13:00:32 raspberrypi logger: Stopping NTP server: ntpd. Starting NTP server: ntpd.

Seitdem läuft mein PI seit 16 Tagen durch. Mal sehen wie lange er ohne Neustart durchhält!

Gruß
Chris

Gaszähler auslesen

Nachdem meine Versuche den M-BUS Wärmemengen- und Wasserzähler auszulesen vorerst beendet sind und ich auf den bestellten M-BUS-Pegelwandler warte, habe ich mich dem Auslesen des Gaszählers gewidmet. Das sollte erfolgsversprechender sein…

Als ich dann endlich den vor langer Zeit bestellten Reed-Kontakt mk 471 b (z.B. bei Reichelt) wieder gefunden habe, konnte es losgehen.

Der Gaszähler hat an der letzten Stelle des Zählwerkes bei der „0“ einen Magneten wodurch der Reedkontakt bei jeder vollen Umdrehung einmal geschlossen wird. Diese Impulse gilt es mit einem Raspberry über einen GPIO zu zählen.

IMG_7735

Den Reedkontakt habe ich natürlich wieder professionell mit Klebeband fixiert…hält!

IMG_7734

Angeschlossen ist der Reedkontakt über eine Zwillingslitze direkt an einen GPIO und Ground des Raspberry PI. Pull-Up braucht es keinen. Dieser wird per Software aktiviert.

Den GPIO lese ich mit einem Python-Script aus welches in einer Endlosschleife ausgeführt wird und den GPIO (im Beispiel Pin „21“) jede Sekunde abfragt. Sekundenweise sollte reichen, da ich nicht hoffe das unser Gaszähler so schnell läuft. Immer wenn der Reed geschlossen wird, wird eine „1“ und der Zeitstempel in die Spalten „timestamp“ und „zaehlerstand“ einer MySQL-Tabelle geschrieben. Das passiert immer nur beim Wechsel des Reed von „Offen“ nach „Geschlossen“. Sollte der Zähler genau mit dem Magnet am Reed stehen bleiben, passiert nichts.

[cc lang=“python“]

import RPi.GPIO as GPIO
import time
import MySQLdb

GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)

# GPIO definieren
REED_gas = 21
# definierten GPIO als Eingang setzen
GPIO.setup(REED_gas, GPIO.IN, pull_up_down=GPIO.PUD_UP)

status_alt=1
while True:
status_aktuell = GPIO.input(REED_gas)
# REEDKONTAKT geoeffnet
if status_aktuell == 1:
#print „Kontakt offen“
status_alt=GPIO.input(REED_gas)
# REEDKONTAKT geschlossen
elif status_aktuell==0:
#print „Kontakt geschlossen“
if status_alt!=status_aktuell:
status_alt=GPIO.input(REED_gas)
# Datenbankverbindung
db = MySQLdb.connect(host=“„, user=“„, passwd=“„, db=“„)
# Impuls in Datenbank eintragen
cursor = db.cursor()
cursor.execute(„““INSERT INTO gaszaehler (timestamp,zaehlerstand) VALUES (CURRENT_TIMESTAMP,1)“““)
db.commit()
cursor.close()
time.sleep(1)
[/cc]

IMG_7737

Da das Python-Script sich ab und an mal verabschiedet, starte ich es per Cronjob wieder neu falls der Prozess nicht mehr vorhanden ist. Ich sollte vielleicht lieber das Problem im Python-Script suchen und das ein oder andere Try&Catch einbauen, aber es geht auch erstmal so…

#!/bin/sh
if ps -ef | grep -v grep | grep gaszaehler.py ; then
    exit 0
else
    sudo python /usr/local/bin/gaszaehler.py &
    logger "gaszaehler.py neu gestartet"
    exit 0
fi

Zur Auswertung benutze ich dann folgende SQL-Querys:

SELECT sum(zaehlerstand) FROM gaszaehler

Hiermit werden alle gespeicherten „Ticks“ summiert. Dazu muss noch ein Startwert addiert werden da der Gaszähler ja schon eine zeitlang lief.
Dieser Startwert muss ggf. ab und an mal korrigiert werden falls der Raspi mal einen Umlauf des Zählers nicht mitbekommt weil z.B. der unwahrscheinliche Fall eintritt, dass das Klebeband nicht gehalten hat oder wahrscheinlicher, das Python-Script bzw. der ganze Raspi nicht mehr läuft. Den Startwert gebe ich als eine Zahl inkl. der drei Nachkommastellen an und addiere das Ergebnis der SQL-Query dazu. Um die richtige „Einheit“ kümmere ich mich in der Ausgabe auf der PHP-Seite mit folgender PHP-Zeile:

[cc lang=“php“]
$sql = „SELECT sum(zaehlerstand) FROM gaszaehler“;
$query = mysql_query($sql) or die(„Anfrage nicht erfolgreich“);
while ($wert = mysql_fetch_array($query)) {
$gesamtwert=($wert[0]*10)+$gas_startwert;
}
$gesamtwert=substr($gesamtwert,0,-3).“.“.substr($gesamtwert,-3,2);
[/cc]

Der Faktor 10 muss hier beachtet werden, da ja nur alle 0,01m³ Impulse gezählt werden und ich den Startwert mit allen drei Nachkommastellen angegeben habe. Die zweite Zeile setzt das Komma in der Ausgabe an die richtige Stelle.

Eine tägliche Auswertung funktioniert z.B. mit folgender SQL-Query:

SELECT CASE DATE_FORMAT(timestamp,'%w')
          WHEN 0 THEN 'Sonntag'
          WHEN 1 THEN 'Montag'
          WHEN 2 THEN 'Dienstag'
          WHEN 3 THEN 'Mittwoch'
          WHEN 4 THEN 'Donnerstag'
          WHEN 5 THEN 'Freitag'
          WHEN 6 THEN 'Samstag'
          ELSE 'fehler' END,
          sum(zaehlerstand)
FROM gaszaehler
WHERE DATE(timestamp)>=DATE_SUB(NOW(),INTERVAL 7 DAY)
GROUP BY day(timestamp)
ORDER BY timestamp

Auch hier bekommt man den korrekten Wert in m³ durch einfache Kommaverschieberei in der Ausgabe. Den Faktor 10 benötigt man bei der täglichen Auswertung nicht:

[cc lang=“php“]substr(($wert[1]),0,-2).“.“.substr(($wert[1]),-2)[/cc]

In der Webseite sieht das folgendermaßen aus:

gaszaehler_screenshot

Das alles läuft erst drei Tage und es gibt bestimmt noch Verbesserungspotential aber ein Anfang ist gemacht.

Gruß
Chris

Wohnzimmer PC

Wer kennt das nicht: Die Musik landet heutzutage auf Handys und Festplatten und der gute alte CD-Player geht in Rente. Die Hersteller bietet verschiedene Lösungen an um MP3 & Co. im Wohnzimmer abzuspielen z.B. mit dem Handy und Bluetooth-Lautsprecher aber das finde ich alles nicht wirklich brauchbar und zu unflexibel.

Ein kleiner Media-PC für´s Wohnzimmer musste her. Meine Wahl fiel auf einen Zotac ZBOX ID41. Das ist nicht mehr der neuste Rechner, dafür aber relativ preiswert und von der Leistung völlig ausreichend für meine Zwecke. Alternativen mit diesem Formfaktor gibt es aber aktuell viele…von Zotac, die Intel NUCs und andere…

zbox

Der Rechner hat einen 1,8 GHz Atom mit 512 MB Hautpspeicher, eine nvidia Grafikkarte und jede Menge Schnittstellen. Als Betriebssystem habe ich ein Ubuntu 14.04 LTS installiert. Als Mediacenter kommt XBMC (demnächst „Kodi“) in der Version aktuell „13.2 Gotham“ zum Einsatz.

Die Steuerung des Rechners geschieht über einen rahmenlosen 19″ Touchscreen von ELO den ich günstig in der Bucht gesteigert habe. Der Touchscreen sollte in die Wand eingelassen werden, der Rechner sollte irgendwo hinter der Couch verschwinden.

Unser Hausbau kam gelegen um alles ordentlich im Wohnzimmer zu integrieren. Oben links im Bild ist die Ausparung für den Monitor. Per Kabelkanal geht es an eine Ausgangsdose die später hinter der Coach ist. In den Kabelkanal kommt ein DVI-Kabel, ein USB-Kabel für den Touchscreen und ein Steuerkabel um bei dem ELO-Monitor das externe Bedienelement für Helligkeit, Kontrast etc. bei Bedarf anschliessen zu können.

IMG_1756

Den Monitor habe ich mit einem ausgeschnittenen Alu-Rahmen verschraubt den ich den Verputzern als Maß für die Ausparung gegeben hatte. das Netzteil des Monitors habe ich hinter dem Monitor in einer extra Vertiefung verstaut.

IMG_1832

Durch das dicke Leerrohr am Boden kamen ein HDMI-Kabel für den Fernsehanschluss (der ist in der Ecke wo das Abflussrohr steht), und ein mit 10m relativ langes optisches TOS-Link-Kabel welches aber problemlos funktioniert.

IMG_1834

Der Alu-Ramen inkl. Monitor habe ich mit Montagekleber in die Aussparung geklebt. Das hält sehr gut, ich bekomme es aber auch wieder (mit etwas Gewalt) ab.

Fertig eingebaut schaut das Ganze dann so aus. Um den Halterahmen zu verdecken ist um den Monitor ein weißer Alurahmen der mit doppelseitigem Klebeband befestigt ist. Für beide Rahmen nochmal vielen Dank an Ingo für das Schneiden mit dem Waterjet:-)

xbmc1

Der Rechners startet direkt per Autostart ins XBMC. Die Daten (Bilder, Musik, Videos) liegen auf einem NAS im Keller. Als Skin für den XBMC kommt der Touchscreen-freundliche „Joggler“ zum Einsatz. Ohne Tastatur geht es leider nicht immer daher hängt eine sehr kleine Bluetooth-Tastatur von Keysonic (KSK-3200 RF) mit integriertem Trackball dran.

xbmc2

XBMC zeigt nach wenigen Minuten ohne Touch und weitere Eingaben eine Diashow als „Bildschirmschoner“ mittels entsprechendem Slideshow-Plugin. Nach einer Stunde geht der Monitor in Standby.

Leider unterstützt XBMC (noch) keine vernünftige Dualscreen-Lösung so das ich Filme per VLC, etc. direkt aus dem Ubuntu schaue.

Da der Rechner fast immer läuft wenn jemand Zuhause ist, bietet er sich auch für die Startseite der Hausautomatisierung im Browser-Vollbildmodus an.

Gruß

Chris

 

 

 

Wortuhr Bildschirmschoner

Die Fa. BSH Bosch und Siemens Hausgeräte GmbH (Fabrik Giengen Kälte) projiziert nach ihrer Kantinenrenovierung meinen Wortuhr-Bildschirmschoner per Beamer an eine Wand.

Eine schöne Möglichkeit den manchmal stressigen Alltag etwas zu entschleunigen und mal nicht auf die Minuten zu schauen…

kantine

Download Wortuhr ScreenSaver

Weiterhin viel Spaß mit dem Bildschirmschoner!

Gruß
Chris

Raspberry Pi in Watchdog-Loop

Da der Raspi bei mir durch die oft beschriebenen Probleme mit dem smsc95xx relativ wacklig auf dem Netzwerk und den beiden USB-Ports ist und dadurch in unregelmäßigen Abständen unmotiviert die Arbeit einstellt, hatte ich den Hardware-Watchdog des Raspi aktiviert. Dieser veranlasst in meinem Fall einen Neustart des Systems wenn länger als 15 Minuten nichts mehr in eine bestimmte Datei geschrieben wird. Wie die Einrichtung des Watchdog genau funktioniert, ist z.B. hier beschrieben.

Diese Woche war es nun plötzlich so, das der Raspi in einer Endlosschleife bootete und anschliessend sofort wieder ein Signal zum Shutdown bekam, bootete, shutdown, ….

Meine erste Vermutung war das Netzteil. Den gleichen Effekt gab es aber auch mit einem anderen Netzteil. Der Ersatz-Raspi mit der gleichen SD-Karte rebootete auch ständig. Also kein Hardware-Fehler!

Also Monitor angeschlossen und mal geschaut was da beim booten so passiert. Das letzte was der Raspi so von sich gab bevor er wieder neu startete war:

WDT device closed unexpectedly.  WDT will not stop!

WDT ist der Watchdog Timer. Dieser schien sich selbständig gemacht zu haben. Nun hieß es also irgendwie diesen Watchdog zu stoppen. Die Zeit zwischen einem möglichen Login, Befehl absetzen etc. ist aber so kurz, das ich es vor einem Shutdown nie geschafft habe irgendwas sinnvolles auf der Konsole zu tun.

Abhilfe schafft z.B. das Programm „pLink“. Die plink.exe ist Teil von puTTy und unter Windows im gleichen Verzeichnis wie die putty.exe zu finden. Hiermit muss nicht erst eine gesonderte SSH-Verbindung zum Server aufgebaut werden, sondern es kann direkt der entsprechende Befehl abgesetzt werden.

In meinem Fall habe ich dem Watchdog um seine Konfiguration beraubt, wodurch dieser beim nächsten Neustart (der ja höchstwahrscheinlich ein paar Sekunden später erfolgt) nicht mehr gestartet wird.

plink -ssh -pw <passwort> <benutzer>@<pi_ip> sudo mv /etc/watchdog.conf /etc/watchdog.alt

Beraubt um seine Konfigdatei, sollte der Watchdog beim nächsten Restart nicht mehr starten. Gespannt hab ich ein paar Sekunden gewartet aber es kam kein Neustart mehr.

Woran es letztendlich gelegen hat das der Watchdog diesen immerwährenden Neustart erzwungen hat weiß ich noch nicht. Auch die Konfiguration des Watchdogs muss ich nochmal prüfen. Jedenfalls läuft der Raspi nun wieder!

Rahmenlose Wortuhr

Heute habe ich es endlich geschafft die neue rahmenlose Wortuhr fertig zu bauen (die letzte war für den Bekannten der mir die Platten fräst). Als LED-Matrix-Treiber habe ich den Bausatz von Elmotex genutzt. Die Rost-Frontplatte kommt bei der neuen Uhr wieder zum Einsatz und wird von 7 Neodym-Magneten gehalten.

Der alte Prototyp mit dem klassischen Drei-Platinen-Aufbau und Ribba-Rahmen bekommt die ursprüngliche Glasplatte mit der schwarzen Folie und ziert jetzt unser Büro.

Haustechnik – Entkalkungsanlage

5 Minuten Duschen und anschliessend eine viertel Stunde putzen. So war das immer…
Laut Gemeinde sollte der Härtegrad unseres Wasser bei 11°dH liegen. Gemessen mit einem einfachen Papierteststreifen waren es ~ 14°dH. Nach längerem hin und her haben wir uns daher aufgrund der deutlichen Kalkablagerungen an den Wasserhähnen etc. entschlossen einen Wasserenthärter zu kaufen.

Härtebereich°dH°dH
weich< 8,43-6"Wohlfühlbereich"
mittel8,4 - 14,0
hart> 14,0

Unsere Wahl ist auf den WINNI-mat VGX 9 von Grünbeck gefallen. Das Gerät basiert auf dem Prinzip des Ionenaustauschs mittels Harzkartusche. Andere Geräte mit Magnet etc. kamen nicht in Frage.

Gegenüber dem „Weichwassermeister“ von Grünbeck hat der WINNI-mat nur eine Harzkartusche. Das bedeutet, das für die Zeit des Rückspülens nur hartes Wasser zur Verfügung steht. Etwa 1000€ Unterschied zwischen den beiden Geräten lassen das verschmerzen. Eine Rückspülung dauert ~ 1 Stunde. Der Zeitpunkt der Rückspülung ist abhängig vom verbrauchten Wasser und kann zeitlich leider nicht eingeschränkt werden (z.B. nur Nachts präventiv Rückspülen o.ä.).

Einbau

Der Einbau der Anlage sollte generell nur von einer fachkundigen Person durchgeführt werden!

Das Gerät produziert Wasser mit 0°dH. Deshalb muss das im Lieferumfang enthaltene Verschneideventil eingebaut werden. Dieses mischt das kalkhaltige Rohwasser wieder mit dem komplett entkalten Weichwasser aus der Anlage. Das Verschneideventil muss irgendwo nach dem Wasserzähler in die Frischwasserleitung montiert werden (Einbaurichtung beachten!). Auf dem Bild fließt das Wasser von links nach rechts. Der weiße Wasserzähler ist nicht der Geeichte vom Wasserwerk!

IMG_7043

Die mitglieferten Stahlflexschläuche müssen zwischen Verschneideventil und Gerät angeschlossen werden. Auch am Gerät sind die Anschlüsse für das Roh- und das Weichwasser mit den entsprechenden Richtungspfeilen zu beachten. Die Flexschläuche sind relativ kurz, weshalb das Gerät nahe an dem Verschneideventil aufgestellt werden muss.

IMG_7039

Das Gerät hat einen Ablaufschlauch für das Wasser welches bei der Regeneration benötigt wird und einen Schlauch für den Überlauf des Salzbehälters. Beide sind im Bild recht zu sehen und führen bei uns in den Überlauf der Heizung. Zu beachten ist, das der Überlauf nicht aktiv gepumpt wird und daher der Ablauf nicht zu hoch sein darf. Nach erfolgtem Anschluss kann das Geräte eingeschaltet, und die beiden Sperrventile am Verschneideventil geöffnet werden. Prüfen ob alles Dicht ist!

Update!

Den Abwasseranschluss hatte ich in der Zwischenzeit geändert da, wie von [Unwissender] in den Kommentaren völlig zu Recht angemerkt, eine große Gefahr einer bakteriellen Verunreinugung ausgeht wenn ein direkter Kontakt zwischen Abwasserleitung (HT-Rohr) und den Schläuchen des Geräts besteht. Das sieht mit dem Grünbeck Kanalanschluss-Dingens nun wie folgt aus:

 

Einstellen

Zur Herstellung der Salzsole muss vor dem dem Einfüllen des Salzes, der Behälter mit 6,5 l Wasser gefüllt werden. Danach geht es an das Einstellen des Härtegrades. Zum Messen des Härtegrades liefert Grünbeck eine spezielle Lösung und einen Messbehälter mit. Dieser muss bis zur ersten Markierung hartem Wasser gefüllt werden (Rohhärtemessung). Dafür entweder das Wasser an einer Entnahmestelle vor dem Verschneideventil abzapfen oder das kleinere Ventil an der Verschneideeinheit kompett zudrehen.

IMG_7046

Jetzt die Lösung in das Wasser im Messbecher eintropfen. Jeder Tropfen entspricht hierbei 1°dH. Das Wasser verfärbt sich rot. Zwischen den einzelnen Tropfen ggf. schütteln.

Genauer wird die Messung, wenn anstatt 5 ml, 10ml, 15ml oder 20ml  eingefüllt werden. Die Anzahl der Tropfen/°dH müssen dann natürlich verdoppelt, verdreifacht, … usw. werden.

IMG_7047

Erwartet hatte ich nach der letzten Messung mit dem Papierstreifen einen Umschlag der Farbe des Wassers nach Grün nach 14 Tropfen was einer Härte von 14°dH entspricht. Umgeschlagen ist es aber erst bei 17 Tropfen. Soviel zu der Genauigkeit des Teststreifens…

IMG_7049

Die ermittelte Rohwasserhärte muss dann im Gerät eingestellt werden. Danach muss am kleinen Regler des Verschneideventils die gewünschte Wasserhärte eingestellt werden. Das Wasser zur Messung muss dazu an einer Entnahmestelle hinter der Enthärtungsanlage gezapft werden. Das Ventil immer weiter auf- oder zudrehen bis der gewünschte Härtegrad erreicht ist. Nach jeder Anpassung des Ventils neu messen. Evtl. muss das Wasser an der Entnahmestelle länger laufen gelassen werden damit kein „altes“ Wasser mehr in der Leitung ist. Ggf. muss auch vor der Messung eine Regeneration durchlaufen werden – je nach Status des Gerätes.

Ist die richtige Härte ermittelt, kann das Ventil mit der Schraube arretiert werden.

Danach dran denken auch die Geräte im Haus wie Spülmaschine, Kaffeemaschine, Waschmaschine etc. falls möglich/notwendig auf den neuen Härtegrad einzustellen.

Geschmacklich ist beim Wasser kein Unterschied festzustellen (das Salz dient ja nur zum Rückspülen). Zum Salz- und Wasserverbrauch kann ich akuell noch nichts sagen da die Anlage noch nicht lange in Betrieb ist. Das wird nachgereicht…

Bitte melden falls jemand eine Idee oder einen Ansatz hat, den aktuellen Status des Gerätes wie die verbleibende Wassermenge bis zur nächsten Regeneration, die Regenerationsdauer, etc. digital auszulesen (falls das überhaupt möglich ist).

Viel Spaß mit weniger Kalkflecken, sauberen Brauseköpfen etc.

Gruß
Chris