“Dernier dialogue avec Alexa” vide depuis fin juillet

Bonjour, tu penses que ce sera possible d’adapter ton plugin? :blush:

Merci Sebastien :+1:

Une petite question : sur quelle évènement tu le mets pour que ce soit exécuter a chaque changement ?
Merci d’avance.

J’ai apporté une petite modif, en créant une variable qui stock le timestamp, car si on demande 2 fois la même info, elle répond plus :grin:
et j’ai définit un deviceSerialNumber pour que seulement cet appareil réagit ( j’en ai 5 ).
le code modifié si cela paut aider :

$ch = curl_init();
curl_setopt_array($ch, [
	CURLOPT_URL => 'http://ip.de.jeedom:3456/history?maxRecordSize=1',
  	CURLOPT_RETURNTRANSFER => true,
  	CURLOPT_ENCODING => "",
  	CURLOPT_MAXREDIRS => 10,
  	CURLOPT_TIMEOUT => 10,
  	CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  	CURLOPT_CUSTOMREQUEST => 'GET',
  	CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
    ]);
$response = curl_exec($ch);
curl_close($ch);
$json = json_decode($response, true);
$creationTimestamp = 0;
$summary = '';
for ($i = 0; $i <= count($json) - 1; $i++) {
    if ($json[$i]['deviceSerialNumber'] == 'votre.device.serial.number') {
        $summary = $json[$i]['summary'];
        $creationTimestamp = $json[$i]['creationTimestamp'];
    	break;
    }
}
 $lastCreationTimestamp = $scenario->getData('lastCreationTimestamp');
if ($lastCreationTimestamp!=$creationTimestamp) {
  $lastCreationTimestamp = $scenario->setData('lastCreationTimestamp', $creationTimestamp);
  cmd::byString('#[Maison][Alexa][LastOrder]#')->event($summary);
}
1 « J'aime »

LOL je viens de faire la même modif.
Toi tu stock dans une variabel je vois … moi j’ai juste mis dans une commande d’un virtuel pour les voir plus facilement, mais c’est pareil.
Voici mon Scénario que j’ai appelé ‹ Alexa ›

$ch = curl_init();
curl_setopt_array($ch, [
	CURLOPT_URL => 'http://ip.de.jeedom:3456/history?maxRecordSize=20',
  	CURLOPT_RETURNTRANSFER => true,
  	CURLOPT_ENCODING => "",
  	CURLOPT_MAXREDIRS => 10,
  	CURLOPT_TIMEOUT => 10,
  	CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  	CURLOPT_CUSTOMREQUEST => 'GET',
  	CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
    ]);
$response = curl_exec($ch);
curl_close($ch);
$json = json_decode($response, true);
$newOrder='';
$newCreationTimestamp='';
for ($i = 0; $i <= 5; $i++) {
	$newOrder = $json[$i]['summary'];
  	$newCreationTimestamp = $json[$i]['creationTimestamp'];
  	if ($newOrder!='' && $newCreationTimestamp!='') {
    	break;
    }
}
$lastCreationTimestamp = cmd::byString('#[Maison][Alexa][creationTimestamp]#')->execCmd();
if ($newOrder!='' && $lastCreationTimestamp!=$newCreationTimestamp) {
  cmd::byString('#[Maison][Alexa][LastOrder]#')->event($newOrder);
  cmd::byString('#[Maison][Alexa][creationTimestamp]#')->event($newCreationTimestamp);  
}

J’utilise donc #[Maison][Alexa][LastOrder]# comme declancheur d’un scénario.

Et pour résoudre la detection du changement j’ai fait un autre scénario ‹ Scheduler 5s › qui va changer la valeur d’une variable Trigger_5s toutes les 5 secondes.

while(1)
 {
 	sleep(5);
  	$myVal = $scenario->getData('Trigger_5s');
  	if ($myVal == 1) {
    	$scenario->setData('Trigger_5s', '0');
    } else {
      	$scenario->setData('Trigger_5s', '1');
    }
 }

J’utilise alors cette variable Trigger_5s pour déclencher mon scenario ‹ Alexa › toutes les 5 secondes.

C’est pas top mais ça marche.
PS: j’ai pas mis le deviceSerialNumber car je souhaite utiliser toutes mes Alexa :slight_smile:

