Trying to set up laundry notifications

i want to notify different people depending on who is home when the laundry is done.

1 if amber and freeland are home, notify both
2 if only amber is home, notify amber
3 if only freeland is home, notify freeland
4 if no one is home, wait until either gets home, then wait 30 minutes and notify everyone who is home (incase the other person arrives during the 30 minutes)

I have 1-3 done but am stumped on 4

thanks for any help

[
    {
        "id": "68a425115022dfab",
        "type": "tab",
        "label": "Washer Alerts",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "eb694178b18686f7",
        "type": "server-state-changed",
        "z": "68a425115022dfab",
        "name": "Washer is off",
        "server": "1494c0a9.8c4aff",
        "version": 4,
        "exposeToHomeAssistant": false,
        "haConfig": [
            {
                "property": "name",
                "value": ""
            },
            {
                "property": "icon",
                "value": ""
            }
        ],
        "entityidfilter": "sensor.washer_status",
        "entityidfiltertype": "exact",
        "outputinitially": false,
        "state_type": "str",
        "haltifstate": "Off",
        "halt_if_type": "str",
        "halt_if_compare": "is",
        "outputs": 2,
        "output_only_on_state_change": true,
        "for": "0",
        "forType": "num",
        "forUnits": "minutes",
        "ignorePrevStateNull": false,
        "ignorePrevStateUnknown": false,
        "ignorePrevStateUnavailable": false,
        "ignoreCurrentStateUnknown": false,
        "ignoreCurrentStateUnavailable": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "",
                "valueType": "entityState"
            },
            {
                "property": "data",
                "propertyType": "msg",
                "value": "",
                "valueType": "eventData"
            },
            {
                "property": "topic",
                "propertyType": "msg",
                "value": "",
                "valueType": "triggerId"
            }
        ],
        "x": 210,
        "y": 360,
        "wires": [
            [
                "f90f0981403b3fc2"
            ],
            []
        ]
    },
    {
        "id": "6249be602195adbe",
        "type": "api-call-service",
        "z": "68a425115022dfab",
        "name": "notify amber",
        "server": "1494c0a9.8c4aff",
        "version": 5,
        "debugenabled": false,
        "domain": "notify",
        "service": "mobile_app_ambers_iphone",
        "areaId": [],
        "deviceId": [],
        "entityId": [],
        "data": "{\"message\":\"Washer Done\",\"data\":{}}",
        "dataType": "json",
        "mergeContext": "",
        "mustacheAltTags": false,
        "outputProperties": [],
        "queue": "none",
        "x": 1090,
        "y": 280,
        "wires": [
            []
        ]
    },
    {
        "id": "f90f0981403b3fc2",
        "type": "api-current-state",
        "z": "68a425115022dfab",
        "name": "If freeland is home",
        "server": "1494c0a9.8c4aff",
        "version": 3,
        "outputs": 2,
        "halt_if": "home",
        "halt_if_type": "str",
        "halt_if_compare": "is",
        "entity_id": "device_tracker.freeland_s_iphone",
        "state_type": "str",
        "blockInputOverrides": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "",
                "valueType": "entityState"
            },
            {
                "property": "data",
                "propertyType": "msg",
                "value": "",
                "valueType": "entity"
            }
        ],
        "for": "0",
        "forType": "num",
        "forUnits": "minutes",
        "override_topic": false,
        "state_location": "payload",
        "override_payload": "msg",
        "entity_location": "data",
        "override_data": "msg",
        "x": 410,
        "y": 360,
        "wires": [
            [
                "d3efb635319cad4e"
            ],
            [
                "e275089131933293"
            ]
        ]
    },
    {
        "id": "d3efb635319cad4e",
        "type": "api-current-state",
        "z": "68a425115022dfab",
        "name": "If amber is home",
        "server": "1494c0a9.8c4aff",
        "version": 3,
        "outputs": 2,
        "halt_if": "home",
        "halt_if_type": "str",
        "halt_if_compare": "is",
        "entity_id": "device_tracker.ambers_iphone",
        "state_type": "str",
        "blockInputOverrides": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "",
                "valueType": "entityState"
            },
            {
                "property": "data",
                "propertyType": "msg",
                "value": "",
                "valueType": "entity"
            }
        ],
        "for": "0",
        "forType": "num",
        "forUnits": "minutes",
        "override_topic": false,
        "state_location": "payload",
        "override_payload": "msg",
        "entity_location": "data",
        "override_data": "msg",
        "x": 650,
        "y": 300,
        "wires": [
            [
                "6249be602195adbe",
                "277c4d650b44a6a8"
            ],
            [
                "b3e824ad2d54d83c"
            ]
        ]
    },
    {
        "id": "e275089131933293",
        "type": "api-current-state",
        "z": "68a425115022dfab",
        "name": "If amber is home",
        "server": "1494c0a9.8c4aff",
        "version": 3,
        "outputs": 2,
        "halt_if": "home",
        "halt_if_type": "str",
        "halt_if_compare": "is",
        "entity_id": "device_tracker.ambers_iphone",
        "state_type": "str",
        "blockInputOverrides": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "",
                "valueType": "entityState"
            },
            {
                "property": "data",
                "propertyType": "msg",
                "value": "",
                "valueType": "entity"
            }
        ],
        "for": "0",
        "forType": "num",
        "forUnits": "minutes",
        "override_topic": false,
        "state_location": "payload",
        "override_payload": "msg",
        "entity_location": "data",
        "override_data": "msg",
        "x": 650,
        "y": 420,
        "wires": [
            [
                "5d4a429cbc18408d"
            ],
            []
        ]
    },
    {
        "id": "ad85d59070ac4d92",
        "type": "ha-wait-until",
        "z": "68a425115022dfab",
        "name": "When freeland gets home",
        "server": "1494c0a9.8c4aff",
        "version": 1,
        "outputs": 1,
        "entityId": "device_tracker.freeland_s_iphone",
        "entityIdFilterType": "exact",
        "property": "state",
        "comparator": "is",
        "value": "home",
        "valueType": "str",
        "timeout": "0",
        "timeoutType": "num",
        "timeoutUnits": "seconds",
        "entityLocation": "data",
        "entityLocationType": "none",
        "checkCurrentState": true,
        "blockInputOverrides": true,
        "x": 1130,
        "y": 680,
        "wires": [
            [
                "a311812cb377d8d1"
            ]
        ]
    },
    {
        "id": "a311812cb377d8d1",
        "type": "delay",
        "z": "68a425115022dfab",
        "name": "wait 30 mins",
        "pauseType": "delay",
        "timeout": "30",
        "timeoutUnits": "minutes",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": false,
        "allowrate": false,
        "outputs": 1,
        "x": 1350,
        "y": 680,
        "wires": [
            []
        ]
    },
    {
        "id": "736d1c7c16d1aa1e",
        "type": "delay",
        "z": "68a425115022dfab",
        "name": "wait 30 mins",
        "pauseType": "delay",
        "timeout": "30",
        "timeoutUnits": "minutes",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": false,
        "allowrate": false,
        "outputs": 1,
        "x": 1350,
        "y": 740,
        "wires": [
            []
        ]
    },
    {
        "id": "6dc8b2f41bb5ddf7",
        "type": "ha-wait-until",
        "z": "68a425115022dfab",
        "name": "When amber gets home",
        "server": "1494c0a9.8c4aff",
        "version": 1,
        "outputs": 1,
        "entityId": "device_tracker.ambers_iphone",
        "entityIdFilterType": "exact",
        "property": "state",
        "comparator": "is",
        "value": "home",
        "valueType": "str",
        "timeout": "0",
        "timeoutType": "num",
        "timeoutUnits": "seconds",
        "entityLocation": "data",
        "entityLocationType": "none",
        "checkCurrentState": true,
        "blockInputOverrides": true,
        "x": 1130,
        "y": 740,
        "wires": [
            [
                "736d1c7c16d1aa1e"
            ]
        ]
    },
    {
        "id": "b3e824ad2d54d83c",
        "type": "api-call-service",
        "z": "68a425115022dfab",
        "name": "notify freeland",
        "server": "1494c0a9.8c4aff",
        "version": 5,
        "debugenabled": false,
        "domain": "notify",
        "service": "mobile_app_freeland_s_iphone",
        "areaId": [],
        "deviceId": [],
        "entityId": [],
        "data": "{\"message\":\"Washer Done\",\"data\":{}}",
        "dataType": "json",
        "mergeContext": "",
        "mustacheAltTags": false,
        "outputProperties": [],
        "queue": "none",
        "x": 1100,
        "y": 420,
        "wires": [
            []
        ]
    },
    {
        "id": "5d4a429cbc18408d",
        "type": "api-call-service",
        "z": "68a425115022dfab",
        "name": "notify amber",
        "server": "1494c0a9.8c4aff",
        "version": 5,
        "debugenabled": false,
        "domain": "notify",
        "service": "mobile_app_ambers_iphone",
        "areaId": [],
        "deviceId": [],
        "entityId": [],
        "data": "{\"message\":\"Washer Done\",\"data\":{}}",
        "dataType": "json",
        "mergeContext": "",
        "mustacheAltTags": false,
        "outputProperties": [],
        "queue": "none",
        "x": 1090,
        "y": 540,
        "wires": [
            []
        ]
    },
    {
        "id": "277c4d650b44a6a8",
        "type": "api-call-service",
        "z": "68a425115022dfab",
        "name": "notify freeland",
        "server": "1494c0a9.8c4aff",
        "version": 5,
        "debugenabled": false,
        "domain": "notify",
        "service": "mobile_app_freeland_s_iphone",
        "areaId": [],
        "deviceId": [],
        "entityId": [],
        "data": "{\"message\":\"Washer Done\",\"data\":{}}",
        "dataType": "json",
        "mergeContext": "",
        "mustacheAltTags": false,
        "outputProperties": [],
        "queue": "none",
        "x": 1100,
        "y": 240,
        "wires": [
            []
        ]
    },
    {
        "id": "8129b3a6daee9d4a",
        "type": "comment",
        "z": "68a425115022dfab",
        "name": "Only freeland is home, notify freeland",
        "info": "",
        "x": 1170,
        "y": 380,
        "wires": []
    },
    {
        "id": "7eb0eb91a7396bc2",
        "type": "comment",
        "z": "68a425115022dfab",
        "name": "Only amber is home, notify amber",
        "info": "",
        "x": 1150,
        "y": 500,
        "wires": []
    },
    {
        "id": "76577e01cf3fe3d3",
        "type": "comment",
        "z": "68a425115022dfab",
        "name": "Both are home, notify both",
        "info": "",
        "x": 1130,
        "y": 200,
        "wires": []
    },
    {
        "id": "a21479560c65a432",
        "type": "comment",
        "z": "68a425115022dfab",
        "name": "When someone gets home, wait 30 minutes, then notify everyone who is home. (incase the other person arives in the meantime)",
        "info": "",
        "x": 1450,
        "y": 640,
        "wires": []
    },
    {
        "id": "1494c0a9.8c4aff",
        "type": "server",
        "name": "Home Assistant",
        "addon": true,
        "rejectUnauthorizedCerts": true,
        "ha_boolean": "",
        "connectionDelay": false,
        "cacheJson": false,
        "heartbeat": false,
        "heartbeatInterval": ""
    }
]

