Ebusd

From CometVisu
Jump to: navigation, search

ebus - ebusd

ebus steht für Energie Bus und wird in modernen Heizungssystemen eingesetzt. Der serielle Bus dient dabei zum Austausch von Nachrichten zwischen einzelnen Bus Teilnehmern.

Prinzip

  • Es gibt sowohl aktive (=Master - kann Nachrichten aktiv versenden) als auch passive (=Slave - Antwortet auf Anfragen) Teilnehmer am Bus.
  • Ein Teilnehmer kann gleichzeitig Master und Slave sein.
  • Über einen ebus-Adapter (usb, lan) tritt der ebusd (ebus Daemon) als zusätzlicher, aktiver Teilnehmer am ebus auf.

Daemon

  • Der Daemon liest die laufende Kommunikation und kann den Inhalt definierter, zyklischer Nachrichten für die weiter Verarbeitung zwischenspeichern.
  • Über eine TCP Socket Verbindung (Telnet) können dem Daemon Befehle (ebus Befehle in lesbarer Form) zur aktiven Ausführung gesendet werden.
  • Nach Abarbeitung werden dem Absender die gewünschten Daten rückgemeldet.
  • Der Daemon nimmt zur Zeit keine Befehle vom ebus entgegen.

Befehle

  • In Sachen ebus Befehle kocht jeder Heizungshersteller sein eigenes Süppchen.
  • Der Daemon benötigt deshalb eine auf die installierte Heizung abgestimmte Konfigurationsdateien.


Installation

Sourcecode

  • Für das Kompilieren sind die GNU Autotools notwendig.
  • Der Sourcecode kann direkt von github bezogen werden.
$ https://github.com/yuhu-/ebusd/releases/tag/v0.1.0

Das Paket downloaden, entpacken, in das neu erstellte Verzeichnis wechseln und wie folgt kompilieren.

$ ./autogen.sh [optional: --prefix=/usr]
$ make
$ [optional: make install]

Konfiguration

Daemon

  • Der Daemon ist mit einer eingebauten Konfiguration ausgestattet.
  • In der Konfigurationsdatei ebusd.conf können alle Optionen überschrieben werden.
  • Mit den Kommandozeilen Optionen können nur die wichtigsten Einstellungen verändert werden.
Priorität der möglichen Konfiguration:
eingebaute Konfiguration < ebusd.conf < Kommandozeilen Option

Kommandozeile

$ ./ebusd -h
Usage: ebusd [OPTIONS]
-a --address         bus address (0xFF)
-c --cfgfdir         configuration directory of command files (/etc/ebusd)
-C --cfgfile         daemon configuration file (/etc/ebusd/ebusd.conf)
-d --device          bus device (/dev/ttyUSB0 or host:port)
-e --extension       extension of command files (csv)
-f --foreground      run in foreground
-l --loglevel        log level (INF | INF, NOT, WAR, ERR, DBG, EBH, EBS, NET, ALL)
-L --logfile         log file (/var/log/ebusd.log)
-n --nodevicecheck   don't check bus device
-P --pidfile         pid file (/var/run/ebusd.pid)
-p --port            port (8888)
-r --rawdump         dump raw ebus data to file
-R --rawfile         raw file (/tmp/ebusd.bin)
-s --showraw         print raw data
-S --settings        print daemon settings
-v --version         print version information
-h --help            print this message

Konfigurationsdatei

  • Der Daemon versucht die Konfigurationsdatei im Verzeichnis /etc/ebusd zu öffnen.
  • Ist diese nicht vorhanden wird im Verzeichnis des Daemons danach gesucht.
  • Zeilen beginnend mit einem # (Hash) werden als Kommentare gelesen.
  • Im Unterverzeichnis ~/contrib/etc/ebusd wird die Konfigurationsdatei ebusd.conf mitgeliefert.
# configuration file for ebusd
# bus address (FF)
address=FF
# configuration directory of command files (/etc/ebusd)
cfgdir=/etc/ebusd
# bus device (/dev/ttyUSB0 or host:port)
device=/dev/ttyUSB0
# extension of command files (csv)
#extension=csv
# run in foreground (NO | YES/NO)
foreground=NO
# log level (INF | INF, NOT, WAR, ERR, DBG, EBH, EBS, NET, ALL)
loglevel=INF
# log file (/var/log/ebusd.log)
logfile=/var/log/ebusd.log
# don't check bus device (NO | YES/NO)
#nodevicecheck=YES
# pid file (/var/run/ebusd.pid)
pidfile=/var/run/ebusd.pid
# port (8888)
port=8888
# dump raw ebus data to file (NO | YES/NO)
rawdump=NO
# raw file (/tmp/ebusd.bin)
awfile=/tmp/ebusd.bin
# print raw data (NO | YES/NO)
showraw=NO
# print daemon settings (NO | YES/NO)
settings=NO
# retry getting bus (3 | max: 10)
get_retry=3
# skipped ACK bytes after get-bus error (1)
skip_ack=1
# wait time for QQ compare (4000 uesc)
max_wait=4000
# retry sending msg (2 | max: 10)
send_retry=2
# number of printed hex bytes (30)
print_size=30

