Benutzer-Werkzeuge

Webseiten-Werkzeuge


hardware:channels:heating_control:gastherme_junkers_can_bus

Dies ist eine alte Version des Dokuments!


Junkers Gastherme mit Heatronic 2 und Can-Bus-Regler

Die Modelle mit Heatronic 2 wurden zwischen Ende der 90er Jahre und 2010 gebaut und haben meist die Typenbezeichnung -5 oder -6, z.B. also ZWR 18-6.

Diese Modelle können mit einem Can-Bus-fähigen Regler ausgestattet werden. Dieser Bus ist nicht zu verwechseln mit dem der Heatronic 3. Achtung: Das heizungsseitige Can-Bus Modul ist nicht standardmäßig eingebaut, sondern Teil des entsprechenden Raum- oder Außentemperaturreglers, konkret sind das die Regler TR200, TA250 und TA270. Ohne einen dieser Regler funktioniert es nicht.

Zu Hardware und der Junkers-spezifischen Implementierung des Can-Protokolles siehe: https://www.mikrocontroller.net/topic/81265

Auf der Volkszähler-Seite wird natürlich ebenso ein Can-Bus-Modul benötigt, zu empfehlen ist das PiCan2 Board, das speziell für den Raspberry Pi entwickelt wurde und sich 1:1 aufstecken lässt. Für Besitzer eines RPi 4 gibt es das PiCan3, das praktischerweise auch noch über eine Real Time Clock verfügt, die ja für den „zeitlosen“ Raspberry durchaus nützlich sein kann. Dazu gibt es einen passenden Schraubensatz und auch ein für diesen „Doppeldecker“ passendes Gehäuse.

Verbunden werden die Busmodule von der Heizung (oder auch dem Regler) mit dem Raspberry mittels einer dreiadrigen Leitung, Can-High, Can-Low und Ground. Da der Bus sowohl an der Heizung als auch am Regler bereits terminiert ist, sollte es nur eine kurze Stichleitung von ca. 30cm sein. Irgendwelche elektronischen Probleme mit der Kommunikation oder Busfehler sind beim Ersteller dieser Dokumentation bislang nie vorgekommen.

Damit der Raspberry mit dem Board kommunizieren kann, muss im /boot/config.txt der SPI Bus aktiviert und einige weitere Eistellungen vergenommen werden, konkret sind das folgende Zeilen:

config.txt
dtparam=spi=on
dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=25
dtoverlay=spi-bcm2835-overlay

Im nächsten Schritt die Clientprogramme, die auf dem Socket-Can aufsetzten, installieren mittels:

apt-get install can-utils

Einmal booten, dann sollte das Board erkannt werden… zum Testen mal das Interface per Hand aufsetzen:

ip link set can0 up type can bitrate 10000 listen-only on

Die Bitrate ist wichtig (muss zum Gegenüber passen!), der Parameter listen-only stellt sicher, dass wirklich nur mitgehört wird nichts den Bus durcheinander bringt. Wenn nun ein

ifconfig can0

ein Interface zeigt, inklusive ankommender Datenpakete, kann es weitergehen zum nächsten Schritt. Ein

candump can0

sollte nun die eingehenden Datenpakete zeigen, die nun anhand dieser Tabelle ausgewertet und via Skript an die VZ Middleware übergeben werden können. Beispielhaft dazu folgende Zeilen, die nur als Vorlage dienen können:

can-vz.sh
#!/bin/bash
export PATH=/usr/bin:/bin
echo "Can_Logger starting on `date`"
 
CANDUMPER="candump can0"
 
