Coder Social home page Coder Social logo

user2684 / imou_life Goto Github PK

View Code? Open in Web Editor NEW
105.0 6.0 15.0 123 KB

Home Assistant custom component for controlling Imou devices

License: MIT License

Python 100.00%
camera home-assistant home-automation imou webcam motion-detection imou-life

imou_life's Introduction

Home Assistant custom component for controlling Imou devices

hacs_badge hacs_badge Donate

This Home Assistant component helps in interacting with devices registered with the Imou Life App and specifically enabling/disabling motion detection, siren, and other switches.

Despite Imou webcams video streams can be integrated in Home Assistant through Onvif, the only way to interact with the device as if using the Imou Life App is to leverage the Imou API, that is what this component under the hood does.

Once an Imou device is added to Home Assistant, switches can be controlled through the frontend or convenientely used in your automations.

Features

  • Configuration through the UI
  • Auto discover registered devices
  • Auto discover device capabilities and supported switches
  • Sensors, binary sensors, select, buttons to control key features of each device
  • Support for push notifications
  • Image snapshots, video streaming and PTZ controls
  • Support for dormant devices

Supported Models

You can find here a list with all the Imou models which have been tested and if they are working or not with the integration. Please feel free to report any missing model or additional information.

Installation

HACS (recommended)

After installing and configuring HACS, go to "Integrations", "Explore & Download Repositories", search for "Imou Life" and download the integration.

Manual installation

  1. Using the tool of choice open the directory (folder) for your HA configuration (where you find configuration.yaml).
  2. If you do not have a custom_components directory (folder) there, you need to create it.
  3. In the custom_components directory (folder) create a new folder called imou_life.
  4. Download all the files from the custom_components/imou_life/ directory (folder) in this repository.
  5. Place the files you downloaded in the new directory (folder) you created.
  6. Restart Home Assistant

This integration depends on the library imouapi for interacting with the end device. The library should be installed automatically by Home Assistante when initializing the integration. If this is not happening, install it manually with:

pip3 install imouapi

Requirements

To interact with the Imou API, valid App Id and App Secret are required.

In order to get them:

Configuration

The configuration of the component is done entirely through the UI.

  1. In the Home Assistant UI to "Configuration" -> "Integrations" click "+" and search for "Imou Life"
  2. Fill in App Id and App Secret
    1. If Discover registered devices is selected:
      • A list of all the devices associated with your account is presented
      • Select the device you want to add
      • Optionally provide a name (otherwise the same name used in Imou Life will be used)
    2. If Discover registered devices is NOT selected:
      • Provide the Device ID of the device you want to add
      • Optionally provide a name (otherwise the same name used in Imou Life will be used)

Once done, you should see the integration added to Home Assistant, a new device and a few entities associated with it.

The following entities are created (if supported by the device):

  • Switches:
    • All of those supported by the remote device
    • Enable/disable push notifications
  • Sensors:
    • Storage Used on SD card
    • Callback URL used for push notifications
  • Binary Sensors:
    • Online
    • Motion alarm
  • Select:
    • Night Vision Mode
  • Buttons:
    • Restart device
    • Refresh all data
    • Refresh motion alarm sensor

If you need to add another device, repeat the process above.

Advanced Options

