An / Aus Status Schalter

Hallo zusammen,
mal in die Runde eine Frage:

Wir sind ein kleiner Skiverein mit Skihütte und Lift (per WLAN erreichbar).
Aktuell habe ich der Skihütte einen kleinen Raspberry PI mit 1Wire Temp-Sensoren dran, dieser schickt mir regelmäßig die Temperatur an mein IPS (bzw. ich frage sie ab). Günstig und perfekt.

Nun würde ich gerne in IPS - oder später auch auf der Homepage darstellen, ob der Lift läuft.
Das ganze sollte nur ein paar Euronen kosten und per Funkt mit dem PI reden, dieser kann die Info ja dann per Internet an IPS weitergeben.

Habe bei Pollin was gefunden, das eigentlich gehen müsste, ist aber nicht mehr lieferbar (Funksender / Empfänger).
Reichweite müsste halt ca. 50 Meter sein.

Hat einer eine günstige Idee?
–> Abgreifen ob der Lift läuft (ggf. mit Fotowiderstand an der Betriebsled) - alternative?
–> und das ganze zum PI per Funk übertragen…

Danke + Gruß

ALs Denkanstoss: FS20 Lichtschranke an FS20AS1 mit potentialfreiem Ausgang an einen Rasperry GPIO.


gpio mode 7 in
status=`gpio read 7`

while true; do
if [ "$status" = "1" ]; then

(code)

fi

done

ja … wollte günstiger :wink:

Leg ein Kabel direkt an den GPIO :slight_smile: Günstiger geht es nicht :smiley:

paresy

Servus

Wenns Funk sein soll wirds aber net viel günstiger gehen.
Bleibt vielleicht noch: Am am Flohmarkt ein altes Spielzeug Modellauto besorgen und aus der Fernbedienung was basteln.

  • oder die Hardcore Variante: Ein altes Elektronik Bastelbuch rausholen ( wer kennt noch die selige 300er Reihe von Franzis Verlag ?) und Sender & Empfänger selbst löten.

gruß
bb

Du kannst die IR Lichtschranke auch gegen einen Microschalter austauschen, am Lift befestigen und jedesmal wenn ein Anker vorbeischrappt gibts einen Impuls.

Dann brauchst Du trotzdem einen potentialfreien Eingang (Taster) der automatisch einen potentialfreien Funk-Ausgang zum Pi hat.

Billiger ist wirklich nur Kabel, aber auch Erdkabel kostet 30€ / 50m :smiley:
Und, hast Du am Lift überhaupt Strom?

Vielen Dank erstmal für Eure Rückmeldungen.
Da ist mir doch direkt eine absolut günstige Lösung eingefallen:
Eine Webcam ist bereist vorhanden die teilweise der Liftbahn drauf hat.
Habe mir kurz ein PHP Script geschrieben, das die einen Ausschnitt der Webcam aufnahmen alle 5 minuten abgleicht.
Ab einem Schwellwert (Differenz) bedeutet dann: läuft!

habe das ganze realtiv dynamsich gemacht, so dass man eigentlich beliebige Bilder / Webcams im Netz auch damit prüfen kann.
Funktioniert klasse.
Falls Interesse am Script, könnte ich es posten!

Gute Idee, quer gedacht😎
Funktioniert es denn auch bei Regen, Schnee und Nebel?

Gruß

Burkhard

Das wird sich zeigen.
Allerdings habe ich das skript. Ich etwas angepasst. DH nur Ausschnitt auswerten und vorher Kontrast Hochsetzen und farbtiefe reduzieren, dann Müsste es gehen!

Hallo zusammen,

so, gestern Abend noch experimentiert.
Mit dem Helligkeit und Contrast anpassen etc, war das nicht zuverlässig.
Ich habe mit Netz aber was gefunden, was einen guten Weg zum Vergleich von Bildern beschreibt.
Darauf hin habe ich mir eine PHP Klasse geschrieben.
Die funktioniert bisher SEHR gut, da Helligkeit und Farbänderungen der Bilder keine Rolle spielen!

Vorab habe ich natürlich nur die Ausschnitte des Webcam Bilds gezoen, die überwacht werden müssen.
Hier mal ein paar Bilder mit Beispielen:
Beispiel der Berlin Webcam:
Original:
Original und 64 Pixel Vergleich:
diff2.jpg

vergrößertes Delta Bild
berlin_delta.jpg

Skilift:
imageDiff.jpg

Und Hier mal Delta mit viel Nebel:
Bahn_delta.jpg

<?php
  /* ImageDiff -------------------------------------------- 
     Class to identify difference between two images.
     Difference is identified in comparing the delta between average color.
     Based on idea from: 
        http://www.hackerfactor.com/blog/?/archives/432-Looks-Like-It.html 
     
     call function Diff to get an Array with the results
     Diff Description:
     Array Diff( string $im1, string $im2 [, boolean $save[,  integer $size]] ):
     $im1:   Path to first file
     $im2:   Path to second file
     $save:  Saves the compare images in the same folder than the soruce file1
             details are returned back in the array.
     $size:  defines the resize image size which is used to compare.
             default is 16 pixels, Higher = more Detail, but slower
                    
     Example:
      $clIM = new ImageDiff;
      $ret = clIM->Diff("./images/image1.jpg","./images/image2.jpg", true)
      print_r($ret);
  */
  
 
  class ImageDiff{
    public $dbg = false;
    
    public function Diff($im1, $im2, $save=false, $size=16 ){
      // $im1, $im2 = path to two images
      // $size default 8, resize size for delta processing
      // $save default. saves the resized images (), same target as src with prefix sized_
      $dbg = $this->dbg;
      
      // Vergleichsbilder erzeugen Nr. 1
      $i1 = imagecreatefromjpeg($im1);
      list($width1, $height1) = getimagesize($im1);
      $id1 = imagecreatetruecolor($size, $size);
      imagecopyresized($id1, $i1, 0, 0, 0, 0, $size,$size, $width1, $height1);
      imagefilter($id1,IMG_FILTER_GRAYSCALE);
      
       
      // Vergleichsbilder erzeugen Nr. 2
      $i2 = imagecreatefromjpeg($im2);
      list($width2, $height2) = getimagesize($im2); 
      $id2 = imagecreatetruecolor($size, $size);
      imagecopyresized($id2, $i2, 0, 0, 0, 0, $size,$size, $width2, $height2);
      imagefilter($id2,IMG_FILTER_GRAYSCALE);
            
      // Nun Pixel
      $i1_avg = $this->average($id1);
      $i2_avg = $this->average($id2);
      
      //Compute Hash
      $i1_hash = $this->ComputeHash($id1,$i1_avg);
      if($dbg) echo "Hash Bild 1 : ".implode($i1_hash)." <br>";
     
      $i2_hash = $this->ComputeHash($id2,$i2_avg);
      if($dbg) echo "Hash Bild 2 : ".implode($i2_hash)." <br>";
      
      // Count Distance:
      $fail = 0;
      for($x=0;$x < count($i2_hash);$x++){
        if($i2_hash[$x] != $i1_hash[$x]){
          $fail++;
        }
      }
      $delta = ($fail / ($size*$size))*100;
      if($save){
        // Create Delta image
        $id3 = imagecreatetruecolor($size, $size);
        imagecopy($id3, $id1,0,0,0,0,$size,$size);
        $col =imagecolorallocate( $id3 , 0 , 255 , 0);
        $x=$y=0;
        $cnt=0;
        for($y=0; $y < $size; $y++){
          for($x=0; $x < $size; $x++){
            if($i2_hash[$cnt] != $i1_hash[$cnt]){
              imagesetpixel($id3, $x, $y,$col);
            }
            $cnt++;
          }
        }
        $fndelta = pathinfo($im1, PATHINFO_DIRNAME)."/delta_".basename($im1);
        imagejpeg($id3,$fndelta); 
        imagedestroy($id3);        
        $ret["deltaimage"]= $fndelta;     
  
        // Save temporary images
        $fn1 = pathinfo($im1, PATHINFO_DIRNAME)."/sized_".basename($im1);
        $fn2 = pathinfo($im2, PATHINFO_DIRNAME)."/sized_".basename($im2);
        imagejpeg($id1,$fn1);
        imagejpeg($id2,$fn2);   
        imagedestroy($id1);
        imagedestroy($id2);                
        $ret["tempimg1"] = $fn1;
        $ret["tempimg2"] = $fn2;
      }
      $ret["delta"]= $delta;     
      return $ret;
     }
   
  private function ComputeHash($img, $avg = 100){
  global $dbg;
      $w = imagesx($img);
      $h = imagesy($img);
      $r = $g = $b = 0;
      for($y = 0; $y < $h; $y++) {
          for($x = 0; $x < $w; $x++) {
              $rgb = imagecolorat($img, $x, $y);
              $r = $rgb >> 16;
              if($r <= $avg){
                $hash [] ="1";
              } else {
                 $hash [] ="0";
              }
          }
      }
      return  $hash;
  }
 
    private function average($img) {
        $w = imagesx($img);
        $h = imagesy($img);
        $r = $g = $b = 0;
        for($y = 0; $y < $h; $y++) {
            for($x = 0; $x < $w; $x++) {
                $rgb = imagecolorat($img, $x, $y);
                $r += $rgb >> 16;
                //$g += $rgb >> 8 & 255;
                //$b += $rgb & 255;
            }
        }
        $pxls = $w * $h;
        //$r = (round($r / $pxls));
        //$g = (round($g / $pxls));
        $r = (round($r / $pxls)); // Da wir graustufen verwenden reicht eine Farbe
        //return  $r ."," . $g .",". $b;
        if($r < 10  )$r=0;      // Wenn fast Schwarz, dann schwarz!
        if($r > 245 )$r=255;    // auch mit Weiß so verfahren.
        return  $r;  
    }  

  }
?>

Auf diese einfache Art kann man dann jede beliebige Webcam mit URL monitoren.
Man muss nur noch per Timer alle paar Minuten ein Bild laden und speichern, dann dieser Klasse übergeben und man erhält das Delta.

Wäre das auch eine Möglichkeit, Helligkeitsveränderungen (Schattenspiele eines Baums) auszufiltern? Die sorgen ärgerlich oft für Fehlalarme…

Grüße
galleto

Hallo,
kann man sicher probieren und etwas optimieren.
Entweder Region mit SChatten auslassen, oder ggf. auch bestimmte farben in einer Region auslassen.
kann man sicher programmieren…:wink: