From e61d04cc5a6a2e28475067b97443c0494292da38 Mon Sep 17 00:00:00 2001 From: Tobias Peper Date: Sun, 7 Jul 2024 17:50:48 +0200 Subject: [PATCH] Aktueller Stand --- sml-180-190-watt-einspeisung.dat | Bin 0 -> 9973 bytes sml-neg.dat | Bin 0 -> 5000 bytes src/main/java/TestCalcMain.java | 10 +++ .../ShellyPlus1PmCloudReader.java | 70 ++++++++++++++++++ .../metertoinflux/TestMeterReaderMain.java | 6 ++ .../info/peper/serialtest/DecodeSmlMain.java | 22 +++++- .../info/peper/serialtest/SerialTestMain.java | 10 ++- 7 files changed, 112 insertions(+), 6 deletions(-) create mode 100644 sml-180-190-watt-einspeisung.dat create mode 100644 sml-neg.dat create mode 100644 src/main/java/TestCalcMain.java create mode 100644 src/main/java/info/peper/metertoinflux/ShellyPlus1PmCloudReader.java diff --git a/sml-180-190-watt-einspeisung.dat b/sml-180-190-watt-einspeisung.dat new file mode 100644 index 0000000000000000000000000000000000000000..d2eafdea840961489f1dd576a0b85fbf950e0bcc GIT binary patch literal 9973 zcmbu_TWDNG7zgnAHZiNQY1M~Px}p#DAr?gx(g&#sHf>s{B2ikjC~+sDipJDpTl&ya zB0@mH$5Iq58eghyQ46hTq)q>Y^Y!eW z|8Kr?nK_L_A`uWj$Lkq`D2uYAUE(ir93aeCeZyev&PLd~|AjghYH2 z{tlt_9l~%T>;*qn|2zyV+UR-fdmTF=Hgr7Ze;Gi%_)M{n*Z|D)H&pExY=_&K*TwGL zSHHe{^uBhlD>R1;M3a} z6VW4Ep(*VD=^um2AYOHFYu_0M9zAAl5O*_(s|~OuHQ4PN-0_mu;KB`)!4NeV0)F$5 zwZV{^!I0VjOTr*i+Xt;aLH)a0g55_<1jCeI7^?Scm`Y6YIYZW0)w0wch$T(uS$aT6F(cLA1U z1l}J1O!)mbt-C4szY0wBhCWvK5Gpys|7I5 zlV{ZeSds~}ftbvz=Eu36rtEVx`yB9pzOl|e=azj=ogGUedr>m_;v$f|TRZ-P+f4>3 zYLEi{*AZ)jl$$|HZGfd)2Dn5LJP&kk(Z)a1Z;C%pS;AXHO4CuVr-zrwrWbuRBV63c-pFJauFWp$Re3+&t zX|Zgy-`XVYW|Efo1#T87E2Jla^Wv9IEz0G~ru-S2KO>e7qt^K|Zuv9v{Qhz-mW08o z+~DMSt-+1~lR=gmWW|~hUU6-fkh5+ES+xO{qy}RBxKRsm^trV`!OftcHo%fFsE|I` zO^Y43^XeSdtrjppE~G-vQe91w|Ua2>kG))-6zU zi(ka}^sxvFBD`1I0KvP%=yokYU!MtJnF1_}wz}UMVA%~|Sv~$(k`Z{p#lIDwR#fxD z^GTDz3N=^(zUd8XgB3S}6}17DSWAZ0wt)xyLH*?LopuwzDg{^t{_RuN0IO~Qt7-r& zNdbZr;iP`G^nh{2xI_&~z^}e%ZBTMED5(vwBn*Hw!F5&l@8~fNewhX@1F!qcI(XSF zcv%u0|3e2>q`8Be;HQb;SXBf)r%VJDN>Blwz{O{qn_$I_pdukyTdc#9FbI*c4<3e2 zy{I*~&}%aAsDZe&yk4|!1JBLCQyXAOY7pEAKGDwvH-Bv~h%sUiW59QQVQUa$P6jci zG*~MMgF1O19PH8d!C=Z{P`!eSy%!VDnSH(12H<7@Y6C1u4T6=j3J#d+dhp>{lR=2~ QK?wNs8Eb>k|1$9Y1*26Yj{pDw literal 0 HcmV?d00001 diff --git a/sml-neg.dat b/sml-neg.dat new file mode 100644 index 0000000000000000000000000000000000000000..6e8068eb609f6d6a901b58beda797f25390660ba GIT binary patch literal 5000 zcmbuDO=w(I6vywGW*AL2MG-LxBDk>XN+s_6=te4vXmsPIgn5oD5oVf?X`u*ig6PUG zs8&%dL=iEf3p1G}lgvz#$p=_yE$G5U7j@%8=tei=IrrRq-+A}l_nslMD9t->?%dz` zpL6d2y~aXis6S()aO(M2kEznsi3+Id=y2GmLT#knT$x*_%sdMEGlI9k0>)=R4e`nt z-mU+J+tje8CZ8SAUs|c&J3XwGZqyfbu!KRdtLYG~aJ+&SqfaiX`4Od#L45*0<0bl+ zeu*wZRaI4^rtmL-ic+|jmf0o!7otn^s)9dIu>aN^?bid~?ZX(-BzBJL^4{H^TS%g& z{-|pby=kaUOsnbdahK7HRfU^3`&1>UL-gnUc!^=|TMFSYk197;2}UQ}uwsEsBxr64w2cD2SWYBZHihhLVAu7GJ(9k7U^h_4Xgxr!wu z4SZd{3doARi9M-1axKY617i(l|FWv0uGy;U8AD$PLc1ALK)oiZv7Ftg;eeqQ(ANn1 zuHV&sPV3(Nk%vvG5!JkIuz5tTL)7UC%2EFZoY*~4WD!aqW(9B=G>5+_6)U0P(gWbNJ!b#9Ee4>oWBz1gLevv(@lN*g=Bei9fbLVNkHpB< zQ%T^SLzrTzdk}s3M4{BaPwYwHm>4BVp3OANq!;PQ0%tpd+vsV1@m4dq)$}hU?sFfC zx)!GuTF29WPiWJas^xyncY+1&|gc96x+fe`r;g1`GvKKOe#40y_)Xz#tNsbzcb;Yiawyr<>eEbwxZLm~7F5dHjm)^p^ylX+s7n|p%89M5~`>)y$r_Qtuu-Xm-{rPa(D zXCCcdOp7U$W{e{t*hQ-FYaizbJzo0f@jPaF@v)z#-p98EPam3kKPdM9_GJ5U2Iw4@ zDc}&MV9smumxp!A!2?$^azO0kaPozs92}%`aDXp?-c02n@jlD5We1Yqdz+Ow&C(BC a2MKnG&XFMc8;E|3-f*Srop4V&AO0WT(^t{} literal 0 HcmV?d00001 diff --git a/src/main/java/TestCalcMain.java b/src/main/java/TestCalcMain.java new file mode 100644 index 0000000..f5b7188 --- /dev/null +++ b/src/main/java/TestCalcMain.java @@ -0,0 +1,10 @@ + +public class TestCalcMain { + + public static void main(String[] args) { + short s = (short) 0xFF47; + System.out.println(s); + + } + +} diff --git a/src/main/java/info/peper/metertoinflux/ShellyPlus1PmCloudReader.java b/src/main/java/info/peper/metertoinflux/ShellyPlus1PmCloudReader.java new file mode 100644 index 0000000..06fd955 --- /dev/null +++ b/src/main/java/info/peper/metertoinflux/ShellyPlus1PmCloudReader.java @@ -0,0 +1,70 @@ +package info.peper.metertoinflux; + +import java.io.IOException; +import java.io.Reader; +import java.util.Properties; + +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 ShellyPlus1PmCloudReader implements MeterReader { + + private final String authKey; + private final String id; + private final String cloudServerHostname; + private final OkHttpClient httpClient; + + public ShellyPlus1PmCloudReader(final Properties config) { + this.authKey = config.getProperty("authKey"); + this.id = config.getProperty("id"); + this.cloudServerHostname = config.getProperty("cloudServerHostname"); + this.httpClient = new OkHttpClient(); + } + + @Override + public double getCurrentValue() throws MeterReadException { + try { + final RequestBody requestBody = new FormBody.Builder() + .add("auth_key", this.authKey) + .add("id", this.id) + .build(); + final Request request = new Request.Builder().url("https://" + this.cloudServerHostname + "/device/status") + .post(requestBody) + .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(); + int level = 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 ("switch:0".equals(name) && level == 2) { + jsonReader.beginObject(); + level++; + } else if ("apower".equals(name) && level == 3) { + return jsonReader.nextDouble(); + } else { + jsonReader.skipValue(); + } + } + } + } catch (IOException e) { + throw new MeterReadException("Could not get value from meter.", e); + } + throw new MeterReadException("Could not get value from meter."); + } +} diff --git a/src/main/java/info/peper/metertoinflux/TestMeterReaderMain.java b/src/main/java/info/peper/metertoinflux/TestMeterReaderMain.java index b11a57c..430a42f 100644 --- a/src/main/java/info/peper/metertoinflux/TestMeterReaderMain.java +++ b/src/main/java/info/peper/metertoinflux/TestMeterReaderMain.java @@ -10,6 +10,12 @@ public class TestMeterReaderMain { final MeterReader readerLocal = new ShellyPlus1PmLocalReader(propsLocal); System.out.println(readerLocal.getCurrentValue()); + final Properties propsCloud = new Properties(); + propsCloud.setProperty("cloudServerHostname", "shelly-8-eu.shelly.cloud"); + propsCloud.setProperty("authKey", "MmQ3ZHVpZA71BA656BE0DBDA1FF163B0F97EB1E902B18B3F3E45EFBCC78AC533A3BF52B91279C42553A06482D6"); + propsCloud.setProperty("id", "cc7b5c85a870"); + final MeterReader readerCloud = new ShellyPlus1PmCloudReader(propsCloud); + System.out.println(readerCloud.getCurrentValue()); } } diff --git a/src/main/java/info/peper/serialtest/DecodeSmlMain.java b/src/main/java/info/peper/serialtest/DecodeSmlMain.java index 7e01379..5ae4559 100644 --- a/src/main/java/info/peper/serialtest/DecodeSmlMain.java +++ b/src/main/java/info/peper/serialtest/DecodeSmlMain.java @@ -2,18 +2,24 @@ package info.peper.serialtest; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; 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 { + public static void decode(final InputStream is, final NewValueListener listener, final OutputStream os) throws IOException { int curPos = 0; int readStatus = 0; int value = 0; int readByte; + boolean firstByte = false; do { readByte = is.read(); + if (os != null) { + os.write(readByte); + os.flush(); + } if (readByte != -1) { if (readStatus == 0) { if (readByte == SEQ[curPos]) { @@ -26,13 +32,21 @@ public class DecodeSmlMain { readStatus = Integer.MAX_VALUE; } } else if (readStatus == Integer.MAX_VALUE) { + System.err.println("Anzahl byte: " + ((readByte & 0x0F) - 1)); if ((readByte & 0xF0) == 80) { - readStatus = readByte & 0x0F - 1; + readStatus = (readByte & 0x0F) - 1; } + firstByte = true; } else { - value *= 256; - value += readByte; + if (firstByte && (readByte & 0x80) == 0x80) { + value = -128 + (readByte & 0x7F); + } else { + value *= 256; + value += readByte; + } + firstByte = false; readStatus--; + System.err.println("gelesenes Byte: " + (byte)readByte + " / ReadStatus: " + readStatus); if (readStatus == 0) { listener.newValue(value); value = 0; diff --git a/src/main/java/info/peper/serialtest/SerialTestMain.java b/src/main/java/info/peper/serialtest/SerialTestMain.java index c4f29f4..19d6a38 100644 --- a/src/main/java/info/peper/serialtest/SerialTestMain.java +++ b/src/main/java/info/peper/serialtest/SerialTestMain.java @@ -1,5 +1,6 @@ package info.peper.serialtest; +import java.io.FileOutputStream; import java.io.InputStream; import com.fazecast.jSerialComm.SerialPort; @@ -29,8 +30,13 @@ public class SerialTestMain { System.out.println(value); } }; - try (InputStream is = serialPort.getInputStream();) { - DecodeSmlMain.decode(is, listener); + try (InputStream is = serialPort.getInputStream(); + FileOutputStream fos = new FileOutputStream("sml.dat")) { +// for (int i = 0; i < 5000; i++) { +// fos.write(is.read()); +// System.out.println(i); +// } + DecodeSmlMain.decode(is, listener, fos); } serialPort.closePort(); }