Nach update keine Daten mehr aus GetHttpFile() vom Arduino

Begonnen von RieWi, 09 Januar 2014, 15:06:07

Vorheriges Thema - Nächstes Thema

RieWi

Hallo zusammen,

ich habe mehrere Temperatursensoren DS18B20 an einem Arduino angeschlossen und frage die Daten mithilfe eine Ethernetshild ab.
In der FHEM Config  habe ich folgenden Eintrag:
=========snip fhem.cfg==============================
define ah_Sensor at +*00:01:00 {\
my $val = GetHttpFile('192.168.178.51:80', '/?cmd=read_tf');;\
fhem("trigger ah_Sensor $val");;\
}
=========snip fhem.cfg==============================
Der Arduino liefert daraufhin die gewünschten Daten ohne irgendwelche HTTP-Headerangaben z.B.:
F5: 30.50 C0: 22:00 78: 20.50 42: 23:00 4: 31.50 E0: 20.50 21: 27.50

Diese Daten wurden bis zum letzten FHEM update am 31.12.2013 auch ordnungsgemäß protokolliert.
=========snip ah_Sensor-2013.log=======================
2013-12-30_08:13 ah_Sensor F5: 30.50 C0: 22:00 78: 20.50 42: 23:00 4: 31.50 E0: 20.50 21: 27.50
...
2013-12-31_20:13 ah_Sensor
=========snip ah_Sensor-2013.log=======================
Nach dem FHEM update fehlen aber alle Werte!

Mit meinen geringen Perl Kenntnissen konnte ich feststellen, dass der Ardoino über das  Modul HttpUtils.pm noch abgefragt wird und auch antwortet.
An Zeile 226 " $ret=~ s/(.*?)\r\n\r\n//s; # Not greedy: switch off the header. " bis Zeile 229 gehen diese Daten dann verloren.

Was muss ich tun um wieder an die Temperaturdaten zu kommen?
Gibt es eine Modulbeschreibung zum HttpUtils.pm? z.B. was erwartet GetHttpFile() als Aufruf und was als Antwort?

Danke
Willi


rudolfkoenig

ZitatDer Arduino liefert daraufhin die gewünschten Daten ohne irgendwelche HTTP-Headerangaben z.B.:

Das ist aber dann mAn kein Fall fuer "GetHttpFile". Es wundert mich, wieso es frueher funktioniert hat, das Auseinandernehmen des Antwortes hat sich mAn nicht wesentlich geaendert, und auch frueher musste Fehlermeldungen geregnet haben.
Kannst Du bitte nach Zeile 226 (mit dem greedy Kommentar) folgendes einfuegen, und pruefen ob es hilft:

  return ("", $ret) if(!defined($1));


RieWi

In $ret befindet sich die Zeile vom Arduino, ich konnte mir bereits mit [ 230 my $code= $ret; ] helfen was  [ return ("", $ret) if(!defined($1)); ] im Ergebnis gleich kommt.

Ich habe ähnliches Beispiele in Arduino-Foren gefunden und nachgebildet.
Wie kann ich es besser machen und Fehlermeldungen vermeiden?
Ich könnte z.B. die Daten vom Arduino mit einen Http-Header zurückliefern - oder gibt es eine andere Funktion (Modul) dafür?

Gibt es eine Funktionsbeschreibung für HttpUtils.pm?
Ich möchte auch sicherstellen, dass nachfolgende updates ohne manuelle Änderungen funktionieren.

Gruß Willi




 

rudolfkoenig

ZitatWie kann ich es besser machen und Fehlermeldungen vermeiden?
Wenn der Server in deinem Hand ist: ein HTTP Header zurueckliefern, wenigstens eine Zeile, getrennt durch Leerzeile von den Daten. Ich habe aber mein Vorschlag eingecheckt, damit muesste es bei Dir auch ohne Aenderungen funktionieren.

ZitatGibt es eine Funktionsbeschreibung für HttpUtils.pm?
??? Natuerlich nicht.

RieWi

Vielen Dank, funktioniert wieder  :).

Den Http Haeder werde ich vom Arduino mitsenden lassen.
Um´s Perl Studium werde ich dann wohl nicht herumkommen um die Module kennen zu lernen.

Gruß Willi