notify mit get-Request debuggen?

Begonnen von simonszu, 20 Dezember 2015, 21:33:45

Vorheriges Thema - Nächstes Thema

simonszu

Hallo Forum,

folgende Situation:

Ich habe einen HM-EM-TX-WM-Sensor für meinen Stromzähler, den ich via fhem und HM-CFG-USB auslese. Die erlangten Daten möchte ich gerne in eine Volkszähler-Instanz einspeisen. Dies geht, indem man auf eine API-URL von der Volkszähler-Instanz einen GET-Request macht. Leider scheitere ich dabei.
Ich habe zunächst einen notify angelegt, der durch eine Veränderung von Stromzähler:power ausgelöst wird, in diesem Reading steht die momentane Leistung, die meine Wohnung aus dem Stromnetz abgreift. Mein Notify sieht momentan so aus:

Stromzaehler:power:.* {
my $base_url = "http://myhost.tld/middleware.php";
my $watt = ReadingsVal("AktuellerVerbrauch", "state", 0);
my $uuid = "XXX-XXX";
my $update_url = $base_url . '/data/' . $uuid . '.json?operation=add&value=' . $watt;

fhem("set Pushover1 msg 'Notify getriggert'");

}


(Ich habe die URL und die UUID obfuscated).

Nun habe ich das Problem, dass ich dieses notify nicht gut debuggen kann. Als Workaround habe ich den Call auf fhem-Pushover am Ende, sodass ich zumindest mitbekomme, ob der Codeblock vorher problemlos durchläuft. Woran ich jetzt noch scheitere ist der GET-Request auf den VZ-Server. Laut Doku von Perl reicht es da einfach, mit get(url) den Request zu triggern. Da der Befehl aber noch einen Callback hat, habe ich versucht, mit my $foo = get($update_url); das Resultat des Requests in einer Variable zu speichern, die sofort wieder verworfen wird.

Wie auch immer - es steht und fällt mit dem get-Befehl. Habe ich ihn drin, wird der notify nicht ausgeführt. Habe ich ihn nicht drin, wird der Rest des notifys ausgeführt. In beiden Fällen gibt's aber kein Update auf die VZ-Instanz.
Ich könnte bei meinen Programmierkenntnissen das Problem vermutlich selbsttätig debuggen, aber ich habe keine Ahnung, ob fhem die Fehler irgendwo anzeigt. Im allgemeinen Logfile steht nichts drin, und wo sonst irgendwelche Exceptions angezeigt werden könnten, weiß ich nicht.

Wäre nett, wenn mir hier jemand helfen könnte.

Und wo wir gerade dabei sind: Ich habe mich bei dem Codeblock des Notifys an http://www.fhemwiki.de/wiki/Volkszaehler ganz unten orientiert. Mir ist allerdings nicht ganz klar, wie der dortige Log-Befehl genau funktioniert. Was macht die Zahl da, und in welches Log schreibt der dann? Ist ja immerhin normales Perl, ist das dennoch irgendwo im fhem-Scope, obwohl es außerhalb jeglicher fhem()-Befehle stattfindet?

rudolfkoenig

ZitatNun habe ich das Problem, dass ich dieses notify nicht gut debuggen kann
Notifies kann man sehr gut debuggen mit dem trigger Kommando.

ZitatLaut Doku von Perl reicht es da einfach, mit "get(url)" den Request zu triggern.
Diese Doku wuerde ich gerne sehen.
Mir ist nur das FHEM-eigene GetFileFromURL()/HttpUtils_NonblockingGet()/usw. bekannt.

ZitatHabe ich ihn drin, wird der notify nicht ausgeführt.
Vermutlich steht die Ursache in FHEM-Log.

betateilchen

Fangen wir mal mit dem einfachen an:

Zitat von: simonszu am 20 Dezember 2015, 21:33:45
Mir ist allerdings nicht ganz klar, wie der dortige Log-Befehl genau funktioniert. Was macht die Zahl da, und in welches Log schreibt der dann? Ist ja immerhin normales Perl, ist das dennoch irgendwo im fhem-Scope, obwohl es außerhalb jeglicher fhem()-Befehle stattfindet?

