Stern inaktivStern inaktivStern inaktivStern inaktivStern inaktiv
 

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
Source code

Oder anstelle von "make all" kann auch folgendes verwendet werden.

gcc -Wall -lusb -o te923con te923con.c te923usb.c te923com.c
Source code

Testen ob die Datei vorhanden ist:

ls -l te923con
Source code

Datein kopieren damit der Befehl immer ausführbar ist:

sudo cp te923con /usr/bin/
Source code

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'"
Source code

Jetzt die Regeln neu laden:

sudo udevadm control --reload-rules
Source code

Jetzt die Wetterstation an den Raspberry anschließen.
Ein Script benötigen wir jetzt noch damit die te923 verwaltet werden kann.

sudo mkdir /usr/lib/cgi-bin
sudo vi /usr/lib/cgi-bin/get_data.cgi
Source code

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
Source code

Jetzt das ganze noch ausführbar machen!

sudo chmod a+x /usr/lib/cgi-bin/get_data.cgi
export QUERY_STRING=data
/usr/lib/cgi-bin/get_data.cgi
sudo bash -c "QUERY_STRING=data"
 
Source code

Beispiel für Ausführung (1. Zeile eingeben; Rest ist ein Beispiel Ergebnis). Sollte das nicht klappen eventuell hier schon Raspberry neu starten (reboot)

/usr/lib/cgi-bin/get_data.cgi
Content-type: text/plain
1356296694:23.00:45:9.50:89:10.50:84:i:i:i:i:i:i:1006.9:i:4:0:8:0.7:0.7:7.9:389
Source code

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
Source code

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 &amp;&amp; $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;
 }
}
 
?>
Source code

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):