FHEM Forum

FHEM => Sonstiges => Thema gestartet von: Afterburner am 25 August 2016, 19:18:03

Titel: Geräte per URL schalten (POST)
Beitrag von: Afterburner am 25 August 2016, 19:18:03
Servus,

ich bastel gerade ein Java Programm welches sich mit der MySQL Datenbank von FHEM verbindet und diese auswertet, jetzt möchte ich auch gerne Geräte schalte, das geht ja nicht über die DB.
Jetzt habe ich mal den Quellcode der Webseiten auseinander genommen.

Ich habe eine HM Steckdose mit Schalter und Leistungsmessung (Name ist mir gerade entfallen)
Der Name lautet: Arbeitszimmer.Steckdose_Sw

gesendet wird das Ganze per POST an /fhem

Das hidden field detail ist wohl für die Visualisierung der Seite zuständig, sieht man ja auch in der URL im Browser
Das Dropdown hat einmal die
id sel_setArbeitszimmer_Steckdose_Sw
name arg.setArbeitszimmer.Steckdose_Sw
wie erfolgt serverseitig die Auswertung ? nach der id oder dem Namen ?

Und ist der Aufbau immer der Selbe das ein sel_set bzw arg.set vorrangestellt wird ?
Oder gibt es da eine API welche ein anderes Format hat ?

Theoretisch kann ich auch das gesamte Formular emulieren aber mit minimalisiertem Aufwand arbeite es sich besser ;)

<form autocomplete="off" action="/fhem" method="post">
<input type="hidden" value="Arbeitszimmer.Steckdose_Sw" name="detail">
<input type="hidden" value="Arbeitszimmer.Steckdose_Sw" name="dev.setArbeitszimmer.Steckdose_Sw">
<input class="set" type="submit" value="set" name="cmd.setArbeitszimmer.Steckdose_Sw">
<div class="set downText"> Arbeitszimmer.Steckdose_Sw </div>
<select id="sel_setArbeitszimmer_Steckdose_Sw" class="set" name="arg.setArbeitszimmer.Steckdose_Sw" informid="sel_setArbeitszimmer_Steckdose_Sw">
<option value="clear" selected="selected">clear</option>
<option value="getConfig">getConfig</option>
<option value="getRegRaw">getRegRaw</option>
<option value="inhibit">inhibit</option>
<option value="off">off</option>
<option value="on">on</option>
<option value="on-for-timer">on-for-timer</option>
<option value="on-till">on-till</option>
<option value="peerBulk">peerBulk</option>
<option value="peerIODev">peerIODev</option>
<option value="press">press</option>
<option value="regBulk">regBulk</option>
<option value="regSet">regSet</option>
<option value="sign">sign</option>
<option value="statusRequest">statusRequest</option>
<option value="toggle">toggle</option>
</select>
<div class="textField_widget" style="display:inline-block" informid="Arbeitszimmer.Steckdose_Sw-on">
<input type="text" size="30" name="val.setArbeitszimmer.Steckdose_Sw">
</div>
</form>
Titel: Antw:Geräte per URL schalten (POST)
Beitrag von: Afterburner am 25 August 2016, 19:37:45
Für alle die evtl auch mit Java arbeiten, so habe ich es momentan gelöst

protected void lichtAn(String parameter) throws IOException {
java.net.Authenticator.setDefault(new java.net.Authenticator(){
            protected java.net.PasswordAuthentication getPasswordAuthentication() {
                return new java.net.PasswordAuthentication("htaccess-Benutzername","htaccess-Passwort".toCharArray());
            }
        });
       
        URL url = new URL("http://192.168.178.63:8084/fhem");
        Map<String,Object> params = new LinkedHashMap<>();
        params.put("detail", "Arbeitszimmer.Steckdose_Sw");
        params.put("dev.setArbeitszimmer.Steckdose_Sw", "Arbeitszimmer.Steckdose_Sw");
        params.put("arg.setArbeitszimmer.Steckdose_Sw", parameter);
        params.put("val.setArbeitszimmer.Steckdose_Sw", "");
        params.put("cmd.setArbeitszimmer.Steckdose_Sw", "set");
     
        StringBuilder postData = new StringBuilder();
        for (Map.Entry<String,Object> param : params.entrySet()) {
            if (postData.length() != 0) postData.append('&');
            postData.append(URLEncoder.encode(param.getKey(), "UTF-8"));
            postData.append('=');
            postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
        }
        byte[] postDataBytes = postData.toString().getBytes("UTF-8");

        HttpURLConnection conn = (HttpURLConnection)url.openConnection();
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length));
        conn.setDoOutput(true);
        conn.getOutputStream().write(postDataBytes);

        Reader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));

        for (int c; (c = in.read()) >= 0;){
            System.out.print((char)c);
        }
       
        in.close();
}