trueten.de

»Das sind meine Prinzipien, und wenn sie Ihnen nicht gefallen, habe ich auch noch andere.« Julius Henry "Groucho" Marx

OnePlus 6T: Kaum da, schon gerootet ;-)

Zur Abwechslung mal wieder was über Telefone. Nach 4 Jahren mit dem OnePlus One, dem so allmählich die Puste ausging, war es mir mal nach Veränderung, so orderte ich mir eine neue Telefonzelle. Es musste mit 256 GB internem Speicher und 8 GB RAM natürlich gleich der dickste Bolzen sein. ;-) Da mich die Qualität des Gerätes und die Community in den letzten Jahren überzeugte - in unserem Haushalt werkelt ja auch noch ein OnePlus 3T - war eigentlich klar, daß ich markentreu bleibe. Das vor 5 Monaten erschienene 6er Modell hätte mich eigentlich schon gereizt, aber ich dachte mir, bau nochmal einen Austauschakku ein, vielleicht hält das Teil ja nochmal 4 Jahre durch. Naja, der Akku war bzw. ist ok, auch der Austausch war in 20 Minuten erledigt. Dennoch: Die heutige Software zieht schon etwas mehr Strom und letztlich reichte das nicht einmal mehr über den Tag.

Tests zum 6T gibt es genügend, für mich gab es keinen Grund mehr, zu Googles "Pixel" zurückzukehren, nachdem die Preispolitik der vergangenen Jahre konsequent fortgesetzt und dafür an der 1000€ Marke gekratzt wird. Ein Thema, bei dem Durchgeknallte, die mit einem iPhone "X" herumposen - wohl nur zu einem müde Lächeln können. Aber irgendwie bekommt Apple das mit den Mondpreisen schon zu spüren.

Wie auch immer, nachdem OnePlus sein 6T vor 14 Tagen vorgestellt hatte kam es am Dienstag zur Auslieferung, meines bekam ich dann gestern geliefert. Während ich einem Familienmitglied beim Umstieg von einem ebenfalls 4 Jahre alten iPhone auf ein 6T unterstützte, fand ich noch die Zeit, nach einer Lösung zum Rooten für das 6T, denn ich hätte ja doch ganz gerne meine diversen Apps 1:1 wieder auf dem neuen Handy. Mittels Titanium BackUp kein Problem, allerdings setzt das Root voraus. Kein Problem1:

blu_spark TWRP für das OnePlus 6T
dann noch

Magisk herunterladen


Bei uns an den Linux Rechner gehängt, nachdem ich das 6T eingeschaltet und einen "alles überspringen" Setup Lauf durchgeführt hatte, bin ich in die Einstellungen / Über das Telefon / 7 * auf "Build Number" tippen, um den Entwicklermodus freizuschalten, dann wieder in "Einstellungen / System / Entwickleroptionen" und dort "OEM Entsperrung", "USB-Debugging" und "USB-Debugging Authorisierungen aufheben" aktivieren und dem angeschlossenen Rechner Zugriffsrechte erteilen. (Am besten auch noch "erweiterter Neustart" aktivieren, aber das ist Komfortzone.)

Sodann als root berechtigter User das folgende in die Linux Kommandozeile 2 reinhacken:

fastboot oem unlock

Schwupps - so schnell ist das Handy platt. Genau: beim Entsperren des Bootloaders werden alle Daten gelöscht. Das macht nichts, da ich noch keine Daten darauf habe und deswegen ja auch im "alles überspringen" Setup Lauf unterwegs war ;-)

Nach dem Aufheben der OEM Sperre und der Freischaltung können nun TWRP, der blu_spark Kernel und Magisk installiert werden. Mit

fastboot boot twrp-3.2.3-x_blu_spark_v9.86_op6.img

wird das neue Recovery gebootet, anschließend erlaubt man Änderungen durch Wischen auf dem im unteren Bildschirrm angebotenen Schieberegler. Dann wird in dem nächsten Bildschirm unter "Advanced" der Menüpunkt"ADB Sideload" gewählt, "Wipe Dalvik Cache" und "Wipe Cache" gewählt und dann der ADB Zugriff durch Wischen am Schieberegler im unteren Bildschirmrand ermöglicht, der dann auf dem Computer per sideload aufs 6T gebügelt wird:

adb sideload twrp-3.2.3-xblusparkv9.86op6.zip

Dann kann z.B. mit dem blu_spark Kernel eine Alternative zum regulären Systemkern installiert werden:

adb sideload blusparkr56-oos-pieop6-6t9e9a352.zip

Als Abschluß gibt es dann noch die Installation von Magisk per sideload:

adb sideload Magisk-v17.3.zip

Dann lösche ich eigentlich immer den Cache und starte das Handy neu. Magisk lässt sich zukünftig dann direkt aus der App updaten.

Diese im Gegensatz zu früheren root / Flash Aktionen scheinbar etwas umständlichere Methode der Recovery Installation hängt mit den A/B Partitionen zusammen, die ursprünglich mit Googles Pixel 1 eingeführt und für mehr Sicherheit sorgen sollen. So existiert im Gegensatz zu früheren Versionen keine eigene Recovery Partition mehr, sondern das Recovery ist Bestandteil des Boot Images. Grob gesagt muss deshalb TWRP temporär gebootet werden, um erst mit einem weiteren Installationslauf in einem der Slots eingerichtet zu werden. Die beiden Slots sind in TWRP selbst auch anwählbar, zum Beispiel beim Backup. Auch beim Neustart aus dem Recovery lässt sich der gewünschte Slot wählen.

Die verwendete (inoffizielle) blue_spark TWRP 3.2.3-x Recovery Version v9.86 ist noch in einem recht frühen Entwicklungsstadium, das sollte man bedenken, ebenso wie die angepasste Magisk Version. Zum Beipiel läuft hier das Xposed Modul leider noch nicht, auch gibt es in Sachen LineAgeOS bis jetzt auch nur inoffizielle Versionen. Hier habe ich mich auch noch nicht dazu durchgerungen, auf den Zug aufzuspringen. Aber was nicht ist, kann ja noch werden. Momentan schaue ich mir noch sehr wohlwollend das installierte OxygenOS 9.05 an, das unmittelbar nach dem TWRP Flash zum Download bereit stand.

