REOLINK - Liste de commandes via API

Post bimensuel récapitulatif JUIN-JUILLET 2021

Ce post regroupe les modifs apportées dans le premier post entre juin et juillet 2021; Vous trouverez le détail de ces informations dans les parties documentations, URLs, ou commandes (applicables ou pas sur la rlc-520) du post 1

  • 26/07/2021 : Ajout URL NVR : Which Cameras can Work with Reolink NVR
  • 25/07/2021 : Ajout URL NVR : How Many HDDs Can I Connect with Reolink NVR System
  • 25/07/2021 : Ajout URLs Projets+Documentations techniques (exemples : reolinkapipy, Camera-proxy, neolink)
  • 24/07/2021 : Ajout URL Code pour générer un QRCode pour caméras WIFI Reolink : cas des SSID de longueur supérieure à 32 caractères + URL Generateur de QRCodes Online (gratuit)
  • 11/07/2021 : Ajout URL Comment fonctionnent les remontées PUSH
  • 27/06/2021 : Ajout de nouvelles commandes récentes non utilisables/applicables sur la RLC-520 (commandes spécifiques aux cameras, statiques ou motorisées, avec detection Personne/Véhicule)
  • 04/06/2021 : Ajout Documentation Reolink (CGI.pdf) -version 2021-
1 « J'aime »

Bonjour,
Désolée j’ai répondu trop rapidement c’était la fin de journée :slight_smile:
J’ai réussi! Ça fonctionne avec ma rlc-810a. J’ai une rlc-811a qui a un projecteur et une sirène et également un haut parleur pour avoir le son bidirectionnel. Tu pense que je peu récupérer les commande de ceux ci?

Bonjour @Neoback45,
tant mieux que cela fonctionne sur ta 810a. De ce que j’ai pu trouvé (non testé), on peut interagir avec :

  • le projecteur led : commandes GetWhiteLed/SetWhiteLed
  • la sirène :
    • commandes GetAudioAlarm/SetAudioAlarm pour les cameras sans Smart Detection (détection personne/véhicule)
    • commandes GetAudioAlarmV20/SetAudioAlarmV20 pour les cameras avec Smart Detection

NB : la sirène est dépendante de la détection de mouvement, elle ne peut pas être utilisé en solo.

Par contre, pour l’audio bidirectionnel, ayant une E1Zoom possédant cette fonctionnalité, je n’ai pas trouvé de commande à ce sujet.
Sur les firmwares récents des cameras avec smart detection, Il existe trois nouvelles commandes qui sembleraient être liés à l’audio (de part leur nom) :

  • GetAudioCfg/SetAudioCfg
  • AudioAlarmPlay

Je ne peux t’en dire plus à ce sujet, je n’ai aucune info sur ces commandes.

NB : Reolink ne nous facilite pas la tâche pour récupérer les informations sur les commandes. Depuis les derniers firmwares des cameras avec Smart Detection, les fichiers json d’interrogation ou de réponse sont cryptés dans l’interface web de ces cameras (celles avec lesquelles on peut communiquer via l’API).

A+

Bonjour mnpg,
Je n’avais pas vu ton message. Merci pour t’être pencher sur mon problème. je viens de tester ton script mais ca ne fonctionne pas.
pour les mouvements il n’y a rien qui bouge et des que j’utilise le zoom j’ai le message d’erreur suivant :

