HTML Aufruf senden und Wert lesen

Begonnen von oniT, 04 Mai 2013, 10:24:41

Vorheriges Thema - Nächstes Thema

oniT

Hallo Fhem'ler,

wie im Wiki "HTML Aufruf senden" beschrieben habe ich versucht über GetHttpFile einen Inhalt zu lesen. Folgenden Test habe ich zunächst durchgeführt.


define html_aufruf notify my_schalter:on {\
my $wert=GetHttpFile("192.168.1.150", "/usr-cgi/xml.cgi");;\
log 1, "Temperatur: $wert";;}


Nach Aufruf erfolgt folgender Eintrag in das Logfile:


2013.05.03 20:06:08 3: html_aufruf return value: Temperatur: HTTP/1.0 200 OK
Content-type: text/xml
Cache-Control: no-cache
Expires: -1

<WEB>
 <PCO>
  <ANALOG>
   <VARIABLE>
    <INDEX>1</INDEX>
    <VALUE>12.3</VALUE>
   </VARIABLE>
  </ANALOG>
 </PCO>
</WEB>



Als Rückgabe bekomme ich nun diese XML Strukture mit dem Wert. Gibt es eine Möglichkeit den "Value" in ein Log zu bekommen? Das drumherum interessiert mich ja nicht, ich möchte nur mit dem Wert selbst weiterarbeiten.

Danke
TinoB
BBB - debian weezy - FHEM 5.7
HMLAN - HM-LC-Bl1-FM, HM-ES-PMSw1-PI, HM-LC-Sw1-FM, HM-TC-IT-WM-W-EU, HM-WDS40-TH-I, HM-Sen-Wa-Od, HM-Sec-RHS
Dimplex Wärmepumpe / Dimplex ZL 300 - Modbus TCP
SDM630M - Modbus TCP
SolarLog 200 / SMA SonnyBoy 1.5/2.5 - Modbus TCP

UliM

Hi,
geht es mit sowas wie dem hier?

my @werte=GetHttpFile("192.168.1.150", "/usr-cgi/xml.cgi");;\

foreach (@werte) {
   if( $_ =~ m"<value>(.*)<\/value>") {
     my $wert = $1;
   }
}

   
Ungetestet.

Gruß,
Uli
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

oniT

Hallo Uli,

danke für Deine Antwort. Folgendes habe ich eingetragen:


define html_aufruf notify my_schalter:on {\
my @werte=GetHttpFile("192.168.1.150", "/usr-cgi/xml.cgi");;\
 foreach (@werte) {\
   if( $_ =~ m"<value>(.*)<\/value>") {\
     my $wert = $1;; \
  }\
 }\
}


Nach Aufruf steht folgende Fehlermeldung im Logfile:


2013.05.04 22:01:01 3: html_aufruf return value: No such class my_schalterwerte at (eval 1559) line 1, near "{ my my_schalterwerte"

Bareword "my_schalterwerte" not allowed while "strict subs" in use at (eval 1559) line 1. syntax error at (eval 1559) line 1, near "my my_schalterwerte="


mit der ich leider nichts anfangen kann. Ich bin da echt nicht der große Perl Spezialist. Könntest Du hier bitte nochmals drüber schauen.

Danke

Gruß
TinoB
BBB - debian weezy - FHEM 5.7
HMLAN - HM-LC-Bl1-FM, HM-ES-PMSw1-PI, HM-LC-Sw1-FM, HM-TC-IT-WM-W-EU, HM-WDS40-TH-I, HM-Sen-Wa-Od, HM-Sec-RHS
Dimplex Wärmepumpe / Dimplex ZL 300 - Modbus TCP
SDM630M - Modbus TCP
SolarLog 200 / SMA SonnyBoy 1.5/2.5 - Modbus TCP

UliM

Wo steht denn
{ my my_schalterwerte"

In dem geposteten Teil steht das nirgend...
äGruß, Uli
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

oniT

Das habe ich mich auch gefragt. Ich nehme an, dass dies irgendwie zusammengesetzt wird aus my_schalter und werte.

Ja, so ist es. Ich habe eben den Test mit:


define html_aufruf notify my_schalter:on {\
my @wertebereich=GetHttpFile("192.168.1.150", "/usr-cgi/xml.cgi");;\
 foreach (@wertebereich) {\
   if( $_ =~ m"<value>(.*)<\/value>") {\
     my $wert = $1;; \
  }\
 }\
}


ausgeführt und bekomme diese Meldung zurück:


2013.05.04 22:41:32 3: html_aufruf return value: No such class my_schalterwertebereich at (eval 1647) line 1, near "{ my my_schalterwertebereich"
Bareword "my_schalterwertebereich" not allowed while "strict subs" in use at (eval 1647) line 1.
syntax error at (eval 1647) line 1, near "my my_schalterwertebereich="


Gruß,

TinoB
BBB - debian weezy - FHEM 5.7
HMLAN - HM-LC-Bl1-FM, HM-ES-PMSw1-PI, HM-LC-Sw1-FM, HM-TC-IT-WM-W-EU, HM-WDS40-TH-I, HM-Sen-Wa-Od, HM-Sec-RHS
Dimplex Wärmepumpe / Dimplex ZL 300 - Modbus TCP
SDM630M - Modbus TCP
SolarLog 200 / SMA SonnyBoy 1.5/2.5 - Modbus TCP

UliM

Hi,
hmmm - das steht ja aber auch nicht im xml-return, das Du oben gepostet hast.

Es fehlt ja nur ein $ - also
my my_schalterwerte=
my $my_schalterwerte=

Du bist sicher dass das nirgend in der gesamten fhem.cfg steht????

Du kannst ja in die Schleife oben ein
Lof 1, "return-Zeile: $_";
setzen, dann sieht man welche Zeilen durchsucht werden.

Gruß, Uli
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

oniT

Hi Uli,

nein in der fhem.cfg steht nichts drin, diese lasse ich bis auf wenige Sachen unverändert. An diese greife ich nicht an und lade mit include meine eigenen *.cfg's. Von daher kann es nicht daran liegen.

Ich habe den Log eingefügt und die Fehlermeldung bleibt gleich. Ich meine es kommt erst gar nicht zur Ausführung der Schleife. Es wird kein weiterer Log-Eintrag geschrieben nur die beschriebene Fehlermeldung. Kann es nicht sein, dass der Fehler irgendwo zwischen den beiden Zeilen:


define html_aufruf notify my_schalter:on {\
my @werte=GetHttpFile("192.168.1.150", "/usr-cgi/xml.cgi");;\  


liegt? In der Fehlermeldung wird ja der "my_schalter" und "werte" zusammengesetzt zu "my_schalterwerte".

Danke

Gruß,
TinoB
BBB - debian weezy - FHEM 5.7
HMLAN - HM-LC-Bl1-FM, HM-ES-PMSw1-PI, HM-LC-Sw1-FM, HM-TC-IT-WM-W-EU, HM-WDS40-TH-I, HM-Sen-Wa-Od, HM-Sec-RHS
Dimplex Wärmepumpe / Dimplex ZL 300 - Modbus TCP
SDM630M - Modbus TCP
SolarLog 200 / SMA SonnyBoy 1.5/2.5 - Modbus TCP

oniT

Hi Uli,

bzgl. der Fehlermeldung, dachte ich mir könnte es ja an dem notify liegen und habe folgendes geändert:


define html_aufruf at +*00:01:00 {\
 my @werte=GetHttpFile("192.168.1.150", "/usr-cgi/xml.cgi");;\
  foreach (@werte) {\
    if( $_ =~ m"<value>(.*)<\/value>") {\
      my $wert = $1;; \
  }\
  Log 1, "return-Zeile: $_";;\
 }\
}


Dies mit Erfolg, da nun keine Fehlermeldung mehr ausgegeben wird. Im Logfile steht nun folgender Eintrag und ich nehme an, dass ist das was Du meintest, da ja hier wieder Zeile für Zeile der Schleife ausgegeben wird:


2013.05.05 18:52:40 1: return-Zeile: HTTP/1.0 200 OK
Content-type: text/xml
Cache-Control: no-cache
Expires: -1

<WEB>
 <PCO>
  <ANALOG>
   <VARIABLE>
    <INDEX>1</INDEX>
    <VALUE>22.0</VALUE>
   </VARIABLE>
  </ANALOG>
 </PCO>
</WEB>


Was zunächst wieder recht gut aussieht. Was ich nun nicht weiß, wie bekomme ich den Value nun geloggt? Ich habe dies so versucht:


define html_aufruf at +*00:01:00 {\
 my @werte=GetHttpFile("192.168.1.150", "/usr-cgi/xml.cgi");;\
  foreach (@werte) {\
    if( $_ =~ m"<value>(.*)<\/value>") {\
      my $wert = $1;; \
  }\
 Log 1, "Temperatur: $wert";;\
 }\
}


und erhalte als Ergebnis dann allerdings folgendes:


2013.05.05 18:59:50 3: Global symbol "$wert" requires explicit package name at (eval 2974) line 1.


Was ist das nun wieder?

Trage ich diesen hier ein:


define html_aufruf at +*00:01:00 {\
 my @werte=GetHttpFile("192.168.1.150", "/usr-cgi/xml.cgi");;\
  foreach (@werte) {\
    if( $_ =~ m"<value>(.*)<\/value>") {\
      my $wert = $1;; \
  Log 1, "Temperatur: $wert";;\
  }\
 }\
}


wird nichts in das Logfile geschrieben. Was mache ich hier falsch? Würdest Du mir hier bitte weiter helfen?

Danke

Gruß,
TinoB
BBB - debian weezy - FHEM 5.7
HMLAN - HM-LC-Bl1-FM, HM-ES-PMSw1-PI, HM-LC-Sw1-FM, HM-TC-IT-WM-W-EU, HM-WDS40-TH-I, HM-Sen-Wa-Od, HM-Sec-RHS
Dimplex Wärmepumpe / Dimplex ZL 300 - Modbus TCP
SDM630M - Modbus TCP
SolarLog 200 / SMA SonnyBoy 1.5/2.5 - Modbus TCP

UliM

Hi,
dann springt die regexp noch nicht an.
Hab's mal getestet mit http://regexp-tester.mediacix.de/exp/regex/
Es liegt an der Groß/Kleinschreibung in der regexp:

define html_aufruf at +*00:01:00 {\
 my @werte=GetHttpFile("192.168.1.150", "/usr-cgi/xml.cgi");;\
  foreach (@werte) {\
    if( $_ =~ m"<VALUE>(.*)<\/VALUE>") {\
      my $wert = $1;; \
  Log 1, "Temperatur: $wert";;\
  }\
 }\
}

Geht's damit?
LG, Uli
PS: Prima dass mal jemand ausführliche Antworten schickt, auf deren Basis man wirklich sehen kann was passiert! :)
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

UliM

Hi Tino,

Zitat von: oniT schrieb am So, 05 Mai 2013 20:30und erhalte als Ergebnis dann allerdings folgendes:


2013.05.05 18:59:50 3: Global symbol "$wert" requires explicit package name at (eval 2974) line 1.


Was ist das nun wieder?
Beim Durchlauf der Schleife traf die Bedingung nie zu. die Deklaration mit my $werte wurde also nie aufgerufen.
Perl beschwert sich nun, dass es in der Zeile Log 1, "$wert" den Inhalt einer Varablen ausgeben soll, die niemals deklariert wurde. Nachvollziehbar :)