Die A/B Partitionen können wie alles andere in dem kurzen Beitrag hier dargestellte zu Problemen führen, bis dahin, das OnePlus 6T in einen 629€ teuren Briefbeschwerer zu "bricken". Von daher: Alles, was bei mir geklappt hat, kann woanders ins Auge gehen, daher: Nachahmung auf eigene Gefahr, informiert Euch zuvor über die möglichen Folgen, zum Beispiel auch über eventuellen Garantieverlust!

In dem Sinne freue ich mich über Hinweise, Vorschläge, Alternativen und Kritiken, gerne über die Kommentarfunktion!

1: Wem das zu stressig / langweilig / riskant / whatever ist, der kann natürlich auch per OnePlusSwitch bequem von einem alten Android Handy - und auch von iPhones - auf das neue umsteigen. Die App, die in Googles Play Store für Android und hier - leider außerhalb von dem Apple Dingens erhältlich und daher nicht ganz ungefährlich - zu installieren ist, erleichtert einem den Umzug doch sehr, indem ein Barcode auf dem alten durch das neue Handy abzufotografieren ist. Binnen kurzer Zeit landen dann alle Fotos und sonstigen Daten auf dem neuen Gerät.

2: Windows kann das natürlich auch. Möglicherweise gibt es dabei einiges zu beachten, daher verweise ich auf die DroidWiki Anleitung hier.

In diesem Beitrag sind einige Links auf Amazon und eBay gesetzt. Wenn Ihr über diese Links dort etwas bestellt, bekomme ich eine kleine Provision. Irgendwie muss die Kohle für das 629€ teure Teil ja wieder reinkommen. ;-) Für Euch bleibt der Preis derselbe wie bei einem Direktkauf.

Error 7: Modem- Firmwareupdate beim OnePlus3T

Ein kurzer Merkbeitrag zu einem Modem / Firmware Problem des OnePlus 3T, der beim Flashen eines beliebigen LineageOS Updates auftreten kann und sich mit dem Abbruch des Flashvorgangs mit der folgenden Fehlermeldung äußert:

"assert(op3.verify_modem("2017-06-27 21:43:31") == "1");"

Die Ursache besteht darin, daß das Handy zwischenzeitlich ein Upgrade der Firmware erhalten hatte, das jedoch in den LineageOS Zips nicht enthalten ist, von diesen aber erwartet wird. Zwischenzeitlich hatte ich mir so geholfen, daß ich in der Zip Datei vor jedem Flash Vorgang die Abfrage des Handymodells manuell geändert hatte.

Dazu im Archiv das Updater Script /META-INF/com/google/android/updater-script mit einem Texteditor öffnen und sämtliche Zeilen mit "assert" und "getprop" Einträgen löschen. Abspeichern und installieren. Klappt problemlos und ermöglicht, falsche Systeme auf dem Handy zu installieren und dies zu bricken. ;-)

Also ein funktionierernder Workaround, jedoch ziemlich weit entfernt von einem automatisierungsfähigen Vorgehen. Zufällig bin ich dann über den Eintrag von Lord Boeffla (Vielen Dank dafür!) bei XDA gestolpert, einem Entwickler von Kernelhacks für die OnePlus Geräte, der die Firmwareupgrades aus dem originalen OxygenOS extrahiert und auch für andere OS zur Verfügung gestellt hat. Diese Datei sollte auf einem der üblichen Wege auf das 3T verbracht und dann per TWRP geflasht werden. Danach klappt es endlich auch wieder mit dem automatischen Update auf die aktuellste LineageOS Version.

Edit: Für den (eher unwahrscheinlichen) Fall, das man das 3T gebrickt hat, findet sich hier einige Hinweise, das Ding wieder ans Laufen zu bekommen.

Wenn Du merkst, daß Dein Pferd tot ist: Steig ab.

Twitter. (Symbolfoto)
Twitter. (Symbolfoto)
Quelle: Museum of Veterinary Anatomy FMVZ USP
Lizenz: CC BY-SA 4.0 , via Wikimedia Commons
Ich hatte neulich aus Gründen (1.,2.) meinen zunehmenden Widerwillen gegen Twitter verkündet. Auch wenn dort die Trolle und Nazis am lautesten keifen und meine Laune jedes Mal in den Keller tendiert, gibt es da natürlich auch jede Menge korrekter Menschen. Trotzdem: Nach 10 Jahren in dem "sozialen" Netzwerk wird es für mich Zeit, anderswo meine Fühler auszustrecken und dabei auch diverse Software auszuprobieren. Den ursprünglichen Beweggründen der Teilnahme bei Twitter und FaceBook entsprechen für mich heute am ehesten Mastodon und Diaspora, die nicht zentral wie die in Mordor, dem Reich Saurons angesiedelten, social kommerziellen Networks daher kommen, sondern notfalls in einer eigenen Instanz auf dem heimischen Server laufen können.

Als erstes war mir ein CLI wichtig, das ich per cronjob steuern kann, um meine von Twitter gewohnte tägliche Zeitansage auch auf Mastodon kundtun zu können tooten. Erste Wahl ist für mich - auch wenn der Name etwas einfallslos ist - toot.

Die jahrelange Twitter Präsenz hat auch dazu geführt, daß ich etwas eingerostet bin, was die Benutzeroberfläche betrifft. Die von Mastodon ist eher naja, wie das selige TeetDeck: Grausam. Jedoch bin ich durch einen Hinweis auf halcyon.anoxion.de gestoßen, der sich Webmäßig wie Twitter verhält.

Für GNU emacs gibt es einen Client mit dem sich vortrefflich tooten lässt und der selbst auf einem VT 420 Terminal läuft. Für Android nutze ich momentan AndStatus, da bin ich aber noch in der "Orientierungsphase" und probiere alle möglichen Clients aus. Der Vorteil bei AndStatus is, daß man neben Mastodon auch Twitter damit bedienen kann.

