Neue Version von HTTPMOD mit neuen Features zum Testen

Begonnen von StefanStrobel, 05 Dezember 2015, 08:31:32

Vorheriges Thema - Nächstes Thema

holle75


fireball

Hi,

ich versuche gerade folgendes:

Ein Device soll ein ein eigenes Reading in HTTPMOD setzen, dieses Reading (eine URL) soll dann genommen werden und in einen setURL genutzt werden...
Ich glaube es scheitert schon beim Anlegen des Readings, bzw. ich kann es dadurch von außen auch nicht setzen.

Ob der Rest richtig ist wäre dann auch noch zu begutachten...

Attributes:
   enableControlSet 1
   get01Name  Taster_WiserLink
   get01RegOpt g
   get01Regex \/(wlss[0-9]*)
   get01URL   http://192.168.178.128/ocf/oic/res
   get02Name  Taster_OpenLevel
   get02RegOpt g
   get02Regex "openLevel":[ \t]+([\d]+)
   get03Name  Taster_WiserRoom
   get03RegOpt g
   get03Regex "wiserone\.room":[ \t]+"([\d]+_[\w]+_*[\w]*)"
   get04Name  Taster_WiserName
   get04RegOpt g
   get04Regex "n":[ \t]+"([\w]*[\s\d]*)"
   get05JSON  sceneValues
   get05Name  globaleSzenen
   get05Poll  1
   get05RecombineExpr join " ", @matchlist
   get05URL   http://192.168.178.128/ocf/sceneCollection/0
   get06JSON  sceneValues
   get06Name  lokaleSzenen
   get06Poll  1
   get06RecombineExpr join ",", @matchlist
   get06URL   http://192.168.178.128/ocf/sceneCollection/1
   getHeader1 Content-Type: application/json
   getPoll    1
   getURL     http://192.168.178.128/ocf/deviceStatus
   httpVersion 1.1
   reading03Name Taster_URL
   readingMaxAge 300
   readingMaxAgeReplacement "offline"
   readingMaxAgeReplacementMode text
   replacement03Mode reading
   replacement03Regex %Taster_URL%
   replacement03Value Taster_URL
   room       WISER
   set01Data  {"isIrrelevant": false,"lastScene": "$val"}
   set01Name  setGlobaleSzenen
   set01TextArg 1
   set01URL   http://192.168.178.128/ocf/sceneCollection/0
   set02Data  {"isIrrelevant": false,"lastScene": "$val"}
   set02Name  setLokaleSzenen
   set02TextArg 1
   set02URL   http://192.168.178.128/ocf/sceneCollection/1
   set03Data  {"action" : $val}
   set03Hint  0,1,2
   set03Name  Taster
   set03URL   %Taster_URL%
   set03replacement03Value Taster_URL
   userattr   get01Decode get01JSON get01Name get01Poll:0,1 get01RecombineExpr get01RegOpt get01Regex get01URL get01extractAllJSON:0,1,2 get02ExtractAllJSON:0,1,2 get02JSON get02Name get02Poll:0,1 get02RecombineExpr get02RegOpt get02Regex get02URL get03Name get03Poll:0,1 get03RecombineExpr get03RegOpt get03Regex get03URL get04Name get04RegOpt get04Regex get05JSON get05Name get05Poll:0,1 get05RecombineExpr get05URL get06JSON get06Name get06Poll:0,1 get06RecombineExpr get06URL getHeader1 getPoll:0,1 getURL reading03Name readingMaxAge readingMaxAgeReplacement readingMaxAgeReplacementMode:text,reading,internal,expression,delete replacement03Mode:reading,internal,text,expression,key replacement03Regex replacement03Value set01Data set01Hint set01Name set01TextArg:0,1 set01URL set02Data set02Hint set02Name set02TextArg:0,1 set02URL set03Data set03Hint set03IMap set03Name set03URL set03replacement03Value
   verbose    0


Ich habe versucht über die Attribute ein neues Reading anzulegen, was ja schon irgendwie nicht klappt:
   reading03Name Taster_URL

Dann soll das Reading (Inhalt von Taster_URL)  genutzt werden und in meinem set03URL ersetzt werden:

   replacement03Mode reading
   replacement03Regex %Taster_URL%
   replacement03Value Taster_URL

   set03Name  Taster
   set03URL   %Taster_URL%
   set03replacement03Value Taster_URL


Ist das alles so richtig und wo liegt das Problem?
replacement03Value sollte gar nicht notwendig sein oder?

VG
René

VB90

#692
Hallo,

ich habe, wie wir wohl alle einige "Geräte" per httpmod eingebunden.

Eines davon ist eine LED-Lichterkette mit WLAN und Gedöns, welche ich dank diesem hilfreichen Beitrag (https://forum.fhem.de/index.php/topic,93197.msg1004834.html#msg1004834) in FHEM einbinden konnte.
Funktioniert soweit sehr gut.

Heute wollte ich diesem Gerät nun mittels Alexa-Modul quasi eine Sprachsteuerung verpassen.
Mittels "attr AlexaName " also einen entsprechenden Namen vergeben.


Jedoch findet sich trotz allem Versuchen das Gerät nicht in der Alexa-App um es bedienen zu können.

Um den Fehler einzugrenzen, habe ich nun eine Tankstelle aus dem Spritpreismonitor ebenfalls in Alexa einbinden wollen.
Die Abfrage der Benzinpreise erfolgt ebenfalls über httpmod, insofern zumindest deutliche Ähnlichkeiten der Geräte.

Leider setzt sich diese auch in der Einbindung bei Alexa fort. Ich "sehe" die Tankstelle nicht.

Ergo schliesse ich daraus, das httpmod-Geräte nicht per "attr AlexaName" eingebunden und abgefragt, geschweige denn geschalten werden können.

Nun die Frage: ist dies ein allgemeines "Problem", oder liegt es an meiner Konfig?
Ist es ein Problem, oder ist meine Idee mal wieder eine von denen, die schlichtweg nicht umsetzbar sind?

Danke für eure Unterstützung.

vb

edit:

Danke, erledigt.
Der "Fehler"  lag natürlich bei mir.
Das Alexa-Modul erwartet ein "set on/off" um schalten zu können.
Dies ist in den httpmod-Geräten von Haus aus natürlich nicht drin, bzw im Fall der Twinkly als an/aus definiert.
Eine kleine Änderung daran und schon funktioniert es.

vb
Man muss das Rad nicht neu erfinden, nur wissen wie es gedreht wird.

amenomade

Zitat von: VB90 am 04 Januar 2020, 18:07:15
Hallo,

ich habe, wie wir wohl alle einige "Geräte" per httpmod eingebunden.

Eines davon ist eine LED-Lichterkette mit WLAN und Gedöns, welche ich dank diesem hilfreichen Beitrag (https://forum.fhem.de/index.php/topic,93197.msg1004834.html#msg1004834) in FHEM einbinden konnte.
Funktioniert soweit sehr gut.

Heute wollte ich diesem Gerät nun mittels Alexa-Modul quasi eine Sprachsteuerung verpassen.
Mittels "attr AlexaName " also einen entsprechenden Namen vergeben.


Jedoch findet sich trotz allem Versuchen das Gerät nicht in der Alexa-App um es bedienen zu können.

Um den Fehler einzugrenzen, habe ich nun eine Tankstelle aus dem Spritpreismonitor ebenfalls in Alexa einbinden wollen.
Die Abfrage der Benzinpreise erfolgt ebenfalls über httpmod, insofern zumindest deutliche Ähnlichkeiten der Geräte.

Leider setzt sich diese auch in der Einbindung bei Alexa fort. Ich "sehe" die Tankstelle nicht.

Ergo schliesse ich daraus, das httpmod-Geräte nicht per "attr AlexaName" eingebunden und abgefragt, geschweige denn geschalten werden können.

Nun die Frage: ist dies ein allgemeines "Problem", oder liegt es an meiner Konfig?
Ist es ein Problem, oder ist meine Idee mal wieder eine von denen, die schlichtweg nicht umsetzbar sind?

Danke für eure Unterstützung.

vb

edit:

Danke, erledigt.
Der "Fehler"  lag natürlich bei mir.
Das Alexa-Modul erwartet ein "set on/off" um schalten zu können.
Dies ist in den httpmod-Geräten von Haus aus natürlich nicht drin, bzw im Fall der Twinkly als an/aus definiert.
Eine kleine Änderung daran und schon funktioniert es.

vb
alexaName reicht nicht, um ein Device per Alexa abfragen zu können. Die Alexa API kennt nut bestimmte Arten von Devices. Diese werden mit genericDeviceType genauer definiert, und die müssen bestimmte Characteristics haben. Lies bitte https://wiki.fhem.de/wiki/Alexa_und_Mappings#homebridgeMapping
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

StefanStrobel

Hallo René,

Wenn es mit Replacements oder anderen Features von HTTPMOD mal nicht klappt, ist es eigentlich immer sinnvoll verbose für das Gerät auf 5 zu setzen und im Log zu verfolgen, was passiert.
Eine Sache fällt mir aber bei Deiner Problembeschreibung schon auf:

Das bloße setzen eines Attributs wie reading03Name erzeugt noch kein Reading. Erst wenn eine HTTP-Response geparsed wird und ein passendes reading03Regex o.ä. matcht, wird das Reading erzeugt.
Wenn Du zum Testen einfach ein Reading mit einem bestimmten Wert benötigst, kannst Du dafür den Fhem-Befehl  setreading verwenden.
Vielleicht hängt es ja schon an dieser Kleinigkeit.

Falls es damit nicht zu lösen ist, poste doch einen Log-Auszug bei verbose 5

Gruß
    Stefan

fireball

Hi Stefan,

ich glaube ich habe nur große Probleme der englischen Doku zu folgen... viell. liegts einfach nur daran. Nach 1000 Versuchen hats jetzt geklappt.

   readingMaxAgeReplacement "offline"
   readingMaxAgeReplacementMode text
   replacement03Mode reading
   replacement03Regex %Taster_URL%
   replacement03Value Taster_URL
   room       WISER
   set01Data  {"isIrrelevant": false,"lastScene": "$val"}
   set01Name  setGlobaleSzenen
   set01TextArg 1
   set01URL   http://192.168.178.128/ocf/sceneCollection/0
   set02Data  {"isIrrelevant": false,"lastScene": "$val"}
   set02Name  setLokaleSzenen
   set02TextArg 1
   set02URL   http://192.168.178.128/ocf/sceneCollection/1
   set03Data  {"action" : $val}
   set03Hint  0,1,2
   set03Name  Taster
   set03URL   %Taster_URL%
   userReadings Taster_URL


Ich habe mir jetzt ein eigenes userReading gesetzt  userReadings Taster_URL.

Und dann folgendes
replacement03Mode reading
replacement03Regex %Taster_URL%
replacement03Value Taster_URL
set03URL   %Taster_URL%


damit habe ich es hinbekommen, dass ein readingsProxy per setFn erst eine URL in HTTPMOD:Taster_URL schreibt, HTTPMOD ersetzt mir dann mit den Einstellungen den Wert von set03URL und dann schalte ich nur noch den Taster (set03Name  Taster).

Dafür habe ich jetzt Stunden gebraucht... :(

Es wäre schön gewesen, wenn ich einfach 2 Werte an den set03 hätte übergeben können:
Zitat von: fireball am 02 Januar 2020, 15:10:05
Hi,

kann man über HTTPMOD auch 2 Values in ein setURL übergeben?

   set03Data  {"action" : $val}
   set03Hint  0,1,2
   set03Name  Taster
   set03URL   http://192.168.178.128/ocf/$val2/shutter/1


Ich würde gern set HTTPMOD Taster val val2.

VG
René

PS: noch eine Frage... aus irgendwelchen umstanden, verliert Interval sehr oft seinen Wert und ich muss es neu setzen. keine ahnung, warum das nicht gespeichert bleibt.

Noch eine andere Sache...    set03replacement03Value Taster_URL das hat irgendwie gar nicht funktioniert... wo lag da mein Denkfehler? Ich hatte das so im Forum gefunden... Damit wurde aber nichts ersetzt.

VG+Danke
René

ch.eick

#696
EDIT: gelöst
Ich habe es doch noch gefunden. Durch setzen des folgenden Attributs wird das Parsen aktiviert.

attr maingau set01ParseResponse 1


Jedoch passen die Regex nun doch nicht :-( , da sind wohl noch einige nicht druckbare Zeichen dazwischen.

Auch die Regex habe ich jetzt gefunden, die Lösung war dann "any non-word character"

attr maingau reading02Regex (?<=<h2>Vielen Dank!<\/h2>)\W.*<p>(\w.*)<\/p>
attr maingau reading03Regex (?<=<h1>Hinweis<\/h1>)\W.*<p>(\w.*)<\/p>

Und nun das Log dazu

2020.01.28 16:07:34.750 5: maingau: ExtractReading for context set, num 01 - no individual parse definition
2020.01.28 16:07:34.751 5: maingau: UpdateReadingList created list of reading.* nums to parse during getUpdate as 01 02 03
2020.01.28 16:07:34.751 5: maingau: Read starts parsing response to set01 with defined readings: 01,02,03
2020.01.28 16:07:34.751 5: maingau: GetRegex found precompiled Regex for reading01 as (?^:((?<=tid=).*))
2020.01.28 16:07:34.751 5: maingau: ExtractReading _tid with regex /(?^:((?<=tid=).*))/...
2020.01.28 16:07:34.754 5: maingau: ExtractReading _tid did not match
2020.01.28 16:07:34.754 5: maingau: GetRegex found precompiled Regex for reading02 as (?^:((?<=<h2>Vielen Dank!<\/h2>     <p>)(\w.*)<\/p>))
2020.01.28 16:07:34.754 5: maingau: ExtractReading Message with regex /(?^:((?<=<h2>Vielen Dank!<\/h2>     <p>)(\w.*)<\/p>))/...
2020.01.28 16:07:34.756 5: maingau: ExtractReading Message did not match
2020.01.28 16:07:34.756 5: maingau: PrecompileRegexAttr precompiled reading03Regex /(?<=<h1>Hinweis<\/h1>)\W.*<p>(\w.*)<\/p>/ to (?^:(?<=<h1>Hinweis<\/h1>)\W.*<p>(\w.*)<\/p>)
2020.01.28 16:07:34.756 5: maingau: ExtractReading Message with regex /(?^:(?<=<h1>Hinweis<\/h1>)\W.*<p>(\w.*)<\/p>)/...
2020.01.28 16:07:34.758 5: maingau: 1 matches, matchlist = Zu dem von Ihnen angegebenen Ablesedatum haben wir bereits einen Zählerstand gespeichert. Die Angabe eines weiteren Zählerstands zu diesem Datum ist nicht möglich.
2020.01.28 16:07:34.758 5: maingau: ExtractReading for reading03-1 sets Message to Zu dem von Ihnen angegebenen Ablesedatum haben wir bereits einen Zählerstand gespeichert. Die Angabe eines weiteren Zählerstands zu diesem Datum ist nicht möglich.
2020.01.28 16:07:34.758 4: maingau: Read response matched 1, unmatch 2 Reading(s)
2020.01.28 16:07:34.758 5: maingau: Read response to set01 matched Message



Hallo zusammen,
Ich setze auf einer html Seite einen Wert und erhalte im httbody auch Rückmeldungen, die ich gerne als reading lesen möchte. Nur leider mache ich da wohl einen Fehler und es werden keine readings erstellt.

- Der Login funktioniert
- Das Setzen auf der Seite funktioniert ebenfalls


defmod maingau HTTPMOD none 0
attr maingau enableControlSet 1
attr maingau enableCookies 1
attr maingau handleRedirects 1

# Terminal ID Aufbereiten, um sie wieder in die nächste URL einzusetzen
attr maingau reading01Name _tid
attr maingau reading01Regex ((?<=tid=).*)
attr maingau replacement01Mode reading
attr maingau replacement01Regex %%_tid%%
attr maingau replacement01Value _tid

# Notwendiges Login erkennen
attr maingau reAuthRegex Anmeldung mit E-Mail

# Passwort aus der Datei holen
attr maingau replacement02Mode key
attr maingau replacement02Regex %%BenutzerPasswort%%
attr maingau replacement02Value BenutzerPasswort

# Passwort und tid müssen hier rein. Meinen Namen und meine Kundennummer ist mit XXXX ersetzt
attr maingau sid01Data1 login%5B0%5D%5Bloginname%5D=XXXXXXXXX%2C+XXXXXXXX&login%5B0%5D%5Bpin%5D=XXXXXXXXX&login%5B0%5D%5Bpassword%5D=%%BenutzerPasswort%%&tid=%%_tid%%&step=default
attr maingau sid01URL https://onlineservice.service-rz.de/?act=login&werknr=52

# Das aktuelle Datum zum ersetzen vorbereiten
attr maingau replacement03Mode expression
attr maingau replacement03Regex %%Datum%%
attr maingau replacement03Value {strftime('%d.%m.%Y', localtime)}

# Setzen des Zählerstandes (steht in $val)  und einsetzen des Tagesdatums
attr maingau set01Name Zaehlerstand
attr maingau set01URL https://onlineservice.service-rz.de/?act=zaehlerstand&werknr=52&tid=%%_tid%%
attr maingau set01Data1 zaehlerstand%5B0%5D%5Bablesedatum%5D=%%Datum%%&zaehlerstand%5B1%5D%5BzaehlerstandNeu%5D=$val&zaehlerstand%5B0%5D%5BbenachrichtigungPerMail%5D=J&tid=%%_tid%%&step=default

# Lesen der Rückmeldung
attr maingau reading02Name Message
attr maingau reading02Regex ((?<=<h2>Vielen Dank!<\/h2>     <p>)(\w.*)<\/p>)
attr maingau reading03Name Message
attr maingau reading03Regex ((?<=<h1>Hinweis<\/h1>                     <p>)(\w.*)<\/p>)


In der Logdatei kommen trotz verbose 5 keine Meldungen zum Erstellen der readings.

Wie muss die readings benennen, damit sie beim set01 aus der Rückmeldung gelesen werden?
Die Regex habe ich in einem Regex Tester erstellt und sollte so passen.

Der Name der Readings darf ruhig identisch sein, da immer nur eine Meldung kommt, die jedoch von der Regex unterschiedlich ist.

Hier noch eine Beispiel Meldung.

        <div class="modal-close-button fa fa-close"></div>
                <div class="modal-inner">
                <h1>Hinweis</h1>
                    <p>Zu dem von Ihnen angegebenen Ablesedatum haben wir bereits einen Zählerstand gespeichert. Die Angabe eines weiteren Zählerstands zu diesem Datum ist nicht möglich.</p>
                                <a href="#" class="button button-primary" onclick="closeModal();return false;">Schließen</a>
                </div>
        </div>


Viele Grüße
     Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

#697
Hallo zusammen,

wie kann ich denn den httpbody im device wieder löschen.

Ich hatte folgendes gesetzt

attr device showBody 1    zum testen
attr device showBody 0    nach dem testen

# Es wird jedoch weiterhin der alte httpbody angezeigt

deleteattr device showBody

# brachte auch keinen Erfolg

RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

amenomade

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

ch.eick

Okay, das probiere ich aus.
Gibt es einen Grund warum es nicht mit
httpBody 0
auch wieder gelöscht wird?

Gesendet von meinem SM-G930F mit Tapatalk

RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

StefanStrobel

Den Bedarf hatte ich bisher nicht gesehen.
In der nächsten Version baue ich es aber gerne ein.

Gruß
   Stefan

ch.eick

#701
Zitat von: StefanStrobel am 30 Januar 2020, 22:50:20
Den Bedarf hatte ich bisher nicht gesehen.
In der nächsten Version baue ich es aber gerne ein.
Ich faende es angenehm. Wenn man sich mal laengere Seiten angesehen hat bleibt der httpbody halt im Fhemweb stehen und man muss ziemlich blaettern, bis man bei den readings und Attributen ist.
Sobald alles laeuft schau ich eher selten drauf.

Gruss
    Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

Jostar

Hallo zusammen,

httpmod ist ja ein mächtiges Modul, vielen Dank erst mal dafür!

Ich nutze es unter anderem um eine IP-Cam jede Sekunde abzufragen, ob sie denn einen Alarm erkannt hat. Eine andere Möglichkeit kenne ich leider nicht (andere Kameras können aktiv eine Website aufrufen, z.B.). Dabei wird in der Kamera auch richtig "login" und "logout" protokolliert und nach einem Tag ist das Log (natürlich) voll. Gibt es eine Möglichkeit die Verbindung offen zu halten, also nach erfolgreichem login auf ein logout zu verzichten? "keepalive" z.B. gibt es bei HttpUtils.


defmod Kamera7status HTTPMOD none 180
attr Kamera7status get02Name alarm
attr Kamera7status get02Poll 1
attr Kamera7statusget02URL http://user:passw@192.168.178.137:8037/cgi-bin/configManager.cgi?action=getConfig&name=MotionDetect


Vielen Dank und Grüße
Raspberry Pi(s) mit FHEM auf Rasbian Jessie/Strech, DbLog/DbRep mit mySQL, piface, 1Wire-USB-Master von SMS-GUARD, RFXtrx433E

amenomade

Keepalive in HttpUtils bezieht sich auf die TCP-Verbindung, und funktioniert nur wenn der Zielserver es unterstützt. Das hat aber nichts mit dem Timeout der Sitzung auf http Ebene. Keepalive macht keine erneuerte Abfrage, das ist nicht die gleiche Schicht des TCP/IP Protokolls.

HTTPMOD macht kein Logoff. Der Zielserver hat ein Timeout, nachdem die Sitzung abläuft.
Evtl kannst Du die Anmeldung in HTTPMOD anders einbauen. Wenn z.B. die Cam ein Sitzungscookie pflegt, wäre enableCookies nicht schlecht, und wenn das nicht reicht, dann mit den Attribute reAuthRegex, sid & Co spielen.

Damit die Log nicht voll wächst, setze einfach verbose auf einen niedrigen Wert.

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

somansch

Ich habe seit dem letzten FHEM Update das Problem, dass der RequestHeader "User-Agent: Mozilla/5.0 (Windows NT 6.0)" nicht mehr akzeptiert wird  ???

Folgender Fehler: bad attribute name requestHeader.* (contains not A-Za-z/\d_\.- or is too long)

Ist das bekannt bzw. gewollt?

Danke und Gruß
Andreas