Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature Request: Add multiple events detections #304

Open
AndreiArdelean1 opened this issue Mar 30, 2023 · 80 comments
Open

Feature Request: Add multiple events detections #304

AndreiArdelean1 opened this issue Mar 30, 2023 · 80 comments
Assignees
Labels
Enhancement New feature or request Help wanted Extra attention is needed

Comments

@AndreiArdelean1
Copy link

AndreiArdelean1 commented Mar 30, 2023

Is your feature request related to a problem? Please describe.
I want to be able to detect multiple event types.
I'm not interested in actually highlighting/retrieving the rectangle where this was detected on the camera, just the detection event.

Describe the solution you'd like
I want to be able to detect and distinguish between:

  • Motion
  • AI: Person, Pet, Vehicle, Baby Crying, Glass Break, Dog Barks, Cat Meows
  • Line-Crossing
  • Camera Tampering

These notifications are sent to the native app.

Describe alternatives you've considered

  1. Create a different sensor for each event type. This has the benefit of also tracking (either now, or maybe in future updates of the camera) the duration that the event was on.
  2. Add attributes to the motion detection sensor binary_sensor that indicate the type of the event

A clear and concise description of any alternative solutions or features you've considered.

Additional context
These features are available on 3MP+ cameras for free, and on 1080p cameras using the paid subscription

Here is the response from GetEventProperties of the ONVIF endpoint on Tapo C225 camera:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsdd="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:chan="http://schemas.microsoft.com/ws/2005/02/duplex" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsa5="http://www.w3.org/2005/08/addressing" xmlns:xmime="http://tempuri.org/xmime.xsd" xmlns:xop="http://www.w3.org/2004/08/xop/include" xmlns:wsrfbf="http://docs.oasis-open.org/wsrf/bf-2" xmlns:wstop="http://docs.oasis-open.org/wsn/t-1" xmlns:wsrfr="http://docs.oasis-open.org/wsrf/r-2" xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2" xmlns:tt="http://www.onvif.org/ver10/schema" xmlns:ter="http://www.onvif.org/ver10/error" xmlns:tns1="http://www.onvif.org/ver10/topics" xmlns:tds="http://www.onvif.org/ver10/device/wsdl" xmlns:tmd="http://www.onvif.org/ver10/deviceIO/wsdl" xmlns:trt="http://www.onvif.org/ver10/media/wsdl" xmlns:tev="http://www.onvif.org/ver10/events/wsdl" xmlns:tdn="http://www.onvif.org/ver10/network/wsdl" xmlns:timg="http://www.onvif.org/ver20/imaging/wsdl" xmlns:trp="http://www.onvif.org/ver10/replay/wsdl" xmlns:tan="http://www.onvif.org/ver20/analytics/wsdl" xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl" xmlns:hikwsd="http://www.onvifext.com/onvif/ext/ver10/wsdl" xmlns:hikxsd="http://www.onvifext.com/onvif/ext/ver10/schema">
    <SOAP-ENV:Header>
        <wsa5:Action SOAP-ENV:mustUnderstand="true">http://www.onvif.org/ver10/events/wsdl/EventPortType/GetEventPropertiesResponse</wsa5:Action>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
        <tev:GetEventPropertiesResponse>
            <tev:TopicNamespaceLocation>http://www.onvif.org/onvif/ver10/topics/topicns.xml</tev:TopicNamespaceLocation>
            <wsnt:FixedTopicSet>true</wsnt:FixedTopicSet>
            <wstop:TopicSet>
                <tns1:RuleEngine>
                    <CellMotionDetector>
                        <Motion wstop:topic="true">
                            <tt:MessageDescription IsProperty="true">
                                <tt:Source>
                                    <tt:SimpleItemDescription Type="tt:ReferenceToken" Name="VideoSourceConfigurationToken"></tt:SimpleItemDescription>
                                    <tt:SimpleItemDescription Type="tt:ReferenceToken" Name="VideoAnalyticsConfigurationToken"></tt:SimpleItemDescription>
                                    <tt:SimpleItemDescription Type="xsd:string" Name="Rule"></tt:SimpleItemDescription>
                                </tt:Source>
                                <tt:Data>
                                    <tt:SimpleItemDescription Type="xsd:boolean" Name="IsMotion"></tt:SimpleItemDescription>
                                </tt:Data>
                            </tt:MessageDescription>
                        </Motion>
                    </CellMotionDetector>
                    <TamperDetector>
                        <Tamper wstop:topic="true">
                            <tt:MessageDescription IsProperty="true">
                                <tt:Source>
                                    <tt:SimpleItemDescription Type="tt:ReferenceToken" Name="VideoSourceConfigurationToken"></tt:SimpleItemDescription>
                                    <tt:SimpleItemDescription Type="tt:ReferenceToken" Name="VideoAnalyticsConfigurationToken"></tt:SimpleItemDescription>
                                    <tt:SimpleItemDescription Type="xsd:string" Name="Rule"></tt:SimpleItemDescription>
                                </tt:Source>
                                <tt:Data>
                                    <tt:SimpleItemDescription Type="xsd:boolean" Name="IsTamper"></tt:SimpleItemDescription>
                                </tt:Data>
                            </tt:MessageDescription>
                        </Tamper>
                    </TamperDetector>
                    <LineCrossDetector>
                        <LineCross wstop:topic="true">
                            <tt:MessageDescription IsProperty="true">
                                <tt:Source>
                                    <tt:SimpleItemDescription Type="tt:ReferenceToken" Name="VideoSourceConfigurationToken"></tt:SimpleItemDescription>
                                    <tt:SimpleItemDescription Type="tt:ReferenceToken" Name="VideoAnalyticsConfigurationToken"></tt:SimpleItemDescription>
                                    <tt:SimpleItemDescription Type="xsd:string" Name="Rule"></tt:SimpleItemDescription>
                                </tt:Source>
                                <tt:Data>
                                    <tt:SimpleItemDescription Type="xsd:boolean" Name="IsLineCross"></tt:SimpleItemDescription>
                                </tt:Data>
                            </tt:MessageDescription>
                        </LineCross>
                    </LineCrossDetector>
                    <PeopleDetector>
                        <People wstop:topic="true">
                            <tt:MessageDescription IsProperty="true">
                                <tt:Source>
                                    <tt:SimpleItemDescription Type="tt:ReferenceToken" Name="VideoSourceConfigurationToken"></tt:SimpleItemDescription>
                                    <tt:SimpleItemDescription Type="tt:ReferenceToken" Name="VideoAnalyticsConfigurationToken"></tt:SimpleItemDescription>
                                    <tt:SimpleItemDescription Type="xsd:string" Name="Rule"></tt:SimpleItemDescription>
                                </tt:Source>
                                <tt:Data>
                                    <tt:SimpleItemDescription Type="xsd:boolean" Name="IsPeople"></tt:SimpleItemDescription>
                                </tt:Data>
                            </tt:MessageDescription>
                        </People>
                    </PeopleDetector>
                    <TPSmartEventDetector>
                        <TPSmartEvent wstop:topic="true">
                            <tt:MessageDescription IsProperty="true">
                                <tt:Source>
                                    <tt:SimpleItemDescription Type="tt:ReferenceToken" Name="VideoSourceConfigurationToken"></tt:SimpleItemDescription>
                                    <tt:SimpleItemDescription Type="tt:ReferenceToken" Name="VideoAnalyticsConfigurationToken"></tt:SimpleItemDescription>
                                    <tt:SimpleItemDescription Type="xsd:string" Name="Rule"></tt:SimpleItemDescription>
                                </tt:Source>
                                <tt:Data>
                                    <tt:SimpleItemDescription Type="xsd:boolean" Name="IsTPSmartEvent"></tt:SimpleItemDescription>
                                </tt:Data>
                            </tt:MessageDescription>
                        </TPSmartEvent>
                    </TPSmartEventDetector>
                </tns1:RuleEngine>
            </wstop:TopicSet>
            <wsnt:TopicExpressionDialect>http://www.onvif.org/ver10/tev/topicExpression/ConcreteSet</wsnt:TopicExpressionDialect>
            <wsnt:TopicExpressionDialect>http://docs.oasis-open.org/wsn/t-1/TopicExpression/Concrete</wsnt:TopicExpressionDialect>
            <tev:MessageContentFilterDialect>http://www.onvif.org/ver10/tev/messageContentFilter/ItemFilter</tev:MessageContentFilterDialect>
            <tev:MessageContentSchemaLocation>http://www.onvif.org/onvif/ver10/schema/onvif.xsd</tev:MessageContentSchemaLocation>
        </tev:GetEventPropertiesResponse>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Currently, motion detection doesn't work on Tapo C225 #303, but this feature would be nice to have once it is working.

