Wo stehen die Löwen zum Saisonende am 22.05.2021?

In der Winterpause bzw. zum Ende der Vorrunde hat es bei den Löwen für den Aufstieg in die 2. Bundesliga ganz gut ausgesehen. Im Februar / März hat uns dann die Realität wieder eingeholt. Ende März waren es dann noch 9 Punkte auf den Relegationsplatz (hinter Dresden, Rostock, Ingolstadt) – aus meiner Sicht war ein Aufstieg in die 2. Bundesliga damit recht unrealistisch. Aber wie ging es dann in den nächsten Wochen weiter?

An den Spieltagen 29 – 32 gab es 4 Siege in Folge und am Spieltag 33 ein Unentschieden (aber immer noch unbesiegt!). Das war ein schweres Programm, aber 1860 ist erst einmal 1 Punkt auf den Relegationsplatz ran gekommen (auch wenn die Anzahl der Spiele etwas unterschiedlich ist) – Rostock, Dresden und Ingolstadt sind immer noch vorne dabei.

Am Spieltag 34 gab es dann wieder einen ein Sieg (leider haben die Konkurrenten auch gepunktet). Dresden gewinnt die beiden Nachholspiele und überholt damit 1860 wieder in der Tabelle. Am Spieltag 35 trennen sich Ingolstadt und Hansa unentschieden. Dresden kommt auch über ein Unentschieden nicht hinaus. Damit sind die Löwen auf dem Relegationsplatz vor Ingolstadt. Am Spieltag 36 gewinnt Dresden deutlich. Ingolstadt, Hansa und 1860 spielen unentschieden d.h. die Löwen sind weiterhin auf dem Relegationsplatz.

Damit hat 1860 10 Spiele in Folge nicht mehr in der 3. Bundesliga verloren. 🙂

Ein Auszug auf die Tabelle vom 09.05.2021 von kicker.de gibt auch ein sehr positives Bild:

