Temperaturdaten SENDEN (hier via pilight)

Begonnen von weini, 06 Mai 2016, 23:22:30

Vorheriges Thema - Nächstes Thema

weini

Warum sollte man das tun wollen?

  • um bei Emfangsproblemen die Signale von Außenfühlern zu wiederholen
  • um einen nicht vorhanden Außenfühler durch Internetdaten zu ersetzen
  • ...

Bei mir war es der zweite Punkt. Ich hatte mir von Pearl die Wetterstation NC-7158 besorgt, dazu 2 Außenfühler NC-7159. Diese habe ich dann aber IN der Wohnung verbaut. Für die Außendaten habe ich stattdessen auf Weather Underground gesetzt und bin damit sehr zufrieden. Nun wäre es natürlich super, wenn man die Außentemperatur trotzdem auch auf der Wetterstation darstellen könnte.

Mein FHEM Server ist ein RASPI, insofern hatte ich mir die einfachen 433 MHz Sender/Receiver beschafft und das ganze via pilight in FHEM eingebunden. Via pilight empfange ich auch die Daten der NC-7159 Außenfühler (pilight Protokoll alecto_WS1700). Leider unterstützt pilight nur den Empfang, Senden geht nur via RAW.

Dazu kann man aber wunderbar das pilight_raw Device nutzen:

define tem_FakeAussen pilight_raw
attr tem_FakeAussen IODev pili_Daemon

Damit lassen sich RAW Codes absetzen. Nun muss man sich den RAW Code aber erarbeiten. Dazu gibt es zum Glück bei pilight ebenfalls Hilfestellung. Man sollte aber das Forum konsultieren (https://forum.pilight.org/Thread-Fully-Supported-No-brand-temp-humidity-sensor-alecto-ws1700). Auf der Wiki-Seite (https://wiki.pilight.org/doku.php/alecto_ws1700_v7_0) ist das Protokoll leider falsch beschrieben.

Mit folgender Perl Funktion wird die Temperatur in pilight Raw-Code überführt:

sub
sendFakeTemp($)
{
  my ($setTemperature)= @_;

  my $bitsHeader = "0101";
  my $bitsFakeID = "10101010";
  my $bitsBattery = "0";
  my $bitsTXMode = "0";
  my $bitsChannel = "10";   # Channel beginnt bei 00 für Ch1
  my $bitsHumidity = "00000000";

  my $cmdPrefix = "/usr/local/bin/pilight-send -p raw --code=";
  my $bit0 = "540 1890 ";
  my $bit1 = "540 3780 ";
  my $bitFooter = "540 9180";

  # code Temperature into bit vector
  my $bitsTemperature;
  if ($setTemperature < 0) {
     $bitsTemperature = substr(unpack("B16", pack("n", int($setTemperature*10+4096+0.5))), 4);
  }
  else {
     $bitsTemperature = substr(unpack("B16", pack("n", int($setTemperature*10+0.5))), 4);
  };

  my $bitsAll = $bitsHeader . $bitsFakeID . $bitsBattery . $bitsTXMode . $bitsChannel . $bitsTemperature . $bitsHumidity;
  Log 5, "sendFakeTemp: setTemperature=". $setTemperature . " bitsAll=" . $bitsAll;

  my $rawValue = "";
  for (my $i=0; $i < length($bitsAll); $i++)  {
     if (substr($bitsAll, $i, 1) eq "0")  {
        $rawValue .= $bit0;
     }
     else {
        $rawValue .= $bit1;
     }
  }
  $rawValue .= $bitFooter;

  return $rawValue;
}

Kanal 3 ist im Code als Konstante festgelegt und muss zur Einstellung an der Wetterstation passen.
Eine Anpassung an andere Codes sollte auch für Perl Laien machbar sein.

Zuletzt braucht es noch ein Notify, das durch Updates des via HTTPMOD eingebundenen Weather Underground Service getriggert wird und dann die aktuelle Temperatur via pilight sendet:

define ntfFakeAussen notify wea_BY3849 { fhem("set tem_FakeAussen code " . sendFakeTemp(ReadingsVal("wea_BY3849","temperature","150"))) }
attr ntfFakeAussen group Temperatur


Lagern wir also alle unsere Außensensoren in die Cloud aus? Sicher nicht, aber in exotischen Situationen kann der Ansatz hilfreich sein.
Im Prinzip geht das auch ohne pilight mit dem G-Befehl des CUL (https://forum.fhem.de/index.php/topic,52534.0.html). In meinem Fall habe ich aber keine Infos zum alecto_WS1700 Protokoll für den CUL gefunden und auch meine Scan-Versuche waren nicht erfolgreich. Damit war pilight klar der einfachere Weg.