Visualisierung von Adresslisten

Problemstellung

„Ach, was machst du denn hier?!“ hieß es letztens von einem Kita-Papa meines Kindes, als er mich nahe unseres Zuhauses ebenfalls auf dem Weg zur Kita traf. Bis dahin wusste ich allerdings auch nicht, dass sie bei uns ums Eck wohnt.
Daher die Idee: Alle Adressen zu visualisieren, da wir Bilder eben einfacher begreifen. Wichtig für mich dabei:

  • Es sollte dem Datenschutz genügen -> Als Visualisierung nicht gerade GoogleMaps o.ä. nutzen, die Speicherung der Daten idealerweise offline
  • Für spätere Erweiterungen per Script aus einer Liste erstellbar (*.csv, *.xlsx,..)
  • Gruppen differenzierbar durch unterschiedliche Farben und/oder Icons

Lösungsansatz manuell

Adressen in Geopunkte/Koordianten

Am Anfang steht, nach der Bereinigung der Daten geht’s an die Abfrage der Koordinaten. Man könnte nun jede einzelne bei GoogleMaps suchen und sich aus der Adresszeile die Koordinaten heraus nehmen(wäre blöd wegen des Datenschutzes). Das selbe geht auch mit OpenStreetMap über den Perma-Link. Aber es geht auch noch schöner und sauberer:

Weiterlesen

Externe Daten in die EPlan Artikeldatenbank einschleusen

Problemstellung

Es existieren sicherlich in einigen Unternehmen und Betrieben Listen mit speziell gepflegten eigenschaften. Das macht auch durchaus Sinn, Beispielsweise um den Typenschlüssel bestimmter Hersteller per VBA in Excel zu dekodieren. Wie bei allen Automationen: Das kann der Rechner schneller, akkurater und mit Beachtung aller Sonderfälle. Doch dann liegen die Infos in einer Exceltabelle und manuelles CopyPaste ist alles andere als Smart. Wie also überführen?

Problemlösung

Nun gibt es verschiedene Ansätze, wie die Daten nun von der Quelle in das Ziel gelangen.

Weiterlesen

Seiteneigenschaften manipulieren

Problemstellung

Unter gewissen Bedingungen soll das Normblatt der Seiten angepasst werden (zB. für Aufgaben jeweils ein etwas anderes, oder bei automatisierten Importen). Klar kann man das auch manuell erledigen: Alle betreffenden Seiten markieren, Normblattname anpassen und fertig. Aber das ist absolut nicht smart.

Lösungansatz

Was muss nun eigentlich passieren? Da auf die Parameter von Seiten (und auch von Bauteilen u.ä.) nicht via Array oder ähnlichem Konstrukt zugegriffen werden kann, müssen die erst selektiert werden. Das geht wie von Johann Weiher umgesetzt über edit:

// übernommen von https://suplanus.de/selectionset-pages/ Zeile 58 ff
private void SelectPage(string page) {
  ActionCallingContext actionCallingContext = new ActionCallingContext();
  actionCallingContext.AddParameter("PAGENAME", page);
  new CommandLineInterpreter().Execute("edit", actionCallingContext);
}

Alternativ könnte der Nutzer auch einzelne Seiten markieren und dann die Funktion ausführen. Das macht beispielsweise Sinn, wenn es um diverse Einstellungen geht. Nun aber noch eben das neue Normblatt definieren. Dafür gibt es die XEsSetPagePropertyAction, die noch die Eigenschaft und den Wert braucht. Es macht hier Sinn es sich an zu gewöhnen ein Try-Catch-Block um den Aufruf zu setzen, damit der Nutzer nicht nachher kryptische Fehlermeldungen bekommt und das ganze mit unter direkt abbricht.

Weiterlesen

Aktionen auf Projektordner anwenden

Problemstellung

Es gibt da noch Altbestände diverser Projekte, oder es soll einfach der aktuelle Stand jedes Projektes als PDF ausgeschrieben werden. Manuell geht das bei wenigen Projekten, bei einigen hundert Projekten aber nicht mehr.

Problemlösung

