freebus.org

Open Bus System
Aktuelle Zeit: 15. Juni 2015 15:12

Alle Zeiten sind UTC + 2 Stunden




Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Zählerstände auswerten
BeitragVerfasst: 24. April 2012 16:10 
Offline
Senior Boarder
Senior Boarder

Registriert: 5. Mai 2011 07:10
Beiträge: 57
Wohnort: Eschweiler
Hallo Zusammen,

ich habe einen eHZ und eine Gas- und Wasseruhr die ich gerne auswerten würde. Hat jemand hier schonmal was aufgebaut/gekauft womit man die günstig an KNX angebunden bekommt. Die Auswertung soll auf dem Gira Homeserver laufen.

Gruss
Norbert


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Zählerstände auswerten
BeitragVerfasst: 25. April 2012 07:38 
Offline
Platinum Boarder
Platinum Boarder

Registriert: 9. Oktober 2007 20:48
Beiträge: 961
Wohnort: Bad Königshofen
Hast du die Pulse vom eHZ rausführen lassen (S0) ?
Ich hab noch einen mechanischen und lasse eine Reflexlichtschranke auf die rote Markierung gucken.
Die Pulse vom Gaszähler sind so niederfrequent,die kannst du über den bus schicken.
Wasseruhr weiss ich nicht.
nimm einfach mal die neue in8 soft her schaue ob sie für die Wasseruhr noch schnell genug ist.

_________________
LG
Andreas


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Zählerstände auswerten
BeitragVerfasst: 25. April 2012 16:55 
Offline
Senior Boarder
Senior Boarder

Registriert: 5. Mai 2011 07:10
Beiträge: 57
Wohnort: Eschweiler
Schonmal Danke für den Typ Oldi, werde ich mal testen. Gas wäre damit erstmal erledigt.
Ich habe einen eHZ mit einer Schnittstelle nach vorne, wo man mit einer Photodiode das SML Protokoll abgreifen kann, aber damit ist es ja noch nicht auf dem Bus.
Meine Wasseruhr sieht so aus, hab leider nichts gefunden, ob man Impuls irgendwo abgreifen kann.


Dateianhänge:
IMG_0475.jpg
IMG_0475.jpg [ 90.96 KiB | 924-mal betrachtet ]
Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Zählerstände auswerten
BeitragVerfasst: 25. April 2012 19:32 
Offline
Senior Boarder
Senior Boarder

Registriert: 26. September 2008 08:29
Beiträge: 47
Hi,

bei den Wasserzählern ist der Impuls anscheinend noch nicht so verbreitet. Habe bei mir auch erst den Gaszähler auf dem Bus. Beim eHz bin ich auch noch nicht weiter.

Matthias


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Zählerstände auswerten
BeitragVerfasst: 25. April 2012 19:44 
Offline
Senior Boarder
Senior Boarder

Registriert: 5. Mai 2011 07:10
Beiträge: 57
Wohnort: Eschweiler
Ich habe zur Auswertung das hier gefunden:
http://wiki.volkszaehler.org/hardware/controllers/yport-node
da gibt's nen Lesekopf und ein Modul, welches die Werte an eine Datenbank schickt, meine Vorstellung wäre, das man es schafft die Werte des Lesekopf zu parsen, auf Momentanverbrauch und Absolutverbrauch zu reduzieren und dies dann auf den Bus zu schicken. Am besten natürlich mit nur einem LPC(?) Controller.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Zählerstände auswerten
BeitragVerfasst: 17. Juni 2012 13:51 
Offline
Senior Boarder
Senior Boarder

Registriert: 5. Mai 2011 07:10
Beiträge: 57
Wohnort: Eschweiler
Ich habe eine funktionierende Lösung mit dem EHZ Lesekopf von Volkszähler, einfach an die serielle Schnittstelle von einem Arduino Ethernet bzw. Itead Iboard anschließen und der stellt dann eine HTML Seite mit dem aktuellen Verbrauch und dem Zählerstand. Ich Werte das dann mit meinem Gira HS aus.
Vielleicht hilft es auch Oldie eine direkte Anbindung mit dem LPC auf KNX zu zaubern ;-)

Gruss
Norbert
Code:
/**
 * Copyright (c) 2012 Volker Wegert <ehzy@volker-wegert.de>
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *   Volker Wegert - initial implementation
 *   Norbert Schnitzler - EMH EHZ and HTML modifications
 */
 
#include <stdarg.h>
#include <stdio.h>
#include <avr/pgmspace.h>
#include <SPI.h>
#include <Ethernet.h>

/***************************************************************************************************
 * CONSTANTS
 ***************************************************************************************************/
