433MHz Temperatur auslesen

Einen 433-MHz-Funk-Außensensor mit pilight empfangen, die Werte per Shell- und PHP-Skript herausfiltern und alle zwei Minuten ablegen.

Archivbeitrag der alten Seite – Stand und Softwareversionen entsprechen dem Zeitpunkt der Erstveröffentlichung.

Was wir benötigen:

Bauteil Beschreibung
71Wz-aGbLzL.SL1500 Aukru 433 MHz Funk- Sende und Empfänger Modul Superregeneration Wireless Transmitter-Modul Einbrecher Alarm 433M receiver module Burglar Alarm für Arduino Raspberry pi (Amazon: LINK)
61u9VeUQJIL.SL1291 PEARL Funk-Außensensor für Wetterstation (Amazon: LINK)

Verkabelung des Senders/Empfängers:

Sendemodul (für das reine Auslesen nicht nötig):

Anschluss Pin am Raspberry Pi
DATA Pin 11
VCC Pin 1 (+3,3 V)
GND Pin 6

Empfangsmodul:

Anschluss Pin am Raspberry Pi
DATA Pin 12
VCC Pin 2 (+5 V)
GND Pin 6

Installation PILIGHT:

sudo nano /etc/apt/sources.list
deb http://apt.pilight.org/ stable main
sudo wget -O - http://apt.pilight.org/pilight.key | sudo apt-key add -
sudo apt-get -y update
sudo apt-get -y install pilight

Grundkonfiguration PILIGHT:

sudo nano /etc/pilight/config.json

hier werden folgende Einstellungen getroffen:

{
        "devices": {},
        "rules": {},
        "gui": {},
        "settings": {
                "log-level": 4,
                "pid-file": "/var/run/pilight.pid",
                "log-file": "/var/log/pilight.log",
                "send-repeats": 10,
                "receive-repeats": 1,
                "webserver-enable": 1,
                "webserver-root": "/usr/local/share/pilight/",
                "webserver-port": 5001,
                "webserver-cache": 1,
                "firmware-update": 0
        },
        "hardware": {
                "433gpio": {
<strong>                        <span style="color: #ff0000;">"sender": 1,
                        "receiver": 0</span></strong>
                }
        },
        "registry": {
                "pilight": {
                        "version": {
                                "current": "5.0"
                        }
                }
        }

Die Einstellungen „sender“ und „receiver“ müssen geändert werden und an eure Pinbelegung angepasst werden.

(0 entspricht Pin 11 und 1 entspricht PIN 12, laut WiringX Pinbelegung)

Abfrage:

Um die Abfrage des Temperatursensors zu ermöglichen, habe ich ein zweigeteiltes Script geschrieben, das Sensoren ausließt die das Protokoll „alecto_wsd17“ benutzen.

Abfragescript Teil1 (SHELL) Speicherort:“/root/auswerte“:

while [ true ] ; do
rm /tmp/r-log
pilight-receive > /tmp/r-log 2>&1 &
sleep 120
ps aux |grep -v grep|grep pilight-receive| awk '{print $2}' >/tmp/pid-light
#cat /tmp/r-log |grep temperature
wert=`cat /tmp/pid-light`
kill $wert
php /root/split.php
#echo $wert

done

Abfragescript Teil2 (PHP) Speicherort:“/root/split.php“:

<?php
$leer = shell_exec("wc -l /tmp/r-log |awk '{ print $1 }'") ;
if ($leer == 0){
exit;
}
$imp= shell_exec('cat /tmp/r-log');
$temparr = array();
$zeichen = preg_split('/repeats/', $imp, -1, PREG_SPLIT_OFFSET_CAPTURE);
$cs = 0;
$az=count($zeichen);
$az = $az - 1;
$neu = array();
while ($cs <= $az){

//echo $cs;
//echo $az;
$neu[] = $zeichen[$cs][0] ;
$cs= $cs + 1;
}
foreach ( $neu as $block ){

$daten = $block ;
$dateihandle = fopen("/tmp/worktmp","w");
fwrite($dateihandle, $daten);

//$r = shell_exec("echo $block > /tmp/worktmp");
$lines = file("/tmp/worktmp");
$searchstr = "temperature";
$searchstrr = "protocol";
unset($results);
foreach ($lines as $line)
{
  if(strpos($line, $searchstr) !== false)
  {
if(strpos($line,"PHP")!==true){
if (!empty($line)) {
    $results[] = $line;
  }
}
}
}

foreach ($lines as $line)
{
  if(strpos($line, $searchstrr) !== false)
  {
if(strpos($line,"PHP")!==true){
if (!empty($line)) {
    $results[] = $line;
  }
}
}
}

//echo '<pre>';
//print_r($results);
//echo '</pre>';
if (!empty($results[1])) {
  if(strpos($results[1],'"alecto_wsd17"')!==false){

if(strpos($results[0],"temperatur")!==false){
   $tempg = str_replace(' ','',$results[0]);
   $temp = substr("$tempg", 16);
   $temparr[] = $temp;
//  echo $temp;
//  echo $results[1];
  //echo "-----------";

}
 }
                    }
    }
    $tstop = 0;
        $lastt=count($temparr);
    $lastt=$lastt - 1 ;
//echo $temparr[$lastt];
     while ($tstop == 0) {
  //echo $lastt;
      if ($lastt == 0){
      exit;
      }
//$ext = substr(strrchr($temparr[$lastt], "."), 1);
$ext = round($temparr[$lastt]);
//echo $ext;
    if ($ext < "100" AND !empty($ext)){
//   echo $temparr[$lastt] ;
$datenx = $temparr[$lastt] ;
$dateihandlex = fopen("/tmp/aussentemp","w");
fwrite($dateihandlex, $datenx);
    $tstop = 1;
                        }
       else {
       $lastt = $lastt - 1;
//echo "prob";
       }

           }

?>

Start der Auswertung:

Das Auslesen wird mit diesem Befehl gestartet:

/root/auswerte > /dev/null 2>&1 &

Die Ergebnisse werden alle 2 Minuten in der Datei /tmp/aussentemp aktualisiert.