PubliBike Stations Info auf SmartMirror

Ich bin zur Zeit immer wieder mit Velos von PubliBike in Bern unterwegs. Bei der mir am nächsten liegende Station kommt es leider häufig mal vor, dass keine Velos, oder nur E-Bikes (ein E-Bike vom Ostring in die Stadt hinunter macht macht nicht viel Sinn) vorhanden sind. Daher habe ich mir überlegt, es wäre doch cool, wenn ich direkt auf meinem SmartMirror sehen könnte, ob es noch Velos an der Station hat (als Alternative zur Mobile-App). Doch sind die PubliBike Stationsinfos überhaupt öffentlich verfügbar?

Auf der Webseite von PubliBike lässt sich eine Karte mit allen Standorten anzeigen. Auf der Karte sind auch die Velo-Verfügbarkeiten pro Station angegeben.

Und da die Informationen ja irgendwie auf die Karte müssen, gehe ich davon aus, dass ich auch irgendwie darauf zugreifen kann. Ich zoome also mal auf die mir nächstgelegene Station (damit ich nur noch die Daten von dieser Station habe) und öffne die Entwicklerkonsole in meinem Browser. Mit Hilfe des Network-Tab schaue ich mir die Kommunikation der Webseite an. Schnell sehe ich folgenden Request:

Das sieht doch schon vielversprechend aus. Schauen wir uns doch mal die Response dazu an:

{
  "id": 332,
  "latitude": 46.943804,
  "longitude": 7.4694264,
  "state": {
    "id": 1,
    "name": "Aktiv"
  },
  "name": "Egelgasse-Ostring",
  "address": "Egelgasse 72",
  "zip": "3006",
  "city": "Bern",
  "vehicles": [
    {
      "id": 1965,
      "name": "501989",
      "type": {
        "id": 2,
        "name": "E-Bike"
      }
    },
    {
      "id": 2367,
      "name": "102526",
      "type": {
        "id": 1,
        "name": "Velo"
      }
    }
  ],
  "network": {
    "id": 5,
    "name": "Bern",
    "background_img": null,
    "logo_img": "https://www.publibike.ch/static-content/Netz5.svg",
    "sponsors": []
  },
  "sponsors": []
}

Voilà, genau was ich will.

Als nächstes müssen diese Daten auf meinen SmartMirror. Für die Anzeige von Temperaturen verwende ich bereits das Plugin MMM-haas. Dieses kann Sensor-Daten aus meinem Home-Assistant auslesen und auf der SmartMirror darstellen. Die Sensor-Daten wiederum sende ich per MQTT an Home-Assistant. Daher will ich für die PubliBike Daten den gleichen Weg gehen. Bei mir läuft unter anderen auch eine Node-Red Instanz, diese verwende ich nun um die API-Daten von PubliBike zu Verarbeiten und in einen MQTT Channel zu pushen. Der Node-Red Flow dafür sieht wie folgt aus:

Am Anfang des Flows verwende ich einen Inject-Node. Dieser injected einen Payload manuell oder in einem festgelegten Intervall in den Flow. Ich injecte damit die ID der gewünschten PubliBike Station. Danach kommt eine Function-Node der mir den HTTP-Request vorbereitet, d.H. die URL zusammenbaut (mit der ID aus dem vorherigen Node). Nun folgt ein HTTP Request Node der dann effektiv die PubliBike API aufruft und ein geparstes JSON-Objekt zurückliefern. Natürlich hätte ich auf einfach nur den HTTP Request Node verwenden können und die API URL gleich da drin zu speichern. Wie oben im JSON sichtbar, zeigt mir die API alle Velos (und E-Bikes) der aktuellen Station an. Nun muss ich diese aber noch zählen. Dazu verwende ich wieder einen Function-Node mit etwas JavaScript:

var bike = 0;
var ebike = 0;

var vehicles = msg.payload.vehicles;
var stationname = msg.payload.name

for (var x in vehicles) {
    
    vehicle = vehicles[x];
    
    if (vehicle.type.name == "E-Bike") {
      ebike++;
    }
  
    if (vehicle.type.name == "Velo") {
      bike++
    }
}

msg.payload = { "velo": bike, "ebike": ebike, "stationname" : stationname, }
msg.topic = "publibike/" + msg.payload.stationname