@JurajNyiri
Copy link
Owner

This integration reuses onvif from Home Assistant. Adding detectors for these would require to expand on it or handlers to be added into https://github.com/home-assistant/core/blob/dev/homeassistant/components/onvif/parsers.py .

@JurajNyiri
Copy link
Owner

JurajNyiri commented Mar 31, 2023

  1. Install https://github.com/JurajNyiri/HomeAssistant-Tapo-Control/tree/expand_onvif
  2. You should see a lot more warning messages now on onvif events trigger
  3. Unsupported entities should come up as "No registered handler for event from" or "Unable to parse event from"

Please report them here.

I tested on C200 with my Person Detection enabled and I have not received any events...

@NEVdataDyne
Copy link

NEVdataDyne commented Mar 31, 2023

I would like to help as I need my tapo cameras to trigger automations in HA when a person is detected. Until now the only way I could achieve that is to use Alexa between the cameras and HA. With this solution the cameras need to access internet which is not ideal. Using the video stream to detect people on another system is also not a solution because it uses the WiFi so much that it interferes with my Philips Hue remotes.

Could you please tell me how to install https://github.com/JurajNyiri/HomeAssistant-Tapo-Control/tree/expand_onvif ?

@NEVdataDyne
Copy link

NEVdataDyne commented Mar 31, 2023

I downloaded the zip
I updated the Tapo custom component to 5.0
Then I replaced all the files custom_components\tapo_control by the ones from the zip using samba share and restarted HA
I didn't see any new entities so I installed the onvif integration and connected it to one of my C225 camera
I didn't see any new entities either (besides the onvif related entities that I was expecting)
In the logs there doesn't seem to be a message like "No registered handler for event from" or "Unable to parse event from"

I am not sure what I should do?

@JurajNyiri
Copy link
Owner

JurajNyiri commented Mar 31, 2023

The code in the branch above doesnt have any new entities. However, it will catch any previously uncought events with an error message. If you are not seeing any other events then it looks like the camera is not issueing those events. I will do some more testing later with the subscription.

@NEVdataDyne

This comment was marked as off-topic.

@AndreiArdelean1
Copy link
Author

AndreiArdelean1 commented Apr 1, 2023

@NEVdataDyne It looks like you are having the issue #303 (the last error in your comment). Is your motion sensor (classic one) working/triggered in Homeassistant?

@JurajNyiri I'm not seeing any of the errors you mentioned. Could it be that the integration needs to subscribe explicitly for certain events? Something like "on event PERSON_DETECTED post to WEBHOOK".

Also, because of #303 I'm having issues at the moment. I'm changing the file manually inside onvif-zeep-async but it sometimes gets overwritten or some other issue, but the motion detection (classic one) is not very stable for me. This could be the cause I'm not getting any of the new errors.

@NEVdataDyne
Copy link

@AndreiArdelean1 No motion sensor doesn't seem to work. It doesn't seem to work even with my C110 camera so I am not really sure if I am doing somethng wrong. (I have C225, C320WS and one C110 camera)

@AndreiArdelean1
Copy link
Author

I've gotten the integration to work by modifying tapo_control to use a local version of onvif-zeep-async and only motion events are triggered. I've also verified this using Postman and observing the sent events.

Also, the ONVIF integration declares CellMotionDetector, TamperDetector, LineCrossDetector, PeopleDetector, TPSmartEventDetector. All of this should be just boolean values. But, I've only been able to trigger only CellMotionDetector. Since the camera supports other types of detection events/notifications (like pet detection, glass break, vehicle, etc., within the official app) + boundary boxes of the detection inside the video feed, (apparently) are not exposed through ONVIF, I'm guessing the camera uses some Tapo specific API for this. The TamperDetector, LineCrossDetector, and PeopleDetector are most likely discontinued from the ONVIF API or something else is going on.

I'll investigate this further and post updates if I find something else.

@AndreiArdelean1
Copy link
Author

AndreiArdelean1 commented Apr 3, 2023

I didn't manage to find a way of getting the special detection events, but the following will help with integrating the configuration of these events (enabling and sensitivity) into HA and pytapo.

