IP-Symcon I2C-Library

Einsatz:

Nutzung von I2C-Anwendungen mit ELV oder Horter USB I2C-Interface in IP-Symcon

Download: i2c_ips.zip

Dokumentation: für Horter bzw. ELV-Interface

benötigtes I2C-Interface:
ELV I2C-Interface (Artikel 68-841-23) oder
Horter USB-Modem

Installation

Die Treiber für das Interface sind gemäß der Beschreibung zu installieren. Im Gerätemanager muss ein virtueller COM-Port für das Interface vorhanden sein. Die PHP-Scripte müssen in das IP-Symcon-“scripts“-Unterverzeichnis kopiert werden.

Konfiguration:

Zunächst muss für den COMPort des Interface eine Instance des IPS Comport-IODevices sowie eine Instanz "RegisterVariable" angelegt werden.

IPS-Instanzen IPS-Instancen

Es ist ein neues Script mit dem Inhalt von RegVarEvntCom.ips.php zu erstellen und im Modul "Registervariable" als Ziel zuzuweisen.

<?php
/** 
 * IPS I2C-Interface
 * als RegisterVariable-Ziel der angegeben Instance definieren
 * @package I2C
 * @subpackage IPSRegVarEvent
 * @copyright (C) Thomas Dreßler
 * @version V0.2 08.08.2010
 * @name Registervariable EventScript
 * @filesource 
 * 
 */
include_once('i2cvars_ips.php');
if ($IPS_SENDER == "RegisterVariable")
{
  // bereits im Puffer der Instanz vorhandene Daten in $data kopieren
  $data  = RegVar_GetBuffer($reg);
  // neu empfangene Daten an $data anhängen
  $data .= $IPS_VALUE;
  // Inhalt von $data im Puffer der RegisterVariable-Instanz speichern
  RegVar_SetBuffer($reg, $data);
  //debug_log(IPS_GetName($reg), "data: $IPS_VALUE\n");
}

?>
IPS RegisterVariable IPS Register Variable

Die IDs der neu erstellen Instancen sind in das Script i2cvars_ips.php einzutragen und das entsprechende include file für die verwendete Hardware zu aktivieren. Dort kann auch noch ein Debug-Flag gesetzt werden.

<?php
/** 
 * IPS I2C-Interface
 * Include für IPS-Variablen
 * @package I2C
 * @subpackage IPSVars
 * @copyright (C) Thomas Dreßler
 * @version V0.2 08.08.2010
 * @name IPSVars Include 
 * 
 */
 
/**
 * ComPort-InstanceID
 * 
 * @global integer $GLOBALS['com']
 */
$GLOBALS['com']=19362;
/**
* IPS Comport Instance Status = Activ
*/
define('IPS_INSTANCE_ACTIVE',102);
/**
 * RegisterVariable-InstanceID
 * 
 * @global integer $GLOBALS['reg']
 */
$GLOBALS['reg']=49406; 
/**
 * Debug flag
 * (geht ins Logfile)
 * 
 * @global boolean $GLOBALS['debug']
 */
$GLOBALS['debug']=true; 


/**
 *  I2C-Befehle gemappt auf Hardware 
 */
include_once('horterusbi2c_ips.php');
//include_once('elvusbi2c_ips.php');

/**
 * Schreibt Debug Messeges ins Logfile
 * 
 * @param $modul Modul-Name
 * @param $text Message
 * @uses boolean $GLOBAL['debug']
 * @return void keine Rückgabe
 */
function debug_log($modul,$text=NULL) {
    
    if ($GLOBALS['debug']) {
        IPS_Logmessage($modul,$text);
    }
}

Das I2C-Gerat ist entsprechend der jeweiligen Hardware-Beschreibung anzuschliessen. In meinem Beispiel ist es ein Temperatur-Modul mit einem LM75 Temperatursensor am ELV USB-Interface

LM75-Modul Modul

Programmierung