Ein wenig mehr zu Mastodon hat Don di Dislessia bei sich gebloggt. Zum Abschluss, wegen dem ganzen tooten:

Neulich, an irgendeinem Bahnhof in Paris, am Fahrkartenschalter:

"Two to Toulouse", fordert ein britischer Kunde. Der nächste verlangt:
"Two to Toulouse, too."
Darauf der Beamte: "Täterätätä..."

SCNR.

RaspBerry Pi: Überallklingel 1.2

Zu Beschleunigung der Zustellung dringend erwarteter Pakete habe ich mich in der Vergangenheit aller möglichen Tricks bedient:

• Duschen.
• Auf dem Klo sitzen.
• Im Keller oder auf dem Dachboden herum lungern.
• Verschlafen.
• Am Fenster auf das gelbe Fahrzeug warten.
• ...

Klappt im Grunde alles nicht richtig. Irgendwie war doch immer eine Benachrichtigung im Briefkasten, mit dem Vorwurf, der / die ZustellerIn hätte mich oder einen anderen Vertreter meiner Sippschaft nicht angetroffen.

Daher kam das Überallklingel Projekt der c't 17/2017, S. 84 wie gerufen. Flugs einen Pi Zero W (*) herausgekramt, einen Widerstand, eine Diode und einen Optokoppler auf ein Stück Lochrasterplatine gelötet und dann beherzt an das Kabelwirrwar der heimischen Siedle HT401a-01 Telefonanlage angeschlossen. Nach der Installation der Telefonanlagensoftware Asterisk und wenigen Stunden Konfigurationsarbeit funktionierte das ganze sehr schön. Bis die Postboten ihre Taktik änderten und die Klingel ungeduldig bearbeiteten, derweil bereits etwas ältere Blogger die Treppe zur Sprechanlage hoch schnauften. Einige dieser Schlingel verstiegen sich dann wohl in die Vermutung, der Paketempfänger sei nicht zu Hause und machten sich daraufhin hurtig davon.


Damit es mal wieder so richtig wie bei Mr. Beaker in den Ohren klingelt ;-)

Klar, daß mensch dieser unvorteilhaften Situation nicht tatenlos zusehen konnte. Eine Erweiterung der Fähigkeiten der Überallklingel war vonnöten. Wenn der RaspBerry Pi(*) ein Signal (von der Klingel) empfangen und dies an die Telefone, die an der FritzBox(*) hängen weiter leiten kann, dann kann man davon ausgehen, daß er ein solches auch von diesen Telefonen aus (an den Türöffner) senden kann.

Dabei müssen zwei Probleme gelöst werden:

  • Wie kann man den Bengel dazu überreden, die 12Volt Spannnung zu vertragen?
  • Wie muss die vohandene Asterisk Installation erweitert werden, um ein Telefonsignal in eine Aktion des Türöffners zu verwandeln?

Die Suche bei einer beliebigen Internetsuchmaschine ergibt zum ersten Problem hunderte Vorschläge, die darauf hinauslaufen, selbiges mittels Relais zu lösen. Ich habe hier dann die Schaltung von xgadget sowie die Anleitung von 4hf übernommen. Die Relais gibt es über die dortigen Quellen zu erwerben oder eben auf Amazon oder in der Bucht. Ja nachdem, was man schalten will, kauft man eben bis zu 16-fach Relais, die dann jedoch ein eigenes Netzteil benötigen.

Der Relaisanbieter gibt es viele, vermutlich kommen die Bauteile jedoch aus der selben chinesischen Fabrik und werden nur entsprechend Anbieter gebrandet. Wie auch immer: Ich habe für unsere Klingel ein 2 Kanal Relais Modul(*) verwendet. Dieses ist zwar größer als das Einfach Modul, kostet meist jedoch weniger. Komisch? So ist der Kapitalismus nun mal, auch in China. (Stimmt nicht! Hier gibt es die Dinger sogar für 0,88€ plus 1€ Versandkosten!(*))

Doch genug der Ideologie, zurück zur Klingel. Die Signalseite des Relais mit den gewünschten Pins des Raspberry Pi GPIO verdrahten und dann die Lastseite parallel zum Türöffner der Sprechanlage geschaltet. Meistens fangen hier die Probleme an. Sprechanlagen aus der Steinzeit? Kein Problem. Was hatte ich mich aber über die Nachrichten des Postboten und die Anrufe von Familienmitglieder gewundert: Angeblich sei niemand zuhause gewesen. Solche Banditen! Oder sollte etwa...?

Es bleibt kompliziert.

Auch bei Sprechanlagen aus der Steinzeit besteht die Möglichkeit, daß diese nicht nur zur Kommunikation mit der Klingel an der Haustüre, sondern auch zur selbigen mit Etagentelefonen, Klingeln an der Wohnungstüre und anderen Gerätschaften vorgesehen waren. Was bei uns der Fall war und dafür sorgte, daß die Klingel zwar klingelte, wenn diese vor der Wohnungstüre betätigt wurde, jedoch nicht von der Haustüre aus. Getestet hatte ich natürlich nur von der Wohnungstüre aus 8-)

Nachdem auch dieses nicht unerhebliche Problem gelöst war, stand erneuten Versuchen nichts im Wege. Außer Asterisk. Dies ist ja nun nicht gerade ein einfaches Telefonanlagenprogramm, sondern doch schon ein relativ mächtiges Werkzeug, mit dem durchaus auch die Kommunikation von Callcentern oder Konzernzentralen mit dazugehörigen Videoanlagen, Faxgeräten, IP-Telefonie usw. geregelt werden kann. Mit Kanonen auf Spatzen? Wenn's hilft. Zum Glück ist Asterisk skalierbar und es gibt auch eine ausgezeichnete Dokumentation, das Asterisk Buch im Netz.

Leider erfordern umfangreiche Programme etwas Einarbeitung. Deshalb gibt es auch Alternativen wie DoorPi. Im Vergleich zu Asterisk deutlich überschaubarer und auch hinsichtlich Home 4.0 sicherlich sinnvoll. Wenn nicht die Klingel schon auf der Grundlage von Asterisk funktioniert hätte und die DoorPi Lösung ebenso gut dokumentiert wäre. Nach einem kurzen Seitenblick habe ich DoorPi deshalb zur Seite gelegt.