Am 16.05.2021 steht das Endspiel 2/3 gegen den FC Bayern 2 an. Am letzten Spieltag am 22.05.2021 (Endspiel (3/3) geht es auswärts gegen den FC Ingolstadt 04 – das wird ein wahrer Aufstiegskrimi.

Aus meiner Sicht gab es sehr viele gute Mannschaftsleistungen mit wichtigen Siegen in den letzten Spielen (und auch in der gesamten Saison). Die Mannschaft formt sich sehr gut. Das Etat für 2021 sollte ähnlich wie in 2020 sein – ich denke damit wird es auch schwierig wieder in höhere Ligen zu kommen. Trainer Michael Köllner macht auf alle Fälle einen sehr guten Job.

Ist da doch noch etwas für die Relegation oder direkten Aufstieg drin? Hat es für den Aufstieg oder einen Relegationsplatz gereicht? In den nächsten beiden Wochen werden wir es wissen. 🙂

Schauen wir mal, wann es wieder in die 2. oder 1. Bundesliga geht. #ELIL

Wings for Life Run am 09.05.2021

Am 09.05.2021 hat der virtuelle Wings for Life World Run stattgefunden. Es ging bei dem Benefizlauf um eine Spendenaktion für die Querschnittslähmung.

Die Teilnahmegebühren werden zu 100 % an anerkannte Förderstiftungen gespendet. Sämtliche administrative Kosten werden von Red Bull und allen weiteren Partnern getragen.

Dur Werbung rund um München bin ich dem Team “AUDI X EHRENPFLAUME” mit Team Captain Kai Pflaume beigetreten..

Um 13 Uhr startet der Lauf weltweit zur gleichen Zeit. 30 Minuten später startet das Catcher-Car und nimmt die Verfolgung auf. Man läuft so lange bis einen das virtuelle Catcher-Car einholt (ab da ist man aus dem Rennen ausgeschieden).

Mein Ziel waren 25 KM für den Virtual App Run. Mit einer Pace von 5:09 min/km würde man das schaffen. 

Mit einem Ergebnis von knapp unter 21 km habe ich aber das Ziel nicht ganz erreicht (mehr war aber wegen der Hitze auch nicht drin).

Insgesamt waren ca. 190.00 Läufer am Start und haben ca. 4,1 Mio. Euro für die Rückenmarksforschung gesammelt (damit war es die bis jetzt die größte Veranstaltung dieser Art). 

Die Ergebnisse könnt Ihr hier einsehen.

Im Großen und Ganzen ein interessantes Format, aber rein virtuell ist nicht so mein Favorit. Ein gemeinsamer Lauf vor Ort in einer Lokation hätte auf alle Fälle mehr Spaß gemacht. Aber es war ja für einen guten Zweck …

Ab und zu mal “Hangry” sein …

to be hangry – vor lauter Hunger total aggressiv oder gereizt sein

Für die schleichende Hungerwut gibt es im Englischen sogar einen Begriff: “hangry”. Man ist “hungry” (also hungrig) und “angry” (also wütend) zugleich.

Routenplanung zum Laufen mit Komoot

Runtastic hat Anfang 2021 die Routenplanungsfunktion in Ihren Apps abgekündigt und wird diese Schritt für Schritt entfernen.

Es musste also eine Alternative zur Routenplanung und Navigation für das Laufen, Trailrunning, Spazieren gehen und Wandern gefunden werden.

Durch die Empfehlung eines Arbeitskollegen und dem zugehörigen Runtastic-Gutschein war die Alternative Komoot relativ klar in der Auswahl.

Wichtig war mir die Offline-Funktionalität und die Sprachausgabe während der “Navigation”. Durch ein gutes Angebot konnte ich mir auch gleich das gesamte Welt-Paket freischalten. Den Mehrwert für einmalige Kosten gegenüber einem monatlichen Abo-Modell zwischen Premium und dem Welt-Paket habe ich aber noch komplett verstanden. Die gebotenen Mehrwerte passen aus meiner Sicht nicht zu den monatlichen Kosten.

Man hat in der Applikation sehr schnell seine eigenen Routen erstellt oder per GPS importiert (hier am Beispiel meiner Hausrunde). Wenn das nicht ausreicht, gibt es rund um den aktuellen Ort sehr gute Empfehlungen für diverse Runden.

Welche App / Anbieter nutzt Ihr für das Entdecken neuer Routen und Wege? Nutzt Ihr eine Navigationsapp für eure “Läufe”?

 

Lebenslanges Lernen im IT-Umfeld

Die Digitalisierung bringt immer schnellere Änderungen in Geschäftsprozessen und damit im eigenen Arbeitsablauf mit sich. Wie kann man sich entsprechend weiterbilden, um speziell die immer kürzer werdenden Lebenszyklen in der IT zu bewältigen? 

Learning Blocks

Aus meiner Sicht ist die schnelle Anpassbarkeit und das schnelle Einstellen auf neue Situationen im Berufsalltag eine Kernkompetenz. Die entsprechenden Lernmaßnahmen müssen natürlich zum Ziel des Unternehmens und dem Ausbildungs- und Wissensstand des Lernenden passen. Eine gute Kultur muss Spaß auf eine lebenslange Weiterbildung machen. Außerdem sollte die Weiterbildung intrinsisch d.h. aus eigenem Antrieb erfolgen.

Es wird in Zukunft immer mehr breites Wissen als Voraussetzung in der Informationstechnologie gefragt sein. Die Themengebiete werden immer komplexer z.B. Cloud-Anbindungen, hybride Szenarien etc. und man muss sich immer schneller auf geänderte Aufgabenstellungen einstellen. Parallel muss man auch die Markttrends beachten und auf seinem Arbeitsgebiet auch noch ein Experte sein.

Einen guten Mix für die Weiterbildung ergibt sich aus folgenden Bausteinen:

  • Klassische Schulungen
  • E-Learning
  • Podcasts
  • Blog
  • E-Books

Im Kombination kann man dann Blended Learning Konzepte verwenden. Die klassischen vor Ort Schulungen bieten meist zu wenig Transfer von Lernstoff und sollten durch weitere Elemente ergänzt werden. Wenn der soziale Aspekt nicht im Vordergrund steht, würde ich eher meine Zeit in E-Learnings anstatt Präsenzveranstaltungen investieren (dies ist aber auch abhängig vom Lerntyp).

In meinen letzten Artikeln habe ich ein paar Weiterbildungsmöglichkeiten von mir dargestellt:

Als E-Learning-Plattform nutze ich auch noch Lecturio. Hier geht es speziell um den Aufbau von Softskills. Falls man Wissen rund um Micorosft Dynamics aufbauen möchte, empfehlt sich auch die Plattform Learn4D365./ Blended Learning

Wie bildet Ihr euch weiter,  auch wenn wir davon ausgehen müssen das es immer weniger Präsenzveranstaltungen im Umfeld geben wird? Was wäre der Wunsch für Weiterbildungsmöglichkeiten von eurem Arbeitgeber? Was seht Ihr als persönliche Weiterbildung und was erwartet Ihr von eurem Vorgesetzten? Ich bin gespannt auf eure Rückmeldungen.

Speedtest der Internetverbindung mit openHAB regelmäßig durchführen

Ich wollte in unserem SmartHome einen regelmäßigen Speedtest unserer Internetverbindung regelmäßig durchführen lassen. Damit wollte ich herausfinden, ob die zugesicherten Bandbreiten unseres Glasfaser-Anschlusses immer eingehalten werden. Da in openHAB 3 automatisch alle Items persistiert werden, war das nach der Umstellung eine gute Möglichkeit.

Die Erste Idee für die Geschwindigkeitsmessung war das Network Binding. Das habe ich aber dann nicht verwendet, da dies eine ISO-Datei für den Test benötigt (das wollte ich so nicht umsetzen).

Im openHAB-Forum habe ich dann eine individuelle Scripting-Lösung auf Basis Speedtest CLI by Ookla gefunden.

Die Umsetzung war dort sehr gut dort beschrieben. Man muss nur die Systemvoraussetzungen beachten, nicht das hier etwas auf dem eigenen System fehlt (das kann zum Teil im Debugging des Scripts etwas aufwändiger sein).

Die Scripte stellen für mich eine sehr runde Lösung dar, die alle Informationen incl. graphischer Aufbereitung / Icons enthält. In openHAB 3.x werden die Daten automatisch persistiert und damit dann auch längerfristig auswertbar gespeichert.

Ein paar Anpassungen für openHAB 3.x mussten durchgeführt werden:

SpeedTest.items

Die Items werden wie folgt definiert:

Group gSpeedtest <"speedtest">
Group gSpeedChart
String SpeedtestCharts

String      SpeedtestSummary        "Speedtest [%s]"                                            <"speedtest_summary">   (gSpeedtest, gPersist)
Number      SpeedtestResultPing     "Ping [%.3f ms]"                                            <"speedtest_ping">      (gSpeedtest, gSpeedChart)
Number      SpeedtestResultDown     "Download [%.2f Mbit/s]"                                    <"speedtest_download">  (gSpeedtest, gSpeedChart)
Number      SpeedtestResultUp       "Upload [%.2f Mbit/s]"                                      <"speedtest_upload">    (gSpeedtest, gSpeedChart)
String      SpeedtestRunning        "Speedtest läuft ... [%s]"                                  <"speedtest_run">       (gSpeedtest)
Switch      SpeedtestRerun          "Manuell starten"                                           <"speedtest_reload">    (gSpeedtest)
DateTime    SpeedtestResultDate     "Letzte Ausführung [%1$td.%1$tm.%1$tY, %1$tH:%1$tM]"        <"speedtest_date">      (gSpeedtest, gPersist)
String      SpeedtestResultError    "Fehlermeldung [%s]"                                        <"speedtest_error">     (gSpeedtest, gPersist)
String      SpeedtestResultImage    "Bild"

SpeedTest.rules

Die Regel steuert dann die gesamte Logik an (hier ist eine automatischer und eine manueller Start möglich). Hier habe ich meine Anpassungen im Kommentar erfasst: 

val String ruleId = "Speedtest"
val Number calc = 125000 // Converting from bits to Mbits

rule "Speedtest init"
when
    System started
then
    createTimer(now.plusSeconds(195))
    [|
        if(SpeedtestRerun.state == NULL)
        {
            SpeedtestRerun.postUpdate(OFF)
        }
        if(SpeedtestRunning.state == NULL)
        {
            SpeedtestRunning.postUpdate("-")
        }
        if(SpeedtestSummary.state == NULL || SpeedtestSummary.state == "")
        {
            SpeedtestSummary.postUpdate("⁉ (unbekannt)")
        }
    ]
end
rule "Speedtest"
when
    // 1 x am Tag 4 Uhr früh
    Time cron "0 0 4 * * ?" or
    //Time cron "0 0/15 * * * ?" or     // alle 15 Minuten
    Item SpeedtestRerun changed from OFF to ON or
    Item SpeedtestRerun received command ON
then
    //logInfo(ruleId, "--> speedtest executed...")
    SpeedtestRunning.postUpdate("Messung läuft...")
    // execute the script, you may have to change the path depending on your system
    // Please use -f json and not -f json-pretty
    
    //val speedtestExecute = "speedtest -f json"
    // 13.02.2021 - Anpassung damit Lizenz akzeptiert wird
    //val speedtestExecute = "sudo -u openhab /usr/bin/speedtest -f json --accept-license --accept-gdpr"
    //val speedtestExecute = "speedtest -f json"
    
    //var speedtestCliOutput = executeCommandLine(speedtestExecute, 120*1000)
    
    // 13.02.2021 - Anpassung für openHAB 3
    var speedtestCliOutput = executeCommandLine(Duration.ofSeconds(120), "speedtest", "-f", "json")
    // for debugging:
    //var String speedtestCliOutput = "Ping: 43.32 ms\nDownload: 21.64 Mbit/s\nUpload: 4.27 Mbit/s"
    logInfo(ruleId, "--> speedtest output:\n" + speedtestCliOutput + "\n\n")
    SpeedtestRunning.postUpdate("Datenauswertung...")
    // starts off with a fairly simple error check, should be enough to catch all problems I can think of
    // 13.02.2021 - Anpassung notwendig zum Beispiel
    //if (speedtestCliOutput.startsWith("{\"type\":\"result\",") && speedtestCliOutput.endsWith("}}"))
    if (speedtestCliOutput.startsWith("{\"type\":\"result\","))
    {
        var ping = Float::parseFloat(transform("JSONPATH", "$.ping.latency", speedtestCliOutput))
        SpeedtestResultPing.postUpdate(ping)
        var float down = Float::parseFloat(transform("JSONPATH", "$.download.bandwidth", speedtestCliOutput))
        down = (down / calc)
        SpeedtestResultDown.postUpdate(down)
        var float up = Float::parseFloat(transform("JSONPATH", "$.upload.bandwidth", speedtestCliOutput))
        up = (up / calc)
        SpeedtestResultUp.postUpdate(up)
        var String url = transform("JSONPATH", "$.result.url", speedtestCliOutput)
        val img = url + ".png"
        SpeedtestResultImage.postUpdate(img)
        SpeedtestSummary.postUpdate(String::format("ᐁ  %.1f Mbit/s  ᐃ %.1f Mbit/s (%.0f ms)", down, up, ping))
        SpeedtestRunning.postUpdate("-")
        // update timestamp for last execution
        val DateTimeType ResultDate = DateTimeType.valueOf(transform("JSONPATH", "$.timestamp", speedtestCliOutput))
        SpeedtestResultDate.postUpdate(ResultDate)
    }
    else
    {
        SpeedtestResultPing.postUpdate(0)
        SpeedtestResultDown.postUpdate(0)
        SpeedtestResultUp.postUpdate(0)
        SpeedtestSummary.postUpdate("(unbekannt)")
        SpeedtestRunning.postUpdate("Fehler")
        logError(ruleId, "--> speedtest failed. Output:\n" + speedtestCliOutput + "\n\n")
    }
    SpeedtestRerun.postUpdate(OFF)
end

Sitemap

Die Visualisierung erfolgt dann in der Sitemap wie folgt:

        Text item=SpeedtestSummary icon="speedtest" {
            Frame label="Ergebnisse" {
                Text item=SpeedtestResultDown
                Text item=SpeedtestResultUp
                Text item=SpeedtestResultPing
            }
            Frame label="Steuerung" {
                Text item=SpeedtestResultDate
                Text item=SpeedtestRunning label="Speedtest [%s]" visibility=[SpeedtestRunning != "-"]
                Text item=SpeedtestResultError visibility=[SpeedtestRunning == "Fehler"]
                Switch item=SpeedtestRerun mappings=[ON="Start"]
            }
            Frame label="Statistik" {
                Switch item=Chart_Zeitraum_D_W_M_Y label="" mappings=[0="Woche", 1="Monat", 2="Jahr"]
                Chart item=gSpeedtest service="rrd4j" period=W refresh=15000 visibility=[Chart_Zeitraum_D_W_M_Y==0, Chart_Zeitraum_D_W_M_Y=="Uninitialized"]
                Chart item=gSpeedtest service="rrd4j" period=M refresh=15000 visibility=[Chart_Zeitraum_D_W_M_Y==1]
                Chart item=gSpeedtest service="rrd4j" period=Y refresh=15000 visibility=[Chart_Zeitraum_D_W_M_Y==2]
            }
        }

Fazit

Damit konnte ich recht einfach die Messung der Bandbreite bei uns zu Hause in openHAB integrieren. Eine schöne Erweiterung wäre noch die Verfügbarkeit des Internetzugangs regelmäßig zu protokollieren.

Wie messt Ihr in eurem SmartHome die Bandbreite eurer Internetverbindung? Habt Ihr eine bessere Variante als diese manuelle Scripting-Lösung?

Gesunde Ernährung in der IT-Beratung

Jeder will gesund und fit sein. Die Gesunde Ernährung ist natürlich nur ein Baustein dabei. Ist eine gesunde Ernährung bei reiseintensiven Berufen wie der IT-Beratung möglich? Ja ist es!

In den Corona-Zeiten ist es natürlich etwas einfacher, da vermehrt Tätigkeiten ins HomeOffice oder Kundenaktivitäten in die virtuelle Welt verlagert werden. Aus meiner Sicht wird sich die der Anteil der Geschäftsreisen auch nach der Pandemie minimieren. Vor 2020 wäre ich von einer Reisetätigkeit von 3 Tage pro Woche ausgegangen. Ab 2022 gehe ich von 1 Tag pro Woche aus.

Bei einem Blick in meine Vergangenheit, muss ich eingestehen, dass eine gesunde Ernährung bei mir nicht immer im Fokus war. Die vielen Hotelübernachtungen, das meist ungesunde Essen und kaum Sport haben für ein paar Kilos zu viel gesorgt. In 20215 hab ich dann meinen Lebensstil geändert. Ich habe eine Ernährungsumstellung begonnen und als Sportart das Laufen für mich entdeckt (weil das unabhängig vom Ort immer möglich ist).

Im Bezug auf die Ernährung muss jeder für sich die richtige Methode finden.  Mit hat das Programm bei schlankr.de dabei sehr geholfen.

Ich habe mir folgende Gewohnheiten über die letzten Jahre antrainiert:

  • Regelmäßiges Protokollieren aller ernährungsrelevanten Themen
  • Regelmäßiges Wasser-Trinken (Min. 1,5 Liter am Tag)
  • Regelmäßig das Gewicht kontrollieren
  • Kohlehydratreduzierte Ernährung (aber dennoch ausgewogen)
  • In meinem Fall mit etwas mehr Sport kombiniert
  • Weitestgehender Verzicht auf Alkohol
  • 6 Tage in der Woche auf eine gesunde Ernährung achten, 1 x pro Woche einen Cheat-Day
  • Konzentration auf das Wunschgewicht als Ziel

Im meinem Fall war die Ernährungsumstellung recht einfach. Ich habe hauptsächlich Abends auf Kohlehydrate verzichtet z.B. Anstatt Steak mit Pommes ein Steak mit Salat. Ich habe auch darauf geachtet nicht  mehr zwei Mal am Tag warm zu Essen, sondern nur einmal. Firmen können im beruflichen Alltag natürlich auch mit einem betrieblichen Gesundheitsmanagement unterstützen.

Welche Tipps habt Ihr für einen gesunden Arbeitsalltag im Beraterleben?

openHAB 3.0.2 veröffentlicht

Am 23.04.2021 wurde ein neues Update für openHAB veröffentlicht. Die Version 3.0.2 ist notwendig da Bintray zum 01.05.2021 nicht mehr zur Verfügung steht und ein Wechsel auf Artifactory notwendig ist.

Die Version 3.0.2 ist wieder komplett kompatibel zu den vorherigen  3.0.x Versionen.

Es gab mit der neuen Version ca. 25 Bugfixes im System und den bestehenden Plugins. In den Release Notes werden die Änderungen kurz und im GitHub dann im Detail beschrieben.

Update 3.0.1 auf 3.0.2

Ich habe mein System von 3.0.1 auf 3.0.2 ohne weitere Probleme wie folgt umgestellt. Integriertes Backup durchführen und zusätzlich noch eine manuelle Datensicherung ausführen:

sudo $OPENHAB_RUNTIME/bin/backup
/var/lib/openhab/backups/

Danach dann das eigentliche Update durchführen:

sudo systemctl stop openhab.service
sudo apt-get update
sudo apt-get upgrade

Und im Nachgang noch den Cache leeren und das System wieder starten:

sudo systemctl stop openhab.service
sudo openhab-cli clean-cache
sudo shutdown -r now

Fazit

Wenn man sich auf dem aktuellen 3er-Releasezweig befindet, ist ein Update recht einfach möglich. Es handelt sich aus meiner Sicht um ein reines Bugfix-Release und Instrastruktur-Update. In meinem Fall ging es ohne unvorhergesehene Probleme und manuellen Anpassungen vor sich. Wie liefen eure Updates auf openHAB 3.0.2? Gibt es Anpassungen auf die Ihr gewartet habt?