Die eigentliche I2C-Library bildet eine Abstraktionsschicht für die Funktionen i2c_open,i2c_close,i2c_read und i2c_write, die für jedes Interface seperat erstellt wurde und entsprechend in das Master-Includefile i2cvars.php eingebunden wird.
Die Library ist nur innerhalb von IP-Symcon nutzbar, da die hardwarenahen Zugriffe über IPS-Befehle realisiert werden.
Für jedes angeschlossene Gerät muss ein Script zur Steuerung der spezifischen Eigenschaften dieses Gerätes erstellt werden. Das mitgelieferte Beispielscript für den LM75 verdeutlicht das.

Beispiel: Temperatur abfragen:

Zunächst ist der COMPort und die Geräteadresse einzutragen. Dann werden die spezifischen Routinen eingebunden und die Abfrage gestartet.
<?php
/** 
 * IPS I2C-Interface
 * I2C Testscript für Horter Chipcard Modul
 * 
 * @package I2C
 * @subpackage LM75
 * @copyright (C) Thomas Dreßler
 * @version V0.1 11.08.2010
 * @name LM75 Testscript 
 * @filesource 
 */

/**
 * 
 * @uses $GLOBALS['debug']
 * @uses $GLOBALS['i2cready']
 */

/**
 * Instance-IDs und I2C-Functions
 */
include('lm75inc_ips.php');

/**
 * ELV-Interface virtual Comport 
 * @var string 
 */
$port="COM11"; //ELV-Interface virtual Comport

/**
 * 
 * @var byte $addresse Geräteadresse
 */
$addresse=144; //LM75 geräteadresse =90hex
if (i2c_open($port)) {
    $temp=lm75_temp($addresse); //Temperatur abfragen
    if (!is_null($temp)) { print "Temperatur: $temp \n";}
    i2c_close();
} else {
    print "Kann port nicht öffnen\n";
}
?>

Beispiel LM75 spezifisches Include

Das geräteabhängige Include stellt die Funktion zum Auslesen zur Verfügung und verdeutlicht den Einsatz der Library. Zunächst wird der COM-Port geöffnet, dann wird an die Geräteadresse das Register 0 adressiert, die Temperatur als Space-separierte HexWerte zurückgegeben und zum Schluss ausgewertet.
Schlägt der Aufruf fehl, kommt nichts zurück.
<?php
/** 
 * IPS I2C-Interface
 * Include für LM75 Temperatur-Sensor
 * 
 * @package I2C
 * @subpackage LM75
 * @copyright (C) Thomas Dreßler
 * @version V0.2 08.08.2010
 * @name LM75 Include
 * @example LM75_test.ips.php  
 */

//lade instance IDs und Helper
/**
 * Instance-IDs und I2C-Functions
 */
include_once('i2cvars_ips.php');

/**
 * Auslesen der Temperaturbytes aus LM75
 * @param   $addr  byte Adresse LM75
 * @global  boolean $GLOBALS['i2cready']
 * @return  float Temperatur oder NULL
 */
 
//LM75_BASE = 144;

function lm75_temp ($addr) {
    
    $i2cready=$GLOBALS['i2cready'];
    $res=NULL; //Default-Rückgabewert
    if ($i2cready) {
        i2c_write($addr,chr(0));//Temp register setzen
        $data=i2c_read($addr,2); //2bytes lesen
        //2 Bytes werden erwartet und verarbeitet
        if (is_array($data) && (count($data)==2)) {
            
           $a=$data[0];
            $b=$data[1] and 128;
            $t=$a and 127;

            if (($a & 128)>0) $t=$t-255;
            if (($b & 128)>0) $t=$t+0.5;
            debug_log('lm75_temp',"Temperatur an LM75 Addr $addr: $t Grad");
            $res=$t;
        }
    }else{
        debug_log('lm75_temp','Device not open');
    }
    return $res;
}
?>

Index
Disclaimer

© 2006-2010 Thomas Dreßler
Alle Rechte vorbehalten
letzte Änderung 04.09.2010