Daten via HTTP Post auslesen

Hallo zusammen,
ich habe ein Gerät das ich per HTTP Post in openHAB auslese, ich würde gerne auf HA wechseln. aber scheitere das umzusetzen. Hat hier jemand einen Tipp wie ich das umsetzten kann. In openHAB frage ich das so ab und erhalte einen Text den ich dann mit JSON extrahiere

UID: http:url:gruenbeck_softliQSC18
label: Grünbeck softliQ:SC18
thingTypeUID: http:url
configuration:
  authMode: BASIC
  ignoreSSLErrors: false
  baseURL: http://10.10.1.35/
  delay: 0
  stateMethod: POST
  refresh: 300
  commandMethod: GET
  contentType: text/xml
  timeout: 10000
  bufferSize: 2048
channels:
  - id: xmldata
    channelTypeUID: http:string
    label: xmlimport
    description: import der XML Daten
    configuration:
      mode: READONLY
      stateExtension: mux_http
      stateContent: data=getXML("id="+getCookie("id")+"&show=D_D_1|D_C_4_2|D_A_1_1|D_A_1_2|D_A_2_2|D_A_3_1|D_A_3_2|D_A_1_3|D_A_2_3|D_Y_5|D_Y_10_1|D_B_1|D_Y_4_1|D_Y_2_1|D_Y_2_2|D_Y_2_3|D_Y_2_4|D_Y_2_5|D_Y_2_6|D_Y_2_7|D_Y_2_8|D_Y_2_9|D_Y_2_10|D_Y_2_11|D_Y_2_12|D_Y_2_13|D_Y_2_14|D_A_1_9|D_Y_2_01~",1);
  - id: last-success
    channelTypeUID: http:request-date-time
    label: Last Success
    configuration: {}
  - id: last-failure
    channelTypeUID: http:request-date-time
    label: Last Failure
    configuration: {}

ich habe in der configuration.yaml folgendes angelegt aber der sensor bleibt leer.

sensor:
  - platform: rest
    name: "Grünbeck softliQ:SC18 xmlimport"
    resource: "http://10.10.1.35/mux_http"
    method: POST
    headers:
      Content-Type: "text/xml"
    payload: "data=getXML('id='+getCookie('id')+'&show=D_D_1|D_C_4_2|D_A_1_1|D_A_1_2|D_A_2_2|D_A_3_1|D_A_3_2|D_A_1_3|D_A_2_3|D_Y_5|D_Y_10_1|D_B_1|D_Y_4_1|D_Y_2_1|D_Y_2_2|D_Y_2_3|D_Y_2_4|D_Y_2_5|D_Y_2_6|D_Y_2_7|D_Y_2_8|D_Y_2_9|D_Y_2_10|D_Y_2_11|D_Y_2_12|D_Y_2_13|D_Y_2_14|D_A_1_9|D_Y_2_01~',1);"
    scan_interval: 300
    timeout: 10
    value_template: "{{ value }}"

Danke
Lenschith

Hi!
Ich hatte mich vor einiger Zeit auch schon länger damit beschäftigt, aber bisher auch noch keine “POST”-Antwort sauber auswerten können - glaube ich zumindest. Vielleicht gehe ich das Thema aber auch noch einmal an, da es schon recht praktisch wäre. Ich hatte zumindest einmal “GET” sauber ausgewertet bekommen:

  - platform: rest
    name: Whatsappnachricht_xxx
    method: GET
    resource: 'http://192.168.178.xxx:3000/api/messages'
    params:
      chatId: 4917xxxxxxx1@c.us
      downloadMedia: false
      limit: 1
      session: default
    scan_interval: 30
    value_template: '{{ value_json[''body''][''notifyName''] }}'
    json_attributes:
      - body
      - notifyName

Vielleicht hilft dir es ja bei weiteren Versuchen…
Grüße

Etwas weiter bin ich schon mal gekommen, aber leider hilft mir das nichts. Ich habe festgestellt das ich nur 255 Zeichen auslesen kann in dem Query sind mehr gespeichert. Gibt es da noch einen Trick. Leider bin ich im Internet nicht fündig geworden. Wenn ich auf die 255 Zeichen einschränke sehe ich die Werte im HA.

