Benutzer-Werkzeuge

Webseiten-Werkzeuge


hardware:channels:heating_control:gastherme_junkers_can_bus

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
Nächste ÜberarbeitungBeide Seiten der Revision
hardware:channels:heating_control:gastherme_junkers_can_bus [2020/05/15 20:12] – Updated trabanthardware:channels:heating_control:gastherme_junkers_can_bus [2023/11/03 09:35] – Notwendige Prerequisite Programme ergänzt (bc/mailx) trabant
Zeile 1: Zeile 1:
 ===== Junkers Gastherme mit Heatronic 2 und Can-Bus-Regler ===== ===== 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//.+Die Modelle mit //Heatronic 2// wurden zwischen Ende der 90er Jahre und 2010 gebaut und haben oft die Typenbezeichnung -5 oder -6, z.B. also //ZWR 18-6//, dazu kommen etliche Brennwertgeräte aus dieser Zeit. Im Zweifelsfall lohnt ein Blick in die Installationsanleitung.
  
-Diese Modelle können mit einem Can-Bus-fähigen Regler ausgestattet werden. Dieser Bus ist nicht zu verwechseln mit dem der [[hardware:channels:heating_control:gastherme_buderus|Heatronic 3]]. Achtung: Das heizungsseitige Can-Bus Modul //BM1// 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.+Diese Modelle können mit einem Can-Bus-fähigen Regler ausgestattet werden. Dieser Bus ist nicht zu verwechseln mit dem der [[hardware:channels:heating_control:gastherme_buderus|Heatronic 3]]. Achtung: Das heizungsseitige Can-Bus Modul //BM1// ist nicht standardmäßig eingebaut, sondern Teil des entsprechenden Raum- oder Außentemperaturreglers, konkret sind das die Regler //TR220//, //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]] 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 [[http://skpang.co.uk/catalog/pican2-canbus-board-for-raspberry-pi-23-p-1475.html|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 [[http://skpang.co.uk/catalog/pican3-canbus-board-for-raspberry-pi-4-with-3a-smps-rtc-p-1572.html|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.+Auf der Volkszähler-Seite wird natürlich ebenso ein Can-Bus-Modul benötigt, zu empfehlen ist das [[https://www.skpang.co.uk/products/pican2-can-bus-board-for-raspberry-pi-2-3|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 [[https://www.skpang.co.uk/products/pican3-can-bus-board-for-raspberry-pi-4-with-3a-smps-rtc|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.+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.  
 + 
 +Hier die Belegung auf der Junkers Seite (Klemme BM1 und TA/TR) sowie des PiCan (2/3), jeweils entsprechend der jeweiligen Anleitung des Herstellers und ohne Gewähr: 
 +<code text> 
 +Junkers --- PiCan --- empfohlene Adernfarbe 
 + 
 +   Can-High  1      (Gelb) 
 +   Can-Low        (Grün) 
 +   Ground    3      (Weiss) 
 +</code> 
 + 
 +Keinesfalls dürfen die Anschlüsse für 24V+ (Junkers Klemme 1) sowie 12V+ (PiCan Pin 4) verbunden werden. 
 + 
 +<note warning>Bei der Verdrahtung bitte sorgfältig und gewissenhaft vorgehen, denn eine falsche Belegung oder gar ein Kurzschluss kann durchaus empfindliche Elektronik zerstören.</note>
  
 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: 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:
Zeile 19: Zeile 32:
 </code> </code>
  
-Im nächsten Schritt die Clientprogramme, die auf dem Socket-Can aufsetzten, installieren mittels:+Im nächsten Schritt die Clientprogramme installieren, die auf dem Socket-Can aufsetzten, sowie den GNU Rechner ''bc'' und den BSD Mailer ''mailx'' (falls noch nicht vorhanden):
  
 <code> <code>
-apt-get install can-utils+apt-get install can-utils bc bsd-mailx
 </code> </code>
  
Zeile 41: Zeile 54:
 sollte nun die eingehenden Datenpakete ausgeben, die nun anhand dieser sollte nun die eingehenden Datenpakete ausgeben, die nun anhand dieser
 {{:hardware:channels:heating_control:can_tabelle.rtf|Tabelle}} {{:hardware:channels:heating_control:can_tabelle.rtf|Tabelle}}
-ausgewertet und via Skript an die VZ [[software:middleware|Middleware]] übergeben werden können. Beispielhaft dazu folgende Zeilen, die nur als Vorlage dienen können:+ausgewertet und via Skript an die VZ [[software:middleware|Middleware]] übergeben werden können. Beispielhaft dazu folgende Zeilen, die nur als Vorlage dienen können und an die konkrete Umgebung angepasst werden müssen:
  
