WMRS200: Erweiterte Daten (Batterie, Trend, Vorhersage)

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

Super danke dir für das Script !

Wann ist die Batterie ok ? Bei true oder false ?

Der sensor liefert 0 bei OK, 1 bei low.
Im Script mappe ich es auf Boolean, false=OK und true=Low Batt. (Wie das ~Battery Profil)

Sehr praktisch.

Und schon meint einer er wolle eine neue Batterie :wink:

Vielen Dank das Skript

Danke hatte ich übersehen läuft super ! Danke

Läuft prima. Danke.

Kann mich nur meinen „Vorrednern“ anschließen: Tolle Anleitung, läuft auch bei mir bestens - DANKE :slight_smile:

Gruß Werner

Von mir auch vielen Dank, super Arbeit. Allerdings muss ich bei mir das Profil Battery reverse nehmen, da sonst der Status nicht korrekt ist. Meine Batterie im Temperatursensor ist schon seit Tagen leer und mit dem Profil Battery zeigt er mir OK an.

Vielleicht wäre die Ergänzung auch was für paresys Todo.

Das könnte man doch in das originale Modul einbauen. :slight_smile:

Super. Vielen Dank.

Gerade eben mit meiner WMR180 getestet. Funktioniert einwandfrei (basiert ja auch auf einer WMR200).

Und die Batterie meines Regensensors ist seit längerer Zeit leer.
Hat nach etwa 1 Minute Wartezeit „Batterie schwach“ ausgespuckt…

TOP!!!

Hallo,

als blutiger Anfänger bei Symcon komme ich nicht ganz klar mit zwei Punkten in der Anleitung. Wie erstelle ich eine Register-Variable und welche Instanz muss ich im Skript eingeben? DIe ID des Gateways die des HID?

Das Skript wirft mir folgende Fehler aus:

Notice: Undefined index: Instance in C:\IPS\IP-Symcon\scripts\40712.ips.php on line 2

Notice: Undefined index: VALUE in C:\IPS\IP-Symcon\scripts\40712.ips.php on line 3

Warning: Instanz #0 existiert nicht in C:\IPS\IP-Symcon\scripts\40712.ips.php on line 7

Warning: Instanz #0 existiert nicht in C:\IPS\IP-Symcon\scripts\40712.ips.php on line 34

Vielen Dank für eure Hilfe!

Matthias

Hallo Matthias,

Eine RegisterVariable ist eine Instanz (siehe Doku).

Nachdem du diese erstellt hast, kannst du nicht viel einstellen, ausser der übergeordneten Instanz und dem Ziel.
Gib als Ziel das Skript an, als übergeordneten Instanz „WMRS200“.

Das Skript selbst wird Fehler werfen, wenn du es von Hand ausführst, das geht nur als Ausführungs-Ziel der RegVar.
Du musst die Zeilen mit SetValueBoolean und SetValueInteger anpassen, da sind die IDs meiner Status-Variablen drin. Diese werden bei dir wohl anders lauten…

Gruss
pelota

Werde es morgen testen.

Danke vorab!

Grüße
Matthias

Hat wunderbar geklappt. Vielen Dank!

Matthias

Guten Abend

ich Habe alles so gemacht wie es hier steht aber ,das Skript weißt bei mir Fehler auf ??
Habe die Register Var angelegt übergeordnete Instance ist die HID Wetterstation. Es wird dann
als Fehlerhaft angezeigt. Habe IP Symcon auf nen
Raspi im Keller am Laufen ver4,0.

Fehlermeldung:

21.11.2016 00:52:47*| Register Variable*| <br />
<b>Parse error</b>: syntax error, unexpected ‚$regvar_id*‘ (T_VARIABLE) in <b>/var/lib/symcon/scripts/21119.ips.php</b> on line <b>2</b><br />

Bitte mal um Rat

Danke

Oliver

Hallo, hat jemand von euch das Skript um weitere Daten erweitert wie z.B. Relative pressure oder Heat index or wind chill ?

Grüße
cerberus

Schon mal danke für das Script - das ist klasse.

Ich habe die Register Variable über die Splitter Instanz gezogen, aber so richtig viel passiert nicht - was mache ich hier noch falsch?

register-wmrs200.PNG

so sollte das aussehen

Mit übergeordnet is nicht gemeint, dass die RegVar im Objektbaum unter dem WMRS200 hängt, sondern in den Einstellungen so eingestellt wird.

Gruss
pelota

Super - Danke … das wars. Die übergeordnete Instanz hat bei mir im Modul gefehlt - bei mir heisst sie übrigens HID (Human Interface Device), was glaube ich der Standard ist.

Super Script!!! :smiley: