How to create a sensor which pulls data from external XML API?

Morning and Happy New year!

I’m currently creating 3 sensor entities for temperature, humidity and dew point in NodeRED by connecting to the opendata API of the Finnish Meteorological Institute. The API returns an XML dataset from which I extract the sensor values (see below).

I’m trying to slowly move stuff from NodeRED to HA native configurations. Assuming, it’s possible in HA to natively do this extraction, could somebody point me to the right direction/documentation where to start from?

Here’s the NodeRED flow:

[{"id":"7c109f99.9948a","type":"tab","label":"HA entities","disabled":false,"info":""},{"id":"7d191209.0ec32c","type":"http request","z":"7c109f99.9948a","name":"","method":"GET","ret":"txt","paytoqs":"ignore","url":"http://opendata.fmi.fi/wfs?service=WFS&version=2.0.0&request=getFeature&storedquery_id=fmi::observations::weather::timevaluepair&place=valkeakoski&timestep=10&starttime=-10","tls":"","persist":false,"proxy":"","authType":"","senderr":false,"x":290,"y":140,"wires":[["bedcd7eb.e38118","2fd858b4d697f65f"]]},{"id":"bedcd7eb.e38118","type":"xml","z":"7c109f99.9948a","name":"","property":"payload","attr":"","chr":"","x":430,"y":140,"wires":[["2c11a13a.9424be"]]},{"id":"e2d359c.c2f62a8","type":"inject","z":"7c109f99.9948a","name":"","repeat":"","crontab":"*/10 0-23 * * *","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":110,"y":140,"wires":[["7d191209.0ec32c"]]},{"id":"2c11a13a.9424be","type":"change","z":"7c109f99.9948a","name":"","rules":[{"t":"set","p":"temperature","pt":"msg","to":"payload[\"wfs:FeatureCollection\"][\"wfs:member\"][0][\"omso:PointTimeSeriesObservation\"][0][\"om:result\"][0][\"wml2:MeasurementTimeseries\"][0][\"wml2:point\"][0][\"wml2:MeasurementTVP\"][0][\"wml2:value\"][0]","tot":"msg"},{"t":"set","p":"time","pt":"msg","to":"payload[\"wfs:FeatureCollection\"][\"wfs:member\"][0][\"omso:PointTimeSeriesObservation\"][0][\"om:result\"][0][\"wml2:MeasurementTimeseries\"][0][\"wml2:point\"][0][\"wml2:MeasurementTVP\"][0][\"wml2:time\"][0]","tot":"msg"},{"t":"set","p":"humidity","pt":"msg","to":"payload[\"wfs:FeatureCollection\"][\"wfs:member\"][4][\"omso:PointTimeSeriesObservation\"][0][\"om:result\"][0][\"wml2:MeasurementTimeseries\"][0][\"wml2:point\"][0][\"wml2:MeasurementTVP\"][0][\"wml2:value\"][0]","tot":"msg"},{"t":"set","p":"dewpoint","pt":"msg","to":"payload[\"wfs:FeatureCollection\"][\"wfs:member\"][5][\"omso:PointTimeSeriesObservation\"][0][\"om:result\"][0][\"wml2:MeasurementTimeseries\"][0][\"wml2:point\"][0][\"wml2:MeasurementTVP\"][0][\"wml2:value\"][0]","tot":"msg"},{"t":"set","p":"rain","pt":"msg","to":"payload[\"wfs:FeatureCollection\"][\"wfs:member\"][6][\"omso:PointTimeSeriesObservation\"][0][\"om:result\"][0][\"wml2:MeasurementTimeseries\"][0][\"wml2:point\"][0][\"wml2:MeasurementTVP\"][0][\"wml2:value\"][0]","tot":"msg"},{"t":"set","p":"prsmsl","pt":"msg","to":"payload[\"wfs:FeatureCollection\"][\"wfs:member\"][9][\"omso:PointTimeSeriesObservation\"][0][\"om:result\"][0][\"wml2:MeasurementTimeseries\"][0][\"wml2:point\"][0][\"wml2:MeasurementTVP\"][0][\"wml2:value\"][0]","tot":"msg"},{"t":"delete","p":"payload","pt":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":580,"y":140,"wires":[["37d6a1301bf50510"]]},{"id":"37d6a1301bf50510","type":"rbe","z":"7c109f99.9948a","name":"","func":"rbe","gap":"","start":"","inout":"out","septopics":true,"property":"time","topi":"topic","x":750,"y":140,"wires":[["6e814027f600017c","54ea0888a712eb31","f6a5dc67ec33a5a6"]]},{"id":"2fd858b4d697f65f","type":"debug","z":"7c109f99.9948a","name":"debug 26","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":500,"y":240,"wires":[]},{"id":"6e814027f600017c","type":"ha-sensor","z":"7c109f99.9948a","name":"hattula_temp","entityConfig":"cb1d9811.4688a8","version":0,"state":"temperature","stateType":"msg","attributes":[],"inputOverride":"allow","outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"data"}],"x":910,"y":140,"wires":[[]]},{"id":"54ea0888a712eb31","type":"ha-sensor","z":"7c109f99.9948a","name":"hattula_hum","entityConfig":"f7a069cf.bfeea8","version":0,"state":"humidity","stateType":"msg","attributes":[],"inputOverride":"allow","outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"data"}],"x":910,"y":180,"wires":[[]]},{"id":"f6a5dc67ec33a5a6","type":"ha-sensor","z":"7c109f99.9948a","name":"hattula_dewp","entityConfig":"c4b26898.9eedb8","version":0,"state":"dewpoint","stateType":"msg","attributes":[],"inputOverride":"allow","outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"data"}],"x":920,"y":220,"wires":[[]]},{"id":"cb1d9811.4688a8","type":"ha-entity-config","server":"2a2d95b3.b1b9f2","deviceConfig":"4250215a25ba6828","name":"sensor config for hattula_temp","version":"6","entityType":"sensor","haConfig":[{"property":"name","value":"Temperature"},{"property":"icon","value":""},{"property":"entity_picture","value":""},{"property":"entity_category","value":""},{"property":"device_class","value":"temperature"},{"property":"unit_of_measurement","value":"°C"},{"property":"state_class","value":"measurement"}],"resend":true,"debugEnabled":false},{"id":"f7a069cf.bfeea8","type":"ha-entity-config","server":"2a2d95b3.b1b9f2","deviceConfig":"4250215a25ba6828","name":"sensor config for hattula_hum","version":6,"entityType":"sensor","haConfig":[{"property":"name","value":"Humidity"},{"property":"icon","value":""},{"property":"entity_picture","value":""},{"property":"entity_category","value":""},{"property":"device_class","value":"humidity"},{"property":"unit_of_measurement","value":"%"},{"property":"state_class","value":"measurement"}],"resend":true,"debugEnabled":false},{"id":"c4b26898.9eedb8","type":"ha-entity-config","server":"2a2d95b3.b1b9f2","deviceConfig":"4250215a25ba6828","name":"sensor config for hattula_dewp","version":6,"entityType":"sensor","haConfig":[{"property":"name","value":"Dewpoint"},{"property":"icon","value":""},{"property":"entity_picture","value":""},{"property":"entity_category","value":""},{"property":"device_class","value":"humidity"},{"property":"unit_of_measurement","value":"%"},{"property":"state_class","value":"measurement"}],"resend":true,"debugEnabled":false},{"id":"2a2d95b3.b1b9f2","type":"server","name":"Home Assistant","version":6,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":["y","yes","true","on","home","open"],"connectionDelay":true,"cacheJson":false,"heartbeat":false,"heartbeatInterval":"30","areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m","enableGlobalContextStore":true},{"id":"4250215a25ba6828","type":"ha-device-config","name":"FMI Hattula","hwVersion":"","manufacturer":"Node-RED","model":"FMI sensor","swVersion":""},{"id":"5548358c99fa22cc","type":"global-config","env":[],"modules":{"node-red-contrib-home-assistant-websocket":"0.80.3"}}]

There is a webscrape integration that may work for you

The RESTful integration is what you want.

XML will be automatically transformed in JSON.

1 Like

Awesome, thank you!