Anmerkung: Anleitung jetzt aktualisiert Anfang 2019 da sich ein paar Fehler eingeschlichen hatten.
Hier eine Übersicht wie Ihr eine te923 wetterstation entsprechend auf dem Raspberry einrichtet, sodass Ihr die Daten abfragen könnt (Wetterstation wird per USB verbunden). Ich habe auch die maximale Anzahl an externen Sensoren angebunden (Temperatur/Luftfeuchtigkeit) für Räume im Haus.
Download und Build. ACHTUNG: Wetterstation noch nicht per USB mit Raspberry verbinden. Kommt erst später
sudo apt-get install gcc
sudo apt-get install libusb-dev
wget http://te923.fukz.org/downloads/te923tool-0.6.1.tgz
tar -xvzf te923tool-0.6.1.tgz
cd te923tool-0.6.1/
make all
sudo apt-get install gcc
sudo apt-get install libusb-dev
wget http://te923.fukz.org/downloads/te923tool-0.6.1.tgz
tar -xvzf te923tool-0.6.1.tgz
cd te923tool-0.6.1/
make all
Oder anstelle von "make all" kann auch folgendes verwendet werden.
Testen ob die Datei vorhanden ist:
Datein kopieren damit der Befehl immer ausführbar ist:
Jetzt müssen noch Regeln für das USB-Gerät angelegt werden:
sudo vi /etc/udev/rules.d/99-te923.rules
ATTRS{idVendor}=="1130", ATTRS{idProduct}=="6801", MODE="0660", GROUP="plugdev", RUN="/bin/sh -c 'echo -n $id:1.0 > /sys/bus/usb/drivers/usbhid/unbind'"
sudo vi /etc/udev/rules.d/99-te923.rules
ATTRS{idVendor}=="1130", ATTRS{idProduct}=="6801", MODE="0660", GROUP="plugdev", RUN="/bin/sh -c 'echo -n $id:1.0 > /sys/bus/usb/drivers/usbhid/unbind'"
Jetzt die Regeln neu laden:
Jetzt die Wetterstation an den Raspberry anschließen.
Ein Script benötigen wir jetzt noch damit die te923 verwaltet werden kann.
Folgender Inhalt wird in das Script rein kopiert:#!/bin/bash
TE923=/usr/bin/te923con
#header content type end empty line
echo "Content-type: text/plain"
echo
#end header
#parameter
PARAM="$QUERY_STRING" #oder $1
#run
if [ -x $TE923 ]; then
#binary must be placed into same dir
#this runs only if apache user www-data is member of group plugdev
#and udev rule is added
case "$PARAM" in
data) $TE923 -i 'i';;
status) $TE923 -s -i 'i';;
debug) $TE923 -D -i 'i';;
version) $TE923 -v;;
esac
fi
#!/bin/bash
TE923=/usr/bin/te923con
#header content type end empty line
echo "Content-type: text/plain"
echo
#end header
#parameter
PARAM="$QUERY_STRING" #oder $1
#run
if [ -x $TE923 ]; then
#binary must be placed into same dir
#this runs only if apache user www-data is member of group plugdev
#and udev rule is added
case "$PARAM" in
data) $TE923 -i 'i';;
status) $TE923 -s -i 'i';;
debug) $TE923 -D -i 'i';;
version) $TE923 -v;;
esac
fi
Jetzt das ganze noch ausführbar machen!
Beispiel für Ausführung (1. Zeile eingeben; Rest ist ein Beispiel Ergebnis). Sollte das nicht klappen eventuell hier schon Raspberry neu starten (reboot)
Jetzt noch reboot mit Benutzer pi testen:sudo reboot
# Nach Neuanmeldung mit Benutzer pi
te923con
# Beispielausgabe
1460192747:21.80:46:7.90:76:20.70:52:17.10:55:20.50:49:20.80:50:1004.2:i:3:0:i:i:i:i:2340
sudo reboot
# Nach Neuanmeldung mit Benutzer pi
te923con
# Beispielausgabe
1460192747:21.80:46:7.90:76:20.70:52:17.10:55:20.50:49:20.80:50:1004.2:i:3:0:i:i:i:i:2340
In IP-Symcon dann als Beispiel (ein neues Script und als Event täglich jede Minute)
Hier der Script Inhalt. Passwort für Benutzer pi anpassen im Script und Net/SSH2.php für Symcon installieren falls noch nicht vorhanden (siehe diverse Beiträge im Symcon Forum)
<? //SSH Login : Beginn include('Net/SSH2.php'); // IP vom Raspberry $ssh = new Net_SSH2('192.168.1.111'); //Anmeldeuser und Passwort für Raspberry nach UFT8 konvertieren //nur mit UTF8 Einstellung klappt auch ein putty login //ohne diese Konvertierung erscheint immer "Login Failed" auch hier per ssh->login $username = 'pi'; //$username = utf8_encode( 'pi' ); //$password = utf8_encode( 'symcon' ); $password = 'symcon'; if (!$ssh->login($username, $password)) // Hier der echte Login { exit('Login Failed'); } //SSH Login: Ende //Befehl der auf dem Raspberry ausgeführt wird um die TE923 Daten zu erhalten //Beispiel Ergebnis //1456855776:22.20:42:1.30:56:21.10:47:16.30:48:20.60:46:21.00:45:1015.3:i:5:0:i:i:i:i:2313 // IP vom Raspberry //$connection = ssh2_connect('192.168.1.111', 22); //ssh2_auth_password($connection, 'pi', 'symcon'); $resultdata = $ssh->exec("/usr/bin/te923con data"); //$resultdata = ssh2_exec($connection, '/usr/bin/te923con data'); print_r($resultdata); $resultstatus = $ssh->exec("/usr/bin/te923con -s"); //$resultstatus = ssh2_exec($connection, '/usr/bin/te923con -s'); print_r($resultstatus); $autocreate=true; $catname='TE923'; $rc_to_mm=0.7; //according http://www.mrbalky.com/tag/te923/ 0.708 $ms_to_kmh=3.6; //check ips env if (!function_exists('IPS_Logmessage')) { print "need IPS environment\n"; return; } /* #----Status (te923con -s -i '') 0x29 :0x17 :0x14 :0x10 :0x26 :1 :1 :1 :1 :1 :1 :1 :1 SYSSW:BARSW:EXTSW:RCCSW:WINSW:BATR:BATU:BATW:BAT5:BAT4:BAT5:BAT2:BAT1 SYSSW - software version of system controller BARSW - software version of barometer EXTSW - software version of UV and channel controller RCCSW - software version of rain controller WINSW - software version of wind controller BATR - battery of rain sensor (1-good (not present), 0-low) BATU - battery of UV sensor (1-good (not present), 0-low) BATW - battery of wind sensor (1-good (not present), 0-low) BAT5 - battery of sensor 5 (1-good (not present), 0-low) BAT4 - battery of sensor 4 (1-good (not present), 0-low) BAT3 - battery of sensor 3 (1-good (not present), 0-low) BAT2 - battery of sensor 2 (1-good (not present), 0-low) BAT1 - battery of sensor 1 (1-good (not present), 0-low) #------Data (te923con -i 'i') 1356207784:22.95:41:7.70:91:8.00:83:i :i :i :i :i :i :1001.9:i :3 :0 :9 :0.1:0.0:7.2:356 T0 :H0:T1 :H1:T2 :H2:T3:H3:T4:H4:T5:H5:PRESS :UV:FC:STORM:WD:WS :WG :WC :RC - T0 - temperature from internal sensor in °C - H0 - humidity from internal sensor in % rel - T1..5 - temperature from external sensor 1..4 in °C - H1..5 - humidity from external sensor 1...4 in % rel - PRESS - air pressure in mBar - UV - UV index from UV sensor - FC - station forecast, see below for more details - STORM - stormwarning; 0 - no warning, 1 - fix your dog - WD - wind direction in n x 22.5°; 0 -> north - WS - wind speed in m/s - WG - wind gust speed in m/s - WC - windchill temperature in °C - RC - rain counter (maybe since station starts measurement) as value weather forecast means (as precisely as possible) 0 - heavy snow 1 - little snow 2 - heavy rain 3 - little rain 4 - cloudy 5 - some clouds 6 - sunny */ //profile definitions //array($name,$icon) $forecast=array(0=>array('Heavy Snow','Snowflake'), 1=>array('Little Snow','Snowflake'), 2=>array('Heavy Rain','Rainfall'), 3=>array('Little Rain','Drops'), 4=>array('Cloudy','Cloud'), 5=>array('some Clouds','Cloud'), 6=>array('Sunny','Sun')); //status field variables $stfields=array(0=>array('name'=>'System SW','type'=>1,'profile'=>'','ident'=>'SYSSW'), 1=>array('name'=>'Baro SW','type'=>1,'profile'=>'','ident'=>'BARSW'), 2=>array('name'=>'ext Controler SW','type'=>1,'profile'=>'','ident'=>'EXTSW'), 3=>array('name'=>'Rain SW','type'=>1,'profile'=>'','ident'=>'RCCSW'), 4=>array('name'=>'Wind SW','type'=>1,'profile'=>'','ident'=>'WINSW'), 5=>array('name'=>'Rain Battery','type'=>0,'profile'=>'~Battery.Reversed','ident'=>'BATR'), 6=>array('name'=>'UV Battery','type'=>0,'profile'=>'~Battery.Reversed','ident'=>'BATU'), 7=>array('name'=>'Wind Battery','type'=>0,'profile'=>'~Battery.Reversed','ident'=>'BATW'), 8=>array('name'=>'Sensor 5 Battery','type'=>0,'profile'=>'~Battery.Reversed','ident'=>'BAT5'), 9=>array('name'=>'Sensor 4 Battery','type'=>0,'profile'=>'~Battery.Reversed','ident'=>'BAT4'), 10=>array('name'=>'Sensor 3 Battery','type'=>0,'profile'=>'~Battery.Reversed','ident'=>'BAT3'), 11=>array('name'=>'Sensor 2 Battery','type'=>0,'profile'=>'~Battery.Reversed','ident'=>'BAT2'), 12=>array('name'=>'Sensor 1 Battery','type'=>0,'profile'=>'~Battery.Reversed','ident'=>'BAT1')); //data field variables $datafields=array(0=>array('name'=>'Time','type'=>1,'profile'=>'~UnixTimestamp','ident'=>'TS'), 1=>array('name'=>'Indoor Temp','type'=>2,'profile'=>'~Temperature','ident'=>'T0'), 2=>array('name'=>'Indoor Hum','type'=>1,'profile'=>'~Humidity','ident'=>'H0'), 3=>array('name'=>'Sensor 1 Temp','type'=>2,'profile'=>'~Temperature','Battery'=>12,'ident'=>'T1'), 4=>array('name'=>'Sensor 1 Hum','type'=>1,'profile'=>'~Humidity','ident'=>'H1'), 5=>array('name'=>'Sensor 2 Temp','type'=>2,'profile'=>'~Temperature','Battery'=>11,'ident'=>'T2'), 6=>array('name'=>'Sensor 2 Hum','type'=>1,'profile'=>'~Humidity','ident'=>'H2'), 7=>array('name'=>'Sensor 3 Temp','type'=>2,'profile'=>'~Temperature','Battery'=>10,'ident'=>'T3'), 8=>array('name'=>'Sensor 3 Hum','type'=>1,'profile'=>'~Humidity','ident'=>'H3'), 9=>array('name'=>'Sensor 4 Temp','type'=>2,'profile'=>'~Temperature','Battery'=>9,'ident'=>'T4'), 10=>array('name'=>'Sensor 4 Hum','type'=>1,'profile'=>'~Humidity','ident'=>'H4'), 11=>array('name'=>'Sensor 5 Temp','type'=>2,'profile'=>'~Temperature','Battery'=>8,'ident'=>'T5'), 12=>array('name'=>'Sensor 5 Hum','type'=>1,'profile'=>'~Humidity','ident'=>'H5'), 13=>array('name'=>'AirPressure','type'=>1,'profile'=>'~AirPressure','ident'=>'PRESS'), 14=>array('name'=>'UV','type'=>1,'profile'=>'~UVindex','Battery'=>6,'ident'=>'UV'), 15=>array('name'=>'Forecast','type'=>1,'profile'=>'TE923_Forecast','ident'=>'FC'), 16=>array('name'=>'Storm','type'=>0,'profile'=>'TE923_Storm','ident'=>'STORM'), 17=>array('name'=>'Wind Direction','type'=>3,'profile'=>'~WindDirection','ident'=>'WD'), 18=>array('name'=>'Wind Speed','type'=>2,'profile'=>'~WindSpeed.kmh','Battery'=>7,'ident'=>'WS'), 19=>array('name'=>'Wind Gust','type'=>2,'profile'=>'~WindSpeed.kmh','ident'=>'WG'), 20=>array('name'=>'Wind Chill','type'=>2,'profile'=>'~Temperature','ident'=>'WC'), 21=>array('name'=>'Rain Counter','type'=>1,'profile'=>'','Battery'=>5,'ident'=>'RC'), 22=>array('name'=>'Rain Current','type'=>2,'profile'=>'~Rainfall','ident'=>'RNow'), 23=>array('name'=>'Rain This Day','type'=>2,'profile'=>'~Rainfall','ident'=>'RThisDay'), 24=>array('name'=>'Rain Last Day','type'=>2,'profile'=>'~Rainfall','ident'=>'RLASTDAY')); //create profile //Storm if (!IPS_VariableProfileExists('TE923_Storm')) { IPS_CreateVariableProfile('TE923_Storm',0); //boolean IPS_SetVariableProfileValues('TE923_Storm', 0, 1, 0); //status is inverted because a 0 value is every time marked red, regardless of color IPS_SetVariableProfileAssociation('TE923_Storm', 1, "Not this", "Ok", -1); IPS_SetVariableProfileAssociation('TE923_Storm', 0, "Save your dog", "Warning", 16711680); IPS_SetVariableProfileIcon('TE923_Storm', "Warning"); } //Forecast if (!IPS_VariableProfileExists('TE923_Forecast')) { IPS_CreateVariableProfile('TE923_Forecast',1); //integer IPS_SetVariableProfileValues('TE923_Forecast', 0, 6, 0); for ($i=0;$i<7;$i++){ IPS_SetVariableProfileAssociation('TE923_Forecast', $i, $forecast[$i][0], $forecast[$i][1],-1); } } //new day routine $lastvar=get_ips_var($datafields[0],$catname); $rsumid=get_ips_var($datafields[23],$catname); $rday=get_ips_var($datafields[24],$catname); if (is_new_day($lastvar['val'])) { //only if really new $updated=IPS_GetVariable($rday['id']['VariableUpdated']); if($updated<$lastvar['val']) { $sum=$rsumid['val']; //set last day sum IPS_LogMessage("TE923","store daily sum: $sum"); setvalue($rday['id'],$sum); //reset rain sum setvalue($rsumid['id'],0); } } //read data $d = $resultdata; if (!$d) { IPS_LogMessage("TE923","No data from $url retrieved"); return; } $d=rtrim($d); //print_r($d); //get status $s = $resultstatus; $s=rtrim($s); //print_r($s); $status=explode(":",$s); $data=explode(":",$d); //walk only through te923con fields for ($f=0;$f<22;$f++) { $val=$data[$f]; if (strlen($val) >0 && $val <>'i') { $defs=$datafields[$f]; $ids=get_ips_var($defs,$catname); $typ=$defs['type']; switch ($typ) { case 0: $val=($val>0); break; case 1: $val=(integer)$val;break; case 2: $val=(float)$val;break; } switch ($f) { case 13://ignore Airpressure <960 if ($val<960) { $val=GetValueInteger(50932 /*[TE923\AirPressure]*/); } break; case 15://FC //$val=$forecast[$val]; //now with profile assoziations break; case 16://Storm, needs to be inverted $val=!$val;break; case 17://WD integer x 22,5Deg $val=$val*22.5;break; case 18://WS and WG m/s to km/h case 19:$val=$val*$ms_to_kmh; break; case 21://raincounter //calculate Rain Diff $old=$ids['val']; $diff=$val-$old; $m=$diff*$rc_to_mm; if (($m<0) or ($m>100)) $m=0; $rdid=get_ips_var($datafields[22],$catname); setvalue($rdid['id'],$m); //calculate rain sum $rsumid=get_ips_var($datafields[23],$catname); $sum=$rsumid['val']; setvalue($rsumid['id'],$sum+$m); break; } setvalue($ids['id'],$val); if (isset($defs['Battery'])) { $b=$defs['Battery']; if (isset($status[$b])) { $bat=$status[$b]; $stat=($bat=='1'); $bdefs=$stfields[$b]; $bids=get_ips_var($bdefs,$catname); setvalue($bids['id'],$stat); } } } } /** * Check for new Day from Timestamp * @param $ts Unix Timestamp * @return boolean */ function is_new_day($ts) { $lastday=date_create(); date_timestamp_set($lastday,$ts); $newday=date_create(); date_time_set($newday,0,0,0); return ($newday>$lastday); } /** * IPS Variablen handler * creates variables as needed * returns assoc. Array with IPS Variable ID and Value * @param array Array with Variable Names, Ident,Types and Profiles * @param string Sensor Group Master Categorie Name */ function get_ips_var($types,$cat) { $varids=null; $ident=$types['ident']; $typ=$types['type']; $profile=$types['profile']; $name=$types['name']; //print "name:$name\n"; $master=@IPS_GetCategoryIDByName($cat,0); //no master cat, create new if (!$master) { $master=IPS_CreateCategory(); IPS_SetIdent($master,$cat); IPS_Setname($master,$cat); @IPS_SetParent($master,0); if ($master>0) { IPS_LogMessage('TE923', "Master category created, ID=$master\n"); }else{ IPS_LogMessage('TE923', "Can't create Master Category\n"); return null; } } $id=0; if ($master>0) { //get variable by Ident $id=@IPS_GetObjectIDByIdent($ident,$master); if (!$id) { //Sensor with address $addr not found in IPS if ($GLOBALS['autocreate']==false) { //autocreate disable, ignore new device return null; } $vid=IPS_CreateVariable($typ); if ($vid>0) { ips_setName($vid,$name); ips_setIdent($vid,$ident); ips_setParent($vid,$master); IPS_SetVariableCustomProfile($vid,$profile); //preload variables SetValue($vid,0); $var['id']=$vid; $var['val']=0; } }else{ // $vid=$id; $obj=IPS_GetObject($vid); $vtyp=$obj['ObjectType']; if ($vtyp==2) { //Variable $val=GetValue($vid); $var['id']=$vid; $var['val']=$val; } } //returns IDs and Values of this Sensor, Name is Key return $var; } } ?>
<?
//SSH Login : Beginn
include('Net/SSH2.php');
// IP vom Raspberry
$ssh = new Net_SSH2('192.168.1.111');
//Anmeldeuser und Passwort für Raspberry nach UFT8 konvertieren
//nur mit UTF8 Einstellung klappt auch ein putty login
//ohne diese Konvertierung erscheint immer "Login Failed" auch hier per ssh->login
$username = 'pi';
//$username = utf8_encode( 'pi' );
//$password = utf8_encode( 'symcon' );
$password = 'symcon';
if (!$ssh->login($username, $password)) // Hier der echte Login
{
exit('Login Failed');
}
//SSH Login: Ende
//Befehl der auf dem Raspberry ausgeführt wird um die TE923 Daten zu erhalten
//Beispiel Ergebnis
//1456855776:22.20:42:1.30:56:21.10:47:16.30:48:20.60:46:21.00:45:1015.3:i:5:0:i:i:i:i:2313
// IP vom Raspberry
//$connection = ssh2_connect('192.168.1.111', 22);
//ssh2_auth_password($connection, 'pi', 'symcon');
$resultdata = $ssh->exec("/usr/bin/te923con data");
//$resultdata = ssh2_exec($connection, '/usr/bin/te923con data');
print_r($resultdata);
$resultstatus = $ssh->exec("/usr/bin/te923con -s");
//$resultstatus = ssh2_exec($connection, '/usr/bin/te923con -s');
print_r($resultstatus);
$autocreate=true;
$catname='TE923';
$rc_to_mm=0.7; //according http://www.mrbalky.com/tag/te923/ 0.708
$ms_to_kmh=3.6;
//check ips env
if (!function_exists('IPS_Logmessage')) {
print "need IPS environment\n";
return;
}
/*
#----Status (te923con -s -i '')
0x29 :0x17 :0x14 :0x10 :0x26 :1 :1 :1 :1 :1 :1 :1 :1
SYSSW:BARSW:EXTSW:RCCSW:WINSW:BATR:BATU:BATW:BAT5:BAT4:BAT5:BAT2:BAT1
SYSSW - software version of system controller
BARSW - software version of barometer
EXTSW - software version of UV and channel controller
RCCSW - software version of rain controller
WINSW - software version of wind controller
BATR - battery of rain sensor (1-good (not present), 0-low)
BATU - battery of UV sensor (1-good (not present), 0-low)
BATW - battery of wind sensor (1-good (not present), 0-low)
BAT5 - battery of sensor 5 (1-good (not present), 0-low)
BAT4 - battery of sensor 4 (1-good (not present), 0-low)
BAT3 - battery of sensor 3 (1-good (not present), 0-low)
BAT2 - battery of sensor 2 (1-good (not present), 0-low)
BAT1 - battery of sensor 1 (1-good (not present), 0-low)
#------Data (te923con -i 'i')
1356207784:22.95:41:7.70:91:8.00:83:i :i :i :i :i :i :1001.9:i :3 :0 :9 :0.1:0.0:7.2:356
T0 :H0:T1 :H1:T2 :H2:T3:H3:T4:H4:T5:H5:PRESS :UV:FC:STORM:WD:WS :WG :WC :RC
- T0 - temperature from internal sensor in °C
- H0 - humidity from internal sensor in % rel
- T1..5 - temperature from external sensor 1..4 in °C
- H1..5 - humidity from external sensor 1...4 in % rel
- PRESS - air pressure in mBar
- UV - UV index from UV sensor
- FC - station forecast, see below for more details
- STORM - stormwarning; 0 - no warning, 1 - fix your dog
- WD - wind direction in n x 22.5°; 0 -> north
- WS - wind speed in m/s
- WG - wind gust speed in m/s
- WC - windchill temperature in °C
- RC - rain counter (maybe since station starts measurement) as value
weather forecast means (as precisely as possible)
0 - heavy snow
1 - little snow
2 - heavy rain
3 - little rain
4 - cloudy
5 - some clouds
6 - sunny
*/
//profile definitions
//array($name,$icon)
$forecast=array(0=>array('Heavy Snow','Snowflake'),
1=>array('Little Snow','Snowflake'),
2=>array('Heavy Rain','Rainfall'),
3=>array('Little Rain','Drops'),
4=>array('Cloudy','Cloud'),
5=>array('some Clouds','Cloud'),
6=>array('Sunny','Sun'));
//status field variables
$stfields=array(0=>array('name'=>'System SW','type'=>1,'profile'=>'','ident'=>'SYSSW'),
1=>array('name'=>'Baro SW','type'=>1,'profile'=>'','ident'=>'BARSW'),
2=>array('name'=>'ext Controler SW','type'=>1,'profile'=>'','ident'=>'EXTSW'),
3=>array('name'=>'Rain SW','type'=>1,'profile'=>'','ident'=>'RCCSW'),
4=>array('name'=>'Wind SW','type'=>1,'profile'=>'','ident'=>'WINSW'),
5=>array('name'=>'Rain Battery','type'=>0,'profile'=>'~Battery.Reversed','ident'=>'BATR'),
6=>array('name'=>'UV Battery','type'=>0,'profile'=>'~Battery.Reversed','ident'=>'BATU'),
7=>array('name'=>'Wind Battery','type'=>0,'profile'=>'~Battery.Reversed','ident'=>'BATW'),
8=>array('name'=>'Sensor 5 Battery','type'=>0,'profile'=>'~Battery.Reversed','ident'=>'BAT5'),
9=>array('name'=>'Sensor 4 Battery','type'=>0,'profile'=>'~Battery.Reversed','ident'=>'BAT4'),
10=>array('name'=>'Sensor 3 Battery','type'=>0,'profile'=>'~Battery.Reversed','ident'=>'BAT3'),
11=>array('name'=>'Sensor 2 Battery','type'=>0,'profile'=>'~Battery.Reversed','ident'=>'BAT2'),
12=>array('name'=>'Sensor 1 Battery','type'=>0,'profile'=>'~Battery.Reversed','ident'=>'BAT1'));
//data field variables
$datafields=array(0=>array('name'=>'Time','type'=>1,'profile'=>'~UnixTimestamp','ident'=>'TS'),
1=>array('name'=>'Indoor Temp','type'=>2,'profile'=>'~Temperature','ident'=>'T0'),
2=>array('name'=>'Indoor Hum','type'=>1,'profile'=>'~Humidity','ident'=>'H0'),
3=>array('name'=>'Sensor 1 Temp','type'=>2,'profile'=>'~Temperature','Battery'=>12,'ident'=>'T1'),
4=>array('name'=>'Sensor 1 Hum','type'=>1,'profile'=>'~Humidity','ident'=>'H1'),
5=>array('name'=>'Sensor 2 Temp','type'=>2,'profile'=>'~Temperature','Battery'=>11,'ident'=>'T2'),
6=>array('name'=>'Sensor 2 Hum','type'=>1,'profile'=>'~Humidity','ident'=>'H2'),
7=>array('name'=>'Sensor 3 Temp','type'=>2,'profile'=>'~Temperature','Battery'=>10,'ident'=>'T3'),
8=>array('name'=>'Sensor 3 Hum','type'=>1,'profile'=>'~Humidity','ident'=>'H3'),
9=>array('name'=>'Sensor 4 Temp','type'=>2,'profile'=>'~Temperature','Battery'=>9,'ident'=>'T4'),
10=>array('name'=>'Sensor 4 Hum','type'=>1,'profile'=>'~Humidity','ident'=>'H4'),
11=>array('name'=>'Sensor 5 Temp','type'=>2,'profile'=>'~Temperature','Battery'=>8,'ident'=>'T5'),
12=>array('name'=>'Sensor 5 Hum','type'=>1,'profile'=>'~Humidity','ident'=>'H5'),
13=>array('name'=>'AirPressure','type'=>1,'profile'=>'~AirPressure','ident'=>'PRESS'),
14=>array('name'=>'UV','type'=>1,'profile'=>'~UVindex','Battery'=>6,'ident'=>'UV'),
15=>array('name'=>'Forecast','type'=>1,'profile'=>'TE923_Forecast','ident'=>'FC'),
16=>array('name'=>'Storm','type'=>0,'profile'=>'TE923_Storm','ident'=>'STORM'),
17=>array('name'=>'Wind Direction','type'=>3,'profile'=>'~WindDirection','ident'=>'WD'),
18=>array('name'=>'Wind Speed','type'=>2,'profile'=>'~WindSpeed.kmh','Battery'=>7,'ident'=>'WS'),
19=>array('name'=>'Wind Gust','type'=>2,'profile'=>'~WindSpeed.kmh','ident'=>'WG'),
20=>array('name'=>'Wind Chill','type'=>2,'profile'=>'~Temperature','ident'=>'WC'),
21=>array('name'=>'Rain Counter','type'=>1,'profile'=>'','Battery'=>5,'ident'=>'RC'),
22=>array('name'=>'Rain Current','type'=>2,'profile'=>'~Rainfall','ident'=>'RNow'),
23=>array('name'=>'Rain This Day','type'=>2,'profile'=>'~Rainfall','ident'=>'RThisDay'),
24=>array('name'=>'Rain Last Day','type'=>2,'profile'=>'~Rainfall','ident'=>'RLASTDAY'));
//create profile
//Storm
if (!IPS_VariableProfileExists('TE923_Storm')) {
IPS_CreateVariableProfile('TE923_Storm',0); //boolean
IPS_SetVariableProfileValues('TE923_Storm', 0, 1, 0);
//status is inverted because a 0 value is every time marked red, regardless of color
IPS_SetVariableProfileAssociation('TE923_Storm', 1, "Not this", "Ok", -1);
IPS_SetVariableProfileAssociation('TE923_Storm', 0, "Save your dog", "Warning", 16711680);
IPS_SetVariableProfileIcon('TE923_Storm', "Warning");
}
//Forecast
if (!IPS_VariableProfileExists('TE923_Forecast')) {
IPS_CreateVariableProfile('TE923_Forecast',1); //integer
IPS_SetVariableProfileValues('TE923_Forecast', 0, 6, 0);
for ($i=0;$i<7;$i++){
IPS_SetVariableProfileAssociation('TE923_Forecast', $i, $forecast[$i][0], $forecast[$i][1],-1);
}
}
//new day routine
$lastvar=get_ips_var($datafields[0],$catname);
$rsumid=get_ips_var($datafields[23],$catname);
$rday=get_ips_var($datafields[24],$catname);
if (is_new_day($lastvar['val'])) {
//only if really new
$updated=IPS_GetVariable($rday['id']['VariableUpdated']);
if($updated<$lastvar['val']) {
$sum=$rsumid['val'];
//set last day sum
IPS_LogMessage("TE923","store daily sum: $sum");
setvalue($rday['id'],$sum);
//reset rain sum
setvalue($rsumid['id'],0);
}
}
//read data
$d = $resultdata;
if (!$d) {
IPS_LogMessage("TE923","No data from $url retrieved");
return;
}
$d=rtrim($d);
//print_r($d);
//get status
$s = $resultstatus;
$s=rtrim($s);
//print_r($s);
$status=explode(":",$s);
$data=explode(":",$d);
//walk only through te923con fields
for ($f=0;$f<22;$f++) {
$val=$data[$f];
if (strlen($val) >0 && $val <>'i') {
$defs=$datafields[$f];
$ids=get_ips_var($defs,$catname);
$typ=$defs['type'];
switch ($typ) {
case 0: $val=($val>0);
break;
case 1: $val=(integer)$val;break;
case 2: $val=(float)$val;break;
}
switch ($f) {
case 13://ignore Airpressure <960
if ($val<960) {
$val=GetValueInteger(50932 /*[TE923\AirPressure]*/);
}
break;
case 15://FC
//$val=$forecast[$val]; //now with profile assoziations
break;
case 16://Storm, needs to be inverted
$val=!$val;break;
case 17://WD integer x 22,5Deg
$val=$val*22.5;break;
case 18://WS and WG m/s to km/h
case 19:$val=$val*$ms_to_kmh; break;
case 21://raincounter
//calculate Rain Diff
$old=$ids['val'];
$diff=$val-$old;
$m=$diff*$rc_to_mm;
if (($m<0) or ($m>100)) $m=0;
$rdid=get_ips_var($datafields[22],$catname);
setvalue($rdid['id'],$m);
//calculate rain sum
$rsumid=get_ips_var($datafields[23],$catname);
$sum=$rsumid['val'];
setvalue($rsumid['id'],$sum+$m);
break;
}
setvalue($ids['id'],$val);
if (isset($defs['Battery'])) {
$b=$defs['Battery'];
if (isset($status[$b])) {
$bat=$status[$b];
$stat=($bat=='1');
$bdefs=$stfields[$b];
$bids=get_ips_var($bdefs,$catname);
setvalue($bids['id'],$stat);
}
}
}
}
/**
* Check for new Day from Timestamp
* @param $ts Unix Timestamp
* @return boolean
*/
function is_new_day($ts) {
$lastday=date_create();
date_timestamp_set($lastday,$ts);
$newday=date_create();
date_time_set($newday,0,0,0);
return ($newday>$lastday);
}
/**
* IPS Variablen handler
* creates variables as needed
* returns assoc. Array with IPS Variable ID and Value
* @param array Array with Variable Names, Ident,Types and Profiles
* @param string Sensor Group Master Categorie Name
*/
function get_ips_var($types,$cat) {
$varids=null;
$ident=$types['ident'];
$typ=$types['type'];
$profile=$types['profile'];
$name=$types['name'];
//print "name:$name\n";
$master=@IPS_GetCategoryIDByName($cat,0);
//no master cat, create new
if (!$master) {
$master=IPS_CreateCategory();
IPS_SetIdent($master,$cat);
IPS_Setname($master,$cat);
@IPS_SetParent($master,0);
if ($master>0) {
IPS_LogMessage('TE923', "Master category created, ID=$master\n");
}else{
IPS_LogMessage('TE923', "Can't create Master Category\n");
return null;
}
}
$id=0;
if ($master>0) {
//get variable by Ident
$id=@IPS_GetObjectIDByIdent($ident,$master);
if (!$id) {
//Sensor with address $addr not found in IPS
if ($GLOBALS['autocreate']==false) {
//autocreate disable, ignore new device
return null;
}
$vid=IPS_CreateVariable($typ);
if ($vid>0) {
ips_setName($vid,$name);
ips_setIdent($vid,$ident);
ips_setParent($vid,$master);
IPS_SetVariableCustomProfile($vid,$profile);
//preload variables
SetValue($vid,0);
$var['id']=$vid;
$var['val']=0;
}
}else{
//
$vid=$id;
$obj=IPS_GetObject($vid);
$vtyp=$obj['ObjectType'];
if ($vtyp==2) { //Variable
$val=GetValue($vid);
$var['id']=$vid;
$var['val']=$val;
}
}
//returns IDs and Values of this Sensor, Name is Key
return $var;
}
}
?>
Mit dem Script oben wird eine Kategorie TE923 angelegt und da werden dann die Daten geschrieben. Hier ein Beispiel (ich habe mir leider den Windsensor durch einen LKW zerstört, somit ist dieser bei mir nicht mehr in Betrieb):