byte mac[] = {   
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
byte ip[] ={ 
  192,168,178,50};
byte gateway[]={ 
  192,168,178,1};
byte subnet[] = {   
  255, 255, 255, 0 };
EthernetServer server(80);

/**
 * size of the SML message buffer = meximum number of bytes that can be received
 */
#define SML_MSG_BUFFER_SIZE    500

/**
 * maximum time to wait for the end of a data packet received via IR
 */
#define SERIAL_READ_TIMEOUT_MS 100

/***************************************************************************************************
 * MESSAGES
 ***************************************************************************************************/

/**
 * maximum length of a message (entire text after variable substitution!)
 */
#define MAX_MESSAGE_LENGTH        50

/**
 * message numbers
 */
#define MSG_PROGRAM_STOPPED        0
#define MSG_NEXT_FILENAME          1
#define MSG_NO_FILE_NAMES_LEFT     2
#define MSG_INIT_HARDWARE          3
#define MSG_INIT_SD_CARD           4
#define MSG_INIT_SD_CARD_ERROR     5
#define MSG_BYTE_READ              6
#define MSG_BUFFER_OVERFLOW        7
#define MSG_SERIAL_OVERFLOW        8 
#define MSG_INVALID_HEADER         9
#define MSG_FILE_OPEN_FAILED      10
#define MSG_FILE_WRITTEN          11
#define MSG_FREE_MEMORY           12
#define MSG_NUM_BYTES_READ        13

/**
 * actual message texts - caution, adapt MAX_MESSAGE_LENGTH if required!
 *                               ....+....1....+....2....+....3....+....4....+....5
 */
prog_char msgText00[] PROGMEM = "Program stopped.";
prog_char msgText01[] PROGMEM = "Next output file name is '%s'";
prog_char msgText02[] PROGMEM = "No more file names left";
prog_char msgText03[] PROGMEM = "Initializing Hardware...";
prog_char msgText04[] PROGMEM = "Initializing SD Card...";
prog_char msgText05[] PROGMEM = "SD Card initialization failed";
prog_char msgText06[] PROGMEM = "Read byte %02hhu from IR receiver";
prog_char msgText07[] PROGMEM = "Message buffer overflow";
prog_char msgText08[] PROGMEM = "Serial buffer overflow";
prog_char msgText09[] PROGMEM = "Invalid escape sequence";
prog_char msgText10[] PROGMEM = "Unable to open output file";
prog_char msgText11[] PROGMEM = "%u bytes of data written to file '%s'";
prog_char msgText12[] PROGMEM = "%u bytes of memory available";
prog_char msgText13[] PROGMEM = "%u bytes read";

/**
 * table for easier access to the message texts
 */
PROGMEM const char *msgTextTable[] = {   
  msgText00,
  msgText01,
  msgText02,
  msgText03,
  msgText04,
  msgText05,
  msgText06,
  msgText07,
  msgText08,
  msgText09,
  msgText10,
  msgText11,
  msgText12,
  msgText13
};

/***************************************************************************************************
 * GLOBAL VARIABLES (YUCK!)
 ***************************************************************************************************/
/**
 * the global buffer to store the SML message currently being read
 */
unsigned char buffer[SML_MSG_BUFFER_SIZE];
unsigned char Aktuell[4];
float aktuell;
unsigned char Stand[4];
unsigned char Akt[4];

/***************************************************************************************************
 * SUBROUTINES
 ***************************************************************************************************/

/**
 * printMessage - reads a message text from the PROGMEM, performs variable substitution and
 *                writes the resulting text to the serial console. Use MSG_* constants for
 *                messageNumber.
 */
void printMessage(int messageNumber, ...) {
  va_list args;
  char format[MAX_MESSAGE_LENGTH];
  char buffer[MAX_MESSAGE_LENGTH];
  va_start(args, messageNumber);
  strncpy_P(format, (char*)pgm_read_word(&(msgTextTable[messageNumber])), MAX_MESSAGE_LENGTH);
  vsnprintf(buffer, MAX_MESSAGE_LENGTH, format, args);
  Serial.println(buffer);
  va_end(args);
}

void PrintHex8(uint8_t *data, uint8_t length) // prints 8-bit data in hex with leading zeroes
{
  char tmp[16];
  for (int i=0; i<length; i++) {
    sprintf(tmp, "0x%.2X",data[i]);
    Serial.print(tmp);
    Serial.print(" ");
  }
}


/**
 * stop - stops program execution in a controlled fashion (endless loop).
 */
void stop() {
  printMessage(MSG_PROGRAM_STOPPED);
  while(1);
}


/**
 * isValidHeader - returns true if the global message buffer begins with a valid SML escape sequence.
 */
inline boolean isValidHeader() {
  return ((buffer[0] == 0x1b) ||
    (buffer[1] == 0x1b) ||
    (buffer[2] == 0x1b) ||
    (buffer[3] == 0x1b) ||
    (buffer[4] == 0x01) ||
    (buffer[5] == 0x01) ||
    (buffer[6] == 0x01) ||
    (buffer[7] == 0x01));
}

/***************************************************************************************************
 * MAIN ROUTINES
 ***************************************************************************************************/

/**
 * setup - initialization routine run once after the device is powered up.
 */
void setup() {
  // set the serial console speed
  Serial.begin(9600);
  // set the pin configuration
  printMessage(MSG_INIT_HARDWARE);
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  Serial.println(Ethernet.localIP());
}
/**
 * loop - main program, run in an endless loop
 */
void loop() {
  unsigned int nextBufferPosition = 0;
  unsigned long lastReadTime = 0;

  // clear the message buffer
  memset(buffer, 0, sizeof(buffer));
  // wait until actual data is available
  while (!Serial.available());

  // keep reading data until either the message buffer is filled or no more data was
  // received for SERIAL_READ_TIMEOUT_MS ms
  lastReadTime = millis();
  while (millis() - lastReadTime < SERIAL_READ_TIMEOUT_MS) {
    if (Serial.available()) {
      buffer[nextBufferPosition] = Serial.read();
      lastReadTime = millis();
      if (nextBufferPosition >= SML_MSG_BUFFER_SIZE) {
        printMessage(MSG_BUFFER_OVERFLOW);
        return;
      }
      nextBufferPosition += 1;
    }
  }

  // check the header
  printMessage(MSG_NUM_BYTES_READ, nextBufferPosition + 1);
  if (!isValidHeader()) {
    // not a valid header - notify the user...
    printMessage(MSG_INVALID_HEADER);
    // ...and empty the receiver buffer (wait for the end of the current data stream
    while (Serial.available() > 0) {
      Serial.read();
    }
  }
  else {
    for(int i=3;i>=0;i--){
      Stand[3-i]=(buffer[143+i]);
      Aktuell[3-i]=buffer[205+i];
    }
  }
  unsigned long result = *((unsigned long *)(& Stand[0]));
  double Result = result/10000;
  int Rest = long(result)%10000;
  float Ergebnis=(result/10000)+(float(long(result)%10000)/10000);
  Serial.println(Ergebnis);
  unsigned long aktuell = *((unsigned long *)(& Aktuell[0]));
  float Verbrauch=(aktuell/10)+(float(long(aktuell)%10)/10);
  Serial.println(Verbrauch);
  EthernetClient client = server.available();
  if (client) {
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          client.println("<head/><meta http-equiv=\"refresh\" content=\"10\"/></head/>");
          client.print("Verbrauch: ");
          client.println(Verbrauch, DEC%3);
          client.println("<br />");
          client.print("Zaehler: ");
          client.println(Ergebnis, DEC%3);
          client.println("<br />");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
  }
}


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Zählerstände auswerten
BeitragVerfasst: 21. Juni 2012 17:55 
Offline
Expert Boarder
Expert Boarder

Registriert: 5. Juli 2009 16:47
Beiträge: 151
Wohnort: Ostfildern
Hallo,

ich bin auch gerade dabei meine 2 eHZ Zähler auszulesen.

Ich habe 2 Leseköpfe und 1 YPORT von Volkszähler gekauft, aufgebaut und relativ schnell in Betrieb genommen.

Der YPORT liest laufend die beiden Zähler aus und stellt die Daten 1:1 auf einem Port zur Verfügung. Kann man direkt mit : Telnet <IP> <Port> sehen.

Die Daten sind bei mir binär im SML-Format. Momentan bin ich gerade dabei in C# eine Auswertung der Daten zu schreiben.
Das ist nicht so schwierig, momentan wird bereits die aktuelle Leistung und der Zählerstand (jeweils pro Richtung) angezeigt.

Das war für mich die einfachere Lösung als von Seriell erst auf KNX dann wieder in den PC.

Gruß
Petzi


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Zählerstände auswerten
BeitragVerfasst: 22. Juni 2012 08:18 
Offline
Platinum Boarder
Platinum Boarder

Registriert: 9. Oktober 2007 20:48
Beiträge: 961
Wohnort: Bad Königshofen
@ Nobi:
Danke.
Ich fange gerade mit dem Universalzähler an.
Wenn der mal fertig, können wir ja noch eine Version mit Auslesen per lesekopf machen, werd
mich dann damit beschäftigen.
Zuvor will ich aber erst meine freebus-RS485 Schnittstelle bauen und damit mein SMA WR
loggen bzw nach 70% Richtlinie steuern.

_________________
LG
Andreas


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 

Alle Zeiten sind UTC + 2 Stunden


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de