Benutzer-Werkzeuge

Webseiten-Werkzeuge


hardware:channels:meters:water:wasserzaehler_ohne_s0

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
hardware:channels:meters:water:wasserzaehler_ohne_s0 [2016/01/08 20:33] – Start Job with cron mikemillerhardware:channels:meters:water:wasserzaehler_ohne_s0 [2021/01/25 21:48] (aktuell) – interne Links repariert jau
Zeile 1: Zeile 1:
 +====== Mechanischen Wasserzähler auslesen ======
  
 +===== Ansatz 1: Text-/Mustererkennung =====
  
-Idee: Das kleine Sternrad des Wasserzählers mit einem Laser anvisieren.\\+**Idee:** Die Ziffern und Rädchen des Wasserzählers über eine Text-/Mustererkennung auslesen und bereitstellen.\\ 
 +**Vorteil:** Auslesen des definierten Wertes des Wasserzählers mit geringen Kosten\\ 
 +**Nachteil:** Für die Erkennung benötigt der ESP32 ~3 Minuten Rechenzeit, sodass die Werte nicht kontinuierlich, sondern max. im 3-Minuten-Rhytmus bereitgestellt werden\\ 
 +{{https://raw.githubusercontent.com/jomjol/AI-on-the-edge-device/master/images/idea.jpg?600x184}} 
 +==== Hardware ==== 
 + 
 +Folgende Hardware (Gesamtkosten ~15€) wird benötigt: 
 +  * ESP32-CAM WiFi 
 +  * USB zu TTL UART Serial Converter zum Download des ESP32 
 +  * Stromversorgung des ESP32, z.B. über USB Breakout-Modul und USB-Netzteil 
 + 
 +==== Software ==== 
 + 
 +Die Idee und Software stammt von Jomjol - die Software und eine Anleitung sind hier hinterlegt: https://github.com/jomjol/AI-on-the-edge-device/wiki 
 +  * Für den ersten Download empfehle ich folgende Schaltung: https://www.fambach.net/esp32-cam-modul/ 
 +  * Bei Nichterkennung des Geräts: Gerätemanager -> Benötigte Treiber ggf. über optionale Windows Updates installieren 
 +  * Bei Verbindungsproblemen -> USB-TTL/UART-Schnittstelle anhängen und PC neu starten 
 + 
 +==== vzlogger-Integration ==== 
 + 
 +Hier der Code für die vzlogger.conf zum Abholen und Verknüpfen der Daten: 
 +<code> 
 +
 +  "enabled" : true, 
 +  "interval" : 180, 
 +  "channels" : [{ 
 +    "uuid": "UUID_FRONTEND", 
 +    "middleware" : "http://localhost/middleware.php", 
 +    "identifier" : "" 
 +    }], 
 +  "protocol" : "exec", 
 +  "command" : "curl -s http://IP-ADDRESS_ESP/setPreValue.html" 
 +
 +</code> 
 + 
 +Folgende Parameter müssen im Code ersetzt werden: 
 +  * UUID_FRONTEND: UUID des Kanals aus dem Frontend 
 +  * IP-ADDRESS_ESP: IP-Adresse des ESP32 zum Abrufen des aktuellen Werts 
 + 
 +Der Parameter 'interval' ist auf 180s / 3min gesetzt und kann auf die jeweilige Aktualisierungszeit des ESP32 angepasst werden. 
 + 
 + 
 +===== Ansatz 2: Laser ===== 
 + 
 +Idee: Das kleine Sternrad des Wasserzählers mit einem Laser anvisieren und die Reflexionen mit Photodiode und Arduino-Mikrocontroller auswerten. 
 + 
 +==== Hardware ====
  
 <note important>Ein roter Laser mit einer Strahlungsleistung von 5mW entspricht der Laserklasse 3R. Die zugängliche Laserstrahlung liegt im Wellenlängenbereich von 302,5 nm bis 10^6 nm und **ist gefährlich für das Auge**.\\ Sicherheitsmaßnahmen:\\ Niemals direkt in den Strahlengang blicken.\\ Im Laserbereich sind gut reflektierende Flächen zu vermeiden.\\ Vorgeschriebene Laserschutzbrillen unbedingt tragen.</note> <note important>Ein roter Laser mit einer Strahlungsleistung von 5mW entspricht der Laserklasse 3R. Die zugängliche Laserstrahlung liegt im Wellenlängenbereich von 302,5 nm bis 10^6 nm und **ist gefährlich für das Auge**.\\ Sicherheitsmaßnahmen:\\ Niemals direkt in den Strahlengang blicken.\\ Im Laserbereich sind gut reflektierende Flächen zu vermeiden.\\ Vorgeschriebene Laserschutzbrillen unbedingt tragen.</note>
Zeile 23: Zeile 71:
 {{:hardware:channels:meters:water:2015-12-31_15.22.17_b.jpg?200|}} {{:hardware:channels:meters:water:2015-12-31_15.22.17_b.jpg?200|}}
  
-Neben dem Wasserzähler greife ich auch den Gaszähler ab. Auf dem letzten Rädchen ist hier ein silber beschichtetets Stück, das hervoragend reflektiert. Hier musste ich nicht den Aufwand mit dem Laser machen, sondern nutze hier dieses Bauteil [[http://www.vishay.com/docs/83760/tcrt5000.pdf]] Die Reflexlichtschranke ist auf einen Einkaufswagenchip geklebt. Dieser ist mit Wiederlösbares Montageband (Aldi, bzw. 3M) auf den Gaszähler geklebt.+Neben dem Wasserzähler greife ich auch den Gaszähler ab. Auf dem letzten Rädchen ist hier ein silber beschichtetets Stück, das hervoragend reflektiert. Hier musste ich nicht den Aufwand mit dem Laser machen, sondern nutze hier dieses Bauteil [[http://www.vishay.com/docs/83760/tcrt5000.pdf]] Die Reflexlichtschranke ist auf einen Einkaufswagenchip geklebt. Dieser ist mit wiederlösbarem Montageband (Aldi, bzw. 3M) auf den Gaszähler geklebt.
  
 {{:hardware:channels:meters:water:gaszaehler.jpg?200|Externer Link}}  {{:hardware:channels:meters:water:gaszaehler.jpg?200|Externer Link}} 
Zeile 29: Zeile 77:
 Beide Zähler gehen an einen Analog in eines Arduino V3 (Ebay, deutlich unter 10 Euro) [[http://www.ebay.de/sch/i.html?_odkw=nano+arduino&_osacat=0&_from=R40&_trksid=p2045573.m570.l1313.TR10.TRC1.A0.H0.Xnano+arduino+v3.TRS0&_nkw=nano+arduino+v3&_sacat=0]] Beide Zähler gehen an einen Analog in eines Arduino V3 (Ebay, deutlich unter 10 Euro) [[http://www.ebay.de/sch/i.html?_odkw=nano+arduino&_osacat=0&_from=R40&_trksid=p2045573.m570.l1313.TR10.TRC1.A0.H0.Xnano+arduino+v3.TRS0&_nkw=nano+arduino+v3&_sacat=0]]
  
 +Es empfiehlt sich, das Analogsignal, bzw. die Variablen des Arduino-Codes, im Testaufbau und während der Justierung von Laser- und Photodiode am Zähler zu beobachten um gut auswertbare Veränderungen herzustellen. Dazu eignet sich z.B. der "Serial Plotter" der Arduino-Entwicklungsumgebung: Baud-Rate hoch stellen und in der Schleife die Variable (eine oder auch mehrere in einer Zeile) einfach ausgeben. 
 +
 +<note important>Fremdlicht beeinflusst das Signal der Photodiode enorm. Sobald die Justierung einigermaßen passt, den Aufbau am besten abdecken.</note>
 +
 +==== Über Script in die Datenbank ====
 +
 +Für Gas- und Wasserzähler, Eintrag per php direkt in die Datenbank.
 +
 +=== Arduino ===
  
-Das ist der Code auf dem Arduino. Die Idee ist die Differenz zwischen dem Tal und dem Berg bei dem analogen Sensort als Trigger zu verwenden+Das ist der Code auf dem Arduino. Die Idee ist die Differenz zwischen dem Tal und dem Berg bei dem analogen Sensor als Trigger zu verwenden
  
 <code c> <code c>
Zeile 100: Zeile 157:
  lastlog = time;  lastlog = time;
  long checksum = time + gas + gas_counter + wasser + wasser_counter;  long checksum = time + gas + gas_counter + wasser + wasser_counter;
- + 
- use Proc::PID::File; +
-  die "Already running!" if Proc::PID::File->running(); +
-  +
  Serial.print(time);  Serial.print(time);
  Serial.print(" - ");    Serial.print(" - ");  
Zeile 127: Zeile 181:
 } }
 </code> </code>
 +
 +=== Script zur Datenübernahme ===
  
 Der Code auf der PC/Raspberry-Seite: Der Code auf der PC/Raspberry-Seite:
 (Aufruf mit Cron regelmäßig, falls etwas abbricht. Job startet sich nur einmal, falls er noch läuft) (Aufruf mit Cron regelmäßig, falls etwas abbricht. Job startet sich nur einmal, falls er noch läuft)
 +
 <code perl> <code perl>
 #!/usr/bin/perl #!/usr/bin/perl
Zeile 217: Zeile 274:
 </code> </code>
  
 +<note>Dieser Code erwartet die Volkszähler-Datenbank auf demselben Raspberry Pi, an dem der Arduino angeschlossen ist.\\
 +Die Kanäle (channel_id) sind hart codiert: 12 und 9.</note>
 + 
 Was noch justiert werden muss, ist die Differenz, die zwischen Tal und Berg nötig ist: Was noch justiert werden muss, ist die Differenz, die zwischen Tal und Berg nötig ist:
  
Zeile 271: Zeile 331:
  
 ?> ?>
- 
  
 </code> </code>
- 
  
 So sieht so eine Grafik aus: So sieht so eine Grafik aus:
- 
  
 {{:hardware:channels:meters:water:gas.png?linkonly|}} {{:hardware:channels:meters:water:gas.png?linkonly|}}
 {{:hardware:channels:meters:water:gas.png?direct&100|}} {{:hardware:channels:meters:water:gas.png?direct&100|}}
  
 +<note tip>Oder den "Serial Plotter" der Entwicklungsumgebung verwenden.</note>
 +
 +==== Über vzlogger an die Middleware ====
 +
 +Für **nur einen** Wasserzähler, Erfassung der Impulse über USB-Schnittstelle und vzlogger. Datenbank kann ausgelagert sein.
 +
 +=== Arduino ===
 +
 +Hier der Code für den Arduino. Verkürzte Version von oben, weil nur eine Diode ausgewertet wird und die Impulse im Arduino nicht gezählt werden.
 +
 +<code c>
 +
 +// Original von mikemiller 2015-2016
 +// Reduziert auf nur 1 Wasserzähler mit Ausgabe 
 +// des Impulses auf die USB-Schnittstelle
 +
 +void setup()
 +{
 +  Serial.begin(300);
 +  // Open serial communications and wait for port to open:
 +  // A baud rate of 115200 is used instead of 9600 for a faster data rate
 +  // on non-native USB ports
 +  //Serial.begin(115200);
 +  while (!Serial) {
 +    ; // wait for serial port to connect. Needed for native USB port only
 +  }
 +  
 +  //digitalWrite(A0, HIGH);
 +  pinMode(A0, INPUT);
 +  digitalWrite(A1, HIGH);
 +}
 +int wasser_max = 0;
 +long wasser = 0;
 +int wasser_z = 0;
 +unsigned long lastlog = 0;
 +unsigned long last_wasser = 0;
 +unsigned long time;
 + 
 +void loop()
 +{
 +  // Gleitender Durchschnitt anwenden. 
 +  wasser = ((wasser *3) + analogRead(0))/4;
 +  time = millis();  // time since startup in milliseconds. Overflow after approx. 50 days.
 +        if (time < lastlog ){ //time ist übergelaufen
 +          lastlog = 0;
 +          last_wasser = 0;
 +        }
 +  wasser_max = max(wasser_max, wasser);
 +
 +  if ((wasser_max - 200) > wasser)
 +  {
 +    wasser_z++;
 +  } else {
 +    wasser_z = 0;
 +  }
 + 
 +  // Qn 2,5 m³/h = 2.500 Liter pro Stunde 
 +  // Das Raedchen hat 6 Fluegel und dreht sich 1x je 0,1 Liter --> 60 Impulse je Liter
 +  // Bei Maximaldurchfluss 2.500 l/h * 60 Imp/l = 2.500*60 Imp/h = 2.500/60 Imp/s = 41,7 Imp/s
 +  // --> Mindestens 24 ms zwischen zwei Impulsen ("Prellen" vermeiden)
 + 
 +  if (wasser_z > 40 && time - last_wasser > 30) {
 +    wasser_max= 0;
 +    lastlog = time;
 +    last_wasser = time;
 +    Serial.print(0x00);  // 1 Impuls ausgeben.
 +  }
 + 
 +}
 +</code>
 +
 +Die Differenz zwischen Hell und Dunkel muss für dieses Code-Beispiel mindestens 200 betragen, sonst wird kein Impuls erzeugt. 
 +
 +=== Frontend ===
 +
 +Kanal erstellen als Wassermengenzähler mit einer Auflösung von 60 (Impulse/l, siehe Berechnung im Code) und Stil=steps. UUID notieren.
 +
 +=== Beispielkonfiguration ===
 +Exemplarische /etc/vzlogger.conf, Element der Aufzählung "meters": []:
 +<code base vzlogger.conf>
 +    {
 +            // Water as S0 meter
 +
 +            "enabled": true,                // disabled meters will be ignored (default)
 +            "allowskip": true,                   // errors when opening meter may be ignored if enabled
 +            "protocol": "s0",               // meter protocol, see 'vzlogger -h' for full list
 +            "device": "/dev/ttyUSB0",       // meter device
 +
 +            "aggtime": -1,                   // aggregate meter readings and send middleware update after <aggtime> seconds
 +            "aggfixedinterval": true,       // round timestamps to nearest <aggtime> before sending to middleware
 +
 +            "channel": {
 +                "identifier": "Impulse",    // s0 meter knows "Impulse" and "Power"
 +                "uuid": "<uuid>",
 +                "aggmode": "SUM",           // aggregation mode: aggregate meter readings during <aggtime> interval
 +                                            //   "SUM": add readings (use for s0 impulses)
 +                                            //   "MAX": maximum value (use for meters sending absolute readings)
 +                                            //   "AVG": average value (use for meters sending current usage)
 +                "middleware": "http://localhost/middleware.php"
 +            }
 +    }   // meter 
 +</code>
 +
 +===== Ansatz 3: grüne LED und Fototransistor =====
 +
 +Im [[https://homematic-forum.de/forum/viewtopic.php?t=23744|Homematic-Forum]] wird ein Ansatz beschrieben, bei dem man den roten Ein-Liter-Zeiger des Wasserzählers zur Kontrastverstärkung mit einer grünen LED anleuchtet, die Helligkeitsunterschiede mit einem Fototransistor auffängt und mit einem modifizierten TCRT500 (das ist eine fertige, justierbare Baugruppe, eigentlich für Reflexlichtschranken) digital aufbereitet.
 +
 +Beim Nachbau hat es sich gezeigt, dass es u.a. auf die Helligkeit der verwendeten LED ankommt. Die zuerst beschafft LED war nicht hell genug, um den Fototransistor selbst bei direkter Belichtung durchzusteuern. Mit der nachbeschafften Nichia NSPG300D gelang der Betrieb dann auf Anhieb.
 +
 +Wie in der Original-Anleitung beschrieben, ist die Justage der Lichtschranke auf dem Wasserzähler sehr fummelig. Die Fixierung mit dem Muttern-und-Epoxidharz-Trick gelang nicht. Nach dem Nachweis der theoretischen Machbarkeit habe ich dann aufgegeben und mir den alternativ genannten [[https://www.stall.biz/project/intelligenter-impulsgeber-w-mit-s0-schnittstelle-zum-nachruesten-fuer-konventionelle-wasserzaehler|Impulsgeber mit S0-Schnittstelle]] bestellt, der auch einen 3d-gedruckten Montageträger zum Aufsetzen auf den Wasserzähler beinhaltet.
 +
 +Dieser Impulsgenerator ließ sich dann einfach aufbauen und funktioniert in der Tat viel besser als die einfache Schaltung. Ob das an der Verwendung eines Mikrocontrollers oder an dem mit Linse fokussierten Lichtstrahl der LED liegt, ist unklar. Die Montage auf dem Wasserzähler und die Justage war jedenfalls in wenigen Minuten erledigt. Zum Schutz von Fremdlicht habe ich ein HT-Rohr mit Deckel über den Wasserzähler gestülpt.
 +
 +Nach Lektüre des Artikels über [[:hardware:controllers:s0-an-usb|S0-Schnittstelle am USB]] ist mir aufgefallen, dass die dort aufgebaute Schaltung dem Ausgangsteil des STALL-Impulsgebers nicht unähnlich ist und habe mir den Aufbau dieser Schaltung gespart. Statt dessen habe ich
 +  - Einen USB-to-Serial-Adapter mit extra herausgeführtem Vcc-Pin aus der Schublade geholt
 +  - diesen gleich zur Spannungsversorgung des STALL-Impulsgebers verwendet
 +
 +{{:hardware:channels:meters:water:screenshot_20190602_162649.png?direct&400|}}
 +
 +Die Idee ist wie bei der Schaltung aus [[:hardware:controllers:s0-an-usb|S0-Schnittstelle am USB,]] dass die Serielle Schnittstelle +5V sieht, wenn der Optokoppler hochohmig ist und von diesem beim Durchschalten des Impulsgebers gegen Masse gezogen wird. Die vzlogger-Konfiguration aus [[:hardware:controllers:s0-an-usb|S0-Schnittstelle am USB]] hat dann auf Anhieb funktioniert. Bei meiner Installation habe ich noch ca 7 Meter KNX-Leitung zwischen dem USB-to-Serial-Adapter und dem Impulsgeber.
 +
 +<code>
 +"meters" : [{
 +        "protocol" : "s0",
 +        "enabled" : true,
 +        "device" : "/dev/USBserialWasser",
 +        "aggtime" : -1, 
 +        "aggfixedinterval" : false,
 +        "channels": [{
 +                "uuid" : "fa6c4b30-8303-11e9-a746-5fe24f8ae232",
 +                "middleware" : "http://middleware.example/",
 +                "identifier" : "Impulse",
 +                "aggmode" : "none",
 +                }]
 +        }
 +]}
 +</code>
 +
 +{{:hardware:channels:meters:water:screenshot_20190602_142248.png?direct&400|}}
 +
 +So besonders gut scheint die Middleware mit den groben Impulsen (1 Impuls pro Liter) und dem oft stundenlangen Ruhen des Messwertes nicht klarzukommen; besonders bei kurzfristigem Verbrauch (z.B. Toilettenspülung) bleibt oft ein hoher Momentanverbrauch in der Tabelle stehen und der Strich in der Grafik geht erst in einer größeren Zoomstufe oder nach etlicher Zeit bis auf Null zurück. In der langfristigen Betrachtung (z.B. die Tagesgrafik) scheint das aber OK zu sein.
 +
 +{{:hardware:channels:meters:water:screenshot_20190602_143056.png?direct&400|}}
 +
 +{{:hardware:channels:meters:water:screenshot_20190602_143112.png?direct&400|}}
 +
 +===== Ansatz 4: 3D Druck Optik und OPT101 =====
 +Ich hatte den Laser-Ansatz für Jahre in Gebrauch. Abgesehen von den Sicherheitsproblemen hatte ich nach ein paar Jahren Algen im Wasserzähler.
 +Daher die Idee auch mit grüner LED zu arbeiten. Da 3D-Drucker vorhanden habe ich eine Halterung für eine Linse entworfen, deren Fokuspunkt direkt auf dem Rad liegt.
 +https://www.thingiverse.com/thing:4151977
 +Impulse werden mit einem OPT101 Chip (intgrierter Verstärker) abgenommen.
 +{{:hardware:channels:meters:water:featured_preview_halterung_linse4.png?400|}}
hardware/channels/meters/water/wasserzaehler_ohne_s0.1452281617.txt.gz · Zuletzt geändert: 2016/01/08 20:33 von mikemiller