Das lässt sich zum einen über das Projektmanagement lösen, aus meiner geht das allerdings etwas schöner und unabhängiger direkt über ein Script. Für den Einstieg lässt sich gut der FolderBrowserDialog nutzen, über den der Stammordner ausgewählt wird. Danach geht’s weiter mit GetFiles und ein Loop über alle Funde (ggf. auch Rekursiv über alle Unterverzeichnisse).

public void doOverProjectFolder() {
  FolderBrowsingDialog srcFolder = new FolderBrowsingDialog();
  srcFolder.Description  = "Projektordner der bearbeitet werden soll"; // Beschreibung
  srcFolder.SelectedPath = PathMap.SubstitutePath("$(MD_PROJECTS)");   // Default path
  DialogResult srcFolderRes = srcFolder.ShowDialog();
  if (srcFolderRes == DialogResult.Cancel) {
    // Meldung beim Abbruch für den Nutzer
    return;
  }
  string[] files = Directory.GetFiles(srcFolder.SelectedPath, "*.el*", SearchOption.AllDirectories);
  foreach(string file in files) {
    // do something
  }
}

Konvertierung in Masse – *.xls zu *.xlsx

Problemstellung

Strukturen sind oft über Jahre wenn nicht Jahrzehnte gewachsen. So auch Datenmengen und deren Formatierungen. Damit nun alle ein einheitliches Format haben und auch in der Cloud besser alle Office-Dokumente im OpenXML-Format vorliegen, sollten diese nun konvertiert werden.

Lösungsansatz

Schritt für Schritt

Aufgrund der Masse der Dateien macht es Sinn, sich mal kurz ein Tool zu basteln. Bei wenigen Dateien ist das vielleicht etwas oversized, aber bei <Öffnen – Speichern unter – Format wählen – Speichern> von immerhin (wenn man fix ist) 30sec. sind das bei 10 Dateien schon 5min+. Sind es mehr als 40-50 Dateien mit dem gleichen Problem lohnt sich der Programmieraufwand.

Nach kurzer Suche stößt man auf zB excellent-conversions-and-downloads und damit auf die etwas schnellere Möglichkeit zur Konvertierung (hier mit Excel und unter Windows):

"<path to file>/excelcnv.exe" -oics "<quelldatei.xls>" "<zieldatei.xlsx>"

Immerhin kann so das Öffnen von und geklickere in Excel eingespart werden, doch richtig smart ist das noch nicht. Also diesen Ansatz ab in einen Batch und um Schleifen (siehe zB. tutorial-zur-for-schleife) und Abfragen erweitert.

Das ganze geht aber auch mit Opensource, zB. mit LibreOffice. Je nach System muss noch der Pfad angegeben werden:

#Windos
"<path to file>\soffice.exe" --convert-to xlsx "<quelldatei.xls>" -outdir "<zielpfad>"
#Linux
libreoffice --convert-to xlsx ./<quelldatei.xls> --outdir <zielpfad>
Weiterlesen

Designrichtlinie und Epläne?!?!

Designrichtlinien in technischen Dokumenten

Bei Designrichtlinien geht es um grundlegende Regeln, die Abteilungs-, Unternehmens-, oder Konzernweit festgehalten werden. das kann von Platzierungsregeln, die Wahl von Schriftarten oder Farben, Linienstärken bis zu genauen Abständen, Formatierungsvorgaben oder auch Vorlagen für Word, Excel und Co. Im Grunde ist jedes Normblatt, jeder Zeichnungsrahmen schon eine Art Designrichtlinie, da er einen gewissen Rahmen vorgibt. In einigen Programmen gibt es die Möglichkeit Linien auf gewissen Layern zu hinterlegen, um Höhen etc. vorzugeben.

Einen weiteren Rahmen werden auch durch Normen vorgegeben, zum Beispiel die Linienstärken in DIN 15, bzw. DIN ISO 128, Gewindedarstellungen in DIN 14 Teil 1+2, Technische Zeichnungen in DIN ISO 10209 Teil 2 und viele mehr. Es gibt auch für textliche Darstellungen Designregeln Beispielsweise die Kennzeichnungen von Betriebsmitteln in der Elektrotechnik nach EN IEC 81346-2 oder Dokumententypen nach EN 61355. Vieles, was den allermeisten schon längst (un)bewusst bekannt sein sollte.