Mir fällt grad auf, dass in dem gezeigten Log-Auszug der Text "return-Zeile: " nur ein mal ausgegeben wird. Das array könnte man sich also sparen, denn dort steht demnach alles in einem Feld. Funktioniert aber im regexp-Tester auch so - kann sein dass man in perl in der regexp extra angeben muss, dass es in meheren Zeilen suchen soll. Ob das nötig ist, hängt vmtl vom verwendeten Zeilenende-Zeichen ab.

Geht denn die zuletzt gepostete Version bzw

define html_aufruf at +*00:01:00 {\
 my $wert=GetHttpFile("192.168.1.150", "/usr-cgi/xml.cgi");;\
 $wert =~ s"<VALUE>(.*)<\/VALUE>"$1";
 Log 1, "Temperatur: $wert";;\
}
?

=8-)
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

oniT

Hi Uli,

ja, die zuletzt gepostete Version geht. Ich habe den "VALUE" nun groß geschrieben und es funktioniert ;-) Ich bin begeistert. Das Schlimme, ich war fast schon einmal an der Stelle und hatte es so getestet. Allerdings etwas zu früh, da wurde noch die Fehlermeldung bzgl. dem "notify" ausgegeben. :)

Danke auch für die Erklärung.

Darf ich noch eine abschließende Frage zu diesem Thema anhängen? Ich sehe jetzt zwar den Wert im Logfile, aber ich bekomme diesen nicht in eine LogDatei. Ich dachte es geht ganz einfach so:


