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

USB- Schnittstelle

Das Kompilieren hat ja jetzt funktioniert.

Ich kann den Sollog auch aufrufen. Aber er kennt die USB- Schnittstelle nicht.

Auf dem PC funktioniert die Com- Schnittstelle. Wenn ich aber die USB- Schnittstelle kompiliere, bricht er nach dem Starten des Sollog ab. Also nicht nur auf der Fritzbox.

Was mach ich falsch? Hatte gedacht , ich brauch nur statt "/dev/ttyS0" nur "/dev/ttyUSB0"
eintragen.

Code:
terminal: Can't open device /dev/ttyUSB0: No such file or directory

Code:
+# define TERM_DEVICE "/dev/ttyUSB0"    /* = USB */
+# define TERM_SPEED B1200        /* Bit/Sek */

Mein Plan ist, den Wechselrichter über einen 485/USB- Wandler und einen Hub (wegen den Speicherstick) an die Fritzbox anzuschliessen. Muss ich da noch was beachten?
Das pl2303 hab ich bei modules eingetragen.
Das USB- Root lässt sich mit den Standarteinstellungen auch nicht aktivieren.
Ich weis nicht was ich bei Mount Optionen: ro,noatime,nodiratime einstellen soll.
Die ausgelagerten Programme funktionieren ja (rrdstats jedenfalls)

Es ist allerdings so, daß ich die ausgelagerten Dateien nach einem Reboot neu laden muss.
Ich hab noch einen 2. Ordner mit 2 testprogrammen auf dem Stick. Den kann ich mit FTP immer sehen. Der Freetz- Ordner geht verloren.
 
Zuletzt bearbeitet:
...
Was mach ich falsch? Hatte gedacht , ich brauch nur statt "/dev/ttyS0" nur "/dev/ttyUSB0"
eintragen.

Code:
terminal: Can't open device /dev/ttyUSB0: No such file or directory

Code:
+# define TERM_DEVICE "/dev/ttyUSB0"    /* = USB */
+# define TERM_SPEED B1200        /* Bit/Sek */
...

Siehe hier: >>> klick <<<
 
Danke für den Link!

Mein Programm für den Würth kann ich leider nicht so verwenden. Ich habe den Wechselrichter nun über einen intakten 485/USB- Wandler angeschlossen und er meldet sich als "Solarmax C6000"
Ich kann also das Protokoll für den Solarmax anwenden. Er hat allerdings keine Ehernet, sondern nur eine 485-er Schnittstelle.

Ich hab nun ein kleines Programm, mit dem ich einen String absenden kann und dann die Antwort des WR lesen kann. Leider funktioniert es nicht richtig. Es liest zuerst nur 8 Zeichen ein und dann den Rest. Ich kann im Inet nichts passendes finden, was mein Problem lösen würde, darum frag ich hier mal, ob jemand was entdecken kann.

Der Wr schickt einen String mit 120 Zeichen zurück:
Code:
{05;FB;59|64:CAC=1F3E;KHR=26D6;KDY=8E;KMT=8D;KYR=221;KT0=18C7;KLD=78;KLM=F8;KYR=221;KT0=18C7;KLD=78;KLM=F8;KLY=A8F|154C}

Ich simuliere es mit einem 2. PC und einem Terminal-programm.

Code:
sending message: {FB;01;46|64:KDY;KMT;KYR;KT0;TNF;TKK;PAC;PRL;IL1;IDC;UL1;UDC;SYS|1199}
WR= 1 message gesendet: {FB;01;46|64:KDY;KMT;KYR;KT0;TNF;TKK;PAC;PRL;IL1;IDC;UL1;UDC;SYS|1199}
received answer/length: {05;FB;5,[COLOR="Red"]8[/COLOR]
Time;Daten =1289374562;{05;FB;5;
sending message: {FB;01;46|64:KDY;KMT;KYR;KT0;TNF;TKK;PAC;PRL;IL1;IDC;UL1;UDC;SYS|1199}
WR= 1 message gesendet: {FB;01;46|64:KDY;KMT;KYR;KT0;TNF;TKK;PAC;PRL;IL1;IDC;UL1;UDC;SYS|1199}
received answer/length: 9|64:CAC=1F3E;KHR=26D6;KDY=8E;KMT=8D;KYR=221;KT0=18C7;KLD=78;KLM=F8;KYR=221;KT0=18C7;KLD=78;KLM=F8;KLY=A8F|154C},[COLOR="Red"]112[/COLOR]
Time;Daten =1289374564;9|64:CAC=1F3E;KHR=26D6;KDY=8E;KMT=8D;KYR=221;KT0=18C7;KLD=78;KLM=F8;KYR=221;KT0=18C7;KLD=78;KLM=F8;KLY=A8F|154C};
sending message: {FB;01;46|64:KDY;KMT;KYR;KT0;TNF;TKK;PAC;PRL;IL1;IDC;UL1;UDC;SYS|1199}
WR= 1 message gesendet: {FB;01;46|64:KDY;KMT;KYR;KT0;TNF;TKK;PAC;PRL;IL1;IDC;UL1;UDC;SYS|1199}