Konzentriert

Die Überallklingel wurde über ein Python Script ausgelöst, das .call Dateien im Outbound von Asterisk anlegt, sobald ein (Klingel)Signal auf ausgewählten GPIO Pins anliegt. Asterisk reagiert auf die .call Datei und setzt deren Inhalt in Aktionen, in dem Fall in einem Anruf bei der Rundrufnummer der FritzBox um. Auf das Projekt ging Andrijan Möcker in seinem c't Artikel ein, diesen kann man auch noch als PDF Datei beziehen.

Beim Türöffner muss ein Signal an einen GPIO Pin gesendet werden, die dann an das Relais weiter geleitet werden, woraufhin der parallel geschaltete Öffner anzieht und die Türe sich öffnen lässt. Da ich des Prorgrammierens in Python nicht mächtig und obendrein zu faul bin, das für eine Klingel zu erlernen, habe ich das in Bash gemacht:

#!/bin/sh
gpio mode 12 out
gpio write 12 0
sleep 2
gpio write 12 1

Mit diesen viereinhalb Zeilen schaltet der Raspberry Pi für 2 Sekunden (so schnell muss der Postbote die Tür öffnen) das Relais über den GPIO Pin 10. Was, Pin 10? Wieso das denn, da steht doch 12? Stimmt. Bei den GPIO Pins gibt es soviele Bezeichnungen für deren Belegungen, wie andere Leute Unterhosen im Schrank haben. Alternative Fakten eben. Tatsächlich ist für die Bezeichnung die jeweilige Bibliothek, die für die Ansteuerung verwendet wird, verantwortlich. Eine gute Übersicht gibt es bei RaspBerry Guide.

Ich verwende hier wiring PI. Dieses Lib ist schnell installiert, ich verweise dazu an der Stelle auf tutorials-raspberry.de. Also. Pin 19 mit dem Signaleingang des Relais verbinden, einen GND Pin des GPIO mit dem selbigen des Relais und Schlußendlich einen 5 Volt Pin des GPIO mit dem VCC Pin des Relais verbinden. Die nebeneinander liegenden VCC und JD-VCC Pins des Relais bleiben bzw. werden im Gegensatz zur Anleitung bei xgadgets mittels eines Pin Steckers gebrückt, damit ersparen wir uns die zusätzliche Versorgung mit 3,3 Volt.

In meinem Fall musste ich die 5 Volt mittels einer Quick & Dirty Lötlösung von dem auf dem Raspberry PI verbauten ZigBee Modul(*) (dem Thema widme ich einen späteren Beitrag) von Dresden Elektronik klauen. Es gehen natürlich auch GPIO Extender(*), falls die Stromverorgungspins alle schon vergeben sind.

Ein erster Funktionstest

"Fliegender" Aufbau. Nach Ablauf diverser Tests werden alle Kabel schön sauber in ein Gehäuse gestopft.
Ein Test, ob man die richtigen Pins belegt hat, ist in jedem Fall sinnvoll. Da 5 Volt im Spiel sind - was für den Raspberry oder auch den auf dem Relais verbauten Optokoppler tödlich sein kann - rate ich in jedem Fall zur sorgfältigen Kontrolle der Schaltung. Für einen ersten Test kann man notfalls auf die Widerstände vom GPIO zum Relais verzichten, aber das ist was für faule Kerle. (Im Falle eines gegrillten RaspBerry Pi bitte ich die entsprechenden Werbelinks in diesem Beitrag zu nutzen, dann hat wenigstens einer etwas davon).

Das Relais selber muss mensch an der Stelle noch nicht an die Sprechanlage anschließen.

Ein entschlossener Aufruf des Scriptes mit dem obigen Inhalt, das vorher unter einem beliebigen Namen zum Beispiel als /usr/local/bin/oeffner.sh gespeichert und anschließend mittels:

sudo chmod a+x /usr/local/bin/oeffner.sh

ausführbar gemacht worden ist, sollte einen deutlich hörbaren Schaltvorgang des Relais zur Folge haben. Zudem sollten die auf dem Relais verbauten LEDs lustig im Schalttakt blinken.

Die halbe Miete

Nun biegen wir beinahe auf der Zielgeraden ein. Zuvor gilt es jedoch die Haarnadelkurve Asterisk zu bewältigen. Wie oben ausgeführt mit durchaus steilem Anstieg der Lernkurve, aber dafür gibt es ja diesen Beitrag hier.

Das Relais schaltet also im Ergebnis der Ausführung des Scripts oeffner.sh. Da der ganze Zweck der Übung der ist, mittels Anwahl einer bestimmten Nummernfolge auf einem der an die FritzBox angeschlossenen Telefone dieses Script auszuführen um so die Türe zu öffnen verwenden wir einen Befehl in Asterisk. Ich setze jetzt voraus, daß Asterisk läuft, sich erfolgreich bei der Fritzbox als IP Telefon angemeldet hat und Klingelsignale empfängt. Dazu habe ich in der FritzBox unter "Telefonie" das IP Telefon "622" mit dem Passwort "Sowasvongeheim" angelegt und in dem Python Script zur Generierung der .call Datei diese Daten ein eingegeben. Nicht verschlampern, die brauchen wir noch, nämlich hier, in dem etwas von mir angepassten (fett markiert) Python Script, das von c't Autor Andrijan Möcker geschrieben wurde:

 import time
 import shutil
 import RPi.GPIO as gpio
 import os
 import sys
 #Einstellungen
 klingel_gpio = 24 #GPIO, der mit der Schaltung verbunden ist
 callfilepfad = "/home/pi/klingel.call" #Dateipfad in dem das Script die .call-Datei ablegt
 sipkanal = "622" #Name des SIP-Kanals (in eckigen Klammern in der SIP.conf)
 sipziel = "**702" #Ziel des Anrufes (Beispiel: **702 als Anrufergruppe der Fritz!Box)
 sipwartezeit = "4" #Wartezeit bevor wieder aufgelegt wird
 #Hier wird die .call-Datei zusammengebaut und abgespeichert
 callfile = "Channel: SIP/" + sipkanal + "/" + sipziel + "\nApplication: Playback\nWaitTime:" + sipwartezeit + "\nData: /var/lib/asterisk/sounds/de/play"
 cf = open(callfilepfad, "w")
 cf.write(callfile)
 cf.close()
 #
 gpio.setmode(gpio.BCM)
 gpio.setup(klingel_gpio, gpio.IN, pull_up_down=gpio.PUD_UP)
 def voip():
 try:
 shutil.copyfile(callfilepfad,'/var/spool/asterisk/outgoing/anruf.call')
 print(text)
 except Exception:
 pass
 while True:
 time.sleep(0.01)
 if not gpio.input(klingel_gpio):
 time.sleep(0.1)
 if not gpio.input(klingel_gpio):
 voip()
 time.sleep(5)

