Neue Version von HTTPMOD mit neuen Features zum Testen

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

Vorheriges Thema - Nächstes Thema

StefanStrobel

Hallo Christian,

Dein Problem sollte mit einer neuen Version behoben sein, die ich gestern eingecheckt habe.

Gruss
   Stefan

StefanStrobel

Hallo yersinia,

die Sache mit den Attribut-Parametern bei userattr ist nicht ganz so einfach, da es hier am Zusammenspiel zwischen HTTPMOD und Fhemweb hängt. Siehe https://forum.fhem.de/index.php/topic,29972.0.html

Gruss
   Stefan

StefanStrobel

Ergänzung:

die letzte Änderung an Fhemweb sollte auch das Problem mit der Auswahlliste in userattr lösen.
Ich checke noch eine passende Änderung der HTTPMOD-Utils ein.

Gruss
   Stefan

ch.eick

Zitat von: StefanStrobel am 13 Dezember 2020, 10:53:00
Dein Problem sollte mit einer neuen Version behoben sein, die ich gestern eingecheckt habe.
Das schaue ich mir in den nächsten tagen an, dann gibt's auch feedback.
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

yersinia

Hallo Stefan,
Zitat von: StefanStrobel am 13 Dezember 2020, 10:56:51die Sache mit den Attribut-Parametern bei userattr ist nicht ganz so einfach, da es hier am Zusammenspiel zwischen HTTPMOD und Fhemweb hängt. Siehe https://forum.fhem.de/index.php/topic,29972.0.html
Zitat von: StefanStrobel am 13 Dezember 2020, 13:07:54
die letzte Änderung an Fhemweb sollte auch das Problem mit der Auswahlliste in userattr lösen.
Ich checke noch eine passende Änderung der HTTPMOD-Utils ein.
habe ich verfolgt, werde ich die Tage mal testen. Besten Dank!
viele Grüße, yersinia
----
FHEM 6.4 (SVN) on RPi 4B with RasPi OS Bookworm (perl 5.36.0) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

yersinia

Hallo Stefan,
ich habe es mit den Templates getestet und es funktioniert. Bedankt. :)
viele Grüße, yersinia
----
FHEM 6.4 (SVN) on RPi 4B with RasPi OS Bookworm (perl 5.36.0) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

gvzdus

#1011
Verzeiht, wenn mein Googling zu unbeholfen war, ich aber nicht sicherheitshalber 60 Seiten Forum durchgelesen habe.

Folgende Anregung:
Angenommen mit HTTPMOD soll eine Datenquelle abgefragt werden, die selber wieder periodisch ihre Inhalte erhält und den Zeitstempel der Messwerte erfasst. Die Antwort ist also z.B.
{ "timestamp": 1608195075, "value": 123.5 }
Dann ergeben 2 Verhaltensweisen Sinn:

  • Ohne Änderung des Zeitstempels auch keine "neuen" (= alten) Reading-Events zu generieren
  • Sich im Messintervall auf den Zeitstempel plus einen Offset zu synchronisieren

Beispiel
Der poweropti ist ein Gerät, dass den Stromzählerstand ausliest. Die Einbindung habe ich gestern hier dokumentiert: https://wiki.fhem.de/wiki/Poweropti

Das Gerät pusht alle 10 Sekunden die Daten des Stromzählers in die Cloud. Will man es genau wissen, bietet sich ein Abfrageintervall von HTTPMOD von 10 Sekunden an. Dieses Intervall wird aber nicht synchron sein, sondern idealerweise vielleicht 0-1 Sekunden alte Daten liefern, worst case mit 10 Sekunden Verzug. Perfekt wäre jetzt, von synchronen Uhrzeiten aller beteiligten Systeme auszugehen und zu sagen:
Ich nehme den Zeitstempel der Antwort, schlage mein Lese-Intervall drauf, plus z.B. 1 Sekunde, und dies ergibt - falls in der Zukunft liegend - den Zeitpunkt der nächsten Abfrage von HTTPMOD
Dann wäre nur noch ein konstanter Versatz dabei.