Ich hab es jetzt so gemacht, daß er immer nur ein Zeichen liest und ich es dann zu einem String zusammenfüge.
Aber der WR gibt noch keine Antwort...... muss das noch testen.

..... hat jetzt funktioniert. Der WR hat keine Handshake- Signale.
Habe die Funktion weggelassen und jetzt gehts.
 
Zuletzt bearbeitet:
Das Auslesen der Daten mit meinem Ubuntu- PC funktioniert ja jetzt. :)
Jetzt stellt sich mir die Frage wie ich die Daten speichern soll.
Momentan schreibe ich die Daten in ein File.
Der Zaglibu macht es ja bei seinem neueren Logger mit einer Mysql- Datenbank.
Ist das Verfahren für die Box auch praktikabel?
Und wie stelle ich die Werte dar? Das Einfachste wäre wohl Excel.
Aber im Inet wird es wohl mit einem Webserver gemacht. Ist da die Lösung von Zaglibu auch auf der Box möglich und zu empfehlen?

Was brauch ich für Komponenten, um das auf der Box darzustellen?
 
..,
Momentan schreibe ich die Daten in ein File.
...
Wo befindet sich das File? Auf der Box oder auf einem externen Datenträger, der mit der Box verbunden ist? Die Box ist zu schwach für mysql.
 
Ich bin erst mal happy, daß ich den WR mit dem PC auslesen kann.
Die Fritzbox muss ich noch ausprobieren.
Es wird dann schon so sein, daß sich das Programm und das File sich auf einem USB- Stick befinden.
Daß es mit mysql wohl nicht gehen wird, hab ich auch schon mal wo gelesen.
Dann stellt sich noch die Frage, wie ich die Daten in dem File speichere.
Momentan ist es noch so, daß die Zeit in einer Zahl, die ab 1970 zählt, gespeichert wird. Es wäre m. E. besser,sie in eine lesbare Form zu bringen.
Die Messwerte werden noch in hexadezimal geschrieben. Da wäre dezimal vielleicht auch besser. Weis noch nicht, was ich machen soll. :confused:
 
Wahrscheinlich ließe sich das rrdstats-Paket um eine Funktion für den Solarlogger erweitern.

Gruß
Oliver
 
Ich bin erst mal happy, daß ich den WR mit dem PC auslesen kann.
Die Fritzbox muss ich noch ausprobieren.
Ja, sonst ist es hier zu sehr OT.;)

Momentan ist es noch so, daß die Zeit in einer Zahl, die ab 1970 zählt, gespeichert wird. Es wäre m. E. besser,sie in eine lesbare Form zu bringen.
Die Messwerte werden noch in hexadezimal geschrieben. Da wäre dezimal vielleicht auch besser. Weis noch nicht, was ich machen soll. :confused:
Entsprechende Stellen im Quelltext ändern (patchen).
 
Es funktioniert jetzt auch auf der Box

Ich hatte erst die Treiber pl2303 und ftdi_sio in die Abteilung für Module geschrieben. Freetz hatte sie aber nicht gestartet. Dann hab ich sie mit
modprobe pl2303,
modprobe ftdi_sio
und dann mit
modprobe ftdi_sio vendor=0x0403 product=0xe0efin der Konsole gestartet, dann gings. (die Nummern anpassen) .
Ich hab ja Dateien im Freetz auf den USB- Stick ausgelagert. Ich kann sie aber wenn ich den Stick an den PC stecke nicht finden.
 
...
Ich hab ja Dateien im Freetz auf den USB- Stick ausgelagert. Ich kann sie aber wenn ich den Stick an den PC stecke nicht finden.
Kannst Du die Dateien nicht per ssh, ftp, etc., vom Stick an der Box, auf den PC kopieren?
 
Ja, sf3978,
ich hab die Dateien im Explorer und kann sie kopieren.
Ich bin momentan dabei , die Daten dezimal aufzeichnen zu können.
Dann werd ich die Box ausprobieren und Daten sammeln.:D
Wie werden Die Daten eigentlich bei RRDstats aufgezeichnet?
Muss mich noch mehr damit beschäftigen....
Wie lege ich eigentlich die Treiber in Modules ordnungsgemäß ab, damit sie auch starten?
Ich hab das momentan so gemacht:
Code:
pl2303, 
ftdi_sio options vendor=0x067b product=0x2303
Aber ich weis nicht ob das stimmt.
Und wie starte und beende ich den Logger mit cron?
 
