Kanalratte – IOT

Beim letzten Unwetter (2016) lief der Keller bei Bekannten voll. Daraufhin haben Sie sich eine Rückstauklappe einbauen lassen. Soweit so gut. Nur was geschieht, wenn die Klappe geschlossen ist, und man auf die Toilette muss? Da die Anzeige bzw. die Bedieneinheit auf Grund der Nachrüstung nicht im Haus ist, war eine andere Lösung gefragt. Raus kam die Kanalratte!

Die Idee ist, von der Steuerung, welche ein potentialfreis Wechselrelais hat, welches offen / geschlossen anzeigt, abzugreifen und einem ESP8266 Mikrocontroller zuzuführen.  ESP8266 sind als verschiedene Module erhältlich – bei mir war es ein NodeMCU. Dieses Modul hat die Möglichkeit sich ins WLAN einzuloggen und einen Status abzusetzen. Dazu wird ein HTTP Request über den Dienst Pushover abgesetzt. Bei diesem sind grundlegen bis 7000 Nachrichten pro Monat kostenfrei. Einzig die APP fürs Handy kostet einmalig knapp 5€ pro Android oder IOS Installation. Familienaccounts sind möglich.

Es wird also ein Request abgesetzt, falls sich die Klappe schließt oder öffnet. Zusätzlich sendet die Kanalratte eine Nachricht beim Startup, womit man die generelle Funktionsweise sehen kann. Weiterhin ruft der ESP8266 die Uhrzeit über NTP ab und schickt um 9 und 21 Uhr eine Ping Nachricht, damit man sieht ob er noch am Leben ist. Es nützt nämlich nichts, wenn nie eine Nachricht kommt oder das Netzteil seinen Dienst versagt hat, was man natürlich nicht bemerkt hat.

Der Hardwareaufbau ist dabei simpel. ESP8266 Modul auf einer Lochrasterplatine aufgesteckt oder direkt aufgelötet. Über zwei Verbindungen werden die zwei Kontakte des Wechselschalters im Wechselrelais abgefragt. Da die zwei Eingänge am ESP8266 intern mit Pullup betrieben werden, ist der gemeinsame Kontakt auf Ground gelegt. Das sind die drei nötigen Leitungen. (Hinweis: in Version 1.1 sind noch zwei 1k Wiederstände in die beiden Leitungen eingeschleift um den Strom zu begrenzen.)

Die Software ist simpel aufgebaut. Es werden die GPIO 12 und 13 als Input verwendet, der WLAN Zugang konfiguriert und die Zeitsynchronisierung über Callback aufgebaut. Die Logik für die GPIO überprüft zyklisch, ob die Klappe auf ist (Zustand der Leitungspaare ein / aus) oder zu ist (Zustand der Leitungspaare aus / ein) oder ob ein Leitungsproblem vorliegt (ein/ein oder aus/aus). Bei einer Statusänderung wird die API Seite von Pushover aufgerufen und so der Status abgesetzt, welcher Sekunden später am Smartphone oder PC erscheint. Als vorgefertigte Bibliotheken müssen nur TimeAlarm, TimeLib und NTPClient in der Arduino IDE nachinstalliert werden.

Quelltext und Konfiguration sind hier erhältlich: Kanalratte.ino config.h

Die Daten für die Pushover API müssen aus dem internen Bereich von Pushover nur noch in die config.h eingesetzt werden und es kann losgehen.

Steuerung Rückstauklappe

Kanalratte Prototyp

Backup mit PHP + FTP + SSL Upload

Wie in meinem vorherigen Beitrag geschrieben, gibt es einige Möglichkeiten, ein Backup zu machen. Dabei habe ich lange die Methode mit FTP über SSL eingesetzt. Hier der kurze Writeup, da man die Scripte auch für andere Sachen verwenden kann.

Datenbankbackup mit Upload:

<?
// Backup erstellen
system("mysqldump -uUSERNAME -h127.0.0.1 --port=3306 -pPASSWORD --all-databases > /tmp/dump.sql");

// SSL-Verbindung aufbauen
$conn_id = ftp_ssl_connect("server08.storage.domain.de");
if($conn_id)
 {
 // Login mit Benutzername und Passwort
 $login_result = ftp_login($conn_id, "ftpUSERNAME", "ftpPASSWORD");

// Datei hochladen
 if(ftp_put($conn_id, "backup_".date("Y-m-d").".sql", "/tmp/dump.sql", FTP_BINARY))
 {
 echo "INFO: Datei erfolgreich hochgeladen\n";
 }
 else
 {
 echo "ERROR: FTP-Backup nicht erfolgreich!\n";
 }

// Dump löschen
 unlink("/tmp/dump.sql");

// SSL-Verbindung schließen
 ftp_close($conn_id);
 }
