[gelöst]HTTPMOD bei aller Liebe / Abfrage verschiedener URL´s

Begonnen von holle75, 15 November 2018, 20:36:32

Vorheriges Thema - Nächstes Thema

holle75

Wirklich seit 8 Stunden versuche ich eine wahrscheinlich absolute Einfachheit umzusetzen.

Ein Get (oder ist es ein Post?) auf eine URL. Dies mehrmals da immer nur ein Wert abgefragt werden kann. Die commandref ist für diese Aufgabe für mich nicht nachvollziehbar, aber das Beispiel war mein Ausgangspunkt.

Wo ich bis jetzt gelandet bin:

define XtenderAuslesen HTTPMOD none 60

attr XtenderAuslesen get1Name SoC
attr XtenderAuslesen get1URL https://xxx.xxx.com/yyy.asmx/ReadUserInfo?email=xxx.com&pwd=yyy&installationNumber=111&device=BSP&infoId=7002
attr XtenderAuslesen get1Poll 1
attr XtenderAuslesen reading1Regex <FloatValue>.*

attr XtenderAuslesen get2Name test
attr XtenderAuslesen get2URL https://xxx.xxx.com/yyy.asmx/ReadUserInfo?email=xxx.com&pwd=yyy&installationNumber=111&device=BSP&infoId=7015
attr XtenderAuslesen get2Poll 1
attr XtenderAuslesen reading2Regex .*


später werden es mehr Werte. Aber das hier mal um "reinzukommen".

Erstens verstehe ich nicht, ob es eine URL anstatt none in der define braucht. Meiner Meinung nach nicht, weil ja später die einzelnen URL´s angegeben werden?

Wenn ich eine der URL´s im Browser versuche, spuckt er mir brav sowas aus:


<UserInfoResult>
        <UIntValue>12812354</UIntValue>
        <FloatValue>97.75</FloatValue>
        <ErrorCode>1</ErrorCode>
        <ErrorMessage>OK</ErrorMessage>
</UserInfoResult>



und interessieren tut mich der Wert aus <FloatValue>97.75</FloatValue>. Habe jetzt mal die Regex mit .* definiert um überhaupt ein Reading zu bekommen. Da liefert er mir aber nur "1". Ich bin lost. Wie bekomme ich die (richtige) Zahl in ein Reading?

Danke für eure Hilfe und Gruß
H.

PS. Jetzt habe ich im log eine Fehlermeldung gefunden die vielleicht die "1" erklärt. Aber wie mache ich ein Read first? Ich dachte ich reade sowieso nur?

XtenderAuslesen: Read callback: Error: https://xxx.com/yyy.asmx/ReadParameter?email=xxx.com&pwd=yyy&installationNumber=1111&device=fe¶mId=1632¶mPart=Value: Can't connect(2) to https:/xxxxx.com:443:  SSL wants a read first

mumpitzstuff

Ich bin jetzt auch kein Experte, aber ein kurzer Blick in die Hilfe sagt:

Example:
attr mydevice getData {"get" :["%%value%%.value"]}
attr mydevice replacement01Mode text
attr mydevice replacement01Regex %%value%%

attr mydevice get01Name Chlor
attr mydevice get01Replacement01Value 34.4008

attr mydevice get02Name Something
attr mydevice get02Replacement01Value 31.4024

defines that %%value%% will be replaced by a static text.
All Get commands will be HTTP post requests of a similar form. Only the %%value%% will be different from get to get.
The first get will set the reading named Chlor and for the request it will take the generic getData and replace %%value%% with 34.4008.
A second get will look the same except a different name and replacement value.


Das sollte deiner Anforderung entsprechen. Du hast 1 Url und ersetzt mit den replacementvalues die Zahlen in deinem Request und die Ergebnisse werden werden in den Name read8ngs abgelegt.

holle75

Hallo mumpitzstuff, Danke, aber ich muß doch durch verschiedenen URL´s meine Anfragen senden? Leider ersetzt sich da nicht nur ein Parameter. Also manchmal schon, aber leider nicht immer.

Ah verdammt, jetzt seh ich gerade, dass ich in meinem Beispiel weil ich nicht jede URL einzeln unkenntlich (Passwörter, etc) machen wollte zweimal eine ähnliche genommen habe. Sorry. Also später sind die URL´s recht deutlich unterschiedlich.

Bin ich da mit meinem Ansatz richtig?