Here is the request the app makes on start:
{"method":"multipleRequest","params":{"requests":[{"method":"getDetectionConfig","params":{"motion_detection":{"name":"motion_det"}}},{"method":"getDetectionRegion","params":{"motion_detection":{"table":["region_info"]}}},{"method":"getBCDConfig","params":{"sound_detection":{"name":["bcd"]}}},{"method":"getPersonDetectionConfig","params":{"people_detection":{"name":["detection"]}}},{"method":"getVehicleDetectionConfig","params":{"vehicle_detection":{"name":["detection"]}}},{"method":"getPetDetectionConfig","params":{"pet_detection":{"name":["detection"]}}},{"method":"getBarkDetectionConfig","params":{"bark_detection":{"name":["detection"]}}},{"method":"getMeowDetectionConfig","params":{"meow_detection":{"name":["detection"]}}},{"method":"getGlassDetectionConfig","params":{"glass_detection":{"name":["detection"]}}},{"method":"getTargetTrackConfig","params":{"target_track":{"name":["target_track_info"]}}},{"method":"getAlertConfig","params":{"msg_alarm":{"name":["chn1_msg_alarm_info","capability"]}}},{"method":"getAlertPlan","params":{"msg_alarm_plan":{"name":"chn1_msg_alarm_plan"}}},{"method":"getAlertTypeList","params":{"msg_alarm":{"name":"alert_type"}}},{"method":"getAlertEventType","params":{"msg_alarm":{"table":["msg_alarm_type"]}}},{"method":"getAlertConfig","params":{"msg_alarm":{"table":["usr_def_audio"]}}},{"method":"getMsgPushConfig","params":{"msg_push":{"name":"chn1_msg_push_info"}}},{"method":"getMsgPushPlan","params":{"msg_push_plan":{"name":"chn1_msg_push_plan"}}},{"method":"getTamperDetectionConfig","params":{"tamper_detection":{"name":"tamper_det"}}},{"method":"getLinecrossingDetectionConfig","params":{"linecrossing_detection":{"name":["detection","arming_schedule"]}}},{"method":"getLinecrossingDetectionRegion","params":{"linecrossing_detection":{"table":["region_info"]}}},{"method":"getMsgPushEventList","params":{"msg_push":{"table":["msg_push_event"]}}}]}}

A few examples of setting detection configs:

  • baby cry
    {"method":"multipleRequest","params":{"requests":[{"method":"setBCDConfig","params":{"sound_detection":{"bcd":{"enabled":"on","sensitivity":"medium"}}}}]}}

  • person
    {"method":"multipleRequest","params":{"requests":[{"method":"setPersonDetectionConfig","params":{"people_detection":{"detection":{"enabled":"off","sensitivity":"60"}}}}]}}

  • pet
    {"method":"multipleRequest","params":{"requests":[{"method":"setPetDetectionConfig","params":{"pet_detection":{"detection":{"enabled":"off","sensitivity":"60"}}}}]}}

  • bark
    {"method":"multipleRequest","params":{"requests":[{"method":"setBarkDetectionConfig","params":{"bark_detection":{"detection":{"enabled":"on","sensitivity":"50"}}}}]}}

  • glass break
    {"method":"multipleRequest","params":{"requests":[{"method":"setGlassDetectionConfig","params":{"glass_detection":{"detection":{"enabled":"on","sensitivity":"60"}}}}]}}

  • tamper
    {"method":"multipleRequest","params":{"requests":[{"method":"setTamperDetectionConfig","params":{"tamper_detection":{"tamper_det":{"enabled":"on","sensitivity":"medium"}}}}]}}

@JurajNyiri
Copy link
Owner

Updated the code in https://github.com/JurajNyiri/HomeAssistant-Tapo-Control/tree/expand_onvif

  1. Download https://github.com/JurajNyiri/HomeAssistant-Tapo-Control/archive/refs/heads/expand_onvif.zip
  2. Follow https://github.com/JurajNyiri/HomeAssistant-Tapo-Control/tree/expand_onvif#installation

You should now see:

  1. Warn message for "async_parse_messages" every time any event is detected
  2. Warn Message Found Event when it found an event it recognizes
  3. Error message "No registered handler for event from" or "Unable to parse event from" when event is found which is not recognized
2023-04-03 08:49:23.920 WARNING (MainThread) [custom_components.tapo_control] async_parse_messages

2023-04-03 08:49:23.921 WARNING (MainThread) [custom_components.tapo_control] Found event ba835a1edb0d0cdf5bcbafab8b732021_tapo_events: {

    'SubscriptionReference': None,

    'Topic': {

        '_value_1': 'tns1:RuleEngine/CellMotionDetector/Motion',

        'Dialect': 'http://www.onvif.org/ver10/tev/topicExpression/ConcreteSet',

        '_attr_1': {

    }

    },

    'ProducerReference': None,

    'Message': {

        '_value_1': {

            'Source': {

                'SimpleItem': [

                    {

                        'Name': 'VideoSourceConfigurationToken',

                        'Value': 'vsconf'

                    },

                    {

                        'Name': 'VideoAnalyticsConfigurationToken',

                        'Value': 'VideoAnalyticsToken'

                    },

                    {

                        'Name': 'Rule',

                        'Value': 'MyMotionDetectorRule'

                    }

                ],

                'ElementItem': [],

                'Extension': None,

                '_attr_1': None

            },

            'Key': None,

            'Data': {

                'SimpleItem': [

                    {

                        'Name': 'IsMotion',

                        'Value': 'true'

                    }

                ],

                'ElementItem': [],

                'Extension': None,

                '_attr_1': None

            },

            'Extension': None,

            'UtcTime': datetime.datetime(1970, 1, 1, 0, 0, tzinfo=<isodate.tzinfo.Utc object at 0x7f663048c580>),

            'PropertyOperation': 'Changed',

            '_attr_1': {

        }

        }

    }

}

@AndreiArdelean1
Copy link
Author

I've already done something similar, but the only thing that changed was the Data.SimpleItem.Value (+ UtcTime). No new event was received by tapo_control, even though the notification was sent to the app. Probably the camera doesn't sent any of the new events using ONVIF.

@JurajNyiri
Copy link
Owner

JurajNyiri commented Apr 3, 2023

I have added to main branch (not yet released to pypi):

  • get/set VehicleDetection
  • get/set Cruise
  • get/set MeowDetection
  • get/set BarkDetection
  • get/set PetDetection
  • get/set BabyCryDetection
  • get/set TamperDetection
  • get/set GlassBreakDetection