else
 {
 echo("ERROR:Login failed!");
 }

?>

Zum anzeigen der vorhandenen Dateien auf dem FTP Server reicht folgendes Snippet:

<?

// SSL-Verbindung aufbauen
$conn_id = ftp_ssl_connect("server08.storage.domain.de");
if($conn_id)
 {
 // Login mit Benutzername und Passwort
 $login_result = ftp_login($conn_id, "ftpUSERNAME", "ftpPASSWORD");

var_dump(ftp_nlist($conn_id, "."));

// SSL-Verbindung schließen
 ftp_close($conn_id);
 }
else
 {
 echo("ERROR:Login failed!");
 }

?>

Wenn man Jahreweis löschen will kann man es hiermit versuchen:

<?

$year = 2000; // Year to delete

// SSL-Verbindung aufbauen
 $conn_id = ftp_ssl_connect("server08.storage.domain.de");
 if($conn_id)
 {
 // Login mit Benutzername und Passwort
 $login_result = ftp_login($conn_id, "ftpUSERNAME", "ftpPASSWORD");

$list = ftp_nlist($conn_id, ".");

foreach($list as $k => $v)
 {
 if(substr($v, 0, 11) == "backup_".$year)
 {
 echo("delete ".$v."\n");
 ftp_delete($conn_id, $v);
 }
 }

// SSL-Verbindung schließen
 ftp_close($conn_id);
 }
 else
 {
 echo("ERROR:Login failed!");
 }

?>

Einzig was bei der Vergindung zum FTP Server nicht geprüft wird, ist das Zertifikat. Es kann also immer noch wer sich als FTP Server ausgeben.

Webspace Backup

Trotz guter Absicherung von medernen Hostern sollte man seine Daten sichern. Damit kann man auch Stände wieder herstellen, z.B. wenn man versehentlich was gelöscht hat, das aber wieder online stellen will.

Dazu gibt es verschiedene Möglichkeiten:

  • 1) Backup durch Hoster
  • 2) Lokales Backup
  • 3) Backup mit Mailversand
  • 4) Kommerzielles Produkte mit FTP Upload
  • 5) Ablage am Server und abholen
  • 6) On-the-fly Komprimierung und Übertragung mit SCP

Ich habe alle Ausprobiert und habe hier zusammengeschrieben, welche möglichkeiten es gibt und welche ich bereits ausprobiert habe über die letzten 10 Jahre.

zu 1) Backup durch Hoster

Ein Lokales Backup auf dem Server hilft zwar dabei Daten wiederherzustellen, die man gelöscht hat, aber wenn der Server den Dienst verweigert, dann sind die Daten verloren. Manche Hoster haben ein spezielles Verzeichnis, dass meist auf einem anderen Server liegt und so diesen Nachteil ausgleicht. Auch gibt es meist in der Administrationskonsole der Hoster Möglichkeiten, das Backup automatisch auf einen anderen Server zu übertragen. Backup ist hier meist kostenlos, aber da der Betreiber auch die zusätzliche Speicherkapazität sich bezahlen lässt, kommt es zu dem Punkt, wo man bezahlen muss, nämlich der Wiederherstellung (Restore).

zu 2) Lokales Backup

Man kann das Backup auch selber durchführen, wenn man Zugriff über SSH auf die Konsole oder wenn man einen (V)Server gebucht hat.

Beispiel für ein eigenes Backupscript:

#!/bin/sh

DATE=`date +%F`

################################
# database backup

cd /backup/data/
mysqldump -C -c --add-drop-table --allow-keywords -l -Q --user=longusername --password=longpassword --databases database > backup-db-${DATE}.sql

tar czvf backup-db-${DATE}.tar.gz backup-db-${DATE}.sql
rm -f /backup/data/backup-db-$DATE.sql