Dafür müsste man HTTPMOD "sagen", ob und wenn wo in der Antwort der Zeitstempel steht, und HTTPMOD bräuchte ein Attribut für den Offset in Millisekunden, wann die nächste Abfrage erfolgen soll.

Eine ähnliche Frage befindet sich hier:
https://forum.fhem.de/index.php?topic=71865.0

P.S. In dem Beispiel der ähnlichen Frage braucht es sogar gar kein zu spezifizierendes Attribut "Wo findest Du den Zeitstempel der abgefragten Ergebnisse?": Dort hat der API-Entwickler den Date-Header der HTTP-Response sauber auf diesen Zeitstempel gesetzt. Das könnte ein sinnvolles Default für HTTPMOD sein, dass verwendet wird, wenn nichts anderes angegeben wurde, aber das Attribut "syncOffsetMilliseconds" gesetzt wurde.

amenomade

1.: Kann man es nicht mit "event-on-change-reading" lösen?
2.: Macht wenig Sinn. Wie garantierst Du, dass die Zeiten von der Webseite und von Fhem immer syncrhonisiert sind?

Ggf kannst Du auch ein Reading mit dem Timestamp generieren lassen, und darauf ein notify reagieren lassen, dass ein "at timestamp +x" ein reread auslöst.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

gvzdus

> 1.: Kann man es nicht mit "event-on-change-reading" lösen?

Nein. Es ist ja etwas völlig Unterschiedliches, ob mein Stromzähler weiterhin 100 Watt Bezug meldet, oder ob er sich nicht mehr meldet. Sinnvoll wäre in dem Szenario, ein Watchdog einzurichten, dass fehlende Updates - auch auf gleiche Zahlen - alarmiert.

> 2. Macht wenig Sinn. Wie garantierst Du, dass die Zeiten von der Webseite und von Fhem immer syncrhonisiert sind?

Dafür haben unsere Urväter NTP erfunden. Nein, eine Garantie ist es nicht. Aber synchronisierte Uhren sind die Regel. Und wenn mal nicht?
a) timestamp in der Zukunft: Dann min(timestamp of API, clienttime) + Loglevel -> Default-Verhalten
b) timestamp in der Vergangenheit: Mein Vorschlag war:
"waittime_nextpoll = (timestamp of API + fixOffset + interval - clienttime)
Ergänzen wir es um eine Auffanglösung:
"waittime_nextpoll -= interval / 10 if (waittime_nextpoll < interval * 9 / 10)";

Dann nähert sich beim 10-Sekunden-Interval eben das Polling in 1-Sekunden-Schritten an die gewünschte Synchronisation an.

gvzdus

ZitatGgf kannst Du auch ein Reading mit dem Timestamp generieren lassen, und darauf ein notify reagieren lassen, dass ein "at timestamp +x" ein reread auslöst.

Ja, das müsste gehen. Interessante Idee. Allerdings - wenn die letzte (erfolgreiche Messung) die nächste Messung verzögert triggert - dann müsste das Intervall als Fallback agieren, damit das System ggf. wieder anläuft. Also z.B. Intervall auf 60 Sekunden. Da "reread" aber einen zusätzlichen Read auslöst, hättest Du immer noch die "Bonus-Messung" im 60-Sekunden-Intervall. Alternativ könnte man laufend "interval" neu setzen. Ist aber erstens nicht schön, zweitens mit seiner Sekundenbasis ungenau.

Gisbert

Zitat von: amenomade am 09 Mai 2020, 22:20:45
Aber ich habe auf Deutsch die XPath erklärt ;) Ok, ein einziges Beispiel reicht vielleicht nicht, um das ganze zu verstehen :D

