Améliorations du plugin Gardena : comment soumettre du code modifié?

hello @Claude69

avec un widget.
J’ai modifié le widget de l’autre plugin qui n’est plus supporté pour l’adapter a la commande info texte « positions ».
je dois faire un peu de nettoyage et puis je le publierai

Salut,

Dans la prochaine beta, j’ai fixé le problème de conversion du timestamp en heure (donc il ne faut plus diviser la valeur par 1000 car le plugin le fait déjà)
J’ai aussi ajouté la gestion des phares (on, off, soir, soir & nuit).

Je voudrais aussi ajouter la remonté des infos en temps réels car apparemment à présent cela serait possible; il n’y aurait donc plus de problème avec la limite des requêtes pour avoir une mise à jour des infos.

pour cela j’aurais besoin d’un accès à un compte avec un robot car je n’ai pas de husqvarna.
Aucune action ne sera faite, uniquement tester la remonter d’état; est-ce que l’un de vous serait prêt à me donner un accès temporaire? si oui, suite en privé?

1 « J'aime »

voici le code du widget qui affiche l’historique des positions sur une carte (à appliquer sur la commande info ‹ positions ›).
pour la carte en fond d’image, prendre un screenshot de Google Maps de la zone ciblée, identifier les coordonnées géographiques du coin inférieur gauche et du coin supérieur droit, et ensuite placer l’image dans un répertoire autorisé par les règles de sécurité du serveur web de Jeedom.
si nécessaire, créer un nouveau répertoire en y plaçant un fichier .htaccess spécifique
ensuite rentrer les données correspondantes dans le plugin. il serait possible de les passer en paramètres du widget mais c’est pour une version ultérieure…


<div id="mower_map#id#" class="cmd cmd-widget #history# tooltips" data-type="info" data-subtype="string" data-template="default" data-cmd_id="#id#"  data-cmd_uid="#uid#" data-version="#version#" data-eqLogic_id="#eqLogic_id#">
    <canvas class="myCanvas#id#"  style="no-repeat center center;border:3px solid #303030;">
    </canvas>
  <script>
    
    var img_wd=250;						 // width of widget map in px
    var img_he=250;						 // height  of widget map in px
    
    var backgroundPic='sharedPublic/husqvarna/maison.png';     // path and file of map to be dispalyed  in the widget. !! must  be in a folder allowed by WEB server policy rules  
    
    var latMin= xx.xxxxx;    			  //Latitude of left bottom corner of map
    var longMin= yy.yyyy;		  		  //Longitude of left bottom corner of map
    var latMax= zz.zzzz;				  //Latitude of right top corner of map
    var longMax= uu.uuuu;                         //Longitude of right top corner of map
    
    var historyDepth = 50;				  // historyDepth defines the max number of previous positions to be displayed.  Husqvarna provides up to 50 previous positions 
    var alphaStep = 1.0 / historyDepth;   // alphaStep defines how color will evolve from oldest position to newest position. 
    									  // if alphaStep = 1.0						 no color variation, remains full red. 
    									  // if alphaStep = 1.0 / historyDepth		 color varies from full blue to full red. 
    
    
    jeedom.cmd.update['#id#'] = function(_options) { 
	  $('.cmd[data-cmd_id=#id#]').attr('title','Date de valeur : '+_options.valueDate+'<br/>Date de collecte : '+_options.collectDate);

      
      var canvas = document.querySelector('.myCanvas#id#');
      var ctx = canvas.getContext('2d');
      ctx.canvas.width = img_wd;
      ctx.canvas.height= img_he;
      var backgroundImage = new Image(); 
      backgroundImage.src = backgroundPic;
      backgroundImage.onload = function() {
      	ctx.drawImage(backgroundImage, 0, 0, img_wd, img_he);
		list_of_points =  _options.display_value.split('/');    
      	var historyLength = list_of_points.length;
      	var historyThreshold = Math.min(historyLength,historyDepth);
//      	console.log('historyLength : ' + historyLength);
//      	console.log('historyDepth  : ' + historyDepth);
//      	console.log('historyThres  : ' + historyThreshold);
//      	console.log('alphaStep     : ' + alphaStep);
        
      	var index;
      	for (index=0; index<historyThreshold; index++) {
          point = list_of_points[index].split(',');
          relLat =  img_he * (1 - (point[0] - latMin) / (latMax - latMin )) ;
          relLong = img_wd * (0 + (point[1] - longMin) / (longMax - longMin)) ; 
        
          var alpha = Math.min(1, Math.max(0,(Math.round( 100 * (1.0-(index * alphaStep)))/100.0)));
          var color = 'rgb(' + Math.round(255 * alpha) + ',0,' + Math.round(255 * (1-alpha)) +')';
//          console.log(index + ', alpha : ' + alpha + ', color : ' + color);
          ctx.lineWidth = 2;
          ctx.setLineDash([5,2]);
          ctx.strokeStyle = color ;           
          ctx.globalAlpha = 1;    

          if (index==0) {
            ctx.beginPath();
            ctx.moveTo(relLong,relLat);
          }
          else {
            ctx.lineTo(relLong,relLat);
            ctx.stroke();
            if (index < (historyThreshold - 1)) 
            {
            	ctx.beginPath();
            	ctx.moveTo(relLong,relLat);
            }
          }
      	}

       //draws circle around current position      
       point = list_of_points[0].split(',');
       relLat =  img_he * (1 - (point[0] - latMin) / (latMax - latMin )) ;
       relLong = img_wd * (0 + (point[1] - longMin) / (longMax - longMin)) ;
       ctx.beginPath();
       ctx.setLineDash([]);
       ctx.strokeStyle = 'Yellow';
       ctx.globalAlpha = 1.0;
       ctx.lineWidth = 2;
       ctx.arc(relLong, relLat, 8, 0, 2 * Math.PI);
       ctx.stroke();
      
     }
    }
    
	jeedom.cmd.update['#id#']({display_value:'#state#',valueDate:'#valueDate#',collectDate:'#collectDate#',alertLevel:'#alertLevel#'});
  </script>
