Thursday, June 13, 2019

Embedded Systems' Data Serialization

Data Serialization

Data serialization is the process of transferring data structures from the in-memory representation that is used for working with the data (e.g. structs) to a binary data stream (usually a sequence of binary octets) that can be transmitted via network or stored on non-volatile memory (e.g. disk, flash). The process in the opposite direction from disk to in memory is called either deserialization or parsing. 

There are many ways to serialize data, each having individual advantages and drawbacks. In this post I want to focus on handling generic structured data. Most popular for handling structured data are probably XML and JSON, but there exist also more advanced techniques for creating highly efficient binary data streams.

XML and JSON

XML and JSON are both generic file formats that can be used for almost any kind of application and structured data except for BLOBs (binary large objects - e.g. pictures, video streams, audio data). Both can be used over a variety of platforms, and can be extended easily later if necessary (e.g. later software version with new features), without loosing backward compatibility. Additionally, their representation is human readable, and therefore, it is easy to deal with those kinds of files.

Comparing XML to JSON, XML provides concepts for meta-data, and the ability to restrict data values to certain ranges to provide means for verification and validation of data. But these features are rather heavy weighted when it comes to their implementation and run-time impact. Nevertheless, powerful embedded systems like smartphones often rely on this technique.

For less powerful embedded systems XML is mostly out of scope, as RAM is limited and processing power may be too limited to provide good enough performance. JSON has much lower requirements when it comes to processing power, but it lacks some of those features, which make XML interesting. Nevertheless, JSON libraries for embedded systems are widely available, and JSON is also useful when it comes to interacting with web servers and other generic data processing partners.

Still, even JSON requires a good amount of code and processing time in comparison with binary file formats. 


Google protocol buffers

There are many binary file formats available for all kinds of applications: images, videos, audio, archives, and many others to name just a few. They use different concepts to encode and compress the data. Providing data serialization for generic data structures is a quite complex task. Therefore, Google provides Protocol Buffers for specifying structured data and generating code for parsing and serializing data.

Google protocol buffer's language has concepts for extending the file format later. Therefore, every individual data field gets a unique identifier that must not be changed over the life-time of the file format. But the associated data type may be changed and extended when following certain guide-lines. This concepts makes it perfect for use with applications that may need later extensions and may want to obsolete certain functions without breaking compatibility.

Unfortunately, even their lite library implementation is pretty heavy weighted and not targeted for embedded systems. Therefore, I have implemented Wire Format Compiler, which extends the language of protocol buffers with options and concepts for embedded systems. It is also hosted on github, where everybody can participate in the work and file bug reports.

Wire Format Compiler

Wire Format Compiler's language has been directly derived from protocol buffers. Of course if WFC extensions and features are used, the protocol description will not work with protocol buffers. But it is perfectly possible to come up with data structure specifications that work with both compilers.

In contrast to protocol buffers, wire format compiler is designed with a strong focus on embedded systems. Therefore, many optimizations for reducing code size and increasing processing performance are implemented to support embedded systems well. Additionally new data types have been added (e.g. fixed8, sfixed16) that support very small controller families, so that targeting even 8- and 16-bit controller families becomes feasible.

Furthermore, there exists a new concept for specifying options to tailor and optimize one data structure definition for multiple applications on different targets. The serialized data will be usable among all applications, but individual tuning allows to remove unsupported and unneeded data structures by telling the compiler with "used=false" that a specific member will not be used. Furthermore, data types the will be used for strings and byte arrays can be adjusted, so that specialized classes can be used.

Additionally, many options are provided to generate even more optimized code for specific targets. E.g. there exists support to make optimize for little endian systems that support unaligned access. On the other hand, it is still possible to target also big endian systems that work totally different, when it comes to byte placements in memory.

A small example

This is a small example that shows a wfc description and its generated header file. The first part of the wfc description has 3 different option sets that I describe below in more detail. After the option descriptions, a message description follows. This is a data structure that will be generated as a C++ class with methods for handling the data fields, and methods for (de-)serialization. 