Zu den von mir vorgenommenen Änderungen schreibe ich weiter unten noch ein paar Worte, das sind im wesentlichen auch die Stellen, die auf die Gegebenheiten vor Ort verändert werden müssen. An der Stelle ein Einschub, nämlich die durch dieses Script im Outbound Verzeichnis von Asterisk /var/lib/asterisk/outgoing/ erzeugte .call Datei:

 Channel: SIP/622/**702
 Application: Playback
 WaitTime 4
 Data: /var/lib/asterisk/sounds/custom/play

Asterisk fragt dieses Verzeichnis ständig ab (pollt) und führt darin enthaltenen Dateien aus. In unserem Fall: Anruf bei der FritzBox mit dem SIP Protokoll unter der Userkennung 622 an die Nummer **702, die ich in dem darüber gezeigten klingelscript.py bereits angelegt habe. Bei erfolgreichem Anruf wird für die Dauer von 4 Sekunden der Inhalt der Datei /var/lib/asterisk/sounds/custom/play ausgeführt. Diese braucht nicht zu existieren, es reicht der Impuls durch den Aufruf, um ein Klingelsignal bei der FritzBox auszulösen.

Nach eingehender Lektüre des bereits erwähnten Asterisk Buches bei dem vor allem auf die Zusammenhänge bei den Benutzerrechten geachtet werden sollte, schreiten wir zur Tat. (Das Semikolon leitet Kommentare ein, diese werden nicht ausgeführt):

 ;Allgemeine Einstellungen in der Asterisk Konfigurationsdatei für SIP Telefonie
 ; /etc/asterisk/sip.conf
 ; Ein paar notwendige Grundeinstellungen
 ;
 [general]
 port=5060
 bindaddr=0.0.0.0
 videosupport=no
 dtmfmode=rfc2833
 srvlookup=yes
 directmedia=no
 nat=no
 localnet=192.168.178.0/255.255.255.0 ; Das lokale Netz sowie die Broadcast Adresse
 transport=udp
 callerid=KlingelPi <622> ; Diese Anruferkennung erscheint auf kompatiblen Telefonen
 ;
 ; Der Sip Provider, in unserem Fall die FritzBox
 ; User:Passwort:Ziel/User
 register => 622:Sowasvongeheim@192.168.178.1/624
 ;
 ; Wir legen mal ein Ziel für den Türöffner an:
 [624]
 type=friend
 secret=Sowasvongeheim
 host=192.168.178.1
 insecure=invite,port
 ;
 ; Virtuelles Telefon für das Python Script, das via .call Datei die Überallklingel auslöst.
 [622]
 type=friend
 username=622
 fromuser=622
 secret=Sowasvongeheim
 host=192.168.178.1
 insecure=invite,port

Nun nützt eineM die beste sip.conf nichts, wenn es keine passenden Contexte in der /etc/asterisk/extensions.conf gibt. Wobei, das stimmt nicht ganz, das Script der c't lässt die extensions unberührt. Im Rahmen der Lektüre des Asterisk Handbuches auf der Suche nach alle, was Shell Befehle betrifft, springen einem dann 2 Möglichkeiten zur Befehlsausführung ins Gesicht: System() und TrySytem(). Dazu mal ein Vollzitat:

Führt durch die C-Funktion system() einen Befehl auf der Shell sh aus.
Diese Anwendung ist der TrySystem()-Anwendung sehr ähnlich, abgesehen davon, dass sie -1 zurückliefert, falls sie den Systembefehl nicht ausführen kann, wohingegen die TrySystem()-Anwendung stets 0 zurückliefert.

So. Ob Bash oder sh ist Wurst, wir haben damit die Möglichkeit, daß Asterisk das oeffner.sh Script ausführt. Sofern ein Context zutrifft. Da wir in der FritzBox ja ein Telefon angelegt haben, kommt über dieses mit der Kurzwahl **622 Kennung nicht nur das Signal vom Postboten an der Klingel, sondern mensch kann die **622 auch anrufen. It's Magic!

 ; Entweder an die bestehende /etc/asterisk/extensions.conf anhängen oder überschreiben, sofern keine anderen 
 ; Contexte / Extensions ausgeführt werden müssen.
 ;
 [default]
 ; Das Klingelscript verweist auf die Extension 622:
 exten => 622,1,Answer() ; Asterisk nimmt ab
 exten => 622,2,WaitExten(1) ; wartet 1 Sekunde
 exten => 622,2,Hangup() ; und legt dann auf
 ; Mehr braucht es nicht zum Klingeln
 ;
 ; Anruf bei **622 verweist hierher:
 exten => 624,1,Answer() ; Asterisk nimmt ab
 exten => 624,2,System(/usr/local/bin/oeffner.sh) ; Asterisk ruft die sh Shell auf und führt darin das oeffner.sh Script aus
 exten => 624,3,Hangup() ; Asterisk legt nach Abarbeitung des Scripts auf

Hier wird nun klar, warum ich bei der extensions.conf einige Zeit vertrödelt hatte und letzlich im Unterschied zur c't keinen Rundruf via **9 bei der FritzBox starte, sondern darin eine Gruppe angelegt habe, in der die anzurufenden Telefone vereint sind: Ein Rundruf bei der *9 führt nämlich dazu, daß auch der Öffner ausgelöst wird, denn die **622 ist ja die Nummer, die für die Türöffnung angerufen wird. Und eine Selbstöffnung wollen wir nun nicht wirklich einbauen, das gehört in Arztpraxen...

Ein Blick in das "sauber" von Profis verlegte Siedle HT401a-01
Die Rechnung ohne den Wirt Elektriker

Der bisherige Aufbau empfängt also Signale der Klingel, löst dadurch Anrufe auf den entsprechenden, bei der FritzBox registrierten Telefonen auf der **702 aus und wenn mensch mittels Kurzwahl **622 auf einem dieser Telefone wählt, klickt das Relais.

Das Relais betätigt den Öffner. Wenn es denn (richtig) angeschlossen ist. In unserm Fall verfluche ich jedes Mal die Elektriker, die Ende der 80er Jahre nicht daran gedacht haben, daß im Jahr 2018 jemand einen RaspBerry an ihre "Installation" anschließen will. Es hilft also kein Rezept wie : "Das blaue Kabel durchschneiden, an beide Enden das Relais anschließen, funktioniert 100%". Bestenfalls geht die Klingel nicht, schlimmstenfalls blickt mensch nicht mehr durch...

Nun denn, es hilft nichts, beim Anschluss der Klingel hat sich bei unserer Installation letztlich die gute alte Zahnstochermethode, mit der Kinder gerne Schellenbergerles² gespielt haben (Mit Zahnstocher den Klingelknopf an der Haustüre festklemmen) um die Leitungen oder Anschlüsse zu finden, die in dem Fall im Unterschied zu vorher Spannung anzeigen.

Im Falle unserer uralten Siedle HT401a-01 Anlage war das aber nicht nötig, die Schraubklemmen „7“ und „c“ im Telefon müssen für die Überallklingel abgegriffen werden, wie Moritz Cichon in seinem Blog im Beitrag "Siedle HT401a-01 Klingel austauschen: Endlich ein angenehmer Gong" ausführte.

Bei dem Anschluss des Relais ist es etwas einfacher, hier hilft es, den Öffnerknopf im Haustelefon anzusehen und welche Kontakte er im Auslösezustand schließt. Im Fall Siedle auf die Klemme "I" und den Pin "c" oben rechts auf der Platine. (Der Anschluss an "Lw" wie "Läutewerk"=Vorgabe von Siedle funktionierte bei unserem Telefon leider nicht. Notfalls Platine heraushebeln und die Schaltung an den Leiterplatten nachverfolgen. Hint: Meßgeräte helfen auch hier weiter ;-)) Daran schließen wir dann das Relais parallel an. Keinesfalls in einer Reihenschaltung, sonst löst weder der Türöffner des Haustelefons noch der Anruf bei der **622 den Türöffner aus.

An der Stelle eine Warnung: Auch wenn in Telefonanlagen in der Regel nur niedrige Ströme fließen können diese durchaus unangenehme Folgen (Kurzschluss der Klingelanlage, Stillstand Herzschrittmacher, Mega Ärger mit dem Vermieter usw.) haben. Daher: Ohne entsprechende Ausbildung bitte Fachleute zur Hilfe heranziehen. Es müssen ja nicht die sein, die bei uns die Klingelanlage verlegt haben.

In dem Sinne: Viel Erfolg beim Nachbauen!

Eigentlich fehlt jetzt noch eine Sprechfunktion. Man will ja nicht jedeN ins Haus lassen...



Blogpost enthält Werbung!

**trueten.de ist Teil des Amazon Partnerprogramm EU. Das bedeutet, wenn ihr ein Produkt über die Links kauft, welche mit einem „*“ gekennzeichnet sind (affiliate Link), erhaltet ihr diese zu den üblichen Preisen und ich bekomme eine kleine Provision. So könnt ihr unser Blog ohne extra Aufwand unterstützen! Vielen Dank!

Mailserverumzug

Nach einigen Jahren stand ein Umzug des Mailservers an. Hier läuft das Gespann Postfix / Cyrus / Sieve / SpamAssassin / DCC / Phyzor / Razor sowie, der Vollständigkeit halber, der freie Virenscanner ClamAV, natürlich in der aufgebohrten Version, mit drastisch gesteigerter Erkennungsrate. Diese Kombination sorgt bei uns zusammen mit ein bisschen weiteren Kleinkram, den ich hier nicht erwähne, seit Jahren dafür, daß Probleme mit Mails oder Viren praktisch gar nicht bzw. im Fall von Spam nur sehr vereinzelt auftreten.

Die Einarbeitungskurve ist bei den genannten Servern natürlich nicht gerade flach, zahlt sich jedoch durch Stabilität und Zuverlässigkeit über Jahre aus. (So habe ich heute noch ein paar Mails, die ich, falls mein Blutdruck mal wieder im Keller ist, hervor krame, um mich mal wieder so richtig auzuregen ;-) )

Den mit Abstand größten Aufwand gibt es immer mit dem Cyrus IMAP Server, der sehr stabil läuft, aber auch sehr empfindlich und wenig aussagekräftig bei Fehlern reagiert. So ist zum Beispiel die richtige Einrichtung von Zertifikaten nicht immer ganz trivial. Deswegen getreu dem Motto: Never touch a running System nur Sicherheitsupdates und Parallelbetrieb bei notwendigen größeren Upgrades, um mögliche Ausfälle möglichst gering zu halten. Zwar gibt es immer auch aktuelle Backups, bei Konfigurationsänderungen wegen neuen Features hilft das wenig.

Nachdem also jetzt alles entsprechend zusammengebaut ist, kommt der Streßtest: Import sämtlicher Postfächer aus dem alten in den neuen IMAP Server, Dank der Kombination mit Sieve werden die Mails auch gleich in die entsprechenden automatisch angelegten Ordner einsortiert. Den Importvorgang erledigt imapsync, ein perl Script, das ich aus einer Handvoll Möglichkeiten herausgepickt hatte. Das Script fragt alle möglichen IMAP Postfächer, z.B. Google, GMX, bzw. die jeweils zugrunde liegenden Server wie Courier, Cyrus und wie sie alle heißen, ab und spricht direkt den gewünschten Zielserver an. Gestartet werden kann das Script auf irgendeinem Terminal.

Vor der Installation von imapsync müssen eine Reihe weiterer Bibliotheken und Perl Module installiert werden, zum Beispiel bei dem betreffenden Server, der mit Debian Jessie läuft:

sudo apt install \
libauthen-ntlm-perl \
libcgi-pm-perl \
libcrypt-openssl-rsa-perl \
libdata-uniqid-perl \
libfile-copy-recursive-perl \
libio-socket-inet6-perl \
libio-socket-ssl-perl \
libio-tee-perl \
libhtml-parser-perl \
libmail-imapclient-perl \
libparse-recdescent-perl \
libmodule-scandeps-perl \
libreadonly-perl \
libterm-readkey-perl \
libtest-mockobject-perl \
libtest-pod-perl \
libunicode-string-perl \
liburi-perl \
libwww-perl \
make \
cpanminus

Sobald cpanminus installiert ist, wirft man darüber weitere Module ins System, um die Voraussetzungen für das in Jessie nicht vorhandene Perl Modul Mail::IMAPClient zu installieren:

cpanm Sys::MemInfo

Danach dann:

sudo cpanm Mail::IMAPClient

Sodann kann man für die 2 Faktor Authentifizierung, die im übrigen sehr empfehlenswert ist, das XOAUTH2 Modul installieren:

sudo cpanm JSON::WebToken

Dann kann man endlich dazu übergehen, imapsync selber zu installieren, holen kann man das als normaler User, was natürlich generell empfehlenswert ist:

wget -N https://imapsync.lamiral.info/dist/imapsync

Man macht dann das Script lauffähig:

chmod +x imapsync

Probiert, ob alles geklappt hat:

./imapsync

Und installiert es schließlich an einem beliebigen Ort, hier bei mir immer im lokalen Scriptverzeichnis:

sudo cp imapsync /usr/local/bin/

Die eigentliche Benutzung des imapsync Scriptes ist in der Dokumentation ausführlich beschrieben. Ich setze hier nur eine einfache Variante ein, das Script kann von einem X-beliebigen USer verwendet werden:

/usr/bin/imapsync --host1 imap.gmail.com --user1 karl.napf@googlemail.com --passfile1 ~/secret1 --gmail1 \
--host2 imap.gmx.net --user2 karl.napf@gmx.net --passfile2 ~/secret2 --automap


Das bedeutet, von links nach rechts gelesen: imapsync holt bei Google mit der Userkennung karl.napf@googlemail.com und dem in der Datei ~/secret1 gespeicherten Passwort sowie für Google empfohlenen weiteren Einstellungen die Mails aus dem Postfach und schiebt sie in das GMX Postfach von karl.napf@gmx.net, mit dem in der Datei ~/secret2 gespeicherten Passwort. Der Parameter ermöglicht meiner Erfahrung nach recht zuverlässig das korrekte Mapping bzw. richtige Einsortieren der Mails in die einzelnen Postfächer, jedoch nur die Standards, also Posteingang / INBOX, Gesendet / SENT, Papierkorb / Trash etc.

Weitergehende Sortierung geht über entsprechende regex Filter, die mit imapsync verwendet werden könenn, die bei unserem Server jedoch nicht nötig waren, da die bereits durch jeden User benutzen sieve Filter entsprechend der jeweiligen Bedürfnisse einsortiert werden.

Und nun zum Wetter. Oder: Ein paar nützliche bash Scripts

Am gegenwärtigen Wetter kann man nichts ändern. Aber man kann sich darauf einstellen. Alexander Epstein hat auf github einige nützliche bash Scripte zusammengestellt, zum Beispiel eine anpassbare Wettervorhersage für die nächsten 3 Tage, einen Url Kürzer, einen Videoplayer, Währungsrechner für die Konsole usw. Nach dem Clonen des git Repositories lassen sich alle oder auch nur einzelne der Scripte installieren.

Tags für diesen Artikel: ,
Zuletzt bearbeitet am 26.07.2017 12:20

KeePass2 Plugins unter Ubuntu 16.04 kompilieren

Seit Ubuntu 12.04 ein Problem. Da inzwischen 16.04 lts aktuell ist und ich das jedesmal bei der Installation eines neuen Clients vergesse, leihe ich mal die Gedächtnisstütze bei tuxinaut aus.

Wer Keepass2 Plugins nutzen möchte und folgende Fehlermeldung auftritt:

The following plugin is incompatible with the current KeePass version: /usr/lib/keepass2/OtpKeyProv.plgx

Liegt das daran das mono das Plugin nicht kompilieren kann. Abhilfe schafft das Paket mono-complete zu installieren.

sudo apt-get install -y mono-complete

OnePlusOne: Inoffizielles CyanogenMod 12.1 mit CAF 3.4.0 kernel

Screenshot der aktuellen Version
Heute mal wieder ein Softwaretipp in Zusammenhang mit dem OnePlusOne: Vor allem wegen des nervigen Kamerabugs sind viele User dieses Handys auf der Suche nach einer Lösung. @Sultanxda hat nun vor einigen Wochen auf der Basis von CM 12.1 und einem CAF Kernel einen inoffiziellen CyanogenMod 12.1 Build entwickelt. Diese bietet neben der Behebung des Kamera Bugs durch die Verwendung der OxygenOS Camera Bibliotheken, die unter anderem auch die Performance der Kamera deutlich erhöht und der Snapdragon Camera App von Qualcomman auch eine erhöhte Akkulaufzeit. Letztere durch Drosselung der CPU von 2457MHz auf nunmehr 1958MHz, was sich laut Sultanxda jedoch lediglich in Benchmarkprogrammen und rechenintensiven Apps bemerkbar macht. Er liefert jedoch auch einen Patch mit, der diese Drosselung aufhebt. Dieser muss jedoch bei OTA Updates jeweils neu eingespielt werden.

Der Wechsel auf dieses Build läuft recht problemlos: Backup via Recovery, Recovery auf TWRP 2.8.6.0 up- bzw. Downgraden, da sonst das Modem nicht richtig installiert wird und dann mit den üblichen Befehlen oder mit dem Bacon Root Toolkit flashen sowie anschließend die Google Apps aufspielen. Übrigens klappte es auch mit dem an dieser Stelle von mir geposteten Hinweis auf TWRP 2.8.6.1 für verschlüsselte Dateisysteme.

Hier die Ankündigung:

This is an unofficial CyanogenMod 12.1 build I developed after seeing some of the craziness in the official CyanogenMod kernel (such as massive merges from different sources and untested cherry-picks that introduce random reboots), as well as craziness with CyanogenMod's camera libraries. If you just want your phone to work without any fancy frills then you might be interested in using this. The ROM is the same as official CM12.1 on the outside, but there have been many optimizations under the hood. It comes with a fancy unique kernel I worked on that is cleanly based off of the latest CAF sources.

Custom kernels are not compatible with this ROM unless otherwise noted.

ROM features:

  • Based off latest generic CyanogenMod 12.1 stable sources (root access is not included)
  • OTA updates via built-in CMUpdater
  • Vanilla CAF LA.BF.1.1.1_rb1.26 display HAL (improved display performance)
  • Vanilla CAF LA.BF.1.1.1_rb1.26 media HAL (improved video performance)
  • Vanilla CAF LA.BF.1.1.1_rb1.26 audio HAL (improved audio performance)
  • OxygenOS camera libraries (no camera bugs and improved camera performance)
  • Snapdragon Camera app by Qualcomm (comes with many unique features, such as HSR)
  • Custom camera HAL I modified myself from CAF featuring:
    -HFR (high-framerate; a.k.a. slow-motion video) recording at 60 FPS, 90 FPS, and 120 FPS for 720p, and 60 FPS for 1080p
    -HSR (high-speed video with audio) recording at 60 FPS, 90 FPS, and 120 FPS for 720p, and 60 FPS for 1080p (you need to use the Snapdragon Camera app in order to use HSR)
    -1080p video recording with the front-facing camera
    -2.5k 1440p video recording with the front-facing camera and back camera (only with the Snapdragon Camera app that comes with the ROM)
    -4k video recording at UHD and DCI resolutions
    -Manual focus
    -Slow shutter (ranging from 1/5000th of a second to 2 seconds)
    -More picture sizes than plain OxygenOS, such as 9.7MP 16:9
    -JPEG quality is always set to 100% (pictures are very high quality)
  • Disabled Qualcomm performance daemon (CPU boosting is now handled completely by the driver I wrote)
  • 2 CPU cores are not forced online all the time (saves power this way)
  • WiFi configuration from LG G3 (better WiFi performance and stability)
  • Many other misc. optimizations


Kernel features:

  • Based off latest CAF LA.BF.1.1.1_rb1.26 kernel source from Qualcomm
  • Almost 100% pure CAF (very clean, there shouldn't be any crazy stability or performance issues)
  • Removed lots of excessive debugging
  • Latest CAF LA.BF.1.1.1_rb1.26 prima (WiFi) drivers
  • Rewrote half of the Synaptics touchscreen driver (over 2500 lines of code modified; your touchscreen might work better)
  • Newest available Synaptics touchscreen firmware (no battery drain)
  • Dynamic CPU input boost driver I wrote myself (makes the phone feel smooooth)
  • CPU underclocked to 1958MHz by default (you can disable this; see why I did this in the FAQ in the 3rd post)
  • Improved notification LED color (white doesn't have a blue tint)
  • Vibrator is automatically disabled when recording videos (so the buzzing noise doesn't get in the videos)
  • Custom thermal driver I wrote myself (keeps the phone cool)
  • LCD KCAL by Savoca
  • Westwood TCP congestion algorithm (enabled by default)
  • NTFS support
  • No BS patches, features, or compiler "optimizations"
  • Many other misc. optimizations


Source code:
Kernel (cm-12.1-caf branch): https://github.com/sultanxda/android...neplus_msm8974
Local manifest (contains the rest of the sources): https://github.com/sultanxda/android...l_manifest.xml

Credits:

  • CyanogenMod and its contributors
  • CAF (aka Qualcomm)
  • OnePlus and Oppo for their clean kernel base
  • myfluxi (awesome friend with lots of amazing contributions)
  • 69gm (loyal guinea pig)
  • If your name should be here and it isn't, then make me use an iPhone 4 running iOS 8


Installation instructions (for first-time installation):
First, you must install/use TWRP recovery v2.8.6.0 (TWRP v2.8.7.0 cannot properly update the modem). After installing TWRP v2.8.6.0, perform a clean install (wipe /data and /system). Next, try flashing the ROM and see if it installs; if it installs without any issues then congratulations! Now just flash a Google apps package, and then reboot.

If you get an error when trying to install (TZ version error), then download and flash the latest official CM12.1 nightly. Then, without rebooting from recovery, flash my ROM. This process is necessary to update various firmwares (including TrustZone), as the updated firmware is needed by my ROM. After flashing my ROM, flash a Google apps package, and then reboot.

Installation instructions (for updating to a newer release):
If you are already running my ROM, then you can update to a newer version of the ROM via the built-in OTA updater or by simply dirty-flashing the new ROM build without wiping anything.

Downloads:


Mirror 1: https://www.androidfilehost.com/?w=f...&sort_dir=DESC

Mirror 2: http://forum.xda-developers.com/devdb/project/?id=10021#downloads



Google apps: http://forum.xda-developers.com/andr...gapps-t3116347
SuperSU (if you want root access): http://forum.xda-developers.com/show....php?t=1538053
Disable CPU underclock: http://forum.xda-developers.com/devd...t/dl/?id=12808

Tags für diesen Artikel:
Zuletzt bearbeitet am 04.10.2015 13:07
cronjob