Pluggit-Datenloggen per TCP/IP Modbus

2 Tage
2 Tage

Anforderungen

Prinzipell werden neben einer Pluggit (z.B. AP310) mit angeschlossenem Netzwerkanschluss, folgende Dinge benoetigt:
  • Unix-/Linux-Umgebung und entsprechende Kenntnisse (bei mir eine gepimpte Seagate GoFlexHome 3TB ein Raspi waere auch moeglich)
  • Php, Bash und ein paar Unix-Tools
  • phpmodbus
  • RRDtool
  • Cron-Jobs
  • ggf. Web-Server und/oder Samba-Server zur Bereitstellung der Graphen/Logs
  • Parametrierungen und Skripten

    RRD Einrichtung

    [root@sgfh3tb-a pluggit]# cat mach_rrd_pluggit.sh
    
    # http://oss.oetiker.ch/rrdtool/tut/rrd-beginners.en.html
    
    # https://www.heise.de/make/artikel/Kurvenzeichner-2714517.html
    
    #
    # DS:variable_name:DST:heartbeat:min:max
    # RRA:CF:xff:step:rows
    
    
    # RRA:AVERAGE:0.5:5:60      1 PDP => 1 CDP ( 1 Minuten) :    60 CDP (      1h )
    # RRA:AVERAGE:0.5:1:1440    1 PDP => 1 CDP ( 1 Minuten) :  1440 CDP (  1  Tag )
    # RRA:AVERAGE:0.5:2:1440    2 PDP => 1 CDP ( 2 Minuten) :  1440 CDP (  2 Tage )
    # RRA:AVERAGE:0.5:7:1440    7 PDP => 1 CDP ( 7 Minuten) :  1440 CDP ( 1 Woche )
    # RRA:AVERAGE:0.5:30:1440  30 PDP => 1 CDP (30 Minuten) :  1440 CDP ( 30 Tage )
    rrdtool create pluggit.rrd \
    	--start 1487350621 \
    	--step 60 \
           	DS:T1:GAUGE:600:-40:80 \
           	DS:T2:GAUGE:600:-40:80 \
           	DS:T3:GAUGE:600:-40:80 \
           	DS:T4:GAUGE:600:-40:80 \
           	DS:RPM1:GAUGE:600:0:5000 \
           	DS:RPM2:GAUGE:600:0:5000 \
    	RRA:AVERAGE:0.5:5:60       \
    	RRA:AVERAGE:0.5:1:1440     \
    	RRA:AVERAGE:0.5:2:1440     \
    	RRA:AVERAGE:0.5:7:1440     \
    	RRA:AVERAGE:0.5:30:1440    \
    	RRA:MIN:0.5:5:60       \
    	RRA:MIN:0.5:1:1440     \
    	RRA:MIN:0.5:2:1440     \
    	RRA:MIN:0.5:7:1440     \
    	RRA:MIN:0.5:30:1440    \
    	RRA:MAX:0.5:5:60       \
    	RRA:MAX:0.5:1:1440     \
    	RRA:MAX:0.5:2:1440     \
    	RRA:MAX:0.5:7:1440     \
    	RRA:MAX:0.5:30:1440
    

    PHP Polling-Skript

    eine gepimpte Version des Polling-Skriptes, so dass je Zeile ein Eintrag abgelegt wird ...
    [root@sgfh3tb-a pluggit]# cat poller.php
    
    <?php
    
    //
    // REF orig: http://www.puschin.de/index.php?print=&aktion=thema_anzeigen&menue_id=77&thema_id=195&faq_id=585
    //
    
    require_once dirname(__FILE__) . '/phpmodbus-master/Phpmodbus/ModbusMaster.php';
    
    #echo "T1        " . joshua_modbus_read(132); // T1
    #echo "T2        " . joshua_modbus_read(134); // T2
    #echo "T3        " . joshua_modbus_read(136); // T3
    #echo "T4        " . joshua_modbus_read(138); // T4
    #echo "Preheater " . joshua_modbus_read_uint(160) . "\n"; // Preheater
    #echo "RPM1      " . joshua_modbus_read(100); // RPM 1
    #echo "RPM2      " . joshua_modbus_read(102); // RPM 2
    #echo "Bypass    " . joshua_modbus_read_uint(198) . "\n"; // Bypass
    
    echo time() . ":" . \
         joshua_modbus_read(132) . ":" . \
         joshua_modbus_read(134) . ":" . \
         joshua_modbus_read(136) . ":" . \
         joshua_modbus_read(138) . ":" . \
         joshua_modbus_read(100) . ":" . \
         joshua_modbus_read(102) . "\n";
    
    function joshua_modbus_read($register)
    {
        $modbus = new ModbusMaster("XXX.XX.XX.XXX", "TCP");
        $recData = $modbus->readMultipleRegisters(0, $register, 2);
        //print_r($recData);
        $values = array_chunk($recData, 4);
    
        foreach($values as $bytes)
         return PhpType::bytes2float($bytes);
    
        $modbus->disconnect;
    }
    
    function joshua_modbus_read_uint($register)
    {
        $modbus = new ModbusMaster("XXX.XX.XX.XXX", "TCP");
        $recData = $modbus->readMultipleRegisters(0, $register, 20);
    
        //print_r($recData);
        $values = array_chunk($recData, 4);
    
        foreach($values as $bytes)
            return PhpType::bytes2unsignedInt($bytes);
    
    //    $modbus->disconnect;
    }
    

    Update-Skript fuer Cron um die Daten aus der Pluggit zu holen

    Hier ist zu beachten, dass einmal die Daten direkt ins RRDtool fliessen und zum anderen in ein Logfile zur Konservierung.

    [root@sgfh3tb-a pluggit]# cat update_pluggit_rrd.sh
    #!/usr/bin/bash
    
    /usr/bin/php /STICK/pluggit/poller.php | sed -e 's/ /:/g' | while read ii
    do
    	rrdtool update /STICK/pluggit/pluggit.rrd ${ii}
    	echo "${ii}" >> /STICK/pluggit/plogger.log
    done
    

    RRDtool zum Zeichnen der Graphen

    [root@sgfh3tb-a pluggit]# cat graph_pluggit.sh
    #!/usr/bin/bash
    
    # /STICK/pluggit
    #
    RRD=/STICK/pluggit/pluggit.rrd
    LT=LINE2
    DT=`date +"%H:%M %d.%m.%Y"`
    
    for p in -8h -16h -1d -2d -7d -30d
    do
    	ODI=/srv/http/pluggit
    	TTT=`echo ${p} | sed -e 's/\-//g'`
    	ODF=${ODI}/pluggit${TTT}.png
    
    	rrdtool graph ${ODF} --start "${p}" --title "Pluggit Lueftung (${TTT}) - ${DT}" \
    	       	--vertical-label "Grad Celsius" \
    		--right-axis-label "rpm" \
    	       	--right-axis 100:0 \
    		--right-axis-format "%lg" \
    		-X 0 \
    	       	-a PNG -w 1024 -h 512 \
    		DEF:RPM1=${RRD}:RPM1:AVERAGE \
    		DEF:RPM2=${RRD}:RPM2:AVERAGE \
    		CDEF:sRPM1=RPM1,0.01,* \
    		CDEF:sRPM2=RPM2,0.01,* \
    		DEF:T1=${RRD}:T1:AVERAGE \
    		DEF:T2=${RRD}:T2:AVERAGE \
    		DEF:T3=${RRD}:T3:AVERAGE \
    		DEF:T4=${RRD}:T4:AVERAGE \
    		${LT}:T1#0000ff:"Zuluft (Aussentemperatur)" \
    		${LT}:T2#00ff00:"Zuluft (Raum)" \
    		${LT}:T3#ff0000:"Abluft (Raum)" \
    		${LT}:T4#aa1010:"Abluft (nach Draussen)" \
    		${LT}:sRPM1#aaaaaa:"Abluft (rpm)" \
    		${LT}:sRPM2#080808:"Zuluft (rpm)"
    
    
    	echo "RC=$? ${ODF}"
    done
    
    

    Cron Eintraege

  • einmal pro Minute die Daten von der Pluggit holen
  • alle halbe Stunde die Graphen aktualisieren
  • */1 * * * * /STICK/pluggit/update_pluggit_rrd.sh
    0,30 * * * * /STICK/pluggit/graph_pluggit.sh >/dev/null
    
    Die Graphen koennen auch manuell erzeugt werden, per /STICK/pluggit/graph_pluggit.sh.

    ggf. Web-Server und/oder Samba-Server zur Bereitstellung der Graphen/Logs

    Je nach Bedarf, um die Daten bereit zu stellen.


    Im Folgenden die Graphen nach Einbau (10.06.2017) des Sommer-Bypass.

    2 Tage
    2 Tage

    8 h
    8 h

    16 h
    16 h

    1 Tag
    1 Tag

    7 Tage
    7 Tage

    30 Tage
    30 Tage