2021-08-04 20:16:19 script Erreur exécution de la commande [Bar][Reolink E1 Zoom][Zoom +] : Erreur sur /var/www/html/plugins/script/data/Reolink_API_PTZ.sh 192.168.1.26 PtzCtrl ZoomInc 2>&1 valeur retournée : 2. Détails : [ { « cmd » : « PtzCtrl », « code » : 1, « error » : { « detail » : « param error », « rspCode » : -4 } } ] /var/www/html/plugins/script/data/Reolink_API_PTZ.sh: line 50: syntax error near unexpected token fi' /var/www/html/plugins/script/data/Reolink_API_PTZ.sh: line 50: fi’
2021-08-04 20:16:19 camera Erreur exécution de la commande [Bar][Camera Bar Temporise][Zoom +] : Erreur sur /var/www/html/plugins/script/data/Reolink_API_PTZ.sh 192.168.1.26 PtzCtrl ZoomInc 2>&1 valeur retournée : 2. Détails : [ { « cmd » : « PtzCtrl », « code » : 1, « error » : { « detail » : « param error », « rspCode » : -4 } } ] /var/www/html/plugins/script/data/Reolink_API_PTZ.sh: line 50: syntax error near unexpected token fi' /var/www/html/plugins/script/data/Reolink_API_PTZ.sh: line 50: fi’

pour info, j’ai dupliqué la camera et le script pour travailler dessus sans altérer la version qui fonctionne avec le script original.

Entre temps j’avais solutionner mon problème en ajoutant la requête « stop » sur la ligne qui demande l’URL de stop

image
image

Merci pour le temps passé et ton aide sur les commandes API des réolink.
T.

bonjour @Theric,
oops! mea culpa! merci pour l’info. Il y a une erreur (« ; » mal placé) dans le script à la ligne :

if [ "${actionptz}" == 1 ] then;

la remplacer par :

if [ "${actionptz}" == 1 ]; then

Pour le pb du zoom sur ta E1Zoom,le résultat que tu as est normal. La commande PtzCtrl ZoomInc (mais aussi ZoomDec, FocusInc et FocusDec) ne fonctionne pas sur la E1-Zoom. Cette partie zoom (et focus) de la E1-Zoom passe par la commande StartZoomFocus.

EDIT :
je te fais suivre la partie du script à modifier pour l’utiliser :

REMPLACER

case $command in
        GetPtzPatrol)
                payload="[{\"cmd\":\""${command}"\",\"action\":0,\"param\":{\"channel\":0}}]";;
        SetPtzPatrol)
                payload="[{\"cmd\":\""${command}"\",\"action\":0,\"param\":{\"PtzPatrol\":"${parameter}"}}]";;
        PtzCtrl)
                case $parameter in
                        Left|Right|Up|Down|LeftUp|RightUp|LeftDown|RightDown|ZoomInc|ZoomDec|FocusInc|FocusDec)
                                payload="[{\"cmd\":\""${command}"\",\"action\":0,\"param\":{\"channel\":0,\"op\":\""${parameter}"\",\"speed\":${speed}}}]"
                                actionptz=1;;
                        Stop)
                                payload="[{\"cmd\":\""${command}"\",\"action\":0,\"param\":{\"channel\":0,\"op\":\""${parameter}"\"}}]";;
                        ZoomPos)
                                payload="[{\"cmd\":\""${command}"\",\"action\":0,\"param\":{\"ZoomFocus\":{\"channel\":0,\"op\":\""${parameter}"\",\"pos\":${speed}}}}]";;
                        ToPos)
                                payload="[{\"cmd\":\""${command}"\",\"action\":0,\"param\":{\"channel\":0,\"id\":${id},\"op\":\""${parameter}"\",\"speed\":${speed}}}]";;
                        StartPatrol|StopPatrol)
                                id=${speed}
                                payload="[{\"cmd\":\""${command}"\",\"action\":0,\"param\":{\"channel\":0,\"id\":${id},\"op\":\""${parameter}"\"}}]";;
                esac;;
esac

PAR :

case $command in
        GetPtzPatrol)
                payload="[{\"cmd\":\""${command}"\",\"action\":0,\"param\":{\"channel\":0}}]";;
        SetPtzPatrol)
                payload="[{\"cmd\":\""${command}"\",\"action\":0,\"param\":{\"PtzPatrol\":"${parameter}"}}]";;
        PtzCtrl)
                case $parameter in
                        Left|Right|Up|Down|LeftUp|RightUp|LeftDown|RightDown|ZoomInc|ZoomDec|FocusInc|FocusDec)
                                payload="[{\"cmd\":\""${command}"\",\"action\":0,\"param\":{\"channel\":0,\"op\":\""${parameter}"\",\"speed\":${speed}}}]"
                                actionptz=1;;
                        Stop)
                                payload="[{\"cmd\":\""${command}"\",\"action\":0,\"param\":{\"channel\":0,\"op\":\""${parameter}"\"}}]";;
                        ZoomPos)
                                payload="[{\"cmd\":\""${command}"\",\"action\":0,\"param\":{\"ZoomFocus\":{\"channel\":0,\"op\":\""${parameter}"\",\"pos\":${speed}}}}]";;
                        ToPos)
                                payload="[{\"cmd\":\""${command}"\",\"action\":0,\"param\":{\"channel\":0,\"id\":${id},\"op\":\""${parameter}"\",\"speed\":${speed}}}]";;
                        StartPatrol|StopPatrol)
                                id=${speed}
                                payload="[{\"cmd\":\""${command}"\",\"action\":0,\"param\":{\"channel\":0,\"id\":${id},\"op\":\""${parameter}"\"}}]";;
                esac;;
        StartZoomFocus)
                case $parameter in
                        ZoomPos|FocusPos)
                                payload="[{\"cmd\":\""${command}"\",\"action\":0,\"param\":{\"ZoomFocus\":{\"channel\":0,\"op\":\""${parameter}"\",\"pos\":${speed}}}}]";;
                esac;;
esac

Pour faire fonctionner ton zoom sur la E1Zoom, tape la commande :

/var/www/html/plugins/script/data/Reolink_API_PTZ.sh 192.168.1.26 StartZoomFocus ZoomPos <n°pos>
(remplace <n°pos> par une valeur entre 0 -loin- et 32 -près- cf image ci-dessus)

NB : Bien vérifier que l’autofocus est activé

pour tout ce qui est mouvement, bien ajouter la vitesse de déplacement dans la commande

  • exemple de commande pour les mouvements (hormis les presets) :

    mouvement vers la gauche, vitesse max (32):

    /var/www/html/plugins/script/data/Reolink_API_PTZ.sh 192.168.1.26 PtzCtrl Left 32


  • exemple de commande pour accéder à une position préenregistrée -preset- (commande ne fonctionnant que sur les cameras ayant la fonction preset dont la E1-Zoom):

    mouvement vers la position 1, vitesse max (32):

    /var/www/html/plugins/script/data/Reolink_API_PTZ.sh 192.168.1.26 PtzCtrl ToPos 32 1

Merci de ton retour. Je vais regarder les commandes :wink:

Félicitation pour cette réponse rapide. effectivement c’était seulement ce fâcheux point virgule qui empêchait le bon fonctionnement du script.
Maintenant avec ce point au bon endroit tous fonctionne a merveille . j’ai bien les mouvement de la caméra ainsi que le bon fonctionnement du zoom (sans aucun autre changement que ce point virgule).
merci beaucoup mnpg
T.

1 « J'aime »

Merci de ton retour. Tant mieux que tout fonctionne

Pour info : J’ai corrigé le script que je t’avais donné dans ma première réponse (déplacer le « ; » au bon endroit), au cas ou un autre possesseur de camera reolink le récuperait.

Tu pense que c’est possible de récupérer la détection de personne ou véhicule pour recevoir des alerte via jeedom? Apparement c’est possible avec home assistant

bonjour @Neoback45,
oui, le plugin reolink de HomeAssistant se base sur la commande GetAiState.

cela peut s’adapter sous jeedom

verifies si tu peux interroger l’URL ci-dessous directement via un navigateur web (NB: l’URL est en https):

