Benutzer-Werkzeuge

Webseiten-Werkzeuge


hardware:channels:sensors:1_wire

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
Nächste ÜberarbeitungBeide Seiten der Revision
hardware:channels:sensors:1_wire [2013/10/05 13:57] – [Raspberrypi] ollirhardware:channels:sensors:1_wire [2017/12/15 18:20] – adding ESPeasy princemichi
Zeile 4: Zeile 4:
  
  
-===== Raspberrypi =====+===== RaspberryPi =====
  
-Den Raspberrypi kann man auch gut zu einlesen der Sensoren verwenden+Den RaspberryPi kann man gut zum Einlesen der Sensoren verwenden.
  
 +[[hardware:controllers:raspberry_pi_erweiterung_klein|Raspberry Pi-Erweiterung_klein]]\\
 +[[hardware:controllers:raspberry_pi_erweiterung_mit_schaltausgaengen_rev.1|Raspberry Pi-Erweiterung_groß]]\\
 [[http://www.raspiprojekt.de/anleitungen/schaltungen/9-1wire-mit-temperatursensor-ds18b20.html]] [[http://www.raspiprojekt.de/anleitungen/schaltungen/9-1wire-mit-temperatursensor-ds18b20.html]]
  
-Bei mir musste zustzlich das Script /etc/modules modufiziert werden:+Ohne VZ-Erweiterung muss unter umständen zusätzlich das Script /etc/modules modufiziert werden:
  
 <code> <code>
 # 1wire # 1wire
-w1-gpio   pullup=1+w1-gpio   pullup=1  ( nicht bei den Raspberry Pi-Erweiterungen)
 w1-therm w1-therm
 </code> </code>
 +
 +Eine Übersicht über die Sensoren bekommt man mit "ls /sys/bus/w1/devices/".
  
 Mit dem Befehl "cat /sys/bus/w1/devices/*/w1_slave" kann man dann die Sensoren abfragen. Mit dem Befehl "cat /sys/bus/w1/devices/*/w1_slave" kann man dann die Sensoren abfragen.
  
-Um das ganze dann in die Volkszählerdatenbank zu bekommen brauche wir wieder perl:+ 
 +In der Datenbank des Volkszähler müssen die einzelnen Kanäle angelegt werden. Die Kanalnummer müssen dann in das script übernommen werden [[software/middleware/einrichtung]]. 
 + 
 +Um das ganze dann in die Volkszählerdatenbank zu bekommen brauchen wir wieder perl:
  
 <code> <code>
Zeile 26: Zeile 33:
 </code> </code>
  
-Das Abfragescript selber "get1wire.pl":+Das Abfragescript selber "get1wire.pl", das Script mit "chmod ugo+x get1wire.pl" ausführbar machen:
 <code> <code>
 +#!/usr/bin/perl
 +
 +# welche werte sollen geholt werden?
 +my %Daten = (      # Name => [ Adresse onewire, uuid-Volkszaehler , Faktor ]
 +                        "WWKessel"   => ["28-0000022c2dd7", "834c8be0-293c-11e3-8abd-911b2ff9df4c" , 0.001] , # in GradC
 +                        "WWVorlauf"  => ["28-0000022bef46", "860f8b30-2940-11e3-92d2-b39a45aed701" , 0.001] , # in GradC
 +                        "HzRueckl"   => ["28-0000022bfba8", "793354f0-2941-11e3-8965-b9f953ac51a9" , 0.001] , # in GradC
 +                        "HzVorl"     => ["28-0000022bfbf2", "9482c580-2941-11e3-a953-0f05013168f3" , 0.001] , # in GradC
 +                        "Abgas"      => ["28-0000022c0f2d", "be748340-2941-11e3-8286-edbdc7c926b3" , 0.001] , # in GradC
 +                        "HzKessel"   => ["28-0000022c1388", "d96476a0-2941-11e3-81f9-27853072856e" , 0.001] , # in GradC
 +                        "WWRueckl"   => ["28-0000022c2742", "3336aa50-2942-11e3-8a3c-61212ee448b1" , 0.001] , # in GradC
 +                        "HzRaum"     => ["28-0000023cc9e7", "4e3a22c0-2942-11e3-af9b-1b95cbbaf179" , 0.001] , # in GradC
 +);
 +
 +
 +# ****************** Werte lesen
 +while (($name) = each(%Daten)){
 +
 +  $addr = $Daten{$name}[0] ;
 +  $fak  = $Daten{$name}[2] ;
 +
 +  # Abfragen
 +  $sensor_temp = `cat /sys/bus/w1/devices/${addr}/w1_slave 2>&1`;
 +  #print $sensor_temp ;
 +
 +  # checken
 +  if ( !($sensor_temp =~ /\ YES/ ) ) {
 +    delete $Daten{$name};
 +    print "CRC == FALSE\n";
 +    next;                     #wieder zu while hochspringen
 +  }
 +  if ( ($sensor_temp =~ /85000/ ) ) { # t=85000 ist der defaultwert ohne Wandlung
 +    delete $Daten{$name};
 +    print "t=85000\n";
 +    next;                     #wieder zu while hochspringen
 +  }
 +
 +  # decodieren
 +  $sensor_temp =~ /t=(\-?\d+)/i;    # ALT: geht nicht bei Minusgraden$sensor_temp =~ /t=(\d+)/i;
 +
 +  $val = (($1*$fak)-0);
 +
 +  if ($val == 0) {
 +    delete $Daten{$name};
 +    print "t=0\n";
 +    next;                     #wieder zu while hochspringen
 +  }
 +
 +
 +  # Wert im Hash ablegen
 +  $Daten{$name}[3] = $val ;
 +
 +  # plotten
 +  print " --> $name = $val\n";
 +
 +}
 +# ****************** Wert in die Datenbank schreiben
 +if (1) {
 +
 +use LWP::UserAgent;
 +
 +while (($name) = each(%Daten)){
 +    $uuid =  $Daten{$name}[1] ;
 +    $val =  $Daten{$name}[3] ;
 +    print $uuid . " : " . $val . "\n";
 +
 +
 +    my $server_endpoint = "http://rasp1/middleware.php/data/${uuid}.json?value=" . $val;
 +    #print "serverget = " .  $server_endpoint . "\n";
 +
 +    # set custom HTTP request header fields
 +    my $req = HTTP::Request->new(POST => $server_endpoint);
 +    $req->header('content-type' => 'application/json');
 +    $req->header('x-auth-token' => 'kfksj48sdfj4jd9d');
 +
 +    # add POST data to HTTP request body
 +    $req->content(" ");
 +
 +    my $ua = LWP::UserAgent->new;
 +    my $resp = $ua->request($req);
 +    if ($resp->is_success) {
 +      my $message = $resp->decoded_content;
 +      print "Received reply: $message\n";
 +    } else {
 +      print "HTTP GET error code: ", $resp->code, "\n";
 +      print "HTTP GET error message: ", $resp->message, "\n";
 +    }
 +
 +  }
 +}
 +
 </code> </code>
  
  
 +Das Script sollte dann manuell ausgeführt werden. Wenn alles erfolgreich war, dann kann das Script auch vom Cron ausführen lassen:
 +
 +Mit crontab -e können dann im Intervall die Daten ausgelesen werden und in der Datenbank gespeichert werden. Achtung: Leerzeile am Ende nicht vergessen. Das Script wird mit der folgenden Einstellung alle 1min ausgeführt.
 +<code>
 +# m h  dom mon dow   command
 +*/1 *        /root/bin/get1wire >/dev/null 2>&1
 +</code>
 +
 +===== BananaPi =====
  
 +Ein HowTo für den BananaPi ist hier zu finden: [[howto:bananapi:1wire an GPIO4|1wire an GPIO4]]
  
 ===== log_onewire.sh ===== ===== log_onewire.sh =====
Zeile 150: Zeile 258:
   CONTROL_END   CONTROL_END
  
 +
 +===== ESPeasy =====
 +Es gibt auch noch weitere Möglichkeiten einen DS18B20 1-Wire Sensor auszulesen und die Messwerte an die Middleware zu übertragen, z.B.mit einem [[hardware:controllers:espeasy|NodeMCU]].
hardware/channels/sensors/1_wire.txt · Zuletzt geändert: 2020/01/19 15:42 von ruperts