How to fetch rest data unknown index

I am trying to fetch Signal Messenger Messages.

they come like this:

[
	{
		"envelope":
			{
				"source":"APHONENUMBER",
				"sourceNumber":"APHONENUMBER",
				"sourceUuid":"SOMEUID",
				"sourceName":"SOMENAME",
				"sourceDevice":2,
				"timestamp":1746072621643,
				"serverReceivedTimestamp":1746072621400,
				"serverDeliveredTimestamp":1746072629686,
				"syncMessage":
					{
						"readMessages":
							[
								{
									"sender":"ANOTHERPHONENUMBER",
									"senderNumber":"ANOTHERPHONENUMBER",
									"senderUuid":"SOMEOTHERUID",
									"timestamp":1746041119011
								},
								{"sender":"APHONENUMBER","senderNumber":"APHONENUMBER","senderUuid":"SOMEUID","timestamp":1746041117020}
							]
					}
			},
		"account":"APHONENUMBER"
	},
	{
		"envelope":
			{
				"source":"APHONENUMBER",
				"sourceNumber":"APHONENUMBER",
				"sourceUuid":"SOMEUID",
				"sourceName":"SOMENAME",
				"sourceDevice":2,
				"timestamp":1746072623669,
				"serverReceivedTimestamp":1746072623637,
				"serverDeliveredTimestamp":1746072629687,
				"syncMessage":
					{
						"sentMessage":
							{
								"destination":"ANOTHERPHONENUMBER",
								"destinationNumber":"ANOTHERPHONENUMBER",
								"destinationUuid":"SOMEOTHERUID",
								"timestamp":1746072623669,
								"message":"hi",
								"expiresInSeconds":0,
								"viewOnce":false
							}
					}
			},
			"account":"APHONENUMBER"
	},
	{
		"envelope":
			{
				"source":"ANOTHERPHONENUMBER",
				"sourceNumber":"ANOTHERPHONENUMBER",
				"sourceUuid":"SOMEOTHERUID",
				"sourceName":"ANOTHERNAME",
				"sourceDevice":1,
				"timestamp":1746072623471,
				"serverReceivedTimestamp":1746072623948,
				"serverDeliveredTimestamp":1746072629687,
				"dataMessage":
					{
						"timestamp":1746072623471,
						"message":null,
						"expiresInSeconds":0,
						"viewOnce":false,
						"reaction":
							{
								"emoji":"šŸ‘šŸ½",
								"targetAuthor":"APHONENUMBER",
								"targetAuthorNumber":"APHONENUMBER",
								"targetAuthorUuid":"SOMEUID",
								"targetSentTimestamp":1746072623669,
								"isRemove":false
							}
					}
			},
			"account":"APHONENUMBER"
	},
	{
		"envelope":
			{
				"source":"ANOTHERPHONENUMBER",
				"sourceNumber":"ANOTHERPHONENUMBER",
				"sourceUuid":"SOMEOTHERUID",
				"sourceName":"ANOTHERNAME",
				"sourceDevice":1,
				"timestamp":1746072623465,
				"serverReceivedTimestamp":1746072623967,
				"serverDeliveredTimestamp":1746072629687,
				"receiptMessage":
					{
						"when":1746072623465,
						"isDelivery":true,
						"isRead":false,
						"isViewed":false,
						"timestamps":[1746072623669]
					}
			},
			"account":"APHONENUMBER"
	},
	{
		"envelope":
			{
				"source":"ANOTHERPHONENUMBER",
				"sourceNumber":"ANOTHERPHONENUMBER",
				"sourceUuid":"SOMEOTHERUID",
				"sourceName":"ANOTHERNAME",
				"sourceDevice":1,
				"timestamp":1746072624012,
				"serverReceivedTimestamp":1746072624080,
				"serverDeliveredTimestamp":1746072629687,
				"receiptMessage":
					{"when":1746072624012,"isDelivery":false,"isRead":true,"isViewed":false,"timestamps":[1746072623669]}},"account":"APHONENUMBER"},
	{"envelope":{"source":"ANOTHERPHONENUMBER","sourceNumber":"ANOTHERPHONENUMBER","sourceUuid":"SOMEOTHERUID","sourceName":"ANOTHERNAME","sourceDevice":1,"timestamp":1746072624144,"serverReceivedTimestamp":1746072624212,"serverDeliveredTimestamp":1746072629687,"typingMessage":{"action":"STARTED","timestamp":1746072624144}},"account":"APHONENUMBER"},
	{
		"envelope":
			{
				"source":"ANOTHERPHONENUMBER",
				"sourceNumber":"ANOTHERPHONENUMBER",
				"sourceUuid":"SOMEOTHERUID",
				"sourceName":"ANOTHERNAME",
				"sourceDevice":1,
				"timestamp":1746072624275,
				"serverReceivedTimestamp":1746072624344,
				"serverDeliveredTimestamp":1746072629687,
				"dataMessage":
					{
						"timestamp":1746072624275,
						"message":"Hi Ewald",
						"expiresInSeconds":0,
						"viewOnce":false,
						"quote":
							{
								"id":1746072623669,
								"author":"APHONENUMBER",
								"authorNumber":"APHONENUMBER",
								"authorUuid":"SOMEUID",
								"text":"hi",
								"attachments":[]
							}
					}
			},
		"account":"APHONENUMBER"
	},
	{
		"envelope":
			{
				"source":"APHONENUMBER",
				"sourceNumber":"APHONENUMBER",
				"sourceUuid":"SOMEUID",
				"sourceName":"SOMENAME",
				"sourceDevice":2,
				"timestamp":1746072624841,
				"serverReceivedTimestamp":1746072624425,
				"serverDeliveredTimestamp":1746072629687,
				"syncMessage":
					{
						"readMessages":
							[
								{
									"sender":"APHONENUMBER",
									"senderNumber":"APHONENUMBER",
									"senderUuid":"SOMEUID",
									"timestamp":1746072623669
								}
							]
					}
			},
		"account":"APHONENUMBER"
	}
]