Sébastien

Salut @sigalou ,

J’ai essayé avec 1 ou 10 ou 20 … le result est le même.
J’ai trouvé l’url depuis ton code du plugin.
Comment fais-tu pour générer ce serveur d’historique?
Si ce serveur récupère les infos à la volé/en temps réel alors tu pourrais directement mettre l’information dans ta commande ‹ Dernier dialogue avec Alexa › vrai?

Là avec la bidouille du script je suis obligé d’interroger l’url … j’aime pas …

Merci!

Sébastien

Merci je vais tester :+1:

Bonjour,

C Ok pour moi

Merci

Bonjour, je n’y connais rien dans les scripts, suite aux alternatives proposées, tu penses que ce sera possible d’adapter ton plugin ou il faut que j’abandonne cet espoir…?
Merci

Bonjour, pareil pour moi, je ne pense pas avoir les aptitudes pour faire ce script et j’espère vraiment une mise à jour du plugin.

Bonjour.

!!! Attention cette modification est pour les personnes expérimentées, je ne suis pas responsable si vous planter Jeedom ou alexaapi !!!

Pour éviter le trigger_5s, j’ai modifié le fichier ssh://jeedom_server/var/www/html/plugins/alexaapi/core/php/jeeAlexaapi.php :
aprés la ligne :
$alexaapi2 = eqLogic::byLogicalId($result['deviceSerialNumber'], 'alexaapi'); // ECHO
j’ai ajouté :

$scenario=scenario::byId(id.du.scenario);
$tags = $scenario->getTags();
$tags["#device#"] = $result['deviceSerialNumber'];
$tags = $scenario->setTags($tags);
$scenario->launch();
log::add('alexaapi_mqtt', 'info', 'Lancement du scénario alexa_Update avec device=' . $result['deviceSerialNumber']);

Le script du scénario:

$ch = curl_init();
curl_setopt_array($ch, [
	CURLOPT_URL => 'http://ip.de.jeedom:3456/history?maxRecordSize=1',
  	CURLOPT_RETURNTRANSFER => true,
  	CURLOPT_ENCODING => "",
  	CURLOPT_MAXREDIRS => 10,
  	CURLOPT_TIMEOUT => 10,
  	CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  	CURLOPT_CUSTOMREQUEST => 'GET',
  	CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
    ]);
$response = curl_exec($ch);
curl_close($ch);
$json = json_decode($response, true);
$creationTimestamp = 0;
$summary = '';
$tags = $scenario->getTags();
$device = $tags['#device#'];
for ($i = 0; $i <= count($json) - 1; $i++) {
    if ($json[$i]['deviceSerialNumber'] == $device) {
        $summary = $json[$i]['summary'];
        $creationTimestamp = $json[$i]['creationTimestamp'];
    	break;
    }
}
 $lastCreationTimestamp = $scenario->getData('lastCreationTimestamp_' . $device);
if ($lastCreationTimestamp!=$creationTimestamp) {
  $lastCreationTimestamp = $scenario->setData('lastCreationTimestamp_' . $device, $creationTimestamp);
  cmd::byString('#[Maison][Alexa][LastOrder]#')->event($summary); // A modifier selon le vôtre
}

Voilà, le scénario sera lancer que si on prononce le mot Alexa, si cela peut dépanner avant une éventuelle mise à jour.
Bonne journée.

1 « J'aime »

Bonjour @Lecreole74

Merci beaucoup pour ta contribution et tu fais bien de prévenir du risque dû à une fausse manipulation d’un utilisateur.
Ton intervention a aussi le mérite d’indiquer qu’une solution existe… j’attendrai qu’elle soit intégrée par sigalou, car je crains de commettre une erreur

Encore merci à tous les utilisateurs qui ont cherché/trouvé une solution

1 « J'aime »

Salut @Lecreole74 et @sigalou ,

J’ai peut-etre un debut pour la modification du plugin et ce grace a l’amelioration du script de @Lecreole74 que j’ai encore modifie…
ATTENTION : pas pour les debutant au risque de casser votre Jeedom
Au meme emplacement dans le fichier ‹ plugins/alexaapi/core/php/jeeAlexaapi.php › j’ai mis ceci :

