Geräte per URL schalten (POST)

Begonnen von Afterburner, 25 August 2016, 19:18:03

Vorheriges Thema - Nächstes Thema

Afterburner

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>
CUL 868 --> Dirks Universalsensor - ESA200 Strommesser
HM USB --> HM Klingelsensor - HM Zwischenstecker
MAXLAN --> 5 x Thermostat - 4 x Fensterkontakt - ECO Taster - Cube
Arduino Nano V3.0 CC1101 433 MHz --> für Revolt Strommesser
bestellt: JeeLink 868 --> für TX 29 DT-HT Außensender

Afterburner

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();
}
CUL 868 --> Dirks Universalsensor - ESA200 Strommesser
HM USB --> HM Klingelsensor - HM Zwischenstecker
MAXLAN --> 5 x Thermostat - 4 x Fensterkontakt - ECO Taster - Cube
Arduino Nano V3.0 CC1101 433 MHz --> für Revolt Strommesser
bestellt: JeeLink 868 --> für TX 29 DT-HT Außensender