return msg;

Der Payload dieser Funktion kommt dann anschliessend in einen MQTT Out Node, der eine Message im ensprechenden Channel (Topic) erstellt. Damit habe ich mal die Anzahl Velos und E-Bikes regelmässig auf einem MQTT-Topic. Der Inject-Node habe ich übrigens mit einem 5 Minuten Intervall konfiguriert. Als nächsten Schritt sollen diese Daten nun von einem Home-Assistant Sensor ausgelesen werden.

Home-Assistant hat dafür einen MQTT-Sensor, ich erstelle also die Konfiguration und lade Home-Assistant neu.

sensor:
  - platform: mqtt
    name: "Publibike Egelgasse-Ostring - Velos"
    state_topic: "publibike/Egelgasse-Ostring"
    value_template: "{{ value_json['velo'] | int }}"
  - platform: mqtt
    name: "Publibike Egelgasse-Ostring - E-Bike"
    state_topic: "publibike/Egelgasse-Ostring"
    value_template: "{{ value_json['ebike'] | int }}"

In Home-Assistant sieht das dann wie folgt aus:

Jetzt fehlt noch die Konfiguration des MMM-haas Modul für den SmartMirror:

{
    module: "MMM-HASS",
    position: "bottom_left",
    config: {
        host: "....",
        port: "8123",
        https: false,
        hassiotoken: true,
        devices: [{
            deviceLabel: "publibike",
            deviceReadings: [{
                sensor: "sensor.publibike_egelgasse_ostring_velos",
                icon: "fa fa-bicycle",
                suffix: ""
                },
                {
                sensor: "sensor.publibike_egelgasse_ostring_e_bike",
                icon: "fa fa-plug",
                suffix: ""
                }
            ]
            },
        ]
    }
}

Auf dem SmartMirror ist nun das gewünschte Resultat zu sehen:

Übrigens, wie auf dem Bild zu sehen, habe ich auch die Daten von aare.guru auf den SmartMirror integriert. Das Vorgehen da war praktisch gleich (Node-Red -> MQTT -> HomeAssistant Sensor -> SmartMirror):

TV7 mit Plex

Vor ein paar Wochen (oder schon Monate) hat Init7 ja bekanntlich ihr TV7 Angebot ohne Mehrkosten in ihr Fiber7 oder Crossover7 integriert. Der von Init7 empfohlene Weg TV7 zu beziehen ist über eine AppleTV App. Darauf habe ich aber keine Lust, da ich kein AppleTV habe sondern eine AndroidTV Box. Da Init7 aber extrem offen ist, können die TV Streams mit einem beliebigen anderen Client über einen Multicast Stream ist bester Qualität bezogen werden.

Nun stellt sich aber die Frage, wie kommt der Stream ins Wohnzimmer. Dafür gibt es mehrere Möglichkeiten, eine davon wäre z.B. der IPTV Simple Client mit Kodi zu verwenden. Dazu stellt Init7 ein .m3u File zur Verfügung. Das ganze funktioniert ohne Probleme, mir fehlt aber der bisher bekannte Komfort wie zappen, EPG, „Non-Nerd“-Friendly Bedienung etc. Eine weiter Möglichkeit ist das TVHeadend Plugin für Kodi zu Verwenden. Dazu muss ein TVHeadend Server laufen. Um das auszuprobieren, habe ich auf meinem Synology NAS das ganze mal in einem Docker Container ausprobiert. Auch das funktionierte grundsätzlich. Die Bedienung anschliessend in Kodi ist aber immer noch nicht so ganz 100% zufriedenstellend. Ich hab sogar kurz darüber nachgedacht, eine eigene AndroidTV App zu schreiben:

Allerdings habe ich damit nicht wirklich Erfahrung und deshalb war mir der Aufwand zu gross.

Kürzlich bin ich dann auf diesen Tweet gestossen:

und da ich Plex auch verwende, wollte ich das gleich mal ausprobieren. Udpxy und Telly habe ich auf meinen Synlology als Docker Container am laufen.

Telly präsentiert sich Plex als HDHomerun Device, welches kompatibel mit Plex ist.