</div>
2 « J'aime »

Hello @Mips
Pas de problème, pour un accès. Je peux te créer ça demain, et je te passe les infos en mp.
Confirme moi ton besoin.
Un accès à Jeedom ou à husqvarna ?

Un accès à husqvarna, je suis occupé à coder le retour d’état en temps réel du robot (pour le moment c’est toutes les x minutes avec un max par jour) et je voudrais donc pouvoir tester directement depuis mon jeedom de dev pour le debug

Ok pas de soucis. je te passe les infos en mp. (mail, mdp et application key ?)

Pour info, ma tondeuse à bien démarrée à 18:00 aujourd’hui.
la date du prochain départ est à l’ouest
Capture d’écran 2022-04-20 à 18.15.16
Edit : Je t’ai envoyé les infos en mp. dis moi si c’est OK

Est-ce que cela te convient si j’inclus ce widget dans le plugin ainsi les autres utilisateurs pourront plus facilement en bénéficier?
Le widget ne sera pas actif par défaut puisqu’il y a un peu de config à faire.

Dans la config de la commande il faudra juste choisir le widget « gardena/positions », compléter les paramètres latitude et longitude (qui ne sont pas optionnels pour le coup, je ne vois pas trop comment calculer cela automatiquement) et charger une image dans le dossier prévu (plugins/gardena/data/maison.png)

Bonjour
Oui, ça serait super. J’avais justement demandé à @t0urista comment il avait fait.
J’allais me pencher dessus un de ces jour.
Si c’est dans le plugin, c’en est que mieux.

Sinon pour info, pas de problème avec le plugin.

J’ai vérifié, la tondeuse est bien en Time zone France. Du coup j’ai appliqué :

#value# - (3600 * (date('I')+1))

Comme cela je ne m’occupe pas du changement d’heure.

pour moi c’est parfait si le widget est intégré dans le plugin, c’est encore plus facile

j’avais modifie le widget pour utiliser des paramètres, je publie ici

