Hallo zusammen,
Ich hatte schon 2x das Problem, dass eines der WMRS200 Sensoren nicht mehr lief, da die Batterie alle war. Beim nachforschen fand ich heraus, dass die Sensoren den Batterie-Status liefern, aber er wird von den IPS-Modulen nicht ausgewertet. (Hoffentlich wird das mal geändert).
Des weiteren werden noch der Temperatur-, Luftfeuchtigkeit-Trend und die Wettervorhersage bereitgestellt.
So gehts:
Erstellt zuerst 2 Profile, 1 für Wettervorhersage, 1 für Trends:
<?
IPS_CreateVariableProfile("Wetter-Trend", 1);
IPS_SetVariableProfileAssociation("Wetter-Trend", 0, "Bleibend", "", -1);
IPS_SetVariableProfileAssociation("Wetter-Trend", 1, "Steigend", "", -1);
IPS_SetVariableProfileAssociation("Wetter-Trend", 2, "Fallend", "", -1);
IPS_CreateVariableProfile("Wettervorhersage", 1);
IPS_SetVariableProfileAssociation("Wettervorhersage", 0, "Teilweise bewölkt", "", -1);
IPS_SetVariableProfileAssociation("Wettervorhersage", 1, "Regen", "", -1);
IPS_SetVariableProfileAssociation("Wettervorhersage", 2, "Bewölkt", "", -1);
IPS_SetVariableProfileAssociation("Wettervorhersage", 3, "Sonnig", "", -1);
IPS_SetVariableProfileAssociation("Wettervorhersage", 4, "Schnee", "", -1);
?>
Danach erstellt die Variablen:
- 3 für Batterie-Status, je einen für die einzelnen batteriebetriebenen Sensoren, Typ der Variable ist Boolean, Profil ist „~Battery“
- 1 für Wettervorhersage, Typ ist Integer, Profil is „Wettervorhersage“
- 1 für Luftfeuchtigkeistrend, Typ ist Integer, Profil is „Wetter-Trend“
- 1 für Temperaturtrend, Typ ist Integer, Profil is „Wetter-Trend“
Danach erstellt das Script, welches die Arbeit macht.
(Passt beim Code die ID’s der Variablen an eure an)
<?
$regvar_id = $_IPS['INSTANCE'];
$raw = $_IPS['VALUE'];
$length = (int) ord(substr($raw, 2, 1));
$oldval = RegVar_GetBuffer($regvar_id);
$newval = substr($raw, 3, $length);
$newval = $oldval.$newval;
if(ord(substr($newval,-1,1)) == 255 && ord(substr($newval,-2,1)) == 255) {
RegVar_SetBuffer($regvar_id, "");
$splitted = str_split($newval);
$bytes = array_map("ord",$splitted);
if(count($bytes) >= 2) {
switch($bytes[1]) { //Type
case 0x41:
rain($bytes); break;
case 0x46:
barometer($bytes); break;
case 0x48:
wind($bytes); break;
case 0x42:
if(low_nibble($bytes[2]) == 1) {
temperature_outdoor($bytes);
}
else {
temperature_indoor($bytes);
}
break;
}
}
} else {
RegVar_SetBuffer($regvar_id, $newval);
}
/**
* Length 16
* Example: 00 41 ff 02 0c 00 00 00 25 00 00 0c 01 01 06 87
* Byte Data Comment
* 0 00 Battery level in high nibble
* 1 41 Identifier
* 2-3 ff 02 Rain rate: byte 3 * 256 + byte 2, in inches/hour
* 4-5 0c 00 Rain last hour: byte 5 * 256 + byte 4, in inches
* 6-7 00 00 Rain last 24 hours: byte 7 * 256 + byte 6, in inches
* 8-9 00 25 Total rain since reset date: byte 9 * 256 + byte 8, in inches
* 10 00 Minute of reset date
* 11 0c Hour of reset date
* 12 01 Day of reset date
* 13 01 Month of reset date
* 14 06 Year + 2000 of reset date
* 15 4e Checksum
*/
function rain($values) {
$batteryOk = (high_nibble($values[0]) == 0);
SetValueBoolean(36006 /*[Instanzen\Wetter\Batterie - Regensensor]*/, !$batteryOk);
}
/**
* Length 7
* Example: 00 46 ed 03 ed 33 56
* Byte Data Comment
* 0 00 Unused?
* 1 46 Identifier
* 2-3 ed 03 Absolute pressure, low nibble of byte 3 * 256 + byte 2
* 3 03 High nibble is forecast indicator for absolute pressure
* 4-5 ed 03 Relative pressure, low nibble of byte 5 * 256 + byte 4
* 5 03 High nibble is forecast indicator for relative pressure
* 6 56
*/
function barometer($values) {
$forecast = high_nibble($values[3]);
SetValueInteger(41891 /*[Instanzen\Wetter\Wettervorhersage]*/, $forecast);
}
/**
* Length 10
* Example: 00 48 0a 0c 16 e0 02 00 20 76
* Byte Data Comment
* 0 00 Battery level in high nibble
* 1 48 Identifier
* 2 0a Wind direction in low nibble, 10 * 360 / 16 = 225 degrees
* 3 0c Unknown
* 4-5 16 e0 Wind gust, (low nibble of byte 5 * 256 + byte 4) / 10
* 5-6 e0 02 Wind average, (high nibble of byte 5 + byte 6 * 16) / 10
* 7 00 ?
* 8 20 ?
* 9 76 Checksum
*/
function wind($values) {
$batteryOk = (high_nibble($values[0]) == 0);
SetValueBoolean(55742 /*[Instanzen\Wetter\Batterie - Windsensor]*/, !$batteryOk);
}
/**
* Length 11
* Example: 20 42 d1 91 00 48 64 00 00 20 90
* Byte Data Comment
* 0 20 Battery level in high nibble. Temp trend in high nibble.
* 1 42 Identifier
* 2 d1 Low nibble is device channel number, high nibble humidity trend and smiley code
* 3-4 91 00 Temperature: (256 * byte 4 + byte 3) / 10 = 14,5 degrees
* 5 48 Humidity: 72%
* 6-7 64 00 Dew point: (256 * byte 7 + byte 6) / 10 = 10 degrees
* 8 00 ?
* 9 20 ?
* 10 90
*/
function temperature_indoor($values){
}
/**
* @see temperature_indoor
*/
function temperature_outdoor($values) {
$batteryOk = (($values[0] & 0x40) == 0); //bit 6
$tTrend = $values[0] & 0x03;
$hTrend = ($values[2] >> 4) & 0x03;
SetValueBoolean(46659 /*[Instanzen\Wetter\Batterie - Temperatur- und Feuchtigkeitssensor (aussen)]*/, !$batteryOk);
SetValueInteger(23290 /*[Instanzen\Wetter\Trend - Temperatur]*/, $tTrend);
SetValueInteger(22022 /*[Instanzen\Wetter\Trend - Luftfeuchtigkeit]*/, $hTrend);
}
/**
* Helper functions
*/
function high_nibble($byte) {
return $byte >> 4;
}
function low_nibble($byte) {
return $byte & 0xf;
}
?>
Und zuletzt erstellt eine Register-Variable, um die Daten zu erhalten.
- Ziel ist euer Script von zuvor
- Übergeordnete Instanz ist „WMRS200“ (Ich nehm an, das heisst bei allen so)
Man kann scheinbar noch weitere Infos auslesen, aber ich benötigte diese nicht. Feel free diese weiteren Daten ebenfalls auszulesen.
Die Infos zum Protokoll hab ich von diesem Python script und von dieser guten Zusammenstellung.
Viel spass
pelota