define FileLog_Wert ./log/Wert-%Y.log html_aufruf
attr FileLog_Wert logtype temp4hum4:Temperatur,text
attr FileLog_Wert room Log


 aber das war wohl ein Trugschluss.


Unknown module ./log/Wert-%Y.log,


Was ja wiederum logisch ist, da es sich nicht um ein Modul handelt.

Danke

Gruß,
Tino

PS: na ja, es ist ja ein Geben und Nehmen und ich möchte ja was, von daher je mehr Infos um so bessere Infos. Ist ja irgendwie jedem seine Freizeit an dem Projekt mitzuwirken. Ausserdem möchte ich später einmal auch so paar Codeschnippsel meiner Projekte mit einwerfen. Könnte ja sein diese nützen auch anderen.

Übrigens, Dein Einsteiger PDF hatte ich mir mehrfach durchgelesen und hat mir vor 6 Monaten den Einstieg erleichter. Ich kann da einige Anfängerfragen in dem Forum dann nicht so recht verstehen und finde einige Fragen erschreckend.  

BBB - debian weezy - FHEM 5.7
HMLAN - HM-LC-Bl1-FM, HM-ES-PMSw1-PI, HM-LC-Sw1-FM, HM-TC-IT-WM-W-EU, HM-WDS40-TH-I, HM-Sen-Wa-Od, HM-Sec-RHS
Dimplex Wärmepumpe / Dimplex ZL 300 - Modbus TCP
SDM630M - Modbus TCP
SolarLog 200 / SMA SonnyBoy 1.5/2.5 - Modbus TCP

UliM

Hiho,
gut dass es nun klappt :)

In ein Log schreiben geht mit "trigger".

Wenn Du bereits ein device "mydevice" hast, kannst Du in dem notify statt des bisherigen Log einfach ein
fhem("trigger mydevice $wert");
eintragen.

Falls Du noch kein device hast:
1. device definieren (zB define mydevice dummy)
2. Trigger wie oben beschrieben setzen
3. dieses device ins logging für die gewünschte Logdatei aufnehmen.

Ein Beispiel für Schritt drei findest Du in
https://groups.google.com/d/msg/fhem-users/JgfxoegUnYI/I5Yyt8ValRIJ

Gruß + viel Erfolg,
Uli
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

oniT

Hallo Uli,

Danke für Deine Hilfe. Die Umsetzung stelle ich demnächst unter "Codeschnippsel" ein. Es ist zwar in diesem Zusammenhang ein Problem mit HMLan aufgetreten, hier Frage ich jedoch im entsprechenden Unterforum bei Martin an.

So sieht zumindest das Plotergebnis aus:

Plotergebnis

Viele Grüße,
TinoB
BBB - debian weezy - FHEM 5.7
HMLAN - HM-LC-Bl1-FM, HM-ES-PMSw1-PI, HM-LC-Sw1-FM, HM-TC-IT-WM-W-EU, HM-WDS40-TH-I, HM-Sen-Wa-Od, HM-Sec-RHS
Dimplex Wärmepumpe / Dimplex ZL 300 - Modbus TCP
SDM630M - Modbus TCP
SolarLog 200 / SMA SonnyBoy 1.5/2.5 - Modbus TCP