Damit Telly die TV7 Sender Plex zur Verfügung stellt, benötigt es die URL des .m3u File von TV7. Darin stehen alle vorhandenen TV7 Sender, allerdings mit den Multicast URLs der Streams. Plex kann diese nicht direkt abspielen, deshalb wird Udpxy verwendet um aus dem UDP Multicast Stream einen HTTP Stream zu erstellen. Udpxy hat ein HTTP Interface mit welchem der HTTP Stream geladen wird. Die Multicast URL aus dem .m3u File muss also etwas angepasst werden und dann an Udpxy gesendet werden. Das Format welches Udpxy erwartet sieht so aus:

http://ip:port/cmd/mgroup_address:mgroup_port/

Im m3u File sieht die URL so aus:

udp://@239.77.0.5:5000

Nun wäre es möglich, ein eigenes .m3u File manuell zu erstellen und Telly mitzugeben, ich wollte das aber nicht um nicht bei jeder Änderung von TV7 erneut ein m3u File zu erstellen. Ich hab dann halt einfach Telly ein wenig umgeschrieben um das umformatieren der URL automatisch zu machen. Mein Fork von Telly ist unter meinem Github Account zu finden: https://github.com/splattner/telly. Telly ist in Go geschrieben, die Änderungen die ich gemacht habe, sind relativ klein. Das könnte sicher noch etwas schöner gemacht werden, ich habs halt einfach auf meine Bedürfnisse angepasst. Im Repository befindet sich auch ein Dockerfile und der Docker Container dazu wird automatisch gebaut und steht auf Docker Hub zur Verfügung. Mit meiner Änderung kann dem Container neu die Umgebungsvariable UDPXY mit IP:PORT des udpxy Service angegeben werden und telly wandelt dann automatisch die Multicast URL’s in udpxy URL’s um, die Plex abspielen kann.

Plex verwendet anschliessend EPG Daten und verknüpft diese mit den Kanälen von TV7. Ich verwende hier Quickline als EPG Quelle, Plex findet allerdings auch weitere Anbieter in der Schweiz. Das Mapping zwischen TV7 Kanal und dem Quickline EPG musste ich teilweise manuell anpassen, da die Kanäle nicht immer ganz gleich heissen. Weiter sind in den Quickline EPG Daten auch nicht ganz alle Kanäle von TV7 vorhanden. Hier ist noch Optimierungspotential vorhanden (aber Init7 arbeitet wohl bestimmt schon an offenen EPG Daten 😉 )

Anschliessend zeigt Plex die einzelnen Kanäle mit den dazugehörigen EPG Daten an. Plex kann auch direkt Recordings von Filmen / TV Serien etc erstellen. Man kann z.B. automatisch alle Folgen einer TV-Serie aufnehmen.

Die Programme (oder Aufnahmen) kann ich anschliessen mit einem beliebigen Plex Client anschauen, z.B. auf meinem AndroidTV Player im Wohnzimmer. Allerdings muss man hier sagen, auch hier muss man sich etwas an Plex gewöhnen. Man wählt vielmehr die Sendung aus, die man sehen will und Plex spielt dan den ensprechenden Kanal ab. Wenn euer Plex Server aus dem Internet erreichbar ist, könnt ihr somit auch von überall unterwegs TV7 schauen.

Hier noch ein paar Details wie meine Docker-Container laufen:

Telly, läuft bei mir mit Network = Host. Würde aber auch normal mit Bridge und Port-Mapping gehen. Bei mir verwende ich die folgenden Env Variabeln (ihr müsst das natürlich anpassen).

Mit DIRECTMODE = true sagt ihr telly, dass es direkt die UDPXY URL Plex mitteilen soll, damit wir ein unnötiges HTTP Redirect auf dem telly Server umgangen.

Udpxy muss wegen dem Multicast Stream mit Network = Host laufen. Hier werden keine speziellen env Variabeln verwendet. Ich verwende das folgende Image dafür: vistalba/udpxy 

PHP API für Mailman und OpenSource Volleyball-Vereinsmanager MyVBC

Kennt Ihr Mailman? Bei meinem Hosting Provicer Cyon kann ich Mailman für Maillisten verwenden. Aktuell nur in der Version 2.1.20, leider. Warum leider? Dazu komme ich gleich. Gerne stelle ich euch aber zuerst meinen OpenSource Volleyball-Vereinsmanager MyVBC vor.

