Excel – Neue Funktion LET am Beispiel eines Verweises

Aufbauend auf dem vorigen Artikel Excel – Vergleich der Möglichkeiten von Verweisen mit Fehler-Handling und Laufzeit-Analyse hier nun eine praktische Vorstellung der Funktion LET.

Egal, ob SVERWEISVVERWEISINDEX + VERGLEICH oder der neue XVERWEIS, alle diese Formeln geben einen Fehler aus, wenn sie keine Übereinstimmung mit dem Suchergebnis finden und sie alle geben eine 0 aus, wenn die Ergebnismatrix keinen Wert enthält. In vielen Auswertungen macht es aber einen großen Unterschied, ob in einer Zelle eine 0 steht oder diese leer ist. Die Verweise liefern jedoch in beiden Fällen als Ergebnis eine 0, was unerwünscht sein kann.

Daher die fiktive Aufgabe:

  • Wird der Suchbegriff nicht gefunden, soll das Wort Error ausgegeben werden
  • Enthält die Ergebnismatrix den Wert 0, soll auch eine 0 ausgegeben werden
  • Enthält die Ergebnismatrix keinen Wert, soll auch das Ergebnis ein leeres Feld sein

Wie im vorigen Artikel zeige ich nun einige Optionen auf, dieses Problem zu lösen. Jede der gezeigten Formeln liefert exakt das gleiche Ergebnis, benötigt aber unterschiedlich viele Schritte dafür. Teilweise muss der identische Verweis mehrfach ausgeführt werden, um zu einem Ergebnis zu gelangen, was natürlich zu Kosten der Gesamtberechnungsdauer geht und bei großen Dateien sehr starke Auswirkungen haben kann.

FormelAnzahl
Funktionen
Anzahl doppelte
Berechnungen
Kompatibilität
=WENN(ISTFEHLER(SVERWEIS(E1;A:B;2;0));"Error";WENN(SVERWEIS(E1;A:B;2;0)="";"";SVERWEIS(E1;A:B;2;0)))63alle Versionen
=WENNFEHLER(WENN(SVERWEIS(E1;A:B;2;0)="";"";SVERWEIS(E1;A:B;2;0));"Error")42ab Version 2007
=WENN(XVERWEIS(E1;A:A;B:B;"Error")="";"";XVERWEIS(E1;A:A;B:B;"Error"))32nur Office 365
=LET(x;XVERWEIS(E1;A:A;B:B;"Error");WENN(x="";"";x))31nur Office 365 ab Version 2102

Wie man sieht, nimmt die Gesamtmenge der einzusetzenden Funktionen ebenso wie die unnötigen Doppelberechnungen kontinuierlich ab. Je neuer die genutzen Funktionen, umso kürzer und effektiver wird auch die Gesamtformel, im Gegenzug sinkt aber auch die Kompatibilität zu älteren Excel-Versionen. Im Austausch mit externen Partnern sollte man das im Blick behalten.

Auf einen Performance-Vergleich verzichte ich an dieser Stelle, im vorigen Artikel hab ich ja bereits aufgezeigt, dass neuer und kürzer nicht zwingend auch mit schneller gleichzusetzen ist.

Die neue Funktion LET ist dabei schnell erklärt: Man definiert immer erst eine Variable und weißt der Variable anschließend einen Wert zu. Das kann man “beliebig” oft machen (gibt sicher ein Limit), abschließend muss dann noch die eigentliche Formel angegeben werden, deren Ergebnis später auch in der Tabelle ausgegeben werden soll. Auf die bereits definierten Variablen kann man im weiteren Verlauf jederzeit Bezug nehmen.

Ein Beispiel steht schon oben, aber hier nochmal ein ganz einfaches zum besseren Verständnis:

=LET(x;1;y;2;x+y)
=LET(x;1;y;2;z;x+y;x+y+z)

Man kann man dieser neuen Funktion relativ übersichtlich Zwischenberechnungen anstellen, ohne dass ein völlig unleserlicher Formelwulst entsteht oder zig Extraspalten für die Zwischenergebnisse angelegt werden müssen.

Veröffentlicht unter Coding | Verschlagwortet mit , | Kommentare deaktiviert für Excel – Neue Funktion LET am Beispiel eines Verweises

Excel – Vergleich der Möglichkeiten von Verweisen mit Fehler-Handling und Laufzeit-Analyse

Viele Wege führen nach Rom, heißt es so schön. Das trifft natürlich auch bei Excel zu, es gibt viele unterschiedliche Ansätze, um letztlich zu dem selben Ergebnis zu gelangen. Aber einige davon sind nur schlecht lesbar, aufwendig zu aktualisieren und zudem auch noch sehr unflexibel.

Ein gutes Beispiel dafür ist der klassische SVERWEIS. Er ist extrem unflexibel, da man den genauen Spaltenindex innnerhalb seiner Suchmatrix angeben muss. Verändert sich die Matrix, weil zusätzliche Spalten eingefügt wurden, liefern die SVERWEISE plötzlich falsche Ergebnisse und müssen manuell angepasst werden. Außerdem spucken sie einen Fehler aus, wenn sie das Suchkriterium nicht in der Matrix finden können. Dieser Fehler muss ggf. abgefangen werden, wenn man ihn nicht im Ergebnis haben möchte.

Die älteste Lösung für dieses Problem sieht man auch heute noch am häufigsten und ist eine Kombination aus WENN und ISTFEHLER. Der SVERWEIS wird hier doppelt angegeben und muss natürlich auch doppelt von Excel ausgeführt werden.

=WENN(ISTFEHLER(SVERWEIS(E1;A:B;2;0));"";SVERWEIS(E1;A:B;2;0))