sensor:
  - platform: rest
    name: "Grünbeck XML"
    resource: "http://10.10.1.35/mux_http"
    method: POST
    headers:
      Content-Type: "text/xml"
    payload: "data=getXML('id='+getCookie('id')+'&show=D_D_1|D_C_4_2|D_A_1_1|D_A_1_2|D_A_2_2|D_A_3_1|D_A_3_2|D_A_1_3|D_A_2_3|D_Y_5|D_Y_10_1|D_B_1|D_Y_4_1|D_Y_2_1|D_Y_2_2|D_Y_2_3|D_Y_2_4|D_Y_2_5|D_Y_2_6|D_Y_2_7|D_Y_2_8|D_Y_2_9|D_Y_2_10|D_Y_2_11|D_Y_2_12|D_Y_2_13|D_Y_2_14|D_A_1_9|D_Y_2_01~',1);"
    scan_interval: 300
    timeout: 10
    value_template: "{{ value }}"  # Speichert den gesamten XML-Inhalt
    #value_template: "{{ value | truncate(255)}}"  # Speichert nur 255 Zeichen

Folgende Werte stehen in der XML

<data><code>ok</code><D_D_1>16.0</D_D_1><D_C_4_2>14:06</D_C_4_2><D_A_1_1>0.00</D_A_1_1><D_A_1_2>0.27</D_A_1_2><D_A_2_2>000</D_A_2_2><D_A_3_1> 12</D_A_3_1><D_A_3_2>60</D_A_3_2><D_A_1_3>6.0</D_A_1_3><D_A_2_3>99</D_A_2_3><D_Y_5>0</D_Y_5><D_Y_10_1> 72</D_Y_10_1><D_B_1>0</D_B_1><D_Y_4_1> 11h 05min</D_Y_4_1><D_Y_2_1>100</D_Y_2_1><D_Y_2_2>112</D_Y_2_2><D_Y_2_3>174</D_Y_2_3><D_Y_2_4>101</D_Y_2_4><D_Y_2_5>111</D_Y_2_5><D_Y_2_6>220</D_Y_2_6><D_Y_2_7>140</D_Y_2_7><D_Y_2_8>164</D_Y_2_8><D_Y_2_9>141</D_Y_2_9><D_Y_2_10>155</D_Y_2_10><D_Y_2_11>162</D_Y_2_11><D_Y_2_12>126</D_Y_2_12><D_Y_2_13>116</D_Y_2_13><D_Y_2_14>102</D_Y_2_14><D_A_1_9>-</D_A_1_9><D_Y_2_01>100</D_Y_2_01></data>

Hier möchte ich quasi jeden Wert der zwischen den Markern steht <D_Y_2_01>100</D_Y_2_01> als eigene Entität in HA. aber auch das habe ich nicht geschafft.

Leider kann ich diesen Webserver auch nicht so oft abfragen, sonst schmiert der ab. Deshalb würde ich gerne einmal alle Daten abrufen und daraus dann extrahieren.

Hat noch jemand eine Idee?
Danke Lenschi

Du könntest die Werte als Attribute in einem Sensor verwenden, dadurch umgehst du die Beschränkung von 255 Zeichen beim State.

Wie kann ich die XML in ein Attribut schreiben und kann ich dann mit Xpath die Werte extrahieren?

Könntest es mal so versuchen:

