Sollog für Würth / SMA/ Diehl / SolarMax / Delta (Solarlogger)

Der Stick ist definitiv im Eimer. Er hat mir bei meinen ersten Versuchen mit Freetz schon schwierigkeiten bereitet. Ich hatte da Datenverlust nach 1-2 Tagen. Jetzt weis ich, daß es am Stick lag.

Vor dem Abziehen versuch ich schon, den Stick abzumelden. Aber auf der Box geht das nicht. Im AVM- Abteil wird er nicht erkannt, so daß mir die Option USB- Speicher sicher entfernen nicht angeboten wird.
 
Wo find ich denn das ?

Hier ist mal ein Link auf meine Baustelle:

http://erwinruhl.dyndns.info:90/solarertrag.php?wr=1


Die Monats- und Jahresbalken bauen sich auch noch nicht auf.
Da fehlen mir noch 2 gd- Skripte. Muss noch schaun wie ich die installiert bekomme.
 
Zuletzt bearbeitet:
Wo find ich denn das ?
...
Mit telnet auf die Box und dann mit "umount ...". Falls das device busy ist, kannst Du mit lsof schauen, wer die Mountstelle benutzt. Evtl. musst Du dann kill einsetzen.
 
Es gab doch auch eine Möglichkeit, das über die Freetz Web-Oberfläche zu machen. Braucht man dafür ein zusätzliches Paket oder ist die Funktion schon im Basis-Paket mit drin?
 
Funktioniert evtl. auch mit FREETZ-MOUNT und der rc.external.
 
Gerade hat mir ein User im PV-Forum geschrieben, er habe das gleiche Prioblem, daß bei ihm auch keine Balken gezeichnet werden.
Er nutzt einen NAS- Computer auch mit Debian Etch im chroot- Modus.

Ich habe den Visualizer ja auf einem Ubuntu- PC und auf der Box laufen.
Auf dem PC werden die Grafiken korrekt gezeichnet. Auf der Box fehlen die Balken in der Monats- und Jahresgrafik.

Er meint, es könne mit dem chroot zu tun haben, daß die Grafiken nicht richtig gezeichnet werden.

Ich habe vermutet, es könne daran liegen, daß in der phpinfo bei gd nur 11 Skripte aufgezählt werden. Auf meinem Ubuntu - Rechner sind es 13.

Ich habe jetzt mehrmals das php5-gd gelöscht und wieder geladen, ohne Erfolg. Es werden nicht mehr als 11.

Hier mal die phpinfo
http://erwinruhl.dyndns.info:90/test.php/


Ich hab noch ein 2. Problem:

Wenn ich ihn auf der Box laufen lasse, nimmt er die Variable buffer nicht richtig an und bringt mir "ERROR no regexp match".

Hier die Passage, wo ich buffer einlese:

// Read answer

bzero(inbuffer, 1);
bzero(buffer, 512);
for (i=0; i < 512; i++)
{
length = read(fd, inbuffer,1);
buffer= inbuffer[0];
if (inbuffer[0] == '}')
{
buffer[i+1] = '\0';
break;

}
}
if (length < 0)
break;

if (DEBUG)
printf("Received answer: %s\n", buffer);

char buffer [512] = "KDY=B;KMT=40;KYR=B9F;KT0=1154;TNF=1388;TKK=19;PAC=5C;PRL........"
if (DEBUG) {
sprintf(buffer2, "Received answer: %s", buffer);

debug_entry(buffer2);
}

