Hallo Zusammen,
ich bin ein Frischling in Sachen FHEM komme aber schon ganz gut zurecht. Mit dem Modul HTTPMOD habe ich allerdings so meine Probleme.
Ich habe in meiner Dreifach-Garage einen Raspberry hängen, der die Tor- und Lichtsteuerung macht. Gesteuert wird via HTTP. Eine URL öffnet ein bestimmtes Tor, die gleiche mit anderen Parameter schließt es wieder und nochmal andere Parameter geben den Status des Tors aus (geöffnet/geschlossen bzw. 1 oder 0).
Jetzt möchte ich natürlich Tore und Licht in FHEM integrieren und habe mir das HTTPMOD schon vorgenommen. Aber so richtig funktionieren tut das nicht. Hier mein Code. Wo mache ich den Fehler? Ich möchte das Tor öffnen, schließen und sehen, ob es offen oder geschlossen ist.
define Garagentor HTTPMOD http://192.168.178.9/schalter.php?gate=true&item=0&state=true 10
attr Garagentor userattr set01IMap set01Name set01URL
attr Garagentor room Garage,Homekit
attr Garagentor set01IMap 0:off, 1:on
attr Garagentor set01Name Garagentor
attr Garagentor set01URL http://192.168.178.9/schalter.php?gate=true&item=0&action=$val
Erste Zeile, da steht die URL zum Status abrufen, und die letzte Zeile ist zum Tor bewegen. action muss 1 oder 0 sein.
VG
Ich bin jetzt kein HTTPMOD experte aber für den get fehlt mir irgendeine Angabe, was denn mit der Rückgabe von dem URL passieren soll - Ich vermute Du bräuchtest noch ein get01.... Set von Attributen?
Was noch wichtig wäre zu erklären, was momentan nicht funktioniert bzw. was funktioniert (z.B. geht der set)?
Nein, es funktioniert nichts. Kein Get und kein Set.
Ist das denn das richtige Modul für mein Vorhaben, oder gibt es ein besseres?
Was passiert denn, wenn Du
set Garagentor Garagentor off
oder
set Garagentor Garagentor on
eingibst?
Wenn dabei nichts geht, lösche doch mal ...iMap attribut und versuche
set Garagentor Garagentor 0
bzw.
set Garagentor Garagentor 1
Ich werd bekloppt. Jetzt geht das. Hatte das eben schon mal ausprobiert, aber da ging es nicht.
Jetzt wird nur noch der Status nicht richtig angezeigt.
Dann verweise ich nochmal auf Antwort #1 - Ich denke da fehlt es noch an Festlegungen was im Reading auftauchen soll
Hab ich mich gestern Abend auch noch dran gemacht. Ich glaube ich bin nah dran.
define Garagentor HTTPMOD http://192.168.178.9/schalter.php?gate=true&item=0&state=true 10
attr Garagentor userattr get1IMap get1Name get1Poll:0,1 get1PollDelay get1URL set1IMap set1Name set1URL
attr Garagentor get1IMap 0:off, 1:on
attr Garagentor get1Name STATE
attr Garagentor room Garage,Homekit
attr Garagentor set1IMap 0:off, 1:on
attr Garagentor set1Name Garagentor
attr Garagentor set1URL http://192.168.178.9/schalter.php?gate=true&item=0&action=$val
Im Log steht nun: 2016.12.17 09:54:38 3: Garagentor: Read response to update didn't match any Reading
Habe den get1 extra STATE genannt, in der Hoffnung, dass der Status dann auch dort eingetragen wird, wo derzeit die Fragezeichen stehen... Geht aber noch nicht.
Der Rückgabewert vom Server in der Garage ist 0 oder 1.
Das Modul HTTPMOD geht meines Wissens davon aus, dass man aus dem Ergebnis des HTTP requests einen Teil extrahieren will und den als Reading zur Verfügung stellen möchte.
Ob das Reading STATE heissen kann, weiss ich nicht.
Generelle Tipps - Ich würde immer erst versuchen die Funktion grundsätzlich zum Laufen zu bekommen, bevor die Verschönerungen beginnen Name des Readings und die IMap sind Verschönerungen) solange DU den http request nicht in ein Reading bekommst sind das nur Fehlerquellen.
Jetzt zu Deinen Settings
- Meines Wissens nach gibt es kein get..IMap
- get... erzeugt ein get command - ich dachte Du willst ein Reading
Ich denke Du solltest die Commandref für HTTPMod wirklich mal lesen und dann eines der Beispiele anpassen
Also Vorschlag:
- Wirf alle get... Attribute weg
- setze den URL auf den URL den Du pollen möchtest und nicht auf den Server root
- definiere reading Attribute für Name und für den regexp
reading1Regex .*
In der Referenz hab ich gelesen. Steige da aber offensichtlich nicht so durch.
Das Get hatte ich zwischenzeitlich schon zum Reading geändert.
Mit deinem Regex Eintrag und eine Änderung des Namen für das Reading auf Status liest er jetzt auch was aus, aber doch irgendwie nicht richtig. Rufe ich die URL im Browser auf, steht da 0, das Reading kommt auf 1.
Dafür gibts keine Fehler mehr im Log.
Ich geh erstmal in den Garten (also in echt ;) ). Mal schauen, ob ich da einen klaren Kopf bekomme.
define HTTPGaragentor HTTPMOD http://192.168.178.9/schalter.php?gate=true&item=0&state=true 10
attr HTTPGaragentor room Garage
attr HTTPGaragentor userattr reading1Name reading1Regex set1IMap set1Name set1URL
attr HTTPGaragentor reading1Name Status
attr HTTPGaragentor reading1Regex .*
attr HTTPGaragentor set1IMap 0:off, 1:on
attr HTTPGaragentor set1Name HTTPGaragentor
attr HTTPGaragentor set1URL http://192.168.178.9/schalter.php?gate=true&item=0&action=$val
Wie bereits gesagt, ich würde das Reading nicht Status nennen, wer weiss wo der Wert 1 sonst herkommt
Aber ich wiederhole mich
Hatte das so verstanden, es nicht STATE zu nennen.
Egal, geändert auf Zustand, gleiches Verhalten.
mach doch mal ein list des HTTPMOD device und poste das Ergebnis hier (in Code tags bitte!)
Internals:
BUSY 0
DEF http://192.168.178.9/schalter.php?gate=true&item=0&state=true 10
Interval 10
LASTSEND 1481974435.77344
MainURL http://192.168.178.9/schalter.php?gate=true&item=0&state=true
ModuleVersion 3.3.5 - 29.9.2016
NAME HTTPGaragentor
NR 45
STATE ???
TRIGGERTIME 1481974445.77156
TRIGGERTIME_FMT 2016-12-17 12:34:05
TYPE HTTPMOD
addr http://192.168.178.9:80
buf
code 200
conn
data
displayurl http://192.168.178.9/schalter.php?gate=true&item=0&state=true
header
host 192.168.178.9
httpheader HTTP/1.1 200 OK
Date: Sat, 17 Dec 2016 11:34:05 GMT
Server: Apache/2.4.10 (Raspbian)
Content-Length: 1
Connection: close
Content-Type: text/html; charset=UTF-8
httpversion 1.0
hu_blocking 0
hu_filecount 1
ignoreredirects 0
loglevel 4
path /schalter.php?gate=true&item=0&state=true
protocol http
redirects 0
timeout 2
url http://192.168.178.9/schalter.php?gate=true&item=0&state=true
value 0
QUEUE:
Readings:
2016-12-17 11:10:44 Status 1
2016-12-17 10:42:04 Test 1
2016-12-17 12:33:56 Zustand 1
Request:
data
header
ignoreredirects 0
retryCount 0
type update
url http://192.168.178.9/schalter.php?gate=true&item=0&state=true
value 0
Defptr:
Readingbase:
Zustand reading
Readingnum:
Zustand 1
Readingoutdated:
Requestreadings:
Update:
Zustand reading 1
Sslargs:
Attributes:
reading1Name Zustand
reading1Regex .*
room Garage
set1IMap 0:off, 1:on
set1Name HTTPGaragentor
set1URL http://192.168.178.9/schalter.php?gate=true&item=0&action=$val
userattr reading1Name reading1Regex set1IMap set1Name set1URL
Sorry war ein Schnellschuss, setze mal
reading1Regex ^(.*)$
Ich vermute wenn dann ein ganz langes reading mit http header erscheint wäre folgendes der richtige Wert:
reading1Regex ^.*(.)$
Denn es kommt wohl nur 1 Zeichen ausserhalb des Headers zurück
Mit beiden Regex getestet: 2016.12.17 14:45:36 3: HTTPGaragentor: Read response to update didn't match any Reading
Ok, dann setzen wir noch eine OPtion dazu:
attr HTTPGaragentor reading1RegOpt s
Ohhh, wir (du) kommen dem Ziel noch näher.
Mit reading1Regex ^.*(.)$
stand der Header im Reading.
Mit reading1Regex ^(.*)$
nichts mehr (auch nicht 0). Nach 10 Sek. <pre> </pre>
Ich kapiere seit ewigen Zeiten schon nicht dieses olle Regex. Schon so oft versucht, nie kapiert.
Zitat von: quichibo am 17 Dezember 2016, 17:59:09
Ohhh, wir (du) kommen dem Ziel noch näher.
Mit reading1Regex ^.*(.)$
stand der Header im Reading.
Mit reading1Regex ^(.*)$
nichts mehr (auch nicht 0). Nach 10 Sek. <pre> </pre>
Ich kapiere seit ewigen Zeiten schon nicht dieses olle Regex. Schon so oft versucht, nie kapiert.
War das nicht umgekehrt beim 2. Regexp der ganze Header, beim ersten nichts?
Achso, wenn der ganze Header im Reading ist, kopiere doch mal das Reading, denn in Deinem list ist der puffer (internal buf) leider leer, so dass ich nicht erkennen kann, was da genau am Ende steht
Nee, habs nochmal kontrolliert. Hast natürlich recht. Sorry. :-\
Den letzten Post hab ich nicht verstanden. Möchtest du das sehen, was im Reading steht?
<pre>HTTP/1.1 200 OK Date: Sat, 17 Dec 2016 17:30:19 GMT Server: Apache/2.4.10 (Raspbian) Content-Length: 1 Connection: close Content-Type: text/html; charset=UTF-8 </pre>
Das ist auch das, was unter httpheader steht. (abgesehen vom pre Tag)
Ja genau das war mein Ziel und leider steht die 1 oder 0 nicht in dem Puffer, damit bekommen wir das auch per regexp nicht raus...
Denn eigentlich müsste in dem Reading jetzt die gesamte Rückgabe stehen (und nicht nur der http-header) und durch Content-length 1 wird auch bestätigt, dass da was kommt aber interessanterweise steht es nicht sichtbar im reading (und auch nicht im internal buf).
Hast Du einfluss auf das Programm im raspberry, kann das vieleicht etwas mehr zurückliefern als ein 1/0?
Zum Beispiel noch ein Zeilenabschluss?
Ja, das habe ich selber programmiert. Da kann stehen was erforderlich ist, damit es funktioniert!
Eigentlich müsste es ja auch mit dem einen Zeichen funktionieren, wenn Du das beeinflussen kannst dann ändere doch gleich 2 Dinge:
- Packe vor das Ergebnis einen aussagekräftigen Text abgeschlossen mit z.B. :, den kann man gut mit dem Regexp verwenden
- Packe hinter den Wert noch einen Zeilenvorschub
Warum sich die = oder 1 nicht matchen lässt kann ich gerade auch nicht sagen
Hi,
bin leider nicht eher dazu gekommen.
Habe jetzt als Ausgabe Gate1:0 oder Gate1:1. Jeweils mit Zeilenumbruch (\n) dahinter.
Im Regex Tester Online funktioniert das hier: (.)\n
Im Modul steht leider: NIX. :(
Also noch mal einen Schritt zurück:
Was ist im log / in den readings bei folgendem
reading1Regex ^(.*)$
und was ist im log / in den readings bei folgendem
reading1Regex Gate1(.*)$
Jeweils mit dem RegOpt s gesetzt!
Uiuiui...
reading1Regex ^(.*)$
Der Komplette Header mit Gate1:0
reading1Regex Gate1(.*)$
:0
reading1Regex Gate1:(.*)$
0
Das ist die Lösung!!
Nach 10 Sekunden steht dann aber
<pre>0 </pre>
im Reading.
Ich vermute erstmal, das ist nur ein Anzeigeproblem, denn FHEMWEB vermutet, dass die Daten vorformatiert sind und zeichnet sie entsprechend aus.
Versuch doch mal:
reading1Regex Gate1:(\d+)
Damit das alles hinter den Ziffern auch noch entfällt
Du brauchst dann vermutlich nicht mal mehr das Attribut regopt
Jap. So ist es top!
Das letzte passt super ohne regopt
Vielen Vielen Dank!!!!!
Bitte - gern geschehen!
Markierst Du den Thread auch noch als gelöst (Titel ändern)?
EDIT:
Modul wurde nochmal angepasst.
Zur Vollständigkeit:
define Garagentor HTTPMOD http://192.168.178.9/schalter.php?gate=true&item=0&state=true&fhem=true 10
attr Garagentor userattr reading1Name reading1Regex set0Map set0Name set0NoArg:0,1 set0URL set1IMap set1Name set1NoArg:0,1 set1URL
attr Garagentor devStateIcon off:fts_garage_door_100 on:fts_garage_door_20
attr Garagentor icon fts_garage
attr Garagentor reading1Name state
attr Garagentor reading1Regex Gate1:(\w+)
attr Garagentor room Garage
attr Garagentor set0Name off
attr Garagentor set0NoArg 1
attr Garagentor set0URL http://192.168.178.9/schalter.php?gate=true&item=0&action=0
attr Garagentor set1Name on
attr Garagentor set1NoArg 1
attr Garagentor set1URL http://192.168.178.9/schalter.php?gate=true&item=0&action=1
Das ist jetzt das HTTPMOD Modul. Durch die einzelnen Sets habe ich jetzt neben dem Status auch ein on und off stehen mit dem man schalten kann.
Da ich die Ausgabe auf meinem Server in der Garage auf on bzw. off gesetzt habe, funktioniert das jetzt auch super in FHEM:
Internals:
BUSY 0
DEF http://192.168.178.9/schalter.php?gate=true&item=0&state=true&fhem=true 10
Interval 10
LASTSEND 1482093868.76309
MainURL http://192.168.178.9/schalter.php?gate=true&item=0&state=true&fhem=true
ModuleVersion 3.3.5 - 29.9.2016
NAME HTTPGaragentor
NR 45
STATE off
TRIGGERTIME 1482093878.76031
TRIGGERTIME_FMT 2016-12-18 21:44:38
TYPE HTTPMOD
addr http://192.168.178.9:80
buf
code 200
conn
data
displayurl http://192.168.178.9/schalter.php?gate=true&item=0&state=true&fhem=true
header
host 192.168.178.9
httpheader HTTP/1.1 200 OK
Date: Sun, 18 Dec 2016 20:44:40 GMT
Server: Apache/2.4.10 (Raspbian)
Content-Length: 10
Connection: close
Content-Type: text/html; charset=UTF-8
httpversion 1.0
hu_blocking 0
hu_filecount 264
ignoreredirects 0
loglevel 4
path /schalter.php?gate=true&item=0&state=true&fhem=true
protocol http
redirects 0
timeout 2
url http://192.168.178.9/schalter.php?gate=true&item=0&state=true&fhem=true
value 0
QUEUE:
Readings:
2016-12-18 21:44:29 state off
Request:
data
header
ignoreredirects 0
retryCount 0
type update
url http://192.168.178.9/schalter.php?gate=true&item=0&state=true&fhem=true
value 0
Defptr:
Readingbase:
state reading
Readingnum:
state 1
Readingoutdated:
Requestreadings:
Update:
state reading 1
Sslargs:
Attributes:
reading1Name state
reading1Regex Gate1:(\w+)
room Garage
set1IMap 0:off, 1:on
set1Name HTTPGaragentor
set1URL http://192.168.178.9/schalter.php?gate=true&item=0&action=$val
userattr reading1Name reading1Regex set1IMap set1Name set1URL
Wie zu sehen ist, auch mit dem Reading state.
Danke - besonderes für die ausführliche Zusammenfassung!