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?  

Amazon Fire Tablet mit Google Play Store

Als Ersatzgerät für unser “Esszimmer-Tablet” haben wir uns ein Amazon Fire HD10 in der 9. Generation gekauft. Bei den Oster-Angeboten gab es da einen guten “Schnapper”. 🙂

Mit der Fire Toolbox ist es recht einfach möglich, den Google Play Store und weitere Services auf dem Gerät zu installieren.

Welche Funktionen nutzt Ihr aus der Fire Toolbox?

 

Was streamt ihr so? Wie sich Nutzungsgewohnheiten ändern!

Amazon Prime Video, Apple TV+, Dazn, Disney Plus, Magenta TV, Joyn Plus, Netflix, Sky Ticket … Das ist erst einmal nur eine Übersicht der möglichen Anbieter von Streaming Diensten für Videos.

“Gefühlt” nutzt jeder in meinem Umkreis bestimmte Streamingdienste. Viele nutzen die entsprechenden Portale die zu ihren Vorlieben passen. Das reguläre bzw. lineare Fernsehen ist bei mir fast komplett verschwunden.

Gibt es überhaupt noch etwas neben den aktuellen Streaming-Portalen? Sieht noch jemand klassisch am TV fern? Kauft aktuell noch jemand DVD’s und BluRay’s?

Es haben sich aber nicht nur die Nutzungsgewohnheiten im Video-Bereich geändert. Auch im Audio-Bereich (z.B. Spotify), Hörbücher (z.B. Audible), Buchzusammenfassungen (z.B. Blinkist), E-Books (z.B. Amazon) oder YouTube zur Informationsbeschaffung wird immer mehr.

Wer kauft überhaupt noch Medien (egal ob physikalisch oder online)? Oder wird in 2021 nur noch gestreamt?

Direkter Aufruf von Items in openHAB 3 (ohne Classic-UI)

Ich habe einen Anwendungsfall in unserem SmartHome, der scheinbar nicht so gängig ist. 🙂

Wenn mein BEDDI-Wecker beim Aufstehen klingelt, soll das Licht langsam gedimmt werden. Das hat mit dem Smarten Wecker und openHAB 2.x mit der Classic-UI per HTTP-Aufruf gut funktioniert. In openHAB 3.x ist die Classic-UI nun nicht mehr dabei. Der BEDDI-Wecker kann nur HTTP-Aufrufe direkt durchführen und hat sonst keine andere Schnittstelle zur Verfügung.

Ich wollte also mit openHAB 3.x wieder Items direkt per HTTP steuern und integrieren (ja mir ist das “Sicherheitsrisiko” bewusst).

Die erste Idee habe ich hier gefunden: https://community.openhab.org/t/external-link-towards-openhab-item/48227/4. Das hat auch im Browser gut funktioniert, aber nicht auf dem BEDDI.

Dann habe ich eine Lösung auf Basis NGINX gefunden (den hatte ich wegen der HueEmulation + Alexa schon installiert). Die Lösung wird hier im Forum beschrieben: https://community.openhab.org/t/how-to-change-an-openhab-switch-with-http-commands/35063/8.

Die Lösung war aber noch auf Basis openHAB 2 und hat mit 3.x nicht direkt funktioniert. Hier ist die Lösung die ich bei mir nun im Einsatz habe:

  location ~ /statechanger/POST/([^/]+)/([^/]+) {
    proxy_pass http://IP:PORT/rest/items/$1;
    proxy_set_header content-type "text/plain";
    proxy_set_header accept "application/json";
    proxy_method POST;
    proxy_set_body $2;
  }

  location ~ /statechanger/PUT/([^/]+)/([^/]+) {
    proxy_pass http://IP:PORT/rest/items/$1/state;
    proxy_set_header content-type "text/plain";
    proxy_set_header accept "application/json";
    proxy_method PUT;
    proxy_set_body $2;
  }

Für die Verwendung mit openHAB 3.x musste ich noch die Header entsprechend anpssen. Hier waren der content-type und das accept wichtig.

So konnte man mit den vorhandenen bereits installierten Komponenten auch direkt eine HTTP-Steuerung von außen der openHAB-Items wieder reaktivieren.

Habt Ihr das Szenario bei euch im SmartHome auch? Oder bin ich der Einzige der openHAB-Items außerhalb des Systems aktivieren möchte?

Das erste Quartal ist vorbei. Wie sieht es mit den Laufzielen aus?

Für das Jahr 2021 hatte ich hier schon etwas zu den Laufzielen geschrieben: Laufziele für das Jahr 2021

Prinzipiell ist man in Pandemie-Zeiten mit dem Laufen noch in einer sehr guten Ausgangssituation, um seine Ziele realisieren zu können. Zu den Laufveranstaltungen gibt es leider noch keine neuen Informationen.

Die Idee mit dem Rom-Marathon ist aber wahrscheinlich schon gestorben – siehe https://www.runnersworld.de/laufkalender/rommarathon/. Der 3-Zinnen-Lauf ist aktuell noch für den 11.09.2021 geplant. Am 17.07.2021 soll bereits der Reschenseelauf stattfinden. Bei der aktuellen Situation kann ich mir das aber alles noch nicht richtig vorstellen. Und wenn es dann recht “individuelle Hygienekonzepte” geben wird z.B. alleine laufen, ohne Zuschauer laufen etc., dann würde ich mir eher Laufveranstaltungen sparen (auch wenn das für die Veranstalter dann noch schwieriger wird).

Da im ersten Quartal auch alle Sportarten in der Halle ausgesetzt wurden, war es mir auch nicht Möglich das Lauftraining durch das Ringen zu unterstützen d.h. ich musste weiterhin 2 x pro Woche auf Adidas Training als Ergänzung ausweichen.

Das Lauftraining verlief aber soweit planmäßig. Ende März 2021 stand ich dann bei 694 Kilometer.

Der Januar 2021 lieg durch den #RWJanuarStreak nahezu perfekt. Im Februar 2021 habe ich dann auch noch einmal fast die 200 km geknackt. Hier hatte ich hauptsächlich Challenges bei Runtastic durchgeführt. Im März 2021 gab es bei den Adidas Runners Munich interessante virtuelle Läufe. 

Dann gab es noch die HI ENERGY SERIES. Diese begann mit einem Cooper Test d.h. 12 Minuten so viele Meter wie möglich laufen. Danach ging es um 1,5 Kilometer mit Maximalgeschwindigkeit. Dann der längste Lauf auf 7 Kilometer, um die 5 Kilometer dann als finales Rennen in Bestzeit am 13.03.2021 zu laufen. Hier konnte ich meine persönliche Bestzeit auf 21:51 Minuten verbessern.

Durch das geänderte Training im Quartal 1 2021 ist auch das Ziel den ICON-Status bei Runtastic zu erklimmen auf alle Fälle in greifbare Nähe gekommen. Das hätte ich in 2020 noch nicht gedacht. 🙂

Wie sehen eure Zwischenstände zu den Laufzielen 2021 aus? Gibt es gravierende Abweichungen oder seid ihr noch alle im Plan?