Supereg / homebridge-http-switch

Powerful http switch for Homebridge: https://github.com/homebridge/homebridge
ISC License
217 stars 36 forks source link

statusPattern question #59

Closed mbierman closed 3 years ago

mbierman commented 4 years ago

Describe the bug This is probably more of a documentation question than a bug, but I have an enhancement request as well. I'm having no luck with setting the statusPattern. Maybe there could be an additional example in the documentation. I'm hoping that I have everything in the right place etc. and I just don't have the query right.

Expected behavior Given the following body response for a statusUrl

{
  "id": "aaaa-8888-444-a99-58sdfsd",
  "children": [],
  "users": [
    {
      "id": "f6b-02-46-b8-941e28b"
    }
  ],
  "devices": [
    {
      "id": "a-d0-4-a5-444",
      "macAddress": "90e"
    }
  ],
  "userRoles": [
    {
      "userId": "fc4-0032-46-b-94ff8b",
      "roles": [
        "owner"
      ]
    }
  ],
  "subscription": {
    "id": "b5-6d-42-a8-2a1",
    "isActive": true,
    "status": "unknown",
    "providerInfo": {}
  },
  "address": "",
  "city": "",
  "state": "a",
  "country": "us",
  "postalCode": "94",
  "timezone": "US/Pacific",
  "gallonsPerDayGoal": 0,
  "occupants": 0000,
  "stories": 1,
  "isProfileComplete": true,
  "hasPastWaterDamage": true,
  "showerBathCount": 200,
  "toiletCount": 200,
  "nickname": "9 Way",
  "irrigationSchedule": {
    "isEnabled": true
  },
  "systemMode": {
    "target": "away"
  },
  "locationType": "sfh",
  "residenceType": "primary",
  "waterSource": "utility",
  "locationSize": "lte_2000_sq_ft",
  "waterShutoffKnown": "unsure",
  "plumbingType": "copper",
  "indoorAmenities": [
    "clotheswasher",
    "dishwasher",
    "icemaker_ref",
    "bathtub"
  ],
  "outdoorAmenities": [
    "fountain"
  ],
  "plumbingAppliances": [
    "re_pump",
    "tankless"
  ],
  "waterUtility": " Utilities",
  "notifications": {
    "pending": {
      "infoCount": 0,
      "warningCount": 0,
      "criticalCount": 0,
      "alarmCount": [],
      "info": {
        "count": 0,
        "devices": {
          "count": 0,
          "absolute": 0
        }
      },
      "warning": {
        "count": 0,
        "devices": {
          "count": 0,
          "absolute": 0
        }
      },
      "critical": {
        "count": 0,
        "devices": {
          "count": 0,
          "absolute": 0
        }
      }
    }
  },
  "areas": {
    "default": [
      {
        "id": "2e-01-49-81-2d8ca",
        "name": "Attic"
      },
      {
        "id": "3bd2b6",
        "name": "Basement"
      },
      {
        "id": "8c56ba0",
        "name": "Garage"
      },
      {
        "id": "2087ea80d27",
        "name": "Main Floor"
      },
      {
        "id": "cf79690",
        "name": "Upstairs"
      }
    ],
    "custom": []
  },
  "class": {
    "key": "unit",
    "level": 0
  },
  "account": {
    "id": "bc6b2375-6cfd-422d-a528-234b2aa24ca1"
  }
}

I need like something like the following, If "target":"home" or"target":"sleep"then switch is ON. I imagine that should look like:

"statusPattern": "{/.*\"target\".*\"(home|sleep)\".*/}"

To Reproduce Steps to reproduce the behavior:

Version (output of npm list -g homebridge homebridge-http-switch)

