RSSI - Optimierung mit Schnick-Schnack
Moderator: Co-Administratoren
-
- Beiträge: 325
- Registriert: 10.03.2015, 10:54
- Wohnort: Süd NDS
- Hat sich bedankt: 3 Mal
- Danksagung erhalten: 8 Mal
RSSI - Optimierung mit Schnick-Schnack
Hallo,
ich brauche für unser Haus mehr als einen Sender, d.h. ich habe eine CUU2, ein Lan-Gateway und einen PI als LAN-Gateway.
Die meisten Sensoren laufen stabil, um aber zu schauen ob alle Geräte den richtigen Gateway zugeordnet sind, habe ich
die RSSI-Übersicht verwendet: Was mich gestört hat: Nicht sortiert, welches ist den das grade aktuelle Gateway, wo ist denn das Gerät...
Ich habe die Seite nachgeneriert, mit Bordmitteln: Die Ausgabe ist sortiert, es wird der Raum und Gerätetyp mit ausgegeben und das Default-Gateway (und ob roaming aktiv ist).
Was mir beim Testen aufgefallen ist, die Werte schwanken doch teilweise recht stark über den Tag, so dass einige Zuordnungen morgens
toll waren, aber am Nachmittag zu Funkstörungen geführt haben: Man sieht hier, das der "rote" Gateway ab und an einen Super Empfang hat. Diesen habe ich auch zugeordnet.
Aber über den Tag ist der "lila" Gateway konstanter und besser.
Deswegen habe ich in meine Lösung ein Speichern der Werte in eine MySQL-DB eingebaut.
Was braucht man zwingend: Java (am besten 1.8 - damit habe ich das JAR erstellt)
Optional: MySql-DB für Historie
ich brauche für unser Haus mehr als einen Sender, d.h. ich habe eine CUU2, ein Lan-Gateway und einen PI als LAN-Gateway.
Die meisten Sensoren laufen stabil, um aber zu schauen ob alle Geräte den richtigen Gateway zugeordnet sind, habe ich
die RSSI-Übersicht verwendet: Was mich gestört hat: Nicht sortiert, welches ist den das grade aktuelle Gateway, wo ist denn das Gerät...
Ich habe die Seite nachgeneriert, mit Bordmitteln: Die Ausgabe ist sortiert, es wird der Raum und Gerätetyp mit ausgegeben und das Default-Gateway (und ob roaming aktiv ist).
Was mir beim Testen aufgefallen ist, die Werte schwanken doch teilweise recht stark über den Tag, so dass einige Zuordnungen morgens
toll waren, aber am Nachmittag zu Funkstörungen geführt haben: Man sieht hier, das der "rote" Gateway ab und an einen Super Empfang hat. Diesen habe ich auch zugeordnet.
Aber über den Tag ist der "lila" Gateway konstanter und besser.
Deswegen habe ich in meine Lösung ein Speichern der Werte in eine MySQL-DB eingebaut.
Was braucht man zwingend: Java (am besten 1.8 - damit habe ich das JAR erstellt)
Optional: MySql-DB für Historie
MfG
Sissiwup
--------------------------------------------
CCu3,CCu2Gateway,RaspiGateway,LanGateway
--------------------------------------------
Sissiwup
--------------------------------------------
CCu3,CCu2Gateway,RaspiGateway,LanGateway
--------------------------------------------
-
- Beiträge: 325
- Registriert: 10.03.2015, 10:54
- Wohnort: Süd NDS
- Hat sich bedankt: 3 Mal
- Danksagung erhalten: 8 Mal
Re: RSSI - Optimierung mit Schnick-Schnack
Java:
Entpacken und rsi.propperties anpassen:
cache-Refresh: Er lädt nur einmal am Tag (default) die Namen, Defaultzuordnungen, Räume von der CCU.
Diese werden im tmp-path gespeichert und für die weiteren Läufe verwendet.
Entpacken und rsi.propperties anpassen:
Code: Alles auswählen
# CCU
ccu-user=Admin
ccu-passwd=<ccu-password>
# MySQL (on/off)
sql=on
sql-user=root
sql-passwd=<mysql-password>
sql-connect=jdbc:mysql://192.168.1.13:3306/zotac?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&autoReconnect=true&useSSL=false
sql-driver=com.mysql.cj.jdbc.Driver
sql-insert=INSERT INTO rssi (address,target,roaming,defintf,val1,val2)
# Sort ouput name/realname
sort=realname
# Pfade
tmp-path=/tmp/
# html (on/off)
html=on
html-file=rssi.html
# cache-Rfresh (yy-MM-dd_ / yy-MM-dd_hh_ / yy-MM-dd_hh_mm_ ) (t‰glich / st¸ndlich / min¸tlich)
cache-refresh=yy-MM-dd_
# debug (on/off)
debug=off
Diese werden im tmp-path gespeichert und für die weiteren Läufe verwendet.
Zuletzt geändert von sissiwup am 30.04.2018, 09:56, insgesamt 2-mal geändert.
MfG
Sissiwup
--------------------------------------------
CCu3,CCu2Gateway,RaspiGateway,LanGateway
--------------------------------------------
Sissiwup
--------------------------------------------
CCu3,CCu2Gateway,RaspiGateway,LanGateway
--------------------------------------------
-
- Beiträge: 325
- Registriert: 10.03.2015, 10:54
- Wohnort: Süd NDS
- Hat sich bedankt: 3 Mal
- Danksagung erhalten: 8 Mal
Re: RSSI - Optimierung mit Schnick-Schnack
JAVA-Code:
Rssi.java
Target.java
Maven:
Rssi.java
Code: Alles auswählen
package ccu2;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.TreeMap;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class Rssi {
public static void main(String[] args) throws JSONException {
final Rssi rs = new Rssi();
try {
rs.login();
final JSONArray rssi = rs.getRssiInfo();
final JSONObject devi = rs.getDevices();
final JSONObject rooms = rs.getRoomInfo();
rs.output(rssi,devi,rooms);
// System.out.println(rooms.toString(4));
} catch (final Exception e) {
System.out.println(e);
e.printStackTrace();
} finally {
rs.logoff();
}
}
private String ssid = "";
private String fname_dev ="dev.txt";
private String fname_all ="all.txt";
private String fname_rooms = "rooms.txt";
private String path_tmp = "";
private String file_html = "rssi.html";
private String dat = "";
private FileWriter html = null;
private Statement st = null;
private java.sql.Connection con = null;
private final HashMap<String, String> params = new HashMap<>();
private boolean debug = false;
private boolean sortName = true;
private int minrssi=0;
private int maxrssi=-999;
private long sumrssi=0;
private int anzrssi=0;
public Rssi() {
super();
readParameters();
debug = getPara("debug","off").compareToIgnoreCase("on")==0;
if (debug) {
System.out.println(params);
}
final Format formatter = new SimpleDateFormat(getPara("cache-refresh","yy-MM-dd_"));
dat = formatter.format(new Date());
fname_dev = dat+fname_dev;
fname_all = dat+fname_all;
fname_rooms = dat+fname_rooms;
path_tmp=getPara("tmp-path", "");
file_html=getPara("html-file", "rssi.html");
sortName=getPara("sort", "realname").compareToIgnoreCase("realname")==0;
if (getPara("html","on").compareToIgnoreCase("on")==0) {
try {
html = new FileWriter(file_html);
} catch (final IOException e) {
html = null;
}
}
}
private void calcRssi(int rssi) {
if (rssi<0) {
anzrssi++;
sumrssi=sumrssi+rssi;
if (rssi<minrssi) {
minrssi=rssi;
}
if (rssi>maxrssi) {
maxrssi=rssi;
}
}
}
public JSONObject getDeviceDesc(String dev) throws JSONException {
final JSONObject json = new JSONObject();
final JSONObject jpar = new JSONObject();
json.put("method","Interface.getDeviceDescription");
jpar.put("interface","BidCos-RF");
jpar.put("address",dev);
jpar.put("_session_id_",ssid);
json.put("params", jpar);
final JSONObject ret = httpCall(json);
final String txt = ret.getString("result");
// System.out.println("Dev-Desc:\n" + txt + "\n");
if (txt.compareToIgnoreCase("null")==0) { return new JSONObject(); }
final JSONObject jobj = new JSONObject(txt);
return jobj ;
}
public JSONArray getDeviceInfo() throws JSONException, IOException {
final JSONObject json = new JSONObject();
final JSONObject jpar = new JSONObject();
String txt;
try (BufferedReader br = new BufferedReader(new FileReader(path_tmp+fname_dev));) {
final StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line);
sb.append(System.lineSeparator());
line = br.readLine();
}
txt = sb.toString();
if (debug) {
System.out.println("Device-Info(cache):\n" + txt.substring(0, Math.min(1000, txt.length())) + "\n");
}
} catch (final IOException e) {
txt="";
}
if (txt.compareToIgnoreCase("")==0) {
json.put("method","Device.listAllDetail");
jpar.put("_session_id_",ssid);
json.put("params", jpar);
final JSONObject ret = httpCall(json);
txt = ret.getString("result");
if (debug) {
System.out.println("Device-Info:\n" + txt.substring(0, Math.min(1000, txt.length())) + "\n");
}
try (FileWriter file = new FileWriter(path_tmp+fname_dev)) {
file.write(txt);
}
}
final JSONArray jarr = new JSONArray(txt);
return jarr ;
}
public JSONObject getDevices() throws JSONException, IOException {
JSONObject json = new JSONObject();
String txt;
try (BufferedReader br = new BufferedReader(new FileReader(path_tmp+fname_all));) {
final StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line);
sb.append(System.lineSeparator());
line = br.readLine();
}
txt = sb.toString();
json = new JSONObject(txt);
if (debug) {
System.out.println("Dev(cache):\n" + txt.substring(0, Math.min(1000, txt.length())) + "\n");
}
} catch (final IOException e) {
txt="";
}
if (txt.compareToIgnoreCase("")==0) {
final JSONArray devi = getDeviceInfo();
for (int i=0;i<devi.length();i++) {
final JSONObject adev = devi.getJSONObject(i);
final JSONObject sub = new JSONObject();
sub.put("name", adev.getString("name"));
sub.put("type", adev.getString("type"));
sub.put("id", adev.getString("id"));
sub.put("interface", adev.getString("interface"));
final String address = adev.getString("address");
// sub.put("address", address);
final JSONObject devd = getDeviceDesc(address);
if (devd!=null && devd.length()>0) {
sub.put("roaming",devd.getString("roaming"));
sub.put("interface",devd.getString("interface"));
sub.put("firmware",devd.getString("firmware"));
}
final JSONArray ids = new JSONArray();
final JSONArray channels = adev.getJSONArray("channels");
for (int j=0;j<channels.length();j++) {
ids.put(channels.getJSONObject(j).get("id"));
}
sub.put("ids", ids);
json.put(address, sub);
// System.out.println(address);
}
txt = json.toString();
if (debug) {
System.out.println("Dev:\n" + txt.substring(0, Math.min(1000, txt.length())) + "\n");
}
try (FileWriter file = new FileWriter(path_tmp+fname_all)) {
file.write(txt);
}
}
return json;
}
public String getPara(String key,String def) {
String val = def;
try {
if ( params.containsKey(key)) {
final String rval = params.get(key);
if (rval!=null) {
val = rval;
}
}
} catch (final Exception e) {
System.out.println(e);
}
return val;
}
public JSONObject getRoomInfo() throws JSONException, IOException {
final JSONObject json = new JSONObject();
final JSONObject jpar = new JSONObject();
String txt;
try (BufferedReader br = new BufferedReader(new FileReader(path_tmp+fname_rooms));) {
final StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line);
sb.append(System.lineSeparator());
line = br.readLine();
}
txt = sb.toString();
if (debug) {
System.out.println("Room-Info(cache):\n" + txt.substring(0, Math.min(1000, txt.length())) + "\n");
}
} catch (final IOException e) {
txt="";
}
if (txt.compareToIgnoreCase("")==0) {
json.put("method","Room.getAll");
jpar.put("_session_id_",ssid);
json.put("params", jpar);
final JSONObject ret = httpCall(json);
txt = ret.getString("result");
if (debug) {
System.out.println("Room-Info:\n" + txt.substring(0, Math.min(1000, txt.length())) + "\n");
}
try (FileWriter file = new FileWriter(path_tmp+fname_rooms)) {
file.write(txt);
}
}
final JSONArray jarr = new JSONArray(txt);
final JSONObject rooms = new JSONObject();
for (int i=0;i<jarr.length();i++) {
final JSONObject akt = jarr.getJSONObject(i);
final String raumname = getString(akt, "name", "noroom");
final JSONArray ids = akt.getJSONArray("channelIds");
for (int j=0;j<ids.length();j++) {
final String key = ids.getString(j);
if (rooms.has(key)) {
rooms.getJSONArray(key).put(raumname);
} else {
rooms.put(key, new JSONArray().put(raumname));
}
}
}
return rooms ;
}
public JSONArray getRssiInfo() throws JSONException {
final JSONObject json = new JSONObject();
final JSONObject jpar = new JSONObject();
json.put("method","Interface.rssiInfo");
jpar.put("interface","BidCos-RF");
jpar.put("_session_id_",ssid);
json.put("params", jpar);
final JSONObject ret = httpCall(json);
final String txt = ret.getString("result");
if (debug) {
System.out.println("RSSI-Info:\n" + txt.substring(0, Math.min(1000, txt.length())) + "\n");
}
final JSONArray jarr = new JSONArray(txt);
return jarr ;
}
public String getString(JSONObject obj,String key, String def) {
String txt = def;
try {
txt = obj.getString(key);
} catch (final JSONException e) {
}
return txt;
}
public JSONObject httpCall(JSONObject json) {
final CloseableHttpClient httpClient = HttpClientBuilder.create().build();
try {
final HttpPost request = new HttpPost("http://192.168.1.11/api/homematic.cgi");
final StringEntity params = new StringEntity(json.toString());
// request.addHeader("content-type", "application/json");
request.setEntity(params);
final HttpResponse response = httpClient.execute(request);
// System.out.println(response);
final JSONObject result=result(response);
// System.out.println(result);
return result;
} catch (final Exception ex) {
System.out.println(ex);
ex.printStackTrace();
} finally {
try {
httpClient.close();
} catch (final IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return new JSONObject();
}
public String login() throws JSONException {
final JSONObject json = new JSONObject();
final JSONObject jpar = new JSONObject();
json.put("method","Session.login");
jpar.put("username",getPara("ccu-user","Admin"));
jpar.put("password", getPara("ccu-passwd",""));
json.put("params", jpar);
if (debug) {
System.out.println(json.toString(4));
}
final JSONObject ret = httpCall(json);
if (debug) {
System.out.println("SSID=" + ret.getString("result"));
}
ssid=ret.getString("result");
return ssid;
}
public boolean logoff() throws JSONException {
final JSONObject json = new JSONObject();
final JSONObject jpar = new JSONObject();
json.put("method","Session.logout");
jpar.put("_session_id_",ssid);
json.put("params", jpar);
final JSONObject ret = httpCall(json);
if (debug) {
System.out.println("Logoff:" + ret.getBoolean("result"));
}
return ret.getBoolean("result");
}
public void output(JSONArray rssi, JSONObject devi,JSONObject rooms) throws JSONException {
writeHtmlHead();
sqlConnect();
final HashMap<String, Integer> hmap = new HashMap<>();
for (int i =0;i<rssi.length();i++) {
final JSONObject saktrsi = rssi.getJSONObject(i);
final String saddress = saktrsi.getString("name");
String name = saddress;
if (sortName) {
try {
final JSONObject saktdev = devi.getJSONObject(saddress);
name=getString(saktdev, "name", saddress);
} catch (final JSONException e) {
}
}
hmap.put(name, i);
}
final Map<String,Integer> map = new TreeMap<>(hmap);
for(final Map.Entry<String,Integer> entry : map.entrySet()) {
final JSONObject aktrsi = rssi.getJSONObject(entry.getValue());
final String address = aktrsi.getString("name");
final JSONArray aktpartner = aktrsi.getJSONArray("partner");
JSONObject aktdev = null;
String intf = "";
String id = "";
String roaming = "";
final ArrayList<String> room = new ArrayList<>();
try {
aktdev = devi.getJSONObject(address);
intf=getString(aktdev, "interface", "");
id=getString(aktdev, "id", "");
roaming=getString(aktdev,"roaming","");
// System.out.println(address + " id="+id);
if (rooms.has(id)) {
final JSONArray roomList = rooms.getJSONArray(id);
for (int i=0;i<roomList.length();i++) {
final String r=roomList.getString(i);
if (!room.contains(r)) {
room.add(r);
}
}
}
final JSONArray ids=aktdev.getJSONArray("ids");
for (int c=0;c<ids.length();c++) {
final String aid = ids.getString(c);
if (rooms.has(aid)) {
final JSONArray roomList = rooms.getJSONArray(aid);
for (int i=0;i<roomList.length();i++) {
final String r=roomList.getString(i);
if (!room.contains(r)) {
room.add(r);
}
}
}
}
} catch (final JSONException e) {
}
// System.out.println(aktpartner.toString(4));
final ArrayList<String> target = new ArrayList<>();
final ArrayList<Target> htmlTarget = new ArrayList<>();
for (int j=0;j<aktpartner.length();j++) {
final JSONObject partner = aktpartner.getJSONObject(j);
final JSONArray rssiData = partner.getJSONArray("rssiData");
final String name = partner.getString("name");
final boolean defInterf = name.compareToIgnoreCase(intf)==0?true:false;
final String defIntTxt = defInterf?"!":" ";
final int empf0 = rssiData.getInt(0);
final int empf1 = rssiData.getInt(1);
calcRssi(empf0);
calcRssi(empf1);
final String empf = ""+(empf0<0?empf0:"0")+"/"+(empf1<0?empf1:"0");
try {
final JSONObject dev = devi.getJSONObject(name);
target.add(defIntTxt+dev.getString("name")+defIntTxt+"("+name+")"+":"+empf);
htmlTarget.add(new Target(name,dev.getString("name"),defInterf,empf0,empf1));
} catch (final JSONException ex) {
target.add(defIntTxt+name+defIntTxt+":"+empf);
htmlTarget.add(new Target(name,"",defInterf,empf0,empf1));
}
}
final String r = String.join(",", room);
final String p = String.join(",", target);
final String ro = roaming.compareToIgnoreCase("true")==0?"(+)":"(-)";
if (aktdev == null) {
if (debug) {
System.out.println(address + "("+address+")"+"<Interface>" + r + ro + p);
}
writeHtmlTable(address,"","<Interface>",roaming.compareToIgnoreCase("true")==0,room,htmlTarget);
sqlWrite(address,roaming.compareToIgnoreCase("true")==0,htmlTarget);
} else {
if (debug) {
System.out.println(aktdev.getString("name")+"("+address+")"+"<"+aktdev.getString("type")+">" +r+ ro + p);
}
writeHtmlTable(address,aktdev.getString("name"),aktdev.getString("type"),roaming.compareToIgnoreCase("true")==0,room,htmlTarget);
sqlWrite(address,roaming.compareToIgnoreCase("true")==0,htmlTarget);
}
}
writeHtmlFoot(rssi.length());
sqlStat();
sqlDisconnect();
}
public void readParameters() {
try {
final File file = new File("rssi.properties");
final FileInputStream fileInput = new FileInputStream(file);
final Properties properties = new Properties();
properties.load(fileInput);
fileInput.close();
@SuppressWarnings("rawtypes")
final Enumeration enuKeys = properties.keys();
while (enuKeys.hasMoreElements()) {
final String key = (String) enuKeys.nextElement();
final String value = properties.getProperty(key);
params.put(key, value);
}
} catch (final FileNotFoundException e) {
e.printStackTrace();
} catch (final IOException e) {
e.printStackTrace();
}
}
public JSONObject result(HttpResponse response) throws UnsupportedOperationException, IOException, JSONException {
final BufferedReader rd = new BufferedReader(
new InputStreamReader(response.getEntity().getContent()));
final StringBuffer result = new StringBuffer();
String line = "";
while ((line = rd.readLine()) != null) {
result.append(line);
}
final JSONObject json = new JSONObject(result.toString());
if (debug) {
System.out.println(json);
}
return json;
}
public void sqlConnect() {
final String myDriver = getPara("sql-driver","com.mysql.cj.jdbc.Driver");
if (getPara("sql","on").compareToIgnoreCase("on")==0) {
try {
Class.forName(myDriver);
final String url = getPara("sql-connect","jdbc:mysql://192.168.1.13:3306/zotac?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&autoReconnect=true&useSSL=false");
final String user = getPara("sql-user","root");
final String password = getPara("sql-passwd","");
try {
con = DriverManager.getConnection(url, user, password);
st = con.createStatement();
}
catch (final SQLException ex) {
System.out.println(ex);
}
} catch (final ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void sqlDisconnect() {
if (con==null) {
return;
}
try {
con.close();
}
catch (final SQLException ex) {
System.out.println(ex);
}
}
public void sqlStat() {
if (st==null) {
return;
}
try {
String ins="INSERT INTO ereignisse (name,dval,tval)"+ " " +
"VALUES (\"RSSI\","+(float)sumrssi/anzrssi+ ",\""+anzrssi+"\");";
st.executeUpdate(ins);
ins="INSERT INTO ereignisse (name,dval)"+ " " +
"VALUES (\"RSSI-min\","+minrssi+ ");";
st.executeUpdate(ins);
ins="INSERT INTO ereignisse (name,dval)"+ " " +
"VALUES (\"RSSI-max\","+maxrssi+ ");";
st.executeUpdate(ins);
}
catch (final SQLException ex) {
System.out.println(ex);
}
}
public void sqlWrite(String name, boolean roaming, ArrayList<Target> target) {
if (st==null) {
return;
}
try {
for (final Target t : target) {
final String ins=getPara("sql-insert","INSERT INTO rssi (address,target,roaming,defintf,val1,val2)") + " " +
"VALUES (\""+name+"\"," +
"\""+t.name+"\"," +
roaming + "," + t.defInterf + "," + t.rsi0 + "," +t.rsi1+");";
// System.out.println(ins);
st.executeUpdate(ins);
}
}
catch (final SQLException ex) {
System.out.println(ex);
}
}
public void writeHtml(String txt) {
if (html!=null) {
try {
html.write(txt+"\n");
html.flush();
} catch (final IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void writeHtmlFoot(int anz) {
writeHtml("</tbody>");
writeHtml("</table>");
final Format formatter = new SimpleDateFormat("hh:mm:ss dd.MM.yyyy");
final String gdat = formatter.format(new Date());
writeHtml("Geräte:"+anz + " Generiert:"+gdat +"<br>RSSI min:"+minrssi + " max:"+maxrssi + " Anzahl=" +anzrssi + " Durchschnitt:" + (float)sumrssi/anzrssi);
writeHtml("</body>");
writeHtml("</html>");
System.out.println("Geräte:"+anz + " Generiert:"+gdat +"\nRSSI min:"+minrssi + " max:"+maxrssi + " Anzahl=" +anzrssi + " Durchschnitt:" + (float)sumrssi/anzrssi);
}
public void writeHtmlHead() {
writeHtml("<html>");
writeHtml("<head>");
writeHtml("<title>RSSI-Info</title>");
writeHtml("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />");
writeHtml("</head>");
writeHtml("<body bgcolor = \"#ffffcc\" text = \"#000000\">");
writeHtml("<h1>RSSI-Info</h1>");
writeHtml("<table border=\"1\" style=\"white-space:nowrap;\">");
writeHtml("<tbody>");
}
public void writeHtmlTable(String name,String realName,String typ, boolean roaming, ArrayList<String> rooms,ArrayList<Target> target) {
// System.out.println("HTML-TAB"+name);
writeHtml("<tr>");
writeHtml("<td rowspan=\"2\" align=\"left\" valign=\"middle\">");
writeHtml(realName+"<br>"+name);
writeHtml("</td>");
writeHtml("<td rowspan=\"2\" align=\"left\" valign=\"middle\">");
final String r = String.join(",", rooms);
writeHtml(r+"<br>"+typ+(roaming?"/Roaming":""));
writeHtml("</td>");
//sort
final HashMap<String, Integer> hmap = new HashMap<>();
for (int i=0;i<target.size();i++) {
final Target t = target.get(i);
final String saddress = t.realname.length()==0?t.name:t.realname;
hmap.put(saddress, i);
}
final Map<String,Integer> map = new TreeMap<>(hmap);
//end sort
for(final Map.Entry<String,Integer> entry : map.entrySet()) {
final Target t = target.get(entry.getValue());
String col="bgcolor=\"#A0A0A0\"";
if (t.defInterf) {col="bgcolor=\"#FFFF00\"";}
writeHtml("<td colspan=\"2\" align=\"center\" valign=\"middle\" "+col+" >");
writeHtml(t.realname+"<br>"+t.name);
writeHtml("</td>");
}
writeHtml("</tr>");
writeHtml("<tr>");
for(final Map.Entry<String,Integer> entry : map.entrySet()) {
final Target t = target.get(entry.getValue());
String col="bgcolor=\"#00FF00\"";
String hexc;
hexc=Integer.toHexString(-t.rsi0);
col = t.rsi0==0?"":"bgcolor=\"#"+hexc+"FF00\"";
writeHtml("<td "+col+" >");
writeHtml(t.rsis0);
writeHtml("</td>");
hexc=Integer.toHexString(-t.rsi1);
col = t.rsi1==0?"": "bgcolor=\"#"+hexc+"FF00\"";
writeHtml("<td "+col+" >");
writeHtml(t.rsis1);
writeHtml("</td>");
}
writeHtml("</tr>");
}
}
Code: Alles auswählen
package ccu2;
public class Target {
String name;
String realname;
boolean defInterf;
int rsi0;
String rsis0;
int rsi1;
String rsis1;
public Target(String name, String realname, boolean defInterf, int rsi0, int rsi1) {
super();
this.name = name;
this.realname = realname;
this.defInterf = defInterf;
this.rsi0 = rsi0<0?rsi0:0;
this.rsi1 = rsi1<0?rsi1:0;
rsis0 = this.rsi0==0?"":String.valueOf(this.rsi0);
rsis1 = this.rsi1==0?"":String.valueOf(this.rsi1);
}
@Override
public String toString() {
return "Target [name=" + name + ", realname=" + realname + ", defInterf=" + defInterf + ", rsi0=" + rsi0
+ ", rsi1=" + rsi1 + "]";
}
}
Code: Alles auswählen
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ccu2</groupId>
<artifactId>ccu2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>RSSI</name>
<description>Auslesen RSSI</description>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.hp.hpl.jena</groupId>
<artifactId>json-jena</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.9</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
</dependencies>
</project>
MfG
Sissiwup
--------------------------------------------
CCu3,CCu2Gateway,RaspiGateway,LanGateway
--------------------------------------------
Sissiwup
--------------------------------------------
CCu3,CCu2Gateway,RaspiGateway,LanGateway
--------------------------------------------
-
- Beiträge: 325
- Registriert: 10.03.2015, 10:54
- Wohnort: Süd NDS
- Hat sich bedankt: 3 Mal
- Danksagung erhalten: 8 Mal
Re: RSSI - Optimierung mit Schnick-Schnack
SQL-Tabelle:
Mit beiden Indizes für mein grafana
Code: Alles auswählen
CREATE TABLE `rssi` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'Key',
`ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Zeit',
`address` text COLLATE latin1_german1_ci NOT NULL COMMENT 'von Datenpunkt',
`target` text COLLATE latin1_german1_ci NOT NULL COMMENT 'zu Datenpunkt',
`roaming` tinyint(1) DEFAULT '0' COMMENT 'Roaming',
`defintf` tinyint(1) DEFAULT '0' COMMENT 'Default Interface',
`val1` int(11) DEFAULT NULL COMMENT 'RSSI von',
`val2` int(11) DEFAULT NULL COMMENT 'RSSI an',
PRIMARY KEY (`id`),
UNIQUE KEY `addr_target_ts` (`address`(10),`target`(10),`ts`),
KEY `ts_address_target` (`ts`,`address`(10),`target`(10))
) ENGINE=InnoDB AUTO_INCREMENT=41477 DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci
MfG
Sissiwup
--------------------------------------------
CCu3,CCu2Gateway,RaspiGateway,LanGateway
--------------------------------------------
Sissiwup
--------------------------------------------
CCu3,CCu2Gateway,RaspiGateway,LanGateway
--------------------------------------------
-
- Beiträge: 325
- Registriert: 10.03.2015, 10:54
- Wohnort: Süd NDS
- Hat sich bedankt: 3 Mal
- Danksagung erhalten: 8 Mal
Re: RSSI - Optimierung mit Schnick-Schnack
Folgende schicke Auswertungen kann man dann mit grafana fahren:
Zeigt die Verbindungen für ein Gerät. (Die 0, oder 1 zeigt das Defaultgateway)
Hier sieht man, dass LEQ (CCU) meist ganz gut ist, aber OEQ(Pi) mal getestet werden könnte.
Die Verbindungen zu den Ventilen sind ok.
(hier verwende ich noch die temp. Tabelle der Gerätenamen um sprechende Namen etc zu erzeugen
=> siehe Beitrag über grafana im ioBroker-Forum von mir)
$sname ist der Name des Geräts, über Variable definiert.
Hier schaue ich mir einen Raum an. VS-10 (Fenster-Kontakt sieht nicht so super aus)
Also nochmal schnell im Detail:
Also vlt. auf LEQ wechseln?
Wer hatte denn in den letzten 6h einen Pegel über 90? (90 über Variable auswählbar)
Und zu guter Letzt, was macht die Statistik:
Zeigt die Verbindungen für ein Gerät. (Die 0, oder 1 zeigt das Defaultgateway)
Hier sieht man, dass LEQ (CCU) meist ganz gut ist, aber OEQ(Pi) mal getestet werden könnte.
Die Verbindungen zu den Ventilen sind ok.
Code: Alles auswählen
SELECT
$__time(ts),
-val2 as value,
concat(n.sname, "->" ,target," ",defIntf) as metric
FROM zotac.rssi r,iobroker.namen n
WHERE $__timeFilter(ts) and r.address=n.address and n.raum != "-" and n.sname="$sname"
ORDER BY defintf desc,ts ASC,target asc
=> siehe Beitrag über grafana im ioBroker-Forum von mir)
$sname ist der Name des Geräts, über Variable definiert.
Hier schaue ich mir einen Raum an. VS-10 (Fenster-Kontakt sieht nicht so super aus)
Code: Alles auswählen
SELECT
$__time(ts),
-val2 as value,
concat(n.sname, "->" ,target) as metric
FROM zotac.rssi r,iobroker.namen n
WHERE $__timeFilter(ts) and r.address=n.address and n.raum != "-" and n.raum="$raum" and r.defIntf=1
ORDER BY ts ASC
Wer hatte denn in den letzten 6h einen Pegel über 90? (90 über Variable auswählbar)
Code: Alles auswählen
SELECT
$__time(r.ts),
-val2 as value,
concat(n.sname, "->" ,r.target,"/",n.raum) as metric
FROM zotac.rssi r,iobroker.namen n
WHERE $__timeFilter(r.ts) and r.address=n.address and n.raum != "-" and
$level<(select max(-z.val2) from zotac.rssi z where $__timeFilter(z.ts) and z.address = r.address and z.target=r.target) and
r.defIntf=1
ORDER BY n.sname,r.ts ASC
MfG
Sissiwup
--------------------------------------------
CCu3,CCu2Gateway,RaspiGateway,LanGateway
--------------------------------------------
Sissiwup
--------------------------------------------
CCu3,CCu2Gateway,RaspiGateway,LanGateway
--------------------------------------------
-
- Beiträge: 325
- Registriert: 10.03.2015, 10:54
- Wohnort: Süd NDS
- Hat sich bedankt: 3 Mal
- Danksagung erhalten: 8 Mal
Re: RSSI - Optimierung mit Schnick-Schnack
Hallo,
ein kleines Update:
Uhrzeit auf 24 Stundenformat umgestellt.
Rot wird gekennzeichnet wenn es einen besseres Gateway/Interface als das aktuell eingestellte gibt.
Es wird eine zweite Statistik der aktuell verwendeten Gateways generiert, d.h. es werden nur die gelb hinterlegten Spalten herangezogen.
ein kleines Update:
Uhrzeit auf 24 Stundenformat umgestellt.
Rot wird gekennzeichnet wenn es einen besseres Gateway/Interface als das aktuell eingestellte gibt.
Es wird eine zweite Statistik der aktuell verwendeten Gateways generiert, d.h. es werden nur die gelb hinterlegten Spalten herangezogen.
MfG
Sissiwup
--------------------------------------------
CCu3,CCu2Gateway,RaspiGateway,LanGateway
--------------------------------------------
Sissiwup
--------------------------------------------
CCu3,CCu2Gateway,RaspiGateway,LanGateway
--------------------------------------------
-
- Beiträge: 325
- Registriert: 10.03.2015, 10:54
- Wohnort: Süd NDS
- Hat sich bedankt: 3 Mal
- Danksagung erhalten: 8 Mal
Re: RSSI - Optimierung mit Schnick-Schnack
Hi,
hier das Skript um es regelmäßig auszuführen:
Ich schiebe die Datei direkt ins Verzeichnis meines Webservers.
Anschließend Passe ich die Rechte an.
Die Zeile mit SED verpasst den unterschiedlichen Gateways eine zweite Zeile mit einen besser lesbaren Namen.
(Bei mir 4 Stück-Ein Block geht immer bis zum ";")
hier das Skript um es regelmäßig auszuführen:
Code: Alles auswählen
#!/bin/bash
NOW=$(date +"%g_%m_%d")
logfile=/var/skripte/rssi.log
echo "$(date) Starte rssi" >> $logfile
cd /var/skripte
if [ $1 == new ]
then
echo Lösche Defaults
rm /tmp/*_all.txt
rm /tmp/*_dev.txt
rm /tmp/*_rooms.txt
fi
java -jar rssi.jar >> $logfile
chown -R www-data:www-data /var/www/html/rssi.html
sed -i "s/<br>CCU2GW0001/CCU2-WZ<br>CCU2GW0001/g;s/<br>NEQ1694131/Gate-DG<br>NEQ
1694131/g;s/<br>OEQ0608058/PI-Buero<br>OEQ0608058/g;s/<br>PEQ1949826/CCU3-EG<br>
PEQ1949826/g" /var/www/html/rssi.html
echo "$(date) Ende rssi" >> $logfile
Anschließend Passe ich die Rechte an.
Die Zeile mit SED verpasst den unterschiedlichen Gateways eine zweite Zeile mit einen besser lesbaren Namen.
(Bei mir 4 Stück-Ein Block geht immer bis zum ";")
MfG
Sissiwup
--------------------------------------------
CCu3,CCu2Gateway,RaspiGateway,LanGateway
--------------------------------------------
Sissiwup
--------------------------------------------
CCu3,CCu2Gateway,RaspiGateway,LanGateway
--------------------------------------------