Hi, I have a similar topic to get to a state where I test where all of us (4 people family) are not at home, partially or not.
It became so complex/long to read and test that in the end I turned to Nodered, just to make it visible helped a lot in the ifs/thens/whens. Now, if you are not familiar to nodered then I agree this is a daunting undertaking ‘just for this’ but I am pointing it out to you anyhow as an option

It is already in NodeRED

Just need to switch around a couple of nodes, the wait you want first then the check to see who is home. The wait node is configured for both entities.

[{"id":"eb694178b18686f7","type":"server-state-changed","z":"68a425115022dfab","name":"Washer is off","server":"","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"sensor.washer_status","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"Off","halt_if_type":"str","halt_if_compare":"is","outputs":2,"output_only_on_state_change":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":170,"y":320,"wires":[["3eacc6e012ac645f"],[]]},{"id":"f90f0981403b3fc2","type":"api-current-state","z":"68a425115022dfab","name":"If freeland is home","server":"","version":3,"outputs":2,"halt_if":"home","halt_if_type":"str","halt_if_compare":"is","entity_id":"device_tracker.freeland_s_iphone","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":850,"y":260,"wires":[["277c4d650b44a6a8"],[]]},{"id":"d3efb635319cad4e","type":"api-current-state","z":"68a425115022dfab","name":"If amber is home","server":"","version":3,"outputs":2,"halt_if":"home","halt_if_type":"str","halt_if_compare":"is","entity_id":"device_tracker.ambers_iphone","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":850,"y":380,"wires":[["5d4a429cbc18408d"],[]]},{"id":"5d4a429cbc18408d","type":"api-call-service","z":"68a425115022dfab","name":"notify amber","server":"","version":5,"debugenabled":false,"domain":"notify","service":"mobile_app_ambers_iphone","areaId":[],"deviceId":[],"entityId":[],"data":"{\"message\":\"Washer Done\",\"data\":{}}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1090,"y":380,"wires":[[]]},{"id":"277c4d650b44a6a8","type":"api-call-service","z":"68a425115022dfab","name":"notify freeland","server":"","version":5,"debugenabled":false,"domain":"notify","service":"mobile_app_freeland_s_iphone","areaId":[],"deviceId":[],"entityId":[],"data":"{\"message\":\"Washer Done\",\"data\":{}}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1100,"y":260,"wires":[[]]},{"id":"3eacc6e012ac645f","type":"ha-wait-until","z":"68a425115022dfab","name":"When freeland gets home","server":"","version":1,"outputs":1,"entityId":["device_tracker.freeland_s_iphone","device_tracker.ambers_iphone"],"entityIdFilterType":"list","property":"state","comparator":"is","value":"home","valueType":"str","timeout":"0","timeoutType":"num","timeoutUnits":"seconds","entityLocation":"data","entityLocationType":"none","checkCurrentState":true,"blockInputOverrides":true,"x":470,"y":320,"wires":[["f90f0981403b3fc2","d3efb635319cad4e"]]}]

Thank you!
I just put it in and realized that what you said exactly matched the order I wrote the description in.
DOH! :man_facepalming: