commit 286e0250676e7725ea632169ca3ea69298892333 Author: Tobias Peper Date: Fri Jul 5 23:58:19 2024 +0200 Erste Version in gitea diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..7a9a105 --- /dev/null +++ b/.classpath @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c8ee1df --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/target/ +/dependency-reduced-pom.xml diff --git a/.project b/.project new file mode 100644 index 0000000..4c63c10 --- /dev/null +++ b/.project @@ -0,0 +1,23 @@ + + + meter-to-influx + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..49859d0 --- /dev/null +++ b/pom.xml @@ -0,0 +1,58 @@ + + 4.0.0 + info.peper + meter-to-influx + 0.0.1-SNAPSHOT + + 8 + 8 + + + + + com.fazecast + jSerialComm + 2.11.0 + + + + com.squareup.okhttp3 + okhttp + 4.12.0 + + + + com.google.code.gson + gson + 2.11.0 + + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.6.0 + + + package + + shade + + + + + + info.peper.serialtest.SerialTestMain + + + + + + + + + diff --git a/sml.dat b/sml.dat new file mode 100644 index 0000000..16d684f Binary files /dev/null and b/sml.dat differ diff --git a/src/main/java/info/peper/serialtest/DecodeSmlMain.java b/src/main/java/info/peper/serialtest/DecodeSmlMain.java new file mode 100644 index 0000000..7e01379 --- /dev/null +++ b/src/main/java/info/peper/serialtest/DecodeSmlMain.java @@ -0,0 +1,45 @@ +package info.peper.serialtest; + +import java.io.IOException; +import java.io.InputStream; + +public class DecodeSmlMain { + + private static final int[] SEQ = new int[] {0x77, 0x07, 0x01, 0x00, 0x10, 0x07, 0x00, 0xff, 0x01, 0x01, 0x62, 0x1b, 0x52, 0x00}; + + public static void decode(final InputStream is, final NewValueListener listener) throws IOException { + int curPos = 0; + int readStatus = 0; + int value = 0; + int readByte; + do { + readByte = is.read(); + if (readByte != -1) { + if (readStatus == 0) { + if (readByte == SEQ[curPos]) { + curPos++; + } else { + curPos = 0; + } + if (curPos == SEQ.length) { + curPos = 0; + readStatus = Integer.MAX_VALUE; + } + } else if (readStatus == Integer.MAX_VALUE) { + if ((readByte & 0xF0) == 80) { + readStatus = readByte & 0x0F - 1; + } + } else { + value *= 256; + value += readByte; + readStatus--; + if (readStatus == 0) { + listener.newValue(value); + value = 0; + } + } + } + } while (readByte != -1); + } + +} diff --git a/src/main/java/info/peper/serialtest/NewValueListener.java b/src/main/java/info/peper/serialtest/NewValueListener.java new file mode 100644 index 0000000..0cf63a4 --- /dev/null +++ b/src/main/java/info/peper/serialtest/NewValueListener.java @@ -0,0 +1,5 @@ +package info.peper.serialtest; + +public interface NewValueListener { + void newValue(int value); +} diff --git a/src/main/java/info/peper/serialtest/SerialTestMain.java b/src/main/java/info/peper/serialtest/SerialTestMain.java new file mode 100644 index 0000000..c4f29f4 --- /dev/null +++ b/src/main/java/info/peper/serialtest/SerialTestMain.java @@ -0,0 +1,39 @@ +package info.peper.serialtest; + +import java.io.InputStream; + +import com.fazecast.jSerialComm.SerialPort; + +public class SerialTestMain { + + public static void main(String[] args) throws Exception { + for (SerialPort port : SerialPort.getCommPorts()) { + System.out.println(port.getSystemPortName() + ": " + port.getDescriptivePortName()); + } + + if (SerialPort.getCommPorts().length == 1) { + SerialPort serialPort = SerialPort.getCommPorts()[0]; + if (!serialPort.setComPortParameters(9600, 8, 1, SerialPort.NO_PARITY)) { + System.err.println("ComPortParameter konnten nicht korrekt gesetzt werden."); + System.exit(1); + } + if (!serialPort.setComPortTimeouts(SerialPort.TIMEOUT_READ_BLOCKING, 0, 0)) { + System.err.println("ComPortTimeouts konnten nicht korrekt gesetzt werden."); + System.exit(1); + } + serialPort.openPort(); + final NewValueListener listener = new NewValueListener() { + + @Override + public void newValue(int value) { + System.out.println(value); + } + }; + try (InputStream is = serialPort.getInputStream();) { + DecodeSmlMain.decode(is, listener); + } + serialPort.closePort(); + } + } + +} diff --git a/src/main/java/info/peper/shelly/ReadShellyCloudMain.java b/src/main/java/info/peper/shelly/ReadShellyCloudMain.java new file mode 100644 index 0000000..354ddd7 --- /dev/null +++ b/src/main/java/info/peper/shelly/ReadShellyCloudMain.java @@ -0,0 +1,69 @@ +package info.peper.shelly; + +import java.io.Reader; + +import com.google.gson.Gson; +import com.google.gson.stream.JsonReader; + +import okhttp3.FormBody; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +public class ReadShellyCloudMain { + + public static void main(String[] args) throws Exception { + final OkHttpClient httpClient = new OkHttpClient(); + final RequestBody requestBody = new FormBody.Builder() + .add("auth_key", "MmQ3ZHVpZA71BA656BE0DBDA1FF163B0F97EB1E902B18B3F3E45EFBCC78AC533A3BF52B91279C42553A06482D6") + .add("id", "483fdacbefe0") + .build(); + final Request request = new Request.Builder().url("https://shelly-8-eu.shelly.cloud/device/status") + .post(requestBody) + .build(); + final Response response = httpClient.newCall(request).execute(); + if (response.isSuccessful()) { +// System.out.println(response.body().string()); + final Reader bodyReader = response.body().charStream(); + final Gson gson = new Gson(); + final JsonReader jsonReader = gson.newJsonReader(bodyReader); + jsonReader.beginObject(); + int level = 0; + int phase = 0; + while (jsonReader.hasNext()) { + final String name = jsonReader.nextName(); + if ("data".equals(name) && level == 0) { + jsonReader.beginObject(); + level++; + } else if ("device_status".equals(name) && level == 1) { + jsonReader.beginObject(); + level++; + } else if ("emeters".equals(name) && level == 2) { + jsonReader.beginArray(); + jsonReader.beginObject(); + phase = 1; + level++; + } else if ("power".equals(name) && level == 3) { + System.out.println("Phase: " + phase + " / Verbrauch: " + jsonReader.nextDouble()); + while (jsonReader.hasNext()) { + jsonReader.nextName(); + jsonReader.skipValue(); + } + jsonReader.endObject(); + if (jsonReader.hasNext()) { + phase++; + jsonReader.beginObject(); + } + } else { + jsonReader.skipValue(); + } +// if ("apower".equals(name)) { +// System.out.println("- " + jsonReader.nextDouble()); +// } else { +// } + } + } + } + +} diff --git a/src/main/java/info/peper/shelly/ReadShellyLocalMain.java b/src/main/java/info/peper/shelly/ReadShellyLocalMain.java new file mode 100644 index 0000000..8e93a8b --- /dev/null +++ b/src/main/java/info/peper/shelly/ReadShellyLocalMain.java @@ -0,0 +1,34 @@ +package info.peper.shelly; + +import java.io.Reader; + +import com.google.gson.Gson; +import com.google.gson.stream.JsonReader; + +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +public class ReadShellyLocalMain { + + public static void main(String[] args) throws Exception { + final OkHttpClient httpClient = new OkHttpClient(); + final Request request = new Request.Builder().url("http://photovoltaik/rpc/Switch.GetStatus?id=0").build(); + final Response response = httpClient.newCall(request).execute(); + if (response.isSuccessful()) { + final Reader bodyReader = response.body().charStream(); + final Gson gson = new Gson(); + final JsonReader jsonReader = gson.newJsonReader(bodyReader); + jsonReader.beginObject(); + while (jsonReader.hasNext()) { + final String name = jsonReader.nextName(); + if ("apower".equals(name)) { + System.out.println(jsonReader.nextDouble()); + } else { + jsonReader.skipValue(); + } + } + } + } + +}