Benutzer-Werkzeuge

Webseiten-Werkzeuge


hardware:channels:meters:power:edl-ehz:siemens_td3511

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
hardware:channels:meters:power:edl-ehz:siemens_td3511 [2015/11/05 20:14] – [Siemens TD-3511] udo1hardware:channels:meters:power:edl-ehz:siemens_td3511 [2023/05/29 13:51] (aktuell) – korrektur Tippfehler gregor.wolf
Zeile 1: Zeile 1:
-===== Siemens TD-3511 ===== +====== Siemens TD-3511 ====== 
-{{ :hardware:channels:meters:power:siemens:td-3511.png?300|TD-3511}} +{{ :hardware:channels:meters:power:siemens:td-3511.png?200|TD-3511}} 
-Bei der Installation einer Solaranlage haben die Stadtwerke bei mir Zähler TD-3511 von Siemens installiert. Es handelt sich um Zweirichtungszähler mit IR-Schnittstelle. Der Zähler besitzt auch noch einen frei zugänglichen Steckplatz für einen M-Bus Adapter, der allerdings hier nicht weiter betrachtet wird.\\+Beim TD-3511 von Siemens  handelt sich um Zweirichtungszähler mit IR-Schnittstelle. Der Zähler besitzt auch noch einen frei zugänglichen Steckplatz für einen M-Bus Adapter.\\ 
 +<note important>User in Oberösterreich nutzen diese Anleitung:\\ [[/hardware/channels/meters/power/edl-ehz/siemens_td3511_in_oberoesterreich|Siemens TD-3511 in Oberösterreich]]\\ 
 +</note>
  