-<code shell can-vz.sh>+<code shell canlogger.sh>
 #!/bin/bash #!/bin/bash
 +# canlogger.sh V2
 # calling the script with "test" parameter will display the values on screen instead of sending to VZ # calling the script with "test" parameter will display the values on screen instead of sending to VZ
  
 export PATH=/usr/bin:/bin export PATH=/usr/bin:/bin
-echo "Can_Logger starting on `date`"+ 
 +case "$1" in 
 +    test) 
 +        echo "CAN Logger V2 starting on `date` in testing mode" 
 +        ;; 
 + 
 +    prod) 
 +        echo "CAN Logger V2 starting on `date` in production mode" 
 +        ;; 
 + 
 +    *) 
 +        echo "Usage: canlogger.sh {test|prod}" 
 +        echo "  testing mode will display values on screen" 
 +        echo "  production mode will send the values to the VZ Middleware" 
 +        exit 3 
 +        ;; 
 +esac
  
 CANDUMPER="candump can0" CANDUMPER="candump can0"
 +
 +MAIL_SENDER="mailfrom@address.com"
 +MAIL_RECIPIENT="mailto@address.com"
  
 CANDUMP_IN[1]="200" CANDUMP_IN[1]="200"
Zeile 70: Zeile 103:
 HUMAN_INFO[6]="Brenner Ein" HUMAN_INFO[6]="Brenner Ein"
 VZ_UUIDFOR[6]="5ec31d30-fa90-11e9-98b7-3b9f4a33ba29" VZ_UUIDFOR[6]="5ec31d30-fa90-11e9-98b7-3b9f4a33ba29"
 +CANDUMP_IN[7]="251"
 +HUMAN_INFO[7]="Leistung Soll"
 +VZ_UUIDFOR[7]="81f3ed90-7f7b-11ed-90c6-b747fd43b61f"
 +CANDUMP_IN[8]="206"
 +HUMAN_INFO[8]="Fehlercode"
  
 VZ_UUIDFORBS="d403e120-115a-11ea-b273-05a1540bacf1" VZ_UUIDFORBS="d403e120-115a-11ea-b273-05a1540bacf1"
  
-typeset -i MAXP=6+typeset -i MAXP=8
 typeset -i P=1 typeset -i P=1
 typeset -i BR=0 typeset -i BR=0
- +typeset FC="00"
-############   M A I N   ############+
  
 while read LINE while read LINE
Zeile 85: Zeile 122:
     if [[ "$( echo -e "${LINE}" | grep "${CANDUMP_IN[${P}]}" | wc -l )" -gt 0 ]]     if [[ "$( echo -e "${LINE}" | grep "${CANDUMP_IN[${P}]}" | wc -l )" -gt 0 ]]
     then     then