Designrichtlinien in EPlan bzw. in Auswertungen

Daher zurück zum Thema. Was bringt eine Designrichtlinie für Auswertungen?

  • Nach außen: Ein einheitliches Aussehen und einen professionell wirkenden Auftritt!
  • Nach innen: Feste Strukturen und Sicherheit bei der Nutzung für die Nutzer der Auswertungen
  • Das Verhalten (wenn auch das Schemata in Auswertungen definiert wird) wird berechenbar -> Fehlersuche bei Problemen einfacher
Weiterlesen

Projektvorlagen und Basisprojekte

Der kleine Unterschied (war einmal)

Projektvorlagen waren in EPlan bis Eplan P8 Version 2.9 nur eine Hülle eines Projektes, welches keine Stammdaten eingelagert, sondern nur referenziert hatte. Übrigens ähnlich zu den Projekten damals in Eplan5 und der Grund bei Problemen der Migration alter Projekte.

Basisprojekte hingegen haben alles direkt an Bord, was man eben braucht (oder eben auch nicht mehr braucht, aber nicht bereinigt wurde).

Projektvorlagen ade – noch schnell umsteigen

Packen wir erstmal das Scheidende an. In 2022 und neuer wird das leider nicht mehr nutzbar sein. Aber es lässt sich mit der Action XPrjConvertBaseProjectsAction und dem Parameter /Folder:<Folder> einfach in ein Basisprojekt konvertieren. Entweder wie in der Beschreibung im Link, oder als kleines Script (ehrlich gesagt: Im Consulting hätte ich mir die Schweizer Taschenmesser-Ribbon-Bar gebastelt, die das direkt mit drin hätte… Als Admin reicht es auch manuell in die Menüleiste gezogen, ausgeführt und wieder gelöscht.

XPrjConvertBaseProjectsAction /Folder:$(MD_TEMPLATES) // Übernommen aus der Anleitung von EPlan

Basisprojekte und wie ich sie automatisiert ausschreibe

Weiterlesen

PDFs Exportieren

Die einfache Variante

Wenn beim Schließen des Projektes einfach nur das PDF ausgeschrieben werden soll? Kein Problem, denn das hat Johann Weiher schon als schönes Beispiel dargestellt. Nun soll das PDF nicht einfach nur den Projektordner abgelegt werden, sondern in einen bestimmten Ordner in der zentralen Datenverwaltung auf einem Netzlaufwerk. Basis ist das verlinkte Script mit ein paar kleinen Anpassungen. Die Zentrale Funktion ist die EXPORT-Funktion.

Weiterlesen

Projektnummern mit RegularExpressions finden

Problemstellung

Folgendes Szenario dürften so einige Sachbearbeiter kennen: Es gibt ein Sammelbecken mit Dateien, die unter anderem eine Projektnummer oder Auftragsnummer beinhalten. Ziel für diese Dateien sind die entsprechenden Projektordner in einer zentralen Struktur. Auch die Projektordner beinhalten die Projektnummer oder Auftragsnummer. So eine Struktur dürfte in vielen Unternehmen, ob Old School auf einem Serverlaufwerk oder etwas aktueller in der Cloud.

Lösungsansatz

Doch wie findet man nun 1. die Nummer in dem Dateinamen und 2. den korrekten Zielordner(besonders wenn der nicht direkt im Stammverzeichnis liegt)? Das Stichwort ist hier RegularExpressions oder eben Reguläre Ausdrücke. Damit lassen sich aber nicht nur Nummernfolgen finden sondern komplexe Ausdrücke, Passwörter auf Konformität prüfen (min x Stellen, Groß/Kleinbuchstaben, Sonderzeichen, etc.), oder auch ganze Formelparser bauen. Soweit soll es hier aber nicht gehen.

Ok, wir nehmen mal an, dass unsere Auftragsnummer, nach der wir suchen möchten, beispielsweise folgendes Format hat: P<Jahreszahl>-<fortlaufende Nummer, 5 Stellen>. Um mal ohne viel Aufwand RegExs zu testen, eignet sich regex101.com super und soll hier auch zum Einsatz kommen. Als Testobjekte sollen dafür mal P2023-45627, P2015-33456, P1999-11223 und P1976-00132 dienen. Damit das nun nicht zu leicht wird, könnte vor/hinter der Projektnummer nichts, Unterlagen, Rev.B, Zeichnung-12345 stehen.

Um nun den Suchbegriff abzubilden, braucht es eigentlich nur folgendes:

([pP][0-9]{4}-[0-9]{5})
(        : Öffnet die Matchgruppe
[pP]     : Ein p oder P
[0-9]{4} : 4 Zeichen, alles von 0-9 erlaubt
-        : Trennzeichen (ggf. auch [-_] möglich, wenn Fehleingaben berücksichtigt werden sollen
[0-9]{5} : 5 Zeichen, alles von 0-9 erlaubt
)        : Schließt die Matchgruppe
Weiterlesen

Marcos in Office durch aufnehmen?

Soll ich, oder besser nicht?

Schickt sich das, als Entwickler für ein Macro wirklich den Aufnahme-Button zu nutzen? Warum denn eigentlich nicht? Es ist ja immerhin nicht gleich das Endergebnis, oder? Es geht doch manchmal nur darum schnell mal einen groben Ansatz zu haben, oder nicht wieder länger nach Funktionen und deren Verwendungsmöglichkeiten zu googlen. Mit wenigen klicks kann wenigstens schon mal der grobe Rahmen erzeugt werden.

Aufgezeichnet und dann?

Das ist eben der spannende Teil: Die Aufzeichnung ist beispielsweise in Excel schnell mal 20-30 Zeilen lang und oft absolut zu einer Zelle bezogen. Nun beginnt das filtern:

  • Was muss denn wirklich sein?
  • Welcher Bezug macht Sinn? Relativ zur Selektion, absolut zu einer Spalte, ein mix?
  • Wie geht’s nun daraus weiter?
  • Welche möglichen Fehleingaben und Fehlinterpretationen sollen abgefangen werden?

Führt das immer schneller ans Ziel?

Das sicherlich nicht, denn existieren vielleicht schon fast fertige Funktionen, die nur noch modifiziert werden müssen, bringt die Aufzeichnung meist nur mehr Chaos in die Lösung. Aber auch da: es gibt kein Schwarz oder Weiß: Fehlt ein Puzzlestück, eine Funktion, dann ist’s manchmal hilfreich sich anzusehen, was Office selbst bauen würde. Man muss es ja nicht zwingend auch übernehmen…

Vinyl geos on Air

Problemstellung

Die alten Boxen waren langsam auf, der eigene Nachwuchs gab ihnen dann den Todesstoß, oder eher den Todes-Finger-Dipp. Der große Verstärker und das CD-Deck waren eh schon immer irgendwie fehlt am Platz. Einzig und alleine der Plattenspieler war noch schick, weil dieses Knistern der Platten einfach einen gewissen Flair haben (und auch das drehen nach drei bis fünf Songs 😉 ). Zudem hat man vielleicht auch die eine oder andere Platte, die bei den großen Streaming-Anbietern so nicht zu haben sind.

Bei uns kam dann die Lösung auch von meiner Frau: Hey, die Sonos-Boxen sehen doch nett aus, kann man überall platzieren, spielen auch gewisse Streaming-Dienste ab und die Boxen im schwedischen Möbelhaus sind preislich völlig in Ordnung (teils auch günstiger gebraucht zu haben). Ok, erstmal den Plattenspieler an die Seite gepackt, zu der Zeit hatte ich eh wenig Ruhe mal eine Platte aufzulegen. Und es gibt ja auch noch die tollen Lösungen von Sonos: Box hinstellen, Stecker rein, in der App auswählen und los geht’s. Vielleicht etwas naiv gedacht und nicht zu ende überlegt, denn die Kostet gerne um 200€+, oder ist in der gebrauchten Variante teilweise nicht mit der aktuellen Sonos-App kompatibel.

Problemlösung

Aber Lösung naht: Ich bin damals auf diesen Blog-Artikel gestoßen: Add Aux to Sonos. Das lässt sich auch noch immer nach der Anleitung zusammenstellen. Dennoch hier mal meine Erfahrungen und Beschreibung:

Grundlage ist die Hardware. In diesem Falle mindestens ein Raspberry Pi 2 (der aktuell auch schon echt schwer zu bekommen ist). Meine Versuche mit einem 1b waren leider alle etwas dürftig. Diverse Aussetzer, Übertragungen waren ruckelig, Qualitativ unschön, auch für nicht audiophile Menschen.
Dazu kommt eine USB-Soundkarte, bei mir eine Behringer U-PHONE UFO202, die mit um 25€ (Stand März 2023) recht erschwinglich ist. Mit dem eingebauten Phono-Vorverstärker erspart man sich das weitere adaptieren. Dazu noch eine Stromversorgung, MicroUSB-Kabel, Netzwerkkabel, eine MicroSD (8Gig reichen hier völlig aus) und schon ist die Einkaufsliste fertig.

Weiterlesen

Serverdaten und MQTT

Problemstellung

Innerhalb des Smarthome-Systems sollen auch Daten der internen Server dargestellt werden, beispielsweise um Aktionen auszulösen, die Werte auf dem zentralen Dashboard darzustellen bzw. längerfristig vorrätig zu halten, oder um bei Problemfällen vom Smarthome über diese informiert zu werden.

Lösungsansatz

Da wäre es doch super, wenn Daten via MQTT versendet werden würden, wie:

  • CPU-Auslastung
  • Speicher-Auslastung
  • Hardwaredaten
  • Uptimes
  • Temperaturen

Ja, MQTT ist nun nicht zwingend die sicherste Variante um sensible Daten zu versenden, erst recht nicht dann, wenn diese nicht verschlüsselt übertragen werden. Und doch, ist das aus meiner Sicht für ein kleines Netzwerk durchaus eine akzeptable Lösung. Immerhin sind ja Sender um Empfänger im gleichen Netz und es wird nicht durchs Netz rund um den Globus geschickt. In der Regel hängt dann auch noch alles an einem Switch, Idealerweise smart Managed oder besser, wird damit auch nur vom Sender-Port zum Empfänger-Port versandt.

Aber zurück zur Lösung, denn die heißt RPi-MQTT-Monitor und liefert eben eine Menge Daten via MQTT und ist damit für alle möglichen Systeme kompatible. Für mich sehr praktikable, denn damit kann ich mir relativ einfach Warnungen bei Grenzwertüberschreitungen melden oder anzeigen lassen. Langfristig volllaufende Speicher werden ebenso gut erkannt, wie havarierte Prozesse (stark steigende, oder konstant hohe CPU-Lasten).

Was ist Smarthome

Smarte Steckdosen und Co

Wenn man manchen Herstellern glauben mag, dann ist Smart schon eine Steckdose, ein Licht, oder ein sonstiger Sensor/Aktor, der sich über die eigene App auslesen oder steuern lässt. In Wikipedia ist dazu zu lesen:

Smart Home dient als Oberbegriff für technische Verfahren und Systeme zur Gebäudeautomation in Wohnräumen und -häusern, in deren Mittelpunkt eine Erhöhung von Wohn- und Lebensqualität, Sicherheit und effizienter Energienutzung auf Basis vernetzter und fernsteuerbarer Geräte und Installationen sowie automatisierbarer Abläufe steht.

https://de.wikipedia.org/wiki/Smart_Home

Sry, aber die schwedische Szenen-Steuerung und artverwandte, auch wenn sie dann durch Beispielsweise Bewegungssensoren getriggert werden, zählt dann leider nicht dazu. Was braucht es denn dann noch mehr, damit es wirklich smart ist? Für mich ist es der Schritt weiter. Das zum Beispiel die Steckdose für die Monitoren schaltet, wenn einer der angeschlossenen Rechner eingeschaltet wird, oder herunter gefahren ist. Oder das die Beleuchtung dem Licht von außen und einem Status des Zuhauses(Anwesend/Abwesend/Schlafend) folgt. So wird das Licht ggf. hoch/runter gedimmt oder ganz abgeschaltet.

Zwischen Ausführen und Reagieren bis Vorausschauend

Was bedeutet das technisch? Was braucht es denn am Ende. Im Idealfall ein zentrales System, welches alle Daten sammelt, verwaltet, darauf reagiert und entsprechende Steuerbefehle verschickt. Es muss nicht gleich die kommerzielle Lösung von Herstellern wie Gira sein. Es gibt unzählige Systeme, die eben genau das bieten. Die einen machen mehr out of the box, bei den anderen hat man mehr Möglichkeiten bei der Erweiterung oder den Einstellungen. Daher gibt es an dieser Stelle auch nicht die eine Empfehlung, für ein System. Es werden an dieser Stelle die eine oder andere Lösung für Anwendungen in Openhab geben, es muss aber nicht zwingend euer System sein.

Warum Openhab

Bei der Wahl des eigenen Smarthome Systems ist oftmals die Liste der Wünsche, Fragen und Anforderungen lang:

  • Welche Daten kann es alles erfassen und welche sollen gesammelt werden? Sensordaten, Statusdaten, Infos von weiteren Server
  • Läuft es lokal oder in der Cloud?
  • Welche Protokolle und Schnittstellen werden unterstützt?
  • Welchen Invest habe ich? Der Server selbst und auch das Material für die Anbindungen
  • Was existiert schon? Beispielsweise eine Fritzbox mit Steckdosen oder Thermostaten
  • Mit welchen Kosten ist zu rechnen (Cloudkosten, Stromkosten, Batterien)

Und auch wenn man schon stark vor filtert, bleiben noch viele über. Für mich persönlich stand im Vordergrund:

  • Sensordaten sollen erfasst werden um langfristig auch Wissen daraus extrahieren, Beispielsweise die Luftfeuchtigkeit in den Räumen. Längerfristig steigende Luftfeuchtigkeit deutet zB. auf Schimmel o.ä. hin, steigende Verbräuche bei festen Setting auf ein mögliches ende der Lebenszeit
  • Es soll definitiv offline funktionieren. Wenn mal wieder die Internetverbindung abbricht, möchte ich nicht im dunklen stehen, also eigener Server.
  • Wichtig waren mir Schnittstellen zu MQTT, SONOS, Netzwerk
  • Beim Invest sollte möglichst auf vorhandenes zurück gegriffen werden, wie auf den Pi4 (eigentlich für ein anderes Projekt gedacht) und seitens Software kam nichts anderes als Opensource in frage
  • Zu den Sensoren und Aktoren: Es existierten aus einer längeren Phase mit FHEM einige WLAN-Steckdosen mit Tasmota, IKEA Geräte und Sensoren mit Zigbee.
  • Der Server als auch die Endgeräte sollten möglichst sparsam sein
  • Die Oberfläche sollte über die Konfigurationsseiten angepasst werden können und nicht über HTML-Dateien wie in FHEM
Weiterlesen

Semantic Model in Openhab

Hintergrund und Nutzen

Am Semantic Model kommt man in Openhab kaum vorbei und wenn man sich einmal damit beschäftigt hat, wird auch schnell der Nutzen klar. Mit dem Semantic Model wird das eigene Haus als Struktur abgebildet, samt aller Ebenen, Räume, Geräte und deren Funktionen. Damit ist von einer kleinen 3-Zimmer Wohnung bis zur mehrgeschossigen Stadtvilla oder zu mehreren Standorten alles möglich.

Wird das Modell sauber aufgebaut, könnte mit Scripten und Regeln durch das ganze Haus navigiert werden. Das kann für komplexere Funktonen interessant sein, zum Beispiel beim generieren von Seiten.
Apropos Seiten: Auf diesen sollen die jeweiligen Steckdosen/Lampen/Sensoren/Lautsprecher etc. des Raumes dargestellt werden. Mit Widgets lassen sich dann Gruppen von Lampen oder Steckdosen dynamisch darstellen.

Tipps zum Aufbau

Wie schon beschrieben, wird das Modell immer von der größten Einheit zur kleinsten aufgebaut, hier mal als Beispiel für ein kleines Eigenheim:

Weiterlesen