Für den Volleyball Verein in dem ich engagiert bin (VBC Langenthal) habe ich schon vor längerem eine PHP Web-Applikation geschrieben um die ganzen administrativen Angelegenheiten des Vereins zu regeln. Dies insbesondere, da ich länger als Chef-TK tätig war und mir das Leben während einer Volleyball Saison so einfach wie möglich machen wollte. Irgendwann habe ich dann diese Web-Applikation auf Github unter dem Namen MyVBC veröffentlicht. MyVBC basiert auf einem sehr einfach, auch selbst geschriebenen, PHP Framework. Auch das habe ich der OpenSource Community via Github zur Verfügung gestellt. Den beiden Projekten fehlt es bestimmt noch einiges an Dokumentation damit sie jedermann benutzen kann. Insbesondere ist/war mein PHP Framework sehr stark mit MyVBC gekoppelt und speziell dafür entwickelt worden. Ich habe es erst später herausgelöst und als eigenständige Library eingebunden. Für ein stabiles, flexibles und mächtiges PHP Framework, gibt es viele andere PHP-Frameworks die besser geeignet sind. Auch in MyVBC gibt es noch einige Sachen, die man schöner, flexibler und robuster machen könnte. Primär sind die beiden Projekte auf meinen Use-Case zugeschnitten. Wenn jemand daran Interesse hat, feel free to use. Forkt das Projekt, stellt fragen und beteiligt euch.

MyVBC bietet unter anderen:

  • Eine Mitgliederverwaltung (Stammdaten wie Anschrift/ Adresse und was dazu gehört)
  • Eine Teamverwaltung um zu erfassen, welche Teams wir haben und insbesondere, wer in welchen Teams spielt.
  • Eine Lizenzverwaltung, damit unsere Teamverantwortlichen die Volleyball Lizenzen bestellen können.
  • Eine Spielverwaltung, um einen Überblick über unsere Spiele zu haben. Die Spieldaten werden hierbei automatisch via Schnittstelle unseres Verbandes Swiss Volley Region Solothurn sowie Swiss Volley eingetragen.
  • Eine Schreiberverwaltung, um unseren Spielen, einfach und schnell einen Schreiber zuzuweisen inkl. automatische Benachrichtigung via SMS. (Im Volleyball müssen die Spiele protokoliert werden, dazu werden die Schreiber benötigt).
  • Eine Schlüssenverwaltung, um um unsere diversen Schlüssen den Personen zuzuordnen.
  • Diverse Reports um einfache Auswertungen zu machen.

Hier ein paar Screenshots:

Wenn Ihr MyVBC ausprobieren wollt, könnt ihr alles dazu via Github herunterladen. Ich habe vor kurzen auch einen Installer/Updater für die Datenbank geschrieben. Wenn jemand Interesse hat, oder Mühe hat beim Ausprobieren, setzt euch einfach mit mir in Verbindung. Gerne versuche ich zu helfen. Ee hat sicher noch viel Verbesserungspotential. Übrigens, MyVBC lässt sich auch via Openshift z.B. auf Appuio betreiben. Ich werde versuchen, mal dazu noch etwas zu dokumentieren.

Zurück zu Mailman, unser Verein hat eine Mailliste um alle aktiven Mitglieder zu erreichen. Was liegt als näher, als die Daten aus MyVBC zu verwenden? Leider hat Mailman in der 2.x Version keine brauchbare Schnittstelle. Deshalb habe ich dazu eine einfache PHP API geschrieben. Auch diese findet ihr auf Github. Die API mach HTTP Request auf die Mailman Admin Webseiten. Mit Hilfe von etwas HTTP Response und HTML Parsing kann ich so die Cookie Authentifizierung abgreifen, den CSRF-Token der Forms hohlen und damit via PHP API Interface Member in der Mailliste verwalten. Eine Anleitung dazu findet Ihr im README auf Github. Die PHP API habe ich nur mit Version 2.1.10 von Mailman getestet! Keine Garantie, dass es für alle Versionen geht. Insbesondere hängt die API stark von HTML Layout ab um auf die Daten zuzugreifen. Somit werden nun endlich die Mitglieder automatisch mit Mailman abgeglichen.

MagicMirror – Finalisierung