Na dann
//a[contains(., "Euro") and contains(.,"Stoxx")]//span[@class="quote"]
oder
//span[contains(., "Euro") and contains(.,"Stoxx")]/..//span[@class="quote"]
oder
//span[contains(., "Euro") and contains(.,"Stoxx")]/following-sibling::*/span[@class="quote"]

Hallo amenomade,

du hattes mir freundlicherweise geholfen die Börsenindices von dieser Seite auszulesen: https://kurse.boerse.ard.de/ard/mobile/index.htn?mobilRedirect=1
Leider hat die ARD beschlossen ab 15.12. diese Seite einzustellen und stattdessen Indexkurse auf dieser Seite anzubieten https://www.tagesschau.de/wirtschaft/boersenkurse/.

Die Seite hat sich damitomplett verändert, und leider komme ich mit trial und error keinen Schritt weiter, zu mehr reicht es bei mir leider nicht.

Ich hänge mal meine vorherige Definition an, quasi als Startpunkt für deine Hilfe, hoffentlich :-*
efine Indizes_ARD HTTPMOD https://kurse.boerse.ard.de/ard/mobile/index.htn?mobilRedirect=1 600
setuuid Indizes_ARD 5eb660c8-f33f-e986-feed-143cad5ec4289aea
attr Indizes_ARD userattr reading01Format reading01Name reading01OExpr reading01XPath reading02Format reading02Name reading02OExpr reading02XPath reading03Format reading03Name reading03OExpr reading03XPath reading04Format reading04Name reading04OExpr reading04XPath reading05Format reading05Name reading05OExpr reading05XPath reading06Format reading06Name reading06OExpr reading06XPath reading07Format reading07Name reading07OExpr reading07XPath reading08Format reading08Name reading08OExpr reading08XPath
attr Indizes_ARD alias börse.<b>ARD</b>.de
attr Indizes_ARD alignTime 00:01:34
attr Indizes_ARD event-min-interval .*:1800
attr Indizes_ARD event-on-change-reading .*
attr Indizes_ARD group Index
attr Indizes_ARD reading01Format %.0f
attr Indizes_ARD reading01Name dax
attr Indizes_ARD reading01OExpr $val =~ s/\.//g;; $val =~ s/\,/./g;; $val
attr Indizes_ARD reading01XPath //a[contains(., 'Dax')]/span[@class="quote"]
attr Indizes_ARD reading02Format %.0f
attr Indizes_ARD reading02Name dow_jones
attr Indizes_ARD reading02OExpr $val =~ s/\.//g;; $val =~ s/\,/./g;; $val
attr Indizes_ARD reading02XPath //a[contains(., 'Jones')]/span[@class="quote"]
attr Indizes_ARD reading03Format %.0f
attr Indizes_ARD reading03Name euro_stoxx_50
attr Indizes_ARD reading03OExpr $val =~ s/\.//g;; $val =~ s/\,/./g;; $val
attr Indizes_ARD reading03XPath //a[contains(.,"Euro") and contains(.,"Stoxx")]//span[@class="quote"]
attr Indizes_ARD reading04Format %.0f
attr Indizes_ARD reading04Name nasdaq_100
attr Indizes_ARD reading04OExpr $val =~ s/\.//g;; $val =~ s/\,/./g;; $val
attr Indizes_ARD reading04XPath //a[contains(., 'Nasdaq')]/span[@class="quote"]
attr Indizes_ARD reading05Name dax_perc
attr Indizes_ARD reading05OExpr $val =~ s/\,/./g;; $val =~ s/\+//g;; $val =~ s/\%//g;; $val
attr Indizes_ARD reading05XPath //a[contains(., 'Dax')]/span[@class="change pos" or @class="change neg"]
attr Indizes_ARD reading06Name dow_jones_perc
attr Indizes_ARD reading06OExpr $val =~ s/\,/./g;; $val =~ s/\+//g;; $val =~ s/\%//g;; $val
attr Indizes_ARD reading06XPath //a[contains(., 'Jones')]/span[@class="change pos" or @class="change neg"]
attr Indizes_ARD reading07Name euro_stoxx_50_perc
attr Indizes_ARD reading07OExpr $val =~ s/\,/./g;; $val =~ s/\+//g;; $val =~ s/\%//g;; $val
attr Indizes_ARD reading07XPath //a[contains(.,"Euro") and contains(.,"Stoxx")]//span[@class="change pos" or @class="change neg"]
attr Indizes_ARD reading08Name nasdaq_100_perc
attr Indizes_ARD reading08OExpr $val =~ s/\,/./g;; $val =~ s/\+//g;; $val =~ s/\%//g;; $val
attr Indizes_ARD reading08XPath //a[contains(., 'Nasdaq')]/span[@class="change pos" or @class="change neg"]
attr Indizes_ARD room Finance
attr Indizes_ARD sortby 1
attr Indizes_ARD stateFormat Dax: [$name:dax] (<span style='color:{(ReadingsVal('$name','dax_perc','') < 0 ? "red":"#2e5e87")}'>[$name:dax_perc]%</span>)<br>\
Dow Jones: [$name:dow_jones] (<span style='color:{(ReadingsVal('$name','dow_jones_perc','') < 0 ? "red":"#2e5e87")}'>[$name:dow_jones_perc]%</span>)<br>\
EuroStoxx50: [$name:euro_stoxx_50] (<span style='color:{(ReadingsVal('$name','euro_stoxx_50_perc','') < 0 ? "red":"#2e5e87")}'>[$name:euro_stoxx_50_perc]%</span>)<br>\
Nasdaq100: [$name:nasdaq_100] (<span style='color:{(ReadingsVal('$name','nasdaq_100_perc','') < 0 ? "red":"#2e5e87")}'>[$name:nasdaq_100_perc]%</span>)
attr Indizes_ARD timeout 5
attr Indizes_ARD verbose 0


Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