Man munkelt dass im Wiki dazu was stehen soll. Wenn du den Trunk nutzt kommst du mit "Hilfe" gleich auf die passende Seite
 
Hab jetzt mein Programm auf einer Box laufen. Muss noch beobachten. Ich kann das Programm im Explorer auf dem Stick sehen. Nur das Datenfile find ich nicht.

Die Daten werden jetzt mit lesbarer Zeit und Dezimalzahlen durch ";" getrennt aufgezeichnet, sofern es das Programm macht.:confused:

Auf dem PC hat es ein File im selben Ordner erstellt und geschrieben. Seltsam, daß ich auf dem Stick nichts finde.
 
Wenn ich in der Konsole ls eingebe, wird mir das File angezeigt:
Code:
root@fritz:/var/mod/root# ls
DateiW?rth1

In meinem Programm sieht die Stelle so aus:
Code:
   		  fprintf(file, "\n%s",text);

Wo liegt nun das File?
Was kann ich machen, daß es auf dem Stick abgelegt wird?

hab jetzt mit
Code:
 cp -r DateiW?rth1 /var/media/ftp/uStor01/external
kopiert und kann nun im PC bearbeiten.
 
Zuletzt bearbeitet:
...
In meinem Programm sieht die Stelle so aus:
Code:
   		  fprintf(file, "\n%s",text);

Wo liegt nun das File?
Was kann ich machen, daß es auf dem Stick abgelegt wird?
...
Schau mal ob Du in deinem Quelltext diese Einträge findest:
Code:
 // Get log file path from command line argument
   [COLOR="Red"]file_name[/COLOR] = argv[[COLOR="Red"]1[/COLOR]];

   // Get log interval from command line argument
   log_interval = atoi(argv[2]);

   // Try to open log file
   if (([COLOR="Blue"]file[/COLOR] = fopen([COLOR="Red"]file_name[/COLOR], mode)) == NULL)
Das Verzeichnis "/var/media/ftp/uStor01/external" sollte nur für die Externalisierung von Anwenungen benutzt werden.
 
Danke für den Hinweis, funktioniert.
Muss dann einen Ordner anlegen für die Daten.

Als Nächstes muss ich schaun, wie ich es automatisch um 5.00 Uhr starten und um 22.00 stoppen kann.

Die Daten werden so aufgezeichnet:
Code:
Sun;Nov;21;08:53:03;2010;KDY;KMT;KYR;KT0;TNF;TKK;PAC;PRL;IL1;IDC;UL1;UDC;
KDY = Energie Tag
TNF = Netzfrequenz
TKK = Temperatur WR
PRL = rel. Leistung

Habe heute das erste Diagramm mit Excel gemacht, gefällt mir gut.

Wo kann man etwas über die Einbindung / Datenformat / Speicherung von rrdstats lesen?

Oder die Darstellung in einem Webserfer? Ich glaub das geht mit PHP- Code.
Aber genaues weis ich nicht. Und ob es auf der Box geht? Und wie mach ich es am besten? .... Fragen über Fragen....

Ich hab mal den Start und Stop in die crontab eingetragen. Das Beenden geht.
Aber starten will er nicht. Sind die Argumente path/to/logfile und Wartezeit nicht möglich?
Code:
00 22 * * * killall sollog
42 * * * * sollog /var/media/ftp/Generic-FlashDisk-01/DateiWürth3 10
 
Zuletzt bearbeitet:
Ich habe es jetzt mit einem sollog ohne Argumente getestet, es will einfach nicht starten.
Muss ich da vielleicht einen Tag warten? Wohl nicht.
Ich kann es in der Konsole problemlos starten. Wenn ich die Konsole wegklicke, wird auch der sollog beendet.
Ich probier schon den ganzen Vormittag und komm nicht weiter. :mad:
Code:
00 22 * * * killall sollog
20 * * * * /var/media/ftp/uStor01/external/sollog
21 * * * * /var/media/ftp/uStor01/external/sollog
22 * * * * sollog
 
...
Ich kann es in der Konsole problemlos starten. Wenn ich die Konsole wegklicke, wird auch der sollog beendet.
...
Versuch mal sollog im Hintergrund zu starten:
Code:
sollog /var/media/ftp/uStor01/external/sollog 10 [B][COLOR="Red"]&[/COLOR][/B]
Oder mit nohup.
 
Ich hab es jetzt mal mit dem Programm auf dem Ubuntu- PC versucht.

Gleiches Verhalten.