################################
# web backup
tar czvf backup-www-${DATE}.tar.gz /var/www/*

Wer die letzten Backups der letzten 40 Tage behalten will und alles andere löschen will, kann es hiermit versuchen.

################################
# remove old data (older than 40 days)
rm -f `find /backup/data/ -mtime +40`

Das ganze kann als Cronjob verpackt werden und jeden Tag ausgeführt werden. Zum editieren des Cronjobs „crontab -e“ eingeben. Im folgenden Beispiel wird der Cronjob um 3 Uhr morgen ausgeführt, wenn die meisten Besucher schlafen.

00 3 * * * /backup/scripts/backup.sh

zu 3) Backup mit Mailversand

Wenn man die Backups in eigener Hand halten will, kann man sich auch die Backups zusenden lassen, solange das Empfängerpostfach groß genug ist. Die aktuellen Postfächer bieten meist diese Möglichkeit, wenn die Backupgröße unter 20 oder 50MB bleibt. Allerdings sollte man sich bewußt sein, dass das Backup ggf. ungesichert über die Leitung geht und dort sensible Daten enthalten sein können.

Um eine Mail aus dem Backup zu erzeugen verwendet man folgende Befehle, die man natürlich auch ins Script einbauen kann:

uuenview -b -s 'test' -m user@email.de /backup/data/backup-db-${DATE}.tar.gz

Erzeugt man das Backup als root, so ist es sinnvoll, es mit einem „echten“ Benutzernamen zu versenden.

su -c "uuenview -b -s 'test' -m user@email.de /backup/data/backup-db-${DATE}.tar.gz" username

zu 4) Kommerzielle Produkte mit FTP Upload

eine weitere Möglichkeit stellen kommerzielle FTP Speicher dar. Diese sind meist auf 1-2 User oder IP Adressen begrenzt. Die Kosten halten sich auch in Grenzen und man hat einen eigenen externen Speicher. Da die Übertragung hier meist ungesichert stattfindet, hat diese Möglichkeit auch Nachteile.

Hier hilft auch wieder ein einfaches Script:

#!/bin/bash
#############################
# FTP backup

DATE=`date +%F`
cd /backup/data/

/usr/bin/ftp -i -v server08.storage.hoster.de <<EOF
binary
put backup-db-$DATE.tar.gz
quit
EOF

Die Zugangsdaten stehen in der Datei .netrc im Verzeichnis des ausführenden Benutzers:

machine server08.storage.hoster.de login ftp-username password ftp-password

zu 5) Ablage am Server und abholen

Bis hierhin haben sich die oben genannten Methoden bewärt, auch wenn sie nach dem Stand der Sicherheit nicht mehr die aktuellsten waren / sind.

Deswegen habe ich meinen kleinen Raspberry Pi bzw. Banana PI damit beauftragt, in der Nacht die Daten von Server abzuholen. Dazu wir das Backupscript aus 2) ausgeführt und der Raspberry holt sich die Daten auf den lokalen Speicher über eine gesicherte Verbindung ab.

Dazu habe ich ein SSH Public/Private Keypair erzeugt und es auf den Server abgelegt (Weiterführende Informationen gibt es bei Google).

Nachdem das Backup um 3.00Uhr gelaufen ist, wird um 3.10Uhr folgendes Script am lokalen Linux Host gestartet.

scp -q -P 22 user@domain.de:/backup/data/backup-db-`date +%Y-%m-%d`.tar.gz /mnt/storage/data/backup/domain.de/

Eine weitere Variante ist, dass die Vorbedingungen gecheckt werden und das Ergebnis über den Dienst Pushover gesendet wird.

#!/bin/bash

# check mount
if ! mountpoint -q /mnt/storage/
then
 curl -s --form-string "token=aTOKEN" --form-string "user=uUSERTOKEN" --form-string "message=ERROR: Backup dir not mounted" https://api.pushover.net/1/messages.json > /dev/null
 exit
fi

# check space - 10GB should be there
SPACE=`df -BM /mnt/storage | grep "/mnt/storage$" | awk '{ print $4}' | cut -d'M' -f1`
if [ $SPACE -lt "10000" ]
then
 curl -s --form-string "token=TOKEN" --form-string "user=USERTOKEN" --form-string "message=WARN: Space on backup dir low" https://api.pushover.net/1/messages.json > /dev/null
fi

# download yesterdays file & check
scp -q -P 22 user@domain.de:/backup/data/backup-db-`date +%Y-%m-%d`.tar.gz /mnt/storage/data/backup/domain.de/

if [ "$?" -eq "0" ]
then
 curl -s --form-string "atoken=TOKEN" --form-string "user=uUSERTOKEN" --form-string "message=INFO: Backup successful" https://api.pushover.net/1/messages.json > /dev/null
else
 curl -s --form-string "atoken=TOKEN" --form-string "user=uUSERTOKEN" --form-string "message=ERROR: Copy from Host failed $?" https://api.pushover.net/1/messages.json > /dev/null
fi

zu 6) On-the-fly Komprimierung und Übertragung mit SCP

Sollte der Hoster weitere Möglichkeiten bereitstellen, so kann man sich die Daten auch on-the-fly vom Linux Backup Host holen und vom Server komprimieren lassen.

Beispiel für Mysql

ssh user@domain.de 'cd /tmp/ && mysqldump -uusername -h127.0.0.1 --port=3307 -ppassword --all-databases | gzip -c -9' > backup_mysql_`date +%Y-%m-%d`.gz

Beispiel für Webspace

ssh user@domain.de 'cd /home/www/ && tar -cf - public | gzip -9' > backup_www_`date +%Y-%m-%d`.tar.gz

Auch hier ist es wichtig, dass man vorher überprüft im Script, ob genügen Speicher vorhanden ist. Auch sollte man sicherstellen, dass SSH sauber beendet wird, ohne das die Verbindung fehlschlägt.

ssh user@domain.de 'cd /home/www/ && tar -cf - public | gzip -9' > backup_www_`date +%Y-%m-%d`.tar.gz
if [ "$?" -eq "0" ]
then
 BACK_HOSTING="OK"
else
 BACK_HOSTING="FAILED"
fi

ssh user@domain.de 'cd /tmp/ && mysqldump -uusername -h127.0.0.1 --port=3307 -ppassword --all-databases | gzip -c -9' > backup_mysql_`date +%Y-%m-%d`.gz
if [ "$?" -eq "0" ]
then
 BACK_MYSQL="OK"
else
 BACK_MYSQL="FAILED"
fi

Das Ergebnis kann man sich dann wieder per Email oder Pushdienst mitteilen lassen.

curl -s --form-string "token=aTOKEN" --form-string "user=uUSERTOKEN" --form-string "message=INFO: Backup done
 Backup hosting: ${BACK_HOSTING}
 Backup mysql: ${BACK_MYSQL}" https://api.pushover.net/1/messages.json > /dev/null

Fazit:

Die letze vorgestellte Methode stellt meiner Meinung nach die sicherste Methode in Bezug auf Übertragung und Datenhaltung dar. Diese setze ich bei meinen Projekten ein.

Wer weitere Vorschläge oder Verbesserungen hat, kann sie mir gerne mailen oder einen Kommentar hinterlassen.

ASUS WL 330 Serial-Mod

Es gibt viele Router, welche sich mit freier Software wie Openwrt betreiben lassen. Dazu wird das entsprechende Image heruntergeladen. Bei manchen Modellen geschieht der Upload / das Update über den Browser über die interne Adminsseite. Teilweise kann man die alternative Software auch über TFTP flashen. Damit man sieht ob es funktioniert hat bzw. im Recovery Fall, ist eine serielle Konsole sehr hilfreich. Auf www.openwrt.org gibt es viele gute Beschreibungen, wie die Pinbelegung der Router ist und wie man die Daten vom Router in den PC bekommt.

Bei meinem ASUS WL-330 sind die Testpads unter Schutzlack versteckt, womit man nicht direkt an die entsprechenden Signale heran kommt. Mit ein wenig Geschick und einer spitzen Pinsette habe ich den Lack entfernt und konnte so an RX/TX der seriellen Schnittstelle rankommen und eine entsprechende fliegende Verdrahtung anbringen. Jetzt läuft die alternative Firmware drauf.

Asus WL330 Router Platine

Asus WL330 Router Platine

Asus WL330 Router Platine

Asus WL330 Router Platine mit freigelegten Testpunkten für RX/TX

Asus WL330 Router Platine mit serieller Verbindung

Asus WL330 Router Platine mit serieller Verbindung

Am Rande sei noch bemerkt, das  der WL-330 in erster Version je eine separate Platine für die „normale“ Version und die mit externem Modem (mit USB) gab. Bei meiner Version 1.20 scheint sich der Unterschied darauf zu beschränken, dass das Gehäuse anders ist und der USB-Anschluß nicht angelötet wurde. Der Kernel findet jedenfalls den USB-OTG Anschluss.

Neuer Batterie Connector für Wiko Rainbow Jam Handy

Bei einem Wiko Rainbow Jam Handy war der mittlere Pin des Batterie Connectors abgebrochen, womit das Handy entweder keinen Strom mehr bekam oder die Datenverbindung mit dem Akku nicht möglich war. Auch in diesem Fall verweigert der Akku das Laden bzw. das Handy seinen Dienst.

WIKO Rainbow Jam - defekter Batterie Connector

WIKO Rainbow Jam – defekter Batterie Connector

Vom eigebauten Batterie Connector von LCM gab es zwar ein Datenblatt, aber dieser war schwer bzw. gar nicht zu bekommen.

LCN Connector

LCN Connector

Mit Hilfe des Datenblattes habe ich dann einen guten Ersatz gefunden, und zwar den vom Microsoft Lumia, den es in Ebay und diversen anderen Handy Reparatur Shops gibt. Der Preis unterscheidet sich meistens nur in den Versandkosten. Nach Bestellung, Lieferung und Entfernen des alten defekten Connectors passt das Ersatzteil einwandfrei, bis auf dass die Füßchen an der Seite zur recht gebogen werden mussten.

Anschließend lies sich das Smartphone wieder laden und bedienen.

WIKO Rainbow Jam - erneuerter Batterie Connector

WIKO Rainbow Jam – erneuerter Batterie Connector

 

WIKO Rainbow Jam - erneuerter Batterie Connector

WIKO Rainbow Jam – erneuerter Batterie Connector

←Older