$jsonHist = file_get_contents("http://" . config::byKey('internalAddr') . ":3456/history?maxRecordSize=1");
$jsonHist = json_decode($jsonHist, true);
for ($i = 0; $i <= count($jsonHist) - 1; $i++) {
	$newOrder = $jsonHist[$i]['summary'];
  	$newCreationTimestamp = $jsonHist[$i]['creationTimestamp']; // Timestamp in milliseconds
  	$deviceSerialNumber = $jsonHist[$i]['deviceSerialNumber'];
  	if ($newOrder!='' && $newCreationTimestamp!='' && $deviceSerialNumber!='') {
      	$alexaEqLogic = eqLogic::byLogicalId($deviceSerialNumber, 'alexaapi');
      	$cmd = $alexaEqLogic->getCmd(null, 'interactioninfo');
      	$valInteractioninfo = $cmd->execCmd();
      	$date = new DateTimeImmutable();
		$milli = (int)$date->format('Uv'); // Timestamp in milliseconds
      	$timeDiff = $milli - $newCreationTimestamp; // Timestamp difference in milliseconds
      	//if ($valInteractioninfo != $newOrder && $timeDiff<2000) {
       	if ($timeDiff<2000) {
        	metAJour("Interaction", $newOrder, 'interactioninfo', true, "ECHO", $deviceSerialNumber);
			log::add('alexaapi', 'debug', 'Mise a jour de la commande "interactioninfo" avec device=' . $deviceSerialNumber . ', Ancien Message = ' . $valInteractioninfo . ', Nouveau Message = ' . $newOrder . ',  Message Timestamp = ' . $newCreationTimestamp . ', Now = ' . $milli);
          	break;
        }
    }
}
  • Plus besoin du scenario, tout est gere par le code.
  • Par contre le code est repete plein de fois car il n’y a plus de balise ‹ ws-device-activity › appele depuis le changement chez Amazon (dumoins c’est ce que j’ai compris)
  • J’essaye alors de recuperer le dernier message en prenant seulement celui emis lors des 2 dernieres secondes
  • Voyez la ligne commente ou j’essaye aussi de comparer la valeur actuelle dans la commande ‹ interactioninfo › et je la change juste si elle est differente de la nouvelle valeur … mais ceci ne permet pas redonner le meme ordre.

Ou alors monsieur @sigalou sait ou mettre ce petit bout de code a un endroit ou il ne serait execute qu’une seule fois lors d’une commande vocale.

Sebastien

Et voila, avec ceci on dirait que tout est OK:

if ($nom=='ws-volume-change') {
	$jsonHist = file_get_contents("http://" . config::byKey('internalAddr') . ":3456/history?maxRecordSize=1");
	$jsonHist = json_decode($jsonHist, true);
	for ($i = 0; $i <= count($jsonHist) - 1; $i++) {
		$newOrder = $jsonHist[$i]['summary'];
  		$newCreationTimestamp = $jsonHist[$i]['creationTimestamp']; // Timestamp in milliseconds
  		$deviceSerialNumber = $jsonHist[$i]['deviceSerialNumber'];
  		if ($newOrder!='' && $newCreationTimestamp!='' && $deviceSerialNumber!='') {
      		$alexaEqLogic = eqLogic::byLogicalId($deviceSerialNumber, 'alexaapi');
      		$cmd = $alexaEqLogic->getCmd(null, 'interactioninfo');
      		$valInteractioninfo = $cmd->execCmd();
      		$date = new DateTimeImmutable(); //Now
			$milliNow = (int)$date->format('Uv');
      		$timeDiffCreation = $milliNow - $newCreationTimestamp;
      		$collectDate = $cmd->getValueDate();
      		$milliCollectDate = strtotime($collectDate) * 1000;
       		$timeDiffCollect = $milliNow - $milliCollectDate;
      		//if ($valInteractioninfo != $newOrder && $timeDiff<2000) {
       		if ($timeDiffCreation<2000 &&  $timeDiffCollect>2000) {
        		metAJour("Interaction", $newOrder, 'interactioninfo', true, "ECHO", $deviceSerialNumber);
				log::add('alexaapi', 'debug', 'Mise a jour de la commande "interactioninfo" avec device=' . $deviceSerialNumber . ', Ancien Message = ' . $valInteractioninfo . ', Nouveau Message = ' . $newOrder . ',  Message Timestamp = ' . $newCreationTimestamp . ', Now = ' . $milliNow . ', CollectDate = ' . $milliCollectDate . ', Name = ' . $nom);
          		break;
        	}
    	}
	}
}
  • Je rajoute un check sur la balise ‹ ws-volume-change ›, on dirait que ca vient a chaque fois qu’une commande vocale est passee.
  • Je compare la derniere date/temps de la mise a jour de la valeur de la commande ‹ interactioninfo ›, elle doit etre superieur a 2 secondes sinon pas d’update.