-<note important>User in Oberösterreich müssen sich neuerdings beim Energielieferanten registrieren:\\ 
-http://strom.netzgmbh.at/eag_at/page/284094835607631929_0_1060376991645160446,de.html \\ 
-um den Zähler per IR-Schnittstelle auslzulesen.\\ 
-vzlogger ist in der Lage diese Zähler auszulesen. Der notwendige AES-Schlüssel muss beim Netzbetreiber beantragt werden.\\ 
-Siehe auch den Thread im [[http://www.photovoltaikforum.com/volkszaehler-org-f131/siemens-td-3511-auslesen-t107784-s30.html|Photovoltaikforum]] </note> 
 ===== Hardware ===== ===== Hardware =====
-Man benötigt den [[hardware:controllers:ir-schreib-lesekopf|IR-Schreib-Lese-Kopf]], da der Zähler erst angesprochen werden muss, bevor er sendet.+Gelesen werden kann mittels [[hardware:controllers:ir-schreib-lesekopf|IR-Schreib-Lese-Kopf]] bei [[hardware:controllers:ir-schreib-lesekopf#grundlagen|300bd 7E1]], das Zuleitungskabel geht nach unten weg.\\
  
-Die linke der beiden Punkte im Bereich des Lesekopfes ist der EmpfängerRechts ist die IR-Sendediode des ZählersWenn man den [[hardware:controllers:ir-schreib-lesekopf-usb-ausgang|USB-IR-Schreib-Lesekopf]] wie im Wiki beschrieben nimmt, geht das USB-Kabel nach unten weg.+===== Kommunikation ===== 
 +Die Datenübertragung erfolgt gemäß Hersteller-Anleitung per IEC 62056-21 in Mode "C".\\ 
 +Das im vzlogger zu konfigurierende Protokoll ist "d0".\\ 
 +Der Zähler arbeitet im Pull-Modus, d.h. er sendet die Daten erst nach Anforderung.
  
-Wahrscheinlich funktionieren auch die Befehle des [[hardware:channels:meters:power:edl-ehz:elster_AS1440]]. Die Umschaltung der Geschwindigkeit auf 19200bps funktioniert auf jeden Fallsiehe die "reine PHP-Lösung" unten.+<note important>Die initiale Kommunikation muss mit einer baudrate 300Bit/s erfolgenerst nach dem vom Zähler gesendeten Identifikationstelegramm kann per Quittierungs-/Optionsauswahltelegramm auf eine höhere Baudrate umgestellt werden.</note>
  
-===== Test #1 ===== +----
-Zum Testen habe ich [[http://www.der-hammer.info/terminal/|hterm]] verwendet.\\ +
-Einzustellen sind:\\ +
-Port: bei Windows:verwendeter COM-Anschluss des USB-Adapters, bei Linux z.B. /dev/ttyUSB0\\ +
-Baud: 300\\ +
-Data: 7\\ +
-Stop: 1\\ +
-Parity: Even\\ +
-Bei "input control": Send on Enter auf "CR-LF"\\ +
-Auf "Connect" klicken, dann im Eingabefeld "/?!" (ohne Anführungszeichen) eingeben und Enter drücken. Dann sollte der Zähler sofort mit seiner Seriennummer antworten. Nach 2-3 Sekunden fängt der Zähler dann an, Daten auszugeben.+
  
-===== Test #2 ===== +Der Zähler erwartet die Initialisierungssequenz 
-Das folgende Perlscript automatisiert die manuelle Bearbeitung des Zählers mit hterm. +<code>/?!\r\n (hex 2F 3F 21 0D 0A)</code> 
-<code> +und antwortet mit seinem Identifikationstelegramm.
-#!/usr/bin/perl+
  
-+Nach der an den Zähler gesendeten Startsequenz ("Optionsauswahltelegramm") "ACK 0 Z 0 CR LF" 
-(m)ein Stromzähler mit IR-Schnittstelle blubbert nach einem "Anforderung- +<code> ACK0<Z><Y>\r\n (hex 06 30 zz yy 0D 0A)</code> 
-# telegramm" Daten raus. Das Telegramm ist mit 300 Baud, 7 Bit, 1 Stoppbit +sendet er bei Option "Y" = 0 ("Daten auslesen") die Daten in der mit "Z" ausgewählten Baudrate.\\ 
-# und gerader Parität zu sendenDas ist der Initialmodus von Geräten, +Beispiel: "ACK050\r\n" (hex 06 30 35 30 0D 0A) --> Daten werden vom Zähler mit 9.600Bit/s gesendet.
-# die das Protokoll IEC 62056-21 implementieren. +
-+
-# Autor: Andreas Schulze +
-# Bugfix: Eric Schanze +
-# Datum: 20120302 +
-#+
  
-my $PORT='/dev/ttyUSB0'; 
-my $anforderungstelegramm = "\n/?!\r\n"; 
  
-use warnings; +Ausschnitt aus der Hersteller-Anleitung (s. Quellen - Benutzerhandbuch (Siemens AG Österreich)): 
-use strict; +>Folgende Bitraten in Abhängigkeit des Wertes des Zeichens "Z" sind im Mode "C" definiert: 
-use utf8; +><code> 
-use Device::SerialPort;+Code Übertragungsrate 
 +0      300 Bit/s 
 +1      600 Bit/s 
 +2    1.200 Bit/s 
 +3    2.400 Bit/s 
 +4    4.800 Bit/s 
 +5    9.600 Bit/s 
 +6   19.200 Bit/s 
 +9  115.200 Bit/s 
 +</code> 
 +>Der Zähler meldet sich aus Kompatibilitätsgründen mit der normkonformen Baudratenkennung "6". Eine maximal mögliche Baudrate von 115.200 Bd wird unterstützt.
  
-my $tty = new Device::SerialPort($PORT) || die "can't open $PORT: $!"; +----
-$tty->baudrate(300)      || die 'fail setting baudrate'; +
-$tty->databits(7)        || die 'fail setting databits'; +
-$tty->stopbits(1)        || die 'fail setting stopbits'; +
-$tty->parity("even"    || die 'fail setting parity'; +
-$tty->write_settings     || die 'fail write settings'; +
-#$tty->debug(1);+
  
-my $num_out = $tty->write($anforderungstelegramm); +Wahrscheinlich funktionieren auch die Befehle des [[hardware:channels:meters:power:edl-ehz:elster_AS1440]]. Die Umschaltung der Geschwindigkeit auf 19200bps funktioniert auf jeden Fall, dazu die Startsequenz verwenden: 
-die "write failed\n" unless ($num_out); +<code>\x06060\r\n</code>
-die "write inclomplete\n" unless ($num_out == length($anforderungstelegramm)); +
-print "$num_out Bytes written\n";+
  
-my ($num_read, $s); +---- 
-$tty->read_const_time(10); +<note tip>Je nach Messstellenbetreiber kann auch eine niedrigere, als die vom Hersteller angegebene, maximal mögliche Baudrate parametriert sein.\\ 
-while(1) { +Falls die Kommunikation bei einer höheren Baudrate nicht funktioniertsollte in der Startsequenz manuell die niedrigste Baudrate von 300Bit/eingestellt werden (automatische Erkennung deaktivieren).</note>
-  ($num_read$s) = $tty->read(1); +
-  print $s if $s; +
-}+
  
-$tty->close || die "can't close $PORT$!";+ 
 +---- 
 + 
 + 
 +===== Beispielkonfiguration ===== 
 +<note tip>Im Gegensatz zu anderen Zählern müssen beim TD-3511 die OBIS-Kennzahlen in der Form "C.D.E" (Bsp1.7.0) und nicht in der Form "A-B:C.D.E" (Bsp: 1-1:1.7.0) eingetragen werden. 
 +</note> 
 + 
 + 
 +<code base vzlogger.conf> 
 +
 +  "verbosity": 10, 
 +  "log": "/var/log/vzlogger/vzlogger.log", 
 +  "retry": 30, 
 +  "local":
 +    "enabled": false, 
 +    "port": 8081, 
 +    "index": true, 
 +    "timeout": 0, 
 +    "buffer": -1 
 +  }, 
 +  "meters":
 +    { 
 +      "enabled": true, 
 +      "allowskip": false, 
 +      "protocol": "d0", 
 +      "device": "/dev/ttyAMA0", 
 +      "aggtime": -1, 
 +      "interval": 10, 
 +      "pullseq": "2F3F210D0A",        // "/?!\r\n" = 2F 3F 21 0D 0A 
 +      "ackseq": "063034300D0A",       //needs to be in accordance to parameter 'baudrate_read' 
 +                                      //"auto" for auto detection 
 +      "baudrate": 300, 
 +      "baudrate_read": 4800, 
 +      "baudrate_change_delay": 300, 
 +      "parity": "7e1", 
 +      "use_local_time": false, 
 +      "read_timeout": 10,             //?? 2200ms according to manual? 
 +      "dump_file": "/home/pi/D0_pullSeq.txt", 
 +      "channels":
 +        { 
 +          "identifier": "1.7.0",      //Positive active instantaneous power (A+) [kW] 
 +          "uuid": "00000000-0000-0000-0000-000000000000", 
 +          "api": "influxdb", 
 +          "host": "http://localhost:8086", 
 +          "database": "vzlogger", 
 +          "measurement_name": "vz_measurement", 
 +          "duplicates": 600, 
 +          "username": "<username>", 
 +          "password": "<password>" 
 +        }, { 
 +          "identifier": "1.8.1",      //Positive active energy (A+) in tariff T1 [kWh] 
 +          "uuid": "00000000-0000-0000-0000-000000000000", 
 +          "api": "influxdb", 
 +          "host": "http://localhost:8086", 
 +          "database": "vzlogger", 
 +          "measurement_name": "vz_measurement", 
 +          "duplicates": 600, 
 +          "username": "<username>", 
 +          "password": "<password>" 
 +        }, { 
 +          "identifier": "2.8.1",      //Negative active energy (A+) in tariff T1 [kWh] 
 +          "uuid": "00000000-0000-0000-0000-000000000000", 
 +          "api": "influxdb", 
 +          "host": "http://localhost:8086", 
 +          "database": "vzlogger", 
 +          "measurement_name": "vz_measurement", 
 +          "duplicates": 600, 
 +          "username": "<username>", 
 +          "password": "<password>" 
 +        } 
 +      ] 
 +    } 
 +  ] 
 +}
 </code> </code>
  
  
-===== Test #3 ===== +---- 
-Das folgende C Programm kann alle Daten mit dem [[hardware:controllers:ir-schreib-lesekopf-usb-ausgang|USB-IR-Schreib-Lesekopf]] empfangen und in eine MYSQL-Datenbank speichern.\\+ 
 + 
 +===== Auslesen mit anderen Methoden als vzlogger ===== 
 + 
 +==== Auslesen per PHP ==== 
 +Dieses Script übergibt die Daten ganz normal an die Middleware. 
 +Das Script verwendet als Geschwindigkeit 9600. Wer 19200 möchte muss die beiden Zeilen im Script einkommentieren. 
 +<code php> 
 +<?php 
 + 
 +$urlBase='http://localhost/middleware.php/data/'; 
 +$device='/dev/serial/by-id/usb-bitteAnpassen'; 
 + 
 +$channels=array( 
 +                '1.7.0(' => 'xxxxxxxx-yyyy-zzzz-aaaa-bbbbbbbbbbbb', 
 +                '2.7.0(' => 'xxxxxxxx-yyyy-zzzz-aaaa-bbbbbbbbbbbb', 
 +                '1.8.1(' => 'xxxxxxxx-yyyy-zzzz-aaaa-bbbbbbbbbbbb', 
 +                '1.8.2(' => 'xxxxxxxx-yyyy-zzzz-aaaa-bbbbbbbbbbbb', 
 +                '2.8.1(' => 'xxxxxxxx-yyyy-zzzz-aaaa-bbbbbbbbbbbb'                 
 +                ); 
 + 
 +error_reporting(E_ALL); 
 + 
 +function setSerial($device,$bps) { 
 +    echo "setze Schnittstelle auf $bps bps\n"; 
 +    $output=array(); 
 +    $returnVar=0; 
 +    $cmd="stty $bps -F $device"; 
 +    exec($cmd, $output,$returnVar);     
 +    echo "Ergebnis vom Setzen der seriellen Schnittstelle per stty:\n"; 
 +    print_r($output); 
 +} // function initSerial 
 + 
 +function setSerialInital($device,$bps) { 
 +    echo "setze Schnittstelle auf $bps bps\n"; 
 +    $output=array(); 
 +    $returnVar=0; 
 +    $cmd="stty $bps -F $device 1:4:da7:a30:3:1c:7f:15:4:10:0:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0"; 
 +    exec($cmd, $output,$returnVar);     
 +    echo "Ergebnis vom Setzen der seriellen Schnittstelle per stty:\n"; 
 +    print_r($output); 
 +} // function initSerial 
 + 
 +function checkLine($line) { 
 +    global $channels; 
 +    global $urlBase; 
 +   
 +    echo "Line: '$line'\n"; 
 +    $line=trim($line); 
 +    if ($line=='!') die("\n bin durchgelaufen\n"); 
 +    foreach(array_keys($channels) as $orbis) {                                                                                                                                                                                 
 +        if(substr($line,0,strlen($orbis))==$orbis ) {                                                                                                                                                                          
 +            echo "match für $orbis\n";                                                                                                                                                                                         
 +            $part=(float)substr($line,6);                                                                                                                                                                                      
 +            // 2.8.0(885.259*kWh)                                                                                                                                                                                              
 +            $part=strstr(substr($line,6),'*',true);                                                                                                                                                                            
 +            if (('1.7.0(' == $orbis) or ('2.7.0(' == $orbis)) $part=$part*1000;                                                                                                                                                
 +            echo "ermittelter Wert: $part\n";                                                                                                                                                                                  
 +            $url=$urlBase.$channels[$orbis].'.json?operation=add&value='.$part;                                                                                                                                                
 +            echo "rufe $url auf.\n";                                                                                                                                                                                           
 +            $dummy=curl_file_get_contents($url);                                                                                                                                                                               
 +        } // if                                                                                                                                                                                                                
 +    } // foreach 
 +} // function checkLine 
 + 
 +function curl_file_get_contents($URL) 
 +    { 
 +      $c = curl_init(); 
 +      curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); 
 +      curl_setopt($c, CURLOPT_URL, $URL); 
 +      $contents = curl_exec($c); 
 +      curl_close($c); 
 +                                                                                         
 +      if ($contents) return $contents; 
 +      else return FALSE; 
 +    } // function curl_get_file_contents 
 + 
 +function getTimestamp() {  
 +     $seconds = microtime(true); // false = int, true = float  
 +          return round( ($seconds * 1000) );  
 +
 + 
 +setSerialInitial($device,300); 
 + 
 +$fp=fopen($device,'c+'); 
 +if (!$fp) { 
 +    echo "Konnte Port nicht öffnen\n"; 
 +    die; 
 +} else { 
 +  echo "Port öffnen OK\n"; 
 +} // if 
 + 
 +echo "Request senden ..."; 
 +$out = "/?!\r\n"; 
 +fwrite($fp, $out); 
 +echo "Request OK.\n"; 
 + 
 +echo "Lese eine Zeile\n"; 
 +echo fgets($fp); 
 +echo "gelesen\n"; 
 + 
 +/* 
 +echo "Lese eine Zeile\n"; 
 +echo fgets($fp); 
 +echo "gelesen\n"; 
 +*/ 
 + 
 +echo "sicherheitshalber etwas warten\n"; 
 +usleep(500 * 1000); 
 + 
 +echo "bps-Rate-Request senden ..."; 
 +$out = "\x06\x30\x35\x31\x0D\x0A"; 
 +$out = "\x06050\r\n"; 
 + 
 +// fuer 19200: 
 +// $out = "\x06060\r\n"; 
 + 
 +fwrite($fp, $out); 
 +echo "BPS Request OK.\n"; 
 + 
 +echo "warte bis Zeichen ausgegeben wurden...\n"; 
 +usleep(500 * 1000); 
 + 
 +//setSerial($device,9600); 
 + 
 +echo "schließe Port\n"; 
 +fclose($fp); 
 +setSerial($device,9600); 
 +// für 19200 
 +// setSerial($device,19200); 
 + 
 +echo "öffne Port\n"; 
 +$fp=fopen($device,'c+'); 
 +if (!$fp) { 
 +   echo "Konnte Port nicht öffnen\n"; 
 +   die; 
 +} else { 
 + echo "Port 9600 OK\n"; 
 +} // if 
 + 
 + 
 +echo "lese Rest ein\n"; 
 +while (!feof($fp)) { 
 +  echo $line=fgets($fp, 128); 
 +  checkLine($line); 
 +} // while 
 + 
 +fclose($fp); 
 +?> 
 +</code> 
 + 
 +==== Auslesen per C zu MySQL ==== 
 +Das folgende C Programm kann alle Daten mit dem [[hardware:controllers:ir-schreib-lesekopf-usb-ausgang|USB-IR-Schreib-Lesekopf]] empfangen und in eine MySQL-Datenbank speichern.\\
 Dabei wird die Übertragungsrate auf 9600bps erhöht.\\ Dabei wird die Übertragungsrate auf 9600bps erhöht.\\
 Das Programm kann über PHP mit pclose(popen("cmd.exe /c C:/Pfad/programm.exe", 'r')); aufgerufen werden. Das Programm kann über PHP mit pclose(popen("cmd.exe /c C:/Pfad/programm.exe", 'r')); aufgerufen werden.
  
-<code>+<code c>
 #include <windows.h> #include <windows.h>
 #include <stdio.h> #include <stdio.h>
Zeile 252: Zeile 459:
 } }
 </code> </code>
-===== Lösung in reinem PHP ===== 
-Dieses Script übergibt die Daten ganz normal an die Middleware. 
-Das Script verwendet als Geschwindigkeit 9600. Wer 19200 möchte muss die beiden Zeilen im Script einkommentieren. 
-<code> 
-<?php 
  
-$urlBase='http://localhost/middleware.php/data/'; +==== Test mit HTerm  ==== 
-$device='/dev/serial/by-id/usb-bitteAnpassen';+Zum Testen kann [[http://www.der-hammer.info/terminal/|hterm]] verwendet werden.\\ 
 +Einzustellen sind:\\ 
 +Port: bei Windows:verwendeter COM-Anschluss des USB-Adapters, bei Linux z.B. /dev/ttyUSB0\\ 
 +Baud: 300\\ 
 +Data: 7\\ 
 +Stop: 1\\ 
 +Parity: Even\\ 
 +Bei "input control": Send on Enter auf "CR-LF"\\ 
 +Auf "Connect" klicken, dann im Eingabefeld "/?!" (ohne Anführungszeichen) eingeben und Enter drücken. Dann sollte der Zähler sofort mit seiner Seriennummer antworten. Nach 2-3 Sekunden fängt der Zähler dann an, Daten auszugeben.
  
-$channels=array( +==== Test mit Perl-Script ==== 
-                '1.7.0(' => 'xxxxxxxx-yyyy-zzzz-aaaa-bbbbbbbbbbbb', +<code perl> 
-                '2.7.0(' => 'xxxxxxxx-yyyy-zzzz-aaaa-bbbbbbbbbbbb'+#!/usr/bin/perl 
-                '1.8.1(' => 'xxxxxxxx-yyyy-zzzz-aaaa-bbbbbbbbbbbb'+
-                '1.8.2(' => 'xxxxxxxx-yyyy-zzzz-aaaa-bbbbbbbbbbbb', +(m)ein Stromzähler mit IR-Schnittstelle blubbert nach einem "Aufforderung
-                '2.8.1(' => 'xxxxxxxx-yyyy-zzzz-aaaa-bbbbbbbbbbbb'                 +# telegramm" Daten rausDas Telegramm ist mit 300 Baud, Bit1 Stoppbit 
-                );+# und gerader Parität zu sendenDas ist der Initialmodus von Geräten
 +# die das Protokoll IEC 62056-21 implementieren
 +
 +# Autor: Andreas Schulze 
 +# Bugfix: Eric Schanze 
 +# Datum: 20120302 
 +
 +# 20171230: Andreas Schulze: speed :-)
  
-error_reporting(E_ALL);+use warnings; 
 +use strict; 
 +use utf8; 
 +use Device::SerialPort; 
 +use Time::HiRes qw(usleep);
  
-function setSerial($device,$bps+# functions 
-    echo "setze Schnittstelle auf $bps bps\n"+sub tty_init($); 
-    $output=array(); +sub tty_baudrate($$); 
-    $returnVar=0+sub tty_close($)
-    $cmd="stty $bps -F $device"; +sub send_telegram($$); 
-    exec($cmd, $output,$returnVar);     +sub receive_line($);
-    echo "Ergebnis vom Setzen der seriellen Schnittstelle per stty:\n"; +
-    print_r($output); +
-} // function initSerial+
  
-function setSerialInital($device,$bps) { +# global vars 
-    echo "setze Schnittstelle auf $bps bps\n"; +my $PORT='/dev/ttyUSB0'
-    $output=array()+my $aufforderung "/?!"
-    $returnVar=0+my $speed chr(6) . "090"; 
-    $cmd="stty $bps -F $device 1:4:da7:a30:3:1c:7f:15:4:10:0:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0"; +my $tty
-    exec($cmd, $output,$returnVar)    +my $answer;
-    echo "Ergebnis vom Setzen der seriellen Schnittstelle per stty:\n"; +
-    print_r($output); +
-} // function initSerial+
  
-function checkLine($line) { +# main 
-    global $channels; +$tty tty_init($PORT); 
-    global $urlBase; +send_telegram($tty, $aufforderung); 
-   +print receive_line($tty);
-    echo "Line: '$line'\n"; +
-    $line=trim($line); +
-    if ($line=='!') die("\n bin durchgelaufen\n"); +
-    foreach(array_keys($channels) as $orbis) {                                                                                                                                                                                 +
-        if(substr($line,0,strlen($orbis))==$orbis ) {                                                                                                                                                                          +
-            echo "match für $orbis\n"                                                                                                                                                                                        +
-            $part=(float)substr($line,6);                                                                                                                                                                                      +
-            // 2.8.0(885.259*kWh)                                                                                                                                                                                              +
-            $part=strstr(substr($line,6),'*',true);                                                                                                                                                                            +
-            if (('1.7.0(' == $orbis) or ('2.7.0(' == $orbis)) $part=$part*1000;                                                                                                                                                +
-            echo "ermittelter Wert: $part\n";                                                                                                                                                                                  +
-            $url=$urlBase.$channels[$orbis].'.json?operation=add&value='.$part;                                                                                                                                                +
-            echo "rufe $url auf.\n";                                                                                                                                                                                           +
-            $dummy=curl_file_get_contents($url);                                                                                                                                                                               +
-        } // if                                                                                                                                                                                                                +
-    } // foreach +
-} // function checkLine+
  
-function curl_file_get_contents($URL) +usleep(250*1000);
-    { +
-      $c = curl_init(); +
-      curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); +
-      curl_setopt($c, CURLOPT_URL, $URL); +
-      $contents = curl_exec($c); +
-      curl_close($c); +
-                                                                                         +
-      if ($contents) return $contents; +
-      else return FALSE; +
-    } // function curl_get_file_contents+
  
-function getTimestamp() {  +send_telegram($tty, $speed); 
-     $seconds = microtime(true); // false = int, true = float  +usleep(250*1000); 
-          return round($seconds * 1000);  +tty_baudrate($tty, 115200);
-}+
  
-setSerialInitial($device,300);+do { 
 +  $answer = receive_line($tty)
 +  print $answer; 
 +} until $answer eq "!\r\n";
  
-$fp=fopen($device,'c+'); +tty_close($tty); 
-if (!$fp+exit(0);
-    echo "Konnte Port nicht öffnen\n"; +
-    die; +
-} else { +
-  echo "Port öffnen OK\n"; +
-} // if+
  
-echo "Request senden ..."+# parameter: tty name 
-$out = "/?!\r\n"; +# return   : a tty handle 
-fwrite($fp, $out); +# on error : die 
-echo "Request OK.\n";+sub tty_init($) { 
 +  my ($device) = @_
 +  my $tty new Device::SerialPort($device) || die "can't open $device: $!"; 
 +  $tty->baudrate(300)                       || die 'fail setting baudrate'; 
 +  $tty->databits(7)                         || die 'fail setting databits'; 
 +  $tty->stopbits(1                        || die 'fail setting stopbits'
 +  $tty->parity("even")                      || die 'fail setting parity'; 
 +  $tty->write_settings                      || die 'fail write settings'; 
 +  $tty->read_const_time(10); 
 +  #$tty->debug(1);
  
-echo "Lese eine Zeile\n"; +  $tty
-echo fgets($fp)+}
-echo "gelesen\n";+
  
-/* +# parameter: a tty handle 
-echo "Lese eine Zeile\n"; +# on error : die 
-echo fgets($fp); +# return   : - 
-echo "gelesen\n"; +sub tty_close($) 
-*/+  my ($tty) = @_
 +  $tty->close || die "can't close tty: $!"; 
 +}
  
-echo "sicherheitshalber etwas warten\n"+# parameter: a tty handle 
-usleep(500 * 1000);+# parameter: new baudrate 
 +# return   : - 
 +# on error : die 
 +sub tty_baudrate($$) { 
 +  my ($tty, $baudrate) = @_
 +  $tty->baudrate($baudrate|| die 'fail setting baudrate'; 
 +  $tty->write_settings      || die 'fail write settings'; 
 +};
  
-echo "bps-Rate-Request senden ..."; +# parameter: a tty handle 
-$out = "\x06\x30\x35\x31\x0D\x0A"; +# parameter: string to send 
-$out "\x06050\r\n";+# return   : 
 +# on error : die 
 +sub send_telegram($$) { 
 +  my ($tty,$telegram) @_;
  
-// fuer 19200: +  print "send '$telegram' ...\n"; 
-// $out = "\x06060\r\n";+  $telegram .= "\r\n"; 
 +  my $num_out = $tty->write($telegram); 
 +  die "write failed\n" unless ($num_out); 
 +  die "write inclomplete\n" unless ($num_out == length($telegram)); 
 +  print "$num_out Byte written ...\n"; 
 +}
  
-fwrite($fp, $out); +# parameter: a tty handle 
-echo "BPS Request OK.\n";+# return   : received string including the final "\n" 
 +# on error : - 
 +sub receive_line($) { 
 +  my ($tty) = @_;
  
-echo "warte bis Zeichen ausgegeben wurden...\n"; +  my ($line, $num_read, $c); 
-usleep(500 * 1000);+  do { 
 +    ($num_read, $c) = $tty->read(1); 
 +    $line .= $c; 
 +  } until !defined($c) || $c eq "\n"; 
 +   
 +  $line; 
 +
 +</code>
  
-//setSerial($device,9600); +===== Quellen ===== 
- +[[https://www.ng-o.com/kunden/downloads/netzkunden/messwesen/strom/Bedienungsanleitung_Siemens_Smart_Meter.pdf|Benutzerhandbuch]] (Netze NGO)\\ 
-echo "schließe Port\n"; +{{:hardware:channels:meters:power:siemens:AMIS_TD-351x_BHBK.pdf|Benutzerhandbuch}} (Siemens AG Österreich)\\
-fclose($fp); +
-setSerial($device,9600); +
-// für 19200 +
-// setSerial($device,19200)+
- +
-echo "öffne Port\n"; +
-$fp=fopen($device,'c+'); +
-if (!$fp) { +
-   echo "Konnte Port nicht öffnen\n"; +
-   die; +
-} else { +
- echo "Port 9600 OK\n"; +
-// if +
- +
- +
-echo "lese Rest ein\n"; +
-while (!feof($fp)) { +
-  echo $line=fgets($fp, 128); +
-  checkLine($line); +
-// while +
- +
-fclose($fp)+
-?> +
-</code>+
hardware/channels/meters/power/edl-ehz/siemens_td3511.1446750840.txt.gz · Zuletzt geändert: 2015/11/05 20:14 von udo1