Beenden kann ich , starten nicht.
Es muss also am Programm liegen. Hier mal der Code:
Code:
/*
 Compile with:
 gcc -W -Wall -Wextra -Wshadow -Wlong-long -Wformat -Wpointer-arith -rdynamic -pedantic-errors -std=c99 -o sollog sollog.c -lmysqlclient

Datenformat:
Sun;Nov;21;08:53:03;2010;KDY;KMT;KYR;KT0;TNF;TKK;PAC;PRL;IL1;IDC;UL1;UDC;
   Run with: ./sollog path/to/Filename sec.
*/
#define _GNU_SOURCE
#define DEBUG 0
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <sys/select.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 <regex.h>
#include <time.h>
# define TERM_DEVICE "/dev/ttyUSB0"    /* = COM1 / USB */
# define TERM_SPEED B19200        /* Bit/Sek */

void error(const char* msg)
{
   perror(msg);
   exit(0);
}

int main(int argc, char *argv[])
 {
  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[256]={0};
//  char	outbuffer[256] = {"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;
   // Check commandline arguments
  if (argc < 3)
      error("ERROR program needs  logfile and loginterval (in seconds) as parameters");

   // Get log file path from command line argument
   file_name = argv[1];

   // Get log interval from command line argument
   log_interval = atoi(argv[2]);

   // Try to open log file
   if ((file = fopen(file_name, mode)) == NULL)
      error("ERROR opening log file");

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

  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 */
  if (tcgetattr(STDIN_FILENO, &term_attr) != 0)
   {
    perror("terminal: tcgetattr() failed");
    return(1);
   }
            /* alte Einst. sichern */
  old_flags = term_attr.c_lflag;
  term_attr.c_lflag &= ~(ICANON | ECHO);
  if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &term_attr) != 0)
    perror("terminal: tcsetattr() failed");

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

     // Read answer
         bzero(inbuffer, 1);
         bzero(outbuffer, 255);
	for (i=0; i < 255; i++)
       {
           length = read(fd, inbuffer,1);
          if (DEBUG)
          outbuffer[i]= inbuffer[0];
	if (inbuffer[0] == '}')
	break;
	}
         if (length < 0)
            break;

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

 // Write the current timestamp to file
    t = time(NULL);
    ts = localtime(&t);
 //   fprintf(file,"%s", asctime(ts));
      strcpy(text, asctime(ts));
	text[3] = ';';
	text[7] = ';';
	text[10] = ';';
	text[19] = ';';
	text[24] = ';';
         if (DEBUG)
           printf( "Time =%s\n",text);
   		  fprintf(file, "\n%s",text);
// Umwandlung in dezimal
	PACcount = 0;	
	for (i=0; i < 255; i++)
       {
 	 if (outbuffer[i] == '=')
		{
		for (j=1; j < 8; ++j)
			{
		if ((outbuffer[i+j] == ';')||(outbuffer[i+j] == '|')) {
		if (j==2){
			integerout2 =integerout1[0];
			break;
				}
		if (j==3){
		integerout2 =integerout1[1]+ (integerout1[0]*16);
			break;
				}
		if (j==4){
		integerout2 =integerout1[2]+ (integerout1[1]*16)+ (integerout1[0]*256);
			break;
				}
		if (j==5){
		integerout2 =integerout1[3]+ (integerout1[2]*16)+ (integerout1[1]*256)+ (integerout1[0]*4096);	
			break;
				}
		if (j==6){
		integerout2 =integerout1[4]+ (integerout1[3]*16)+ (integerout1[2]*256)+ (integerout1[1]*4096)+ (integerout1[0]*65536);
			break;
				}
			}
			integer =  outbuffer[i+j]; 
//		     printf("integer: %d\n", integer);
			if (integer > 57)
			integerout = integer -55;
			if (integer < 58)
			integerout = integer -48;
			integerout1[j-1] = integerout;
			}
        // Write the answer data to file
			PACcount = PACcount + 1;
			if (PACcount ==7)
			integerout2 = integerout2 / 2;
		         if (DEBUG)
		     printf(">>>Data=: %d",integerout2);

    		  fprintf(file, "%d;",integerout2);	
		}	
	}
          // Wait for the specified number of seconds
         sleep(log_interval);
   }
            /* Std.-Eingabe wie vorher */
  term_attr.c_lflag = old_flags;
  if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &term_attr) != 0)
    perror("terminal: tcsetattr() failed");
  printf("Aborted.\n");
  close(fd);
  return(0);
 }
Ich denke, es müsste mit der Terminal / ttyUSB0 / RS 232 - initialisierung zu tun haben.

Hier ist der Fehler:
/* Std.-Eingabe anpassen *//* hier ist der Fehler
if (tcgetattr(STDIN_FILENO, &term_attr) != 0)
{
perror("terminal: tcgetattr() failed");
return(1);
}

Fragt sich nun, ob ich den Teil weglassen kann oder nicht.
 
Zuletzt bearbeitet:

Neueste Beiträge

Statistik des Forums

Themen
244,881
Beiträge
2,220,085
Mitglieder
371,611
Neuestes Mitglied
Mandylion73
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.

IPPF im Überblick

Neueste Beiträge