Ankündigung

Einklappen
Keine Ankündigung bisher.

Schreiben in csv

Einklappen
Dieses Thema ist geschlossen.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [wiregate] Schreiben in csv

    Nachdem hier danach gefragt wurde: https://knx-user-forum.de/347744-post16.html

    Zitat von XueSheng Beitrag anzeigen
    Das ist jetzt zwar offtopic, aber ich fände es auch gut, wenn mal ein Beispiel für "Schreiben in CSV" einen eigenen Thread bekommen würde (dann hätten alle etwas davon). Ich habe zwar Diskussionen zu diesem Thema gefunden, jedoch noch keine richtigen Beispiele, die praktisch umgesetzt worden sind.
    Hier der Code für mein csv-Plugin, zwar Spaghetti-Code, aber manchmal find ich das übersichtlicher als die vielen push...

    Das Plugin schreibt immer innerhalb der 1min nach Mitternacht, die Daten kommen aus anderen Plugins etc. und werden mit knx_read gelesen.

    lg
    Robert

    Code:
    # Verbrauchsdaten schreiben
    # V1.00 2013-03-03
    use Date::Calc qw(:all);
    
    ### Definitionen 
    ### Hier werden die Werte/Gruppenadressen definiert
    my $WP_Laufzeit4bit_ga = "5/0/3";                  # WP Laufzeit gesamt DPT14
    my $WP_Starts_ga = "5/0/4";                        # WP Starts DPT12
    my $Brunnenpumpe_Laufzeit4bit_ga = "5/0/23";       # Brunnenpumpe Laufzeit gesamt DPT14
    my $Brunnenpumpe_Starts_ga = "5/0/24";             # Brunnenpumpe Starts DPT12
    my $Stromzaehler_Haus_Zaehlerstand_ga = "5/0/41";  # Stromzaehler Zaehlerstand Haus DPT14
    my $Stromzaehler_WP_Zaehlerstand_ga = "5/0/46";    # Stromzaehler Zaehlerstand WP DPT14
    my $Zaehlerstand_DG2_ga = "7/1/6";
    my $Zaehlerstand_Licht_ga = "3/5/2";
    my $Zaehlerstand_DG1_ga = "7/1/16";
    my $Zaehlerstand_GS_ga = "7/1/26";
    my $Zaehlerstand_KS_ga = "7/1/36";
    my $Zaehlerstand_GFS_ga = "7/1/46";
    my $Zaehlerstand_WM_ga = "7/0/16";
    my $Zaehlerstand_TR_ga = "7/0/26";
    my $Zaehlerstand_BP_ga = "7/0/36";
    
    ### Ende Definitionen
    
    # Eigenen Aufruf-Zyklus auf 20 Sekunden setzen
    # der Aufrufzyklus ist unabhängig von der Taktzeit und muss kürzer sein!
    $plugin_info{$plugname.'_cycle'} = 20;
    
    my $write = $plugin_info{$plugname.'_written'};
    
    my $sec;
    my $min;
    my $hour;
    my $mday;
    my $mon;
    my $year;
    my $wday;
    my $yday;
    my $isdst;
    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
    $year += 1900;
    $mon += 1;
    
    #return "Zeit $hour:$min:$sec";    $hour == 0 and 
    if (($hour == 0 and $min == 0) and $write == 0) {
      $plugin_info{$plugname.'_written'} = 1;
      
      my $WP_Laufzeit = knx_read($WP_Laufzeit4bit_ga,0,14);
      my $WP_Starts = knx_read($WP_Starts_ga,0,12);
      my $Brunnenpumpe_Laufzeit = knx_read($Brunnenpumpe_Laufzeit4bit_ga,0,14);
      my $Brunnenpumpe_Starts = knx_read($Brunnenpumpe_Starts_ga,0,12);
      my $Stromzaehler_Haus = knx_read($Stromzaehler_Haus_Zaehlerstand_ga,0,14);
      my $Stromzaehler_WP = knx_read($Stromzaehler_WP_Zaehlerstand_ga,0,14);
      my $Zaehlerstand_DG2 = knx_read($Zaehlerstand_DG2_ga,0,14); 
      my $Zaehlerstand_Licht = knx_read($Zaehlerstand_Licht_ga,0,14); 
      my $Zaehlerstand_DG1 = knx_read($Zaehlerstand_DG1_ga,0,14); 
      my $Zaehlerstand_GS = knx_read($Zaehlerstand_GS_ga,0,14); 
      my $Zaehlerstand_KS = knx_read($Zaehlerstand_KS_ga,0,14); 
      my $Zaehlerstand_GFS = knx_read($Zaehlerstand_GFS_ga,0,14); 
      my $Zaehlerstand_WM = knx_read($Zaehlerstand_WM_ga,0,14); 
      my $Zaehlerstand_TR = knx_read($Zaehlerstand_TR_ga,0,14); 
      my $Zaehlerstand_BP = knx_read($Zaehlerstand_BP_ga,0,14); 
      
      $mon = sprintf("%02d", $mon); 
      $mday = sprintf("%02d", $mday);   
      $hour = sprintf("%02d", $hour); 
      $min = sprintf("%02d", $min); 
      my $DatumZeit = "$year-$mon-$mday; $hour:$min";
      my $wert_neu = "$DatumZeit; $WP_Laufzeit; $WP_Starts; $Brunnenpumpe_Laufzeit; $Brunnenpumpe_Starts; $Stromzaehler_Haus; $Stromzaehler_WP; $Zaehlerstand_Licht; $Zaehlerstand_DG2; $Zaehlerstand_DG1; $Zaehlerstand_GS; $Zaehlerstand_KS; $Zaehlerstand_GFS; $Zaehlerstand_WM; $Zaehlerstand_TR; $Zaehlerstand_BP \n";
    
      open(File,'>>/var/www/rrd/Verbrauchsdaten.csv');
      print File $wert_neu;
      close File;
      return; #"Zeit $hour:$min:$sec write $write";
    }
    elsif (($hour == 0 and $min == 1) and $write == 1) {
      $plugin_info{$plugname.'_written'} = 0;
      return; #"Zeit $hour:$min:$sec Reset write $write":
    }
    
    return;

    #2
    open(File,'>>/var/www/rrd/Verbrauchsdaten.csv');

    Hallo Robert!

    Danke für das Plugin!
    Eine Frage an dieser Stelle:
    "open(File,'>>/var/www/rrd/Verbrauchsdaten.csv');"
    Das ist die Pfadangabe, etc für die CSV.
    Wie müsste der Pfad heissen, wenn die Datei auf einem NAS liegt?
    -Vorausgesetzt das ist möglich.

    Danke und GRüße,
    Lio

    Kommentar


      #3
      Hallo Lio!

      Kann deine Frage leider auch nicht direkt beantworten.

      Was ich auf die Schnelle gefunden habe und zeitnah auch selbst probieren werde:
      https://knx-user-forum.de/forum/supp...wiregate/17761

      lg
      Robert

      Kommentar


        #4
        Lass doch einfach die Datei aufm WireGate und hol sie mit dem NAS mit wget und cron.
        Umgezogen? Ja! ... Fertig? Nein!
        Baustelle 2.0 !

        Kommentar


          #5
          Hallo Mirko,

          was ist dann der Vorteil?
          DAs WG hat ja nur begrenzt Speicher und die CSV soll ja auch weiterverarbeitet werden.

          Ist das Mounten umständlich, schwierig oder unzuverlässig?

          Danke und Gruß,
          Lio

          Kommentar


            #6
            Naja das CSV zeig mir mal das ne 4GB Karte zum Platzen bringt .

            Was es bringt? Es ist simpel.

            crontab aufm NAS
            Code:
            * * * * * cd /mein/verzeichnis/auf/nas && wget http://ip_wiregate/dateiname.csv
            Klar kann man auch mounten, aber was wenn gerade da irgendwas mal mit NAS ist ? Mit mehreren crontab Einträgen könnte man sogar "Backups" einrichten falls mal was mit der Datei passiert.

            Ich wollte nur ne Alternative aufzeigen.
            Umgezogen? Ja! ... Fertig? Nein!
            Baustelle 2.0 !

            Kommentar


              #7
              Hallo Robert,

              bekomme die Meldung

              Code:
              Can't locate Date/Calc.pm in @INC (@INC contains: /etc/perl  /usr/local/lib/perl/5.10.0 /usr/local/share/perl/5.10.0 /usr/lib/perl5  /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10  /usr/local/lib/site_perl .) at (eval 36246) line 3. BEGIN failed--compilation aborted at (eval 36246) line 3.
              Muss ich da was (wie) nachinstallieren?


              Danke und Grüße,
              Lio

              Kommentar


                #8
                apt-get install libdate-calc-perl
                Umgezogen? Ja! ... Fertig? Nein!
                Baustelle 2.0 !

                Kommentar


                  #9
                  Hallo,

                  ich würde mir gern einen Temperaturwert (1-Wire) per Email verschicken.
                  GA ist für die Temp ja vorhanden und eine Trigger GA ja auch.
                  Kann man das in die Zeile einbauen? (Wenn ja wie?)

                  Code:
                  push @actionGA, { name => "Temperatur", email_adress =>  'meine@mail.de', email_subject => "Aussentemp", email_text => "Die Aussentemp beträgt um  $hour:$min  genau   XXX", trigger_ga => "1/1/26", value => 0 };

                  Danke und Grüße,
                  Lio

                  Kommentar


                    #10
                    Hallo Lio!

                    Gerne unterstütze ich dich bei deinem Problem, aber ich hab's noch nicht ganz verstanden:
                    Willst du den e-mail Versand mit dem csv-Plugin gemeinsam verwenden oder einfach mit einer GA eine Mail auslösen?

                    Hierzu gibt es im sourceforge:
                    https://sourceforge.net/p/openautoma...gered_by_ga.pl

                    bereits ein plugin, dass einen Empfänger-Adresse und mehrere Nachrichten erlaubt.
                    Entspricht das nicht genau dem, was dir vorschwebt, oder willst du jede Nachricht an eine andere Mail verschicken?

                    lg Robert

                    Kommentar


                      #11
                      Hallo,

                      sorry, ich habe mich am Plugin, bzw am Forumsthema geirrt.
                      Gerade erst bemerkt, dass das eine mit dem anderen nichts zu tun hat.

                      Sorry nochmal.

                      Grüße,
                      Lio

                      Kommentar


                        #12
                        Wenn ich dich richtig verstehe, willst du 1x Tag per Mail eine Nachricht per Mail verschicken? Richtig?

                        Um Mitternacht oder einstellbare Zeit?

                        lg Robert

                        Kommentar


                          #13
                          jaja,

                          das Plugin von Deinem Beitrag läuft bei mir schon.
                          Open Automation / Code / [r2028] /wiregate/plugin/generic/email_triggered_by_ga.pl

                          Das wird ja per GA getriggert.
                          In diesem Plugin bräuchte ich nun eine Zeile, die als Text mit den Temperaturwert liefert, also in etwa so:
                          push @actionGA, { name => "Temperatur", email_adress => 'meine@mail.de', email_subject => "Aussentemp", email_text => "Die Aussentemp beträgt um $hour:$min genau XXX", trigger_ga => "1/1/26", value => 0 };
                          Triggern würde ich über ein Zeitschaltuhrplugin, welches ja bei mir auch schon läuft.

                          Das wäre für mich wohl der einfachste Weg. Und würde mir genügen.

                          Aber mir fehlt eben der Eintrag im Emailplugin für die Temperatur.

                          Grüße,
                          Lio

                          Kommentar


                            #14
                            Na dann.

                            Ich würde folgenden Code im E-Mail plugin aufnehhmen:
                            Code:
                            # ganz am anfang in den Definitionen
                            use Date::Calc qw(:all);
                            my $temp_ga="1/2/3";
                            
                            # dann
                            my $hour = (localtime(time))[2];
                            my $min = (localtime(time))[1];
                            my $temp = knx_read($temp_ga, 0,9);
                            push @actionGA, { name => "Temperatur", email_adress =>  'meine@mail.de', email_subject => "Aussentemp", email_text => "Die  Aussentemp beträgt um $hour:$min genau $temp", trigger_ga => "1/1/26",  value => 0 };
                            Ist jetzt zugegebenermaßen ungetestet direkt im Forum geschrieben, sollte aber gehen. Mit einem Wert 0 auf deine Trigger ga sollte dann eine Mail ausgelöste werden.

                            lg
                            Robert

                            Kommentar


                              #15
                              Mal ne dumme Frage... Wozu wird eigentlich "use Date::Calc qw(:all);" benötigt? Habe das nun schon öfters in Plugins gesehen, die hier im Forum kursieren und den Zweck noch nicht verstanden.

                              In deinem kurzen Beispiel kommt doch nur die Funktion "localtime()" in diesem Zusammenhang zum Einsatz. Aber diese Funktion gehört doch garnicht zu "Date::Calc"... das müsste ja dann "Localtime()" sein.

                              Wie gesagt, nur eine dumme Frage. Vermutlich stehe ich auch nur auf dem Schlauch.

                              Kommentar

                              Lädt...
                              X