Gestern konnte ich endlich mein MagicMirror Projekt (zum Grössten Teil) abschliessen. Nach dem ersten Versuch mit Spionspiegel Folie, habe ich Alternativen gesucht. Dazu startete ich zwei Anfragen bei Glasereien. Eine davon wurde bis heute leider nicht beantwortet, bei der zweiten habe ich eine Offerte für ein Spionspiegel aus Glas erhalten. Leider wäre der Spiegel ca 300.- CHF teuer gewesen, 6mm Dick und ca 2.7 Kg schwer. Das ist mir erstens zu teuer und auch von den Massen unpassend. Dann bin ich auf einen Acrylglas-Spiegel 2W gestossen, den ich über die Firma Kunststoffpark bestellen konnte. Preis inkl. Mwst und Versand waren etwas über 90.- CHF. Diesen Acryglas-Spiegel 2W kann ich empfehlen, wenn jemand ein ähnliches Projekt machen will. Den Spiegel habe ich auch schnell erhalten und konnte dann endlich mein MagicMirror fertigstellen.

Damit ich das Display im Spiegel ein- und ausschalten kann, habe ich via Banggood ein 250V Relais bestellt, welches über die GPIO Schnittstelle des Raspberry Pi angesteuert wird. Auch das ist nach etwa 2 Wochen eingetroffen. Mit Python habe ich einen kleinen Daemon geschrieben, der das Relais ansteuert (via SIGUSR1 und SIGUSR2 Signals). Weiter habe ich eine MQTT Schnittstelle in den  Daemon eingebaut, damit ich das Display auch Remote ein- und ausschalten kann. Damit ist nun auch ein produktiver Einsatz von Node-Red. welches ich früher schon Mal erwähnt habe, möglich. Via Node-Red Dashboard habe ich ein einfaches Dashboard erstellt, um das Display An- und Auszuschalten. 

Aktuell steuere ich das Display über einen MQTT Channel smartmirror/command an den ich ein JSON sende. Z.B. {„screen“:“on“} um einzuschalten oder {„status“:“get“} um den Status abzufragen. Beim Status Command wird auf dem Channel smartmirror/status den aktuellen Status via JSON ausgesendet. Das geschieht auch automatisch bei jedem Statuswechsel (von on zu off oder umgekehrt). Vermutlich werde ich diese Schnittstelle aber noch umbauen, ich muss mich noch schlau machen, was hier die gängigen Standards sind um IOT Geräte via MQTT zu steuern. Vermutlich werde ich es so umbauen, dass es nur einen Channel smartmirror/display/power gibt. In den Channel wird dann eine einfache 0 oder 1 gesendet um die Stromzufuhr zum Display zu steuern. Der gleiche Channel kann auch für die Status-Response verwenden werden.

Was noch fehlt, ist ein kleiner Push-Button am MagicMirror, um das Display auch ohne Dashboard Ein-und Auszuschalten. Aktuell habe ich ein via Cronjob getriggertes Script am laufen, um das Display zeitgesteuert Ein- und Auszuschalten (in der Nacht sowie ab spätem Morgen bis spätem Nachmittag läuft das Display z.B. nicht).

Update 22. Mai 2018

Hier ein kurzes Video wie der Spiegel live aussieht

MagicMirror mit Wort Uhr in Berndeutsch

Kennt Ihr Magic Mirrors? Es gibt dazu einige spannende Projekte. Ich selbst hatte Lust, mal so einen zu bauen. Wie genau das geht, erkläre hier aber nicht, dazu gibt es viele gute Anleitungen (z.B. hier) und schliesslich kann man das auch auf viele verschiedene Arten tun. Nur die paar wichtigsten Infos aus meinem Projekt.

  • Ich hatte noch ein altes Raspberry Pi rumliegen, dass ich dafür verwendet habe. Als Betriebssystem kommt Raspian zum Einsatz. Als Software für die Anzeige habe ich MagicMirror genommen. Da ich aber nur die erste Generation vom Raspberry habe, musste ich die Backend Komponente von MagicMirror in einem Docker Container auf meinem Synology NAS laufen lassen. Auf dem Raspberry läuft dann nur ein Browser im Fullscreen Modus.
  • In Magic Mirror sind bereits viele coole Module vorhanden. zwei davon möchte ich aber speziell erwählen:
  • Links oben werden bei mir die Trams von einer Haltestelle hier in Bern angezeigt. Die Daten dazu werden von https://transport.opendata.ch/  zur verfügung gestellt. Dazu verwenden ich ein MagicMIrror Modul von Beny habe es aber ein wenig an meine Bedürfnisse angepasst. Unter anderem habe ich eine Funktion eingefügt, welche Trams (oder Züge) rot einfärbt, wenn es nicht mehr erreicht werden kann, da der Fussweg zulange ist (die Dauer lässt sich natürlich konfigurieren)
  • Als zweites habe ich eine Wort Uhr erstellt, welche die aktuelle Uhrzeit in Berndeutsch ausgibt. Auch diese könnt ich bei mir auf Github herunterladen wenn ihr selbst damit spielen wollt.