CANDUMP_IN[1]="200"
HUMAN_INFO[1]="Vorlauf Max"
VZ_UUIDFOR[1]="80089ae0-xxxxxxxxxxxxxxxxxxxxxxxxxxx"
CANDUMP_IN[2]="252"
HUMAN_INFO[2]="Vorlauf Soll"
VZ_UUIDFOR[2]="af1863e0-xxxxxxxxxxxxxxxxxxxxxxxxxxx"
CANDUMP_IN[3]="201"
HUMAN_INFO[3]="Vorlauf Ist"
VZ_UUIDFOR[3]="cbf99f10-xxxxxxxxxxxxxxxxxxxxxxxxxxx"
CANDUMP_IN[4]="203"
HUMAN_INFO[4]="Warmwasser Ist"
VZ_UUIDFOR[4]="521a0ca0-xxxxxxxxxxxxxxxxxxxxxxxxxxx"
CANDUMP_IN[5]="20A"
HUMAN_INFO[5]="Heizung Ein"
VZ_UUIDFOR[5]="a5958bf0-xxxxxxxxxxxxxxxxxxxxxxxxxxx"
CANDUMP_IN[6]="209"
HUMAN_INFO[6]="Brenner Ein"
VZ_UUIDFOR[6]="5ec31d30-xxxxxxxxxxxxxxxxxxxxxxxxxxx"
 
VZ_UUIDFORBS="d403e120-xxxxxxxxxxxxxxxxxxxxxxxxxxx"
 
typeset -i MAXP=6
typeset -i P=1
typeset -i BR=0
 
###########  M A I N  ############
 
  while read LINE # Read line by line from "candump"
  do
    while [[ ${P} -le ${MAXP} ]] # check if the current line is on of the wanted measurement values
    do
        if [[ "$( echo -e "${LINE}" | grep "${CANDUMP_IN[${P}]}" | wc -l )" -gt 0 ]]
        then
          # if the candump line includes one of the wanted values, get the value from message
          VAL="$( echo -e "ibase=16;obase=A;$( echo -e ${LINE} | cut -c14-15 )" | bc )"
          if [[ ( "${CANDUMP_IN[${P}]}" == 20A ) ]]
          then
            VALUE=${VAL}
          elif [[ ( "${CANDUMP_IN[${P}]}" == 209 ) ]]
          then
            VALUE=${VAL}
            if [[ ( "${VAL}" == 1 ) && ( "${BR}" == 0 ) ]]
            then
              BR=1
              if [[ "${1}" == "test" ]]
              then
                 echo -e "$( date "+%H:%M:%S") - Brennerstart"
              else
                 R_BS="$( wget -O - -q "http://localhost/middleware/data/${VZ_UUIDFORBS}.json?operation=add" )"
              fi
            elif [[ ( "${VAL}" == 0 ) ]]
              then
              BR=0
            fi
          else
            VALUE="$( echo "scale=1 ; ${VAL} / 2" | bc )"
          fi
          if [[ "${1}" == "test" ]]
          then
              echo -e "$( date "+%H:%M:%S") - ${HUMAN_INFO[${P}]}:  ${VALUE} (${LINE})"
          elif [[ $(echo "$VALUE > 80" | bc) -eq 1 ]]
          then
              echo -e "$( date "+%H:%M:%S") - ${HUMAN_INFO[${P}]}:  Value ${VALUE} larger than 80, ignoring"
          else
              # Send the value to volkszaehler
              RESPONSE="$( wget -O - -q "http://localhost/middleware/data/${VZ_UUIDFOR[${P}]}.json?operation=add&value=${VALUE}" )"
          fi
      fi
      P=${P}+1
    done
    P=1
  done < <( ${CANDUMPER} )

Starten kann man das Ganze dann automatisch mittels systemd-service:

canlogger.service
[Unit]
Description=Can Logger for VZ
After=mysql.service middleware.service nginx.service
 
[Service]
ExecStartPre=/sbin/ip link set can0 up type can bitrate 10000 listen-only on
ExecStart=/home/pi/bin/can-vz.sh
ExecStopPost=/sbin/ip link set can0 down
ExecReload=
StandardOutput=syslog
Restart=always
 
[Install]
WantedBy=multi-user.target

Last not least ein Bild des Frontends, was den Erfolg und auch die verwendeten Kanaltypen zeigt:

 Frontend

hardware/channels/heating_control/gastherme_junkers_can_bus.1588006096.txt.gz · Zuletzt geändert: 2020/04/27 18:48 von trabant