Kommando

  • Die möglichen Kommandos werden im csv Format bei Start des Daemons aus dem Verzeichnis /etc/ebusd gelesen.
  • Per Telnet Schnittstelle empfängt der Daemon Kommandos und setzt diese in ebus Nachrichten um.
  • Nachdem Ausführen wird eine Antwort an den Absender rückgemeldet.

Aufbau

  • Der Aufbau einer csv Datei folgt der im Daemon verwendeten Strukturen.
  • Eine Zeile entspricht einer ebus Nachricht bzw. einem Kommando (mehrere Unterkommandos).
  • Jeder Befehl besteht aus einem Nachrichten Kopf und einem variablen Teil (Wiederholgruppe).
  • Im Kopf sind dabei alle Daten, welche für die Verarbeitung der Nachricht notwendig sind.
  • In der anschließenden Wiederholgruppe werden die Nutzdaten definiert.


  • Als Feldtrennzeichen wird das Semikolon ; verwendet.
  • Der Daemon verlangt in jeder Spalte einen Wert. Falls kein Wert vorhanden dient der Bindestrich – als Füllzeichen.

Struktur - Kopf

char[  3] type     - Typ des Befehls (get, set, cyc)
char[ 20] class    - Klasse (ci, ...)
char[ 40] cmd      - Befehl (password, ...)
char[256] com      - Beschreibung des Befehls 
char[  2] s_type   - ebus Nachrichten Typ (BR = Broadcast, MM = MasterMaster or MS = MasterSlave)
char[  2] s_zz     - Adresse des Slave (15, ...)
char[  4] s_cmd    - Primär und Sekundär ebus Befehl (B509, ...)
int       s_len    - Anzahl Datenbytes des Befehls 
char[ 32] s_msg    - Datenbytes des Befehls (0D2C00, ...)
int       d_elem   - Anzahl der Elemente der Wiederholgruppe

Struktur - Wiederholgruppe

char[ 20] d_sub    - Unterbefehl (pin1, ...)
char[  2] d_part   - Quelle des Datenbytes (MD=Master Data, SA=Slave ACK, SD=Slave Data, MA=Master ACK)
char[ 10] d_pos    - Position der Datenbytes  (1,2 oder 3,4,5 ...)
char[  3] d_type   - Datentyp (asc, bcd, ...))
float     d_fac    - Skalierungsfaktor (1.0, 0.02, ...)
char[  6] d_unit   - Einheit des Wertes (°C, ...)
char[ 30] d_valid  - Mögliche Werte (noch nicht Implementiert) (01, 02, 03, ...)
char[256] d_com    - Beschreibung des Unterbefehl 

Datentypen

  • Für die Dekodierung bzw. Kodierung stehen folgende Datentypen zur Verfügung.
De  Ko  Typ  Byte Beschreibung
 X   X  str  x    string
 X   X  bcd  1    bcd
 X   X  d1b  1    data1b
 X   X  d1c  1    data1c
 X   X  d2b  2    data2b
 X   X  d2c  2    data2c
 X      bda  3    date (bcd Format)
 X   X  hda  3    date (hex Format)
 X      bti  3    time (bcd Format)
 X   X  hti  3    time (hex Format)
 X      bdy  1    day  (bcd Format)
 X   X  hdy  1    day  (hex Format)
 X      hex  x    2-nibble hex Format z.B: 2C
 X      uch  1    unsigned char
 X      sch  1    signed char
 X      uin  2    unsigned int
 X      sin  2    signed int
 X      ulg  4    unsigned long
 X      slg  4    signed long
 X      flt  4    float

Telnet Schnittstelle

  • Die Verbindung wird mit einem Telnet Client hergestellt.

daemon spezifisch

  • loglevel → ändert den Logging Level zur Laufzeit
  • quit → beendet die eigene Verbindung mit dem Daemon
  • shutdown → stoppt den Daemon und trennt die Verbindung

ebus spezifisch

  • get → sendet einen Befehl zum Lesen eines Heizungsparameter
  • set → sendet einen Befehl zum Setzen eines Heizungsparameter
  • cyc → fordert Werte für einen zyklisch aufgezeichneten Befehl an

Der Daemon erwartet für die Befehle get, set und cyc (type) noch die Klasse (class), den Befehl (cmd) und wenn notwendig einen Unterbefehl (sub). Somit ergibt sich folgender Aufbau.

type class cmd sub
  • Zwischen class, cmd und sub darf auch ein Punkt verwendet werden.
  • Die Groß-/Kleinschreibung wird für class, cmd und sub ignoriert.


Beispiel: Befehl für Ermittlung der Außentemperatur: cyc broad date_time_temp temp

$ telnet localhost 8888
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
cyc broad date_time_temp temp
5.00
quit
Connection closed by foreign host.