I was not able to test:

setBarkDetection
setPetDetection
setGlassBreakDetection
setMeowDetection
setVehicleDetection
getBarkDetection
getPetDetection
getGlassBreakDetection
getMeowDetection
getVehicleDetection
getCruise

@AndreiArdelean1 could you please test above?

Edit: Released as pytapo 3.1.8.

@JurajNyiri
Copy link
Owner

@AndreiArdelean1 now released in https://github.com/JurajNyiri/HomeAssistant-Tapo-Control/releases/tag/5.1.0.beta.1 Please test above, my devices do not support it.

@AndreiArdelean1
Copy link
Author

They all work except for getCruise. getCruise always is {'patrol': {'patrol': {'action': 'idle'}}} regardless if it is idle or doing the cruise. The HA integrations also works. 🎉

@AndreiArdelean1
Copy link
Author

AndreiArdelean1 commented Apr 7, 2023

I've been investigating this issue and here is what I've found so far:

ONVIF:

  • the ONVIF endpoint declares IsMotion, IsTamper, IsLineCross, IsPeople, IsTPSmartEvent
  • for IsTamper, IsLineCross I'm not sure if they are triggered (I don't remember if I tested this), but IsPeople is not triggered
  • Pet, Vehicle, Baby Crying, Glass Break, Dog Barks, Cat Meows, are not even declared in the ONVIF endpoint

