Max Cube Rest Webservice

@Andreas

Kannst Du vielleicht das aktualisierte Script online stellen? Genau an der Stelle komme ich nicht weiter :frowning:

Tausend DANK!

Das angepasste Client Script

<?

class MaxWsClient {

	const TYPE_BOOLEAN = 0;
	const TYPE_INTEGER = 1;
	const TYPE_FLOAT = 2;
	const TYPE_STRING = 3;

	private $host;
	private $port;

	public function __construct($host, $port) {
		$this->host = $host;
		$this->port = $port;
	}

	public function getRooms() {
		return $this->executeGetRequest("http://".$this->host.":".$this->port."/max-ws/rest/rooms");
	}

	public function getRoom($roomId) {
		return $this->executeGetRequest("http://".$this->host.":".$this->port."/max-ws/rest/rooms/".$roomId);
	}

	public function setRoomAutoMode($roomId) {
	   return $this->executeGetRequest("http://".$this->host.":".$this->port."/max-ws/rest/rooms/".$roomId."/mode/AUTO");
	}

	public function setRoomPermanentMode($roomId, $temp){
	   return $this->executeGetRequest("http://".$this->host.":".$this->port."/max-ws/rest/rooms/".$roomId."/mode/MANUAL?temp=".$temp);
	}

	public function setRoomAutoModeWithTemperature($roomId, $temp) {
		return $this->executeGetRequest("http://".$this->host.":".$this->port."/max-ws/rest/rooms/".$roomId."/mode/AUTO_TEMPERATURE?temp=".$temp);
	}

	public function setRoomTemporaryMode($roomId, $temp, $hours) {
		return $this->executeGetRequest("http://".$this->host.":".$this->port."/max-ws/rest/rooms/".$roomId."/mode/TEMPORARY?temp=".$temp."&hours=".$hours);
	}

	public function install() {

		$rooms =  $this->getRooms();

      //var_dump($rooms);

		$this->createProfile("MaxControlMode", array(1 => 'Auto', 2 => 'Manual'));
		//$this->createProfile("MaxTemperatureMode", array(1 => 'Normal', 2 => 'Eco', 3 => 'Comfort'));

      $order = 10;
      $houseId = $this->createDummyInstance("Haus", 0, $order);
	   $this->createVariable("Id", 0, $houseId, $order++);
		$this->createVariable("Name", "Haus", $houseId, $order++);
		$this->createVariable("ControlMode", 1, $houseId, $order++, self::TYPE_INTEGER, "MaxControlMode");
		$this->createVariable("SetPointTemperature", 20, $houseId, $order++, self::TYPE_FLOAT, "~Temperature");
      $this->createVariable("EcoTemperature", 16.5, $houseId, $order++, self::TYPE_FLOAT, "~Temperature.Room");
		$this->createVariable("ComfortTemperature", 21.5, $houseId, $order++, self::TYPE_FLOAT, "~Temperature.Room");

		foreach($rooms as $room) {
			//var_dump($room);
		   $roomId = $this->createDummyInstance($room->name, 0, $order++);
		   $this->createVariable("Id", $room->id, $roomId, $order++);
			$this->createVariable("Name", $room->name, $roomId, $order++);
			$this->createVariable("ControlMode", $room->controlMode == 'Auto' ? 1 : 2, $roomId, $order++, self::TYPE_INTEGER, "MaxControlMode");
			$this->createVariable("SetPointTemperature", $room->setPointTemperature, $roomId, $order++, self::TYPE_FLOAT, "~Temperature");
			$this->createVariable("TemperatureMode", $room->temperatureMode, $roomId, $order++);
			$this->createVariable("EcoTemperature", $room->ecoTemperature, $roomId, $order++, self::TYPE_FLOAT, "~Temperature.Room");
			$this->createVariable("ComfortTemperature", $room->comfortTemperature, $roomId, $order++, self::TYPE_FLOAT, "~Temperature.Room");

			foreach($room->devices as $device) {
			   //var_dump($device->state);
			   $order = 10;
			   $deviceId = $this->createDummyInstance($device->name, $roomId, 100);
		   	$this->createVariable("actualTemperature", $device->state->actualTemperature, $deviceId, $order++, self::TYPE_FLOAT, "~Temperature");
		   	//$this->createVariable("LastMeasurementUpdate", $device->state->lastMeasurementUpdate/1000, $deviceId, $order++, self::TYPE_INTEGER, "~UnixTimestamp");
		   	$this->createVariable("TemperatureOffset", $device->state->temperatureOffset, $deviceId, $order++, self::TYPE_FLOAT, "~Temperature");
		   	//$this->createVariable("ValvePosition", $device->state->valvePosition, $deviceId, $order++, self::TYPE_INTEGER, "~Intensity.100");
		   	$this->createVariable("BatteryLow", $device->state->batteryLow, $deviceId, $order++, self::TYPE_BOOLEAN, "~Battery");
			}
		}
	}