Configuration

    {
        "bridge": {
            "name": "Homebridge Synology",
            "username" : "*****",
            "port": *****
            "pin" : "*****"
        },
        "accessories": [
            {
                "accessory": "PowerlossIFTTTNotifier",
                "name": "PowerlossIFTTTNotifier",
                "IFTTTkey : "*****",
                "IFTTTservice: "*****",
                "IFTTTvalue2": "Homebridge started at",
                "IFTTTvalue3": false
            },
            {
                "accessory": "Synology",
                "name": "Pigpen",
                "ip" : "*****",
                "mac" : "*****",
                "port": "5001",
                "secure": true,
                "account" : "*****",
                "password" : "*****",
                "version": 6,
                "timeout": *****
                "disabled": [
                    ""
                ],
                "doPolling": true,
                "pollingInterval": 120
            },
            {
                "accessory": "neurio",
                "name": "neurio",
                "location" : "*****",
                "username" : "*****",
                "password" : "*****",
                "options": {
                    "ttl": 30,
                    "verboseP": false
                }
            },
            {
                "name": "Garage Door",
                "username" : "*****",
                "password" : "*****",
                "accessory": "Chamberlain"
            },
            {
                "accessory": "HTTP-SWITCH",
                "name": "Flo",
                "switchType": "stateful",
                "pullInterval": 5000,
                "debug": true,
                "statusPattern": "true",
                "onUrl" : "*****",
                    "url" : "https://...",
                    "method": "POST",
                    "headers": {
                        "authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCfWTVU",
                        "Content-Type": "application/json"
                    },
                    "body": {
                        "target": "home"
                    }
                },
                "offUrl": {
                    "url" : "https://...",
                    "method": "POST",
                    "headers": {
                        "authorization": "TVU",
                        "Content-Type": "application/json"
                    },
                    "body": {
                        "target": "away"
                    }
                },
                "statusUrl": {
                    "url" : "https://...",
                    "method": "GET",
                    "headers": {
                        "authorization": "eyJhbGciOiJIUzI1NiIsVU",
                        "Content-Type": "application/json"
                    },
                    "statusPattern": "{/.*\"target\".*\"home\".*/}"
                }
            },
            {
                "accessory": "HTTP-SWITCH",
                "name": "pigpen temp warning",
                "switchType": "stateless",
                "timeout": 1000,
                "onUrl" : "*****",
                "method": "POST",
                "debug": false
            },
            {
                "accessory": "HTTP-SWITCH",
                "name": "Arming error",
                "switchType": "stateless",
                "timeout": 1000,
                "onUrl" : "*****",
                "method": "POST",
                "debug": false
            },
            {
                "accessory": "DummySwitch",
                "name": "iPad charged",
                "stateful": true
            },
            {
                "accessory": "DummySwitch",
                "name": "iPhone charged",
                "stateful": true
            },
            {
                "accessory": "AutomationCalendar",
                "name": "AutomationCalendar",
                "latitude" :   ***,
                "longitude" :   ***,
            },
            {
                "accessory": "Schedule",
                "name": "Hourly",
                "cron": "*/90 0-8,21-23 * * *"
            }
        ],
        "platforms": [
            {
                "name": "Config",
                "port": 8581,
                "auth": "form",
                "theme": "navi-blue",
                "tempUnits": "f",
                "lang": "auto",
                "sessionTimeout": *****
                "log": {
                    "method": "null"
                },
                "accessoryControl": {
                    "debug": true
                },
                "platform": "config"
            },
            {
                "platform": "Nest",
                "name": "Nest",
                "access_token" : "****",
                "fanDurationMinutes": 15
            },
            {
                "platform": "TuyaWebPlatform",
                "name": "Smart Life",
                "options": {
                    "username" : "*****",
                    "password" : "*****",
                    "countryCode": "1",
                    "platform": "smart_life",
                    "pollingInterval": 120
                }
            },
            {
                "platform": "WeatherPlus",
                "units": "us",
                "interval": 5,
                "stations": [
                    {
                        "nameNow": "Current",
                        "service": "openweathermap",
                        "key": "******",
                        "locationGeo": [
                            *****
                            -121.96
                        ],
                        "locationCity" : "*****",
                        "language": "en",
                        "compatibility": "both",
                        "forecast": [
                            0
                        ],
                        "conditionCategory": "detailed",
                        "now": true,
                        "extraHumidity": false,
                        "hidden": [
                            "Air Pressure",
                            "Observation Station",
                            "Observation Time",
                            "Snow"
                        ],
                        "tresholdCloudCover": 30,
                        "tresholdUvIndex": 4,
                        "tresholdWindSpeed": 10
                    }
                ]
            }
        ]

My questions:

  1. Is the regex matching only if the entire response matches?
  2. is the regex matching matching if the string occurs anywhere in the response?

Additional context So I might be getting ahead of myself because I obviously don't follow how the regex is working here, but it would be amazing if stead of regex the plugin supported query the nodes. in this case, .node .systemMode would return exactly the right value to test rather than a RegEx.

mbierman commented 4 years ago

So it looks like I found the problem. statusPattern should not be inside the statusUrl as I had it.

I will leave this open as I think the documentation could be improved. Also, for consideration of the request to support parssing by keynames instead of regex