FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Jochen1980 am 09 April 2014, 11:29:46

Titel: Programmatische fhem-Ansprache via Java oder PHP
Beitrag von: Jochen1980 am 09 April 2014, 11:29:46
Hallo FHEM-Gemeinde,

ich komme sehr gut mit fhem klar und bin beeindruckt, wie flüssig das Pairing und die Abläufe über das fhem-Interface klappen. Ebenso kann ich via Browser die von mir gewuenschte Aktion triggern, etwa 'Licht an'. Ich setze hier die URL in der Form http://meine.ip.adre.sse:8083/fhem?cmd.steckdose=set steckdose on&room=Buero ab. Es klappt auch, dass ich die URL durch meine Webanwendung (basiert auf PHP Zend Framework in der Version 2.x) absetze. Der funktionierende Code lautet:

$ip = $jobaGlobalOptions['networkIp'];
if ($state == "100"){
    $room->setLightone("0");
    // call fhem url
    $client = new Client();
    $client->setAdapter('Zend\Http\Client\Adapter\Curl');
    $uri = 'http://' . $ip . ':8083/fhem?cmd.steckdose=set steckdose off&room=Buero';
    $client->setUri($uri);
    $result = $client->send();
    $body = $result->getBody();
    $this->createMessage("Protokoll", "Licht Nummer Eins im Raum '" . $room->getName() . "' ausgeschaltet.");
...
}
$this->getRoomTable()->saveRoom($room);
return $this->redirect()->toRoute('home');


Es klappt leider nicht, dass ich die Aktion, also das Absetzen einer URL in einer für fhem verständlichen Weise komplett ohne Browser bewältigen kann, weder in PHP noch in JAVA!?
Daher meine Frage: wie fahre ich fhem auf zuverlässige Weise mit PHP oder JAVA an? Ich fand im Netz bereits eine fhem-java-api, siehe openAAL-Projekt und TheOpenTransporter ( http://www.theopentransporter.de/), hier wird aber recht viel zusätzlich erzeugt, wenn ich das richtig verstanden habe - ich hatte angenommen, hier gibt es einen einfacheren Weg die URLs aus einem php-Skript oder einer Java-Swing-Anwendung abzufeuern.

Hier noch mein Versuch per Java den Request an fhem loszuwerden:
String ip = "10.20.65.108";
targetURL = "http://" + ip + ":8083/fhem?cmd.steckdose=set steckdose off&room=Buero";
String response = utils.executeHttpGet(targetURL, urlParameters);


... die executeHttpGet-Methode:

public String executeHttpGet(String targetURL, String urlParameters){
URL url;
String httpResponse;
HttpURLConnection connection = null;
try {
// Create connection
url = new URL(targetURL);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Content-Length", "" + Integer.toString(urlParameters.getBytes().length));
connection.setRequestProperty("Content-Language", "en-US");
connection.setUseCaches(false);
connection.setDoInput(true);
connection.setDoOutput(true);
// Send request
DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
wr.writeBytes(urlParameters);
wr.flush();
wr.close();
// Get Response
InputStream is = connection.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
String line;
StringBuffer response = new StringBuffer();
while ((line = rd.readLine()) != null) {
response.append(line);
response.append('\r');
}
rd.close();
httpResponse = response.toString();
//System.out.println("HTTP-Resonse: " + httpResponse);
return httpResponse;

} catch (Exception e) {

e.printStackTrace();
return null;
} finally {
if (connection != null) {
connection.disconnect();
}
}
}

Danke vorab.