From 286e0250676e7725ea632169ca3ea69298892333 Mon Sep 17 00:00:00 2001 From: Tobias Peper Date: Fri, 5 Jul 2024 23:58:19 +0200 Subject: [PATCH] Erste Version in gitea --- .classpath | 40 ++++++++++ .gitignore | 2 + .project | 23 ++++++ pom.xml | 58 +++++++++++++++ sml.dat | Bin 0 -> 2000 bytes .../info/peper/serialtest/DecodeSmlMain.java | 45 ++++++++++++ .../peper/serialtest/NewValueListener.java | 5 ++ .../info/peper/serialtest/SerialTestMain.java | 39 ++++++++++ .../peper/shelly/ReadShellyCloudMain.java | 69 ++++++++++++++++++ .../peper/shelly/ReadShellyLocalMain.java | 34 +++++++++ 10 files changed, 315 insertions(+) create mode 100644 .classpath create mode 100644 .gitignore create mode 100644 .project create mode 100644 pom.xml create mode 100644 sml.dat create mode 100644 src/main/java/info/peper/serialtest/DecodeSmlMain.java create mode 100644 src/main/java/info/peper/serialtest/NewValueListener.java create mode 100644 src/main/java/info/peper/serialtest/SerialTestMain.java create mode 100644 src/main/java/info/peper/shelly/ReadShellyCloudMain.java create mode 100644 src/main/java/info/peper/shelly/ReadShellyLocalMain.java 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 0000000000000000000000000000000000000000..16d684fc3c3a6b4262e173afd8a7942d8581916f GIT binary patch literal 2000 zcmb7_zl#%55XaxVELlk!?c`QZ!6t>3u#Jddm*NUJ5xmM{A87>xNov6=ofa0N9%A7? zU=gy(CY^A@~P~h=|Xbc|Z1LZ?lJKvdK=~em~#u%p^&Y1R^0I6PXwe@B+pF zu@F&fI_q}Q-Y|nfGy~PXE5=wSU0n>5SnFO4BI{_)Rrrh11iv^0fd1YA7VtG*wuDT3 z{25LOJrHyzR%enfV$c9tvM=!XmOEa;eNf*o34!{O9oW4|?|3ed2o!6i3OaZk(Fdca z>jXt8A|es=>UKy^Rm3@nhWmOTHK2Nto{k0Tc!lNa@ik;cDI~&6(6=iRoCxpNJa~>Z zWDe?{tTRsI3(NNoymxcs-4#}Bv>O9SRuh9UbDr%I%-6R+&~=F}6BW5^Ziw{r9S*=? zlHIrD5lmSdxh_MypZ>064O$~Vj+%q|ba@MEP`%kOIkiX?8ET2SaVRr`l{?;_gcSnw zom$?PnC*=>9+{h{(r8y7)Q|_@3yWe0qcvTC`tZ$Tmz`(>c75luF_DFz5<4Qy8+Zg0 z5N1%27waABFRo`+|22W);bE-LuwB&IQ6pzRui@O7{y+~}j?Y_y%HDZWHqQ)Qi0bCg zrnIaybqGvjSv!;*FfxUqF4+T{Y6yFTunmjj%Y`kRcE=T)m^3g2sA9IA(=HMpC=XeI zoX7h3u)dMYXstZa1b|R~CF_!PB0ZrxkRb z)I$djmC&eebwak-`jUZcE8FKd*uMtW@2S-WY#8wif<0qGF2{8T9$nm$t>4J&K)W@2 z4Jv={K&f+S4fp*PUXPHGljMJo|JlH6N2bFVxjoFS+MUEnzP{d=q&j~RsN>B30j=Y$ AtpET3 literal 0 HcmV?d00001 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(); + } + } + } + } + +}