Die Zahl gibt den Loglevel (innerhalb fhem) an, mit dem die Nachricht geloggt werden soll. Wobei die Funktion Log() innerhalb fhem eigentlich durch Log3() ersetzt werden sollte. Dokumentation zur Funktion gibts hier im Forum und innerhalb von fhem.pl, wo diese Funktion bereitgestellt wird.


Nächste Frage:

Zitat von: simonszu am 20 Dezember 2015, 21:33:45
Laut Doku von Perl reicht es da einfach, mit get(url) den Request zu triggern.

Das stimmt prinzipiell schon, aber Du solltest auch die gesamte Dokumentation lesen. Das funktioniert nämlich nur, wenn Du zuvor ein Object aus LWP::Simple definiert hast, das mit diesem Methodenaufruf überhaupt etwas anfangen kann. In Deinem notify wird das auf keinen Fall funktionieren.


Nächste Frage:

Zitat von: simonszu am 20 Dezember 2015, 21:33:45
Ich könnte bei meinen Programmierkenntnissen das Problem vermutlich selbsttätig debuggen, aber ich habe keine Ahnung, ob fhem die Fehler irgendwo anzeigt. Im allgemeinen Logfile steht nichts drin, und wo sonst irgendwelche Exceptions angezeigt werden könnten, weiß ich nicht.

Klingt nach typischem JAVA-Denken *grusel*

Tipp: Bau Dir eine Funktion in der 99_myUtils.pm, die Du dann in Deinem notify aufrufst. In dieser Funktion kannst Du dann spielen, debuggen und testen soviel Du möchtest.


Zitat von: simonszu am 20 Dezember 2015, 21:33:45
Ich könnte bei meinen Programmierkenntnissen das Problem vermutlich selbsttätig debuggen, aber ich habe keine Ahnung

Wenn man keine Ahnung hat, sollte man zumindest mal die fhem-Grundlagendoku und die fhem-Dokumente, die es für Entwickler gibt, gelesen haben. Dann hätte man zumindest schonmal verstanden, wie das Logging innerhalb von fhem funktioniert  8)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

Ich habe das Event-Monitor mit optionalen FHEM Log (aka Logfile) Monitoring erweitert, d.h. ab sofort kann man hier auch die eigenen Log/Log3 Aufrufe zusammen mit den Events sehen.

Ab sofort bedeutet ab morgen per update.

Wuppi68

Tante Google listet bei "Perl Debug" alles notwendige auf :-)

@Rudi: Danke
FHEM unter Proxmox als VM

simonszu

Zitat von: rudolfkoenig am 21 Dezember 2015, 08:31:54
Diese Doku wuerde ich gerne sehen.
Mir ist nur das FHEM-eigene GetFileFromURL()/HttpUtils_NonblockingGet()/usw. bekannt.
Mein Fehler. Es geht wohl wirklich nur mit LWP::Simple, wie betateilchen schrieb. Mit HttpUtils_NonblockingGet() habe ich es hinbekommen. Im von mir oben verlinkten Wiki-Artikel zum Volkszähler steht das notify-Snippet allerdings ohne LWP::Simple drin.

Zitat von: betateilchen am 21 Dezember 2015, 11:27:01

Klingt nach typischem JAVA-Denken *grusel*

Ruby, genau genommen. ;) Ich wüsste jetzt auch nicht, was so gruselig daran sein soll, Exceptions lesen zu wollen, um zu erkennen, was an dem Code jetzt falsch ist.

Zitat von: Wuppi68 am 21 Dezember 2015, 11:48:32
Tante Google listet bei "Perl Debug" alles notwendige auf :-)

Was auch durchaus benutzbar ist, wenn man Perlscripte normal von der Kommandozeile aus aufruft. 

Mit dem trigger-Command muss ich mich nochmal reinfuchsen. Momentan habe ich noch folgendes Resultat:
trigger Stromzaehler:power:30
Please define Stromzaehler:power:30 first


