User Tools

Site Tools


software:controller:ethersex

Ethersex

Die Funktionen die benoetigt werden um Daten von einem Zaehler mit S0-Ausgang an die volkszaehler-middleware zu uebertragen, sind in die ethersex-Firmware für Atmel-AVR Controller bereits integriert. (die “watchasync” Funktion, die fuer Impulse an einem Eingang http-reqeusts erzeugt.)

Diese Seite beschreibt die Installation und Konfiguration der Firmware.

Voraussetzungen

ethersex muss zunaechst auf einem PC konfiguriert und kompiliert werden, bevor es auf den Controller uebertragen werden kann. Dazu ist folgende Software noetig:

Debian:

# apt-get update
# apt-get install gcc-avr avr-libc binutils-avr m4 gawk libncurses5-dev make dialog git-core avrdude

Fedora:

# yum install avr-binutils avr-libc avr-gcc avrdude gawk git m4 ncurses-devel 

avr-gcc 4.5.1-2.fc14.1 bricht mit einem “internal compiler error” ab, mit den älteren 4.4.2 (gibt's unter http://download.fedoraproject.org/, updates/12) tut's aber.

Ubuntu:

# sudo apt-get update
# sudo apt-get install gcc-avr avr-libc binutils-avr m4 gawk libncurses5-dev make dialog git-core avrdude 

Verwendeter Controller: Als Controller sollte (mindestens?) ein ATmega644 oder ATmega644p eingesetzt werden. Der im NETIO-Board von Pollin eingesetzte ATmega32 unterstützt den Interruptbetrieb nur an 3 Pins. Beim Atmega644 sind alle Pins interruptfähig (wichtig für den watchasync service siehe weiter unten). Der Controller ist pinkompatibel und kann im NET-IO-Board einfach ersetzt werden.

(Achtung: Aktuell (Stand Nov. 2012) wird vom watchasync Code ein ATmega32 nicht unterstützt. Daher ist ein ATmega644(p) zwingend erforderlich (das sollte aber auch zu beheben sein).)

Herunterladen

Die Software für Ethersex solltet Ihr Euch aus dem offiziellen git-Repository des Ethersex-Projektes holen:

git clone git://github.com/ethersex/ethersex.git
cd ethersex

(Falls es Probleme beim konfigurieren/compilieren gibt, möglicherweise noch: “cd ethersex; git checkout snapshot_compile_ok”, das verursacht aber evtl. auch Probleme.)

Konfigurieren

Da die middleware und das Frontend mittlerweile auf eine Timestamp-Auflösung in Millisekunden umgestellt wurde, muss in E6 im watchasync service unter “Path at the end:” “000” eingetragen werden.

Um S0-Impulse vom AVR zur Middleware zu bekommen, benutzen wir den watchasync-Service von ethersex. Dieser Service ist recht flexibel und somit auch etwas komplex.

Die Pins (pinning) hängen von der verwendeten Hardware ab (z.B. avr_net-io oder 5xS0-Hutschienencontroller oder YPORT-Node), die UUIDs muß man sich vorher von der Middleware erstellen lassen.

Hier sind ein paar Standard-Configs:

Gemeinsame Einstellungen

$ make menuconfig

Load a Default Configuration --->:
  Pollin, AVR Net-IO, für 5xS0-Hutschienencontroller oder YPORT-Node jedoch hier nichts auswählen.
General Setup --->:
  Target MCU: Controller auswählen (ATmega644 oder ATmega644p oder ATmega1284p (für 5xS0-Hutschienencontroller oder YPORT-Node))
  VFS (Virtual File System) support: ausschalten
Network --->:
  Hostname: "<hier den gewünschten Hostnamen eintragen>"
  Ethernet (ENC28J60) support --->:
    MAC address: "<hier die MAC Adresse des AVR Net-IO eintragen>"
    --- Static IPv4 configuration
      IP address: <hier die IP-Adresse eintragen, die das AVR Net-IO haben soll>
      Netmask: <hier die Netzwerkmaske eintragen, die das AVR Net-IO haben soll - vermutlich passt der Standardwert von 255.255.255.0 bereits>
  --- IP Configuration
    Default Gateway: <hier die IP-Adresse des Routers eintragen>
    UDP support: einschalten
    DNS support --->: einschalten
      DNS-Server IP address: <IP-Adresse des DNS-Servers> (normalerweise ist das die IP-Adresse des Routers)
I/O --->:
  ADC input: ausschalten
  Onewire support: ausschalten

Anmerkung: “Use Polling for edge detect instead of interrupt” sollte bei Verwendung des Service watchasync immer ausgeschaltet bleiben, ansonsten gehen Zählimpulse verloren!

Die einfachere Variante: Verwenden der Serverzeit für die Zeitstempel

In dieser Variante übermittelt der Controller keine eigenen Zeitstempel. Die Middleware verwendet dann ihre eigene Uhr zur Kennzeichnung des Impulses. Dies ist einfacher zu konfigurieren und bedeutet in der Praxis keine Nachteile (Details gerne auf Nachfrage über die Liste). Gerade für Einsteiger ist diese Variante daher gut geeignet, ein Wechsel zur anderen Variante ist jederzeit problemlos möglich (s.u.).

Vorteile:

  • Die lokale Uhrzeit des ATmega-Controllers ist nicht relevant
  • Einfacher einzurichten
  • Serverzeit wird automatisch benutzt, ist i.A. genau genug

Nachteile:

  • Die Zeitstempel werden erst nach der Übermittlung zur Middleware gebildet; die entstehende Latenz verfälscht daher die Messung; dieser Effekt ist jedoch vernachlässigbar
  • Wenn der Server nicht erreichbar ist, haben die Impulse später den falschen Zeitstempel; wer also eine unzuverlässige Netzanbindung hat, sollte sich die andere Variante anschauen
...
Applications --->:
  watchasync service --->: einschalten
    Server: <Hostname des Middlewareservers>
    Server IP: <IP-Adresse des Middlewareservers> (diese Option erscheint nur, falls der DNS-Support deaktiviert wurde)
    Port number: 80
    HTTP Method (often GET or POST): "POST"
    Path in front of pin identifier: "</Pfad auf dem Server zur middleware>/middleware.php/data/"
    Path at the end: ".json"
    Include unix timestamp: aus
    Summarize Events: aus
    [ ] Use Polling for edge detect instead of interrupt
    Pin Configuration ---> (Hier sollte mindestens eine UUID/Pin konfiguriert werden)
-> Exit -> Exit -> Exit -> "...save..." -> "Yes"

Um die Daten an die Demo-Installation volkszaehler.org zu senden muss abweichend folgendes eingegeben werden:

...
Applications --->:
   Server: "demo.volkszaehler.org"
   Port number: 80
   HTTP Method: POST
   Path in front of pin identifier: "/middleware.php/data/"
   Path at the end: "000"
   [*] Include unix timestamp
     Path in front of timestamp: ".json?ts="

Vor dem Speichern muss von volkszaehler.org eine eindeutige UUID erstellt werden. Beispiel: Erstellen eines Stromzählerkanals (type=power) mit dem Titel Zaehler (title=“Zaehler”) und einer Auflösung von 800 Impulsen

http://demo.volkszaehler.org/middleware.php/channel.json?operation=add&title=Zaehler&type=power&resolution=800&description=TMT%20sensor

Die heruntergeladene Datei enthält die UUID, die in der Pin Configuration eingetragen wird.

Der Aufruf im volkszaehler Frontend lautet:

demo.volkszaehler.org/frontend/?uuid=<UUID>

AVR-Zeit

...
Application / System clock support
[*] Date and Time support                           
[*] Use 32 kHz crystal to tick the clock (Anm.: das nur ankreuzen, wenn auch wirklich ein 32 kHz dran hängt)(was eine gute Idee ist)
[ ] Use CPU clock to tick the clock (EXPERIMENTAL)  
[*] Adjust clock to NTP clock signal                
[-] Synchronize using DCF77 signal  --->            
[*] Synchronize using NTP protocol                  
     NTP Server: ptbtime1.ptb.de          //wenn DNS ausgeschaltet ist, hier eine IP eintragen          
(123) NTP Port                                      
[ ] NTP daemon                                      
[ ] Working hour meter                              
[ ] Uptime (whm in unix format like: d days, hh:mm) 
(CET/CEST) Time Zone                                     
--- Debugging Flags                                 
[-] NTP Clock-Adjust  
...
Applications / watchasync service:
   Server: "demo.volkszaehler.org" //oder eigener Hostname
   Port number: 80
   HTTP Method: POST
   Path in front of pin identifier: "/middleware.php/data/" //oder eigener Pfad, i.d.r.> middleware.php/data/
   Path at the end: "000"
   [*] Include unix timestamp
     Path in front of timestamp: ".json?ts="
Falls man die Ereignisse nicht pro Auflösungsschritt summieren möchte:
   Path at the end: "000"
   [ ] Summarize Events
Falls man die Ereignisse pro Auflösungsschritt summieren möchte:
   Path at the end: ""
   [*] Summarize Events
     Path in front of eventcount: "000&value="
   [ ] Use Polling for edge detect instead of interrupt  

Erklärung von weiteren watchasync-Parametern:

“Resolution in seconds (Power of 2)” Dieser Parameter gibt an, über welches Zeitinterval Ereignisse (z.B. Impulse) gesammelt (addiert) werden, bevor die Summe an die Middleware übermittelt werden. Der Wert des Parameters muss eine Zweipotenz sein. Weiterer Hinweis: Setzt man “Resolution in Seconds” auf eine Zweierpotenz (2, 4, 8, 16, 32) wird ohne “Summarize Events” der Zeitstempel auf 2, 4, 8, 16 .. Sekunden gerundet, mit “Summarize Events” werden die Impulse der entsprechenden Zeitspanne aufsummiert und als Summe gesendet.

“Send end of intervall instead of beginning” ???

“Counterrange” ???

“Buffersize (Power of 2)” ???

Weitere Tipps: Die Verbindung zum Server per watchasync kommt nur zustande, wenn permanent ein DNS-Server zur Verfügung steht, der den in E6 hinterlegten application –> watchasync service –> Server per DNS auflösen kann. Andernfalls gilt: keine Namensauflösung –> keine Datenspeicherung. Wenn allerdings für den Server eine IP in watchasync eingetragen ist, muss DNS ausgeschaltet sein. Nicht vergessen für den NTP-Server dann auch eine IP eintragen.

Kompilieren

make

Flashen

Die Optionen hängen vom verwendeten ISP-Programmer ab und sollten nur als Beispiel dienen. Das sind nur die Optionen, die ich benutze. — Steffen Vogel 2010/11/07 16:20

avrdude -c avr910 -p m644p -b 115200 -P /dev/ttyUSB0 -U flash:w:ethersex.hex -U lfuse:w:0xE7:m -U hfuse:w:0xDC:m -U efuse:w:0xFF:m

Eine detailierte Anleitung gibts im ethersex-Wiki: “Wie flasht man ein AVR NET-IO

software/controller/ethersex.txt · Last modified: 2016/01/12 18:02 by udo1