A tester et confirmer mes chers developpeurs :slight_smile:

J’ai les yeux qui piquent, @ demain !

Sebastien

2 « J'aime »

Bon boulot @Sattaz :+1:
Tu a mérité une bonne nuit de sommeil :grin:

Charles.

Merci :slight_smile: mais deja au taff depuis 7h …

Avant la pause de midi, j’ai vu ton message et le soucis du retour du temps en millisecondes pour ces lignes:

$date = new DateTimeImmutable(); //Now
$milliNow = (int)$date->format('Uv');

Essaye avec ceci :

if ($nom=='ws-volume-change') {
	$jsonHist = file_get_contents("http://" . config::byKey('internalAddr') . ":3456/history?maxRecordSize=1");
	$jsonHist = json_decode($jsonHist, true);
	for ($i = 0; $i <= count($jsonHist) - 1; $i++) {
		$newOrder = $jsonHist[$i]['summary'];
  		$newCreationTimestamp = $jsonHist[$i]['creationTimestamp']; // Timestamp in milliseconds
  		$deviceSerialNumber = $jsonHist[$i]['deviceSerialNumber'];
  		if ($newOrder!='' && $newCreationTimestamp!='' && $deviceSerialNumber!='') {
      		$alexaEqLogic = eqLogic::byLogicalId($deviceSerialNumber, 'alexaapi');
      		$cmd = $alexaEqLogic->getCmd(null, 'interactioninfo');
      		$valInteractioninfo = $cmd->execCmd();
          	$milliNow = intval(gettimeofday(true) * 1000);
      		$timeDiffCreation = $milliNow - $newCreationTimestamp;
      		$collectDate = $cmd->getValueDate();
      		$milliCollectDate = strtotime($collectDate) * 1000;
       		$timeDiffCollect = $milliNow - $milliCollectDate;
      		//if ($valInteractioninfo != $newOrder && $timeDiff<2000) {
       		if ($timeDiffCreation<2000 &&  $timeDiffCollect>2000) {
        		metAJour("Interaction", $newOrder, 'interactioninfo', true, "ECHO", $deviceSerialNumber);
				log::add('alexaapi', 'debug', 'Mise a jour de la commande "interactioninfo" avec device=' . $deviceSerialNumber . ', Ancien Message = ' . $valInteractioninfo . ', Nouveau Message = ' . $newOrder . ',  Message Timestamp = ' . $newCreationTimestamp . ', Now = ' . $milliNow . ', CollectDate = ' . $milliCollectDate . ', Name = ' . $nom);
          		break;
        	}
    	}
	}
}

Sebastien

1 « J'aime »

Je testerais ce soir, merci :+1:

1 « J'aime »

@sigalou , as-tu fais les tests?
Vas-tu pousser une mise a jour pour les utilisateurs prochainement?

Moi mes tests sont tres concluants.

Sebastien

1 « J'aime »

Salut. Oui mais toujours NOK

Je vais garder le scénario pour l’instant, je pars en vacances.

Merci

1 « J'aime »

Salut @Lecreole74 ,
C’est quand même bizarre car ce sont des fonctions PHP classiques.
Que donne ce code php dans le testeur d’expression de Jeedom? :

intval(gettimeofday(true) * 1000)

chez moi ça donne ceci:
image

Bonnes vacances à toi!

Sebastien

Effectivment c’est pas bon … hum … il faudrait trouver une formule php qui donne le temps actuel en millisecondes.
Essaye de chercher de ton coté, je cherche du miens.