-      VAL="$( echo -e "ibase=16;obase=A;$( echo -e ${LINE} | cut -c14-15 )" | bc )" +      HEXCODE="$( echo -e ${LINE} | cut -c14-15 )" 
-      if [[ ( "${CANDUMP_IN[${P}]}" == 20A ) ]]+      DECVAL="$( echo -e "ibase=16;obase=A;${HEXCODE}" | bc )" 
 +      if [[ "${CANDUMP_IN[${P}]}" == 206 ) ]] 
 +      then 
 +        case "$1" in 
 +          test) 
 +            echo -e "$( date "+%H:%M:%S") - ${HUMAN_INFO[${P}]}: ${HEXCODE} (${LINE})" 
 +            ;; 
 +          prod) 
 +            if [[ ( "${HEXCODE}" != "$FC" ) ]] 
 +            then 
 +              FC=${HEXCODE} 
 +              echo "Hilfe! Fehlercode ${FC}" mailx -r "${MAIL_SENDER} (Junkers Therme)" -s "Therme Fehler" ${MAIL_RECIPIENT} 
 +            fi 
 +            ;; 
 +        esac 
 +        break 
 +      elif [[ ( "${CANDUMP_IN[${P}]}" == 251 ]] 
 +      then 
 +        VALUE="$( echo "scale=2 ; ${DECVAL} / 255 * 100" | bc )" 
 +      elif [[ ( "${CANDUMP_IN[${P}]}" == 20A ) ]]
       then       then
-        VALUE=${VAL}+        VALUE=${DECVAL}
       elif [[ ( "${CANDUMP_IN[${P}]}" == 209 ) ]]       elif [[ ( "${CANDUMP_IN[${P}]}" == 209 ) ]]
       then       then
-        VALUE=${VAL+        VALUE=${DECVAL
-        if [[ ( "${VAL}" == 1 ) && ( "${BR}" == 0 ) ]]+        if [[ ( "${DECVAL}" -eq 1 ) && ( "${BR}" -eq 0 ) ]]
         then         then
           BR=1           BR=1
-          if [[ "${1}== "test" ]] +          case "$1" in 
-          then +            test) 
-            echo -e "$( date "+%H:%M:%S") - Brennerstart" +              echo -e "$( date "+%H:%M:%S") - Brennerstart" 
-          else +              ;; 
-            R_BS="$( wget -4 -O - -q --post-data "" "http://localhost/middleware/data/${VZ_UUIDFORBS}.json" )" +            prod) 
-          fi +              R_BS="$( wget -4 -O - -q --post-data "" "http://localhost/middleware/data/${VZ_UUIDFORBS}.json" )" 
-        elif [[ ( "${VAL}" == 0 ) ]]+              if [[ ! ${R_BS} == *rows*1* ]] 
 +              then  
 +                echo "Error posting to Middleware: ${R_BS}" 
 +              fi 
 +              ;; 
 +          esac 
 +        elif [[ ( "${DECVAL}" -eq 0 ) ]]
           then           then
           BR=0           BR=0
         fi         fi
       else       else
-        VALUE="$( echo "scale=1 ; ${VAL} / 2" | bc )" +        VALUE="$( echo "scale=1 ; ${DECVAL} / 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 +
-        RESPONSE="$( wget -4 -O - -q --post-data "value=${VALUE}" "http://localhost/middleware/data/${VZ_UUIDFOR[${P}]}.json" )"+
       fi       fi
 +      case "$1" in
 +        test)
 +          echo -e "$( date "+%H:%M:%S") - ${HUMAN_INFO[${P}]}:  ${VALUE} (${LINE})"
 +          ;;
 +        prod)
 +          RESPONSE="$( wget -4 -O - -q --post-data "value=${VALUE}" "http://localhost/middleware/data/${VZ_UUIDFOR[${P}]}.json" )"
 +          if [[ ! ${RESPONSE} == *rows*1* ]]
 +          then 
 +            echo "Error posting to Middleware: ${RESPONSE}"
 +          fi
 +          ;;
 +      esac
     fi     fi
     P=${P}+1     P=${P}+1
-  done+  done 
   P=1   P=1
 done < <( ${CANDUMPER} ) done < <( ${CANDUMPER} )
 +
 </code> </code>
  
-Starten kann man das Ganze dann automatisch mittels //systemd-service//, dazu folgende Datei nach  /etc/systemd/system/ kopieren:+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 canlogger.service> <code text canlogger.service>
 [Unit] [Unit]
Zeile 132: Zeile 198:
 [Service] [Service]
 ExecStartPre=/sbin/ip link set can0 up type can bitrate 10000 listen-only on ExecStartPre=/sbin/ip link set can0 up type can bitrate 10000 listen-only on
-ExecStart=/home/pi/bin/can-vz.sh+ExecStart=/home/pi/bin/canlogger.sh prod
 ExecStopPost=/sbin/ip link set can0 down ExecStopPost=/sbin/ip link set can0 down
 ExecReload= ExecReload=
Zeile 141: Zeile 207:
 WantedBy=multi-user.target WantedBy=multi-user.target
 </code> </code>
 +<note tip>Bitte beachten dass der Pfad im ExecStart Statement auch dem tatsächlichen Pfad des Programmes entspricht.
 +</note>
 Dann sollte sich der Dienst per ''systemctl enable canlogger.service'' und ''systemctl start canlogger.service'' aktivieren lassen. Dann sollte sich der Dienst per ''systemctl enable canlogger.service'' und ''systemctl start canlogger.service'' aktivieren lassen.
  
Zeile 148: Zeile 216:
  
 <note important>Etwas sollte man noch beachten: Damit das heizungseitige Bus-Modul alle Informationen sendet, insbesondere //Brenner- und Heizung/Pumpe Ein// (also die Betriebsstundensensoren), muss der Drehschalter des TR/TA-Reglers auf Info stehen!</note> <note important>Etwas sollte man noch beachten: Damit das heizungseitige Bus-Modul alle Informationen sendet, insbesondere //Brenner- und Heizung/Pumpe Ein// (also die Betriebsstundensensoren), muss der Drehschalter des TR/TA-Reglers auf Info stehen!</note>
 +
 +//**Nachtrag 12.09.2023**//
 +- Skript bereinigt und aktualisiert, es versendet jetzt auch eine E-Mail im Falle eines Fehlercodes der Junkers-Heatronic. Dies setzt ein funktionierendes Mailsystem sowie gültige eingetragene Mail-Adressen im Skript voraus.
 +
 +
hardware/channels/heating_control/gastherme_junkers_can_bus.txt · Zuletzt geändert: 2024/01/09 19:45 von trabant