<div id="mower_map#id#" class="cmd cmd-widget #history# tooltips" data-type="info" data-subtype="string" data-template="default" data-cmd_id="#id#"  data-cmd_uid="#uid#" data-version="#version#" data-eqLogic_id="#eqLogic_id#">
    <canvas class="myCanvas#id#"  style="no-repeat center center;border:3px solid #303030;">
    </canvas>
    
  <template>
    <div>imgWidth : background image width in pixel (default 250)</div>  
    <div>imgHeight : background image height in pixel (default 250)</div>    
    <div>imgFile : background image path and file. must be allowed by jeedom web server security policies !!! </div>    
    <div>latMin : Latitude of left bottom corner of map</div>    
    <div>longMin : Longitude of left bottom corner of map</div> 
    <div>latMax : Latitude of right top corner of map</div>
    <div>longMax : Longitude of right top corner of map</div>
    <div>historyDepth : max number of previous positions to display [0..50] (default 50)</div>
  </template>
  
  
  <script>
    var img_wd = isNaN('#imgWidth#') ? 250 : parseInt('#imgWidth#');
	var img_he = isNaN('#imgHeight#') ? 250 : parseInt('#imgHeight#'); 
    
    var imgFile = (('#imgFile#').charAt(0) != '#'  && '#imgFile#' != "" ) ? '#imgFile#' : 'sharedPublic/husqvarna/maison.png';    

    var latMin= isNaN('#latMin#') ? 0.0 : parseFloat("#latMin#");    			
    var longMin= isNaN('#longMin#') ? 0.0 : parseFloat("#longMin#"); 		  		
    var latMax= isNaN('#latMax#') ? 0.0 : parseFloat("#latMax#");				  
    var longMax= isNaN('#longMax#') ? 0.0 : parseFloat("#longMax#");  
    
    var historyDepth = isNaN('#historyDepth#') ? 50 : parseInt("#historyDepth#");  
      
    var alphaStep = 1.0 / historyDepth;   // alphaStep defines how color will evolve from oldest position to newest position. 
    									  // if alphaStep = 1.0						 no color variation, remains full red. 
    									  // if alphaStep = 1.0 / historyDepth		 color varies from full blue to full red. 
    
    
    jeedom.cmd.update['#id#'] = function(_options) { 
	  $('.cmd[data-cmd_id=#id#]').attr('title','Date de valeur : '+_options.valueDate+'<br/>Date de collecte : '+_options.collectDate);

      
      var canvas = document.querySelector('.myCanvas#id#');
      var ctx = canvas.getContext('2d');
      ctx.canvas.width = img_wd;
      ctx.canvas.height= img_he;
      var backgroundImage = new Image(); 
      backgroundImage.src = imgFile;
      backgroundImage.onload = function() {
      	ctx.drawImage(backgroundImage, 0, 0, img_wd, img_he);
		list_of_points =  _options.display_value.split('/');    
      	var historyLength = list_of_points.length;
      	var historyThreshold = Math.min(historyLength,historyDepth);
//      	console.log('historyLength : ' + historyLength);
//      	console.log('historyDepth  : ' + historyDepth);
//      	console.log('historyThres  : ' + historyThreshold);
//      	console.log('alphaStep     : ' + alphaStep);
        
      	var index;
      	for (index=0; index<historyThreshold; index++) {
          point = list_of_points[index].split(',');
          relLat =  img_he * (1 - (point[0] - latMin) / (latMax - latMin )) ;
          relLong = img_wd * (0 + (point[1] - longMin) / (longMax - longMin)) ; 
        
          var alpha = Math.min(1, Math.max(0,(Math.round( 100 * (1.0-(index * alphaStep)))/100.0)));
          var color = 'rgb(' + Math.round(255 * alpha) + ',0,' + Math.round(255 * (1-alpha)) +')';
//          console.log(index + ', alpha : ' + alpha + ', color : ' + color);
          ctx.lineWidth = 2;
          ctx.setLineDash([5,2]);
          ctx.strokeStyle = color ;           
          ctx.globalAlpha = 1;    

          if (index==0) {
            ctx.beginPath();
            ctx.moveTo(relLong,relLat);
          }
          else {
            ctx.lineTo(relLong,relLat);
            ctx.stroke();
            if (index < (historyThreshold - 1)) 
            {
            	ctx.beginPath();
            	ctx.moveTo(relLong,relLat);
            }
          }
      	}

       //draws circle around current position      
       point = list_of_points[0].split(',');
       relLat =  img_he * (1 - (point[0] - latMin) / (latMax - latMin )) ;
       relLong = img_wd * (0 + (point[1] - longMin) / (longMax - longMin)) ;
       ctx.beginPath();
       ctx.setLineDash([]);
       ctx.strokeStyle = 'Yellow';
       ctx.globalAlpha = 1.0;
       ctx.lineWidth = 2;
       ctx.arc(relLong, relLat, 8, 0, 2 * Math.PI);
       ctx.stroke();
      
     }
    }
    
	jeedom.cmd.update['#id#']({display_value:'#state#',valueDate:'#valueDate#',collectDate:'#collectDate#',alertLevel:'#alertLevel#'});
  </script>
</div>

Merci, c’est intégré en beta.
Je devrai encore mettre la doc à jour pour expliquer comment l’utiliser mais tu as déjà bien détaillé ci-dessus

1 « J'aime »

Je n’ai plus de retour de problème sur cette beta, je vais passer en stable ajd, cela sera dispo demain sur le market.

1 « J'aime »

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.