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-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 Register Variable<?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
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.
<?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"; } ?>
<?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; } ?>