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>
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();
}