amenomade

Man muss nicht unbedingt in FHEM arbeiten, und alles per try and error über HTTPMOD machen. Ich nutze gerne http://xpather.com/
Dort ein Teil des Quellcodes der Seite kopieren (einige Fehler korrigieren), und los geht's ;)

<div class="list_securities">
<ul>
       
        <li class="cf linked"  onclick="top.location.href='https://www.tagesschau.de/wirtschaft/boersenkurse/dax-index-846900/';">
          <span>
            <span class="name">DAX ®</span>
            <span class="change cf pos">
              <span>+122,10</span>
              <span>+0,92%</span>
            </span>
          </span>
          <span class="price"><span class="icon_pos">13.368,40</span></span>
        </li>
       
        <li class="cf linked"  onclick="top.location.href='https://www.tagesschau.de/wirtschaft/boersenkurse/mdax-index-846741/';">
          <span>
            <span class="name">MDAX ®</span>
            <span class="change cf pos">
              <span>+187,67</span>
              <span>+0,63%</span>
            </span>
          </span>
          <span class="price"><span class="icon_pos">30.054,14</span></span>
        </li>
       
        <li class="cf linked"  onclick="top.location.href='https://www.tagesschau.de/wirtschaft/boersenkurse/57691/';">
          <span>
            <span class="name">E-STOXX 50</span>
            <span class="change cf neg">
              <span>-1,78</span>
              <span>-0,05%</span>
            </span>
          </span>
          <span class="price"><span class="icon_neg">3.481,62</span></span>
        </li>
       
        <li class="cf linked"  onclick="top.location.href='https://www.tagesschau.de/wirtschaft/boersenkurse/47776/';">
          <span>
            <span class="name">DOW JONES</span>
            <span class="change cf neg">
              <span>-38,22</span>
              <span>-0,13%</span>
            </span>
          </span>
          <span class="price"><span class="icon_neg">30.170,81</span></span>
        </li>
       
        <li class="cf linked"  onclick="top.location.href='https://www.tagesschau.de/wirtschaft/boersenkurse/eu0009652759-25108390/';">
          <span>
            <span class="name">EUR/USD</span>
            <span class="change cf neg">
              <span>-0,0017</span>
              <span>-0,14%</span>
            </span>
          </span>
          <span class="price"><span class="icon_neg">1,2221$</span></span>
        </li>
       
        <li class="cf linked"  onclick="top.location.href='https://www.tagesschau.de/wirtschaft/boersenkurse/xc0009677409-4770764/';">
          <span>
            <span class="name">BRENT</span>
            <span class="change cf neg">
              <span>-0,42</span>
              <span>-0,83%</span>
            </span>
          </span>
          <span class="price"><span class="icon_neg">50,36$</span></span>
        </li>
       
        <li class="cf linked"  onclick="top.location.href='https://www.tagesschau.de/wirtschaft/boersenkurse/xc0009655157-4770761/';">
          <span>
            <span class="name">Gold USD</span>
            <span class="change cf neg">
              <span>-2,88</span>
              <span>-0,15%</span>
            </span>
          </span>
          <span class="price"><span class="icon_neg">1.874,11$</span></span>
        </li>
       