...obwohl das doch eigentlich genau dem Regexp "Stromzaehler:power:.*" des Notifys entspricht.

marvin78

Siehe commandref zu trigger:

Zitattrigger <devspec> <state>

Markus Bloch

Zitat von: rudolfkoenig am 21 Dezember 2015, 11:38:19
Ich habe das Event-Monitor mit optionalen FHEM Log (aka Logfile) Monitoring erweitert, d.h. ab sofort kann man hier auch die eigenen Log/Log3 Aufrufe zusammen mit den Events sehen.

Ab sofort bedeutet ab morgen per update.

Finde ich prinzipiell super, nur dann müsste man generell anfangen html-entities zu ersetzen, da ansonsten bei der Ausgabe von XML oder HTML Output im Log folgendes passiert (siehe Anhang).

Ich schlage vor den Text generell durch die jQuery-interne HTML-Konvertierung zu jagen:

function htmlEncode(value){
  //create a in-memory div, set it's inner text(which jQuery automatically encodes)
  //then grab the encoded contents back out.  The div never exists on the page.
  return $('<div/>').text(value).html();
}


siehe dazu: http://stackoverflow.com/questions/1219860/html-encoding-in-javascript-jquery

Viele Grüße

Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

rudolfkoenig

Ich frage mich eher was HTML-Code im FHEM-Log zu suchen hat.
Dein Beispiel tut nicht, da die Daten in <div> gesendet werden (sonst waere es nicht rot).

Markus Bloch

Nunja, nicht umbedingt reinweg HTML Code, aber XML Code beim Debuggen von Modulen mit XML Schnittstelle.

In meinem Fall wird die XML-Antwort im Log festgehalten wenn man verbose 5 gesetzt hat. Nunja, die ganze Struktur geht dann natürlich flöten, weil es als HTML vom Browser interpretiert wird:

2015.12.24 13:12:24.258 5: YAMAHA_AVR (AV_Receiver) - got response for "statusRequest basicStatus": <YAMAHA_AV rsp="GET" RC="0"><Main_Zone><Basic_Status><Power_Control><Power>Standby</Power><Sleep>Off</Sleep></Power_Control><Volume><Lvl><Val>-450</Val><Exp>1</Exp><Unit>dB</Unit></Lvl><Mute>Off</Mute></Volume><Input><Input_Sel>AirPlay</Input_Sel><Input_Sel_Item_Info><Param></Param><RW>RW</RW><Title> AirPlay </Title><Icon><On>/YamahaRemoteControl/Icons/icon067.png</On><Off></Off></Icon><Src_Name>AirPlay</Src_Name><Src_Number>1</Src_Number></Input_Sel_Item_Info></Input><Surround><Program_Sel><Current><Straight>Off</Straight><Enhancer>On</Enhancer><Sound_Program>5ch Stereo</Sound_Program></Current></Program_Sel><_3D_Cinema_DSP>Auto</_3D_Cinema_DSP></Surround><Sound_Video><Tone><Bass><Val>0</Val><Exp>1</Exp><Unit>dB</Unit></Bass><Treble><Val>0</Val><Exp>1</Exp><Unit>dB</Unit></Treble></Tone><Direct><Mode>Off</Mode></Direct><HDMI><Standby_Through_Info>On</Standby_Through_Info><Output><OUT_1>On</OUT_1></Output></HDMI><Adaptive_DRC>Auto</Adaptive_DRC></Sound_Video></Basic_Status></Main_Zone></YAMAHA_AV>


Das Tag "<Input>" wurde dann eben durch den Browser in eine Textbox umgewandelt. Das würde ich gerne vermeiden.

Das JS-Beispiel war nur ungetestet verlinkt. Ich bin momentan unterwegs und hab leider nicht die Zeit um einen Patch zu bauen.

Viele Grüße und frohe Weihnachten

Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

rudolfkoenig


Markus Bloch

So gehts natürlich auch.

Vielen Dank

Gruß´
Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)