// Extract the data fields from answer
result = regexec(&rx, buffer, rx.re_nsub + 1, matches, 0);
if (result) {
regerror(result, &rx, buffer, sizeof(buf
//error_exit("ERROR no regexp match");
error_retry("ERROR no regexp match");
lost_connection = 1;
break;
}

// Convert the extracted data fields to integer
temp = strndup(buffer + matches[1].rm_so, matche
kdy = strtol(temp, NULL, 16);
free(temp);


Wenn ich den Antwortstring einfüge, kommt kein Fehler und er zeichnet die vorgegebenen Werte auf.
char buffer [512] = "KDY=B;KMT=40;KYR=B9F;KT0=1154;TNF=1388;TKK=19;PAC=5C;PRL........"

Wenn Debug aktiviert ist, zeigt er mir die Variable buffer auch an, bringt halt den obigen Error.

.... jetzt hab ich mir den 2. Stick zerschossen..... Darum gehen die Links momentan nicht.....
 
Zuletzt bearbeitet:
Die beiden Probleme sind gelöst.
Bei den Balken war es so, daß sie von oben nach unten gezeichnet werden müssen.

Bei meiner Variablen Buffer war es so, daß mein Würth- Wechselrichter den letzten Teil der Antwort SYS nicht herausgibt. Habe dann eine Antwort (SYS=FFFF) angehängt und dann gings.

Den Logger kann man auf meiner "Baustelle" bei der Arbeit zusehen.

Wie weiter oben schon geschrieben , hat der Logger recht lange Ladezeiten.

Mir wurde auch schon zu einer NAS geraten. Bin noch am überlegen.
Oder welche Fritzbox wäre performanter als die 7141? Am liebsten wäre mir eine mit nur einem Antennenanschluß.

Die Fritzbox hat ja den Vorteil, daß kein zusätzlicher Stromverbraucher angeschlossen wird. Von daher gefällt mir diese Lösung sehr gut.

Momentan versuche ich einen zweiten Stick mit dem System zu bespielen. Leider funktioniert das Pakete laden mit apt-get und aptitude nicht mehr. Ich vermute, daß es an den Sticks liegt, die ich verwende. Muss mir neue besorgen.....

....Ich habe meine Sticks, wie in einem anderen Thread empfohlen wurde, mit ext2 statt mit ext3 formatiert. Funktioniert seither wesentlich besser.
 
Zuletzt bearbeitet:
Ich will hier nochmal eine kleine Anleitung geben, wie man den Logger installiert:

Erstmal brauchst einen PC, auf dem Du Ubuntu installierst.
Dazu Ubuntu herunterladen (google) , auf eine CD brennen und dann das Betriebssystem auf einem ArbeitsPC installieren.

Dann brauchst eine Fritzbox mit USB- Anschluss.
Da musst dann mit Hilfe des Ubuntu- PC Freetz draufmachen.
http://freetz.org/wiki/help/howtos/common/newbie
Am besten nimmst freetz-trunk
http://freetz.org/
In diesem Forum kannst Dir Hilfe holen:
http://www.ip-phone-forum.de/forumdisplay.php?f=525

Wennst dann Freetz drauf hast, kommt der Debian (Etch)
Es geht im großen und ganzen nach der Anleitung:
http://www.ip-phone-forum.de/showthread.php?t=137008
Da kann es sein, daß Du den Lenny nicht zum laufen kriegst.
Dann musst auf den Debian Etch zurückgreifen:
http://freetz.org/wiki/packages/debootstrap
Die Klammer um foreign musst wegmachen.

Wenn Du dann den Debian hast, kannst (wennst einen Solarmax hättest) den Logger von zagibu auf Seite 13 einrichten.

http://www.photovoltaikforum.com/datenlogger-f5/solarmax-datenlogger-t52179.html

Da wird dann noch Apache2 , Mysql und der Compiler installiert.

Aber wie gesagt, nicht so ganz einfach. Wichtig ist, daß Du den Stick mit ext2 formatierst. Das machst Du mit dem Programm Gparted.
 
Zuletzt bearbeitet:
Der Logger funktioniert, nur....
Nach ein paar Tagen wird der Stick nicht mehr erkannt.
Ich hab dann auch kein swap mehr, wie gesagt der Stick ist weg.
meine /var/flash/debug.cfg:
Code:
## Rudi-Editor
## Bitte umgebende Zeilen NICHT entfernen ('cat > ...', 'RUDI_EOF')
cat > /var/flash/debug.cfg << 'RUDI_EOF'

modprobe pl2303
modprobe ftdi_sio 
modprobe ftdi_sio vendor=0x067b product=0x2303
modprobe ext2
mkdir /var/media/ftp/USBHDD/
mount -t ext2 /dev/sda1 /var/media/ftp/USBHDD/
mount -t proc proc /var/media/ftp/USBHDD/Debian_Etch/proc/
mount -o bind /dev/ /var/media/ftp/USBHDD/Debian_Etch/dev/
mount -t devpts devpts /var/media/ftp/USBHDD/Debian_Etch/dev/pts
USBDEVICE='USBHDD'
# Swapfile einbinden falls vorhanden
if [ -f /var/media/ftp/$USBDEVICE/swapfile1 ]
 then
  modprobe loop
  swapon /var/media/ftp/$USBDEVICE/swapfile1
fi
chroot /var/media/ftp/USBHDD/Debian_Etch /etc/init.d/apache2 start
chroot /var/media/ftp/USBHDD/Debian_Etch /etc/init.d/mysql start


RUDI_EOF

wenn ich
Code:
mkdir /var/media/ftp/USBHDD/
eingebe, kommt : No such File or Directory

Hat da vielleicht einer eine Idee?
Ich habe heute mal einen anderen Typ USB-Stick beschrieben, mal schaun.

.... Der neue Stick ist nun eine Woche in Betrieb und scheint zu halten...
 
Zuletzt bearbeitet:
Der Logger funktioniert auf der 7141 er Fritzbox. Das freut mich.

Ich wollte jetzt ihn auf eine 7170 installieren. Ich habe aber Schwierigkeiten, Freetz auf die Box zu bringen. Bzw. es klappt überhaupt nicht.

Ich führe freetz-trunk aus und habe das Image. Das übertrage ich in das ruKernelTool.
Beim Ausführen des Tools bekomme ich fogendes:

kernel_aus_7170_04.80freetz-devel-6189.de_20110317-051939.image übertragen... überprüfen... gescheitert!

Das kernel.image konnte nicht übertragen werden!

Alle Kommunikationsverhinderer (z.B. Firewall, Virenscanner) ausschalten bzw. mit msconfig deaktivieren und dann noch einmal versuchen.
Eventuell auch alle bis auf den einen notwendigen Netzwerkadapter deaktivieren.
Siehe auch Option in Einstellungen -> "Alle nicht benötigten Netzwerkkarten temporär deaktivieren"

LibNcFTP 3.2.5 (January 17, 2011) compiled for Windows
220: ADAM2 FTP Server ready
Connected to 99.88.77.1.
Cmd: USER adam2
331: Password required for adam2
Cmd: PASS xxxxxxxx
230: User adam2 successfully logged in
Logged in to 99.88.77.1 as adam2.
Cmd: MEDIA FLSH
200: Media set to MEDIA_FLASH
Cmd: TYPE I
200: Type set to BINARY
Cmd: PASV
227: Entering Passive Mode (99,88,77,1,5,102)
Cmd: STOR mtd1
Could not read reply from control connection -- timed out.
ncftpput mtd1: timed out while waiting for server response.

Ich habe es jetzt auch mit einem Minimal- Image versucht, es klappt nicht.
Er schreibt ja, ich solle einen Firewall deaktivieren oder Vierenscanner. Ich weis nicht, wo ich das machen sollte, mit der 7141 funktioniert es ja. Netzwerkkarten hab ich eh nur eine.

Das Aufspielen des original- AVM- Image klappt.

Hat da vielleicht wer einen Tip?
 
Zuletzt bearbeitet:
Hast du mal probiert die Firmware auf normalem Weg über das Webinterface zu flashen?

Gruß
Oliver
 
Vielen Dank Oliver, hat geklappt.

Der zagibu vom PV- Forum will eine kombinierte Ansicht bauen. Dann kann man mehrere Wechselrichter von einer Seite aus beobachten.

Ausserdem will er Emailversand bei Störungen einbauen. Bin gespannt.
 
Der Sollog ist jetzt über einen Monat durchgelaufen. Vor ein paar Tagen war wieder der SWAP weg. Durch einen Einschaltereset konnte ich ihn wieder reanimieren.
Ich habe jetzt auch eine Webcam installiert. Dazu habe ich allerdings einen separaten Laptop benutzen müssen. Was ich hier im Forum gelesen habe, gibt es noch Probleme mit den Treibern und man kann keine Kamera über den USB- Anschluss benutzen. Naja, dann muss ich halt so 50 Watt zusätzlich verheizen.
Oder weis wer eine Möglichkeit, eine Webcam an die Fritzbox anzuschliessen?

... Ich bin jetzt auf die Seagate Dockstar gekommen. Darauf hat sich auch meine Webcam installieren lassen. Sie hat 1200 MHz und die Seiten werden jetzt wesentlich schneller aufgebaut als auf der Fritzbox. Sie braucht auch nur so ca. 5 Watt.

Hier der Logger, der den Würth bzw. Solarmax über die RS485 - USB - Schnittstelle loggt:

Code:
/*
   Simple solarmax logger c program written by [email protected] in July 2010
   This program was originally licensed under WTFPL 2 http://sam.zoy.org/wtfpl/
   It is now licensed under GPLv2 or later http://www.gnu.org/licenses/gpl2.html

   You need the mysql client library files installed to be able to compile it.

   Compile with:
gcc -W -Wall -Wextra -Wshadow -Wlong-long -Wformat -Wpointer-arith -rdynamic -pedantic-errors -std=c99 -o sollog sollog.c -lmysqlclient

   Run with:
./sollog /home/fritz/Desktop/loggertest/sollog.conf
./sollog /usr/bin/sollog.conf
   Structure of the config-file:

        Debug=0
   Loginterval=60
   Waitinterval=200
   DBhost=localhost
   DBname=solarmax
   DBtabprefix=log
   DBuser=solaruser
   DBpass=userpassword
   Hostname=192.168.178.35
   Hostport=12345
   NumberOfInverters=1

   You can set DEBUG to 1 to get detailed output in a separate logfile.

   It is recommended to schedule the smw-logger to be started between 5:00 - 6:00 in the
   morning and stopped between 22:00 and 23:00 in the evening (compare with sunshine
   duration). The smw-logger has no built-in facility for logging, so use CRON or similar.

   Example CRON entries:
   00 05 * * * /usr/local/bin/logger /usr/local/etc/logger.conf
   00 23 * * * killall logger

   Sources:
  - http://www.linuxhowtos.org/C_C++/socket.htm
  - http://wwwuser.gwdg.de/~kboehm/ebook/21_kap15_w6.html#49329
  - http://man.cx/setbuf%283%29
  - http://allfaq.org/forums/t/169895.aspx
  - http://dev.mysql.com/tech-resources/articles/mysql-capi-tutorial.html
*/

#define _GNU_SOURCE

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <mysql/mysql.h>
#include <regex.h>
#include <time.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <pthread.h>
#include <termios.h>
# define TERM_DEVICE "/dev/ttyUSB0"    /* = COM1 / USB */
# define TERM_SPEED B19200        /* Bit/Sek */



  int i, fd, old_flags, log_interval, integer, integerout,integerout2,j, PACcount;
int integerout1[8];
  ssize_t length;

  struct termios term_attr;
  FILE* file;
  char* file_name;
  char outbuffer[512]={0};
//  char   outbuffer[512] = "KDY=B;KMT=40;KYR=B9F;KT0=1154;TNF=1388;TKK=19;PAC=5C;PRL=1;IL1=54;IDC=1A;UL1=910;UDC=A2C;SYS=FFFF|";
  char text[256];
  char inbuffer[1];
  char* mode = "a";
  char* message = "{FB;01;46|64:KDY;KMT;KYR;KT0;TNF;TKK;PAC;PRL;IL1;IDC;UL1;UDC;SYS|1199}";
//  time_t timestamp;
    time_t t;
    struct tm *ts;




FILE* error_file = NULL;
char* error_file_name = "/var/log/solarmax-error.log";
char* error_mode = "w";
FILE* debug_file = NULL;
char* debug_file_name = "/var/log/solarmax-debug.log";
char* debug_mode = "w";
FILE* config_file = NULL;
char* config_file_name;
char* config_mode = "r";
int sockfd, portno, n, log_interval, result, counter, wait_interval, active_max, nr_of_maxes, DEBUG;
int lost_connection = 0;
struct sockaddr_in serv_addr;
struct hostent* server;
char dbhost[512];
char dbname[512];
char dbtabprefix[512];
char dbuser[512];
char dbpass[512];
char hostaddr[512];
char line[512];
char* message;
char* expression = "...=([0-9A-F]*);...=([0-9A-F]*);...=([0-9A-F]*);...=([0-9A-F]*);...=([0-9A-F]*);...=([0-9A-F]*);...=([0-9A-F]*);...=([0-9A-F]*);...=([0-9A-F]*);...=([0-9A-F]*);...=([0-9A-F]*);...=([0-9A-F]*);...=([0-9A-F]*)";
int kdy, kmt, kyr, kt0, tnf, tkk, pac, prl, il1, idc, ul1, udc, sys;
char buffer2[512];
// char    buffer [512] = {"KDY=B;KMT=40;KYR=B9F;KT0=1154;TNF=1388;TKK=19;PAC=5C;PRL=1;IL1=54;IDC=1A;UL1=910;UDC=A2C;SYS=FFFF;"};
char buffer[512];
char query[512];
char* temp;
regex_t rx;
regmatch_t* matches;
MYSQL* connection = NULL;

void error_exit(const char* msg) {
   perror(msg);
   if (error_file != NULL)
      fclose(error_file);
   if (debug_file != NULL)
      fclose(debug_file);
   exit(0);
}

void debug_entry(char* msg) {
   time_t timestamp = time(NULL);
   char debug_msg[512];
   char *time_now = ctime(&timestamp);
   time_now[strlen(time_now)-1]=0;
   if (debug_file == NULL)
      error_exit("ERROR writing to debug.log file");
   sprintf(debug_msg, "%s %s", time_now, msg);
   fprintf(debug_file, "%s\n", debug_msg);
}

void error_retry(char* msg) {
   time_t timestamp = time(NULL);
   char error_msg[512];
   char *time_now = ctime(&timestamp);
   time_now[strlen(time_now)-1]=0;
   if (error_file == NULL)
      error_exit("ERROR writing to error.log file");
   sprintf(error_msg, "%s %s", time_now, msg);
   fprintf(error_file, "%s\n", error_msg);
}

void set_nonblock(int sock) {
   int flags;
   flags = fcntl(sock,F_GETFL,0);
   if (flags == -1)
      error_exit("ERROR no valid flags on socket");
   fcntl(sock, F_SETFL, flags | O_NONBLOCK);
}

int main(int argc, char *argv[]) {
   // Check commandline arguments
   if (argc < 2)
      error_exit("ERROR program needs config-file as parameter");

   // Try to open error log file
   if ((error_file = fopen(error_file_name, error_mode)) == NULL)
      error_exit("ERROR opening error.log file");

   // Make file unbuffered
   setbuf(error_file, NULL);

   //Read Config File
   config_file_name = argv[1];
   FILE *fp = fopen(config_file_name, config_mode);

   // Read variables
   if (fp) {
      while (fgets(line, sizeof(line), fp)) {
         sscanf(line, "Debug=%d[^\n]", &DEBUG);
         sscanf(line, "Loginterval=%d[^\n]", &log_interval);
         sscanf(line, "Waitinterval=%d[^\n]", &wait_interval);
         sscanf(line, "DBhost=%[^\n]", dbhost);
         sscanf(line, "DBname=%[^\n]", dbname);
         sscanf(line, "DBtabprefix=%[^\n]", dbtabprefix);
         sscanf(line, "DBuser=%[^\n]", dbuser);
         sscanf(line, "DBpass=%[^\n]", dbpass);
         sscanf(line, "Hostname=%[^\n]", hostaddr);
         sscanf(line, "Hostport=%d[^\n]", &portno);
         sscanf(line, "NumberOfInverters=%d[^\n]", &nr_of_maxes);
      }
   }
   fclose(fp);

   // Try to open debug log file, if necessary
   if(DEBUG) {
      if((debug_file = fopen(debug_file_name, debug_mode)) == NULL)
         error_exit("ERROR opening debug.log file");

      // Make file unbuffered
      setbuf(debug_file, NULL);
   }   

   // Try to compile regular expression
   result = regcomp(&rx, expression, REG_EXTENDED);
   if (result != 0) {
      regerror(result, &rx, expression, sizeof(expression));
      regfree(&rx);
      sprintf(buffer, "ERROR invalid regular expression: %s", expression);
      error_exit(buffer);
   }

   // Try to reserve memory for matches
   matches = (regmatch_t *) malloc((rx.re_nsub + 1) * sizeof(regmatch_t));
   if (!matches)
      error_exit("Out of memory");

   // Connect to database
   connection = mysql_init(NULL);
   if (!mysql_real_connect(connection, dbhost, dbuser, dbpass, dbname, 0, NULL, 0))
      error_exit(mysql_error(connection));

   if (DEBUG) {
      sprintf(buffer, "Connected to database %s on host %s", dbname, dbhost);
      debug_entry(buffer);
   }


  if ((fd = open(TERM_DEVICE, O_RDWR)) == -1)
   {
    perror("terminal: Can't open device " TERM_DEVICE);
    return(1);
   }
            /* RS232 konfigurieren */

  if (tcgetattr(fd, &term_attr) != 0)
   {
    perror("terminal: tcgetattr() failed");
    return(1);
   }
  term_attr.c_cflag = TERM_SPEED | CS8 | CLOCAL | CREAD;
  term_attr.c_iflag = 0;
  term_attr.c_oflag = OPOST | ONLCR;
  term_attr.c_lflag = 0;
  if (tcsetattr(fd, TCSAFLUSH, &term_attr) != 0)
    perror("terminal: tcsetattr() failed");

            /* Std.-Eingabe anpassen */

tcgetattr(STDIN_FILENO, &term_attr) ;
   
   
            /* alte Einst. sichern */

    old_flags = term_attr.c_lflag;
    term_attr.c_lflag &= ~(ICANON | ECHO);
    tcsetattr(STDIN_FILENO, TCSAFLUSH, &term_attr) ;
 
/* */


   while (1) {

      // set variable to default value or it will keep trying to reconnect
      lost_connection = 0;

      // Check if connection to db-server must be re-established
      if (mysql_ping(connection)) {

         // Connect to database
         if (!mysql_real_connect(connection, dbhost, dbuser, dbpass, dbname, 0, NULL, 0))
            error_exit(mysql_error(connection));

         if (DEBUG) {
            sprintf(buffer, "Connected to database %s on host %s", dbname, dbhost);
            debug_entry(buffer);
         }
      }

// Start sending the data requests and logging the answers
      while (1) {
/*
         // We have to get out of this while-loop to reestablish the connection to the inverter
         if (lost_connection){
                 debug_entry("Looks like we lost our connection to solarmax, reconnecting...");
                 break;
            }
             */
         // Get the current time
         time_t start_time = time(NULL);

         for(active_max = 1; active_max <= nr_of_maxes; active_max++){

            // Generate message according to device address of solarmax:
   
            // Could be something like this:
            // sprintf(message, "{FB;0%d;46|64:KDY;KMT;KYR;KT0;TNF;TKK;PAC;PRL;IL1;IDC;UL1;UDC;SYS|%s}", active_max, 16_bit_checksum
            // For further information on the protocol refer to: http://blog.dest-unreach.be/2009/04/15/solarmax-maxtalk-protocol-reverse-engineered

            // Until someone comes up with a nice solution to calculate the checksum, lets stick to a few precalculated message strings (tested only for 2 maxes!):
            if (active_max == 1) {
               message = "{FB;01;46|64:KDY;KMT;KYR;KT0;TNF;TKK;PAC;PRL;IL1;IDC;UL1;UDC;SYS|1199}";
            }
            else if (active_max == 2) {
               message = "{FB;02;46|64:KDY;KMT;KYR;KT0;TNF;TKK;PAC;PRL;IL1;IDC;UL1;UDC;SYS|119A}";
            }
            else if (active_max == 3) {
               message = "{FB;03;46|64:KDY;KMT;KYR;KT0;TNF;TKK;PAC;PRL;IL1;IDC;UL1;UDC;SYS|119B}";
            }
            else if (active_max == 4) {
               message = "{FB;04;46|64:KDY;KMT;KYR;KT0;TNF;TKK;PAC;PRL;IL1;IDC;UL1;UDC;SYS|119C}";
            }
            else if (active_max == 5) {
               message = "{FB;05;46|64:KDY;KMT;KYR;KT0;TNF;TKK;PAC;PRL;IL1;IDC;UL1;UDC;SYS|119D}";
            }
            else if (active_max == 6) {
               message = "{FB;06;46|64:KDY;KMT;KYR;KT0;TNF;TKK;PAC;PRL;IL1;IDC;UL1;UDC;SYS|119E}";
            }
            else if (active_max == 7) {
               message = "{FB;07;46|64:KDY;KMT;KYR;KT0;TNF;TKK;PAC;PRL;IL1;IDC;UL1;UDC;SYS|119F}";
            }
            else if (active_max == 8) {
               message = "{FB;08;46|64:KDY;KMT;KYR;KT0;TNF;TKK;PAC;PRL;IL1;IDC;UL1;UDC;SYS|11A0}";
            }
            else if (active_max == 9) {
               message = "{FB;09;46|64:KDY;KMT;KYR;KT0;TNF;TKK;PAC;PRL;IL1;IDC;UL1;UDC;SYS|11A1}";
            }
            else {
               error_exit("ERROR invalid hardware address; currently works only for 9 maxes");   
            }

            if (DEBUG) {
               sprintf(buffer, "Sending message: %s", message);
               debug_entry(buffer);
            }





        // Send message 1
         length = write(fd,message,strlen(message));
         if (length < 0)
            break;
         if (DEBUG)
           printf("WR= message gesendet: %s\n", message);

     // Read answer

         bzero(inbuffer, 1);
         bzero(buffer, 512);
   for (i=0; i < 512; i++)
       {
          length = read(fd, inbuffer,1);
          buffer[i]= inbuffer[0];
   if (inbuffer[0] == '}')
          {
         buffer[i+1] = '\0';
           break;
          }
   }
         if (length < 0)
            break;
         buffer[i] = '\0';
         buffer[i-1] = '\0';
         buffer[i-2] = '\0';
         buffer[i-3] = '\0';
         buffer[i-4] = '\0';
         buffer[i-5] = '\0';

        strcat(buffer, ";SYS=FFFF;");

         if (DEBUG)
            printf("Received answer: %s\n", buffer);

//  char    buffer [512] = "KDY=B;KMT=40;KYR=B9F;KT0=1154;TNF=1388;TKK=19;PAC=5C;PRL=1;IL1=54;IDC=1A;UL1=910;UDC=A2C;SYS=FFFF;";
            if (DEBUG) {
               sprintf(buffer2, "Received answer: %s", buffer);
               debug_entry(buffer2);
            }

            // Extract the data fields from answer
            result = regexec(&rx, buffer, rx.re_nsub + 1, matches, 0);
            if (result) {
               regerror(result, &rx, buffer, sizeof(buffer));
               //error_exit("ERROR no regexp match");
               error_retry("ERROR no regexp match");
               lost_connection = 1;
               break;
            }

            // Convert the extracted data fields to integer values
            temp = strndup(buffer + matches[1].rm_so, matches[1].rm_eo - matches[1].rm_so);
            kdy = strtol(temp, NULL, 16);
            free(temp);
            temp = strndup(buffer + matches[2].rm_so, matches[2].rm_eo - matches[2].rm_so);
            kmt = strtol(temp, NULL, 16);
            free(temp);
            temp = strndup(buffer + matches[3].rm_so, matches[3].rm_eo - matches[3].rm_so);
            kyr = strtol(temp, NULL, 16);
            free(temp);
            temp = strndup(buffer + matches[4].rm_so, matches[4].rm_eo - matches[4].rm_so);
            kt0 = strtol(temp, NULL, 16);
            free(temp);
            temp = strndup(buffer + matches[5].rm_so, matches[5].rm_eo - matches[5].rm_so);
            tnf = strtol(temp, NULL, 16);
            free(temp);
            temp = strndup(buffer + matches[6].rm_so, matches[6].rm_eo - matches[6].rm_so);
            tkk = strtol(temp, NULL, 16);
            free(temp);
            temp = strndup(buffer + matches[7].rm_so, matches[7].rm_eo - matches[7].rm_so);
            pac = strtol(temp, NULL, 16) /2 ;
            free(temp);
            temp = strndup(buffer + matches[8].rm_so, matches[8].rm_eo - matches[8].rm_so);
            prl = strtol(temp, NULL, 16);
            free(temp);
            temp = strndup(buffer + matches[9].rm_so, matches[9].rm_eo - matches[9].rm_so);
            il1 = strtol(temp, NULL, 16);
            free(temp);
            temp = strndup(buffer + matches[10].rm_so, matches[10].rm_eo - matches[10].rm_so);
            idc = strtol(temp, NULL, 16);
            free(temp);
            temp = strndup(buffer + matches[11].rm_so, matches[11].rm_eo - matches[11].rm_so);
            ul1 = strtol(temp, NULL, 16);
            free(temp);
            temp = strndup(buffer + matches[12].rm_so, matches[12].rm_eo - matches[12].rm_so);
            udc = strtol(temp, NULL, 16);
            free(temp);
            temp = strndup(buffer + matches[13].rm_so, matches[13].rm_eo - matches[13].rm_so);
            sys = strtol(temp, NULL, 16);
            free(temp);

            // Construct the query according to active solarmax
            sprintf(query, "INSERT INTO %s%d (kdy, kmt, kyr, kt0, tnf, tkk, pac, prl, il1, idc, ul1, udc, sys) VALUES (%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d);", dbtabprefix, active_max, kdy, kmt, kyr, kt0, tnf, tkk, pac, prl, il1, idc, ul1, udc, sys);

            if (DEBUG) {
               sprintf(buffer, "Executing query: %s", query);
               debug_entry(buffer);
            }

            // Execute the query to write the data into db
            mysql_query(connection, query);
            if (mysql_errno(connection))
               error_exit(mysql_error(connection));
         }

         // Get the current time
         time_t stop_time = time(NULL);

         // Wait for the specified number of seconds - calc duration - 1
            if (DEBUG)
               debug_entry("Waiting for about 1 minute ...");
            sleep(log_interval + start_time - stop_time -1 );

            // Add a busy-loop for the last second to make sure we are perfectly accurate
            while (time(NULL) < start_time + log_interval) usleep(99999);
         }
      }
   return 0;
}

dazu die Konfigurationsdatei:

Code:
    # Settings for the Solarmax Watcher
    # defaults are shown in parentheses

    ## Global settings of the logger

    # Debug? (0)
    Debug=1

    # Interval to read the values of the inverter (60)
    Loginterval=60

    # Interval to wait for inverters answer (200)
    Waitinterval=200


    ## MySQL settings

    # Hostname which is running the MySQL server (localhost)
    DBhost=localhost

    # Name of the MySQL DB for the Solarmax logger (solarmax)
    DBname=solarmax

    # Tablename prefix (log)
    DBtabprefix=log

    # DB user to write the values solarmax-DB (solaruser)
    DBuser=solaruser

    # Password for the DB user (userpassword)
    DBpass=userpassword


    ## Inverter settings

    # IP-address or hostname of the inverter connected to the LAN (192.168.178.35)
    Hostname=192.168.178.35

    # IP-Port of the inverter (12345)
    Hostport=12345

    # Number of Solarmax inverters in your array (1)
    NumberOfInverters=1

Der Visualizer und der Logger über die Ethernetschnittstelle sind hier beschrieben:

http://www.photovoltaikforum.com/datenlogger-f5/solarmax-datenlogger-t52179.html

Mein Plan ist nun, den Logger so zu verändern, damit er die Delta - Wechselrichter loggen kann.

Die Deltas sind ebenfalls über die RS 485 er Schnittstelle ansprechbar.

Sie geben ihre Daten aber nicht wie die Solarmaxe in einem String heraus, sondern nur einzeln. Dazu muss man pro Wert ein Kommando an den Wechselrichter schicken.

Dies muss man für die 12 oder 13 Werte machen und sie dann zu einem String zusammenfügen, den man dann analog zu zagibus Logger der Mysql - Datenbank übergibt.

Ich weis allerdings noch nicht recht wie ich die Daten konvertieren kann und werde dann wahrscheinlich den Rat der Experten brauchen. Darum bitte ich, der Thread nicht vorzeitig wegen o.T. abzuwürgen.
 
Zuletzt bearbeitet:
Logger für Delta- Wechselrichter

Hier der Logger, der bei mir 3 Delta- Wechselrichter loggt.

http://www.photovoltaikforum.com/datenlogger-f5/delta-datenlogger-auf-dockstar-t67000.html

Er funktioniert auf der Fritzbox auch, halt nur etwas langsam.

Ich habe nun das Problem, daß wenn ich ihn über Port 90 laufen lassen will, ihn nicht angezeigt bekomme.

Ich habe

1. in der etc/apache2/ports.conf Listen von 80 auf 90 gesetzt
und
2. in der Fritzbox eine Portfreigabe 90 nach 90 gesetzt.

Die entsprechende Zeile sieht so aus:
Aktiv Bezeichnung Protokoll Port an Computer an Port
Haken HTTP-Server TCP 90 debian(2) 90

Wenn ich

http://erwinruhl.dyndns.info:90/solarertrag.php?wr=1
eingebe,
bekomme ich:

Not Found

The requested URL /solarertrag.php was not found on this server.
Apache/2.2.16 (Debian) Server at erwinruhl.dyndns.info Port 90

Wenn ich die IP eingebe, das gleiche Ergebnis:

http://192.168.178.33:90/solarertrag.php?wr=1

Ich hatte es mit dem Solarmax- Logger schon mal über Port 90 laufen.
Jetzt will es nicht mehr.
 
2. in der Fritzbox eine Portfreigabe 90 nach 90 gesetzt.
Auf Port 90 wird aber nicht gelauscht:
Code:
# nmap -sS erwinruhl.dyndns.info -p90

Starting Nmap 5.00 ( http://nmap.org ) at 2011-08-27 21:33 CEST
Interesting ports on p57AFA7C7.dip.t-dialin.net (87.175.167.199):
PORT   STATE    SERVICE
[COLOR=red]90/tcp filtered dnsix[/COLOR]

Nmap done: 1 IP address (1 host up) scanned in 0.88 seconds
 
Danke sf3978,
Ich hab nochmal nachgelesen in der /etc/apache2/ports.conf.
Dann hab ich den Port auch in der /etc/apache2/sites-enabled/000-default geändert.

jetzt gehts.
 
Der Logger für meine Delta und Solarmax- Wechselrichter funktioniert ohne Probleme.
Für die Hilfe durch dieses Forum danke ich recht herzlich.

Ich habe ja auch eine USB- Webcamera über die Dockstar laufen.

Geht auch einwandfrei.

Jetzt fragt mich mein Mieter, er hätte gerne drei Überwachungskameras und die Bilder auf einer USB- Platte aufgezeichnet.

Weis da vielleicht wer eine Anleitung, wie man das realisieren kann?

Man müsste halt die Bilder, die von der Kamera kommen im Sekundentakt speichern.

Vielleicht kann mir jemand eine Anregung geben, wie das zu machen wäre.

Die Webcam hab ich nach dieser Anleitung gemacht:

http://streamboard.gmc.to/wiki/Seagate_Dockstar#Zusatz-Pakete_installieren
 
Da geht es um Cams?
 
Webcam? Oscam? Ist doch alle das gleiche... :mrgreen:

Gruß
Oliver
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.