The description of a field requires three elements: a field type, the field name, and a unique identifier. The unique identifier is set once for every field name, and it must not change later. The associated data is serialized with this unique identifier, and therefore, it is needed for deserialization. Changing the type is only possible, if it is a compatible change. E.g. a variable length integer might be changed from 8 to 16 bits, but the change of type must not impact the serialization concept of the member. Changing the name does only conflict with associated source code. So this is usually without a problem, unless special concepts like JSON support or ASCII generation are used.


The first option set, called "embedded", is optimized for a 32-bit embedded systems without string handling. I.e. the strings that are referenced in the data structure are regular C-strings (char pointer), and their memory management must be done independently. In contrast the option set "embedded_dyn" specifies "astring" as string data type. You could also specify your own data type, as long as it has some basic interfaces of std::string, like the member functions size() and c_str(). 

The generated header file includes a class definition that reflects the message description. It includes a function for calculating the concrete size of a serialized object (calcSize). This can be used to allocate enough memory before using the toMemory function to serialize the object to memory. After that the memory block can be written to a file, to flash memory, or send via network, as needed. For deserializing the data on the receiver side the fromMemory function can be used.

In addition, wfc supports the generation of functions for using a string instead of a memory block for serialization. This is more convenient in use, but might not be possible on all embedded systems. 


For every message object member, functions are generated to get and set their values and to determine the number of elements (size) of repeated members. For optional members functions are added to determine if a certain member has been set (e.g. has_hostname). All generated functions employ statically linked core functions. But options can be used to share the core functionality among multiple message objects.

The options and concepts shown in this post are only the most basic ones. Please refer to the available options and documentation, to learn in what other ways the code generation can be influenced. 

If you have questions or want to file a bug report, please refer to the project page on github or get in touch with me directly.

Sunday, May 05, 2019

Variants of D1 Mini with ESP8266

Overview

In this post I take a look at prototype boards for MCUs from Espressif. Espressif offers two popular micro-controller families: ESP8266 and ESP32. Those two SOCs have a lot in common, while the ESP32 is the stronger one with 2 main cores, higher performance, and more peripheral interfaces.

On the other hand the ESP8266 has lower power consumption and provides sufficient performance for many applications. Additionally, the ESP8266 family has a member called ESP8285 that provides internal flash memory, so that it can be used for very small boards, as no additional external flash is necessary.

Here is a short comparison table of these controllers: 

FeatureESP8266ESP32
architectureTensilica L106Tensilica LX6
# main cores12
WiFi MACyesyes
Bluetooth MACnoyes
Ethernet MACnoyes
touchnoyes
hall sensornoyes
SPI24
PWMsoftwarehardware
waveform generatornoyes

Both families provide much more features than shown in this short table. This table should give you just an impression of those architectures, in case you are not familiar with them.

One popular prototyping board with ESP8266 is the D1 mini offered by Wemos, which is also provide as a clone by other companies. The variants and versions of the D1 mini have subtle differences, we want to take a look at here.

Boards with ESP8266

D1 Mini:


  • ESP8266
  • 4 MB external flash integrated in metal package
  • USB socket connect to UART0 TX/RX
  • Reset button
  • From Version 2.2.0 to version 2.3.0 the USB socket moved from back to front 
  • one LED





D1 Mini Lite:

  • ESP8285
  • 1MB internal flash
  • USB socket connect to UART0 TX/RX 
  • Reset button
  • one LED