Eine etwas modernere Variante bietet die Funktion WENNFEHLER, welche aber scheinbar nicht so bekannt ist. Sie macht exakt das gleiche wie die erste Lösung, ist aber schneller, besser lesbar und bietet eine potentielle Fehlerquelle weniger, da der SVERWEIS nur noch einmal angegeben werden muss.

=WENNFEHLER(SVERWEIS(E1;A:B;2;0);"")

Die beste und modernste Variante gibt es erst seit einigen Monaten. Microsoft hat Excel um eine ganze Reihe sogenannter dynamischer Matrixformeln​ ergänzt. Eine davon ist der XVERWEIS, welcher quasi als Ersatz für SVERWEIS sowie VVERWEIS genutzt werden kann, aber viel flexibler ist und um einige sinnvolle Funktionen ergänzt wurde.

=XVERWEIS(E1;A:A;B:B;"";0;1)

Große Neuerungen beim XVERWEIS:

  • Er beinhaltet gleich das Fehler-Handlung, mann benötigt also weder WENNFEHLER noch ISTFEHLER.
  • Die Suchmatrix und die Ergebnismatrix werden separat angegeben und passen sich wie jede andere Formel mit Zell-, Zeilen- oder Spaltenbezug in Excel automatisch an, sobald neue Spalten oder Zeilen eingefügt werden.
  • Die Suchreihenfolge kann angegeben werden. Verweise stoppen immer beim ersten Suchtreffer und ignorieren alle nachfolgenden Ergebnisse. Hat man eine nach Datum absteigend sortierte Liste, bekommt man beim SVERWEIS somit immer das älteste Datum als Ergebnis geliefert. Beim XVERWEIS kann angegeben werden, ob die Suche aufsteigend oder absteigend erfolgen soll. Die Formel selbst nimmt aber keine Sortierung vor, man bekommt halt nur den ersten Treffer von oben oder von unten.
  • Für das Ergebnis können mehrere zusammenhängende Spalte angegeben werden. Das ist eine der Besonderheiten der dynamischen Matrixformeln. Anstatt mehrere einzelnen Verweise in jeder Spalte schreiben zu müssen, kann man jetzt in der ersten Spalte den XVERWEIS schreiben und in der Ergebnismatrix alle Spalten angeben, die einen interessieren (sofern sie zusammenhängend sind). Der XVERWEIS erweitert sich dann automatisch um so viele Spalten, wie für die Ausgabe der Ergebnisse erforderlich ist.

Laufzeiten

Nur weil etwas kompakter geschrieben wird, muss es nicht unbedingt schneller sein. In den offiziellen Microsoft Docs gibt es einen Beitrag, der sich um Formel-Laufzeiten dreht. Darin wird auch ein Makro zur Messung der Laufzeiten vorgestellt. Da die Kalkulationsgeschwindigkeit aber dadurch beeinflust wird, wie leistungsstark der Prozessor ist und wie stark er grade ausgelastet wird, gibt es teils starke Abweichungen zwischen jedem Ermittlungsversuch. Die Messung auf eine einzelne Zelle macht darüber hinaus wenig Sinn.

Ich habe daher die 3 oben vorgestellten Formeln jeweils auf eine Suchmatrix mit 3500 Einträgen angewendet und auch in 3500 Zellen mit der jeweiligen Formel das Ergebnis ermitteln lassen. Die Laufzeitberechnung erfolte dann via RangeTimer auf den jeweiligen Formel-Range. Bei 6 Durchgängen für jede der 3 vorgestellten Schreibweisen kam es im Durchschnitt zu folgenden Laufzeiten:

FormelkombinationDurchschnittliche Laufzeit
WENNISTFEHLER + 2x SVERWEIS0,19176 Sekunden
WENNFEHLER + ISTVERWEIS0,11493 Sekunden
XVERWEIS0,19892 Sekunden

Das Ergebnis ist natürlich nicht repräsentativ, da nur ein relativ kleiner Range betroffen ist und “nur” 6 Durchläufe gemacht wurden. Aber es zeigt eine Tendenz auf. So liegen die klassische alte Vorgehensweise sowie der ganz neue XVERWEIS zeitlich in etwa gleich auf, was wohl dem größeren Funktionsumfang des XVERWEIS geschuldet ist. Klarer Sieger bezüglich der Laufzeit ist WENNFEHLER.

Hier geht es zwar nur um wenige Millisekunden, aber bei großen Dateien mit sehr vielen Formeln summiert sich das schnell und macht eine Datei unerträglich langsam.

Veröffentlicht unter Coding | Verschlagwortet mit , | Kommentare deaktiviert für Excel – Vergleich der Möglichkeiten von Verweisen mit Fehler-Handling und Laufzeit-Analyse

AHK – Speichern von eMails aus Outlook im Explorer mit Zeitstempel

Aus unterschiedlichsten Gründen kann es erforderlich werden, eine bestimmte Menge eMails im Explorer oder auf einem Netzlaufwerk abzulegen. Das ist mit Outlook generell auch recht einfach per Drag & Drop realisierbar, birgt aber einige Probleme. Das größte Problem: Die Mails bekommen im Explorer alle das heutige Datum und nicht das Sende- / Empfangsdatum gesetzt. Und bei Mailketten wird einfach nur eine laufende Nummer am Dateinamen angehangen. Eine chronologische Sortierung ist somit vollständig ausgeschlossen. Erschwerend kommt auch noch hinzu, dass Outlook beim kopieren nicht prüft, ob die max. zulässige Zeichenzahl von 255 für Pfad + Dateiname überschritten wird. Es kann beim einfachen Kopieren also auch zu Abbruchfehlern führen.