sensor:
  - platform: rest
    name: "Grünbeck XML"
    resource: "http://10.10.1.35/mux_http"
    method: POST
    headers:
      Content-Type: "text/xml"
    payload: "data=getXML('id='+getCookie('id')+'&show=D_D_1|D_C_4_2|D_A_1_1|D_A_1_2|D_A_2_2|D_A_3_1|D_A_3_2|D_A_1_3|D_A_2_3|D_Y_5|D_Y_10_1|D_B_1|D_Y_4_1|D_Y_2_1|D_Y_2_2|D_Y_2_3|D_Y_2_4|D_Y_2_5|D_Y_2_6|D_Y_2_7|D_Y_2_8|D_Y_2_9|D_Y_2_10|D_Y_2_11|D_Y_2_12|D_Y_2_13|D_Y_2_14|D_A_1_9|D_Y_2_01~',1);"
    scan_interval: 300
    timeout: 10
    value_template: "ok"  
    json_attributes_path: "$.data"
    json_attributes:
      - "code"
      - "D_D_1"
      - "D_C_4_2"
      - "D_A_1_1"
      - "D_A_1_2"
      - "D_A_2_2"
      - "D_A_3_1"
      - "D_A_3_2"
      - "D_A_1_3"
      - "D_A_2_3"
      - "D_Y_5"
      - "D_Y_10_1"
      - "D_B_1"
      - "D_Y_4_1"
      - "D_Y_2_1"
      - "D_Y_2_2"
      - "D_Y_2_3"
      - "D_Y_2_4"
      - "D_Y_2_5"
      - "D_Y_2_6"
      - "D_Y_2_7"
      - "D_Y_2_8"
      - "D_Y_2_9"
      - "D_Y_2_10"
      - "D_Y_2_11"
      - "D_Y_2_12"
      - "D_Y_2_13"
      - "D_Y_2_14"
      - "D_A_1_9"
      - "D_Y_2_01"


bekomme dann diese Meldung im Log:

Logger: homeassistant.components.rest.util
Quelle: components/rest/util.py:37
Integration: RESTful (Dokumentation, Probleme)
Erstmals aufgetreten: 16:12:49 (1 Vorkommnisse)
Zuletzt protokolliert: 16:12:49

REST result could not be parsed as JSON

Versuch es mal mit Content-Type: “application/xml”

ändert leider nichts :frowning:

Logger: homeassistant.components.rest.util
Quelle: components/rest/util.py:37
Integration: RESTful (Dokumentation, Probleme)
Erstmals aufgetreten: 16:38:27 (1 Vorkommnisse)
Zuletzt protokolliert: 16:38:27

REST result could not be parsed as JSON

Hmm, ich hatte mir deine Werte von oben genommen und mir mit NR die se dann zum Abruf bereitgestellt. Zumindest mit einem GET wird der Sensor mit Daten gefüllt. Wenn ich nachher Zeit finde, versuche ich es nochmal mit einem POST nachzubauen.
Kommen die Daten exakt so zurück?

<data><code>ok</code><D_D_1>16.0</D_D_1><D_C_4_2>14:06</D_C_4_2><D_A_1_1>0.00</D_A_1_1><D_A_1_2>0.27</D_A_1_2><D_A_2_2>000</D_A_2_2><D_A_3_1> 12</D_A_3_1><D_A_3_2>60</D_A_3_2><D_A_1_3>6.0</D_A_1_3><D_A_2_3>99</D_A_2_3><D_Y_5>0</D_Y_5><D_Y_10_1> 72</D_Y_10_1><D_B_1>0</D_B_1><D_Y_4_1> 11h 05min</D_Y_4_1><D_Y_2_1>100</D_Y_2_1><D_Y_2_2>112</D_Y_2_2><D_Y_2_3>174</D_Y_2_3><D_Y_2_4>101</D_Y_2_4><D_Y_2_5>111</D_Y_2_5><D_Y_2_6>220</D_Y_2_6><D_Y_2_7>140</D_Y_2_7><D_Y_2_8>164</D_Y_2_8><D_Y_2_9>141</D_Y_2_9><D_Y_2_10>155</D_Y_2_10><D_Y_2_11>162</D_Y_2_11><D_Y_2_12>126</D_Y_2_12><D_Y_2_13>116</D_Y_2_13><D_Y_2_14>102</D_Y_2_14><D_A_1_9>-</D_A_1_9><D_Y_2_01>100</D_Y_2_01></data>

wenn ich das Ergebnis abschneide kommt das so an

<data><code>ok</code><D_D_1>16.0</D_D_1><D_C_4_2>16:56</D_C_4_2><D_A_1_1>0.00</D_A_1_1><D_A_1_2>0.25</D_A_1_2><D_A_2_2>000</D_A_2_2><D_A_3_1> 15</D_A_3_1><D_A_3_2>86</D_A_3_2><D_A_1_3>6.0</D_A_1_3><D_A_2_3>99</D_A_2_3><D_Y_5>0</D_Y_5><D_Y_10_1>...

Und wenn ich das mit einem anderen System abfrage schaut die Antwort exakt wie oben aus.

Update:

