Aller au contenu

S.a.h.r.a Et Hc2


Moicphil

Utilisez-vous S.a.r.a.h ?  

102 membres ont voté

  1. 1. Utilisez vous s.a.r.a.h ?

    • Oui
      37
    • Non
      13
    • Surement, plus tard
      52


Messages recommandés

@Ibouriez

La v4... de Sarah ?

Dans mes précédents posts quand je parle de la v4, c'est celle de la box HC2.

Pour ce qui est de Sarah ma modif. a été effectué sur la v3.16.

 

@Byackee

Nickel !

Comment comptes-tu t'y prendre pour avoir les "case" de tous les modules ?

La v4 de fibaro :)

Lien vers le commentaire
Partager sur d’autres sites

J ai commencé a modifié le fichier js, il est dispo sur mon github. Les actions sur lumières binaires fonctionnent mais je n ai pas testé le reste (pas beaucoup de temps)

Je reprends ça demain

Envoyé de mon PE-TL10 en utilisant Tapatalk

Lien vers le commentaire
Partager sur d’autres sites

Alors, toujours un souci sur les walls plug.

Il faut rajouter dans le switch module.type

case 'com.fibaro.FGWP101':

 

Et malgré ça, ça ne marche pas :(

Ils ont peut être changé un truc dans l'API et on ne peut plus simplement contrôler les wallplugs via des requêtes ?

Lien vers le commentaire
Partager sur d’autres sites

Tu dois modifier ou ajouter 2 lignes du code :

 

- Sous : "var get_value = function ( module, value ) {

               switch ( module.baseType ) {"

Ajoute ces lignes :

		case 'com.fibaro.FGWP101':
			return (value == 'false'? 0: 1);
			break;

- Sous : "var say = function ( module, callback ) {

               switch ( module.baseType ) {"

Ajoute ces lignes :

		case 'com.fibaro.FGWP101':
			var string = module.name + " est " + (module.properties.value == '0'? ' éteint': ' allumé');
			if (module.properties.valueSensor && module.properties.valueSensor !="") 
				string += ' et la consommation est de ' + returnString(module.properties.valueSensor,".",",") + get_unit(module);
			output (callback, string);
			break;

Tiens moi au courant  ;)

Lien vers le commentaire
Partager sur d’autres sites

Peut-être que Byackee pourra t'aider...

Je ne peux pas faire plus car je n'ai pas de WallPlug pour tester.

 

As tu récuperé le fichier js de Byackee sur son github ?

Regarde ses modifs pour les lumières binaires, ce sera peut-être une piste pour ton WallPlug.

Modifié par synthetic
Lien vers le commentaire
Partager sur d’autres sites

Et comme ça ? :

		case 'com.fibaro.FGWP101':
		if ( value == 'true' || value == 'false') {
		return (value == 'false'? 0: 1);
			break;
		case 'com.fibaro.FGWP101':
			output (callback, module.properties.value == '0'? 'c\'est éteint': 'c\'est allumé');
			break;
Lien vers le commentaire
Partager sur d’autres sites

Oui j'ai récupéré la dernière version justement.

Et non, ca ne change rien :(

 

Si je récupère l'url et que je la lance dans chrome j'obtiens ce résultat (avec le wallplug qui ne réagit toujours pas):

URL : MON_IP/api/callAction?deviceID=54&name=setValue&arg1=1

Résultat : {"id":0,"jsonrpc":"2.0","result":{"result":1}}

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

Bonjour j'ai fait du debug a l'arrache ce soir si ca vous interresse: les switch fonctionnent, la variation fonctionne et les volets fonctionnent (avec un petit bug sur le retour d'état)

exports.init = function (SARAH){
  status(SARAH.ConfigManager.getConfig());
}

exports.action = function(data, callback, config){
	console.log('##### Home Center 2 #####');

var config = config.modules.homecenter2;	

	switch (data.request)
	{
	case 'set':
	get_rooms( set, data, callback, config );
	break;
	case 'get':
	get_rooms( get, data, callback, config );
	break;
	case 'launch':
	get_rooms( set, data, callback, config );
	break;
	case 'updatedevices':
	get_rooms(update, data, callback, config );
	break;
	case 'updaterooms':
	get_rooms(update, data, callback, config );
	break;
	default:
	output(callback, "Une erreur s'est produite: ");
	}
}

var get_rooms = function ( action, data, callback, config ) {
	var http = require('http');
	var options = {
	  hostname: config.ip,
	  port: 80,
	  path: '/api/rooms',
	  auth: config.login + ':' + config.password
	};
	
	var request = data.request;
	http.get(options, function(res) {
			
			var buffer = '';
			res.on('data', function (chunk) {
					buffer += chunk;
				});
			
			res.on('end', function(){
					var jsonrooms = JSON.parse(buffer);
					get_modules(jsonrooms, action, data, callback, config);
				});
		}).on('error', function(e) {
			output(callback, "Une erreur s'est produite: " + e.message);
		});
		
}

var get_modules = function ( jsonrooms, action, data, callback, config ) {
	var http = require('http');
	var options = {
	  hostname: config.ip,
	  port: 80,
	  path: '/api/devices',
	  auth: config.login + ':' + config.password
	};
	
	var request = data.request;
	http.get(options, function(res) {
			
			var buffer = '';
			res.on('data', function (chunk) {
					buffer += chunk;
				});
			
			res.on('end', function(){
					var json = JSON.parse(buffer);
					get_scenes(jsonrooms, json, action, data, callback, config);
				});
		}).on('error', function(e) {
			output(callback, "Une erreur s'est produite: " + e.message);
		});
		
}

var get_scenes = function ( jsonrooms, json, action, data, callback, config ) {
	var http = require('http');
	var options = {
	  hostname: config.ip,
	  port: 80,
	  path: '/api/scenes',
	  auth: config.login + ':' + config.password
	};

	var request = data.request;
	http.get(options, function(res) {
			var buffer = '';
			res.on('data', function (chunk) {
					buffer += chunk;
				});
			
			res.on('end', function(){
					json = json.concat(JSON.parse(buffer));
					action(jsonrooms, json, data, callback, config);
				});
		}).on('error', function(e) {
			output(callback, "Une erreur s'est produite: " + e.message);
		});
}

var get = function (jsonrooms, json, data, callback, config) {
	console.log("***** GET *****");
	var text = data.module;
	var text2 = data.room;
	var value = data.value;
	
	for ( var i = 0; i < jsonrooms.length; i++ ) {
	var rooms = jsonrooms[i];
	var tokens = rooms.name.split(' ');
	var found = true;
	for ( var j = 0; found && j < tokens.length; j++ ) {
			found = new RegExp(tokens[j],'i').test(text2);
		}

		console.log ( "Found rooms (" + i + ") " + rooms.name + ": " + found );
		if ( found ) {
			for ( var i = 0; i < json.length; i++ ) {
				var module = json[i];
				var tokens = module.name.split(' ');
				var found = true;
				if (rooms.id == module.roomID){
				for ( var j = 0; found && j < tokens.length; j++ ) {
					found = new RegExp(tokens[j],'i').test(text);
				}

			console.log ( "Found modules (" + i + ") " + module.name + ": " + found );
			if ( found ) {
				return say(module, callback);
			}
		}
		}
		}
	}

	
	console.log('rien trouvé');
	return output( callback, 'je ne sais pas');
}

var set = function (jsonrooms, json, data, callback, config ) {
	console.log("***** SET *****");
	var text = data.module;
	var text2 = data.room;
	var value = data.value;
	
for ( var i = 0; i < jsonrooms.length; i++ ) {
	var rooms = jsonrooms[i];
	var tokens = rooms.name.split(' ');
	var found = true;
	for ( var j = 0; found && j < tokens.length; j++ ) {
			found = new RegExp(tokens[j],'i').test(text2);
		}

		console.log ( "Found rooms (" + i + ") " + rooms.name + ": " + found );
		if ( found ) {	
			for ( var i = 0; i < json.length; i++ ) {
				var module = json[i];
				var tokens = module.name.split(' ');
				var found = true;
				if (rooms.id == module.roomID){
				for ( var j = 0; found && j < tokens.length; j++ ) {
					found = new RegExp(tokens[j],'i').test(text);
				}

			console.log ( "Found (" + i + ") " + module.name + ": " + found );
			if ( found ) {
				if ( data.request == "set") {
					if(module.type=='com.fibaro.binarySwitch'){
						var http = require('http');
						var options = {
						hostname: config.ip,
						port: 80,
						path: '/api/callAction?deviceID='+module.id+"&name="+get_value(module,value),
						auth: config.login + ':' + config.password
						};
					}else{
						var http = require('http');
						var options = {
						hostname: config.ip,
						port: 80,
						path: '/api/callAction?deviceID='+module.id+"&name=setValue&arg1="+get_value(module,value),
						auth: config.login + ':' + config.password
						};
					}
					console.log(options);
				} else {
				console.log('run scene');
					var http = require('http');
					var options = {
					hostname: config.ip,
					port: 80,
					path: '/api/sceneControl?id='+module.id+"&14&action=start",
					auth: config.login + ':' + config.password
					};
			}

			
			http.get(options, function(res) {
					var buffer = '';
					res.on('data', function (chunk) {
							buffer += chunk;
						});
					
					res.on('end', function(){
						setTimeout((function() {				
						if ( data.request == "set") {
						get_rooms( get, data, callback, config );
						} else {
						output(callback, "fait");
						}
						}), 500);
					});
				}).on('error', function(e) {
					output(callback, "Une erreur s'est produite: " + e.message);
				});
			
			return 
		}
	}
	}
	}
	}

	console.log('rien trouvé');
	return output( callback, 'vous pouvez répéter la question');
}
			
var get_value = function ( module, value ) {
	switch ( module.type ) {
		case 'com.fibaro.binarySwitch':
			return (value == 'false'? 'turnOff': 'turnOn');
			break;
		case 'com.fibaro.multilevelSwitch':
		if ( value == 'true' || value == 'false') {
		return (value == 'false'? 0: 99);
		} else {
			console.log('retour de valeur:'+value);
			return value;
			break;
		}
		case 'com.fibaro.FGR221':
		if ( value == 'true' || value == 'false') {
		return (value == 'false'? 0: 99);
		} else {
			console.log('retour de valeur:'+value);
			return value;
			break;
		}
		case 'com.fibaro.FGRM222':
		if ( value == 'true' || value == 'false') {
		return (value == 'false'? 0: 99);
		} else {
			console.log('retour de valeur:'+value);
			return value;
			break;
		}
	}
}

var say = function ( module, callback ) {
	
	switch ( module.type ) {
		case 'com.fibaro.multilevelSensor':
			output (callback, 'la ' + module.name + ' est de ' + module.properties.value + get_unit(module));
			break;
		case 'com.fibaro.binarySwitch':
			var string = module.name + " est " + (module.properties.value == 'false'? ' éteint': ' allumé');
			if (module.properties.valueSensor && module.properties.valueSensor !="") 
				string += ' et la consommation est de ' + returnString(module.properties.valueSensor,".",",") + get_unit(module);
			output (callback, string);
			break;
		case 'com.fibaro.multilevelSwitch':
			output (callback, module.properties.value == '0'? 'c\'est éteint': 'c\'est allumé à' + module.properties.value + 'pour cent');
			break;
		case 'com.fibaro.humiditySensor':
			output (callback, 'le taux d\'humidité est de ' + module.properties.value + get_unit(module));
			break;
		case 'com.fibaro.multilevelSensor':
			output (callback, 'la valeur de ' + module.name + ' est de ' + module.properties.value + get_unit(module));
			break;
		case 'com.fibaro.doorSensor':
			output (callback, module.name + (module.properties.value == '0'? ' est fermé': ' est ouvert '));
			break;
		case 'com.fibaro.lightSensor':
			output (callback, 'la ' + module.name + ' est de ' + module.properties.value + get_unit(module));
			break;
		case 'com.fibaro.FGR221':
			output (callback, module.name + (module.properties.value == '0'? ' est fermé': ' est ouvert '));
			break;
		case 'com.fibaro.FGRM222':
			
			output (callback, module.name + (module.properties.value == '0'? ' est fermé': ' est ouvert '));
			break;
		case 'com.fibaro.motionSensor':
			output (callback, (module.properties.value == '0'? ' pas de mouvements sur ': ' detection présence sur') + module.name );
			break;
		default:
		output(callback, "Je ne peux pas exécuter cette action");
	}
}

var get_unit = function ( module ) {
var unit = module.properties.unit;
if (unit == "")
unit = module.properties.unitSensor
	switch ( unit ) {
		case 'W':
			return ' watt';
		case '%':
			return ' pour cent';
		case 'C':
			return ' degrés';
		case 'F':
			return ' degrés';
		case 'Lux':
			return ' Lux';
		default:
			return ' ';
	}
}

var output = function ( callback, output ) {
	console.log(output);
	callback({ 'tts' : output});
}

var update = function(jsonrooms, json, data, callback, config){
	console.log("***** UPDATE  *****");

	if (!data.directory){ 
	console.log('il n\'y a pas de dossier spécifié');
	return false; 
	}

	var fs   = require('fs');
	var file = data.directory + '/../plugins/homecenter2/homecenter2.xml';
	var xml  = fs.readFileSync(file,'utf8');
  
	var replace  = '§ -->\n';
	replace += '  <one-of>\n';
					
		for ( var i = 0; i < json.length; i++ ) {
			var module = json[i];
			var tokens = module.name.split(' ');
			replace += '    <item>'+module.name+'<tag>out.action.module="'+module.name+'"</tag></item>\n';
			console.log('ajout de : ' + module.name);
						
		}
	replace += '  </one-of>\n';
	replace += '<!-- §';
	
		var replace2  = '@ -->\n';
	replace2 += '  <one-of>\n';
					
		for ( var i = 0; i < jsonrooms.length; i++ ) {
			var module = jsonrooms[i];
			var tokens = module.name.split(' ');
			replace2 += '    <item>'+module.name+'<tag>out.action.room="'+module.name+'"</tag></item>\n';
			console.log('ajout de : ' + module.name);
						
		}
	replace2 += '  </one-of>\n';
	replace2 += '<!-- @	';
						
	var regexp = new RegExp('§[^§]+§','gm');
	var regexp2 = new RegExp('@[^@]+@','gm');
	var xml    = xml.replace(regexp,replace);
	xml    = xml.replace(regexp2,replace2);
	
	fs.writeFileSync(file, xml, 'utf8');
	fs.writeFileSync(file, xml, 'utf8');
	
	var file = data.directory + '/../plugins/homecenter2/portlet.html';
	var xml  = fs.readFileSync(file,'utf8');
  
	var replace  = '§ -->\n';
	replace += '<BR>nombre de modules = <b>'+json.length+'</b></BR>\n';
	replace += 'nombre de pieces = <b>'+jsonrooms.length+'</b></BR>\n';
	replace += '<!-- §';
						
	var regexp = new RegExp('§[^§]+§','gm');
	var xml    = xml.replace(regexp,replace);
	fs.writeFileSync(file, xml, 'utf8');
	fs.writeFileSync(file, xml, 'utf8');
		
  callback({ 'tts' : 'j\'ai trouvé ' + json.length + ' modules et ' + jsonrooms.length + ' pieces'});
  console.log('j\'ai trouvé ' + json.length + ' modules et ' + jsonrooms.length + ' pieces');

}

var returnString = function (data, stringtoreplace, word) {
var str = data;
str = str.replace(stringtoreplace,word);
//console.log('return: ' + str);
return str;
}

var status = function (config) {	
	var config = config.modules.homecenter2;
	var http = require('http');
	var options = {
	  hostname: config.ip,
	  port: 80,
	  path: '/api/devices',
	  auth: config.login + ':' + config.password
	};

	http.get(options, function(res) {
			res.on('data', function (chunk) {
				});
			
			res.on('end', function(){
			
						console.log("alive");
			status = 'alive';
				});
		}).on('error', function(e) {
		console.log("dead");
				status = 'dead';
		});
	return status;	
}

exports.status  = status;

Lien vers le commentaire
Partager sur d’autres sites

Voilà  ce que j'obtient personnellement dans le log du serveur .. Même problème avec ton script Akrobat. "Je ne peux exécuter cette action"...

 

##### Home Center 2 #####
***** SET *****
Found rooms (0) Salon: true
Found (12) Prise Salon: true
{ hostname: '192.168.1.4',
  port: 80,
  path: '/api/callAction?deviceID=25&name=setValue&arg1=undefined',
  auth: 'xxxx:xxxx' }
***** GET *****
Found rooms (0) Salon: true
Found modules (12) Prise Salon: true
Je ne peux pas exécuter cette action
info: Run homecenter2: 584ms
Lien vers le commentaire
Partager sur d’autres sites

Salut!

Je n'ai pas de Walle plug, j'ai débuger la version existante pour  qu'elle fonctionne avec la V4 voir le principe de fonctionnement et confirmer que la reconnaissance vocale fonctionne bien avec mes switch, dimmer et roller shutter.

Je vais maintenant commencer (semaine prochaine) a faire mon plugin que je distribuerais à  la communauté quand il sera terminé. Le plugin existant est sympa et le boulot effectué est énorme, mais certaines choses ne correspondent pas a mon utilisation du HC2, notamment dans les phrases type générée dans le fichier XML. Je veux rendre les commandes plus naturelles.

Si tu veux, des que j'ai un truc exploitable je t'envoi ma version.

 

Pour ton probleme de wall plug, dans le switch case il faudrait que tu rajoute un logger au debut du switch case pour voir le nom exacte de la classe du module que le hc2 transmets (ils ont changé depuis la V4) et ensuite via l'API rest, tu interroges le HC2 pour connaitre les méthodes disponibles pour le module (là  encore les noms des méthodes et les paramètres ont changés depuis la V4).

Et si tu ne comprends pas ce que je viens de te t'écrire (parce que tu n'es pas développeur :) ), je regarde la semaine pro (si j'ai le temps) pour te donner le code a mettre en place pour corriger ton probleme.

 

@ plush!

Lien vers le commentaire
Partager sur d’autres sites

@akrobat,

Je serais également intéressé quand tu auras finis, je viens de migrer de V3 àV4 mais je ne suis pas pressé car ce n'est pas les fonctions les plus importantes sur sarah àmon goût car on ira tjs plus vite àappuyer sur un inter.

Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...