Ankündigung

Einklappen
Keine Ankündigung bisher.

Webseitenabfrage mit Wiregate Plugin

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

    [wiregate] Webseitenabfrage mit Wiregate Plugin

    Hallo,

    ich habe mir eine RedDevil4 Teichpumpe mit IP Steuerung über Webserver angeschafft.

    In meinem Gartenhaus habe ich ein WG. Damit möchte ich gerne die Website der Pumpe auslesen und im Step 2 auch schreiben!

    Im HS hätte ich das in 10min geschrieben, aber bei den WG Plugins bin ich noch ein Frischling.

    Gibt es hier eine Anleitung/Vorlage wie ich die Website auslesen kann und die Werte auf den Bus geben kann?




    Zur Info hier mal der HTML Quelltext der Pumpe

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head> <meta content="text/html; charset=UTF-8" http-equiv="Content-Type"> <meta http-equiv="refresh" content="3"><title>AIR-AQUA-800W</title></head> <body style="background-color: white;"> <div style="text-align: center;"> <font size="6"><span style="font-weight: bold;">"AIR-AQUA-800W" pump</span></font></div> <table fgcolor="white" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr bgcolor="#3366ff"> <td style="text-align: left;" width="20%"><font color="#ffffff"> <span style="font-weight: bold;">Pump-&gt;</span></font><font><b><a href="cfg.htm" target="_blank"><font color="#ffffff"><b> Adjust</b></font></a></b></font></td> <td style="text-align: left;" width="20%"> <a href="net.htm"><font color="#ffffff"><b> Network</b></font></a></td> <td style="text-align: left;" width="20%"><a href="log.htm"> <font color="#ffffff"> <span style="font-weight: bold;">Log</span></font></a></td> </tr> </tbody> </table> <br> <table style="width: 100%;" border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td style="vertical-align: top; width: 100%;"> <p style="font-weight: bold; text-align: center; background-color: rgb(164, 164, 255);">Status:<span style="font-weight: normal;"><br> </span></p> <table style="background-color: rgb(208, 208, 255); width: 100%; height: 100%; text-align: left; margin-left: auto; margin-right: auto;" cellpadding="1"> <tbody> <tr> <td style="font-style: italic; text-align: right; background-color: rgb(204, 204, 255);">Parameter:&nbsp;</td> <td style="font-style: italic; background-color: rgb(204, 204, 255);">Value (limit)</td> </tr> <tr> <td style="text-align: right;"><span style="text-decoration: underline;">Operation:&nbsp;</span></td> <td></td> </tr> <tr> <td style="text-align: right;">Power consumption:&nbsp;</td> <td>1 W (800 W)</td> </tr> <tr> <td style="text-align: right;">Grid current:&nbsp;</td> <td>0.03 A&nbsp; (6.0 A)</td> </tr> <tr> <td style="text-align: right;">RPM:&nbsp;</td> <td>0 /min (0 /min)</td> </tr> <tr> <td style="text-align: right;">Estimated head:&nbsp;</td> <td>0.0 m (39.6 m)</td> </tr> <tr> <td style="text-align: right;">Estimated flow:&nbsp; </td> <td>0.0 m3/h</td> </tr> <tr> <td style="text-align: right;">Estimated efficiency:&nbsp; </td> <td>0 %</td> </tr> <tr> <td style="text-decoration: underline; text-align: right;">Temperature:&nbsp;</td> <td></td> </tr> <tr> <td style="text-align: right;">Motor:&nbsp;</td> <td>OK</td> </tr> <tr> <td style="text-align: right;">Heatsink:&nbsp;</td> <td>15 °C (90&nbsp;°C)</td> </tr> <tr> <td style="text-align: right;"><span style="text-decoration: underline;">Statistics:&nbsp;</span></td> <td></td> </tr> <tr> <td style="text-align: right;">Operating hours:&nbsp;</td> <td>0 h</td> </tr> <tr> <td style="text-align: right;">Restart counter:&nbsp;</td> <td>18</td> </tr> <tr> <td style="text-align: right;">Energy consumed:&nbsp;</td> <td>0 kWh</td> </tr> <tr> <td style="text-align: right;"><span style="text-decoration: underline;">Control: </span><br> </td> <td>&nbsp;<br> </td> </tr> <tr> <td style="text-align: right;">Digital inputs:&nbsp;</td> <td>1(rpmdown), 0(rpmup)</td> </tr> <tr> <td style="text-align: right;">Relay status:&nbsp;</td> <td>0(run)</td> </tr> <tr> <td></td> <td></td> </tr> <tr> <td style="text-align: right;">&nbsp;</td> <td style="color: rgb(255, 164, 164);">sw: v1.2rc7 Apr 15 2011 15:00:13<br> web: 2011 <br>royal-exclusiv/js</td> </tr> </tbody> </table> </td> </tr> </tbody> </table> </body></html>
    Gruß Hartwig

    #2
    Hi Hartwigm,

    Mit dem Wiregate kriegst du das womöglich noch schneller hin, denn Perl, die Sprache der Plugins, ist ja DIE "Practical Extraction and Report Language" schlechthin...

    Sicher führen viele Wege nach Rom, ich würde es folgendermaßen machen:

    1. die Webseite laden mit sowas wie:

    Code:
    use LWP::Simple;
    use Encode;
    my $url = 'http://www.teichpumpe.de/...';
    my $content = get($url) || return 'Laden der Teichpumpenseite fehlgeschlagen.';
    my $content = decode('UTF-8',$content);
    (Fragment übernommen aus JNKs Unwetterzentrale)

    Jetzt hast du die gesamte Seite in $content und kannst viele Pattern Matches machen, zum Beispiel holst du dir mit solchem Code

    Code:
    $content=~m!Grid current:\&nbsp;</td> <td>([0-9\.]*) A\&nbsp;!;
    my $grid_current = $1;
    eine Angabe aus der Webseite. Reguläre Ausdrücke unbekannt? Kein Problem => google oder "man perlre" auf der Kommandozeile, und fünf Minuten später schreibst du solchen Code selbst.

    Schlussendlich auf den Bus schreiben. Das geht so:

    Code:
    knx_write('1/3/13', $grid_current, 9);
    (die 9 ist der Datentyp, DPT, und steht hier für 2-byte-Fliesskomma).

    Für deine Anwendung gibt es nichts Besseres auf dem Markt.
    Dank Larry Wall (Perl).

    Have fun,
    Fry

    Kommentar


      #3
      Also die erste Massnahme ist: prüfen ob man die Daten nicht irgendwie "gescheit" bekommt, Webseiten-parsen ist IMHO eine Hollerith-zu-fuss-Notlösung

      Also mal schauen, ob es irgendwie ggfs. ein CSV o.ä. ausspuckt..
      Ansonsten wie Fry schon schrub, ich mach mir sowas meist erstmal standalone auf dem Desktop bis das parsen passt und überführe es dann ins Plugin.

      Makki
      EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
      -> Bitte KEINE PNs!

      Kommentar


        #4
        Hallo Fry,

        Vielen Dank für deine Hilfestellung

        eine Angabe aus der Webseite. Reguläre Ausdrücke unbekannt? Kein Problem => google oder "man perlre" auf der Kommandozeile, und fünf Minuten später schreibst du solchen Code selbst



        Die 5min konnte ich leider nicht einhalten, aber mit ein wenig Recherche und testen ging es.

        Zum probieren habe ich dad nicht ald Plugin ausgeführt sondern als test.pl

        Ich scheitere aber nun am knx_write

        knx_write('11/1/20',$power_consumption,9);
        .
        .

        führt zu

        undefined subroutine &main::knx_write calles at ./test.pl line 80


        Gibt es knx_write nur im Plugin?
        Gruß Hartwig

        Kommentar


          #5
          Ja, knx_write ist eine "interne" Funktion in dem Programm (wiregated.pl) das die Plugins ausführt.

          Aber erstmal Standalone ist schon richtig und gut, wenn da ein
          print "Test: $power_consumption \n";
          das liefert was man will, dann kann man das (fast) 1:1 (ggfs. ohne die erste shebang-Zeile #!/usr/bin/perl)
          in ein Plugin überführen, die Umgebung kümmert sich dann um den blutigen Rest das via knx_write richtig auf den KNX zu bekommen.

          Makki

          Edit/P.S.: Und über das funktionierende Ergebniss freut sich das Repository und die Community natürlich auch immer! Keine Scheu, mir drehts bei meinem Code von 2004 auch grob die Magengrube um, aber er läuft teils bis heute
          EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
          -> Bitte KEINE PNs!

          Kommentar


            #6
            Jetzt brauche ich doch nochmals Eure Hilfe!

            ich habe nun ein test.pl, dieses liefert die korrekten Werte der Pumpe

            root@wiregate298:~/test# ./test.pl
            Auswertung:

            Power Consumtion: 0
            Grid current : 0.00
            Estimated_head : 0.0
            RPM : 0
            Estimated flow : 0.0
            Estimated efiz : 0
            Headsink temp : 13
            Operating Hours : 0
            restart Counter : 18
            Energy Consumed : 0
            Software Stand : 1.2rc7
            Software date : Apr 15 2011


            -

            Nun habe ich das Programm in das Plugin Verzeichnis kopiert und gestartet

            use LWP::Simple;
            use Encode;
            my $url = 'http://192.168.0.245';
            my $content = get($url) || return 'Laden der Pumpeninfo fehlgeschlagen.';
            my $content = decode('UTF-8',$content);

            #Seite steht nun in content
            #print $content;

            my $power_consumption;
            my $grid_current;
            my $rpm;
            my $estimated_head;
            my $estimated_flow;
            my $estimated_efficiency;
            my $headsink;
            my $operating_hours;
            my $restart_counter;
            my $energy_consumed;
            my $software_version;
            my $software_date;

            if ($content =~m!Power\s*consumption: </td>\s*<td>([(0-9]+)!){
            $power_consumption=$1
            }

            if ($content =~m!Grid\s*current: </td>\s*<td>([0-9]+\.[0-9]+)!){
            $grid_current=$1
            }


            if ($content =~m!RPM: </td>\s*<td>([0-9]+)!){
            $rpm=$1
            }


            if ($content =~m!Estimated\s*head: \s*</td>\s*<td>([0-9]+\.[0-9]+)!){
            $estimated_head= $1
            }

            if ($content =~m!Estimated\s*flow: </td>\s*<td>([0-9]+\.[0-9]+)!){
            $estimated_flow= $1
            }
            if ($content =~m!Estimated\s*efficiency: </td>\s*<td>([0-9]+)!){
            $estimated_efficiency= $1
            }
            if ($content =~m!Heatsink: </td>\s*<td>([0-9]+)!){
            $headsink =$1
            }

            if ($content =~m!Operating\s*hours: </td>\s*<td>([0-9]+)!){
            $operating_hours = $1
            }

            if ($content =~m!Restart\s*counter: </td>\s*<td>([0-9]+)!){
            $restart_counter = $1
            }

            if ($content =~m!Energy\s*consumed: </td>\s*<td>([0-9]+)!){
            $energy_consumed =$1
            }

            if ($content =~m!sw: v([0-9]+\.[0-9]+[a-z]+[0-9]+) ([\w]+ [0-9]+ [0-9]+)!){
            $software_version =$1;
            $software_date=$2
            }


            # print "Power Consumtion: $power_consumption\n";
            # print "Grid current : $grid_current\n";
            # print "Estimated_head : $estimated_head\n";
            # print "RPM : $rpm\n";
            # print "Estimated flow : $estimated_flow\n";
            # print "Estimated efiz : $estimated_efficiency\n";
            # print "Headsink temp : $headsink\n";
            # print "Operating Hours : $operating_hours\n";
            # print "restart Counter : $restart_counter\n";
            # print "Energy Consumed : $energy_consumed\n";
            # print "Software Stand : $software_version\n";
            # print "Software date : $software_date\n";



            # Daten auf den Bus schreiben
            knx_write('11/1/20',$power_consumption,9);
            knx_write('11/1/21',$grid_current,9);
            knx_write('11/1/22',$estimated_head,9);
            knx_write('11/1/23',$rpm,9);
            knx_write('11/1/24',$estimated_flow,9);
            knx_write('11/1/25',$estimated_efficiency,9);
            knx_write('11/1/26',$headsink,9);
            knx_write('11/1/27',$operating_hours,12);
            knx_write('11/1/28',$restart_counter,9);
            knx_write('11/1/29',$energy_consumed,9);
            knx_write('11/1/30',$software_version,16);
            knx_write('11/1/31',$software_date,16);



            ---
            Das einzige was korrekt auf den Bus geschrieben wird ist die Software Version und Datum Datentyp 16.

            Muss ich da ggf. die Variablen ins richtige Format wandeln?

            Wie kann ich die Ausführungzeit reduzieren. So dass das Teil nur jede Minute läuft!
            Angehängte Dateien
            Gruß Hartwig

            Kommentar


              #7
              Häng noch ein
              Code:
              $plugin_info{$plugname.'_cycle'}=60;
              an, damit das PLugin jede Minute aufgerufen wird.

              Sollte laufen. Wenn es nichts ausgibt, liegt es höchstwahrscheinlich daran, dass die angeforderte Seite nicht kommt oder deine Pattern Matches nicht greifen.

              Die Ausführungszeit deines Codes wird klar dominiert durch die Zeit, um die Webseite zu laden.

              Fry

              Kommentar


                #8
                Hallo Fry,

                Script läuft nun alle 60 sec. Vielen Dank!

                Hast Du noch eine Idee warum nur die der die beiden Strings auf den Bus gehen und der Rest nicht!

                Korrektur: Die Daten werden an den Bus übergeben, allerdings mit Wert 0!
                Gruß Hartwig

                Kommentar


                  #9
                  Eigentlich sollte es (aber die emisten Werte sind ja 0..)
                  Häng doch mal test.pl, das html und das komplette plugin an..

                  Und im Zweifel mit
                  return "Werte: $power_consumption $grid_current $estimated_head ...";
                  den sums einfach ins log zurückgeben lassen.

                  Makki
                  EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                  -> Bitte KEINE PNs!

                  Kommentar


                    #10
                    das erschliesst sich mir nocht nciht wirklich!

                    Anbei mal die test.pl und das Plugin

                    mit dem test.pl kommen Werte
                    mit dem Plugin kommt bei

                    return "Werte: $power_consumption, $grid_current, $estimated_head,$rpm,$estimated_flow,$estimated_ef ficiency,$headsink,$operating_hours, $restart_counter,$energy_consumed, $software_version, $software_date";


                    Werte: , , ,,,,,, ,, 1.2rc7, Apr 15 2011
                    Angehängte Dateien
                    Gruß Hartwig

                    Kommentar


                      #11
                      Hmm, musste ich mir jetzt selber nebeneinander legen, dann kommt (diff) bei raus:
                      Code:
                      --- native/reddevil-test.pl	2012-05-17 00:59:51.562447496 +0200
                      +++ plugin/reddevil.pl	2012-05-17 00:59:06.378465843 +0200
                      ....
                      
                      -if ($content =~m!Power\s*consumption:&nbsp;</td>\s*<td>([(0-9]+)!){
                      +if ($content =~m!Power\s*consumption:�</td>\s*<td>([(0-9]+)!){
                      Also vermutlich kannste da garnichts für entweder eine Encoding oder eine Webeditor-Nummer (ich hab das mal auf die Liste und prüf das mal - aber es ist halt auch hardcore in einem Webeditor in JS mit Syntax-Highlighting Perl-code und darin eine RE richtig zu lesen *und* zu schreiben..)

                      -> Mach das mal mit WinSCP & Editor (PSpas, Notepad++, ..) o.ä. in das Plugin, wenn im Plugin auch wieder &nbsp; steht klappt auch die RE und das mit den Werten.

                      Makki

                      P.S.: Deswegen mag ich weder RE noch Webseiten-parsen, das ist immer sisiphus-Arbeit und bits oder bytes-zählen..

                      P.S.2: Wenns fertig ist hätt ich das gerne fürs SVN, immerhin das erste "Männerteichpumpen->KNX Gateway"
                      EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                      -> Bitte KEINE PNs!

                      Kommentar


                        #12
                        Zitat von makki Beitrag anzeigen
                        immerhin das erste "Männerteichpumpen->KNX Gateway"
                        Streiche "Männer" setze "Nerd".

                        Oder halt, Nerd sein ist ja neuerdings sexy...

                        Fry

                        Kommentar


                          #13
                          so nun kann ich schon mal Vollzug melden.

                          Problem war der WG Editor. Dieser lässt die Eingabe von &nbsp; zu und führt das auch nach dem ersten Speichern, aus.

                          Wird das Plugin aber wieder geladen so ist ein &nbsp; nicht mehr vorhanden und ab diesem Zeitpunkt geht es nicht mehr!

                          Ich habe dies nun über den mc editiert und nun geht da, allerdings laufe ich nun in das nächste Problem wo ich nochmals einen Tipp bräuchte.

                          Die Daten kommen nun auf den Bus (siehe Anhang)

                          Diese würde ich nun gerne in der Comet im Step1 anzeigen.



                          Gelöst: hier war die Lösung
                          https://knx-user-forum.de/cometvisu/...angezeigt.html

                          Nochmals Danke für die Hilfe

                          Es werden aber nicht alle Werte angezeigt. Ich habe im WG die GA Adressen schon mal angelegt., hat allerdings nichts gebracht.

                          Die aktuell angezeigten Werte sind unter "KNX Gruppenadressen bearbeiten" nicht vorhanden.

                          Wie Ihr am Beispiel der Software Version seht sollte der Datentyp passen.

                          Was mache ich falsch!
                          Angehängte Dateien
                          Gruß Hartwig

                          Kommentar


                            #14
                            Komisch..
                            Das ist aber eher in der sphäre der CV zu suchen (release 0.6.1 oder SVN?), weil wenn die Werte am Bus kommen, sind sie auch im eibd-cache, das ist sicher
                            Evtl. nur ein Anzeige/Config-Problem; die eibga.conf ("Gruppenadressen-Editor") kann, muss aber nicht befüllt sein, wenn man in Plugin und CV den DPT explizit angibt wie hier..
                            Zeig doch mal die ganze CV-config (/var/www/visu/visu_config.xml)..

                            Makki
                            EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                            -> Bitte KEINE PNs!

                            Kommentar


                              #15
                              Brauche nochmals einen TIPP!

                              Ich will bei der Pumped die Drahzahl regeln

                              Dazu abonniere ich den Gruppenadresse.

                              Wenn ich nun 60% über die Gruppenadresse senden wird die Drehzahl berechnet und über Get an die Website übergeben.

                              Nach 60 sec. wird da Plugin aber wieder gestartet.
                              Der Vorgabewert hat sich nicht geändert das subscribe liefert nun einen Vorgabewert von 0 und sendet diesen an meine Pumpe so dass diese nach 60sec den Dienst quittiert.

                              Wie bekomme ich da Plugin dazu nur aktiv zu werden, wenn sich der abonnierte Wert ändert?


                              my $url = 'http://192.168.0.245/cfg.htm?';
                              my $url_send;
                              my $rpm_wert ='11/1/35'; # GA % Wert
                              my $rpm_soll ='11/1/36'; # GA für Sollwert
                              my $maxdrehzahl =3400;
                              my $drehzahl; # Umgerechnete Wert für die Steuerung
                              my $rpm_vorgabe; # % Wert auf dem Bus

                              #Der Wert ist ein Prozentwert und muß mit der max. Drehzahl von max_drehzahl multipliziert werden

                              $plugin_subscribe{$rpm_wert}{$plugname}=1;
                              if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $rpm_wert) {
                              $rpm_vorgabe= decode_dpt5($msg{'data'});
                              }



                              $drehzahl = int($rpm_vorgabe * $maxdrehzahl/100);
                              knx_write($rpm_soll,$drehzahl,9);
                              # der wert drehzahl wird nun der Website mit dem parameter ?rpmmax=$drehzahl übergeben

                              my $url_send = $url."rpmmax=".$drehzahl."&saveconfig=Save";
                              my $ret = encode("utf8",get($url_send));
                              return "Werte: $drehzahl, $rpm_vorgabe, $maxdrehzahl, $url_send";
                              Gruß Hartwig

                              Kommentar

                              Lädt...
                              X