UDP:

  • There aren't any multicast packets sent when an event is triggered
  • The app has the option to highlight people, pets, etc. in the live stream. The only place where this could take place (from the network packets received by the app) is inside the video/mp2t in the live stream from port 8800 (https://md.depau.eu/s/r1Ys_oWoP#Live-streaming, https://drmnsamoliu.github.io/video.html). There are no additional application/json received besides the initial ones (informing of the privacy mode overlay). I've not been able to decode the sent JSON packets, only the received ones, as they are encrypted. Most likely the highlighted zones are already included in the video.

API:

  • the App has a feature to view recordings where it also indicates the type of event triggered.
  • when the app enters that screen, here are the calls made:
{"method":"multipleRequest","params":{"requests":[{"method":"searchDateWithVideo","params":{"playback":{"search_year_utility":{"channel":[0],"end_date":"20230431","start_date":"20230401"}}}}]}}
{"method":"multipleRequest","params":{"requests":[{"method":"getSdCardStatus","params":{"harddisk_manage":{"table":["hd_info"]}}},{"method":"getCircularRecordingConfig","params":{"harddisk_manage":{"name":"harddisk"}}}]}}
{"method":"multipleRequest","params":{"requests":[{"method":"getClockStatus","params":{"system":{"name":"clock_status"}}},{"method":"getDstRule","params":{"system":{"name":"dst"}}},{"method":"getTimezone","params":{"system":{"name":["basic"]}}}]}}
{"method":"multipleRequest","params":{"requests":[{"method":"searchDateWithVideo","params":{"playback":{"search_year_utility":{"channel":[0],"end_date":"20230331","start_date":"20230301"}}}}]}}
{"method":"multipleRequest","params":{"requests":[{"method":"searchVideoWithUTC","params":{"playback":{"search_video_with_utc":{"id":1,"start_index":0,"channel":0,"start_time":1680555600,"end_time":1680641999,"end_index":99}}}}]}}
{"method":"multipleRequest","params":{"requests":[{"method":"searchDetectionList","params":{"playback":{"search_detection_list":{"start_index":0,"channel":0,"start_time":1680555600,"end_time":1680641999,"end_index":99}}}}]}}
{"method":"multipleRequest","params":{"requests":[{"method":"searchDateWithVideo","params":{"playback":{"search_year_utility":{"channel":[0],"end_date":"20230231","start_date":"20230201"}}}}]}}

What can be used, for event detection is the call:

{"method":"searchDetectionList","params":{"playback":{"search_detection_list":{"start_index":0,"channel":0,"start_time":1680555600,"end_time":1680641999,"end_index":99}}}}

and returning:

{'playback': {'snapshot_enable': True, 'search_detection_list': [{'start_time': 1680725544, 'end_time': 1680725662, 'alarm_type': 6}, {'start_time': 1680725693, 'end_time': 1680725802, 'alarm_type': 6}, {'start_time': 1680725826, 'end_time': 1680725856, 'alarm_type': 6}, {'start_time': 1680725917, 'end_time': 1680725947, 'alarm_type': 6}], 'total_num': 4}}

A few things to note here:

  • the end time extends if multiple events are triggered in quick succession
  • the alarm type also updates. People, pet detection is preferred over motion events.
  • the start_time and end_time define a range and the camera returns the events that have at least 1s within that range (event.start_time can be before request.start_time, and the same for end_time)

I've written this python script to get the events from the last 10 min to test it:

secondsFrom1970 = tapo.executeFunction(
            "getClockStatus", {"system":{"name":"clock_status"}}
          )["system"]["clock_status"]["seconds_from_1970"]
print(secondsFrom1970)
searchStart = secondsFrom1970 - (10 * 60) # 10 min
searchEnd = secondsFrom1970 + 10
print(tapo.executeFunction(
  "searchDetectionList", {"playback":{"search_detection_list":{"start_index":0,"channel":0,"start_time":searchStart,"end_time":searchEnd,"end_index":99}}}
))

Maybe this method of detection motion could be used to detect motion on #273.
This could be done by:

  1. making the above call every 0.5-1s and getting the last event (named here lastEvent) from the list and later storing it to savedLastEvent.
  2. if the start_time of lastEvent and savedLastEvent are not the same, a new event was triggered
  3. if the alarm_type of lastEvent and savedLastEvent are not the same, a new event was triggered
  4. if savedLastEvent has completed, a new event was triggered
  5. if secondsFrom1970 is within 30s (this is the default/minimum duration of an event) or 10s from the end_time, the event could still be active, otherwise the lastEvent can be marked as completed

Instead of making a call periodically, the ONVIF motion event could be used to trigger the call to searchDetectionList. BUT, the motion event is not triggered if only an AI event is detected. If the motion sensitivity is set high enough, the 2 events would be triggered in close succession and this would probably work.

Probably the best solution would be a combination of making a call periodically and watching for ONVIF motion events.

Other possible methods not yet discovered/implemented on the camera:

  • adding the missing events to ONVIF
  • the camera to emit a multicast broadcast (preferably encrypted) whenever something changes or just on events triggered
  • a way to register a webhook from the camera API for this
  • a way to register a webhook from the Tapo server to HA. Something similar to https://ifttt.com/tplink_tapo/details, but from what I could find, the API is only available to select developers.
  • opening a socket connection to the camera for events (not likely to be done in the future, or to already exist)
  • intercept the calls made by the camera to Tapo servers for notification (if possible, too complicated for the average user for the purpose of this integration)
  • register webhooks with IFTTT (tested and working). The only problem here is that the free plan only allows 5 automations.
  • register webhooks with Alexa

@NEVdataDyne
Copy link

Maybe in "Other possible methods not yet discovered/implemented" you can add "intercept the calls made by the camera to Alexa servers for notification" (for people detection). For some reason Alex seems to be the only service other than Tapo to get notified when a person is detected (and this is the only event Alexa can get).

@AndreiArdelean1
Copy link
Author

I've written this script (attached) to pull events from the camera. It works really well. I'd implement a proof of concept for Tapo-Control, but I'm not very familiar with HomeAssistant integrations. Maybe this method could be used alogside the existing ONVIF events for detecting motion.
Notes: The 2 files need to be under the same directory.
Archive.zip

@JurajNyiri
Copy link
Owner

JurajNyiri commented Apr 13, 2023

Thank you @AndreiArdelean1 . I played with the script, it had a bug where it was calculating incorrect start time for cameras in different timezone to UTC-0. I adjusted a couple of things and released new function getEvents to pytapo 3.1.11.

I am testing with following script:

from pytapo import Tapo
import time
from datetime import datetime
import os

# Camera
user = os.environ.get("user")  # admin user
password = os.environ.get("password")  # cloud password
host = os.environ.get("ip")  # ip of the camera, example: 192.168.1.52

tapo = Tapo(host, user, password, password)

epoch_time = int(time.time())
secondsFrom1970 = epoch_time

minSearchStart = secondsFrom1970 - (60 * 60)

searchStart = minSearchStart # can be used as opt parameter in tapo.getEvents()
searchEnd = secondsFrom1970 + 60  # maybe add a few seconds? # can be used as opt parameter in tapo.getEvents()

while True:
    events = tapo.getEvents()
    if events:
        lastEvent = events[-1]

        newLastEventDictionary = {
            'startTime': lastEvent["start_time"],
            'endTime': lastEvent["end_time"],
            'alarmType': lastEvent["alarm_type"],
        }
        print(datetime.now())
        print(lastEvent)
        print(datetime.fromtimestamp(newLastEventDictionary['startTime']))
        print(datetime.fromtimestamp(newLastEventDictionary['endTime']))
        print("")
    else:
        print("none")
    time.sleep(1)

I tested on 2 C200s. One HW V1.0 and another one 3.0. The 3.0 also has tapo cloud subscription.
I found that:

  • Events are not reported reliably, even if they are visible in the timeline of recordings.
  • Events are reported with start time in the future

I tested also with your script only to verify I haven't made any mistakes when writing the new function.

Could you try it and let me know if it works with your cameras?

@AndreiArdelean1
Copy link
Author

AndreiArdelean1 commented Apr 13, 2023

I get something like:

2023-04-13 15:57:14.501225
{'start_time': 1681390629, 'end_time': 1681390659, 'alarm_type': 2, 'startRelative': 4.0, 'endRelative': -26.0}
2023-04-13 15:57:09
2023-04-13 15:57:39
  • start time is always in the past (startRelative > 0)
  • for me, the events are received reliably. An event being a change in either start_time, end_time, or alarm_type of the last event

What I've noticed, if multiple sources (script and Tapo app) are requesting the events at once, one of them could return an empty list.

@AndreiArdelean1
Copy link
Author

Off-topic, but I'm not sure where I should post this:
All the possible values for alarm_type from searchDetectionList:

allKnownAlarmTypes = {
    1: "Timing",
    2: "Motion",
    3: "TAMPER",
    4: "Line Crossing",
    5: "Area Intrusion", 
    6: "Person",
    7: "Baby Cry",
    8: "Vehicle",
    9: "Pet",
    10: "Ring Alarm",
    11: "Dog Bark",
    12: "Cat Meow",
    13: "Alarm Glass",
    14: "Alarm Smoke",
    15: "Deliver Package",
    16: "Pickup Package",
    17: "Dollbell Ring Missed",
    18: "Dollbell Ring Answered",
    19: "Anti Theft",
}

I'm not sure which work, which don't, or what they mean. I've extracted them from the Android app.
The raw values:

1: TIMING 
2: MOTION 
3: TAMPER 
4: LINECROSS 
5: AREAINTRUSION 
6: HUMAN 
7: BABYCRY 
8: VEHICLE 
9: PET 
10: RINGALARM 
11: ALARMBARK 
12: ALARMMEOW 
13: ALARMGLASS 
14: ALARMSMOKE 
15: DELIVERPACKAGE 
16: PICKUPPACKAGE 
17: DOLLBELLRINGMISSED 
18: DOLLBELLRINGANSWERED 
19: ANTITHEFT 

@JurajNyiri
Copy link
Owner

@AndreiArdelean1 could you please test this script with the pytapo 3.1.13 to verify it still works? I think I managed to fix the timezone issue and it seems to be working fairly well now for me.

@AndreiArdelean1
Copy link
Author

It works!

@fightforlife
Copy link

fightforlife commented May 7, 2023

When I try to run the script above on the latest python docker image I get the following error:
File "/usr/local/lib/python3.11/site-packages/requests/adapters.py", line 517, in send raise SSLError(e, request=request) requests.exceptions.SSLError: HTTPSConnectionPool(host='192.168.1.81', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, '[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:1002)')))

Do you have a tip? Maybe it has something todo with the IP not being a hostname? Is there a way to set the request to insecure?

@rmtrane
Copy link

rmtrane commented Jun 6, 2023

@AndreiArdelean1 Just to clarify, you were able to extract the AI detected events (person, pet, vehicle, baby crying, etc.)? I was playing around for a minute with the getEvents function, but couldn't get it to work. Just wanted to make sure it would be worth the time to actually dive in... Thank you!

@AndreiArdelean1
Copy link
Author

AndreiArdelean1 commented Jun 7, 2023

