Diskussion:HTTPMOD

Aus FHEMWiki
Wechseln zu: Navigation, Suche

Ich habe mehrere Anmerkungen. Könnte man nicht einen deutschen Teil vorschalten (bevor es komplex wird)? Der Hinweis auf 2013 scheint mir inzwischen überflüssig zu sein. Ich würde auch in einem Abschnitt vorab anmerken, dass es einfache readings, dann set und dann get gibt und wann man was verwendet. Am besten versuche ich das hier mal:

X mark.svg Bitte Webseiten nur zu Zeitpunkten abrufen, an denen die abgefragten Informationen tatsaechlich gebraucht werden. Ein zu kurzes Zeitintervall oder Abrufe zu unnötigen Zeiten führen zu erheblichen Belastung des Dienstanbieters und schlimmstenfalls zu Diensteinstellungen. Siehe zur Problematik unbedingt Forenthread.

Mit Hilfe des HTTPMOD kann man automatisiert auf Webseiten zugreifen, Informationen holen und Daten senden. Im einfachsten Fall wird regelmäßig ein http-Aufruf gestartet und etwa der Inhalt einer Seite ausgelesen und weiter bearbeitet. Beim Aufruf muss dann die URL sowie das Zeitintervall, in dem der Aufruf erfolgen soll, angegeben werden. Um Informationen aus den aufgerufenen Webseiten auszulesen, werden readings benötigt. In diesem Readings gibt man Regex an, die die notwendige Informationen auslesen. Hierzu am besten ein Beispiel.

define PM HTTPMOD  http://www.klack.de/fernsehprogramm/was-laeuft-gerade/0/-1/free.html 20000

Hierdurch wird ein device erstellt, das auf die Webseite http://www.klack.de/fernsehprogramm/was-laeuft-gerade/0/-1/free.html mit dem Fernsehprogramm alle 20000 Sekunden zugreift. Werden weder readings noch weitere Attribute definiert, so erfolgt ausschließlich der Aufruf der Webseite und FHEM erhält keine weiteren Daten aus dem Webzugriff.

Nun wird aber beim Aufruf der Webseite ein Fernsehprogramm zurückgegeben, das man möglicherweise auslesen will. Um etwa die Inhalte in FHEM abzuspeichern, die mit der ARD zusammenhängen, benötigt man ein reading. Dieses reading muss einen Namen enthalten (damit FHEM weiß, unter welchem Namen die Information gespeichert wird) und einen Regex (damit man weiß, wo auf der Webseite die Information enthalten ist). Da üblicherweise nicht ein, sondern sehr viele Readings definiert werden, werden diese Readings durchnummeriert. Dies geschieht durch Zahlen, die unmittelbar nach dem Wort reading angegeben werden. In unserem Beispiel wäre dies etwa

attr PM reading1Name ARD 
attr PM reading1Regex <span class="stationName">ARD<\/span>[\w\W]*?<div class="content">\s*<a[\w\W]*?>\s*(.*?)\s*<\/a> 
attr PM reading2Name ARD_time 
attr PM reading2Regex <span class="stationName">ARD<\/span>[\w\W]*?<td class="time">\s*(.*?)\s*< 
attr PM reading3Name ARD_details 
attr PM reading3Regex <span class="stationName">ARD<\/span>[\w\W]*?<div class="content">\s*<a[\w\W]*?>[\w\W]*?<\/a>\s*<br\/>\s*(.*?)(<img|<\/div)

Das Reading1 enthält die Sendung, reading2 die Uhrzeit und reading3 weitere Details. Die Regex ergeben sich aus dem Aufbau der Webseite und müssen eventuell in mühevoller Kleinarbeit entworfen werden.

Es gibt Fälle, wo dies auch nicht reicht. So könnte es beispielsweise sein, dass man die Informationen aus dem Webzugriff nicht automatisiert, sondern durch manuell erhalten will. Dann muss zuerst oben bei der Zeitdauer eine 0 eingegeben werden. Wie aber weiß dann HTTPMOD, wann die Daten geholt werden sollen? Hierzu dienen get-Befehle. Wird ein get-Befehl ausgeführt, so greift HTTPMOD auf die Webseite zu, holt die Informationen und füllt die entsprechenden Readings.

Wieder ist es möglich, dass man nicht einen, sondern mehrere get-Befehle erstellen wird. Deshalb folgt auf get immer (mindestens) eine Zahl, mit der die get-Befehle durchnummeriert werden. Auch hierzu ein Beispiel. Das Fernsehprogramm soll manuell und nicht zeitgesteuert aufgerufen werden. Dazu ändern wir zuerst die Definition in

define PM HTTPMOD  http://www.klack.de/fernsehprogramm/was-laeuft-gerade/0/-1/free.html 0

und fügen bei den Attributen hinzu

attr PM get1Name ARDHolen

Mit dem Befehl "get PM ARDHolen" werden dann die oben stehenden Readings gefüllt. Damit allerdings FHEM weiß, dass neben dem reading1 auch die anderen reading2, reading3 usw. eingelesen werden sollen, muss das (User-)Attribut

attr PM get1CheckAllReadings 1

gesetzt werden.

Wenn beim Aufruf der Webseite die URL nicht ausreicht, sondern ein spezieller Header mitgesendet werden soll, kann dies mit dem Attribut get1Header geschehen. Ist der Header mehrzeilig, so können die einzelnen Zeilen mit get1Header1, get1Header2 usw eingetragen werden.

Will man verschiedene URLs auswerten oder ansteuern, kann man mehrere get-Befehle (get1, get2 usw) definieren und diese mit eigenen URLs versehen. Dabei liest get1 üblicherweise nur die reading1, get2 nur die reading2 usw ein. Mit CheckAllReadings werden dagegen alle readings gleichzeitig ausgewertet.

Sollen auf der Webseite nur Daten gesendet, aber nicht ausgelesen werden, bietet sich der set-Befehl an. Er ist analog zum get-Befehl aufgebaut.

Etwas komplexer wird es, wenn die Webseite eine Login-Prüfung voraussetzt. Hierzu dienen die sid-Attribute. usw usf.

--2017 Jun 12, andies