	private function createDummyInstance($name, $parent, $order=0) {
		$instanceId = @IPS_GetObjectIDByIdent($name, $parent);
		if ($instanceId === false) {
		   $instanceId = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
			IPS_SetParent($instanceId, $parent);
			IPS_SetName($instanceId, $name);
			IPS_SetIdent($instanceId, $name);
			IPS_SetPosition($instanceId, $order);
		}
		return $instanceId;
	}

	private function createVariable($name, $value, $parent, $order=0, $type=self::TYPE_STRING, $profile='~String') {
		$varId = @IPS_GetObjectIDByIdent($name, $parent);
		if ($varId === false) {
			$varId = IPS_CreateVariable($type);
			IPS_SetName($varId, $name);
			IPS_SetParent($varId, $parent);
			IPS_SetIdent($varId, $name);
			IPS_SetPosition($varId, $order);
			IPS_SetVariableCustomProfile($varId, $profile);
		}

		SetValue($varId, $value);

		return $varId;
	}

	private function createProfile($name, $associations) {
		@IPS_CreateVariableProfile($name, 1);
		IPS_SetVariableProfileText($name, "", "");
		IPS_SetVariableProfileValues($name, 0, 0, 0);
		IPS_SetVariableProfileDigits($name, 0);
		foreach($associations as $idx => $idxName) {
			IPS_SetVariableProfileAssociation($name, $idx, $idxName, "", -1);
		}
	}

	private function executeGetRequest($uri) {
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_URL, $uri);
		curl_setopt($ch, CURLOPT_TIMEOUT, 20);
		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
		$json =  curl_exec($ch);
		var_dump($json);
		$info = curl_getinfo($ch);
		curl_close($ch);
		if($info['http_code'] != 200) {
		   print_r($info);
		}
		return json_decode($json);
	}
}

?>

Meine Aktualisierungsabfrage

<?

include_once('15997.ips.php');

$maxClient= new MaxWsClient('192.168.1.9', '8080'); // eigene ip und port deines Tomcats
$room = $maxClient->getRoom(2);
$timeget = time();
$uhrzeit = date("H:i",$timeget);

SetValue(24648 /*[Geräte\Max!\Badezimmer\ControlMode]*/, $room->controlMode == 'Auto' ? 1 : 2);
SetValue(15562 /*[Geräte\Max!\Badezimmer\SetPointTemperature]*/, $room->setPointTemperature);
SetValue(15527 /*[Geräte\Max!\Badezimmer\TemperatureMode]*/, $room->temperatureMode);
SetValue(36866 /*[Geräte\Max!\Badezimmer\EcoTemperature]*/, $room->ecoTemperature);
SetValue(38233 /*[Geräte\Max!\Badezimmer\ComfortTemperature]*/, $room->comfortTemperature);
SetValue(50059 /*[Geräte\Max!\Badezimmer\Wandthermostat\actualTemperature]*/, $room->actualTemperature);
SetValue(59751 /*[Geräte\Max!\Badezimmer\Wandthermostat\Stand]*/, $uhrzeit);

?>