Hey, yes, it is working. It did work for motion, person, and pet, but it wasn't working for tamper detection (Or I didn't manage to get it in my testing as that type of detection was a bit hard to trigger). Sounds detection (meow, bark, baby, glass break) I couldn't trigger the actual event during testing so I can't say if it is working. But, if an event is shown with the correct icon in the playback list in the official app, then you should also be able to detect it with this function.

You could:

  1. every x seconds request the most recent events. The downside is that it introduces a load on the camera, and since the camera has limited resources (CPU, memory, etc.) the official app may become unresponsive, and it may cause other unknown issues
  2. when an event is detected with ONVIF, wait for 1s (or a smaller amount of time to make sure the event registers) and request the latest event from the camera to get the actual event type.

I've only tested method 1. When investigating I had some issues with ONVIF so I couldn't test method 2.

@rmtrane
Copy link

rmtrane commented Jun 7, 2023

Thank you for letting me know! I'm mainly interested in the sounds detection, so might try to get this to work.

(In case you're interested, I have had success in triggering the events resulting in notifications through the Tapo app by simply using youtube videos of baby crying, dog barking, etc.)

@JurajNyiri Any plans to implement something like this in the Home Assistant integration? I will probably try to do something ad-hoc, but would be really cool to have this in the integration 😊

@jterrace
Copy link

I have (2) C720 cameras on 1.2.3 Build 240823 Rel.40327n that also don't seem to send out these onvif messages. My C325WB on 1.2.2 Build 240723 Rel.54710n does. Not sure what is going on, might have to do some further debugging to see why some cameras don't seem to send onvif messages.

@simon-bd
Copy link

Same here. I really want to participate so we can detect baby cries. I use my C110 as a baby monitor, but right now it’s just set up to trigger on any noise, which results in too many false positives. I also have nothing in my logs 😔.

@lcapriotti
Copy link

I have 4xC210 HW2.0 and I have lost binary sensors on some. All on FW 1.4.3 build 241010. Happy to contribute.

@jterrace
Copy link

Sent out the pull request for person and vehicle detection, which will work for my C325WB. My C720 cameras don't even get motion. I turned on debug logging for onvif component and I see this message:

2024-11-16 13:36:17.061 DEBUG (MainThread) [homeassistant.components.onvif] Side Porch: Device does not support notification service or too many subscriptions: illegal status line: bytearray(b'POST /onvif/service\x00HTTP/1.1\x00\x00Host\x00 192.168.56.109:2020\x00\x00Accept\x00 */*\x00\x00Accept-Encoding\x00 gzip, deflate, br\x00\x00Connection\x00 keep-alive\x00\x00User-Agent\x00 ZHTTP/1.1 500 Internal Server Error')

which looks to be coming from here:
https://github.com/home-assistant/core/blob/9711816542b581d7c40a3d69668c3711d5af7c23/homeassistant/components/onvif/event.py#L300

I'm not sure why the camera would be returning a 500 error when trying to set up onvif pull subscription.

I turned on "Diagnostics" on the camera that supposedly outputs a log file to the sd card. Going to pull it and see if there's anything helpful on it.

@jterrace
Copy link

Nothing interesting in the camera's diagnostic log, so not sure what else to try for debugging why some cameras just return 500s when trying to pull notifications. For anyone else not getting events, it would be nice to confirm people see the same issue with other cameras, since I only have my C720s that are showing this symptom. If you enable debug logging like this in your configuration.yaml file:

logger:
  logs:
    homeassistant.components.onvif: debug

You should see a log message like mine.

@airdrummingfool
Copy link

airdrummingfool commented Nov 17, 2024

I have a TC55 - which is identical to the C720 as far as I can tell - and it also doesn't seem to send any ONVIF notifications. There is a Cell motion detection sensor, but it is almost always unavailable; when it does come online, it is on for hours before going back to unavailable. It seems to have no correlation to actual motion events recognized by the camera.

I enabled debug logging for the onvif component and I received the same error:

DEBUG (MainThread) [homeassistant.components.onvif] Tapo Floodlight: Device does not support notification service or too many subscriptions: illegal status line: bytearray(b'POST /onvif/service\x00HTTP/1.1\x00\x00Host\x00 192.168.x.xxx:2020\x00\x00Accept\x00 */*\x00\x00Accept-Encoding\x00 gzip, deflate, br\x00\x00Connection\x00 keep-alive\x00\x00User-Agent\x00 ZeeHTTP/1.1 500 Internal Server Error')

I wonder if the C720/TC55 firmware doesn't have proper support for ONVIF events? That would be a big bummer.

EDIT: I just tested, and Scrypted can receive basic motion events from the TC55 via ONVIF. So I'm not sure why it's not working in HA.

@jterrace
Copy link

For my C720s, I turned off webhook in the device configuration and restarted home assistant. Switching to pullpoint seemed to make motion events start coming in, but they seem unreliable. And only motion gets picked up, no other events. The C325WB is working great with webhook and that's where I see the other event types. I wonder if pullpoint somehow doesn't work with other event types and for some reason webhooks are broken on C720/TC55. I'll play around some more with seeing if I can get webhooks working with my C720 cameras.

@lcapriotti
Copy link

lcapriotti commented Nov 18, 2024

You should see a log message like mine.

confirmed:

Camera1-C210: Starting PullPoint manager
Camera2-C210: Starting PullPoint manager
Camera3-C210: Starting PullPoint manager
Camera1-C210: Starting webhook manager
Camera1-C210: Registering webhook: onviftapo_control192.168.0.111
Camera1-C210: Unregistering webhook onviftapo_control192.168.0.111
Camera1-C210: Registered webhook: onviftapo_control192.168.0.111
Camera1-C210: Creating webhook subscription with URL: http://192.168.0.175:8123/api/webhook/onviftapo_control192.168.0.111
Camera2-C210: Starting webhook manager
Camera2-C210: Registering webhook: onviftapo_control192.168.0.113
Camera2-C210: Unregistering webhook onviftapo_control192.168.0.113
Camera2-C210: Registered webhook: onviftapo_control192.168.0.113
Camera2-C210: Creating webhook subscription with URL: http://192.168.0.175:8123/api/webhook/onviftapo_control192.168.0.113
Camera4-C210: Starting PullPoint manager
Camera3-C210: Starting webhook manager
Camera3-C210: Registering webhook: onviftapo_control192.168.0.112
Camera3-C210: Unregistering webhook onviftapo_control192.168.0.112
Camera3-C210: Registered webhook: onviftapo_control192.168.0.112
Camera3-C210: Creating webhook subscription with URL: http://192.168.0.175:8123/api/webhook/onviftapo_control192.168.0.112
Camera4-C210: Starting webhook manager
Camera4-C210: Registering webhook: onviftapo_control192.168.0.114
Camera4-C210: Unregistering webhook onviftapo_control192.168.0.114
Camera4-C210: Registered webhook: onviftapo_control192.168.0.114
Camera4-C210: Creating webhook subscription with URL: http://192.168.0.175:8123/api/webhook/onviftapo_control192.168.0.114
Camera1-C210: Pulling PullPoint messages timeout=0:01:00 limit=100
Camera2-C210: Pulling PullPoint messages timeout=0:01:00 limit=100
Camera3-C210: Pulling PullPoint messages timeout=0:01:00 limit=100
Camera4-C210: Pulling PullPoint messages timeout=0:01:00 limit=100
Camera5-D225: Starting PullPoint manager
Camera5-D225: Starting webhook manager
Camera5-D225: Registering webhook: onviftapo_control192.168.0.110
Camera5-D225: Unregistering webhook onviftapo_control192.168.0.110
Camera5-D225: Registered webhook: onviftapo_control192.168.0.110
Camera5-D225: Creating webhook subscription with URL: http://192.168.0.175:8123/api/webhook/onviftapo_control192.168.0.110
Camera5-D225: Pulling PullPoint messages timeout=0:01:00 limit=100
Camera1-C210: Creating webhook subscription with URL: http://192.168.0.175:8123/api/webhook/onviftapo_control192.168.0.111
Camera1-C210: Device does not support notification service or too many subscriptions: illegal status line: bytearray(b'POST /onvif/service\x00HTTP/1.1\x00\x00Host\x00 192.168.0.111:2020\x00\x00Accept\x00 /\x00\x00Accept-Encoding\x00 gzip, deflate, br\x00\x00Connection\x00 keep-alive\x00\x00User-Agent\x00 ZeHTTP/1.1 500 Internal Server Error')
Camera2-C210: Creating webhook subscription with URL: http://192.168.0.175:8123/api/webhook/onviftapo_control192.168.0.113
Camera2-C210: Device does not support notification service or too many subscriptions: illegal status line: bytearray(b'POST /onvif/service\x00HTTP/1.1\x00\x00Host\x00 192.168.0.113:2020\x00\x00Accept\x00 /\x00\x00Accept-Encoding\x00 gzip, deflate, br\x00\x00Connection\x00 keep-alive\x00\x00User-Agent\x00 ZeHTTP/1.1 500 Internal Server Error')
Camera3-C210: Creating webhook subscription with URL: http://192.168.0.175:8123/api/webhook/onviftapo_control192.168.0.112
Camera3-C210: Device does not support notification service or too many subscriptions: illegal status line: bytearray(b'POST /onvif/service\x00HTTP/1.1\x00\x00Host\x00 192.168.0.112:2020\x00\x00Accept\x00 /\x00\x00Accept-Encoding\x00 gzip, deflate, br\x00\x00Connection\x00 keep-alive\x00\x00User-Agent\x00 ZeHTTP/1.1 500 Internal Server Error')
Camera4-C210: Creating webhook subscription with URL: http://192.168.0.175:8123/api/webhook/onviftapo_control192.168.0.114
Camera4-C210: Device does not support notification service or too many subscriptions: illegal status line: bytearray(b'POST /onvif/service\x00HTTP/1.1\x00\x00Host\x00 192.168.0.114:2020\x00\x00Accept\x00 /\x00\x00Accept-Encoding\x00 gzip, deflate, br\x00\x00Connection\x00 keep-alive\x00\x00User-Agent\x00 ZeHTTP/1.1 500 Internal Server Error')
Camera5-D225: Creating webhook subscription with URL: http://192.168.0.175:8123/api/webhook/onviftapo_control192.168.0.110
Camera5-D225: Device does not support notification service or too many subscriptions: illegal status line: bytearray(b'POST /onvif/service\x00HTTP/1.1\x00\x00Host\x00 192.168.0.110:2020\x00\x00Accept\x00 /\x00\x00Accept-Encoding\x00 gzip, deflate, br\x00\x00Connection\x00 keep-alive\x00\x00User-Agent\x00 ZeHTTP/1.1 500 Internal Server Error')
Camera1-C210: PullPoint subscription encountered a remote protocol error (this is normal for some cameras): Server disconnected without sending a response.
Camera2-C210: PullPoint subscription encountered a remote protocol error (this is normal for some cameras): Server disconnected without sending a response.
Camera3-C210: PullPoint subscription encountered a remote protocol error (this is normal for some cameras): Server disconnected without sending a response.
Camera1-C210: Pulling PullPoint messages timeout=0:01:00 limit=100
Camera2-C210: Pulling PullPoint messages timeout=0:01:00 limit=100

(...))