The following options can be customized through the UI by clicking on the "Configure" link:

  • Polling interval - how often to refresh the data (in seconds, default 15 minutes)
  • API Base URL - th url of the Imou Life API (default https://openapi.easy4ip.com/openapi)
  • API Timeout - API call timeout in seconds (default 10 seconds)
  • Callback URL - when push notifications are enabled, full url to use as a callback for push notifications

Motion Detection

When adding a new device, a Motion Alarm binary sensor is created (provided your device supports motion detection). You can use it for building your automations, when its state changes, like any other motion sensors you are already familiar with. There are multiple options available to keep the motion alarm sensor regularly updated, described below. All the options will update the same "Motion Alarm" sensor, just the frequency changes depending on the option. Option 1 and 2 does not require Home Assistant to be exposed over the Internet, Option 3 does but ensure realtime updates of the sensor.

Option 1

If you do nothing, by default the sensor will be updated every 15 minutes, like any other sensor of the device. If a motion is detected, the sensor triggers and it will get back to a "Clear" state at the next update cycle (e.g. after other 15 minutes)

Option 2

If you want to increase the frequency, you can force an update of the "Motion Alarm" sensor state manually or automatically, through the "Refresh Alarm" button which is created in the same device. For example, you can create an automation like the below which press every 30 seconds the "Refresh Alarm" button for you, causing an update of the "Motion Alarm" sensor state (replace button.webcam_refreshalarm with the name of your entity):

alias: Imou - Refresh Alarm
description: ""
trigger:
  - platform: time_pattern
    seconds: "30"
condition: []
action:
  - service: button.press
    data: {}
    target:
      entity_id: <button.webcam_refreshalarm>
mode: single

Please note, the underlying Imou API is limited to 20000 calls per day.

Option 3

If you want relatime updates of the "Motion Alarm" sensor, you need to enable push notifications. In this scenario, upon an event occurs (e.g. alarm, device offline, etc.) a realtime notification is sent by the Imou API directly to your Home Assistance instance so you can immediately react upon it. Since this is happening via a direct HTTP call to your instance, your Home Assistance must be exposed to the Internet as a requirement. Please note, push notification is a global configuration, not per device, meaning once enabled on one device it applies to ALL devices registered in your Imou account.

Requirements

  • Home Assistant exposed to the Internet
  • Home Assistant behind a reverse proxy, due to malformed requests sent by the Imou API (see below for details and examples)

Configuration

  • Ensure Home Assistant is exposed over the Internet, is behind a reverse proxy, and you have implemented the security checklists
  • In Home Assistant, add at least a device through the Imou Life integration
  • Go to "Settings", "Devices & Services", select your Imou Life integration and click on "Configure"
  • In "Callback URL" add the external URL of your Home Assistant instance, followed by /api/webhook/, followed by a random string difficult to guess such as imou_life_callback_123jkls and save. For example https://yourhomeassistant.duckdns.org/api/webhook/imou_life_callback_123jkls. This will be name of the webhook which will be called when an event occurs.
  • Visit the Device page, you should see a "Push Notifications" switch
  • Enable the switch. Please remember this is a global configuration, you just need to do it once and in a SINGLE device only
  • Go to "Settings", "Automation & Scenes" and click on "Create Automation" and select "Start with an empty automation"
  • Click the three dots in the top-right of the screen, select "Edit in YAML", copy, paste the following and replace <your_string_difficult_to_guess> with yours (e.g. imou_life_callback_123jkls) and save it:
alias: Imou Push Notifications
description: "Handle Imou push notifications by requesting to update the Motion Alarm sensor of the involved device (v1)"
trigger:
  - platform: webhook
    webhook_id: <your_string_difficult_to_guess>
condition:
  - condition: template
    value_template: |
      {% for entity_name in integration_entities("imou_life") %}
        {%- if entity_name is match('.+_refreshalarm$') and is_device_attr(entity_name, "hw_version", trigger.json.did) %}
          true
        {%-endif%}
        {% else %}
          false
      {%- endfor %}
  - condition: template
    value_template: |-
      {%- if trigger.json.msgType in ("videoMotion", "human", "openCamera") %}
        true
      {% else %}
        false
      {%-endif%}
action:
  - service: button.press
    data: {}
    target:
      entity_id: |
        {% for entity_name in integration_entities("imou_life") %}
          {%- if entity_name is match('.+_refreshalarm$') and is_device_attr(entity_name, "hw_version", trigger.json.did) %}
            {{entity_name}}
          {%-endif%}
        {%- endfor %}
    enabled: true
mode: queued
max: 10

When using this option, please note the following:

  • The API for enabling/disabling push notification is currently limited to 10 times per day by Imou so do not perform too many consecutive changes. Keep also in mind that if you change the URL, sometimes it may take up to 5 minutes for a change to apply on Imou side
  • In Home Assistant you cannot have more than one webhook trigger with the same ID so customize the example above if you need to add any custom logic
  • Unfortunately HTTP requests sent by the Imou API server to Home Assistant are somehow malformed, causing HA to reject the request (404 error, without any evidence in the logs). A reverse proxy like NGINX in front of Home Assistant without any special configuration takes care of cleaning out the request, hence this is a requirement. Instructions on how to configured it and examples are available here.

PTZ Controls

The integration exposes two services for interacting with the PTZ capabilities of the device:

  • imou_life.ptz_location: if the device supports PTZ, you will be able to move it to a specified location by providing horizontal (between -1 and 1), vertical (between -1 and 1) and zoom (between 0 and 1)
  • imou_life.ptz_move If the device supports PTZ, you will be able to move it around by providing an operation (one of "UP", "DOWN", "LEFT", "RIGHT", "UPPER_LEFT", "BOTTOM_LEFT", "UPPER_RIGHT", "BOTTOM_RIGHT", "ZOOM_IN", "ZOOM_OUT", "STOP") and a duration for the operation (in milliseconds)

Those services can be invoked on the camera entity. To test this capability, in Home Assistant go to "Developer Tools", click on "Services", select one of the services above, select the target entity, provide the required information and click on "Call Service". If something will go wrong, have a look at the logs.

Presets are instead not apparently supported by the Imou APIs but could be implemented by combining HA scripts and calls to the imou_life.ptz_location service.

Limitations / Known Issues

  • The Imou API does not provide a stream of events, for this reason the integration periodically polls the devices to sync the configuration. So if you change anything from the Imou Life App, it could take a few minutes to be updated in HA. Use the "Refresh Data" button to refresh data for all the devices' sensors
  • Imou limits up to 5 the number of devices which can be controlled through a developer account (e.g. the method used by this integration). Additional devices are added successfully but they will throw a "APIError: FL1001: Insufficient remaining available licenses" error message whenever you try to interact. As a workaround, create another Imou account associated to a different e-mail address, take note of the new AppId and AppSecret, and bind the device there. Alternatively, you can also keep the device associated with the primary account, share it with the newly account and add it to HA through the integration
  • For every new device to be added, AppId and AppSecret are requested
  • Advanced options can be changed only after having added the device
  • Due to malformed requests sent by the Imou API server, in order for push notifications to work, Home Assistant must be behind a reverse proxy

Troubleshooting

If anything fails, you should find the error message and the full stack trace on your Home Assistant logs. This can be helpful for either troubleshoot the issue or reporting it.

Device Diagnostics

Diagnostics information is provided by visiting the device page in Home Assistant and clicking on "Download Diagnostics".

Debugging

To gain more insights on what the component is doing or why is failing, you can enable debug logging:

logger:
  default: info
  logs:
    custom_components.imou_life: debug

Since this integration depends on the library imouapi for interacting with the end device, you may want to enable debug level logging to the library itself:

logger:
  default: info
  logs:
    custom_components.imou_life: debug
    imouapi: debug

Bugs or feature requests

Bugs and feature requests can be reported through Github Issues. When reporting bugs, ensure to include also diagnostics and debug logs. Please review those logs to redact any potential sensitive information before submitting the request.

Contributing

Any contribution is more than welcome. Github is used to host the code, track issues and feature requests, as well as submitting pull requests. Detailed information on how the code is structured, how to setup a development environment and how to test your code before submitting pull requests is detailed here.

Roadmap

A high level roadmap of this integration can be found here

imou_life's People

Contributors

dependabot[bot] avatar leandroissa avatar ponyony avatar rogodra avatar user2684 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

imou_life's Issues

Motion Detection switch not working

Hi, I'm a beginner with Home Assistant and I have this issue.
I have got 2 cameras: IPC-S42F-D and IPC-C26E-V2.
With the first one the switch "Motion Detection" works perfectly.
With the second one it doesn't work.
Can you please help me?

HA version: 2023.4.6
Supervisor: 2023.04.1
Operating system : 10.0
Frontend: 20230411.1

Thank you very much

Marco

home-assistant_imou_life_2023-04-26T21-32-00.941Z.log

Unique Callback URL for each device

The Callback URL is not unique for each device. If I set the URL on camera 1 and then set the URL on camera 2, the URL from camera 2 is then applied to camera 1. I would have expected the URL for camera 1 to be retained and not overwritten by camera 2. It appears to be a global setting.

My intention is to create template sensors for each camera (webhook), this could make it easier to integrate the webhook events. Below is an example of what could be achieved.

However, I suspect this is not possible as the Callback URL is linked to the developer account which only allows one Callback address per account https://open.imoulife.com/book/http/push/setMessageCallback.html

template:
  - trigger:
      - platform: webhook
        webhook_id: imou_life_webhook_1
    sensor:
      - name: "Imou cName"
        state: "{{ trigger.json.cname }}"
      - name: "Imou deviceType"
        state: "{{ trigger.json.deviceType }}"
      - name: "Imou msgType"
        state: "{{ trigger.json.msgType }}"
      - name: "Imou labelType"
        state: "{{ trigger.json.labelType }}"

Find a way to reverse engineer Imou Life API calls

Especially with new models, Imou is adding capabilities and changing existing one without updating the API documentation resulting in difficulties to emulate Imou Life behaviour and functionalities.
We need to find a way (e.g. a proxy?) to intercept the HTTP calls sent from Imou Life to the Imou API so to emulate the same in our integration
Related issues: #61 #48 #35 #55 #59 #60 #51

Add motion/human sensor

Is it possible to add motion/human detection sensor of the camera?

My device is Imou Cruiser 4MP (IPC-S42F-D).

Failed to setup after upgrading to v1.0.7

If options are defined, the migration of the configuration entry from v1 to v2 does not check if api_url is empty and copy it over causing the failure (the url is invalid)

Cannot activate siren in Imou Bullet IPC-G26E

Recently I added a Imou Bullet IPC-G26E to HomeAssitant via Imou life integration.

Device and entities are available in HA.

I'm able to activate/deactivate white light via whitelight entity or watch video stream.

Unfortunately I cannot enable siren from HA site.

Every attempt ends with an error:
"Failed to call service siren/turn_on. DV1026. The device does not support the call of this function."
signal-2023-05-14-181158_002

The device is equipped in siren that can be activated in official IMOU app in menu.

Please let me know if I can provide more info or do some checks.

Motion sensor not added

Version of the custom_component

1.0.12

Configuration

"home_assistant": {
"installation_type": "Home Assistant OS",
"version": "2023.1.7",
"dev": false,
"hassio": true,
"virtualenv": false,
"python_version": "3.10.7",
"docker": true,
"arch": "x86_64",
"timezone": "Europe/Stockholm",
"os_name": "Linux",
"os_version": "5.15.90",
"supervisor": "2023.01.1",
"host_os": "Home Assistant OS 9.5",
"docker_version": "20.10.22",
"chassis": "vm",
"run_as_root": true

Add your logs here.

Describe the bug

The Motion sensor is not added
image

A clear and concise description of what the bug is.

Debug log

{
"home_assistant": {
"installation_type": "Home Assistant OS",
"version": "2023.1.7",
"dev": false,
"hassio": true,
"virtualenv": false,
"python_version": "3.10.7",
"docker": true,
"arch": "x86_64",
"timezone": "Europe/Stockholm",
"os_name": "Linux",
"os_version": "5.15.90",
"supervisor": "2023.01.1",
"host_os": "Home Assistant OS 9.5",
"docker_version": "20.10.22",
"chassis": "vm",
"run_as_root": true

},
"imou_life": {
  "version": "1.0.12",
  "requirements": [
    "imouapi==1.0.12"

},
"integration_manifest": {
"domain": "imou_life",
"name": "Imou Life",
"documentation": "https://github.com/user2684/imou_life",
"issue_tracker": "https://github.com/user2684/imou_life/issues",
"dependencies": [],
"config_flow": true,
"codeowners": [
"@user2684"
],
"requirements": [
"imouapi==1.0.12"
],
"version": "1.0.12",
"iot_class": "cloud_polling",
"is_built_in": false
},
"data": {
"entry": {
"entry_id": "REDACTED",
"version": 3,
"domain": "imou_life",
"title": "Kamera baksida",
"data": {
"api_url": "https://openapi.easy4ip.com/openapi",
"device_name": "Kamera baksida",
"app_id": "REDACTED",
"app_secret": "REDACTED",
"device_id": "REDACTED"
},
"options": {},
"pref_disable_new_entities": false,
"pref_disable_polling": false,
"source": "user",
"unique_id": "REDACTED",
"disabled_by": null
},
"device_info": {
"api": {
"base_url": "https://openapi.easy4ip.com/openapi",
"timeout": 10,
"is_connected": true
},
"device": {
"device_id": "REDACTED",
"name": "baksida",
"catalog": "IPC",
"given_name": "Kamera baksida",
"model": "IPC-C26E-V2",
"firmware": "Eng_P_V2.680.0000000.28.R.20210911",
"manufacturer": "Imou",
"status": "1",
"sleepable": false
},
"capabilities": [
{
"name": "WLAN",
"description": "Support access to wireless local area network (WLAN)"
},
{
"name": "Auth",
"description": "Device end loopback RTSP requires authentication (Auth)"
},
{
"name": "DHP2P",
"description": "Support Dahua P2P Service (DHP2P)"
},
{
"name": "HSEncrypt",
"description": "Support Huashi WeChat Stream Encryption (HSEncrypt)"
},
{
"name": "BreathingLight",
"description": "The device has a breathing light (indicator light) (BreathingLight)"
},
{
"name": "CloudStorage",
"description": "Support for cloud storage of China Vision WeChat platform (CloudStorage)"
},
{
"name": "LocalStorage",
"description": "Support device local storage, such as SD card or hard disk (LocalStorage)"
},
{
"name": "PlaybackByFilename",
"description": "The device supports playback based on the file name (PlaybackByFilename)"
},
{
"name": "MT",
"description": "Support streaming media forwarding capability (MT)"
},
{
"name": "CK",
"description": "The device supports CustomKey (CustomKey) (CK)"
},
{
"name": "RD",
"description": "The device has remote debugging capabilities and supports log extraction (RemoteDebug) (RD)"
},
{
"name": "RDV2",
"description": "Support RD capability, support data burying point control, support debugging log upload (RDV2)"
},
{
"name": "LocalRecord",
"description": "Support device local recording settings (LocalRecord)"
},
{
"name": "XUpgrade",
"description": "Cloud Upgrade (XUpgrade)"
},
{
"name": "TimeSync",
"description": "Device supports time synchronization (TimeSync)"
},
{
"name": "ModifyPassword",
"description": "Support user name password information verification and password modification (ModifyPassword)"
},
{
"name": "LocalStorageEnable",
"description": "Support device local storage enable switch (LocalStorageEnable)"
},
{
"name": "Siren",
"description": "Siren (Siren)"
},
{
"name": "WhiteLight",
"description": "White Light (WhiteLight)"
},
{
"name": "RTSV2",
"description": "Real-time streaming supports private protocol streaming, supports dynamic port modification (RTSV2)"
},
{
"name": "PBSV2",
"description": "The playback stream supports private protocol streaming and supports dynamic port modification (PBSV2)"
},
{
"name": "ESV1",
"description": "Support 0x95 extension header encryption (ESV1)"
},
{
"name": "DaySummerTime",
"description": "The device supports daily summer time (DaySummerTime)"
},
{
"name": "WeekSummerTime",
"description": "The device supports weekly daylight saving time (WeekSummerTime)"
},
{
"name": "TAP",
"description": "Time supports 12-hour and 24-hour switching (TAP)"
},
{
"name": "TimeFormat",
"description": "Support time format setting (TimeFormat)"
},
{
"name": "AbAlarmSound",
"description": "Abnormal alarm sound (AbAlarmSound)"
},
{
"name": "CheckAbDecible",
"description": "Abnormal detection tone decibel threshold (CheckAbDecible)"
},
{
"name": "PlaySound",
"description": "Device sound switch capability (PlaySound)"
},
{
"name": "CustomRing",
"description": "Custom Ring (CustomRing)"
},
{
"name": "LinkDevAlarm",
"description": "Associated Device Alarm (LinkDevAlarm)"
},
{
"name": "InfraredLight",
"description": "Infrared Light (InfraredLight)"
},
{
"name": "SCCode",
"description": "The device supports SC security code (SCCode)"
},
{
"name": "TimingGraphics",
"description": "Support the device to capture multiple pictures (TimingGraphics)"
},
{
"name": "DevReset",
"description": "Device Reset (DevReset)"
},
{
"name": "TLSEnable",
"description": "Support TLS transmission (TLSEnable)"
},
{
"name": "DHCP",
"description": "DHCP"
},
{
"name": "DLS",
"description": "Direct log storage (DLS)"
},
{
"name": "ONLDLS",
"description": "ONLDLS"
},
{
"name": "Reboot",
"description": "The device supports restarting (Reboot)"
},
{
"name": "NEC",
"description": "The device supports No encrypt capture (NEC)"
},
{
"name": "CCD",
"description": "CCD"
},
{
"name": "ME",
"description": "Support Message Engine (ME)"
},
{
"name": "LRRF",
"description": "Local recording supports fast forward LocalRecordReplayForward (LRRF)"
},
{
"name": "CDD-OSS",
"description": "CDD-OSS"
},
{
"name": "CDD-OBS",
"description": "CDD-OBS"
},
{
"name": "CDD-US3",
"description": "CDD-US3"
},
{
"name": "CDD-BOS",
"description": "CDD-BOS"
},
{
"name": "CDD-COS",
"description": "CDD-COS"
},
{
"name": "CDDV2",
"description": "CDDV2"
},
{
"name": "CDD",
"description": "CDD"
},
{
"name": "RemoteControl",
"description": "Support remote linkage (RemoteControl)"
},
{
"name": "FrameReverse",
"description": "Support screen flip (FrameReverse)"
},
{
"name": "AudioEncodeControlV2",
"description": "Supports audio encoding control (on or off), only affects real-time video, video audio, and does not affect intercom audio control (AudioEncodeControlV2)"
},
{
"name": "MDW",
"description": "motion-detect-window supports motion detection window settings (MDW)"
},
{
"name": "MDS",
"description": "motion-detect-sensitive supports motion detection sensitivity setting (MDS)"
},
{
"name": "MobileDetect",
"description": "Mobile Detection (Merged with PIR) (MobileDetect)"
},
{
"name": "SDLIFE",
"description": "SD card life (SDLIFE)"
},
{
"name": "OSD",
"description": "Support video channel OSD configuration (OSD)"
},
{
"name": "1080P",
"description": "Maximum capability set supported by the device (1080P)"
},
{
"name": "mp4",
"description": "mp4"
},
{
"name": "MDMD",
"description": "MDMD"
},
{
"name": "VC",
"description": "VC"
},
{
"name": "WDRV2",
"description": "Wide dynamic v2, support 0-100 gear configuration (WDRV2)"
},
{
"name": "WLTM",
"description": "WLTM"
},
{
"name": "VQS",
"description": "VQS"
},
{
"name": "AudioTalk",
"description": "Support voice intercom (AudioTalk)"
},
{
"name": "AlarmSound",
"description": "Support alarm sound setting (AlarmSound)"
},
{
"name": "pushNotifications",
"description": "Push notifications (pushNotifications)"
}
],
"switches": [
{
"name": "localRecord",
"description": "Local recording (localRecord)",
"state": null,
"is_enabled": false,
"is_updated": false,
"attributes": {}
},
{
"name": "breathingLight",
"description": "Status indicator (breathingLight)",
"state": true,
"is_enabled": true,
"is_updated": true,
"attributes": {}
},
{
"name": "audioEncodeControl",
"description": "Record audio (audioEncodeControl)",
"state": null,
"is_enabled": false,
"is_updated": false,
"attributes": {}
},
{
"name": "localStorageEnable",
"description": "Local storage (localStorageEnable)",
"state": null,
"is_enabled": false,
"is_updated": false,
"attributes": {}
},
{
"name": "whiteLight",
"description": "White Light (whiteLight)",
"state": false,
"is_enabled": true,
"is_updated": true,
"attributes": {}
},
{
"name": "infraredLight",
"description": "Infrared light (infraredLight)",
"state": null,
"is_enabled": false,
"is_updated": false,
"attributes": {}
},
{
"name": "mobileDetect",
"description": "Mobile detection (mobileDetect)",
"state": null,
"is_enabled": false,
"is_updated": false,
"attributes": {}
},
{
"name": "tlsEnable",
"description": "Tls enable (tlsEnable)",
"state": null,
"is_enabled": false,
"is_updated": false,
"attributes": {}
},
{
"name": "linkDevAlarm",
"description": "Siren Armed (linkDevAlarm)",
"state": false,
"is_enabled": true,
"is_updated": true,
"attributes": {}
},
{
"name": "abAlarmSound",
"description": "Noise detection (abAlarmSound)",
"state": true,
"is_enabled": true,
"is_updated": true,
"attributes": {}
},
{
"name": "playSound",
"description": "Device sound (playSound)",
"state": null,
"is_enabled": false,
"is_updated": false,
"attributes": {}
},
{
"name": "pushNotifications",
"description": "Push notifications (pushNotifications)",
"state": false,
"is_enabled": true,
"is_updated": true,
"attributes": {}
}
],
"sensors": [
{
"name": "storageUsed",
"description": "Storage used (storageUsed)",
"state": null,
"is_enabled": true,
"is_updated": true,
"attributes": {}
},
{
"name": "callbackUrl",
"description": "Callback url (callbackUrl)",
"state": "",
"is_enabled": true,
"is_updated": true,
"attributes": {}
},
{
"name": "status",
"description": "Status (status)",
"state": "Online",
"is_enabled": true,
"is_updated": true,
"attributes": {}
}
],
"binary_sensors": [
{
"name": "online",
"description": "Online (online)",
"state": true,
"is_enabled": true,
"is_updated": true,
"attributes": {}
}
],
"selects": [],
"buttons": [
{
"name": "restartDevice",
"description": "Restart device (restartDevice)",
"is_enabled": true,
"is_updated": false,
"attributes": {}
},
{
"name": "refreshData",
"description": "Refresh all data (refreshData)",
"is_enabled": true,
"is_updated": false,
"attributes": {}
},
{
"name": "refreshAlarm",
"description": "Refresh alarm (refreshAlarm)",
"is_enabled": true,
"is_updated": false,
"attributes": {}
}
],
"sirens": [
{
"name": "siren",
"description": "Activate siren (siren)",
"state": false,
"is_enabled": true,
"is_updated": false,
"attributes": {}
}
],
"cameras": [
{
"name": "camera",
"description": "Camera (HD) (camera)",
"is_enabled": true,
"is_updated": false,
"attributes": {}
},
{
"name": "cameraSD",
"description": "Camera (SD) (cameraSD)",
"is_enabled": false,
"is_updated": false,
"attributes": {}
}
]
}
}
}


Add your logs here.

Push Notifications

Sorry if I use this channel to send this message but I don't have your mail.
I have installed your component and would like to activate notifications.
I have set Callback Webhook ID, enabled the Push Notifications adn created a automation but I cannot trigger the notifications.

In Imou Life config I need add only the Callback Webhook ID, right? I need add any more? (Callback full URL , ...)
I use duckdns to access to my ha from internet.

Ability to also get a local RTSP stream from the integration and configure via Home Assistant

Is your feature request related to a problem? Please describe.
Assuming that the current camera stream is via Imou Cloud, would be great to also derive the appropriate RTSP local stream at the same time as configuring this new integration for a camera. That way there is both a cloud and local streaming option.
Configuring the parameters of the stream would be great too (e.g. CBR vs VBR, resolution, max bitrate, brightness, etc.) as per what https://dahuawiki.com/ConfigTool allows.

Describe the solution you'd like
Add a new camera stream based on RTSP local network streaming

Describe alternatives you've considered
Separate manual RTSP configuration via the Camera or ONVIF Home Assistant integrations.
Separate configuration using the Dahua Windows PC config toolbox. (https://dahuawiki.com/ConfigTool)

Additional context
RTSP streams may require the use of the Dahua config app (but possibly could be done via cloud settings) to configure to H264 protocol as I think Home Assistant doesn't support the default H265 compression protocol.

Change base url for API

Hi,

Currently the option to configure the base url is only allowed when the integration completes setup.

Suggest to have an option to input a custom url at the same time when inputting the AppId and AppSecret. This would allow for setup of devices from another region (https://openapi.lechange.cn:443/openapi), without first having devices tagged to "https://openapi.easy4ip.com/openapi".

Thanks!

<Ref
The following options can be customized through the UI by clicking on the "Configure" link:

Polling interval - how often to refresh the data (in seconds, default 15 minutes)
API Base URL - th url of the Imou Life API (default https://openapi.easy4ip.com/openapi)
API Timeout - API call timeout in seconds (default 10 seconds)
Callback URL - when push notifications are enabled, full url to use as a callback for push notifications
/>

Real Time Alarm update

Hi There,

I have this configuration but the motion alarm is a bit pointless. Can you please advise on how can I get real-time alarm updates since I will configure my security lights based on the alarm inputs.

Thanks

Unable perform the logon to discover the devices

Hello

I'm trying to performed the logon with the credentials App Id and App Secret and I'm using the last available version of the integration available over hacs

But I'm receiving the following erro msg

image

Can you please help me in order to try solve this issue ?

Thank you in advance for your help and support

imou cell 2 request

So, adding this camera gives a few sensors and stuff which temporarily work. As the camera is a battery operated one, it goes to sleep.

Looking at the http api's, I think it could enable query the device to wake up and then pull sensor states. Also could not get webhooks working to have entities update.
So request is:

  • wake up device implementation
  • webhook fix (could not get any debug info on it, imou wasnt very clear when webooks are sent)
  • fetch a live stream to display as camera on awake device (which also happens on motion detection)

iMou Ranger 2 4MP No video feed

Version of the custom_component

Lastest 1.0.12

Describe the bug

Added a new iMou Ranger 2 4MP via Homeassistant HACS integration. All entities like switches, statuses work, but camera feed is broken (no image) on either the "HD" or "SD" channel.

Hardware

IPC-A42-D
by Imou
Firmware: 2.800.0000000.11.R.220812
Hardware: 8C07422PAZC614A

Push notifications set problem

I have 2 problem with push notifications:

FIRST PROBLEM
I have set the webhook callback on settings, like this:
"https://MYDOMAIN.duckdns.org/api/webhook/MYCALLBACKSTRING" (without port number, right?)

Then I tried to active Push Notifications about configuration of a device and I get this error:
"OP1003: Invalid parameter (incorrect or null), please modify parameter"

SECOND PROBLEM
I installed HA core on docker, so I don't have add. So I installed Nginx Proxy Manager and MariaDB both on docker and So I they seem to work.
Could someone tell me how to set up Nginx because I don't know it (a screenshot is welcome).

how to watch video with this integration

Hello

I have done the integration and I have access to all the sensors of the integration.

But how can I see the video of the camera with this integration?
I don't see the video sensor in the integration.
I would like to be able to move the camera motor and view the video in both quality profiles.
With this integration I can access via rstp ? until now it was not possible with this type of camera.
Is it possible ?

Thanks

image

Bullet & Cruiser - Mention "IDLE"

Hi There,

I have 4 imou camera :

1 x Bullet 2C - 4MP
1 X Cruiser - 4MP
2 X Ranger 2C - 4MP

For the 2 x Rangers the integration works normally.
For the other two models, Cruiser & Bullet, to the right of the window at the bottom,
I have a mention "inactive" -> "Idle" which is displayed.
The stream does not happen. The image refreshes every 10s.
How to solve this?

Thanks in advance.
HA - Imou - Idle

Motion Sensors not Working

None of the motion sensors are working with the last update. I have 2xdifferent types of IMOU cameras and motion sensors works on the default app but not in this integration.

Cell Go support?

Is your feature request related to a problem? Please describe.
I have integrated an Imou Cell go camera into HA but I can't get any live feed and some sensors are not reported (like Battery reports unavailable)

Describe the solution you'd like
I might be totally wrong but I read request #36 and it seems the Cell go is not that much different (battery operated, no permanent live feed)...reason why I am opening it as a request as there's no official support yet I guess

Thanks
Eric

PTZ control to move the camera :)

Hello, I have an Imou Ranger 2 camera and it works well on Home Assistant, even more since this integration, but I would like to ask for PTZ control.
There are some camera integrations that allow to add PTZ controls and move it at will from HA.
(example: https://github.com/AlexxIT/WebRTC/wiki/PTZ-Config-Examples)

Now I can open and close the camera from Home Assistant, and that's a big step to automate the cameras.
Would you consider to add PTZ control to imou based cameras?

Thanks in advance

Document how to watch the video stream

Add in the documentation:

  • This integration is not intended to provide a video stream for not overlapping with other integrations
  • Video stream can be seen through onvif or webrtc (#17)
  • camera entity can be used for PTZ
  • PTZ can be combined with other video streams

No video feed from Ranger 2 (IPC-A22E-D)

Version of the custom_component

HACS imou 1.0.12

Camera:
IPC-A22E-D (Ranger 2 (2MP))
by Imou
Firmware: 2.800.0000000.11.R.221208

Describe the bug

Adding my new Ranger 2 (2MP) via the HACS integration is successful, and there are parameters of the camera that are valid, but the video feed itself is broken (see screen). I've enabled logs for the integration and I got this error log below. Just for reference, I have the same camera (but IPC-A22E w/o -D) that I bought one year ago and it works just fine.
I've tried:

  • factory resetting
  • using the macOS ConfigTool
  • regenerating the API keys in the imou web panel

Debug log

Logger: homeassistant.components.camera
Source: custom_components/imou_life/camera.py:106 
Integration: Camera (documentation, issues) 
First occurred: 09:46:59 (2 occurrences) 
Last logged: 09:46:59

Error adding entities for domain camera with platform imou_life
Error while setting up imou_life platform for camera
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 442, in async_add_entities
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 717, in _async_add_entity
    await entity.add_to_platform_finish()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 812, in add_to_platform_finish
    await self.async_internal_added_to_hass()
  File "/usr/src/homeassistant/homeassistant/components/camera/__init__.py", line 665, in async_internal_added_to_hass
    await self.async_refresh_providers()
  File "/usr/src/homeassistant/homeassistant/components/camera/__init__.py", line 676, in async_refresh_providers
    self._rtsp_to_webrtc = await self._async_use_rtsp_to_webrtc()
  File "/usr/src/homeassistant/homeassistant/components/camera/__init__.py", line 686, in _async_use_rtsp_to_webrtc
    stream_source = await self.stream_source()
  File "/config/custom_components/imou_life/camera.py", line 106, in stream_source
    return await self.sensor_instance.async_get_stream_url()
  File "/usr/local/lib/python3.10/site-packages/imouapi/device_entity.py", line 656, in async_get_stream_url
    raise APIError("unable to get live streaming")
imouapi.exceptions.APIError: unable to get live streaming

Screenshot 2023-02-03 at 09 51 57

Licenses Exceed

Hello,

I installed your integration to my HA yesterday and everything seemed fine but today it suddenly stopped working and asked for a reboot.

After the reboot the camera is not seen anymore and I just have a log saying that there are api timeout.

I waited a bit to see if this was Imou life APIs that were down for a few minutes but as it did not go up again I started to worry and tested the phone app, and there I could see that everything is working fine.

After that I headed to the open.imoulife.com console and in device I saw that I had a license Exceed:
image

I tried to look at your documentation but did not see any information on a license limit, I'm a bit confused as I did not find a lot of infos on the net on that. I tested to close/open the camera a few times (less than 10) and it was yesterday, any idea what I could do to prevent the license exceed?

Adding support for the new Imour Ranger RC

Describe the bug

I try to added the new IMOU Ranger RC, the device appears in the HA - Home Assistant, but I can't load the image stream or use some of the sensors and the buttons as you can see in the imagens bellow

image
image
image

Debug log

This error originated from a custom integration.

Logger: aiohttp.server
Source: custom_components/imou_life/camera.py:98
Integration: Imou Life (documentation, issues)
First occurred: 10:05:01 AM (4 occurrences)
Last logged: 10:05:30 AM

Error handling request
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/aiohttp/web_protocol.py", line 433, in _handle_request
    resp = await request_handler(request)
  File "/usr/local/lib/python3.10/site-packages/aiohttp/web_app.py", line 504, in _handle
    resp = await handler(request)
  File "/usr/local/lib/python3.10/site-packages/aiohttp/web_middlewares.py", line 117, in impl
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/security_filter.py", line 67, in security_filter_middleware
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/forwarded.py", line 227, in forwarded_middleware
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/request_context.py", line 28, in request_context_middleware
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/ban.py", line 80, in ban_middleware
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/auth.py", line 234, in auth_middleware
    return await handler(request)
  File "/usr/src/homeassistant/homeassistant/components/http/view.py", line 146, in handle
    result = await result
  File "/usr/src/homeassistant/homeassistant/components/camera/__init__.py", line 724, in get
    return await self.handle(request, camera)
  File "/usr/src/homeassistant/homeassistant/components/camera/__init__.py", line 742, in handle
    image = await _async_get_image(
  File "/usr/src/homeassistant/homeassistant/components/camera/__init__.py", line 170, in _async_get_image
    if image_bytes := await camera.async_camera_image(
  File "/config/custom_components/imou_life/camera.py", line 98, in async_camera_image
    return await self.sensor_instance.async_get_image()
  File "/usr/local/lib/python3.10/site-packages/imouapi/device_entity.py", line 562, in async_get_image
    data = await self.api_client.async_api_setDeviceSnapEnhanced(self._device_id)
  File "/usr/local/lib/python3.10/site-packages/imouapi/api.py", line 540, in async_api_setDeviceSnapEnhanced
    return await self._async_call_api(api, payload)
  File "/usr/local/lib/python3.10/site-packages/imouapi/api.py", line 216, in _async_call_api
    raise APIError(error_message)
imouapi.exceptions.APIError: DV1007: Device offline

Can you please add the support for this Device ?

Thank you for your support and best regards

Malformed or unexpected API response when adding light bulb

Version of the custom_component

1.0.12

Configuration

Configured using HACS

Describe the bug

I've installed the imou integration using HACS and when I try to add a device (an imou bulb), after entering the appId and the appSecret, if I check "discover registered devices" when I click send button I get the error "Malformed or unexpected API response". If I don't check the "discover registered devices" I go to the next screen where I set the device id and a name and when clicking send I get the same error "Malformed or unexpected API response".

A clear and concise description of what the bug is.

Debug log

Following is the error log I found (I substitute the real device id by XXX)


InvalidResponse: missing parameter or error parsing in {'expandChanNum': '', 'productId': '5w244i7j0d2l6h37', 'trackFollowStatus': '', 'httpPort': '80', 'privatePort': '', 'rtspPort': '554', 'deviceId': 'XXX', 'version': 'V1.000.0000002.0.R', 'aplist': [], 'accessType': 'PaaS', 'p2pPort': '554', 'port': '37777', 'encryptMode': 0, 'tlsPrivatePort': '37778', 'name': 'Luz escalera abajo', 'deviceModel': 'CL1B-5-E27', 'ability': '', 'brand': 'easy4Ip', 'playToken': 'svaDSjtNAJnO+P6d4vLGhwr07nvJOzQtTqs7JELzSw6wEOFKm+uTbci0eO8dBLwfM47gV5pumwf+id4irBcBLvq4HOZt1BxLrQ3BpGbZ0Vfpo7UVxjMfYU4Oene/7dVbzACMSZvX8naOdWe3RybYLbq8iNuGtWNI7Q/KZXj8HrOAMCya8V9Af8KZ5yJkEpCB', 'shareStatus': 'owner', 'status': 'online'} Traceback (most recent call last): File "/usr/local/lib/python3.10/site-packages/imouapi/device.py", line 189, in async_initialize self._catalog = device_data["catalog"] KeyError: 'catalog' The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/config/custom_components/imou_life/config_flow.py", line 130, in async_step_discover await self._discover_service.async_discover_devices() File "/usr/local/lib/python3.10/site-packages/imouapi/device.py", line 633, in async_discover_devices await device.async_initialize() File "/usr/local/lib/python3.10/site-packages/imouapi/device.py", line 352, in async_initialize raise InvalidResponse(f" missing parameter or error parsing in {device_data}") from exception imouapi.exceptions.InvalidResponse: missing parameter or error parsing in {'expandChanNum': '', 'productId': '5w244i7j0d2l6h37', 'trackFollowStatus': '', 'httpPort': '80', 'privatePort': '', 'rtspPort': '554', 'deviceId': 'AMWTLBC23981522', 'version': 'V1.000.0000002.0.R', 'aplist': [], 'accessType': 'PaaS', 'p2pPort': '554', 'port': '37777', 'encryptMode': 0, 'tlsPrivatePort': '37778', 'name': 'Luz escalera abajo', 'deviceModel': 'CL1B-5-E27', 'ability': '', 'brand': 'easy4Ip', 'playToken': 'svaDSjtNAJnO+P6d4vLGhwr07nvJOzQtTqs7JELzSw6wEOFKm+uTbci0eO8dBLwfM47gV5pumwf+id4irBcBLvq4HOZt1BxLrQ3BpGbZ0Vfpo7UVxjMfYU4Oene/7dVbzACMSZvX8naOdWe3RybYLbq8iNuGtWNI7Q/KZXj8HrOAMCya8V9Af8KZ5yJkEpCB', 'shareStatus': 'owner', 'status': 'online'}

Errors on a VERSA cam (IPC-C22FP-C) of two installed

Version of the custom_component

HACS imou 1.0.12

Configuration

# Loads default set of integrations. Do not remove.
default_config:

# Load frontend themes from the themes folder
frontend:
  themes: !include_dir_merge_named themes

# Text to speech
tts:
  - platform: google_translate

automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml

# Logger
logger:
  default: critical
  logs:
    custom_components.imou_life: debug
    imouapi: debug
    

Describe the bug

Hi All,
first of all, I'm sorry for my english! :)
I have 2 VERSA cam installed in my home.
I tried to integrate them into HA: for one of them (called "Soggiorno") all was ok.
For the other one (called "Camera Piccola") I have many issues:

  • Aspect ratio is wrong (as you can see in the first image below)
  • When I open the "stream", it is freezed with the "loading" circle in the middle, and a quick and flashing error message on the top (you can see in the second image, I was able to catch it)

I enabled the SD stream for "Camera Piccola" cam and the "playback" is ok, but the aspect ratio is still wrong.

In the IMOU app I have no problem: playback is ok and aspect ratio is the same of "Soggiorno" cam.

Sometimes I have a gray image in the HA dashboard for "Camera Piccola" preview (both HD and SD, but not in the same time - IMAGE 3 below)

Below you can find the logs of HA after a restart and some tests on camera.

Please, help me in order to solve these issues.

Thanks

IMAGE 1
image

IMAGE 2
image

IMAGE 3
image

Debug log


[home-assistant.log](https://github.com/user2684/imou_life/files/10771889/home-assistant.log)


Download Diagnostics for discovered devices

Download diagnostics is possible only for individual devices.
A possible approach is registering a virtual discovery service device through which downloading diagnostics

Motion Sensor Alarm status Unknown

Hi there
With the recent update of the home assistant, the status of the motion alarm is unknown. I've tried restarting the home assistant but the status is still same.

I am using version 1.0.13
My device is

IPC-F42
by Imou
Firmware: 2.800.0000000.13.R.221108

Thanks

Imou Cloud Message Push Service not triggering the callback url

I have followed the Option 3 described here in order to enable the HASS to receive callbacks from Imou Cloud for my Bullet 2C cameras motion alarm, but the callback url configured on the service was never triggered by them.

I'm using the https://webhookrelay.com/ service, but tried to debug with https://requestbin.com/ also. Both services didn't receive any request from Imou cloud. Just to be clear, I received the push notifications on my iOS app as expected, just the Imou cloud isn't working.

Here how was configured on Imou Cloud:

image

I tried these and nothing worked for now:

  • Generate a different callback URL on webhook relay service;
  • Used a callback url ending with "/", with path, with parameter;
  • Disable / save / wait 1 hour / enable / save, following the tips from #14;
  • Configured the callback url directly though API;
  • Open a ticket on Imou cloud service, but they answer with a generic response;

Has anyone had the same problem? Any workaround to "force" Imou cloud to trigger the push notifications to callback url?
Thanks

Motion sensor & doorbell button sensor support for Imou doorbells (DB11/DB60/DB61)

I am requesting support for the Imou/Dahua doorbell products (DB11/DB60/DB61) to provide motion detection and doorbell button binary sensors. The recent binary sensor enhancement for cameras is not working for doorbells. I think this is because it uses a different event classification mobileDetect whereas cameras are using videoMotion events. Ideally I want to know when someone actually presses the doorbell button, probably more important than the motion detection event. This should be possible through the callBellEvent

Example JSON webhook response for mobileDetect event

  json:
    deviceType: DB
    msgType: mobileDetect
    cname: DB11
    labelType: motionAlarm
    remark: ''
    zerotime: 1669025671
    type: 1030

Example JSON webhook response for callBellEvent

  json:
    deviceType: DB
    msgType: callBellEvent
    cname: DB11
    labelType: callAlarm
    remark: ' '
    zerotime: 1669025675
    type: 1028

Extract from log file

- Device ID: xxxx
Name: Doorbell
Catalog: Doorbell
Model: DB11
Firmware: Eng_N_V1.001.176S000.1.R.20220719
Online: yes
Capabilities:
- Support access to wireless local area network (WLAN)
- Device end loopback RTSP requires authentication (Auth)
- Support Dahua P2P Service (DHP2P)
- Support Huashi WeChat Stream Encryption (HSEncrypt)
- Support for cloud storage of China Vision WeChat platform (CloudStorage)
- Support device local storage, such as SD card or hard disk (LocalStorage)
- The device supports playback based on the file name (PlaybackByFilename)
- Support streaming media forwarding capability (MT)
- The device supports CustomKey (CustomKey) (CK)
- The device has remote debugging capabilities and supports log extraction (RemoteDebug) (RD)
- Support RD capability, support data burying point control, support debugging log upload (RDV2)
- Cloud Upgrade (XUpgrade)
- Device supports time synchronization (TimeSync)
- Support user name password information verification and password modification (ModifyPassword)
- Support device local storage enable switch (LocalStorageEnable)
- Real-time streaming supports private protocol streaming, supports dynamic port modification (RTSV2)
- The playback stream supports private protocol streaming and supports dynamic port modification (PBSV2)
- Voice intercom streaming supports private protocol streaming, supports dynamic port modification (TSV2)
- Support 0x95 extension header encryption (ESV1)
- The device supports daily summer time (DaySummerTime)
- The device supports weekly daylight saving time (WeekSummerTime)
- Support time format setting (TimeFormat)
- Doorbell volume setting (RingAlarmSound)
- Device Reset (DevReset)
- The device supports restarting (Reboot)
- The device supports No encrypt capture (NEC)
- CCD
- Support remote linkage (RemoteControl)
- Support Panorama (Panorama)
- Support screen flip (FrameReverse)
- AECV3
- motion-detect-window supports motion detection window settings (MDW)
- motion-detect-sensitive supports motion detection sensitivity setting (MDS)
- Mobile Detection (Merged with PIR) (MobileDetect)
- Support voice intercom (AudioTalk)
- Push notifications (pushNotifications)
Switches:
- Local storage (localStorageEnable): None {}
- Mobile detection (mobileDetect): None {}
- Push notifications (pushNotifications): None {}
Sensors:
- Storage used (storageUsed): None {}
- Callback url (callbackUrl): None {}
Binary Sensors:
- Online (online): None {}
Select:
Buttons:
- Restart device (restartDevice) {}
- Refresh all data (refreshData) {}
- Refresh alarm (refreshAlarm) {}
2022-11-21 09:43:08.702 DEBUG (MainThread) [custom_components.imou_life] Initialized coordinator. Scan internal 900 seconds
2022-11-21 09:43:08.702 DEBUG (MainThread) [imouapi] [Doorbell] update requested

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.