Mini32:

  • Controller: ESP32
  • Flash: 4MB
  • USB socket is connected to UART TX only
    (Update: this observation is probably related to a broken device. A sample of a similar looking clone without branding did not show this limitation. The clone had an additional LED, so it has not the exact schematic. But the additional LED is just a supply monitoring LED.)
  • Reset button
  • Pads have same spacing, but are assigned differntly. The critical pads are assigned the same: VCC, GND, TX, RX, 3,3V, RST
  • 2 LEDs

    Tuesday, March 12, 2019

    Entscheidung für eine Hausautomatisierung

    Einsatzbereich und Erweiterbarkeit

    Hausautomatisierungen bieten heute ein großes Portfolio an Anwendungsmöglichkeiten. Nicht alle Anbieter von Smart-Home Lösungen bieten Komponenten für alle diese Anwendungen. Deswegen macht es Sinn, sich mit der Frage auseinanderzusetzen, welche Anwendungen in Zukunft in Betracht kommen könnten. 

    Hat man sich einmal für einen Systemanbieter entschieden, muss man mit den Komponenten auskommen, die dieser im Programm hat oder man muss ggf. Systeme verschiedener Anbieter parallel betreiben. Da die Systeme normalerweise zueinander inkompatibel sind, bedeutet das, dass man mehrere Apps verwenden muss, und keine Interaktion über die Systemgrenzen möglich sind.

    Folgende Anwendungen können über Systeme zur Hausautomatisierung abgedeckt werden:
    • Beschattung mit Rollos und Jalousien
    • Heizung
    • Beleuchtung, Schalten, Dimmen
    • Wetter- und Umweltdatenerfassung
    • Bewässerung
    • Schließsysteme
    • Alarm- und Überwachungsanlagen
    • Multimedia
    Die Auswahl am Markt ist sehr groß, aber fast alle Systeme sind zueinander inkompatibel. Conrad hat eine schöne Übersicht über die verfügbaren Systeme und ihre Funktionen.

    Unterstützung für Sprachsteuerung über Alexa und Co. wird von einigen dieser Systeme mit angeboten. Was aber üblicherweise nicht geht, ist beispielsweise eine schaltbare Steckdose eines Anbieters in die Steuerung eines anderen zu integrieren. Auch können Umweltdaten wie Temperatur und Luftfeuchtigkeit eines Sensors von Anbieter A nicht zur Steuerung der Heizung mit einem Thermostat von Anbieter B verwendet werden.

    Funk oder Kabel?

    Grundsätzlich gibt es Kabel gebundene Systeme und Systeme die über Funk kommunizieren. Kabel gebundene Kommunikation ist im Punkt Stör- und Ausfallsicherheit etwas robuster als Funk basierte Systeme. Allerdings kann eine beschädigte Verkabelung zu einem sehr hohen Aufwand bei der Fehlersuche führen.

    Funk basierte Systeme wurden erst später eingeführt und können auch in bestehenden Gebäuden einfach nachgerüstet werden, ohne dass nachträglich aufwendig neue Kabel eingezogen werden müssen. Leider behindern Fußböden und Wände aus Beton die Kommunikation via Funk deutlich. Doch es gibt Zusatzgeräte um in Gebäuden mit viel Beton eine Hausautomatisierung mit Funk in jeder Ecke zu ermöglichen.

    Die meisten kabellose Systeme verwenden das 868 MHz Band. Allerdings ist diese Kommunikation nicht standardisiert. Das bedeutet, dass Systeme verschiedener Anbieter die eine 868MHz basierte Lösung haben, normalerweise nicht miteinander kompatibel sind und somit nicht miteinander verwendet werden können. Deswegen sollte man immer davon ausgehen, dass Systeme verschiedener Anbieter nicht miteinander funktionieren. 

    Bedienung und Integration des Designs

    Über die Art und Weise der Bedienung sollte man sich im Vorfeld auch Gedanken machen. Ist eine Bedienung per Wand- oder Handschalter gewünscht? Ist ein Tischaufsteller vorzuziehen? Soll der Status der Systeme irgendwie visualisiert werden (z.B. Display an der Wand)? Wie sieht es aus mit einer App für Smartphone oder Tablet - würde diese von den Bewohnern verwendet werden?

    Nicht jeder Anbieter bietet alle Bedienkonzepte, und häufig haben die Anbieter ein eigenes Design. Das kann insbesondere auf Ablehnung stoßen, wenn die Wandschalter zwischen Hausautomatisierung  und normalen Schaltern unterschiedlich aussehen. Einige Hersteller bieten eine Integration ins bestehende Schalterprogramm an. Dabei werden die Blenden des Anbieters für das Schalterprogramm über Adapter auf die Komponenten der Hausautomatisierung gesteckt.

    Alternativ kann man das ganze Schalterprogramm tauschen (also alle Lichtschalter und Steckdosen). Allerdings treibt das die Kosten unter Umständen deutlich in die Höhe.

    Wenn der bestehende Look des Schalterprogramms erhalten werden soll, muss sichergestellt werden, dass es für die konkrete Designvariante passende Adapter gibt. Diese sind oft für die bekannten Hersteller von Schaltern und Steckdosen, wie Busch-Jaeger, Gira, Jung und andere verfügbar. 

    Manche Hersteller von Schalterprogrammen bieten auch eigene Lösungen zum Thema Smart Home an. Dann stellt sich die Frage des passenden Designs gar nicht erst. Busch-Jaeger und Gira haben beispielsweise eine gemeinsame technische Lösung names eNet. Allerdings ist hier zu beachten, dass die klassischen Anbieter von Schalterprogrammen sich auf ihre klassischen Anwendungen konzentrieren und für die Installation von geschultem Fachpersonal ausgehen. 

    Zentralsteuerung vs. Internetbasierter Lösung

    Smart Home Lösungen arbeiten entweder mit einem Server der zu Hause aufgestellt wird oder mit einer Cloud basierten Lösung im Internet. 

    Vorteile eine Servers zu Hause:

    • funktioniert auch, wenn die Internetverbindung zusammenbricht
    • alle Daten bleiben zu Hause
    • Funktionsfähigkeit hängt nur an den beschafften Geräten und nicht an externen Firmenentscheidungen (z.B. Pleite, Abkündigung von Cloud-Diensten)

    Vorteile einer Cloud-Lösung (Server im Internet):

    • geringere Anschaffungskosten
    • geringerer Installationsaufwand
    • der Zugriff über das Internet in der Regel ohne Mehraufwand möglich

    Entscheidung für ein System

    Meine Anforderungen:

    • Integration ins bestehende Schaltersystem Gira E2
    • Funkbasierte Lösung, da an vielen Stellen nachträglich keine Verkabelung möglich ist
    • Unterstützung von Jalousien und dem Schrägstellen der Jalousielamellen für eine Teilbeschattung
    • Abdeckung möglichst vieler Anwendungsgebiete
    • Optional ein offenes System, so dass auch Eigenlösungen integriert werden können
    • App für die einfache Bedienung wäre von Vorteil

    Lösungsfindung:

    Unser Schalterprogramm ist von Gira, deswegen habe ich als erstes das Angebot von Gira evaluiert. Gira bietet alles was ich zu Beginn haben wollte. Einzig störte mich, dass eNet ein geschlossenes System ist, in das keine Eigenlösungen integriert werden kann. Der Preis für den eNet Server bewegt sich im Mittelfeld und im Vergleich zur kabelgebundenen KNX Lösungen ist er deutlich günstiger. Außerdem sind die angebotenen Komponenten auf die klassischen Anwendungen eines Schalterprogramms beschränkt.

    Lösungen mit dem Gira E2 Design gibt es auch von anderen Herstellern. Am Ende habe ich mich für Homematic IP entschieden, da dies als Server Lösung mit CCU3 kompatibel zu Homematic ist und außerdem als Cloud-Variante einen einfachen und sehr kostengünstigen Einstieg mit vielen Erweiterungsmöglichkeiten bietet. Außerdem ist das Homematic-System teiloffen und es gibt Möglichkeiten Eigenlösungen zu entwickeln. Darüber hinaus werden Alexa, Google Assistant und Conrad Connect auch noch unterstützt.

    Die Konkurrenzprodukte von Bosch, Innogy und Co. habe ich wegen fehlenden Anwendungsmöglichkeiten ausgeschlossen. Die Auswahl der richtigen Komponenten bei Gira gestaltete sich schwierig, da es mehrere verschiedene Systeme gibt, die nicht alle beliebig miteinander kombiniert werden können.

    Meine Lösung:

    Zunächst habe ich die Cloud basierte Variante von Homematic-IP mit dem für 50 Euro sehr günstigen AccessPoint in Betrieb genommen. Meine Erwartungshaltung war hier, dass ich mit der App recht schnell an die Grenzen dessen komme was möglich ist und Wünsche offen bleiben. In diesem Fall wäre der Schritt zu einer CCU3 als Home-Server einfach möglich, da alle Geräte von Homematic-IP auch damit kompatibel sind. Anders herum sind leider die Geräte von Homematic nicht mit der Cloud-Lösung von Homematic-IP kompatibel. Die Cloud basierte Lösung bleibt somit auf das Angebot von Homematic-IP beschränkt.

    Erfahrungen bei Installation und Betrieb

    Die Installation der Hardware benötigt für alle Geräte einen Nullleiter (schwarzer Draht). Das ist auch für alle Konkurenzprodukte so zu erwarten. D.h. man sollte vor dem Kauf der Geräte prüfen, ob die Dosen alle Anforderungen bzgl. des Bauraums und der erforderlichen Leitungen erfüllen. Ggf. muss noch ein Draht eingezogen werden, wenn die entsprechende Dose noch keinen Nullleiter hat. Die Installation sollte auf jedem Fall von jemanden durchgeführt werden, der über das entsprechende elektrische Fachwissen verfügt. 

    Bitte immer daran denken, dass zum prüfen des Bauraums und der verfügbaren Leitungen die entsprechenden Phasen über die Sicherungen zum Eigenschutz abgeschaltet werden müssen.

    Persönlich hat mich bei der Inbetriebnahme überrascht, dass ich mit der App zur Konfiguration des Cloud Dienstes tatsächlich alle meine Wünsche bzgl. der Beschattungskonfiguration mit Gruppensteuerungen, Zeitprofilen und Abhängigkeiten zu Sonnen Auf- und Untergang realisieren konnte. Der Einstieg erfolgte mit 4 Rollladen Steuerungen und 4 Jalousiesteuerungen. Inzwischen sind bereits mehr Geräte integriert und die nächste Erweiterung für Aussperrschutz (Türsensor der Verhindert, dass die zugehörige Jalousie heruntergefahren wird, wenn die Tür offen steht) und die Heizung um Keller bestellt. 

    Sogar ein Schutz der Jalousien in Abhängigkeit von der Windgeschwindigkeit basierend auf den Wetterdaten im Internet zu der Postleitzahl war möglich. Ein richtiger Windmesser einer Wetterstation liefert allerdings genauere Daten und darüber hinaus Informationen zur Sonnensituation.

    Die Funk-Reichweite in unserem Haus mit viel Beton ist grenzwertig. Trotzdem war durch eine geeignete Positionierung des Accesspoint im ersten Obergeschoß es bisher möglich alle Geräte zu erreichen. Eine Reichweitenerhöhung über Steckdosenrepeater mit Schaltfunktion ist ggf. für ca. 40 Euro möglich. 

    In Summe hat diese Lösung weniger als die Hälfte dessen gekostet, was die gleiche Lösung von Gira gekostet hätte. Außerdem ist bereits von Anfang an ein höherer Funktionsumfang durch die Cloud-Technik gegeben (z.B. Windschutz der Jalousien). 

    Die App

    Die App von Homematic IP ist tatsächlich auch für einen Endanwender vernünftig nutzbar und zeigt den Status auch unterwegs ohne Zusatzaufwand vernünftig an.

    Hier einige beispielhafte Screenshots, wie die App zur Bedienung über das Smartphone aussieht. Im Falle von Homematic-IP erfolgte auch die gesamte Konfiguration und das Update der Komponenten über diese App. Aus meiner Sicht ist die App mit ihrer Aufteilung in Räume, Gruppen und Zeitprofilen sauber und verständlich strukturiert.

      

    Power-User kommen mit der App möglicherweise an die Grenze dessen, was die App kann. In diesem Fall kann man bei Homematic-IP aber immer noch auf einen Server (CCU3) umstellen, der dann eine deutlich detailliertere und aufwendigere Konfiguration ermöglicht. Bei der Verwendung der CCU3 können dann auch noch Komponenten aus dem Angebot von Homematic (also nicht Homematic-IP) verwendet werden.

    Fazit

    Homematic-IP als Cloud basierte Smart-Home-Lösung kann ich durchaus empfehlen. Mangels Erfahrung mit Konkurrenzprodukten ist allerdings eine differenzierte Bewertung an dieser Stelle nicht möglich. So bleibt nur mein subjektiver aber positiver Gesamteindruck. Außerdem sehe ich auch im Nachhinein am Markt keine bessere Lösung und würde es so auch wieder umsetzen.

    Positiv ist mir aufgefallen:

    • Inbetriebnahme des Accesspoints
    • Verständlichkeit und Aufwand der Konfiguration
    • Einfache Bedienung über App und Taster
    • Verwendung von Windinformationen auf Postleitzahlbasis zum Schutz der Jalousien
    • Steuerung in Abhängigkeit von Sonnenauf- und -untergang
    • Automatische Erkennung der Abschaltpunkte und Laufzeiten von Rollos und Jalousien
    • Automatisches Update der Geräte
    • Preis/Leistungs-Verhältnis

    Verbesserungswürdig habe ich empfunden:

    • minimale Steuerzeit der Jalousien erlaubt keine Feinpositionierung der Lamellenwinkel (vermutlich Systembedingt wegen der verbauten Relais)
    • schwacher Druckpunkt der Steuertaster
    • manche Änderungen waren nur über ein Abmelden, Rücksetzen und Wiederanmelden der Geräte möglich
    • das Verschraubungs- und Befestigungskonzept erlaubt nur begrenzte Feinpositionierung

    Tuesday, March 05, 2019

    Speedport Smart 3 vs. FritzBox - Erfahrungen...

    Nach ein paar Jahren mit einem anderen Internet-Anbieter bin ich nun zur Telekom gewechselt. Deswegen stand die Frage im Raum: Speedport Smart 3 mieten oder ein eigenes Gerät kaufen. Da die Mietkonditionen für Neukunden sehr günstig sind, und das WLAN To Go nur mit dem Speedport angeboten wird, habe ich mich zunächst einmal für die Miete entschieden.

    Eigentlich bin ich davon ausgegangen, dass es technisch keinen Unterschied machen sollte, ob eine FritzBox (hatte ich zuvor) als Router verwendet wird oder ein Speedport Smart 3 von der Telekom. Leider stimmt das nicht bei meinen Anforderungen. Denn es gibt mit dem Speedport einiges worauf man verzichten muss:
    1. Die Liste der verpassten Anrufe und das Telefonbuch werden vom Speedport nicht auf dem AVM Telefon unterstützt, und das Wählverfahren läuft nur im Ton-Wahlverfahren. 
    2. VPN ist nicht im Speedport direkt konfigurierbar und nur über eine Portfreischaltung realisierbar. D.h. ein zusätzliches Gerät muss als VPN Server konfiguriert werden (z.B. ein RasPi mit Pi-VPN). Durch das zusätzliches Gerät sind die Stromkosten höher, und das eigenhändige Pflegen eines VPN Servers bedeutet Mehraufwand bietet bringt zusätzliche Sicherheitsrisiken mit sich.
    3. Der DHCP Server des Speedport gibt die Namenseinträge der Gerät nicht an den Nameserver weiter. D.h. die Geräte sind dadurch nicht wie von der FritzBox gewohnt über ihren Hostnamen sondern nur über ihre IP-Adresse ansprechbar. Das hat bei mir alle Owncloud Dienste auf den Clients lahmgelegt und ist auch sonst ein nerviges Hindernis für Netzwerkdienste wie z.B. SSH, NFS. 
    4. Es gibt keinen Gast-LAN Port. Diesen hatte ich bisher dafür benutzt unsere auf Homematic IP basierende Hausautomatisierung vom restlichen Netz zu isolieren. Das ist nicht notwendig, fand ich aber ein nützliches Detail, da so eine Sicherheitslücke im Homematic-IP Gerät sich nicht nutzen lässt, um auf das Heimnetz zuzugreifen.
    5. WLAN-Mesh: die AVM Repeater lassen sich nicht mit dem Speedport n ein gemeinsam konfigurierbares und Update-bares Mesh zusammenführen. Also auch hier Mehraufwand.
    Entsprechend habe ich kurzer Hand eine FritzBox 7530 gekauft und werde die Miete kündigen. Einziges Manko mit der 7530: Das Gast-LAN (nicht Gast-WLAN) ist bei Verwendung der 7530 an einem Glasfaseranschluss nicht Verfügbar, da anscheinend das Glasfasermodem auf dem Ethernet-Port des Gast-LAN angeschlossen wird...

    Update: Das Gast-LAN der FritzBox kann nach der Einstellung der Glasfaser-Verbindung wieder reaktiviert werden.