@jterrace
Copy link

Some exciting progress. I installed this onvif client software to test an independent implementation:
https://www.happytimesoft.com/products/onvif-client/index.html

And after subscribing to events on my C720, I am able to see both motion and people events coming in:
image

So that tells me that the C720 at least is capable of producing these events. Next I'm going to try to capture the xml payloads with wireshark to hopefully figure out the difference between what this happytime client is doing vs. home assistant's python onvif/zeep client.

@jterrace
Copy link

jterrace commented Nov 20, 2024

I figured out what causes the 500 internal server error. The cameras do not like the ns0/ns1 namespace prefixes zeep is generating. Technically, it's correct due to the xmlns, but most serializers will put the xmlns definitions in the envelope at the start of the xml document.

This fails:

<ns0:Subscribe xmlns:ns0="http://docs.oasis-open.org/wsn/b-2">
  <ns0:ConsumerReference>
    <ns1:Address xmlns:ns1="http://www.w3.org/2005/08/addressing">http://192.168.56.109:9988/</ns1:Address>
  </ns0:ConsumerReference>
  <ns0:InitialTerminationTime>PT60S</ns0:InitialTerminationTime>
</ns0:Subscribe>

While this works:

<wsnt:Subscribe>
  <wsnt:ConsumerReference>
    <wsa:Address>http://192.168.56.109:9988/</wsa:Address>
  </wsnt:ConsumerReference>
  <wsnt:InitialTerminationTime>PT60S</wsnt:InitialTerminationTime>
</wsnt:Subscribe>

To get that to be output, I added:

