Benutzer:StefanStrobel/Module HTTPMOD: Unterschied zwischen den Versionen
(Die Seite wurde neu angelegt: „== Introduction == This module provides a generic way to retrieve information from devices with an HTTP Interface and store them in Readings. It queries a gi…“) |
Keine Bearbeitungszusammenfassung |
||
Zeile 1: | Zeile 1: | ||
== Introduction == | == Introduction == | ||
This module provides a generic way to retrieve information from devices with an HTTP | This module provides a generic way to retrieve information from devices with an HTTP interface and store it in readings. | ||
It queries a given URL with | It queries a given URL with headers and data defined by attributes. | ||
From the HTTP | From the HTTP response it extracts readings named in attributes using regexes also defined by attributes. | ||
== | == Prerequisites == | ||
This | This module uses the non blocking HTTP function <code>HttpUtils_NonblockingGet</code> provided by FHEM's HttpUtils in a new version published in December 2013. | ||
If not already installed in your environment, please update FHEM or install it manually using appropriate commands from your environment. | If not already installed in your environment, please update FHEM or install it manually using appropriate commands from your environment. | ||
Zeile 13: | Zeile 13: | ||
define <name> HTTPMOD <URL> <Interval> | define <name> HTTPMOD <URL> <Interval> | ||
</pre> | </pre> | ||
The module connects to the given URL every Interval seconds, sends optional headers and data and then parses the response | The module connects to the given <code>URL</code> every <code>Interval</code> seconds, sends optional headers and data and then parses the response | ||
Example: | Example: | ||
Zeile 21: | Zeile 21: | ||
== Configuration of HTTP Devices == | == Configuration of HTTP Devices == | ||
If your device expects special HTTP-headers then specify them as <code>attr requestHeader1</code> to <code>attr requestHeaderX</code>. | |||
If your Device expects an HTTP POST instead of HTTP GET then the POST-data can be specified as <code>attr requestData</code>. | |||
To get the readings, specify pairs of <code>attr readingNameX</code> and <code>attr readingRegexX</code> to define which readings you want to extract from the HTTP response and how to extract them. The actual values to be extracted have to be sub expressions within () in the regex (see example below) | |||
=== Example for a PoolManager 5: === | === Example for a PoolManager 5: === | ||
Zeile 63: | Zeile 65: | ||
</pre> | </pre> | ||
To configure HTTPMOD for a PoolManager one would first define a PoolManager | To configure HTTPMOD for a PoolManager one would first define a PoolManager device with e.g. the name PM, the URL and an interval of e.g. 60 seconds. | ||
Then the | Then the data to be sent in the request needs to be defined because in this example the device expects a POST request so the query is not contained in the URL but in the request data. | ||
Also as seen above the device expects special HTTP | Also as seen above the device expects special HTTP headers in the request so these headers also need to be defined as <code>attr PM requestHeader1</code> and <code>attr PM requestHeader2</code> | ||
Then the names of the | Then the names of the readings to be extracted would be set with attributes | ||
Then for each | Then for each reading value to be extracted a regular expression needs to be set that will match the value in question within (). | ||
Example: | Example: | ||
Zeile 91: | Zeile 93: | ||
attr PM stateFormat {sprintf("%.1f Grad, PH %.1f, %.1f mg/l Chlor", ReadingsVal($name,"TEMP",0), ReadingsVal($name,"PH",0), ReadingsVal($name,"CL",0))} | attr PM stateFormat {sprintf("%.1f Grad, PH %.1f, %.1f mg/l Chlor", ReadingsVal($name,"TEMP",0), ReadingsVal($name,"PH",0), ReadingsVal($name,"CL",0))} | ||
</pre> | </pre> | ||
=== Example for AmbientMonitor === | |||
AmbientMonitor is a webbased visualisation for sensors connected to an Arduino device. Its web interface can also be queried with HTTMOD to grab the data into readings. | |||
This example was provided by locutus. The hardware configuration is an Arduino + Ethercard with ENC28J60 Controller + DHT22 Sensor and software can be downloaded from https://github.com/lucadentella/AmbientMonitor | |||
In this example an HTTP GET is sufficent, so no <code>requestData</code> is needed. The device provides temperature and humidity readings in an HTTP response that looks like: | |||
<pre> | |||
HTTP/1.0 200 OK | |||
Content-Type: text/html | |||
myCB({'temperature':22.00,'humidity':46.00}) | |||
</pre> | |||
the definition could be: | |||
<pre> | |||
define AmbientMonitor HTTPMOD http://192.168.1.221/?callback=? 300 | |||
attr AmbientMonitor requestHeader Content-Type: application/json | |||
attr AmbientMonitor readingsName1 Temperatur | |||
attr AmbientMonitor readingsName2 Feuchtigkeit | |||
attr AmbientMonitor readingsRegex1 temperature':([\d\.]+) | |||
attr AmbientMonitor readingsRegex2 humidity':([\d\.]+) | |||
attr AmbientMonitor stateFormat {sprintf("Temperatur %.1f C, Feuchtigkeit %.1f %", ReadingsVal($name,"Temperatur",0), ReadingsVal($name,"Feuchtigkeit",0))} | |||
</pre> | |||
== Set-Commands == | == Set-Commands == | ||
Zeile 98: | Zeile 126: | ||
== Attributes == | == Attributes == | ||
;do_not_notify | |||
;readingFnAttributes | |||
;requestHeader.* | |||
:Define an additional HTTP Header to set in the HTTP request | |||
;requestData | |||
:POST Data to be sent in the request. If not defined, it will be a GET request as defined in HttpUtils used by this module | |||
;readingsName.* | |||
:the name of a reading to extract with the corresponding readingRegex | |||
;readingsRegex.* | |||
:defines the regex to be used for extracting the reading. The value to extract should be in a sub expression e.g. ([\d\.]+) in the above example | |||
== notes == | == notes == | ||
If you don't know which URLs, headers or POST data your web GUI uses, you might try a local proxy like BurpSuite [http://portswigger.net/burp/>BurpSuite] to track requests and responses | If you don't know which URLs, headers or POST data your web GUI uses, you might try a local proxy like BurpSuite [http://portswigger.net/burp/>BurpSuite] to track requests and responses | ||
Future extensions might include attributes to define <code>set</code> commands in a generic way. If a device allows setting of values via HTTP then for each <code>set</code> a name and a corresponding URL with headers and data might be a possible way forward. |
Version vom 12. Januar 2014, 14:22 Uhr
Introduction
This module provides a generic way to retrieve information from devices with an HTTP interface and store it in readings. It queries a given URL with headers and data defined by attributes. From the HTTP response it extracts readings named in attributes using regexes also defined by attributes.
Prerequisites
This module uses the non blocking HTTP function HttpUtils_NonblockingGet
provided by FHEM's HttpUtils in a new version published in December 2013.
If not already installed in your environment, please update FHEM or install it manually using appropriate commands from your environment.
Define
define <name> HTTPMOD <URL> <Interval>
The module connects to the given URL
every Interval
seconds, sends optional headers and data and then parses the response
Example:
define PM HTTPMOD http://MyPoolManager/cgi-bin/webgui.fcgi 60
Configuration of HTTP Devices
If your device expects special HTTP-headers then specify them as attr requestHeader1
to attr requestHeaderX
.
If your Device expects an HTTP POST instead of HTTP GET then the POST-data can be specified as attr requestData
.
To get the readings, specify pairs of attr readingNameX
and attr readingRegexX
to define which readings you want to extract from the HTTP response and how to extract them. The actual values to be extracted have to be sub expressions within () in the regex (see example below)
Example for a PoolManager 5:
The PoolManager Web GUI can be queried with HTTP POST Requests like this one:
POST /cgi-bin/webgui.fcgi HTTP/1.1 Host: 192.168.70.90 Accept: */* Content-Type: application/json;charset=UTF-8 Content-Length: 60 {"get" :["34.4001.value" ,"34.4008.value" ,"34.4033.value"]}
The resulting HTTP Response would look like this:
HTTP/1.1 200 OK Content-type: application/json; charset=UTF-8 Expires: 0 Cache-Control: no-cache Date: Sun, 12 Jan 2014 12:23:11 GMT Server: lighttpd/1.4.26 Content-Length: 179 { "data": { "34.4001.value": "7.00", "34.4008.value": "0.52", "34.4033.value": "24.8" }, "status": { "code": 0 }, "event": { "type": 1, "data": "48.30000.0" } }
To configure HTTPMOD for a PoolManager one would first define a PoolManager device with e.g. the name PM, the URL and an interval of e.g. 60 seconds.
Then the data to be sent in the request needs to be defined because in this example the device expects a POST request so the query is not contained in the URL but in the request data.
Also as seen above the device expects special HTTP headers in the request so these headers also need to be defined as attr PM requestHeader1
and attr PM requestHeader2
Then the names of the readings to be extracted would be set with attributes
Then for each reading value to be extracted a regular expression needs to be set that will match the value in question within ().
Example:
define PM HTTPMOD http://MyPoolManager/cgi-bin/webgui.fcgi 60 attr PM requestData {"get" :["34.4001.value" ,"34.4008.value" ,"34.4033.value", "14.16601.value", "14.16602.value"]} attr PM requestHeader1 Content-Type: application/json attr PM requestHeader2 Accept: */* attr PM readingsName1 PH attr PM readingsName2 CL attr PM readingsName3 TEMP attr PM readingsRegex1 34.4001.value":[ \t]+"([\d\.]+)" attr PM readingsRegex2 34.4008.value":[ \t]+"([\d\.]+)" attr PM readingsRegex3 34.4033.value":[ \t]+"([\d\.]+)" attr PM stateFormat {sprintf("%.1f Grad, PH %.1f, %.1f mg/l Chlor", ReadingsVal($name,"TEMP",0), ReadingsVal($name,"PH",0), ReadingsVal($name,"CL",0))}
Example for AmbientMonitor
AmbientMonitor is a webbased visualisation for sensors connected to an Arduino device. Its web interface can also be queried with HTTMOD to grab the data into readings.
This example was provided by locutus. The hardware configuration is an Arduino + Ethercard with ENC28J60 Controller + DHT22 Sensor and software can be downloaded from https://github.com/lucadentella/AmbientMonitor
In this example an HTTP GET is sufficent, so no requestData
is needed. The device provides temperature and humidity readings in an HTTP response that looks like:
HTTP/1.0 200 OK Content-Type: text/html myCB({'temperature':22.00,'humidity':46.00})
the definition could be:
define AmbientMonitor HTTPMOD http://192.168.1.221/?callback=? 300 attr AmbientMonitor requestHeader Content-Type: application/json attr AmbientMonitor readingsName1 Temperatur attr AmbientMonitor readingsName2 Feuchtigkeit attr AmbientMonitor readingsRegex1 temperature':([\d\.]+) attr AmbientMonitor readingsRegex2 humidity':([\d\.]+) attr AmbientMonitor stateFormat {sprintf("Temperatur %.1f C, Feuchtigkeit %.1f %", ReadingsVal($name,"Temperatur",0), ReadingsVal($name,"Feuchtigkeit",0))}
Set-Commands
none
Get-Commands
none
Attributes
- do_not_notify
- readingFnAttributes
- requestHeader.*
- Define an additional HTTP Header to set in the HTTP request
- requestData
- POST Data to be sent in the request. If not defined, it will be a GET request as defined in HttpUtils used by this module
- readingsName.*
- the name of a reading to extract with the corresponding readingRegex
- readingsRegex.*
- defines the regex to be used for extracting the reading. The value to extract should be in a sub expression e.g. ([\d\.]+) in the above example
notes
If you don't know which URLs, headers or POST data your web GUI uses, you might try a local proxy like BurpSuite >BurpSuite to track requests and responses
Future extensions might include attributes to define set
commands in a generic way. If a device allows setting of values via HTTP then for each set
a name and a corresponding URL with headers and data might be a possible way forward.