Im Internet gibt es haufenweise Makros und AddIns für Outlook, mit denen sich die Mails recht komfortabel mit beliebigen Informationen im Dateinamen speichern lassen (u.a. Zeitstempel). Allerdings ist die Ausführung von Makros in Outlook auf den betreffenden PCs gesperrt.

Zum Glück stehen aber andere Hilfmittel zur Verfügung. Eines davon ist AutoHotKey (AHK).

Das beigefügte AHK-Script speichert beliebig viele eMails mit Zeitstempel in einem frei wählbaren Verzeichnis innerhalb des eigenen Benutzerprofils. Dazu müssen die gewünschten eMails in Outlook markiert werden, anschließend drückt man F9. Daraufhin öffnet sich ein Eingabedialog, in welchem man das Zielverzeichnis auswählen und bei Bedarf auch neue Ordner anlegen kann. eMails mit gleichem Betreff und auf die Sekunde identischem Zeitstempel werden nur einmal abgelegt. Zu lange Betreffzeilen werden eingekürzt, so dass der Zielpfad + Zeitstempel und Mailbetreff in Summe eine Länge von 255 Zeichen nicht überschreiten.

Um das AHK-Script zu starten, muss zunächst natürlich AHK installiert sein. Danach genügt ein Doppelklick auf die Datei, um sie in AHK zu laden.

Soll das AHK-Script bei jedem Systemstart automatisch geladen werden, muss eine Verknüpfung zum AHK-Script im Autostart-Ordner gespeichert werden. Diesen erreicht man sehr schnell, indem man gleichzeitig auf die Tasten [Windows] und [R] drückt. Es öffnet sich der Ausführen-Dialog. Hier gibt man nun den Befehl shell:startup ein und bestätigt mit OK. Anschließend öffnet sich der Autostart-Ordner.

Outlook muss in der deutschen Sprachversion genutzt werden, andernfalls sind Anpassungen in den Zeilen 31-36 erforderlich.

; Das nachfolgende Script basiert auf den folgenden Projekten
; https://www.autohotkey.com/boards/viewtopic.php?t=12682
; https://www.autohotkey.com/boards/viewtopic.php?t=47969
; es wid gestartet, wenn im Hauptfenster von Outlook die Taste F9 gedrückt wird

#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
EnvGet, A_UserProfile, UserProfile ; UserProfile-Directory as variable

#IfWinActive, ahk_exe OUTLOOK.EXE
F9::

; Auswahl des Verzeichnis, in welches die Mails gespeichert werden sollen
FileSelectFolder, FileFolder, %A_UserProfile%, 1, Bitte Verzeichnis zum Speichern der Mails auswaehlen
if ErrorLevel
	return

olApp := ComObjActive("Outlook.Application")
Window := olApp.ActiveWindow 
if (Window.Class = 34) {  ; 34 = Prüfen, ob das Outlook-Hauptfenster geöffnet ist
    Selection := Window.Selection
    if (Selection.Count > 0) {
        Loop, % Selection.Count {
            Item := Selection.Item(A_Index)
			
            ; Zeichen entfernen, welche im Dateinamen nicht zulässig sind: \ / : * ? | " < >
            FileName := RegExReplace(Item.Subject, "[\?<>/\\\*""|:]")
			
			; Datum der Mail einlesen, zerlegen und für die Ausgabe neu zusammensetzen
			; setzt deutsches Datumsformat DD.MM.YYYY hh:mm:ss voraus
			olReceivedTime := Item.ReceivedTime
			date_d := SubStr(olReceivedTime, 1, 2)
			date_m := SubStr(olReceivedTime, 4, 2)
			date_y := SubStr(olReceivedTime, 7, 4)
			date_h := SubStr(olReceivedTime, 12, 2)
			date_min := SubStr(olReceivedTime, 15, 2)
			date_s := SubStr(olReceivedTime, 18, 2)
			olTime := date_y "-" date_m "-" date_d " " date_h "." date_min "." date_s
            
			; Speicherpfad und Dateinamen zusammensetzen
			FileDir := FileFolder "\" olTime " - " FileName ".msg"

			FileDirLen := StrLen(FileDir)
			FileDirMinLen := StrLen(FileFolder "\" olTime " - " ".msg")
			
			; Prüfen, ob die Verzeichnisnamen bereits zu lang sind, so dass selbst das Minimum an Dateinamen nicht mehr gespeichert werden könnte
			if (FileDirMinLen >= 255) {
				MsgBox, Mails koennen nicht gespeichert werden, da die maximal zulaessige Zeichenzahl von 255 Zeichen fuer Pfad + Dateiname ueberschritten wird
				return
			}

			; Prüfen, ob der Pfad + Dateiname insgesamt länger als 255 Zeichen wird. Trifft dies zu, wird der Mail-Betreff passend eingekürzt
			if (FileDirLen > 255) {
				FileNameLen := StrLen(FileName)
				FileNameSub := FileNameLen - (FileDirLen - 256)
				FileName := SubStr(FileName, 1, FileNameSub)
				FileDir := FileFolder "\" olTime " - " FileName ".msg"
			}
			
			; Mail nur speichern, wenn noch keine gleichname Datei mit exakt identischen Zeitstempel vorhanden ist
			if !FileExist(FileDir) {
				Item.SaveAs(FileDir, 3)
			}

			; Alternativ alle Mails speichern und doppelte mit laufender Nummer ablegen
			; kann bei erneutem Durchlauf zu Fehlern führen
;			if FileExist(FileDir) {
;                Loop, {
;                    FileDir := FileFolder olTime " - " FileName "(" (A_Index + 1) ").msg"
;                    if !FileExist(CorrectedPath)
;                        break
;                }
;			}
;			Item.SaveAs(FileDir, 3)
        }
    }
}
return
#If
Veröffentlicht unter Coding | Verschlagwortet mit , | Kommentare deaktiviert für AHK – Speichern von eMails aus Outlook im Explorer mit Zeitstempel

Dynamische Matrixformeln in Office 365

Seit einiger Zeit gibt es endlich einen Schwung neuer Formeln für Microsoft Excel, welche sich schon lange in der Beta befunden haben. Microsoft nennt sie dynamische Matrixformeln, in anderen Quellen werden sie auch gelegentlich als dynamische Array-Funktionen bezeichnet.

Matrix-Formeln gab es schon sehr Lange in Excel, diese mussten mit [Strg] + [Umschalt] + [Enter] bestätigt werden und wurden dann in geschweiften Klammern { … } angezeigt. Bei dieser neuen Form der Matrixformeln ist das nicht mehr erforderlich, man schreibt die Formel einfach in die erste Zelle des Bereichs und sie erweitert sich anschließend automatisch und dynamisch um die individuell benötigte Zellenanzahl.

Derzeit scheinen die folgenden neuen Formeln bereits freigeschaltet und auch auf unseren APS nutzbar zu sein (vorausgesetzt, Office 365 ist verfügbar):

  • EINDEUTIG
  • SORTIEREN
  • SORTIERENNACH
  • SEQUENZ
  • FILTER
  • ZUFALLSMATRIX

Weitere Informationen zu den dynamischen Matrixformeln allgemein sowie den einzelnen Formeln im speziellen gibt es auf den Support-Seiten von Microsoft: https://support.microsoft.com/de-de/office/dynamische-matrixformeln-und-versch%C3%BCttetes-array-verhalten-205c6b06-03ba…

Achtung: Diese sind nur in Office 365 verfügbar und somit zu 100% inkompatibel zu älteren Office Versionen! Ob sie in der Standalone Version Office 2019 verfügbar sind, ist unklar.

Eine weitere neue Formel, welche ebenfalls Funktionalitäten der dynamischen Matrixformeln beinhaltet, aber nicht auf der Infoseite aufgeführt wird, ist der XVERWEIS.

Diese kann zukünftig die bisherigen Formeln SVERWEIS sowie WVERWEIS vollständig ersetzen, da beim XVERWEIS egal ist, ob horizontal oder vertikal gesucht werden soll. Der Datenblock muss nicht mal zusammenhängend sein. Zudem ist man nicht mehr auf die Suche “nach rechts” bzw. “nach unten” beschränkt, dem XVERWEIS ist völlig egal, an welcher Position sich Suchkriterium und Ergebnis(se) befinden. Richtig, es können mehrere Spalten bzw. Zeilen als Ergebnis zurückgegeben werden, an diesem Punkt kommt das dynamische Array zum Einsatz. Und es wird nicht mehr über einen Indexwert referenziert, sondern man gibt die Zielspalte oder Zeile direkt an, so können auch problemlos nachträglich Zeilen oder Spalten hinzugefügt oder gelöscht werden, ohne den XVERWEIS erneut anpassen zu müssen.

Als weitere Features kommen dann noch die Suche nach dem nächst größeren oder kleineren Ergebnis, wenn kein 1:1 Treffer erzielt werden kann sowie die Suche nach Wildcards, wobei hier * für beliebig viele Unbekannte und ? für genau eine Unbekannte genutzt werden können. Auch kann ein Default Rückgabewert definiert werden, der ausgegeben wird, wenn keine Übereinstimmung gefunden wird. Den Einsatz von WENNFEHLER oder ISTFEHLER kann man sich somit sparen.

Zu guter Letzt kann auch noch eingestellt werden, ob von oben nach unten oder umgekehrt gesucht werden soll. Auch eine Binärsuche soll möglich sein, da ist mir aber noch unklar, was sich hinter dem Begriff verbirgt.

Weitere Informationen zu XVERWEIS gibt es auf den Support-Seiten von Microsoft: https://support.microsoft.com/de-de/office/xverweis-funktion-b7fd680e-6d10-43e6-84f9-88eae8bf5929

Veröffentlicht unter Coding | Verschlagwortet mit , | Kommentare deaktiviert für Dynamische Matrixformeln in Office 365

Notepad++ Regex Datum finden und ersetzen

Ziel: Datum im Format dd.mm.yyyy soll in Anführungszeichen gesetzt werden.

Suchen: (\d{2}.\d{2}.\d{1,4})
Ersetzen: “\1”

Veröffentlicht unter Coding | Verschlagwortet mit , | Kommentare deaktiviert für Notepad++ Regex Datum finden und ersetzen

DSL und Glasfaser parallel betreiben mit 2 Fritzboxen

Schöne neue Welt, vor kurzem wurde endlich der Glasfaseranschluss scharf geschaltet, doch noch ist der alte Telekom Vertrag nicht abgelaufen. Für 3 Monate komme ich daher nicht um einen Parallelbetrieb herum, da mir der neue Betreiber bis zum offiziellen Vertragsende nur Internet ohne VOIP zur Verfügung stellt (Rufnummermitnahme sei dank).

Bisheriger Anschluss:
Telekom VVDSL 100/40
Telekom VOIP

Neuer Anschluss:
Glasfaser 500/100

Verfügbare Geräte:
2x Fritzbox 7590 (im folgenden Fritz-DSL und Fritz-GF genannt)
1x Fritzbox 7390

Meine Wunschvorstellung deckt sich mit der vieler anderer Internetnutzer, wie ich Google entnehmen konnte: Man will das schnellere Internet, aber trotzdem weiter telefonisch erreichbar sein. Dumm nur, dass einem die Telekom da einen Strich durch die Rechnung macht, denn eine nomadische Nutzung des VOIP an einem Fremdanbieteranschluss wird nicht angeboten. Hat garantiert Sicherheitsgründe, wenn beispielsweise der Notruf angerufen wird, man aber keine Auskunft mehr zum Standort machen kann, dann kann die Adresse traditionell zumindest anhand der Rufnummer ermittelt werden. Bei nomadischer Nutzung könnte man sich aber eben so gut grade auf Mallorca aufhalten. Macht also schon irgendwie Sinn, auch wenn es im aktuellen Szenario sehr hinderlich ist.

Die naheliegenste Option: 3 Monate echter Parallelbetrieb. Man stellt beide Fritzboxen quasi direkt nebeneinander, deaktiviert bei der Fritz-DSL das WLAN und klemmt alle per Ethernet angeschlossenen Geräte ab. Somit stellt sie weiterhin die VVDSL Verbindung her und kann das VOIP abhandeln, ansonsten spielt sie im Netzwerk aber keine Rolle mehr. WLAN sowie der Versorgung der Ethernet-Geräte übernimmt ausschließlich Fritz-GF.

Leider ist die WLAN-Abdeckung im Obergeschoss bisher immer mäßig gewesen, und grade für Home-Office somit eher suboptimal. Daher tue ich mich schwer damit, beide Geräte nebeneinander im Erdgeschoss aufzustellen. Eine Verteilung über beide Stockwerke wäre sinnvoller. Nun könnte ich natürlich noch die etwas angestaubte 7390 reaktivieren und als Switch / Repeater der Fritz-GF nutzen. Dann sind aber schon 3 Geräte in Betrieb für eine Aufgabe, die sich doch auch irgendwie mit 2 Geräten umsetzen lassen muss.

Eine weitere Idee war es, einfach die MESH-Funktionalität der beiden Fritzboxen zu nutzen. Nach kurzem Test die Ernüchterung, das funktioniert nicht, denn eine Box gibt alles vor. Man hat also je nach MESH-Master entweder VVDSL + VOIP an beiden Geräten, oder aber Glasfaser ohne VOIP.

Die Frickel-Idee: Die Fritz-DSL ist ja bereits vollständig eingerichtet und in Betrieb. Somit erstmal entsprechend der ersten Option die Fritz-GF als separates Netzwerk einrichten. Bei der Einrichtung aber schonmal drauf achten, dass man den gleichen IP-Range verwendet, ohne Konflikte bei der Adressvergabe zu verursachen. Nun deaktiviert man auf der Fritz-DSL den DHCP-Server (sowohl IPv4 als auch IPv6) und verbindet beide Fritzboxen per LAN-Kabel miteinander. Somit wird allen Geräten, welche sich an Fritz-DSL anmelden, via DHCP die Fritz-GF als Internet-Gateway mitgeteilt und nutzen die bessere Internetverbindung, obwohl die Fritz-DSL auch weiterhin selbst VVDSL zur Verfügung stellt.

Nur beim Thema VOIP war ich mir nicht sicher, ob es mit dieser Konstellation klappt oder nicht. Meine Hoffnung war, dass die Telefonie im Gerät direkt auf den Internetzugang gelegt wird und keinen “Umweg” über die gleiche Schnittstelle nimmt, an welcher WLAN und Ethernet hängen. Habe mit diesem Ansatz daher bei der AVM-Hotline angerufen und gefragt, ob das was werden kann, man wollte bzw. konnte das aber weder dementieren noch bestätigen. Nur das es eine äußerst unsaubere Lösung sei und die Fritzboxen dafür nicht konzipiert seien.

Also rein in den Live-Test. Alles so konfiguriert und verkabelt wie beschrieben und gespannt die Ergebnisse abgewartet. Und man kann sagen, im Großen und Ganzen funktioniert es auch. VOIP läuft tatsächlich weiter direkt über VVDSL, alles andere nimmt auch wie geplant den Weg über die Glasfaser. Aber…

Während ich per Ethernet an beiden Fritzboxen nahezu maximale Geschwindigkeiten messen kann, scheint sich das WLAN mit der Lösung nicht ganz anfreunden zu können. Im WLAN der Fritz-GF bekomme ich mit 200-300 MBit/s down und knapp 90 MBit/s up ganz ordentliche Geschwindigkeiten, im WLAN der Fritz-DSL hingegen komme ich nur auf 70-150 MBit/s down und 85 MBit/s up…der Upload ist spannenderweise recht stabil, während der Download stark schwankt.

Werde die Kanäle nochmal prüfen, hab aktuell beide Fritzboxen im Auto-Modus, vielleicht stehen die sich ja gegenseitig im Weg rum.

Ebenfalls wäre es nochmal einen Versuch wert, ob man auf beiden Geräten die gleiche SSID und gleiches Passwort verwenden kann, um zwischen beiden Netzwerken nahtlos wechseln zu können…also quasi MESH nur ohne MESH. Bin aber nicht sicher, ob das was werden kann.

Veröffentlicht unter Allgemein | Verschlagwortet mit , , | Kommentare deaktiviert für DSL und Glasfaser parallel betreiben mit 2 Fritzboxen

Zwei separate Stromkreise via Funkschalter gleichzeitig schalten

Immer wieder spannend, was aus einer vermeintlich einfachen Aufgabenstellung so entstehen kann.

Ausgangssituation: Wir haben vor dem Haus sowie hinter dem Haus im Dachüberstand jeweils 4 Lampen verbaut, um eine ausreichende Beleuchtung in der dunkleren Jahreszeit sicherzustellen. Vorne wird von innen per Schalter dauerhaft an/aus geschaltet, zudem werden die Lampen von einem Bewegungsmelder angesteuert. Hinter dem Haus werden die Lampen nur von innen mit einem Schalter bedient, welcher sich im HWR befindet. In der Wohnstube, wo ebenfalls eine Terrassentür verbaut ist, fehlt ein entsprechender Schalter. Die jeweils 4 Lampen hängen an unterschiedlichen Stromkreisen. An der Seite vom Haus, wo u.a. die Mülltonnen stehen, gibt es gar keine Beleuchtung.

Erstes einfaches Ziel: An der Seite vom Haus soll ebenfalls eine Beleuchtung installiert werden.

Und schon ging die Überlegung los, wie soll die Beleuchtung dimensioniert und realisiert werden. Da sie primär zweckdienlich sein soll, viel die Entscheidung auf LED-Fluter mit 10-20 Watt, und um eine ausreichende Ausleuchtung sicherzustellen, gleich zwei davon.

Nächster Punkt: Wie sollen die neuen Lampen geschaltet werden. Häufig kommt man nach Hause, läuft vor dem Haus lang, der Bewegungsmelder schaltet die Frontbeleuchtung. Dann läuft man um das Haus herum, noch ist dunkel. Würde man die neuen Lampen mit an den Bewegungsmelder hängen, hätte man auch hier Licht. Allerdings wäre das dann immer an, wenn der Bewegungsmelder reagiert, ich will hier aber nur Licht, wenn ich auch wirklich um das Haus laufe. Zudem wäre hinter dem Haus immer noch dunkel…

Also vielleicht neue Bewegungsmelder bei den neuen Lampen an der Hausseite? Wäre eine Möglichkeit, die müssten dann aber zuverlässig einen 180° Bereich abdecken und sollten nicht reagieren, wenn die Nachbarin mal durch ihren Garten läuft. Außerdem wäre hinten immer noch dunkel. Gut, da könnte man natürlich noch einen Bewegungsmelder montieren, aber man möchte ja vielleicht auch mal ungestört im Dunkeln im Garten sitzen, dann würde der wiederum stören…

Nach reichlich hin- und herüberlegen, abwägen aller Vor- und Nachteile, gab es schließlich einen Entschluss: Das Ganze wird über Funkschalter realisiert, welche in ähnlicher Form häufig für Garagentore eingesetzt werden. Damit hat man die nötige Flexibilität, der Bewegungsmelder schaltet immer noch nur vorne die Beleuchtung, das reicht für Postboten und Besucher. Hinten wird nach wie vor nur nach Bedarf von innen geschaltet. Möchte man aber um das Haus herumlaufen, kann man per Fernbedienung komplett rund um das Haus das Licht einschalten. Die Fernbedienung wiederum kommt an den Schlüsselbund, damit man sie nicht ständig vergisst.

Nun bleibt noch der Umstand, dass es sich um zwei getrennte Stromkreise handelt, die man nun gemeinsam schalten möchte. Die Lösung dafür nennt sich Relais bzw. Schütz, wobei sich letzteres aufgrund seiner Schaltlautstärke nicht unbedingt eignet. Die neuen Lampen werden zur Arbeitserleichterung auf die beiden Stromkreise verteilt und so angeschlossen, dass sie nicht auf Bewegungsmelder bzw. Lichtschalter reagieren.

Beim Aufgeben der Bestellung des benötigten Materials musste ich dann leider feststellen, dass es keine 4-fach Relais gab, die meinen Anforderung genügten, dafür hätte ich Schütze kaufen müssen, welche aber wie zuvor bereits erwähnt zu laut schalten und daher nicht in Frage kommen. Also wurden statt dessen zwei 2-fach Relais bestellt.

Nächstes Problem war dann die Reichweite der Funkschalter bzw. der Fernbedienungen. Zuerst wollte ich den Schalter im Giebel unterbringen, nach ersten Tests musste ich aber feststellen, dass dieser vom Carport aus (also um 2 Hausecken herum) kein Signal empfangen konnte. Nach ein paar weiteren Positionierungsversuchen dann die Erkenntnis, dass ein Funkschalter wohl nicht ausreichen würde, irgendwo hat man immer einen toten Punkt.

Also wurde der Plan nochmals überarbeitet, diesmal mit zwei Relais und zwei Funkschaltern. Bei der Gelegenheit wurde dann auch gleich ein zusätzlicher Schalter in der Wohnstube für die hintere Beleuchtung ergänzt.

Beide Funkschalter haben eine eigene Frequenz, die Ferbedienung hat zwei Knöpfe. Die Funkschalter wurden vor und hinter dem Haus im Dachüberstand montiert, so ist ein nahezu lückenloser Bereich abgedeckt.

Einen Nachteil hat die gewählte Lösung. Schaltet man vorne, geht ums Haus und drückt beim Ausschalten auf den falschen Knopf, so bleibt das Licht an, weil nun beide Funkschalter aktiv sind. Man muss dann etwas rumprobieren, bis man beide aus hat.

Um das zu vermeiden, hätte ich natürlich die beiden Funkschalter in eine Kreuzschaltung bringen können. Aber dann wäre i.d.R. immer einer angezogen, was sicherlich nicht so zuträglich für die Lebensdauer des Schalters wäre, daher hab ich zugunsten der zu erwartenden Materialermüdung auf die Kreuzschaltung verzichtet und muss mich selbst zu etwas Disziplin beim Ein- und Ausschalten via Fernbedienung erziehen.

Veröffentlicht unter Heimwerken, Technik | Verschlagwortet mit , | Kommentare deaktiviert für Zwei separate Stromkreise via Funkschalter gleichzeitig schalten

Dateien anhand des Anfangsbuchstaben in unterschiedliche Ordner verschieben

Eine Aufgabe, die mir schon ein paar mal bevor stand und händisch einfach eine Katastrophe ist: Ein paar 100 oder 1000 Dateien sollen anhand des Anfangsbuchstaben ihres Dateinamen in entsprechende Ordner von A-Z einsortiert werden.

Dazu musste eine Batch-Lösung her, was aber meine Kenntnisse der Batch-Programmierung etwas überschritt, daher musste Google bei der Suche helfen…was etwas zeitaufwendiger war, denn diese spezielle Anforderung kommt wohl nicht so häufig vor. Herausgekommen ist folgendes Script, welches vom Autor rubberman auf administrator.de veröffentlicht wurde. Ich hab nur das copy gegen move getauscht und natürlich die Pfade angepasst.

@echo off &amp;setlocal
set "quelle=c:\files"
set "ziel=c:\sort"
set ^"LF=^

^"  Die Leerzeile oben ist kritisch - Nicht entfernen!
for /f "delims=" %%i in ('dir /a-d /b "%quelle%"') do (
  set "file=%%i"
  set "first="
  for /f skip^=1^ delims^=^ eol^= %%i in (
    '2^>^&1 cmd /von /c fc "!LF!!file:~,1!!LF!" nul'
  ) do if not defined first set "first=%%i"
  setlocal EnableDelayedExpansion
  if not exist "!ziel!\!first!\" md "!ziel!\!first!"
  move /y "!quelle!\!file!" "!ziel!\!first!\"
  endlocal
)

Veröffentlicht unter Coding, Software, Technik | Verschlagwortet mit , | Kommentare deaktiviert für Dateien anhand des Anfangsbuchstaben in unterschiedliche Ordner verschieben

Runtastic Export – JSON zu GPX konvertieren

Runtastic ist an sich ja eine feine Sache, man kann den Dienst “kostenfrei” nutzen und seine Aktivitäten erfassen, dokumentieren und auswerten. Dafür bezahlt man mit seinen gesammelten Daten, wer mehr will muss dann auch noch ein Premium-Abo abschließen und/oder die Pro-App kaufen. Aber wehe, man möchte seine Daten auch außerhalb der Runtastic-Plattform verwenden, da hört die Freundschaft schnell auf. Dass alle hochgeladenen Daten dem jeweiligen Nutzer gehören und dieser generell damit anstellen darf, was er will, scheint Runtastic nicht im Geringsten zu Interessieren.

Mir geht es speziell um die mit der App erfassten Geodaten. Diese möchte man vielleicht auch gern mit anderen Programmen bzw. mit anderen Online-Plattformen nutzen.

Dabei steht es jedem frei, sich zu EINER Aktivität die Track-Daten in verschiedenen Formaten herunterzuladen. Diesen Vorgang darf man aber nicht beliebig wiederholen, sondern die möglichen Downloads pro Stunde oder Tag sind begrenzt. Man kann also nur wenige Aktivitäten auf einmal exportieren und muss dann warten. Grund dafür sind Tools, die einem in der Vergangenheit das massenhafte Herunterladen aller Aktivitätsdaten ermöglichten. Da Runtastic das nicht gepasst hat, wurde das Download-Limit eingeführt.

Nicht zuletzt der DSGVO haben wir es jedoch zu verdanken, dass wir unsere gesamten Account-Daten auf einen Schlag exportieren dürfen. Dazu meldet man sich bei Runtastic an, klickt oben rechts auf den Pfeil neben dem Benutzerbild und wählt Einstellungen. Auf der linken Seite gibt es den Menüpunkt Export. Dort kann man einen Export seiner Account-Daten anfordern und mit etwas Zeitversatz herunterladen.

ABER: Auch hier hat sich Runtastic Mühe gegeben, die Nutzung der exportierten Daten möglichst umständlich zu gestalten. Dazu werden einfach alle Daten im JSON-Format bereitgestellt, auch die Trackdaten. Und anstatt sich hier zumindest an die allgemein gültige Spezifikation GeoJSON zu halten, hat man sich lieber für eine eigene Darstellungsform entschieden, damit Converter-Programme nicht eingesetzt werden können.

Zum Glück gibt es hilfsbereite Programmierer da draußen, die sowas nicht akzeptieren wollen und entsprechende Hilfsmittel zur Verfügung stellen.

Zuerst bin ich über den Runtastic GPX Converter von SamFent gestolpert. Wandelt zuverlässig die JSON-Daten von Runtastic in gültige GPX-Daten um. Allerdings jede Datei einzeln, man muss viel hin und her kopieren, aber für die Massenumwandlung ist es auch nicht konzipiert worden.

Nach weiterer Suche habe ich dann runtastic-activity-parser von Eugen Mayer gefunden. Dabei handelt es sich um einen Fork von runtastic-activity-lib von Matthias Richter. Letztlich würden es wahrscheinlich beide Projekte gut hinbekommen, aber da nur von Eugen Mayer eine vorkompilierte JAR zum Download angeboten wird, habe ich mich für den Fork entschieden.

Wie man genau vorgeht, ist auf der Projektseite von Github gut beschrieben. Export von Runtastic anfordern, runterladen und entpacken. Dann die JAR-Datei von Github herunterladen. Da es sich um ein Java-Projekt handelt, muss natürlich auch Java installiert sein. Abschließend die Console (cmd.exe) öffnen, in den Ordner mit der JAR-Datei wechseln und dann wie folgt aufrufen:

java -jar runtastic-activity-parser.jar c:\quellverzeichnis c:\zielverzeichnis

Danach beginnt das Programm, die JSON-Dateien umzuwandeln, der Fortschritt wird dabei immer angezeigt. Nach Abschluss liegen die GPX-Dateien im angegebenen Zieverzeichnis. Einziger Wermutstropfen, die GPX-Dateien haben danach den gleichen kryptischen, nichts sagenden Dateinamen wie zuvor auch schon die JSON-Dateien. Schöner wäre es gewesen, wenn diese als Dateiname Datum + Beginnzeit verpasst bekommen hätten, dann könnte man bestimmte Daten gezielt suchen.

Aber da ich keine Ahnung von Java habe und auch nicht von dessen Kompilierung mittels maven verstehe, bleibt mir nur, diesen Umstand zu akzeptieren. Vielleicht erbarmt sich ja irgendwann nochmal jemand und verpasst dem Programm eine bessere Benennung der Ausgabe-Daten.

Update:
Da mir das Ausgabe-Format einfach nicht in den Kram passt, habe ich ein kleines Powershell-Script geschrieben, welches eine Umbenennung der GPX-Dateien bewirkt. Die Dateien werden nach folgendem Schema umbenannt: YYYY-MM-DD HH_MM. Geht bestimmt auch eleganter, aber von Powershell hab ich auch nur relativ wenig Ahnung, außerdem sollte es schnell gehen 🙂

gci 'c:\zielverzeichnis\*.gpx' |
ForEach{
    $var1 = gc $_.FullName
    $var2 = $var1[15].substring(10,16)
    $var2 = $var2.Replace("T"," ")
    $var2 = $var2.Replace(":","_")
    rename-item -Path $_.FullName -Newname ( $var2+".gpx" ) -force
}
Veröffentlicht unter Coding, Software | Verschlagwortet mit , | Kommentare deaktiviert für Runtastic Export – JSON zu GPX konvertieren

JavaScript Funktion – Zahl in Worten / Zahlwort (v2)

So, hier nun Version 2. Etwas schlanker und wie angekündigt nach oben offen, zumindest theoretisch. JavaScript verarbeitet Zahlen als 64 Bit Gleitkommazahl, womit die maximale Größe bei 253 = 9.007.199.254.740.992 liegt.

Das Array einheiten ist daher nur bis Billion gepflegt, sofern größere Zahlen ausgeschrieben werden sollen, muss das Array entsprechend erweitert und eine Möglichkeit geschaffen werden, diese größeren Zahlen auch korrekt verarbeiten bzw. speichern zu lassen. Tipps dazu gibt es u.a. bei stackoverflow.

Eine Live-Version habe ich bei CodePen eingestellt.

function zahlwort(zahl) {
  
  var sonderzahlen = [];
  sonderzahlen[11] = 'elf';
  sonderzahlen[12] = 'zwölf';
  sonderzahlen[16] = 'sechzehn';
  sonderzahlen[17] = 'siebzehn';

  var zahlen = [];
  zahlen[1] = 'ein';
  zahlen[2] = 'zwei';
  zahlen[3] = 'drei';
  zahlen[4] = 'vier';
  zahlen[5] = 'fünf';
  zahlen[6] = 'sechs';
  zahlen[7] = 'sieben';
  zahlen[8] = 'acht';
  zahlen[9] = 'neun';
  zahlen[10] = 'zehn';
  zahlen[20] = 'zwanzig';
  zahlen[30] = 'dreißig';
  zahlen[40] = 'vierzig';
  zahlen[50] = 'fünfzig';
  zahlen[60] = 'sechzig';
  zahlen[70] = 'siebzig';
  zahlen[80] = 'achtzig';
  zahlen[90] = 'neunzig';
  
  var einheiten = ['','tausend','Million','Milliarde','Billion']
  var trennschritte = 1000;
  var zahlinworten = "";

  if(zahl==0) 
    zahlinworten = "null";
  for(var i=0;i<Math.ceil(zahl.length / 3);i++) {
    if(i>einheiten.length-1)
      return "Zahl nicht unterstützt";
    if(i==0)
      zahlenblock = zahl % trennschritte;
    else
      zahlenblock = ((zahl % trennschritte) - (zahl % (trennschritte / 1000))) / (trennschritte / 1000);
    einer = zahlenblock % 10;
    zehn = zahlenblock % 100;
    hunderter = (zahlenblock - (zahlenblock % 100)) / 100;
    einheitenendung = einheiten[i].substr(einheiten[i].length-1,1);

    if(zahlenblock>0) {
      if(zahlenblock>1 && einheitenendung == "n")
        zahlinworten = " " + einheiten[i] + "en " + zahlinworten;
      else if(zahlenblock>1 && einheitenendung == "e")
        zahlinworten = " " + einheiten[i] + "n " + zahlinworten;
      else if(zahlenblock>0 && i==1)
        zahlinworten = einheiten[i] + zahlinworten;
      else
        zahlinworten = " " + einheiten[i] + " " + zahlinworten;
    }
   
    if(zehn>0) {
      if(zehn==1 && i==0)
        zahlinworten = "eins" + zahlinworten;
      else if(zehn==1 && i==1)
        zahlinworten = "ein" + zahlinworten;
      else if(zehn==1 && i>1)
        zahlinworten = "eine" + zahlinworten;
      else if(sonderzahlen[zehn])
        zahlinworten = sonderzahlen[zehn] + zahlinworten;
      else {
        if(zehn>9)
          zahlinworten = zahlen[zehn-einer] + zahlinworten;
        if(zehn>20 && einer>0)
          zahlinworten = "und" + zahlinworten;
        if(einer>0)
          zahlinworten = zahlen[einer] + zahlinworten;
      }
    }

    if(hunderter>0)
      zahlinworten = zahlen[hunderter] + "hundert" + zahlinworten;

    trennschritte *= 1000;
  }
  return zahlinworten;
}
Veröffentlicht unter Coding, Internet, Software, Technik | Verschlagwortet mit | Kommentare deaktiviert für JavaScript Funktion – Zahl in Worten / Zahlwort (v2)