https://#IP#/cgi-bin/api.cgi?cmd=GetAiState&rs=test&user=#username#&password=#password#
(remplace #IP#, #username# et #password# par tes propres valeurs)

ou, si cela ne marche pas, avec l’argument channel=0 :
https://#IP#/cgi-bin/api.cgi?cmd=GetAiState&channel=0&rs=test&user=#username#&password=#password#

si tu obtiens un fichier json de retour de ce style :

[{
cmd: "GetAiState",
code: 0,
value: {
  channel: 0,
  people_state: 0,
  vehicle_state: 1
  }
}]

tu pourras récupérer les infos, par le plugin script - commande de script, via des commandes de script de type Info/Binaire (HOWTO >> cf Post → partie « Récupération de la Détection de Mouvement »)

detection personne :

    commandes de script de type Info/Binaire
    Type script : JSON
    URL json : https://#IP#/cgi-bin/api.cgi?cmd=GetAiState&rs=test&user=#username#&password=#password#
    Requête : >value>people_state

détection véhicule :

    commandes de script de type Info/Binaire
    Type script : JSON
    URL json : https://#IP#/cgi-bin/api.cgi?cmd=GetAiState&rs=test&user=#username#&password=#password#
    Requête : >value>vehicle_state

avec les derniers firmware (vers 3.x.x.412) pour les cameras avec detection personne/vehicule, le fichier JSON de retour de la commande GetAiState a changé. il est plus de ce style :

[
   {
      "cmd" : "GetAiState",
      "code" : 0,
      "value" : {
         "channel" : 0,
         "face" : {
            "alarm_state" : 0,
            "support" : 0
         },
         "people" : {
            "alarm_state" : 0,
            "support" : 1
         },
         "vehicle" : {
            "alarm_state" : 0,
            "support" : 1
         }
      }
   }
]

Dans ce cas,il faut changer les requêtes utilisées pour les commandes de script jeedom que je t’ai donné précédemment pour celles-ci :

détection personne :

Requête : >value>people>alarm_state

détection véhicule :

Requête : >value>vehicle>alarm_state

Salut,
Oui ça me donne le fichier json « nouveau »
Intéressant ! Donc je doit pouvoir recevoir une alerte jeedom lorsque la caméra détecte une personne ou un véhicule ?

salut,

malheureusement non, il faut que tu interroges cette URL de la camera, sous la forme de script JSON, pour avoir l’info et cela toutes les minutes.

Pour info : La seule façon, à ma connaissance, qu’a la camera pour pousser l’information de détection, c’est par la fonctionnalité Push : push de l’information vers une URL Reolink (pushx.reolink.com) et relayer sous la forme de notifications via l’application Reolink installée sur ton smartphone

Bonjour à tous !

Déjà merci pour ce topic + qu’utile :slight_smile:
J’ai pu passer quelques commandes curl avec succès pour récupérer des états divers.
J’essaie maintenant de passer à des commandes de modifs pour rentrer dans le vif du sujet.

J’essaie actuellement de jouer sur la planification des alarmes mails pour activer H24 les notifs (quand je pars en vacances par exemple) ou au contraire uniquement la nuit (quand je suis à la maison).

Je vois grâce au GetEmailV20 qu’il faut modifier le schedule > table.
Par contre je ne suis pas sûr de saisir correctement les champs.
N.B : Configuration actuelle : Détection de personne de 8h00 à 20h00. Le reste désactivé.
J’ai un NVR RLN8-410 avec des caméras RLC-820A

            "schedule" : {
               "channel" : 1,
               "table" : {
                  "AI_PEOPLE" : "111111110000000000001111111111110000000000001111111111110000000000001111111111110000000000001111111111110000000000001111111111110000000000001111111111110000000000001111",
                  "AI_VEHICLE" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
                  "MD" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
                  "VL" : "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
               }
            },

AI_PEOPLE et AI_VEHICLE, je suppose que c’est pour la détection des personnes et véhicules. Là OK.
MD (pour motion detection ?). Je suppose que c’est pour la détection tout mouvement. Là OK également, ça colle avec ma configuration actuelle.
VL par contre je ne sais pas ce que c’est…

Second point, j’ai essayé via l’app windows de modifier le schedule d’une camera pour voir ce que ça donnait avec un GetEmailV20 mais je ne vois pas les changements dans le retour curl …

Merci par avance pour votre aide.

[EDIT] : Pour ce qui est du second point, je m’auto-réponds : je me suis fait avoir comme un bleu.
Les channels de caméra sont incrémentés à partir de 0 et non 1, donc la caméra 1 correspond au channel 0, caméra 2 au channel 1, etc…

Pour le premier point je ne vois toujours pas à quoi cela correspond :frowning:

Bonjour @khirin, MD est pour la 3eme option (motion) que tu trouves sur les schedules. Pour VL, Cela ne me dis rien, perso je me base sur les options que l’on a sur l’interface. Par contre je sais que pour les schedules, tu peux trouver « TIMER ».
Pour info, les champs AI_PEOPLE, AI_VEHICLE et MD sont etroitement lies, TIMER est independant des 3 autres
Exemple :

Si tu positionnes une planification en cochant Motion unquement, seul MD aura des 1 et 0 (champ de 128 caractères soit 7 jours * 24h), les AI_** seront a zero (chaine de 128 zeros).

Avec cette conf, si tu coches, par exemple Person, alors la chaine de caracteres de MD sera recopie dans le champ AI_PEOPLE.

Hello,

Merci pour ton retour !

En effet, la partie TIMER est dispo pour l’enregistrement pur et le ftp par exemple.
Je suis en train de me demander si VL ça ne serait pas pour le son (volume).
Via l’interface, on peut activer ou non le son mais pas de manière schedulé (avantage implicite de l’utilisation des APIs ? :smiley: )

J’ai réussi à contrôler le schedule de mes caméras suivant mes besoins et également récupéré les états (people detection et status de la caméra en soit) donc nickel :slight_smile: .

Je suis sous Home Assistant ( :smiling_imp: ) mais je vous fournis malgré tout le code que j’ai fait qui peut sûrement être compris et réadapté suivant les contraintes de jeedom en modulant un peu la syntaxe.
Très probablement optimisable (je suis un peu une bille pour le json, jinja and co…)

sensor:
# Schedule Mode (Global)
  - platform: template
    sensors:
      reolink_schedule_mode_global:
        value_template: >-
          {% if (states.sensor.reolink_schedule_mode_cam_1.state == "Home" and
                states.sensor.reolink_schedule_mode_cam_2.state == "Home" and
                states.sensor.reolink_schedule_mode_cam_3.state == "Home" and
                states.sensor.reolink_schedule_mode_cam_4.state == "Home") %}
            Home
          {% elif (states.sensor.reolink_schedule_mode_cam_1.state == "Out" and
                  states.sensor.reolink_schedule_mode_cam_2.state == "Out" and
                  states.sensor.reolink_schedule_mode_cam_3.state == "Out" and
                  states.sensor.reolink_schedule_mode_cam_4.state == "Out") %}
            Out
          {% elif (states.sensor.reolink_schedule_mode_cam_1.state == "Disable" and
                  states.sensor.reolink_schedule_mode_cam_2.state == "Disable" and
                  states.sensor.reolink_schedule_mode_cam_3.state == "Disable" and
                  states.sensor.reolink_schedule_mode_cam_4.state == "Disable") %}
            Disable
          {% else %}
            Unknown
          {% endif %}
          
# Schedule Mode (Camera 2 > Channel 1)
  - platform: rest
    name: reolink_schedule_mode_cam_2
    resource: http://IPNVR:80/api.cgi?cmd=GetEmailV20&channel=1&user=USER&password=PASS
    method: GET
    json_attributes_path: "$.[]value['Email'][schedule][table]"
    json_attributes:
      - AI_PEOPLE
      - AI_VEHICLE
      - MD
      - VL
    value_template: >-
      {% if value_json[0].value.Email.schedule.table.AI_PEOPLE == "111111110000000000001111111111110000000000001111111111110000000000001111111111110000000000001111111111110000000000001111111111110000000000001111111111110000000000001111" %}
        Home 
      {% elif value_json[0].value.Email.schedule.table.AI_PEOPLE == "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" %}
        Out
      {% elif value_json[0].value.Email.schedule.table.AI_PEOPLE == "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" %}
        Disable
      {% else %}
        Unknown
      {% endif %}
    scan_interval: 30

# People Detection (Camera 3 > Channel 2)
  - platform: rest
    name: reolink_people_cam_3
    resource: 'http://IPNVR:80/api.cgi?cmd=GetAIState&channel=2&user=USER&password=PASS
    method: GET
    json_attributes_path: "$.[]value['people']"
    json_attributes:
      - alarm_state
    value_template: "{{ value_json[0].value.people.alarm_state }}"
    scan_interval: 5

# Status (Camera 1 > Channel 0)
  - platform: rest
    name: reolink_status_cam_1
    resource: http://IPNVR:80/api.cgi?cmd=GetChannelstatus&channel=0&user=USER&password=PASS
    method: GET
    json_attributes_path: "$.[]value['status'][0]"
    json_attributes:
      - name
      - channel
      - online
    value_template: >-
      {% if value_json[0].value.status[0].online == 1 %}
        Online 
      {% else %}
        Offline
      {% endif %}
    scan_interval: 30

rest_command:
  reolink_cam_1_email_in:
    method: POST
    content_type: 'application/json'
    url: http://IPNVR:80/cgi-bin/api.cgi?user=USER&password=PASS
    payload: '
    [{
      "cmd": "SetEmailV20",
      "action": 0,
      "param":
      {
        "channel": 0,
        "Email":
        {
          "schedule":
          {
            "channel": 0,
            "table":
            {
              "AI_PEOPLE": "111111110000000000001111111111110000000000001111111111110000000000001111111111110000000000001111111111110000000000001111111111110000000000001111111111110000000000001111",
              "AI_VEHICLE": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
              "MD": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
              "VL": "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"             
            }
          }
        }
      }
    }]'
# FTP (Camera 3 > Channel 2)
  reolink_cam_3_ftp_out:
    method: POST
    content_type: 'application/json'
    url: http://IPNVR:80/cgi-bin/api.cgi?user=USER&password=PASS
    payload: '
    [{
      "cmd": "SetFtpV20",
      "action": 0,
      "param":
      {
        "channel": 0,
        "Ftp":
        {
          "schedule":
          {
            "channel": 2,
            "table":
            {
              "AI_PEOPLE": "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111",
              "AI_VEHICLE": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
              "MD": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
              "TIMING": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"             
            }
          }
        }
      }
    }]'

Pour info : Actuellement j’ai quelques news comme quoi Reolink est tres actif dans la mise en place de nouvelles fonctionnalites pour les cameras avec AI. Des améliorations sont en cours sur la detection AI et cote commandes, cela risque d’évoluer assez rapidement avec les nouveaux firmwares. Nb : Dans le dernier firmware en date, la detection des visages est intégrée mais non active (cf resultat de la commande GetAiState)

Plutot que de changer la planification pour gerer l’envoi ou pas de la detection de mouvement, tu as a ta disposition le champ enable, pour les commandes SetEmailV20, SetFtpV20, SetRecV20 voir SetAudioAlarmV20, qui te permet d’activer ou desactiver ces fonctionnalites SANS supprimer les informations qui auraient pu etre definies. C’est l’équivalent du mode scene que tu peux trouver sur l’application android (ou IOS).
Par contre, cela ne marchera pas pour la fonctionnalite Push (commande SetPushV20). Ca passe par une methode differente.

Merci @khirin pour ton code et tes retours d’informations