RSSI - Optimierung mit Schnick-Schnack

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

Antworten
sissiwup
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

Beitrag von sissiwup » 30.04.2018, 09:24

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:
Bildschirmfoto 2018-04-30 um 09.05.05.png
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:
Bildschirmfoto 2018-04-30 um 09.07.07.png
Bildschirmfoto 2018-04-30 um 09.20.33.png
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:
Bildschirmfoto 2018-04-30 um 09.15.48.png
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
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

Beitrag von sissiwup » 30.04.2018, 09:50

Java:
rssi.zip
(4.03 MiB) 134-mal heruntergeladen
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
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.
Zuletzt geändert von sissiwup am 30.04.2018, 09:56, insgesamt 2-mal geändert.
MfG

Sissiwup

--------------------------------------------
CCu3,CCu2Gateway,RaspiGateway,LanGateway
--------------------------------------------

sissiwup
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

Beitrag von sissiwup » 30.04.2018, 09:54

JAVA-Code:

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

}
Target.java

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 + "]";
	}
}
Maven:

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
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

Beitrag von sissiwup » 30.04.2018, 10:00

SQL-Tabelle:

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 
Mit beiden Indizes für mein grafana
Bildschirmfoto 2018-04-30 um 09.59.17.png
MfG

Sissiwup

--------------------------------------------
CCu3,CCu2Gateway,RaspiGateway,LanGateway
--------------------------------------------

sissiwup
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

Beitrag von sissiwup » 01.05.2018, 15:18

Folgende schicke Auswertungen kann man dann mit grafana fahren:
Bildschirmfoto 2018-05-01 um 15.04.47.png
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
(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.
Bildschirmfoto 2018-05-01 um 15.10.45.png
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
Also nochmal schnell im Detail:
Bildschirmfoto 2018-05-01 um 15.12.11.png
Also vlt. auf LEQ wechseln?
Bildschirmfoto 2018-05-01 um 15.13.41.png
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
Und zu guter Letzt, was macht die Statistik:
Bildschirmfoto 2018-05-01 um 15.17.03.png
MfG

Sissiwup

--------------------------------------------
CCu3,CCu2Gateway,RaspiGateway,LanGateway
--------------------------------------------

sissiwup
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

Beitrag von sissiwup » 22.12.2018, 02:31

Hallo,

ein kleines Update:

Uhrzeit auf 24 Stundenformat umgestellt.
Bildschirmfoto 2018-12-22 um 02.26.59.png
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.
rssi.jar.zip
(19.58 KiB) 110-mal heruntergeladen
MfG

Sissiwup

--------------------------------------------
CCu3,CCu2Gateway,RaspiGateway,LanGateway
--------------------------------------------

sissiwup
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

Beitrag von sissiwup » 06.03.2019, 23:13

Hi,

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
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 ";")
MfG

Sissiwup

--------------------------------------------
CCu3,CCu2Gateway,RaspiGateway,LanGateway
--------------------------------------------

Antworten

Zurück zu „Projektvorstellungen“