Aller au contenu

Piloter L'enregistrement Des Caméras Avec Synology Surveillance Station


Lazer

Messages recommandés

je veux bien regarder à  cela, mais j'ai observé que tu as programmé cela d'une manière que je ne maîtrise pas (encore) : une partie du code serait dans une table ?

 

Je reverrais la partie authentification du main loop (dans un premier temps), mais alors en la réécrivant d'une façon que je maîtrise. ok ?

Lien vers le commentaire
Partager sur d’autres sites

si tu réécris la main loop de façon classique, elle va planter comme toutes les main loop :(

 

La méthode employée est la seule que j'ai trouvé qui ne fasse pas crasher la main loop tôt ou tard.

Je n'ai rien inventé, je me suis inspiré d'un module de Krikroff.

 

Les variables et la fonction appelée sont toutes encapsulées dans un objet/classe (je ne connais pas le nom de cette structure en LUA) ce qui évite de la redéclarer à  chaque appel de la main loop, donc limite l'usage de la RAM qui fait planter toutes les main loop.

Lien vers le commentaire
Partager sur d’autres sites

ok, merci.

En effet je n'ai pas pu m'empêcher de déjà  commencer, en le réécrivant de manière classique. Et le 1° 1/4 d'heure, pas d'erreur malgré un refresh toutes les 60s  :60:

Mais maintenant il est planté.

J'ai une autre idée : écrire le main loop dans un bouton, et dans le main loop faire appel au bouton ?

Lien vers le commentaire
Partager sur d’autres sites

oui oui pourquoi pas, mais j'avais tenté de maintenir un virtual device élégant, sans bouton inutile, en laissant la main loop faire son job.

Si tu refais tout àzero, je te sens parti pour faire un nouveau tuto comme tu sais si bien le faire :D

Lien vers le commentaire
Partager sur d’autres sites

Non non, surtout pas de nouveau tuto.

effectivement ta solution à  beaucoup d'avantages :

  1. c'est plus élégant, pas de bouton inutile
  2. si on appuye sur le debug de la mainloop, puis start, on voit tout le debug depuis la dernière sauvegarde du VD, ce qui n'est pas le cas avec un bouton.

Donc je vais essayer de le faire fonctionner sans erreur avec un bouton (=développement classique) et ensuite on le traduirait vers ta solution.

 

Mais je ne garanti rien, je ne suis pas un développeur

Lien vers le commentaire
Partager sur d’autres sites

Je pense que tu pourrais tout aussi bien y arriver en conservant la structure actuelle.

En fin de compte, le code est le même, c'est juste qu'il est encapsulé dans une fonction, elle même dans une classe.

Comme j'ai tout bien tabulé, si tu utilises un  bon éditeur comme Notepad++, tu verras facilement les zones utiles.

(euh je crois que tu es sur Mac, mais tu dois avoir un éditeur équivalent).

Lien vers le commentaire
Partager sur d’autres sites

Eh Jojo, réfléchit un peu, tu es vraiment stupide quand tu veux !

 

Pourquoi se casse-t-on la tête pour le mainloop ? Il n'a pas de problème. Car en fait que voudrait-on faire pour le MAINLOOP ?

Si erreur de SID, on recommence, étant donné qu'on est incapable de prédire quand arrivera l'erreur. Mais c'est ce qu'il fait déjà  !

Donc on fait un refresh toutes les 15s, et le tour est joué, d'autant plus qu'il ne fait "que" un refresh de l'icone.

 

Par contre là  où est le problème, c'est dans les boutons. Si on automatise l'appuis sur le bouton et qu'il y a une erreur, il faut réappuyer dessus.

 

Il y a 2 solutions pour cela :

  1. réécrire le code des boutons
  2. stocker dans une variable le status d'erreur et le traiter par GEA, si l'erreur est problématique.

Pourquoi se casser la tête ?

Lien vers le commentaire
Partager sur d’autres sites

Le module doit être autonome, et ne doit pas dépendre de GEA pour la gestion des erreurs.

Que GEA fasse appel au module est une chose normale, mais pas l'inverse.

 

Donc il reste : réécrite le code des boutons ! En fait, ce sont les même modifs que pour la main loop. Donc il suffit de commencer le travail sur la main loop, puis recopier ensuite.

Lien vers le commentaire
Partager sur d’autres sites

Oui, d'accord avec toi our l'aspect autonome.

 

Dans les boutons ce sera la même chose que dans le mainloop, sauf qu'il n'y a pas cette problématique d'encapsulation. Et j'aurais bien utilisé des fonctions pour générer un SID, et je ne vois pas comment avec cette encapsulation => si on règle le problème des boutons, ok

Lien vers le commentaire
Partager sur d’autres sites

OK donc tu n'as pas imaginé la même solution que moi.

Je vais essayer de donner l’algorithme tel que je le vois :

- Lors de l'initialisation de l'objet CheckRecording, on définit la variable SID = nil (même mieux : cette variable SID ne devrait pas être local, mais être dans un label afin que les autres boutons puissent s'en servir)

- dans la fonction main, si SID == nil, alors on appelle une fonction connect() qui établie une nouvelle connexion

- sinon on passe direct à  la suite

- la suite est une boucle dans laquelle on doit passer 2 fois maxi

- dans cette boucle, on liste les caméras, met à  jour les icones et tout le tralala

- si le liste caméra est en échec, alors c'est qu'il faut définir un nouvel SID.... donc on appelle la fonction connect() vue précédemment.... puis grâce à  la boucle, on repasse une 2nde fois ce qui permet de lister à  nouveau les caméras et tout le tralala....

 

Bon j'ai presque fait tout le boulot là .... le reste c'est pour les codeurs fous :P

 

 

Quand même, c'est toujours pareil, on ne peut jamais compter sur Sid, il n'est vraiment pas fiable :

tYIo3XL.png

Lien vers le commentaire
Partager sur d’autres sites

là  tu as fais un véritable travail de patron.  :13:

Merci pour l'analyse, je me dois de l'implémenter maintenant.

 

Si on veut garder un aspect esthétique au VD, il ne faudrait pas mettre le SID dans un label, mais dans une variable globale, mais là  aussi j'hésite car alors le VD n'est plus autonome, il faut penser à  la créer, et j'aime autant éviter si possible.

Lien vers le commentaire
Partager sur d’autres sites

Oui je pense comme toi.... la variable globale "ne se voit pas", mais dans ce cas faut implémenter une fonction pour sa création via l'API.... On trouve tout ça sur le forum, mais ça surcharge encore un peu plus le code.

Lien vers le commentaire
Partager sur d’autres sites

@Lazer,

Encore une idée d'optimisation du VD.

J'ai 3 caméras sur mon Synology. Il y en a une qui est déconnectée (status Disconnected dans Surveillance Station).

Lorsque j'ai appuyé sur le bouton enable, il en a bien activé 2 et évidemment, il n'a pas réussi àactiver la 3°.

Mais dans le VD, il affiche toujours le Status activating et l'icône désactivée.

Serait-il possible de récupérer depuis Synology ce status particulier et de mettre une icône "Error" ? par exemple.

Lien vers le commentaire
Partager sur d’autres sites

Ca devient compliqué àgérer ce genre de cas particulier....

Est-ce que ça ne serait pas plus simple pour toi de dupliquer les boutons et d'utiliser la variable locale cameras afin de limiter chaque bouton àune seule caméra ?

Voir carrément de dupliquer le VD complet, ce qui te permettrait d'avoir le label de chaque VD qui correspond précisément au statut de chaque caméras.

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

OK donc tu n'as pas imaginé la même solution que moi.

Je vais essayer de donner l’algorithme tel que je le vois :

- Lors de l'initialisation de l'objet CheckRecording, on définit la variable SID = nil (même mieux : cette variable SID ne devrait pas être local, mais être dans un label afin que les autres boutons puissent s'en servir)

 

@Lazer, 

j'avance DOUCEMENT, j'ai déjà  fait le point 1 avec une variable globale qui est créée automatiquement si nécessaire

Lien vers le commentaire
Partager sur d’autres sites

j'ai terminé (selon moi) de rivoir le code de la main loop, il (tourne avec le même SID sans erreur depuis 45min  à  une fréquence de 10s.

Je te l'envoie en MP pour validation, avant de le reproduire pour les boutons ?

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Je n'ai pas encore installé la 7,1 mais j'ai un message d'erreur actuellement ... :(

 


[DEBUG] 09:43:00: Synology API version OK
[DEBUG] 09:43:05: Error : API Authentication failure, Invalid password., {"error":{"code":400},"success":false}
 
Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...