mumpitzstuff

Das kann ich leider nicht sagen. Vielleicht kann ja noch jemand anderer was beitragen. Da die URLs sehr ähnlich waren, dachte ich, dass es mit dem von mir geposteten weg hätte gehen müssen. Wenn du gar nicht weiter kommst, dann kannst du das ganze auch in einem Script auslagern und dann z.b. in einem at mit "Perl Script.pl" im Hintergrund (nicht blockierend) ausführen. Die Daten kann man dann an fhem schicken und die Readings füllen.

holle75

#4
Guten Morgen, ich bin ein wenig weitergekommen.

So:
define XtenderAuslesen HTTPMOD none 60

attr XtenderAuslesen get01Name SoC
attr XtenderAuslesen get01URL https://xxx.com/scomwebservice.asmx/ReadUserInfo?email=nxxx.com&pwd=xxx&installationNumber=xxx&device=BSP&infoId=7002
attr XtenderAuslesen get01Poll 1
attr XtenderAuslesen reading01Name SoC
attr XtenderAuslesen reading01Regex .*<FloatValue>([0-9.]+)
attr XtenderAuslesen reading01RegOpt s

attr XtenderAuslesen get02Name Volt
attr XtenderAuslesen get02URL https://xxx.com/scomwebservice.asmx/ReadUserInfo?email=nxxx.com&pwd=xxx&installationNumber=xxx&device=BSP&infoId=7000
attr XtenderAuslesen get02Poll 1
attr XtenderAuslesen reading02Name Volt
attr XtenderAuslesen reading02Regex .*<FloatValue>([0-9.]+)
attr XtenderAuslesen reading02RegOpt s

attr XtenderAuslesen get03Name test
attr XtenderAuslesen get03URL https://xxx.com/scomwebservice.asmx/ReadParameter?email=nxxx.com&pwd=xxx&installationNumber=xxx&device=XT1&paramId=1632&paramPart=Value
attr XtenderAuslesen get03Poll 1
attr XtenderAuslesen reading03Name test
attr XtenderAuslesen reading03Regex .*<FloatValue>([0-9.]+)
attr XtenderAuslesen reading03RegOpt s



lassen sich Werte auslesen. Antwort setzt sich dann so mit jeweils pro URL unterschiedlichem FloatValue zusammen:
<UserInfoResult>
       <UIntValue>14475329</UIntValue>
       <FloatValue>27.609375</FloatValue>
       <ErrorCode>1</ErrorCode>
       <ErrorMessage>OK</ErrorMessage>
</UserInfoResult>



der ganze httpbody:
<?xml version="1.0" encoding="utf-8"?> <UserInfoResult xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://xxx.com/"> <UIntValue>14475329</UIntValue> <FloatValue>27.609375</FloatValue> <ErrorCode>1</ErrorCode> <ErrorMessage>OK</ErrorMessage> </UserInfoResult>

Aber, da es ja sonst zu einfach wäre ..... Bei jedem Durchgang werden mir alle drei Readings final mit dem Wert der letzten Abfrage befüllt. Also jede einzelne URL-Abfrage befüllt alle drei Readings.

Das verstehe ich nicht. Dachte, wenn man sich schon die "Mühe" macht jede einzelne URL zu definieren, setzt diese auch nur das zugehörige Reading?

Habe schon attr minSendDelay und attr queueDelay ausprobiert. Keine Änderung.

Ideen?

holle75

Aah, so einfach? Ich fange an HTTPMOD zu lieben ;)

So funktionierts:

define XtenderAuslesen HTTPMOD none 60

attr XtenderAuslesen get01Name SoC
attr XtenderAuslesen get01URL https://xxx
attr XtenderAuslesen get01Poll 1
attr XtenderAuslesen get01Regex .*<FloatValue>([0-9.]+)
attr XtenderAuslesen get01Format %.2f

attr XtenderAuslesen get02Name Volt
attr XtenderAuslesen get02URL https://xxxx
attr XtenderAuslesen get02Poll 1
attr XtenderAuslesen get02Regex .*<FloatValue>([0-9.]+)
attr XtenderAuslesen get02Format %.2f

attr XtenderAuslesen get03Name test
attr XtenderAuslesen get03URL https://xxxx
attr XtenderAuslesen get03Poll 1
attr XtenderAuslesen get03Regex .*<FloatValue>([0-9.]+)