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
Letzte ÜberarbeitungBeide Seiten der Revision
hardware:channels:sensors:1_wire [2013/10/05 13:57] – [Raspberrypi] ollirhardware:channels:sensors:1_wire [2018/01/25 15:58] – code jau
Zeile 3: Zeile 3:
 Derzeit haben wir mehrere Möglichkeiten 1-Wire Sensoren auszulesen. Derzeit haben wir mehrere Möglichkeiten 1-Wire Sensoren auszulesen.
  
 +===== RaspberryPi =====
  
-===== Raspberrypi ===== +Den RaspberryPi kann man gut zum Einlesen der Sensoren verwenden.
- +
-Den Raspberrypi kann man auch gut zu 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>
  
-Mit dem Befehl "cat /sys/bus/w1/devices/*/w1_slave" kann man dann die Sensoren abfragen.+Eine Übersicht über die Sensoren bekommt man mit ''ls /sys/bus/w1/devices/''.
  
-Um das ganze dann in die Volkszählerdatenbank zu bekommen brauche wir wieder perl:+Mit dem Befehl ''cat /sys/bus/w1/devices/*/w1_slave'' kann man dann die Sensoren abfragen. 
 + 
 + 
 +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 32:
 </code> </code>
  
-Das Abfragescript selber "get1wire.pl"+Das Script mit ''chmod ugo+x get1wire.pl'' ausführbar machen
-<code>+<code perl get1wire.pl> 
 +#!/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 78: Zeile 185:
  
 Dann ganz normal kompilieren. "Include unix timstamp" funktioniert **so nicht** für Volkszaehler, siehe unten. Dann ganz normal kompilieren. "Include unix timstamp" funktioniert **so nicht** für Volkszaehler, siehe unten.
- 
  
  
Zeile 115: Zeile 221:
   ON STARTUP DO THREAD_START(1wirelog) END   ON STARTUP DO THREAD_START(1wirelog) END
   CONTROL_END   CONTROL_END
-  </code>+</code>
  
 Für control6 ist bei aktiviertem "Onewire naming support" ebenfalls eine neuer Befehlt vorhanden. Für control6 ist bei aktiviertem "Onewire naming support" ebenfalls eine neuer Befehlt vorhanden.
Zeile 124: Zeile 230:
 Beispiel mit aktiviertem Timestamp und Namensupport : Beispiel mit aktiviertem Timestamp und Namensupport :
  
 +<code>
   C6_HEADER(`/* This will be in control6.h */')   C6_HEADER(`/* This will be in control6.h */')
   dnl   dnl
Zeile 149: Zeile 256:
     ON STARTUP DO THREAD_START(onewire) END;     ON STARTUP DO THREAD_START(onewire) END;
   CONTROL_END   CONTROL_END
 +</code>
  
 +===== 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