Leider fehlt aber noch der Spiegel um das Projekt zu beenden. Mein erster Versuch mit einer Spiegelfolie war leider nicht erfolgreich. Der Spiegeleffekt ist zu klein, es kommt zu viel Licht vom Display hindurch. Ausserdem ist es auch fast nicht möglich, die Folie sauber auf ein Plexiglas oder normales Glas aufzuziehen. Ich habe jetzt verschiedene Anfragen für ein sog. Spionspiegel bei Glasereien und einem Kunststoffhersteller offen und hoffe somit dem MagicMirror bald fertig zu stellen. Hat jemand aus der Schweiz bereits Erfahrungen damit gesammelt? Ich freue mich auf Kommentare dazu.

Linksammlung: Coole Projekte #1

In dieser Kategorie von Beiträgen teile ich mit euch gerne ein paar coole Projekte, über die ich in der Vergangenheit gestolpert bin. Projekte die hier aufgelistet sind, habe ich häufig nur kurz angeschaut um einen ersten Eindruck zu erhalten. Erwartet hier also keines Falls ausführliche Berichte sondern eher eine loose Sammlung von Projekten die ich aus irgendeinem Grund spannend finde.

Heute sind es zwei aus dem Bereich Heim-Automatisierung & Internet of

openHAB http://www.openhab.org/

openHAB ist eine Open-Source Software basierte Heim-Automatisierungs Lösung welche mit vielen bekannten Produkten verwendet werden kann. Ich selbst habe hier leider nicht sehr viele „Smarte“ Geräte im Einsatz und kann deshalb openHAB nur beschränkt ausprobieren. Trotzdem habe ich einen kurzen Test gemacht und es bei mir installiert. Laufen tut openHAB bei mir auf meinem QNAP NAS. Die Installation war ohne Probleme und auch mit dem User-Interface von openHAB kommt man schnell klar. Ich konnte schnell meine LIFX Lampe und auch meine Kodi-Installation integrieren. Wenn ich mal mehr „Smarte“ Geräte habe, werde ich mich sicherlich noch weiter mit openHAB beschäftigen. Am besten macht ihr euch selbst ein Bild davon.

Node-RED https://nodered.org/

Node-Red gehört wohl eher in den Bereich Internet of Things und daher meiner Meinung nach auch in den Bereich Heim-Automtisierung. Darauf aufmerksam wurde ich durch die Youtube Videos von Andreas Spiess. Ein Auszug von deren Webseite beschreibt in kurzen Worten was Node-RED ist:

Node-RED is a programming tool for wiring together hardware devices, APIs and online services in new and interesting ways.

It provides a browser-based editor that makes it easy to wire together flows using the wide range of nodes in the palette that can be deployed to its runtime in a single-click.

Ich hab mal ein wenig darin herum geklickt und obschon ich nicht viel gemacht habe, gefällt mir das Konzept sehr. Sollte ich mal Zeit finden, mich etwas mehr mit IOT zu beschäftigen, werde ich dieses Projekt sicher noch genauer anschauen. Am schnellsten könnt ihr Node-RED wohl mit Docker ausprobieren.

10 Gbit/s auf OM1 Glasfaser (10GBASE-LRM)