I fetch the messages with this:

sensor:
  - platform: rest
    name: "Signal message received test"
    unique_id: signal_msg_rcv_t
    resource: http://MYIP:8080/v1/receive/MYNUMBER
    headers: 
      Content-Type: application/json
    json_attributes_path: $.[0].envelope
    json_attributes:
          - source
          - sourceName
          - timestamp
    value_template: "{{ value_json[0].envelope.dataMessage.message }}"

But as you can see I don’t need index 0. I need index 3&7. Because those are the ones that actually hold the received messages. The rest are receiptMessage or syncMessage.

And how to do that for json_attributes_path: $.[0].envelope

How can I determine which index to use. And potentially extract two sensor values in one call. So not two different sensors, but one sensor, two values in one go.

Found the answer to my first question:

value_template: >
        {% for n in value_json %}
            {% if n.envelope.dataMessage is defined and n.envelope.dataMessage.message is defined %}
                {{ n.envelope.dataMessage.message }}
            {% endif %}
        {% endfor %}

To get the json_attributes_path: $..[?(@.dataMessage)]

But what if I have received multiple messages?

Hi Emily,

Thank you so much for your help! Much appreciated.

This is what worsk for me now:

{% set msgs = value_json | selectattr("envelope.dataMessage") | list %}
{% set msg = msgs | selectattr("envelope.dataMessage.message", "string" ) | list %}
{% if msg |length > 0 %}
        {{ msg[0].envelope.dataMessage.message }}
{% else %}
          {{ states('sensor.signal_msg_rcv_2') }}
{% endif %}

Somehow selectattr(ā€œenvelope.dataMessage.messageā€) returns an empty list, but now if I do it in two steps like this, that works.

Thanmk you once again!