self.zeep_client.set_ns_prefix('wsnt', 'http://docs.oasis-open.org/wsn/b-2')
self.zeep_client.set_ns_prefix('wsa', 'http://www.w3.org/2005/08/addressing')

to onvif\client.py. I'm kind of surprised that zeep doesn't put namespaces at the top by default, since it reduces serialization byte size quite a bit. As a workaround, I can send a PR upstream to python-onvif-zeep-async to do this for all of the common onvif namespaces. I'll see if he'll take that PR. That should hopefully fix everyone's 500s and make additional event types start flowing.

@jterrace
Copy link

Status:

Nothing else I can do until those are accepted.

@jterrace
Copy link

jterrace commented Dec 4, 2024

Good news, everything has been merged. Unfortunately, it looks like I just barely missed the 2024.12.0 release for the person and vehicle event change. However, the bump to onvif-zeep-async to 3.1.13 did make it into 2024.12.0, so some cameras should start getting motion events using push that were broken with pull. We'll have to wait for the next release to pick up the person and vehicle event.

@garethmo
Copy link

Hey guys, think I may have misunderstood? I don't see any new entities for my camera. I have cw320. I'm on 2024.12.2.

@jterrace
Copy link

I see some discussion here that maybe the cw320 events don't work?
https://community.tp-link.com/us/smart-home/forum/topic/661924

Do you have motion notifications enabled on the camera? Do you get notified on the app when it detects motion?

If so, you should see the motion detection show up as a sensor on the device page, e.g.
image

@garethmo
Copy link

@jterrace i get the motion events :) just not person/vehicle. I'll have a look at the thread you posted

@jterrace
Copy link

No, that's the expected behavior right now. The person/vehicle events change didn't make it into 2024.12, we have to wait for 2025.01

@garethmo
Copy link

Aaah that would explain it!! I thought it was in the dot release

@jterrace
Copy link

The minor dot fixes only take bug fixes / security fixes. They don't pull in new features :(

@simon-bd
Copy link

Even through it wasn't pulled it should we be able to see it in logs or how should we understand it. I have motion sensor visible and active but the logs only display :

2024-12-12 16:09:25.474 DEBUG (MainThread) [homeassistant.components.onvif] Baby monitor camera: Pulling PullPoint messages timeout=0:01:00 limit=100 2024-12-12 16:09:25.538 DEBUG (MainThread) [homeassistant.components.onvif] Baby monitor camera: continuous PullMessages: 1 event(s) 2024-12-12 16:09:26.288 DEBUG (MainThread) [homeassistant.components.onvif] Baby monitor camera: Pulling PullPoint messages timeout=0:01:00 limit=100

@jterrace
Copy link

Do you have "Enable webhooks" enabled in the device configuration?

@fcastilloec
Copy link

fcastilloec commented Dec 12, 2024

@simon-bd I see the same as you, but I also have this additional message

PullPoint subscription encountered a remote protocol error (this is normal for some cameras): Server disconnected without sending a response.

I'm guessing it's because I've disabled internet access to my camera from my router. I'm waiting to see what tomorrow's Tapo-app update will do to the camera. I don't want to send my feed to the Internet, but I also would like to receive firmware updates to my camera. So, if I enable Internet access temporarily, I don't want my camera to stop working with this integration.

I hope that the new ONVIF code allows us to get all the sensors' data locally, I was relaying on IFTTT to get those specific notifications. I didn't like having my data sent to the Internet, and with the new firmware stopping us from using this integration, it was better to disable Internet access.

@simon-bd
Copy link

I have internet blocked for the devices as well. I have the c100 and c110. Which devices do you have.

I don't see a webhook option in my camera settings

@jterrace
Copy link

jterrace commented Dec 12, 2024

  • Settings → Devices & services → Tapo: Cameras Control → Configure button the device:

  • image

  • Select "Configure device" → Submit

  • Check the "Enable webhooks" box:

  • image

You probably need to restart home assistant for it to take effect.

I could be wrong, but I don't think the cameras need internet access for local onvif to work.

@simon-bd
Copy link

Thanks a bunch!

I already had the ‘Enable webhooks’ option turned on in my Tapo integration settings in Home Assistant. I just set up a second camera of the same model, and I’ll keep an eye on the logs. Before, the second camera was only connected to Scrypted, not to Home Assistant.

I’ll keep the internet access blocked for these cameras, even though it’s blocked. I don’t want to send any data to the internet.

Thanks again for the helpful instructions and suggestions. I really appreciate you taking the time to walk me through this.

@airdrummingfool
Copy link

I have a TC55 (same as C720) and have noticed that if there is more than one ONVIF client connected to it (this integration + Scrypted, for example) event notifications behave erratically - often times motion is "detected" for hours at a time without a break, and sometimes there's no detection at all. I've reported it to TP Link support and they are trying to reproduce it.

@fcastilloec
Copy link

@simon-bd I have two C120, one if v1 and the other v1.6, they're not connected to anything else just this integration and the Tapo app on my phone, and webhook is also enabled. Not sure what the PullPoint error is from

@jterrace
Copy link

Actually, when I enable it looks like I'm still seeing my cameras fall back to pullpoint due to webhook still seeing 500s:

2024-12-12 13:26:11.510 DEBUG (MainThread) [homeassistant.components.onvif] Side Porch: Device does not support notification service or too many subscriptions: illegal status line: bytearray(b'POST /onvif/service\x00HTTP/1.1\x00\x00Host\x00 192.168.56.109:2
020\x00\x00Accept\x00 */*\x00\x00Accept-Encoding\x00 gzip, deflate, br\x00\x00Connection\x00 keep-alive\x00\x00User-Agent\x00 ZHTTP/1.1 500 Internal Server Error')

Those errors should have gone away with the bump of onvif-zeep-async library. Now I realize the bump did not make it into 2024.12 at all. Looking at my installation, I still see 3.1.12, not 3.1.13:

# grep onvif-zeep /usr/src/homeassistant/homeassistant/components/onvif/manifest.json 
  "requirements": ["onvif-zeep-async==3.1.12", "WSDiscovery==2.0.0"]

And browsing the 2024.12.2 tag, I also don't see it:
https://github.com/home-assistant/core/blob/2024.12.2/homeassistant/components/onvif/manifest.json

Sorry I was mistaken about that: we're going to have to wait for 2025.1 to get any of the changes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Enhancement New feature or request Help wanted Extra attention is needed
Projects
None yet
Development

No branches or pull requests