Die Abfrage des Batteriestatus bekomme ich noch nicht hin :0(

Ich lese nur. Aber prinzipiell sollte man auch schreiben können. Ist aber meines Wissens nicht implementiert

Schade, aber danke für die Info. Ich mag meinen IPS-Server nicht mit noch mehr zusätzlicher Software wie Maxbuddy oder Tomcat belasten, da wäre ein einfaches PHP-Skript zur Steuerung natürlich ein Volltreffer gewesen.

Hab mich heute zum Feiertag mal ausführlicher damit beschäftigt. Es gibt wohl eine Möglichkeit, Maxbuddy „headless“, also ohne GUI, auf Linux laufen zu lassen und über Skripte zu steuern. Wenn ich das alles richtig verstanden habe, dann könnte man so über eine Synology, einen Pi, einen PogoPlug, … den Max! Cube von IPS aus über Skripte auslesen und auch steuern.

Synology und Plug „liegen“ hier sowieso rum, da juckt es in den Fingern… :smiley: Problem: Ich habe (noch) keine Max!-Komponenten, weil ich erstmal das neue HM-Thermostat abwarten möchte. Deshalb bin ich auf fremde Erfahrungen angewiesen. :wink:

Grüße
galleto

Bei mir macht das Script leider noch Probleme. Daher werden die aktuellen Temperaturen auch nicht angezeigt :frowning:

}},{„stop“:1385067630016,"temperatu … ient.php on line 90
Warning: Ident darf nur aus Buchstaben und Zahlen bestehen in D:\IP-Symcon\scripts\MaxWsClient.php on line 90
Notice: Undefined property: stdClass::$actualTemperature in D:\IP-Symcon\scripts\MaxWsClient.php on line 75

Warning: Cannot auto-convert to Float from Variant. Error: Could not convert variant of type (Null) into type (Double) in D:\IP-Symcon\scripts\MaxWsClient.php on line 107

Warning: Ident darf nur aus Buchstaben und Zahlen bestehen in D:\IP-Symcon\scripts\MaxWsClient.php on line 90

Notice: Undefined property: stdClass::$actualTemperature in D:\IP-Symcon\scripts\MaxWsClient.php on line 75

Warning: Cannot auto-convert to Float from Variant. Error: Could not convert variant of type (Null) into type (Double) in D:\IP-Symcon\scripts\MaxWsClient.php on line 107

Habt Ihr eine Idee?

VG

Tobi

Was für ein Wandthermostat hast du ? Das neue mit dem „+“ oder das alte ?

Da könnte das Problem liegen…ich habe 4 der alten Baureihe und zwei ganz Neue der + Reihe.

Hallo,

ich habe das script so weit eingebunden dass er mir alle werte (wie temperatur,Ventilstellung und Fensterkontakt) abfragt.
Aber jetzt habe ich dass problem dass ich keine werte setzen kann, bzw. der cube diese nicht ändert.
Wenn ich zb. bei Auto den wert auf Manual ändere und das script

<?

  include_once('MaxWsClient.php');

$maxClient= new MaxWsClient('192.168.0.104', '8080'); // eigene ip und port deines Tomcats
$room = $maxClient->getRoom(1);
$timeget = time();
$uhrzeit = date("H:i",$timeget);

 SetValue (39846 /*[Heizung\Wohnzimmer\ControlMode]*/, $room->controlMode == 'Auto' ? 1 : 2);

?>

ausführe bekomme ich wieder auto angezeigt und ich komme nicht drauf wo der fehler liegt …

Hoffe ihr könnt mir auf die sprünge helfen :wink:

MfG

Sebastian

Hallo Sebastian,

wenn ich das Konzept richtig verstanden habe, dann holst Du mit Deinem Skript die Daten für den Raum mit der ID=1 ab.

Zum Setzen von Werten braucht es einen anderen Aufruf. Ich würde im ersten Schritt im Browser die Aufrufe direkt testen.

z.B.
http://192.168.0.104:8080/max-ws/rest/rooms/1/mode/AUTO
http://192.168.0.104:8080/max-ws/rest/rooms/1/mode/MANUAL?temp=21
http://192.168.0.104:8080/max-ws/rest/rooms/1/mode/TEMPORARY?temp=22&hours=3
(ist im 1. Thread beschrieben)

Wenn das grundsätzlich funktioniert, dann zurück nach IPS und dort im Script:

include_once('MaxWsClient.php');
$maxClient= new MaxWsClient('192.168.0.104', '8080');

$status = setRoomAutoMode(1);
echo $status;              // hier sollte <Status:ok> o.ä. zurückkommen

$status = setRoomPermanentMode(1, 21);
echo $status;

$status = setRoomTemporaryMode(1, 22, 3);
echo $status;

Ich habe das selbst nocht nicht verifiziert, könnte mir aber vorstellen das es in die richtige Richtung geht.

@nixda:

Hallo nixda,

Super-Webservice - vielen Dank dafür. Ich habe es mit Deiner Anleitung grundsätzlich zum Laufen gebracht und Daten holen funktioniert.
Der Rest kommt noch. :slight_smile:

Hast Du die Software weiter entwickelt? Gibt es eine aktuellere Version?

Viele Grüße aus dem Unterallgäu
Harry

Hallo Nixda,

ich habe gesehen, dein Sourcecode war mal ein git repository.
Pflegst du den irgendwo in github/sourceforge o.Ä.?

PS: Konnte den Webservice problemlos installieren und Daten abrufen - auch mit den EQ-3 Libraries v. 1.4.0

Grüße

Shivan

Der Winter kommt so langsam.
Habs leider bei mir nicht zum laufen bekommen.

Gibts schon weiter Fortschritte um auch die Heizung zu steuern?

Ich habe alles so gemacht wie beschrieben, aber leider geht es nicht.
Wenn ich http://localhost:8080/max-ws/rest/rooms aufrufe bekomme ich nur einen Tomcat fehler.
The request resource is not avalable

Was mir aufgefallen ist, ist das beim entpacken von max-ws nur zwei Ordner drin sind ist das richtig so?

Gruß

:slight_smile:

Geht jetzt die Java Einstellungen vom Tomcat Server waren falsch.

Hallo,

kann irgendwer nochmal einen Download link für die Skripte erstellen,
weil der Drop box link funktioniert nicht mehr.

Hi Nixda ,

can you upload again the max.zip please ?

Thank you ( sorry no german )

Gibt es zum Max System inzwischen schon was neues ? Oder ist das hier immer noch aktuell ?

Hallo,

ich bin letztes Jahr von MAX auf Homematic umgestiegen. Der MAX Cube hat leider nicht stabil funktioniert, 2 mal im Winter ist der abgestürzt und hat seine Konfiguration verloren. Ich würde MAX nicht mehr empfehlen.

Viele Grüsse
Holger

Das hatte ich auch noch vor zu wechseln aber wären dann 400 EUR was ich da an neuer Hardware brauche, aber der Winter lässt sich ja noch etwas Zeit

Da ja bei Dir alles in FHEM läuft kannst Du auch Stück für Stück ausprobieren oder aber einfach von FHEM den Status des Geräts an IP-Symcon schicken bis alles was Du willst selber in IP-Symcon läuft und so IP-Symcon für die Visualisierung nutzten. Dazu nutzt Du am besten HTTPMOD in FHEM und schickst dann die Daten an einen Webhook in IP-Symcon. Den Weg kann man zumindest gehen, wenn es was geben sollte, für das es keine einfache Anbindung in IP-Symcon selber gibt. Als Beispiel habe ich dies hier bei FakeRoku mal beschrieben. Ich hatte ja Hoffnung das es von Logitech da mal eine andere Möglichkeit gibt, aber da tut sich wohl nichts zur Zeit. In sofern wird man das dann wohl auch mal in IP-Symcon einbauen müssen.

Ja das wäre durchaus eine Idee wert da Daten zwischen den beiden Systemen auszutauschen.
Kann man mit IPS eigentlich auch MySQL Datenbanken auslesen ?

Also ob es da was fertiges gibt, ansonsten wäre es ja kein Problem das in PHP selbst zu machen, muss dann nur gucken wie ich die Daten dann in IPS übernommen bekommen, also in Variabeln und auch so das es loggt denn Logging geht bei mir irgendwie nicht, evtl weil es die Demo ist