Ein kurzen Erfahrungsbericht aus meinem IT-Alltag. Diese Woche musste ich zwei Gebäude an unserem Standort netzwerktechnisch verbinden. Leider stellte sich dabei heraus, dass die vorhandenen Glasfaser mehr als 300 m und weiter eine OM1 Faser ist. Da ich nicht so bewandert mit Glasfaser bin, musste ich mich erstmal schlau machen, was damit möglich ist. Geplant wäre eine 10Gbit/s Verbindung, mit OM1 Fasern sollen aber maximal 220m (10GBASE-LRM) möglich sein. Erschwerend kommt noch dazu, auf den ca. 300 Meter Kabel auch noch 4 Patchungen vorhanden sind. Ich habe es natürlich trotzdem versucht und mir SFP+ Module für 10GBase-LRM besorgt. An beiden Seiten kommt ein Switch von HP zum Einsatz und ich habe mich deshalb für diese SFP+ Module von SwissGBIC entschieden:

SFP+ 10GBase-LRM MultiMode 1310nm 220m DDM X132 / HP

Nachdem alles verbunden war, war ich gespannt ob es funktioniert. Und Tatsächlich, Link ist up und ich habe eine Verbindung über die 300m OM1 Faser mit 10Gbit/s! Momentan ist auf der Leitung noch nicht viel los, ich bin gespannt ob die Verbindung auch mit mehr Traffic stabil bleibt. Hat sonst jemand Erfahrung damit? Zur Sicherheit habe ich übrigens auch noch 1Gbit/s Module, diese Verbindung funktioniert natürlich auch einwandfrei.

Falls sich plötzlich doch noch herausstellt, dass die Verbindung instabil ist, muss ich prüfen, ob Singemode Fasern eingezogen werden sollen. Vorläufig aber mal der Versuch mit den 10Gbit/s, oder wenns doch nicht geht mit 1Gbit/s (von der Auslastung her sollte es locker reichen). Zudem werde ich noch eine zweite Leitung in Betrieb nehmen, also 2 x 10Gbit/s oder eben 2 x 1 Gbit/s.

Ubuntu 16.04 Installation auf einem Trekstor SurfTab wintron 7.0 – Teil 1

Die Migros hat aktuell ein Trekstor SurfTab wintron 7.0 für 39.90 (statt 59.90) im Angebot, da meine Arbeitskollegen sich so eines organisiert haben, habe ich auch gleich zugeschlagen. Auf dem SurfTab läuft ein Windows 8.1, ich habe aber nicht vor, es damit laufen zu lassen. Vielmehr soll eine Linux Variante auf das Tablet geladen werden. Vorläufig versuche ich es mal mit einem Ubuntu 16.04. Gerne zeige ich euch die Hürden und Tücken bei der Installation auf.

Das Tablet hat einem 64 bit Prozessor, offenbar kommt das Tablet aber nur mit einem 32-bit UEFI Bootloader zu recht, Ubuntu 16.04 64 Bit wird aber mit einem 64 Bit Bootloader ausgeliefert. Ihr müsst zuerst das Ubuntu ISO File auf einen USB-Stick schreiben. Dafür gibt es verschiedene Varianten. Zuerst versuchte ich es mit dem Ubuntu „Startmedienersteller“, allerdings konnte ich anschliessend den Stick nicht read+write mounten und konnte deshalb auch den neuen Bootloader nicht drauf kopieren. (-o remount,rw hat nicht funktioniert). Deshalb habe ich unetbootin gefunden und dieses benutzt um das Ubuntu ISO auf den USB Stick zu kopieren.

  • Zuerst den USB Stick neu formatieren, ich habe hier mal eine FAT32 Partition erstellt, da ich nicht sicher war, ob das Surftab von einer Ext4 Partition booten kann.
  • Die neue Partition mounten (wichtig! da sonst unetbootin meckert)
  • unetbootin starten, das ISO File auswählen. Als Typ USB-Laufwerk und dann euren Stick auswählen. Mit OK den Vorgang starten.

UNetbootin

Nun muss der 32-Bit UEFI Bootloader auf den Stick kopiert werden. Ich habe den hier verwendet. Den USB Stick mounten und die Datei in den Ordner „EFI/BOOT/“ kopieren.

Weiter müssen die Pakete „grub-efi-ia32“ und „grub-efi-ia32-bin“ auf dem USB Stick vorhanden sein. Während der Installation versucht Ubuntu diese Pakete zu installieren, allerdings sind diese nicht in dem ISO-File vorhanden. Die Files können einfach ins Root Verzeichnis des USB Sticks kopiert werden.

Anschliessend das Surftab vom USB Stick booten und wie gewohnt die Installation von Ubuntu starten. Am besten schliesst Ihr einen USB Hub an, mit einer Tastatur und Maus sowie einem WLAN Dongle (da die onboard WLAN Karte nicht erkannt wird).
Mit ESC kommt ins BIOS des Tablets, dort müsst Ihr die Bootreihenfolge ändern, damit vom USB Stick gebootet wird.

Damit habt Ihr mal Ubuntu Installiert und könnt davon booten. Nun funktionieren aber noch ein paar Sachen nicht. Diese versuche ich in einem zweiten Teil herauszufinden und werden dann wieder davon berichten.

Trekstore Surftab mit Ubuntu 16.04

Folgendes läuft z.B. nicht nach der Installation: internes WLAN, Touchscreen und wohl auch noch weiters.

von Owncloud zu Nextcloud

Nur ganz kurz, weil es so einfach war… Anlässlich dieses Tweets

habe ich heute mal die Migration von Owncloud zu Nextcloud getestet. Im Blog Beitrag von Novatrend wird auf diese Help Seite von Nextcloud verwiesen. Die Anleitung da habe ich dann auch befolgt:

  1. Backup Config (nur zur Sicherheit)
  2. Alles ausser dem Config und Data Ordner löschen
  3. Nextcloud herunterladen und entpacken
  4. Update via Webbrowser oder OCC starten

That’s it, hat bei mir auf Anhieb geklappt, ich musste einzig ein paar Custom Plugins wieder aktivieren. Data Order war in meiner Installation sowieso an einem anderen Ort und daher im Config File angepasst, deshalb musste ich den original Data Ordner auch nicht beachten.

Was ich allerdings noch nicht weiss, ob ich zukünftig auf Nextcloud oder Owncloud setzen soll? Was denkt Ihr? Meine zweite Owncloud Installation lasse ich mal vorläufig noch und berichte dann später Mal, wie ich mich da entschieden habe.

Let’s Encrypt mit Reverse Proxy

Ihr kennt sicher Let’s Encrypt? Für einen Web Server in meinem Betrieb habe ich kürzlich eine Domain mit einem Let’s Encrypt Zertifikat ausgestattet. Der Web Server läuft bei uns via ein NGINX Reverse Proxy welcher alle Anfragen an einen internen Server weiterleitet. Damit die Let’s Encrypt Zertifikate erstellt werden können, muss folgendes beachtet werden:

Während der Zertifikat Erstellung prüft Let’s Encrypt, dass uns die Domain wirklich gehört, indem diverse Files auf dem Web-Server abgelegt werden, welche dann von Let’s Encrypt abgerufen und geprüft werden. Für genaue Details schaut euch doch mal diesen Beitrag an. Die Let’s Encrypt Zertifikate sind bei uns auf dem Reverse Proxy abgelegt, Verbindung zum Backend Server ist dann über ein Self-Signed Zertifikat gesichert. Damit die Let’s Encrypt Validierung funktioniert, dürfen nicht alle Anfragen an den Backend Server weitergeleitet werden. Mit der folgenden NGINX Konfiguration konnte ich die Let’s Encrypt Zertifikate ausstellen:

server {
 listen ipv4_address:80;
 listen [ipv6_address]:80;
 server_name domainname.tld www.domainname.tld

location /.well-known {
 root /var/www/html;
 }


 location / {

rewrite ^ https://$server_name$request_uri? permanent;
 }
}

Man beachte die /.well-known Location Directive welche für Let’s Encrypt verwendet wird. Darin werden die zu prüfenden Files für Let’s Encrypt abgelegt. (Siehe Let’s Encrypt Dokumentation)

Das Zertifikat wird dann mit:

./letsencrypt-auto certonly --webroot -w /var/www/html -d domainame.tld -d www.domainname.tld

erstellt.

Let’s Encrypt bietet alternativ auch ein Standalone Mode an, dafür muss aber kurzzeitig der bestehende NGINX Reverse Proxy gestoppt werden (deshalb habe ich das bei uns nicht so gelöst)