</ul>
</div>


Z.B. Euro Stoxx 50:
//li[contains(.,"E-STOXX 50")]/span[@class="price"]

Lautet:
vom "li" Tag innerhalb dessen "E-STOXX 50" irgendwo steht, will ich den untergeordneten "span" Tag, dessen "class" Property "price" heisst.

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

Gisbert

#1017
Hallo amenomade,

vielen Dank, das funktioniert schon mal im Prinzip, und so wie du es erklärst, verstehe ich es auch.

Es treten jedoch noch 2 Hürden auf, die ich nicht hinbekomme:
<li class="cf linked"  onclick="top.location.href='https://www.tagesschau.de/wirtschaft/boersenkurse/dax-index-846900/';">
  <span>
    <span class="name">DAX ®</span>
    <span class="change cf pos">
      <span>+122,10</span>
      <span>+0,92%</span>
    </span>
  </span>
  <span class="price"><span class="icon_pos">13.368,40</span></span>
</li>


1) DAX kommt in DAX ind MDAX vor, d.h. ich erhalte dann 2 Readings, möchte aber nur den Wert des DAX. Ich habe es mit starts-with() probiert, bin jedoch gescheitert.
2) Neben der prozentualen Änderungen wird auch die absolute Änderung übernommen:

    <span class="change cf pos">
      <span>+122,10</span>
      <span>+0,92%</span>
    </span>


Hast du auch da eine Lösung für mich?

Viele, liebe Grüße
Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

Gisbert

Hallo amenomade,

für die prozentualen Änderungen und ohne die absolute Änderung habe ich folgende Lösung gefunden, oder sollte ich lieber sagen sie hat mich gefunden ;)
attr Indizes_ARD reading07Name euro_stoxx_50_perc
attr Indizes_ARD reading07OExpr $val =~ s/\,/./g;; $val =~ s/\+//g;; $val =~ s/\%//g;; $val
attr Indizes_ARD reading07XPath //li[contains(.,"E-STOXX 50")]//span[(@class="change cf pos" or @class="change cf neg")]/span[contains(.,"%")]


Ist diese Lösung so ok?
Fehlt mir nur die Selektion auf DAX und nicht MDAX?

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

Gisbert

Hallo amenomade,

so, jetzt habe ich auch eine(!) Lösung für das Ausbleiben von Readings des MDAX gefunden: and not(contains(.,"MDAX"))
attr Indizes_ARD reading01Name dax
attr Indizes_ARD reading01OExpr $val =~ s/\.//g;; $val =~ s/\,/./g;; $val
attr Indizes_ARD reading01XPath //li[contains(.,"DAX") and not(contains(.,"MDAX"))]/span[@class="price"]


Könntest du drüber schauen, ob das eine gute bis brauchbare Lösung ist, bzw. wie du es machen würdest?

Nochmals vielen Dank
Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome