Benutzer-Werkzeuge

Webseiten-Werkzeuge


hardware:channels:heating_control:gastherme_buderus

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
hardware:channels:heating_control:gastherme_buderus [2025/11/24 21:31] – Aktualisierung, Nachtrag, TODO trabanthardware:channels:heating_control:gastherme_buderus [2025/11/29 22:03] (aktuell) trabant
Zeile 1: Zeile 1:
 ===== Gastherme Buderus/Bosch/Junkers mit Heatronic 3===== ===== Gastherme Buderus/Bosch/Junkers mit Heatronic 3=====
-Hier geht es um die Anbindung zu einer Gastherme mit //Heatronic 3//, diese gibt es unter den Namen Buderus, Junkers als auch neuerdings Bosch. Die Regelungen sind sehr ähnlich, da ja alle aus dem Hause Bosch kommen.+Hier geht es um die Anbindung einer Gastherme mit //Heatronic 3//, diese gibt es unter den Namen //Buderus////Junkers// sowie seit wenigen Jahren auch //Bosch// selbst. Die Regelungen sind sehr ähnlich, da  alle aus dem Hause Bosch kommen.
  
 Nicht passend ist diese Lösung für ältere Thermen mit //Heatronic 2//, die jedoch auch mit einem busfähigen Regler ausgestattet werden können. Siehe hierzu [[gastherme_junkers_can_bus|Junkers Gastherme mit Heatronic 2 und Can-Bus-Regler]]. Nicht passend ist diese Lösung für ältere Thermen mit //Heatronic 2//, die jedoch auch mit einem busfähigen Regler ausgestattet werden können. Siehe hierzu [[gastherme_junkers_can_bus|Junkers Gastherme mit Heatronic 2 und Can-Bus-Regler]].
  
-Bei den Junkers-Geräten wurde der HT3-Bus ab 2010 eingeführt, bei Buderus gibt es in schon etwa 10 Jahre länger.+Bei den Junkers-Geräten wurde der HT3-Bus ab 2010 eingeführt, bei Buderus gibt es ihn schon etwa 10 Jahre länger unter dem Namen EMS.
  
-Im Mikrocontroller Forum [[https://www.mikrocontroller.net/topic/317004]] wurden verschiedene Adapter für den Anschluss eines //Heatronic 3// Busses an einen Raspberry Pi entwickelt. Mit etwas Glück bekommt man auf Nachfrage ein bereits bestücktes Adapter-Board. Dieses wird über eine zweiadrige verpolungssichere Leitung mit der Therme oder auch dem Regler verbunden.+Im Mikrocontroller-Forum [[https://www.mikrocontroller.net/topic/317004]] wurden verschiedene Adapter für den Anschluss eines //Heatronic 3// Busses an einen Raspberry Pi entwickelt. Mit etwas Glück bekommt man auf Nachfrage ein bereits bestücktes Adapter-Board. Dieses wird über eine zweiadrige verpolungssichere Leitung mit der Therme oder auch dem Regler verbunden.
  
 Passend zu diesen Boards gibt es eine eigene Software, die die Dekodierung übernimmt: [[https://github.com/norberts1/hometop_HT3.git]], auch dazu gibt es einen Thread im genannten Forum [[https://mikrocontroller.net/topic/324673]]. Diese Software ist wirklich herstellerspezifisch und würde bei Geräten anderer Hersteller mit EMS-Bus nicht so einfach funktionieren. Passend zu diesen Boards gibt es eine eigene Software, die die Dekodierung übernimmt: [[https://github.com/norberts1/hometop_HT3.git]], auch dazu gibt es einen Thread im genannten Forum [[https://mikrocontroller.net/topic/324673]]. Diese Software ist wirklich herstellerspezifisch und würde bei Geräten anderer Hersteller mit EMS-Bus nicht so einfach funktionieren.
  
-Jetzt geht es an die Anbindung an der Volkszähler: Im Forum findet man auch ein Skript, welches die Daten aus der Sqlite Datenbank der HT3 Software in die Volkszähler-Datenbank überträgt [[https://www.mikrocontroller.net/topic/317004?page=single#4400665]]+Die //hometop-HT3// Software kann die dekodierten Daten wahlweise als RRD Dateien speichern und damit einen eigenen Webserver füttern, oder aber auch als Sqlite Datenbank. Für das Logging in den [[:volkszaehler|Volkszähler]] wählen wir die zweite Methode. In der Konfigurationsdatei ''HT3/sw/config/HT3_db_cfg.xml'' setzen wir in der Sektion ''<sql-db>'' den Parameter ''<enable>'' auf ''on'' und setzen die automatische Löschung von alten Daten (''<autoerase_olddata>'') auf einen Tag (''1''). Darunter kann unter ''<rrdtool-db>'' die Erstellung der RRD Daten ausgeschaltet werden (''off'', wer die RRD Daten gerne haben möchte kann diese auch parallel erstellen lassen)
  
-Dieses Perl Skript löscht die vorhandenen Daten aus den betreffenden Volkszähler-Kanälen und überträgt die  Werte aus der obengenannten SQLite DB in einem Rutsch.+Diese Anpassungen sollten am Besten vor dem ersten Lauf des Programmes ''create_databases.py'' vergenommen werden, Sind die Datenbanken im Rahmen des Installationsprozesses von //hometop-HT3// bereits erstellt worden, und es gibt keine Sqlite Datei unter ''HT3/sw/var/databases/HT3_db.sqlite'', dann lässt man ''create_databases.py'' noch einmal laufen.
  
-Alternativ kann man das Skript auch ein bisschen anpassenso dass es im Hintergrund läuft und in einem festgesetzten Abstand die aktuellen Daten abfragt und den VZ auf dem aktuellen Stand hältDas sieht dann in etwa so aus:+Für die Anbindung an den Volkszähler ist es wichtig, dass die Dienste ''ht_proxy.py'' und ''ht_collgate.py'' laufen und die Sqlite Datenbank ''HT3_db.sqlite'' auch aktualisiert wird.
  
-<code perl ht3logger.pl+Mit dem folgenden Skript können dann die Daten in einem festgesetzten Abstand (voreingestellt sind 10s) abgefragt und via [[software:middleware:einrichtung|Middleware]] an die [[software:middleware:datenbank|Volkszähler-DB]] übermittelt werden: 
-#!/usr/bin/perl+  
 +<code python ht3logger.py
 +#!/usr/bin/python3
  
-$date = scalar localtime(); +import sqlite3 
-print "Starting up ht3logger on $date\n";+from requests import post 
 +from time import ctime,sleep
  
-use DBI;+print("Starting up ht3logger V1 on "+ctime())
  
-$dsn "DBI:mysql:database=volkszaehler;host=localhost"; +channel_list 
-$dbh2 = DBI->connect($dsn, "vz""*secure*", { RaiseError => 1AutoCommit => 1});+        'ch_V_spare_1'     '80089ae0-fa81-11e9-bdc6-b99d5fa0fe8b', 
 +        'T_vorlauf_soll'   'af1863e0-fa81-11e9-8d30-337b7499db8e', 
 +        'T_vorlauf_ist'    : 'cbf99f10-fa81-11e9-9709-d55e7ad0883e', 
 +        'T_mischer'        : '521a0ca0-fa8d-11e9-970f-752aababd342', 
 +        'V_heizungs_pumpe' : 'a5958bf0-fa8f-11e9-bf34-4f7c2163b201', 
 +        'V_brenner_flamme' : '5ec31d30-fa90-11e9-98b7-3b9f4a33ba29', 
 +        'V_leistung'       : '81f3ed90-7f7b-11ed-90c6-b747fd43b61f', 
 +        'C_brenner_gesamt' : '9bbd1c20-a8ee-11e5-82ab-079b3d8ffc8e' 
 +
 +  
 +while True: 
 + try: 
 + db = sqlite3.connect("/home/pi/HT3/sw/var/databases/HT3_db.sqlite"
 + db.row_factory = sqlite3.Row 
 + cursor = db.execute("SELECT FROM heizgeraet order by utc desc limit 1"
 + except: 
 + print("Error accessing Sqlite database."
 + raise SystemExit(2) 
 + for dbvalue in cursor: 
 + timestamp int(dbvalue['UTC'] * 1000) 
 + for key,uuid in channel_list.items(): 
 + try: 
 + #print(key, timestamp, uuid, dbvalue[key]) 
 + post('http://localhost/middleware/data.json'data='uuid':uuid,'ts':timestamp,'value':dbvalue[key]}) 
 + except: 
 + print("Couldn't post to VZ Middleware.")  
 + db.close() 
 + sleep(10) 
 +</code>
  
 +<note important>Die ''channel_list'' im Skript muss manuell angepasst werden. An erster Stelle stehen die Spaltennamen aus der //hometop// Sqlite-DB, an zweiter Stelle die ''UUID'' eines bestehenden VZ-Kanals. Der Name (z.B. //T_vorlauf_ist//, kann, muss aber nicht mit der Benennung des entsprechenden [[software:middleware:einrichtung|Kanals]] im VZ übereinstimmen.</note>
  
-while (1) { +Die genannten Werte sind nur Beispiele, ein Blick in die SQLite DB genügt um herauszufinden, was man selbst gerne hätteIn diesem Beispiel einer Kombitherme findet man unter ''T_mischer'' im übrigen die DL-Warmwassertemperatur.
-        $dbh = DBI->connect( "dbi:SQLite:/var/HT3/sw/var/databases/HT3_db.sqlite" ) || die "Cannot connect: $DBI::errstr";+
  
-        my $sth = $dbh->prepare("select * from heizgeraet order by utc desc limit 1;");+<note tip>In der Sqlite Datenbank gibt es neben der Tabelle ''heizgeraet'' noch weitere, für den Fall dass separate Heizkreise, Solarthermie oder ein Warmwasserspeicher existieren. Möchte man von weiteren Tabellen Daten abrufen, lässt sich das Skript einfach replizieren und entsprechend anpassen.</note> 
  
-        $sth->execute();+Wenn man das Skript dann auf dem VZ-System abgelegt hat, z.B. unter ''/home/pi/bin/'', kann man es dann auch automatisch mittels //systemd-service// starten, dazu folgende Datei nach ''/etc/systemd/system/'' kopieren: 
 +<code text ht3logger.service> 
 +[Unit] 
 +Description=Logging data from hometop HT3 database to VZ Middleware 
 +After=ht_proxy.service ht_collgate.service
  
-        $ref = $sth->fetchrow_hashref(); +[Service
-        $utc = $ref->{'UTC'}*1000; +ExecStart=/home/pi/bin/ht3logger.py 
-        $sql[$z++= "(1,  $utc , ". $ref->{'T_ruecklauf'}."),\n"; +ExecReload
-        $sql[$z++] "(2,  $utc , "$ref->{'T_vorlauf_soll'}."),\n"; +StandardOutput=syslog 
-        $sql[$z++] "(3,  $utc , ". $ref->{'T_vorlauf_ist'}."),\n"; +Restart=always
-        $sql[$z++] "(4,  $utc , ". $ref->{'T_mischer'}."),\n"; +
-        $sql[$z++] "(5,  $utc , ". $ref->{'V_heizungs_pumpe'}."),\n"; +
-        $sql[$z++] = "(6,  $utc , ". $ref->{'V_brenner_flamme'}."),\n"; +
-        $sql[$z++] = "(11,  $utc , ". $ref->{'V_leistung'}."),\n"; +
-        $sql[$z++] = "(18,  $utc , ". $ref->{'C_brenner_gesamt'}."),\n"; +
-        $sql2 = ""; +
-        $z=0; +
-        foreach my $do (@sql)   { +
-                $sql2 .= $do; +
-                $z++; +
-                $sql2 = "INSERT INTO `data` (`channel_id`, `timestamp`, `value`) VALUES ".$sql2; +
-                chop($sql2); +
-                chop($sql2); +
-                #print $sql2; +
-                print $dbh2->do($sql2) if ($utc ne $utcold); +
-                $sql2 = ""; +
-                $z=0; +
-                } +
-        $utcold = $utc; +
-        $sth->finish(); +
-        $dbh->disconnect;+
  
-        sleep 10; +[Install] 
-}+WantedBy=multi-user.target
 </code> </code>
- +<note tip>Bitte beachten dass der Pfad im ExecStart Statement auch dem tatsächlichen Pfad des Programmes entspricht. 
-Die genannten Werte sind nur Beispiele, ein Blick in die SQLite DB genügt um herauszufinden, was man selbst gerne hätte. In diesem Beispiel einer Kombitherme findet man unter ''T_mischer'' im übrigen die DL-Warmwassertemperatur. +</note> 
- +Dann sollte sich der Dienst per ''systemctl enable ht3logger.service'' und ''systemctl start ht3logger.service'' aktivieren lassen.
-<note important>Bitte beachten: das Skript nutzt für die Volkszähler-DB noch nicht die ''UUIDs'', sondern die jeweilige interne ''channel_id''Die Zuordung findet man in der ''entities'' Tabelle der VZ-Datenbank</note> +
- +
-<note tip>Da die //hometop// Software beim Startup etwas Zeit benötigt um die Datenbank zu aktualisieren, empfiehlt es sich, zwischen dem Start des ''ht_collgate.py'' und des ''ht3logger.pl'' eine Wartezeit von 3 Minuten eizuhalten (z.B. ''sleep 180'' im Startup Skript). Andernfalls findet der logger alte Daten vor und wirft eine Fehlermeldung.</note>+
  
 Last not least ein Bild des [[software:frontends:frontend|Frontends]], was den Erfolg und auch die verwendeten [[software:middleware:einrichtung|Kanaltypen]] zeigt: Last not least ein Bild des [[software:frontends:frontend|Frontends]], was den Erfolg und auch die verwendeten [[software:middleware:einrichtung|Kanaltypen]] zeigt:
Zeile 76: Zeile 87:
 {{ :hardware:channels:heating_control:can-vz.png | Frontend}} {{ :hardware:channels:heating_control:can-vz.png | Frontend}}
  
-<note tip>In diesem Fall muss für den Kanaltyp der Brennerstarts nicht der "Allgemeine Impulszähler", sondern "Bestriebsstundenzähler (Zählerstand)" verwendet werden. Der Grund hierfür ist, dass vom Skript nicht die einzelnen Starts geloggt werden, sondern die Therme selbst die Starts aufaddiert und auf den Bus schreibt.</note> +<note tip>In diesem Fall muss für den Kanaltyp der Brennerstarts nicht der "Allgemeine Impulszähler", sondern "Betriebsstundenzähler (Zählerstand)" verwendet werden. Der Grund hierfür ist, dass vom Skript nicht die einzelnen Starts geloggt werden, sondern die Therme selbst die Starts aufaddiert und auf den Bus schreibt.</note>
- +
-//**TODO -**//  +
-Umstellung des Skriptes auf UUIDs und evtl. auch Verwendung der Middleware zur Datenübertragung anstelle des direkten Datenbankzugriffs. Dokumentierung der //hometop//-Konfiguration und der Startup Skripts. Add prerequisites & error-handling.+
hardware/channels/heating_control/gastherme_buderus.1764016293.txt.gz · Zuletzt geändert: von trabant