<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>http://pool.technik-fan.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin</id>
	<title>Technik-fan.de Wiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="http://pool.technik-fan.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin"/>
	<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php/Spezial:Beitr%C3%A4ge/Admin"/>
	<updated>2026-04-29T09:15:03Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.40.4</generator>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Turnigy_9x&amp;diff=273</id>
		<title>Turnigy 9x</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Turnigy_9x&amp;diff=273"/>
		<updated>2025-02-26T13:33:43Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In diesem Artikel wird beschrieben wie eine alternative Firmware auf den Modellbau Sender Turnigy 9x aufgespielt werden kann.&lt;br /&gt;
&lt;br /&gt;
* Kabel einlöten&lt;br /&gt;
* Programmer anstecken&lt;br /&gt;
* Treiber herunterladen: http://sourceforge.net/projects/libusb-win32/files/libusb-win32-releases/1.2.6.0/libusb-win32-bin-1.2.6.0.zip/download&lt;br /&gt;
* Win AVR herunterladen: http://sourceforge.net/projects/winavr/files&lt;br /&gt;
* Programmieren:&lt;br /&gt;
&lt;br /&gt;
 avrdude: stk500v2_command(): command failed&lt;br /&gt;
 avrdude: stk500v2_command(): unknown status 0xc9&lt;br /&gt;
 avrdude: stk500v2_program_enable(): cannot get connection status&lt;br /&gt;
 avrdude: initialization failed, rc=-1&lt;br /&gt;
         Double check connections and try again, or use -F to override&lt;br /&gt;
         this check.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Um den Fehler zu beseitigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Sender Ausschalten&lt;br /&gt;
* Alle Kabel zum Programmer und PC verbinden&lt;br /&gt;
* Alle Schalter auf &amp;quot;AUS&amp;quot;&lt;br /&gt;
* Flachband Kabel der Rückseite des Senders (mit den Batterien) einstecken&lt;br /&gt;
* Sender Einschalten&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;avrdude -c avrispmkII -p m64  -v -P usb&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 Reading | ################################################## | 100% 0.03s&lt;br /&gt;
 &lt;br /&gt;
 avrdude: Device signature = 0x1e9602&lt;br /&gt;
 avrdude: safemode: lfuse reads as E&lt;br /&gt;
 avrdude: safemode: hfuse reads as 89&lt;br /&gt;
 avrdude: safemode: efuse reads as FF&lt;br /&gt;
 &lt;br /&gt;
 avrdude: safemode: lfuse reads as E&lt;br /&gt;
 avrdude: safemode: hfuse reads as 89&lt;br /&gt;
 avrdude: safemode: efuse reads as FF&lt;br /&gt;
 avrdude: safemode: Fuses OK&lt;br /&gt;
 &lt;br /&gt;
 avrdude done.  Thank you.&lt;br /&gt;
&lt;br /&gt;
Backup anlegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;avrdude -c avrispmkII -p m64 -U flash:r:backupflash.bin:r -v -P usb&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 avrdude: AVR device initialized and ready to accept instructions&lt;br /&gt;
 Reading | ################################################## | 100% 0.03s&lt;br /&gt;
 avrdude: Device signature = 0x1e9602&lt;br /&gt;
 avrdude: safemode: lfuse reads as E&lt;br /&gt;
 avrdude: safemode: hfuse reads as 89&lt;br /&gt;
 avrdude: safemode: efuse reads as FF&lt;br /&gt;
 avrdude: reading flash memory:&lt;br /&gt;
 Reading | ################################################## | 100% 12.38s&lt;br /&gt;
 avrdude: writing output file &amp;quot;backupflash.bin&amp;quot;&lt;br /&gt;
 avrdude: safemode: lfuse reads as E&lt;br /&gt;
 avrdude: safemode: hfuse reads as 89&lt;br /&gt;
 avrdude: safemode: efuse reads as FF&lt;br /&gt;
 avrdude: safemode: Fuses OK&lt;br /&gt;
 avrdude done.  Thank you.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;avrdude -c avrispmkII -p m64 -U eeprom:r:backupeeprom.bin:r -v -P usb&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 avrdude: AVR device initialized and ready to accept instructions &lt;br /&gt;
 Reading | ################################################## | 100% 0.03s&lt;br /&gt;
 avrdude: Device signature = 0x1e9602&lt;br /&gt;
 avrdude: safemode: lfuse reads as E&lt;br /&gt;
 avrdude: safemode: hfuse reads as 89&lt;br /&gt;
 avrdude: safemode: efuse reads as FF&lt;br /&gt;
 avrdude: reading eeprom memory:&lt;br /&gt;
 Reading | ################################################## | 100% 0.43s&lt;br /&gt;
 avrdude: writing output file &amp;quot;backupeeprom.bin&amp;quot;&lt;br /&gt;
 avrdude: safemode: lfuse reads as E&lt;br /&gt;
 avrdude: safemode: hfuse reads as 89&lt;br /&gt;
 avrdude: safemode: efuse reads as FF&lt;br /&gt;
 avrdude: safemode: Fuses OK&lt;br /&gt;
 avrdude done.  Thank you.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Flashen:&lt;br /&gt;
&lt;br /&gt;
 Datei: th9x.bin in Ordner &amp;quot;C:\Program Files\WinAVR-20100110\bin&amp;quot; kopieren...&lt;br /&gt;
 &#039;&#039;&#039;C:\Program Files\WinAVR-20100110\bin&amp;gt;avrdude -c avrispmkII -p m64 -U flash:w:th9x.bin:a -v -P usb&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
avrdude: AVR device initialized and ready to accept instructions&lt;br /&gt;
&lt;br /&gt;
Reading | ################################################## | 100% 0.03s&lt;br /&gt;
&lt;br /&gt;
avrdude: Device signature = 0x1e9602&lt;br /&gt;
avrdude: safemode: lfuse reads as E&lt;br /&gt;
avrdude: safemode: hfuse reads as 89&lt;br /&gt;
avrdude: safemode: efuse reads as FF&lt;br /&gt;
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed&lt;br /&gt;
&lt;br /&gt;
         To disable this feature, specify the -D option.&lt;br /&gt;
avrdude: erasing chip&lt;br /&gt;
avrdude: reading input file &amp;quot;th9x.bin&amp;quot;&lt;br /&gt;
avrdude: input file th9x.bin auto detected as raw binary&lt;br /&gt;
avrdude: writing flash (44956 bytes):&lt;br /&gt;
&lt;br /&gt;
Writing | ################################################## | 100% 9.47s&lt;br /&gt;
&lt;br /&gt;
avrdude: 44956 bytes of flash written&lt;br /&gt;
avrdude: verifying flash memory against th9x.bin:&lt;br /&gt;
avrdude: load data flash data from input file th9x.bin:&lt;br /&gt;
avrdude: input file th9x.bin auto detected as raw binary&lt;br /&gt;
avrdude: input file th9x.bin contains 44956 bytes&lt;br /&gt;
avrdude: reading on-chip flash data:&lt;br /&gt;
&lt;br /&gt;
Reading | ################################################## | 100% 8.71s&lt;br /&gt;
&lt;br /&gt;
avrdude: verifying ...&lt;br /&gt;
avrdude: 44956 bytes of flash verified&lt;br /&gt;
&lt;br /&gt;
avrdude: safemode: lfuse reads as E&lt;br /&gt;
avrdude: safemode: hfuse reads as 89&lt;br /&gt;
avrdude: safemode: efuse reads as FF&lt;br /&gt;
avrdude: safemode: Fuses OK&lt;br /&gt;
&lt;br /&gt;
avrdude done.  Thank you.&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Turnigy_9x&amp;diff=272</id>
		<title>Turnigy 9x</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Turnigy_9x&amp;diff=272"/>
		<updated>2025-02-26T13:33:17Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In diesem Artikel wird beschrieben wie eine alternative Firmware auf den Modellbau Sender Turnigy 9x aufgespielt werden kann.&lt;br /&gt;
&lt;br /&gt;
* Kabel einlöten&lt;br /&gt;
* Programmer anstecken&lt;br /&gt;
* Treiber herunterladen: http://sourceforge.net/projects/libusb-win32/files/libusb-win32-releases/1.2.6.0/libusb-win32-bin-1.2.6.0.zip/download&lt;br /&gt;
* Win AVR herunterladen: http://sourceforge.net/projects/winavr/files&lt;br /&gt;
* Programmieren:&lt;br /&gt;
&lt;br /&gt;
 avrdude: stk500v2_command(): command failed&lt;br /&gt;
 avrdude: stk500v2_command(): unknown status 0xc9&lt;br /&gt;
 avrdude: stk500v2_program_enable(): cannot get connection status&lt;br /&gt;
 avrdude: initialization failed, rc=-1&lt;br /&gt;
         Double check connections and try again, or use -F to override&lt;br /&gt;
         this check.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Um den Fehler zu beseitigen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Sender Ausschalten&lt;br /&gt;
* Alle Kabel zum Programmer und PC verbinden&lt;br /&gt;
* Alle Schalter auf &amp;quot;AUS&amp;quot;&lt;br /&gt;
* Flachband Kabel der Rückseite des Senders (mit den Batterien) einstecken&lt;br /&gt;
* Sender Einschalten&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;avrdude -c avrispmkII -p m64  -v -P usb&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 Reading | ################################################## | 100% 0.03s&lt;br /&gt;
 &lt;br /&gt;
 avrdude: Device signature = 0x1e9602&lt;br /&gt;
 avrdude: safemode: lfuse reads as E&lt;br /&gt;
 avrdude: safemode: hfuse reads as 89&lt;br /&gt;
 avrdude: safemode: efuse reads as FF&lt;br /&gt;
 &lt;br /&gt;
 avrdude: safemode: lfuse reads as E&lt;br /&gt;
 avrdude: safemode: hfuse reads as 89&lt;br /&gt;
 avrdude: safemode: efuse reads as FF&lt;br /&gt;
 avrdude: safemode: Fuses OK&lt;br /&gt;
 &lt;br /&gt;
 avrdude done.  Thank you.&lt;br /&gt;
&lt;br /&gt;
Backup anlegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;avrdude -c avrispmkII -p m64 -U flash:r:backupflash.bin:r -v -P usb&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 avrdude: AVR device initialized and ready to accept instructions&lt;br /&gt;
 Reading | ################################################## | 100% 0.03s&lt;br /&gt;
 avrdude: Device signature = 0x1e9602&lt;br /&gt;
 avrdude: safemode: lfuse reads as E&lt;br /&gt;
 avrdude: safemode: hfuse reads as 89&lt;br /&gt;
 avrdude: safemode: efuse reads as FF&lt;br /&gt;
 avrdude: reading flash memory:&lt;br /&gt;
 Reading | ################################################## | 100% 12.38s&lt;br /&gt;
 avrdude: writing output file &amp;quot;backupflash.bin&amp;quot;&lt;br /&gt;
 avrdude: safemode: lfuse reads as E&lt;br /&gt;
 avrdude: safemode: hfuse reads as 89&lt;br /&gt;
 avrdude: safemode: efuse reads as FF&lt;br /&gt;
 avrdude: safemode: Fuses OK&lt;br /&gt;
 avrdude done.  Thank you.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;avrdude -c avrispmkII -p m64 -U eeprom:r:backupeeprom.bin:r -v -P usb&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 avrdude: AVR device initialized and ready to accept instructions &lt;br /&gt;
 Reading | ################################################## | 100% 0.03s&lt;br /&gt;
 avrdude: Device signature = 0x1e9602&lt;br /&gt;
 avrdude: safemode: lfuse reads as E&lt;br /&gt;
 avrdude: safemode: hfuse reads as 89&lt;br /&gt;
 avrdude: safemode: efuse reads as FF&lt;br /&gt;
 avrdude: reading eeprom memory:&lt;br /&gt;
 Reading | ################################################## | 100% 0.43s&lt;br /&gt;
 avrdude: writing output file &amp;quot;backupeeprom.bin&amp;quot;&lt;br /&gt;
 avrdude: safemode: lfuse reads as E&lt;br /&gt;
 avrdude: safemode: hfuse reads as 89&lt;br /&gt;
 avrdude: safemode: efuse reads as FF&lt;br /&gt;
 avrdude: safemode: Fuses OK&lt;br /&gt;
 avrdude done.  Thank you.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Flashen:&lt;br /&gt;
&lt;br /&gt;
 Datei: th9x.bin in Ordner &amp;quot;C:\Program Files\WinAVR-20100110\bin&amp;quot; kopieren...&lt;br /&gt;
 &#039;&#039;&#039;C:\Program Files\WinAVR-20100110\bin&amp;gt;avrdude -c avrispmkII -p m64 -U flash:w:th9x.bin:a -v -P usb&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=text&amp;gt;&lt;br /&gt;
avrdude: AVR device initialized and ready to accept instructions&lt;br /&gt;
&lt;br /&gt;
Reading | ################################################## | 100% 0.03s&lt;br /&gt;
&lt;br /&gt;
avrdude: Device signature = 0x1e9602&lt;br /&gt;
avrdude: safemode: lfuse reads as E&lt;br /&gt;
avrdude: safemode: hfuse reads as 89&lt;br /&gt;
avrdude: safemode: efuse reads as FF&lt;br /&gt;
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed&lt;br /&gt;
&lt;br /&gt;
         To disable this feature, specify the -D option.&lt;br /&gt;
avrdude: erasing chip&lt;br /&gt;
avrdude: reading input file &amp;quot;th9x.bin&amp;quot;&lt;br /&gt;
avrdude: input file th9x.bin auto detected as raw binary&lt;br /&gt;
avrdude: writing flash (44956 bytes):&lt;br /&gt;
&lt;br /&gt;
Writing | ################################################## | 100% 9.47s&lt;br /&gt;
&lt;br /&gt;
avrdude: 44956 bytes of flash written&lt;br /&gt;
avrdude: verifying flash memory against th9x.bin:&lt;br /&gt;
avrdude: load data flash data from input file th9x.bin:&lt;br /&gt;
avrdude: input file th9x.bin auto detected as raw binary&lt;br /&gt;
avrdude: input file th9x.bin contains 44956 bytes&lt;br /&gt;
avrdude: reading on-chip flash data:&lt;br /&gt;
&lt;br /&gt;
Reading | ################################################## | 100% 8.71s&lt;br /&gt;
&lt;br /&gt;
avrdude: verifying ...&lt;br /&gt;
avrdude: 44956 bytes of flash verified&lt;br /&gt;
&lt;br /&gt;
avrdude: safemode: lfuse reads as E&lt;br /&gt;
avrdude: safemode: hfuse reads as 89&lt;br /&gt;
avrdude: safemode: efuse reads as FF&lt;br /&gt;
avrdude: safemode: Fuses OK&lt;br /&gt;
&lt;br /&gt;
avrdude done.  Thank you.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor&amp;diff=271</id>
		<title>Open Energy Monitor</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor&amp;diff=271"/>
		<updated>2025-02-26T13:31:47Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Weblinks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Achtung: Es gibt inzwischen eine neue Version des Open Energy Monitors mit dem ESP32 und WLAN: [[Open Energy Monitor mit dem ESP32]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Einleitung=&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird beschrieben wie mit Hilfe eines Arduinos und des Ethernet Shields der Energieverbrauch auf einer Internet Seite abgebildet werden kann. Das Ziel ist das der Energie Verbrauch einer ganzen Wohnung oder eines Hauses übersichtlich auf einer Website dargestellt wird. Mehr Fotos sind in meinem Picasa Album zu finden: https://picasaweb.google.com/112556810584672853030/OpenEnergyMonitor?authuser=0&amp;amp;feat=directlink&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folgende Bauteile werden benötigt:&#039;&#039;&#039;&lt;br /&gt;
 -Arduino UNO Duemilanove oder kompatibel&lt;br /&gt;
 -Ethernet Shield oder ein anderes kompatibles Shield&lt;br /&gt;
 -Strom Sensor SCT-013-30 (30A) oder SCT-013-100 (100A) siehe: http://openenergymonitor.org/emon/node/156&lt;br /&gt;
 -2x 10kOhm Widerstände 1/4W&lt;br /&gt;
 -1 Elko 47 uF&lt;br /&gt;
 -Universalplatine&lt;br /&gt;
 -evtl. USB Netzteil oder anderes Netzteil für die Spannungsversorgung&lt;br /&gt;
 -Pfosten Stecker Rastermaß: 2.54mm&lt;br /&gt;
 -3,5 mm Audio Anschluss&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:emon2.png|Open Energie Monitor]]&lt;br /&gt;
&lt;br /&gt;
==Elektrotechnische Grundlagen==&lt;br /&gt;
Elektrische Leistung wird in Watt gemessen.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;P = U x I&#039;&#039;&#039;&lt;br /&gt;
 z.B. P = 230V x 0,5A = 115W&lt;br /&gt;
&lt;br /&gt;
In Abhnängikeit mit der Zeit ergeben sich Kilowatt Stunden. Braucht ein Verbraucher z.B. 1000 Watt und ist er eine Stunde in Betrieb, dann wird eine Kilowatt Stunde Energie benötigt.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;1 kWh = 1000W x 1 h&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es wird also Spannung und Strom benötigt um die elektrische Energie zu messen. Da in Deutschland die Spannung nur um +-2V pendelt war es für mich nicht notwendig die Spannung zu messen. Somit beschränkt sich diese Anleitung lediglich auf eine Strom Messung. Der Strom wird dann einfach mit 230 multipliziert. Somit erspart man sich viel Arbeit und Kabel gewirr.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Arten Strom und Spannung zu messen. In handelsüblichen Energie Messgeräten wird meistens eine Strom Messung über einen Shunt Widerstand und einen Operationsverstärker vorgenommen. Das ist relativ günstig und genau (siehe: http://en.wikipedia.org/wiki/Shunt_%28electrical%29). Um größere Ströme zu messen nimmt man häufig induktive Strom Sensoren. Diese werden einfach um das stromführende Kabel &amp;quot;geclipst&amp;quot; und erzeugen je nach Stromfluss eine bestimmte Spannung oder einen bestimmten Strom. Der Vorteil hierbei ist das sich durch die Induktion eine sichere Trennung vor der gefährlichen Netzspannung ergibt. &lt;br /&gt;
Zudem ist diese Methode auch gut für Mietwohnungen geeignet, weil die Elektroinstallation nicht geändert werden muss. In manchen kleinen Wohnungen wird nur eine Phase verwendet. Somit wird nur ein Sensor für die Strom Messung verwendet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Achtung: Auf den Leitungen liegt auch dann Netzspannung wenn die Sicherungen abgeschaltet sind!!!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:emon3.jpg|Open Energie Monitor]]&lt;br /&gt;
&lt;br /&gt;
=Converter Board=&lt;br /&gt;
Das Converter Board muss die Spannung oder den Strom (hängt vom Sensor ab, siehe: http://openenergymonitor.org/emon/node/156) in eine Spannung zwischen 0-5V DC umwandeln. Es wird ein Spannungsteiler aufgebaut, der 2,5V für den Sensor erzeugt. Mit dem entsprechendem Arduino Sketch können die Werte dann an dem Analog 0 Port ausgelesen werden. Den Aufbau der Schaltung findet man auf den Webseiten des Open Energie Monitors: http://openenergymonitor.org/emon/node/54&lt;br /&gt;
&lt;br /&gt;
[[Datei:emon4.jpg|Open Energie Monitor]]&lt;br /&gt;
[[Datei:emon5.jpg|Open Energie Monitor]]&lt;br /&gt;
&lt;br /&gt;
Die ganze Schaltung passt ohne Probleme in eine 7x7cm Abzweigdose.&lt;br /&gt;
&lt;br /&gt;
[[Datei:emon12.jpg|Open Energie Monitor]]&lt;br /&gt;
&lt;br /&gt;
=Arduino Sketch=&lt;br /&gt;
Es empfiehlt sich die Schaltung zuerst über USB zu testen, bevor man sich an die Kommunikation mit dem Ethernet Shield vertraut macht. Die Parameter müssen individuell mit einer &amp;quot;genormten Last&amp;quot; z.B. einem Wasserkocher etc. eingestellt werden. Ein Energie Messgerät sollte natürlich auch vorhanden sein. &lt;br /&gt;
&lt;br /&gt;
Hier ist mein Arduino Sketch mit den Parametern für den 30A Strom Sensor:&lt;br /&gt;
 [[Media:USBemon.zip|Download Arduino Sketch: USB emon]]&lt;br /&gt;
&lt;br /&gt;
==Kalibrierung==&lt;br /&gt;
Ich habe für die Kalibrierung eine umgebaute Steckdosenleiste hergenommen. Dabei muss die Phase aus dem Gehäuse geführt werden. Wenn man den Sensor um das komplette Kabel montiert kann nichts gemessen werden. Das liegt daran das die Ströme sich gegenseitig aufheben. Natürlich ergibt sich in dieser Anordnung ein kleiner Messfehler, weil das Energiekosten Messgerät auch Strom verbraucht. Dieser Fehler ist jedoch sehr gering.&lt;br /&gt;
&lt;br /&gt;
[[Datei:emon6.jpg|Open Energie Monitor]]&lt;br /&gt;
&lt;br /&gt;
Um die Daten zu visualisieren habe ich die Werte einfach in eine Open Office Calc Tabelle kopiert und ein Diagramm erstellt. Nach dem Import mussten lediglich noch die Punkte in Kommas umgewandelt werden. Also z.B.&lt;br /&gt;
 245.6&lt;br /&gt;
 245,6&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:emon7.png|Samsung Fernseher&lt;br /&gt;
Datei:emon8.png|Wasserkocher und Herdplatten&lt;br /&gt;
Datei:emon9.png|Energiesparlampe 18W&lt;br /&gt;
Datei:emon14.png|Stromverbrauch an einem Samstag Abend.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ethernet Shield und emon==&lt;br /&gt;
Wenn die Mess Ergebnisse korrekt sind, kann das Ethernet Shield eingebunden werden. Das Sketch besteht aus den Programmen emon und dem Beispiel &amp;quot;Weblient&amp;quot; aus der Ethernet Library. Damit die Daten korrekt und sicher auf den Webserver übermittelt werden können ist es notwendig die API Keys aus dem emoncms Webinterface auszulesen. Die Keys finden sich hier:&lt;br /&gt;
&lt;br /&gt;
 [[Datei:emon11.jpg|Open Energie Monitor]]&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle im Arduino Sketch wird der API Key eingetragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
client.print(&amp;quot;GET /emon/api/post?apikey=9888888888888888888&amp;amp;json={power:&amp;quot;);&lt;br /&gt;
client.print(watt);&lt;br /&gt;
client.print(&amp;quot;,temperature:25.0}&amp;quot;);&lt;br /&gt;
client.println();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die lokale IP Adresse und die IP Adresse des Servers muss natürlich auch noch an die eigene Umgebung angepasst werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };&lt;br /&gt;
byte ip[] = { 192,168,1,152 };&lt;br /&gt;
byte server[] = { 111,111,101,111}; // Enter your IP&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [[Media:EthernetAndPowerInet.zip|Download Arduino Sketch: emon and Ethernet]]&lt;br /&gt;
&lt;br /&gt;
Es können so auch mehrere Werte an emoncms übergeben werden. Z.B. Strom, Spannung und Temperatur.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
In den folgende Schritten soll die Kommunikation mit der MYSQL Datenbank geprpüft werden. Als erstes wird geprüft ob das Shield im lokalen Netz erreichbar ist:&lt;br /&gt;
&lt;br /&gt;
 ping 192.168.1.152&lt;br /&gt;
&lt;br /&gt;
Danach muss die Apache Log Datei auf dem Server geprüft werden. Dies kann bei einem Linux Server am besten mit folgendem Befehl geschehen:&lt;br /&gt;
&lt;br /&gt;
 tail -f /var/log/apache2/access.log&lt;br /&gt;
&lt;br /&gt;
Um das ganze bunter und übersichtlicher zu gestalten kann man das ganze noch mit ccze &amp;quot;einfärben&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 apt-get install ccze&lt;br /&gt;
 tail -f /var/log/apache2/access.log | &#039;&#039;&#039;ccze&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bei einer erfolgreichen Verbindung stehen folgende Einträge in der Log Datei:&lt;br /&gt;
&lt;br /&gt;
 [[Datei:emon10.png|Open Energie Monitor]]&lt;br /&gt;
&lt;br /&gt;
=Software auf dem Server=&lt;br /&gt;
&lt;br /&gt;
Download der *.zip Archive:&lt;br /&gt;
&lt;br /&gt;
 https://github.com/openenergymonitor/emoncms3&lt;br /&gt;
&lt;br /&gt;
Entpacken auf dem Server:&lt;br /&gt;
&lt;br /&gt;
 cd /var/www/emon&lt;br /&gt;
 wget https://github.com/openenergymonitor/emoncms3/tarball/master&lt;br /&gt;
 mv master openenergymonitor-emoncms3-3a1eb8b.tar&lt;br /&gt;
 unp openenergymonitor-emoncms3-3a1eb8b.tar&lt;br /&gt;
 mv openenergymonitor-emoncms3 emon&lt;br /&gt;
&lt;br /&gt;
Die Visualisierung der Daten übernimmt das PHP Script emoncms. Damit das Script auf dem Apache2 Webserver läuft muss die Option AllowOverride All gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
 vim /etc/apache2/sites-enabled/000-default&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Directory /var/www/nossl/wiki&amp;gt;&lt;br /&gt;
                Options Indexes FollowSymLinks MultiViews&lt;br /&gt;
                &#039;&#039;&#039;AllowOverride None&#039;&#039;&#039;&lt;br /&gt;
                Order allow,deny&lt;br /&gt;
                allow from all&lt;br /&gt;
        &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muss geändert werden zu&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Directory /var/www/nossl/wiki&amp;gt;&lt;br /&gt;
                Options Indexes FollowSymLinks MultiViews&lt;br /&gt;
                &#039;&#039;&#039;AllowOverride All&#039;&#039;&#039;&lt;br /&gt;
                Order allow,deny&lt;br /&gt;
                allow from all&lt;br /&gt;
        &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einem Neustart des Apache Webservers ist die Seite erreichbar:&lt;br /&gt;
 /etc/init.d/apache2 restart&lt;br /&gt;
&lt;br /&gt;
Danach muss eine Datenbank für emoncms in phpmyadmin angelegt werden. Es ist zu beachten das der Zugriff von jeder IP-Adresse möglich ist, damit der Arduino auch in die SQL Datenbank schreiben darf. Eine Anleitung zur Installation ist hier zu finden:&lt;br /&gt;
 http://openenergymonitor.org/emon/node/150&lt;br /&gt;
&lt;br /&gt;
==User Registrierung abschalten==&lt;br /&gt;
Um zu verhindern das sich fremde Leute in emoncms einloggen kann man den Button registrieren verstecken. Dazu muss folgende Datei verändert werden:&lt;br /&gt;
 vim /var/www/emon/Views/user/login_block.php&lt;br /&gt;
&lt;br /&gt;
Diese Zeile suchen:&lt;br /&gt;
 &amp;lt;input type=&amp;quot;submit&amp;quot; class=&amp;quot;button04&amp;quot; value=&amp;quot;Login&amp;quot; onclick=&amp;quot;javascript: form.action=&#039;&amp;lt;?php echo $GLOBALS[&#039;path&#039;]; ?&amp;gt;user/login&#039;;&amp;quot; /&amp;gt; or &lt;br /&gt;
 &amp;lt;input ype=&amp;quot;submit&amp;quot; class=&amp;quot;button04&amp;quot; value=&amp;quot;Register&amp;quot; onclick=&amp;quot;javascript: form.action=&#039;&amp;lt;?php echo $GLOBALS[&#039;path&#039;]; ?&amp;gt;user/create&#039;;&amp;quot; /&amp;gt;&lt;br /&gt;
und mit dieser Zeile ersetzen:&lt;br /&gt;
 &amp;lt;input type=&amp;quot;submit&amp;quot; class=&amp;quot;button04&amp;quot; value=&amp;quot;Login&amp;quot; onclick=&amp;quot;javascript: form.action=&#039;&amp;lt;?php echo $GLOBALS[&#039;path&#039;]; ?&amp;gt;user/login&#039;;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eigenes Dashboard erstellen==&lt;br /&gt;
&lt;br /&gt;
Das Dashboard kann sehr flexibel angepasst werden. Dabei werden die einzelnen Graphen einfach der Reihe nach in das Feld &amp;quot;Edit Dashboard&amp;quot; geschrieben. Wichtig ist das man immer den korrekten &#039;&#039;&#039;Api Key&#039;&#039;&#039; und die korrekte &#039;&#039;&#039;Feed ID&#039;&#039;&#039; einträgt.&lt;br /&gt;
&lt;br /&gt;
Also z.B:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;iframe style=&amp;quot;width:925px;height:300px;&amp;quot; marginheight=&amp;quot;0&amp;quot; src=&amp;quot;http://&#039;&#039;&#039;YOURDOMAIN&#039;&#039;&#039;/emon/Vis/rawdata.php?apikey=&#039;&#039;&#039;YOURAPIKEY&#039;&#039;&#039;&amp;amp;amp;&#039;&#039;&#039;feedid=4&#039;&#039;&#039;&amp;quot;  &lt;br /&gt;
 marginwidth=&amp;quot;0&amp;quot; frameborder=&amp;quot;0&amp;quot; scrolling=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel für eine schöne Übersicht auf Deutsch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=php&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;widget-container-nc&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;h2&amp;gt;Energie Explorer&amp;lt;/h2&amp;gt;&lt;br /&gt;
  &amp;lt;iframe style=&amp;quot;width:645px; height:470px;&amp;quot; marginheight=&amp;quot;0&amp;quot; marginwidth=&amp;quot;0&amp;quot; src=&amp;quot;http://YOURDOMAIN/emon/Vis/kWhdZoomer/kwhdzoomer.php?apikey=YOURAPIKEY&amp;amp;amp;kwhd=7&amp;amp;amp;power=4&amp;quot; frameborder=&amp;quot;0&amp;quot; scrolling=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;widget-container-v&amp;quot; style=&amp;quot;height:562px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;widget&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Aktueller Energie Verbrauch&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;b&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;dial&amp;quot; feed=&amp;quot;power&amp;quot; max=&amp;quot;5000&amp;quot; units=&amp;quot;W&amp;quot; scale=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;b&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div class=&amp;quot;stats&amp;quot; style=&amp;quot;height:70px&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Heutiger Energieverbrauch&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;value&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;kwhd&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; kWh&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div class=&amp;quot;widget&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;house-graph&amp;quot; class=&amp;quot;graph&amp;quot; feed=&amp;quot;power&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;      &lt;br /&gt;
&amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iframe style=&amp;quot;width:925px;height:300px;&amp;quot; marginheight=&amp;quot;0&amp;quot; src=&amp;quot;http://YOURDOMAIN/emon/Vis/rawdata.php?apikey=YOURAPIKEY&amp;amp;amp;feedid=4&amp;quot; marginwidth=&amp;quot;0&amp;quot; frameborder=&amp;quot;0&amp;quot; scrolling=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Sprache lässt sich einfach in den entsprechenden PHP Dateien ändern:&lt;br /&gt;
&lt;br /&gt;
 vim /emon/Vis/kWhdZoomer/view.js&lt;br /&gt;
 vim /emon/Vis/kWhdZoomer/kwhdzoomer.php&lt;br /&gt;
&lt;br /&gt;
Ergibt z.B. folgendes Dashboard:&lt;br /&gt;
&lt;br /&gt;
[[Datei:emon17.png|Open Energie Monitor]]&lt;br /&gt;
&lt;br /&gt;
Fertige Installation:&lt;br /&gt;
&lt;br /&gt;
[[Datei:emon15.jpg|300px|Open Energie Monitor]][[Datei:emon16.jpg|300px|Open Energie Monitor]]&lt;br /&gt;
&lt;br /&gt;
= Weblinks =&lt;br /&gt;
&lt;br /&gt;
* http://openenergymonitor.org Official Page&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor&amp;diff=270</id>
		<title>Open Energy Monitor</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor&amp;diff=270"/>
		<updated>2025-02-26T13:31:32Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Weblinks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Achtung: Es gibt inzwischen eine neue Version des Open Energy Monitors mit dem ESP32 und WLAN: [[Open Energy Monitor mit dem ESP32]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Einleitung=&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird beschrieben wie mit Hilfe eines Arduinos und des Ethernet Shields der Energieverbrauch auf einer Internet Seite abgebildet werden kann. Das Ziel ist das der Energie Verbrauch einer ganzen Wohnung oder eines Hauses übersichtlich auf einer Website dargestellt wird. Mehr Fotos sind in meinem Picasa Album zu finden: https://picasaweb.google.com/112556810584672853030/OpenEnergyMonitor?authuser=0&amp;amp;feat=directlink&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folgende Bauteile werden benötigt:&#039;&#039;&#039;&lt;br /&gt;
 -Arduino UNO Duemilanove oder kompatibel&lt;br /&gt;
 -Ethernet Shield oder ein anderes kompatibles Shield&lt;br /&gt;
 -Strom Sensor SCT-013-30 (30A) oder SCT-013-100 (100A) siehe: http://openenergymonitor.org/emon/node/156&lt;br /&gt;
 -2x 10kOhm Widerstände 1/4W&lt;br /&gt;
 -1 Elko 47 uF&lt;br /&gt;
 -Universalplatine&lt;br /&gt;
 -evtl. USB Netzteil oder anderes Netzteil für die Spannungsversorgung&lt;br /&gt;
 -Pfosten Stecker Rastermaß: 2.54mm&lt;br /&gt;
 -3,5 mm Audio Anschluss&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:emon2.png|Open Energie Monitor]]&lt;br /&gt;
&lt;br /&gt;
==Elektrotechnische Grundlagen==&lt;br /&gt;
Elektrische Leistung wird in Watt gemessen.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;P = U x I&#039;&#039;&#039;&lt;br /&gt;
 z.B. P = 230V x 0,5A = 115W&lt;br /&gt;
&lt;br /&gt;
In Abhnängikeit mit der Zeit ergeben sich Kilowatt Stunden. Braucht ein Verbraucher z.B. 1000 Watt und ist er eine Stunde in Betrieb, dann wird eine Kilowatt Stunde Energie benötigt.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;1 kWh = 1000W x 1 h&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es wird also Spannung und Strom benötigt um die elektrische Energie zu messen. Da in Deutschland die Spannung nur um +-2V pendelt war es für mich nicht notwendig die Spannung zu messen. Somit beschränkt sich diese Anleitung lediglich auf eine Strom Messung. Der Strom wird dann einfach mit 230 multipliziert. Somit erspart man sich viel Arbeit und Kabel gewirr.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Arten Strom und Spannung zu messen. In handelsüblichen Energie Messgeräten wird meistens eine Strom Messung über einen Shunt Widerstand und einen Operationsverstärker vorgenommen. Das ist relativ günstig und genau (siehe: http://en.wikipedia.org/wiki/Shunt_%28electrical%29). Um größere Ströme zu messen nimmt man häufig induktive Strom Sensoren. Diese werden einfach um das stromführende Kabel &amp;quot;geclipst&amp;quot; und erzeugen je nach Stromfluss eine bestimmte Spannung oder einen bestimmten Strom. Der Vorteil hierbei ist das sich durch die Induktion eine sichere Trennung vor der gefährlichen Netzspannung ergibt. &lt;br /&gt;
Zudem ist diese Methode auch gut für Mietwohnungen geeignet, weil die Elektroinstallation nicht geändert werden muss. In manchen kleinen Wohnungen wird nur eine Phase verwendet. Somit wird nur ein Sensor für die Strom Messung verwendet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Achtung: Auf den Leitungen liegt auch dann Netzspannung wenn die Sicherungen abgeschaltet sind!!!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:emon3.jpg|Open Energie Monitor]]&lt;br /&gt;
&lt;br /&gt;
=Converter Board=&lt;br /&gt;
Das Converter Board muss die Spannung oder den Strom (hängt vom Sensor ab, siehe: http://openenergymonitor.org/emon/node/156) in eine Spannung zwischen 0-5V DC umwandeln. Es wird ein Spannungsteiler aufgebaut, der 2,5V für den Sensor erzeugt. Mit dem entsprechendem Arduino Sketch können die Werte dann an dem Analog 0 Port ausgelesen werden. Den Aufbau der Schaltung findet man auf den Webseiten des Open Energie Monitors: http://openenergymonitor.org/emon/node/54&lt;br /&gt;
&lt;br /&gt;
[[Datei:emon4.jpg|Open Energie Monitor]]&lt;br /&gt;
[[Datei:emon5.jpg|Open Energie Monitor]]&lt;br /&gt;
&lt;br /&gt;
Die ganze Schaltung passt ohne Probleme in eine 7x7cm Abzweigdose.&lt;br /&gt;
&lt;br /&gt;
[[Datei:emon12.jpg|Open Energie Monitor]]&lt;br /&gt;
&lt;br /&gt;
=Arduino Sketch=&lt;br /&gt;
Es empfiehlt sich die Schaltung zuerst über USB zu testen, bevor man sich an die Kommunikation mit dem Ethernet Shield vertraut macht. Die Parameter müssen individuell mit einer &amp;quot;genormten Last&amp;quot; z.B. einem Wasserkocher etc. eingestellt werden. Ein Energie Messgerät sollte natürlich auch vorhanden sein. &lt;br /&gt;
&lt;br /&gt;
Hier ist mein Arduino Sketch mit den Parametern für den 30A Strom Sensor:&lt;br /&gt;
 [[Media:USBemon.zip|Download Arduino Sketch: USB emon]]&lt;br /&gt;
&lt;br /&gt;
==Kalibrierung==&lt;br /&gt;
Ich habe für die Kalibrierung eine umgebaute Steckdosenleiste hergenommen. Dabei muss die Phase aus dem Gehäuse geführt werden. Wenn man den Sensor um das komplette Kabel montiert kann nichts gemessen werden. Das liegt daran das die Ströme sich gegenseitig aufheben. Natürlich ergibt sich in dieser Anordnung ein kleiner Messfehler, weil das Energiekosten Messgerät auch Strom verbraucht. Dieser Fehler ist jedoch sehr gering.&lt;br /&gt;
&lt;br /&gt;
[[Datei:emon6.jpg|Open Energie Monitor]]&lt;br /&gt;
&lt;br /&gt;
Um die Daten zu visualisieren habe ich die Werte einfach in eine Open Office Calc Tabelle kopiert und ein Diagramm erstellt. Nach dem Import mussten lediglich noch die Punkte in Kommas umgewandelt werden. Also z.B.&lt;br /&gt;
 245.6&lt;br /&gt;
 245,6&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:emon7.png|Samsung Fernseher&lt;br /&gt;
Datei:emon8.png|Wasserkocher und Herdplatten&lt;br /&gt;
Datei:emon9.png|Energiesparlampe 18W&lt;br /&gt;
Datei:emon14.png|Stromverbrauch an einem Samstag Abend.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ethernet Shield und emon==&lt;br /&gt;
Wenn die Mess Ergebnisse korrekt sind, kann das Ethernet Shield eingebunden werden. Das Sketch besteht aus den Programmen emon und dem Beispiel &amp;quot;Weblient&amp;quot; aus der Ethernet Library. Damit die Daten korrekt und sicher auf den Webserver übermittelt werden können ist es notwendig die API Keys aus dem emoncms Webinterface auszulesen. Die Keys finden sich hier:&lt;br /&gt;
&lt;br /&gt;
 [[Datei:emon11.jpg|Open Energie Monitor]]&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle im Arduino Sketch wird der API Key eingetragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
client.print(&amp;quot;GET /emon/api/post?apikey=9888888888888888888&amp;amp;json={power:&amp;quot;);&lt;br /&gt;
client.print(watt);&lt;br /&gt;
client.print(&amp;quot;,temperature:25.0}&amp;quot;);&lt;br /&gt;
client.println();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die lokale IP Adresse und die IP Adresse des Servers muss natürlich auch noch an die eigene Umgebung angepasst werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };&lt;br /&gt;
byte ip[] = { 192,168,1,152 };&lt;br /&gt;
byte server[] = { 111,111,101,111}; // Enter your IP&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [[Media:EthernetAndPowerInet.zip|Download Arduino Sketch: emon and Ethernet]]&lt;br /&gt;
&lt;br /&gt;
Es können so auch mehrere Werte an emoncms übergeben werden. Z.B. Strom, Spannung und Temperatur.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
In den folgende Schritten soll die Kommunikation mit der MYSQL Datenbank geprpüft werden. Als erstes wird geprüft ob das Shield im lokalen Netz erreichbar ist:&lt;br /&gt;
&lt;br /&gt;
 ping 192.168.1.152&lt;br /&gt;
&lt;br /&gt;
Danach muss die Apache Log Datei auf dem Server geprüft werden. Dies kann bei einem Linux Server am besten mit folgendem Befehl geschehen:&lt;br /&gt;
&lt;br /&gt;
 tail -f /var/log/apache2/access.log&lt;br /&gt;
&lt;br /&gt;
Um das ganze bunter und übersichtlicher zu gestalten kann man das ganze noch mit ccze &amp;quot;einfärben&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 apt-get install ccze&lt;br /&gt;
 tail -f /var/log/apache2/access.log | &#039;&#039;&#039;ccze&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bei einer erfolgreichen Verbindung stehen folgende Einträge in der Log Datei:&lt;br /&gt;
&lt;br /&gt;
 [[Datei:emon10.png|Open Energie Monitor]]&lt;br /&gt;
&lt;br /&gt;
=Software auf dem Server=&lt;br /&gt;
&lt;br /&gt;
Download der *.zip Archive:&lt;br /&gt;
&lt;br /&gt;
 https://github.com/openenergymonitor/emoncms3&lt;br /&gt;
&lt;br /&gt;
Entpacken auf dem Server:&lt;br /&gt;
&lt;br /&gt;
 cd /var/www/emon&lt;br /&gt;
 wget https://github.com/openenergymonitor/emoncms3/tarball/master&lt;br /&gt;
 mv master openenergymonitor-emoncms3-3a1eb8b.tar&lt;br /&gt;
 unp openenergymonitor-emoncms3-3a1eb8b.tar&lt;br /&gt;
 mv openenergymonitor-emoncms3 emon&lt;br /&gt;
&lt;br /&gt;
Die Visualisierung der Daten übernimmt das PHP Script emoncms. Damit das Script auf dem Apache2 Webserver läuft muss die Option AllowOverride All gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
 vim /etc/apache2/sites-enabled/000-default&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Directory /var/www/nossl/wiki&amp;gt;&lt;br /&gt;
                Options Indexes FollowSymLinks MultiViews&lt;br /&gt;
                &#039;&#039;&#039;AllowOverride None&#039;&#039;&#039;&lt;br /&gt;
                Order allow,deny&lt;br /&gt;
                allow from all&lt;br /&gt;
        &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muss geändert werden zu&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Directory /var/www/nossl/wiki&amp;gt;&lt;br /&gt;
                Options Indexes FollowSymLinks MultiViews&lt;br /&gt;
                &#039;&#039;&#039;AllowOverride All&#039;&#039;&#039;&lt;br /&gt;
                Order allow,deny&lt;br /&gt;
                allow from all&lt;br /&gt;
        &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einem Neustart des Apache Webservers ist die Seite erreichbar:&lt;br /&gt;
 /etc/init.d/apache2 restart&lt;br /&gt;
&lt;br /&gt;
Danach muss eine Datenbank für emoncms in phpmyadmin angelegt werden. Es ist zu beachten das der Zugriff von jeder IP-Adresse möglich ist, damit der Arduino auch in die SQL Datenbank schreiben darf. Eine Anleitung zur Installation ist hier zu finden:&lt;br /&gt;
 http://openenergymonitor.org/emon/node/150&lt;br /&gt;
&lt;br /&gt;
==User Registrierung abschalten==&lt;br /&gt;
Um zu verhindern das sich fremde Leute in emoncms einloggen kann man den Button registrieren verstecken. Dazu muss folgende Datei verändert werden:&lt;br /&gt;
 vim /var/www/emon/Views/user/login_block.php&lt;br /&gt;
&lt;br /&gt;
Diese Zeile suchen:&lt;br /&gt;
 &amp;lt;input type=&amp;quot;submit&amp;quot; class=&amp;quot;button04&amp;quot; value=&amp;quot;Login&amp;quot; onclick=&amp;quot;javascript: form.action=&#039;&amp;lt;?php echo $GLOBALS[&#039;path&#039;]; ?&amp;gt;user/login&#039;;&amp;quot; /&amp;gt; or &lt;br /&gt;
 &amp;lt;input ype=&amp;quot;submit&amp;quot; class=&amp;quot;button04&amp;quot; value=&amp;quot;Register&amp;quot; onclick=&amp;quot;javascript: form.action=&#039;&amp;lt;?php echo $GLOBALS[&#039;path&#039;]; ?&amp;gt;user/create&#039;;&amp;quot; /&amp;gt;&lt;br /&gt;
und mit dieser Zeile ersetzen:&lt;br /&gt;
 &amp;lt;input type=&amp;quot;submit&amp;quot; class=&amp;quot;button04&amp;quot; value=&amp;quot;Login&amp;quot; onclick=&amp;quot;javascript: form.action=&#039;&amp;lt;?php echo $GLOBALS[&#039;path&#039;]; ?&amp;gt;user/login&#039;;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eigenes Dashboard erstellen==&lt;br /&gt;
&lt;br /&gt;
Das Dashboard kann sehr flexibel angepasst werden. Dabei werden die einzelnen Graphen einfach der Reihe nach in das Feld &amp;quot;Edit Dashboard&amp;quot; geschrieben. Wichtig ist das man immer den korrekten &#039;&#039;&#039;Api Key&#039;&#039;&#039; und die korrekte &#039;&#039;&#039;Feed ID&#039;&#039;&#039; einträgt.&lt;br /&gt;
&lt;br /&gt;
Also z.B:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;iframe style=&amp;quot;width:925px;height:300px;&amp;quot; marginheight=&amp;quot;0&amp;quot; src=&amp;quot;http://&#039;&#039;&#039;YOURDOMAIN&#039;&#039;&#039;/emon/Vis/rawdata.php?apikey=&#039;&#039;&#039;YOURAPIKEY&#039;&#039;&#039;&amp;amp;amp;&#039;&#039;&#039;feedid=4&#039;&#039;&#039;&amp;quot;  &lt;br /&gt;
 marginwidth=&amp;quot;0&amp;quot; frameborder=&amp;quot;0&amp;quot; scrolling=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel für eine schöne Übersicht auf Deutsch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=php&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;widget-container-nc&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;h2&amp;gt;Energie Explorer&amp;lt;/h2&amp;gt;&lt;br /&gt;
  &amp;lt;iframe style=&amp;quot;width:645px; height:470px;&amp;quot; marginheight=&amp;quot;0&amp;quot; marginwidth=&amp;quot;0&amp;quot; src=&amp;quot;http://YOURDOMAIN/emon/Vis/kWhdZoomer/kwhdzoomer.php?apikey=YOURAPIKEY&amp;amp;amp;kwhd=7&amp;amp;amp;power=4&amp;quot; frameborder=&amp;quot;0&amp;quot; scrolling=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;widget-container-v&amp;quot; style=&amp;quot;height:562px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;widget&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Aktueller Energie Verbrauch&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;b&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;dial&amp;quot; feed=&amp;quot;power&amp;quot; max=&amp;quot;5000&amp;quot; units=&amp;quot;W&amp;quot; scale=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;b&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div class=&amp;quot;stats&amp;quot; style=&amp;quot;height:70px&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Heutiger Energieverbrauch&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;value&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;kwhd&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; kWh&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div class=&amp;quot;widget&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;house-graph&amp;quot; class=&amp;quot;graph&amp;quot; feed=&amp;quot;power&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;      &lt;br /&gt;
&amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iframe style=&amp;quot;width:925px;height:300px;&amp;quot; marginheight=&amp;quot;0&amp;quot; src=&amp;quot;http://YOURDOMAIN/emon/Vis/rawdata.php?apikey=YOURAPIKEY&amp;amp;amp;feedid=4&amp;quot; marginwidth=&amp;quot;0&amp;quot; frameborder=&amp;quot;0&amp;quot; scrolling=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Sprache lässt sich einfach in den entsprechenden PHP Dateien ändern:&lt;br /&gt;
&lt;br /&gt;
 vim /emon/Vis/kWhdZoomer/view.js&lt;br /&gt;
 vim /emon/Vis/kWhdZoomer/kwhdzoomer.php&lt;br /&gt;
&lt;br /&gt;
Ergibt z.B. folgendes Dashboard:&lt;br /&gt;
&lt;br /&gt;
[[Datei:emon17.png|Open Energie Monitor]]&lt;br /&gt;
&lt;br /&gt;
Fertige Installation:&lt;br /&gt;
&lt;br /&gt;
[[Datei:emon15.jpg|300px|Open Energie Monitor]][[Datei:emon16.jpg|300px|Open Energie Monitor]]&lt;br /&gt;
&lt;br /&gt;
= Weblinks =&lt;br /&gt;
&lt;br /&gt;
* http://openenergymonitor.org Official Page&lt;br /&gt;
* http://vis.openenergymonitor.org Open Energie Monitor Version 3&lt;br /&gt;
* http://openenergymonitor.org/emon/node/156 Compare different CT sensors&lt;br /&gt;
* http://openenergymonitor.org/emon/node/319 EtherLib Configuration&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Einfache_Steuerung_der_parallelen_Schnittstelle&amp;diff=269</id>
		<title>Einfache Steuerung der parallelen Schnittstelle</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Einfache_Steuerung_der_parallelen_Schnittstelle&amp;diff=269"/>
		<updated>2025-02-26T13:30:33Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ziel dieser Beschreibung ist es, die parallele Schnittstelle über ein Webinterface steuern zu können. &lt;br /&gt;
Ich verwende eine Schaltung aus 4 Leds, die auf eine Rochlasterplatine gelötet wurden. Damit kann man sich sehr leicht den Zustand der einzelnen Ports anzeigen lassen. Ich verwende dabei keine Vorwiderstände da ich ultra helle LED&#039;s genommen habe. Zur Sicherheit empfiehlt es sich aber 100 Ohm Vorwiderstände zu verwenden. &lt;br /&gt;
Im wesentlichen gibt es zwei Möglichkeiten den parallelen Port unter Debian zu steuern. Zum einen lässt sich der Port direkt per Speicher Adresse aus einem C Programm heraus schreiben und lesen. Nachteil dabei: Speicher Adressen darf nur Root schreiben. Es ist also nicht möglich das ganze per www-data User aus einer Website heraus zu starten.&lt;br /&gt;
Die andere Möglichkeit besteht darin den Hardware Zugriff über ein C Programm das ein paar Linux Kernel Module benötigt vorzunehmen. Die Module können wiederum einem bestimmten Linux User oder einer Gruppe angehören. So kann der parallele Port dann auch über ein Webfrontend (PHP, Ajax etc.) gesteuert werden. Auf diese Möglichkeit möchte ich hier genauer eingehen.&lt;br /&gt;
&lt;br /&gt;
Als erstes sollten die benötigten Module geladen werden: &lt;br /&gt;
 modprobe parport&lt;br /&gt;
 modprobe ppdev&lt;br /&gt;
&lt;br /&gt;
 lsmod|grep parport&lt;br /&gt;
&lt;br /&gt;
sollte dann folgende Ausgaben produzieren: &lt;br /&gt;
 parport_pc             32132  0&lt;br /&gt;
 parport                33256  2 ppdev,parport_pc&lt;br /&gt;
nun benötigen wir den gcc und alle Programme die zum kompilieren nötig sind: &lt;br /&gt;
 apt-get install build-essential&lt;br /&gt;
nun legen wir uns einen Ordner zum kompilieren an. Für alle die wenig Erfahrung im kompilieren von Linux Software haben biete ich hier meine kompilierte ausführbare Datei zum Download an. (Debian etch 2.6.18-6-686): &lt;br /&gt;
 mkdir /usr/src/blink&lt;br /&gt;
 cd /usr/src/blink&lt;br /&gt;
Darin speichern wir unsere C Quellcode Datei mit folgendem Inhalt: &lt;br /&gt;
 vim blink.c&lt;br /&gt;
Inhalt, das Programm stammt übrigens aus diesem Forumbeitrag: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
 /*Dieser Code laesst LEDs die an Pins 2...9 (Datenregister)&lt;br /&gt;
 angeschlossen sind blinken. */&lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/ppdev.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/parport.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/ioctl.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int fd,loop=0;&lt;br /&gt;
    unsigned char datareg=0xFF;&lt;br /&gt;
    unsigned char controlreg=0x00;&lt;br /&gt;
    struct ppdev_frob_struct frob;&lt;br /&gt;
&lt;br /&gt;
/*parallele Schnittstelle Ã¶en*/&lt;br /&gt;
    if((fd = open (&amp;quot;/dev/parport0&amp;quot;, O_RDWR))!=-1)&lt;br /&gt;
    {&lt;br /&gt;
        ioctl (fd, PPCLAIM);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;Konnte Schnittstelle nicht oeffnen\n&amp;quot;);&lt;br /&gt;
        return 1;&lt;br /&gt;
    }  &lt;br /&gt;
&lt;br /&gt;
/*Pins 2..9 als Ausgang konfigurieren*/&lt;br /&gt;
    frob.mask = 0x20;&lt;br /&gt;
    frob.val =0x00;&lt;br /&gt;
    ioctl (fd, PPFCONTROL, &amp;amp;frob); &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*10 mal LEDs ein- und ausschalten*/&lt;br /&gt;
   while ((loop++)&amp;lt;1)&lt;br /&gt;
   {&lt;br /&gt;
       datareg=0xFF;&lt;br /&gt;
       ioctl(fd,PPWDATA ,&amp;amp;datareg);&lt;br /&gt;
       sleep(1);&lt;br /&gt;
       datareg=0x00;&lt;br /&gt;
       ioctl(fd,PPWDATA ,&amp;amp;datareg);&lt;br /&gt;
       sleep(1);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
/*parallele Schnittstelle schliessen*/&lt;br /&gt;
   ioctl(fd,PPRELEASE);&lt;br /&gt;
   close(fd);&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
Dann wird ein kleines Makefile erstellt: &lt;br /&gt;
 vim Makefile&lt;br /&gt;
Inhalt: &lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
CC      =       gcc&lt;br /&gt;
PROG    =       blink&lt;br /&gt;
&lt;br /&gt;
all:&lt;br /&gt;
       $(CC) -c $(PROG).c&lt;br /&gt;
       $(CC) -o $(PROG) $(PROG).o&lt;br /&gt;
&lt;br /&gt;
clean:&lt;br /&gt;
       rm -f $(PROG) $(PROG).o *~&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nun kompilieren wir das ganze mit: &lt;br /&gt;
make&lt;br /&gt;
und schon erscheint eine ausführbare Datei mit dem Namen blink. Wir starten die Datei mit: &lt;br /&gt;
 ./blink&lt;br /&gt;
Jetzt sollten die LED&#039;s an der parallelen Schnittstelle aufblinken...Um zu testen ob das Programm auch als www-data User läuft, könnnen wir das Programm als  www-data ausführen: &lt;br /&gt;
 su www-data&lt;br /&gt;
 ./blink&lt;br /&gt;
Wenn alles bis dahin klappt können wir uns ein PHP Skript schreiben das dieses Programm über ein Webfrontend aufrufen kann. Ich verwende hier ein einfaches Beispiel um die Funktion darzustellen. Achtung: Wegen Sicherheitslücken sollte das Programm nur zu Testzwecken benützt werden. &lt;br /&gt;
 apt-get install apache php5&lt;br /&gt;
 cd /var/www&lt;br /&gt;
 mkdir blink&lt;br /&gt;
 chown www-data www-data ../*&lt;br /&gt;
 vim index.php &lt;br /&gt;
Inhalt der Datei index.php: &lt;br /&gt;
&amp;lt;source lang=html4strict&amp;gt;&lt;br /&gt;
&amp;lt;HTML&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;TITLE&amp;gt;Parallele Schnittstelle per Webfrontend steuern...&amp;lt;/TITLE&amp;gt;&lt;br /&gt;
   &amp;lt;/HEAD&amp;gt;&lt;br /&gt;
 &amp;lt;BODY&amp;gt;&lt;br /&gt;
 &amp;lt;font face=&amp;quot;arial&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;CENTER&amp;gt;&amp;lt;h3&amp;gt;Öffnet beim Neu Laden den Parallelport...&amp;lt;/h3&amp;gt;&amp;lt;/CENTER&amp;gt;&lt;br /&gt;
 &amp;lt;body bgcolor=ffffe9&amp;gt;&lt;br /&gt;
 &amp;lt;/BODY&amp;gt;&lt;br /&gt;
&amp;lt;/HEAD&amp;gt;&lt;br /&gt;
&amp;lt;CENTER&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
shell_exec(&#039;/usr/src/blink&#039;);&lt;br /&gt;
echo exec(&#039;whoami&#039;);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nun sollte beim Aufrufen oder Aktualisieren der Seite ein blinken der LED&#039;s sichtbar sein. Es sind nun diverse Funktionen möglich. Z.B. können über Optokoppler Relais geschaltet werden. Über diese Relais können so Verbraucher übers Internet geschaltet werden. Zudem kann das ganze mit einem Netzwerkkabel an den S0 Bus der Telefonanlage angeschlossen werden (siehe: CAPI, Asterisk etc.).&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Der_PC_als_Temperatur_Sensor_-_Digitemp&amp;diff=268</id>
		<title>Der PC als Temperatur Sensor - Digitemp</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Der_PC_als_Temperatur_Sensor_-_Digitemp&amp;diff=268"/>
		<updated>2025-02-26T13:29:59Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Dieser Artikel beschäftigt sich mit der Temperatur Messung unter Debian Linux. Als Grundlage dient das Digitemp Projekt für den seriellen Anschluss, da die Bauteile günstig zu beschaffen sind und jeder Server mit einer COM Schnittstelle ausgestattet ist.&#039;&#039;&#039; &lt;br /&gt;
Als erstes sollte man sich ein altes Modem Kabel für die Bauteile besorgen. Man kann dann alles direkt an den Stecker anlöten. Eine ausführliche &lt;br /&gt;
&lt;br /&gt;
Bauanleitung findet ihr hier: &lt;br /&gt;
https://systemausfall.org/wikis/howto/DigiTemp &lt;br /&gt;
Nun müssen wir das Programm digitemp installieren: &lt;br /&gt;
 apt-get install digitemp&lt;br /&gt;
Konfiguration initialisieren:&lt;br /&gt;
 digitemp_DS9097 -i -s0 -q -c /root/digitemp.cfg&lt;br /&gt;
Jetzt muss Digitemp der Sensor &amp;quot;mitgeteilt&amp;quot; werden mit: &lt;br /&gt;
 digitemp_DS9097 -i ttyS0&lt;br /&gt;
Die Ausgabe sollte dann so aussehen: &lt;br /&gt;
Searching the 1-Wire LAN&lt;br /&gt;
 106C6C7C000000 : DS1820/DS18S20/DS1920 Temperature Sensor&lt;br /&gt;
 ROM #0 : 106C6C7C01080012&lt;br /&gt;
 Wrote .digitemprc&lt;br /&gt;
Damit man das ganze schön als Graphen anzeigen lassen kann müssen noch die rrdtools installiert werden: &lt;br /&gt;
 apt-get install rrdtool&lt;br /&gt;
Nun erstellen wir ein paar Scripte unter /auktion/rrdtool &lt;br /&gt;
 cd /auktion/rrdtool&lt;br /&gt;
 vim erzeugepng.sh&lt;br /&gt;
Die Datei sollte mit folgendem Inhalt gefüllt werden: &lt;br /&gt;
 nice -n 19 /usr/bin/rrdtool graph /var/www/temperatur.png -a PNG -b 1024 --start -129600 -A \&lt;br /&gt;
 -l 0 -u 30 -t &amp;quot;Zimmer Temperatur&amp;quot; --vertical-label &amp;quot;Grad Celsius&amp;quot; -w 600 -h 200 \&lt;br /&gt;
 DEF:g1=/auktion/rrdtool/temperatur/temperatur.rrd:gehaeuse:AVERAGE \&lt;br /&gt;
 DEF:gmin=/auktion/rrdtool/temperatur/temperatur.rrd:gehaeuse:MIN \&lt;br /&gt;
 DEF:gmax=/auktion/rrdtool/temperatur/temperatur.rrd:gehaeuse:MAX \&lt;br /&gt;
 VDEF:g1a=g1,LAST \&lt;br /&gt;
 VDEF:gmina=gmin,MINIMUM \&lt;br /&gt;
 VDEF:gmaxa=gmax,MAXIMUM \&lt;br /&gt;
 LINE2:g1#ff0000:&amp;quot;Zimmer Temperatur&amp;quot; \&lt;br /&gt;
 GPRINT:g1a:&amp;quot;aktuell\: %5.2lf Â°C&amp;quot;  \&lt;br /&gt;
 COMMENT:&amp;quot;(Last updated\: $(/bin/date &amp;quot;+%d.%m.%Y %H\:%M\:%S&amp;quot;))\n&amp;quot;&lt;br /&gt;
Datei ausführbar machen mit: &lt;br /&gt;
 chmod ug+x erzeugepng.sh&lt;br /&gt;
Wenn alles geklappt hat erscheint nach Eingabe von: &lt;br /&gt;
 ./erzeugepng.sh&lt;br /&gt;
unter dem Ordner /var/www/temperatur.png die Grafik...&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Arduino_und_das_Imax_B6_Ladeger%C3%A4t&amp;diff=267</id>
		<title>Arduino und das Imax B6 Ladegerät</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Arduino_und_das_Imax_B6_Ladeger%C3%A4t&amp;diff=267"/>
		<updated>2025-02-26T13:29:21Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Einleitung=&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird beschrieben wie das Ladegerät Imax B6 über einen Arduino mit dem PC verbunden werden kann. Der Vorteil ist das einfach ein USB Kabel zur Datenübertragung genützt werden kann.&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
&lt;br /&gt;
Damit der Arduino nicht booten kann wird ein Kabel von Masse nach Reset angeschlossen. Als Stecker kann man einfach eine Buchsenleiste (Rastermaß 2,54) feilen damit diese in den Anschluß vom Imax B6 passt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Imaxb6 1.jpg|Imax B6]]&lt;br /&gt;
&lt;br /&gt;
=Aufbau=&lt;br /&gt;
Anschluß des Imax B6 Ladegerätes an den Arduino&lt;br /&gt;
&lt;br /&gt;
[[Datei:Imaxb6 3.jpg|Imax B6]]&lt;br /&gt;
&lt;br /&gt;
Um mit dem Imax B6 auch kleine 160 mAh LiPos zu laden habe ich mir aus einer Universal Platine diesen Adapter zum Laden gebaut.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Imaxb6 2.jpg|Imax B6]]&lt;br /&gt;
&lt;br /&gt;
Der ganze Aufbau mit dem Ladegerät sieht dann so aus:&lt;br /&gt;
&lt;br /&gt;
[[Datei:Imaxb6 4.jpg|Imax B6]]&lt;br /&gt;
&lt;br /&gt;
==Auswertung==&lt;br /&gt;
&lt;br /&gt;
Nach der Arduino Treiber Installation können die Daten am einfachsten mit dem Tool Logview aufgezeichnet und gespeichert werden. Logview kann hier heruntergeladen werden: http://logview.info&lt;br /&gt;
&lt;br /&gt;
Turnigy 160 mAh (Hobbyking)&lt;br /&gt;
&lt;br /&gt;
Zugeführte Ladung: 130 mAh&lt;br /&gt;
&lt;br /&gt;
[[Datei:Lipo160mAh.jpg|800px|Imax B6]]&lt;br /&gt;
&lt;br /&gt;
Lidl Loop Low Self Discharge Mignon Zelle (ähnlich Eneloop)&lt;br /&gt;
&lt;br /&gt;
Zugeführte Ladung: 2230 mAh&lt;br /&gt;
&lt;br /&gt;
Entladen (200 mAh): 1720 mAh&lt;br /&gt;
&lt;br /&gt;
[[Datei:LidlLoop.jpg|800px|Imax B6]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Alle_Senders_eines_Transponders_anzeigen_lassen&amp;diff=266</id>
		<title>Alle Senders eines Transponders anzeigen lassen</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Alle_Senders_eines_Transponders_anzeigen_lassen&amp;diff=266"/>
		<updated>2025-02-26T13:28:33Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Hier eine einfache Möglichkeit um sich alle Senders eines Transponders anzeigen zu lassen&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
In das VDR Verzeichniss wechseln: &lt;br /&gt;
 cd /etc/vdr&lt;br /&gt;
Die Senderliste anzeigen lassen: &lt;br /&gt;
 vim channels.conf&lt;br /&gt;
Für das Erste z.B. erscheint dieser Eintrag: &lt;br /&gt;
 Das Erste;ARD:410000:C0M64:C:6900:101:102=deu,103=2ch;106=dd:104:0:28106:1:1101:0&lt;br /&gt;
Die Nummer des Transponders beträgt in diesem Fall: 410000. &lt;br /&gt;
Durch ein grep auf die channels.conf (Suche nach der Transponderfrequenz) werden alle Sender des Transponders angezeigt: &lt;br /&gt;
 grep 410000 channels.conf&lt;br /&gt;
Ausgabe: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
 Das Erste;ARD:410000:C0M64:C:6900:101:102=deu,103=2ch;106=dd:104:0:28106:1:1101:0&lt;br /&gt;
 WDR Köln;ARD:410000:C0M64:C:6900:601:602=deu:604:0:28111:1:1101:0&lt;br /&gt;
 BR-alpha;ARD:410000:C0M64:C:6900:701:702=deu:704:0:28112:1:1101:0&lt;br /&gt;
 arte;ARD:410000:C0M64:C:6900:401:402=deu,403=fra:404:0:28109:1:1101:0&lt;br /&gt;
 hr-fernsehen;ARD:410000:C0M64:C:6900:301:302=deu:304:0:28108:1:1101:0&lt;br /&gt;
 Phoenix;ARD:410000:C0M64:C:6900:901:902=deu:904:0:28114:1:1101:0&lt;br /&gt;
 SWR Fernsehen BW;ARD:410000:C0M64:C:6900:801:802=deu:804:0:28113:1:1101:0&lt;br /&gt;
 Bayerisches FS;ARD:410000:C0M64:C:6900:201:202=deu,203=2ch:204:0:28107:1:1101:0&lt;br /&gt;
 Test-R;ARD:410000:C0M64:C:6900:701:702:204:0:28130:1:1101:0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Alle_Senders_eines_Transponders_anzeigen_lassen&amp;diff=265</id>
		<title>Alle Senders eines Transponders anzeigen lassen</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Alle_Senders_eines_Transponders_anzeigen_lassen&amp;diff=265"/>
		<updated>2025-02-26T13:28:25Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Hier eine einfache Möglichkeit um sich alle Senders eines Transponders anzeigen zu lassen&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
In das VDR Verzeichniss wechseln: &lt;br /&gt;
 cd /etc/vdr&lt;br /&gt;
Die Senderliste anzeigen lassen: &lt;br /&gt;
 vim channels.conf&lt;br /&gt;
Für das Erste z.B. erscheint dieser Eintrag: &lt;br /&gt;
 Das Erste;ARD:410000:C0M64:C:6900:101:102=deu,103=2ch;106=dd:104:0:28106:1:1101:0&lt;br /&gt;
Die Nummer des Transponders beträgt in diesem Fall: 410000. &lt;br /&gt;
Durch ein grep auf die channels.conf (Suche nach der Transponderfrequenz) werden alle Sender des Transponders angezeigt: &lt;br /&gt;
 grep 410000 channels.conf&lt;br /&gt;
Ausgabe: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 Das Erste;ARD:410000:C0M64:C:6900:101:102=deu,103=2ch;106=dd:104:0:28106:1:1101:0&lt;br /&gt;
 WDR Köln;ARD:410000:C0M64:C:6900:601:602=deu:604:0:28111:1:1101:0&lt;br /&gt;
 BR-alpha;ARD:410000:C0M64:C:6900:701:702=deu:704:0:28112:1:1101:0&lt;br /&gt;
 arte;ARD:410000:C0M64:C:6900:401:402=deu,403=fra:404:0:28109:1:1101:0&lt;br /&gt;
 hr-fernsehen;ARD:410000:C0M64:C:6900:301:302=deu:304:0:28108:1:1101:0&lt;br /&gt;
 Phoenix;ARD:410000:C0M64:C:6900:901:902=deu:904:0:28114:1:1101:0&lt;br /&gt;
 SWR Fernsehen BW;ARD:410000:C0M64:C:6900:801:802=deu:804:0:28113:1:1101:0&lt;br /&gt;
 Bayerisches FS;ARD:410000:C0M64:C:6900:201:202=deu,203=2ch:204:0:28107:1:1101:0&lt;br /&gt;
 Test-R;ARD:410000:C0M64:C:6900:701:702:204:0:28130:1:1101:0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Alle_Senders_eines_Transponders_anzeigen_lassen&amp;diff=264</id>
		<title>Alle Senders eines Transponders anzeigen lassen</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Alle_Senders_eines_Transponders_anzeigen_lassen&amp;diff=264"/>
		<updated>2025-02-26T13:28:01Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Hier eine einfache Möglichkeit um sich alle Senders eines Transponders anzeigen zu lassen&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
In das VDR Verzeichniss wechseln: &lt;br /&gt;
 cd /etc/vdr&lt;br /&gt;
Die Senderliste anzeigen lassen: &lt;br /&gt;
 vim channels.conf&lt;br /&gt;
Für das Erste z.B. erscheint dieser Eintrag: &lt;br /&gt;
 Das Erste;ARD:410000:C0M64:C:6900:101:102=deu,103=2ch;106=dd:104:0:28106:1:1101:0&lt;br /&gt;
Die Nummer des Transponders beträgt in diesem Fall: 410000. &lt;br /&gt;
Durch ein grep auf die channels.conf (Suche nach der Transponderfrequenz) werden alle Sender des Transponders angezeigt: &lt;br /&gt;
 grep 410000 channels.conf&lt;br /&gt;
Ausgabe: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 Das Erste;ARD:410000:C0M64:C:6900:101:102=deu,103=2ch;106=dd:104:0:28106:1:1101:0&lt;br /&gt;
 WDR Köln;ARD:410000:C0M64:C:6900:601:602=deu:604:0:28111:1:1101:0&lt;br /&gt;
 BR-alpha;ARD:410000:C0M64:C:6900:701:702=deu:704:0:28112:1:1101:0&lt;br /&gt;
 arte;ARD:410000:C0M64:C:6900:401:402=deu,403=fra:404:0:28109:1:1101:0&lt;br /&gt;
 hr-fernsehen;ARD:410000:C0M64:C:6900:301:302=deu:304:0:28108:1:1101:0&lt;br /&gt;
 Phoenix;ARD:410000:C0M64:C:6900:901:902=deu:904:0:28114:1:1101:0&lt;br /&gt;
 SWR Fernsehen BW;ARD:410000:C0M64:C:6900:801:802=deu:804:0:28113:1:1101:0&lt;br /&gt;
 Bayerisches FS;ARD:410000:C0M64:C:6900:201:202=deu,203=2ch:204:0:28107:1:1101:0&lt;br /&gt;
 Test-R;ARD:410000:C0M64:C:6900:701:702:204:0:28130:1:1101:0&lt;br /&gt;
&amp;lt;\syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Fernsehen_mit_der_XBOX_-_Installation_von_Xineliboutput_auf_der_xBox&amp;diff=263</id>
		<title>Fernsehen mit der XBOX - Installation von Xineliboutput auf der xBox</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Fernsehen_mit_der_XBOX_-_Installation_von_Xineliboutput_auf_der_xBox&amp;diff=263"/>
		<updated>2025-02-26T13:26:34Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Diese Anleitung orientiert sich an einem Wiki Eintrag und beschreibt die Installation von Xineliboutput mit Hilfe von Xebian auf der XBOX.==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Als erstes muss Xebian auf der XBOX installiert werden. Dazu benötigt ihr eine XBOX auf der unsignierte Software läuft. Das Image gibt es hier zum herunterladen. &lt;br /&gt;
&lt;br /&gt;
2. Debian Grundkonfiguration: &lt;br /&gt;
Nameserver anpassen: &lt;br /&gt;
 vim /etc/resolv.conf&lt;br /&gt;
Standard Software installieren: &lt;br /&gt;
 apt-get update&lt;br /&gt;
 apt-get install vim unp bzip2&lt;br /&gt;
 Exim4 entfernen, da Mailserver nicht benötigt wird: &lt;br /&gt;
 apt-get remove --purge exim4&lt;br /&gt;
Syntax Highlighting aktivieren: &lt;br /&gt;
 vim /etc/vim/vimrc&lt;br /&gt;
Die Zeile &lt;br /&gt;
 &amp;quot; syntax on&lt;br /&gt;
einkommentieren &lt;br /&gt;
 syntax on&lt;br /&gt;
Falls DHCP gewünscht wird müssen die Interfaces angepasst werden: &lt;br /&gt;
 vim /etc/network/interfaces&lt;br /&gt;
In diesem Fall muss das static in dhcp geändert werden, die 3 Zeilen darunter werden auskommentiert. &lt;br /&gt;
 vim /etc/apt/sources.list&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb http://ftp.at.debian.org/debian/ stable main contrib non-free&lt;br /&gt;
deb http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free&lt;br /&gt;
deb-src http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free&lt;br /&gt;
deb http://security.debian.org/ stable/updates main contrib non-free&lt;br /&gt;
deb-src http://security.debian.org/ stable/updates main contrib non-free&lt;br /&gt;
#Debian Multimedia&lt;br /&gt;
deb http://www.debian-multimedia.org etch main&lt;br /&gt;
deb-src http://debian-multimedia.org etch main&lt;br /&gt;
# VDR&lt;br /&gt;
deb http://e-tobi.net/vdr-experimental etch base addons vdr-multipatch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 apt-get update&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG NICHT: apt-get upgrade ausführen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Nun verbindet man sich am besten per SSH zur XBOX.&lt;br /&gt;
&lt;br /&gt;
3. XServer Installation: &lt;br /&gt;
 apt-get install xserver-xorg xineliboutput-sxfe xterm xfonts-base xfonts-base&lt;br /&gt;
 vim /etc/X11/xorg.conf&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
Section &amp;quot;Files&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/misc&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/misc&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/cyrillic&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/cyrillic&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/100dpi/:unscaled&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/100dpi/:unscaled&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/75dpi/:unscaled&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/75dpi/:unscaled&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/Type1&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/Type1&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/100dpi&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/100dpi&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/75dpi&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/75dpi&amp;quot;&lt;br /&gt;
# path to defoma fonts&lt;br /&gt;
FontPath        &amp;quot;/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType&amp;quot;&lt;br /&gt;
EndSection&lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Module&amp;quot;&lt;br /&gt;
Load    &amp;quot;bitmap&amp;quot;&lt;br /&gt;
Load    &amp;quot;dbe&amp;quot;&lt;br /&gt;
Load    &amp;quot;ddc&amp;quot;&lt;br /&gt;
Load    &amp;quot;dri&amp;quot;&lt;br /&gt;
Load    &amp;quot;extmod&amp;quot;&lt;br /&gt;
Load    &amp;quot;freetype&amp;quot;&lt;br /&gt;
Load    &amp;quot;glx&amp;quot;&lt;br /&gt;
Load    &amp;quot;int10&amp;quot;&lt;br /&gt;
Load    &amp;quot;record&amp;quot;&lt;br /&gt;
Load    &amp;quot;vbe&amp;quot;&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;InputDevice&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Generic Keyboard&amp;quot;&lt;br /&gt;
Driver          &amp;quot;kbd&amp;quot;&lt;br /&gt;
Option          &amp;quot;CoreKeyboard&amp;quot;&lt;br /&gt;
Option          &amp;quot;XkbRules&amp;quot;      &amp;quot;xorg&amp;quot;&lt;br /&gt;
Option          &amp;quot;XkbModel&amp;quot;      &amp;quot;pc105&amp;quot;&lt;br /&gt;
Option          &amp;quot;XkbLayout&amp;quot;     &amp;quot;us&amp;quot;&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;InputDevice&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Configured Mouse&amp;quot;&lt;br /&gt;
Driver          &amp;quot;mouse&amp;quot;&lt;br /&gt;
Option          &amp;quot;CorePointer&amp;quot;&lt;br /&gt;
Option          &amp;quot;Device&amp;quot;                &amp;quot;/dev/input/mice&amp;quot;&lt;br /&gt;
Option          &amp;quot;Protocol&amp;quot;              &amp;quot;ImPS/2&amp;quot;&lt;br /&gt;
Option          &amp;quot;Emulate3Buttons&amp;quot;       &amp;quot;true&amp;quot;&lt;br /&gt;
EndSection  &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Device&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;nVidia Corporation GeForce3 MX for XBox&amp;quot;&lt;br /&gt;
#       Driver          &amp;quot;nv&amp;quot;&lt;br /&gt;
Driver          &amp;quot;nvxbox&amp;quot;&lt;br /&gt;
Option          &amp;quot;UseFBDev&amp;quot;              &amp;quot;true&amp;quot;&lt;br /&gt;
Option          &amp;quot;HWCursor&amp;quot;              &amp;quot;false&amp;quot;&lt;br /&gt;
#       Option          &amp;quot;NoAccel&amp;quot;               &amp;quot;true&amp;quot;&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Device&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Frame Buffer&amp;quot;&lt;br /&gt;
Driver          &amp;quot;fbdev&amp;quot;&lt;br /&gt;
Option          &amp;quot;UseFBDev&amp;quot;              &amp;quot;true&amp;quot;&lt;br /&gt;
EndSection&lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Monitor&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Generic Monitor&amp;quot;&lt;br /&gt;
Option          &amp;quot;DPMS&amp;quot;&lt;br /&gt;
HorizSync       28-32&lt;br /&gt;
VertRefresh     43-60&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Screen&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Default Screen&amp;quot;&lt;br /&gt;
Device          &amp;quot;nVidia Corporation GeForce3 MX for XBox&amp;quot;&lt;br /&gt;
#       Device          &amp;quot;Frame Buffer&amp;quot;&lt;br /&gt;
Monitor         &amp;quot;Generic Monitor&amp;quot;&lt;br /&gt;
DefaultDepth    24&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           1&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           4&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           8&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           15&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           16&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           24&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;DRI&amp;quot;&lt;br /&gt;
Mode    0666&lt;br /&gt;
EndSection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
4. Init Skript anpassen: &lt;br /&gt;
 vim /etc/init.d/xorg&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#! /bin/sh&lt;br /&gt;
### BEGIN INIT INFO&lt;br /&gt;
# Provides:          X4VDR&lt;br /&gt;
# Required-Start:    $local_fs&lt;br /&gt;
# Required-Stop:     vdr&lt;br /&gt;
# Default-Start:     2&lt;br /&gt;
# Default-Stop:&lt;br /&gt;
# Short-Description: X-Server for VDR&lt;br /&gt;
# Description:       Starts the X-Server for the VDR.&lt;br /&gt;
### END INIT INFO&lt;br /&gt;
#&lt;br /&gt;
# Author:            Helmar Gerloni &amp;lt;helmar@gerloni.net&amp;gt;&lt;br /&gt;
# Version:           2006-09-13&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin&lt;br /&gt;
DESC=&amp;quot;X-Server for VDR&amp;quot;&lt;br /&gt;
NAME=X4VDR&lt;br /&gt;
PIDFILE=/var/run/$NAME\.pid&lt;br /&gt;
SCRIPTNAME=/etc/init.d/$NAME&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
#       Function that starts X.&lt;br /&gt;
#&lt;br /&gt;
d_start() {&lt;br /&gt;
       vdr-sxfe --tcp --reconnect --syslog --fullscreen --video=xv xvdr://vdr.server.ip:37890 &amp;gt; /dev/null 2&amp;amp;&amp;gt;1 &amp;amp;&lt;br /&gt;
       start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --exec /usr/bin/X -- :0 vt7 -br -nolisten tcp&lt;br /&gt;
       if [ $? -gt 0 ]; then&lt;br /&gt;
               echo &amp;quot;Error starting X-Server.&amp;quot;&lt;br /&gt;
               exit $?&lt;br /&gt;
       fi&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
#       Function that stops X.&lt;br /&gt;
#&lt;br /&gt;
d_stop() {&lt;br /&gt;
       start-stop-daemon --stop --quiet --pidfile $PIDFILE&lt;br /&gt;
       if [ $? -gt 0 ]; then&lt;br /&gt;
               echo &amp;quot;Error stopping X-Server.&amp;quot;&lt;br /&gt;
       fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
case &amp;quot;$1&amp;quot; in&lt;br /&gt;
 start)&lt;br /&gt;
       echo -n &amp;quot;Starting $DESC: $NAME&amp;quot;&lt;br /&gt;
       d_start&lt;br /&gt;
       echo &amp;quot;.&amp;quot;&lt;br /&gt;
       ;;&lt;br /&gt;
 stop)&lt;br /&gt;
       echo -n &amp;quot;Stopping $DESC: $NAME&amp;quot;&lt;br /&gt;
       d_stop&lt;br /&gt;
       echo &amp;quot;.&amp;quot;&lt;br /&gt;
       ;;&lt;br /&gt;
*)&lt;br /&gt;
       echo &amp;quot;Usage: $SCRIPTNAME {start|stop|restart|force-reload}&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
       exit 1&lt;br /&gt;
       ;;&lt;br /&gt;
esac &lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Das Script ausführbar machen mit: &lt;br /&gt;
 chmod ug+x /etc/init.d/xorg&lt;br /&gt;
Das VDR Script startet nun den X-Server und zugleich vdr-sxfe. Zum starten und testen einfach: &lt;br /&gt;
 /etc/init.d/xorg start&lt;br /&gt;
eingeben&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Fernsehen_mit_der_XBOX_-_Installation_von_Xineliboutput_auf_der_xBox&amp;diff=262</id>
		<title>Fernsehen mit der XBOX - Installation von Xineliboutput auf der xBox</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Fernsehen_mit_der_XBOX_-_Installation_von_Xineliboutput_auf_der_xBox&amp;diff=262"/>
		<updated>2025-02-26T13:24:50Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Diese Anleitung orientiert sich an einem Wiki Eintrag und beschreibt die Installation von Xineliboutput mit Hilfe von Xebian auf der XBOX.==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Als erstes muss Xebian auf der XBOX installiert werden. Dazu benötigt ihr eine XBOX auf der unsignierte Software läuft. Das Image gibt es hier zum herunterladen. &lt;br /&gt;
&lt;br /&gt;
2. Debian Grundkonfiguration: &lt;br /&gt;
Nameserver anpassen: &lt;br /&gt;
 vim /etc/resolv.conf&lt;br /&gt;
Standard Software installieren: &lt;br /&gt;
 apt-get update&lt;br /&gt;
 apt-get install vim unp bzip2&lt;br /&gt;
 Exim4 entfernen, da Mailserver nicht benötigt wird: &lt;br /&gt;
 apt-get remove --purge exim4&lt;br /&gt;
Syntax Highlighting aktivieren: &lt;br /&gt;
 vim /etc/vim/vimrc&lt;br /&gt;
Die Zeile &lt;br /&gt;
 &amp;quot; syntax on&lt;br /&gt;
einkommentieren &lt;br /&gt;
 syntax on&lt;br /&gt;
Falls DHCP gewünscht wird müssen die Interfaces angepasst werden: &lt;br /&gt;
 vim /etc/network/interfaces&lt;br /&gt;
In diesem Fall muss das static in dhcp geändert werden, die 3 Zeilen darunter werden auskommentiert. &lt;br /&gt;
 vim /etc/apt/sources.list&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb http://ftp.at.debian.org/debian/ stable main contrib non-free&lt;br /&gt;
deb http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free&lt;br /&gt;
deb-src http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free&lt;br /&gt;
deb http://security.debian.org/ stable/updates main contrib non-free&lt;br /&gt;
deb-src http://security.debian.org/ stable/updates main contrib non-free&lt;br /&gt;
#Debian Multimedia&lt;br /&gt;
deb http://www.debian-multimedia.org etch main&lt;br /&gt;
deb-src http://debian-multimedia.org etch main&lt;br /&gt;
# VDR&lt;br /&gt;
deb http://e-tobi.net/vdr-experimental etch base addons vdr-multipatch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 apt-get update&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG NICHT: apt-get upgrade ausführen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Nun verbindet man sich am besten per SSH zur XBOX.&lt;br /&gt;
&lt;br /&gt;
3. XServer Installation: &lt;br /&gt;
 apt-get install xserver-xorg xineliboutput-sxfe xterm xfonts-base xfonts-base&lt;br /&gt;
 vim /etc/X11/xorg.conf&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
Section &amp;quot;Files&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/misc&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/misc&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/cyrillic&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/cyrillic&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/100dpi/:unscaled&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/100dpi/:unscaled&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/75dpi/:unscaled&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/75dpi/:unscaled&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/Type1&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/Type1&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/100dpi&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/100dpi&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/75dpi&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/75dpi&amp;quot;&lt;br /&gt;
# path to defoma fonts&lt;br /&gt;
FontPath        &amp;quot;/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType&amp;quot;&lt;br /&gt;
EndSection&lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Module&amp;quot;&lt;br /&gt;
Load    &amp;quot;bitmap&amp;quot;&lt;br /&gt;
Load    &amp;quot;dbe&amp;quot;&lt;br /&gt;
Load    &amp;quot;ddc&amp;quot;&lt;br /&gt;
Load    &amp;quot;dri&amp;quot;&lt;br /&gt;
Load    &amp;quot;extmod&amp;quot;&lt;br /&gt;
Load    &amp;quot;freetype&amp;quot;&lt;br /&gt;
Load    &amp;quot;glx&amp;quot;&lt;br /&gt;
Load    &amp;quot;int10&amp;quot;&lt;br /&gt;
Load    &amp;quot;record&amp;quot;&lt;br /&gt;
Load    &amp;quot;vbe&amp;quot;&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;InputDevice&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Generic Keyboard&amp;quot;&lt;br /&gt;
Driver          &amp;quot;kbd&amp;quot;&lt;br /&gt;
Option          &amp;quot;CoreKeyboard&amp;quot;&lt;br /&gt;
Option          &amp;quot;XkbRules&amp;quot;      &amp;quot;xorg&amp;quot;&lt;br /&gt;
Option          &amp;quot;XkbModel&amp;quot;      &amp;quot;pc105&amp;quot;&lt;br /&gt;
Option          &amp;quot;XkbLayout&amp;quot;     &amp;quot;us&amp;quot;&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;InputDevice&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Configured Mouse&amp;quot;&lt;br /&gt;
Driver          &amp;quot;mouse&amp;quot;&lt;br /&gt;
Option          &amp;quot;CorePointer&amp;quot;&lt;br /&gt;
Option          &amp;quot;Device&amp;quot;                &amp;quot;/dev/input/mice&amp;quot;&lt;br /&gt;
Option          &amp;quot;Protocol&amp;quot;              &amp;quot;ImPS/2&amp;quot;&lt;br /&gt;
Option          &amp;quot;Emulate3Buttons&amp;quot;       &amp;quot;true&amp;quot;&lt;br /&gt;
EndSection  &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Device&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;nVidia Corporation GeForce3 MX for XBox&amp;quot;&lt;br /&gt;
#       Driver          &amp;quot;nv&amp;quot;&lt;br /&gt;
Driver          &amp;quot;nvxbox&amp;quot;&lt;br /&gt;
Option          &amp;quot;UseFBDev&amp;quot;              &amp;quot;true&amp;quot;&lt;br /&gt;
Option          &amp;quot;HWCursor&amp;quot;              &amp;quot;false&amp;quot;&lt;br /&gt;
#       Option          &amp;quot;NoAccel&amp;quot;               &amp;quot;true&amp;quot;&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Device&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Frame Buffer&amp;quot;&lt;br /&gt;
Driver          &amp;quot;fbdev&amp;quot;&lt;br /&gt;
Option          &amp;quot;UseFBDev&amp;quot;              &amp;quot;true&amp;quot;&lt;br /&gt;
EndSection&lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Monitor&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Generic Monitor&amp;quot;&lt;br /&gt;
Option          &amp;quot;DPMS&amp;quot;&lt;br /&gt;
HorizSync       28-32&lt;br /&gt;
VertRefresh     43-60&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Screen&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Default Screen&amp;quot;&lt;br /&gt;
Device          &amp;quot;nVidia Corporation GeForce3 MX for XBox&amp;quot;&lt;br /&gt;
#       Device          &amp;quot;Frame Buffer&amp;quot;&lt;br /&gt;
Monitor         &amp;quot;Generic Monitor&amp;quot;&lt;br /&gt;
DefaultDepth    24&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           1&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           4&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           8&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           15&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           16&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           24&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;DRI&amp;quot;&lt;br /&gt;
Mode    0666&lt;br /&gt;
EndSection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
4. Init Skript anpassen: &lt;br /&gt;
 vim /etc/init.d/xorg&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#! /bin/sh&lt;br /&gt;
### BEGIN INIT INFO&lt;br /&gt;
# Provides:          X4VDR&lt;br /&gt;
# Required-Start:    $local_fs&lt;br /&gt;
# Required-Stop:     vdr&lt;br /&gt;
# Default-Start:     2&lt;br /&gt;
# Default-Stop:&lt;br /&gt;
# Short-Description: X-Server for VDR&lt;br /&gt;
# Description:       Starts the X-Server for the VDR.&lt;br /&gt;
### END INIT INFO&lt;br /&gt;
#&lt;br /&gt;
# Author:            Helmar Gerloni &amp;lt;helmar@gerloni.net&amp;gt;&lt;br /&gt;
# Version:           2006-09-13&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin&lt;br /&gt;
DESC=&amp;quot;X-Server for VDR&amp;quot;&lt;br /&gt;
NAME=X4VDR&lt;br /&gt;
PIDFILE=/var/run/$NAME\.pid&lt;br /&gt;
SCRIPTNAME=/etc/init.d/$NAME&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
#       Function that starts X.&lt;br /&gt;
#&lt;br /&gt;
d_start() {&lt;br /&gt;
       vdr-sxfe --tcp --reconnect --syslog --fullscreen --video=xv xvdr://vdr.server.ip:37890 &amp;gt; /dev/null 2&amp;amp;&amp;gt;1 &amp;amp;&lt;br /&gt;
       start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --exec /usr/bin/X -- :0 vt7 -br -nolisten tcp&lt;br /&gt;
       if [ $? -gt 0 ]; then&lt;br /&gt;
               echo &amp;quot;Error starting X-Server.&amp;quot;&lt;br /&gt;
               exit $?&lt;br /&gt;
       fi&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
#       Function that stops X.&lt;br /&gt;
#&lt;br /&gt;
d_stop() {&lt;br /&gt;
       start-stop-daemon --stop --quiet --pidfile $PIDFILE&lt;br /&gt;
       if [ $? -gt 0 ]; then&lt;br /&gt;
               echo &amp;quot;Error stopping X-Server.&amp;quot;&lt;br /&gt;
       fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
case &amp;quot;$1&amp;quot; in&lt;br /&gt;
 start)&lt;br /&gt;
       echo -n &amp;quot;Starting $DESC: $NAME&amp;quot;&lt;br /&gt;
       d_start&lt;br /&gt;
       echo &amp;quot;.&amp;quot;&lt;br /&gt;
       ;;&lt;br /&gt;
 stop)&lt;br /&gt;
       echo -n &amp;quot;Stopping $DESC: $NAME&amp;quot;&lt;br /&gt;
       d_stop&lt;br /&gt;
       echo &amp;quot;.&amp;quot;&lt;br /&gt;
       ;;&lt;br /&gt;
*)&lt;br /&gt;
       echo &amp;quot;Usage: $SCRIPTNAME {start|stop|restart|force-reload}&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
       exit 1&lt;br /&gt;
       ;;&lt;br /&gt;
esac &lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Das Script ausführbar machen mit: &lt;br /&gt;
 chmod ug+x /etc/init.d/xorg&lt;br /&gt;
Das VDR Script startet nun den X-Server und zugleich vdr-sxfe. Zum starten und testen einfach: &lt;br /&gt;
 /etc/init.d/xorg start&lt;br /&gt;
eingeben&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
def quick_sort(arr):&lt;br /&gt;
	less = []&lt;br /&gt;
	pivot_list = []&lt;br /&gt;
	more = []&lt;br /&gt;
	if len(arr) &amp;lt;= 1:&lt;br /&gt;
		return arr&lt;br /&gt;
	else:&lt;br /&gt;
		pass&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Fernsehen_mit_der_XBOX_-_Installation_von_Xineliboutput_auf_der_xBox&amp;diff=261</id>
		<title>Fernsehen mit der XBOX - Installation von Xineliboutput auf der xBox</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Fernsehen_mit_der_XBOX_-_Installation_von_Xineliboutput_auf_der_xBox&amp;diff=261"/>
		<updated>2025-02-26T12:56:10Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Diese Anleitung orientiert sich an einem Wiki Eintrag und beschreibt die Installation von Xineliboutput mit Hilfe von Xebian auf der XBOX.==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Als erstes muss Xebian auf der XBOX installiert werden. Dazu benötigt ihr eine XBOX auf der unsignierte Software läuft. Das Image gibt es hier zum herunterladen. &lt;br /&gt;
&lt;br /&gt;
2. Debian Grundkonfiguration: &lt;br /&gt;
Nameserver anpassen: &lt;br /&gt;
 vim /etc/resolv.conf&lt;br /&gt;
Standard Software installieren: &lt;br /&gt;
 apt-get update&lt;br /&gt;
 apt-get install vim unp bzip2&lt;br /&gt;
 Exim4 entfernen, da Mailserver nicht benötigt wird: &lt;br /&gt;
 apt-get remove --purge exim4&lt;br /&gt;
Syntax Highlighting aktivieren: &lt;br /&gt;
 vim /etc/vim/vimrc&lt;br /&gt;
Die Zeile &lt;br /&gt;
 &amp;quot; syntax on&lt;br /&gt;
einkommentieren &lt;br /&gt;
 syntax on&lt;br /&gt;
Falls DHCP gewünscht wird müssen die Interfaces angepasst werden: &lt;br /&gt;
 vim /etc/network/interfaces&lt;br /&gt;
In diesem Fall muss das static in dhcp geändert werden, die 3 Zeilen darunter werden auskommentiert. &lt;br /&gt;
 vim /etc/apt/sources.list&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb http://ftp.at.debian.org/debian/ stable main contrib non-free&lt;br /&gt;
deb http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free&lt;br /&gt;
deb-src http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free&lt;br /&gt;
deb http://security.debian.org/ stable/updates main contrib non-free&lt;br /&gt;
deb-src http://security.debian.org/ stable/updates main contrib non-free&lt;br /&gt;
#Debian Multimedia&lt;br /&gt;
deb http://www.debian-multimedia.org etch main&lt;br /&gt;
deb-src http://debian-multimedia.org etch main&lt;br /&gt;
# VDR&lt;br /&gt;
deb http://e-tobi.net/vdr-experimental etch base addons vdr-multipatch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 apt-get update&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG NICHT: apt-get upgrade ausführen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Nun verbindet man sich am besten per SSH zur XBOX.&lt;br /&gt;
&lt;br /&gt;
3. XServer Installation: &lt;br /&gt;
 apt-get install xserver-xorg xineliboutput-sxfe xterm xfonts-base xfonts-base&lt;br /&gt;
 vim /etc/X11/xorg.conf&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
Section &amp;quot;Files&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/misc&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/misc&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/cyrillic&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/cyrillic&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/100dpi/:unscaled&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/100dpi/:unscaled&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/75dpi/:unscaled&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/75dpi/:unscaled&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/Type1&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/Type1&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/100dpi&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/100dpi&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/75dpi&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/75dpi&amp;quot;&lt;br /&gt;
# path to defoma fonts&lt;br /&gt;
FontPath        &amp;quot;/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType&amp;quot;&lt;br /&gt;
EndSection&lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Module&amp;quot;&lt;br /&gt;
Load    &amp;quot;bitmap&amp;quot;&lt;br /&gt;
Load    &amp;quot;dbe&amp;quot;&lt;br /&gt;
Load    &amp;quot;ddc&amp;quot;&lt;br /&gt;
Load    &amp;quot;dri&amp;quot;&lt;br /&gt;
Load    &amp;quot;extmod&amp;quot;&lt;br /&gt;
Load    &amp;quot;freetype&amp;quot;&lt;br /&gt;
Load    &amp;quot;glx&amp;quot;&lt;br /&gt;
Load    &amp;quot;int10&amp;quot;&lt;br /&gt;
Load    &amp;quot;record&amp;quot;&lt;br /&gt;
Load    &amp;quot;vbe&amp;quot;&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;InputDevice&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Generic Keyboard&amp;quot;&lt;br /&gt;
Driver          &amp;quot;kbd&amp;quot;&lt;br /&gt;
Option          &amp;quot;CoreKeyboard&amp;quot;&lt;br /&gt;
Option          &amp;quot;XkbRules&amp;quot;      &amp;quot;xorg&amp;quot;&lt;br /&gt;
Option          &amp;quot;XkbModel&amp;quot;      &amp;quot;pc105&amp;quot;&lt;br /&gt;
Option          &amp;quot;XkbLayout&amp;quot;     &amp;quot;us&amp;quot;&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;InputDevice&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Configured Mouse&amp;quot;&lt;br /&gt;
Driver          &amp;quot;mouse&amp;quot;&lt;br /&gt;
Option          &amp;quot;CorePointer&amp;quot;&lt;br /&gt;
Option          &amp;quot;Device&amp;quot;                &amp;quot;/dev/input/mice&amp;quot;&lt;br /&gt;
Option          &amp;quot;Protocol&amp;quot;              &amp;quot;ImPS/2&amp;quot;&lt;br /&gt;
Option          &amp;quot;Emulate3Buttons&amp;quot;       &amp;quot;true&amp;quot;&lt;br /&gt;
EndSection  &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Device&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;nVidia Corporation GeForce3 MX for XBox&amp;quot;&lt;br /&gt;
#       Driver          &amp;quot;nv&amp;quot;&lt;br /&gt;
Driver          &amp;quot;nvxbox&amp;quot;&lt;br /&gt;
Option          &amp;quot;UseFBDev&amp;quot;              &amp;quot;true&amp;quot;&lt;br /&gt;
Option          &amp;quot;HWCursor&amp;quot;              &amp;quot;false&amp;quot;&lt;br /&gt;
#       Option          &amp;quot;NoAccel&amp;quot;               &amp;quot;true&amp;quot;&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Device&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Frame Buffer&amp;quot;&lt;br /&gt;
Driver          &amp;quot;fbdev&amp;quot;&lt;br /&gt;
Option          &amp;quot;UseFBDev&amp;quot;              &amp;quot;true&amp;quot;&lt;br /&gt;
EndSection&lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Monitor&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Generic Monitor&amp;quot;&lt;br /&gt;
Option          &amp;quot;DPMS&amp;quot;&lt;br /&gt;
HorizSync       28-32&lt;br /&gt;
VertRefresh     43-60&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Screen&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Default Screen&amp;quot;&lt;br /&gt;
Device          &amp;quot;nVidia Corporation GeForce3 MX for XBox&amp;quot;&lt;br /&gt;
#       Device          &amp;quot;Frame Buffer&amp;quot;&lt;br /&gt;
Monitor         &amp;quot;Generic Monitor&amp;quot;&lt;br /&gt;
DefaultDepth    24&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           1&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           4&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           8&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           15&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           16&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           24&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;DRI&amp;quot;&lt;br /&gt;
Mode    0666&lt;br /&gt;
EndSection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
4. Init Skript anpassen: &lt;br /&gt;
 vim /etc/init.d/xorg&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#! /bin/sh&lt;br /&gt;
### BEGIN INIT INFO&lt;br /&gt;
# Provides:          X4VDR&lt;br /&gt;
# Required-Start:    $local_fs&lt;br /&gt;
# Required-Stop:     vdr&lt;br /&gt;
# Default-Start:     2&lt;br /&gt;
# Default-Stop:&lt;br /&gt;
# Short-Description: X-Server for VDR&lt;br /&gt;
# Description:       Starts the X-Server for the VDR.&lt;br /&gt;
### END INIT INFO&lt;br /&gt;
#&lt;br /&gt;
# Author:            Helmar Gerloni &amp;lt;helmar@gerloni.net&amp;gt;&lt;br /&gt;
# Version:           2006-09-13&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin&lt;br /&gt;
DESC=&amp;quot;X-Server for VDR&amp;quot;&lt;br /&gt;
NAME=X4VDR&lt;br /&gt;
PIDFILE=/var/run/$NAME\.pid&lt;br /&gt;
SCRIPTNAME=/etc/init.d/$NAME&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
#       Function that starts X.&lt;br /&gt;
#&lt;br /&gt;
d_start() {&lt;br /&gt;
       vdr-sxfe --tcp --reconnect --syslog --fullscreen --video=xv xvdr://vdr.server.ip:37890 &amp;gt; /dev/null 2&amp;amp;&amp;gt;1 &amp;amp;&lt;br /&gt;
       start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --exec /usr/bin/X -- :0 vt7 -br -nolisten tcp&lt;br /&gt;
       if [ $? -gt 0 ]; then&lt;br /&gt;
               echo &amp;quot;Error starting X-Server.&amp;quot;&lt;br /&gt;
               exit $?&lt;br /&gt;
       fi&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
#       Function that stops X.&lt;br /&gt;
#&lt;br /&gt;
d_stop() {&lt;br /&gt;
       start-stop-daemon --stop --quiet --pidfile $PIDFILE&lt;br /&gt;
       if [ $? -gt 0 ]; then&lt;br /&gt;
               echo &amp;quot;Error stopping X-Server.&amp;quot;&lt;br /&gt;
       fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
case &amp;quot;$1&amp;quot; in&lt;br /&gt;
 start)&lt;br /&gt;
       echo -n &amp;quot;Starting $DESC: $NAME&amp;quot;&lt;br /&gt;
       d_start&lt;br /&gt;
       echo &amp;quot;.&amp;quot;&lt;br /&gt;
       ;;&lt;br /&gt;
 stop)&lt;br /&gt;
       echo -n &amp;quot;Stopping $DESC: $NAME&amp;quot;&lt;br /&gt;
       d_stop&lt;br /&gt;
       echo &amp;quot;.&amp;quot;&lt;br /&gt;
       ;;&lt;br /&gt;
*)&lt;br /&gt;
       echo &amp;quot;Usage: $SCRIPTNAME {start|stop|restart|force-reload}&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
       exit 1&lt;br /&gt;
       ;;&lt;br /&gt;
esac &lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Das Script ausführbar machen mit: &lt;br /&gt;
 chmod ug+x /etc/init.d/xorg&lt;br /&gt;
Das VDR Script startet nun den X-Server und zugleich vdr-sxfe. Zum starten und testen einfach: &lt;br /&gt;
 /etc/init.d/xorg start&lt;br /&gt;
eingeben&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Fernsehen_mit_der_XBOX_-_Installation_von_Xineliboutput_auf_der_xBox&amp;diff=260</id>
		<title>Fernsehen mit der XBOX - Installation von Xineliboutput auf der xBox</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Fernsehen_mit_der_XBOX_-_Installation_von_Xineliboutput_auf_der_xBox&amp;diff=260"/>
		<updated>2025-02-26T12:55:54Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Diese Anleitung orientiert sich an einem Wiki Eintrag und beschreibt die Installation von Xineliboutput mit Hilfe von Xebian auf der XBOX.==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Als erstes muss Xebian auf der XBOX installiert werden. Dazu benötigt ihr eine XBOX auf der unsignierte Software läuft. Das Image gibt es hier zum herunterladen. &lt;br /&gt;
&lt;br /&gt;
2. Debian Grundkonfiguration: &lt;br /&gt;
Nameserver anpassen: &lt;br /&gt;
 vim /etc/resolv.conf&lt;br /&gt;
Standard Software installieren: &lt;br /&gt;
 apt-get update&lt;br /&gt;
 apt-get install vim unp bzip2&lt;br /&gt;
 Exim4 entfernen, da Mailserver nicht benötigt wird: &lt;br /&gt;
 apt-get remove --purge exim4&lt;br /&gt;
Syntax Highlighting aktivieren: &lt;br /&gt;
 vim /etc/vim/vimrc&lt;br /&gt;
Die Zeile &lt;br /&gt;
 &amp;quot; syntax on&lt;br /&gt;
einkommentieren &lt;br /&gt;
 syntax on&lt;br /&gt;
Falls DHCP gewünscht wird müssen die Interfaces angepasst werden: &lt;br /&gt;
 vim /etc/network/interfaces&lt;br /&gt;
In diesem Fall muss das static in dhcp geändert werden, die 3 Zeilen darunter werden auskommentiert. &lt;br /&gt;
 vim /etc/apt/sources.list&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
deb http://ftp.at.debian.org/debian/ stable main contrib non-free&lt;br /&gt;
deb http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free&lt;br /&gt;
deb-src http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free&lt;br /&gt;
deb http://security.debian.org/ stable/updates main contrib non-free&lt;br /&gt;
deb-src http://security.debian.org/ stable/updates main contrib non-free&lt;br /&gt;
#Debian Multimedia&lt;br /&gt;
deb http://www.debian-multimedia.org etch main&lt;br /&gt;
deb-src http://debian-multimedia.org etch main&lt;br /&gt;
# VDR&lt;br /&gt;
deb http://e-tobi.net/vdr-experimental etch base addons vdr-multipatch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 apt-get update&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG NICHT: apt-get upgrade ausführen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Nun verbindet man sich am besten per SSH zur XBOX.&lt;br /&gt;
&lt;br /&gt;
3. XServer Installation: &lt;br /&gt;
 apt-get install xserver-xorg xineliboutput-sxfe xterm xfonts-base xfonts-base&lt;br /&gt;
 vim /etc/X11/xorg.conf&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
Section &amp;quot;Files&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/misc&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/misc&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/cyrillic&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/cyrillic&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/100dpi/:unscaled&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/100dpi/:unscaled&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/75dpi/:unscaled&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/75dpi/:unscaled&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/Type1&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/Type1&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/100dpi&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/100dpi&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/75dpi&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/75dpi&amp;quot;&lt;br /&gt;
# path to defoma fonts&lt;br /&gt;
FontPath        &amp;quot;/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType&amp;quot;&lt;br /&gt;
EndSection&lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Module&amp;quot;&lt;br /&gt;
Load    &amp;quot;bitmap&amp;quot;&lt;br /&gt;
Load    &amp;quot;dbe&amp;quot;&lt;br /&gt;
Load    &amp;quot;ddc&amp;quot;&lt;br /&gt;
Load    &amp;quot;dri&amp;quot;&lt;br /&gt;
Load    &amp;quot;extmod&amp;quot;&lt;br /&gt;
Load    &amp;quot;freetype&amp;quot;&lt;br /&gt;
Load    &amp;quot;glx&amp;quot;&lt;br /&gt;
Load    &amp;quot;int10&amp;quot;&lt;br /&gt;
Load    &amp;quot;record&amp;quot;&lt;br /&gt;
Load    &amp;quot;vbe&amp;quot;&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;InputDevice&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Generic Keyboard&amp;quot;&lt;br /&gt;
Driver          &amp;quot;kbd&amp;quot;&lt;br /&gt;
Option          &amp;quot;CoreKeyboard&amp;quot;&lt;br /&gt;
Option          &amp;quot;XkbRules&amp;quot;      &amp;quot;xorg&amp;quot;&lt;br /&gt;
Option          &amp;quot;XkbModel&amp;quot;      &amp;quot;pc105&amp;quot;&lt;br /&gt;
Option          &amp;quot;XkbLayout&amp;quot;     &amp;quot;us&amp;quot;&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;InputDevice&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Configured Mouse&amp;quot;&lt;br /&gt;
Driver          &amp;quot;mouse&amp;quot;&lt;br /&gt;
Option          &amp;quot;CorePointer&amp;quot;&lt;br /&gt;
Option          &amp;quot;Device&amp;quot;                &amp;quot;/dev/input/mice&amp;quot;&lt;br /&gt;
Option          &amp;quot;Protocol&amp;quot;              &amp;quot;ImPS/2&amp;quot;&lt;br /&gt;
Option          &amp;quot;Emulate3Buttons&amp;quot;       &amp;quot;true&amp;quot;&lt;br /&gt;
EndSection  &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Device&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;nVidia Corporation GeForce3 MX for XBox&amp;quot;&lt;br /&gt;
#       Driver          &amp;quot;nv&amp;quot;&lt;br /&gt;
Driver          &amp;quot;nvxbox&amp;quot;&lt;br /&gt;
Option          &amp;quot;UseFBDev&amp;quot;              &amp;quot;true&amp;quot;&lt;br /&gt;
Option          &amp;quot;HWCursor&amp;quot;              &amp;quot;false&amp;quot;&lt;br /&gt;
#       Option          &amp;quot;NoAccel&amp;quot;               &amp;quot;true&amp;quot;&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Device&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Frame Buffer&amp;quot;&lt;br /&gt;
Driver          &amp;quot;fbdev&amp;quot;&lt;br /&gt;
Option          &amp;quot;UseFBDev&amp;quot;              &amp;quot;true&amp;quot;&lt;br /&gt;
EndSection&lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Monitor&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Generic Monitor&amp;quot;&lt;br /&gt;
Option          &amp;quot;DPMS&amp;quot;&lt;br /&gt;
HorizSync       28-32&lt;br /&gt;
VertRefresh     43-60&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Screen&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Default Screen&amp;quot;&lt;br /&gt;
Device          &amp;quot;nVidia Corporation GeForce3 MX for XBox&amp;quot;&lt;br /&gt;
#       Device          &amp;quot;Frame Buffer&amp;quot;&lt;br /&gt;
Monitor         &amp;quot;Generic Monitor&amp;quot;&lt;br /&gt;
DefaultDepth    24&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           1&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           4&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           8&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           15&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           16&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           24&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;DRI&amp;quot;&lt;br /&gt;
Mode    0666&lt;br /&gt;
EndSection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
4. Init Skript anpassen: &lt;br /&gt;
 vim /etc/init.d/xorg&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#! /bin/sh&lt;br /&gt;
### BEGIN INIT INFO&lt;br /&gt;
# Provides:          X4VDR&lt;br /&gt;
# Required-Start:    $local_fs&lt;br /&gt;
# Required-Stop:     vdr&lt;br /&gt;
# Default-Start:     2&lt;br /&gt;
# Default-Stop:&lt;br /&gt;
# Short-Description: X-Server for VDR&lt;br /&gt;
# Description:       Starts the X-Server for the VDR.&lt;br /&gt;
### END INIT INFO&lt;br /&gt;
#&lt;br /&gt;
# Author:            Helmar Gerloni &amp;lt;helmar@gerloni.net&amp;gt;&lt;br /&gt;
# Version:           2006-09-13&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin&lt;br /&gt;
DESC=&amp;quot;X-Server for VDR&amp;quot;&lt;br /&gt;
NAME=X4VDR&lt;br /&gt;
PIDFILE=/var/run/$NAME\.pid&lt;br /&gt;
SCRIPTNAME=/etc/init.d/$NAME&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
#       Function that starts X.&lt;br /&gt;
#&lt;br /&gt;
d_start() {&lt;br /&gt;
       vdr-sxfe --tcp --reconnect --syslog --fullscreen --video=xv xvdr://vdr.server.ip:37890 &amp;gt; /dev/null 2&amp;amp;&amp;gt;1 &amp;amp;&lt;br /&gt;
       start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --exec /usr/bin/X -- :0 vt7 -br -nolisten tcp&lt;br /&gt;
       if [ $? -gt 0 ]; then&lt;br /&gt;
               echo &amp;quot;Error starting X-Server.&amp;quot;&lt;br /&gt;
               exit $?&lt;br /&gt;
       fi&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
#       Function that stops X.&lt;br /&gt;
#&lt;br /&gt;
d_stop() {&lt;br /&gt;
       start-stop-daemon --stop --quiet --pidfile $PIDFILE&lt;br /&gt;
       if [ $? -gt 0 ]; then&lt;br /&gt;
               echo &amp;quot;Error stopping X-Server.&amp;quot;&lt;br /&gt;
       fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
case &amp;quot;$1&amp;quot; in&lt;br /&gt;
 start)&lt;br /&gt;
       echo -n &amp;quot;Starting $DESC: $NAME&amp;quot;&lt;br /&gt;
       d_start&lt;br /&gt;
       echo &amp;quot;.&amp;quot;&lt;br /&gt;
       ;;&lt;br /&gt;
 stop)&lt;br /&gt;
       echo -n &amp;quot;Stopping $DESC: $NAME&amp;quot;&lt;br /&gt;
       d_stop&lt;br /&gt;
       echo &amp;quot;.&amp;quot;&lt;br /&gt;
       ;;&lt;br /&gt;
*)&lt;br /&gt;
       echo &amp;quot;Usage: $SCRIPTNAME {start|stop|restart|force-reload}&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
       exit 1&lt;br /&gt;
       ;;&lt;br /&gt;
esac &lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Das Script ausführbar machen mit: &lt;br /&gt;
 chmod ug+x /etc/init.d/xorg&lt;br /&gt;
Das VDR Script startet nun den X-Server und zugleich vdr-sxfe. Zum starten und testen einfach: &lt;br /&gt;
 /etc/init.d/xorg start&lt;br /&gt;
eingeben&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Fernsehen_mit_der_XBOX_-_Installation_von_Xineliboutput_auf_der_xBox&amp;diff=259</id>
		<title>Fernsehen mit der XBOX - Installation von Xineliboutput auf der xBox</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Fernsehen_mit_der_XBOX_-_Installation_von_Xineliboutput_auf_der_xBox&amp;diff=259"/>
		<updated>2025-02-26T12:50:30Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Diese Anleitung orientiert sich an einem Wiki Eintrag und beschreibt die Installation von Xineliboutput mit Hilfe von Xebian auf der XBOX.==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Als erstes muss Xebian auf der XBOX installiert werden. Dazu benötigt ihr eine XBOX auf der unsignierte Software läuft. Das Image gibt es hier zum herunterladen. &lt;br /&gt;
&lt;br /&gt;
2. Debian Grundkonfiguration: &lt;br /&gt;
Nameserver anpassen: &lt;br /&gt;
 vim /etc/resolv.conf&lt;br /&gt;
Standard Software installieren: &lt;br /&gt;
 apt-get update&lt;br /&gt;
 apt-get install vim unp bzip2&lt;br /&gt;
 Exim4 entfernen, da Mailserver nicht benötigt wird: &lt;br /&gt;
 apt-get remove --purge exim4&lt;br /&gt;
Syntax Highlighting aktivieren: &lt;br /&gt;
 vim /etc/vim/vimrc&lt;br /&gt;
Die Zeile &lt;br /&gt;
 &amp;quot; syntax on&lt;br /&gt;
einkommentieren &lt;br /&gt;
 syntax on&lt;br /&gt;
Falls DHCP gewünscht wird müssen die Interfaces angepasst werden: &lt;br /&gt;
 vim /etc/network/interfaces&lt;br /&gt;
In diesem Fall muss das static in dhcp geändert werden, die 3 Zeilen darunter werden auskommentiert. &lt;br /&gt;
 vim /etc/apt/sources.list&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
deb http://ftp.at.debian.org/debian/ stable main contrib non-free&lt;br /&gt;
deb http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free&lt;br /&gt;
deb-src http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free&lt;br /&gt;
deb http://security.debian.org/ stable/updates main contrib non-free&lt;br /&gt;
deb-src http://security.debian.org/ stable/updates main contrib non-free&lt;br /&gt;
#Debian Multimedia&lt;br /&gt;
deb http://www.debian-multimedia.org etch main&lt;br /&gt;
deb-src http://debian-multimedia.org etch main&lt;br /&gt;
# VDR&lt;br /&gt;
deb http://e-tobi.net/vdr-experimental etch base addons vdr-multipatch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 apt-get update&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG NICHT: apt-get upgrade ausführen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Nun verbindet man sich am besten per SSH zur XBOX.&lt;br /&gt;
&lt;br /&gt;
3. XServer Installation: &lt;br /&gt;
 apt-get install xserver-xorg xineliboutput-sxfe xterm xfonts-base xfonts-base&lt;br /&gt;
 vim /etc/X11/xorg.conf&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
Section &amp;quot;Files&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/misc&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/misc&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/cyrillic&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/cyrillic&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/100dpi/:unscaled&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/100dpi/:unscaled&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/75dpi/:unscaled&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/75dpi/:unscaled&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/Type1&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/Type1&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/100dpi&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/100dpi&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/75dpi&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/75dpi&amp;quot;&lt;br /&gt;
# path to defoma fonts&lt;br /&gt;
FontPath        &amp;quot;/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType&amp;quot;&lt;br /&gt;
EndSection&lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Module&amp;quot;&lt;br /&gt;
Load    &amp;quot;bitmap&amp;quot;&lt;br /&gt;
Load    &amp;quot;dbe&amp;quot;&lt;br /&gt;
Load    &amp;quot;ddc&amp;quot;&lt;br /&gt;
Load    &amp;quot;dri&amp;quot;&lt;br /&gt;
Load    &amp;quot;extmod&amp;quot;&lt;br /&gt;
Load    &amp;quot;freetype&amp;quot;&lt;br /&gt;
Load    &amp;quot;glx&amp;quot;&lt;br /&gt;
Load    &amp;quot;int10&amp;quot;&lt;br /&gt;
Load    &amp;quot;record&amp;quot;&lt;br /&gt;
Load    &amp;quot;vbe&amp;quot;&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;InputDevice&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Generic Keyboard&amp;quot;&lt;br /&gt;
Driver          &amp;quot;kbd&amp;quot;&lt;br /&gt;
Option          &amp;quot;CoreKeyboard&amp;quot;&lt;br /&gt;
Option          &amp;quot;XkbRules&amp;quot;      &amp;quot;xorg&amp;quot;&lt;br /&gt;
Option          &amp;quot;XkbModel&amp;quot;      &amp;quot;pc105&amp;quot;&lt;br /&gt;
Option          &amp;quot;XkbLayout&amp;quot;     &amp;quot;us&amp;quot;&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;InputDevice&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Configured Mouse&amp;quot;&lt;br /&gt;
Driver          &amp;quot;mouse&amp;quot;&lt;br /&gt;
Option          &amp;quot;CorePointer&amp;quot;&lt;br /&gt;
Option          &amp;quot;Device&amp;quot;                &amp;quot;/dev/input/mice&amp;quot;&lt;br /&gt;
Option          &amp;quot;Protocol&amp;quot;              &amp;quot;ImPS/2&amp;quot;&lt;br /&gt;
Option          &amp;quot;Emulate3Buttons&amp;quot;       &amp;quot;true&amp;quot;&lt;br /&gt;
EndSection  &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Device&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;nVidia Corporation GeForce3 MX for XBox&amp;quot;&lt;br /&gt;
#       Driver          &amp;quot;nv&amp;quot;&lt;br /&gt;
Driver          &amp;quot;nvxbox&amp;quot;&lt;br /&gt;
Option          &amp;quot;UseFBDev&amp;quot;              &amp;quot;true&amp;quot;&lt;br /&gt;
Option          &amp;quot;HWCursor&amp;quot;              &amp;quot;false&amp;quot;&lt;br /&gt;
#       Option          &amp;quot;NoAccel&amp;quot;               &amp;quot;true&amp;quot;&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Device&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Frame Buffer&amp;quot;&lt;br /&gt;
Driver          &amp;quot;fbdev&amp;quot;&lt;br /&gt;
Option          &amp;quot;UseFBDev&amp;quot;              &amp;quot;true&amp;quot;&lt;br /&gt;
EndSection&lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Monitor&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Generic Monitor&amp;quot;&lt;br /&gt;
Option          &amp;quot;DPMS&amp;quot;&lt;br /&gt;
HorizSync       28-32&lt;br /&gt;
VertRefresh     43-60&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Screen&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Default Screen&amp;quot;&lt;br /&gt;
Device          &amp;quot;nVidia Corporation GeForce3 MX for XBox&amp;quot;&lt;br /&gt;
#       Device          &amp;quot;Frame Buffer&amp;quot;&lt;br /&gt;
Monitor         &amp;quot;Generic Monitor&amp;quot;&lt;br /&gt;
DefaultDepth    24&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           1&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           4&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           8&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           15&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           16&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           24&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;DRI&amp;quot;&lt;br /&gt;
Mode    0666&lt;br /&gt;
EndSection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
4. Init Skript anpassen: &lt;br /&gt;
 vim /etc/init.d/xorg&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#! /bin/sh&lt;br /&gt;
### BEGIN INIT INFO&lt;br /&gt;
# Provides:          X4VDR&lt;br /&gt;
# Required-Start:    $local_fs&lt;br /&gt;
# Required-Stop:     vdr&lt;br /&gt;
# Default-Start:     2&lt;br /&gt;
# Default-Stop:&lt;br /&gt;
# Short-Description: X-Server for VDR&lt;br /&gt;
# Description:       Starts the X-Server for the VDR.&lt;br /&gt;
### END INIT INFO&lt;br /&gt;
#&lt;br /&gt;
# Author:            Helmar Gerloni &amp;lt;helmar@gerloni.net&amp;gt;&lt;br /&gt;
# Version:           2006-09-13&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin&lt;br /&gt;
DESC=&amp;quot;X-Server for VDR&amp;quot;&lt;br /&gt;
NAME=X4VDR&lt;br /&gt;
PIDFILE=/var/run/$NAME\.pid&lt;br /&gt;
SCRIPTNAME=/etc/init.d/$NAME&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
#       Function that starts X.&lt;br /&gt;
#&lt;br /&gt;
d_start() {&lt;br /&gt;
       vdr-sxfe --tcp --reconnect --syslog --fullscreen --video=xv xvdr://vdr.server.ip:37890 &amp;gt; /dev/null 2&amp;amp;&amp;gt;1 &amp;amp;&lt;br /&gt;
       start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --exec /usr/bin/X -- :0 vt7 -br -nolisten tcp&lt;br /&gt;
       if [ $? -gt 0 ]; then&lt;br /&gt;
               echo &amp;quot;Error starting X-Server.&amp;quot;&lt;br /&gt;
               exit $?&lt;br /&gt;
       fi&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
#       Function that stops X.&lt;br /&gt;
#&lt;br /&gt;
d_stop() {&lt;br /&gt;
       start-stop-daemon --stop --quiet --pidfile $PIDFILE&lt;br /&gt;
       if [ $? -gt 0 ]; then&lt;br /&gt;
               echo &amp;quot;Error stopping X-Server.&amp;quot;&lt;br /&gt;
       fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
case &amp;quot;$1&amp;quot; in&lt;br /&gt;
 start)&lt;br /&gt;
       echo -n &amp;quot;Starting $DESC: $NAME&amp;quot;&lt;br /&gt;
       d_start&lt;br /&gt;
       echo &amp;quot;.&amp;quot;&lt;br /&gt;
       ;;&lt;br /&gt;
 stop)&lt;br /&gt;
       echo -n &amp;quot;Stopping $DESC: $NAME&amp;quot;&lt;br /&gt;
       d_stop&lt;br /&gt;
       echo &amp;quot;.&amp;quot;&lt;br /&gt;
       ;;&lt;br /&gt;
*)&lt;br /&gt;
       echo &amp;quot;Usage: $SCRIPTNAME {start|stop|restart|force-reload}&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
       exit 1&lt;br /&gt;
       ;;&lt;br /&gt;
esac &lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Das Script ausführbar machen mit: &lt;br /&gt;
 chmod ug+x /etc/init.d/xorg&lt;br /&gt;
Das VDR Script startet nun den X-Server und zugleich vdr-sxfe. Zum starten und testen einfach: &lt;br /&gt;
 /etc/init.d/xorg start&lt;br /&gt;
eingeben&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Fernsehen_mit_der_XBOX_-_Installation_von_Xineliboutput_auf_der_xBox&amp;diff=258</id>
		<title>Fernsehen mit der XBOX - Installation von Xineliboutput auf der xBox</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Fernsehen_mit_der_XBOX_-_Installation_von_Xineliboutput_auf_der_xBox&amp;diff=258"/>
		<updated>2025-02-26T12:49:52Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Diese Anleitung orientiert sich an einem Wiki Eintrag und beschreibt die Installation von Xineliboutput mit Hilfe von Xebian auf der XBOX.==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Als erstes muss Xebian auf der XBOX installiert werden. Dazu benötigt ihr eine XBOX auf der unsignierte Software läuft. Das Image gibt es hier zum herunterladen. &lt;br /&gt;
&lt;br /&gt;
2. Debian Grundkonfiguration: &lt;br /&gt;
Nameserver anpassen: &lt;br /&gt;
 vim /etc/resolv.conf&lt;br /&gt;
Standard Software installieren: &lt;br /&gt;
 apt-get update&lt;br /&gt;
 apt-get install vim unp bzip2&lt;br /&gt;
 Exim4 entfernen, da Mailserver nicht benötigt wird: &lt;br /&gt;
 apt-get remove --purge exim4&lt;br /&gt;
Syntax Highlighting aktivieren: &lt;br /&gt;
 vim /etc/vim/vimrc&lt;br /&gt;
Die Zeile &lt;br /&gt;
 &amp;quot; syntax on&lt;br /&gt;
einkommentieren &lt;br /&gt;
 syntax on&lt;br /&gt;
Falls DHCP gewünscht wird müssen die Interfaces angepasst werden: &lt;br /&gt;
 vim /etc/network/interfaces&lt;br /&gt;
In diesem Fall muss das static in dhcp geändert werden, die 3 Zeilen darunter werden auskommentiert. &lt;br /&gt;
 vim /etc/apt/sources.list&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot; line&amp;gt;&lt;br /&gt;
deb http://ftp.at.debian.org/debian/ stable main contrib non-free&lt;br /&gt;
deb http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free&lt;br /&gt;
deb-src http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free&lt;br /&gt;
deb http://security.debian.org/ stable/updates main contrib non-free&lt;br /&gt;
deb-src http://security.debian.org/ stable/updates main contrib non-free&lt;br /&gt;
#Debian Multimedia&lt;br /&gt;
deb http://www.debian-multimedia.org etch main&lt;br /&gt;
deb-src http://debian-multimedia.org etch main&lt;br /&gt;
# VDR&lt;br /&gt;
deb http://e-tobi.net/vdr-experimental etch base addons vdr-multipatch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 apt-get update&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG NICHT: apt-get upgrade ausführen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Nun verbindet man sich am besten per SSH zur XBOX.&lt;br /&gt;
&lt;br /&gt;
3. XServer Installation: &lt;br /&gt;
 apt-get install xserver-xorg xineliboutput-sxfe xterm xfonts-base xfonts-base&lt;br /&gt;
 vim /etc/X11/xorg.conf&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
Section &amp;quot;Files&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/misc&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/misc&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/cyrillic&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/cyrillic&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/100dpi/:unscaled&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/100dpi/:unscaled&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/75dpi/:unscaled&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/75dpi/:unscaled&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/Type1&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/Type1&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/100dpi&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/100dpi&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/75dpi&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/75dpi&amp;quot;&lt;br /&gt;
# path to defoma fonts&lt;br /&gt;
FontPath        &amp;quot;/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType&amp;quot;&lt;br /&gt;
EndSection&lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Module&amp;quot;&lt;br /&gt;
Load    &amp;quot;bitmap&amp;quot;&lt;br /&gt;
Load    &amp;quot;dbe&amp;quot;&lt;br /&gt;
Load    &amp;quot;ddc&amp;quot;&lt;br /&gt;
Load    &amp;quot;dri&amp;quot;&lt;br /&gt;
Load    &amp;quot;extmod&amp;quot;&lt;br /&gt;
Load    &amp;quot;freetype&amp;quot;&lt;br /&gt;
Load    &amp;quot;glx&amp;quot;&lt;br /&gt;
Load    &amp;quot;int10&amp;quot;&lt;br /&gt;
Load    &amp;quot;record&amp;quot;&lt;br /&gt;
Load    &amp;quot;vbe&amp;quot;&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;InputDevice&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Generic Keyboard&amp;quot;&lt;br /&gt;
Driver          &amp;quot;kbd&amp;quot;&lt;br /&gt;
Option          &amp;quot;CoreKeyboard&amp;quot;&lt;br /&gt;
Option          &amp;quot;XkbRules&amp;quot;      &amp;quot;xorg&amp;quot;&lt;br /&gt;
Option          &amp;quot;XkbModel&amp;quot;      &amp;quot;pc105&amp;quot;&lt;br /&gt;
Option          &amp;quot;XkbLayout&amp;quot;     &amp;quot;us&amp;quot;&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;InputDevice&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Configured Mouse&amp;quot;&lt;br /&gt;
Driver          &amp;quot;mouse&amp;quot;&lt;br /&gt;
Option          &amp;quot;CorePointer&amp;quot;&lt;br /&gt;
Option          &amp;quot;Device&amp;quot;                &amp;quot;/dev/input/mice&amp;quot;&lt;br /&gt;
Option          &amp;quot;Protocol&amp;quot;              &amp;quot;ImPS/2&amp;quot;&lt;br /&gt;
Option          &amp;quot;Emulate3Buttons&amp;quot;       &amp;quot;true&amp;quot;&lt;br /&gt;
EndSection  &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Device&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;nVidia Corporation GeForce3 MX for XBox&amp;quot;&lt;br /&gt;
#       Driver          &amp;quot;nv&amp;quot;&lt;br /&gt;
Driver          &amp;quot;nvxbox&amp;quot;&lt;br /&gt;
Option          &amp;quot;UseFBDev&amp;quot;              &amp;quot;true&amp;quot;&lt;br /&gt;
Option          &amp;quot;HWCursor&amp;quot;              &amp;quot;false&amp;quot;&lt;br /&gt;
#       Option          &amp;quot;NoAccel&amp;quot;               &amp;quot;true&amp;quot;&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Device&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Frame Buffer&amp;quot;&lt;br /&gt;
Driver          &amp;quot;fbdev&amp;quot;&lt;br /&gt;
Option          &amp;quot;UseFBDev&amp;quot;              &amp;quot;true&amp;quot;&lt;br /&gt;
EndSection&lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Monitor&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Generic Monitor&amp;quot;&lt;br /&gt;
Option          &amp;quot;DPMS&amp;quot;&lt;br /&gt;
HorizSync       28-32&lt;br /&gt;
VertRefresh     43-60&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Screen&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Default Screen&amp;quot;&lt;br /&gt;
Device          &amp;quot;nVidia Corporation GeForce3 MX for XBox&amp;quot;&lt;br /&gt;
#       Device          &amp;quot;Frame Buffer&amp;quot;&lt;br /&gt;
Monitor         &amp;quot;Generic Monitor&amp;quot;&lt;br /&gt;
DefaultDepth    24&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           1&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           4&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           8&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           15&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           16&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           24&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;DRI&amp;quot;&lt;br /&gt;
Mode    0666&lt;br /&gt;
EndSection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
4. Init Skript anpassen: &lt;br /&gt;
 vim /etc/init.d/xorg&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#! /bin/sh&lt;br /&gt;
### BEGIN INIT INFO&lt;br /&gt;
# Provides:          X4VDR&lt;br /&gt;
# Required-Start:    $local_fs&lt;br /&gt;
# Required-Stop:     vdr&lt;br /&gt;
# Default-Start:     2&lt;br /&gt;
# Default-Stop:&lt;br /&gt;
# Short-Description: X-Server for VDR&lt;br /&gt;
# Description:       Starts the X-Server for the VDR.&lt;br /&gt;
### END INIT INFO&lt;br /&gt;
#&lt;br /&gt;
# Author:            Helmar Gerloni &amp;lt;helmar@gerloni.net&amp;gt;&lt;br /&gt;
# Version:           2006-09-13&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin&lt;br /&gt;
DESC=&amp;quot;X-Server for VDR&amp;quot;&lt;br /&gt;
NAME=X4VDR&lt;br /&gt;
PIDFILE=/var/run/$NAME\.pid&lt;br /&gt;
SCRIPTNAME=/etc/init.d/$NAME&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
#       Function that starts X.&lt;br /&gt;
#&lt;br /&gt;
d_start() {&lt;br /&gt;
       vdr-sxfe --tcp --reconnect --syslog --fullscreen --video=xv xvdr://vdr.server.ip:37890 &amp;gt; /dev/null 2&amp;amp;&amp;gt;1 &amp;amp;&lt;br /&gt;
       start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --exec /usr/bin/X -- :0 vt7 -br -nolisten tcp&lt;br /&gt;
       if [ $? -gt 0 ]; then&lt;br /&gt;
               echo &amp;quot;Error starting X-Server.&amp;quot;&lt;br /&gt;
               exit $?&lt;br /&gt;
       fi&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
#       Function that stops X.&lt;br /&gt;
#&lt;br /&gt;
d_stop() {&lt;br /&gt;
       start-stop-daemon --stop --quiet --pidfile $PIDFILE&lt;br /&gt;
       if [ $? -gt 0 ]; then&lt;br /&gt;
               echo &amp;quot;Error stopping X-Server.&amp;quot;&lt;br /&gt;
       fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
case &amp;quot;$1&amp;quot; in&lt;br /&gt;
 start)&lt;br /&gt;
       echo -n &amp;quot;Starting $DESC: $NAME&amp;quot;&lt;br /&gt;
       d_start&lt;br /&gt;
       echo &amp;quot;.&amp;quot;&lt;br /&gt;
       ;;&lt;br /&gt;
 stop)&lt;br /&gt;
       echo -n &amp;quot;Stopping $DESC: $NAME&amp;quot;&lt;br /&gt;
       d_stop&lt;br /&gt;
       echo &amp;quot;.&amp;quot;&lt;br /&gt;
       ;;&lt;br /&gt;
*)&lt;br /&gt;
       echo &amp;quot;Usage: $SCRIPTNAME {start|stop|restart|force-reload}&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
       exit 1&lt;br /&gt;
       ;;&lt;br /&gt;
esac &lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Das Script ausführbar machen mit: &lt;br /&gt;
 chmod ug+x /etc/init.d/xorg&lt;br /&gt;
Das VDR Script startet nun den X-Server und zugleich vdr-sxfe. Zum starten und testen einfach: &lt;br /&gt;
 /etc/init.d/xorg start&lt;br /&gt;
eingeben&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Fernsehen_mit_der_XBOX_-_Installation_von_Xineliboutput_auf_der_xBox&amp;diff=257</id>
		<title>Fernsehen mit der XBOX - Installation von Xineliboutput auf der xBox</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Fernsehen_mit_der_XBOX_-_Installation_von_Xineliboutput_auf_der_xBox&amp;diff=257"/>
		<updated>2025-02-26T12:49:00Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Diese Anleitung orientiert sich an einem Wiki Eintrag und beschreibt die Installation von Xineliboutput mit Hilfe von Xebian auf der XBOX.==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Als erstes muss Xebian auf der XBOX installiert werden. Dazu benötigt ihr eine XBOX auf der unsignierte Software läuft. Das Image gibt es hier zum herunterladen. &lt;br /&gt;
&lt;br /&gt;
2. Debian Grundkonfiguration: &lt;br /&gt;
Nameserver anpassen: &lt;br /&gt;
 vim /etc/resolv.conf&lt;br /&gt;
Standard Software installieren: &lt;br /&gt;
 apt-get update&lt;br /&gt;
 apt-get install vim unp bzip2&lt;br /&gt;
 Exim4 entfernen, da Mailserver nicht benötigt wird: &lt;br /&gt;
 apt-get remove --purge exim4&lt;br /&gt;
Syntax Highlighting aktivieren: &lt;br /&gt;
 vim /etc/vim/vimrc&lt;br /&gt;
Die Zeile &lt;br /&gt;
 &amp;quot; syntax on&lt;br /&gt;
einkommentieren &lt;br /&gt;
 syntax on&lt;br /&gt;
Falls DHCP gewünscht wird müssen die Interfaces angepasst werden: &lt;br /&gt;
 vim /etc/network/interfaces&lt;br /&gt;
In diesem Fall muss das static in dhcp geändert werden, die 3 Zeilen darunter werden auskommentiert. &lt;br /&gt;
 vim /etc/apt/sources.list&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
deb http://ftp.at.debian.org/debian/ stable main contrib non-free&lt;br /&gt;
deb http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free&lt;br /&gt;
deb-src http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free&lt;br /&gt;
deb http://security.debian.org/ stable/updates main contrib non-free&lt;br /&gt;
deb-src http://security.debian.org/ stable/updates main contrib non-free&lt;br /&gt;
#Debian Multimedia&lt;br /&gt;
deb http://www.debian-multimedia.org etch main&lt;br /&gt;
deb-src http://debian-multimedia.org etch main&lt;br /&gt;
# VDR&lt;br /&gt;
deb http://e-tobi.net/vdr-experimental etch base addons vdr-multipatch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 apt-get update&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG NICHT: apt-get upgrade ausführen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Nun verbindet man sich am besten per SSH zur XBOX.&lt;br /&gt;
&lt;br /&gt;
3. XServer Installation: &lt;br /&gt;
 apt-get install xserver-xorg xineliboutput-sxfe xterm xfonts-base xfonts-base&lt;br /&gt;
 vim /etc/X11/xorg.conf&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
Section &amp;quot;Files&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/misc&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/misc&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/cyrillic&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/cyrillic&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/100dpi/:unscaled&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/100dpi/:unscaled&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/75dpi/:unscaled&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/75dpi/:unscaled&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/Type1&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/Type1&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/100dpi&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/100dpi&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/share/fonts/X11/75dpi&amp;quot;&lt;br /&gt;
FontPath        &amp;quot;/usr/X11R6/lib/X11/fonts/75dpi&amp;quot;&lt;br /&gt;
# path to defoma fonts&lt;br /&gt;
FontPath        &amp;quot;/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType&amp;quot;&lt;br /&gt;
EndSection&lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Module&amp;quot;&lt;br /&gt;
Load    &amp;quot;bitmap&amp;quot;&lt;br /&gt;
Load    &amp;quot;dbe&amp;quot;&lt;br /&gt;
Load    &amp;quot;ddc&amp;quot;&lt;br /&gt;
Load    &amp;quot;dri&amp;quot;&lt;br /&gt;
Load    &amp;quot;extmod&amp;quot;&lt;br /&gt;
Load    &amp;quot;freetype&amp;quot;&lt;br /&gt;
Load    &amp;quot;glx&amp;quot;&lt;br /&gt;
Load    &amp;quot;int10&amp;quot;&lt;br /&gt;
Load    &amp;quot;record&amp;quot;&lt;br /&gt;
Load    &amp;quot;vbe&amp;quot;&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;InputDevice&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Generic Keyboard&amp;quot;&lt;br /&gt;
Driver          &amp;quot;kbd&amp;quot;&lt;br /&gt;
Option          &amp;quot;CoreKeyboard&amp;quot;&lt;br /&gt;
Option          &amp;quot;XkbRules&amp;quot;      &amp;quot;xorg&amp;quot;&lt;br /&gt;
Option          &amp;quot;XkbModel&amp;quot;      &amp;quot;pc105&amp;quot;&lt;br /&gt;
Option          &amp;quot;XkbLayout&amp;quot;     &amp;quot;us&amp;quot;&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;InputDevice&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Configured Mouse&amp;quot;&lt;br /&gt;
Driver          &amp;quot;mouse&amp;quot;&lt;br /&gt;
Option          &amp;quot;CorePointer&amp;quot;&lt;br /&gt;
Option          &amp;quot;Device&amp;quot;                &amp;quot;/dev/input/mice&amp;quot;&lt;br /&gt;
Option          &amp;quot;Protocol&amp;quot;              &amp;quot;ImPS/2&amp;quot;&lt;br /&gt;
Option          &amp;quot;Emulate3Buttons&amp;quot;       &amp;quot;true&amp;quot;&lt;br /&gt;
EndSection  &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Device&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;nVidia Corporation GeForce3 MX for XBox&amp;quot;&lt;br /&gt;
#       Driver          &amp;quot;nv&amp;quot;&lt;br /&gt;
Driver          &amp;quot;nvxbox&amp;quot;&lt;br /&gt;
Option          &amp;quot;UseFBDev&amp;quot;              &amp;quot;true&amp;quot;&lt;br /&gt;
Option          &amp;quot;HWCursor&amp;quot;              &amp;quot;false&amp;quot;&lt;br /&gt;
#       Option          &amp;quot;NoAccel&amp;quot;               &amp;quot;true&amp;quot;&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Device&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Frame Buffer&amp;quot;&lt;br /&gt;
Driver          &amp;quot;fbdev&amp;quot;&lt;br /&gt;
Option          &amp;quot;UseFBDev&amp;quot;              &amp;quot;true&amp;quot;&lt;br /&gt;
EndSection&lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Monitor&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Generic Monitor&amp;quot;&lt;br /&gt;
Option          &amp;quot;DPMS&amp;quot;&lt;br /&gt;
HorizSync       28-32&lt;br /&gt;
VertRefresh     43-60&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Screen&amp;quot;&lt;br /&gt;
Identifier      &amp;quot;Default Screen&amp;quot;&lt;br /&gt;
Device          &amp;quot;nVidia Corporation GeForce3 MX for XBox&amp;quot;&lt;br /&gt;
#       Device          &amp;quot;Frame Buffer&amp;quot;&lt;br /&gt;
Monitor         &amp;quot;Generic Monitor&amp;quot;&lt;br /&gt;
DefaultDepth    24&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           1&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           4&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           8&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           15&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           16&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
SubSection &amp;quot;Display&amp;quot;&lt;br /&gt;
Depth           24&lt;br /&gt;
Modes           &amp;quot;640x480&amp;quot;&lt;br /&gt;
EndSubSection&lt;br /&gt;
EndSection &lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;DRI&amp;quot;&lt;br /&gt;
Mode    0666&lt;br /&gt;
EndSection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
4. Init Skript anpassen: &lt;br /&gt;
 vim /etc/init.d/xorg&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#! /bin/sh&lt;br /&gt;
### BEGIN INIT INFO&lt;br /&gt;
# Provides:          X4VDR&lt;br /&gt;
# Required-Start:    $local_fs&lt;br /&gt;
# Required-Stop:     vdr&lt;br /&gt;
# Default-Start:     2&lt;br /&gt;
# Default-Stop:&lt;br /&gt;
# Short-Description: X-Server for VDR&lt;br /&gt;
# Description:       Starts the X-Server for the VDR.&lt;br /&gt;
### END INIT INFO&lt;br /&gt;
#&lt;br /&gt;
# Author:            Helmar Gerloni &amp;lt;helmar@gerloni.net&amp;gt;&lt;br /&gt;
# Version:           2006-09-13&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin&lt;br /&gt;
DESC=&amp;quot;X-Server for VDR&amp;quot;&lt;br /&gt;
NAME=X4VDR&lt;br /&gt;
PIDFILE=/var/run/$NAME\.pid&lt;br /&gt;
SCRIPTNAME=/etc/init.d/$NAME&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
#       Function that starts X.&lt;br /&gt;
#&lt;br /&gt;
d_start() {&lt;br /&gt;
       vdr-sxfe --tcp --reconnect --syslog --fullscreen --video=xv xvdr://vdr.server.ip:37890 &amp;gt; /dev/null 2&amp;amp;&amp;gt;1 &amp;amp;&lt;br /&gt;
       start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --exec /usr/bin/X -- :0 vt7 -br -nolisten tcp&lt;br /&gt;
       if [ $? -gt 0 ]; then&lt;br /&gt;
               echo &amp;quot;Error starting X-Server.&amp;quot;&lt;br /&gt;
               exit $?&lt;br /&gt;
       fi&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
#       Function that stops X.&lt;br /&gt;
#&lt;br /&gt;
d_stop() {&lt;br /&gt;
       start-stop-daemon --stop --quiet --pidfile $PIDFILE&lt;br /&gt;
       if [ $? -gt 0 ]; then&lt;br /&gt;
               echo &amp;quot;Error stopping X-Server.&amp;quot;&lt;br /&gt;
       fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
case &amp;quot;$1&amp;quot; in&lt;br /&gt;
 start)&lt;br /&gt;
       echo -n &amp;quot;Starting $DESC: $NAME&amp;quot;&lt;br /&gt;
       d_start&lt;br /&gt;
       echo &amp;quot;.&amp;quot;&lt;br /&gt;
       ;;&lt;br /&gt;
 stop)&lt;br /&gt;
       echo -n &amp;quot;Stopping $DESC: $NAME&amp;quot;&lt;br /&gt;
       d_stop&lt;br /&gt;
       echo &amp;quot;.&amp;quot;&lt;br /&gt;
       ;;&lt;br /&gt;
*)&lt;br /&gt;
       echo &amp;quot;Usage: $SCRIPTNAME {start|stop|restart|force-reload}&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
       exit 1&lt;br /&gt;
       ;;&lt;br /&gt;
esac &lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Das Script ausführbar machen mit: &lt;br /&gt;
 chmod ug+x /etc/init.d/xorg&lt;br /&gt;
Das VDR Script startet nun den X-Server und zugleich vdr-sxfe. Zum starten und testen einfach: &lt;br /&gt;
 /etc/init.d/xorg start&lt;br /&gt;
eingeben&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Arduino_Printer_Control_(St%C3%A4dtische_B%C3%BChnen_M%C3%BCnster)&amp;diff=256</id>
		<title>Arduino Printer Control (Städtische Bühnen Münster)</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Arduino_Printer_Control_(St%C3%A4dtische_B%C3%BChnen_M%C3%BCnster)&amp;diff=256"/>
		<updated>2025-02-25T14:47:02Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Einleitung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Einleitung=&lt;br /&gt;
Für die Aufführung der &amp;quot;Winterreise&amp;quot; von Elfriede Jelinek mussten 40 Drucker gleichzeitig angesteuert werden. Ich habe dafür eine Schaltung entwickelt, die es ermöglicht alle Drucker gleichzeitig anzusteuern. Im &amp;quot;Herzen&amp;quot; der Schaltung befindet sich ein Arduino Mega 2560. Dieser steuert an den IO-Ports die seriellen Printer Module vom Typ: BAS-120 an. Die Drucker werden über ein MIDI Keyboard angesprochen. So habe ich jeder Taste auf dem Keyboard einem Drucker zugeordnet. Über spezielle Tasten ist es möglich alle Drucker anzusprechen.&lt;br /&gt;
&lt;br /&gt;
=MIDI Steuerung=&lt;br /&gt;
Siehe: [[Arduino MIDI Input]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:KeyBoard.png|Keyboard Belegung]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Theater1.jpg|800px|Keyboard Belegung]]&lt;br /&gt;
&lt;br /&gt;
Alle Fotos zum Projekt sind in meinem Picasa Album: [https://picasaweb.google.com/112556810584672853030/ArduinoTheaterProjektWinterreiseVonElfriedeJelinek?authuser=0&amp;amp;feat=directlink|Picasa]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Arduino_Printer_Control_(St%C3%A4dtische_B%C3%BChnen_M%C3%BCnster)&amp;diff=255</id>
		<title>Arduino Printer Control (Städtische Bühnen Münster)</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Arduino_Printer_Control_(St%C3%A4dtische_B%C3%BChnen_M%C3%BCnster)&amp;diff=255"/>
		<updated>2025-02-25T14:46:57Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Einleitung=&lt;br /&gt;
Für die Aufführung der &amp;quot;Winterreise&amp;quot; von Elfriede Jelinek mussten 40 Drucker gleichzeitig angesteuert werden. Ich habe dafür eine Schaltung entwickelt, die es ermöglicht alle Drucker gleichzeitig anzusteuern. Im &amp;quot;Herzen&amp;quot; der Schaltung befindet sich ein Arduino Mega 2560. Dieser steuert an den IO-Ports die seriellen Printer Module vom Typ: BAS-120 an. Die Drucker werden über ein MIDI Keyboard angesprochen. So habe ich jeder Taste auf dem Keyboard einem Drucker zugeordnet. Über spezielle Tasten ist es möglich alle Drucker anzusprechen.&lt;br /&gt;
&lt;br /&gt;
Test&lt;br /&gt;
&lt;br /&gt;
=MIDI Steuerung=&lt;br /&gt;
Siehe: [[Arduino MIDI Input]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:KeyBoard.png|Keyboard Belegung]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Theater1.jpg|800px|Keyboard Belegung]]&lt;br /&gt;
&lt;br /&gt;
Alle Fotos zum Projekt sind in meinem Picasa Album: [https://picasaweb.google.com/112556810584672853030/ArduinoTheaterProjektWinterreiseVonElfriedeJelinek?authuser=0&amp;amp;feat=directlink|Picasa]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Atheros_und_Madwifi:_Das_WLAN_im_EEE-PC_in_den_Promiscuous_Mode_schalten&amp;diff=254</id>
		<title>Atheros und Madwifi: Das WLAN im EEE-PC in den Promiscuous Mode schalten</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Atheros_und_Madwifi:_Das_WLAN_im_EEE-PC_in_den_Promiscuous_Mode_schalten&amp;diff=254"/>
		<updated>2025-02-25T14:45:43Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Achtung: Das Mitschneiden von Internetverkehr in fremden Netzwerken ist strafbar. Diese Anleitung bezieht sich auf das eigene WLAN Netzwerk! Der Author übernimmt keine Haftung für irgendwelche Schäden!&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird beschrieben wie sich eine Netzwerkkarte unter Debian/Ubuntu in den Promiscuous Mode schalten lässt. Als Grundlage dient der Madwifi Treiber. Eine Liste der unterstützten Hardware Komponenten ist hier verfügbar. &lt;br /&gt;
WLAN Verbindung im Netzwerkmanager deaktivieren: &lt;br /&gt;
rechte Maustaste auf das Netzwerksymbol, Haken bei Enable Wireless entfernen&lt;br /&gt;
ifconfig sollte nun nur noch die Ethernet Schnittstelle eth0 anzeigen &lt;br /&gt;
 ifconfig&lt;br /&gt;
 eth0     Protokoll:Ethernet  Hardware Adresse 00:1E:8C:BC:&lt;br /&gt;
         inet Adresse:192.168.1.102  Bcast:192.168.1.255  Maske:255.255.255.0&lt;br /&gt;
         inet6 Adresse: fe80::21e:8cff:/64 GÃ¼ltigkeitsbereich:Verbindung&lt;br /&gt;
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1&lt;br /&gt;
         RX packets:107 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
         TX packets:126 errors:0 dropped:0 overruns:0 carrier:2&lt;br /&gt;
         Kollisionen:0 SendewarteschlangenlÃ¤nge:1000&lt;br /&gt;
         RX bytes:13587 (13.2 KB)  TX bytes:0 (0.0 b)&lt;br /&gt;
         Speicher:fbfc0000-fc000000&lt;br /&gt;
Physische WLAN Schnittstelle herunterfahren: &lt;br /&gt;
 ifconfig wifi0 down&lt;br /&gt;
Virtuelle Schnittstelle im Monitor Modus (Promiscuous Mode) erstellen: &lt;br /&gt;
 wlanconfig ath10 create wlandev wifi0 wlanmode monitor&lt;br /&gt;
Ein iwconfig sollte uns nun unsere neue virtuelle Schnittstelle anzeigen (Die Schnittstelle ath wird durchlaufend nummeriert, es kann also sein das diese bei euch anders heisst): &lt;br /&gt;
 iwconfig&lt;br /&gt;
 ath01    IEEE 802.11g  ESSID:&amp;quot;&amp;quot;  Nickname:&amp;quot;&amp;quot;&lt;br /&gt;
         Mode:Monitor  Channel:0  Access Point: Not-Associated&lt;br /&gt;
         Bit Rate:0 kb/s   Tx-Power:17 dBm   Sensitivity=1/1&lt;br /&gt;
         Retry:off   RTS thr:off   Fragment thr:off&lt;br /&gt;
         Encryption key:off&lt;br /&gt;
         Power Management:off&lt;br /&gt;
         Link Quality=0/70  Signal level=-94 dBm  Noise level=-94 dBm&lt;br /&gt;
         Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0&lt;br /&gt;
         Tx excessive retries:0  Invalid misc:0   Missed beacon:0&lt;br /&gt;
Physische Schnittstelle hochfahren: &lt;br /&gt;
 ifconfig wifi0 up&lt;br /&gt;
Airmon Schnittstelle zuweisen: &lt;br /&gt;
 airmon-ng start ath01&lt;br /&gt;
Airodump starten: &lt;br /&gt;
 airodump-ng ath01&lt;br /&gt;
Nun sollte Airodump alle Informationen zu den gefundenen WLAN Netzwerken anzeigen. In diesem Fall werden auch versteckte Netzwerke angezeigt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Airodump-wlans.png|Airodump WLAN]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Atheros_und_Madwifi:_Das_WLAN_im_EEE-PC_in_den_Promiscuous_Mode_schalten&amp;diff=253</id>
		<title>Atheros und Madwifi: Das WLAN im EEE-PC in den Promiscuous Mode schalten</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Atheros_und_Madwifi:_Das_WLAN_im_EEE-PC_in_den_Promiscuous_Mode_schalten&amp;diff=253"/>
		<updated>2025-02-25T14:45:30Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Achtung: Das Mitschneiden von Internetverkehr in fremden Netzwerken ist strafbar. Diese Anleitung bezieht sich auf das eigene WLAN Netzwerk! Der Author übernimmt keine Haftung für irgendwelche Schäden!&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird beschrieben wie sich eine Netzwerkkarte unter Debian/Ubuntu in den Promiscuous Mode schalten lässt. Als Grundlage dient der Madwifi Treiber. Eine Liste der unterstützten Hardware Komponenten ist hier verfügbar. &lt;br /&gt;
WLAN Verbindung im Netzwerkmanager deaktivieren: &lt;br /&gt;
rechte Maustaste auf das Netzwerksymbol, Haken bei Enable Wireless entfernen&lt;br /&gt;
ifconfig sollte nun nur noch die Ethernet Schnittstelle eth0 anzeigen &lt;br /&gt;
 ifconfig&lt;br /&gt;
 eth0     Protokoll:Ethernet  Hardware Adresse 00:1E:8C:BC:&lt;br /&gt;
         inet Adresse:192.168.1.102  Bcast:192.168.1.255  Maske:255.255.255.0&lt;br /&gt;
         inet6 Adresse: fe80::21e:8cff:/64 GÃ¼ltigkeitsbereich:Verbindung&lt;br /&gt;
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1&lt;br /&gt;
         RX packets:107 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
         TX packets:126 errors:0 dropped:0 overruns:0 carrier:2&lt;br /&gt;
         Kollisionen:0 SendewarteschlangenlÃ¤nge:1000&lt;br /&gt;
         RX bytes:13587 (13.2 KB)  TX bytes:0 (0.0 b)&lt;br /&gt;
         Speicher:fbfc0000-fc000000&lt;br /&gt;
Physische WLAN Schnittstelle herunterfahren: &lt;br /&gt;
 ifconfig wifi0 down&lt;br /&gt;
Virtuelle Schnittstelle im Monitor Modus (Promiscuous Mode) erstellen: &lt;br /&gt;
 wlanconfig ath10 create wlandev wifi0 wlanmode monitor&lt;br /&gt;
Ein iwconfig sollte uns nun unsere neue virtuelle Schnittstelle anzeigen (Die Schnittstelle ath wird durchlaufend nummeriert, es kann also sein das diese bei euch anders heisst): &lt;br /&gt;
 iwconfig&lt;br /&gt;
 ath01    IEEE 802.11g  ESSID:&amp;quot;&amp;quot;  Nickname:&amp;quot;&amp;quot;&lt;br /&gt;
         Mode:Monitor  Channel:0  Access Point: Not-Associated&lt;br /&gt;
         Bit Rate:0 kb/s   Tx-Power:17 dBm   Sensitivity=1/1&lt;br /&gt;
         Retry:off   RTS thr:off   Fragment thr:off&lt;br /&gt;
         Encryption key:off&lt;br /&gt;
         Power Management:off&lt;br /&gt;
         Link Quality=0/70  Signal level=-94 dBm  Noise level=-94 dBm&lt;br /&gt;
         Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0&lt;br /&gt;
         Tx excessive retries:0  Invalid misc:0   Missed beacon:0&lt;br /&gt;
Physische Schnittstelle hochfahren: &lt;br /&gt;
 ifconfig wifi0 up&lt;br /&gt;
Airmon Schnittstelle zuweisen: &lt;br /&gt;
 airmon-ng start ath01&lt;br /&gt;
Airodump starten: &lt;br /&gt;
 airodump-ng ath01&lt;br /&gt;
Nun sollte Airodump alle Informationen zu den gefundenen WLAN Netzwerken anzeigen. In diesem Fall werden auch versteckte Netzwerke angezeigt.&lt;br /&gt;
Test&lt;br /&gt;
[[Datei:Airodump-wlans.png|Airodump WLAN]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=250</id>
		<title>Open Energy Monitor mit dem ESP32</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=250"/>
		<updated>2018-02-06T07:07:52Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Emoncms */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Einleitung=&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird beschrieben wie mit Hilfe einer ESP32 Platine ein Strom Sensor für 3 Phasen Wechselstrom aufgebaut werden kann. Der Spannungsteiler aus den 10kOhm Widerständen erzeugt 1,6V für die SCT-013-030 Strom Sensoren. Die Stromsensoren werden mit den ADC Pin&#039;s des ESP32 verbunden. Natürlich sind die Messungen nicht sonderlich genau, da die Phasenverschiebung und Spannung nicht berücksichtigt wird. Auch das wäre durch zusätzliche Transformatoren möglich die dann auf die ADC Pin&#039;s geführt werden. Da ich damit nur meinen ungefähren Stromverbrauch zuhause messen möchte ist die Schaltung völlig ausreichend. Die Kosten für die einzelnen Komponenten sollten 30€ nicht übersteigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folgende Bauteile werden benötigt:&#039;&#039;&#039;&lt;br /&gt;
 -Board: DOIT ESP32 DEVKIT V1 (ca. 10€)&lt;br /&gt;
 -Strom Sensor SCT-013-30 (30A) oder SCT-013-100 (100A) siehe: http://openenergymonitor.org/emon/node/156&lt;br /&gt;
 -6x 10kOhm Widerstände 1/4W&lt;br /&gt;
 -3x Elko 10 uF&lt;br /&gt;
 -Universalplatine&lt;br /&gt;
 -evtl. USB Netzteil oder anderes Netzteil für die Spannungsversorgung&lt;br /&gt;
 -Pfosten Stecker Rastermaß: 2.54mm&lt;br /&gt;
 -3 x 3,5 mm Audio Anschluss&lt;br /&gt;
 -Optional: 1000uF / 10V Kondensator zur Stabilisierung&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pinbelegung des DOIT ESP32 DEVKIT V1 Board:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 https://github.com/playelek/pinout-doit-32devkitv1&lt;br /&gt;
&lt;br /&gt;
=Grundlagen=&lt;br /&gt;
&lt;br /&gt;
Auf der Seite von Open Energy Monitor finden sich genügend Informationen über die Grundlagen der Leistungsberechnung. Das Prinzip lässt sich 1:1 vom Aufbau eines Arduinos übernehmen. Der ESP32 verkraftet jedoch maximal 3,3V am Analog Eingang.&lt;br /&gt;
&lt;br /&gt;
 https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino&lt;br /&gt;
&lt;br /&gt;
=Aufbau=&lt;br /&gt;
&lt;br /&gt;
Auf die Lochrasterplatine müssen nur wenige Bauteile. Die Teile lassen sich relativ einfach einlöten. Für den Aufbau werden nur wenige PIN&#039;s des ESP32 benötigt. Bei meinem Aufbau gibt es am obersten Sensor Anschluss noch einen zusätzlichen Burden Widerstand von 200 Ohm. Das liegt daran das der SCT-013-030 Sensor schon einige Jahre alt ist. Bei den neuen Sensoren sind keine Burden Widerstände nötig, da diese schon einen 62 Ohm Burden eingebaut haben. Ein 1000uF Kondensator zwischen 5V und GND ist empfehlenswert, da je nach 5V Netzteil die Messwerte stark schwanken.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 03.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 05.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 01.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
Ich verwende zum programmieren immer die Arduino Gui. Es sind zuerst einige Anpassungen nötig damit das DOIT ESP32 Board von der Arduino Software erkannt wird. Hierzu muss diese Anleitung umgesetzt werden:&lt;br /&gt;
&lt;br /&gt;
 https://github.com/espressif/arduino-esp32&lt;br /&gt;
&lt;br /&gt;
Nach dem Neustart der Arduino Software kann dann das passende ESP32 Board ausgewählt werden. In meinem Beispiel ist es ein DOIT V1 Board.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 04.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
==Spezielle Hinweise für den ESP32==&lt;br /&gt;
Bei der Programmierung des ESP32 gibt es ein paar Dinge zu beachten. Auf den Boards ist meist ein passender Spannungsregler für 3,3V und ein passender FTDI Chip aufgelötet. Somit entfällt eine weitere Schaltung zur Spannungsversorgung. Zudem wird das Board vom FTDI Chip durch die Arduino Software automatisch in den &amp;quot;Upload Modus&amp;quot; versetzt. Man muss also nicht wie beim ESP8266 bestimmte Taster drücken (Flash und Reset) um das Board in den &amp;quot;Upload Modus&amp;quot; zu bringen.&lt;br /&gt;
&lt;br /&gt;
Ich habe öfters die WifiManager Library für das WLAN verwendet. Auf Dauer hatte ich damit jedoch immer wieder Probleme, so das ich meine WLAN Daten mit Absicht &amp;quot;fest&amp;quot; in das Programm einbaue. Zudem ergibt sich beim WLAN noch ein Problem wenn auf einmal die WLAN Verbindung unterbrochen wird, z.B. wenn der Router neu gestartet wird. Danach verbindet sich der ESP32 nämlich nicht mehr automatisch mit dem WLAN. Um das zu verhindern habe ich folgende Funktion in den Code eingebaut. Die Funktion WifiEvent startet den ESP32 neu wenn keine Verbindung mehr zum WLAN besteht. Leider funktioniert jeder andere Weg im Moment nicht zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//WiFi&lt;br /&gt;
const char* ssid     = &amp;quot;AccessPoint&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;pass&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//WiFi&lt;br /&gt;
void WIFI_Connect()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(2,1);&lt;br /&gt;
  WiFi.disconnect();&lt;br /&gt;
  Serial.println(&amp;quot;Booting Sketch...&amp;quot;);&lt;br /&gt;
  WiFi.mode(WIFI_AP_STA);&lt;br /&gt;
  WiFi.begin(ssid, password);&lt;br /&gt;
    // Wait for connection&lt;br /&gt;
  for (int i = 0; i &amp;lt; 25; i++)&lt;br /&gt;
  {&lt;br /&gt;
    if ( WiFi.status() != WL_CONNECTED ) {&lt;br /&gt;
      delay ( 250 );&lt;br /&gt;
      digitalWrite(2,0);&lt;br /&gt;
      Serial.print ( &amp;quot;.&amp;quot; );&lt;br /&gt;
      delay ( 250 );&lt;br /&gt;
      digitalWrite(2,1);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  digitalWrite(2,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
  //WiFi Part&lt;br /&gt;
  WIFI_Connect();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
//Wifi WatchDog&lt;br /&gt;
WiFi.onEvent(WiFiEvent);&lt;br /&gt;
//Check if WiFi is here&lt;br /&gt;
//Automatically reconnect the ESP32 if the WiFi Router is not there...&lt;br /&gt;
if (WiFi.status() != WL_CONNECTED)&lt;br /&gt;
    {&lt;br /&gt;
      WiFi.onEvent(WiFiEvent);&lt;br /&gt;
      WIFI_Connect();&lt;br /&gt;
    } else {&lt;br /&gt;
      //Do something if the WiFi is available&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Wifi Watchdog&lt;br /&gt;
void WiFiEvent(WiFiEvent_t event) {&lt;br /&gt;
  Serial.printf(&amp;quot;[WiFi-event] event: %d  - &amp;quot;, event);&lt;br /&gt;
  switch(event) {&lt;br /&gt;
  case SYSTEM_EVENT_STA_GOT_IP:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi connected&amp;quot;);&lt;br /&gt;
      Serial.print(&amp;quot;IP address: &amp;quot;); Serial.println(WiFi.localIP());&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_DISCONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi lost connection&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_START:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station start&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_CONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station connected to AP&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_LOST_IP:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 Lost IP&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kalibrierung==&lt;br /&gt;
Als nächstes müssen die Stromsensoren kalibriert werden. Dazu sollten folgende Variablen angepasst werden. Die Kalibrierung habe ich mit einer 100W Lampe und einem Wasserkocher 1800W durchgeführt. Eine genaue Stromzange oder eine Wattmeter sind sehr nützliche Hilfsmittel. In meinem Fall kann der SCT-013-030 als kleinste Einheit 100mA Strom erkennen. Die Sensoren haben 1800 Wicklungen und einen 62 Ohm Burden Widerstand. Der Offset Wert sollte nicht am PC USB Port sondern an einem separaten 5V Netzteil kalibriert werden. Denn die meisten PC USB Anschlüsse liefern bei 200mA nur noch eine Spannung von 4,5V.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;ICAL&#039;&#039;&#039; = Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 filteredI = &#039;&#039;&#039;0.9989&#039;&#039;&#039; * (lastFilteredI+sampleI-lastSampleI); //Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - &#039;&#039;&#039;0.06&#039;&#039;&#039;;//Offset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Setup variables&lt;br /&gt;
int numberOfSamples = 4000;&lt;br /&gt;
double ICAL = 1.08;&lt;br /&gt;
&lt;br /&gt;
//Set Voltage and current input pins&lt;br /&gt;
int inPinI1 = 34;&lt;br /&gt;
&lt;br /&gt;
// CT: Voltage depends on current, burden resistor, and turns&lt;br /&gt;
#define CT_BURDEN_RESISTOR    62&lt;br /&gt;
#define CT_TURNS              1800&lt;br /&gt;
#define VOLTAGE               225&lt;br /&gt;
&lt;br /&gt;
// Initial gueses for ratios, modified by VCAL/ICAL tweaks&lt;br /&gt;
double I_RATIO = (long double)CT_TURNS / CT_BURDEN_RESISTOR * 3.3 / 4096 * ICAL;&lt;br /&gt;
&lt;br /&gt;
//Filter variables 1&lt;br /&gt;
double lastFilteredI, filteredI;&lt;br /&gt;
double sqI,sumI;&lt;br /&gt;
//Sample variables&lt;br /&gt;
int lastSampleI,sampleI;&lt;br /&gt;
double Irms1;&lt;br /&gt;
unsigned long timer;&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
timer = millis();&lt;br /&gt;
//**************************************************************************&lt;br /&gt;
//Phase1 &lt;br /&gt;
  for (int n=0; n&amp;lt;numberOfSamples; n++)&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastSampleI=sampleI;&lt;br /&gt;
   &lt;br /&gt;
   //Read in voltage and current samples.   &lt;br /&gt;
   sampleI = analogRead(inPinI1);&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastFilteredI = filteredI;&lt;br /&gt;
  &lt;br /&gt;
   //Digital high pass filters to remove 1.6V DC offset.&lt;br /&gt;
   filteredI = 0.9989 * (lastFilteredI+sampleI-lastSampleI);&lt;br /&gt;
   &lt;br /&gt;
   //Root-mean-square method current&lt;br /&gt;
   //1) square current values&lt;br /&gt;
   sqI = filteredI * filteredI;&lt;br /&gt;
   //2) sum &lt;br /&gt;
   sumI += sqI;&lt;br /&gt;
   delay(0.0002);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Calculation of the root of the mean of the voltage and current squared (rms)&lt;br /&gt;
//Calibration coeficients applied. &lt;br /&gt;
Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - 0.06;&lt;br /&gt;
if (Irms1 &amp;lt; 0){ Irms1 = 0; }; //Set negative Current to zero&lt;br /&gt;
sumI = 0;&lt;br /&gt;
&lt;br /&gt;
Serial.println(&amp;quot;Irms1:&amp;quot;+String(Irms1));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Download Arduino Sketch==&lt;br /&gt;
&#039;&#039;&#039;Achtung: Ihr müsst das Programm noch an Eure WLAN und EMON Server Parameter anpassen.&#039;&#039;&#039;&lt;br /&gt;
 [[Media:EmonCMS ESP32 v1.zip|Download Arduino Sketch: Emon ESP32]]&lt;br /&gt;
&lt;br /&gt;
=Emoncms=&lt;br /&gt;
In Emoncms kann nun ein schönes Dashboard erstellt werden. Dazu gibt es bereits bei den Inputs die Funktionen &amp;quot;Power to kWh und Power to kWh/d&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 07.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
Die Werte können nun alle im Dashboard angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 06.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
= Weblinks =&lt;br /&gt;
&lt;br /&gt;
* https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino Official Page&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=249</id>
		<title>Open Energy Monitor mit dem ESP32</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=249"/>
		<updated>2018-02-06T07:07:14Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Einleitung=&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird beschrieben wie mit Hilfe einer ESP32 Platine ein Strom Sensor für 3 Phasen Wechselstrom aufgebaut werden kann. Der Spannungsteiler aus den 10kOhm Widerständen erzeugt 1,6V für die SCT-013-030 Strom Sensoren. Die Stromsensoren werden mit den ADC Pin&#039;s des ESP32 verbunden. Natürlich sind die Messungen nicht sonderlich genau, da die Phasenverschiebung und Spannung nicht berücksichtigt wird. Auch das wäre durch zusätzliche Transformatoren möglich die dann auf die ADC Pin&#039;s geführt werden. Da ich damit nur meinen ungefähren Stromverbrauch zuhause messen möchte ist die Schaltung völlig ausreichend. Die Kosten für die einzelnen Komponenten sollten 30€ nicht übersteigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folgende Bauteile werden benötigt:&#039;&#039;&#039;&lt;br /&gt;
 -Board: DOIT ESP32 DEVKIT V1 (ca. 10€)&lt;br /&gt;
 -Strom Sensor SCT-013-30 (30A) oder SCT-013-100 (100A) siehe: http://openenergymonitor.org/emon/node/156&lt;br /&gt;
 -6x 10kOhm Widerstände 1/4W&lt;br /&gt;
 -3x Elko 10 uF&lt;br /&gt;
 -Universalplatine&lt;br /&gt;
 -evtl. USB Netzteil oder anderes Netzteil für die Spannungsversorgung&lt;br /&gt;
 -Pfosten Stecker Rastermaß: 2.54mm&lt;br /&gt;
 -3 x 3,5 mm Audio Anschluss&lt;br /&gt;
 -Optional: 1000uF / 10V Kondensator zur Stabilisierung&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pinbelegung des DOIT ESP32 DEVKIT V1 Board:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 https://github.com/playelek/pinout-doit-32devkitv1&lt;br /&gt;
&lt;br /&gt;
=Grundlagen=&lt;br /&gt;
&lt;br /&gt;
Auf der Seite von Open Energy Monitor finden sich genügend Informationen über die Grundlagen der Leistungsberechnung. Das Prinzip lässt sich 1:1 vom Aufbau eines Arduinos übernehmen. Der ESP32 verkraftet jedoch maximal 3,3V am Analog Eingang.&lt;br /&gt;
&lt;br /&gt;
 https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino&lt;br /&gt;
&lt;br /&gt;
=Aufbau=&lt;br /&gt;
&lt;br /&gt;
Auf die Lochrasterplatine müssen nur wenige Bauteile. Die Teile lassen sich relativ einfach einlöten. Für den Aufbau werden nur wenige PIN&#039;s des ESP32 benötigt. Bei meinem Aufbau gibt es am obersten Sensor Anschluss noch einen zusätzlichen Burden Widerstand von 200 Ohm. Das liegt daran das der SCT-013-030 Sensor schon einige Jahre alt ist. Bei den neuen Sensoren sind keine Burden Widerstände nötig, da diese schon einen 62 Ohm Burden eingebaut haben. Ein 1000uF Kondensator zwischen 5V und GND ist empfehlenswert, da je nach 5V Netzteil die Messwerte stark schwanken.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 03.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 05.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 01.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
Ich verwende zum programmieren immer die Arduino Gui. Es sind zuerst einige Anpassungen nötig damit das DOIT ESP32 Board von der Arduino Software erkannt wird. Hierzu muss diese Anleitung umgesetzt werden:&lt;br /&gt;
&lt;br /&gt;
 https://github.com/espressif/arduino-esp32&lt;br /&gt;
&lt;br /&gt;
Nach dem Neustart der Arduino Software kann dann das passende ESP32 Board ausgewählt werden. In meinem Beispiel ist es ein DOIT V1 Board.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 04.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
==Spezielle Hinweise für den ESP32==&lt;br /&gt;
Bei der Programmierung des ESP32 gibt es ein paar Dinge zu beachten. Auf den Boards ist meist ein passender Spannungsregler für 3,3V und ein passender FTDI Chip aufgelötet. Somit entfällt eine weitere Schaltung zur Spannungsversorgung. Zudem wird das Board vom FTDI Chip durch die Arduino Software automatisch in den &amp;quot;Upload Modus&amp;quot; versetzt. Man muss also nicht wie beim ESP8266 bestimmte Taster drücken (Flash und Reset) um das Board in den &amp;quot;Upload Modus&amp;quot; zu bringen.&lt;br /&gt;
&lt;br /&gt;
Ich habe öfters die WifiManager Library für das WLAN verwendet. Auf Dauer hatte ich damit jedoch immer wieder Probleme, so das ich meine WLAN Daten mit Absicht &amp;quot;fest&amp;quot; in das Programm einbaue. Zudem ergibt sich beim WLAN noch ein Problem wenn auf einmal die WLAN Verbindung unterbrochen wird, z.B. wenn der Router neu gestartet wird. Danach verbindet sich der ESP32 nämlich nicht mehr automatisch mit dem WLAN. Um das zu verhindern habe ich folgende Funktion in den Code eingebaut. Die Funktion WifiEvent startet den ESP32 neu wenn keine Verbindung mehr zum WLAN besteht. Leider funktioniert jeder andere Weg im Moment nicht zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//WiFi&lt;br /&gt;
const char* ssid     = &amp;quot;AccessPoint&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;pass&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//WiFi&lt;br /&gt;
void WIFI_Connect()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(2,1);&lt;br /&gt;
  WiFi.disconnect();&lt;br /&gt;
  Serial.println(&amp;quot;Booting Sketch...&amp;quot;);&lt;br /&gt;
  WiFi.mode(WIFI_AP_STA);&lt;br /&gt;
  WiFi.begin(ssid, password);&lt;br /&gt;
    // Wait for connection&lt;br /&gt;
  for (int i = 0; i &amp;lt; 25; i++)&lt;br /&gt;
  {&lt;br /&gt;
    if ( WiFi.status() != WL_CONNECTED ) {&lt;br /&gt;
      delay ( 250 );&lt;br /&gt;
      digitalWrite(2,0);&lt;br /&gt;
      Serial.print ( &amp;quot;.&amp;quot; );&lt;br /&gt;
      delay ( 250 );&lt;br /&gt;
      digitalWrite(2,1);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  digitalWrite(2,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
  //WiFi Part&lt;br /&gt;
  WIFI_Connect();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
//Wifi WatchDog&lt;br /&gt;
WiFi.onEvent(WiFiEvent);&lt;br /&gt;
//Check if WiFi is here&lt;br /&gt;
//Automatically reconnect the ESP32 if the WiFi Router is not there...&lt;br /&gt;
if (WiFi.status() != WL_CONNECTED)&lt;br /&gt;
    {&lt;br /&gt;
      WiFi.onEvent(WiFiEvent);&lt;br /&gt;
      WIFI_Connect();&lt;br /&gt;
    } else {&lt;br /&gt;
      //Do something if the WiFi is available&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Wifi Watchdog&lt;br /&gt;
void WiFiEvent(WiFiEvent_t event) {&lt;br /&gt;
  Serial.printf(&amp;quot;[WiFi-event] event: %d  - &amp;quot;, event);&lt;br /&gt;
  switch(event) {&lt;br /&gt;
  case SYSTEM_EVENT_STA_GOT_IP:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi connected&amp;quot;);&lt;br /&gt;
      Serial.print(&amp;quot;IP address: &amp;quot;); Serial.println(WiFi.localIP());&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_DISCONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi lost connection&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_START:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station start&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_CONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station connected to AP&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_LOST_IP:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 Lost IP&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kalibrierung==&lt;br /&gt;
Als nächstes müssen die Stromsensoren kalibriert werden. Dazu sollten folgende Variablen angepasst werden. Die Kalibrierung habe ich mit einer 100W Lampe und einem Wasserkocher 1800W durchgeführt. Eine genaue Stromzange oder eine Wattmeter sind sehr nützliche Hilfsmittel. In meinem Fall kann der SCT-013-030 als kleinste Einheit 100mA Strom erkennen. Die Sensoren haben 1800 Wicklungen und einen 62 Ohm Burden Widerstand. Der Offset Wert sollte nicht am PC USB Port sondern an einem separaten 5V Netzteil kalibriert werden. Denn die meisten PC USB Anschlüsse liefern bei 200mA nur noch eine Spannung von 4,5V.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;ICAL&#039;&#039;&#039; = Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 filteredI = &#039;&#039;&#039;0.9989&#039;&#039;&#039; * (lastFilteredI+sampleI-lastSampleI); //Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - &#039;&#039;&#039;0.06&#039;&#039;&#039;;//Offset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Setup variables&lt;br /&gt;
int numberOfSamples = 4000;&lt;br /&gt;
double ICAL = 1.08;&lt;br /&gt;
&lt;br /&gt;
//Set Voltage and current input pins&lt;br /&gt;
int inPinI1 = 34;&lt;br /&gt;
&lt;br /&gt;
// CT: Voltage depends on current, burden resistor, and turns&lt;br /&gt;
#define CT_BURDEN_RESISTOR    62&lt;br /&gt;
#define CT_TURNS              1800&lt;br /&gt;
#define VOLTAGE               225&lt;br /&gt;
&lt;br /&gt;
// Initial gueses for ratios, modified by VCAL/ICAL tweaks&lt;br /&gt;
double I_RATIO = (long double)CT_TURNS / CT_BURDEN_RESISTOR * 3.3 / 4096 * ICAL;&lt;br /&gt;
&lt;br /&gt;
//Filter variables 1&lt;br /&gt;
double lastFilteredI, filteredI;&lt;br /&gt;
double sqI,sumI;&lt;br /&gt;
//Sample variables&lt;br /&gt;
int lastSampleI,sampleI;&lt;br /&gt;
double Irms1;&lt;br /&gt;
unsigned long timer;&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
timer = millis();&lt;br /&gt;
//**************************************************************************&lt;br /&gt;
//Phase1 &lt;br /&gt;
  for (int n=0; n&amp;lt;numberOfSamples; n++)&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastSampleI=sampleI;&lt;br /&gt;
   &lt;br /&gt;
   //Read in voltage and current samples.   &lt;br /&gt;
   sampleI = analogRead(inPinI1);&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastFilteredI = filteredI;&lt;br /&gt;
  &lt;br /&gt;
   //Digital high pass filters to remove 1.6V DC offset.&lt;br /&gt;
   filteredI = 0.9989 * (lastFilteredI+sampleI-lastSampleI);&lt;br /&gt;
   &lt;br /&gt;
   //Root-mean-square method current&lt;br /&gt;
   //1) square current values&lt;br /&gt;
   sqI = filteredI * filteredI;&lt;br /&gt;
   //2) sum &lt;br /&gt;
   sumI += sqI;&lt;br /&gt;
   delay(0.0002);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Calculation of the root of the mean of the voltage and current squared (rms)&lt;br /&gt;
//Calibration coeficients applied. &lt;br /&gt;
Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - 0.06;&lt;br /&gt;
if (Irms1 &amp;lt; 0){ Irms1 = 0; }; //Set negative Current to zero&lt;br /&gt;
sumI = 0;&lt;br /&gt;
&lt;br /&gt;
Serial.println(&amp;quot;Irms1:&amp;quot;+String(Irms1));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Download Arduino Sketch==&lt;br /&gt;
&#039;&#039;&#039;Achtung: Ihr müsst das Programm noch an Eure WLAN und EMON Server Parameter anpassen.&#039;&#039;&#039;&lt;br /&gt;
 [[Media:EmonCMS ESP32 v1.zip|Download Arduino Sketch: Emon ESP32]]&lt;br /&gt;
&lt;br /&gt;
=Emoncms=&lt;br /&gt;
In Emoncms kann nun ein schönes Dashboard erstellt werden. Dazu gibt es bereits bei den Inputs die Funktionen &amp;quot;Power to kWh und Power to kWh/d&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 07.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Weblinks =&lt;br /&gt;
&lt;br /&gt;
* https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino Official Page&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Datei:ESP32_07.png&amp;diff=248</id>
		<title>Datei:ESP32 07.png</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Datei:ESP32_07.png&amp;diff=248"/>
		<updated>2018-02-06T07:05:42Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Datei:ESP32_06.png&amp;diff=247</id>
		<title>Datei:ESP32 06.png</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Datei:ESP32_06.png&amp;diff=247"/>
		<updated>2018-02-06T07:03:43Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=246</id>
		<title>Open Energy Monitor mit dem ESP32</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=246"/>
		<updated>2018-02-05T13:11:54Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Kalibrierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Einleitung=&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird beschrieben wie mit Hilfe einer ESP32 Platine ein Strom Sensor für 3 Phasen Wechselstrom aufgebaut werden kann. Der Spannungsteiler aus den 10kOhm Widerständen erzeugt 1,6V für die SCT-013-030 Strom Sensoren. Die Stromsensoren werden mit den ADC Pin&#039;s des ESP32 verbunden. Natürlich sind die Messungen nicht sonderlich genau, da die Phasenverschiebung und Spannung nicht berücksichtigt wird. Auch das wäre durch zusätzliche Transformatoren möglich die dann auf die ADC Pin&#039;s geführt werden. Da ich damit nur meinen ungefähren Stromverbrauch zuhause messen möchte ist die Schaltung völlig ausreichend. Die Kosten für die einzelnen Komponenten sollten 30€ nicht übersteigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folgende Bauteile werden benötigt:&#039;&#039;&#039;&lt;br /&gt;
 -Board: DOIT ESP32 DEVKIT V1 (ca. 10€)&lt;br /&gt;
 -Strom Sensor SCT-013-30 (30A) oder SCT-013-100 (100A) siehe: http://openenergymonitor.org/emon/node/156&lt;br /&gt;
 -6x 10kOhm Widerstände 1/4W&lt;br /&gt;
 -3x Elko 10 uF&lt;br /&gt;
 -Universalplatine&lt;br /&gt;
 -evtl. USB Netzteil oder anderes Netzteil für die Spannungsversorgung&lt;br /&gt;
 -Pfosten Stecker Rastermaß: 2.54mm&lt;br /&gt;
 -3 x 3,5 mm Audio Anschluss&lt;br /&gt;
 -Optional: 1000uF / 10V Kondensator zur Stabilisierung&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pinbelegung des DOIT ESP32 DEVKIT V1 Board:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 https://github.com/playelek/pinout-doit-32devkitv1&lt;br /&gt;
&lt;br /&gt;
=Grundlagen=&lt;br /&gt;
&lt;br /&gt;
Auf der Seite von Open Energy Monitor finden sich genügend Informationen über die Grundlagen der Leistungsberechnung. Das Prinzip lässt sich 1:1 vom Aufbau eines Arduinos übernehmen. Der ESP32 verkraftet jedoch maximal 3,3V am Analog Eingang.&lt;br /&gt;
&lt;br /&gt;
 https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino&lt;br /&gt;
&lt;br /&gt;
=Aufbau=&lt;br /&gt;
&lt;br /&gt;
Auf die Lochrasterplatine müssen nur wenige Bauteile. Die Teile lassen sich relativ einfach einlöten. Für den Aufbau werden nur wenige PIN&#039;s des ESP32 benötigt. Bei meinem Aufbau gibt es am obersten Sensor Anschluss noch einen zusätzlichen Burden Widerstand von 200 Ohm. Das liegt daran das der SCT-013-030 Sensor schon einige Jahre alt ist. Bei den neuen Sensoren sind keine Burden Widerstände nötig, da diese schon einen 62 Ohm Burden eingebaut haben. Ein 1000uF Kondensator zwischen 5V und GND ist empfehlenswert, da je nach 5V Netzteil die Messwerte stark schwanken.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 03.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 05.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 01.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
Ich verwende zum programmieren immer die Arduino Gui. Es sind zuerst einige Anpassungen nötig damit das DOIT ESP32 Board von der Arduino Software erkannt wird. Hierzu muss diese Anleitung umgesetzt werden:&lt;br /&gt;
&lt;br /&gt;
 https://github.com/espressif/arduino-esp32&lt;br /&gt;
&lt;br /&gt;
Nach dem Neustart der Arduino Software kann dann das passende ESP32 Board ausgewählt werden. In meinem Beispiel ist es ein DOIT V1 Board.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 04.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
==Spezielle Hinweise für den ESP32==&lt;br /&gt;
Bei der Programmierung des ESP32 gibt es ein paar Dinge zu beachten. Auf den Boards ist meist ein passender Spannungsregler für 3,3V und ein passender FTDI Chip aufgelötet. Somit entfällt eine weitere Schaltung zur Spannungsversorgung. Zudem wird das Board vom FTDI Chip durch die Arduino Software automatisch in den &amp;quot;Upload Modus&amp;quot; versetzt. Man muss also nicht wie beim ESP8266 bestimmte Taster drücken (Flash und Reset) um das Board in den &amp;quot;Upload Modus&amp;quot; zu bringen.&lt;br /&gt;
&lt;br /&gt;
Ich habe öfters die WifiManager Library für das WLAN verwendet. Auf Dauer hatte ich damit jedoch immer wieder Probleme, so das ich meine WLAN Daten mit Absicht &amp;quot;fest&amp;quot; in das Programm einbaue. Zudem ergibt sich beim WLAN noch ein Problem wenn auf einmal die WLAN Verbindung unterbrochen wird, z.B. wenn der Router neu gestartet wird. Danach verbindet sich der ESP32 nämlich nicht mehr automatisch mit dem WLAN. Um das zu verhindern habe ich folgende Funktion in den Code eingebaut. Die Funktion WifiEvent startet den ESP32 neu wenn keine Verbindung mehr zum WLAN besteht. Leider funktioniert jeder andere Weg im Moment nicht zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//WiFi&lt;br /&gt;
const char* ssid     = &amp;quot;AccessPoint&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;pass&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//WiFi&lt;br /&gt;
void WIFI_Connect()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(2,1);&lt;br /&gt;
  WiFi.disconnect();&lt;br /&gt;
  Serial.println(&amp;quot;Booting Sketch...&amp;quot;);&lt;br /&gt;
  WiFi.mode(WIFI_AP_STA);&lt;br /&gt;
  WiFi.begin(ssid, password);&lt;br /&gt;
    // Wait for connection&lt;br /&gt;
  for (int i = 0; i &amp;lt; 25; i++)&lt;br /&gt;
  {&lt;br /&gt;
    if ( WiFi.status() != WL_CONNECTED ) {&lt;br /&gt;
      delay ( 250 );&lt;br /&gt;
      digitalWrite(2,0);&lt;br /&gt;
      Serial.print ( &amp;quot;.&amp;quot; );&lt;br /&gt;
      delay ( 250 );&lt;br /&gt;
      digitalWrite(2,1);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  digitalWrite(2,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
  //WiFi Part&lt;br /&gt;
  WIFI_Connect();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
//Wifi WatchDog&lt;br /&gt;
WiFi.onEvent(WiFiEvent);&lt;br /&gt;
//Check if WiFi is here&lt;br /&gt;
//Automatically reconnect the ESP32 if the WiFi Router is not there...&lt;br /&gt;
if (WiFi.status() != WL_CONNECTED)&lt;br /&gt;
    {&lt;br /&gt;
      WiFi.onEvent(WiFiEvent);&lt;br /&gt;
      WIFI_Connect();&lt;br /&gt;
    } else {&lt;br /&gt;
      //Do something if the WiFi is available&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Wifi Watchdog&lt;br /&gt;
void WiFiEvent(WiFiEvent_t event) {&lt;br /&gt;
  Serial.printf(&amp;quot;[WiFi-event] event: %d  - &amp;quot;, event);&lt;br /&gt;
  switch(event) {&lt;br /&gt;
  case SYSTEM_EVENT_STA_GOT_IP:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi connected&amp;quot;);&lt;br /&gt;
      Serial.print(&amp;quot;IP address: &amp;quot;); Serial.println(WiFi.localIP());&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_DISCONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi lost connection&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_START:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station start&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_CONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station connected to AP&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_LOST_IP:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 Lost IP&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kalibrierung==&lt;br /&gt;
Als nächstes müssen die Stromsensoren kalibriert werden. Dazu sollten folgende Variablen angepasst werden. Die Kalibrierung habe ich mit einer 100W Lampe und einem Wasserkocher 1800W durchgeführt. Eine genaue Stromzange oder eine Wattmeter sind sehr nützliche Hilfsmittel. In meinem Fall kann der SCT-013-030 als kleinste Einheit 100mA Strom erkennen. Die Sensoren haben 1800 Wicklungen und einen 62 Ohm Burden Widerstand. Der Offset Wert sollte nicht am PC USB Port sondern an einem separaten 5V Netzteil kalibriert werden. Denn die meisten PC USB Anschlüsse liefern bei 200mA nur noch eine Spannung von 4,5V.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;ICAL&#039;&#039;&#039; = Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 filteredI = &#039;&#039;&#039;0.9989&#039;&#039;&#039; * (lastFilteredI+sampleI-lastSampleI); //Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - &#039;&#039;&#039;0.06&#039;&#039;&#039;;//Offset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Setup variables&lt;br /&gt;
int numberOfSamples = 4000;&lt;br /&gt;
double ICAL = 1.08;&lt;br /&gt;
&lt;br /&gt;
//Set Voltage and current input pins&lt;br /&gt;
int inPinI1 = 34;&lt;br /&gt;
&lt;br /&gt;
// CT: Voltage depends on current, burden resistor, and turns&lt;br /&gt;
#define CT_BURDEN_RESISTOR    62&lt;br /&gt;
#define CT_TURNS              1800&lt;br /&gt;
#define VOLTAGE               225&lt;br /&gt;
&lt;br /&gt;
// Initial gueses for ratios, modified by VCAL/ICAL tweaks&lt;br /&gt;
double I_RATIO = (long double)CT_TURNS / CT_BURDEN_RESISTOR * 3.3 / 4096 * ICAL;&lt;br /&gt;
&lt;br /&gt;
//Filter variables 1&lt;br /&gt;
double lastFilteredI, filteredI;&lt;br /&gt;
double sqI,sumI;&lt;br /&gt;
//Sample variables&lt;br /&gt;
int lastSampleI,sampleI;&lt;br /&gt;
double Irms1;&lt;br /&gt;
unsigned long timer;&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
timer = millis();&lt;br /&gt;
//**************************************************************************&lt;br /&gt;
//Phase1 &lt;br /&gt;
  for (int n=0; n&amp;lt;numberOfSamples; n++)&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastSampleI=sampleI;&lt;br /&gt;
   &lt;br /&gt;
   //Read in voltage and current samples.   &lt;br /&gt;
   sampleI = analogRead(inPinI1);&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastFilteredI = filteredI;&lt;br /&gt;
  &lt;br /&gt;
   //Digital high pass filters to remove 1.6V DC offset.&lt;br /&gt;
   filteredI = 0.9989 * (lastFilteredI+sampleI-lastSampleI);&lt;br /&gt;
   &lt;br /&gt;
   //Root-mean-square method current&lt;br /&gt;
   //1) square current values&lt;br /&gt;
   sqI = filteredI * filteredI;&lt;br /&gt;
   //2) sum &lt;br /&gt;
   sumI += sqI;&lt;br /&gt;
   delay(0.0002);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Calculation of the root of the mean of the voltage and current squared (rms)&lt;br /&gt;
//Calibration coeficients applied. &lt;br /&gt;
Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - 0.06;&lt;br /&gt;
if (Irms1 &amp;lt; 0){ Irms1 = 0; }; //Set negative Current to zero&lt;br /&gt;
sumI = 0;&lt;br /&gt;
&lt;br /&gt;
Serial.println(&amp;quot;Irms1:&amp;quot;+String(Irms1));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Download Arduino Sketch==&lt;br /&gt;
&#039;&#039;&#039;Achtung: Ihr müsst das Programm noch an Eure WLAN und EMON Server Parameter anpassen.&#039;&#039;&#039;&lt;br /&gt;
 [[Media:EmonCMS ESP32 v1.zip|Download Arduino Sketch: Emon ESP32]]&lt;br /&gt;
&lt;br /&gt;
= Weblinks =&lt;br /&gt;
&lt;br /&gt;
* https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino Official Page&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=245</id>
		<title>Open Energy Monitor mit dem ESP32</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=245"/>
		<updated>2018-02-05T13:09:11Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Einleitung=&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird beschrieben wie mit Hilfe einer ESP32 Platine ein Strom Sensor für 3 Phasen Wechselstrom aufgebaut werden kann. Der Spannungsteiler aus den 10kOhm Widerständen erzeugt 1,6V für die SCT-013-030 Strom Sensoren. Die Stromsensoren werden mit den ADC Pin&#039;s des ESP32 verbunden. Natürlich sind die Messungen nicht sonderlich genau, da die Phasenverschiebung und Spannung nicht berücksichtigt wird. Auch das wäre durch zusätzliche Transformatoren möglich die dann auf die ADC Pin&#039;s geführt werden. Da ich damit nur meinen ungefähren Stromverbrauch zuhause messen möchte ist die Schaltung völlig ausreichend. Die Kosten für die einzelnen Komponenten sollten 30€ nicht übersteigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folgende Bauteile werden benötigt:&#039;&#039;&#039;&lt;br /&gt;
 -Board: DOIT ESP32 DEVKIT V1 (ca. 10€)&lt;br /&gt;
 -Strom Sensor SCT-013-30 (30A) oder SCT-013-100 (100A) siehe: http://openenergymonitor.org/emon/node/156&lt;br /&gt;
 -6x 10kOhm Widerstände 1/4W&lt;br /&gt;
 -3x Elko 10 uF&lt;br /&gt;
 -Universalplatine&lt;br /&gt;
 -evtl. USB Netzteil oder anderes Netzteil für die Spannungsversorgung&lt;br /&gt;
 -Pfosten Stecker Rastermaß: 2.54mm&lt;br /&gt;
 -3 x 3,5 mm Audio Anschluss&lt;br /&gt;
 -Optional: 1000uF / 10V Kondensator zur Stabilisierung&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pinbelegung des DOIT ESP32 DEVKIT V1 Board:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 https://github.com/playelek/pinout-doit-32devkitv1&lt;br /&gt;
&lt;br /&gt;
=Grundlagen=&lt;br /&gt;
&lt;br /&gt;
Auf der Seite von Open Energy Monitor finden sich genügend Informationen über die Grundlagen der Leistungsberechnung. Das Prinzip lässt sich 1:1 vom Aufbau eines Arduinos übernehmen. Der ESP32 verkraftet jedoch maximal 3,3V am Analog Eingang.&lt;br /&gt;
&lt;br /&gt;
 https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino&lt;br /&gt;
&lt;br /&gt;
=Aufbau=&lt;br /&gt;
&lt;br /&gt;
Auf die Lochrasterplatine müssen nur wenige Bauteile. Die Teile lassen sich relativ einfach einlöten. Für den Aufbau werden nur wenige PIN&#039;s des ESP32 benötigt. Bei meinem Aufbau gibt es am obersten Sensor Anschluss noch einen zusätzlichen Burden Widerstand von 200 Ohm. Das liegt daran das der SCT-013-030 Sensor schon einige Jahre alt ist. Bei den neuen Sensoren sind keine Burden Widerstände nötig, da diese schon einen 62 Ohm Burden eingebaut haben. Ein 1000uF Kondensator zwischen 5V und GND ist empfehlenswert, da je nach 5V Netzteil die Messwerte stark schwanken.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 03.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 05.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 01.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
Ich verwende zum programmieren immer die Arduino Gui. Es sind zuerst einige Anpassungen nötig damit das DOIT ESP32 Board von der Arduino Software erkannt wird. Hierzu muss diese Anleitung umgesetzt werden:&lt;br /&gt;
&lt;br /&gt;
 https://github.com/espressif/arduino-esp32&lt;br /&gt;
&lt;br /&gt;
Nach dem Neustart der Arduino Software kann dann das passende ESP32 Board ausgewählt werden. In meinem Beispiel ist es ein DOIT V1 Board.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 04.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
==Spezielle Hinweise für den ESP32==&lt;br /&gt;
Bei der Programmierung des ESP32 gibt es ein paar Dinge zu beachten. Auf den Boards ist meist ein passender Spannungsregler für 3,3V und ein passender FTDI Chip aufgelötet. Somit entfällt eine weitere Schaltung zur Spannungsversorgung. Zudem wird das Board vom FTDI Chip durch die Arduino Software automatisch in den &amp;quot;Upload Modus&amp;quot; versetzt. Man muss also nicht wie beim ESP8266 bestimmte Taster drücken (Flash und Reset) um das Board in den &amp;quot;Upload Modus&amp;quot; zu bringen.&lt;br /&gt;
&lt;br /&gt;
Ich habe öfters die WifiManager Library für das WLAN verwendet. Auf Dauer hatte ich damit jedoch immer wieder Probleme, so das ich meine WLAN Daten mit Absicht &amp;quot;fest&amp;quot; in das Programm einbaue. Zudem ergibt sich beim WLAN noch ein Problem wenn auf einmal die WLAN Verbindung unterbrochen wird, z.B. wenn der Router neu gestartet wird. Danach verbindet sich der ESP32 nämlich nicht mehr automatisch mit dem WLAN. Um das zu verhindern habe ich folgende Funktion in den Code eingebaut. Die Funktion WifiEvent startet den ESP32 neu wenn keine Verbindung mehr zum WLAN besteht. Leider funktioniert jeder andere Weg im Moment nicht zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//WiFi&lt;br /&gt;
const char* ssid     = &amp;quot;AccessPoint&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;pass&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//WiFi&lt;br /&gt;
void WIFI_Connect()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(2,1);&lt;br /&gt;
  WiFi.disconnect();&lt;br /&gt;
  Serial.println(&amp;quot;Booting Sketch...&amp;quot;);&lt;br /&gt;
  WiFi.mode(WIFI_AP_STA);&lt;br /&gt;
  WiFi.begin(ssid, password);&lt;br /&gt;
    // Wait for connection&lt;br /&gt;
  for (int i = 0; i &amp;lt; 25; i++)&lt;br /&gt;
  {&lt;br /&gt;
    if ( WiFi.status() != WL_CONNECTED ) {&lt;br /&gt;
      delay ( 250 );&lt;br /&gt;
      digitalWrite(2,0);&lt;br /&gt;
      Serial.print ( &amp;quot;.&amp;quot; );&lt;br /&gt;
      delay ( 250 );&lt;br /&gt;
      digitalWrite(2,1);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  digitalWrite(2,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
  //WiFi Part&lt;br /&gt;
  WIFI_Connect();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
//Wifi WatchDog&lt;br /&gt;
WiFi.onEvent(WiFiEvent);&lt;br /&gt;
//Check if WiFi is here&lt;br /&gt;
//Automatically reconnect the ESP32 if the WiFi Router is not there...&lt;br /&gt;
if (WiFi.status() != WL_CONNECTED)&lt;br /&gt;
    {&lt;br /&gt;
      WiFi.onEvent(WiFiEvent);&lt;br /&gt;
      WIFI_Connect();&lt;br /&gt;
    } else {&lt;br /&gt;
      //Do something if the WiFi is available&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Wifi Watchdog&lt;br /&gt;
void WiFiEvent(WiFiEvent_t event) {&lt;br /&gt;
  Serial.printf(&amp;quot;[WiFi-event] event: %d  - &amp;quot;, event);&lt;br /&gt;
  switch(event) {&lt;br /&gt;
  case SYSTEM_EVENT_STA_GOT_IP:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi connected&amp;quot;);&lt;br /&gt;
      Serial.print(&amp;quot;IP address: &amp;quot;); Serial.println(WiFi.localIP());&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_DISCONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi lost connection&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_START:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station start&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_CONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station connected to AP&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_LOST_IP:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 Lost IP&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kalibrierung==&lt;br /&gt;
Als nächstes müssen die Stromsensoren kalibriert werden. Dazu sollten folgende Variablen angepasst werden. Die Kalibrierung habe ich mit einer 100W Lampe und einem Wasserkocher 1800W durchgeführt. Eine genaue Stromzange oder eine Wattmeter sind sehr nützliche Hilfsmittel. In meinem Fall kann der SCT-013-030 als kleinste Einheit 100mA Strom erkennen. Die Sensoren haben 1800 Wicklungen und einen 62 Ohm Burden Widerstand. Der Offset Wert sollte nicht am PC USB Port sondern an einem separaten 5V Netzteil kalibriert werden. Denn die meisten PC USB Anschlüsse liefern bei 200mA nur noch eine Spannung von 4,5V.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;ICAL&#039;&#039;&#039;    = Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 filteredI = &#039;&#039;&#039;0.9989&#039;&#039;&#039; * (lastFilteredI+sampleI-lastSampleI); //Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - &#039;&#039;&#039;0.06&#039;&#039;&#039;;//Offset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Setup variables&lt;br /&gt;
int numberOfSamples = 4000;&lt;br /&gt;
double ICAL = 1.08;&lt;br /&gt;
&lt;br /&gt;
//Set Voltage and current input pins&lt;br /&gt;
int inPinI1 = 34;&lt;br /&gt;
&lt;br /&gt;
// CT: Voltage depends on current, burden resistor, and turns&lt;br /&gt;
#define CT_BURDEN_RESISTOR    62&lt;br /&gt;
#define CT_TURNS              1800&lt;br /&gt;
#define VOLTAGE               225&lt;br /&gt;
&lt;br /&gt;
// Initial gueses for ratios, modified by VCAL/ICAL tweaks&lt;br /&gt;
double I_RATIO = (long double)CT_TURNS / CT_BURDEN_RESISTOR * 3.3 / 4096 * ICAL;&lt;br /&gt;
&lt;br /&gt;
//Filter variables 1&lt;br /&gt;
double lastFilteredI, filteredI;&lt;br /&gt;
double sqI,sumI;&lt;br /&gt;
//Sample variables&lt;br /&gt;
int lastSampleI,sampleI;&lt;br /&gt;
double Irms1;&lt;br /&gt;
unsigned long timer;&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
timer = millis();&lt;br /&gt;
//**************************************************************************&lt;br /&gt;
//Phase1 &lt;br /&gt;
  for (int n=0; n&amp;lt;numberOfSamples; n++)&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastSampleI=sampleI;&lt;br /&gt;
   &lt;br /&gt;
   //Read in voltage and current samples.   &lt;br /&gt;
   sampleI = analogRead(inPinI1);&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastFilteredI = filteredI;&lt;br /&gt;
  &lt;br /&gt;
   //Digital high pass filters to remove 1.6V DC offset.&lt;br /&gt;
   filteredI = 0.9989 * (lastFilteredI+sampleI-lastSampleI);&lt;br /&gt;
   &lt;br /&gt;
   //Root-mean-square method current&lt;br /&gt;
   //1) square current values&lt;br /&gt;
   sqI = filteredI * filteredI;&lt;br /&gt;
   //2) sum &lt;br /&gt;
   sumI += sqI;&lt;br /&gt;
   delay(0.0002);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Calculation of the root of the mean of the voltage and current squared (rms)&lt;br /&gt;
//Calibration coeficients applied. &lt;br /&gt;
Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - 0.06;&lt;br /&gt;
if (Irms1 &amp;lt; 0){ Irms1 = 0; }; //Set negative Current to zero&lt;br /&gt;
sumI = 0;&lt;br /&gt;
&lt;br /&gt;
Serial.println(&amp;quot;Irms1:&amp;quot;+String(Irms1));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Download Arduino Sketch==&lt;br /&gt;
&#039;&#039;&#039;Achtung: Ihr müsst das Programm noch an Eure WLAN und EMON Server Parameter anpassen.&#039;&#039;&#039;&lt;br /&gt;
 [[Media:EmonCMS ESP32 v1.zip|Download Arduino Sketch: Emon ESP32]]&lt;br /&gt;
&lt;br /&gt;
= Weblinks =&lt;br /&gt;
&lt;br /&gt;
* https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino Official Page&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=244</id>
		<title>Open Energy Monitor mit dem ESP32</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=244"/>
		<updated>2018-02-05T13:06:46Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Download Arduino Sketch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Einleitung=&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird beschrieben wie mit Hilfe einer ESP32 Platine ein Strom Sensor für 3 Phasen Wechselstrom aufgebaut werden kann. Der Spannungsteiler aus den 10kOhm Widerständen erzeugt 1,6V für die SCT-013-030 Strom Sensoren. Die Stromsensoren werden mit den ADC Pin&#039;s des ESP32 verbunden. Natürlich sind die Messungen nicht sonderlich genau, da die Phasenverschiebung und Spannung nicht berücksichtigt wird. Auch das wäre durch zusätzliche Transformatoren möglich die dann auf die ADC Pin&#039;s geführt werden. Da ich damit nur meinen ungefähren Stromverbrauch zuhause messen möchte ist die Schaltung völlig ausreichend. Die Kosten für die einzelnen Komponenten sollten 30€ nicht übersteigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folgende Bauteile werden benötigt:&#039;&#039;&#039;&lt;br /&gt;
 -Board: DOIT ESP32 DEVKIT V1 (ca. 10€)&lt;br /&gt;
 -Strom Sensor SCT-013-30 (30A) oder SCT-013-100 (100A) siehe: http://openenergymonitor.org/emon/node/156&lt;br /&gt;
 -6x 10kOhm Widerstände 1/4W&lt;br /&gt;
 -3x Elko 10 uF&lt;br /&gt;
 -Universalplatine&lt;br /&gt;
 -evtl. USB Netzteil oder anderes Netzteil für die Spannungsversorgung&lt;br /&gt;
 -Pfosten Stecker Rastermaß: 2.54mm&lt;br /&gt;
 -3 x 3,5 mm Audio Anschluss&lt;br /&gt;
 -Optional: 1000uF / 10V Kondensator zur Stabilisierung&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pinbelegung des DOIT ESP32 DEVKIT V1 Board:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 https://github.com/playelek/pinout-doit-32devkitv1&lt;br /&gt;
&lt;br /&gt;
=Grundlagen=&lt;br /&gt;
&lt;br /&gt;
Auf der Seite von Open Energy Monitor finden sich genügend Informationen über die Grundlagen der Leistungsberechnung. Das Prinzip lässt sich 1:1 vom Aufbau eines Arduinos übernehmen. Der ESP32 verkraftet jedoch maximal 3,3V am Analog Eingang.&lt;br /&gt;
&lt;br /&gt;
 https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino&lt;br /&gt;
&lt;br /&gt;
=Aufbau=&lt;br /&gt;
&lt;br /&gt;
Auf die Lochrasterplatine müssen nur wenige Bauteile. Die Teile lassen sich relativ einfach einlöten. Für den Aufbau werden nur wenige PIN&#039;s des ESP32 benötigt. Bei meinem Aufbau gibt es am obersten Sensor Anschluss noch einen zusätzlichen Burden Widerstand von 200 Ohm. Das liegt daran das der SCT-013-030 Sensor schon einige Jahre alt ist. Bei den neuen Sensoren sind keine Burden Widerstände nötig, da diese schon einen 62 Ohm Burden eingebaut haben. Ein 1000uF Kondensator zwischen 5V und GND ist empfehlenswert, da je nach 5V Netzteil die Messwerte stark schwanken.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 03.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 05.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 01.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
Ich verwende zum programmieren immer die Arduino Gui. Es sind zuerst einige Anpassungen nötig damit das DOIT ESP32 Board von der Arduino Software erkannt wird. Hierzu muss diese Anleitung umgesetzt werden:&lt;br /&gt;
&lt;br /&gt;
 https://github.com/espressif/arduino-esp32&lt;br /&gt;
&lt;br /&gt;
Nach dem Neustart der Arduino Software kann dann das passende ESP32 Board ausgewählt werden. In meinem Beispiel ist es ein DOIT V1 Board.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 04.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
==Spezielle Hinweise für den ESP32==&lt;br /&gt;
Bei der Programmierung des ESP32 gibt es ein paar Dinge zu beachten. Auf den Boards ist meist ein passender Spannungsregler für 3,3V und ein passender FTDI Chip aufgelötet. Somit entfällt eine weitere Schaltung zur Spannungsversorgung. Zudem wird das Board vom FTDI Chip durch die Arduino Software automatisch in den &amp;quot;Upload Modus&amp;quot; versetzt. Man muss also nicht wie beim ESP8266 bestimmte Taster drücken (Flash und Reset) um das Board in den &amp;quot;Upload Modus&amp;quot; zu bringen.&lt;br /&gt;
&lt;br /&gt;
Ich habe öfters die WifiManager Library für das WLAN verwendet. Auf Dauer hatte ich damit jedoch immer wieder Probleme, so das ich meine WLAN Daten mit Absicht &amp;quot;fest&amp;quot; in das Programm einbaue. Zudem ergibt sich beim WLAN noch ein Problem wenn auf einmal die WLAN Verbindung unterbrochen wird, z.B. wenn der Router neu gestartet wird. Danach verbindet sich der ESP32 nämlich nicht mehr automatisch mit dem WLAN. Um das zu verhindern habe ich folgende Funktion in den Code eingebaut. Die Funktion WifiEvent startet den ESP32 neu wenn keine Verbindung mehr zum WLAN besteht. Leider funktioniert jeder andere Weg im Moment nicht zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//WiFi&lt;br /&gt;
const char* ssid     = &amp;quot;AccessPoint&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;pass&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//WiFi&lt;br /&gt;
void WIFI_Connect()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(2,1);&lt;br /&gt;
  WiFi.disconnect();&lt;br /&gt;
  Serial.println(&amp;quot;Booting Sketch...&amp;quot;);&lt;br /&gt;
  WiFi.mode(WIFI_AP_STA);&lt;br /&gt;
  WiFi.begin(ssid, password);&lt;br /&gt;
    // Wait for connection&lt;br /&gt;
  for (int i = 0; i &amp;lt; 25; i++)&lt;br /&gt;
  {&lt;br /&gt;
    if ( WiFi.status() != WL_CONNECTED ) {&lt;br /&gt;
      delay ( 250 );&lt;br /&gt;
      digitalWrite(2,0);&lt;br /&gt;
      Serial.print ( &amp;quot;.&amp;quot; );&lt;br /&gt;
      delay ( 250 );&lt;br /&gt;
      digitalWrite(2,1);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  digitalWrite(2,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
  //WiFi Part&lt;br /&gt;
  WIFI_Connect();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
//Wifi WatchDog&lt;br /&gt;
WiFi.onEvent(WiFiEvent);&lt;br /&gt;
//Check if WiFi is here&lt;br /&gt;
//Automatically reconnect the ESP32 if the WiFi Router is not there...&lt;br /&gt;
if (WiFi.status() != WL_CONNECTED)&lt;br /&gt;
    {&lt;br /&gt;
      WiFi.onEvent(WiFiEvent);&lt;br /&gt;
      WIFI_Connect();&lt;br /&gt;
    } else {&lt;br /&gt;
      //Do something if the WiFi is available&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Wifi Watchdog&lt;br /&gt;
void WiFiEvent(WiFiEvent_t event) {&lt;br /&gt;
  Serial.printf(&amp;quot;[WiFi-event] event: %d  - &amp;quot;, event);&lt;br /&gt;
  switch(event) {&lt;br /&gt;
  case SYSTEM_EVENT_STA_GOT_IP:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi connected&amp;quot;);&lt;br /&gt;
      Serial.print(&amp;quot;IP address: &amp;quot;); Serial.println(WiFi.localIP());&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_DISCONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi lost connection&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_START:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station start&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_CONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station connected to AP&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_LOST_IP:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 Lost IP&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kalibrierung==&lt;br /&gt;
Als nächstes müssen die Stromsensoren kalibriert werden. Dazu sollten folgende Variablen angepasst werden. Die Kalibrierung habe ich mit einer 100W Lampe und einem Wasserkocher 1800W durchgeführt. Eine genaue Stromzange oder eine Wattmeter sind sehr nützliche Hilfsmittel. In meinem Fall kann der SCT-013-030 als kleinste Einheit 100mA Strom erkennen. Die Sensoren haben 1800 Wicklungen und einen 62 Ohm Burden Widerstand. Der Offset Wert sollte nicht am PC USB Port sondern an einem separaten 5V Netzteil kalibriert werden. Denn die meisten PC USB Anschlüsse liefern bei 200mA nur noch eine Spannung von 4,5V.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;ICAL&#039;&#039;&#039;    = Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 filteredI = &#039;&#039;&#039;0.9989&#039;&#039;&#039; * (lastFilteredI+sampleI-lastSampleI); //Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - &#039;&#039;&#039;0.06&#039;&#039;&#039;;//Offset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Setup variables&lt;br /&gt;
int numberOfSamples = 4000;&lt;br /&gt;
double ICAL = 1.08;&lt;br /&gt;
&lt;br /&gt;
//Set Voltage and current input pins&lt;br /&gt;
int inPinI1 = 34;&lt;br /&gt;
&lt;br /&gt;
// CT: Voltage depends on current, burden resistor, and turns&lt;br /&gt;
#define CT_BURDEN_RESISTOR    62&lt;br /&gt;
#define CT_TURNS              1800&lt;br /&gt;
#define VOLTAGE               225&lt;br /&gt;
&lt;br /&gt;
// Initial gueses for ratios, modified by VCAL/ICAL tweaks&lt;br /&gt;
double I_RATIO = (long double)CT_TURNS / CT_BURDEN_RESISTOR * 3.3 / 4096 * ICAL;&lt;br /&gt;
&lt;br /&gt;
//Filter variables 1&lt;br /&gt;
double lastFilteredI, filteredI;&lt;br /&gt;
double sqI,sumI;&lt;br /&gt;
//Sample variables&lt;br /&gt;
int lastSampleI,sampleI;&lt;br /&gt;
double Irms1;&lt;br /&gt;
unsigned long timer;&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
timer = millis();&lt;br /&gt;
//**************************************************************************&lt;br /&gt;
//Phase1 &lt;br /&gt;
  for (int n=0; n&amp;lt;numberOfSamples; n++)&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastSampleI=sampleI;&lt;br /&gt;
   &lt;br /&gt;
   //Read in voltage and current samples.   &lt;br /&gt;
   sampleI = analogRead(inPinI1);&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastFilteredI = filteredI;&lt;br /&gt;
  &lt;br /&gt;
   //Digital high pass filters to remove 1.6V DC offset.&lt;br /&gt;
   filteredI = 0.9989 * (lastFilteredI+sampleI-lastSampleI);&lt;br /&gt;
   &lt;br /&gt;
   //Root-mean-square method current&lt;br /&gt;
   //1) square current values&lt;br /&gt;
   sqI = filteredI * filteredI;&lt;br /&gt;
   //2) sum &lt;br /&gt;
   sumI += sqI;&lt;br /&gt;
   delay(0.0002);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Calculation of the root of the mean of the voltage and current squared (rms)&lt;br /&gt;
//Calibration coeficients applied. &lt;br /&gt;
Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - 0.06;&lt;br /&gt;
if (Irms1 &amp;lt; 0){ Irms1 = 0; }; //Set negative Current to zero&lt;br /&gt;
sumI = 0;&lt;br /&gt;
&lt;br /&gt;
Serial.println(&amp;quot;Irms1:&amp;quot;+String(Irms1));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Download Arduino Sketch==&lt;br /&gt;
&#039;&#039;&#039;Achtung: Ihr müsst das Programm noch an Eure WLAN und EMON Server Parameter anpassen.&#039;&#039;&#039;&lt;br /&gt;
 [[Media:EmonCMS ESP32 v1.zip|Download Arduino Sketch: Emon ESP32]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=243</id>
		<title>Open Energy Monitor mit dem ESP32</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=243"/>
		<updated>2018-02-05T13:06:34Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Download Arduino Sketch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Einleitung=&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird beschrieben wie mit Hilfe einer ESP32 Platine ein Strom Sensor für 3 Phasen Wechselstrom aufgebaut werden kann. Der Spannungsteiler aus den 10kOhm Widerständen erzeugt 1,6V für die SCT-013-030 Strom Sensoren. Die Stromsensoren werden mit den ADC Pin&#039;s des ESP32 verbunden. Natürlich sind die Messungen nicht sonderlich genau, da die Phasenverschiebung und Spannung nicht berücksichtigt wird. Auch das wäre durch zusätzliche Transformatoren möglich die dann auf die ADC Pin&#039;s geführt werden. Da ich damit nur meinen ungefähren Stromverbrauch zuhause messen möchte ist die Schaltung völlig ausreichend. Die Kosten für die einzelnen Komponenten sollten 30€ nicht übersteigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folgende Bauteile werden benötigt:&#039;&#039;&#039;&lt;br /&gt;
 -Board: DOIT ESP32 DEVKIT V1 (ca. 10€)&lt;br /&gt;
 -Strom Sensor SCT-013-30 (30A) oder SCT-013-100 (100A) siehe: http://openenergymonitor.org/emon/node/156&lt;br /&gt;
 -6x 10kOhm Widerstände 1/4W&lt;br /&gt;
 -3x Elko 10 uF&lt;br /&gt;
 -Universalplatine&lt;br /&gt;
 -evtl. USB Netzteil oder anderes Netzteil für die Spannungsversorgung&lt;br /&gt;
 -Pfosten Stecker Rastermaß: 2.54mm&lt;br /&gt;
 -3 x 3,5 mm Audio Anschluss&lt;br /&gt;
 -Optional: 1000uF / 10V Kondensator zur Stabilisierung&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pinbelegung des DOIT ESP32 DEVKIT V1 Board:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 https://github.com/playelek/pinout-doit-32devkitv1&lt;br /&gt;
&lt;br /&gt;
=Grundlagen=&lt;br /&gt;
&lt;br /&gt;
Auf der Seite von Open Energy Monitor finden sich genügend Informationen über die Grundlagen der Leistungsberechnung. Das Prinzip lässt sich 1:1 vom Aufbau eines Arduinos übernehmen. Der ESP32 verkraftet jedoch maximal 3,3V am Analog Eingang.&lt;br /&gt;
&lt;br /&gt;
 https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino&lt;br /&gt;
&lt;br /&gt;
=Aufbau=&lt;br /&gt;
&lt;br /&gt;
Auf die Lochrasterplatine müssen nur wenige Bauteile. Die Teile lassen sich relativ einfach einlöten. Für den Aufbau werden nur wenige PIN&#039;s des ESP32 benötigt. Bei meinem Aufbau gibt es am obersten Sensor Anschluss noch einen zusätzlichen Burden Widerstand von 200 Ohm. Das liegt daran das der SCT-013-030 Sensor schon einige Jahre alt ist. Bei den neuen Sensoren sind keine Burden Widerstände nötig, da diese schon einen 62 Ohm Burden eingebaut haben. Ein 1000uF Kondensator zwischen 5V und GND ist empfehlenswert, da je nach 5V Netzteil die Messwerte stark schwanken.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 03.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 05.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 01.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
Ich verwende zum programmieren immer die Arduino Gui. Es sind zuerst einige Anpassungen nötig damit das DOIT ESP32 Board von der Arduino Software erkannt wird. Hierzu muss diese Anleitung umgesetzt werden:&lt;br /&gt;
&lt;br /&gt;
 https://github.com/espressif/arduino-esp32&lt;br /&gt;
&lt;br /&gt;
Nach dem Neustart der Arduino Software kann dann das passende ESP32 Board ausgewählt werden. In meinem Beispiel ist es ein DOIT V1 Board.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 04.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
==Spezielle Hinweise für den ESP32==&lt;br /&gt;
Bei der Programmierung des ESP32 gibt es ein paar Dinge zu beachten. Auf den Boards ist meist ein passender Spannungsregler für 3,3V und ein passender FTDI Chip aufgelötet. Somit entfällt eine weitere Schaltung zur Spannungsversorgung. Zudem wird das Board vom FTDI Chip durch die Arduino Software automatisch in den &amp;quot;Upload Modus&amp;quot; versetzt. Man muss also nicht wie beim ESP8266 bestimmte Taster drücken (Flash und Reset) um das Board in den &amp;quot;Upload Modus&amp;quot; zu bringen.&lt;br /&gt;
&lt;br /&gt;
Ich habe öfters die WifiManager Library für das WLAN verwendet. Auf Dauer hatte ich damit jedoch immer wieder Probleme, so das ich meine WLAN Daten mit Absicht &amp;quot;fest&amp;quot; in das Programm einbaue. Zudem ergibt sich beim WLAN noch ein Problem wenn auf einmal die WLAN Verbindung unterbrochen wird, z.B. wenn der Router neu gestartet wird. Danach verbindet sich der ESP32 nämlich nicht mehr automatisch mit dem WLAN. Um das zu verhindern habe ich folgende Funktion in den Code eingebaut. Die Funktion WifiEvent startet den ESP32 neu wenn keine Verbindung mehr zum WLAN besteht. Leider funktioniert jeder andere Weg im Moment nicht zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//WiFi&lt;br /&gt;
const char* ssid     = &amp;quot;AccessPoint&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;pass&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//WiFi&lt;br /&gt;
void WIFI_Connect()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(2,1);&lt;br /&gt;
  WiFi.disconnect();&lt;br /&gt;
  Serial.println(&amp;quot;Booting Sketch...&amp;quot;);&lt;br /&gt;
  WiFi.mode(WIFI_AP_STA);&lt;br /&gt;
  WiFi.begin(ssid, password);&lt;br /&gt;
    // Wait for connection&lt;br /&gt;
  for (int i = 0; i &amp;lt; 25; i++)&lt;br /&gt;
  {&lt;br /&gt;
    if ( WiFi.status() != WL_CONNECTED ) {&lt;br /&gt;
      delay ( 250 );&lt;br /&gt;
      digitalWrite(2,0);&lt;br /&gt;
      Serial.print ( &amp;quot;.&amp;quot; );&lt;br /&gt;
      delay ( 250 );&lt;br /&gt;
      digitalWrite(2,1);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  digitalWrite(2,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
  //WiFi Part&lt;br /&gt;
  WIFI_Connect();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
//Wifi WatchDog&lt;br /&gt;
WiFi.onEvent(WiFiEvent);&lt;br /&gt;
//Check if WiFi is here&lt;br /&gt;
//Automatically reconnect the ESP32 if the WiFi Router is not there...&lt;br /&gt;
if (WiFi.status() != WL_CONNECTED)&lt;br /&gt;
    {&lt;br /&gt;
      WiFi.onEvent(WiFiEvent);&lt;br /&gt;
      WIFI_Connect();&lt;br /&gt;
    } else {&lt;br /&gt;
      //Do something if the WiFi is available&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Wifi Watchdog&lt;br /&gt;
void WiFiEvent(WiFiEvent_t event) {&lt;br /&gt;
  Serial.printf(&amp;quot;[WiFi-event] event: %d  - &amp;quot;, event);&lt;br /&gt;
  switch(event) {&lt;br /&gt;
  case SYSTEM_EVENT_STA_GOT_IP:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi connected&amp;quot;);&lt;br /&gt;
      Serial.print(&amp;quot;IP address: &amp;quot;); Serial.println(WiFi.localIP());&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_DISCONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi lost connection&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_START:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station start&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_CONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station connected to AP&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_LOST_IP:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 Lost IP&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kalibrierung==&lt;br /&gt;
Als nächstes müssen die Stromsensoren kalibriert werden. Dazu sollten folgende Variablen angepasst werden. Die Kalibrierung habe ich mit einer 100W Lampe und einem Wasserkocher 1800W durchgeführt. Eine genaue Stromzange oder eine Wattmeter sind sehr nützliche Hilfsmittel. In meinem Fall kann der SCT-013-030 als kleinste Einheit 100mA Strom erkennen. Die Sensoren haben 1800 Wicklungen und einen 62 Ohm Burden Widerstand. Der Offset Wert sollte nicht am PC USB Port sondern an einem separaten 5V Netzteil kalibriert werden. Denn die meisten PC USB Anschlüsse liefern bei 200mA nur noch eine Spannung von 4,5V.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;ICAL&#039;&#039;&#039;    = Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 filteredI = &#039;&#039;&#039;0.9989&#039;&#039;&#039; * (lastFilteredI+sampleI-lastSampleI); //Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - &#039;&#039;&#039;0.06&#039;&#039;&#039;;//Offset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Setup variables&lt;br /&gt;
int numberOfSamples = 4000;&lt;br /&gt;
double ICAL = 1.08;&lt;br /&gt;
&lt;br /&gt;
//Set Voltage and current input pins&lt;br /&gt;
int inPinI1 = 34;&lt;br /&gt;
&lt;br /&gt;
// CT: Voltage depends on current, burden resistor, and turns&lt;br /&gt;
#define CT_BURDEN_RESISTOR    62&lt;br /&gt;
#define CT_TURNS              1800&lt;br /&gt;
#define VOLTAGE               225&lt;br /&gt;
&lt;br /&gt;
// Initial gueses for ratios, modified by VCAL/ICAL tweaks&lt;br /&gt;
double I_RATIO = (long double)CT_TURNS / CT_BURDEN_RESISTOR * 3.3 / 4096 * ICAL;&lt;br /&gt;
&lt;br /&gt;
//Filter variables 1&lt;br /&gt;
double lastFilteredI, filteredI;&lt;br /&gt;
double sqI,sumI;&lt;br /&gt;
//Sample variables&lt;br /&gt;
int lastSampleI,sampleI;&lt;br /&gt;
double Irms1;&lt;br /&gt;
unsigned long timer;&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
timer = millis();&lt;br /&gt;
//**************************************************************************&lt;br /&gt;
//Phase1 &lt;br /&gt;
  for (int n=0; n&amp;lt;numberOfSamples; n++)&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastSampleI=sampleI;&lt;br /&gt;
   &lt;br /&gt;
   //Read in voltage and current samples.   &lt;br /&gt;
   sampleI = analogRead(inPinI1);&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastFilteredI = filteredI;&lt;br /&gt;
  &lt;br /&gt;
   //Digital high pass filters to remove 1.6V DC offset.&lt;br /&gt;
   filteredI = 0.9989 * (lastFilteredI+sampleI-lastSampleI);&lt;br /&gt;
   &lt;br /&gt;
   //Root-mean-square method current&lt;br /&gt;
   //1) square current values&lt;br /&gt;
   sqI = filteredI * filteredI;&lt;br /&gt;
   //2) sum &lt;br /&gt;
   sumI += sqI;&lt;br /&gt;
   delay(0.0002);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Calculation of the root of the mean of the voltage and current squared (rms)&lt;br /&gt;
//Calibration coeficients applied. &lt;br /&gt;
Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - 0.06;&lt;br /&gt;
if (Irms1 &amp;lt; 0){ Irms1 = 0; }; //Set negative Current to zero&lt;br /&gt;
sumI = 0;&lt;br /&gt;
&lt;br /&gt;
Serial.println(&amp;quot;Irms1:&amp;quot;+String(Irms1));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Download Arduino Sketch==&lt;br /&gt;
&#039;&#039;&#039;Achtung: Ihr müsst das Programm noch an Eure WLAN und EMON Server Werte anpassen.&#039;&#039;&#039;&lt;br /&gt;
 [[Media:EmonCMS ESP32 v1.zip|Download Arduino Sketch: Emon ESP32]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=242</id>
		<title>Open Energy Monitor mit dem ESP32</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=242"/>
		<updated>2018-02-05T13:06:18Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Einleitung=&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird beschrieben wie mit Hilfe einer ESP32 Platine ein Strom Sensor für 3 Phasen Wechselstrom aufgebaut werden kann. Der Spannungsteiler aus den 10kOhm Widerständen erzeugt 1,6V für die SCT-013-030 Strom Sensoren. Die Stromsensoren werden mit den ADC Pin&#039;s des ESP32 verbunden. Natürlich sind die Messungen nicht sonderlich genau, da die Phasenverschiebung und Spannung nicht berücksichtigt wird. Auch das wäre durch zusätzliche Transformatoren möglich die dann auf die ADC Pin&#039;s geführt werden. Da ich damit nur meinen ungefähren Stromverbrauch zuhause messen möchte ist die Schaltung völlig ausreichend. Die Kosten für die einzelnen Komponenten sollten 30€ nicht übersteigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folgende Bauteile werden benötigt:&#039;&#039;&#039;&lt;br /&gt;
 -Board: DOIT ESP32 DEVKIT V1 (ca. 10€)&lt;br /&gt;
 -Strom Sensor SCT-013-30 (30A) oder SCT-013-100 (100A) siehe: http://openenergymonitor.org/emon/node/156&lt;br /&gt;
 -6x 10kOhm Widerstände 1/4W&lt;br /&gt;
 -3x Elko 10 uF&lt;br /&gt;
 -Universalplatine&lt;br /&gt;
 -evtl. USB Netzteil oder anderes Netzteil für die Spannungsversorgung&lt;br /&gt;
 -Pfosten Stecker Rastermaß: 2.54mm&lt;br /&gt;
 -3 x 3,5 mm Audio Anschluss&lt;br /&gt;
 -Optional: 1000uF / 10V Kondensator zur Stabilisierung&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pinbelegung des DOIT ESP32 DEVKIT V1 Board:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 https://github.com/playelek/pinout-doit-32devkitv1&lt;br /&gt;
&lt;br /&gt;
=Grundlagen=&lt;br /&gt;
&lt;br /&gt;
Auf der Seite von Open Energy Monitor finden sich genügend Informationen über die Grundlagen der Leistungsberechnung. Das Prinzip lässt sich 1:1 vom Aufbau eines Arduinos übernehmen. Der ESP32 verkraftet jedoch maximal 3,3V am Analog Eingang.&lt;br /&gt;
&lt;br /&gt;
 https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino&lt;br /&gt;
&lt;br /&gt;
=Aufbau=&lt;br /&gt;
&lt;br /&gt;
Auf die Lochrasterplatine müssen nur wenige Bauteile. Die Teile lassen sich relativ einfach einlöten. Für den Aufbau werden nur wenige PIN&#039;s des ESP32 benötigt. Bei meinem Aufbau gibt es am obersten Sensor Anschluss noch einen zusätzlichen Burden Widerstand von 200 Ohm. Das liegt daran das der SCT-013-030 Sensor schon einige Jahre alt ist. Bei den neuen Sensoren sind keine Burden Widerstände nötig, da diese schon einen 62 Ohm Burden eingebaut haben. Ein 1000uF Kondensator zwischen 5V und GND ist empfehlenswert, da je nach 5V Netzteil die Messwerte stark schwanken.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 03.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 05.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 01.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
Ich verwende zum programmieren immer die Arduino Gui. Es sind zuerst einige Anpassungen nötig damit das DOIT ESP32 Board von der Arduino Software erkannt wird. Hierzu muss diese Anleitung umgesetzt werden:&lt;br /&gt;
&lt;br /&gt;
 https://github.com/espressif/arduino-esp32&lt;br /&gt;
&lt;br /&gt;
Nach dem Neustart der Arduino Software kann dann das passende ESP32 Board ausgewählt werden. In meinem Beispiel ist es ein DOIT V1 Board.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 04.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
==Spezielle Hinweise für den ESP32==&lt;br /&gt;
Bei der Programmierung des ESP32 gibt es ein paar Dinge zu beachten. Auf den Boards ist meist ein passender Spannungsregler für 3,3V und ein passender FTDI Chip aufgelötet. Somit entfällt eine weitere Schaltung zur Spannungsversorgung. Zudem wird das Board vom FTDI Chip durch die Arduino Software automatisch in den &amp;quot;Upload Modus&amp;quot; versetzt. Man muss also nicht wie beim ESP8266 bestimmte Taster drücken (Flash und Reset) um das Board in den &amp;quot;Upload Modus&amp;quot; zu bringen.&lt;br /&gt;
&lt;br /&gt;
Ich habe öfters die WifiManager Library für das WLAN verwendet. Auf Dauer hatte ich damit jedoch immer wieder Probleme, so das ich meine WLAN Daten mit Absicht &amp;quot;fest&amp;quot; in das Programm einbaue. Zudem ergibt sich beim WLAN noch ein Problem wenn auf einmal die WLAN Verbindung unterbrochen wird, z.B. wenn der Router neu gestartet wird. Danach verbindet sich der ESP32 nämlich nicht mehr automatisch mit dem WLAN. Um das zu verhindern habe ich folgende Funktion in den Code eingebaut. Die Funktion WifiEvent startet den ESP32 neu wenn keine Verbindung mehr zum WLAN besteht. Leider funktioniert jeder andere Weg im Moment nicht zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//WiFi&lt;br /&gt;
const char* ssid     = &amp;quot;AccessPoint&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;pass&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//WiFi&lt;br /&gt;
void WIFI_Connect()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(2,1);&lt;br /&gt;
  WiFi.disconnect();&lt;br /&gt;
  Serial.println(&amp;quot;Booting Sketch...&amp;quot;);&lt;br /&gt;
  WiFi.mode(WIFI_AP_STA);&lt;br /&gt;
  WiFi.begin(ssid, password);&lt;br /&gt;
    // Wait for connection&lt;br /&gt;
  for (int i = 0; i &amp;lt; 25; i++)&lt;br /&gt;
  {&lt;br /&gt;
    if ( WiFi.status() != WL_CONNECTED ) {&lt;br /&gt;
      delay ( 250 );&lt;br /&gt;
      digitalWrite(2,0);&lt;br /&gt;
      Serial.print ( &amp;quot;.&amp;quot; );&lt;br /&gt;
      delay ( 250 );&lt;br /&gt;
      digitalWrite(2,1);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  digitalWrite(2,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
  //WiFi Part&lt;br /&gt;
  WIFI_Connect();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
//Wifi WatchDog&lt;br /&gt;
WiFi.onEvent(WiFiEvent);&lt;br /&gt;
//Check if WiFi is here&lt;br /&gt;
//Automatically reconnect the ESP32 if the WiFi Router is not there...&lt;br /&gt;
if (WiFi.status() != WL_CONNECTED)&lt;br /&gt;
    {&lt;br /&gt;
      WiFi.onEvent(WiFiEvent);&lt;br /&gt;
      WIFI_Connect();&lt;br /&gt;
    } else {&lt;br /&gt;
      //Do something if the WiFi is available&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Wifi Watchdog&lt;br /&gt;
void WiFiEvent(WiFiEvent_t event) {&lt;br /&gt;
  Serial.printf(&amp;quot;[WiFi-event] event: %d  - &amp;quot;, event);&lt;br /&gt;
  switch(event) {&lt;br /&gt;
  case SYSTEM_EVENT_STA_GOT_IP:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi connected&amp;quot;);&lt;br /&gt;
      Serial.print(&amp;quot;IP address: &amp;quot;); Serial.println(WiFi.localIP());&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_DISCONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi lost connection&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_START:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station start&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_CONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station connected to AP&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_LOST_IP:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 Lost IP&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kalibrierung==&lt;br /&gt;
Als nächstes müssen die Stromsensoren kalibriert werden. Dazu sollten folgende Variablen angepasst werden. Die Kalibrierung habe ich mit einer 100W Lampe und einem Wasserkocher 1800W durchgeführt. Eine genaue Stromzange oder eine Wattmeter sind sehr nützliche Hilfsmittel. In meinem Fall kann der SCT-013-030 als kleinste Einheit 100mA Strom erkennen. Die Sensoren haben 1800 Wicklungen und einen 62 Ohm Burden Widerstand. Der Offset Wert sollte nicht am PC USB Port sondern an einem separaten 5V Netzteil kalibriert werden. Denn die meisten PC USB Anschlüsse liefern bei 200mA nur noch eine Spannung von 4,5V.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;ICAL&#039;&#039;&#039;    = Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 filteredI = &#039;&#039;&#039;0.9989&#039;&#039;&#039; * (lastFilteredI+sampleI-lastSampleI); //Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - &#039;&#039;&#039;0.06&#039;&#039;&#039;;//Offset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Setup variables&lt;br /&gt;
int numberOfSamples = 4000;&lt;br /&gt;
double ICAL = 1.08;&lt;br /&gt;
&lt;br /&gt;
//Set Voltage and current input pins&lt;br /&gt;
int inPinI1 = 34;&lt;br /&gt;
&lt;br /&gt;
// CT: Voltage depends on current, burden resistor, and turns&lt;br /&gt;
#define CT_BURDEN_RESISTOR    62&lt;br /&gt;
#define CT_TURNS              1800&lt;br /&gt;
#define VOLTAGE               225&lt;br /&gt;
&lt;br /&gt;
// Initial gueses for ratios, modified by VCAL/ICAL tweaks&lt;br /&gt;
double I_RATIO = (long double)CT_TURNS / CT_BURDEN_RESISTOR * 3.3 / 4096 * ICAL;&lt;br /&gt;
&lt;br /&gt;
//Filter variables 1&lt;br /&gt;
double lastFilteredI, filteredI;&lt;br /&gt;
double sqI,sumI;&lt;br /&gt;
//Sample variables&lt;br /&gt;
int lastSampleI,sampleI;&lt;br /&gt;
double Irms1;&lt;br /&gt;
unsigned long timer;&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
timer = millis();&lt;br /&gt;
//**************************************************************************&lt;br /&gt;
//Phase1 &lt;br /&gt;
  for (int n=0; n&amp;lt;numberOfSamples; n++)&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastSampleI=sampleI;&lt;br /&gt;
   &lt;br /&gt;
   //Read in voltage and current samples.   &lt;br /&gt;
   sampleI = analogRead(inPinI1);&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastFilteredI = filteredI;&lt;br /&gt;
  &lt;br /&gt;
   //Digital high pass filters to remove 1.6V DC offset.&lt;br /&gt;
   filteredI = 0.9989 * (lastFilteredI+sampleI-lastSampleI);&lt;br /&gt;
   &lt;br /&gt;
   //Root-mean-square method current&lt;br /&gt;
   //1) square current values&lt;br /&gt;
   sqI = filteredI * filteredI;&lt;br /&gt;
   //2) sum &lt;br /&gt;
   sumI += sqI;&lt;br /&gt;
   delay(0.0002);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Calculation of the root of the mean of the voltage and current squared (rms)&lt;br /&gt;
//Calibration coeficients applied. &lt;br /&gt;
Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - 0.06;&lt;br /&gt;
if (Irms1 &amp;lt; 0){ Irms1 = 0; }; //Set negative Current to zero&lt;br /&gt;
sumI = 0;&lt;br /&gt;
&lt;br /&gt;
Serial.println(&amp;quot;Irms1:&amp;quot;+String(Irms1));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Download Arduino Sketch==&lt;br /&gt;
Ihr müsst das Programm noch an Eure WLAN und EMON Server Werte anpassen.&lt;br /&gt;
 [[Media:EmonCMS ESP32 v1.zip|Download Arduino Sketch: Emon ESP32]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=241</id>
		<title>Open Energy Monitor mit dem ESP32</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=241"/>
		<updated>2018-02-05T13:04:32Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Einleitung=&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird beschrieben wie mit Hilfe einer ESP32 Platine ein Strom Sensor für 3 Phasen Wechselstrom aufgebaut werden kann. Der Spannungsteiler aus den 10kOhm Widerständen erzeugt 1,6V für die SCT-013-030 Strom Sensoren. Die Stromsensoren werden mit den ADC Pin&#039;s des ESP32 verbunden. Natürlich sind die Messungen nicht sonderlich genau, da die Phasenverschiebung und Spannung nicht berücksichtigt wird. Auch das wäre durch zusätzliche Transformatoren möglich die dann auf die ADC Pin&#039;s geführt werden. Da ich damit nur meinen ungefähren Stromverbrauch zuhause messen möchte ist die Schaltung völlig ausreichend. Die Kosten für die einzelnen Komponenten sollten 30€ nicht übersteigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folgende Bauteile werden benötigt:&#039;&#039;&#039;&lt;br /&gt;
 -Board: DOIT ESP32 DEVKIT V1 (ca. 10€)&lt;br /&gt;
 -Strom Sensor SCT-013-30 (30A) oder SCT-013-100 (100A) siehe: http://openenergymonitor.org/emon/node/156&lt;br /&gt;
 -6x 10kOhm Widerstände 1/4W&lt;br /&gt;
 -3x Elko 10 uF&lt;br /&gt;
 -Universalplatine&lt;br /&gt;
 -evtl. USB Netzteil oder anderes Netzteil für die Spannungsversorgung&lt;br /&gt;
 -Pfosten Stecker Rastermaß: 2.54mm&lt;br /&gt;
 -3 x 3,5 mm Audio Anschluss&lt;br /&gt;
 -Optional: 1000uF / 10V Kondensator zur Stabilisierung&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pinbelegung des DOIT ESP32 DEVKIT V1 Board:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 https://github.com/playelek/pinout-doit-32devkitv1&lt;br /&gt;
&lt;br /&gt;
=Grundlagen=&lt;br /&gt;
&lt;br /&gt;
Auf der Seite von Open Energy Monitor finden sich genügend Informationen über die Grundlagen der Leistungsberechnung. Das Prinzip lässt sich 1:1 vom Aufbau eines Arduinos übernehmen. Der ESP32 verkraftet jedoch maximal 3,3V am Analog Eingang.&lt;br /&gt;
&lt;br /&gt;
 https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino&lt;br /&gt;
&lt;br /&gt;
=Aufbau=&lt;br /&gt;
&lt;br /&gt;
Auf die Lochrasterplatine müssen nur wenige Bauteile. Die Teile lassen sich relativ einfach einlöten. Für den Aufbau werden nur wenige PIN&#039;s des ESP32 benötigt. Bei meinem Aufbau gibt es am obersten Sensor Anschluss noch einen zusätzlichen Burden Widerstand von 200 Ohm. Das liegt daran das der SCT-013-030 Sensor schon einige Jahre alt ist. Bei den neuen Sensoren sind keine Burden Widerstände nötig, da diese schon einen 62 Ohm Burden eingebaut haben. Ein 1000uF Kondensator zwischen 5V und GND ist empfehlenswert, da je nach 5V Netzteil die Messwerte stark schwanken.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 03.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 05.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 01.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
Ich verwende zum programmieren immer die Arduino Gui. Es sind zuerst einige Anpassungen nötig damit das DOIT ESP32 Board von der Arduino Software erkannt wird. Hierzu muss diese Anleitung umgesetzt werden:&lt;br /&gt;
&lt;br /&gt;
 https://github.com/espressif/arduino-esp32&lt;br /&gt;
&lt;br /&gt;
Nach dem Neustart der Arduino Software kann dann das passende ESP32 Board ausgewählt werden. In meinem Beispiel ist es ein DOIT V1 Board.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 04.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
==Spezielle Hinweise für den ESP32==&lt;br /&gt;
Bei der Programmierung des ESP32 gibt es ein paar Dinge zu beachten. Auf den Boards ist meist ein passender Spannungsregler für 3,3V und ein passender FTDI Chip aufgelötet. Somit entfällt eine weitere Schaltung zur Spannungsversorgung. Zudem wird das Board vom FTDI Chip durch die Arduino Software automatisch in den &amp;quot;Upload Modus&amp;quot; versetzt. Man muss also nicht wie beim ESP8266 bestimmte Taster drücken (Flash und Reset) um das Board in den &amp;quot;Upload Modus&amp;quot; zu bringen.&lt;br /&gt;
&lt;br /&gt;
Ich habe öfters die WifiManager Library für das WLAN verwendet. Auf Dauer hatte ich damit jedoch immer wieder Probleme, so das ich meine WLAN Daten mit Absicht &amp;quot;fest&amp;quot; in das Programm einbaue. Zudem ergibt sich beim WLAN noch ein Problem wenn auf einmal die WLAN Verbindung unterbrochen wird, z.B. wenn der Router neu gestartet wird. Danach verbindet sich der ESP32 nämlich nicht mehr automatisch mit dem WLAN. Um das zu verhindern habe ich folgende Funktion in den Code eingebaut. Die Funktion WifiEvent startet den ESP32 neu wenn keine Verbindung mehr zum WLAN besteht. Leider funktioniert jeder andere Weg im Moment nicht zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//WiFi&lt;br /&gt;
const char* ssid     = &amp;quot;AccessPoint&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;pass&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//WiFi&lt;br /&gt;
void WIFI_Connect()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(2,1);&lt;br /&gt;
  WiFi.disconnect();&lt;br /&gt;
  Serial.println(&amp;quot;Booting Sketch...&amp;quot;);&lt;br /&gt;
  WiFi.mode(WIFI_AP_STA);&lt;br /&gt;
  WiFi.begin(ssid, password);&lt;br /&gt;
    // Wait for connection&lt;br /&gt;
  for (int i = 0; i &amp;lt; 25; i++)&lt;br /&gt;
  {&lt;br /&gt;
    if ( WiFi.status() != WL_CONNECTED ) {&lt;br /&gt;
      delay ( 250 );&lt;br /&gt;
      digitalWrite(2,0);&lt;br /&gt;
      Serial.print ( &amp;quot;.&amp;quot; );&lt;br /&gt;
      delay ( 250 );&lt;br /&gt;
      digitalWrite(2,1);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  digitalWrite(2,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
  //WiFi Part&lt;br /&gt;
  WIFI_Connect();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
//Wifi WatchDog&lt;br /&gt;
WiFi.onEvent(WiFiEvent);&lt;br /&gt;
//Check if WiFi is here&lt;br /&gt;
//Automatically reconnect the ESP32 if the WiFi Router is not there...&lt;br /&gt;
if (WiFi.status() != WL_CONNECTED)&lt;br /&gt;
    {&lt;br /&gt;
      WiFi.onEvent(WiFiEvent);&lt;br /&gt;
      WIFI_Connect();&lt;br /&gt;
    } else {&lt;br /&gt;
      //Do something if the WiFi is available&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Wifi Watchdog&lt;br /&gt;
void WiFiEvent(WiFiEvent_t event) {&lt;br /&gt;
  Serial.printf(&amp;quot;[WiFi-event] event: %d  - &amp;quot;, event);&lt;br /&gt;
  switch(event) {&lt;br /&gt;
  case SYSTEM_EVENT_STA_GOT_IP:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi connected&amp;quot;);&lt;br /&gt;
      Serial.print(&amp;quot;IP address: &amp;quot;); Serial.println(WiFi.localIP());&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_DISCONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi lost connection&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_START:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station start&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_CONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station connected to AP&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_LOST_IP:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 Lost IP&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Download Arduino Sketch==&lt;br /&gt;
 [[Media:EmonCMS ESP32 v1.zip|Download Arduino Sketch: Emon ESP32]]&lt;br /&gt;
&lt;br /&gt;
==Kalibrierung==&lt;br /&gt;
Als nächstes müssen die Stromsensoren kalibriert werden. Dazu sollten folgende Variablen angepasst werden. Die Kalibrierung habe ich mit einer 100W Lampe und einem Wasserkocher 1800W durchgeführt. Eine genaue Stromzange oder eine Wattmeter sind sehr nützliche Hilfsmittel. In meinem Fall kann der SCT-013-030 als kleinste Einheit 100mA Strom erkennen. Die Sensoren haben 1800 Wicklungen und einen 62 Ohm Burden Widerstand. Der Offset Wert sollte nicht am PC USB Port sondern an einem separaten 5V Netzteil kalibriert werden. Denn die meisten PC USB Anschlüsse liefern bei 200mA nur noch eine Spannung von 4,5V.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;ICAL&#039;&#039;&#039;    = Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 filteredI = &#039;&#039;&#039;0.9989&#039;&#039;&#039; * (lastFilteredI+sampleI-lastSampleI); //Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - &#039;&#039;&#039;0.06&#039;&#039;&#039;;//Offset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Setup variables&lt;br /&gt;
int numberOfSamples = 4000;&lt;br /&gt;
double ICAL = 1.08;&lt;br /&gt;
&lt;br /&gt;
//Set Voltage and current input pins&lt;br /&gt;
int inPinI1 = 34;&lt;br /&gt;
&lt;br /&gt;
// CT: Voltage depends on current, burden resistor, and turns&lt;br /&gt;
#define CT_BURDEN_RESISTOR    62&lt;br /&gt;
#define CT_TURNS              1800&lt;br /&gt;
#define VOLTAGE               225&lt;br /&gt;
&lt;br /&gt;
// Initial gueses for ratios, modified by VCAL/ICAL tweaks&lt;br /&gt;
double I_RATIO = (long double)CT_TURNS / CT_BURDEN_RESISTOR * 3.3 / 4096 * ICAL;&lt;br /&gt;
&lt;br /&gt;
//Filter variables 1&lt;br /&gt;
double lastFilteredI, filteredI;&lt;br /&gt;
double sqI,sumI;&lt;br /&gt;
//Sample variables&lt;br /&gt;
int lastSampleI,sampleI;&lt;br /&gt;
double Irms1;&lt;br /&gt;
unsigned long timer;&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
timer = millis();&lt;br /&gt;
//**************************************************************************&lt;br /&gt;
//Phase1 &lt;br /&gt;
  for (int n=0; n&amp;lt;numberOfSamples; n++)&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastSampleI=sampleI;&lt;br /&gt;
   &lt;br /&gt;
   //Read in voltage and current samples.   &lt;br /&gt;
   sampleI = analogRead(inPinI1);&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastFilteredI = filteredI;&lt;br /&gt;
  &lt;br /&gt;
   //Digital high pass filters to remove 1.6V DC offset.&lt;br /&gt;
   filteredI = 0.9989 * (lastFilteredI+sampleI-lastSampleI);&lt;br /&gt;
   &lt;br /&gt;
   //Root-mean-square method current&lt;br /&gt;
   //1) square current values&lt;br /&gt;
   sqI = filteredI * filteredI;&lt;br /&gt;
   //2) sum &lt;br /&gt;
   sumI += sqI;&lt;br /&gt;
   delay(0.0002);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Calculation of the root of the mean of the voltage and current squared (rms)&lt;br /&gt;
//Calibration coeficients applied. &lt;br /&gt;
Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - 0.06;&lt;br /&gt;
if (Irms1 &amp;lt; 0){ Irms1 = 0; }; //Set negative Current to zero&lt;br /&gt;
sumI = 0;&lt;br /&gt;
&lt;br /&gt;
Serial.println(&amp;quot;Irms1:&amp;quot;+String(Irms1));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Datei:EmonCMS_ESP32_v1.zip&amp;diff=240</id>
		<title>Datei:EmonCMS ESP32 v1.zip</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Datei:EmonCMS_ESP32_v1.zip&amp;diff=240"/>
		<updated>2018-02-05T13:03:05Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=239</id>
		<title>Open Energy Monitor mit dem ESP32</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=239"/>
		<updated>2018-02-05T12:43:53Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Spezielle Hinweise für den ESP32 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Einleitung=&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird beschrieben wie mit Hilfe einer ESP32 Platine ein Strom Sensor für 3 Phasen Wechselstrom aufgebaut werden kann. Der Spannungsteiler aus den 10kOhm Widerständen erzeugt 1,6V für die SCT-013-030 Strom Sensoren. Die Stromsensoren werden mit den ADC Pin&#039;s des ESP32 verbunden. Natürlich sind die Messungen nicht sonderlich genau, da die Phasenverschiebung und Spannung nicht berücksichtigt wird. Auch das wäre durch zusätzliche Transformatoren möglich die dann auf die ADC Pin&#039;s geführt werden. Da ich damit nur meinen ungefähren Stromverbrauch zuhause messen möchte ist die Schaltung völlig ausreichend. Die Kosten für die einzelnen Komponenten sollten 30€ nicht übersteigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folgende Bauteile werden benötigt:&#039;&#039;&#039;&lt;br /&gt;
 -Board: DOIT ESP32 DEVKIT V1 (ca. 10€)&lt;br /&gt;
 -Strom Sensor SCT-013-30 (30A) oder SCT-013-100 (100A) siehe: http://openenergymonitor.org/emon/node/156&lt;br /&gt;
 -6x 10kOhm Widerstände 1/4W&lt;br /&gt;
 -3x Elko 10 uF&lt;br /&gt;
 -Universalplatine&lt;br /&gt;
 -evtl. USB Netzteil oder anderes Netzteil für die Spannungsversorgung&lt;br /&gt;
 -Pfosten Stecker Rastermaß: 2.54mm&lt;br /&gt;
 -3 x 3,5 mm Audio Anschluss&lt;br /&gt;
 -Optional: 1000uF / 10V Kondensator zur Stabilisierung&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pinbelegung des DOIT ESP32 DEVKIT V1 Board:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 https://github.com/playelek/pinout-doit-32devkitv1&lt;br /&gt;
&lt;br /&gt;
=Grundlagen=&lt;br /&gt;
&lt;br /&gt;
Auf der Seite von Open Energy Monitor finden sich genügend Informationen über die Grundlagen der Leistungsberechnung. Das Prinzip lässt sich 1:1 vom Aufbau eines Arduinos übernehmen. Der ESP32 verkraftet jedoch maximal 3,3V am Analog Eingang.&lt;br /&gt;
&lt;br /&gt;
 https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino&lt;br /&gt;
&lt;br /&gt;
=Aufbau=&lt;br /&gt;
&lt;br /&gt;
Auf die Lochrasterplatine müssen nur wenige Bauteile. Die Teile lassen sich relativ einfach einlöten. Für den Aufbau werden nur wenige PIN&#039;s des ESP32 benötigt. Bei meinem Aufbau gibt es am obersten Sensor Anschluss noch einen zusätzlichen Burden Widerstand von 200 Ohm. Das liegt daran das der SCT-013-030 Sensor schon einige Jahre alt ist. Bei den neuen Sensoren sind keine Burden Widerstände nötig, da diese schon einen 62 Ohm Burden eingebaut haben. Ein 1000uF Kondensator zwischen 5V und GND ist empfehlenswert, da je nach 5V Netzteil die Messwerte stark schwanken.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 03.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 05.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 01.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
Ich verwende zum programmieren immer die Arduino Gui. Es sind zuerst einige Anpassungen nötig damit das DOIT ESP32 Board von der Arduino Software erkannt wird. Hierzu muss diese Anleitung umgesetzt werden:&lt;br /&gt;
&lt;br /&gt;
 https://github.com/espressif/arduino-esp32&lt;br /&gt;
&lt;br /&gt;
Nach dem Neustart der Arduino Software kann dann das passende ESP32 Board ausgewählt werden. In meinem Beispiel ist es ein DOIT V1 Board.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 04.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
==Spezielle Hinweise für den ESP32==&lt;br /&gt;
Bei der Programmierung des ESP32 gibt es ein paar Dinge zu beachten. Auf den Boards ist meist ein passender Spannungsregler für 3,3V und ein passender FTDI Chip aufgelötet. Somit entfällt eine weitere Schaltung zur Spannungsversorgung. Zudem wird das Board vom FTDI Chip durch die Arduino Software automatisch in den &amp;quot;Upload Modus&amp;quot; versetzt. Man muss also nicht wie beim ESP8266 bestimmte Taster drücken (Flash und Reset) um das Board in den &amp;quot;Upload Modus&amp;quot; zu bringen.&lt;br /&gt;
&lt;br /&gt;
Ich habe öfters die WifiManager Library für das WLAN verwendet. Auf Dauer hatte ich damit jedoch immer wieder Probleme, so das ich meine WLAN Daten mit Absicht &amp;quot;fest&amp;quot; in das Programm einbaue. Zudem ergibt sich beim WLAN noch ein Problem wenn auf einmal die WLAN Verbindung unterbrochen wird, z.B. wenn der Router neu gestartet wird. Danach verbindet sich der ESP32 nämlich nicht mehr automatisch mit dem WLAN. Um das zu verhindern habe ich folgende Funktion in den Code eingebaut. Die Funktion WifiEvent startet den ESP32 neu wenn keine Verbindung mehr zum WLAN besteht. Leider funktioniert jeder andere Weg im Moment nicht zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//WiFi&lt;br /&gt;
const char* ssid     = &amp;quot;AccessPoint&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;pass&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//WiFi&lt;br /&gt;
void WIFI_Connect()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(2,1);&lt;br /&gt;
  WiFi.disconnect();&lt;br /&gt;
  Serial.println(&amp;quot;Booting Sketch...&amp;quot;);&lt;br /&gt;
  WiFi.mode(WIFI_AP_STA);&lt;br /&gt;
  WiFi.begin(ssid, password);&lt;br /&gt;
    // Wait for connection&lt;br /&gt;
  for (int i = 0; i &amp;lt; 25; i++)&lt;br /&gt;
  {&lt;br /&gt;
    if ( WiFi.status() != WL_CONNECTED ) {&lt;br /&gt;
      delay ( 250 );&lt;br /&gt;
      digitalWrite(2,0);&lt;br /&gt;
      Serial.print ( &amp;quot;.&amp;quot; );&lt;br /&gt;
      delay ( 250 );&lt;br /&gt;
      digitalWrite(2,1);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  digitalWrite(2,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
  //WiFi Part&lt;br /&gt;
  WIFI_Connect();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
//Wifi WatchDog&lt;br /&gt;
WiFi.onEvent(WiFiEvent);&lt;br /&gt;
//Check if WiFi is here&lt;br /&gt;
//Automatically reconnect the ESP32 if the WiFi Router is not there...&lt;br /&gt;
if (WiFi.status() != WL_CONNECTED)&lt;br /&gt;
    {&lt;br /&gt;
      WiFi.onEvent(WiFiEvent);&lt;br /&gt;
      WIFI_Connect();&lt;br /&gt;
    } else {&lt;br /&gt;
      //Do something if the WiFi is available&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Wifi Watchdog&lt;br /&gt;
void WiFiEvent(WiFiEvent_t event) {&lt;br /&gt;
  Serial.printf(&amp;quot;[WiFi-event] event: %d  - &amp;quot;, event);&lt;br /&gt;
  switch(event) {&lt;br /&gt;
  case SYSTEM_EVENT_STA_GOT_IP:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi connected&amp;quot;);&lt;br /&gt;
      Serial.print(&amp;quot;IP address: &amp;quot;); Serial.println(WiFi.localIP());&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_DISCONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi lost connection&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_START:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station start&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_CONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station connected to AP&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_LOST_IP:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 Lost IP&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kalibrierung==&lt;br /&gt;
Als nächstes müssen die Stromsensoren kalibriert werden. Dazu sollten folgende Variablen angepasst werden. Die Kalibrierung habe ich mit einer 100W Lampe und einem Wasserkocher 1800W durchgeführt. Eine genaue Stromzange oder eine Wattmeter sind sehr nützliche Hilfsmittel. In meinem Fall kann der SCT-013-030 als kleinste Einheit 100mA Strom erkennen. Die Sensoren haben 1800 Wicklungen und einen 62 Ohm Burden Widerstand. Der Offset Wert sollte nicht am PC USB Port sondern an einem separaten 5V Netzteil kalibriert werden. Denn die meisten PC USB Anschlüsse liefern bei 200mA nur noch eine Spannung von 4,5V.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;ICAL&#039;&#039;&#039;    = Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 filteredI = &#039;&#039;&#039;0.9989&#039;&#039;&#039; * (lastFilteredI+sampleI-lastSampleI); //Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - &#039;&#039;&#039;0.06&#039;&#039;&#039;;//Offset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Setup variables&lt;br /&gt;
int numberOfSamples = 4000;&lt;br /&gt;
double ICAL = 1.08;&lt;br /&gt;
&lt;br /&gt;
//Set Voltage and current input pins&lt;br /&gt;
int inPinI1 = 34;&lt;br /&gt;
&lt;br /&gt;
// CT: Voltage depends on current, burden resistor, and turns&lt;br /&gt;
#define CT_BURDEN_RESISTOR    62&lt;br /&gt;
#define CT_TURNS              1800&lt;br /&gt;
#define VOLTAGE               225&lt;br /&gt;
&lt;br /&gt;
// Initial gueses for ratios, modified by VCAL/ICAL tweaks&lt;br /&gt;
double I_RATIO = (long double)CT_TURNS / CT_BURDEN_RESISTOR * 3.3 / 4096 * ICAL;&lt;br /&gt;
&lt;br /&gt;
//Filter variables 1&lt;br /&gt;
double lastFilteredI, filteredI;&lt;br /&gt;
double sqI,sumI;&lt;br /&gt;
//Sample variables&lt;br /&gt;
int lastSampleI,sampleI;&lt;br /&gt;
double Irms1;&lt;br /&gt;
unsigned long timer;&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
timer = millis();&lt;br /&gt;
//**************************************************************************&lt;br /&gt;
//Phase1 &lt;br /&gt;
  for (int n=0; n&amp;lt;numberOfSamples; n++)&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastSampleI=sampleI;&lt;br /&gt;
   &lt;br /&gt;
   //Read in voltage and current samples.   &lt;br /&gt;
   sampleI = analogRead(inPinI1);&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastFilteredI = filteredI;&lt;br /&gt;
  &lt;br /&gt;
   //Digital high pass filters to remove 1.6V DC offset.&lt;br /&gt;
   filteredI = 0.9989 * (lastFilteredI+sampleI-lastSampleI);&lt;br /&gt;
   &lt;br /&gt;
   //Root-mean-square method current&lt;br /&gt;
   //1) square current values&lt;br /&gt;
   sqI = filteredI * filteredI;&lt;br /&gt;
   //2) sum &lt;br /&gt;
   sumI += sqI;&lt;br /&gt;
   delay(0.0002);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Calculation of the root of the mean of the voltage and current squared (rms)&lt;br /&gt;
//Calibration coeficients applied. &lt;br /&gt;
Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - 0.06;&lt;br /&gt;
if (Irms1 &amp;lt; 0){ Irms1 = 0; }; //Set negative Current to zero&lt;br /&gt;
sumI = 0;&lt;br /&gt;
&lt;br /&gt;
Serial.println(&amp;quot;Irms1:&amp;quot;+String(Irms1));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=238</id>
		<title>Open Energy Monitor mit dem ESP32</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=238"/>
		<updated>2018-02-05T12:42:46Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Spezielle Hinweise für den ESP32 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Einleitung=&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird beschrieben wie mit Hilfe einer ESP32 Platine ein Strom Sensor für 3 Phasen Wechselstrom aufgebaut werden kann. Der Spannungsteiler aus den 10kOhm Widerständen erzeugt 1,6V für die SCT-013-030 Strom Sensoren. Die Stromsensoren werden mit den ADC Pin&#039;s des ESP32 verbunden. Natürlich sind die Messungen nicht sonderlich genau, da die Phasenverschiebung und Spannung nicht berücksichtigt wird. Auch das wäre durch zusätzliche Transformatoren möglich die dann auf die ADC Pin&#039;s geführt werden. Da ich damit nur meinen ungefähren Stromverbrauch zuhause messen möchte ist die Schaltung völlig ausreichend. Die Kosten für die einzelnen Komponenten sollten 30€ nicht übersteigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folgende Bauteile werden benötigt:&#039;&#039;&#039;&lt;br /&gt;
 -Board: DOIT ESP32 DEVKIT V1 (ca. 10€)&lt;br /&gt;
 -Strom Sensor SCT-013-30 (30A) oder SCT-013-100 (100A) siehe: http://openenergymonitor.org/emon/node/156&lt;br /&gt;
 -6x 10kOhm Widerstände 1/4W&lt;br /&gt;
 -3x Elko 10 uF&lt;br /&gt;
 -Universalplatine&lt;br /&gt;
 -evtl. USB Netzteil oder anderes Netzteil für die Spannungsversorgung&lt;br /&gt;
 -Pfosten Stecker Rastermaß: 2.54mm&lt;br /&gt;
 -3 x 3,5 mm Audio Anschluss&lt;br /&gt;
 -Optional: 1000uF / 10V Kondensator zur Stabilisierung&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pinbelegung des DOIT ESP32 DEVKIT V1 Board:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 https://github.com/playelek/pinout-doit-32devkitv1&lt;br /&gt;
&lt;br /&gt;
=Grundlagen=&lt;br /&gt;
&lt;br /&gt;
Auf der Seite von Open Energy Monitor finden sich genügend Informationen über die Grundlagen der Leistungsberechnung. Das Prinzip lässt sich 1:1 vom Aufbau eines Arduinos übernehmen. Der ESP32 verkraftet jedoch maximal 3,3V am Analog Eingang.&lt;br /&gt;
&lt;br /&gt;
 https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino&lt;br /&gt;
&lt;br /&gt;
=Aufbau=&lt;br /&gt;
&lt;br /&gt;
Auf die Lochrasterplatine müssen nur wenige Bauteile. Die Teile lassen sich relativ einfach einlöten. Für den Aufbau werden nur wenige PIN&#039;s des ESP32 benötigt. Bei meinem Aufbau gibt es am obersten Sensor Anschluss noch einen zusätzlichen Burden Widerstand von 200 Ohm. Das liegt daran das der SCT-013-030 Sensor schon einige Jahre alt ist. Bei den neuen Sensoren sind keine Burden Widerstände nötig, da diese schon einen 62 Ohm Burden eingebaut haben. Ein 1000uF Kondensator zwischen 5V und GND ist empfehlenswert, da je nach 5V Netzteil die Messwerte stark schwanken.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 03.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 05.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 01.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
Ich verwende zum programmieren immer die Arduino Gui. Es sind zuerst einige Anpassungen nötig damit das DOIT ESP32 Board von der Arduino Software erkannt wird. Hierzu muss diese Anleitung umgesetzt werden:&lt;br /&gt;
&lt;br /&gt;
 https://github.com/espressif/arduino-esp32&lt;br /&gt;
&lt;br /&gt;
Nach dem Neustart der Arduino Software kann dann das passende ESP32 Board ausgewählt werden. In meinem Beispiel ist es ein DOIT V1 Board.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 04.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
==Spezielle Hinweise für den ESP32==&lt;br /&gt;
Bei der Programmierung des ESP32 gibt es ein paar Dinge zu beachten. Auf den Boards ist meist ein passender Spannungsregler für 3,3V und ein passender FTDI Chip aufgelötet. Somit entfällt eine weitere Schaltung zur Spannungsversorgung. Zudem wird das Board vom FTDI Chip durch die Arduino Software automatisch in den &amp;quot;Upload Modus&amp;quot; versetzt. Man muss also nicht wie beim ESP8266 bestimmte Taster drücken (Flash und Reset) um das Board in den &amp;quot;Upload Modus&amp;quot; zu bringen.&lt;br /&gt;
&lt;br /&gt;
Ich habe öfters die WifiManager Library für das WLAN verwendet. Auf Dauer hatte ich damit jedoch immer wieder Probleme, so das ich meine WLAN Daten mit Absicht &amp;quot;fest&amp;quot; in das Programm einbaue. Zudem ergibt sich beim WLAN noch ein Problem wenn auf einmal die WLAN Verbindung unterbrochen wird, z.B. wenn der Router neu gestartet wird. Danach verbindet sich der ESP32 nämlich nicht mehr automatisch mit dem WLAN. Um das zu verhindern habe ich folgende Funktion in den Code eingebaut. Die Funktion WifiEvent startet den ESP32 neu wenn keine Verbindung mehr zum WLAN besteht. Leider funktioniert jeder andere Weg im Moment nicht zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//WiFi Part&lt;br /&gt;
const char* ssid     = &amp;quot;AccessPoint&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;pass&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//WiFi&lt;br /&gt;
void WIFI_Connect()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(2,1);&lt;br /&gt;
  WiFi.disconnect();&lt;br /&gt;
  Serial.println(&amp;quot;Booting Sketch...&amp;quot;);&lt;br /&gt;
  WiFi.mode(WIFI_AP_STA);&lt;br /&gt;
  WiFi.begin(ssid, password);&lt;br /&gt;
    // Wait for connection&lt;br /&gt;
  for (int i = 0; i &amp;lt; 25; i++)&lt;br /&gt;
  {&lt;br /&gt;
    if ( WiFi.status() != WL_CONNECTED ) {&lt;br /&gt;
      delay ( 250 );&lt;br /&gt;
      digitalWrite(2,0);&lt;br /&gt;
      Serial.print ( &amp;quot;.&amp;quot; );&lt;br /&gt;
      delay ( 250 );&lt;br /&gt;
      digitalWrite(2,1);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  digitalWrite(2,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
//Wifi WatchDog&lt;br /&gt;
WiFi.onEvent(WiFiEvent);&lt;br /&gt;
//Check if WiFi is here&lt;br /&gt;
//Automatically reconnect the ESP32 if the WiFi Router is not there...&lt;br /&gt;
if (WiFi.status() != WL_CONNECTED)&lt;br /&gt;
    {&lt;br /&gt;
      WiFi.onEvent(WiFiEvent);&lt;br /&gt;
      WIFI_Connect();&lt;br /&gt;
    } else {&lt;br /&gt;
      //Do something if the WiFi is available&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Wifi Watchdog&lt;br /&gt;
void WiFiEvent(WiFiEvent_t event) {&lt;br /&gt;
  Serial.printf(&amp;quot;[WiFi-event] event: %d  - &amp;quot;, event);&lt;br /&gt;
  switch(event) {&lt;br /&gt;
  case SYSTEM_EVENT_STA_GOT_IP:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi connected&amp;quot;);&lt;br /&gt;
      Serial.print(&amp;quot;IP address: &amp;quot;); Serial.println(WiFi.localIP());&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_DISCONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi lost connection&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_START:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station start&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_CONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station connected to AP&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_LOST_IP:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 Lost IP&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kalibrierung==&lt;br /&gt;
Als nächstes müssen die Stromsensoren kalibriert werden. Dazu sollten folgende Variablen angepasst werden. Die Kalibrierung habe ich mit einer 100W Lampe und einem Wasserkocher 1800W durchgeführt. Eine genaue Stromzange oder eine Wattmeter sind sehr nützliche Hilfsmittel. In meinem Fall kann der SCT-013-030 als kleinste Einheit 100mA Strom erkennen. Die Sensoren haben 1800 Wicklungen und einen 62 Ohm Burden Widerstand. Der Offset Wert sollte nicht am PC USB Port sondern an einem separaten 5V Netzteil kalibriert werden. Denn die meisten PC USB Anschlüsse liefern bei 200mA nur noch eine Spannung von 4,5V.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;ICAL&#039;&#039;&#039;    = Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 filteredI = &#039;&#039;&#039;0.9989&#039;&#039;&#039; * (lastFilteredI+sampleI-lastSampleI); //Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - &#039;&#039;&#039;0.06&#039;&#039;&#039;;//Offset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Setup variables&lt;br /&gt;
int numberOfSamples = 4000;&lt;br /&gt;
double ICAL = 1.08;&lt;br /&gt;
&lt;br /&gt;
//Set Voltage and current input pins&lt;br /&gt;
int inPinI1 = 34;&lt;br /&gt;
&lt;br /&gt;
// CT: Voltage depends on current, burden resistor, and turns&lt;br /&gt;
#define CT_BURDEN_RESISTOR    62&lt;br /&gt;
#define CT_TURNS              1800&lt;br /&gt;
#define VOLTAGE               225&lt;br /&gt;
&lt;br /&gt;
// Initial gueses for ratios, modified by VCAL/ICAL tweaks&lt;br /&gt;
double I_RATIO = (long double)CT_TURNS / CT_BURDEN_RESISTOR * 3.3 / 4096 * ICAL;&lt;br /&gt;
&lt;br /&gt;
//Filter variables 1&lt;br /&gt;
double lastFilteredI, filteredI;&lt;br /&gt;
double sqI,sumI;&lt;br /&gt;
//Sample variables&lt;br /&gt;
int lastSampleI,sampleI;&lt;br /&gt;
double Irms1;&lt;br /&gt;
unsigned long timer;&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
timer = millis();&lt;br /&gt;
//**************************************************************************&lt;br /&gt;
//Phase1 &lt;br /&gt;
  for (int n=0; n&amp;lt;numberOfSamples; n++)&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastSampleI=sampleI;&lt;br /&gt;
   &lt;br /&gt;
   //Read in voltage and current samples.   &lt;br /&gt;
   sampleI = analogRead(inPinI1);&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastFilteredI = filteredI;&lt;br /&gt;
  &lt;br /&gt;
   //Digital high pass filters to remove 1.6V DC offset.&lt;br /&gt;
   filteredI = 0.9989 * (lastFilteredI+sampleI-lastSampleI);&lt;br /&gt;
   &lt;br /&gt;
   //Root-mean-square method current&lt;br /&gt;
   //1) square current values&lt;br /&gt;
   sqI = filteredI * filteredI;&lt;br /&gt;
   //2) sum &lt;br /&gt;
   sumI += sqI;&lt;br /&gt;
   delay(0.0002);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Calculation of the root of the mean of the voltage and current squared (rms)&lt;br /&gt;
//Calibration coeficients applied. &lt;br /&gt;
Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - 0.06;&lt;br /&gt;
if (Irms1 &amp;lt; 0){ Irms1 = 0; }; //Set negative Current to zero&lt;br /&gt;
sumI = 0;&lt;br /&gt;
&lt;br /&gt;
Serial.println(&amp;quot;Irms1:&amp;quot;+String(Irms1));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=237</id>
		<title>Open Energy Monitor mit dem ESP32</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=237"/>
		<updated>2018-02-05T12:41:23Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Spezielle Hinweise für den ESP32 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Einleitung=&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird beschrieben wie mit Hilfe einer ESP32 Platine ein Strom Sensor für 3 Phasen Wechselstrom aufgebaut werden kann. Der Spannungsteiler aus den 10kOhm Widerständen erzeugt 1,6V für die SCT-013-030 Strom Sensoren. Die Stromsensoren werden mit den ADC Pin&#039;s des ESP32 verbunden. Natürlich sind die Messungen nicht sonderlich genau, da die Phasenverschiebung und Spannung nicht berücksichtigt wird. Auch das wäre durch zusätzliche Transformatoren möglich die dann auf die ADC Pin&#039;s geführt werden. Da ich damit nur meinen ungefähren Stromverbrauch zuhause messen möchte ist die Schaltung völlig ausreichend. Die Kosten für die einzelnen Komponenten sollten 30€ nicht übersteigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folgende Bauteile werden benötigt:&#039;&#039;&#039;&lt;br /&gt;
 -Board: DOIT ESP32 DEVKIT V1 (ca. 10€)&lt;br /&gt;
 -Strom Sensor SCT-013-30 (30A) oder SCT-013-100 (100A) siehe: http://openenergymonitor.org/emon/node/156&lt;br /&gt;
 -6x 10kOhm Widerstände 1/4W&lt;br /&gt;
 -3x Elko 10 uF&lt;br /&gt;
 -Universalplatine&lt;br /&gt;
 -evtl. USB Netzteil oder anderes Netzteil für die Spannungsversorgung&lt;br /&gt;
 -Pfosten Stecker Rastermaß: 2.54mm&lt;br /&gt;
 -3 x 3,5 mm Audio Anschluss&lt;br /&gt;
 -Optional: 1000uF / 10V Kondensator zur Stabilisierung&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pinbelegung des DOIT ESP32 DEVKIT V1 Board:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 https://github.com/playelek/pinout-doit-32devkitv1&lt;br /&gt;
&lt;br /&gt;
=Grundlagen=&lt;br /&gt;
&lt;br /&gt;
Auf der Seite von Open Energy Monitor finden sich genügend Informationen über die Grundlagen der Leistungsberechnung. Das Prinzip lässt sich 1:1 vom Aufbau eines Arduinos übernehmen. Der ESP32 verkraftet jedoch maximal 3,3V am Analog Eingang.&lt;br /&gt;
&lt;br /&gt;
 https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino&lt;br /&gt;
&lt;br /&gt;
=Aufbau=&lt;br /&gt;
&lt;br /&gt;
Auf die Lochrasterplatine müssen nur wenige Bauteile. Die Teile lassen sich relativ einfach einlöten. Für den Aufbau werden nur wenige PIN&#039;s des ESP32 benötigt. Bei meinem Aufbau gibt es am obersten Sensor Anschluss noch einen zusätzlichen Burden Widerstand von 200 Ohm. Das liegt daran das der SCT-013-030 Sensor schon einige Jahre alt ist. Bei den neuen Sensoren sind keine Burden Widerstände nötig, da diese schon einen 62 Ohm Burden eingebaut haben. Ein 1000uF Kondensator zwischen 5V und GND ist empfehlenswert, da je nach 5V Netzteil die Messwerte stark schwanken.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 03.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 05.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 01.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
Ich verwende zum programmieren immer die Arduino Gui. Es sind zuerst einige Anpassungen nötig damit das DOIT ESP32 Board von der Arduino Software erkannt wird. Hierzu muss diese Anleitung umgesetzt werden:&lt;br /&gt;
&lt;br /&gt;
 https://github.com/espressif/arduino-esp32&lt;br /&gt;
&lt;br /&gt;
Nach dem Neustart der Arduino Software kann dann das passende ESP32 Board ausgewählt werden. In meinem Beispiel ist es ein DOIT V1 Board.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 04.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
==Spezielle Hinweise für den ESP32==&lt;br /&gt;
Bei der Programmierung des ESP32 gibt es ein paar Dinge zu beachten. Auf den Boards ist meist ein passender Spannungsregler für 3,3V und ein passender FTDI Chip aufgelötet. Somit entfällt eine weitere Schaltung zur Spannungsversorgung. Zudem wird das Board vom FTDI Chip durch die Arduino Software automatisch in den &amp;quot;Upload Modus&amp;quot; versetzt. Man muss also nicht wie beim ESP8266 bestimmte Taster drücken (Flash und Reset) um das Board in den &amp;quot;Upload Modus&amp;quot; zu bringen.&lt;br /&gt;
&lt;br /&gt;
Ich habe öfters die WifiManager Library für das WLAN verwendet. Auf Dauer hatte ich damit jedoch immer wieder Probleme, so das ich meine WLAN Daten mit Absicht &amp;quot;fest&amp;quot; in das Programm einbaue. Zudem ergibt sich beim WLAN noch ein Problem wenn auf einmal die WLAN Verbindung unterbrochen wird, z.B. wenn der Router neu gestartet wird. Danach verbindet sich der ESP32 nämlich nicht mehr automatisch mit dem WLAN. Um das zu verhindern habe ich folgende Funktion in den Code eingebaut. Die Funktion WifiEvent startet den ESP32 neu wenn keine Verbindung mehr zum WLAN besteht. Leider funktioniert jeder andere Weg im Moment nicht zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
//Wifi WatchDog&lt;br /&gt;
WiFi.onEvent(WiFiEvent);&lt;br /&gt;
//Check if WiFi is here&lt;br /&gt;
//Automatically reconnect the ESP32 if the WiFi Router is not there...&lt;br /&gt;
if (WiFi.status() != WL_CONNECTED)&lt;br /&gt;
    {&lt;br /&gt;
      WiFi.onEvent(WiFiEvent);&lt;br /&gt;
      //WIFI_Connect();&lt;br /&gt;
    } else {&lt;br /&gt;
      //Do something if the WiFi is available&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Wifi Watchdog&lt;br /&gt;
void WiFiEvent(WiFiEvent_t event) {&lt;br /&gt;
  Serial.printf(&amp;quot;[WiFi-event] event: %d  - &amp;quot;, event);&lt;br /&gt;
  switch(event) {&lt;br /&gt;
  case SYSTEM_EVENT_STA_GOT_IP:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi connected&amp;quot;);&lt;br /&gt;
      Serial.print(&amp;quot;IP address: &amp;quot;); Serial.println(WiFi.localIP());&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_DISCONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi lost connection&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_START:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station start&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_CONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station connected to AP&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_LOST_IP:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 Lost IP&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kalibrierung==&lt;br /&gt;
Als nächstes müssen die Stromsensoren kalibriert werden. Dazu sollten folgende Variablen angepasst werden. Die Kalibrierung habe ich mit einer 100W Lampe und einem Wasserkocher 1800W durchgeführt. Eine genaue Stromzange oder eine Wattmeter sind sehr nützliche Hilfsmittel. In meinem Fall kann der SCT-013-030 als kleinste Einheit 100mA Strom erkennen. Die Sensoren haben 1800 Wicklungen und einen 62 Ohm Burden Widerstand. Der Offset Wert sollte nicht am PC USB Port sondern an einem separaten 5V Netzteil kalibriert werden. Denn die meisten PC USB Anschlüsse liefern bei 200mA nur noch eine Spannung von 4,5V.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;ICAL&#039;&#039;&#039;    = Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 filteredI = &#039;&#039;&#039;0.9989&#039;&#039;&#039; * (lastFilteredI+sampleI-lastSampleI); //Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - &#039;&#039;&#039;0.06&#039;&#039;&#039;;//Offset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Setup variables&lt;br /&gt;
int numberOfSamples = 4000;&lt;br /&gt;
double ICAL = 1.08;&lt;br /&gt;
&lt;br /&gt;
//Set Voltage and current input pins&lt;br /&gt;
int inPinI1 = 34;&lt;br /&gt;
&lt;br /&gt;
// CT: Voltage depends on current, burden resistor, and turns&lt;br /&gt;
#define CT_BURDEN_RESISTOR    62&lt;br /&gt;
#define CT_TURNS              1800&lt;br /&gt;
#define VOLTAGE               225&lt;br /&gt;
&lt;br /&gt;
// Initial gueses for ratios, modified by VCAL/ICAL tweaks&lt;br /&gt;
double I_RATIO = (long double)CT_TURNS / CT_BURDEN_RESISTOR * 3.3 / 4096 * ICAL;&lt;br /&gt;
&lt;br /&gt;
//Filter variables 1&lt;br /&gt;
double lastFilteredI, filteredI;&lt;br /&gt;
double sqI,sumI;&lt;br /&gt;
//Sample variables&lt;br /&gt;
int lastSampleI,sampleI;&lt;br /&gt;
double Irms1;&lt;br /&gt;
unsigned long timer;&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
timer = millis();&lt;br /&gt;
//**************************************************************************&lt;br /&gt;
//Phase1 &lt;br /&gt;
  for (int n=0; n&amp;lt;numberOfSamples; n++)&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastSampleI=sampleI;&lt;br /&gt;
   &lt;br /&gt;
   //Read in voltage and current samples.   &lt;br /&gt;
   sampleI = analogRead(inPinI1);&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastFilteredI = filteredI;&lt;br /&gt;
  &lt;br /&gt;
   //Digital high pass filters to remove 1.6V DC offset.&lt;br /&gt;
   filteredI = 0.9989 * (lastFilteredI+sampleI-lastSampleI);&lt;br /&gt;
   &lt;br /&gt;
   //Root-mean-square method current&lt;br /&gt;
   //1) square current values&lt;br /&gt;
   sqI = filteredI * filteredI;&lt;br /&gt;
   //2) sum &lt;br /&gt;
   sumI += sqI;&lt;br /&gt;
   delay(0.0002);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Calculation of the root of the mean of the voltage and current squared (rms)&lt;br /&gt;
//Calibration coeficients applied. &lt;br /&gt;
Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - 0.06;&lt;br /&gt;
if (Irms1 &amp;lt; 0){ Irms1 = 0; }; //Set negative Current to zero&lt;br /&gt;
sumI = 0;&lt;br /&gt;
&lt;br /&gt;
Serial.println(&amp;quot;Irms1:&amp;quot;+String(Irms1));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=236</id>
		<title>Open Energy Monitor mit dem ESP32</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=236"/>
		<updated>2018-02-05T12:39:32Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Einleitung=&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird beschrieben wie mit Hilfe einer ESP32 Platine ein Strom Sensor für 3 Phasen Wechselstrom aufgebaut werden kann. Der Spannungsteiler aus den 10kOhm Widerständen erzeugt 1,6V für die SCT-013-030 Strom Sensoren. Die Stromsensoren werden mit den ADC Pin&#039;s des ESP32 verbunden. Natürlich sind die Messungen nicht sonderlich genau, da die Phasenverschiebung und Spannung nicht berücksichtigt wird. Auch das wäre durch zusätzliche Transformatoren möglich die dann auf die ADC Pin&#039;s geführt werden. Da ich damit nur meinen ungefähren Stromverbrauch zuhause messen möchte ist die Schaltung völlig ausreichend. Die Kosten für die einzelnen Komponenten sollten 30€ nicht übersteigen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folgende Bauteile werden benötigt:&#039;&#039;&#039;&lt;br /&gt;
 -Board: DOIT ESP32 DEVKIT V1 (ca. 10€)&lt;br /&gt;
 -Strom Sensor SCT-013-30 (30A) oder SCT-013-100 (100A) siehe: http://openenergymonitor.org/emon/node/156&lt;br /&gt;
 -6x 10kOhm Widerstände 1/4W&lt;br /&gt;
 -3x Elko 10 uF&lt;br /&gt;
 -Universalplatine&lt;br /&gt;
 -evtl. USB Netzteil oder anderes Netzteil für die Spannungsversorgung&lt;br /&gt;
 -Pfosten Stecker Rastermaß: 2.54mm&lt;br /&gt;
 -3 x 3,5 mm Audio Anschluss&lt;br /&gt;
 -Optional: 1000uF / 10V Kondensator zur Stabilisierung&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pinbelegung des DOIT ESP32 DEVKIT V1 Board:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 https://github.com/playelek/pinout-doit-32devkitv1&lt;br /&gt;
&lt;br /&gt;
=Grundlagen=&lt;br /&gt;
&lt;br /&gt;
Auf der Seite von Open Energy Monitor finden sich genügend Informationen über die Grundlagen der Leistungsberechnung. Das Prinzip lässt sich 1:1 vom Aufbau eines Arduinos übernehmen. Der ESP32 verkraftet jedoch maximal 3,3V am Analog Eingang.&lt;br /&gt;
&lt;br /&gt;
 https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino&lt;br /&gt;
&lt;br /&gt;
=Aufbau=&lt;br /&gt;
&lt;br /&gt;
Auf die Lochrasterplatine müssen nur wenige Bauteile. Die Teile lassen sich relativ einfach einlöten. Für den Aufbau werden nur wenige PIN&#039;s des ESP32 benötigt. Bei meinem Aufbau gibt es am obersten Sensor Anschluss noch einen zusätzlichen Burden Widerstand von 200 Ohm. Das liegt daran das der SCT-013-030 Sensor schon einige Jahre alt ist. Bei den neuen Sensoren sind keine Burden Widerstände nötig, da diese schon einen 62 Ohm Burden eingebaut haben. Ein 1000uF Kondensator zwischen 5V und GND ist empfehlenswert, da je nach 5V Netzteil die Messwerte stark schwanken.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 03.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 05.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 01.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
Ich verwende zum programmieren immer die Arduino Gui. Es sind zuerst einige Anpassungen nötig damit das DOIT ESP32 Board von der Arduino Software erkannt wird. Hierzu muss diese Anleitung umgesetzt werden:&lt;br /&gt;
&lt;br /&gt;
 https://github.com/espressif/arduino-esp32&lt;br /&gt;
&lt;br /&gt;
Nach dem Neustart der Arduino Software kann dann das passende ESP32 Board ausgewählt werden. In meinem Beispiel ist es ein DOIT V1 Board.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 04.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
==Spezielle Hinweise für den ESP32==&lt;br /&gt;
Bei der Programmierung des ESP32 gibt es ein paar Dinge zu beachten. Auf den Boards ist meist ein passender Spannungsregler für 3,3V und ein passender FTDI Chip aufgelötet. Somit entfällt eine weitere Schaltung zur Spannungsversorgung. Zudem wird das Board vom FTDI Chip durch die Arduino Software automatisch in den &amp;quot;Upload Modus&amp;quot; versetzt. Man muss also nicht wie beim ESP8266 bestimmte Taster drücken (Flash und Reset) um das Board in den &amp;quot;Upload Modus&amp;quot; zu bringen.&lt;br /&gt;
&lt;br /&gt;
Ich habe öfters die WifiManager Library für das WLAN verwendet. Auf Dauer hatte ich damit jedoch immer wieder Probleme, so das ich meine WLAN Daten mit Absicht &amp;quot;fest&amp;quot; in das Programm einbaue. Zudem ergibt sich beim WLAN noch ein Problem wenn auf einmal die WLAN Verbindung unterbrochen wird, z.B. wenn der Router neu gestartet wird. Danach verbindet sich der ESP32 nämlich nicht mehr automatisch mit dem WLAN. Um das zu verhindern habe ich folgende Funktion in den Code eingebaut. Die Funktion WifiEvent startet den ESP32 neu wenn keine Verbindung mehr zum WLAN besteht. Leider funktioniert jeder andere Weg im Moment nicht zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
//Wifi WatchDog&lt;br /&gt;
WiFi.onEvent(WiFiEvent);&lt;br /&gt;
//Check if WiFi is here&lt;br /&gt;
//Automatically reconnect the ESP32 if the WiFi Router is not there...&lt;br /&gt;
if (WiFi.status() != WL_CONNECTED)&lt;br /&gt;
    {&lt;br /&gt;
      WiFi.onEvent(WiFiEvent);&lt;br /&gt;
      //WIFI_Connect();&lt;br /&gt;
    } else {&lt;br /&gt;
      //Do something&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Wifi Watchdog&lt;br /&gt;
void WiFiEvent(WiFiEvent_t event) {&lt;br /&gt;
  Serial.printf(&amp;quot;[WiFi-event] event: %d  - &amp;quot;, event);&lt;br /&gt;
  switch(event) {&lt;br /&gt;
  case SYSTEM_EVENT_STA_GOT_IP:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi connected&amp;quot;);&lt;br /&gt;
      Serial.print(&amp;quot;IP address: &amp;quot;); Serial.println(WiFi.localIP());&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_DISCONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi lost connection&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_START:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station start&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_CONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station connected to AP&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_LOST_IP:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 Lost IP&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kalibrierung==&lt;br /&gt;
Als nächstes müssen die Stromsensoren kalibriert werden. Dazu sollten folgende Variablen angepasst werden. Die Kalibrierung habe ich mit einer 100W Lampe und einem Wasserkocher 1800W durchgeführt. Eine genaue Stromzange oder eine Wattmeter sind sehr nützliche Hilfsmittel. In meinem Fall kann der SCT-013-030 als kleinste Einheit 100mA Strom erkennen. Die Sensoren haben 1800 Wicklungen und einen 62 Ohm Burden Widerstand. Der Offset Wert sollte nicht am PC USB Port sondern an einem separaten 5V Netzteil kalibriert werden. Denn die meisten PC USB Anschlüsse liefern bei 200mA nur noch eine Spannung von 4,5V.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;ICAL&#039;&#039;&#039;    = Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 filteredI = &#039;&#039;&#039;0.9989&#039;&#039;&#039; * (lastFilteredI+sampleI-lastSampleI); //Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - &#039;&#039;&#039;0.06&#039;&#039;&#039;;//Offset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Setup variables&lt;br /&gt;
int numberOfSamples = 4000;&lt;br /&gt;
double ICAL = 1.08;&lt;br /&gt;
&lt;br /&gt;
//Set Voltage and current input pins&lt;br /&gt;
int inPinI1 = 34;&lt;br /&gt;
&lt;br /&gt;
// CT: Voltage depends on current, burden resistor, and turns&lt;br /&gt;
#define CT_BURDEN_RESISTOR    62&lt;br /&gt;
#define CT_TURNS              1800&lt;br /&gt;
#define VOLTAGE               225&lt;br /&gt;
&lt;br /&gt;
// Initial gueses for ratios, modified by VCAL/ICAL tweaks&lt;br /&gt;
double I_RATIO = (long double)CT_TURNS / CT_BURDEN_RESISTOR * 3.3 / 4096 * ICAL;&lt;br /&gt;
&lt;br /&gt;
//Filter variables 1&lt;br /&gt;
double lastFilteredI, filteredI;&lt;br /&gt;
double sqI,sumI;&lt;br /&gt;
//Sample variables&lt;br /&gt;
int lastSampleI,sampleI;&lt;br /&gt;
double Irms1;&lt;br /&gt;
unsigned long timer;&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
timer = millis();&lt;br /&gt;
//**************************************************************************&lt;br /&gt;
//Phase1 &lt;br /&gt;
  for (int n=0; n&amp;lt;numberOfSamples; n++)&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastSampleI=sampleI;&lt;br /&gt;
   &lt;br /&gt;
   //Read in voltage and current samples.   &lt;br /&gt;
   sampleI = analogRead(inPinI1);&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastFilteredI = filteredI;&lt;br /&gt;
  &lt;br /&gt;
   //Digital high pass filters to remove 1.6V DC offset.&lt;br /&gt;
   filteredI = 0.9989 * (lastFilteredI+sampleI-lastSampleI);&lt;br /&gt;
   &lt;br /&gt;
   //Root-mean-square method current&lt;br /&gt;
   //1) square current values&lt;br /&gt;
   sqI = filteredI * filteredI;&lt;br /&gt;
   //2) sum &lt;br /&gt;
   sumI += sqI;&lt;br /&gt;
   delay(0.0002);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Calculation of the root of the mean of the voltage and current squared (rms)&lt;br /&gt;
//Calibration coeficients applied. &lt;br /&gt;
Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - 0.06;&lt;br /&gt;
if (Irms1 &amp;lt; 0){ Irms1 = 0; }; //Set negative Current to zero&lt;br /&gt;
sumI = 0;&lt;br /&gt;
&lt;br /&gt;
Serial.println(&amp;quot;Irms1:&amp;quot;+String(Irms1));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=235</id>
		<title>Open Energy Monitor mit dem ESP32</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=235"/>
		<updated>2018-02-05T12:32:13Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Einleitung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Einleitung=&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird beschrieben wie mit Hilfe einer ESP32 Platine ein Strom Sensor für 3 Phasen Wechselstrom aufgebaut werden kann. Der Spannungsteiler aus den 10kOhm Widerständen erzeugt 1,6V für die SCT-013-030 Strom Sensoren. Die Stromsensoren werden mit den ADC Pin&#039;s des ESP32 verbunden. Natürlich sind die Messungen nicht sonderlich genau, da die Phasenverschiebung und Spannung nicht berücksichtigt wird. Auch das wäre durch zusätzliche Transformatoren möglich die dann auf die ADC Pin&#039;s geführt werden. Da ich damit nur meinen ungefähren Stromverbrauch zuhause messen möchte ist die Schaltung völlig ausreichend.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folgende Bauteile werden benötigt:&#039;&#039;&#039;&lt;br /&gt;
 -Board: DOIT ESP32 DEVKIT V1 (ca. 10€)&lt;br /&gt;
 -Strom Sensor SCT-013-30 (30A) oder SCT-013-100 (100A) siehe: http://openenergymonitor.org/emon/node/156&lt;br /&gt;
 -6x 10kOhm Widerstände 1/4W&lt;br /&gt;
 -3x Elko 10 uF&lt;br /&gt;
 -Universalplatine&lt;br /&gt;
 -evtl. USB Netzteil oder anderes Netzteil für die Spannungsversorgung&lt;br /&gt;
 -Pfosten Stecker Rastermaß: 2.54mm&lt;br /&gt;
 -3 x 3,5 mm Audio Anschluss&lt;br /&gt;
 -Optional: 1000uF / 10V Kondensator zur Stabilisierung&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pinbelegung des DOIT ESP32 DEVKIT V1 Board:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 https://github.com/playelek/pinout-doit-32devkitv1&lt;br /&gt;
&lt;br /&gt;
=Grundlagen=&lt;br /&gt;
&lt;br /&gt;
Auf der Seite von Open Energy Monitor finden sich genügend Informationen über die Grundlagen der Leistungsberechnung. Das Prinzip lässt sich 1:1 vom Aufbau eines Arduinos übernehmen. Der ESP32 verkraftet jedoch maximal 3,3V am Analog Eingang.&lt;br /&gt;
&lt;br /&gt;
 https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino&lt;br /&gt;
&lt;br /&gt;
=Aufbau=&lt;br /&gt;
&lt;br /&gt;
Auf die Lochrasterplatine müssen nur wenige Bauteile. Die Teile lassen sich relativ einfach einlöten. Für den Aufbau werden nur wenige PIN&#039;s des ESP32 benötigt. Bei meinem Aufbau gibt es am obersten Sensor Anschluss noch einen zusätzlichen Burden Widerstand von 200 Ohm. Das liegt daran das der SCT-013-030 Sensor schon einige Jahre alt ist. Bei den neuen Sensoren sind keine Burden Widerstände nötig, da diese schon einen 62 Ohm Burden eingebaut haben. Ein 1000uF Kondensator zwischen 5V und GND ist empfehlenswert, da je nach 5V Netzteil die Messwerte stark schwanken.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 03.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 05.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 01.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
Ich verwende zum programmieren immer die Arduino Gui. Es sind zuerst einige Anpassungen nötig damit das DOIT ESP32 Board von der Arduino Software erkannt wird. Hierzu muss diese Anleitung umgesetzt werden:&lt;br /&gt;
&lt;br /&gt;
 https://github.com/espressif/arduino-esp32&lt;br /&gt;
&lt;br /&gt;
Nach dem Neustart der Arduino Software kann dann das passende ESP32 Board ausgewählt werden. In meinem Beispiel ist es ein DOIT V1 Board.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 04.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
==Spezielle Hinweise für den ESP32==&lt;br /&gt;
Bei der Programmierung des ESP32 gibt es ein paar Dinge zu beachten. Auf den Boards ist meist ein passender Spannungsregler für 3,3V und ein passender FTDI Chip aufgelötet. Somit entfällt eine weitere Schaltung zur Spannungsversorgung. Zudem wird das Board vom FTDI Chip durch die Arduino Software automatisch in den &amp;quot;Upload Modus&amp;quot; versetzt. Man muss also nicht wie beim ESP8266 bestimmte Taster drücken (Flash und Reset) um das Board in den &amp;quot;Upload Modus&amp;quot; zu bringen.&lt;br /&gt;
&lt;br /&gt;
Ich habe öfters die WifiManager Library für das WLAN verwendet. Auf Dauer hatte ich damit jedoch immer wieder Probleme, so das ich meine WLAN Daten mit Absicht &amp;quot;fest&amp;quot; in das Programm einbaue. Zudem ergibt sich beim WLAN noch ein Problem wenn auf einmal die WLAN Verbindung unterbrochen wird, z.B. wenn der Router neu gestartet wird. Danach verbindet sich der ESP32 nämlich nicht mehr automatisch mit dem WLAN. Um das zu verhindern habe ich folgende Funktion in den Code eingebaut. Die Funktion WifiEvent startet den ESP32 neu wenn keine Verbindung mehr zum WLAN besteht. Leider funktioniert jeder andere Weg im Moment nicht zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
//Wifi WatchDog&lt;br /&gt;
WiFi.onEvent(WiFiEvent);&lt;br /&gt;
//Check if WiFi is here&lt;br /&gt;
//Automatically reconnect the ESP32 if the WiFi Router is not there...&lt;br /&gt;
if (WiFi.status() != WL_CONNECTED)&lt;br /&gt;
    {&lt;br /&gt;
      WiFi.onEvent(WiFiEvent);&lt;br /&gt;
      //WIFI_Connect();&lt;br /&gt;
    } else {&lt;br /&gt;
      //Do something&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Wifi Watchdog&lt;br /&gt;
void WiFiEvent(WiFiEvent_t event) {&lt;br /&gt;
  Serial.printf(&amp;quot;[WiFi-event] event: %d  - &amp;quot;, event);&lt;br /&gt;
  switch(event) {&lt;br /&gt;
  case SYSTEM_EVENT_STA_GOT_IP:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi connected&amp;quot;);&lt;br /&gt;
      Serial.print(&amp;quot;IP address: &amp;quot;); Serial.println(WiFi.localIP());&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_DISCONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi lost connection&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_START:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station start&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_CONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station connected to AP&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_LOST_IP:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 Lost IP&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kalibrierung==&lt;br /&gt;
Als nächstes müssen die Stromsensoren kalibriert werden. Dazu sollten folgende Variablen angepasst werden. Die Kalibrierung habe ich mit einer 100W Lampe und einem Wasserkocher 1800W durchgeführt. Eine genaue Stromzange oder eine Wattmeter sind sehr nützliche Hilfsmittel. In meinem Fall kann der SCT-013-030 als kleinste Einheit 100mA Strom erkennen. Die Sensoren haben 1800 Wicklungen und einen 62 Ohm Burden Widerstand. Der Offset Wert sollte nicht am PC USB Port sondern an einem separaten 5V Netzteil kalibriert werden. Denn die meisten PC USB Anschlüsse liefern bei 200mA nur noch eine Spannung von 4,5V.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;ICAL&#039;&#039;&#039;    = Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 filteredI = &#039;&#039;&#039;0.9989&#039;&#039;&#039; * (lastFilteredI+sampleI-lastSampleI); //Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - &#039;&#039;&#039;0.06&#039;&#039;&#039;;//Offset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Setup variables&lt;br /&gt;
int numberOfSamples = 4000;&lt;br /&gt;
double ICAL = 1.08;&lt;br /&gt;
&lt;br /&gt;
//Set Voltage and current input pins&lt;br /&gt;
int inPinI1 = 34;&lt;br /&gt;
&lt;br /&gt;
// CT: Voltage depends on current, burden resistor, and turns&lt;br /&gt;
#define CT_BURDEN_RESISTOR    62&lt;br /&gt;
#define CT_TURNS              1800&lt;br /&gt;
#define VOLTAGE               225&lt;br /&gt;
&lt;br /&gt;
// Initial gueses for ratios, modified by VCAL/ICAL tweaks&lt;br /&gt;
double I_RATIO = (long double)CT_TURNS / CT_BURDEN_RESISTOR * 3.3 / 4096 * ICAL;&lt;br /&gt;
&lt;br /&gt;
//Filter variables 1&lt;br /&gt;
double lastFilteredI, filteredI;&lt;br /&gt;
double sqI,sumI;&lt;br /&gt;
//Sample variables&lt;br /&gt;
int lastSampleI,sampleI;&lt;br /&gt;
double Irms1;&lt;br /&gt;
unsigned long timer;&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
timer = millis();&lt;br /&gt;
//**************************************************************************&lt;br /&gt;
//Phase1 &lt;br /&gt;
  for (int n=0; n&amp;lt;numberOfSamples; n++)&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastSampleI=sampleI;&lt;br /&gt;
   &lt;br /&gt;
   //Read in voltage and current samples.   &lt;br /&gt;
   sampleI = analogRead(inPinI1);&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastFilteredI = filteredI;&lt;br /&gt;
  &lt;br /&gt;
   //Digital high pass filters to remove 1.6V DC offset.&lt;br /&gt;
   filteredI = 0.9989 * (lastFilteredI+sampleI-lastSampleI);&lt;br /&gt;
   &lt;br /&gt;
   //Root-mean-square method current&lt;br /&gt;
   //1) square current values&lt;br /&gt;
   sqI = filteredI * filteredI;&lt;br /&gt;
   //2) sum &lt;br /&gt;
   sumI += sqI;&lt;br /&gt;
   delay(0.0002);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Calculation of the root of the mean of the voltage and current squared (rms)&lt;br /&gt;
//Calibration coeficients applied. &lt;br /&gt;
Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - 0.06;&lt;br /&gt;
if (Irms1 &amp;lt; 0){ Irms1 = 0; }; //Set negative Current to zero&lt;br /&gt;
sumI = 0;&lt;br /&gt;
&lt;br /&gt;
Serial.println(&amp;quot;Irms1:&amp;quot;+String(Irms1));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=234</id>
		<title>Open Energy Monitor mit dem ESP32</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=234"/>
		<updated>2018-02-05T12:30:21Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Kalibrierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Einleitung=&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird beschrieben wie mit Hilfe einer ESP32 Platine ein Strom Sensor für 3 Phasen Wechselstrom aufgebaut werden kann. Der Spannungsteiler aus den 10kOhm Widerständen erzeugt 1,6V für die SCT-013-030 Strom Sensoren. Die Stromsensoren werden mit den ADC Pin&#039;s des ESP32 verbunden. Natürlich sind die Messungen nicht sonderlich genau, da die Phasenverschiebung nicht berücksichtigt wird. Auch das wäre durch zusätzliche Transformatoren möglich die dann auf die ADC Pin&#039;s geführt werden. Da ich damit nur meinen ungefähren Stromverbrauch zuhause messen möchte ist die Schaltung völlig ausreichend.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folgende Bauteile werden benötigt:&#039;&#039;&#039;&lt;br /&gt;
 -Board: DOIT ESP32 DEVKIT V1 (ca. 10€)&lt;br /&gt;
 -Strom Sensor SCT-013-30 (30A) oder SCT-013-100 (100A) siehe: http://openenergymonitor.org/emon/node/156&lt;br /&gt;
 -6x 10kOhm Widerstände 1/4W&lt;br /&gt;
 -3x Elko 10 uF&lt;br /&gt;
 -Universalplatine&lt;br /&gt;
 -evtl. USB Netzteil oder anderes Netzteil für die Spannungsversorgung&lt;br /&gt;
 -Pfosten Stecker Rastermaß: 2.54mm&lt;br /&gt;
 -3 x 3,5 mm Audio Anschluss&lt;br /&gt;
 -Optional: 1000uF / 10V Kondensator zur Stabilisierung&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pinbelegung des DOIT ESP32 DEVKIT V1 Board:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 https://github.com/playelek/pinout-doit-32devkitv1&lt;br /&gt;
&lt;br /&gt;
=Grundlagen=&lt;br /&gt;
&lt;br /&gt;
Auf der Seite von Open Energy Monitor finden sich genügend Informationen über die Grundlagen der Leistungsberechnung. Das Prinzip lässt sich 1:1 vom Aufbau eines Arduinos übernehmen. Der ESP32 verkraftet jedoch maximal 3,3V am Analog Eingang.&lt;br /&gt;
&lt;br /&gt;
 https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino&lt;br /&gt;
&lt;br /&gt;
=Aufbau=&lt;br /&gt;
&lt;br /&gt;
Auf die Lochrasterplatine müssen nur wenige Bauteile. Die Teile lassen sich relativ einfach einlöten. Für den Aufbau werden nur wenige PIN&#039;s des ESP32 benötigt. Bei meinem Aufbau gibt es am obersten Sensor Anschluss noch einen zusätzlichen Burden Widerstand von 200 Ohm. Das liegt daran das der SCT-013-030 Sensor schon einige Jahre alt ist. Bei den neuen Sensoren sind keine Burden Widerstände nötig, da diese schon einen 62 Ohm Burden eingebaut haben. Ein 1000uF Kondensator zwischen 5V und GND ist empfehlenswert, da je nach 5V Netzteil die Messwerte stark schwanken.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 03.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 05.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 01.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
Ich verwende zum programmieren immer die Arduino Gui. Es sind zuerst einige Anpassungen nötig damit das DOIT ESP32 Board von der Arduino Software erkannt wird. Hierzu muss diese Anleitung umgesetzt werden:&lt;br /&gt;
&lt;br /&gt;
 https://github.com/espressif/arduino-esp32&lt;br /&gt;
&lt;br /&gt;
Nach dem Neustart der Arduino Software kann dann das passende ESP32 Board ausgewählt werden. In meinem Beispiel ist es ein DOIT V1 Board.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 04.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
==Spezielle Hinweise für den ESP32==&lt;br /&gt;
Bei der Programmierung des ESP32 gibt es ein paar Dinge zu beachten. Auf den Boards ist meist ein passender Spannungsregler für 3,3V und ein passender FTDI Chip aufgelötet. Somit entfällt eine weitere Schaltung zur Spannungsversorgung. Zudem wird das Board vom FTDI Chip durch die Arduino Software automatisch in den &amp;quot;Upload Modus&amp;quot; versetzt. Man muss also nicht wie beim ESP8266 bestimmte Taster drücken (Flash und Reset) um das Board in den &amp;quot;Upload Modus&amp;quot; zu bringen.&lt;br /&gt;
&lt;br /&gt;
Ich habe öfters die WifiManager Library für das WLAN verwendet. Auf Dauer hatte ich damit jedoch immer wieder Probleme, so das ich meine WLAN Daten mit Absicht &amp;quot;fest&amp;quot; in das Programm einbaue. Zudem ergibt sich beim WLAN noch ein Problem wenn auf einmal die WLAN Verbindung unterbrochen wird, z.B. wenn der Router neu gestartet wird. Danach verbindet sich der ESP32 nämlich nicht mehr automatisch mit dem WLAN. Um das zu verhindern habe ich folgende Funktion in den Code eingebaut. Die Funktion WifiEvent startet den ESP32 neu wenn keine Verbindung mehr zum WLAN besteht. Leider funktioniert jeder andere Weg im Moment nicht zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
//Wifi WatchDog&lt;br /&gt;
WiFi.onEvent(WiFiEvent);&lt;br /&gt;
//Check if WiFi is here&lt;br /&gt;
//Automatically reconnect the ESP32 if the WiFi Router is not there...&lt;br /&gt;
if (WiFi.status() != WL_CONNECTED)&lt;br /&gt;
    {&lt;br /&gt;
      WiFi.onEvent(WiFiEvent);&lt;br /&gt;
      //WIFI_Connect();&lt;br /&gt;
    } else {&lt;br /&gt;
      //Do something&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Wifi Watchdog&lt;br /&gt;
void WiFiEvent(WiFiEvent_t event) {&lt;br /&gt;
  Serial.printf(&amp;quot;[WiFi-event] event: %d  - &amp;quot;, event);&lt;br /&gt;
  switch(event) {&lt;br /&gt;
  case SYSTEM_EVENT_STA_GOT_IP:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi connected&amp;quot;);&lt;br /&gt;
      Serial.print(&amp;quot;IP address: &amp;quot;); Serial.println(WiFi.localIP());&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_DISCONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi lost connection&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_START:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station start&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_CONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station connected to AP&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_LOST_IP:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 Lost IP&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kalibrierung==&lt;br /&gt;
Als nächstes müssen die Stromsensoren kalibriert werden. Dazu sollten folgende Variablen angepasst werden. Die Kalibrierung habe ich mit einer 100W Lampe und einem Wasserkocher 1800W durchgeführt. Eine genaue Stromzange oder eine Wattmeter sind sehr nützliche Hilfsmittel. In meinem Fall kann der SCT-013-030 als kleinste Einheit 100mA Strom erkennen. Die Sensoren haben 1800 Wicklungen und einen 62 Ohm Burden Widerstand. Der Offset Wert sollte nicht am PC USB Port sondern an einem separaten 5V Netzteil kalibriert werden. Denn die meisten PC USB Anschlüsse liefern bei 200mA nur noch eine Spannung von 4,5V.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;ICAL&#039;&#039;&#039;    = Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 filteredI = &#039;&#039;&#039;0.9989&#039;&#039;&#039; * (lastFilteredI+sampleI-lastSampleI); //Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - &#039;&#039;&#039;0.06&#039;&#039;&#039;;//Offset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Setup variables&lt;br /&gt;
int numberOfSamples = 4000;&lt;br /&gt;
double ICAL = 1.08;&lt;br /&gt;
&lt;br /&gt;
//Set Voltage and current input pins&lt;br /&gt;
int inPinI1 = 34;&lt;br /&gt;
&lt;br /&gt;
// CT: Voltage depends on current, burden resistor, and turns&lt;br /&gt;
#define CT_BURDEN_RESISTOR    62&lt;br /&gt;
#define CT_TURNS              1800&lt;br /&gt;
#define VOLTAGE               225&lt;br /&gt;
&lt;br /&gt;
// Initial gueses for ratios, modified by VCAL/ICAL tweaks&lt;br /&gt;
double I_RATIO = (long double)CT_TURNS / CT_BURDEN_RESISTOR * 3.3 / 4096 * ICAL;&lt;br /&gt;
&lt;br /&gt;
//Filter variables 1&lt;br /&gt;
double lastFilteredI, filteredI;&lt;br /&gt;
double sqI,sumI;&lt;br /&gt;
//Sample variables&lt;br /&gt;
int lastSampleI,sampleI;&lt;br /&gt;
double Irms1;&lt;br /&gt;
unsigned long timer;&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
timer = millis();&lt;br /&gt;
//**************************************************************************&lt;br /&gt;
//Phase1 &lt;br /&gt;
  for (int n=0; n&amp;lt;numberOfSamples; n++)&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastSampleI=sampleI;&lt;br /&gt;
   &lt;br /&gt;
   //Read in voltage and current samples.   &lt;br /&gt;
   sampleI = analogRead(inPinI1);&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastFilteredI = filteredI;&lt;br /&gt;
  &lt;br /&gt;
   //Digital high pass filters to remove 1.6V DC offset.&lt;br /&gt;
   filteredI = 0.9989 * (lastFilteredI+sampleI-lastSampleI);&lt;br /&gt;
   &lt;br /&gt;
   //Root-mean-square method current&lt;br /&gt;
   //1) square current values&lt;br /&gt;
   sqI = filteredI * filteredI;&lt;br /&gt;
   //2) sum &lt;br /&gt;
   sumI += sqI;&lt;br /&gt;
   delay(0.0002);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Calculation of the root of the mean of the voltage and current squared (rms)&lt;br /&gt;
//Calibration coeficients applied. &lt;br /&gt;
Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - 0.06;&lt;br /&gt;
if (Irms1 &amp;lt; 0){ Irms1 = 0; }; //Set negative Current to zero&lt;br /&gt;
sumI = 0;&lt;br /&gt;
&lt;br /&gt;
Serial.println(&amp;quot;Irms1:&amp;quot;+String(Irms1));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=233</id>
		<title>Open Energy Monitor mit dem ESP32</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=233"/>
		<updated>2018-02-05T12:29:46Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Kalibrierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Einleitung=&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird beschrieben wie mit Hilfe einer ESP32 Platine ein Strom Sensor für 3 Phasen Wechselstrom aufgebaut werden kann. Der Spannungsteiler aus den 10kOhm Widerständen erzeugt 1,6V für die SCT-013-030 Strom Sensoren. Die Stromsensoren werden mit den ADC Pin&#039;s des ESP32 verbunden. Natürlich sind die Messungen nicht sonderlich genau, da die Phasenverschiebung nicht berücksichtigt wird. Auch das wäre durch zusätzliche Transformatoren möglich die dann auf die ADC Pin&#039;s geführt werden. Da ich damit nur meinen ungefähren Stromverbrauch zuhause messen möchte ist die Schaltung völlig ausreichend.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folgende Bauteile werden benötigt:&#039;&#039;&#039;&lt;br /&gt;
 -Board: DOIT ESP32 DEVKIT V1 (ca. 10€)&lt;br /&gt;
 -Strom Sensor SCT-013-30 (30A) oder SCT-013-100 (100A) siehe: http://openenergymonitor.org/emon/node/156&lt;br /&gt;
 -6x 10kOhm Widerstände 1/4W&lt;br /&gt;
 -3x Elko 10 uF&lt;br /&gt;
 -Universalplatine&lt;br /&gt;
 -evtl. USB Netzteil oder anderes Netzteil für die Spannungsversorgung&lt;br /&gt;
 -Pfosten Stecker Rastermaß: 2.54mm&lt;br /&gt;
 -3 x 3,5 mm Audio Anschluss&lt;br /&gt;
 -Optional: 1000uF / 10V Kondensator zur Stabilisierung&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pinbelegung des DOIT ESP32 DEVKIT V1 Board:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 https://github.com/playelek/pinout-doit-32devkitv1&lt;br /&gt;
&lt;br /&gt;
=Grundlagen=&lt;br /&gt;
&lt;br /&gt;
Auf der Seite von Open Energy Monitor finden sich genügend Informationen über die Grundlagen der Leistungsberechnung. Das Prinzip lässt sich 1:1 vom Aufbau eines Arduinos übernehmen. Der ESP32 verkraftet jedoch maximal 3,3V am Analog Eingang.&lt;br /&gt;
&lt;br /&gt;
 https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino&lt;br /&gt;
&lt;br /&gt;
=Aufbau=&lt;br /&gt;
&lt;br /&gt;
Auf die Lochrasterplatine müssen nur wenige Bauteile. Die Teile lassen sich relativ einfach einlöten. Für den Aufbau werden nur wenige PIN&#039;s des ESP32 benötigt. Bei meinem Aufbau gibt es am obersten Sensor Anschluss noch einen zusätzlichen Burden Widerstand von 200 Ohm. Das liegt daran das der SCT-013-030 Sensor schon einige Jahre alt ist. Bei den neuen Sensoren sind keine Burden Widerstände nötig, da diese schon einen 62 Ohm Burden eingebaut haben. Ein 1000uF Kondensator zwischen 5V und GND ist empfehlenswert, da je nach 5V Netzteil die Messwerte stark schwanken.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 03.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 05.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 01.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
Ich verwende zum programmieren immer die Arduino Gui. Es sind zuerst einige Anpassungen nötig damit das DOIT ESP32 Board von der Arduino Software erkannt wird. Hierzu muss diese Anleitung umgesetzt werden:&lt;br /&gt;
&lt;br /&gt;
 https://github.com/espressif/arduino-esp32&lt;br /&gt;
&lt;br /&gt;
Nach dem Neustart der Arduino Software kann dann das passende ESP32 Board ausgewählt werden. In meinem Beispiel ist es ein DOIT V1 Board.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 04.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
==Spezielle Hinweise für den ESP32==&lt;br /&gt;
Bei der Programmierung des ESP32 gibt es ein paar Dinge zu beachten. Auf den Boards ist meist ein passender Spannungsregler für 3,3V und ein passender FTDI Chip aufgelötet. Somit entfällt eine weitere Schaltung zur Spannungsversorgung. Zudem wird das Board vom FTDI Chip durch die Arduino Software automatisch in den &amp;quot;Upload Modus&amp;quot; versetzt. Man muss also nicht wie beim ESP8266 bestimmte Taster drücken (Flash und Reset) um das Board in den &amp;quot;Upload Modus&amp;quot; zu bringen.&lt;br /&gt;
&lt;br /&gt;
Ich habe öfters die WifiManager Library für das WLAN verwendet. Auf Dauer hatte ich damit jedoch immer wieder Probleme, so das ich meine WLAN Daten mit Absicht &amp;quot;fest&amp;quot; in das Programm einbaue. Zudem ergibt sich beim WLAN noch ein Problem wenn auf einmal die WLAN Verbindung unterbrochen wird, z.B. wenn der Router neu gestartet wird. Danach verbindet sich der ESP32 nämlich nicht mehr automatisch mit dem WLAN. Um das zu verhindern habe ich folgende Funktion in den Code eingebaut. Die Funktion WifiEvent startet den ESP32 neu wenn keine Verbindung mehr zum WLAN besteht. Leider funktioniert jeder andere Weg im Moment nicht zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
//Wifi WatchDog&lt;br /&gt;
WiFi.onEvent(WiFiEvent);&lt;br /&gt;
//Check if WiFi is here&lt;br /&gt;
//Automatically reconnect the ESP32 if the WiFi Router is not there...&lt;br /&gt;
if (WiFi.status() != WL_CONNECTED)&lt;br /&gt;
    {&lt;br /&gt;
      WiFi.onEvent(WiFiEvent);&lt;br /&gt;
      //WIFI_Connect();&lt;br /&gt;
    } else {&lt;br /&gt;
      //Do something&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Wifi Watchdog&lt;br /&gt;
void WiFiEvent(WiFiEvent_t event) {&lt;br /&gt;
  Serial.printf(&amp;quot;[WiFi-event] event: %d  - &amp;quot;, event);&lt;br /&gt;
  switch(event) {&lt;br /&gt;
  case SYSTEM_EVENT_STA_GOT_IP:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi connected&amp;quot;);&lt;br /&gt;
      Serial.print(&amp;quot;IP address: &amp;quot;); Serial.println(WiFi.localIP());&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_DISCONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi lost connection&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_START:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station start&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_CONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station connected to AP&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_LOST_IP:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 Lost IP&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kalibrierung==&lt;br /&gt;
Als nächstes müssen die Stromsensoren kalibriert werden. Dazu sollten folgende Variablen angepasst werden. Die Kalibrierung habe ich mit einer 100W Lampe und einem Wasserkocher 1800W durchgeführt. Eine genaue Stromzange oder eine Wattmeter sind sehr nützliche Hilfsmittel. In meinem Fall kann der SCT-013-030 als kleinste Einheit 100mA Strom erkennen. Die Sensoren haben 1800 Wicklungen und einen 62 Ohm Burden Widerstand. Der Offset Wert sollte nicht am PC USB Port sondern an einem separaten 5V Netzteil kalibriert werden. Denn die meisten PC USB Anschlüsse liefern bei 200mA nur noch eine Spannung von 4,5V.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;ICAL&#039;&#039;&#039;    = Kalibrierung&lt;br /&gt;
 &#039;&#039;&#039;inPinI1&#039;&#039;&#039; = ADC Pin&lt;br /&gt;
&lt;br /&gt;
 filteredI = &#039;&#039;&#039;0.9989&#039;&#039;&#039; * (lastFilteredI+sampleI-lastSampleI); //Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - &#039;&#039;&#039;0.06&#039;&#039;&#039;;//Offset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Setup variables&lt;br /&gt;
int numberOfSamples = 4000;&lt;br /&gt;
double ICAL = 1.08;&lt;br /&gt;
&lt;br /&gt;
//Set Voltage and current input pins&lt;br /&gt;
int inPinI1 = 34;&lt;br /&gt;
&lt;br /&gt;
// CT: Voltage depends on current, burden resistor, and turns&lt;br /&gt;
#define CT_BURDEN_RESISTOR    62&lt;br /&gt;
#define CT_TURNS              1800&lt;br /&gt;
#define VOLTAGE               225&lt;br /&gt;
&lt;br /&gt;
// Initial gueses for ratios, modified by VCAL/ICAL tweaks&lt;br /&gt;
double I_RATIO = (long double)CT_TURNS / CT_BURDEN_RESISTOR * 3.3 / 4096 * ICAL;&lt;br /&gt;
&lt;br /&gt;
//Filter variables 1&lt;br /&gt;
double lastFilteredI, filteredI;&lt;br /&gt;
double sqI,sumI;&lt;br /&gt;
//Sample variables&lt;br /&gt;
int lastSampleI,sampleI;&lt;br /&gt;
double Irms1;&lt;br /&gt;
unsigned long timer;&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
timer = millis();&lt;br /&gt;
//**************************************************************************&lt;br /&gt;
//Phase1 &lt;br /&gt;
  for (int n=0; n&amp;lt;numberOfSamples; n++)&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastSampleI=sampleI;&lt;br /&gt;
   &lt;br /&gt;
   //Read in voltage and current samples.   &lt;br /&gt;
   sampleI = analogRead(inPinI1);&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastFilteredI = filteredI;&lt;br /&gt;
  &lt;br /&gt;
   //Digital high pass filters to remove 1.6V DC offset.&lt;br /&gt;
   filteredI = 0.9989 * (lastFilteredI+sampleI-lastSampleI);&lt;br /&gt;
   &lt;br /&gt;
   //Root-mean-square method current&lt;br /&gt;
   //1) square current values&lt;br /&gt;
   sqI = filteredI * filteredI;&lt;br /&gt;
   //2) sum &lt;br /&gt;
   sumI += sqI;&lt;br /&gt;
   delay(0.0002);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Calculation of the root of the mean of the voltage and current squared (rms)&lt;br /&gt;
//Calibration coeficients applied. &lt;br /&gt;
Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - 0.06;&lt;br /&gt;
if (Irms1 &amp;lt; 0){ Irms1 = 0; }; //Set negative Current to zero&lt;br /&gt;
sumI = 0;&lt;br /&gt;
&lt;br /&gt;
Serial.println(&amp;quot;Irms1:&amp;quot;+String(Irms1));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=232</id>
		<title>Open Energy Monitor mit dem ESP32</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=232"/>
		<updated>2018-02-05T12:26:49Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Einleitung=&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird beschrieben wie mit Hilfe einer ESP32 Platine ein Strom Sensor für 3 Phasen Wechselstrom aufgebaut werden kann. Der Spannungsteiler aus den 10kOhm Widerständen erzeugt 1,6V für die SCT-013-030 Strom Sensoren. Die Stromsensoren werden mit den ADC Pin&#039;s des ESP32 verbunden. Natürlich sind die Messungen nicht sonderlich genau, da die Phasenverschiebung nicht berücksichtigt wird. Auch das wäre durch zusätzliche Transformatoren möglich die dann auf die ADC Pin&#039;s geführt werden. Da ich damit nur meinen ungefähren Stromverbrauch zuhause messen möchte ist die Schaltung völlig ausreichend.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folgende Bauteile werden benötigt:&#039;&#039;&#039;&lt;br /&gt;
 -Board: DOIT ESP32 DEVKIT V1 (ca. 10€)&lt;br /&gt;
 -Strom Sensor SCT-013-30 (30A) oder SCT-013-100 (100A) siehe: http://openenergymonitor.org/emon/node/156&lt;br /&gt;
 -6x 10kOhm Widerstände 1/4W&lt;br /&gt;
 -3x Elko 10 uF&lt;br /&gt;
 -Universalplatine&lt;br /&gt;
 -evtl. USB Netzteil oder anderes Netzteil für die Spannungsversorgung&lt;br /&gt;
 -Pfosten Stecker Rastermaß: 2.54mm&lt;br /&gt;
 -3 x 3,5 mm Audio Anschluss&lt;br /&gt;
 -Optional: 1000uF / 10V Kondensator zur Stabilisierung&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pinbelegung des DOIT ESP32 DEVKIT V1 Board:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 https://github.com/playelek/pinout-doit-32devkitv1&lt;br /&gt;
&lt;br /&gt;
=Grundlagen=&lt;br /&gt;
&lt;br /&gt;
Auf der Seite von Open Energy Monitor finden sich genügend Informationen über die Grundlagen der Leistungsberechnung. Das Prinzip lässt sich 1:1 vom Aufbau eines Arduinos übernehmen. Der ESP32 verkraftet jedoch maximal 3,3V am Analog Eingang.&lt;br /&gt;
&lt;br /&gt;
 https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino&lt;br /&gt;
&lt;br /&gt;
=Aufbau=&lt;br /&gt;
&lt;br /&gt;
Auf die Lochrasterplatine müssen nur wenige Bauteile. Die Teile lassen sich relativ einfach einlöten. Für den Aufbau werden nur wenige PIN&#039;s des ESP32 benötigt. Bei meinem Aufbau gibt es am obersten Sensor Anschluss noch einen zusätzlichen Burden Widerstand von 200 Ohm. Das liegt daran das der SCT-013-030 Sensor schon einige Jahre alt ist. Bei den neuen Sensoren sind keine Burden Widerstände nötig, da diese schon einen 62 Ohm Burden eingebaut haben. Ein 1000uF Kondensator zwischen 5V und GND ist empfehlenswert, da je nach 5V Netzteil die Messwerte stark schwanken.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 03.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 05.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 01.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
Ich verwende zum programmieren immer die Arduino Gui. Es sind zuerst einige Anpassungen nötig damit das DOIT ESP32 Board von der Arduino Software erkannt wird. Hierzu muss diese Anleitung umgesetzt werden:&lt;br /&gt;
&lt;br /&gt;
 https://github.com/espressif/arduino-esp32&lt;br /&gt;
&lt;br /&gt;
Nach dem Neustart der Arduino Software kann dann das passende ESP32 Board ausgewählt werden. In meinem Beispiel ist es ein DOIT V1 Board.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 04.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
==Spezielle Hinweise für den ESP32==&lt;br /&gt;
Bei der Programmierung des ESP32 gibt es ein paar Dinge zu beachten. Auf den Boards ist meist ein passender Spannungsregler für 3,3V und ein passender FTDI Chip aufgelötet. Somit entfällt eine weitere Schaltung zur Spannungsversorgung. Zudem wird das Board vom FTDI Chip durch die Arduino Software automatisch in den &amp;quot;Upload Modus&amp;quot; versetzt. Man muss also nicht wie beim ESP8266 bestimmte Taster drücken (Flash und Reset) um das Board in den &amp;quot;Upload Modus&amp;quot; zu bringen.&lt;br /&gt;
&lt;br /&gt;
Ich habe öfters die WifiManager Library für das WLAN verwendet. Auf Dauer hatte ich damit jedoch immer wieder Probleme, so das ich meine WLAN Daten mit Absicht &amp;quot;fest&amp;quot; in das Programm einbaue. Zudem ergibt sich beim WLAN noch ein Problem wenn auf einmal die WLAN Verbindung unterbrochen wird, z.B. wenn der Router neu gestartet wird. Danach verbindet sich der ESP32 nämlich nicht mehr automatisch mit dem WLAN. Um das zu verhindern habe ich folgende Funktion in den Code eingebaut. Die Funktion WifiEvent startet den ESP32 neu wenn keine Verbindung mehr zum WLAN besteht. Leider funktioniert jeder andere Weg im Moment nicht zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
//Wifi WatchDog&lt;br /&gt;
WiFi.onEvent(WiFiEvent);&lt;br /&gt;
//Check if WiFi is here&lt;br /&gt;
//Automatically reconnect the ESP32 if the WiFi Router is not there...&lt;br /&gt;
if (WiFi.status() != WL_CONNECTED)&lt;br /&gt;
    {&lt;br /&gt;
      WiFi.onEvent(WiFiEvent);&lt;br /&gt;
      //WIFI_Connect();&lt;br /&gt;
    } else {&lt;br /&gt;
      //Do something&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Wifi Watchdog&lt;br /&gt;
void WiFiEvent(WiFiEvent_t event) {&lt;br /&gt;
  Serial.printf(&amp;quot;[WiFi-event] event: %d  - &amp;quot;, event);&lt;br /&gt;
  switch(event) {&lt;br /&gt;
  case SYSTEM_EVENT_STA_GOT_IP:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi connected&amp;quot;);&lt;br /&gt;
      Serial.print(&amp;quot;IP address: &amp;quot;); Serial.println(WiFi.localIP());&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_DISCONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi lost connection&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_START:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station start&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_CONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station connected to AP&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_LOST_IP:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 Lost IP&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kalibrierung==&lt;br /&gt;
Als nächstes müssen die Stromsensoren kalibriert werden. Dazu sollten folgende Variablen angepasst werden. Die Kalibrierung habe ich mit einer 100W Lampe und einem Wasserkocher 1800W durchgeführt. Eine genaue Stromzange oder eine Wattmeter sind sehr nützliche Hilfsmittel. In meinem Fall kann der SCT-013-030 als kleinste Einheit 100mA Strom erkennen. Die Sensoren haben 1800 Wicklungen und einen 62 Ohm Burden Widerstand.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;ICAL&#039;&#039;&#039;    = Kalibrierung&lt;br /&gt;
 &#039;&#039;&#039;inPinI1&#039;&#039;&#039; = ADC Pin&lt;br /&gt;
&lt;br /&gt;
 filteredI = &#039;&#039;&#039;0.9989&#039;&#039;&#039; * (lastFilteredI+sampleI-lastSampleI); //Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - &#039;&#039;&#039;0.06&#039;&#039;&#039;;//Offset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Setup variables&lt;br /&gt;
int numberOfSamples = 4000;&lt;br /&gt;
double ICAL = 1.08;&lt;br /&gt;
&lt;br /&gt;
//Set Voltage and current input pins&lt;br /&gt;
int inPinI1 = 34;&lt;br /&gt;
&lt;br /&gt;
// CT: Voltage depends on current, burden resistor, and turns&lt;br /&gt;
#define CT_BURDEN_RESISTOR    62&lt;br /&gt;
#define CT_TURNS              1800&lt;br /&gt;
#define VOLTAGE               225&lt;br /&gt;
&lt;br /&gt;
// Initial gueses for ratios, modified by VCAL/ICAL tweaks&lt;br /&gt;
double I_RATIO = (long double)CT_TURNS / CT_BURDEN_RESISTOR * 3.3 / 4096 * ICAL;&lt;br /&gt;
&lt;br /&gt;
//Filter variables 1&lt;br /&gt;
double lastFilteredI, filteredI;&lt;br /&gt;
double sqI,sumI;&lt;br /&gt;
//Sample variables&lt;br /&gt;
int lastSampleI,sampleI;&lt;br /&gt;
double Irms1;&lt;br /&gt;
unsigned long timer;&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
timer = millis();&lt;br /&gt;
//**************************************************************************&lt;br /&gt;
//Phase1 &lt;br /&gt;
  for (int n=0; n&amp;lt;numberOfSamples; n++)&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastSampleI=sampleI;&lt;br /&gt;
   &lt;br /&gt;
   //Read in voltage and current samples.   &lt;br /&gt;
   sampleI = analogRead(inPinI1);&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastFilteredI = filteredI;&lt;br /&gt;
  &lt;br /&gt;
   //Digital high pass filters to remove 1.6V DC offset.&lt;br /&gt;
   filteredI = 0.9989 * (lastFilteredI+sampleI-lastSampleI);&lt;br /&gt;
   &lt;br /&gt;
   //Root-mean-square method current&lt;br /&gt;
   //1) square current values&lt;br /&gt;
   sqI = filteredI * filteredI;&lt;br /&gt;
   //2) sum &lt;br /&gt;
   sumI += sqI;&lt;br /&gt;
   delay(0.0002);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Calculation of the root of the mean of the voltage and current squared (rms)&lt;br /&gt;
//Calibration coeficients applied. &lt;br /&gt;
Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - 0.06;&lt;br /&gt;
if (Irms1 &amp;lt; 0){ Irms1 = 0; }; //Set negative Current to zero&lt;br /&gt;
sumI = 0;&lt;br /&gt;
&lt;br /&gt;
Serial.println(&amp;quot;Irms1:&amp;quot;+String(Irms1));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=231</id>
		<title>Open Energy Monitor mit dem ESP32</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=231"/>
		<updated>2018-02-05T12:26:14Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Aufbau */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Einleitung=&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird beschrieben wie mit Hilfe einer ESP32 Platine ein Strom Sensor für 3 Phasen Wechselstrom aufgebaut werden kann. Der Spannungsteiler aus den 10kOhm Widerständen erzeugt 1,6V für die SCT-013-030 Strom Sensoren. Die Stromsensoren werden mit den ADC Pin&#039;s des ESP32 verbunden. Natürlich sind die Messungen nicht sonderlich genau, da die Phasenverschiebung nicht berücksichtigt wird. Auch das wäre durch zusätzliche Transformatoren möglich die dann auf die ADC Pin&#039;s geführt werden. Da ich damit nur meinen ungefähren Stromverbrauch zuhause messen möchte ist die Schaltung völlig ausreichend.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folgende Bauteile werden benötigt:&#039;&#039;&#039;&lt;br /&gt;
 -Board: DOIT ESP32 DEVKIT V1 (ca. 10€)&lt;br /&gt;
 -Strom Sensor SCT-013-30 (30A) oder SCT-013-100 (100A) siehe: http://openenergymonitor.org/emon/node/156&lt;br /&gt;
 -6x 10kOhm Widerstände 1/4W&lt;br /&gt;
 -3x Elko 10 uF&lt;br /&gt;
 -Universalplatine&lt;br /&gt;
 -evtl. USB Netzteil oder anderes Netzteil für die Spannungsversorgung&lt;br /&gt;
 -Pfosten Stecker Rastermaß: 2.54mm&lt;br /&gt;
 -3 x 3,5 mm Audio Anschluss&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pinbelegung des DOIT ESP32 DEVKIT V1 Board:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 https://github.com/playelek/pinout-doit-32devkitv1&lt;br /&gt;
&lt;br /&gt;
=Grundlagen=&lt;br /&gt;
&lt;br /&gt;
Auf der Seite von Open Energy Monitor finden sich genügend Informationen über die Grundlagen der Leistungsberechnung. Das Prinzip lässt sich 1:1 vom Aufbau eines Arduinos übernehmen. Der ESP32 verkraftet jedoch maximal 3,3V am Analog Eingang.&lt;br /&gt;
&lt;br /&gt;
 https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino&lt;br /&gt;
&lt;br /&gt;
=Aufbau=&lt;br /&gt;
&lt;br /&gt;
Auf die Lochrasterplatine müssen nur wenige Bauteile. Die Teile lassen sich relativ einfach einlöten. Für den Aufbau werden nur wenige PIN&#039;s des ESP32 benötigt. Bei meinem Aufbau gibt es am obersten Sensor Anschluss noch einen zusätzlichen Burden Widerstand von 200 Ohm. Das liegt daran das der SCT-013-030 Sensor schon einige Jahre alt ist. Bei den neuen Sensoren sind keine Burden Widerstände nötig, da diese schon einen 62 Ohm Burden eingebaut haben. Ein 1000uF Kondensator zwischen 5V und GND ist empfehlenswert, da je nach 5V Netzteil die Messwerte stark schwanken.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 03.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 05.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 01.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
Ich verwende zum programmieren immer die Arduino Gui. Es sind zuerst einige Anpassungen nötig damit das DOIT ESP32 Board von der Arduino Software erkannt wird. Hierzu muss diese Anleitung umgesetzt werden:&lt;br /&gt;
&lt;br /&gt;
 https://github.com/espressif/arduino-esp32&lt;br /&gt;
&lt;br /&gt;
Nach dem Neustart der Arduino Software kann dann das passende ESP32 Board ausgewählt werden. In meinem Beispiel ist es ein DOIT V1 Board.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 04.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
==Spezielle Hinweise für den ESP32==&lt;br /&gt;
Bei der Programmierung des ESP32 gibt es ein paar Dinge zu beachten. Auf den Boards ist meist ein passender Spannungsregler für 3,3V und ein passender FTDI Chip aufgelötet. Somit entfällt eine weitere Schaltung zur Spannungsversorgung. Zudem wird das Board vom FTDI Chip durch die Arduino Software automatisch in den &amp;quot;Upload Modus&amp;quot; versetzt. Man muss also nicht wie beim ESP8266 bestimmte Taster drücken (Flash und Reset) um das Board in den &amp;quot;Upload Modus&amp;quot; zu bringen.&lt;br /&gt;
&lt;br /&gt;
Ich habe öfters die WifiManager Library für das WLAN verwendet. Auf Dauer hatte ich damit jedoch immer wieder Probleme, so das ich meine WLAN Daten mit Absicht &amp;quot;fest&amp;quot; in das Programm einbaue. Zudem ergibt sich beim WLAN noch ein Problem wenn auf einmal die WLAN Verbindung unterbrochen wird, z.B. wenn der Router neu gestartet wird. Danach verbindet sich der ESP32 nämlich nicht mehr automatisch mit dem WLAN. Um das zu verhindern habe ich folgende Funktion in den Code eingebaut. Die Funktion WifiEvent startet den ESP32 neu wenn keine Verbindung mehr zum WLAN besteht. Leider funktioniert jeder andere Weg im Moment nicht zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
//Wifi WatchDog&lt;br /&gt;
WiFi.onEvent(WiFiEvent);&lt;br /&gt;
//Check if WiFi is here&lt;br /&gt;
//Automatically reconnect the ESP32 if the WiFi Router is not there...&lt;br /&gt;
if (WiFi.status() != WL_CONNECTED)&lt;br /&gt;
    {&lt;br /&gt;
      WiFi.onEvent(WiFiEvent);&lt;br /&gt;
      //WIFI_Connect();&lt;br /&gt;
    } else {&lt;br /&gt;
      //Do something&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Wifi Watchdog&lt;br /&gt;
void WiFiEvent(WiFiEvent_t event) {&lt;br /&gt;
  Serial.printf(&amp;quot;[WiFi-event] event: %d  - &amp;quot;, event);&lt;br /&gt;
  switch(event) {&lt;br /&gt;
  case SYSTEM_EVENT_STA_GOT_IP:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi connected&amp;quot;);&lt;br /&gt;
      Serial.print(&amp;quot;IP address: &amp;quot;); Serial.println(WiFi.localIP());&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_DISCONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi lost connection&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_START:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station start&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_CONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station connected to AP&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_LOST_IP:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 Lost IP&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kalibrierung==&lt;br /&gt;
Als nächstes müssen die Stromsensoren kalibriert werden. Dazu sollten folgende Variablen angepasst werden. Die Kalibrierung habe ich mit einer 100W Lampe und einem Wasserkocher 1800W durchgeführt. Eine genaue Stromzange oder eine Wattmeter sind sehr nützliche Hilfsmittel. In meinem Fall kann der SCT-013-030 als kleinste Einheit 100mA Strom erkennen. Die Sensoren haben 1800 Wicklungen und einen 62 Ohm Burden Widerstand.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;ICAL&#039;&#039;&#039;    = Kalibrierung&lt;br /&gt;
 &#039;&#039;&#039;inPinI1&#039;&#039;&#039; = ADC Pin&lt;br /&gt;
&lt;br /&gt;
 filteredI = &#039;&#039;&#039;0.9989&#039;&#039;&#039; * (lastFilteredI+sampleI-lastSampleI); //Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - &#039;&#039;&#039;0.06&#039;&#039;&#039;;//Offset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Setup variables&lt;br /&gt;
int numberOfSamples = 4000;&lt;br /&gt;
double ICAL = 1.08;&lt;br /&gt;
&lt;br /&gt;
//Set Voltage and current input pins&lt;br /&gt;
int inPinI1 = 34;&lt;br /&gt;
&lt;br /&gt;
// CT: Voltage depends on current, burden resistor, and turns&lt;br /&gt;
#define CT_BURDEN_RESISTOR    62&lt;br /&gt;
#define CT_TURNS              1800&lt;br /&gt;
#define VOLTAGE               225&lt;br /&gt;
&lt;br /&gt;
// Initial gueses for ratios, modified by VCAL/ICAL tweaks&lt;br /&gt;
double I_RATIO = (long double)CT_TURNS / CT_BURDEN_RESISTOR * 3.3 / 4096 * ICAL;&lt;br /&gt;
&lt;br /&gt;
//Filter variables 1&lt;br /&gt;
double lastFilteredI, filteredI;&lt;br /&gt;
double sqI,sumI;&lt;br /&gt;
//Sample variables&lt;br /&gt;
int lastSampleI,sampleI;&lt;br /&gt;
double Irms1;&lt;br /&gt;
unsigned long timer;&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
timer = millis();&lt;br /&gt;
//**************************************************************************&lt;br /&gt;
//Phase1 &lt;br /&gt;
  for (int n=0; n&amp;lt;numberOfSamples; n++)&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastSampleI=sampleI;&lt;br /&gt;
   &lt;br /&gt;
   //Read in voltage and current samples.   &lt;br /&gt;
   sampleI = analogRead(inPinI1);&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastFilteredI = filteredI;&lt;br /&gt;
  &lt;br /&gt;
   //Digital high pass filters to remove 1.6V DC offset.&lt;br /&gt;
   filteredI = 0.9989 * (lastFilteredI+sampleI-lastSampleI);&lt;br /&gt;
   &lt;br /&gt;
   //Root-mean-square method current&lt;br /&gt;
   //1) square current values&lt;br /&gt;
   sqI = filteredI * filteredI;&lt;br /&gt;
   //2) sum &lt;br /&gt;
   sumI += sqI;&lt;br /&gt;
   delay(0.0002);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Calculation of the root of the mean of the voltage and current squared (rms)&lt;br /&gt;
//Calibration coeficients applied. &lt;br /&gt;
Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - 0.06;&lt;br /&gt;
if (Irms1 &amp;lt; 0){ Irms1 = 0; }; //Set negative Current to zero&lt;br /&gt;
sumI = 0;&lt;br /&gt;
&lt;br /&gt;
Serial.println(&amp;quot;Irms1:&amp;quot;+String(Irms1));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=230</id>
		<title>Open Energy Monitor mit dem ESP32</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=230"/>
		<updated>2018-02-04T19:03:36Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Kalibrierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Einleitung=&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird beschrieben wie mit Hilfe einer ESP32 Platine ein Strom Sensor für 3 Phasen Wechselstrom aufgebaut werden kann. Der Spannungsteiler aus den 10kOhm Widerständen erzeugt 1,6V für die SCT-013-030 Strom Sensoren. Die Stromsensoren werden mit den ADC Pin&#039;s des ESP32 verbunden. Natürlich sind die Messungen nicht sonderlich genau, da die Phasenverschiebung nicht berücksichtigt wird. Auch das wäre durch zusätzliche Transformatoren möglich die dann auf die ADC Pin&#039;s geführt werden. Da ich damit nur meinen ungefähren Stromverbrauch zuhause messen möchte ist die Schaltung völlig ausreichend.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folgende Bauteile werden benötigt:&#039;&#039;&#039;&lt;br /&gt;
 -Board: DOIT ESP32 DEVKIT V1 (ca. 10€)&lt;br /&gt;
 -Strom Sensor SCT-013-30 (30A) oder SCT-013-100 (100A) siehe: http://openenergymonitor.org/emon/node/156&lt;br /&gt;
 -6x 10kOhm Widerstände 1/4W&lt;br /&gt;
 -3x Elko 10 uF&lt;br /&gt;
 -Universalplatine&lt;br /&gt;
 -evtl. USB Netzteil oder anderes Netzteil für die Spannungsversorgung&lt;br /&gt;
 -Pfosten Stecker Rastermaß: 2.54mm&lt;br /&gt;
 -3 x 3,5 mm Audio Anschluss&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pinbelegung des DOIT ESP32 DEVKIT V1 Board:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 https://github.com/playelek/pinout-doit-32devkitv1&lt;br /&gt;
&lt;br /&gt;
=Grundlagen=&lt;br /&gt;
&lt;br /&gt;
Auf der Seite von Open Energy Monitor finden sich genügend Informationen über die Grundlagen der Leistungsberechnung. Das Prinzip lässt sich 1:1 vom Aufbau eines Arduinos übernehmen. Der ESP32 verkraftet jedoch maximal 3,3V am Analog Eingang.&lt;br /&gt;
&lt;br /&gt;
 https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino&lt;br /&gt;
&lt;br /&gt;
=Aufbau=&lt;br /&gt;
&lt;br /&gt;
Auf die Lochrasterplatine müssen nur wenige Bauteile. Die Teile lassen sich relativ einfach einlöten. Für den Aufbau werden nur wenige PIN&#039;s des ESP32 benötigt. Bei meinem Aufbau gibt es am obersten Sensor Anschluss noch einen zusätzlichen Burden Widerstand von 200 Ohm. Das liegt daran das der SCT-013-030 Sensor schon einige Jahre alt ist. Bei den neuen Sensoren sind keine Burden Widerstände nötig, da diese schon einen 62 Ohm Burden eingebaut haben.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 03.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 05.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 01.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
Ich verwende zum programmieren immer die Arduino Gui. Es sind zuerst einige Anpassungen nötig damit das DOIT ESP32 Board von der Arduino Software erkannt wird. Hierzu muss diese Anleitung umgesetzt werden:&lt;br /&gt;
&lt;br /&gt;
 https://github.com/espressif/arduino-esp32&lt;br /&gt;
&lt;br /&gt;
Nach dem Neustart der Arduino Software kann dann das passende ESP32 Board ausgewählt werden. In meinem Beispiel ist es ein DOIT V1 Board.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 04.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
==Spezielle Hinweise für den ESP32==&lt;br /&gt;
Bei der Programmierung des ESP32 gibt es ein paar Dinge zu beachten. Auf den Boards ist meist ein passender Spannungsregler für 3,3V und ein passender FTDI Chip aufgelötet. Somit entfällt eine weitere Schaltung zur Spannungsversorgung. Zudem wird das Board vom FTDI Chip durch die Arduino Software automatisch in den &amp;quot;Upload Modus&amp;quot; versetzt. Man muss also nicht wie beim ESP8266 bestimmte Taster drücken (Flash und Reset) um das Board in den &amp;quot;Upload Modus&amp;quot; zu bringen.&lt;br /&gt;
&lt;br /&gt;
Ich habe öfters die WifiManager Library für das WLAN verwendet. Auf Dauer hatte ich damit jedoch immer wieder Probleme, so das ich meine WLAN Daten mit Absicht &amp;quot;fest&amp;quot; in das Programm einbaue. Zudem ergibt sich beim WLAN noch ein Problem wenn auf einmal die WLAN Verbindung unterbrochen wird, z.B. wenn der Router neu gestartet wird. Danach verbindet sich der ESP32 nämlich nicht mehr automatisch mit dem WLAN. Um das zu verhindern habe ich folgende Funktion in den Code eingebaut. Die Funktion WifiEvent startet den ESP32 neu wenn keine Verbindung mehr zum WLAN besteht. Leider funktioniert jeder andere Weg im Moment nicht zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
//Wifi WatchDog&lt;br /&gt;
WiFi.onEvent(WiFiEvent);&lt;br /&gt;
//Check if WiFi is here&lt;br /&gt;
//Automatically reconnect the ESP32 if the WiFi Router is not there...&lt;br /&gt;
if (WiFi.status() != WL_CONNECTED)&lt;br /&gt;
    {&lt;br /&gt;
      WiFi.onEvent(WiFiEvent);&lt;br /&gt;
      //WIFI_Connect();&lt;br /&gt;
    } else {&lt;br /&gt;
      //Do something&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Wifi Watchdog&lt;br /&gt;
void WiFiEvent(WiFiEvent_t event) {&lt;br /&gt;
  Serial.printf(&amp;quot;[WiFi-event] event: %d  - &amp;quot;, event);&lt;br /&gt;
  switch(event) {&lt;br /&gt;
  case SYSTEM_EVENT_STA_GOT_IP:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi connected&amp;quot;);&lt;br /&gt;
      Serial.print(&amp;quot;IP address: &amp;quot;); Serial.println(WiFi.localIP());&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_DISCONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi lost connection&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_START:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station start&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_CONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station connected to AP&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_LOST_IP:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 Lost IP&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kalibrierung==&lt;br /&gt;
Als nächstes müssen die Stromsensoren kalibriert werden. Dazu sollten folgende Variablen angepasst werden. Die Kalibrierung habe ich mit einer 100W Lampe und einem Wasserkocher 1800W durchgeführt. Eine genaue Stromzange oder eine Wattmeter sind sehr nützliche Hilfsmittel. In meinem Fall kann der SCT-013-030 als kleinste Einheit 100mA Strom erkennen. Die Sensoren haben 1800 Wicklungen und einen 62 Ohm Burden Widerstand.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;ICAL&#039;&#039;&#039;    = Kalibrierung&lt;br /&gt;
 &#039;&#039;&#039;inPinI1&#039;&#039;&#039; = ADC Pin&lt;br /&gt;
&lt;br /&gt;
 filteredI = &#039;&#039;&#039;0.9989&#039;&#039;&#039; * (lastFilteredI+sampleI-lastSampleI); //Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - &#039;&#039;&#039;0.06&#039;&#039;&#039;;//Offset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Setup variables&lt;br /&gt;
int numberOfSamples = 4000;&lt;br /&gt;
double ICAL = 1.08;&lt;br /&gt;
&lt;br /&gt;
//Set Voltage and current input pins&lt;br /&gt;
int inPinI1 = 34;&lt;br /&gt;
&lt;br /&gt;
// CT: Voltage depends on current, burden resistor, and turns&lt;br /&gt;
#define CT_BURDEN_RESISTOR    62&lt;br /&gt;
#define CT_TURNS              1800&lt;br /&gt;
#define VOLTAGE               225&lt;br /&gt;
&lt;br /&gt;
// Initial gueses for ratios, modified by VCAL/ICAL tweaks&lt;br /&gt;
double I_RATIO = (long double)CT_TURNS / CT_BURDEN_RESISTOR * 3.3 / 4096 * ICAL;&lt;br /&gt;
&lt;br /&gt;
//Filter variables 1&lt;br /&gt;
double lastFilteredI, filteredI;&lt;br /&gt;
double sqI,sumI;&lt;br /&gt;
//Sample variables&lt;br /&gt;
int lastSampleI,sampleI;&lt;br /&gt;
double Irms1;&lt;br /&gt;
unsigned long timer;&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
timer = millis();&lt;br /&gt;
//**************************************************************************&lt;br /&gt;
//Phase1 &lt;br /&gt;
  for (int n=0; n&amp;lt;numberOfSamples; n++)&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastSampleI=sampleI;&lt;br /&gt;
   &lt;br /&gt;
   //Read in voltage and current samples.   &lt;br /&gt;
   sampleI = analogRead(inPinI1);&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastFilteredI = filteredI;&lt;br /&gt;
  &lt;br /&gt;
   //Digital high pass filters to remove 1.6V DC offset.&lt;br /&gt;
   filteredI = 0.9989 * (lastFilteredI+sampleI-lastSampleI);&lt;br /&gt;
   &lt;br /&gt;
   //Root-mean-square method current&lt;br /&gt;
   //1) square current values&lt;br /&gt;
   sqI = filteredI * filteredI;&lt;br /&gt;
   //2) sum &lt;br /&gt;
   sumI += sqI;&lt;br /&gt;
   delay(0.0002);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Calculation of the root of the mean of the voltage and current squared (rms)&lt;br /&gt;
//Calibration coeficients applied. &lt;br /&gt;
Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - 0.06;&lt;br /&gt;
if (Irms1 &amp;lt; 0){ Irms1 = 0; }; //Set negative Current to zero&lt;br /&gt;
sumI = 0;&lt;br /&gt;
&lt;br /&gt;
Serial.println(&amp;quot;Irms1:&amp;quot;+String(Irms1));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=229</id>
		<title>Open Energy Monitor mit dem ESP32</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=229"/>
		<updated>2018-02-04T18:59:17Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Aufbau */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Einleitung=&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird beschrieben wie mit Hilfe einer ESP32 Platine ein Strom Sensor für 3 Phasen Wechselstrom aufgebaut werden kann. Der Spannungsteiler aus den 10kOhm Widerständen erzeugt 1,6V für die SCT-013-030 Strom Sensoren. Die Stromsensoren werden mit den ADC Pin&#039;s des ESP32 verbunden. Natürlich sind die Messungen nicht sonderlich genau, da die Phasenverschiebung nicht berücksichtigt wird. Auch das wäre durch zusätzliche Transformatoren möglich die dann auf die ADC Pin&#039;s geführt werden. Da ich damit nur meinen ungefähren Stromverbrauch zuhause messen möchte ist die Schaltung völlig ausreichend.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folgende Bauteile werden benötigt:&#039;&#039;&#039;&lt;br /&gt;
 -Board: DOIT ESP32 DEVKIT V1 (ca. 10€)&lt;br /&gt;
 -Strom Sensor SCT-013-30 (30A) oder SCT-013-100 (100A) siehe: http://openenergymonitor.org/emon/node/156&lt;br /&gt;
 -6x 10kOhm Widerstände 1/4W&lt;br /&gt;
 -3x Elko 10 uF&lt;br /&gt;
 -Universalplatine&lt;br /&gt;
 -evtl. USB Netzteil oder anderes Netzteil für die Spannungsversorgung&lt;br /&gt;
 -Pfosten Stecker Rastermaß: 2.54mm&lt;br /&gt;
 -3 x 3,5 mm Audio Anschluss&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pinbelegung des DOIT ESP32 DEVKIT V1 Board:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 https://github.com/playelek/pinout-doit-32devkitv1&lt;br /&gt;
&lt;br /&gt;
=Grundlagen=&lt;br /&gt;
&lt;br /&gt;
Auf der Seite von Open Energy Monitor finden sich genügend Informationen über die Grundlagen der Leistungsberechnung. Das Prinzip lässt sich 1:1 vom Aufbau eines Arduinos übernehmen. Der ESP32 verkraftet jedoch maximal 3,3V am Analog Eingang.&lt;br /&gt;
&lt;br /&gt;
 https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino&lt;br /&gt;
&lt;br /&gt;
=Aufbau=&lt;br /&gt;
&lt;br /&gt;
Auf die Lochrasterplatine müssen nur wenige Bauteile. Die Teile lassen sich relativ einfach einlöten. Für den Aufbau werden nur wenige PIN&#039;s des ESP32 benötigt. Bei meinem Aufbau gibt es am obersten Sensor Anschluss noch einen zusätzlichen Burden Widerstand von 200 Ohm. Das liegt daran das der SCT-013-030 Sensor schon einige Jahre alt ist. Bei den neuen Sensoren sind keine Burden Widerstände nötig, da diese schon einen 62 Ohm Burden eingebaut haben.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 03.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 05.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 01.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
Ich verwende zum programmieren immer die Arduino Gui. Es sind zuerst einige Anpassungen nötig damit das DOIT ESP32 Board von der Arduino Software erkannt wird. Hierzu muss diese Anleitung umgesetzt werden:&lt;br /&gt;
&lt;br /&gt;
 https://github.com/espressif/arduino-esp32&lt;br /&gt;
&lt;br /&gt;
Nach dem Neustart der Arduino Software kann dann das passende ESP32 Board ausgewählt werden. In meinem Beispiel ist es ein DOIT V1 Board.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 04.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
==Spezielle Hinweise für den ESP32==&lt;br /&gt;
Bei der Programmierung des ESP32 gibt es ein paar Dinge zu beachten. Auf den Boards ist meist ein passender Spannungsregler für 3,3V und ein passender FTDI Chip aufgelötet. Somit entfällt eine weitere Schaltung zur Spannungsversorgung. Zudem wird das Board vom FTDI Chip durch die Arduino Software automatisch in den &amp;quot;Upload Modus&amp;quot; versetzt. Man muss also nicht wie beim ESP8266 bestimmte Taster drücken (Flash und Reset) um das Board in den &amp;quot;Upload Modus&amp;quot; zu bringen.&lt;br /&gt;
&lt;br /&gt;
Ich habe öfters die WifiManager Library für das WLAN verwendet. Auf Dauer hatte ich damit jedoch immer wieder Probleme, so das ich meine WLAN Daten mit Absicht &amp;quot;fest&amp;quot; in das Programm einbaue. Zudem ergibt sich beim WLAN noch ein Problem wenn auf einmal die WLAN Verbindung unterbrochen wird, z.B. wenn der Router neu gestartet wird. Danach verbindet sich der ESP32 nämlich nicht mehr automatisch mit dem WLAN. Um das zu verhindern habe ich folgende Funktion in den Code eingebaut. Die Funktion WifiEvent startet den ESP32 neu wenn keine Verbindung mehr zum WLAN besteht. Leider funktioniert jeder andere Weg im Moment nicht zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
//Wifi WatchDog&lt;br /&gt;
WiFi.onEvent(WiFiEvent);&lt;br /&gt;
//Check if WiFi is here&lt;br /&gt;
//Automatically reconnect the ESP32 if the WiFi Router is not there...&lt;br /&gt;
if (WiFi.status() != WL_CONNECTED)&lt;br /&gt;
    {&lt;br /&gt;
      WiFi.onEvent(WiFiEvent);&lt;br /&gt;
      //WIFI_Connect();&lt;br /&gt;
    } else {&lt;br /&gt;
      //Do something&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Wifi Watchdog&lt;br /&gt;
void WiFiEvent(WiFiEvent_t event) {&lt;br /&gt;
  Serial.printf(&amp;quot;[WiFi-event] event: %d  - &amp;quot;, event);&lt;br /&gt;
  switch(event) {&lt;br /&gt;
  case SYSTEM_EVENT_STA_GOT_IP:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi connected&amp;quot;);&lt;br /&gt;
      Serial.print(&amp;quot;IP address: &amp;quot;); Serial.println(WiFi.localIP());&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_DISCONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi lost connection&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_START:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station start&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_CONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station connected to AP&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_LOST_IP:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 Lost IP&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kalibrierung==&lt;br /&gt;
Als nächstes müssen die Stromsensoren kalibriert werden. Dazu sollten folgende Variablen angepasst werden. Die Kalibrierung habe ich mit einer 100W Lampe und einem Wasserkocher 1800W durchgeführt. Eine genaue Stromzange oder eine Wattmeter sind sehr nützliche Hilfsmittel. In meinem Fall kann der SCT-013-030 als kleinste Einheit 100mA Strom erkennen. Die Sensoren haben 1800 Wicklungen und einen 62 Ohm Burden Widerstand.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;ICAL&#039;&#039;&#039;    = Kalibrierung&lt;br /&gt;
 &#039;&#039;&#039;inPinI1&#039;&#039;&#039; = ADC Pin&lt;br /&gt;
&lt;br /&gt;
 filteredI = &#039;&#039;&#039;0.9989&#039;&#039;&#039; * (lastFilteredI+sampleI-lastSampleI); //Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - &#039;&#039;&#039;0.06&#039;&#039;&#039;;//Offset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Setup variables&lt;br /&gt;
int numberOfSamples = 4000;&lt;br /&gt;
double ICAL = 1.08;&lt;br /&gt;
&lt;br /&gt;
//Set Voltage and current input pins&lt;br /&gt;
int inPinI1 = 34;&lt;br /&gt;
&lt;br /&gt;
// CT: Voltage depends on current, burden resistor, and turns&lt;br /&gt;
#define CT_BURDEN_RESISTOR    62&lt;br /&gt;
#define CT_TURNS              1800&lt;br /&gt;
#define VOLTAGE               225&lt;br /&gt;
&lt;br /&gt;
// Initial gueses for ratios, modified by VCAL/ICAL tweaks&lt;br /&gt;
double I_RATIO = (long double)CT_TURNS / CT_BURDEN_RESISTOR * 3.3 / 4096 * ICAL;&lt;br /&gt;
&lt;br /&gt;
//Filter variables 1&lt;br /&gt;
double lastFilteredI, filteredI;&lt;br /&gt;
double sqI,sumI;&lt;br /&gt;
//Sample variables&lt;br /&gt;
int lastSampleI,sampleI;&lt;br /&gt;
double Irms1;&lt;br /&gt;
unsigned long timer;&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
//**************************************************************************&lt;br /&gt;
//Phase1 &lt;br /&gt;
  for (int n=0; n&amp;lt;numberOfSamples; n++)&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastSampleI=sampleI;&lt;br /&gt;
   &lt;br /&gt;
   //Read in voltage and current samples.   &lt;br /&gt;
   sampleI = analogRead(inPinI1);&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastFilteredI = filteredI;&lt;br /&gt;
  &lt;br /&gt;
   //Digital high pass filters to remove 1.6V DC offset.&lt;br /&gt;
   filteredI = 0.9989 * (lastFilteredI+sampleI-lastSampleI);&lt;br /&gt;
   &lt;br /&gt;
   //Root-mean-square method current&lt;br /&gt;
   //1) square current values&lt;br /&gt;
   sqI = filteredI * filteredI;&lt;br /&gt;
   //2) sum &lt;br /&gt;
   sumI += sqI;&lt;br /&gt;
   delay(0.0002);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Calculation of the root of the mean of the voltage and current squared (rms)&lt;br /&gt;
//Calibration coeficients applied. &lt;br /&gt;
Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - 0.06;&lt;br /&gt;
if (Irms1 &amp;lt; 0){ Irms1 = 0; }; //Set negative Current to zero&lt;br /&gt;
sumI = 0;&lt;br /&gt;
&lt;br /&gt;
Serial.println(&amp;quot;Irms1:&amp;quot;+String(Irms1));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Datei:ESP32_05.png&amp;diff=228</id>
		<title>Datei:ESP32 05.png</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Datei:ESP32_05.png&amp;diff=228"/>
		<updated>2018-02-04T18:58:42Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=227</id>
		<title>Open Energy Monitor mit dem ESP32</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=227"/>
		<updated>2018-02-04T18:50:45Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Spezielle Hinweise für den ESP32 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Einleitung=&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird beschrieben wie mit Hilfe einer ESP32 Platine ein Strom Sensor für 3 Phasen Wechselstrom aufgebaut werden kann. Der Spannungsteiler aus den 10kOhm Widerständen erzeugt 1,6V für die SCT-013-030 Strom Sensoren. Die Stromsensoren werden mit den ADC Pin&#039;s des ESP32 verbunden. Natürlich sind die Messungen nicht sonderlich genau, da die Phasenverschiebung nicht berücksichtigt wird. Auch das wäre durch zusätzliche Transformatoren möglich die dann auf die ADC Pin&#039;s geführt werden. Da ich damit nur meinen ungefähren Stromverbrauch zuhause messen möchte ist die Schaltung völlig ausreichend.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folgende Bauteile werden benötigt:&#039;&#039;&#039;&lt;br /&gt;
 -Board: DOIT ESP32 DEVKIT V1 (ca. 10€)&lt;br /&gt;
 -Strom Sensor SCT-013-30 (30A) oder SCT-013-100 (100A) siehe: http://openenergymonitor.org/emon/node/156&lt;br /&gt;
 -6x 10kOhm Widerstände 1/4W&lt;br /&gt;
 -3x Elko 10 uF&lt;br /&gt;
 -Universalplatine&lt;br /&gt;
 -evtl. USB Netzteil oder anderes Netzteil für die Spannungsversorgung&lt;br /&gt;
 -Pfosten Stecker Rastermaß: 2.54mm&lt;br /&gt;
 -3 x 3,5 mm Audio Anschluss&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pinbelegung des DOIT ESP32 DEVKIT V1 Board:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 https://github.com/playelek/pinout-doit-32devkitv1&lt;br /&gt;
&lt;br /&gt;
=Grundlagen=&lt;br /&gt;
&lt;br /&gt;
Auf der Seite von Open Energy Monitor finden sich genügend Informationen über die Grundlagen der Leistungsberechnung. Das Prinzip lässt sich 1:1 vom Aufbau eines Arduinos übernehmen. Der ESP32 verkraftet jedoch maximal 3,3V am Analog Eingang.&lt;br /&gt;
&lt;br /&gt;
 https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino&lt;br /&gt;
&lt;br /&gt;
=Aufbau=&lt;br /&gt;
&lt;br /&gt;
Auf die Lochrasterplatine müssen nur wenige Bauteile. Die Teile lassen sich relativ einfach einlöten. Für den Aufbau werden nur wenige PIN&#039;s des ESP32 benötigt. Bei meinem Aufbau gibt es am obersten Sensor Anschluss noch einen zusätzlichen Burden Widerstand von 200 Ohm. Das liegt daran das der SCT-013-030 Sensor schon einige Jahre alt ist. Bei den neuen Sensoren sind keine Burden Widerstände nötig, da diese schon einen 62 Ohm Burden eingebaut haben.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 03.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 01.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
Ich verwende zum programmieren immer die Arduino Gui. Es sind zuerst einige Anpassungen nötig damit das DOIT ESP32 Board von der Arduino Software erkannt wird. Hierzu muss diese Anleitung umgesetzt werden:&lt;br /&gt;
&lt;br /&gt;
 https://github.com/espressif/arduino-esp32&lt;br /&gt;
&lt;br /&gt;
Nach dem Neustart der Arduino Software kann dann das passende ESP32 Board ausgewählt werden. In meinem Beispiel ist es ein DOIT V1 Board.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 04.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
==Spezielle Hinweise für den ESP32==&lt;br /&gt;
Bei der Programmierung des ESP32 gibt es ein paar Dinge zu beachten. Auf den Boards ist meist ein passender Spannungsregler für 3,3V und ein passender FTDI Chip aufgelötet. Somit entfällt eine weitere Schaltung zur Spannungsversorgung. Zudem wird das Board vom FTDI Chip durch die Arduino Software automatisch in den &amp;quot;Upload Modus&amp;quot; versetzt. Man muss also nicht wie beim ESP8266 bestimmte Taster drücken (Flash und Reset) um das Board in den &amp;quot;Upload Modus&amp;quot; zu bringen.&lt;br /&gt;
&lt;br /&gt;
Ich habe öfters die WifiManager Library für das WLAN verwendet. Auf Dauer hatte ich damit jedoch immer wieder Probleme, so das ich meine WLAN Daten mit Absicht &amp;quot;fest&amp;quot; in das Programm einbaue. Zudem ergibt sich beim WLAN noch ein Problem wenn auf einmal die WLAN Verbindung unterbrochen wird, z.B. wenn der Router neu gestartet wird. Danach verbindet sich der ESP32 nämlich nicht mehr automatisch mit dem WLAN. Um das zu verhindern habe ich folgende Funktion in den Code eingebaut. Die Funktion WifiEvent startet den ESP32 neu wenn keine Verbindung mehr zum WLAN besteht. Leider funktioniert jeder andere Weg im Moment nicht zuverlässig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
//Wifi WatchDog&lt;br /&gt;
WiFi.onEvent(WiFiEvent);&lt;br /&gt;
//Check if WiFi is here&lt;br /&gt;
//Automatically reconnect the ESP32 if the WiFi Router is not there...&lt;br /&gt;
if (WiFi.status() != WL_CONNECTED)&lt;br /&gt;
    {&lt;br /&gt;
      WiFi.onEvent(WiFiEvent);&lt;br /&gt;
      //WIFI_Connect();&lt;br /&gt;
    } else {&lt;br /&gt;
      //Do something&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Wifi Watchdog&lt;br /&gt;
void WiFiEvent(WiFiEvent_t event) {&lt;br /&gt;
  Serial.printf(&amp;quot;[WiFi-event] event: %d  - &amp;quot;, event);&lt;br /&gt;
  switch(event) {&lt;br /&gt;
  case SYSTEM_EVENT_STA_GOT_IP:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi connected&amp;quot;);&lt;br /&gt;
      Serial.print(&amp;quot;IP address: &amp;quot;); Serial.println(WiFi.localIP());&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_DISCONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi lost connection&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_START:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station start&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_CONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station connected to AP&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_LOST_IP:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 Lost IP&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kalibrierung==&lt;br /&gt;
Als nächstes müssen die Stromsensoren kalibriert werden. Dazu sollten folgende Variablen angepasst werden. Die Kalibrierung habe ich mit einer 100W Lampe und einem Wasserkocher 1800W durchgeführt. Eine genaue Stromzange oder eine Wattmeter sind sehr nützliche Hilfsmittel. In meinem Fall kann der SCT-013-030 als kleinste Einheit 100mA Strom erkennen. Die Sensoren haben 1800 Wicklungen und einen 62 Ohm Burden Widerstand.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;ICAL&#039;&#039;&#039;    = Kalibrierung&lt;br /&gt;
 &#039;&#039;&#039;inPinI1&#039;&#039;&#039; = ADC Pin&lt;br /&gt;
&lt;br /&gt;
 filteredI = &#039;&#039;&#039;0.9989&#039;&#039;&#039; * (lastFilteredI+sampleI-lastSampleI); //Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - &#039;&#039;&#039;0.06&#039;&#039;&#039;;//Offset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Setup variables&lt;br /&gt;
int numberOfSamples = 4000;&lt;br /&gt;
double ICAL = 1.08;&lt;br /&gt;
&lt;br /&gt;
//Set Voltage and current input pins&lt;br /&gt;
int inPinI1 = 34;&lt;br /&gt;
&lt;br /&gt;
// CT: Voltage depends on current, burden resistor, and turns&lt;br /&gt;
#define CT_BURDEN_RESISTOR    62&lt;br /&gt;
#define CT_TURNS              1800&lt;br /&gt;
#define VOLTAGE               225&lt;br /&gt;
&lt;br /&gt;
// Initial gueses for ratios, modified by VCAL/ICAL tweaks&lt;br /&gt;
double I_RATIO = (long double)CT_TURNS / CT_BURDEN_RESISTOR * 3.3 / 4096 * ICAL;&lt;br /&gt;
&lt;br /&gt;
//Filter variables 1&lt;br /&gt;
double lastFilteredI, filteredI;&lt;br /&gt;
double sqI,sumI;&lt;br /&gt;
//Sample variables&lt;br /&gt;
int lastSampleI,sampleI;&lt;br /&gt;
double Irms1;&lt;br /&gt;
unsigned long timer;&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
//**************************************************************************&lt;br /&gt;
//Phase1 &lt;br /&gt;
  for (int n=0; n&amp;lt;numberOfSamples; n++)&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastSampleI=sampleI;&lt;br /&gt;
   &lt;br /&gt;
   //Read in voltage and current samples.   &lt;br /&gt;
   sampleI = analogRead(inPinI1);&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastFilteredI = filteredI;&lt;br /&gt;
  &lt;br /&gt;
   //Digital high pass filters to remove 1.6V DC offset.&lt;br /&gt;
   filteredI = 0.9989 * (lastFilteredI+sampleI-lastSampleI);&lt;br /&gt;
   &lt;br /&gt;
   //Root-mean-square method current&lt;br /&gt;
   //1) square current values&lt;br /&gt;
   sqI = filteredI * filteredI;&lt;br /&gt;
   //2) sum &lt;br /&gt;
   sumI += sqI;&lt;br /&gt;
   delay(0.0002);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Calculation of the root of the mean of the voltage and current squared (rms)&lt;br /&gt;
//Calibration coeficients applied. &lt;br /&gt;
Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - 0.06;&lt;br /&gt;
if (Irms1 &amp;lt; 0){ Irms1 = 0; }; //Set negative Current to zero&lt;br /&gt;
sumI = 0;&lt;br /&gt;
&lt;br /&gt;
Serial.println(&amp;quot;Irms1:&amp;quot;+String(Irms1));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor&amp;diff=226</id>
		<title>Open Energy Monitor</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor&amp;diff=226"/>
		<updated>2018-02-04T18:47:39Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Achtung: Es gibt inzwischen eine neue Version des Open Energy Monitors mit dem ESP32 und WLAN: [[Open Energy Monitor mit dem ESP32]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Einleitung=&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird beschrieben wie mit Hilfe eines Arduinos und des Ethernet Shields der Energieverbrauch auf einer Internet Seite abgebildet werden kann. Das Ziel ist das der Energie Verbrauch einer ganzen Wohnung oder eines Hauses übersichtlich auf einer Website dargestellt wird. Mehr Fotos sind in meinem Picasa Album zu finden: https://picasaweb.google.com/112556810584672853030/OpenEnergyMonitor?authuser=0&amp;amp;feat=directlink&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folgende Bauteile werden benötigt:&#039;&#039;&#039;&lt;br /&gt;
 -Arduino UNO Duemilanove oder kompatibel&lt;br /&gt;
 -Ethernet Shield oder ein anderes kompatibles Shield&lt;br /&gt;
 -Strom Sensor SCT-013-30 (30A) oder SCT-013-100 (100A) siehe: http://openenergymonitor.org/emon/node/156&lt;br /&gt;
 -2x 10kOhm Widerstände 1/4W&lt;br /&gt;
 -1 Elko 47 uF&lt;br /&gt;
 -Universalplatine&lt;br /&gt;
 -evtl. USB Netzteil oder anderes Netzteil für die Spannungsversorgung&lt;br /&gt;
 -Pfosten Stecker Rastermaß: 2.54mm&lt;br /&gt;
 -3,5 mm Audio Anschluss&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:emon2.png|Open Energie Monitor]]&lt;br /&gt;
&lt;br /&gt;
==Elektrotechnische Grundlagen==&lt;br /&gt;
Elektrische Leistung wird in Watt gemessen.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;P = U x I&#039;&#039;&#039;&lt;br /&gt;
 z.B. P = 230V x 0,5A = 115W&lt;br /&gt;
&lt;br /&gt;
In Abhnängikeit mit der Zeit ergeben sich Kilowatt Stunden. Braucht ein Verbraucher z.B. 1000 Watt und ist er eine Stunde in Betrieb, dann wird eine Kilowatt Stunde Energie benötigt.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;1 kWh = 1000W x 1 h&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es wird also Spannung und Strom benötigt um die elektrische Energie zu messen. Da in Deutschland die Spannung nur um +-2V pendelt war es für mich nicht notwendig die Spannung zu messen. Somit beschränkt sich diese Anleitung lediglich auf eine Strom Messung. Der Strom wird dann einfach mit 230 multipliziert. Somit erspart man sich viel Arbeit und Kabel gewirr.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Arten Strom und Spannung zu messen. In handelsüblichen Energie Messgeräten wird meistens eine Strom Messung über einen Shunt Widerstand und einen Operationsverstärker vorgenommen. Das ist relativ günstig und genau (siehe: http://en.wikipedia.org/wiki/Shunt_%28electrical%29). Um größere Ströme zu messen nimmt man häufig induktive Strom Sensoren. Diese werden einfach um das stromführende Kabel &amp;quot;geclipst&amp;quot; und erzeugen je nach Stromfluss eine bestimmte Spannung oder einen bestimmten Strom. Der Vorteil hierbei ist das sich durch die Induktion eine sichere Trennung vor der gefährlichen Netzspannung ergibt. &lt;br /&gt;
Zudem ist diese Methode auch gut für Mietwohnungen geeignet, weil die Elektroinstallation nicht geändert werden muss. In manchen kleinen Wohnungen wird nur eine Phase verwendet. Somit wird nur ein Sensor für die Strom Messung verwendet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Achtung: Auf den Leitungen liegt auch dann Netzspannung wenn die Sicherungen abgeschaltet sind!!!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Datei:emon3.jpg|Open Energie Monitor]]&lt;br /&gt;
&lt;br /&gt;
=Converter Board=&lt;br /&gt;
Das Converter Board muss die Spannung oder den Strom (hängt vom Sensor ab, siehe: http://openenergymonitor.org/emon/node/156) in eine Spannung zwischen 0-5V DC umwandeln. Es wird ein Spannungsteiler aufgebaut, der 2,5V für den Sensor erzeugt. Mit dem entsprechendem Arduino Sketch können die Werte dann an dem Analog 0 Port ausgelesen werden. Den Aufbau der Schaltung findet man auf den Webseiten des Open Energie Monitors: http://openenergymonitor.org/emon/node/54&lt;br /&gt;
&lt;br /&gt;
[[Datei:emon4.jpg|Open Energie Monitor]]&lt;br /&gt;
[[Datei:emon5.jpg|Open Energie Monitor]]&lt;br /&gt;
&lt;br /&gt;
Die ganze Schaltung passt ohne Probleme in eine 7x7cm Abzweigdose.&lt;br /&gt;
&lt;br /&gt;
[[Datei:emon12.jpg|Open Energie Monitor]]&lt;br /&gt;
&lt;br /&gt;
=Arduino Sketch=&lt;br /&gt;
Es empfiehlt sich die Schaltung zuerst über USB zu testen, bevor man sich an die Kommunikation mit dem Ethernet Shield vertraut macht. Die Parameter müssen individuell mit einer &amp;quot;genormten Last&amp;quot; z.B. einem Wasserkocher etc. eingestellt werden. Ein Energie Messgerät sollte natürlich auch vorhanden sein. &lt;br /&gt;
&lt;br /&gt;
Hier ist mein Arduino Sketch mit den Parametern für den 30A Strom Sensor:&lt;br /&gt;
 [[Media:USBemon.zip|Download Arduino Sketch: USB emon]]&lt;br /&gt;
&lt;br /&gt;
==Kalibrierung==&lt;br /&gt;
Ich habe für die Kalibrierung eine umgebaute Steckdosenleiste hergenommen. Dabei muss die Phase aus dem Gehäuse geführt werden. Wenn man den Sensor um das komplette Kabel montiert kann nichts gemessen werden. Das liegt daran das die Ströme sich gegenseitig aufheben. Natürlich ergibt sich in dieser Anordnung ein kleiner Messfehler, weil das Energiekosten Messgerät auch Strom verbraucht. Dieser Fehler ist jedoch sehr gering.&lt;br /&gt;
&lt;br /&gt;
[[Datei:emon6.jpg|Open Energie Monitor]]&lt;br /&gt;
&lt;br /&gt;
Um die Daten zu visualisieren habe ich die Werte einfach in eine Open Office Calc Tabelle kopiert und ein Diagramm erstellt. Nach dem Import mussten lediglich noch die Punkte in Kommas umgewandelt werden. Also z.B.&lt;br /&gt;
 245.6&lt;br /&gt;
 245,6&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:emon7.png|Samsung Fernseher&lt;br /&gt;
Datei:emon8.png|Wasserkocher und Herdplatten&lt;br /&gt;
Datei:emon9.png|Energiesparlampe 18W&lt;br /&gt;
Datei:emon14.png|Stromverbrauch an einem Samstag Abend.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ethernet Shield und emon==&lt;br /&gt;
Wenn die Mess Ergebnisse korrekt sind, kann das Ethernet Shield eingebunden werden. Das Sketch besteht aus den Programmen emon und dem Beispiel &amp;quot;Weblient&amp;quot; aus der Ethernet Library. Damit die Daten korrekt und sicher auf den Webserver übermittelt werden können ist es notwendig die API Keys aus dem emoncms Webinterface auszulesen. Die Keys finden sich hier:&lt;br /&gt;
&lt;br /&gt;
 [[Datei:emon11.jpg|Open Energie Monitor]]&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle im Arduino Sketch wird der API Key eingetragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
client.print(&amp;quot;GET /emon/api/post?apikey=9888888888888888888&amp;amp;json={power:&amp;quot;);&lt;br /&gt;
client.print(watt);&lt;br /&gt;
client.print(&amp;quot;,temperature:25.0}&amp;quot;);&lt;br /&gt;
client.println();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die lokale IP Adresse und die IP Adresse des Servers muss natürlich auch noch an die eigene Umgebung angepasst werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };&lt;br /&gt;
byte ip[] = { 192,168,1,152 };&lt;br /&gt;
byte server[] = { 111,111,101,111}; // Enter your IP&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [[Media:EthernetAndPowerInet.zip|Download Arduino Sketch: emon and Ethernet]]&lt;br /&gt;
&lt;br /&gt;
Es können so auch mehrere Werte an emoncms übergeben werden. Z.B. Strom, Spannung und Temperatur.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
In den folgende Schritten soll die Kommunikation mit der MYSQL Datenbank geprpüft werden. Als erstes wird geprüft ob das Shield im lokalen Netz erreichbar ist:&lt;br /&gt;
&lt;br /&gt;
 ping 192.168.1.152&lt;br /&gt;
&lt;br /&gt;
Danach muss die Apache Log Datei auf dem Server geprüft werden. Dies kann bei einem Linux Server am besten mit folgendem Befehl geschehen:&lt;br /&gt;
&lt;br /&gt;
 tail -f /var/log/apache2/access.log&lt;br /&gt;
&lt;br /&gt;
Um das ganze bunter und übersichtlicher zu gestalten kann man das ganze noch mit ccze &amp;quot;einfärben&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 apt-get install ccze&lt;br /&gt;
 tail -f /var/log/apache2/access.log | &#039;&#039;&#039;ccze&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bei einer erfolgreichen Verbindung stehen folgende Einträge in der Log Datei:&lt;br /&gt;
&lt;br /&gt;
 [[Datei:emon10.png|Open Energie Monitor]]&lt;br /&gt;
&lt;br /&gt;
=Software auf dem Server=&lt;br /&gt;
&lt;br /&gt;
Download der *.zip Archive:&lt;br /&gt;
&lt;br /&gt;
 https://github.com/openenergymonitor/emoncms3&lt;br /&gt;
&lt;br /&gt;
Entpacken auf dem Server:&lt;br /&gt;
&lt;br /&gt;
 cd /var/www/emon&lt;br /&gt;
 wget https://github.com/openenergymonitor/emoncms3/tarball/master&lt;br /&gt;
 mv master openenergymonitor-emoncms3-3a1eb8b.tar&lt;br /&gt;
 unp openenergymonitor-emoncms3-3a1eb8b.tar&lt;br /&gt;
 mv openenergymonitor-emoncms3 emon&lt;br /&gt;
&lt;br /&gt;
Die Visualisierung der Daten übernimmt das PHP Script emoncms. Damit das Script auf dem Apache2 Webserver läuft muss die Option AllowOverride All gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
 vim /etc/apache2/sites-enabled/000-default&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Directory /var/www/nossl/wiki&amp;gt;&lt;br /&gt;
                Options Indexes FollowSymLinks MultiViews&lt;br /&gt;
                &#039;&#039;&#039;AllowOverride None&#039;&#039;&#039;&lt;br /&gt;
                Order allow,deny&lt;br /&gt;
                allow from all&lt;br /&gt;
        &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muss geändert werden zu&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Directory /var/www/nossl/wiki&amp;gt;&lt;br /&gt;
                Options Indexes FollowSymLinks MultiViews&lt;br /&gt;
                &#039;&#039;&#039;AllowOverride All&#039;&#039;&#039;&lt;br /&gt;
                Order allow,deny&lt;br /&gt;
                allow from all&lt;br /&gt;
        &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach einem Neustart des Apache Webservers ist die Seite erreichbar:&lt;br /&gt;
 /etc/init.d/apache2 restart&lt;br /&gt;
&lt;br /&gt;
Danach muss eine Datenbank für emoncms in phpmyadmin angelegt werden. Es ist zu beachten das der Zugriff von jeder IP-Adresse möglich ist, damit der Arduino auch in die SQL Datenbank schreiben darf. Eine Anleitung zur Installation ist hier zu finden:&lt;br /&gt;
 http://openenergymonitor.org/emon/node/150&lt;br /&gt;
&lt;br /&gt;
==User Registrierung abschalten==&lt;br /&gt;
Um zu verhindern das sich fremde Leute in emoncms einloggen kann man den Button registrieren verstecken. Dazu muss folgende Datei verändert werden:&lt;br /&gt;
 vim /var/www/emon/Views/user/login_block.php&lt;br /&gt;
&lt;br /&gt;
Diese Zeile suchen:&lt;br /&gt;
 &amp;lt;input type=&amp;quot;submit&amp;quot; class=&amp;quot;button04&amp;quot; value=&amp;quot;Login&amp;quot; onclick=&amp;quot;javascript: form.action=&#039;&amp;lt;?php echo $GLOBALS[&#039;path&#039;]; ?&amp;gt;user/login&#039;;&amp;quot; /&amp;gt; or &lt;br /&gt;
 &amp;lt;input ype=&amp;quot;submit&amp;quot; class=&amp;quot;button04&amp;quot; value=&amp;quot;Register&amp;quot; onclick=&amp;quot;javascript: form.action=&#039;&amp;lt;?php echo $GLOBALS[&#039;path&#039;]; ?&amp;gt;user/create&#039;;&amp;quot; /&amp;gt;&lt;br /&gt;
und mit dieser Zeile ersetzen:&lt;br /&gt;
 &amp;lt;input type=&amp;quot;submit&amp;quot; class=&amp;quot;button04&amp;quot; value=&amp;quot;Login&amp;quot; onclick=&amp;quot;javascript: form.action=&#039;&amp;lt;?php echo $GLOBALS[&#039;path&#039;]; ?&amp;gt;user/login&#039;;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eigenes Dashboard erstellen==&lt;br /&gt;
&lt;br /&gt;
Das Dashboard kann sehr flexibel angepasst werden. Dabei werden die einzelnen Graphen einfach der Reihe nach in das Feld &amp;quot;Edit Dashboard&amp;quot; geschrieben. Wichtig ist das man immer den korrekten &#039;&#039;&#039;Api Key&#039;&#039;&#039; und die korrekte &#039;&#039;&#039;Feed ID&#039;&#039;&#039; einträgt.&lt;br /&gt;
&lt;br /&gt;
Also z.B:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;iframe style=&amp;quot;width:925px;height:300px;&amp;quot; marginheight=&amp;quot;0&amp;quot; src=&amp;quot;http://&#039;&#039;&#039;YOURDOMAIN&#039;&#039;&#039;/emon/Vis/rawdata.php?apikey=&#039;&#039;&#039;YOURAPIKEY&#039;&#039;&#039;&amp;amp;amp;&#039;&#039;&#039;feedid=4&#039;&#039;&#039;&amp;quot;  &lt;br /&gt;
 marginwidth=&amp;quot;0&amp;quot; frameborder=&amp;quot;0&amp;quot; scrolling=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel für eine schöne Übersicht auf Deutsch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=php&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;widget-container-nc&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;h2&amp;gt;Energie Explorer&amp;lt;/h2&amp;gt;&lt;br /&gt;
  &amp;lt;iframe style=&amp;quot;width:645px; height:470px;&amp;quot; marginheight=&amp;quot;0&amp;quot; marginwidth=&amp;quot;0&amp;quot; src=&amp;quot;http://YOURDOMAIN/emon/Vis/kWhdZoomer/kwhdzoomer.php?apikey=YOURAPIKEY&amp;amp;amp;kwhd=7&amp;amp;amp;power=4&amp;quot; frameborder=&amp;quot;0&amp;quot; scrolling=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;widget-container-v&amp;quot; style=&amp;quot;height:562px&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;widget&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Aktueller Energie Verbrauch&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;b&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;dial&amp;quot; feed=&amp;quot;power&amp;quot; max=&amp;quot;5000&amp;quot; units=&amp;quot;W&amp;quot; scale=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;b&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div class=&amp;quot;stats&amp;quot; style=&amp;quot;height:70px&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;b&amp;gt;Heutiger Energieverbrauch&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;value&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;kwhd&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; kWh&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div class=&amp;quot;widget&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;house-graph&amp;quot; class=&amp;quot;graph&amp;quot; feed=&amp;quot;power&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;      &lt;br /&gt;
&amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iframe style=&amp;quot;width:925px;height:300px;&amp;quot; marginheight=&amp;quot;0&amp;quot; src=&amp;quot;http://YOURDOMAIN/emon/Vis/rawdata.php?apikey=YOURAPIKEY&amp;amp;amp;feedid=4&amp;quot; marginwidth=&amp;quot;0&amp;quot; frameborder=&amp;quot;0&amp;quot; scrolling=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Sprache lässt sich einfach in den entsprechenden PHP Dateien ändern:&lt;br /&gt;
&lt;br /&gt;
 vim /emon/Vis/kWhdZoomer/view.js&lt;br /&gt;
 vim /emon/Vis/kWhdZoomer/kwhdzoomer.php&lt;br /&gt;
&lt;br /&gt;
Ergibt z.B. folgendes Dashboard:&lt;br /&gt;
&lt;br /&gt;
[[Datei:emon17.png|Open Energie Monitor]]&lt;br /&gt;
&lt;br /&gt;
Fertige Installation:&lt;br /&gt;
&lt;br /&gt;
[[Datei:emon15.jpg|300px|Open Energie Monitor]][[Datei:emon16.jpg|300px|Open Energie Monitor]]&lt;br /&gt;
&lt;br /&gt;
= Weblinks =&lt;br /&gt;
&lt;br /&gt;
* http://openenergymonitor.org/emon/emoncms Official Page&lt;br /&gt;
* http://vis.openenergymonitor.org Open Energie Monitor Version 3&lt;br /&gt;
* http://openenergymonitor.org/emon/node/156 Compare different CT sensors&lt;br /&gt;
* http://openenergymonitor.org/emon/node/319 EtherLib Configuration&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=225</id>
		<title>Open Energy Monitor mit dem ESP32</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=225"/>
		<updated>2018-02-04T18:43:58Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Kalibrierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Einleitung=&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird beschrieben wie mit Hilfe einer ESP32 Platine ein Strom Sensor für 3 Phasen Wechselstrom aufgebaut werden kann. Der Spannungsteiler aus den 10kOhm Widerständen erzeugt 1,6V für die SCT-013-030 Strom Sensoren. Die Stromsensoren werden mit den ADC Pin&#039;s des ESP32 verbunden. Natürlich sind die Messungen nicht sonderlich genau, da die Phasenverschiebung nicht berücksichtigt wird. Auch das wäre durch zusätzliche Transformatoren möglich die dann auf die ADC Pin&#039;s geführt werden. Da ich damit nur meinen ungefähren Stromverbrauch zuhause messen möchte ist die Schaltung völlig ausreichend.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folgende Bauteile werden benötigt:&#039;&#039;&#039;&lt;br /&gt;
 -Board: DOIT ESP32 DEVKIT V1 (ca. 10€)&lt;br /&gt;
 -Strom Sensor SCT-013-30 (30A) oder SCT-013-100 (100A) siehe: http://openenergymonitor.org/emon/node/156&lt;br /&gt;
 -6x 10kOhm Widerstände 1/4W&lt;br /&gt;
 -3x Elko 10 uF&lt;br /&gt;
 -Universalplatine&lt;br /&gt;
 -evtl. USB Netzteil oder anderes Netzteil für die Spannungsversorgung&lt;br /&gt;
 -Pfosten Stecker Rastermaß: 2.54mm&lt;br /&gt;
 -3 x 3,5 mm Audio Anschluss&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pinbelegung des DOIT ESP32 DEVKIT V1 Board:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 https://github.com/playelek/pinout-doit-32devkitv1&lt;br /&gt;
&lt;br /&gt;
=Grundlagen=&lt;br /&gt;
&lt;br /&gt;
Auf der Seite von Open Energy Monitor finden sich genügend Informationen über die Grundlagen der Leistungsberechnung. Das Prinzip lässt sich 1:1 vom Aufbau eines Arduinos übernehmen. Der ESP32 verkraftet jedoch maximal 3,3V am Analog Eingang.&lt;br /&gt;
&lt;br /&gt;
 https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino&lt;br /&gt;
&lt;br /&gt;
=Aufbau=&lt;br /&gt;
&lt;br /&gt;
Auf die Lochrasterplatine müssen nur wenige Bauteile. Die Teile lassen sich relativ einfach einlöten. Für den Aufbau werden nur wenige PIN&#039;s des ESP32 benötigt. Bei meinem Aufbau gibt es am obersten Sensor Anschluss noch einen zusätzlichen Burden Widerstand von 200 Ohm. Das liegt daran das der SCT-013-030 Sensor schon einige Jahre alt ist. Bei den neuen Sensoren sind keine Burden Widerstände nötig, da diese schon einen 62 Ohm Burden eingebaut haben.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 03.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 01.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
Ich verwende zum programmieren immer die Arduino Gui. Es sind zuerst einige Anpassungen nötig damit das DOIT ESP32 Board von der Arduino Software erkannt wird. Hierzu muss diese Anleitung umgesetzt werden:&lt;br /&gt;
&lt;br /&gt;
 https://github.com/espressif/arduino-esp32&lt;br /&gt;
&lt;br /&gt;
Nach dem Neustart der Arduino Software kann dann das passende ESP32 Board ausgewählt werden. In meinem Beispiel ist es ein DOIT V1 Board.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 04.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
==Spezielle Hinweise für den ESP32==&lt;br /&gt;
Bei der Programmierung des ESP32 gibt es ein paar Dinge zu beachten. Auf den Boards ist meist ein passender Spannungsregler für 3,3V und ein passender FTDI Chip aufgelötet. Somit entfällt eine weitere Schaltung zur Spannungsversorgung. Zudem wird das Board vom FTDI Chip durch die Arduino Software automatisch in den &amp;quot;Upload Modus&amp;quot; versetzt. Man muss also nicht wie beim ESP8266 bestimmte Taster drücken (Flash und Reset) um das Board in den &amp;quot;Upload Modus&amp;quot; zu bringen.&lt;br /&gt;
&lt;br /&gt;
Ich habe öfters die WifiManager Library für das WLAN verwendet. Auf Dauer hatte ich damit jedoch immer wieder Probleme, so das ich meine WLAN Daten mit Absicht &amp;quot;fest&amp;quot; in das Programm einbaue. Zudem ergibt sich beim WLAN noch ein Problem wenn auf einmal die WLAN Verbindung unterbrochen wird, z.B. wenn der Router neu gestartet wird. Danach verbindet sich der ESP32 nämlich nicht mehr automatisch mit dem WLAN. Um das zu verhindern habe ich folgende Funktion in den Code eingebaut:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
//Wifi WatchDog&lt;br /&gt;
WiFi.onEvent(WiFiEvent);&lt;br /&gt;
//Check if WiFi is here&lt;br /&gt;
//Automatically reconnect the ESP32 if the WiFi Router is not there...&lt;br /&gt;
if (WiFi.status() != WL_CONNECTED)&lt;br /&gt;
    {&lt;br /&gt;
      WiFi.onEvent(WiFiEvent);&lt;br /&gt;
      //WIFI_Connect();&lt;br /&gt;
    } else {&lt;br /&gt;
      //Do something&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Wifi Watchdog&lt;br /&gt;
void WiFiEvent(WiFiEvent_t event) {&lt;br /&gt;
  Serial.printf(&amp;quot;[WiFi-event] event: %d  - &amp;quot;, event);&lt;br /&gt;
  switch(event) {&lt;br /&gt;
  case SYSTEM_EVENT_STA_GOT_IP:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi connected&amp;quot;);&lt;br /&gt;
      Serial.print(&amp;quot;IP address: &amp;quot;); Serial.println(WiFi.localIP());&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_DISCONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi lost connection&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_START:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station start&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_CONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station connected to AP&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_LOST_IP:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 Lost IP&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kalibrierung==&lt;br /&gt;
Als nächstes müssen die Stromsensoren kalibriert werden. Dazu sollten folgende Variablen angepasst werden. Die Kalibrierung habe ich mit einer 100W Lampe und einem Wasserkocher 1800W durchgeführt. Eine genaue Stromzange oder eine Wattmeter sind sehr nützliche Hilfsmittel. In meinem Fall kann der SCT-013-030 als kleinste Einheit 100mA Strom erkennen. Die Sensoren haben 1800 Wicklungen und einen 62 Ohm Burden Widerstand.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;ICAL&#039;&#039;&#039;    = Kalibrierung&lt;br /&gt;
 &#039;&#039;&#039;inPinI1&#039;&#039;&#039; = ADC Pin&lt;br /&gt;
&lt;br /&gt;
 filteredI = &#039;&#039;&#039;0.9989&#039;&#039;&#039; * (lastFilteredI+sampleI-lastSampleI); //Kalibrierung&lt;br /&gt;
&lt;br /&gt;
 Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - &#039;&#039;&#039;0.06&#039;&#039;&#039;;//Offset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Setup variables&lt;br /&gt;
int numberOfSamples = 4000;&lt;br /&gt;
double ICAL = 1.08;&lt;br /&gt;
&lt;br /&gt;
//Set Voltage and current input pins&lt;br /&gt;
int inPinI1 = 34;&lt;br /&gt;
&lt;br /&gt;
// CT: Voltage depends on current, burden resistor, and turns&lt;br /&gt;
#define CT_BURDEN_RESISTOR    62&lt;br /&gt;
#define CT_TURNS              1800&lt;br /&gt;
#define VOLTAGE               225&lt;br /&gt;
&lt;br /&gt;
// Initial gueses for ratios, modified by VCAL/ICAL tweaks&lt;br /&gt;
double I_RATIO = (long double)CT_TURNS / CT_BURDEN_RESISTOR * 3.3 / 4096 * ICAL;&lt;br /&gt;
&lt;br /&gt;
//Filter variables 1&lt;br /&gt;
double lastFilteredI, filteredI;&lt;br /&gt;
double sqI,sumI;&lt;br /&gt;
//Sample variables&lt;br /&gt;
int lastSampleI,sampleI;&lt;br /&gt;
double Irms1;&lt;br /&gt;
unsigned long timer;&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
//**************************************************************************&lt;br /&gt;
//Phase1 &lt;br /&gt;
  for (int n=0; n&amp;lt;numberOfSamples; n++)&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastSampleI=sampleI;&lt;br /&gt;
   &lt;br /&gt;
   //Read in voltage and current samples.   &lt;br /&gt;
   sampleI = analogRead(inPinI1);&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastFilteredI = filteredI;&lt;br /&gt;
  &lt;br /&gt;
   //Digital high pass filters to remove 1.6V DC offset.&lt;br /&gt;
   filteredI = 0.9989 * (lastFilteredI+sampleI-lastSampleI);&lt;br /&gt;
   &lt;br /&gt;
   //Root-mean-square method current&lt;br /&gt;
   //1) square current values&lt;br /&gt;
   sqI = filteredI * filteredI;&lt;br /&gt;
   //2) sum &lt;br /&gt;
   sumI += sqI;&lt;br /&gt;
   delay(0.0002);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Calculation of the root of the mean of the voltage and current squared (rms)&lt;br /&gt;
//Calibration coeficients applied. &lt;br /&gt;
Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - 0.06;&lt;br /&gt;
if (Irms1 &amp;lt; 0){ Irms1 = 0; }; //Set negative Current to zero&lt;br /&gt;
sumI = 0;&lt;br /&gt;
&lt;br /&gt;
Serial.println(&amp;quot;Irms1:&amp;quot;+String(Irms1));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=224</id>
		<title>Open Energy Monitor mit dem ESP32</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=224"/>
		<updated>2018-02-04T18:42:33Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Kalibrierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Einleitung=&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird beschrieben wie mit Hilfe einer ESP32 Platine ein Strom Sensor für 3 Phasen Wechselstrom aufgebaut werden kann. Der Spannungsteiler aus den 10kOhm Widerständen erzeugt 1,6V für die SCT-013-030 Strom Sensoren. Die Stromsensoren werden mit den ADC Pin&#039;s des ESP32 verbunden. Natürlich sind die Messungen nicht sonderlich genau, da die Phasenverschiebung nicht berücksichtigt wird. Auch das wäre durch zusätzliche Transformatoren möglich die dann auf die ADC Pin&#039;s geführt werden. Da ich damit nur meinen ungefähren Stromverbrauch zuhause messen möchte ist die Schaltung völlig ausreichend.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folgende Bauteile werden benötigt:&#039;&#039;&#039;&lt;br /&gt;
 -Board: DOIT ESP32 DEVKIT V1 (ca. 10€)&lt;br /&gt;
 -Strom Sensor SCT-013-30 (30A) oder SCT-013-100 (100A) siehe: http://openenergymonitor.org/emon/node/156&lt;br /&gt;
 -6x 10kOhm Widerstände 1/4W&lt;br /&gt;
 -3x Elko 10 uF&lt;br /&gt;
 -Universalplatine&lt;br /&gt;
 -evtl. USB Netzteil oder anderes Netzteil für die Spannungsversorgung&lt;br /&gt;
 -Pfosten Stecker Rastermaß: 2.54mm&lt;br /&gt;
 -3 x 3,5 mm Audio Anschluss&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pinbelegung des DOIT ESP32 DEVKIT V1 Board:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 https://github.com/playelek/pinout-doit-32devkitv1&lt;br /&gt;
&lt;br /&gt;
=Grundlagen=&lt;br /&gt;
&lt;br /&gt;
Auf der Seite von Open Energy Monitor finden sich genügend Informationen über die Grundlagen der Leistungsberechnung. Das Prinzip lässt sich 1:1 vom Aufbau eines Arduinos übernehmen. Der ESP32 verkraftet jedoch maximal 3,3V am Analog Eingang.&lt;br /&gt;
&lt;br /&gt;
 https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino&lt;br /&gt;
&lt;br /&gt;
=Aufbau=&lt;br /&gt;
&lt;br /&gt;
Auf die Lochrasterplatine müssen nur wenige Bauteile. Die Teile lassen sich relativ einfach einlöten. Für den Aufbau werden nur wenige PIN&#039;s des ESP32 benötigt. Bei meinem Aufbau gibt es am obersten Sensor Anschluss noch einen zusätzlichen Burden Widerstand von 200 Ohm. Das liegt daran das der SCT-013-030 Sensor schon einige Jahre alt ist. Bei den neuen Sensoren sind keine Burden Widerstände nötig, da diese schon einen 62 Ohm Burden eingebaut haben.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 03.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 01.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
Ich verwende zum programmieren immer die Arduino Gui. Es sind zuerst einige Anpassungen nötig damit das DOIT ESP32 Board von der Arduino Software erkannt wird. Hierzu muss diese Anleitung umgesetzt werden:&lt;br /&gt;
&lt;br /&gt;
 https://github.com/espressif/arduino-esp32&lt;br /&gt;
&lt;br /&gt;
Nach dem Neustart der Arduino Software kann dann das passende ESP32 Board ausgewählt werden. In meinem Beispiel ist es ein DOIT V1 Board.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 04.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
==Spezielle Hinweise für den ESP32==&lt;br /&gt;
Bei der Programmierung des ESP32 gibt es ein paar Dinge zu beachten. Auf den Boards ist meist ein passender Spannungsregler für 3,3V und ein passender FTDI Chip aufgelötet. Somit entfällt eine weitere Schaltung zur Spannungsversorgung. Zudem wird das Board vom FTDI Chip durch die Arduino Software automatisch in den &amp;quot;Upload Modus&amp;quot; versetzt. Man muss also nicht wie beim ESP8266 bestimmte Taster drücken (Flash und Reset) um das Board in den &amp;quot;Upload Modus&amp;quot; zu bringen.&lt;br /&gt;
&lt;br /&gt;
Ich habe öfters die WifiManager Library für das WLAN verwendet. Auf Dauer hatte ich damit jedoch immer wieder Probleme, so das ich meine WLAN Daten mit Absicht &amp;quot;fest&amp;quot; in das Programm einbaue. Zudem ergibt sich beim WLAN noch ein Problem wenn auf einmal die WLAN Verbindung unterbrochen wird, z.B. wenn der Router neu gestartet wird. Danach verbindet sich der ESP32 nämlich nicht mehr automatisch mit dem WLAN. Um das zu verhindern habe ich folgende Funktion in den Code eingebaut:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
//Wifi WatchDog&lt;br /&gt;
WiFi.onEvent(WiFiEvent);&lt;br /&gt;
//Check if WiFi is here&lt;br /&gt;
//Automatically reconnect the ESP32 if the WiFi Router is not there...&lt;br /&gt;
if (WiFi.status() != WL_CONNECTED)&lt;br /&gt;
    {&lt;br /&gt;
      WiFi.onEvent(WiFiEvent);&lt;br /&gt;
      //WIFI_Connect();&lt;br /&gt;
    } else {&lt;br /&gt;
      //Do something&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Wifi Watchdog&lt;br /&gt;
void WiFiEvent(WiFiEvent_t event) {&lt;br /&gt;
  Serial.printf(&amp;quot;[WiFi-event] event: %d  - &amp;quot;, event);&lt;br /&gt;
  switch(event) {&lt;br /&gt;
  case SYSTEM_EVENT_STA_GOT_IP:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi connected&amp;quot;);&lt;br /&gt;
      Serial.print(&amp;quot;IP address: &amp;quot;); Serial.println(WiFi.localIP());&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_DISCONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi lost connection&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_START:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station start&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_CONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station connected to AP&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_LOST_IP:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 Lost IP&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kalibrierung==&lt;br /&gt;
Als nächstes müssen die Stromsensoren kalibriert werden. Dazu sollten folgende Variablen angepasst werden. Die Kalibrierung habe ich mit einer 100W Lampe und einem Wasserkocher 1800W durchgeführt. Eine genaue Stromzange oder eine Wattmeter sind sehr nützliche Hilfsmittel. In meinem Fall kann der SCT-013-030 als kleinste Einheit 100mA Strom erkennen. Die Sensoren haben 1800 Wicklungen und einen 62 Ohm Burden Widerstand.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;ICAL&#039;&#039;&#039;    = Kalibrierung&lt;br /&gt;
 &#039;&#039;&#039;inPinI1&#039;&#039;&#039; = ADC Pin&lt;br /&gt;
&lt;br /&gt;
 filteredI = &#039;&#039;&#039;0.9989&#039;&#039;&#039; * (lastFilteredI+sampleI-lastSampleI); //Kalibrierung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Setup variables&lt;br /&gt;
int numberOfSamples = 4000;&lt;br /&gt;
double ICAL = 1.08;&lt;br /&gt;
&lt;br /&gt;
//Set Voltage and current input pins&lt;br /&gt;
int inPinI1 = 34;&lt;br /&gt;
&lt;br /&gt;
// CT: Voltage depends on current, burden resistor, and turns&lt;br /&gt;
#define CT_BURDEN_RESISTOR    62&lt;br /&gt;
#define CT_TURNS              1800&lt;br /&gt;
#define VOLTAGE               225&lt;br /&gt;
&lt;br /&gt;
// Initial gueses for ratios, modified by VCAL/ICAL tweaks&lt;br /&gt;
double I_RATIO = (long double)CT_TURNS / CT_BURDEN_RESISTOR * 3.3 / 4096 * ICAL;&lt;br /&gt;
&lt;br /&gt;
//Filter variables 1&lt;br /&gt;
double lastFilteredI, filteredI;&lt;br /&gt;
double sqI,sumI;&lt;br /&gt;
//Sample variables&lt;br /&gt;
int lastSampleI,sampleI;&lt;br /&gt;
double Irms1;&lt;br /&gt;
unsigned long timer;&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
//**************************************************************************&lt;br /&gt;
//Phase1 &lt;br /&gt;
  for (int n=0; n&amp;lt;numberOfSamples; n++)&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastSampleI=sampleI;&lt;br /&gt;
   &lt;br /&gt;
   //Read in voltage and current samples.   &lt;br /&gt;
   sampleI = analogRead(inPinI1);&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastFilteredI = filteredI;&lt;br /&gt;
  &lt;br /&gt;
   //Digital high pass filters to remove 1.6V DC offset.&lt;br /&gt;
   filteredI = 0.9989 * (lastFilteredI+sampleI-lastSampleI);&lt;br /&gt;
   &lt;br /&gt;
   //Root-mean-square method current&lt;br /&gt;
   //1) square current values&lt;br /&gt;
   sqI = filteredI * filteredI;&lt;br /&gt;
   //2) sum &lt;br /&gt;
   sumI += sqI;&lt;br /&gt;
   delay(0.0002);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Calculation of the root of the mean of the voltage and current squared (rms)&lt;br /&gt;
//Calibration coeficients applied. &lt;br /&gt;
Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - 0.06;&lt;br /&gt;
if (Irms1 &amp;lt; 0){ Irms1 = 0; }; //Set negative Current to zero&lt;br /&gt;
sumI = 0;&lt;br /&gt;
&lt;br /&gt;
Serial.println(&amp;quot;Irms1:&amp;quot;+String(Irms1));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=223</id>
		<title>Open Energy Monitor mit dem ESP32</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=223"/>
		<updated>2018-02-04T18:41:24Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Einleitung=&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird beschrieben wie mit Hilfe einer ESP32 Platine ein Strom Sensor für 3 Phasen Wechselstrom aufgebaut werden kann. Der Spannungsteiler aus den 10kOhm Widerständen erzeugt 1,6V für die SCT-013-030 Strom Sensoren. Die Stromsensoren werden mit den ADC Pin&#039;s des ESP32 verbunden. Natürlich sind die Messungen nicht sonderlich genau, da die Phasenverschiebung nicht berücksichtigt wird. Auch das wäre durch zusätzliche Transformatoren möglich die dann auf die ADC Pin&#039;s geführt werden. Da ich damit nur meinen ungefähren Stromverbrauch zuhause messen möchte ist die Schaltung völlig ausreichend.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folgende Bauteile werden benötigt:&#039;&#039;&#039;&lt;br /&gt;
 -Board: DOIT ESP32 DEVKIT V1 (ca. 10€)&lt;br /&gt;
 -Strom Sensor SCT-013-30 (30A) oder SCT-013-100 (100A) siehe: http://openenergymonitor.org/emon/node/156&lt;br /&gt;
 -6x 10kOhm Widerstände 1/4W&lt;br /&gt;
 -3x Elko 10 uF&lt;br /&gt;
 -Universalplatine&lt;br /&gt;
 -evtl. USB Netzteil oder anderes Netzteil für die Spannungsversorgung&lt;br /&gt;
 -Pfosten Stecker Rastermaß: 2.54mm&lt;br /&gt;
 -3 x 3,5 mm Audio Anschluss&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pinbelegung des DOIT ESP32 DEVKIT V1 Board:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 https://github.com/playelek/pinout-doit-32devkitv1&lt;br /&gt;
&lt;br /&gt;
=Grundlagen=&lt;br /&gt;
&lt;br /&gt;
Auf der Seite von Open Energy Monitor finden sich genügend Informationen über die Grundlagen der Leistungsberechnung. Das Prinzip lässt sich 1:1 vom Aufbau eines Arduinos übernehmen. Der ESP32 verkraftet jedoch maximal 3,3V am Analog Eingang.&lt;br /&gt;
&lt;br /&gt;
 https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino&lt;br /&gt;
&lt;br /&gt;
=Aufbau=&lt;br /&gt;
&lt;br /&gt;
Auf die Lochrasterplatine müssen nur wenige Bauteile. Die Teile lassen sich relativ einfach einlöten. Für den Aufbau werden nur wenige PIN&#039;s des ESP32 benötigt. Bei meinem Aufbau gibt es am obersten Sensor Anschluss noch einen zusätzlichen Burden Widerstand von 200 Ohm. Das liegt daran das der SCT-013-030 Sensor schon einige Jahre alt ist. Bei den neuen Sensoren sind keine Burden Widerstände nötig, da diese schon einen 62 Ohm Burden eingebaut haben.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 03.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 01.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
Ich verwende zum programmieren immer die Arduino Gui. Es sind zuerst einige Anpassungen nötig damit das DOIT ESP32 Board von der Arduino Software erkannt wird. Hierzu muss diese Anleitung umgesetzt werden:&lt;br /&gt;
&lt;br /&gt;
 https://github.com/espressif/arduino-esp32&lt;br /&gt;
&lt;br /&gt;
Nach dem Neustart der Arduino Software kann dann das passende ESP32 Board ausgewählt werden. In meinem Beispiel ist es ein DOIT V1 Board.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 04.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
==Spezielle Hinweise für den ESP32==&lt;br /&gt;
Bei der Programmierung des ESP32 gibt es ein paar Dinge zu beachten. Auf den Boards ist meist ein passender Spannungsregler für 3,3V und ein passender FTDI Chip aufgelötet. Somit entfällt eine weitere Schaltung zur Spannungsversorgung. Zudem wird das Board vom FTDI Chip durch die Arduino Software automatisch in den &amp;quot;Upload Modus&amp;quot; versetzt. Man muss also nicht wie beim ESP8266 bestimmte Taster drücken (Flash und Reset) um das Board in den &amp;quot;Upload Modus&amp;quot; zu bringen.&lt;br /&gt;
&lt;br /&gt;
Ich habe öfters die WifiManager Library für das WLAN verwendet. Auf Dauer hatte ich damit jedoch immer wieder Probleme, so das ich meine WLAN Daten mit Absicht &amp;quot;fest&amp;quot; in das Programm einbaue. Zudem ergibt sich beim WLAN noch ein Problem wenn auf einmal die WLAN Verbindung unterbrochen wird, z.B. wenn der Router neu gestartet wird. Danach verbindet sich der ESP32 nämlich nicht mehr automatisch mit dem WLAN. Um das zu verhindern habe ich folgende Funktion in den Code eingebaut:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
//Wifi WatchDog&lt;br /&gt;
WiFi.onEvent(WiFiEvent);&lt;br /&gt;
//Check if WiFi is here&lt;br /&gt;
//Automatically reconnect the ESP32 if the WiFi Router is not there...&lt;br /&gt;
if (WiFi.status() != WL_CONNECTED)&lt;br /&gt;
    {&lt;br /&gt;
      WiFi.onEvent(WiFiEvent);&lt;br /&gt;
      //WIFI_Connect();&lt;br /&gt;
    } else {&lt;br /&gt;
      //Do something&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Wifi Watchdog&lt;br /&gt;
void WiFiEvent(WiFiEvent_t event) {&lt;br /&gt;
  Serial.printf(&amp;quot;[WiFi-event] event: %d  - &amp;quot;, event);&lt;br /&gt;
  switch(event) {&lt;br /&gt;
  case SYSTEM_EVENT_STA_GOT_IP:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi connected&amp;quot;);&lt;br /&gt;
      Serial.print(&amp;quot;IP address: &amp;quot;); Serial.println(WiFi.localIP());&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_DISCONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi lost connection&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_START:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station start&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_CONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station connected to AP&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_LOST_IP:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 Lost IP&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kalibrierung==&lt;br /&gt;
Als nächstes müssen die Stromsensoren kalibriert werden. Dazu sollten folgende Variablen angepasst werden. Die Kalibrierung habe ich mit einer 100W Lampe und einem Wasserkocher 1800W durchgeführt. Eine genaue Stromzange oder eine Wattmeter sind sehr nützliche Hilfsmittel. In meinem Fall kann der SCT-013-030 als kleinste Einheit 100mA Strom erkennen. Die Sensoren haben 1800 Wicklungen und einen 62Ohm Burden Widerstand.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;ICAL&#039;&#039;&#039;    = Kalibrierung&lt;br /&gt;
 &#039;&#039;&#039;inPinI1&#039;&#039;&#039; = ADC Pin&lt;br /&gt;
&lt;br /&gt;
 filteredI = &#039;&#039;&#039;0.9989&#039;&#039;&#039; * (lastFilteredI+sampleI-lastSampleI); //Kalibrierung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Setup variables&lt;br /&gt;
int numberOfSamples = 4000;&lt;br /&gt;
double ICAL = 1.08;&lt;br /&gt;
&lt;br /&gt;
//Set Voltage and current input pins&lt;br /&gt;
int inPinI1 = 34;&lt;br /&gt;
&lt;br /&gt;
// CT: Voltage depends on current, burden resistor, and turns&lt;br /&gt;
#define CT_BURDEN_RESISTOR    62&lt;br /&gt;
#define CT_TURNS              1800&lt;br /&gt;
#define VOLTAGE               225&lt;br /&gt;
&lt;br /&gt;
// Initial gueses for ratios, modified by VCAL/ICAL tweaks&lt;br /&gt;
double I_RATIO = (long double)CT_TURNS / CT_BURDEN_RESISTOR * 3.3 / 4096 * ICAL;&lt;br /&gt;
&lt;br /&gt;
//Filter variables 1&lt;br /&gt;
double lastFilteredI, filteredI;&lt;br /&gt;
double sqI,sumI;&lt;br /&gt;
//Sample variables&lt;br /&gt;
int lastSampleI,sampleI;&lt;br /&gt;
double Irms1;&lt;br /&gt;
unsigned long timer;&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
//**************************************************************************&lt;br /&gt;
//Phase1 &lt;br /&gt;
  for (int n=0; n&amp;lt;numberOfSamples; n++)&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastSampleI=sampleI;&lt;br /&gt;
   &lt;br /&gt;
   //Read in voltage and current samples.   &lt;br /&gt;
   sampleI = analogRead(inPinI1);&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastFilteredI = filteredI;&lt;br /&gt;
  &lt;br /&gt;
   //Digital high pass filters to remove 1.6V DC offset.&lt;br /&gt;
   filteredI = 0.9989 * (lastFilteredI+sampleI-lastSampleI);&lt;br /&gt;
   &lt;br /&gt;
   //Root-mean-square method current&lt;br /&gt;
   //1) square current values&lt;br /&gt;
   sqI = filteredI * filteredI;&lt;br /&gt;
   //2) sum &lt;br /&gt;
   sumI += sqI;&lt;br /&gt;
   delay(0.0002);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Calculation of the root of the mean of the voltage and current squared (rms)&lt;br /&gt;
//Calibration coeficients applied. &lt;br /&gt;
Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - 0.06;&lt;br /&gt;
if (Irms1 &amp;lt; 0){ Irms1 = 0; }; //Set negative Current to zero&lt;br /&gt;
sumI = 0;&lt;br /&gt;
&lt;br /&gt;
Serial.println(&amp;quot;Irms1:&amp;quot;+String(Irms1));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=222</id>
		<title>Open Energy Monitor mit dem ESP32</title>
		<link rel="alternate" type="text/html" href="http://pool.technik-fan.de/index.php?title=Open_Energy_Monitor_mit_dem_ESP32&amp;diff=222"/>
		<updated>2018-02-04T18:39:29Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Kalibrierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Einleitung=&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung wird beschrieben wie mit Hilfe einer ESP32 Platine ein Strom Sensor für 3 Phasen Wechselstrom aufgebaut werden kann. Der Spannungsteiler aus den 10kOhm Widerständen erzeugt 1,6V für die SCT-013-030 Strom Sensoren. Die Stromsensoren werden mit den ADC Pin&#039;s des ESP32 verbunden. Natürlich sind die Messungen nicht sonderlich genau, da die Phasenverschiebung nicht berücksichtigt wird. Auch das wäre durch zusätzliche Transformatoren möglich die dann auf die ADC Pin&#039;s geführt werden. Da ich damit nur meinen ungefähren Stromverbrauch zuhause messen möchte ist die Schaltung völlig ausreichend.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Folgende Bauteile werden benötigt:&#039;&#039;&#039;&lt;br /&gt;
 -Board: DOIT ESP32 DEVKIT V1 (ca. 10€)&lt;br /&gt;
 -Strom Sensor SCT-013-30 (30A) oder SCT-013-100 (100A) siehe: http://openenergymonitor.org/emon/node/156&lt;br /&gt;
 -6x 10kOhm Widerstände 1/4W&lt;br /&gt;
 -3x Elko 10 uF&lt;br /&gt;
 -Universalplatine&lt;br /&gt;
 -evtl. USB Netzteil oder anderes Netzteil für die Spannungsversorgung&lt;br /&gt;
 -Pfosten Stecker Rastermaß: 2.54mm&lt;br /&gt;
 -3 x 3,5 mm Audio Anschluss&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pinbelegung des DOIT ESP32 DEVKIT V1 Board:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 https://github.com/playelek/pinout-doit-32devkitv1&lt;br /&gt;
&lt;br /&gt;
=Grundlagen=&lt;br /&gt;
&lt;br /&gt;
Auf der Seite von Open Energy Monitor finden sich genügend Informationen über die Grundlagen der Leistungsberechnung. Das Prinzip lässt sich 1:1 vom Aufbau eines Arduinos übernehmen. Der ESP32 verkraftet jedoch maximal 3,3V am Analog Eingang.&lt;br /&gt;
&lt;br /&gt;
 https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino&lt;br /&gt;
&lt;br /&gt;
=Aufbau=&lt;br /&gt;
&lt;br /&gt;
Auf die Lochrasterplatine müssen nur wenige Bauteile. Die Teile lassen sich relativ einfach einlöten. Für den Aufbau werden nur wenige PIN&#039;s des ESP32 benötigt. Bei meinem Aufbau gibt es am obersten Sensor Anschluss noch einen zusätzlichen Burden Widerstand von 200 Ohm. Das liegt daran das der SCT-013-030 Sensor schon einige Jahre alt ist. Bei den neuen Sensoren sind keine Burden Widerstände nötig, da diese schon einen 62 Ohm Burden eingebaut haben.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 03.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 01.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
&lt;br /&gt;
Ich verwende zum programmieren immer die Arduino Gui. Es sind zuerst einige Anpassungen nötig damit das DOIT ESP32 Board von der Arduino Software erkannt wird. Hierzu muss diese Anleitung umgesetzt werden:&lt;br /&gt;
&lt;br /&gt;
 https://github.com/espressif/arduino-esp32&lt;br /&gt;
&lt;br /&gt;
Nach dem Neustart der Arduino Software kann dann das passende ESP32 Board ausgewählt werden. In meinem Beispiel ist es ein DOIT V1 Board.&lt;br /&gt;
&lt;br /&gt;
[[Datei:ESP32 04.png|700px|Klicken um zu vergrößern]]&lt;br /&gt;
&lt;br /&gt;
Bei der Programmierung des ESP32 gibt es ein paar Dinge zu beachten. Auf den Boards ist meist ein passender Spannungsregler für 3,3V und ein passender FTDI Chip aufgelötet. Somit entfällt eine weitere Schaltung zur Spannungsversorgung. Zudem wird das Board vom FTDI Chip durch die Arduino Software automatisch in den &amp;quot;Upload Modus&amp;quot; versetzt. Man muss also nicht wie beim ESP8266 bestimmte Taster drücken (Flash und Reset) um das Board in den &amp;quot;Upload Modus&amp;quot; zu bringen.&lt;br /&gt;
&lt;br /&gt;
Ich habe öfters die WifiManager Library für das WLAN verwendet. Auf Dauer hatte ich damit jedoch immer wieder Probleme, so das ich meine WLAN Daten mit Absicht &amp;quot;fest&amp;quot; in das Programm einbaue. Zudem ergibt sich beim WLAN noch ein Problem wenn auf einmal die WLAN Verbindung unterbrochen wird, z.B. wenn der Router neu gestartet wird. Danach verbindet sich der ESP32 nämlich nicht mehr automatisch mit dem WLAN. Um das zu verhindern habe ich folgende Funktion in den Code eingebaut:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
//Wifi WatchDog&lt;br /&gt;
WiFi.onEvent(WiFiEvent);&lt;br /&gt;
//Check if WiFi is here&lt;br /&gt;
//Automatically reconnect the ESP32 if the WiFi Router is not there...&lt;br /&gt;
if (WiFi.status() != WL_CONNECTED)&lt;br /&gt;
    {&lt;br /&gt;
      WiFi.onEvent(WiFiEvent);&lt;br /&gt;
      //WIFI_Connect();&lt;br /&gt;
    } else {&lt;br /&gt;
      //Do something&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Wifi Watchdog&lt;br /&gt;
void WiFiEvent(WiFiEvent_t event) {&lt;br /&gt;
  Serial.printf(&amp;quot;[WiFi-event] event: %d  - &amp;quot;, event);&lt;br /&gt;
  switch(event) {&lt;br /&gt;
  case SYSTEM_EVENT_STA_GOT_IP:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi connected&amp;quot;);&lt;br /&gt;
      Serial.print(&amp;quot;IP address: &amp;quot;); Serial.println(WiFi.localIP());&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_DISCONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;WiFi lost connection&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_START:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station start&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_CONNECTED:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 station connected to AP&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  case SYSTEM_EVENT_STA_LOST_IP:&lt;br /&gt;
      Serial.println(&amp;quot;ESP32 Lost IP&amp;quot;);&lt;br /&gt;
      WiFi.begin();   // &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;  added  &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
      ESP.restart();&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kalibrierung==&lt;br /&gt;
Als nächstes müssen die Stromsensoren kalibriert werden. Dazu sollten folgende Variablen angepasst werden. Die Kalibrierung habe ich mit einer 100W Lampe und einem Wasserkocher 1800W durchgeführt. Eine genaue Stromzange oder eine Wattmeter sind sehr nützliche Hilfsmittel. In meinem Fall kann der SCT-013-030 als kleinste Einheit 100mA Strom erkennen. Die Sensoren haben 1800 Wicklungen und einen 62Ohm Burden Widerstand.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;ICAL&#039;&#039;&#039;    = Kalibrierung&lt;br /&gt;
 &#039;&#039;&#039;inPinI1&#039;&#039;&#039; = ADC Pin&lt;br /&gt;
&lt;br /&gt;
 filteredI = &#039;&#039;&#039;0.9989&#039;&#039;&#039; * (lastFilteredI+sampleI-lastSampleI); //Kalibrierung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c++&amp;gt;&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Setup variables&lt;br /&gt;
int numberOfSamples = 4000;&lt;br /&gt;
double ICAL = 1.08;&lt;br /&gt;
&lt;br /&gt;
//Set Voltage and current input pins&lt;br /&gt;
int inPinI1 = 34;&lt;br /&gt;
&lt;br /&gt;
// CT: Voltage depends on current, burden resistor, and turns&lt;br /&gt;
#define CT_BURDEN_RESISTOR    62&lt;br /&gt;
#define CT_TURNS              1800&lt;br /&gt;
#define VOLTAGE               225&lt;br /&gt;
&lt;br /&gt;
// Initial gueses for ratios, modified by VCAL/ICAL tweaks&lt;br /&gt;
double I_RATIO = (long double)CT_TURNS / CT_BURDEN_RESISTOR * 3.3 / 4096 * ICAL;&lt;br /&gt;
&lt;br /&gt;
//Filter variables 1&lt;br /&gt;
double lastFilteredI, filteredI;&lt;br /&gt;
double sqI,sumI;&lt;br /&gt;
//Sample variables&lt;br /&gt;
int lastSampleI,sampleI;&lt;br /&gt;
double Irms1;&lt;br /&gt;
unsigned long timer;&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
//**************************************************************************&lt;br /&gt;
//Phase1 &lt;br /&gt;
  for (int n=0; n&amp;lt;numberOfSamples; n++)&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastSampleI=sampleI;&lt;br /&gt;
   &lt;br /&gt;
   //Read in voltage and current samples.   &lt;br /&gt;
   sampleI = analogRead(inPinI1);&lt;br /&gt;
   &lt;br /&gt;
   //Used for offset removal&lt;br /&gt;
   lastFilteredI = filteredI;&lt;br /&gt;
  &lt;br /&gt;
   //Digital high pass filters to remove 1.6V DC offset.&lt;br /&gt;
   filteredI = 0.9989 * (lastFilteredI+sampleI-lastSampleI);&lt;br /&gt;
   &lt;br /&gt;
   //Root-mean-square method current&lt;br /&gt;
   //1) square current values&lt;br /&gt;
   sqI = filteredI * filteredI;&lt;br /&gt;
   //2) sum &lt;br /&gt;
   sumI += sqI;&lt;br /&gt;
   delay(0.0002);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Calculation of the root of the mean of the voltage and current squared (rms)&lt;br /&gt;
//Calibration coeficients applied. &lt;br /&gt;
Irms1 = (I_RATIO * sqrt(sumI / numberOfSamples)) - 0.06;&lt;br /&gt;
if (Irms1 &amp;lt; 0){ Irms1 = 0; }; //Set negative Current to zero&lt;br /&gt;
sumI = 0;&lt;br /&gt;
&lt;br /&gt;
Serial.println(&amp;quot;Irms1:&amp;quot;+String(Irms1));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>