habe jetzt einmal vom Homeassistant Dockerhost mit curl geprüft.
curl:

HA_core:/config# curl -X POST -H "Content-Type: text/xml" -d "data=getXML('id='+getCookie('id')+'&show=D_D_1|D_C_4_2|D_A_1_1|D_A_1_2|D_A_2_2|D_A_3_1|D_A_3_2|D_A_1_3|D_A_2_3|D_Y_5|D_Y_10_1|D_B_1|D_Y_4_1|D_Y_2_1|D_Y_2_2|D_Y_2_3|D_Y_2_4|D_Y_2_5|D_Y_2_6|D_Y_2_7|D_Y_2_8|D_Y_2_9|D_Y_2_10|D_Y_2_11|D_Y_2_12|D_Y_2_13|D_Y_2_14|D_A_1_9|D_Y_2_01~',1);" http://10.10.1.35/mux_http

Output:

<data><code>ok</code><D_D_1>16.0</D_D_1><D_C_4_2>19:42</D_C_4_2><D_A_1_1>0.00</D_A_1_1><D_A_1_2>0.23</D_A_1_2><D_A_2_2>000</D_A_2_2><D_A_3_1> 17</D_A_3_1><D_A_3_2>86</D_A_3_2><D_A_1_3>6.0</D_A_1_3><D_A_2_3>99</D_A_2_3><D_Y_5>0</D_Y_5><D_Y_10_1> 60</D_Y_10_1><D_B_1>0</D_B_1><D_Y_4_1>   16h 40min</D_Y_4_1><D_Y_2_1>235</D_Y_2_1><D_Y_2_2>202</D_Y_2_2><D_Y_2_3>100</D_Y_2_3><D_Y_2_4>112</D_Y_2_4><D_Y_2_5>174</D_Y_2_5><D_Y_2_6>101</D_Y_2_6><D_Y_2_7>111</D_Y_2_7><D_Y_2_8>220</D_Y_2_8><D_Y_2_9>140</D_Y_2_9><D_Y_2_10>164</D_Y_2_10><D_Y_2_11>141</D_Y_2_11><D_Y_2_12>155</D_Y_2_12><D_Y_2_13>162</D_Y_2_13><D_Y_2_14>126</D_Y_2_14><D_A_1_9>-</D_A_1_9><D_Y_2_01>235</D_Y_2_01></data>

:crayon:by HarryP: Zusammenführung Doppelpost

Ich habe die Lösung gefunden. Danke für euren Support.

rest:
  # Grünbeck REST-Sensor
  - resource: "http://10.10.1.35/mux_http"
    method: POST
    headers:
      Content-Type: "text/xml"
    payload: >
      data=getXML('id='+getCookie('id')+'&show=D_D_1|D_C_4_2|D_A_1_1|D_A_1_2|D_A_2_2|D_A_3_1|D_A_3_2|D_A_1_3|D_A_2_3|D_Y_5|D_Y_10_1|D_B_1|D_Y_4_1|D_Y_2_1|D_Y_2_2|D_Y_2_3|D_Y_2_4|D_Y_2_5|D_Y_2_6|D_Y_2_7|D_Y_2_8|D_Y_2_9|D_Y_2_10|D_Y_2_11|D_Y_2_12|D_Y_2_13|D_Y_2_14|D_A_1_9|D_Y_2_01~',1);
    scan_interval: 600  # alle 10 Minuten

    sensor:
      - name: "Restkapazität"
        value_template: >
          {{ value | regex_findall_index("<D_A_1_2>(.*?)</D_A_1_2>") }}
        unit_of_measurement: "m³"     
        unique_id: gruenbeck_D_A_1_2
        icon: mdi:percent

      - name: "Rest Weichwasser"
        value_template: >
          {{ value | regex_findall_index("<D_A_3_2>(.*?)</D_A_3_2>") }}
        unit_of_measurement: "%" 
        unique_id: gruenbeck_D_A_3_2
        icon: mdi:percent        

      - name: "Kapazitätszahl"
        value_template: >
          {{ value | regex_findall_index("<D_A_1_3>(.*?)</D_A_1_3>") }}
        unit_of_measurement: "m³*°dH"   
        unique_id: gruenbeck_D_A_1_3
        icon: mdi:bottle-tonic-outline